Сезонная корректировка в Python и Scipy - PullRequest
9 голосов
/ 14 января 2010

Я рассчитываю на сезонную корректировку месячных данных, используя Python. Как видно из этих серий: www.emconfidential.com , в данных присутствует высокий сезонный компонент. Я хотел бы приспособиться к этому, чтобы лучше понять, растет ли тренд серии или падает. Кто-нибудь знает, как это легко сделать, используя scipy или другую библиотеку Python?

Ответы [ 5 ]

7 голосов
/ 10 марта 2015

Statsmodels может сделать это. Они имеют базовую сезонную декомпозицию, а также обертку к переписи X13. Вы также можете использовать rpy2 для доступа к некоторым превосходным библиотекам SA. Вот statsmodels сезонная декомпозиция:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
pd.options.display.mpl_style = 'default'
%matplotlib inline

dta = sm.datasets.co2.load_pandas().data.resample("M").fillna(method="ffill")

res = sm.tsa.seasonal_decompose(dta)

fig = res.plot()
fig.set_size_inches(10, 5)
plt.tight_layout()

http://statsmodels.sourceforge.net/0.6.0/release/version0.6.html

3 голосов
/ 14 января 2010

Нет волшебной библиотеки питонов, которая будет делать сезонные корректировки для вас. Приложения, которые делают подобные вещи, имеют тенденцию быть довольно большими .

Вам нужно будет самому заняться математикой , а затем использовать scipy, чтобы рассчитать остальное для вас.

1 голос
/ 17 января 2018

Я бы предложил Пророк , разработанный группой по науке в Facebook. Он имеет API-интерфейс Python + R и используется для прогнозирования временных рядов, хотя вы можете использовать его только для разложения ряда на его компоненты (тренд против сезонности). Вы можете легко настроить и визуализировать разложение:

from fbprophet import Prophet
import numpy as np
import pandas as pd

# Create series
np.random.seed(0)
x = np.arange(0, 10, .285)
y_periodic = np.sin(x*np.pi)
y_random = np.random.normal(size=len(x))
y_trend = x / 10.
df = pd.DataFrame({'ds': pd.date_range('01-01-2017', periods=len(x)),
                    'y': y_periodic})
df.head() # has to be a DataFrame with columns "ds" and "y"
df.set_index('ds').plot(style='-*')

Series with noise

# Estimate the model
m = Prophet()
m.fit(df);
forecast = m.predict(df)
m.plot_components(forecast);

Trend and seasonality decomposition

1 голос
/ 22 сентября 2016

Теперь есть пакет, который, кажется, именно то, что вы ищете! Проверьте пакет seasonal, вот ссылка . Я лично нашел это очень полезным, интересно, что думают другие.

0 голосов
/ 14 января 2010

Не уверен в программном аспекте, но я бы серьезно подумал о скользящих средних для решения этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...