加入收藏 | 设为首页 | 会员中心 | 我要投稿 宜春站长网 (https://www.0795zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

还在抱怨Pandas运行速度慢?这几个方法会颠覆你的看法

发布时间:2018-12-20 15:16:11 所属栏目:教程 来源:知乎
导读:前言 当大家谈到数据分析时,提及最多的语言就是Python和SQL。Python之所以适合数据分析,是因为它有很多第三方强大的库来协助,pandas就是其中之一。pandas的文档中是这样描述的: 快速,灵活,富有表现力的数据结构,旨在使关系或标记数据的使用既简单又
副标题[/!--empirenews.page--]

前言

当大家谈到数据分析时,提及最多的语言就是Python和SQL。Python之所以适合数据分析,是因为它有很多第三方强大的库来协助,pandas就是其中之一。pandas的文档中是这样描述的:

  • “快速,灵活,富有表现力的数据结构,旨在使”关系“或”标记“数据的使用既简单又直观。”

我们知道pandas的两个主要数据结构:dataframe和series,我们对数据的一些操作都是基于这两个数据结构的。但在实际的使用中,我们可能很多时候会感觉运行一些数据结构的操作会异常的慢。一个操作慢几秒可能看不出来什么,但是一整个项目中很多个操作加起来会让整个开发工作效率变得很低。有的朋友抱怨pandas简直太慢了,其实对于pandas的一些操作也是有一定技巧的。

还在抱怨Pandas运行速度慢?这几个方法会颠覆你的看法

pandas是基于numpy库的数组结构上构建的,并且它的很多操作都是(通过numpy或者pandas自身由Cpython实现并编译成C的扩展模块)在C语言中实现的。因此,如果正确使用pandas的话,它的运行速度应该是非常快的。

本篇将要介绍几种pandas中常用到的方法,对于这些方法使用存在哪些需要注意的问题,以及如何对它们进行速度提升。

  • 将datetime数据与时间序列一起使用的优点
  • 进行批量计算的最有效途径
  • 通过HDFStore存储数据节省时间

使用Datetime数据节省时间

我们来看一个例子。

  1. >>> import pandas as pd 
  2. >>> pd.__version__ 
  3. '0.23.1' 
  4.  
  5. # 导入数据集 
  6. >>> df = pd.read_csv('demand_profile.csv') 
  7. >>> df.head() 
  8.      date_time  energy_kwh 
  9. 0  1/1/13 0:00       0.586 
  10. 1  1/1/13 1:00       0.580 
  11. 2  1/1/13 2:00       0.572 
  12. 3  1/1/13 3:00       0.596 
  13. 4  1/1/13 4:00       0.592 

从运行上面代码得到的结果来看,好像没有什么问题。但实际上pandas和numpy都有一个 dtypes 的概念。如果没有特殊声明,那么date_time将会使用一个 object的dtype类型,如下面代码所示:

  1. >>> df.dtypes 
  2. date_time      object 
  3. energy_kwh    float64 
  4. dtype: object 
  5.  
  6. >>> type(df.iat[0, 0]) 
  7. str 

object 类型像一个大的容器,不仅仅可以承载 str,也可以包含那些不能很好地融进一个数据类型的任何特征列。而如果我们将日期作为 str 类型就会极大的影响效率。

因此,对于时间序列的数据而言,我们需要让上面的date_time列格式化为datetime对象数组(pandas称之为时间戳)。pandas在这里操作非常简单,操作如下:

  1. >>> df['date_time'] = pd.to_datetime(df['date_time']) 
  2. >>> df['date_time'].dtype 
  3. datetime64[ns] 

我们来运行一下这个df看看转化后的效果是什么样的。

  1. >>> df.head() 
  2.                date_time    energy_kwh 
  3. 0    2013-01-01 00:00:00         0.586 
  4. 1    2013-01-01 01:00:00         0.580 
  5. 2    2013-01-01 02:00:00         0.572 
  6. 3    2013-01-01 03:00:00         0.596 
  7. 4    2013-01-01 04:00:00         0.592 

date_time的格式已经自动转化了,但这还没完,在这个基础上,我们还是可以继续提高运行速度的。如何提速呢?为了更好的对比,我们首先通过 timeit 装饰器来测试一下上面代码的转化时间。

  1. >>> @timeit(repeat=3, number=10) 
  2. ... def convert(df, column_name): 
  3. ...     return pd.to_datetime(df[column_name]) 
  4.  
  5. >>> df['date_time'] = convert(df, 'date_time') 
  6. Best of 3 trials with 10 function calls per trial: 
  7. Function `convert` ran in average of 1.610 seconds. 

(编辑:宜春站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读