如何计算熊猫每周的变化?

时间:2017-08-02 03:04:47

标签: python pandas offset moving-average datetimeoffset

对于不同的切片,我有以下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变化。例如,我希望jan 1 - jan 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.换句话说,没有丢失的日期。

2 个答案:

答案 0 :(得分:2)

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

但是我想在这里发布一个修改日期缺失的案例,对于任何有兴趣的人。来自docs

  

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

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

答案 1 :(得分:1)

如果我们知道偏移总是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')