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) | 04-Nov-2026 | 56 | AMFI terms; publicly published daily NAV file |
amfi_schemes | Association of Mutual Funds in India (AMFI) | 04-Nov-2026 | 14,430 | AMFI terms; publicly published daily NAV file |
bank_fundamentals | Yahoo Finance | 11 NSE tickers | 46 | Yahoo Finance terms; personal/research use |
bank_prices | Yahoo Finance | 11 NSE tickers | 13,588 | Yahoo Finance terms; personal/research use |
india_rates | FRED (Federal Reserve Bank of St. Louis), series sourced from OECD / RBI | 1968-01 to 2026-09 | 705 | FRED terms of use; underlying series (c) OECD. Free to redistribute with attribution. |
pix_fraud_monthly | Banco Central do Brasil | 2022-01 to 2026-09 | 57 | Banco Central do Brasil open data terms |
pix_p2b_initiation | Banco Central do Brasil | 2020-11 to 2026-10 | 436 | Banco Central do Brasil open data terms |
pix_txn_monthly | Banco Central do Brasil | 2020-11 to 2026-10 | 701 | Banco Central do Brasil open data terms |
psp_financials | Yahoo Finance | 4 NSE tickers, FY2023 to FY2026 | 16 | Yahoo Finance terms; personal/research use |
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) |
rbi_acceptance | Reserve Bank of India | 2026-05 to 2026-07, national totals | 15 | Reserve Bank of India terms; data is provisional as published |
rbi_card_payments | Reserve Bank of India | 2026-05 to 2026-07, national totals | 18 | Reserve Bank of India terms; data is provisional as published |
survey_SYNTHETIC_nps | Generated by this repository (SYNTHETIC) | 2,000 respondents x 4 episodes, seed 20260820 | 8,000 | Apache-2.0 |
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_incentive | Press Information Bureau, Ministry of Finance | FY2021-22 to FY2024-25, incentive payout and national UPI value split | 4 | Government of India, PIB terms |
upi_monthly | NPCI via India Data Portal (CKAN mirror) | 2016-07 to 2026-07 | 116 | NPCI terms apply to the underlying data |
worldbank_brazil | World Bank Open Data | 1960 to 2025 | 66 | CC BY 4.0 |
worldbank_india | World Bank Open Data | 1960 to 2025 | 66 | CC BY 4.0 |
All accessed 2026-11-05. 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.pix_fraud_monthly, STALE relative to the transaction series: fraud stops at 2026-09 while transactions run to 2026-10. Disputed volume, accepted disputes per 100,000 transactions, and the share of disputed value returned through the special return mechanism. No Indian equivalent is published in machine-readable form. `Database` in the Olinda URL is the EARLIEST reference month, not the publication vintage: each response runs cumulatively forward to the latest published month. Olinda ignores $select, $count, $apply and $orderby, so the full cross-tab is downloaded and aggregated locally. No currency is converted anywhere: every comparison is a share of Brazil's own total.pix_p2b_initiation, How the P2B leg is initiated, as a share of that month's P2B volume. BCB began breaking the method out in 2021-06; earlier months carry the code 'Nao disponivel', which is kept rather than dropped so an undisclosed month cannot read as a zero. `Database` in the Olinda URL is the EARLIEST reference month, not the publication vintage: each response runs cumulatively forward to the latest published month. Olinda ignores $select, $count, $apply and $orderby, so the full cross-tab is downloaded and aggregated locally. No currency is converted anywhere: every comparison is a share of Brazil's own total.pix_txn_monthly, Monthly Pix volume and value by leg, where P2B is person to business and is the leg comparable to India's merchant payments. `Database` in the Olinda URL is the EARLIEST reference month, not the publication vintage: each response runs cumulatively forward to the latest published month. Olinda ignores $select, $count, $apply and $orderby, so the full cross-tab is downloaded and aggregated locally. No currency is converted anywhere: every comparison is a share of Brazil's own total.psp_financials, Filed annual income statements retrieved via the yfinance library, for four listed businesses grouped by what each one sells. A PANEL OF NAMED COMPANIES, not cohort averages: two of the groups hold a single company, and an average of one is not an average. The companies are not like-for-like, so only the shape of the margin each model produces is compared, never a league table.pulse_base_national, Registered users and registered merchants. PhonePe's own transactions, not all of UPI.pulse_txn_national, P2P / Retail (merchant) / Utility split. Counts live; VALUE FROZEN at the 2026-08-21 pull to 2026Q2, because PhonePe has since withdrawn it from this endpoint (value_source column). 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. Counts live; VALUE FROZEN at the last good pull where PhonePe has withdrawn it (value_source column). PhonePe's own transactions, not all of UPI.rbi_acceptance, Browser-only: RBI's listing page answers a script but its XLSX links return an interstitial, so the monthly workbook is downloaded by hand and its national Total row transcribed. That Total reconciled against the sum of 63 bank rows at 0.00% on every column. Cash withdrawal is excluded: it is not a merchant payment. Cards are the PRICED rail: a merchant discount rate is permitted on them and prohibited on UPI, which is what makes them a control group rather than a rival.rbi_card_payments, Browser-only: RBI's listing page answers a script but its XLSX links return an interstitial, so the monthly workbook is downloaded by hand and its national Total row transcribed. That Total reconciled against the sum of 63 bank rows at 0.00% on every column. Cash withdrawal is excluded: it is not a merchant payment. Cards are the PRICED rail: a merchant discount rate is permitted on them and prohibited on UPI, which is what makes them a control group rather than a rival.survey_SYNTHETIC_nps, SYNTHETIC. Not a real survey. Generated from a documented seeded model to demonstrate episode-level NPS, because published episode benchmarks are proprietary.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_incentive, Hand-transcribed in a browser: PIB serves HTTP 403 to scripted requests, and the figures are published as chart images with printed data labels. The blended rate is incentive paid over ALL merchant value, not the statutory 0.15%, which applies only to transactions at or under Rs 2,000 to small merchants. STALE: the release stops at FY2024-25 and was accessed 2026-11-05.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_brazil, The denominator for the Pix comparator only: transactions per banked adult, computed on the same 15+ base as India's. Indicators: FX.OWN.TOTL.ZS, SP.POP.TOTL, SP.POP.0014.TOworldbank_india, Inclusion denominators, asset quality and private credit for the banking and payments modules. 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.