我目前正在重构一个对时间序列进行分析的算法,因为除了使用原型之外的任何东西,实现都太慢了。
该算法通过将时间序列切成24h块并将它们并排排列来生成DataFrame
,因此每列包含24h的时间序列数据。
下一步是循环每一天(列),将当天的(滚动)统计数据与前7天(列)的组合(滚动)统计数据进行比较(数据的SNR非常糟糕,所以结合天来增强它)。问题是这是python本身的for循环,它从DataFrame
通过df.loc[]
获取切片,这非常慢。
我想尽可能地使用原生熊猫方法来加速算法,但是我现在有点卡住了。
我想要生成滚动"参考"统计数据(由前7天组成)在一个命令而不是循环中,我应该将数据排列成一个大对角线DataFrame
,如此
[[day 0] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] ...
[nan..] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [day 7] [nan..] [nan..] [nan..] [nan..] [nan..] [nan..] ...
etc.]
然后我可以简单地应用df.rolling(foo).whatever()。
我尝试在DataFrame
的帮助下生成如上所述df.groupby(pd.TimeGrouper("1d"))
,但我无法想出一种无循环的方法。
如果有人知道如何生成这样一个框架或者想出更好的方法来解决这个问题,我将不胜感激。
编辑:
再考虑一下这个问题,DataFrame
也可能看起来像这样
[[day 0] [day 1] [day 2] [day 3] [day 4] [day 5] [day 6]
[day 1] [day 2] [day 3] [day 4] [day 5] [day 6] [day 7]
etc.]
看起来像是一个Hankel矩阵的子集,其中每个元素都是24h数据的时间序列。
答案 0 :(得分:0)
事实证明这比我最初想象的要容易。看看第二个例子,可以看到每一列只是原始时间序列的一个副本,再移动一天。
我想出了什么:
# duplicate timeseries
refFrame = pd.concat([data] * refLen, axis=1)
# shift each column by samples per day * day index
refFrame = refFrame.apply(lambda x: x.shift(-int(x.name) * 144),
axis=0)
# drop rows that contain nan after shifting
refFrame.dropna(inplace=True)