你最后一次學(xué)習(xí)到新的Python技巧是什么時(shí)候?作為數(shù)據(jù)科學(xué)家,我們習(xí)慣于使用熟悉的庫并且每次都調(diào)用相同的函數(shù)?,F(xiàn)在是打破舊慣例的時(shí)候了!
Python不僅限于Pandas,NumPy和scikit-learn(盡管它們在數(shù)據(jù)科學(xué)中絕對必不可少)!我們可以使用很多Python技巧來改進(jìn)我們的代碼,加速我們的數(shù)據(jù)科學(xué)任務(wù),并在編寫代碼時(shí)變得更加高效。
更重要的是我們可以在Python中學(xué)習(xí)新的東西是很有趣的一件事!我喜歡玩不同的包和函數(shù)。每隔一段時(shí)間,就會有一個(gè)新的技巧將引起我的注意,并將其納入我的日常工作中。
所以我決定在這里整理我最喜歡的Python技巧!這個(gè)列表的范圍從加速基本數(shù)據(jù)科學(xué)任務(wù)(如預(yù)處理)到在同一個(gè)Jupyter Notebook中運(yùn)行R和Python代碼。其中有很多需要我們學(xué)習(xí)的東西,所以讓我們一起開始吧!
我們經(jīng)常編寫復(fù)雜的for循環(huán)來將多個(gè)列表組合在一起。你自己是不是這樣做的呢?如果是,你會喜歡zip函數(shù)。這個(gè)zip函數(shù)的目的是“創(chuàng)建一個(gè)迭代器,該迭代器可以聚合每個(gè)可迭代對象的元素”。
讓我們通過一個(gè)簡單的例子看看如何使用zip函數(shù)并組合多個(gè)列表:
我喜歡使用Google地圖數(shù)據(jù)。它是你可以在任何地方找到的數(shù)據(jù)最豐富的應(yīng)用之一。這就是為什么我決定從這個(gè)Python技巧開始。
當(dāng)我們想要看到兩個(gè)變量之間的關(guān)系時(shí),散點(diǎn)圖是一個(gè)非常好的方式。但如果變量是某個(gè)位置的緯度和經(jīng)度坐標(biāo),你還會這么做嗎?可能不會。最好將這些點(diǎn)繪制在真實(shí)地圖上,以便我們可以輕松地查看和解決特定問題(例如優(yōu)化路線)。
gmplot提供了一個(gè)驚人的接口來生成HTML和JavaScript,以便在Google地圖上呈現(xiàn)我們想要的所有數(shù)據(jù)。讓我們看看用一個(gè)示例看看如何使用gmplot。
安裝gmplot
!pip3 install gmplot
在Google地圖上繪制位置坐標(biāo)
你可以從這里[1]下載代碼所用到的數(shù)據(jù)集。讓我們首先導(dǎo)入必要的庫和讀數(shù)據(jù):
# 緯度和經(jīng)度列表latitude_list = data['LATITUDE'] longitude_list = data['LONGITUDE'] # 地圖的中心坐標(biāo)gmap = gmplot.GoogleMapPlotter( 56.730876,9.349849,9)# 在谷歌地圖上繪制坐標(biāo)gmap.scatter( latitude_list, longitude_list, '# FF0000', size = 40, er = True) #以下代碼將在你的Web瀏覽器中創(chuàng)建html文件視圖gmap.heatmap(latitude_list, longitude_list) gmap.draw( 'mymap.html' )
上面的代碼將生成HTML文件,你可以看到在Google地圖上繪制了緯度和經(jīng)度坐標(biāo)。熱圖顯示了具有高密度紅色點(diǎn)的區(qū)域。
我們在早期數(shù)據(jù)科學(xué)數(shù)據(jù)集中面臨的最大障礙之一是我們應(yīng)該對類別變量做些什么呢?我們的機(jī)器在眨眼之間處理數(shù)值,但處理類別是一個(gè)完全不同的問題。
一些機(jī)器學(xué)習(xí)算法可以自己處理類別變量。但我們需要將它們轉(zhuǎn)換為數(shù)值變量,為此,category_encoders是一個(gè)令人驚嘆的庫,它提供了15種不同的編碼方案。
讓我們看看我們?nèi)绾卫眠@個(gè)庫。
安裝category-encoders
將類別數(shù)據(jù)轉(zhuǎn)換為數(shù)值數(shù)據(jù)
import pandas as pd import category_encoders as ce # 創(chuàng)建一個(gè)Dataframe data = pd.DataFrame({ 'gender' : ['Male', 'Female', 'Male', 'Female', 'Female'], 'class' : ['A','B','C','D','A'], 'city' : ['Delhi','Gurugram','Delhi','Delhi','Gurugram'] }) data.head()
所有編碼器都與sklearn-transformer完全兼容,因此可以輕松地在現(xiàn)有腳本中使用。此外,category_encoders支持NumPy數(shù)組和Pandas dataframe。你可以在此處[2]閱讀有關(guān)category_encoders的更多信息。
你通?;ǘ嗌贂r(shí)間來清理和預(yù)處理數(shù)據(jù)?數(shù)據(jù)科學(xué)家通?;ㄙM(fèi)60-70%的時(shí)間來清理數(shù)據(jù)的說法是完全正確的。對我們來說跟蹤這個(gè)很重要,對吧?
我們不想花費(fèi)數(shù)天來清理數(shù)據(jù)而忽略其他數(shù)據(jù)科學(xué)步驟。這就是progress_apply函數(shù)使我們的生活變得如此簡單的地方。讓我演示它是如何工作的。
讓我們計(jì)算各個(gè)點(diǎn)的經(jīng)緯度之和(這雖然沒有什么意義),并查看完成此任務(wù)的進(jìn)度。你可以在此處[3]下載此數(shù)據(jù)集。
import pandas as pdfrom tqdm._tqdm_notebook import tqdm_notebooktqdm_notebook.pandas()data = pd.read_csv('3D_spatial_network.csv')data.head()
我們花了很多時(shí)間來理解我們獲得的數(shù)據(jù)。這是公平的 - 我們不希望在不了解我們做什么的情況下直接進(jìn)入模型構(gòu)建。這是任何數(shù)據(jù)科學(xué)項(xiàng)目中必不可少的一步。
pandas_profiling是一個(gè)Python包,可以減少執(zhí)行最初數(shù)據(jù)分析步驟的大量工作。該軟件包只需一行代碼即可生成詳細(xì)的數(shù)據(jù)報(bào)告!
import pandas as pd import pandas_profiling # 讀取數(shù)據(jù)data = pd.read_csv('add-your-data-here') pfr = pandas_profiling.ProfileReport(data)# 在jupyter執(zhí)行代碼,則不需下面一行代碼pfr.to_file('./example.html')
我們可以看到,只需一行代碼,我們就可以獲得數(shù)據(jù)集的詳細(xì)報(bào)告:
現(xiàn)在誰不熟悉Pandas?它是最流行的Python庫之一,廣泛用于數(shù)據(jù)操作和分析。我們知道Pandas具有操作和匯總數(shù)據(jù)的驚人能力。
我最近正在研究一個(gè)時(shí)間序列問題,并注意到Pandas有一個(gè)我以前從未使用過的Grouper函數(shù)。我對它的使用變得非常好奇。
事實(shí)證明,這個(gè)Grouper函數(shù)對于時(shí)間序列數(shù)據(jù)分析來說是非常重要的功能。那么,讓我們試一試,看看它是如何工作的。你可以在此處[4]下載此代碼的數(shù)據(jù)集。
現(xiàn)在,處理任何時(shí)間序列數(shù)據(jù)的第一步是將date列轉(zhuǎn)換為DateTime格式:
data['date'] = pd.to_datetime(data['date'])
假設(shè)我們的目標(biāo)是查看每個(gè)客戶的月銷售額。我們大多數(shù)人都試著寫一些復(fù)雜的東西。但這是Pandas對我們有用的地方。
我們可以通過groupby語法使用一種簡單的方法,而不必使用重建索引。我們將通過提供有關(guān)如何在日期列中對數(shù)據(jù)進(jìn)行分組的更多信息,為此函數(shù)添加額外的內(nèi)容。它看起來更干凈,工作方式完全相同:
data.groupby(['name', pd.Grouper(key='date', freq='M')])['ext price'].sum()
我們剛剛看到grouper如何幫助分組時(shí)間序列數(shù)據(jù)?,F(xiàn)在,這有一個(gè)挑戰(zhàn),如果我們想要將name列(在上面示例結(jié)果中是索引)視為dataframe的列,該怎么辦?
這是unstack函數(shù)至關(guān)重要的地方。讓我們在上面的代碼示例中應(yīng)用unstack函數(shù)并查看結(jié)果。
非常實(shí)用!注意:如果索引不是MultiIndex,則輸出將是Series。
我是matplotlib庫的忠實(shí)粉絲。它是我們用于在Jupyter Notebook中生成各種圖形的最常見的可視化庫。
要查看這些圖,我們通常使用一行 – %matplotlib inline – 同時(shí)導(dǎo)入matplotlib庫。這很好用,但它渲染了Jupyter Notebook中的靜態(tài)圖。
只需用%matplotlib notebook替換 %matplotlib inline。你將在Jupyter Notebook中獲得可調(diào)整大小和可縮放的圖表!
%matplotlib notebookimport matplotlib.pyplot as plt# 繪制散點(diǎn)圖#在你的數(shù)據(jù)集上嘗試此操作plt.scatter(data['quantity'],data['unit price'])
可以有多種方法來解決一個(gè)問題,作為數(shù)據(jù)科學(xué)家,我們非常清楚這一點(diǎn)。而計(jì)算成本在行業(yè)中很重要 - 特別是在一個(gè)中小型組織中。你可能希望選擇在最短時(shí)間內(nèi)完成任務(wù)的最佳方法。
實(shí)際上很容易檢查Jupyter Notebook中特定代碼塊的運(yùn)行時(shí)間。
只需添加%% time命令即可檢查特定單元格的運(yùn)行時(shí)間:
在這里,我們CPU time和Wall time。CPU time是CPU專用于進(jìn)程的總執(zhí)行或運(yùn)行時(shí)間。Wall time是從進(jìn)程開始到“現(xiàn)在”之間經(jīng)過的時(shí)間。
10: rpy2: R和Python在同一個(gè)Jupyter Notebook中!
R和Python是數(shù)據(jù)科學(xué)領(lǐng)域中最好和最流行的兩種開源編程語言。R主要用于統(tǒng)計(jì)分析,而Python提供了一個(gè)簡單的接口,可以將數(shù)學(xué)解決方案轉(zhuǎn)換為代碼。
現(xiàn)在我們可以在一個(gè)Jupyter Notebook中同時(shí)使用它們!我們可以利用這兩種生態(tài)系統(tǒng),為此,我們只需要安裝rpy2。
所以,讓我們暫時(shí)擱置R與Python的爭論,并享受在我們的Jupyter Notebook中繪制ggplot級別的圖表。
!pip3 install rpy2
我們可以將兩種語言一起使用,甚至可以在它們之間傳遞變量。
在這里,我們在Python中創(chuàng)建了一個(gè)dataframe df,并通過使用R的ggplot2庫(函數(shù)geom_point)來創(chuàng)建一個(gè)散點(diǎn)圖。來吧試試,我想你會喜歡它。
結(jié)語
除了這些之外,你還直到哪些Python技巧嗎?請?jiān)谙旅娴脑u論部分告訴我們,分享彼此的經(jīng)驗(yàn)!
[1] https://drive.google.com/file/d/1VS292bhx_caAamNGY1bRrAySABMNSAhH/view?usp=sharing
[2] https://github.com/scikit-learn-contrib/categorical-encoding ??
[3] https://drive.google.com/file/d/1VS292bhx_caAamNGY1bRrAySABMNSAhH/view?usp=sharing
[4] https://drive.google.com/file/d/1UXHlP2TcenRFQJi5ZoaFtWpRuSU6AwQk/view?usp=sharing