在Python中使用pandas + statsmodels实现VAR模型

5

我是一个热衷于使用R的用户,但最近由于一些不同的原因转向Python。然而,我在使用statsmodels中的向量AR模型时遇到了一些困难。

问题#1:当我运行此代码时,出现错误,并且我怀疑这与我的向量类型有关。

    import numpy as np
    import statsmodels.tsa.api
    from statsmodels import datasets
    import datetime as dt
    import pandas as pd
    from pandas import Series
    from pandas import DataFrame
    import os

    df = pd.read_csv('myfile.csv')
    speedonly = DataFrame(df['speed'])
    results = statsmodels.tsa.api.VAR(speedonly)

    Traceback (most recent call last):
    File "<pyshell#14>", line 1, in <module>
      results = statsmodels.tsa.api.VAR(speedonly)
    File "C:\Python27\lib\site-packages\statsmodels\tsa\vector_ar\var_model.py", line 336, in __init__
      super(VAR, self).__init__(endog, None, dates, freq)
    File "C:\Python27\lib\site-packages\statsmodels\tsa\base\tsa_model.py", line 40, in __init__
      self._init_dates(dates, freq)
    File "C:\Python27\lib\site-packages\statsmodels\tsa\base\tsa_model.py", line 54, in _init_dates
      raise ValueError("dates must be of type datetime")
    ValueError: dates must be of type datetime

现在,有趣的是,当我运行来自这里的VAR示例时(https://github.com/statsmodels/statsmodels/blob/master/docs/source/vector_ar.rst#id5),它可以正常工作。
我尝试使用Wes McKinney的《Python数据分析》第293页中的第三个更短的向量ts进行VAR模型测试,但它无法工作。
好的,现在我想这是因为向量类型不同:
    >>> speedonly.head()
         speed
    0  559.984
    1  559.984
    2  559.984
    3  559.984
    4  559.984
    >>> type(speedonly)
    <class 'pandas.core.frame.DataFrame'> #DOESN'T WORK

    >>> type(data)
    <type 'numpy.ndarray'> #WORKS

    >>> ts
    2011-01-02   -0.682317
    2011-01-05    1.121983
    2011-01-07    0.507047
    2011-01-08   -0.038240
    2011-01-10   -0.890730
    2011-01-12   -0.388685
    >>> type(ts)
    <class 'pandas.core.series.TimeSeries'> #DOESN'T WORK

我将speedonly转换为ndarray,但仍然无法正常工作。但是这次我收到了另一个错误:

   >>> nda_speedonly = np.array(speedonly)
   >>> results = statsmodels.tsa.api.VAR(nda_speedonly)

   Traceback (most recent call last):
   File "<pyshell#47>", line 1, in <module>
     results = statsmodels.tsa.api.VAR(nda_speedonly)
   File "C:\Python27\lib\site-packages\statsmodels\tsa\vector_ar\var_model.py", line 345, in __init__
     self.neqs = self.endog.shape[1]
   IndexError: tuple index out of range

有什么建议吗?

问题2:我的数据集中有外生特征变量,似乎对预测有用。那么,statsmodels中的上述模型是否是最好的选择?

1个回答

4
当您将一个pandas对象提供给时间序列模型时,它期望索引是日期。当前源代码中的错误消息已经得到改进(即将发布)。
ValueError: Given a pandas object and the index does not contain dates

在第二种情况下,您将单个1d系列提供给VAR。当您有多个系列时,才会使用VAR。这就是为什么您会遇到形状错误,因为它期望您的数组中有第二个维度。我们可能可以改进此处的错误消息。对于具有外生变量的单个系列AR模型,您可能想使用sm.tsa.ARMA。请注意,对于具有外生变量的模型,在ARMA.predict中存在已知错误,该错误很快就会被修复。如果您能为此提供一个测试用例,那将很有帮助。

啊,好的,这很有道理。就使用情况而言——比如说你想要预测速度,其中每个速度都与时间戳相关联。其他对于预测有用的特征变量包括位置(例如州),等等。我想要运行一个同时包含速度和位置的AR(p)模型。我的公式大致上会是这样的:Y_t = a + b_iY_t-i +... + c_iL_t-i + ... + error。 - user1822685
我遇到了一个ValueError(“如果使用日期,则目前需要提供频率。”),但根据[http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_model.ARMA.html],它应该允许为“None”。我包含了一个频率('D'):`model=statsmodels.tsa.arima_model.ARMA(c, freq='D'),这样可以工作,但是当我尝试进行 results=model.fit(24)` 时,它抛出了一个 TypeError (“'int' object has no attribute 'getitem'”)。有什么想法吗? - user1822685
频率问题应该在主分支中得到解决,但尚未发布。您正在运行哪个版本的代码? - jseabold
关于另一个问题,请查看fit的文档字符串。它不期望第一个参数为整数。 - jseabold
嘿@jseabold-我正在使用Python 2.7.3,statsmodels 0.4,pandas 0.10.1。对于频率“D”,“M”和“W”有效,但“H”,“L”和“S”无效...而且不清楚原因。 - user1822685
你需要升级到当前代码。这个问题还没有在发布中得到修复。如果你无法从源代码构建,我们很快就会发布0.5.0版本。 - jseabold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接