0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用python生成图表

马哥Linux运维 来源:Python编程学习圈 作者:Python编程学习圈 2022-04-11 12:04 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Google Ngram viewer是一个有趣和有用的工具,它使用谷歌从书本中扫描来的海量的数据宝藏,绘制出单词使用量随时间的变化。举个例子,单词Python(区分大小写)

27fc65de-b724-11ec-aa7f-dac502259ad0.jpg

这幅图来自: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 只能够处理长度已知而且固定的字符串。基于这种情况,大多数的单词有不同的长度,因此这并不理想。

Loading the data

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

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

2810dbfe-b724-11ec-aa7f-dac502259ad0.jpg

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

28242204-b724-11ec-aa7f-dac502259ad0.jpg

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

283ab1ae-b724-11ec-aa7f-dac502259ad0.jpg

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

285052de-b724-11ec-aa7f-dac502259ad0.jpg

28600e04-b724-11ec-aa7f-dac502259ad0.jpg

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

╒═══════════╤════════╤═════════╕

│ Is_Word │ Year │ Count │

╞═══════════╪════════╪═════════╡

│ 0 │ 1799 │ 2 │

├───────────┼────────┼─────────┤

│ 0 │ 1804 │ 1 │

├───────────┼────────┼─────────┤

│ 0 │ 1805 │ 1 │

├───────────┼────────┼─────────┤

│ 0 │ 1811 │ 1 │

├───────────┼────────┼─────────┤

│ 0 │ 1820 │ ... │

╘═══════════╧════════╧═════════╛

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

每一年的单词总使用量

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

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

287dedb6-b724-11ec-aa7f-dac502259ad0.jpg

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

288ce104-b724-11ec-aa7f-dac502259ad0.jpg

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

28a203ae-b724-11ec-aa7f-dac502259ad0.jpg

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

28b82b98-b724-11ec-aa7f-dac502259ad0.jpg

Python 在每年的占比百分数

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

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

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

28cf3234-b724-11ec-aa7f-dac502259ad0.jpg

绘制出 word_counts 的结果:

28eb043c-b724-11ec-aa7f-dac502259ad0.jpg

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

28fee6dc-b724-11ec-aa7f-dac502259ad0.jpg

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

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

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

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

性能

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

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

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

语言战争

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

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

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

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

结果:

291bd1a2-b724-11ec-aa7f-dac502259ad0.jpg

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

2930a37a-b724-11ec-aa7f-dac502259ad0.jpg

运行时间: 只有 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 亿条数据

文章出处:【微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 谷歌
    +关注

    关注

    27

    文章

    6244

    浏览量

    110259
  • 图表
    +关注

    关注

    0

    文章

    33

    浏览量

    9155
  • python
    +关注

    关注

    57

    文章

    4857

    浏览量

    89586

原文标题:使用 python 分析 14 亿条数据

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    详解ROMA中复杂图表的渲染实现

    一、背景 ROMA承接很多复杂图表的渲染需求,在京东金融APP内,特别是首页首屏的图表,对图表渲染的及时性要求很高。近期业务反馈频繁重启时,首页的黄金走势图偶现渲染不出的问题,通过梳理图表
    的头像 发表于 10-21 13:57 255次阅读
    详解ROMA中复杂<b class='flag-5'>图表</b>的渲染实现

    termux调试python猜数字游戏

    实现(Python版) ```python import random def guess_number(): # 生成随机数字(1-100) secret_number
    发表于 08-29 17:15

    python入门圣经-高清电子书(建议下载)

    此资料内容是一本针对所有层次的Python 读者而作的Python 入门电子书。 全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy
    发表于 04-10 16:53

    基于鸿蒙原生ArkTS语法开发的图表组件--柱状图

    大家好,我是陈杨。在上一篇文章中,我简要介绍了折线图的实现逻辑,并解释了整体图表的绘制规则。根据这些规则,我们还可以绘制更多种类的图表组件。在本期中,我将讲解如何实现柱状图,并引入了一个新的功能
    的头像 发表于 03-16 16:01 826次阅读
    基于鸿蒙原生ArkTS语法开发的<b class='flag-5'>图表</b>组件--柱状图

    Python中的迭代器与生成

    Python迭代器与生成器 列表生成式 列表生成式也叫做列表推导式,它本身还是列表,只不过它是根据我们定义的规则来生成一个真实的列表。  
    的头像 发表于 02-20 10:43 677次阅读

    Python绘图Matplotlib快速参考手册

     PYTHON
    发表于 02-07 14:04 0次下载

    SciChart 3D for WPF图表

    SciChart 3D for WPF 是一个实时、高性能的 WPF 3D 图表库,专为金融、医疗和科学应用程序而设计。非常适合需要极致性能和丰富的交互式 3D 图表的项目。 使用我们
    的头像 发表于 01-23 13:49 1251次阅读
    SciChart 3D for WPF<b class='flag-5'>图表</b>库

    SciChart—高性能的JavaScript图表和图形库

    使用 SciChart 的 JavaScript 图表库为您的 JS 应用程序发现终极解决方案。 使用 WebGL 创建动态、高速的图表和图形,非常适合实时处理复杂的数据可视化。使用我们强大而灵活
    的头像 发表于 01-22 10:15 2531次阅读
    SciChart—高性能的JavaScript<b class='flag-5'>图表</b>和图形库

    使用Python实现xgboost教程

    使用Python实现XGBoost模型通常涉及以下几个步骤:数据准备、模型训练、模型评估和模型预测。以下是一个详细的教程,指导你如何在Python中使用XGBoost。 1. 安装XGBoost
    的头像 发表于 01-19 11:21 2215次阅读

    Chart FX——金融图表

    相较于传统的柱状图,许多交易者认为高低收盘图和蜡烛图更具视觉吸引力,也更容易解读。金融图表提供了一幅易于解读的价格走势图。交易者可以立即看到并比较开盘价和收盘价以及最高价和最低价之间的关系。开盘价
    的头像 发表于 01-15 17:20 827次阅读

    Chart FX——图表导出

    Chart FX 提供的导出方法可以让您(或您的最终用户)以多种格式保存图表文件、图像和数据。不同平台的产品能够导出的格式也不尽相同,只有Web产品(如 Chart FX WebForms)能生成
    的头像 发表于 01-15 14:38 694次阅读
    Chart FX——<b class='flag-5'>图表</b>导出

    Chart FX——打印图表

    另一个重要的问题是图表打印的页数。当您需要打印包含大量点的图表(可滚动)时,Chart FX 将根据需要打印尽可能多的页面。若使用压缩属性, Chart FX 会通过重新计算适当的值使所有点都能
    的头像 发表于 01-13 09:12 635次阅读
    Chart FX——打印<b class='flag-5'>图表</b>

    Chart FX-图表渲染尺寸和格式

    渲染尺寸 网络开发人员的常见做法是创建一个大图表,以便于在浏览器上阅读。然而,这种做法可能是影响服务器在大负载情况下的表现和性能的一个重要因素。从本质上讲,图表越大,意味着必须处理、生成、存储和最终
    的头像 发表于 01-08 11:25 578次阅读
    Chart FX-<b class='flag-5'>图表</b>渲染尺寸和格式

    Chart FX-选择图表输出

    图表选择输出时,最简单的方法是使用 Chart FX 智能标签向导。 通过 Chart FX 服务器控件控制图表输出有几种不同的方法。其中一种仅需允许浏览器检测功能生成适合(发出请求的)客户端
    的头像 发表于 01-05 11:06 787次阅读
    Chart FX-选择<b class='flag-5'>图表</b>输出

    Chart FX图表类型:条形图(下)

    中,图表图表空间中显示为具有深度的三维物体。相反,正投影 3D 视图允许您为图表设置旋转角度和透视值。以下分别是斜视投影和正视投影的示例图: 注意:这并不意味着您正在绘制三维数据或使用三维空间来表示数据(XYZ 坐标)。相反,
    的头像 发表于 01-03 09:22 788次阅读
    Chart FX<b class='flag-5'>图表</b>类型:条形图(下)