如何计算 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
我有以下不同时间片的 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 afreq
argument which can accept aDateOffset
class or othertimedelta
-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