Build an Index of Industrial Production dashboard from MoSPI data
In this article (7 sections)
Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).
India's Index of Industrial Production (IIP) is the monthly measure of factory, mining and electricity output. A dashboard that shows sector growth correctly, flags base effects and never mixes index bases is a solid, business-relevant portfolio project. This one uses MoSPI's IIP on the eSankhyiki portal. It builds year-on-year and momentum measures for each sector and adds a one-page view a strategy or research team could read in two minutes.
Where to get IIP
MoSPI's eSankhyiki IIP page has Table, Chart, API and Metadata tabs and a Download button. The current series has base year 2022-23. The columns we observed were:
| Column | Content |
|---|---|
| Base Year | 2022-23 for the current series |
| Year | Reference year or month label |
| Type | For example General or Sectoral |
| Category | For example Mining & Quarrying or Manufacturing |
| Sub Category | Finer breakdown within a category |
| Index | Index value |
| Growth Rate (%) | Year-on-year growth as published |
Check how Year encodes the month in your download before parsing it. IIP is revised, since initial monthly estimates are updated in later releases. Save each download with its date so you can show what changed.
A trap worth knowing: RBI's DBIE database still listed IIP on the 2011-12 base when we checked. If you pull history from there, you have two different series. Do not join index levels across them.
What it signals to a hiring team
Equity research desks, credit rating agencies, manufacturing companies' strategy teams and industry associations all track IIP. Many dashboards on the internet simply plot the headline. One that separates base effects from momentum, handles revisions and shows sector contributions shows you understand what the number means. That is the difference between reporting and analysis.
Cleaning steps
- 1Filter the hierarchy. Type, Category and Sub Category are stacked in one table. Choose the level you are charting and filter to it, or totals double-count.
- 2Parse months into a real date column. Sort by it. Never sort month names alphabetically.
- 3Keep the published growth rate and compute your own. Where you have index levels a year apart on the same base, recompute growth and compare it with the published figure. Differences point to revisions or rounding.
- 4Label provisional months. The latest months are usually provisional. Mark them on the chart.
- 5Check base year on every row. Assert that it is a single value in your working table.
Code on a synthetic series
Index values below are synthetic. They follow a made-up seasonal pattern and are not MoSPI data.
import numpy as np
import pandas as pd
rng = np.random.default_rng(21)
months = pd.period_range("2023-04", "2026-07", freq="M")
season = {4: 0.98, 5: 1.02, 6: 1.00, 7: 0.99, 8: 0.97, 9: 0.99,
10: 1.01, 11: 0.98, 12: 1.04, 1: 1.05, 2: 1.00, 3: 1.10}
rows = []
for sector, trend in [("Mining & Quarrying", 0.002), ("Manufacturing", 0.004), ("Electricity", 0.005)]:
level = 100.0
for m in months:
level *= 1 + trend + rng.normal(0, 0.003)
idx = level * season[m.month]
if sector == "Manufacturing" and m == pd.Period("2024-05", "M"):
idx *= 0.92 # a synthetic weak month to create a base effect a year later
rows.append({"Base Year": "2022-23", "Category": sector, "month": m, "Index": round(idx, 1)})
df = pd.DataFrame(rows)
assert df["Base Year"].nunique() == 1
df = df.sort_values(["Category", "month"])
g = df.groupby("Category")["Index"]
df["yoy"] = (df["Index"] / g.shift(12) - 1) * 100
df["two_year"] = ((df["Index"] / g.shift(24)) ** 0.5 - 1) * 100 # annualised over two years
df["mom_3m"] = (df["Index"] / g.shift(3) - 1) * 100 # not seasonally adjusted
df["base_effect_flag"] = (df["yoy"] - df["two_year"]).abs() > 4
latest = df[df["month"] >= pd.Period("2025-04", "M")]
cols = {"yoy": 1, "two_year": 1}
print(latest[latest["base_effect_flag"]][["Category", "month", "yoy", "two_year"]].round(cols))
print(df[df["month"] == months[-1]][["Category", "Index", "yoy", "two_year"]].round(cols))The flag compares one-year growth with the annualised two-year change. When the two diverge sharply, last year's base was unusual. In the synthetic data that happens in May 2025, the anniversary of a weak month, which is exactly what the flag should catch. The three-month change is not seasonally adjusted, so use it only to compare the same months across years, or apply a seasonal adjustment and say which method you used.
What to analyse
- Headline and sectors: year-on-year growth for General, Mining & Quarrying, Manufacturing and Electricity, month by month.
- Base-effect flags: mark months where one-year and two-year growth disagree, and explain the top three in words.
- Contributions: if the metadata gives sector weights, show each sector's contribution to headline growth. The contributions should add up to the headline, which is a check worth including.
- Revisions: compare two downloads a month apart, and show which months moved and by how much.
The finished dashboard
- Tile row: latest month's headline growth, manufacturing growth and the provisional marker.
- Line chart: year-on-year growth by sector over the full base-2022-23 span, with base-effect months highlighted.
- Bar chart: latest month's sector contributions, if weights are available.
- Revision table: month, first published value, latest value, change.
- README: source page, base year, download dates, hierarchy level, growth formulas, adjustment choices and the DBIE base warning.
Interview questions
- What is a base effect, and how did you detect it?
- Why can't you splice 2011-12 and 2022-23 index levels directly?
- How would you seasonally adjust this series, and what would you lose?
- The latest month is provisional. How would you present it to a director?
- Sector contributions do not add to the headline. What are the likely reasons?
Building a dashboard that a reader can trust is at the core of our Data Analyst programme. If you are deciding between analytics and data science, read our comparison of data analytics and data science.
Frequently asked questions
What is the current base year of India's IIP?
MoSPI's eSankhyiki portal carries the Index of Industrial Production with base year 2022-23. Some other databases still list the older 2011-12 series, so always record the base year beside every figure you publish.
What is a base effect?
Year-on-year growth compares this month with the same month last year. If last year's month was unusually weak, growth this year looks strong even if activity barely changed. Comparing month-on-month movement and the two-year change helps separate real momentum from base effects.
Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.
This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.
Explore Data Analytics with Generative AI