我有一个像这样的数据帧
ACCEL_X ACCEL_Y ACCEL_Z
DATETIME
2021-05-11 16:12:56 160 32 16392
2021-05-11 16:12:57 20 -192 16548
2021-05-11 16:12:57 128 224 16212
2021-05-11 16:12:57 -148 -132 16624
2021-05-11 16:12:57 -40 204 16132
2021-05-11 16:12:57 72 -132 16536
2021-05-11 16:12:57 220 48 16292
2021-05-11 16:12:57 -132 236 16332
2021-05-11 16:12:57 -232 -132 16628
2021-05-11 16:12:57 192 140 16172
2021-05-11 16:12:57 200 -96 16684
2021-05-11 16:12:57 0 64 16020
2021-05-11 16:12:57 -144 -24 16524
2021-05-11 16:12:57 -160 24 16336
2021-05-11 16:12:57 96 56 16252
2021-05-11 16:12:57 68 -44 16544
2021-05-11 16:12:57 12 76 16308
2021-05-11 16:12:57 -228 -132 16668
2021-05-11 16:12:57 72 -96 16244
2021-05-11 16:12:57 48 -96 16536
根据文档,我可以使用第二个执行滑动窗口,我已经执行了3秒的滑动窗口滚动代码:
df = df.rolling('3s').mean()
df
返回,
ACCEL_X ACCEL_Y ACCEL_Z
DATETIME
2021-05-11 16:12:56 160.000000 32.000000 16392.000000
2021-05-11 16:12:57 90.000000 -80.000000 16470.000000
2021-05-11 16:12:57 102.666667 21.333333 16384.000000
2021-05-11 16:12:57 40.000000 -17.000000 16444.000000
2021-05-11 16:12:57 24.000000 27.200000 16381.600000
2021-05-11 16:12:57 32.000000 0.666667 16407.333333
2021-05-11 16:12:57 58.857143 7.428571 16390.857143
2021-05-11 16:12:57 35.000000 36.000000 16383.500000
2021-05-11 16:12:57 5.333333 17.333333 16410.666667
2021-05-11 16:12:57 24.000000 29.600000 16386.800000
2021-05-11 16:12:57 40.000000 18.181818 16413.818182
2021-05-11 16:12:57 36.666667 22.000000 16381.000000
2021-05-11 16:12:57 22.769231 18.461538 16392.000000
2021-05-11 16:12:57 9.714286 18.857143 16388.000000
2021-05-11 16:12:57 15.466667 21.333333 16378.933333
2021-05-11 16:12:57 18.750000 17.250000 16389.250000
2021-05-11 16:12:57 18.352941 20.705882 16384.470588
2021-05-11 16:12:57 4.666667 12.222222 16400.222222
2021-05-11 16:12:57 8.210526 6.526316 16392.000000
2021-05-11 16:12:57 10.200000 1.400000 16399.200000
我注意到,当我在滑动窗口后打印df时,它返回了一个不同的期望结果。
根据我对滑动窗口的理解,它应该花费'N秒,在我的情况下是3s'间隔数据,并从中执行平均值。
我所看到的'DATETIME'是完全相同的,它应该返回相同的结果。但事实并非如此,有人能告诉我熊猫的滑动窗是如何工作的吗?
—EDIT 1—
运行df.index.inferred_type == "datetime64"
返回True
您的三秒窗口涵盖了所有数据点。您可以看到结果的最后一行是整个DataFrame的平均值。也许你在期待这个:
In [194]: df.rolling('3s', center=True).mean()
Out[194]:
ACCEL_X ACCEL_Y ACCEL_Z
DATETIME
2021-05-11 16:12:56 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
2021-05-11 16:12:57 10.2 1.4 16399.2
来自文档:"默认情况下,结果被设置为窗口的右边缘。可以通过设置center=True.">
将其更改为窗口的中心当center=False
在第一个元素上的窗口只覆盖了那个元素,在第二个元素上它同时覆盖了第一个和第二个元素,以此类推。在最后一个元素上,它覆盖了所有元素,因为窗口已经扩展到覆盖了比当前元素晚3秒的所有元素。当center=True
时,窗口的中心依次放置在每个元素上。此窗口将覆盖当前元素以及所有落后和领先一秒钟的元素。我仍然怀疑当偏移量是偶数时会发生什么,例如'2s'和center=True
。
看看当我在20121-05-11 16:12:58添加另一个数据点时会发生什么。这里我使用计数聚合来更好地说明:
In [214]: df3.rolling('3s', center=True).count()
Out[214]:
ACCEL_X ACCEL_Y ACCEL_Z
DATETIME
2021-05-11 16:12:56 20.0 20.0 20.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:57 21.0 21.0 21.0
2021-05-11 16:12:58 20.0 20.0 20.0
这里的关键观点是,窗口的大小取决于有多少元素落在指定的偏移量和还滚动数据(因为它是一个滚动窗口)。center
参数控制相对于每个数据点的窗口跨度。
编辑:pandas错误(在1.3.2修复)
pandas 1.3.1给出了不一致的结果。在这种情况下,不一致出现在输出的第一行,有时是:
ACCEL_X ACCEL_Y ACCEL_Z
DATETIME
2021-05-11 16:12:56 160.0 32.0 16392.0
也就是说,第一行有时单独使用。正确的结果如上所示。这个问题在1.3.2版中修复了,并在issue #42753中进行了记录。