Преобразование даты в 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. Они не всегда один к одному, поэтому это ссылка, которую я часто использовал; -)