timeseries python的线性回归(numpy或pandas)

timeseries python的线性回归(numpy或pandas),python,numpy,pandas,statsmodels,Python,Numpy,Pandas,Statsmodels,一般来说,我对python和编程都是新手,所以请原谅任何应该显而易见的简单错误/事情 我想做的很简单,我只想把一个线性趋势(1-d多项式)拟合到一组时间序列上,看看斜率是正的还是负的。现在我只是想让它为一个时间序列工作 问题是:熊猫和小熊似乎都不能对日期时间进行回归。我的约会时间不固定(通常每月1天,但不是同一天),因此不能使用中提出的建议 我的时间序列csv看起来像: StationName, year, month, day, depth, NO3-N, PO4-P,

一般来说,我对python和编程都是新手,所以请原谅任何应该显而易见的简单错误/事情

我想做的很简单,我只想把一个线性趋势(1-d多项式)拟合到一组时间序列上,看看斜率是正的还是负的。现在我只是想让它为一个时间序列工作

问题是:熊猫和小熊似乎都不能对日期时间进行回归。我的约会时间不固定(通常每月1天,但不是同一天),因此不能使用中提出的建议

我的时间序列csv看起来像:

StationName,    year,   month,  day,    depth,  NO3-N,  PO4-P,  TotP,   TotN,
Kvarnbacken (Savaran),  2003,   2,  25, 0.5,    46, 9,  14, 451
Kvarnbacken (Savaran),  2003,   3,  18, 0.5,    64, 15, 17, 310
Kvarnbacken (Savaran),  2003,   3,  31, 0.5,    76, 7,  19, 566
到目前为止,我得到的是

import datetime as dt
from scipy import stats
import numpy as np

# read in station csv file
data = pd.read_csv('Kvarnbacken (Savaran)_2003.csv')
data.head()
# set up dates to something python can recognize
data['date'] = pd.to_datetime(data.year*10000+data.month *
                          100+data.day, format='%Y%m%d')
我试过了

slope, intercept, r_value, p_value, std_err = stats.linregress(data.date,
                                                               data.TotP)
并且得到了错误 TypeError:ufunc add无法使用类型为dtype('的操作数 我也试过了

coefP = np.polyfit(data.date, data.TotP, 1)
polyP = np.poly1d(coefP)
ys = polyP(data.date)
print 'For P: coef, poly'
print coefP
print polyP
得到了同样的错误


我猜最简单的方法是做一些事情,我只计算第一次测量后的天数,然后用天数u回归到总磷浓度(totP)但我不确定最简单的方法是什么,或者是否还有其他技巧。

您可以用以下方法将datetime转换为天

data['days_since'] = (data.date - pd.to_datetime('2003-02-25') ).astype('timedelta64[D]')

        date  days_since
0 2003-02-25           0
1 2003-03-18          21
2 2003-03-31          34
现在你应该能够像上面那样回归

slope, intercept, r_value, p_value, std_err = stats.linregress(data.days_since, 
                                                               data.TotP)
slope, intercept
(0.1466591166477916, 13.977916194790488)

你可能还想考虑其他的回归选项,比如包,特别是如果你经常这样做的时候。(注意X和Y与线性回归相比是相反的)


这只是statsmodels输出btw的一小部分(使用
summary()
而不是
params
来获得额外的输出。

我觉得你所做的是错误的,因为两天之间的间隔不是恒定的(解释:12月31日和1月1日之间)。你可以说第0天是你的第一次约会。然后将第一次约会减去每个日期,然后用天来转换。Hugo你绝对是对的。我没有认真考虑我的快速修复方法。注释#1不是一个好方法。如果你想做这样的事情,你应该将它转换为一些常用单位。更像是365*年+30*月+天。虽然这并不理想,因为年和月没有固定的天数。请参阅答案以获得更好的方法。谢谢。我最后做了类似的事情,但我一直在思考如何将“day_since”作为整数,这是一个很好的技巧。
import statsmodels.formula.api as smf

smf.ols( 'TotP ~ days_since', data=data ).fit().params

Intercept     13.977916
days_since     0.146659