将日期转换为float以在Pandas数据框上进行线性回归

Que*_*atl 12 python time-series 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

...
Run Code Online (Sandbox Code Playgroud)

我想对销售取决于日期的方式进行线性回归(随着时间的推移,销售如何移动?).我的代码下面的问题似乎是日期不是浮点值.我将非常感谢如何解决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()
Run Code Online (Sandbox Code Playgroud)

当我改变城市价值时,我得到R ^ 2 = 1的结果,这是错误的.我也试图index_col = 0, parse_dates == True'定义dataframe df,但没有成功.

我怀疑有更好的方法来读取这些csv文件以执行日期的基本回归,以及更一般的时间序列分析.感谢帮助,示例和资源!

注意,使用上面的代码,如果我将日期索引(对于给定的城市)转换为数组,则此数组中的值具有以下形式:

'\xef\xbb\xbf2014-04-28'
Run Code Online (Sandbox Code Playgroud)

如何对所有非销售参数进行AIC分析?(例如,结果可能是销售在日期和城市中线性最依赖).

Tom*_* Q. 25

对于这种回归,我通常将日期或时间戳转换为自数据开始以来的整数天.

这很好地解决了这个问题:

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()
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是您可以确定回归中涉及的单位(天),而自动转换可能会隐式使用其他单位,从而在线性模型中创建混淆系数.它还允许您将来自不同时间开始的多个销售活动的数据组合到您的回归中(假设您对广告系列的有效性感兴趣,作为活动天数的函数).如果您有兴趣测量一年中的日期趋势,您也可以选择Jan 1作为您的0.选择你自己的0日期会让你掌控所有这些.

还有证据表明statsmodels支持大熊猫的时间序列.您也可以将其应用于线性模型:http: //statsmodels.sourceforge.net/stable/examples/generated/ex_dates.html

另外,请注意:您应该能够自动读取csv中的列名,就像我发布的示例代码一样.在您的示例中,我看到csv文件的第一行中的逗号之间有空格,导致列名称如'date'.删除空格和自动csv标题读取应该工作.