我是熊猫的新手。我有时间序列数据。我怎样才能轻松完成以下操作?
我有一个叫做输入的二维矩阵。每行有5个元素。有很多行(数千)
input[t,:] = [f1, f2, f3, f4, f5]
(1)我需要计算样本之间的相对差异。
即。 rel[t,:] = ( input[t,:]-input[t-1,:] ) / input[t-1,:]
(2)我需要创建一个大小为80的滑动窗口。
即。 win[t,:] = [rel[t,:],rel[t-1,:],...,rel[t-79,:]]
我怎么能在Pandas或任何其他框架中执行此操作,例如scikit.timeseries。
答案 0 :(得分:2)
关于这些类型的操作,文档非常全面
请参阅:
1)http://pandas.pydata.org/pandas-docs/dev/timeseries.html#time-series-related-instance-methods
2)http://pandas.pydata.org/pandas-docs/dev/computation.html#expanding-window-moment-functions
答案 1 :(得分:2)
你可以在朴素的numpy中做到这两点,虽然pandas可能会有特定的功能,使它更容易。但是:
rel = np.diff(input) / input[:-1]
和
from numpy.lib.stride_tricks import as_strided
win = as_strided(rel, shape=(rel.shape[0]-79, 80), strides=rel.strides*2)
会这样做。
如果输入有多行,您仍然可以执行以下操作:
rel = np.diff(input, axis=1) / input[:, :-1]
win = as_strided(rel, shape=(rel.shape[0], rel.shape[1]-79, 80),
strides=rel.strides + rel.strides[1:])
虽然您可能想要使用'shape'并匹配strides
来获得您所追求的确切窗口形状。