使用offset时滚动窗口函数的意外结果



我有一个像这样的数据帧

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中进行了记录。

最新更新