【问题标题】:How do I calculate week over week changes in Pandas?如何计算 Pandas 的每周变化?
【发布时间】:2017-08-02 03:04:46
【问题描述】:

我对不同时间的切片有以下 df 值:

    date        A   B   C
0   2016-01-01  5   7   2
1   2016-01-02  6   12  15
...
2   2016-01-08  9   5   16
...
3   2016-12-24  5   11  13
4   2016-12-31  3   52  22

我想创建一个新的数据框,按日期计算每个切片中的 w-w 变化。例如,我希望新表对于从 1 月 1 日到 1 月 7 日的所有切片都是空白的。我希望 jan 8 的值是给定切片的 jan 8 值减去该切片的 jan 1 值的值。然后,我希望 jan 9 的值是给定切片的 jan 9 值减去 jan 2 切片的值。如此等等,一直向下。

示例表如下所示:

    date        A   B   C
0   2016-01-01  0   0   0
1   2016-01-02  0   0   0
...
2   2016-01-08  4   -2  14
...
3   2016-12-24  4   12  2
4   2016-12-31  -2  41  9

您可以假设偏移量始终为 7。换句话说,没有丢失的日期。

【问题讨论】:

  • 你能像在 python 控制台中那样重构你的数据帧吗?
  • @djk47463 - 一切就绪。

标签: python pandas offset moving-average datetimeoffset


【解决方案1】:

@Unatiel 的回答在这种情况下是正确的,没有遗漏日期,应该被接受。

但我想在这里为缺少日期的情况发布修改,供任何感兴趣的人使用。来自docs

shift 方法接受 freq 参数,该参数可以接受 DateOffset 类或其他 timedelta-like 对象或偏移量 别名

from pandas.tseries.offsets import Week
res = ((df - df.shift(1, freq=Week()).reindex(df.index))
       .fillna(value=0)
       .astype(int))

print(res)
             A   B
date              
2016-01-01   0   0
2016-01-02   0   0
2016-01-03   0   0
2016-01-04   0   0
2016-01-05   0   0
2016-01-06   0   0
2016-01-07   0   0
2016-01-08  31  46
2016-01-09   4  20
2016-01-10 -51 -65
2016-01-11  56   5
2016-01-12 -51  24
        ..  ..
2016-01-20  34 -30
2016-01-21 -28  19
2016-01-22  24   8
2016-01-23 -28 -46
2016-01-24 -11 -60
2016-01-25 -34  -7
2016-01-26 -12 -28
2016-01-27 -41  42
2016-01-28  -2  48
2016-01-29  35 -51
2016-01-30  -8  62
2016-01-31  -6  -9

【讨论】:

    【解决方案2】:

    如果我们知道偏移量始终为 7,则使用 shift(),这是一个简单的示例,展示了它是如何工作的:

    df = pandas.DataFrame({'x': range(30)})
    df.shift(7)
           x
    0    NaN
    1    NaN
    2    NaN
    3    NaN
    4    NaN
    5    NaN
    6    NaN
    7    0.0
    8    1.0
    9    2.0
    10   3.0
    11   4.0
    12   5.0
    ...
    

    所以你可以这样做:

    df - df.shift(7)
          x
    0   NaN
    1   NaN
    2   NaN
    3   NaN
    4   NaN
    5   NaN
    6   NaN
    7   7.0
    8   7.0  
    ...
    

    在你的情况下,不要忘记之前set_index('date')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 2022-09-24
      相关资源
      最近更新 更多