Paras Mani
Paras Mani

Reputation: 77

Python seasonal_decompose function from Statsmodels library giving ValueError

I am trying to decompose seasonality and trend of my time series data using seasonal_decompose function from Statsmodels library but I am getting ValueError

Data :

                    A (Current average)
     TS 
2017-12-01 00:01:00 3.274965
2017-12-01 00:02:00 3.274083
2017-12-01 00:03:00 3.262563
2017-12-01 00:04:00 3.278352
2017-12-01 00:05:00 3.251769

Index of data :

ts_log.index

output :

DatetimeIndex(['2017-12-01 00:01:00', '2017-12-01 00:02:00',
               '2017-12-01 00:03:00', '2017-12-01 00:04:00',
               '2017-12-01 00:05:00', '2017-12-01 00:06:00',
               '2017-12-01 00:07:00', '2017-12-01 00:08:00',
               '2017-12-01 00:09:00', '2017-12-01 00:10:00',
               ...
               '2018-01-04 23:26:00', '2018-01-04 23:27:00',
               '2018-01-04 23:28:00', '2018-01-04 23:29:00',
               '2018-01-04 23:30:00', '2018-01-04 23:31:00',
               '2018-01-04 23:32:00', '2018-01-04 23:33:00',
               '2018-01-04 23:34:00', '2018-01-04 23:35:00'],
              dtype='datetime64[ns]', name='TS', length=50000, freq=None)

Decomposing seasonality

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(ts_log)

Error :

ValueError                                Traceback (most recent call last)
<ipython-input-79-7ca5a90bdbf8> in <module>()
      1 from statsmodels.tsa.seasonal import seasonal_decompose
----> 2 decomposition = seasonal_decompose(ts_log)
      3 
      4 trend = decomposition.trend
      5 seasonal = decomposition.seasonal

C:\Users\Paras Mani\Anaconda2\envs\py3\lib\site-packages\statsmodels\tsa\seasonal.py in seasonal_decompose(x, model, filt, freq, two_sided)
     82             freq = pfreq
     83         else:
---> 84             raise ValueError("You must specify a freq or x must be a "
     85                              "pandas object with a timeseries index with"
     86                              "a freq not set to None")

ValueError: You must specify a freq or x must be a pandas object with a timeseries index witha freq not set to None

Here I am using timeseries index but frequency is set to None. How can I change the frequency.

Upvotes: 2

Views: 5826

Answers (2)

Jason
Jason

Reputation: 4546

If you have a pandas dataframe with a DateTimeIndex, you can inspect its frequency attribute.

print(df.index.freq)

If this returns None, you can set the frequency by assigning directly to the df.index.freq attribute or by using the df.asfreq() method. Eg.

# Set df freq to 120 min
df.index.freq = '120t'
df.asfreq('120t')

Using df.asfreq() will allow you to easily resample/convert between frequencies and handle resampling. You can find a list of valid offset aliases (the 't' part of the code) here. Or you can run pd.tseries.offsets.__all__ to get a list of valid offsets only (NB, this won't print aliases, so you'll see Minute instead of min or t).

Once your dataframe has a valid time you can run seasonal_decompose(). From experimenting in statsmodels 0.12.2, frequencies above 1 hour i.e. freq < '60T', results in ValueError: freq T not understood. Please report if you think this is in error. being thrown. If this means you'll need to downsample your df, I'd recommend using as approach along the lines of the following df.resample('1H').median().

Upvotes: 1

Lassa Samaila
Lassa Samaila

Reputation: 1

Try this:

from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(x, model='additive', filt=None, freq=52)
fig = decomposition.plot()
plt.show()

Upvotes: -1

Related Questions