如何计算 Pandas 的周环比变化?

How do I calculate week over week changes in Pandas?

我有以下不同时间片的 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 日的所有切片的新 table 都为空。我希望 1 月 8 日的值是给定切片的 1 月 8 日值减去 1 月 1 日值的值那片。然后我希望 jan 9 的值是给定切片的 jan 9 值减去 jan 2 切片的值。如此等等,一路往下。

示例 table 如下所示:

    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。换句话说,没有遗漏日期。

如果我们知道偏移量始终为 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')

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

但我想 post 为任何感兴趣的人修改缺少日期的案例。来自 docs:

The shift method accepts a freq argument which can accept a DateOffset class or other timedelta-like object or also a offset alias

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