Method
Sources, provenance, and what this analysis cannot know
Every figure on this site is computed by a script from a committed dataset. Nothing is typed in by hand. This page is generated from the provenance ledger the fetchers write, so it cannot drift from what the pipeline actually pulled.
Datasets
| Dataset | Publisher | Coverage | Rows | Terms |
|---|---|---|---|---|
amfi_fund_houses | Association of Mutual Funds in India (AMFI) | 20-Aug-2026 | 52 | AMFI terms; publicly published daily NAV file |
amfi_schemes | Association of Mutual Funds in India (AMFI) | 20-Aug-2026 | 14,288 | AMFI terms; publicly published daily NAV file |
bank_fundamentals | Yahoo Finance | 11 NSE tickers | 47 | Yahoo Finance terms; personal/research use |
bank_prices | Yahoo Finance | 11 NSE tickers | 13,580 | Yahoo Finance terms; personal/research use |
india_rates | FRED (Federal Reserve Bank of St. Louis), series sourced from OECD / RBI | 1968-01 to 2026-06 | 702 | FRED terms of use; underlying series (c) OECD. Free to redistribute with attribution. |
pulse_base_national | PhonePe Pulse | 2018Q1 to 2026Q2 | 34 | CDLA-Permissive-2.0 (see PhonePe/pulse repository LICENSE) |
pulse_txn_national | PhonePe Pulse | 2018Q1 to 2026Q2 | 102 | CDLA-Permissive-2.0 (see PhonePe/pulse repository LICENSE) |
pulse_txn_state | PhonePe Pulse | 2018Q1 to 2026Q2 | 1,224 | CDLA-Permissive-2.0 (see PhonePe/pulse repository LICENSE) |
pulse_txn_state_mix | PhonePe Pulse | 2026Q2 | 108 | CDLA-Permissive-2.0 (see PhonePe/pulse repository LICENSE) |
upi_apps | NPCI (UPI Ecosystem Statistics) | 2023-12 to 2026-07 | 132 | NPCI terms apply to the underlying data |
upi_apps_hhi | NPCI (UPI Ecosystem Statistics) | 2023-12 to 2026-07 | 12 | NPCI terms apply to the underlying data |
upi_monthly | NPCI via India Data Portal (CKAN mirror) | 2016-07 to 2026-07 | 116 | NPCI terms apply to the underlying data |
worldbank_india | World Bank Open Data | 1960 to 2025 | 66 | CC BY 4.0 |
All accessed 2026-08-21. Code in this repository is Apache 2.0 licensed; each dataset retains its publisher's own terms.
Caveats carried into every exhibit
amfi_fund_houses, Scheme universe snapshot; scheme counts are not AUM.amfi_schemes, Scheme universe snapshot; scheme counts are not AUM.bank_fundamentals, Retrieved via the yfinance library. NIM here is a PROXY: net interest income / average total assets, not reported NIM.bank_prices, Retrieved via the yfinance library. NIM here is a PROXY: net interest income / average total assets, not reported NIM.india_rates, India immediate/call money interbank rate, monthly. Fetched from FRED's keyless CSV endpoint so the pipeline needs no credentials. Months FRED does not publish are dropped, never interpolated.pulse_base_national, Registered users and registered merchants. PhonePe's own transactions, not all of UPI.pulse_txn_national, P2P / Retail (merchant) / Utility split. PhonePe's own transactions, not all of UPI.pulse_txn_state, State-level transaction count and value. PhonePe's own transactions, not all of UPI.pulse_txn_state_mix, P2P / merchant / utility split within each state, from the per-state aggregated endpoint. Reconciled against the country file. PhonePe's own transactions, not all of UPI.upi_apps, Top ten apps by volume, transcribed from a browser session because NPCI returns HTTP 403 to scripted access. Shares are computed against the NPCI national monthly total, so they are true market shares and the residual is real.upi_apps_hhi, Top ten apps by volume, transcribed from a browser session because NPCI returns HTTP 403 to scripted access. Shares are computed against the NPCI national monthly total, so they are true market shares and the residual is real.upi_monthly, CKAN mirror STOPS AT 2023-08. Rows after that are hand-seeded from npci.org.in, which returns HTTP 403 to scripted access. The `provenance` column marks which is which.worldbank_india, Indicators: FX.OWN.TOTL.ZS, FX.OWN.TOTL.FE.ZS, NY.GDP.MKTP.CD, SP.POP.TOTL, SP.POP.0014.TO, FB.AST.NPER.ZS, FS.AST.PRVT.GD.ZS
What was deliberately not used
- RBI DBIE (data.rbi.org.in)
- An Angular application with no documented public REST API. Net interest margin is derived from filed income statements instead, which is more defensible than screen-scraping a portal.
- NPCI direct scraping
- npci.org.in returns HTTP 403 to every scripted request. Recent months are transcribed from a browser session with per-row provenance instead. The overlap month matches the open mirror exactly, confirming no level shift at the seam.
- data.gov.in
- The public sandbox key authenticates, but filtered resource queries time out and many finance resources have no active API. It would add nothing the spine does not already cover.
- Perspective, Superset, Panel, Redash, Vizro, glue
- Each needs a live Python or Node backend, which a static free-hosted site cannot have, or ships several megabytes of WASM to pivot 36 rows. The workbench is built in code instead, which keeps the page fast.
- D3
- Dropped after the charts were specified. A four-point cohort chart is server-rendered SVG with no JavaScript at all, and ECharts covers the rest. Removing it took a dependency and a client bundle out of the project.
- WebGPU
- No dataset here is remotely large enough to justify it.
Three rules the pipeline enforces
- Never fabricate a number. If a value was not fetched or computed it stays a visible gap. Four months NPCI does not publish are left empty rather than interpolated.
- Fail loud on shape change. Each fetcher validates its schema and range. The bank fetcher refused to run when a NIM came back negative, correctly, because the company was a payments firm, not a bank.
- Synthetic data announces itself. The survey panel is generated. It says so in the filename, on the chart, and at the top of the memo.