pandas内存优化分享

缘由

最近在做Kaggle上的wiki文章流量预测项目,这里由于个人电脑配置问题,我一直都是用的Kaggle的kernel,但是我们知道kernel的内存限制是16G,如下:

在处理数据过程中发现会超出,虽然我们都知道对于大数据的处理有诸如spark等分布式处理框架,但是依然存在下面的问题:

  1. 对于个人来说,没有足够的资源让这些框架发挥其优势;
  2. 从处理数据的库丰富程度上,还是pandas等更具有优势;
  3. 很多时候并不是pandas无法处理,只是数据未经优化;

所以这里还是考虑针对数据进行内存方面的优化,以达到减少内存占用,并在kernel上正常运行为最终目的;

整个尝试的过程

只加载当前用到的

这个不用多说,虽然一般为了省事,都是开头一起load到内存中,但是特殊情况下,这里还是要注意的,如下:

可以看到,虽然可用数据文件很多,但是由于当前处理需要的仅仅是train2.csv,所以只加载其即可,不要小看这一步,这里每个文件加载过来都是几百M的;

类型转换

这里是在预处理部分能做的对内存影响最大的一部分,基本思路如下:

  1. object考虑是否需要转换为category;
  2. numeric,即各种数值类型,是否在允许范围内降低类型,例如假如某一列为整型且最大值为100,那么就是用用int8类型来描述;
  3. 对于日期类型,可以先不着急转为datetime64,我们直到datetime类型占用内存是比object还多的,可以先考虑转为category,后续处理完释放了没用对象后再转回来即可(这种方式比较少用,但是对于这个项目还是挺有用的,因为最终内存峰值也就在那几G上);

如下是未做转换前的DataFrame信息:

如下是我对原始数据各字段的类型转换以及转换后的DataFrame信息:

看到内存占用直接降了一半,不要小看这几百M,在DataFrame进行各种apply、groupby运算时,临时占用的内存是非常多的,也很容易超过峰值导致kernel重启;

PS:当然,这里如果直接加载时指定数据类型也是可以的,我这边为了展示转换前后效果,所以直接指定,实时上更常见的做法时,先直接加载,info或者describe看数据信息,然后判断数据应该的类型,修改代码为直接指定;

使用union_categoricals代替pd.concat实现表的连接

做过时序数据预测的朋友应该直到,时序数据构建时,一个特点是需要连接训练和测试数据,然后同时针对这些数据做时序上的延迟特征、各种维度的统计特征等等,因此这里就涉及到数据连接,一定要注意要用union_categoricals代替pd.concat,如果直接使用concat,那么category类型的列会被转为object,那么在连接的过程中,内存就会超过峰值,导致kernel重启,那就悲剧了。。。。

如下,是对数据做reshape的操作,这个是该竞赛数据的一个特点,由于其把每一天对应的访问数据都放到了一起,也就是一行中包含了一篇文章的每一天的访问量,而这是不利于后续做延迟特征构建的,需要将每一天的信息单独作为一行,因此需要reshape:

如下这种连接、即时销毁的方式虽然看着丑,但是效果还是可以的:

如下是采取这种方式链接后的DataFrame信息,其实难点不在于DataFrame多大,而是它在运算过程中的内存峰值会超过限制:

注意

  1. 即时del掉不用的对象;
  2. 对于category列的连接,使用union_categoricals;
  3. 在不同类型的列连接时,结果类型会取大的那个,比如int8连接int64,那么结果就都是int64;
  4. 关于category类型,不仅可以降低内存占用,而且还能加快运算速度,关键在于特征的取值可能数量是否远小于行数;

Kaggle竞赛链接

https://www.kaggle.com/c/web-traffic-time-series-forecasting

Kaggle kernel链接,该kernel已经设置为public,大家可以随意copy

https://www.kaggle.com/holoong9291/web-traffic-time-series-forecasting

最后

大家可以到我的Github上看看有没有其他需要的东西,目前主要是自己做的机器学习项目、Python各种脚本工具、数据分析挖掘项目以及Follow的大佬、Fork的项目等:
https://github.com/NemoHoHaloAi

由Kaggle竞赛wiki文章流量预测引发的pandas内存优化过程分享的更多相关文章

  1. Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

    Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931   近日,Artur Suilin 等人发布了 Kaggl ...

  2. 教程 | Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

    https://mp.weixin.qq.com/s/JwRXBNmXBaQM2GK6BDRqMw 选自GitHub 作者:Artur Suilin 机器之心编译 参与:蒋思源.路雪.黄小天 近日,A ...

  3. 如何使用Python在Kaggle竞赛中成为Top15

    如何使用Python在Kaggle竞赛中成为Top15 Kaggle比赛是一个学习数据科学和投资时间的非常的方式,我自己通过Kaggle学习到了很多数据科学的概念和思想,在我学习编程之后的几个月就开始 ...

  4. 初窥Kaggle竞赛

    初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...

  5. 《机器学习及实践--从零开始通往Kaggle竞赛之路》

    <机器学习及实践--从零开始通往Kaggle竞赛之路> 在开始说之前一个很重要的Tip:电脑至少要求是64位的,这是我的痛. 断断续续花了个把月的时间把这本书过了一遍.这是一本非常适合基于 ...

  6. 《Python机器学习及实践:从零开始通往Kaggle竞赛之路》

    <Python 机器学习及实践–从零开始通往kaggle竞赛之路>很基础 主要介绍了Scikit-learn,顺带介绍了pandas.numpy.matplotlib.scipy. 本书代 ...

  7. kaggle竞赛分享:NFL大数据碗(上篇)

    kaggle竞赛分享:NFL大数据碗 - 上 竞赛简介 一年一度的NFL大数据碗,今年的预测目标是通过两队球员的静态数据,预测该次进攻推进的码数,并转换为该概率分布: 竞赛链接 https://www ...

  8. Kaggle竞赛入门:决策树算法的Python实现

    本文翻译自kaggle learn,也就是kaggle官方最快入门kaggle竞赛的教程,强调python编程实践和数学思想(而没有涉及数学细节),笔者在不影响算法和程序理解的基础上删除了一些不必要的 ...

  9. Kaggle竞赛入门(二):如何验证机器学习模型

    本文翻译自kaggle learn,也就是kaggle官方最快入门kaggle竞赛的教程,强调python编程实践和数学思想(而没有涉及数学细节),笔者在不影响算法和程序理解的基础上删除了一些不必要的 ...

随机推荐

  1. git checkout简介

    原文: http://web.mit.edu/~thefred/MacData/afs/sipb/project/git/git-doc/git-checkout.html  git checkout ...

  2. 2019年第二阶段我要变强个人训练赛第八场 B.序列(seq)

    传送门 B.序列(seq) •题目描述 给出一个长度为n的序列a,每次对序列进行一下的某一个操作. •输入 第一行两个整数n,q表示序列长度和操作个数. 接下来一行n个数,表示序列a. 接下来q行表示 ...

  3. POJ 1236 Network of Schools(tarjan)

    Network of Schools Description A number of schools are connected to a computer network. Agreements h ...

  4. linux seqlock 锁

    内核包含了一对新机制打算来提供快速地, 无锁地存取一个共享资源. seqlock 在这 种情况下工作, 要保护的资源小, 简单, 并且常常被存取, 并且很少写存取但是必须要快. 基本上, 它们通过允许 ...

  5. Linux 内核 启动时间

    为见到 PCI 如何工作的, 我们从系统启动开始, 因为那是设备被配置的时候. 当一个 PCI 设备上电时, 硬件保持非激活. 换句话说, 设备只响应配置交易. 在上电时, 设备没有内存并且没有 I/ ...

  6. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  7. Linux基础:Linux下常用命令

    常用命令 shutdown ​ 用来系统关机命令.shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作. ​ shutdown (选项)(参数) -c: 当执行"s ...

  8. .NETCore3.1中的Json互操作最全解读-收藏级

    前言 本文比较长,我建议大家先点赞.收藏后慢慢阅读,点赞再看,形成习惯! 我很高兴,.NETCore终于来到了3.1LTS版本,并且将支持3年,我们也准备让部分业务迁移到3.1上面,不过很快我们就遇到 ...

  9. 经典问题(c++/python)素数、杨辉三角(金字塔型)、统计单词数、简单计算器、密码安全程度、凯撒密码加密、汉诺塔 (python课设实验实例)-- biaobiao88

    [编写程序,输人一个大于2的自然数,然后输出小于该数字的所有素数组成的列表.]所谓素数,是指除了1和自身之外没有其他因数的自然数,最小的素数是2,后面依次是3.5.7.11.13... c++代码: ...

  10. Javascript事件系统

    本文内容 事件基础 事件监听方式 事件默认行为 事件冒泡与事件捕获 事件绑定与事件委托 事件基础 注意:本文不会深入探究Javascript的事件循环. 提到事件,相信每位Javascript开发者都 ...