Stop 14 · Build Your Data Science PortfolioProjects · 4/7

Time Series Forecasting Project

Part of the Data Science Roadmap

In short

Every business asks 'how much will we sell next month?'. A forecasting project shows you can respect time order, beat a simple baseline and talk honestly about uncertainty.

Apply Phase 11's forecasting skills to a real business-relevant time series, with a clear evaluation of forecast accuracy and honest communication of uncertainty.

The mascot stacks colourful kites and spools of thread on the shelves of a busy kite shop.

Think of it like this

The kite shop before the festival

A kite seller doesn't order stock on a hunch. He looks at past seasons: sales climb in early January, peak just before the kite festival, then crash. He also checks which weekday the festival falls on. Forecasting is that thinking, in code, with a range instead of one number.

Watch it happen

Ten weeks of sales, split by time

120
0
135
1
128
2
150
3
162
4
158
5
175
6
190
7
184
8
201
9

1/5Weekly sales in time order. Rows can't be shuffled; order is the whole point.

The big ideas

What you need to know

Split by time

Train on the past, test on later dates. Use rolling or expanding windows for cross-validation.

Beat a naive baseline

'Same as last week' is surprisingly hard to beat. Show your model does.

Seasons and holidays

Add weekday, month and holiday features. Festivals and salary days move sales a lot in India.

Give a range

Report MAE in real units and show a likely range, not just a single line.

See it in code

Walk through the code

python
1import pandas as pd2from sklearn.linear_model import LinearRegression3from sklearn.metrics import mean_absolute_error4 5df = pd.read_csv("daily_sales.csv", parse_dates=["date"], index_col="date")6df["last_week"] = df["sales"].shift(7)      # same weekday, a week earlier7df["dow"] = df.index.dayofweek8df = df.dropna()9 10train, test = df[:"2025-12-31"], df["2026-01-01":]11X = ["last_week", "dow"]12model = LinearRegression().fit(train[X], train["sales"])13 14print("Naive MAE:", mean_absolute_error(test["sales"], test["last_week"]))15print("Model MAE:", mean_absolute_error(test["sales"], model.predict(test[X])))

1/3Features built only from the past: last week's sales and the day of the week.

A starter that splits by date and compares a model against the 'same day last week' baseline.

Save yourself the pain

Common mistakes

Oops

Using train_test_split with shuffling on daily sales data.

Do this instead

Split by date. Shuffling lets the model peek at the future and gives a fake, rosy score.

Oops

Showing one forecast line as if it's certain.

Do this instead

Show a range, explain what drives it, and say how far ahead the forecast stays useful.

Your mission

First milestone: baseline to beat

~40 min

Quick check

Why compare your forecast against a 'same as last week' baseline?

Go deeper

  1. 1Choose a time series with a real forecasting use case (sales, demand, traffic).
  2. 2Compare at least two modeling approaches (e.g. ARIMA and Prophet) and justify your final choice.
  3. 3Present the forecast with a confidence range, not just a single predicted line.

More projects at this stop

Stuck on this topic? Ask an Insider

Get 1:1 guidance from people who've walked this exact path — on the InsideEdge app.

Download
InsideEdge