最近常用的几个【行操作】的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. 总结

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

相关推荐
程序员Bears几秒前
Flask项目实践:构建功能完善的博客系统(含评论与标签功能)
后端·python·flask
zhou1853 分钟前
【最新】MySQL 5.6 保姆级安装详细教程
java·数据库·python·mysql·php
chao_7896 分钟前
python八股文汇总(持续更新版)
开发语言·python·学习
Ritter_Liu10 分钟前
在tensorflow源码环境里,编译出独立的jni.so,避免依赖libtensorflowlite.so,从而实现apk体积最小化
人工智能·python·tensorflow
开开心心就好15 分钟前
全能视频处理工具介绍说明
前端·python·pdf·ocr·音视频·tornado·dash
blues_C34 分钟前
二、【环境搭建篇】:Django 和 Vue3 开发环境准备
后端·python·django·vue3·测试平台
郜太素1 小时前
深度学习中的正则化方法与卷积神经网络基础
人工智能·pytorch·python·深度学习·神经网络·机器学习·cnn
搭贝1 小时前
门店管理五大痛点解析:如何用数字化系统实现高效运营
信息可视化·数据分析·系统定制·搭贝·门店销售系统
蹦蹦跳跳真可爱5891 小时前
Python----目标检测(labelimg和labelme的安装与使用,Pycharm配置教程)
人工智能·python·目标检测·计算机视觉·pycharm
Vodka~1 小时前
服务器多用户共享Conda环境操作指南——Ubuntu24.02
服务器·python·conda