从未这样玩过!第一次使用 Python 分析 14 亿条数据!

使用Python分析14亿条数据 这次探索 确实 展示了,使用 numpy 和 初出茅庐的 pytubes 以及标准的商用硬件和 Python,在合理的时间内从十亿行数据的数据集中加载,处理和提取任意的统计信息是可行的,通过提取这些信息,处理不同长度的字符串数据的额外消耗被忽略掉了,但是我们仍然需要对比不同字符串的数值来区分哪些行数据是有我们感兴趣的字段的。使用一个简单的技巧,创建基于年份的数组,2008 个元素长度意味着每一年的索引等于年份的数字,因此,举个例子,1995 就只是获取 1995 年的元素的问题了。 阅读详情

你用 Python 处理过的最大数据集有多大?我想大概不会超过上亿条吧,今天分享一个用 Python 处理分析 14 亿条数据的案

这份 14 亿条数据集来自 Google Books ,由 Google Ngram viewer 生成,根据书本印刷的每一个年份,记录了一个特定单词或词组在谷歌图书的使用量。数据集中有成千上百万的书,时间上涵盖了从 16 世纪到 2008 年。可以绘制出单词使用量随时间的变化,比如查询「Python 」在历史中出现的频率。

数据集可以免费从这里下载:

http://storage.googleapis.com/books/ngrams/books/datasetsv2.html

下面使用 Python 的 PyTubes 数据库来加载上面的数据集,然后分析生成上面这样一张图。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 只能够处理长度已知而且固定的字符串。基于这种情况,大多数的单词有不同的长度,因此这并不理想。

加载数据集

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

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

1Python 1587 4 2
2Python 1621 1 1
3Python 1651 2 2
4Python 1659 1 1

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

11. Word
22. Year of Publication
33. Total number of times the word was seen
44. Total number of books containing the word

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

11. 这个单词是我们感兴趣的?
22. 发布的年份
33. 单词使用的总次数

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

 1import tubes
 2
 3FILES = glob.glob(path.expanduser("~/src/data/ngrams/1gram/googlebooks*"))
 4WORD = "Python"
 5one_grams_tube = (tubes.Each(FILES)
 6    .read_files()
 7    .split()
 8    .tsv(headers=False)
 9    .multi(lambda row: (
10        row.get(0).equals(WORD.encode('utf-8')),
11        row.get(1).to(int),
12        row.get(2).to(int)
13    ))
14)

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

 1╒═══════════╤════════╤═════════╕
 2│   Is_Word │   Year │   Count │
 3╞═══════════╪════════╪═════════╡
 4│         0 │   1799 │       2 │
 5├───────────┼────────┼─────────┤
 6│         0 │   1804 │       1 │
 7├───────────┼────────┼─────────┤
 8│         0 │   1805 │       1 │
 9├───────────┼────────┼─────────┤
10│         0 │   1811 │       1 │
11├───────────┼────────┼─────────┤
12│         0 │   1820 │     ... │
13╘═══════════╧════════╧═════════╛

下面就可以开始分析数据了。

每年单词总使用量

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

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

 1last_year = 2008
 2YEAR_COL = '1'
 3COUNT_COL = '2'
 4year_totals, bins = np.histogram(
 5    one_grams[YEAR_COL],
 6    density=False,
 7    range=(0, last_year+1),
 8    bins=last_year + 1,
 9    weights=one_grams[COUNT_COL]
10)

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

img

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

 1one_grams_tube = (tubes.Each(FILES)
 2    .read_files()
 3    .split()
 4    .tsv(headers=False)
 5    .skip_unless(lambda row: row.get(1).to(int).gt(1799))
 6    .multi(lambda row: (
 7        row.get(0).equals(word.encode('utf-8')),
 8        row.get(1).to(int),
 9        row.get(2).to(int)
10    ))
11)

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

img

Python 在每年占比百分数

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

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

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

1word_rows = one_grams[IS_WORD_COL]
2word_counts = np.zeros(last_year+1)
3for _, year, count in one_grams[word_rows]:
4    word_counts[year] += (100*count) / year_totals[year]

绘制出 word_counts 的结果:

img

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

img

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

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

  • 'Python' 的计算总量是否包含 'Python_VERB'?等

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

性能

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

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

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

Python,Pascal 和 Perl 对比

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

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

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

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

结果:

img

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

img

运行时间: 只有 10 分钟多一点。

Python 处理分析 14 亿条数据实战 你用 Python 处理过的最大数据集有多大?我想大概不会超过上亿条吧,今天分享一个用 Python 处理分析 14 亿条数据的案例。 阅读详情

相关推荐

对于上亿数据使用python进行分块处理

将自己想要处理的文档的名字直接粘贴到代码中,点击运行即可出现分块处理结果。

[译] 使用 python 分析 14 亿条数据

原文地址:Analysing 1.4 billion rows with python 原文作者:Steve Stagg 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:Ryden Sun 校对者:luochen1992 allen 使用 python 分析 14 亿条数据 使用 pytubes,numpy 和 matplotlib Google...

weixin_34242331的博客 1470

使用Python Pandas处理亿级数据的方法

主要介绍了使用Python Pandas处理亿级数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

实战演练Python数据分析[pandas]

本篇文章通过四个用例来重点讲解如何利用Python进行数据分析,相信读者一定能有所收获,加油!

qq_56086076的博客 2424

Vue3集成百度实时语音识别

Vue3集成百度实时语音识别

weixin_61769998的博客 548

别再凭感觉估算!用ADS的EBOND库精确仿真Bonding线寄生电感(附完整参数设置指南)

本文详细介绍了在ADS中使用EBOND库精确仿真Bonding线寄生电感的方法,帮助射频工程师在毫米波频段实现高精度建模。通过三维物理参数和电磁场求解算法,EBOND模型能将误差控制在5%以内,显著提升电路性能。文章还提供了完整的参数设置指南和实战操作步骤,适用于5G毫米波前端模块等高频应用场景。

weixin_28730131的博客 506

Python大数据分析(一):认识大数据

文章目录(一)大数据的定义(二)大数据的4V特征(1)大量(Volume)(2)(三)大数据思维变革(四)大数据处理过程(五)大数据的应用 (一)大数据的定义 大数据(Big data),又称为巨量资料,指的是在传统数据处理应用软件不足以处理的大或复杂的数据集的术语 (二)大数据的4V特征 (1)大量(Volume) (2) (三)大数据思维变革 (四)大数据处理过程 (五)大数据的应用 ...

数据库爆破专家的博客 4300

Arduino四足开源机器猫-Opencat(导航贴)

本内容由我和小伙伴共同编写,未经授权,谢绝转载! 1.项目介绍 2.组装调试教程 (一)Opencat-F (1)资料地址(包含程序代码&&3D打印图纸): 链接:https://pan.baidu.com/s/1AcVA5jSiOSzRKqEQAomrTA 提取码:szfx (2) (二)Opencat-B (1)组装调试 (2)组装调试注意事项 (3)添加新技能 3.编程 ...

qqliuzhitong的博客 4172

使用Python Pandas处理亿级数据

阅读目录 数据读取数据清洗数据处理 在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章《别老扯什么Hadoop了,你的数据根本不够大》指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择。这次拿到近亿条日志数据,千万级数据已经是关系型数据库的查询分析瓶颈,之前使用过Hadoop对大量文本进行分类,这次决定采用Python来

牧之-_- 1万+

【ComfyUI】Wan2.2 Animate 动作迁移重绘视频生成

本文介绍了一个基于ComfyUI的Wan2.2 Animate视频生成工作流,通过动作迁移和视频重绘技术实现高质量视频创作。该系统融合视频帧重建、动作迁移、图像重绘和音频合成等多种AI技术,核心采用Wan2.2 Animate 14B_fp8模型配合专属VAE解码器和LoRA微调模块。工作流程包含输入预处理、模型加载、特征提取、动作采样生成、解码输出和资源清理六个阶段,通过WanVideo系列节点实现从图像/视频输入到最终视频输出的完整处理。系统支持对参考图像进行视觉特征提取和嵌入生成,结合文本/动作嵌入进

Mr数据杨 2449

B.3【智能标注】:基于Labelstudio的UIE半监督深度学习的智能标注方案(云端版),提效。

Label Studio 所提供的 Machine Learning Backend 提供了一个比较灵活的辅助人工标注的框架,我们通过它确实可以加快 nlp 数据的标注Label Studio 的 enterprise 版本提供了 Active Learning 的流程,不过从其描述看这个流程并不完美,尤其是 fit 部分,由于 Label Studio 低估了「Train」所花费的时间,所以每次标注都自动训练的流程可能并不会那么顺滑(会在链接时候等待一段时间)

丨汀、的博客 1840

【Python】pandas读取亿级数据

思想是分块读取,通过read_csv或read_table的两种方式(两个参数:chunksize和iterator)。

yuxeaotao的博客 2108

图形推理2-四大类六提示

图形推理笔记2

小y的学习笔记 6743

从未这样玩过!第一次使用 Python 分析 14 亿条数据

这是恋习Python推荐的第121篇好文 来源:掘金翻译计划 作者:Steve Stagg 你用 Python 处理过的最大数据集有多大?我想大概不会超过上亿条吧,今天分享一个用 Python 处理分析 14 亿条数据的案 这份 14 亿条数据集来自 Google Books ,由 Google Ngram viewer 生成,根据书本印刷的每一个年份,记录了一个特定单词或词组...

1044

【R语言】基于Biomod2集成平台探究物种分布区的构建流程(SDMs)

我为什么想要写这个内容呢?其实我已经想了很久了,但是一直没有把所有的代码给理清楚,此外这将是我之后研究的主要方向。本博客讲述了如何基于Biomod2集成平台构建物种分布模型的全流程,以及我在使用该模型时的一些心得,同时还有我提供的一些小福利(一键处理代码),可以十分快捷的帮助你完成SDMs的构建,写出你的中英文论文。

amyniez的博客,欢迎交流讨论 3889

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用 Python 分析 14 亿条数据

你用 Python 处理过的最大数据集有多大?我想大概不会超过上亿条吧,今天分享一个用 Python 处理分析 14 亿条数据的案例。转载来源原文博客:https://h...

静觅 1019

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

用 Python 分析 14 亿条数据,就是那么刺激!

你用 Python 处理过的最大数据集有多大?我想大概不会超过上亿条吧,今天分享一个用 Python 处理分析 14 亿条数据的案 这份 14 亿条数据集来自 Google Books ,由 Google Ngram viewer 生成,根据书本印刷的每一个年份,记录了一个特定单词或词组在谷歌图书的使用量。数据集中有成千上百万的书,时间上涵盖了从 16 世纪到 2008 年。可以绘制出单词使用量随...

Python8年程序员教程分享 786

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

下一篇: 你真的知道Python的字符串是什么吗?
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值