我有一个df,self.meter_readings,其中索引是日期时间值,并且有一列数字,如下所示:
self.meter_readings['PointProduction']
2012-03 7707.443
2012-04 9595.481
2012-05 5923.493
2012-06 4813.446
2012-07 5384.159
2012-08 4108.496
2012-09 6370.271
2012-10 8829.357
2012-11 7495.700
2012-12 13709.940
2013-01 6148.129
2013-02 7249.951
2013-03 6546.819
2013-04 7290.730
2013-05 5056.485
Freq: M, Name: PointProduction, dtype: float64
我想获得PointProduction的渐变与时间的关系。即y = PointProduction x =时间。我目前正在尝试使用线性回归获得m:
m,c,r,x,y = stats.linregress(list(self.meter_readings.index),list(self.meter_readings['PointProduction']))
但是我收到了错误:
raise TypeError(other).
这似乎是由于形成了x轴作为时间戳,而不仅仅是数字。
我该如何纠正?
答案 0 :(得分:0)
将x轴中的datetimestamps转换为以秒为单位的纪元时间。
如果索引在datetime对象中,则需要将它们转换为纪元时间,例如,如果ts是日期时间对象,则以下函数执行转换
ts_epoch = int(ts.strftime('%s'))
这是一段代码,可以帮助您将索引列转换为纪元秒:
import pandas as pd
from datetime import datetime
import numpy as np
rng = pd.date_range('1/1/2011', periods=5, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
t = ts.index
print [int(t[x].strftime('%s')) for x in range(len(t)) ]
此代码完全适用于python2.7。
要在您的问题上使用这段代码,解决方案可能如下:
t = self.meter_readings.index
indexes = [int(t[x].strftime('%s')) for x in range(len(t)) ]
m,c,r,x,y = stats.linregress(indexes,list(self.meter_readings['PointProduction']))
答案 1 :(得分:0)
您可以尝试将每个时间戳转换为格里高利序数:linregress
应该与您的freq='M'
index
一起使用。
import pandas as pd
from scipy import stats
data = [
7707.443,
9595.481,
5923.493,
4813.446,
5384.159,
4108.496,
6370.271,
8829.357,
7495.700,
13709.940,
6148.129,
7249.951,
6546.819,
7290.730,
5056.485
]
period_index = pd.period_range(start='2012-03', periods=len(data), freq='M')
df = pd.DataFrame(data=data,
index=period_index,
columns=['PointProduction'])
# these ordinals are months since the start of the Unix epoch
df['ords'] = [tstamp.ordinal for tstamp in df.index]
m,c,r,x,y = stats.linregress(list(df.ords),
list(df['PointProduction']))