Python分析14亿条数据,分分钟就处理好了

Google Ngram viewer是一个有趣和有用的工具,它使用谷歌从书本中扫描来的海量的数据宝藏,绘制出单词使用量随时间的变化。

举个例子,单词 Python (区分大小写) :

Python分析14亿条数据,分分钟就处理好了

这幅图来自:books.google.com/ngrams… ,描绘了单词 ‘Python’ 的使用量随时间的变化。

它是由谷歌的n-gram 数据集驱动的,根据书本印刷的每一个年份,记录了一个特定单词或词组在谷歌图书的使用量。然而这并不完整(它并没有包含每一本已经发布的书!),数据集中有成千上百万的书,时间上涵盖了从 16 世纪到 2008 年。数据集可以免费从这里下载。

我决定使用 Python 和我新的数据加载库 PyTubes 来看看重新生成上面的图有多容易。

挑战

1-gram 的数据集在硬盘上可以展开成为 27 Gb 的数据,这在读入 python 时是一个很大的数据量级。Python可以轻易地一次性地处理千兆的数据,但是当数据是损坏的和已加工的,速度就会变慢而且内存效率也会变低。

总的来说,这 14 亿条数据(1,430,727,243)分散在 38 个源文件中,一共有 2 千 4 百万个(24,359,460)单词(和词性标注,见下方),计算自 1505 年至 2008 年。

当处理 10 亿行数据时,速度会很快变慢。并且原生 Python 并没有处理这方面数据的优化。幸运的是, numpy 真的很擅长处理大体量数据。使用一些简单的技巧,我们可以使用 numpy 让这个分析变得可行。

在 python/numpy 中处理字符串很复杂。字符串在 python 中的内存开销是很显著的,并且 numpy 只能够处理长度已知而且固定的字符串。基于这种情况,大多数的单词有不同的长度,因此这并不理想。

# 兄弟们学习python,有时候不知道怎么学,从哪里开始学。掌握了基本的一些语法或者做了两个案例后,不知道下一步怎么走,不知道如何去学习更加高深的知识。
# 那么对于这些大兄弟们,我准备了大量的免费视频教程,PDF电子书籍,以及源代码!
# 还会有大佬解答!
# 都在这个裙里了:708525271
# 欢迎加入,一起讨论 一起学习!

 

Loading the data

下面所有的代码/例子都是运行在 8 GB 内存 的 2016 年的 Macbook Pro。如果硬件或云实例有更好的 ram 配置,表现会更好。

1-gram 的数据是以 tab 键分割的形式储存在文件中,看起来如下:

Python分析14亿条数据,分分钟就处理好了

每一条数据包含下面几个字段:

Python分析14亿条数据,分分钟就处理好了

为了按照要求生成图表,我们只需要知道这些信息,也就是:

Python分析14亿条数据,分分钟就处理好了

通过提取这些信息,处理不同长度的字符串数据的额外消耗被忽略掉了,但是我们仍然需要对比不同字符串的数值来区分哪些行数据是有我们感兴趣的字段的。这就是 pytubes 可以做的工作:

Python分析14亿条数据,分分钟就处理好了

Python分析14亿条数据,分分钟就处理好了

差不多 170 秒(3 分钟)之后, one_grams 是一个 numpy 数组,里面包含差不多 14 亿行数据,看起来像这样(添加表头部为了说明):

Python分析14亿条数据,分分钟就处理好了

从这开始,就只是一个用 numpy 方法来计算一些东西的问题了:

每一年的单词总使用量

谷歌展示了每一个单词出现的百分比(某个单词在这一年出现的次数/所有单词在这一年出现的总数),这比仅仅计算原单词更有用。为了计算这个百分比,我们需要知道单词总量的数目是多少。

幸运的是,numpy让这个变得十分简单:

Python分析14亿条数据,分分钟就处理好了

绘制出这个图来展示谷歌每年收集了多少单词:

Python分析14亿条数据,分分钟就处理好了

很清楚的是在 1800 年之前,数据总量下降很迅速,因此这回曲解最终结果,并且会隐藏掉我们感兴趣的模式。为了避免这个问题,我们只导入 1800 年以后的数据:

Python分析14亿条数据,分分钟就处理好了

这返回了 13 亿行数据(1800 年以前只有 3.7% 的的占比)

Python分析14亿条数据,分分钟就处理好了

Python 在每年的占比百分数

获得 python 在每年的占比百分数现在就特别的简单了。

使用一个简单的技巧,创建基于年份的数组,2008 个元素长度意味着每一年的索引等于年份的数字,因此,举个例子,1995 就只是获取 1995 年的元素的问题了。

这都不值得使用 numpy 来操作:

Python分析14亿条数据,分分钟就处理好了

绘制出 word_counts 的结果:

Python分析14亿条数据,分分钟就处理好了

形状看起来和谷歌的版本差不多

Python分析14亿条数据,分分钟就处理好了

实际的占比百分数并不匹配,我认为是因为下载的数据集,它包含的用词方式不一样(比如:Python_VERB)。这个数据集在 google page 中解释的并不是很好,并且引起了几个问题:

人们是如何将 Python 当做动词使用的?

‘Python’ 的计算总量是否包含 ‘Python_VERB’?等

幸运的是,我们都清楚我使用的方法生成了一个与谷歌很像的图标,相关的趋势都没有被影响,因此对于这个探索,我并不打算尝试去修复。

性能

谷歌生成图片在 1 秒钟左右,相较于这个脚本的 8 分钟,这也是合理的。谷歌的单词计算的后台会从明显的准备好的数据集视图中产生作用。

举个例子,提前计算好前一年的单词使用总量并且把它存在一个单独的查找表会显著的节省时间。同样的,将单词使用量保存在单独的数据库/文件中,然后建立第一列的索引,会消减掉几乎所有的处理时间。

这次探索 确实 展示了,使用 numpy 和 初出茅庐的 pytubes 以及标准的商用硬件和 Python,在合理的时间内从十亿行数据的数据集中加载,处理和提取任意的统计信息是可行的。

语言战争

为了用一个稍微更复杂的例子来证明这个概念,我决定比较一下三个相关提及的编程语言:Python,Pascal, 和 Perl.

源数据比较嘈杂(它包含了所有使用过的英文单词,不仅仅是编程语言的提及,并且,比如,python 也有非技术方面的含义!),为了这方面的调整, 我们做了两个事情:

只有首字母大写的名字形式能被匹配(Python,不是 Python)

每一个语言的提及总数已经被转换到了从 1800 年到 1960 年的百分比平均数,考虑到 Pascal 在 1970 年第一次被提及,这应该有一个合理的基准线。

结果:

Python分析14亿条数据,分分钟就处理好了

对比谷歌 ( 没有任何的基准线调整 ):

Python分析14亿条数据,分分钟就处理好了
运行时间: 只有 10 分钟多一点

以后的 PyTubes 提升

在这个阶段,pytubes 只有单独一个整数的概念,它是 64
比特的。这意味着 pytubes 生成的 numpy 数组对所有整数都使用 i8 dtypes。在某些地方(像 ngrams 数据),8
比特的整型就有点过度,并且浪费内存(总的 ndarray 有 38Gb,dtypes 可以轻易的减少其 60%)。

我计划增加一些等级 1,2 和 4 比特的整型支持( github.com/stestagg/py… )

更多的过滤逻辑 - Tube.skip_unless() 是一个比较简单的过滤行的方法,但是缺少组合条件(AND/OR/NOT)的能力。这可以在一些用例下更快地减少加载数据的体积。

更好的字符串匹配 —— 简单的测试如下:startswith, endswith, contains, 和 is_one_of 可以轻易的添加,来明显地提升加载字符串数据是的有效性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python分析14亿条数据,分分钟就处理好了 - Python技术站

(0)
上一篇 2023年3月31日 下午9:03
下一篇 2023年3月31日

相关文章

  • 挑战在代码里面不写for循环,让代码变得更简洁、规范、结构化,以及更好的代码可读性!

    哈喽兄弟们,又是新的一天!今天你敲代码了吗? 一、序言 为什么要挑战自己在代码里不写 for loop?因为这样可以迫使你去学习使用比较高级、比较地道的语法或 library。文中以 python 为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。 自从我开始探索 Python 中惊人的语言功能已经有一段时间了。一开始,我给自己一个挑战,目的…

    Python开发 2023年4月2日
    00
  • 快过年了,Python实现12306查票以及自动购票….

    马上就要过年了,听说还有人买不到票? 不要慌,今天咱们来用Python做一个自动查票抢票的脚本,24小时抢票,谁抢的过你!   准备工作 环境 Python 3.8 Pycharm 插件 谷歌浏览器驱动 模块 需要安装的第三方模块,直接pip安装即可。 requests # 数据请求模块 prettytable # 打印好看一些 selenium # 模拟人…

    Python开发 2023年3月31日
    00
  • Python实战小案例:如何读取文件并统计文件中的数值

    哈喽兄弟们,今天浅浅的实战一下,如何用Python计算文件内最大数与最小数平均值~ 一、实战场景 给定一个包含整数的文件,每行数字小于 200,统计文件中的最大最小值和平均值,并将结果写入文件中。 创建一个txt文件,随机输入几行数字,保存命名为 input 即可。 二、主要知识点 文件读写 基础语法 单行注释和多行注释 三、代码实战 马上安排! 1、创建 …

    Python开发 2023年4月2日
    00
  • 用Python来做一个简单的学生管理系统(附源码)

    小学妹说要毕业了,学了一学期Python等于没学,现在要做毕设做不出来,让我帮帮她,晚上去她家吃夜宵。 当时我心想,这不是分分钟的事情,还要去她家,男孩子晚上不要随便出门,要学会保护好自己,于是我花了十分钟给她写了一个发过去,这下不用去她家了~     代码实战 主要代码,完整代码素材、包括其它版本学生管理系统代码,也有录制好的视频讲解,第八行代码自取即可!…

    2023年3月31日
    00
  • 简单的用Python对手机号进行加密

    基础学的太枯燥了,当然需要用案例来实践一下,才能更好的巩固所学。   所以本次来个对手机号进行加密,检验我们所学~ 知识点: 文件读写 基础语法 字符串处理 正则表达式 代码部分 # 导入系统包 import platform import re print(“Hello,秀儿”) print(“简单的加密手机号 “) # 定义文本内容 # Python学习…

    2023年4月2日
    00
  • 为了快速了解原神,我用Python爬取了原神所有角色信息!

    原神是由米哈游制作发行的一款开放世界冒险游戏,号称全球玩家5600W,可以说是非常热门了,朋友都说好玩,哎,但我就是不玩,就是皮…       但是,今天我就要用python来打开“原神世界”的大门!探索一下游戏角色! 话不多说直接开整! 准备工作 这是本次需要使用到 的工具 nodejs pyexecjs requests 编辑器:pycharm环境:Py…

    Python开发 2023年3月31日
    00
  • 重温Python基础——用户输入和while循环

    哈喽兄弟们,本节咱们来复习一下用户输入和while循环。 函数input()的工作原理 函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后,python将其赋值给一个变量,以方便继续使用。例如我们尝试让用户输入一些东西 a = input(“请输入一个数”) print(a) 运行结果 请输入一个数   这时我们就可以根据要求输入数值函数…

    Python开发 2023年4月2日
    00
  • 只用13行Python代码,实现给抖音APP自动点赞,非常简单!

    哈喽兄弟们,今天我们来试试,如何只用13行代码,给抖音APP视频自动点赞! 前因后果 事情是这样的,昨晚表弟晚上一两点了,房间灯还亮着,原来是还在用手机刷某音视频,我抢过手机一看,好家伙,连刷十个都是美女,喜欢列表也全是MM。 我看他手动点赞手都点累了,干脆熬个夜,给他写一个自动点赞的代码,今晚他就点一晚上赞,别睡了直接通宵吧! 好了不多哔哔,我们直接上代码…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部