Преобразование даты для плавания для линейной регрессии в кадре данных Pandas

Похоже, что для линейной регрессии OLS хорошо работать в Pandas, аргументы должны быть плавающими. Я начинаю с 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 для выполнения базовой регрессии по датам, а также для более общего анализа временных рядов. Помощь, примеры и ресурсы приветствуются!

Обратите внимание, что с приведенным выше кодом, если я преобразую индекс даты (для данного города) в массив, значения в этом массиве имеют вид:

 '\xef\xbb\xbf2014-04-28' 

Как произвести анализ AIC по всем непродажным параметрам? (например, результат может заключаться в том, что продажи зависят максимально линейно от даты и города).

2 Solutions collect form web for “Преобразование даты для плавания для линейной регрессии в кадре данных Pandas”

Для такого рода регрессии я обычно конвертирую даты или временные метки в целое число дней с момента начала данных.

Это делает трюк красиво:

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

  • pandas.DataFrame.apply () не удалось после pandas.to_datetime ()
  • Панды: присоединяйтесь к DataFrames в поле с разными именами?
  • Python Pandas подсчет и суммирование конкретных условий
  • Python, Pandas: записывать содержимое DataFrame в текстовый файл
  • Подсчет дат в диапазоне, заданном рамкой данных pandas
  • Чтение двоичных данных в панды
  • транспонировать несколько столбцов Pandas dataframe
  • Метод to_sql pandas изменяет схему таблиц sqlite
  • Python - лучший язык программирования в мире.