【问题标题】:Pandas remove daily seasonality from data by substracting daily mean熊猫通过减去每日平均值从数据中删除每日季节性
【发布时间】:2021-12-26 01:35:27
【问题描述】:

我在 pandas 数据框中有大量时间序列传感器数据。对于 876 个传感器,数据分辨率为 1 个月内每 15 分钟一次观测。

在大约 50% 的观察结果中,数据具有一些日常季节性和单个传感器的一些错误测量结果。

我想去掉季节性。

df.diff(periods=96)

这不起作用,因为我在 2 天(实际测量错误的那天和之后的第二天)有一个异常值。

因此,我编写了这个 sn-p 代码,它做了它应该做的并且工作正常:

  for index in df.index:
    for column in df.columns:
        df[column][index] = df[column][index] - (
            df[column][df.index % 96 == index % 96]).mean()

问题是这非常慢。 有没有办法用 pandas 函数更快地实现同样的事情?

【问题讨论】:

  • 请通过分享df 的样本和代码块内的预期输出来提供minimal reproducible example,以便我们重现您的问题并为您提供帮助。

标签: python pandas dataframe time-series


【解决方案1】:

遍历 DataFrame/ Series 应该是最后的手段,它非常慢。

在这种情况下,您可以使用groupby + transform 计算所有列的每个季节的平均值,然后以矢量化方式从您的 DataFrame 中减去。

根据您的代码,这似乎应该可以工作

period = 96
season_mean = df.groupby(df.index % period).transform('mean')
df -= season_mean

或者,如果你愿意

period = 96
df = df.groupby(df.index % period).transform(lambda g: g - g.mean()) 

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2012-10-25
    • 2020-08-09
    • 1970-01-01
    • 2017-01-28
    • 2022-06-30
    • 2015-05-11
    • 2019-05-20
    • 2020-03-10
    相关资源
    最近更新 更多