Модель VAR с pandas + statsmodels в Python

Я активный пользователь R, но недавно перешел на Python по нескольким причинам. Тем не менее, я немного изо всех сил пытаюсь запустить векторную модель AR в Python из statsmodels.

Вопрос №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, все работает нормально.

Я пробую модель VAR с третьим, более коротким вектором, ts, из книги Уэса МакКинни «Python для анализа данных», стр. 293, и она не работает.

Итак, теперь я думаю, что это потому, что векторы разных типов:

    >>> 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 лучшей для использования?


person user1822685    schedule 03.04.2013    source источник


Ответы (1)


Когда вы передаете объект pandas модели временных рядов, он ожидает, что индекс — это даты. Сообщение об ошибке улучшено в текущем источнике (будет выпущено в ближайшее время).

ValueError: Given a pandas object and the index does not contain dates

Во втором случае вы отдаете VAR одну серию из 1 дня. VAR используются, когда у вас есть более одной серии. Вот почему у вас есть ошибка формы, потому что она ожидает, что в вашем массиве будет второе измерение. Вероятно, мы могли бы улучшить сообщение об ошибке здесь. Для односерийной модели AR с экзогенными переменными вы, вероятно, захотите использовать sm.tsa.ARMA. Обратите внимание, что в ARMA.predict скоро будет исправлена ​​известная ошибка для моделей с экзогенными переменными. . Если бы вы могли предоставить тестовый пример для этого, это было бы полезно.

person jseabold    schedule 03.04.2013
comment
А, хорошо, это имеет большой смысл. С точки зрения варианта использования - скажем, вы пытаетесь предсказать скорость, где каждая скорость связана с отметкой времени. Другие переменные функций, которые полезны для прогнозов, включают местоположение (например, состояние) и т. д. Я хотел бы запустить модель AR (p) как со скоростью, так и с местоположением. Тогда моя формула будет выглядеть примерно так: Y_t = a + b_iY_t-i +... + c_iL_t-i + ... + ошибка. - person user1822685; 03.04.2013
comment
Я получаю ValueError (в настоящее время вам нужно указать частоту, если используются даты.), что согласно [statsmodels.sourceforge.net/devel/generated/ должно иметь значение «Нет». Я включаю частоту ('D'): model=statsmodels.tsa.arima_model.ARMA(c, freq='D'), и это работает, но когда я пытаюсь сделать results=model.fit(24), выдает TypeError (объект 'int' не имеет атрибута 'getitem'). Есть мысли по этому поводу? - person user1822685; 04.04.2013
comment
Проблема с частотой должна быть исправлена ​​в мастере, но еще не выпущена. Какую версию кода вы используете? - person jseabold; 04.04.2013
comment
По другому вопросу. См. строку документации fit. Он не ожидает целого числа в качестве первого аргумента. - person jseabold; 04.04.2013
comment
Привет, @jseabold, я использую python 2.7.3, statsmodels 0.4, pandas 0.10.1. Для частоты "D", "M" и "W" работают, а "H", "L" и "S" нет... и непонятно почему. - person user1822685; 11.04.2013
comment
Вам необходимо перейти на текущий код. Это еще не исправлено в релизе. Мы собираемся выпустить 0.5.0 в ближайшее время, если вы не можете собрать код из исходников. - person jseabold; 12.04.2013