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

pandas · 浏览次数 : 4

小编点评

**数据行操作总结** | 函数名 | 功能 | 处理方式 | |---|---|---| | shift | 下移一行 | df[\"C-shift()\"] = df[\"C\"].shift() | | | 上移一行 | df[\"C-shift(-3)\"] = df[\"C\"].shift(-3] | | | 自定义行数 | df[\"C-shift(3)\"] = df[\"C\"].shift(3) | | | 自定义行数 | df2 = pd.DataFrame({ \"D\": [110, 100],}, index=[4, 7])df1[\"D\"] = df2[\"D\"] | | pct_change | 计算数据百分比变化 | df[\"C_percent\"] = df[\"C\"].pct_change() | | | 自定义行数 | df[\"C_percent\"] = df[\"C\"].pct_change(3) | | | 计算累积乘积 | df[\"C_cumprod\"] = df[\"C\"].cumprod() | **其他** * pct_change()可以传入参数跨越多行。 * cumprod函数不能像shift和pct_change那样可以传入数值或负数参数。

正文

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

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. 总结

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

与最近常用的几个【行操作】的Pandas函数相似的内容:

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

theme: smartblue 最近在做交易数据的统计分析时,多次用到数据行之间的一些操作,对于其中的细节,简单做了个笔记。 1. shfit函数 shift函数在策略回测代码中经常出现,计算交易信号,持仓信号以及资金曲线时都有涉及。这个函数的主要作用是将某列的值上下移动。默认情况下,shift函

【pandas基础】--数据检索

pandas的数据检索功能是其最基础也是最重要的功能之一。 pandas中最常用的几种数据过滤方式如下: 行列过滤:选取指定的行或者列 条件过滤:对列的数据设置过滤条件 函数过滤:通过函数设置更加复杂的过滤条件 本篇所有示例所使用的测试数据如下: import pandas as pd import

第一百零九篇:基本数据类型(String类型)

好家伙, 本篇内容为《JS高级程序设计》第三章学习笔记 1.String类型 字符串类型是最常用的几个基本类型之一 字符串可以使用双引号,单引号以及反引号(键盘左Tab上面那个)标示 let panghu ='panghu'; let kunkun ="kunkun"; let awei =`awe

[转帖]strace分析sqlplus登录慢问题

一、 问题分析 有时会遇到sqlplus / as sysdba登录非常慢的问题,由于还没登录,通过数据库等待事件一般看不出来啥,需要用到strace这个分析利器。strace有很多参数,后面会列出,但分析时最常用的是以下几个 strace -T -t -f -o strace_slow.log s

分享几个常用的运维 shell 脚本

今天咸鱼给大家分享几个不错的 Linux 运维脚本,这些脚本中大量使用了 Linux 的文本三剑客: 1. awk 2. grep 3. sed 建议大家这三个工具都要了解并最好能够较为熟练的使用 根据 PID 显示进程所有信息 根据用户输入的 PID,过滤出该 PID 所有的信息 #! /bin/

[转帖]不同语言的程序在龙芯上的性能表现

https://zhuanlan.zhihu.com/p/591198312 当代的计算机软件都是由高级语言编写的。目前最主流的语言有几个: C/C++:Unix/Linux原生语言,系统级程序,驱动,高性能的应用程序 JAVA:企业级开发主流语言,企业应用后台最常用语言 JavaScript:承载

RocketMQ 事件驱动:云时代的事件驱动有啥不同?

本文深入探讨了云时代 EDA 的新内涵及它在云时代再次流行的主要驱动力,包括技术驱动力和商业驱动力,随后重点介绍了 RocketMQ 5.0 推出的子产品 EventBridge,并通过几个云时代事件驱动的典型案例,进一步叙述了云时代事件驱动的常见场景和最佳实践。

移动端APP组件化架构实践

对于中大型移动端APP开发来讲,组件化是一种常用的项目架构方式。个人最近几年在工作项目中也一直使用组件化的方式来开发,在这过程中也积累了一些经验和思考。主要是来自在日常开发中使用组件化开发遇到的问题以及和其他开发同学的交流探讨。

【manim动画教程】--常用动画效果

manim的主要功能就是制作动画,因此它提供了各类丰富的动画效果, 本篇主要介绍其中最常用的几种动画效果。 至于特殊的动画效果,以及自定义动画效果的方法以后再另外介绍。 1. 创建效果 展示某个元素或者文字时,一下子就全显示出来会显得比较突兀,通过创建效果的动画,让各个元素的出现更加的自然。 常用的

【pandas基础】--数据类型

数据类型是计算机编程中将不同类型的数据值分类和定义的方式。 通过数据类型,可以确定数据的存储方式和内存占用量,了解不同类型的数据进行各种运算的能力。 使用`pandas`进行数据分析时,最常用到的几种类型是: 1. 字符串类型,各类文本内容都是字符串类型 2. 数值类型,包括整数和浮点数,可用于计算