早下班系列:比python更稱手的兵器-續(xù)
話說上一回(早下班系列:比python更稱手的兵器),本菜鳥剛揶揄了一番某python培訓(xùn)班的代碼,結(jié)果還沒等收到其他小伙伴的紛紛好評,就先被本公司的大俠給打臉了。
大俠給出了如下代碼:
- 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的小量數(shù)據(jù)都做得那么水,那鼎鼎大名的python在編程語言界也就不用混了,谷歌、臉書等那么賣力推薦python更只會被視為腦殘。
那么上一篇文章真正得出的結(jié)論其實是:就算你參加了好幾個月的python培訓(xùn)班,畢業(yè)之后,你的python可能也只能寫出類似上一篇的那種被我這樣的菜鳥還瘋狂嘲諷的代碼。
所以,今天的再次對比,咱就不玩上次的那種“菜雞互啄”式的對比了,上點干貨:
一、玩一點真正的大數(shù)據(jù)計算
上次偷了個懶,弄個22.3M的東西來冒充大數(shù)據(jù),結(jié)果慘遭打臉,至今仍隱隱作疼……這次不敢再偷懶了,既然說是大數(shù)據(jù),那不上他個幾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) |
相比上次代碼基本沒變動多少,就是幾個涉及要計算平均值的數(shù)據(jù)類型,從int改成了decimal。畢竟是用大數(shù)據(jù)去計算聚合函數(shù)嘛,若還用int那就等著被爆出負數(shù)吧……
至于計算結(jié)果,看一看SQFEET、BATHS和PRICE三列就知道:因為是計算平均值,而大數(shù)據(jù)文件其實是用整塊原始數(shù)據(jù)循環(huán)復(fù)制粘貼出來的,所以最終結(jié)果,跟原先一模一樣,所以是完全正確地!
然后該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())
接下來該測試結(jié)果了……咳,不出所料,python家的pandas愉快地罷工了(內(nèi)存溢出)
二、讀個其他類型的文件試試
上次弄的TXT文本文件,是不是覺得看著太Low,不上檔次?這回咱就讀個Excel吧。
鑒于python要處理大數(shù)據(jù)文件實在有點麻煩(且本人也比較懶),就不拿大數(shù)據(jù)繼續(xù)欺負python了?;氐揭婚_始的小數(shù)據(jù)文件進行測試。只不過咱給他改成Excel的。
同樣先上集算器的:變兩行代碼了(得感謝Excel的金額類數(shù)值的固定格式)
A | |
1 | =file(“D:/data.xlsx”).importxls@tc() |
2 | =A1.groups(STYLE,BEDROOMS;avg(SQFEET):SQFEET,avg(BATHS):BATHS,avg(PRICE):PRICE) |
計算結(jié)果依舊:
接下來該上python了,主要代碼倒也是兩行
- import pandas as pd
- data = pd.read_excel(‘D:/data.xlsx’,sheet_name=0)
- print(data.groupby([‘STYLE’,‘BEDROOMS’]).mean())
計算結(jié)果也完全一樣
不過計算前別忘了安裝xlrd和xlwt兩個庫,否則pandas會報錯給你看哦!至于怎么安裝這兩個庫?不難,反正我是用pip在線安裝的。怎么安裝pip?呵呵,請看本系列的***篇
這個比較,就算打個平手吧,畢竟python也不是吃素的。
三、算一點稍微復(fù)雜的東西
如果覺得平時你不需要處理多大的數(shù)據(jù),也不嫌安python的各種第三方庫麻煩(反正主要就折騰一次),那是否就不需要考慮集算器了呢?我覺得倒也未必……說實話,之前舉例的這種分類后求平均值,太幼兒園了……根本無法體現(xiàn)出多少差別。所以下面咱就算個稍微復(fù)雜一點的:計算一下在至少連漲三天的股票中能達到至少連漲四天的股票的比例吧。
先看看一組原始數(shù)據(jù):
還是先上集算器的代碼,其實嚴格來講整段代碼可以縮成一大行(不過感覺太賴皮就不做了)。
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的股票個數(shù)就完了,只是寫出連漲的邏輯會有些考驗,集算器有很好的跨行引用機制,就不在話下了。
計算結(jié)果嘛,因為數(shù)據(jù)不多,有耐心的可以心算驗算一下
再看看python解決此題需要的代碼(已做了盡量的簡化,若還有不足歡迎指導(dǎo))
- 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沒有太好的跨行引用機制,得搞個自定義函數(shù)才能實現(xiàn)這種略繁瑣的邏輯,比較適合遇到問題喜歡DIY的同學(xué)們。計算結(jié)果因為都一樣就不貼出來了
當然,也不是說集算器什么方面都比python強,比如來個深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)啥的,暫時集算器里還沒加上這類功能(畢竟術(shù)業(yè)有專攻)??傊龅酱髷?shù)據(jù)或感覺python類庫安裝起來太麻煩時,不妨考慮一下集算器。