10.Pandas优化

1.如何优化Pandas

除非对相应的优化手段已经非常熟悉,否则代码的可读性应当被放在首位。过早优化是万
恶之源!
pandas 为了易用性,确实牺牲了一些效率,但同时也预留了相应的优化路径。因此如果要进行优化,熟悉并优先使用 pandas 自身提供的优化套路至关重要。
尽量使用 pandas(或者 numpy)内置的函数进行运算,一般效率都会更高。
在可以用几种内部函数实现相同需求时,最好进行计算效率的比较,差距可能很大。
pandas 官方提供的讨论如何进行优化的文档:
优化文档

2.Pandas时间记录工具

如何使用time和timeit去计算每行、每段代码的运行时间可以查看以下文章
time和timeit使用方法
使用python原生的方式计算时间

import pandas as pd
df = pd.read_excel('stu_data.xlsx')
import time
from datetime import datetime

t1 = datetime.now()
a = df
time.sleep(1)
print('运行时间:',datetime.now()-t1)

在这里插入图片描述
用 line_profiler做深入分析

from line_profiler import LineProfiler
import random
def m_test(numbers):
 s = sum(numbers)
 l = [numbers[i]/50 for i in
range(len(numbers))]
 m = ['hello' + str(numbers[i]) for i in
range(len(numbers))]
lp = LineProfiler() # 定义一个 LineProfiler 对象
lp_wrapper = lp(m_test) # 用 LineProfiler 对象监控需要分析的函数
#生成函数所需参数
import random
nums = [random.randint(1,100)for i in
range(1000)]
#传递参数
lp_wrapper(nums)
#获取执行时间
lp.print_stats()

在这里插入图片描述

3.超大数据文件的处理

超大数据文件在使用 pandas 进行处理时可能需要考虑两个问题:
读取速度,内存用量。
一般情况会考虑读入部分数据进行代码编写和调试,然后再对完整数据进行处理。在数据读入和处理时需要加快处理速度,减少资源占用。
一些基本原则
当明确知道数据列的取值范围时,读取数据时可以使用 dtype 参数来手动指定类型,如 np.uint8 或者 np.int16,否则默认的 np.int64 类型等内存开销明显非常大。
尽量少用类型模糊的 object,改用更明确的 category 等(用astype()转换)。
对类别取值较少,但案例数极多的变量,读入后尽量转换为数值代码进行处理。
方式1:导入后进行类型转换

import pandas as pd
# 方式1:导入后进行类型转换
df = pd.DataFrame({"a" : [0,1, 2, 3, 4, 5,6, 7, 8, 9],
                    "b" : ["祖安狂人","祖安狂人","冰晶凤凰","冰晶凤凰","祖安狂人","祖安狂人","祖安狂人","冰晶凤凰", "冰晶凤凰","祖安狂人"]})
print('按照默认存储的内存信息')
print(df.info())

# 类型转换
df['a'] = pd.to_numeric(df['a'], downcast='integer')
df['b'] = df['b'].astype('category') # 必要时修改成str占用更小内存
# df['b'] = df['b'].astype('str')
print('修改数据类型后的内存信息')
print(df.info())

在这里插入图片描述
方式2:对文件进行分段读取

# 方式2:读取部分数据
# 每次读取5行 csv才可以用
df2 = pd.read_csv('stu_data.csv',encoding='gbk',chunksize=5)
# 获取数据 可以加一个判断条件(循环次数大于多少时退出循环),来控制读取数量
for d in df2:
    print(d)

在这里插入图片描述
方式3:使用 iterator 参数和 get_chunk()组合

# 使用iteraotor迭代器,usecols选取哪几列
df3 = pd.read_csv('stu_data.csv',encoding='gbk', iterator=True, usecols=[0,1,2,3])
df3.get_chunk(10) # 执行一次,读取向下的10行(第二次读取到11-20行...)

在这里插入图片描述

4.Pandas代码优化

代码基本优化
尽量不要在 pandas 中使用循环
如果循环很难避免,尽量在循环体中使用 numpy 做计算。
使用for循环、内置函数、自定义函数的耗费时间对比
在这里插入图片描述

5.Pandas代码多列运算优化

在这里插入图片描述

6. Pandas加速外挂

大部分外挂包都是基于 linux 环境,windows 下能用的不多。大部分外挂包还处于测试阶段,功能上并未完善。
numba
对编写的自定义函数进行编译,以提高运行效率。
A Just-In-Time Compiler for Numerical Functions in Python 具体使用的是 C++编写的
LLVM(Low Level Virtual Machine) compiler 实际上主要是针对numpy 库进行优化编译,并不仅限于 pandas
在这里插入图片描述
swifter
对 apply 函数进行并行操作是专门针对 pandas 进行优化的工具包
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为数据分析师的开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值