Pandas:如何让你的代码性能飙升

news2025/1/22 19:55:55

在数据分析相关的工作中,Pandas无疑是一个强大的工具,它的易用性和灵活性广受青睐。然而,随着数据量的不断增长和计算需求的日益复杂,Pandas代码的性能问题也逐渐浮出水面。如何让Pandas代码运行得更快、更高效,成为了每一个人使用者都需要面对的挑战。

今天,本文就一个简化版的实际分析案例,来一起探讨Pandas代码如何写才能性能更好,让你的数据处理流程更加顺滑,不再为漫长的等待运行而烦恼。

1. 案例介绍

假设有个股票分析的场景,我们需要给所有的股票每天的交易情况做一个评估,评估的结果有3个级别:。其中,“优”的条件是当天成交额大于10亿收盘价大于开盘价,也就是股票上涨;“差”的条件是当天成交额小于1亿收盘价小于开盘价,也就是股票下跌;除此之外的情况就是“中”

再次强调一下,这是一个简化的评估方法,主要是为了下面演示Pandas的代码性能,真实的评估不会如此粗糙。

股票交易的数据来自A股2024年1,2月份的日交易数据,大约20多万条。数据可从地址 databook.top 下载。

导入数据:

import pandas as pd

# 这个路径根据实际情况修改
fp = r'D:\data\2024\历史行情数据-东财-不复权-2024.csv'

df = pd.read_csv(fp)
df = df.loc[:, ["股票代码", "日期", "开盘", "收盘", "最高", "最低", "成交量"]]
df

image.png

2. 不同写法的性能比较

下面是3种代码的写法都是基于pandas的,完成的功能也是一样的。

2.1. 循环遍历

给每条数据加一个评估的指标,最直接想到的方法就是遍历所有的数据,然后根据每条数据的情况,给予一个评估指标(优,中,差)。

首先,封装一个评估一条数据的函数:

def eval_stock(row):
    """
    评估一条的数据
    """
    # 成交额
    volumn = row["收盘"] * row["成交量"]
    
    if volumn > 1_000_000_000 and row["收盘"] > row["开盘"]:
        return "优"

    if volumn < 100_000_000 and row["收盘"] < row["开盘"]:
        return "差"

    return "中"

然后用遍历的方式评估我们准备的数据(A股2024年1,2月份的日交易数据)。

for idx, row in df.iterrows():
    df.loc[idx, "评估"] = eval_stock(row)

df

image.png

虽然只有20多万条数据,但是执行时间还挺长的,在jupyter notebook 中用 %%timeit 魔法函数测试性能如下。

%%timeit
for idx, row in df.iterrows():
    df.loc[idx, "评估"] = eval_stock(row)

运行结果:

36.4 s ± 367 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

执行一次要36秒多,效率很低。

2.2. apply方法

apply方法是pandas提供的一种灵活处理数据的接口,它允许我们传入一个自定义函数来处理数据。下面我们看看这种方式的性能如何。

%%timeit
df["评估"] = df.apply(eval_stock, axis=1)

运行结果:

4.9 s ± 86.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

性能提升非常明显(36.4秒->4.9秒),代码也变得更加简洁。

2.3. 向量化方法

最后,我们看看终极的写法,这种写法把pandas的数据结构DataFrame看成是一个一维的向量数组(每列一个向量),而不是一个二维的数值数组。这样,我们操作数据是以为单位来操作,看看这样写的性能如何:

%%timeit
df["评估"] = "中"
df.loc[
    (df["收盘"] * df["成交量"] > 1_000_000_000) & (df["收盘"] > df["开盘"]),
    "评估",
] = "优"
df.loc[
    (df["收盘"] * df["成交量"] < 100_000_000) & (df["收盘"] < df["开盘"]), "评估"
] = "差"

运行结果:

8.22 ms ± 434 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

运行时间几乎可以忽略不计

3. 总结

同样使用pandas写数据分析的代码,性能差距居然会如此天差地别。

可见,学习pandas,不仅仅是学习它的各种接口和函数,更重要的是了解从pandas执行的角度应该如何看待数据,是把数据看成一个一个独立的值,还是一行一行或一列一列的向量。只有这样,才能用pandas高效的处理数据,这在数据量膨胀之后,会大大提高我们分析的效率。

文章转载自:wang_yb

原文链接:https://www.cnblogs.com/wang_yb/p/18081105

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1529275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电子科技大学链时代工作室招新题C语言部分---题号G

1. 题目 问题的第一段也是非常逆天&#xff0c;说实话&#xff0c;你编不出问题背景可以不编。 这道题的大概意思就是&#xff0c; Pia要去坐飞机&#xff0c;那么行李就有限重。这时Pia想到自己带了个硬盘&#xff0c;众所周知&#xff0c;硬盘上存储的数据就是0和1的二进制序…

StartAI创成式填充(扩图)功能使用教程 约等于Photoshop Beta 25.0

创成式填充&#xff0c;是基于原有图片进行扩展或延展&#xff0c;在保证图片合理性的同时实现与原图片的高度契合。StartAI PS智能AI插件通过【扩图】&#xff0c;【局部重绘】&#xff0c;【背景移除】等功能来实现PS的“创成式填充” StartAI当前最新版本&#xff1a;V0.7.…

rabbitmq-spring-boot-start配置使用手册

rabbitmq-spring-boot-start配置使用手册 文章目录 1.yaml配置如下2.引入pom依赖如下2.1 引入项目resources下libs中的jar包依赖如下2.2引入maven私服依赖如下 3.启动类配置如下4.项目中测试发送消息如下5.项目中消费消息代码示例6.mq管理后台交换机队列创建及路由绑定关系如下…

Maven项目如何导入依赖包

一、导入依赖包 导入mysql依赖包 第一步&#xff1a;登录Maven官网 Maven官网&#xff1a;https://mvnrepository.com/search?qmysql 第二步&#xff1a;点击MySql Connector Java 第三步&#xff1a;点击任意一个版本 第四步&#xff1a;将以下内容复制到pom.xml中 导入j…

【MATLAB源码-第165期】基于matlab的科莫多巨蜥算法(KMA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 科莫多巨蜥算法&#xff08;Komodo Mlipir Algorithm&#xff0c;简称KMA&#xff09;是一种受到印尼科莫多岛上独特生物——科莫多巨蜥启发的创新算法。尽管这个算法的名称听起来很有趣&#xff0c;但实际上它并不是一个公认…

【Godot4.2】2D导航04 - TileMap导航的逻辑

基于NavigationRegion2D 我们基于NavigationRegion2D的逻辑一文的场景结构&#xff0c;但是将NavigationRegion2D删除&#xff0c;更改为TileMap节点。 为TileMap创建Tileset&#xff0c;并创建一个导航层。在TileSet面板中&#xff0c;为草地和黄色泥土地面图块绘制可通行区…

PX4|基于FAST-LIO mid360的无人机室内自主定位及定点悬停

目录 前言环境配置运行fast-lio修改px4位置信息融合方式编写位置坐标转换及传输节点 前言 在配置mid360运行环境后&#xff0c;可使用mid360进行室内的精准定位。 环境配置 在livox_ros_driver2的上级目录src下保存fast-lio的工程 git clone https://github.com/hku-mars/F…

springboot企业级抽奖项目-整体展示

项目地址 GitHub - kiorr/lottery: 企业红包雨项目 star截图q&#xff1a;3353441618可以领取资料 原型效果 前台 后台 业务分析 项目介绍 项目概述 京东的红包雨大家可能都参与过&#xff0c;在某段时间内随机发放不同的红包 本项目为一个通用的红包雨模式抽奖系统&…

服务器端(Debian 12)配置jupyter与R 语言的融合

融合前&#xff1a; 服务器端Debian 12,域名&#xff1a;www.leyuxy.online 1.安装r-base #apt install r-base 2.进入R并安装IRkernel #R >install.packages(“IRkernel”) 3.通过jupyter notebook的Terminal执行&#xff1a; R >IRkernel::installspec() 报错 解决办…

【Godot4.2】2D导航01 - AStar2D及其使用方法

概述 对于2D平台跳跃或飞机大战&#xff0c;以及一些直接用键盘方向键操控玩家的游戏&#xff0c;是根本用不到寻路的&#xff0c;因为只需要检测碰撞就可以了。 但是对于像RTS或战棋这样需要操控玩家到地图指定位置的移动方式&#xff0c;就绝对绕不开寻路了。 导航、碰撞与…

堆排序(数据结构)

本期讲解堆排序的实现 —————————————————————— 1. 堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 1. 建堆 • 升序&#xff1a;建大堆 • 降序&#xff1a;建小堆 2. 利用堆删除思想来进行排序. 建堆和堆删…

QCustomPlot-绘制X轴为日期的折线图

主要代码如下&#xff1a; void Widget::InitQLineXDateAddData() {customPlot new QCustomPlot(this);// 创建日期时间类型的刻度生成器QSharedPointer<QCPAxisTickerDateTime> dateTimeTicker(new QCPAxisTickerDateTime);dateTimeTicker->setDateTimeFormat(&quo…

基于python+vue智慧社区家政服务系统的设计与实现flask-django-nodejs

论文主要是对智慧社区家政服务系统进行了介绍&#xff0c;包括研究的现状&#xff0c;还有涉及的开发背景&#xff0c;然后还对系统的设计目标进行了论述&#xff0c;还有系统的需求&#xff0c;以及整个的设计方案&#xff0c;对系统的设计以及实现&#xff0c;也都论述的比较…

Kotlin进阶之协程从专家到出家

公众号「稀有猿诉」 原文链接 Kotlin进阶之协程从专家到出家 协程Coroutine是一种轻量级的实现异步的方式&#xff0c;是代码执行的控制框架&#xff0c;是最新式的并发编程范式。它在使用上大大简化了以往多线程并发带来的种种麻烦&#xff08;如状态同步和锁&#xff…

1-postgresql数据库高可用脚本详解

问题&#xff1a; pgrep -f postgres > /dev/null && echo 0 || pkill keepalived 这是什么意思 建议换成 pgrep -f postmaster > /dev/null && echo 0 || pkill keepalived 回答 这条命令是一个复合命令&#xff0c;包含条件执行和重定向的元素。让我们…

Docker部署dart-frog服务

参考&#xff1a; dart-frog官网&#xff1a;https://dartfrog.vgv.dev/docs/overview 使用 Dart Frog 体验 Dart 服务端开发 - 简书 打包项目 按照demo新增项目后&#xff0c;执行&#xff1a; dart_frog build 等待build后生成 build 文件夹&#xff0c;这个文件夹就是需要…

体验函数式组件简单实现Loading 加载(造轮子篇)

一、前言 最近想着优化一下网站&#xff0c;在文章列表页加一个Loading操作&#xff0c;于是就想到了函数式组件&#xff0c;于是本章就来和大家一起简单探讨下实现思路。 二、Loading设计 这里我想实现的效果是&#xff1a;当我们刷新页面的时候&#xff0c;前端请求接口&…

Linux 建立链接(ln)

目录 1、ln命令 创建软链接&#xff1a; 创建硬链接&#xff1a; 2、输出重定向&#xff08;>/>>&#xff09; 3、管道&#xff08;|&#xff09; 1、ln命令 &#xff08;英文全拼&#xff1a;link files&#xff09;为某一个文件在另外一个位置建立一个同步的…

R语言:ggplot2做柱状图,随机生成颜色。

#加载包 > library(ggplot2) > library(tidyverse) > library(openxlsx) > library(reshape2) > library(RColorBrewer) > library(randomcoloR) > library(viridis) > set.seed(1233) #设立种子数。 > palette <- distinctColorPalette(30) …

python爬取微博话题、关键词下方的所有帖子

文章目录 github repository项目介绍输出安装必备库获取cookiegithub repository 网址:https://github.com/dataabc/weibo-search 在GitHub获取到的非常成熟的微博话题、关键词等微博帖子的获取方案,并且可以指定一个或多个关键词,指定获取微博类型,指定获取日期等等。 项…