中企动力 > 头条 > python结果分析

网站性能检测评分

注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。

python结果分析

使用 python 分析 14 亿条数据 企业视频课程

img

克劳瑞丝

关注

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

这幅图来自: books.google/ngrams/grap… ,描绘了单词 ‘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 键分割的形式储存在文件中,看起来如下:

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

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

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

差不多 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让这个变得十分简单:

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

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

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

Python 在每年的占比百分数

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

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

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

绘制出 word_counts 的结果:

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

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

人们是如何将 Python 当做动词使用的?‘Python’ 的计算总量是否包含 ‘Python_VERB’?等

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

性能

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

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

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

语言战争

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

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

只有首字母大写的名字形式能被匹配(Python,不是 python)每一个语言的提及总数已经被转换到了从 1800 年到 1960 年的百分比平均数,考虑到 Pascal 在 1970 年第一次被提及,这应该有一个合理的基准线。

结果:

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

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

代码: gist.github/stestagg/91…

以后的 PyTubes 提升

在这个阶段,pytubes 只有单独一个整数的概念,它是 64 比特的。这意味着 pytubes 生成的 numpy 数组对所有整数都使用 i8 dtypes。在某些地方(像 ngrams 数据),8 比特的整型就有点过度,并且浪费内存(总的 ndarray 有 38Gb,dtypes 可以轻易的减少其 60%)。 我计划增加一些等级 1,2 和 4 比特的整型支持( github/stestagg/py… )

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

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

Python数据分析系列——品味葡萄酒 营销视频课程

img

苗傲易

关注

前言

数据分析学习了挺久,pandas也用了比较多,自从上次写了篇

Python数据采集和分析告诉你为何上海的二手房你都买不起!

之后就没写过数据分析相关的了

之前那篇主要偏向数据清洗(因为数据是自己爬的,所以不太规整)

这次突出一下数据探索和可视化

之前一直听问某某某参加了kaggle大数据竞赛之类

我就去kaggle上瞄了一眼

打开了新世界的大门!

kaggle上有世界各国网友提供的数据集

https://kaggle/datasets

我这次选了个葡萄酒评分的数据

下载下来之后

内容是这样的

一共有150929条记录

数据集的描述是这样的:

在观看Somm(侍酒师纪录片)之后,数据及提供者想知道如何创建一个预测模型,通过像侍酒师那样的盲品来鉴别葡萄酒。 第一步是收集一些数据来训练一个模型。 他打算根据品酒的描述/评论中使用的单词利用深度学习来预测葡萄酒品种。 该模型虽然不能品尝葡萄酒,但理论上可以基于侍酒师可以给出的描述来识别葡萄酒。

小编百度了一下Somm的影片信息如下:

我们看看各字段含义:

评分(Points):评分为1-100

品种(Variety):用来制作葡萄酒的葡萄品种

描述(Description):侍酒师的几句话描述酒的味道,气味,外观,感觉等。

国家(Country):葡萄酒来自的国家

省(Province):葡萄酒来自的省份或州

区域1(Region 1):一个省或州的葡萄酒产区

区域2(Region 2):有时在葡萄酒产区内有更具体的区域,但是这个值有时可能是空白的

酒庄(Winery):酿酒的酿酒厂

名称(Designation):葡萄酒酿造厂所在的葡萄园

价格(Price):一瓶葡萄酒的价格

数据探索

我们使用pandas读取这个文件:

我们查看一下前五行数据:

删除掉本次分析用不到的字段后再次看看情况:

看一下每个字段的类型:

发现评分和价格是数值型的,我们计算时候就不用转换类型了~

我们看一下各字段的数据缺失情况:

本想把有缺失值的记录去掉,去掉后发现只有US的葡萄酒信息,所以没去除存在缺失值的记录

葡萄酒的评分情况

我们通过绘制直方图查看评分分布情况:

发现基本符合高斯分布情况,评分大多集中在85~90分

葡萄酒的价格情况

接着我们看看葡萄酒的价格情况:

发现价格集中在图示的最左端,因为有特殊离群值的影响,所以区间给的特别宽

通过筛选发现确实是有特别昂贵的葡萄酒(这里暂且不管这个价格数据是采集异常还是真的这么贵)

为了可视化到主要的部分,我们选中大部分的价格重新做可视化

这样就可以看到,大部分的价格是在0-100(好像数据集提供者没告诉我价格的单位)

为了买到满意的葡萄酒,我们看看葡萄酒的性价比

简单定义为 性价比 = 评分/价格

结果发现计算出的价格低的明显性价比高

我们看看总体上葡萄酒价格和评分的关系:

发现评分相同的葡萄酒,价格还是差异挺大,特别是评分较高的葡萄酒价格的差异

从图中也可以看出,有几个离群值,他们大多价格很高!

葡萄酒基本来自哪些国家

我们看到,生产葡萄酒的五个大国是吗,美国、意大利、发过、西班牙、智利共和国。

为了更直观凸显他们的比例,我们绘制饼图:

发现美国真是占据了葡萄酒的半壁江山啊

应该是这个数据收集者没收集到中国的数据,我们也是葡萄酒大国之一啊!

看看这些国家在全球的分布(点的大小代表葡萄酒品种多):

除去美国最多,我们看看其次的几个:

(以上两个图是用Tableau画的)

酿造葡萄酒的葡萄品种

我这个不懂酒的程序猿马上查了一下前三的葡萄!

为了看一下这些葡萄使用的比重,做个饼图:

发现前三种占据了1/4

后面还有使用较少的名称堆叠在了一起

酒庄信息

我们接下来看看酒庄信息:

前五的葡萄酒品种最多

分别是:

1.威廉斯莱酒庄

来源:

http://.baidu/s?id=1559415099145034&wfr=spider&for=pc

2.特斯坦罗萨酒厂

3.DFJ Vinhos

来源:http://cache.baiducontent/c?m=9d78d513d99515f74fede53a564a8d3b584381132ba7a7020ed0843e967328355321a3e52878564291d27d141cb20c19afe736056f5e7bebdd9bc9118efec97478c93034074ddb1e0f8245b29d127d857bcc00b4ee0ee7cdb268d1&p=9c769a47ca9a02ff57efcd3159&newp=8457c54ad48b0be00be296264a53d8304a02c70e3ac3864e1290c408d23f061d4862e5b125251003d3c6776705a44a56e9f6307123454df6cc8a871d81edda6260&user=baidu&fm=sc&query=DFJ+Vinhos%BE%C6%D7%AF&qid=d5be9796000028be&p1=2

4.圣密夕酒庄

来源:http://wine-world/winery/chateau-ste-michelle-winery

5.哥伦比亚山峰酒庄

看看哪个酒庄的葡萄酒均价最高:

1.巴布莱尔酒庄

苏格兰最古老的酒庄之一,巴布莱尔酒庄是全球唯一专注生产单一年份威士忌(Single Vintage Whisky)的酒庄。

2.拉图城堡酒庄

享有“全球最昂贵的酒庄”声誉,是当之无愧的法国国宝级酒庄。

3.花思蝶酒庄

700年的历史,意大利托斯卡纳最古老的葡萄酒世家之一,曾成为罗马教皇和英王亨利八世的御用佳酿。

4.奥比昂酒庄

法国五大酒庄之一

5.美讯庄园

地处法国波尔多(Bordeaux)格拉夫(Graves)产区的最北端,与奥比昂酒庄(Chateau Haut-Brion)同属于克兰斯帝龙酒业集团(Domaine Clarence Dillon)旗下酒庄,两个酒庄之间仅有一路之隔。美讯酒庄出产的葡萄酒是整个波尔多地区首屈一指的顶级佳酿。

我们看看这五个酒庄的葡萄酒平均价格变化趋势:

前两个的价格遥遥领先~

买不起,买不起!

End.

运行人员:中国统计网小编

中国统计网,是国内最早的大数据学习网站

//itongji

python数据分析之线性回归,各种检验和解决方法! 行业视频课程

img

笑南

关注

线性回归

(1)线性回归的主要内容:

有兴趣可以玩一下这个游戏:是猜相关系数的,给你一些散点图,猜相关系数,很难猜对,说明看图说明相关性不靠谱!

(2)线性回归怎么做?数学公式

一个简单线性回归的例子:

ols:

拟合优度:

(3) 假设检验

线性回归这位老师用的是statsmodels做的。

这就是用线性回归拟合出来的模型!

使用这个函数可以直接得到模型的一些结果,会得到这些表!

这个是预测的函数:predict(x)。这是这个包的函数!

二、多元线性回归

也可以用向量的方式。

参数是迭代计算的,此处不讲了。

模型的检验

只用与 模型的选择 调整的r方。避免的样本量的影响,预防过拟合!

python中的实现 试用stats model 多个变量用+连一起!

模型的一些值

变量的筛选,除了常规的,就是使用相前,向后还有逐步,还有全子集的方法。

不多介绍,上篇也讲过。

python需要自己写来实现,当然我不会,这里可以用spss去实现

这是python代码

跳过。。。

回归的假设。

线性

强影响点筛选,然后直接删除

强烈建议用spss进行多元线性回归建模。不过为了熟悉python明天打算用python更着去实现。

自己整理一下,多元线性回归的检验方法:

整体显著性检验:回归模型出来时候,可以之间看整体的F检验的p值

拟合优度检验:最简单的就看R方和调整的R方

系数检验:T检验结果,可以直接看P值

自相关检验:dw检验用得最多

异方差检验:Goldfeld - Quandt 检验法,这个方法挺好的的。其实还有其他检验方法,解决办法是建议取对数

共线性检验:vif值

不够细,明日具体操作的时候会细点!

python数据分析笔记——数据加载与整理 互联网视频课程

img

马斯塔尔

关注

文 | 张俊红

数据加载

导入文本数据

1、导入文本格式数据(CSV)的方法:

方法一:使用pd.read_csv(),默认打开csv文件。

9、10、11行三种方式均可以导入文本格式的数据。

特殊说明:第9行使用的条件是运行文件.py需要与目标文件CSV在一个文件夹中的时候可以只写文件名。第10和11行中文件名ex1.CSV前面的部分均为文件的路径。

方法二:使用pd.read.table(),需要指定是什么样分隔符的文本文件。用sep=””来指定。

2、当文件没有标题行时

可以让pandas为其自动分配默认的列名。

也可以自己定义列名。

3、将某一列作为索引,比如使用message列做索引。通过index_col参数指定’message’。

4、要将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表即可。

5、文本中缺失值处理,缺失数据要么是没有(空字符串),要么是用某个标记值表示的,默认情况下,pandas会用一组经常出现的标记值进行识别,如NA、NULL等。查找出结果以NAN显示。

6、逐块读取文本文件

如果只想读取几行(避免读取整个文件),通过nrows进行制定即可。

7、对于不是使用固定分隔符分割的表格,可以使用正则表达式来作为read_table的分隔符。

(’\s+’是正则表达式中的字符)。

导入JSON数据

JSON数据是通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标注形式之一。通过json.loads即可将JSON对象转换成Python对象。(import json)

对应的json.dumps则将Python对象转换成JSON格式。

导入EXCEL数据

直接使用read_excel(文件名路径)进行获取,与读取CSV格式的文件类似。

导入数据库数据

主要包含两种数据库文件,一种是SQL关系型数据库数据,另一种是非SQL型数据库数据即MongoDB数据库文件。

数据库文件是这几种里面比较难的,本人没有接触数据库文件,没有亲测,所以就不贴截图了。

数据整理

合并数据集

1、数据库风格的合并

数据库风格的合并与SQL数据库中的连接(join)原理一样。通过调用merge函数即可进行合并。

当没有指明用哪一列进行连接时,程序将自动按重叠列的列名进行连接,上述语句就是按重叠列“key”列进行连接。也可以通过on来指定连接列进行连接。

当两个对象的列名不同时,即两个对象没有共同列时,也可以分别进行指定。

Left_on是指左侧DataFrame中用作连接的列。

right_on是指右侧DataFrame中用作连接的列。

通过上面的语句得到的结果里面只有a和b对应的数据,c和d以及与之相关的数据被消去,这是因为默认情况下,merge做的是‘inner’连接,即sql中的内连接,取得两个对象的交集。也有其他方式连接:left、right、outer。用“how”来指明。

也可以根据多个键(列)进行合并,用on传入一个由列名组成的列表即可。

2、索引上的合并

(1)普通索引的合并

Left_index表示将左侧的行索引引用做其连接键

right_index表示将右侧的行索引引用做其连接键

上面两个用于DataFrame中的连接键位于其索引中,可以使用Left_index=True或right_index=True或两个同时使用来进行键的连接。

(2)层次化索引

与数据库中用on来根据多个键合并一样。

3、轴向连接(合并)

轴向连接,默认是在轴方向进行连接,也可以通过axis=1使其进行横向连接。

(1)对于numpy对象(数组)可以用numpy中的concatenation函数进行合并。

(2)对于pandas对象(如Series和DataFrame),可以pandas中的concat函数进行合并。

·4、合并重叠数据

对于索引全部或部分重叠的两个数据集,我们可以使用numpy的where函数来进行合并,where函数相当于if—else函数。

对于重复的数据显示出相同的数据,而对于不同的数据显示a列表的数据。同时也可以使用combine_first的方法进行合并。合并原则与where函数一致,遇到相同的数据显示相同数据,遇到不同的显示a列表数据。

重塑数据集

1、旋转数据

(1)重塑索引、分为stack(将数据的列旋转为行)和unstack(将数据的行旋转为列)。

(2)将‘长格式’旋转为‘宽格式’

2、转换数据

(1)数据替换,将某一值或多个值用新的值进行代替。(比较常用的是缺失值或异常值处理,缺失值一般都用NULL、NAN标记,可以用新的值代替缺失标记值)。方法是replace。

一对一替换:用np.nan替换-999

多对一替换:用np.nan替换-999和-1000.

多对多替换:用np.nan代替-999,0代替-1000.

也可以使用字典的形式来进行替换。

(2)离散化或面元划分,即根据某一条件将数据进行分组。

利用pd.cut()方式对一组年龄进行分组。

默认情况下,cut对分组条件的左边是开着的状态,右边是闭合状态。可以用left(right)=False来设置哪边是闭合的。

清理数据集

主要是指清理重复值,DataFrame中经常会出现重复行,清理数据主要是针对这些重复行进行清理。

利用drop_duplicates方法,可以返回一个移除了重复行的DataFrame.

默认情况下,此方法是对所有的列进行重复项清理操作,也可以用来指定特定的一列或多列进行。

默认情况下,上述方法保留的是第一个出现的值组合,传入take_last=true则保留最后一个。

End.

来源:36大数据

使用 python 分析 14 亿条数据 行业视频课程

img

放肆

关注

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

这幅图来自: books.google/ngrams/grap… ,描绘了单词 ‘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 键分割的形式储存在文件中,看起来如下:

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

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

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

差不多 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让这个变得十分简单:

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

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

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

Python 在每年的占比百分数

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

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

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

绘制出 word_counts 的结果:

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

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

人们是如何将 Python 当做动词使用的?‘Python’ 的计算总量是否包含 ‘Python_VERB’?等

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

性能

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

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

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

语言战争

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

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

只有首字母大写的名字形式能被匹配(Python,不是 python)每一个语言的提及总数已经被转换到了从 1800 年到 1960 年的百分比平均数,考虑到 Pascal 在 1970 年第一次被提及,这应该有一个合理的基准线。

结果:

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

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

代码: gist.github/stestagg/91…

以后的 PyTubes 提升

在这个阶段,pytubes 只有单独一个整数的概念,它是 64 比特的。这意味着 pytubes 生成的 numpy 数组对所有整数都使用 i8 dtypes。在某些地方(像 ngrams 数据),8 比特的整型就有点过度,并且浪费内存(总的 ndarray 有 38Gb,dtypes 可以轻易的减少其 60%)。 我计划增加一些等级 1,2 和 4 比特的整型支持( github/stestagg/py… )

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

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

img

在线咨询

建站在线咨询

img

微信咨询

扫一扫添加
动力姐姐微信

img
img

TOP