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

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

相关推荐
笨鸟先飞,勤能补拙27 分钟前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能1 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂2 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study2 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境3 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境3 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1233 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102164 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb004 小时前
一个项目带你入门AI应用开发01
python
0566464 小时前
Python康复训练——常用标准库
开发语言·python·学习