最近常用的几个【行操作】的Pandas函数

最近在做交易数据的统计分析时,多次用到数据行之间的一些操作,对于其中的细节,简单做了个笔记。

1. shfit函数

shift函数在策略回测代码中经常出现,计算交易信号持仓信号 以及资金曲线 时都有涉及。

这个函数的主要作用是将某列的值上下移动。

默认情况下,shift函数是向下移动一行,

移动后,新数据列的第一行数据用NaN(空值)填充,原始数据列的最后一行丢弃。

python 复制代码
import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, 3, 4, 5, 6],
    "B": [2, 3, 4, 2, 4, 5],
    "C": [5, 6, 7, 1, 3, 4],
}, dtype=float)

# 默认 shift()
df["C-shift()"] = df["C"].shift()
print(df)

也可以在shift函数中指定移动的行数,比如下面的代码下移3行

python 复制代码
df["C-shift(3)"] = df["C"].shift(3)
print(df)

指定的行数为负值时,表示向上移动,此时,下面的部分用NaN填充。

python 复制代码
df["C-shift(-3)"] = df["C"].shift(-3)
print(df)

shift之后一般会在 首部/尾部 产生NaN空值,根据情况看是否需要进一步处理。

2. 不同行数的列赋值

shift函数还是比较好理解的,

下面这个操作比shift稍微复杂一些。

为了简化,创建两个测试数据:

python 复制代码
df1 = pd.DataFrame({
    "A": [1, 2, 3, 4, 5, 6],
    "B": [2, 3, 4, 2, 4, 5],
    "C": [5, 6, 7, 1, 3, 4],
})

df2 = pd.DataFrame({
    "D": [110, 100],
})

print(df1, df2)

df2只有2行df16行 ,此时,把df2D列 赋值给df1时,
pandas会自动比较df1df2index(索引,也就是上图中红色框内部分),只赋值具有相同index的行。

python 复制代码
df1["D"] = df2["D"]
print(df1)

改变df2index,再次赋值看看:

python 复制代码
df2 = pd.DataFrame({
    "D": [110, 100],
}, index=[4, 7])

df1["D"] = df2["D"]
print(df1)


df2index=4时能和df1匹配,所以赋值之后,只有index=4那行赋给了df1
df2index=7那行没匹配上,就直接丢弃了。

所以,不同行数的两个数据集互相赋值时,比不是从上而下按行赋值,而是根据两个数据的index来匹配赋值的。

这时,再回头看计算交易信号 的代码,temp虽然经过过滤之后,行数比df要少,但是过滤之后的每行数据会根据对应的index准确的赋给df中相同index的行。

3. pct_change函数

pct_change函数用来计算数据百分比变化的。

具体的计算规则是,当前行数据 减去 上一行数据 ,得出的结果再 除以 上一行数据

比如:

python 复制代码
df = pd.DataFrame({
    "A": [1, 2, 3, 4, 5, 6],
    "B": [2, 3, 4, 2, 4, 5],
    "C": [5, 6, 7, 1, 3, 4],
}, dtype=float)

df["C_percent"] = df["C"].pct_change()

第一行数据因为没有上一行数据,所以是 NaN

这和shift函数一样,处理完之后,别忘了填充第一行的NaN

同样,pct_change()可以传入参数跨越多行。

python 复制代码
df["C_percent"] = df["C"].pct_change(3)

向上3行 ,也就是隔两行 计算变化百分比,这里就会产生3个NaN

pct_change()还可以传入负值,传入负值时的计算规则变为:
当前行数据 减去 下一行数据 ,得出的结果再 除以 下一行数据

比如:

python 复制代码
df["C_percent"] = df["C"].pct_change(-1)

这样,空值NaN出现最后一行,因为最后一行没有下一行。

4. cumprod函数

cumprod函数用来计算累积乘积的。

具体的计算规则是,若 当前行 是第一行,则直接用 **当前行数据 **作为 累积乘积结果

当前行 不是第一行,则用 **当前行数据 **乘以 上一行累积乘积结果 ,得出的结果作为 当前行累积乘积结果

比如:

python 复制代码
df["C_cumprod"] = df["C"].cumprod()


cumprod函数不能像shiftpct_change那样可以传入数值或负数参数,只有默认的逐行累积计算。

5. 总结

在分析交易信息,特别是统计收益和收益率的变化时,上面几个函数能帮助我们极大简化代码,避免写各种复杂的循环。

相关推荐
lzq6039 分钟前
Python虚拟环境全指南:venv与conda对比与实践
开发语言·python·conda
Candice_jy30 分钟前
vscode运行ipynb文件:使用docker中的虚拟环境
服务器·ide·vscode·python·docker·容器·编辑器
流烟默1 小时前
基于Optuna 贝叶斯优化的自动化XGBoost 超参数调优器
人工智能·python·机器学习·超参数优化
海琴烟Sunshine1 小时前
leetcode 263. 丑数 python
python·算法·leetcode
AI视觉网奇1 小时前
yolo 获取异常样本 yolo 异常
开发语言·python·yolo
程序员爱钓鱼1 小时前
Python编程实战 面向对象与进阶语法 迭代器与生成器
后端·python·ipython
程序员爱钓鱼2 小时前
Python编程实战 面向对象与进阶语法 JSON数据读写
后端·python·ipython
TH88862 小时前
一体化负氧离子监测站:实时、精准监测空气中负氧离子浓度及其他环境参数
python
苏打水com2 小时前
0基础学前端:100天拿offer实战课(第3天)—— CSS基础美化:给网页“精装修”的5大核心技巧
人工智能·python·tensorflow
顾安r3 小时前
11.5 脚本 本地网站收藏(解封归来)
linux·服务器·c语言·python·bash