Skip to main content

Precise real-world-example news search and spaced-repetition study tools for IB Economics — offline-first, explainable, classic IR (BM25).

Project description

EconLens 🔎

Find precise, current real-world news examples for any IB Economics concept — ranked, explainable, and offline-first.

PyPI Python IB Economics BM25 MIT


The hardest marks on IB Economics Paper 1 (b) — the 15-mark Evaluate / Discuss / Examine questions — reward real-world examples (RWE). EconLens turns any syllabus concept into a ranked list of current news stories you can cite, with the date, source, and a link back to the original article.

$ econlens news inflation

🔎 Inflation  [macro/inflation]
   1. [13.6] US inflation rose at fastest pace in three years as energy costs surge
          2026-05-28 · The Guardian — Economics
          https://www.theguardian.com/business/2026/may/28/...
   2. [ 4.0] US PCE inflation rate hits three-year high …
   ...
   see also: monetary_policy, interest_rates, deflation

Why it's different

  • 🎯 Precise, not a keyword dump — each concept has a hand-tuned keyword set (must / boost / exclude), so "minimum wage" never returns "minimum balance".
  • 🔬 Explainable — classic Okapi BM25 ranking with title-field weighting. Run with --why to see exactly which keywords and how recent each result is. Fully deterministic: the same news yields the same ranking, every time.
  • 🕒 Recency-aware — RWE must be current, so fresher stories get a bounded, half-life recency bonus, and --since 30d trims the search to a window.
  • 🆓 Offline-first & free — pulls from key-less sources (economics RSS feeds + the free GDELT news API), fetched concurrently so the wait is the slowest single source, not their sum. An optional NewsAPI key adds coverage but is never required.
  • 🤖 Scriptable--json emits structured results (status on stderr) so you can pipe EconLens into other tools.
  • 🧩 Data-driven — concepts live in a YAML ontology; contributors extend coverage by editing data, not code. The schema reserves a course field so other curricula (A-Level, AP) can be added later.
  • 🔒 Copyright-safe — only the headline, link, date, and source are stored; article bodies are never copied. Results always link to the original.

Quickstart

pip install econlens

Or from source:

git clone https://github.com/HarryXin0919/econlens.git
cd econlens
pip install -e .          # add .[dev] for tests

# list the concepts (35 across micro / macro / global / development)
econlens concepts
econlens concepts --unit macro

# find real-world examples for a concept
econlens news minimum_wage
econlens news tariffs --why            # show which keywords + how recent each match is
econlens news inflation --since 30d    # only stories from the last 30 days (also 2w, 3m, 1y)
econlens news inflation --no-gdelt     # RSS only (faster; skips the slower GDELT API)
econlens news tariffs --json           # structured output for piping into other tools

GDELT can take 10–20 s and feeds occasionally hiccup; EconLens fetches every source concurrently, with a per-source timeout and retries, so one slow source never sinks the search.

Concepts covered (v0.2)

35 core IB Economics concepts:

Unit Examples
Micro PED/PES, market failure, externalities, carbon/sugar tax, subsidies, minimum wage, price floors, monopoly, oligopoly, competition policy, labour markets
Macro inflation, deflation, interest rates, monetary & fiscal policy, government debt, unemployment, economic growth, supply-side policy
Global free trade, protectionism, tariffs, exchange rates, balance of payments
Development economic development, poverty & inequality, foreign aid

Add more by editing econlens/data/ontology.yaml — see CONTRIBUTING.md.

Optional: more sources via NewsAPI

The free GDELT + RSS sources need no setup. To also query NewsAPI (free tier: 100 requests/day, non-commercial), copy config.example.py to config_local.py and add your key, or set the NEWSAPI_KEY environment variable. config_local.py is git-ignored and never committed.

Roadmap

  • Phase 1 — concept ontology + multi-source fetch + BM25 ranking (econlens news)
  • v0.2 — recency-aware ranking, concurrent fetch, --since / --json
  • Phase 2 — syllabus-organised practice questions (econlens questions)
  • Phase 3 — spaced-repetition review (SM-2) (econlens review)
  • Phase 4 — optional Streamlit web UI

Design & contributing

The ranking model, ontology design, and source handling are documented in docs/DESIGN.md. To add concepts, keywords, or news sources, see CONTRIBUTING.md.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

econlens-0.2.1.tar.gz (25.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

econlens-0.2.1-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

Details for the file econlens-0.2.1.tar.gz.

File metadata

  • Download URL: econlens-0.2.1.tar.gz
  • Upload date:
  • Size: 25.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for econlens-0.2.1.tar.gz
Algorithm Hash digest
SHA256 4d49362ffa09e320d520a464a88aa0396e09744a8416c94a7993c00116c5db8a
MD5 213afc54cef915b94107567ab91bbbfb
BLAKE2b-256 510862dc95cfa1738074f3a59ab46ee25b0d850a9bd9b5a934c44cd839f37109

See more details on using hashes here.

Provenance

The following attestation bundles were made for econlens-0.2.1.tar.gz:

Publisher: publish.yml on HarryXin0919/econlens

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file econlens-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: econlens-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 23.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for econlens-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b8ee6cebfb26338fa9d98fddbef9e6e3e29441d53c524683f565f272d391eedf
MD5 8f7f3b1a3fc330f51bb58ed35ff46277
BLAKE2b-256 a5afea1381f6b2237da1b1d859bac5f919ea7e3f693627b767c229fc51d23049

See more details on using hashes here.

Provenance

The following attestation bundles were made for econlens-0.2.1-py3-none-any.whl:

Publisher: publish.yml on HarryXin0919/econlens

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page