11

我希望使用 Python 对每月数据进行季节性调整。正如您从这些系列中看到的那样:www.emconfidential.com,数据中有很高的季节性成分。我想对此进行调整,以便更好地判断系列趋势是上升还是下降。有人知道如何使用 scipy 或其他 Python 库轻松做到这一点吗?

4

5 回答 5

15

Statsmodels 可以做到这一点。它们具有基本的季节性分解,也是 Census X13 调整的包装。您还可以使用 rpy2 访问 R 的一些优秀的 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

于 2015-03-10T16:46:33.073 回答
4

没有神奇的 python 库可以为你做季节性调整。做这种事情的应用程序往往相当大

您需要自己计算数学,然后使用 scipy 为您计算其余部分。

于 2010-01-14T20:44:15.203 回答
2

现在有一个似乎正是您正在寻找的包!查看seasonal包装,这是链接。我个人觉得它非常有用,想知道其他人的想法。

于 2016-09-22T17:29:53.630 回答
1

我建议由 Facebook 的数据科学团队开发的Prophet 。它具有 Python+R API 并用于时间序列预测,尽管您可以将其仅用于将序列分解为其组件(趋势与季节性)。您可以轻松调整和可视化分解:

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='-*')

有噪音的系列

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

趋势和季节性分解

于 2018-01-17T14:55:27.857 回答
0

不确定这方面的编程,但我会认真考虑移动平均线来解决这个问题。

于 2010-01-14T20:01:07.447 回答