pandas进阶:运用cumcount大幅提高生成众数序列速度

分类: python |
前文多次提到生成一个众数序列的速度比较,一个众数序列如果使用遍历无论什么语言都慢如蜗牛,即便用c++也不例外,特别遇到大数据越到后面越慢,因为每一个元素都需要用到前面所有的数据计算,用c++,numpy的bincount,pandas的expanding都无法避免使用讨厌的循环遍历,例如使用pandas的expanding结合numpy的bincount生成一个1万行的众数序列大概需要600毫秒,但10万行的大幅增加到35秒!
所以遇到tick数据的层面基本可以放弃这种方法,试想即使分开一百个10万行一年过千万的数据光计算就一个小时!
八年的数据跑一天也算不了几个品种,还很可能中途死机,幸运的是pandas的grouping模块可以解决这个问题,
需要用到里面的cumcount函数,其速度快的根本原因是算法完全不一样,先看看数据:
这里有10万行随机生成的整数序列'data‘,希望生成的众数序列如图中的'm'列,expanding结合bincount虽然代码很简单确平均需要35秒,另一种方法通过groupby后使用cumcount,然后用cummax,在对这个序列进行groupby通过first提取第一个元素,然后reindex搞定:
35秒对52毫秒!!!