Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分解趋势、季节和剩余时间序列元素_Python_Pandas_Machine Learning_Time Series_Statsmodels - Fatal编程技术网

Python 分解趋势、季节和剩余时间序列元素

Python 分解趋势、季节和剩余时间序列元素,python,pandas,machine-learning,time-series,statsmodels,Python,Pandas,Machine Learning,Time Series,Statsmodels,我有一个带有几个时间序列的DataFrame: divida movav12 var varmovav12 Date 2004-01 0 NaN NaN NaN 2004-02 0 NaN NaN NaN 2004-03 0 NaN

我有一个带有几个时间序列的
DataFrame

         divida    movav12       var  varmovav12
Date                                            
2004-01       0        NaN       NaN         NaN
2004-02       0        NaN       NaN         NaN
2004-03       0        NaN       NaN         NaN
2004-04      34        NaN       inf         NaN
2004-05      30        NaN -0.117647         NaN
2004-06      44        NaN  0.466667         NaN
2004-07      35        NaN -0.204545         NaN
2004-08      31        NaN -0.114286         NaN
2004-09      30        NaN -0.032258         NaN
2004-10      24        NaN -0.200000         NaN
2004-11      41        NaN  0.708333         NaN
2004-12      29  24.833333 -0.292683         NaN
2005-01      31  27.416667  0.068966    0.104027
2005-02      28  29.750000 -0.096774    0.085106
2005-03      27  32.000000 -0.035714    0.075630
2005-04      30  31.666667  0.111111   -0.010417
2005-05      31  31.750000  0.033333    0.002632
2005-06      39  31.333333  0.258065   -0.013123
2005-07      36  31.416667 -0.076923    0.002660
我想分解第一个时间序列
divida
,将其趋势与其季节性和剩余成分分开

我找到了答案,并尝试使用以下代码:

import statsmodels.api as sm

s=sm.tsa.seasonal_decompose(divida.divida)
然而,我不断地得到这个错误:

Traceback (most recent call last):
File "/Users/Pred_UnBR_Mod2.py", line 78, in <module> s=sm.tsa.seasonal_decompose(divida.divida)
File "/Library/Python/2.7/site-packages/statsmodels/tsa/seasonal.py", line 58, in seasonal_decompose _pandas_wrapper, pfreq = _maybe_get_pandas_wrapper_freq(x)
File "/Library/Python/2.7/site-packages/statsmodels/tsa/filters/_utils.py", line 46, in _maybe_get_pandas_wrapper_freq
freq = index.inferred_freq
AttributeError: 'Index' object has no attribute 'inferred_freq'
回溯(最近一次呼叫最后一次):
文件“/Users/Pred_UnBR_Mod2.py”,第78行,在s=sm.tsa.seasonal_decompose(divida.divida)中
文件“/Library/Python/2.7/site packages/statsmodels/tsa/seasonal.py”,第58行,在seasonal_decompose_pandas_包装器中,pfreq=_maybe_get_pandas_包装器_freq(x)
文件“/Library/Python/2.7/site-packages/statsmodels/tsa/filters/_-utils.py”,第46行,在“可能”、“获得”、“熊猫”、“包装器”和“频率”中
freq=index.expressed\u freq
AttributeError:“Index”对象没有“推断频率”属性

如何继续?

在将
索引转换为
日期时间索引时可以正常工作:

df.reset_index(inplace=True)
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index('Date')
s=sm.tsa.seasonal_decompose(df.divida)

<statsmodels.tsa.seasonal.DecomposeResult object at 0x110ec3710>

仅当您提供频率时,Statsmodel才会分解序列。通常所有的时间序列索引都会包含频率,例如:按天、工作日、每周,所以它会显示错误。您可以通过两种方式删除此错误:

  • Stefan所做的是将索引列赋予pandas
    DateTime
    函数。它使用内部函数
    expert_freq
    查找频率并返回带有频率的索引
  • 否则,您可以将索引列的频率设置为
    df.index.asfreq(freq='m')
    。此处
    m
    表示月份。如果您有领域知识或通过
    d
    设置频率
  • 简单一点:

    遵循三个步骤:
    1.如果未完成,请在
    yyyy-mm-dd
    dd-mm-yyy
    中创建列(使用excel)。
    2.然后使用pandas将其转换为日期格式,如下所示:
    df['Date']=pd.to_datetime(df['Date'])

    3.使用以下方法对其进行分解:

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


    这取决于索引格式。可以使用DateTimeIndex,也可以使用PeriodIndex。Stefan给出了DateTimeIndex的示例。下面是我的PeriodIndex示例。 我的原始数据框架有一个多索引索引,第一级是年,第二级是月。以下是我如何将其转换为PeriodIndex:

    df["date"] = pd.PeriodIndex (df.index.map(lambda x: "{0}{1:02d}".format(*x)),freq="M")
    df = df.set_index("date")
    

    现在,季节分解可以使用它了。

    尝试使用parse\u dates解析date列,稍后再提到index列

    from statsmodels.tsa.seasonal import seasonal_decompose
    data=pd.read_csv(airline,header=0,squeeze=True,index_col=[0],parse_dates=[0])
    res=seasonal_decompose(data)
    

    你的
    divida.index.dtype是什么?这应该是一个DatetimeIndexQuick问题:如何访问该结果?我只收到了感谢@Stefan,救了我的命!您好,当我尝试此代码时,我得到以下错误:
    AttributeError:“RangeIndex”对象没有属性“推断的频率”
    任何建议??错误表明您的索引属于
    RangeIndex
    类型,而它应该是
    DateTimeIndex
    (请参阅示例中的
    Date
    列的情况)@Leevo您必须指定一个频率,例如,您可以对数据重新采样:谢谢,旧问题已经解决。但是现在它说:
    ValueError:无法插入级别0,已经存在了
    。有什么建议吗?对你的问题做一些更详细的描述。带有回溯错误的代码将有助于解决此问题
    from statsmodels.tsa.seasonal import seasonal_decompose
    data=pd.read_csv(airline,header=0,squeeze=True,index_col=[0],parse_dates=[0])
    res=seasonal_decompose(data)