2016-06-25 2 views
0

Я пытаюсь запустить основную seasonal_decompose на часто используемых авиапассажиров набора данных, который начинается с этих строк:seasonal_decompose вызывает ошибку: TypeError: PeriodIndex. Проверьте freq` атрибут `вместо infer_freq

Month 
1949-02 4.770685 
1949-03 4.882802 
1949-04 4.859812 
1949-05 4.795791 
1949-06 4.905275 
1949-07 4.997212 
1949-08 4.997212 
1949-09 4.912655 
1949-10 4.779123 
1949-11 4.644391 
1949-12 4.770685 
1950-01 4.744932 
1950-02 4.836282 
1950-03 4.948760 
1950-04 4.905275 
1950-05 4.828314 
1950-06 5.003946 
1950-07 5.135798 
1950-08 5.135798 
Freq: M, Name: Passengers, dtype: float64 

Мой тип индекса является:

pandas.tseries.period.PeriodIndex 

Я пытаюсь запустить некоторые очень простой код:

from statsmodels.tsa.seasonal import seasonal_decompose 
log_passengers.interpolate(inplace = True) 
decomposition = seasonal_decompose(log_passengers) 

Вот полный вывод ошибки:

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-113-bf122d457673> in <module>() 
     1 from statsmodels.tsa.seasonal import seasonal_decompose 
     2 log_passengers.interpolate(inplace = True) 
----> 3 decomposition = seasonal_decompose(log_passengers) 

/Users/ann/anaconda/lib/python3.5/site-packages/statsmodels/tsa/seasonal.py in seasonal_decompose(x, model, filt, freq) 
    56  statsmodels.tsa.filters.convolution_filter 
    57  """ 
---> 58  _pandas_wrapper, pfreq = _maybe_get_pandas_wrapper_freq(x) 
    59  x = np.asanyarray(x).squeeze() 
    60  nobs = len(x) 

/Users/ann/anaconda/lib/python3.5/site-packages/statsmodels/tsa/filters/_utils.py in _maybe_get_pandas_wrapper_freq(X, trim) 
    44   index = X.index 
    45   func = _get_pandas_wrapper(X, trim) 
---> 46   freq = index.inferred_freq 
    47   return func, freq 
    48  else: 

pandas/src/properties.pyx in pandas.lib.cache_readonly.__get__ (pandas/lib.c:44097)() 

/Users/ann/anaconda/lib/python3.5/site-packages/pandas/tseries/base.py in inferred_freq(self) 
    233   """ 
    234   try: 
--> 235    return frequencies.infer_freq(self) 
    236   except ValueError: 
    237    return None 

/Users/ann/anaconda/lib/python3.5/site-packages/pandas/tseries/frequencies.py in infer_freq(index, warn) 
    854 
    855  if com.is_period_arraylike(index): 
--> 856   raise TypeError("PeriodIndex given. Check the `freq` attribute " 
    857       "instead of using infer_freq.") 
    858  elif isinstance(index, pd.TimedeltaIndex): 

TypeError: PeriodIndex given. Check the `freq` attribute instead of using infer_freq. 

Вот что я пытался:

  • Использование decomposition = seasonal_decompose(log_passengers, infer_freq = True), который производит ошибку: TypeError: seasonal_decompose() got an unexpected keyword argument 'infer_freq'
  • Использование decomposition = seasonal_decompose(log_passengers, freq = 'M'), что приводит к ошибке: TypeError: PeriodIndex given. Check the FREQ attribute instead of using infer_freq.
  • Я также проверить, что каждый период индекс в моем индексе индексов периода имеет одинаковую частоту со списком кода: set([x.freq for x in log_passengers.index]), который действительно создал набор только одной частоты: {<MonthEnd>}

Я вижу некоторые разговоры об этом по различным вопросам Github (https://github.com/pydata/pandas/issues/6771), но ничто из обсуждаемого не помогает. Любые предложения по устранению этого или того, что я делаю неправильно в этом простом seasona_decompose?

+0

Я думаю, что seasonal_decompose не поддерживает индекс периода должным образом. Я думаю, что он должен корректно работать с DateTimeIndex. statsmodels 0.8.0rc1 позволяет заданной 'freq' переопределять все, что находится в индексе pandas. Я не знаю, работает ли это с индексом периода. Пожалуйста, откройте вопрос о statsmodels github, если вы не получите решение в ответ. (Я мало знаю о pandas DateTime и обработке периода.) – user333700

ответ

0

seasonal_decompose не принимает PeriodIndex, обходной путь будет преобразование индекса DatetimeIndex используя to_timestamp метод:

from statsmodels.tsa.seasonal import seasonal_decompose 
log_passengers.interpolate(inplace = True) 
log_passengers.index=log_passengers.index.to_timestamp() 
decomposition = seasonal_decompose(log_passengers)