一、背景
當需要統計不同周期的變化情況時,需要使用數據偏移,在 Python
中使用 shift
函數實現。
# 一階差分
diff_num = num - num.shift(1)
二、實現
1.創建測試表
import pandas as pd
dic = {'id':[1,2,2,3,3,3],
'num':[4,2,7,10,5,5]
}
data = pd.DataFrame(dic)
print(data)
```
id num
0 1 4
1 2 2
2 2 7
3 3 10
4 3 5
5 3 5
```
2.分析
- 新增一列存儲每個id上一周期數量
- 將兩列做差即可
3.shift函數
通過 shift
函數實現數據的上下偏移,使用語法:
df.shift(periods=1, freq=None, axis=0)
- periods 偏移的幅度(正值表示下、右編譯,負值表示上、左偏移)
- freq 適用於時間索引的偏移 值不發生變化
- axis 軸向指定(axis=0表示縱向偏移,axis=1表示橫向偏移,默認縱向)
4.實例
# 所有字段向下偏移一行
data.shift(1)
```
id num
0 NaN NaN
1 1.0 4.0
2 2.0 2.0
3 2.0 7.0
4 3.0 10.0
5 3.0 5.0
```
# 所有字段向上偏移一行
data.shift(-1)
```
id num
0 2.0 2.0
1 2.0 7.0
2 3.0 10.0
3 3.0 5.0
4 3.0 5.0
5 NaN NaN
```
# 所有字段向右偏移一列
data.shift(1, axis=1)
```
id num
0 NaN 1.0
1 NaN 2.0
2 NaN 2.0
3 NaN 3.0
4 NaN 3.0
5 NaN 3.0
```
# 所有字段向左偏移一列
data.shift(-1, axis=1)
```
id num
0 4.0 NaN
1 2.0 NaN
2 7.0 NaN
3 10.0 NaN
4 5.0 NaN
5 5.0 NaN
```
# 全部偏移
data["last_num"] = data["num"]
data["last_num"] = data["last_num"].shift(1).fillna(0)
```
id num last_num
0 1 4 0.0
1 2 2 4.0
2 2 7 2.0
3 3 10 7.0
4 3 5 10.0
5 3 5 5.0
```
# 按id分組偏移
data["last_num"] = data.groupby("id")["num"].shift(1).fillna(0)
data["diff_num"] = data["num"] - data["last_num"]
```
id num last_num diff_num
0 1 4 0.0 4.0
1 2 2 0.0 2.0
2 2 7 2.0 5.0
3 3 10 0.0 10.0
4 3 5 10.0 -5.0
5 3 5 5.0 0.0
```
參考鏈接:利用Python實現數據偏移