获取Python中值相对于时间戳的梯度
我有一个数据框,叫做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轴的数据是时间戳,而不是简单的数字。
我该如何修正这个问题呢?
2 个回答
0
将x轴上的时间戳转换为以秒为单位的纪元时间。
如果索引是日期时间对象,你需要把它们转换成纪元时间。比如,如果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']))
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']))