Time Capsule • 1999

An eight-page year-in-review that reads like a magazine and behaves like a Power BI report — assembled from public archives, set in a fixed design system, and told one chapter at a time.

What it is

Eight report pages covering one year: Cover, Headlines, Soundtrack, Screen, Tech, Numbers, Rewind, and Where You Were. Each chapter carries one chart and the editorial copy that explains it, styled after print year-in-review issues rather than a dashboard.

The data comes from Wikipedia, Billboard's year-end Hot 100, Box Office Mojo, the OMDb API, eight Federal Reserve series, and a Spotify audio-features dataset. Python scripts handle acquisition and cleaning; Power BI handles the model, visuals, and layout. The judgment — which events matter, which songs stand in for a hundred, which chart shape makes the point — is documented rather than implied.

By the numbers

  • 8 pages — a cover and seven chapters
  • 217 headline events, weighted 2–5 for editorial significance
  • 100 Billboard Hot 100 songs, all matched to Spotify audio features
  • 84 films — Box Office Mojo's top 80 plus 4 restored from OMDb
  • 30 hand-curated tech milestones across 7 categories
  • 7,118 economic observations — 8 FRED series, 1995–2005
  • 7 Python scripts, 1,847 lines
  • 17 DAX measures and 11 Vega-Lite specs

The pages

01_cover.png

Cover. Four numerals at 640pt and a chapter list. The masthead uses mid-dot separators because letter-spacing alone closed the word gaps and rendered "ATIMECAPSULE".

02_headlines.png

Headlines. A calendar heatmap where color carries editorial significance and the bars alongside carry raw count — so a busy month and a consequential one never collapse into the same mark. 217 events, merged from the 1999 year article and 366 day-of-year pages.

03_soundtrack.png

Soundtrack. Billboard's year-end Hot 100 fuzzy-joined to Spotify audio features, 100 of 100 matched. Three songs on a six-feature radar — Britney Spears, Jay-Z, Jewel — chosen because their shapes barely overlap.

04_screen.png

Screen. Fifty films plotted by IMDb rating against domestic gross, with quadrants named rather than numbered: Forgotten, Held up, Overpaid, Underseen. The strip plot places each director's 1999 inside a decade of their work.

05_tech.png

Tech. Thirty milestones by category, sized by significance. Napster's June dot is one of the smallest marks on the page; the curve beside it is what the dot turned into.

06_numbers.png

Numbers. Four Federal Reserve series drawn across a decade — five years either side of 1999 — with the issue year picked out in red. The argument is that the indicators never agreed on direction.

07_rewind.png

Rewind. The chapter for what doesn't fit a chart — the Furby's 14 million units, Bezos as Person of the Year, an In Memoriam column. No visual, same grid and voice.

08_where_you_were_default.png

Where You Were. A what-if age parameter drives DAX that rewrites the page's copy for the reader's age in 1999 — same evidence, different vantage point.

Judgment calls

NASDAQ substituted for the S&P 500FRED's SP500 series only reaches back to 2013, so against a 1990s window it returns an empty chart rather than an error. The NASDAQ Composite is also the sharper instrument for a dot-com issue: up about 86% in 1999, peaking ten weeks later. The substitution is recorded in the project brief so every measure names the NASDAQ rather than implying the S&P.
Films the calendar year hidBox Office Mojo buckets by calendar-year gross, dropping MagnoliaThe Hurricane and The Cider House Rules — December limited releases that earned in 2000 — out of 1999 entirely. A second OMDb pass restores them; the four that survived dedup carry Source = "OMDb-supplemental" and Rank = 999 so an editorial addition can't pass as a chart position.
Significance over countCounting events makes a crowded news week and a consequential one look identical. Each headline carries a weight from 2 to 5; color encodes weight, bars encode count, and the caption says which is which.
A scraper that had to change shapeWikipedia's twelve month pages for 1999 all soft-redirect to the year article, so the intended scrape returned the same page twelve times. The fix: fetch the year article once for 88 anchor events, walk all 366 day-of-year pages for the other 135, and merge at 0.85 title similarity.

Pipeline

Script Source Output Rows
01_scrape_headlines.py Wikipedia — 1999 year article Year-overview events 88
01b_scrape_per_day.py Wikipedia — 366 day-of-year articles Per-day events 135
01c_merge_headlines.py Both of the above headlines.csv 217
02_billboard_and_spotify.py Billboard Hot 100 · Spotify features music.csv 100
03_movies.py Box Office Mojo · OMDb API movies.csv 84
04_fred.py FRED — 8 series economy.csv 7,118
05_song_dna.py music.csv song_dna.csv 18
hand-curated Wikipedia references, per event tech.csv · directors_decade.csv · napster_milestones.csv 30 · 38 · 8

Row counts are the tables as they stand in processed/. Sources stay immutable in raw/; keys live in .env; Power BI imports the CSVs and never scrapes.

Built with

  • Python 3.12 — pandas, requests, BeautifulSoup, rapidfuzz, fredapi
  • Power BI Desktop — theme.json, SVG page backgrounds, bookmarks, what-if parameter
  • Deneb (Vega-Lite) — calendar heatmap, radar, timeline, sparklines
  • Design system: paper #F4EFE6, ink #1A1A1A, oxide #B8341B, gold #D4A437; Cambria, Segoe UI, Consolas

Sources

  • Wikipedia — year, day-of-year, and Billboard year-end articles (CC BY-SA 4.0)
  • Box Office Mojo (IMDb) — 1999 domestic box office
  • OMDb API — per-title enrichment
  • Federal Reserve Economic Data (FRED), Federal Reserve Bank of St. Louis
  • Audio features courtesy of Spotify, via Kaggle