滴水恩情 发表于 2024-5-18 15:14:36

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

最近在做生意业务数据的统计分析时,多次用到数据行之间的一些操纵,对于其中的细节,简单做了个笔记。
1. shfit函数

shift函数在策略回测代码中常常出现,盘算生意业务信号,持仓信号以及资金曲线时都有涉及。
这个函数的紧张作用是将某列的值上下移动。
默认情况下,shift函数是向下移动一行,
移动后,新数据列的第一行数据用NaN(空值)填充,原始数据列的最后一行丢弃。
import pandas as pd

df = pd.DataFrame({
    "A": ,
    "B": ,
    "C": ,
}, dtype=float)

# 默认 shift()
df["C-shift()"] = df["C"].shift()
print(df)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1e48786661624f3b88151ee3f6f7b36f~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=317&h=241&s=13880&e=png&b=f1f1f1
也可以在shift函数中指定移动的行数,比如下面的代码下移3行。
df["C-shift(3)"] = df["C"].shift(3)
print(df)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6a00510c6c89428c8ea8742bfb19de1f~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=257&h=237&s=14222&e=png&b=f0f0f0
指定的行数为负值时,表示向上移动,此时,下面的部分用NaN填充。
df["C-shift(-3)"] = df["C"].shift(-3)
print(df)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/de5803fba4194fc596cf16e0aec9ac23~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=270&h=242&s=14706&e=png&b=f0f0f0
shift之后一般会在 首部/尾部 产生NaN空值,根据情况看是否需要进一步处置惩罚。
2. 不同行数的列赋值

shift函数照旧比较好明确的,
下面这个操纵比shift稍微复杂一些。
为了简化,创建两个测试数据:
df1 = pd.DataFrame({
    "A": ,
    "B": ,
    "C": ,
})

df2 = pd.DataFrame({
    "D": ,
})

print(df1, df2)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba50936120384643a00970d2c8a28ffb~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=388&h=236&s=9877&e=png&b=f2f2f2
把df2只有2行,df1有6行,此时,把df2的D列赋值给df1时,
pandas会主动比较df1和df2的index(索引,也就是上图中红色框内部分),只赋值具有相同index的行。
df1["D"] = df2["D"]
print(df1)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/458727d3e91c46bf849f409792d96b04~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=241&h=246&s=9238&e=png&b=f0f0f0
改变df2的index,再次赋值看看:
df2 = pd.DataFrame({    "D": ,}, index=)df1["D"] = df2["D"]
print(df1)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c0a9862b4b2d446aa21ff79f02dfa10f~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=541&h=238&s=17071&e=png&b=f1f1f1
df2中index=4时能和df1匹配,所以赋值之后,只有index=4那行赋给了df1,
df2中index=7那行没匹配上,就直接丢弃了。
所以,不同行数的两个数据集互相赋值时,比不是从上而下按行赋值,而是根据两个数据的index来匹配赋值的。
这时,再转头看盘算生意业务信号的代码,temp虽然经过过滤之后,行数比df要少,但是过滤之后的每行数据会根据对应的index准确的赋给df中相同index的行。
3. pct_change函数

pct_change函数用来盘算数据百分比变化的。
具体的盘算规则是,当前行数据 减去 上一行数据,得出的效果再 除以 上一行数据。
比如:
df = pd.DataFrame({
    "A": ,
    "B": ,
    "C": ,
}, dtype=float)

df["C_percent"] = df["C"].pct_change()https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9ea64f9b4d1f45ceb8276ff40c7732eb~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=494&h=254&s=27657&e=png&b=f3f3f3
第一行数据因为没有上一行数据,所以是 NaN,
这和shift函数一样,处置惩罚完之后,别忘了填充第一行的NaN。
同样,pct_change()可以传入参数跨越多行。
df["C_percent"] = df["C"].pct_change(3)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/29e2520ecc3a4459a78e91dbb2c1f18e~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=475&h=232&s=25005&e=png&b=f2f2f2
向上3行,也就是隔两行盘算变化百分比,这里就会产生3个NaN。
pct_change()还可以传入负值,传入负值时的盘算规则变为:
当前行数据 减去 下一行数据,得出的效果再 除以 下一行数据。
比如:
df["C_percent"] = df["C"].pct_change(-1)https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/22febf46a5c74be0ac36e41646205cdb~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=461&h=235&s=28727&e=png&b=f2f2f2
这样,空值NaN出现最后一行,因为最后一行没有下一行。
4. cumprod函数

cumprod函数用来盘算累积乘积的。
具体的盘算规则是,若 当前行 是第一行,则直接用 **当前行数据 **作为 累积乘积效果;
若 当前行 不是第一行,则用 **当前行数据 **乘以 上一行累积乘积效果,得出的效果作为 当前行累积乘积效果。
比如:
df["C_cumprod"] = df["C"].cumprod()https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0600932d688d4f6ebca1e7a6315260e4~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=440&h=240&s=23996&e=png&b=f2f2f2
cumprod函数不能像shift和pct_change那样可以传入数值或负数参数,只有默认的逐行累积盘算。
5. 总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 最近常用的几个【行操纵】的Pandas函数