Skip to content

Home / Forecasting and Analytics / Seasonal Index Calculator

Forecasting and Analytics

Seasonal Index Calculator (Deseasonalize and Seasonally Adjusted Forecast)

Measure the repeating seasonal pattern in a demand series, strip it out to see the underlying trend, and put it back on a base forecast so the projection rises and falls with the calendar. Paste your demand history, one value per line, pick a season length of 4 for quarters or 12 for months, and the tool builds a seasonal index for each position in the cycle, tells you which season runs above the yearly average and which runs below, deseasonalizes the series, fits a trend to the smooth version, and reseasonalizes to give you the next-period forecast. It draws the raw demand, the deseasonalized series, and the seasonally adjusted forecast on one chart, so you can see the season being removed and then added back. Every value stays in your browser.

A seasonal index is a number that says how far one position in the cycle sits from the yearly average. In the multiplicative form the indices average 1.0, so an index of 1.60 means that season runs 60 percent above the average and 0.40 means 60 percent below, while in the additive form they sum to 0 and read as units above or below instead of a percentage. The tool offers two ways to measure the pattern. The simple average method divides each season average by the grand average, which is quick and works on flat demand. The ratio to centered moving average method divides out the trend with a centered moving average first, then measures the season on what is left, which is the method to use when demand is clearly rising or falling. Once the indices are set, deseasonalizing exposes the trend, and reseasonalizing a projected trend line gives a forecast that carries the season forward. It is free, needs no sign-up, and runs entirely in your browser.

In short: a seasonal index measures the repeating pattern of length L in a demand series, L = 4 for quarters or L = 12 for months. The simple average method sets the grand average G = mean of all demand, the season average A[s] = mean of the demand in season s, and the raw index R[s] = A[s] / G, then normalizes so the L indices average 1.0. The ratio to centered moving average method divides each point by a centered moving average, Ratio = Y[t] / CMA[t], averages the ratios in each season, and normalizes the same way. You deseasonalize with D[t] = Y[t] / index[season(t)], fit a trend to the smooth series, and reseasonalize with F[t] = (a + b*t) * index[season(t)]. On the default series of 100, 200, 150, 50, 120, 240, 180, 60 (two years quarterly, simple average, multiplicative) the grand average is 137.5, the indices are Q1 0.80, Q2 1.60, Q3 1.20, Q4 0.40, the deseasonalized series is a clean step from 125 to 150, the trend on it is a = 116.07 and b = 4.76, and the next period (Year 3 Q1) forecasts (116.07 + 4.76*9) * 0.80 = 127.14. Q2 is the peak at 60 percent above average and Q4 the trough at 60 percent below.

Demand series

next-period forecast

127.14next-period forecast

Seasonal indices

Q1
0.800 (80)
Q2
1.600 (160)
Q3
1.200 (120)
Q4
0.400 (40)
Peak
Peak Q2 (60% above average)
Trough
Trough Q4 (60% below average)

2 full cycles of length 4. Each seasonal index averages 1.0, so an index of 1.30 means demand runs 30 percent above the seasonal average and 0.70 means 30 percent below.

How the calculator works

The tool does the same work you would do by hand to pull a seasonal pattern out of a demand series and then use it, only faster and with the chart drawn for you. You give it a demand history, one value per period, and you tell it the season length: 4 when the cycle is quarterly and 12 when it is monthly. It lines the values up against a repeating season position 1, 2, …, L, so in a quarterly series the first, fifth, and ninth values all fall in season 1, the second, sixth, and tenth in season 2, and so on. It then measures how far each season sits from the yearly average, builds one index per season, and normalizes them so they average 1.0 in the multiplicative model or sum to 0 in the additive model. From those indices it deseasonalizes the series, fits a trend to the smooth version, and reseasonalizes to produce the forecast. You read the next-period forecast at the top, the per-season index table below it, the peak and the trough seasons under that, and the chart at the bottom.

You need a clean set of whole cycles for this to work. Fit a demand series with a repeating cycle of length L, where L = 4 quarters or L = 12 months, and give it at least two full cycles, with three or more preferred. Season(t) repeats 1 through L, so the season of any period is just its position in the cycle. The tool then chooses one of two ways to measure the pattern, which you select with the method control, and one of two models, multiplicative or additive, which you select with the model control. The two methods differ in whether they remove the trend before measuring the season, and that single difference is what makes one right for flat demand and the other right for trending demand. The rest of this section walks through both.

The simple average method is the quick one. The grand average G is the mean of all demand, the season average A[s] is the mean of the demand that falls in season s, and the raw index R[s] = A[s] / G in the multiplicative model. Because the raw indices will not average exactly 1.0 on real data, the tool normalizes so the L indices sum to L: index[s] = R[s] * L / sum(R). It is simple and common, and it is fine when demand is flat, but it does not remove the trend first, so on a strongly trending series it folds part of the trend into the indices and biases them. When your demand is clearly climbing or falling, the ratio to centered moving average method described next is the one to use, and the trend step at the end reuses the same least-squares fit as the Linear Regression Forecast Calculator.

The centered moving average and even season lengths

The ratio to centered moving average method follows the classical decomposition, which reads a series as Y = T * S * C * I, the product of a trend, a season, a cycle, and an irregular part. The idea is to estimate the trend and cycle together with a moving average, divide them out, and read the season from the ratio that is left. The tricky part is that a season length of 4 or 12 is even, and an ordinary moving average of even length does not sit centered on a period. The fix is a centered moving average, a 2 by L average that gives the two end points half weight so the window lines up on a single period. For L = 4 it is CMA[t] = (0.5*Y[t-2] + Y[t-1] + Y[t] + Y[t+1] + 0.5*Y[t+2]) / 4, which spans five values but weights them to cover exactly four periods centered on t. The same shape with half-weighted ends applies for L = 12. Because the window reaches L/2 periods on each side, the first and last L/2 periods of the series have no CMA, which is one reason the method wants at least two full cycles.

Once the centered moving average is in hand, the season falls out of a ratio. For each period that has a CMA, the ratio Ratio = Y[t] / CMA[t] divides out the trend and the cycle, so what remains is the seasonal factor for that period times the irregular noise. You then average the ratios that fall in each season to cancel the noise and land on the raw index for that season. The averaging can be a plain mean, or a median when one period holds an outlier that would drag the mean, and the tool exposes that choice with the ratio-averaging control that appears only for this method. As with the simple average method, the raw indices are normalized so they average 1.0. The payoff is that the trend was removed before the season was measured, so the indices are not contaminated by a rising or falling level, which is exactly the failure the simple average method has on trending demand. The Moving Average Calculator is the same centered-average idea used on its own to smooth a series.

The two methods usually agree on flat demand and diverge on trending demand. On a level series with a steady season, the grand average and the centered moving average tell nearly the same story, so the simple average indices and the ratio to moving average indices come out close. On a series that climbs year over year, the simple average blends the climb into the season averages and pushes the early seasons down and the late seasons up, while the ratio to moving average removes the climb first and reads a cleaner season. The chart makes the difference visible: with the ratio method the deseasonalized series is nearly a straight line, and the trend fit on it is much tighter than the trend fit you get from the simple average method on the same data. That is the practical test. If switching the method noticeably tightens the deseasonalized trend, your demand was trending and the ratio method is the right pick.

Multiplicative against additive

The model controls whether the season is a ratio or a difference. In the multiplicative model the season multiplies the level, so the indices are ratios that average 1.0 and the raw index divides: R[s] = A[s] / G, and deseasonalizing divides, D[t] = Y[t] / index[season(t)]. In the additive model the season adds to the level, so the indices are differences that sum to 0 and the raw index subtracts: R[s] = A[s] – G, and deseasonalizing subtracts, D[t] = Y[t] – index[season(t)]. A multiplicative index of 1.60 says that season runs 60 percent above the seasonal average, while an additive index of +82.5 says it runs 82.5 units above, and the same series can be described either way, just in different units.

The choice comes from how the seasonal swing behaves as the level moves. Use multiplicative when the size of the seasonal peak grows with the level, so a busy quarter that is 60 percent above average stays 60 percent above average as the business doubles, and the absolute swing gets bigger in units. Use additive when the swing is a roughly constant number of units regardless of the level, so a quarter that runs 80 units above average stays about 80 units above whether the base is 200 or 400. Most demand is multiplicative, because seasonal effects tend to scale with volume, which is why the tool opens in that model. Additive suits series where the seasonal bump is a fixed physical quantity, like a fixed number of extra units shipped every December regardless of the year.

One case forces the choice. The multiplicative model divides by the index and multiplies by it, so a season with zero or near-zero demand breaks the ratio, either dividing by something tiny or producing an index near zero that blows up the deseasonalized value. When a series has genuine zeros or values close to zero, the additive model is the safe one, because subtracting a difference never divides by a small number. Beyond that edge case, pick the model from the shape of the swing, read a multiplicative index as a percentage around 1.0 and an additive index as units around 0, and keep the same model consistent through deseasonalizing and reseasonalizing so the season you remove is the season you add back.

Deseasonalizing and the seasonally adjusted forecast

Deseasonalizing is the payoff of the indices. Once each season has an index, D[t] = Y[t] / index[season(t)] in the multiplicative model, or D[t] = Y[t] – index[season(t)] in the additive model, produces the seasonally adjusted series. This is the version of the demand with the calendar pattern taken out, so what remains is the underlying level and trend without the seasonal noise on top. On the default series the deseasonalized values come out to a clean step, 125 for the first four quarters and 150 for the next four, which makes the real story obvious: the business held a level of 125 in year one and jumped to 150 in year two, a fact the raw swings from 50 to 200 completely hide. Reading the deseasonalized series is often the most useful thing the tool does, because it separates a real change in the business from the ordinary rhythm of the season.

The forecast is the reverse trip. To project forward you fit a linear trend to the deseasonalized series, Dhat[t] = a + b*t, which is exactly the least-squares fit the Linear Regression Forecast Calculator performs and is how the trend line is fit here. You project that line to the future period you want, then reseasonalize by putting the season back: F[t] = (a + b*t) * index[season(t)] in the multiplicative model, or F[t] = (a + b*t) + index[season(t)] in the additive model. On the default series the deseasonalized trend is a = 116.07 and b = 4.76, so the next period, Year 3 Q1, sits at t = 9 in season 1: the trend value is 116.07 + 4.76*9 = 158.93, and multiplying by the Q1 index of 0.80 gives 127.14. The projection carries the trend from the smooth series and the shape from the indices, so it climbs year over year and dips in Q4 the way the history does.

The three curves on the chart tell the whole story at a glance. The raw demand in blue swings with the season, the deseasonalized series in green is the smooth trend underneath, and the seasonally adjusted forecast in amber dashed carries both forward. The peak and trough readout names the strongest and weakest seasons and how far each sits from the average, so on the default series it reports Q2 as the peak at 60 percent above average and Q4 as the trough at 60 percent below. Once you have a forecast from this route, you can grade it against what actually happens with a Forecast Error Metrics calculator, which measures the accuracy of the seasonally adjusted forecast with MAD, RMSE, and MAPE. That tool is a sibling in this silo and is not yet live.

What a seasonal index actually measures

A seasonal index is a single number attached to a position in the cycle, and it answers one question: how does this season compare to a typical season in the same year. In the multiplicative model the indices are built to average 1.0 across the cycle, so 1.0 is an average season, above 1.0 is a busy season, and below 1.0 is a quiet one, with the distance from 1.0 read as a percentage. An index of 1.20 is 20 percent above the seasonal average, 0.80 is 20 percent below, and on the default series the Q2 index of 1.60 says the second quarter runs 60 percent above a typical quarter while the Q4 index of 0.40 says the fourth runs 60 percent below. The indices are relative, not absolute, so they describe the shape of the year rather than the size of the business, which is what lets the same index apply as the base level rises or falls.

Because the multiplicative indices average 1.0 and the additive indices sum to 0, they always balance out over a full cycle. That is not an accident of the data, it is enforced by the normalization step, and it is what makes the index a clean measure of shape. If the busy seasons pull some quarters above 1.0, the quiet seasons must pull others below, so the year as a whole neither gains nor loses from the season alone. This is why deseasonalizing works: dividing each period by an index that averages 1.0 leaves the yearly total roughly unchanged while flattening the within-year swings. The index carries the calendar shape and nothing else, which is exactly what you want to remove before you look for a trend and exactly what you want to add back once you have one.

The base-100 form in parentheses in the index table is the same number on a different scale. Multiplying a multiplicative index by 100 gives the base-100 index that some planners prefer, so 1.60 shows as 160 and 0.40 shows as 40, with 100 the average season. It reads the same way, just as a percentage of the average rather than a ratio around 1.0, and it is common in retail and in published seasonal-adjustment tables. Whichever form you read, the meaning is identical: the distance from the average season, expressed as a multiplier, a percentage, or a base-100 figure. The tool shows both so you can match whatever convention your reports already use.

When a seasonal index is the wrong tool

A seasonal index assumes a fixed, repeating pattern of a known length, and every one of those assumptions is also a limit. The first break is a mismatch between L and the true cycle. The method only finds the pattern you tell it to look for, so setting L = 4 on data whose real cycle is monthly, or L = 12 on quarterly data, produces indices that mix unrelated periods together and mean nothing. Match L to the real cycle before anything else: 4 for quarterly demand, 12 for monthly demand, and be sure the series is actually recorded at that spacing with no gaps.

The second break is too little history. Seasonal indices are averages over cycles, so with only one cycle there is nothing to average and the index is just that single year repeated, outliers and all. Two full cycles is the floor, three or more is better, and the series should be a whole number of cycles so every season is represented the same number of times. A series that stops halfway through a cycle over-weights the seasons it happens to include and biases the indices toward them. The third break is a moving pattern. A fixed-length index cannot capture a holiday that drifts on the calendar, like Easter shifting between quarters, or the fact that months have different numbers of days and different numbers of weekends, so demand tied to those effects is only approximated by a fixed monthly index.

The fourth break is outliers and zeros. Because the simple average and the mean-of-ratios both average, a single unusual period, a promotion, a stockout, or a data error, pulls the index for its season toward itself, which is why the tool offers the median option for the ratios in the centered moving average method. Zeros or near-zero demand break the multiplicative model outright by dividing by something tiny, so a series with genuine zeros belongs in the additive model. And if the underlying series has no real trend once it is deseasonalized, the reseasonalized forecast is just the seasonal shape laid on a flat level, which is fine, but at that point a level method feeding the season may be simpler. The Moving Average and Exponential Smoothing calculators track a level without a trend, and either can supply the base that the indices then reshape.

Preparing whole cycles of clean data

The indices are only as good as the history behind them, so a little care with the series pays off. Enter demand, not sales, where the two differ, because a period that sold out understates the demand that was really there, and a censored low value in a busy season will pull that season index down and flatten the pattern. If you know a period was stocked out, estimate the true demand for it rather than feeding the truncated sales figure, since the index for that season is an average and one low value drags it. The tool takes one value per period, one per line, so you can paste a column straight from a spreadsheet.

Order and spacing matter as much here as the values. List the periods oldest first, so the most recent period is at the bottom, because the tool assigns seasons from the top and forecasts the period after the last one. Keep the spacing even and matched to L: every value one quarter apart for L = 4, or one month apart for L = 12, with no gaps and no mixed spacing, because the season position assumes each step is one period of the cycle. A missing period shifts every later value into the wrong season, which quietly corrupts the whole index set, so decide whether a gap should be filled with an estimate before you paste rather than leaving it out.

Give it whole cycles and enough of them. Aim for at least two full cycles and preferably three or more, and make the series length a whole multiple of L so each season appears the same number of times. Before you commit the indices, glance at the deseasonalized series on the chart: if it is close to a straight line, the pattern was captured well and the model fits, and if it still swings, the season length or the model is probably wrong. Watch for the moving-holiday and month-length effects a fixed index cannot carry, and use the median option for the ratios when one period is a clear outlier. Re-estimate the indices as new cycles arrive, since a growing business can see its seasonal shape shift over the years.

Five worked examples

Example 1: the default series, simple average multiplicative, full derivation

This one shows every number so the forecast is transparent. The series is two years of quarterly demand, 100, 200, 150, 50, 120, 240, 180, 60, with L = 4, the simple average method, and the multiplicative model. The grand average is G = 137.5. The season averages are Q1 = (100 + 120) / 2 = 110, Q2 = (200 + 240) / 2 = 220, Q3 = (150 + 180) / 2 = 165, and Q4 = (50 + 60) / 2 = 55, so the raw indices are 110/137.5 = 0.80, 220/137.5 = 1.60, 165/137.5 = 1.20, and 55/137.5 = 0.40. They already sum to 4.0 and average 1.0, so no rescaling is needed: the indices are Q1 0.80, Q2 1.60, Q3 1.20, Q4 0.40. Deseasonalizing divides each period by its season index, which gives the clean step 125, 125, 125, 125, 150, 150, 150, 150. The trend on that series is a = 116.07 and b = 4.76, and the next period, Year 3 Q1 at t = 9 in season 1, forecasts (116.07 + 4.76*9) * 0.80 = 158.93 * 0.80 = 127.14. The lesson is that the index says Q2 runs 60 percent above the yearly average and Q4 60 percent below, and deseasonalizing exposes the real story the swings hide, a level that jumps from 125 to 150 between the two years.

Example 2: the same series by ratio to centered moving average

This case keeps the default series but measures the season with the centered moving average, which removes the trend first. The centered moving average at t = 3 is (0.5*100 + 200 + 150 + 50 + 0.5*120) / 4 = 127.5, and at t = 4 it is (0.5*200 + 150 + 50 + 120 + 0.5*240) / 4 = 135, and the ratios Y[t] / CMA[t] at those points feed the season averages. The resulting indices come out to Q1 0.836, Q2 1.615, Q3 1.178, Q4 0.371, close to the simple average indices but shifted because the trend was divided out before the season was read. The deseasonalized series is almost a straight line, and the trend fit on it is much tighter, R2 0.99 against 0.76 for the simple average method on the same data, and the next-period forecast is 139.17. The lesson is that on trending demand the ratio to moving average method removes the climb before it measures the season, so both the indices and the deseasonalized trend come out cleaner than the simple average gives.

Example 3: the additive model on the same series

This case switches the default series to the additive model with the simple average method, so the season is a difference rather than a ratio. The season averages are the same, Q1 110, Q2 220, Q3 165, Q4 55, and the grand average is 137.5, but now the raw index is the difference A[s] – G: Q1 = 110 – 137.5 = -27.5, Q2 = 220 – 137.5 = +82.5, Q3 = 165 – 137.5 = +27.5, and Q4 = 55 – 137.5 = -82.5. These sum to 0, which is the additive equivalent of averaging 1.0, and they read as units above or below the seasonal average rather than a percentage. Deseasonalizing subtracts the index from each period, and the next-period forecast is 131.43. The lesson is to use the additive model when the seasonal swing is a roughly constant number of units regardless of the level, and to read the additive index as units above or below the seasonal average: +82.5 in Q2 means that quarter runs about 82.5 units above a typical quarter, not 60 percent above.

Example 4: three years of quarterly demand with a stronger trend

This case adds a third year to show how more cycles stabilize the indices and let the forecast reach a full year ahead. The series is 100, 200, 150, 50, 120, 240, 180, 60, 140, 280, 210, 70, twelve quarters with a clear year-over-year climb, using the simple average method and the multiplicative model. The indices come out to the same shape, Q1 0.80, Q2 1.60, Q3 1.20, Q4 0.40, because the seasonal proportions held across all three years, and the deseasonalized series steps up cleanly, 125 in year one, 150 in year two, and 175 in year three. The trend on the smooth series is a = 113.64 and b = 5.59, and reseasonalizing the projected trend gives the next full year: Q1 149.09, Q2 307.13, Q3 237.06, Q4 81.26. The lesson is that a third cycle steadies the indices and gives the trend enough history to project a whole year forward, each quarter carrying the same seasonal shape on a higher base than the year before.

Example 5: monthly demand with a season length of 12

This case moves to a monthly series to show the season length in its other setting. The demand is three years of monthly values, L = 12, measured with the ratio to centered moving average method because monthly demand usually carries a trend. The twelve monthly indices peak in July at about 1.49, meaning July runs about 49 percent above the average month, and bottom in December at about 0.55, about 45 percent below, with the other months filling in the shape of the year between those extremes. From the deseasonalized series and its trend the tool projects a seasonally adjusted forecast for the next twelve months, each month scaled by its own index. The lesson is to set L to the true cycle length: a monthly series needs L = 12, not 4, and it needs at least two, ideally three, full years so every one of the twelve months is averaged over enough cycles to give a stable index.

Three expert tips

Pick the method to match the trend

The simple average method is fine for flat, stationary demand, but on a trending series it mixes the trend into the seasonal indices and biases them, because the early seasons average low and the late seasons average high for reasons that have nothing to do with the calendar. When demand is clearly rising or falling, use the ratio to centered moving average method, which divides out the trend with a centered moving average before it measures the season. The tool makes the difference easy to check: switch the method and watch the deseasonalized series and its trend fit. On the default data the ratio method tightens the deseasonalized trend from an R2 of 0.76 to 0.99, which is the sign the trend was contaminating the simple average indices. If the fit tightens noticeably when you switch, your demand was trending and the ratio method is the right one.

Choose multiplicative or additive by how the swing behaves

If the size of the seasonal peak grows as the overall level grows, the seasonality is multiplicative and the index is a ratio around 1.0, so a busy season stays a fixed percentage above average as the business scales and the absolute swing widens with it. If the peak is a roughly constant number of units no matter the level, it is additive and the index is a deviation that sums to 0, so a season that runs 80 units above average stays about 80 units above whether the base is small or large. Multiplicative is the usual choice for demand, because seasonal effects tend to scale with volume, and it is what the tool opens in. Additive suits series with a stable absolute swing, and it is also the safe model when the series has genuine zeros, which break the multiplicative ratio. Keep the same model through deseasonalizing and reseasonalizing so the season you strip out is the season you put back.

Give it enough clean, whole cycles

Seasonal indices are only as stable as the number of cycles behind them, so use at least two full cycles and preferably three or more, and make sure the series length is a whole number of cycles so every season is represented the same number of times. A series that stops partway through a cycle over-weights the seasons it happens to include and tilts the indices toward them. Watch for moving holidays like Easter that drift between periods and for month-length differences, both of which a fixed-length index cannot capture, and use the median option for the ratios when one period holds an outlier that would drag the mean. Re-estimate the indices as new cycles arrive, because a growing or changing business can see its seasonal shape shift over the years, and an index built on old cycles slowly stops describing the current one.

Common mistakes to avoid

The first mistake is a season length that does not match the real cycle. Setting L = 4 on monthly data, or L = 12 on quarterly data, groups unrelated periods into the same season and produces indices that mean nothing, so match L to the spacing of the data before anything else. The second is using the simple average method on a strongly trending series, which folds the trend into the indices and biases them low early and high late; the ratio to centered moving average method removes the trend first and is the right pick whenever demand clearly climbs or falls.

A third mistake is too little history, one cycle or a fractional number of cycles, which leaves nothing to average and over-weights whichever seasons the series happens to include. A fourth is letting an outlier bend a season index: a promotion, a stockout, or a data error in one period pulls that season toward itself, so clean or flag such points, or use the median option for the ratios. A fifth is running the multiplicative model on a series with zeros or near-zero demand, which breaks the ratio by dividing by something tiny; the additive model is the safe choice there. Match L to the cycle, pick the method by whether demand trends, feed whole clean cycles, and choose the model from the shape of the swing, and the indices and the forecast will hold up.

Where this calculator fits

It suits anyone who has to turn a seasonal demand history into a next-period number and knows the calendar pattern matters as much as the trend. A demand planner can paste a series, read which seasons run hot and cold, deseasonalize to see the real level underneath the swings, and get a forecast that carries the season forward instead of a flat line that ignores it. An operations or inventory analyst can use the seasonally adjusted forecast to set stock and staffing that rise and fall with the season, rather than holding one level all year. A student or an analyst learning forecasting can watch the classical decomposition happen step by step, the centered moving average removing the trend, the ratios averaging into indices, and the deseasonalized series revealing a clean trend that the raw swings hide.

Because a seasonal forecast is built from a trend and a season, this tool hands off naturally to the rest of the forecasting set. The Linear Regression Forecast Calculator is the trend step itself, the least-squares line fit to the deseasonalized series, and it is worth opening on its own when you want the fit statistics and the prediction band around the trend. The Moving Average Calculator and the Exponential Smoothing Calculator track a level without a trend and can supply the base that the indices reshape, which is the right route when the deseasonalized series is flat rather than trending. Once you have a forecast, a Forecast Error Metrics calculator grades it against actuals with MAD, RMSE, and MAPE, and an XYZ Demand Classification calculator groups items by how variable their demand is; both are siblings in this silo and are not yet live. The Forecasting and Analytics hub gathers the forecasting tools as they go live.

Frequently asked questions

What does this seasonal index calculator do?

It measures the repeating seasonal pattern in a demand series, deseasonalizes the series to expose the trend, and reseasonalizes a projected trend to forecast forward. You paste your demand, one value per period, set a season length of 4 for quarters or 12 for months, and pick a method and a model, and it returns a seasonal index for each position in the cycle, the peak and trough seasons with how far each sits from the average, and the next-period forecast. It draws the raw demand, the deseasonalized series, and the seasonally adjusted forecast on one chart. On the default series of 100, 200, 150, 50, 120, 240, 180, 60 with the simple average method and the multiplicative model, the grand average is 137.5, the indices are Q1 0.80, Q2 1.60, Q3 1.20, Q4 0.40, the deseasonalized series steps from 125 to 150, and the next period forecasts 127.14. Every value stays in your browser.

What is a seasonal index?

A seasonal index is a number that says how far one position in the cycle sits from the yearly average. In the multiplicative model the indices average 1.0, so 1.0 is an average season, above 1.0 is busy, and below 1.0 is quiet, with the distance from 1.0 read as a percentage: an index of 1.60 means that season runs 60 percent above the average and 0.40 means 60 percent below. In the additive model the indices sum to 0 and read as units above or below the average instead of a percentage. The index is relative, describing the shape of the year rather than the size of the business, which is what lets the same index apply as the base level rises or falls. The base-100 form some planners use is the same number times 100, so 1.60 shows as 160 and 0.40 as 40, with 100 the average season.

What is the difference between the simple average and the ratio to moving average methods?

The simple average method divides each season average by the grand average, R[s] = A[s] / G, then normalizes so the indices average 1.0. It is quick and works on flat demand, but it does not remove the trend first, so on a trending series it folds the trend into the indices and biases them. The ratio to centered moving average method divides each point by a centered moving average, Ratio = Y[t] / CMA[t], which removes the trend and cycle before the season is measured, then averages the ratios in each season and normalizes the same way. Use the simple average method for flat, stationary demand and the ratio to moving average method whenever demand clearly rises or falls. On the default series the ratio method tightens the deseasonalized trend fit from an R2 of 0.76 to 0.99, which is the sign the trend was contaminating the simple average indices.

What is a centered moving average and why the half weights?

A centered moving average is a moving average built to sit on a single period even when the window length is even, which a season length of 4 or 12 always is. An ordinary average of four periods falls between two periods rather than on one, so the centered version uses a 2 by L average that gives the two end points half weight. For L = 4 it is CMA[t] = (0.5*Y[t-2] + Y[t-1] + Y[t] + Y[t+1] + 0.5*Y[t+2]) / 4, which spans five values but weights them to cover exactly four periods centered on t. The half weights on the ends are what re-center the window on period t. Because the window reaches L/2 periods on each side, the first and last L/2 periods of the series have no centered moving average, which is one reason the method wants at least two full cycles of data.

Should I use the multiplicative or the additive model?

Choose by how the seasonal swing behaves as the level moves. Use multiplicative when the size of the peak grows with the level, so a busy season stays a fixed percentage above average as the business scales; the indices are ratios that average 1.0 and deseasonalizing divides. Use additive when the swing is a roughly constant number of units regardless of the level; the indices are differences that sum to 0 and deseasonalizing subtracts. Most demand is multiplicative, because seasonal effects tend to scale with volume, which is why the tool opens in that model. Additive suits series with a stable absolute swing, and it is also the safe model when the series has genuine zeros or near-zero demand, which break the multiplicative ratio by dividing by something tiny. Keep the same model through deseasonalizing and reseasonalizing so the season you remove is the season you add back.

How does the tool deseasonalize a series?

It divides or subtracts each period by its season index. In the multiplicative model D[t] = Y[t] / index[season(t)], and in the additive model D[t] = Y[t] – index[season(t)]. Because the multiplicative indices average 1.0 and the additive indices sum to 0, deseasonalizing leaves the yearly total roughly unchanged while flattening the within-year swings, so what remains is the underlying level and trend without the seasonal pattern. On the default series the deseasonalized values come out to a clean step, 125 for the first four quarters and 150 for the next four, which shows the real story the raw swings from 50 to 200 hide: the business held a level of 125 in year one and jumped to 150 in year two. Reading the deseasonalized series is often the most useful thing the tool does, because it separates a real change in the business from the ordinary rhythm of the season.

How is the seasonally adjusted forecast built?

In three steps: deseasonalize, fit a trend, then reseasonalize. First the series is deseasonalized with the indices. Then a linear trend is fit to the smooth series, Dhat[t] = a + b*t, which is the same least-squares fit the Linear Regression Forecast Calculator performs and is how the trend line is fit here. Then the projected trend is reseasonalized by putting the season back: F[t] = (a + b*t) * index[season(t)] in the multiplicative model, or F[t] = (a + b*t) + index[season(t)] in the additive model. On the default series the deseasonalized trend is a = 116.07 and b = 4.76, so the next period, Year 3 Q1 at t = 9 in season 1, has a trend value of 116.07 + 4.76*9 = 158.93, and multiplying by the Q1 index of 0.80 gives 127.14. The forecast carries the trend from the smooth series and the shape from the indices.

What do the peak and trough readouts mean?

The peak is the season with the highest index and the trough is the season with the lowest, and each is reported with how far it sits from the average season. On the default series the peak is Q2 at 60 percent above average, because its index is 1.60, and the trough is Q4 at 60 percent below average, because its index is 0.40. In the multiplicative model the percentage is the distance of the index from 1.0, so an index of 1.49 reads as 49 percent above and 0.55 reads as 45 percent below. In the additive model the readout is in units above or below the average instead. The peak and trough give you the shape of the year at a glance, which season to staff up for and which to hold back on, without reading the whole index table.

How many cycles of data do I need?

At least two full cycles, and preferably three or more. Seasonal indices are averages over cycles, so with only one cycle there is nothing to average and the index is just that single year repeated, outliers and all. Two cycles is the floor, three or more gives steadier indices, and the series should be a whole number of cycles so every season is represented the same number of times. A quarterly series needs at least eight values, a monthly series at least twenty-four, and more is better. A series that stops halfway through a cycle over-weights the seasons it happens to include and biases the indices toward them, so trim the history to a whole number of cycles or fill it out before you fit. Re-estimate the indices as new cycles arrive, since a growing business can see its seasonal shape shift over the years.

Why do the two years give the same indices on the default series?

Because the seasonal proportions held steady across both years even though the level rose. In year one the quarters are 100, 200, 150, 50, and in year two they are 120, 240, 180, 60, which is the same shape scaled up by 20 percent, so each quarter keeps the same ratio to its own year average. The simple average method averages the two years for each season and divides by the grand average, and since the proportions matched, the indices come out to a clean Q1 0.80, Q2 1.60, Q3 1.20, Q4 0.40 with no rescaling needed. That is also why the deseasonalized series is a perfect step from 125 to 150: the season was identical in shape each year, so removing it leaves only the level jump. Real data is rarely this tidy, but the example shows the mechanism clearly.

When should I use the median instead of the mean for the ratios?

Use the median when one period in a season holds an outlier that would drag the mean. The ratio to centered moving average method averages the ratios that fall in each season, and by default it uses the mean, which is efficient but sensitive to a single unusual value: a promotion, a stockout, or a data error in one period pulls that season index toward itself. The median takes the middle ratio instead, so one extreme value moves it much less, which makes the indices more robust when the history is not clean. The trade-off is that the median throws away some information and is slightly noisier on clean data, so use the mean when the ratios in each season are tight and switch to the median when one period is a clear outlier you cannot remove. The option appears only for the ratio to moving average method, since the simple average method does not average ratios.

Can I use this for monthly data?

Yes. Set the season length to 12 for monthly demand, which tells the tool the cycle repeats every twelve periods, and paste at least two, ideally three, full years so each of the twelve months is averaged over enough cycles to give a stable index. The math is the same as the quarterly case with L = 12 instead of 4: the centered moving average uses a 2 by 12 window with half-weighted ends, the ratios average into twelve monthly indices, and the indices normalize to average 1.0. A monthly example might peak in July at about 1.49, 49 percent above the average month, and bottom in December at about 0.55, 45 percent below. The one thing to watch with monthly data is that months have different numbers of days and weekends, and moving holidays drift between months, so a fixed monthly index only approximates demand tied to those effects.

Why does the multiplicative model break on zeros?

Because it divides by the demand and by the index. The multiplicative raw index is A[s] / G, and deseasonalizing is Y[t] / index[season(t)], so a season with zero or near-zero demand either produces an index near zero, which blows up the deseasonalized value when you divide by it, or forces a division by something tiny that makes the result unstable. The additive model never divides: its index is A[s] – G and deseasonalizing is Y[t] – index[season(t)], so a zero is just a small number the subtraction handles cleanly. If your series has genuine zeros or values close to zero, switch to the additive model rather than the multiplicative one. This is one of the few cases where the model choice is forced rather than a judgment about how the swing behaves.

How does this relate to the linear regression, moving average, and exponential smoothing tools?

They fit together as a set. The trend step inside this tool is literally the least-squares fit that the Linear Regression Forecast Calculator performs, run on the deseasonalized series, so that tool is the trend line here shown on its own with fit statistics and a prediction band. The Moving Average and Exponential Smoothing calculators track a level without a trend, and either can supply the base that the seasonal indices then reshape, which is the right route when the deseasonalized series is flat rather than trending. The centered moving average this tool uses to remove the trend is the same idea the Moving Average calculator uses to smooth a series. When your demand has a repeating calendar pattern, this seasonal index is the piece those level and trend tools cannot carry on their own, and it wraps around them by removing the season, letting them fit the base, and adding the season back.

Is the tool free, and does it work in my browser?

Yes to both. The seasonal index calculator is free with no sign-up, and every calculation runs in your browser, so the demand values you enter are never sent to a server, stored, or shared. You can download a PDF of the result, export a CSV, or share a summary on WhatsApp. It builds a seasonal index for each position in the cycle by the simple average or the ratio to centered moving average method, in the multiplicative or additive model, names the peak and trough seasons, deseasonalizes the series, fits a trend to the smooth version, reseasonalizes to forecast forward, and draws the raw demand, the deseasonalized series, and the seasonally adjusted forecast on one chart. It is a planning and analysis tool, so treat the forecast as a well-grounded estimate and read the indices, the deseasonalized series, and the model choice to judge how well it fits your own data before you commit the number to a plan.

More forecasting and analytics calculators

The Moving Average, Exponential Smoothing, and Linear Regression Forecast calculators are live and pair directly with this tool. The other sibling tools below are on the way and are not yet live, so they are listed here for reference rather than linked.

Live
Average a fixed window of recent demand, simple or weighted, with MAD, RMSE, MAPE, the bias, and a window sweep. The same centered-average idea this tool uses to remove the trend, run on its own to smooth a series.
Live
Weight the whole history with a weight that fades, SES for a level or Holt for a trend. A level-tracking method that can supply the base the seasonal indices then reshape.
Live
Fit a least-squares trend line and project it with a prediction band, R2, and a trend verdict. This is the trend step inside the seasonal forecast, shown on its own with the fit statistics.
Coming soon
Forecast Error Metrics Calculator
Grade any forecast against actuals with MAD, RMSE, MAPE, and a tracking signal that watches the bias drift over time, including the seasonally adjusted forecast this tool produces.
Coming soon
XYZ Demand Classification Calculator
Group items by demand variability so you send steady items to a trend or level method and erratic or lumpy items to a method built for them.

The forecasting tools work as a set. This tool measures and removes the season, then reuses the Linear Regression Forecast fit for the trend and adds the season back. The Moving Average and Exponential Smoothing calculators track a level and can supply the base under the indices when the deseasonalized series is flat. When you want to grade a forecast from any method over time, Forecast Error Metrics takes MAD, RMSE, and MAPE further with a tracking signal. The Forecasting and Analytics hub gathers the forecasting tools as they go live.

Sources, disclaimer, and editorial transparency

The relationships used here are standard seasonal-decomposition and forecasting practice. A demand series is fit with a repeating cycle of length L, L = 4 quarters or L = 12 months, with season(t) repeating 1 through L. The simple average method sets the grand average G = mean of all demand, the season average A[s] = mean of the demand in season s, and the raw index R[s] = A[s] / G (multiplicative) or A[s] – G (additive), then normalizes so the L indices average 1.0 (multiplicative) or sum to 0 (additive): index[s] = R[s] * L / sum(R) in the multiplicative case. The ratio to centered moving average method uses CMA[t] = (0.5*Y[t-2] + Y[t-1] + Y[t] + Y[t+1] + 0.5*Y[t+2]) / 4 for L = 4, with a 2 by L window and half-weighted ends in general, forms Ratio = Y[t] / CMA[t], averages the ratios by mean or median in each season, and normalizes the same way. Deseasonalizing is D[t] = Y[t] / index[season(t)] (multiplicative) or Y[t] – index[season(t)] (additive); a linear trend Dhat[t] = a + b*t is fit to the deseasonalized series by least squares, exactly as in the Linear Regression Forecast Calculator, and the forecast is F[t] = (a + b*t) * index[season(t)] (multiplicative) or (a + b*t) + index[season(t)] (additive). The worked-example numbers are computed from the series shown: the default series of 100, 200, 150, 50, 120, 240, 180, 60 gives grand average 137.5, indices Q1 0.80, Q2 1.60, Q3 1.20, Q4 0.40, a deseasonalized step from 125 to 150, a trend of a = 116.07 and b = 4.76, and a next-period forecast of 127.14 with a full Year 3 of Q1 127.14, Q2 261.90, Q3 202.14, Q4 69.29; the ratio to moving average method on the same series gives CMA 127.5 at t = 3 and 135 at t = 4, indices Q1 0.836, Q2 1.615, Q3 1.178, Q4 0.371, an R2 of 0.99 against 0.76, and a next-period forecast of 139.17; the additive model gives indices Q1 -27.5, Q2 +82.5, Q3 +27.5, Q4 -82.5 and a next-period forecast of 131.43; the three-year series of 100, 200, 150, 50, 120, 240, 180, 60, 140, 280, 210, 70 gives the same index shape, a deseasonalized step of 125, 150, 175, a trend of a = 113.64 and b = 5.59, and a next-year forecast of Q1 149.09, Q2 307.13, Q3 237.06, Q4 81.26; and a monthly example with L = 12 peaks in July near 1.49 and bottoms in December near 0.55. This calculator and guide are built and reviewed by the OpsCalculators team; see our Editorial Policy for how each tool is researched, built, and tested.

Results are accurate for the formulas and the series above, and they are a planning and analysis estimate, not a guarantee of future demand. A seasonal index assumes a fixed, repeating pattern of a known length, so it needs L to match the true cycle, at least two and preferably three or more whole cycles, and clean data; it cannot capture moving holidays like Easter or month-length differences, the simple average method biases the indices on a strongly trending series, and the multiplicative model breaks on zero or near-zero demand. Match the season length to the data, use the ratio to centered moving average method when demand trends, choose the model from how the swing behaves, and read the deseasonalized series to judge whether the pattern was captured before you trust the forecast. See our full Disclaimer. OpsCalculators.com is operated by MAFHH INTERNATIONAL LTD. Your inputs are processed in your browser and are never stored; see our Privacy Policy.