首页 > 其他分享 >最近常用的几个【行操作】的Pandas函数

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

时间:2024-04-28 13:57:56浏览次数:23  
标签:index 常用 函数 df shift df1 df2 Pandas

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

1. shfit函数

shift函数在策略回测代码中经常出现,计算交易信号持仓信号以及资金曲线时都有涉及。
这个函数的主要作用是将某列的值上下移动。
默认情况下,shift函数是向下移动一行,
移动后,新数据列的第一行数据用NaN(空值)填充,原始数据列的最后一行丢弃。

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)

image.png

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

df["C-shift(3)"] = df["C"].shift(3)
print(df)

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

df["C-shift(-3)"] = df["C"].shift(-3)
print(df)

image.png

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

2. 不同行数的列赋值

shift函数还是比较好理解的,
下面这个操作比shift稍微复杂一些。

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

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)

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

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

image.png

改变df2index,再次赋值看看:

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

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

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

所以,不同行数的两个数据集互相赋值时,比不是从上而下按行赋值,而是根据两个数据的index来匹配赋值的。
这时,再回头看计算交易信号的代码,temp虽然经过过滤之后,行数比df要少,但是过滤之后的每行数据会根据对应的index准确的赋给df中相同index的行。

3. pct_change函数

pct_change函数用来计算数据百分比变化的。
具体的计算规则是,当前行数据 减去 上一行数据,得出的结果再 除以 上一行数据
比如:

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()

image.png
第一行数据因为没有上一行数据,所以是 NaN
这和shift函数一样,处理完之后,别忘了填充第一行的NaN

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

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

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

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

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

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

4. cumprod函数

cumprod函数用来计算累积乘积的。
具体的计算规则是,若 当前行 是第一行,则直接用 **当前行数据 **作为 累积乘积结果
当前行 不是第一行,则用 **当前行数据 **乘以 上一行累积乘积结果,得出的结果作为 当前行累积乘积结果
比如:

df["C_cumprod"] = df["C"].cumprod()

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

5. 总结

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

标签:index,常用,函数,df,shift,df1,df2,Pandas
From: https://www.cnblogs.com/wang_yb/p/18163596

相关文章

  • Pacemaker常用命令
    crmconfigureshow#查看配置信息 说明:资源组名为zavipg,包含有zatest和vip01两个资源。vip为10.10.206.229,通过systemd监控zabbix_agentd服务,监控周期为3s,超时时间为15s,失败后置为状态standby;通过location配置资源约束,首选运行节点为centos20624,通过#uname识别 pcsstat......
  • openGauss 时间-日期函数和操作符
    时间/日期函数和操作符时间日期操作符警告:用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。比如下面示例没有明确数据类型就会出现异常错误。SELECTdate'2001-10-01'-'7......
  • Python中有很多库可以操作Excel,像xlsxwriter、openpyxl、pandas、xlwings等
    Python中确实有多个库可以用于操作Excel文件,包括但不限于xlsxwriter、openpyxl、pandas和xlwings。以下是这些库的简要介绍和它们各自的优点:xlsxwriter:优点:专门用于创建新的.xlsx文件。提供了丰富的功能来创建复杂的Excel文档,包括图表、图片、自动筛选等。性能相对较......
  • 一文看懂什么是回调函数
    文章目录一、什么是回调函数二、回调示例三、回调函数的应用场景四、回调函数的优点五、回调函数的注意事项一、什么是回调函数回调函数是一种在编程中常见的概念,它是指一个函数作为参数传递给另一个函数,并且在特定事件发生或条件满足时被调用执行的函数。二、回调示例举......
  • git 常用操作
    git常用操作1.撤销gitadd撤销所有的已经add的文件gitresetHEAD--.撤销某个文件或文件夹gitresetHEAD--filename2.撤销gitcommitgitreset--softHEAD^HEAD^的意思是上一个版本,也可以写成HEAD~1如果你进行了2次commit,想都撤回,可以使用HEAD~2其他参......
  • SpringBoot常用注解(部分)
     @Service:注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository:注解在类上,表示这是一个数据访问层bean@Component:注解在类上,表示通用bean,value不写默认就是类名首字母小写@Autowired:按照类型(Spring容器默认单例模......
  • 实验3 C语言函数应用编程
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);voidprint_spaces(intn);voidprint_blank_lines(intn);intmain(){ intline,col,i;......
  • 常用Git命令
    1常用流程初始化本地repo;针对每个优化版本,修改的散点及时add,并随时gitdiff--cached;验证一个featureOK后gitcommit-m“message”;gitinitgitstatus#列出未跟踪的文件、已修改的文件、已暂存的文件gitadd--allgitcommit-m"message"备注:git文件的四种状态......
  • 实验3 C语言函数应用编程
    1#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);//函数声明8voidprint_spaces(intn);//函数声明9voidprint_blank_......
  • python 如何动态加载lib中的函数
    classTestInstance:def__init__(self):#初始化库字典,存放找到的库self.lib=Proxy()#使用一个代理对象来模拟层级结构classProxy:def__init__(self):self._libObjectDictCache={}def_getLibInstance(self,l......