早下班系列:比python更称手的兵器-续
话说上一回(早下班系列:比python更称手的兵器),本菜鸟刚揶揄了一番某python培训班的代码,结果还没等收到其他小伙伴的纷纷好评,就先被本公司的大侠给打脸了。
大侠给出了如下代码:
import pandas as pd
data = pd.read_table('D:/data.txt',sep=' ')
data.PRICE = data.PRICE.str[1:].str.replace(',','').astype('int64')
out = data.groupby(['STYLE','BEDROOMS']).mean()
刨除import语句后,同样是三行代码!而运行效率嘛,也跟集算器也差不多:同样是1.4s左右!
这可真是:出师未捷脸被打,常使菜鸟泪……不对,菜鸟还不能就此放弃……
仔细一想,如果连对付这么简单的一个22.3M的小量数据都做得那么水,那鼎鼎大名的python在编程语言界也就不用混了,谷歌、脸书等那么卖力推荐python更只会被视为脑残。
那么上一篇文章真正得出的结论其实是:就算你参加了好几个月的python培训班,毕业之后,你的python可能也只能写出类似上一篇的那种被我这样的菜鸟还疯狂嘲讽的代码。
所以,今天的再次对比,咱就不玩上次的那种“菜鸡互啄”式的对比了,上点干货:
一、玩一点真正的大数据计算
上次偷了个懒,弄个22.3M的东西来冒充大数据,结果惨遭打脸,至今仍隐隐作疼……这次不敢再偷懒了,既然说是大数据,那不上他个几G的,也敢称为“大”么?
这回咱先上集算器的:
A | |
1 | =file("D:/data.txt").cursor@t(#1,#2:decimal,#3:int,#4:decimal,#5;," ") |
2 | =A1.run(decimal(replace(replace(#5,"$",""),",","")):PRICE) |
3 | =A2.groups(STYLE,BEDROOMS;avg(SQFEET):SQFEET,avg(BATHS):BATHS,avg(PRICE):PRICE) |
相比上次代码基本没变动多少,就是几个涉及要计算平均值的数据类型,从int改成了decimal。毕竟是用大数据去计算聚合函数嘛,若还用int那就等着被爆出负数吧……
至于计算结果,看一看SQFEET、BATHS和PRICE三列就知道:因为是计算平均值,而大数据文件其实是用整块原始数据循环复制粘贴出来的,所以最终结果,跟原先一模一样,所以是完全正确地!
然后该python了,同样先上代码
import pandas as pd
data = pd.read_table('D:/data.txt',sep=' ')
data.PRICE = data.PRICE.str[1:].str.replace(',','').astype('int64')
print(data.groupby(['STYLE','BEDROOMS']).mean())
接下来该测试结果了……咳,不出所料,python家的pandas愉快地罢工了(内存溢出)
二、读个其他类型的文件试试
上次弄的TXT文本文件,是不是觉得看着太Low,不上档次?这回咱就读个Excel吧。
鉴于python要处理大数据文件实在有点麻烦(且本人也比较懒),就不拿大数据继续欺负python了。回到一开始的小数据文件进行测试。只不过咱给他改成Excel的。
同样先上集算器的:变两行代码了(得感谢Excel的金额类数值的固定格式)
A | |
1 | =file("D:/data.xlsx").importxls@tc() |
2 | =A1.groups(STYLE,BEDROOMS;avg(SQFEET):SQFEET,avg(BATHS):BATHS,avg(PRICE):PRICE) |
计算结果依旧:
接下来该上python了,主要代码倒也是两行
import pandas as pd
data = pd.read_excel('D:/data.xlsx',sheet_name=0)
print(data.groupby(['STYLE','BEDROOMS']).mean())
计算结果也完全一样
不过计算前别忘了安装xlrd和xlwt两个库,否则pandas会报错给你看哦!至于怎么安装这两个库?不难,反正我是用pip在线安装的。怎么安装pip?呵呵,请看本系列的第一篇
这个比较,就算打个平手吧,毕竟python也不是吃素的。
三、算一点稍微复杂的东西
如果觉得平时你不需要处理多大的数据,也不嫌安python的各种第三方库麻烦(反正主要就折腾一次),那是否就不需要考虑集算器了呢?我觉得倒也未必……说实话,之前举例的这种分类后求平均值,太幼儿园了……根本无法体现出多少差别。所以下面咱就算个稍微复杂一点的:计算一下在至少连涨三天的股票中能达到至少连涨四天的股票的比例吧。
先看看一组原始数据:
还是先上集算器的代码,其实严格来讲整段代码可以缩成一大行(不过感觉太赖皮就不做了)。
A | |
1 | =file("E:/Stock.xlsx").importxls@t().sort(Date).group(Company) |
2 | =A1.((a=0,~.max(a=if(Price>Price[-1],a+1,0)))) |
3 | =string(A2.count(~>=4)/A2.count(~>=3),"0.00%") |
思路很简单,按日期排序再按股票分组,然后计算出每支股票最长上涨了多少天,再看这个值不低于3或不低于4的股票个数就完了,只是写出连涨的逻辑会有些考验,集算器有很好的跨行引用机制,就不在话下了。
计算结果嘛,因为数据不多,有耐心的可以心算验算一下
再看看python解决此题需要的代码(已做了尽量的简化,若还有不足欢迎指导)
import pandas as pd
def iterate(col):
prev = 0;
res = 0;
val = 0;
for curr in col:
if curr - prev > 0:
res += 1;
else:
res = 0;
prev = curr;
if val < res:
val = res;
return val;
data = pd.read_excel('E:/Stock.xlsx',sheet_name=0).sort_values('Date').groupby('Company')['Price'].apply(iterate);
print('%.2f%%' % (data[data>=4].count()/data[data>=3].count() * 100));
基本思路其实都差不多,只是python没有太好的跨行引用机制,得搞个自定义函数才能实现这种略繁琐的逻辑,比较适合遇到问题喜欢DIY的同学们。计算结果因为都一样就不贴出来了
当然,也不是说集算器什么方面都比python强,比如来个深度学习神经网络啥的,暂时集算器里还没加上这类功能(毕竟术业有专攻)。总之,遇到大数据或感觉python类库安装起来太麻烦时,不妨考虑一下集算器。