Python和Scipy的季节性调整

时间:2010-01-14 19:48:54

标签: python scipy

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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

没有神奇的python库可以为你做季节性调整。执行此类操作的应用程序往往是rather large

你需要算出数学yourself,然后用scipy为你计算剩下的数学。

答案 2 :(得分:1)

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

答案 3 :(得分: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='-*')

Series with noise

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

Trend and seasonality decomposition

答案 4 :(得分:0)

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