Преобразование даты в float для линейной регрессии на фрейме данных Pandas
кажется, что для того, чтобы линейная регрессия OLS хорошо работала в панд, аргументы должны быть поплавками. Я начинаю с csv (называемого " gameAct.csv") формы:
date, city, players, sales
2014-04-28,London,111,1091.28
2014-04-29,London,100,1100.44
2014-04-28,Paris,87,1001.33
...
Я хочу выполнить линейную регрессию того, как продажи зависят от даты (как время движется вперед, как движутся продажи?). Проблема с моим кодом ниже, похоже, заключается в том, что даты не являются значениями float. Я был бы признателен за помощь в решении этой проблемы индексирования в Pandas.
мой текущий (не работает, но компиляция кода):
import pandas as pd
from pandas import DataFrame, Series
import statsmodels.formula.api as sm
df = pd.read_csv('gameAct.csv')
df.columns = ['date', 'city', 'players', 'sales']
city_data = df[df['city'] == 'London']
result = sm.ols(formula = 'sales ~ date', data = city_data).fit()
поскольку я изменяю значение города, я получаю результаты R^2 = 1, что неверно. Я также попытался index_col = 0, parse_dates == True'
в определении dataframe df
, но без успеха.
Я подозреваю, что есть лучший способ читать в таких csv-файлах для выполнения базовой регрессии по датам, а также для более общего анализа временных рядов. Помощь, примеры и ресурсы приветствуются!
Примечание, с вышеуказанным кодом, если я преобразую индекс дат (для данного города) в массив, значения в этом массиве имеют вид:
'xefxbbxbf2014-04-28'
как создать АИК анализ по всем внереализационных параметров? (например, результатом может быть то, что продажи зависят наиболее линейно от даты и города).
2 ответов
для такого рода регрессии я обычно преобразую даты или метки времени в целое число дней с момента начала данных.
это делает трюк красиво:
df = pd.read_csv('test.csv')
df['date'] = pd.to_datetime(df['date'])
df['date_delta'] = (df['date'] - df['date'].min()) / np.timedelta64(1,'D')
city_data = df[df['city'] == 'London']
result = sm.ols(formula = 'sales ~ date_delta', data = city_data).fit()
преимущество этого метода заключается в том, что вы уверены в единицах, участвующих в регрессии (днях), тогда как автоматическое преобразование может неявно использовать другие единицы, создавая запутанные коэффициенты в вашей линейной модели. Он также позволяет комбинировать данные из нескольких кампаний продаж, которые начало в разное время в вашей регрессии (скажем, вы заинтересованы в эффективности кампании в зависимости от дней в кампании). Вы также можете выбрать 1 января в качестве 0, если вы заинтересованы в измерении тенденции дня года. Выбор собственной даты 0 ставит вас под контроль всего этого.
есть также доказательства того, что statsmodels поддерживает временные ряды от панд. Вы можете применить это к линейным моделям как что ж: http://statsmodels.sourceforge.net/stable/examples/generated/ex_dates.html
кроме того, быстрое Примечание: Вы должны иметь возможность автоматически считывать имена столбцов непосредственно из csv, как в примере кода, который я опубликовал. В вашем примере я вижу пробелы между запятыми в первой строке csv-файла, в результате чего имена столбцов, такие как "дата". Удалите пробелы и автоматическое чтение заголовка csv должно просто работать.
Я не уверен в специфике statsmodels, но этот пост перечисляет все преобразования даты/времени для python. Они не всегда один к одному, поэтому это ссылка, которую я часто использовал; -)