用Python入門數(shù)據(jù)科學(xué)
使用 Python 開展數(shù)據(jù)科學(xué)為你提供了潛力,使你能夠以有意義和啟發(fā)性的方式解析、解釋和組織數(shù)據(jù)。
數(shù)據(jù)科學(xué)是計(jì)算領(lǐng)域一個(gè)令人興奮的新領(lǐng)域,它圍繞分析、可視化和關(guān)聯(lián)以解釋我們的計(jì)算機(jī)收集的有關(guān)世界的信息而建立。當(dāng)然,稱其為“新”領(lǐng)域有點(diǎn)不誠(chéng)實(shí),因?yàn)樵搶W(xué)科是統(tǒng)計(jì)學(xué)、數(shù)據(jù)分析和普通而古老的科學(xué)觀察派生而來(lái)的。
但是數(shù)據(jù)科學(xué)是這些學(xué)科的形式化分支,擁有自己的流程和工具,并且可以廣泛應(yīng)用于以前從未產(chǎn)生過(guò)大量不可管理數(shù)據(jù)的學(xué)科(例如視覺(jué)效果)。數(shù)據(jù)科學(xué)是一個(gè)新的機(jī)會(huì),可以重新審視海洋學(xué)、氣象學(xué)、地理學(xué)、制圖學(xué)、生物學(xué)、醫(yī)學(xué)和健康以及娛樂(lè)行業(yè)的數(shù)據(jù),并更好地了解其中的模式、影響和因果關(guān)系。
像其他看似包羅萬(wàn)象的大型領(lǐng)域一樣,知道從哪里開始探索數(shù)據(jù)科學(xué)可能會(huì)令人生畏。有很多資源可以幫助數(shù)據(jù)科學(xué)家使用自己喜歡的編程語(yǔ)言來(lái)實(shí)現(xiàn)其目標(biāo),其中包括流行的編程語(yǔ)言之一:Python。使用 Pandas、Matplotlib 和 Seaborn 這些庫(kù),你可以學(xué)習(xí)數(shù)據(jù)科學(xué)的基本工具集。
如果你對(duì) Python 的基本用法不是很熟悉,請(qǐng)?jiān)诶^續(xù)之前先閱讀我的 Python 介紹。
創(chuàng)建 Python 虛擬環(huán)境
程序員有時(shí)會(huì)忘記在開發(fā)計(jì)算機(jī)上安裝了哪些庫(kù),這可能導(dǎo)致他們提供了在自己計(jì)算機(jī)上可以運(yùn)行,但由于缺少庫(kù)而無(wú)法在所有其它電腦上運(yùn)行的代碼。Python 有一個(gè)系統(tǒng)旨在避免這種令人不快的意外:虛擬環(huán)境。虛擬環(huán)境會(huì)故意忽略你已安裝的所有 Python 庫(kù),從而有效地迫使你一開始使用通常的 Python 進(jìn)行開發(fā)。
為了用 venv
激活虛擬環(huán)境, 為你的環(huán)境取個(gè)名字 (我會(huì)用 example
) 并且用下面的指令創(chuàng)建它:
$ python3 -m venv example
導(dǎo)入該環(huán)境的 bin
目錄里的 activate
文件以激活它:
$ source ./example/bin/activate
(example) $
你現(xiàn)在“位于”你的虛擬環(huán)境中。這是一個(gè)干凈的狀態(tài),你可以在其中構(gòu)建針對(duì)該問(wèn)題的自定義解決方案,但是額外增加了需要有意識(shí)地安裝依賴庫(kù)的負(fù)擔(dān)。
安裝 Pandas 和 NumPy
你必須在新環(huán)境中首先安裝的庫(kù)是 Pandas 和 NumPy。這些庫(kù)在數(shù)據(jù)科學(xué)中很常見(jiàn),因此你肯定要時(shí)不時(shí)安裝它們。
Pandas 是使用 BSD 許可證的開源庫(kù),可輕松處理數(shù)據(jù)結(jié)構(gòu)以進(jìn)行分析。它依賴于 NumPy,這是一個(gè)提供多維數(shù)組、線性代數(shù)和傅立葉變換等等的科學(xué)庫(kù)。使用 pip3
安裝兩者:
(example) $ pip3 install pandas
安裝 Pandas 還會(huì)安裝 NumPy,因此你無(wú)需同時(shí)指定兩者。一旦將它們安裝到虛擬環(huán)境中,安裝包就會(huì)被緩存,這樣,當(dāng)你再次安裝它們時(shí),就不必從互聯(lián)網(wǎng)上下載它們。
這些是你現(xiàn)在僅需的庫(kù)。接下來(lái),你需要一些樣本數(shù)據(jù)。
生成樣本數(shù)據(jù)集
數(shù)據(jù)科學(xué)都是關(guān)于數(shù)據(jù)的,幸運(yùn)的是,科學(xué)、計(jì)算和政府組織可以提供許多免費(fèi)和開放的數(shù)據(jù)集。雖然這些數(shù)據(jù)集是用于教育的重要資源,但它們具有比這個(gè)簡(jiǎn)單示例所需的數(shù)據(jù)更多的數(shù)據(jù)。你可以使用 Python 快速創(chuàng)建示例和可管理的數(shù)據(jù)集:
#!/usr/bin/env python3
import random
def rgb():
NUMBER=random.randint(0,255)/255
return NUMBER
FILE = open('sample.csv','w')
FILE.write('"red","green","blue"')
for COUNT in range(10):
FILE.write('\n{:0.2f},{:0.2f},{:0.2f}'.format(rgb(),rgb(),rgb()))
這將生成一個(gè)名為 sample.csv
的文件,該文件由隨機(jī)生成的浮點(diǎn)數(shù)組成,這些浮點(diǎn)數(shù)在本示例中表示 RGB 值(在視覺(jué)效果中通常是數(shù)百個(gè)跟蹤值)。你可以將 CSV 文件用作 Pandas 的數(shù)據(jù)源。
使用 Pandas 提取數(shù)據(jù)
Pandas 的基本功能之一是可以提取數(shù)據(jù)和處理數(shù)據(jù),而無(wú)需程序員編寫僅用于解析輸入的新函數(shù)。如果你習(xí)慣于自動(dòng)執(zhí)行此操作的應(yīng)用程序,那么這似乎不是很特別,但請(qǐng)想象一下在 LibreOffice 中打開 CSV 并且必須編寫公式以在每個(gè)逗號(hào)處拆分值。Pandas 可以讓你免受此類低級(jí)操作的影響。以下是一些簡(jiǎn)單的代碼,可用于提取和打印以逗號(hào)分隔的值的文件:
#!/usr/bin/env python3
from pandas import read_csv, DataFrame
import pandas as pd
FILE = open('sample.csv','r')
DATAFRAME = pd.read_csv(FILE)
print(DATAFRAME)
一開始的幾行導(dǎo)入 Pandas 庫(kù)的組件。Pandas 庫(kù)功能豐富,因此在尋找除本文中基本功能以外的功能時(shí),你會(huì)經(jīng)常參考它的文檔。
接下來(lái),通過(guò)打開你創(chuàng)建的 sample.csv
文件創(chuàng)建變量 FILE
。Pandas 模塊 read_csv
(在第二行中導(dǎo)入)使用該變量來(lái)創(chuàng)建數(shù)據(jù)幀。在 Pandas 中,數(shù)據(jù)幀是二維數(shù)組,通??梢哉J(rèn)為是表格。數(shù)據(jù)放入數(shù)據(jù)幀中后,你可以按列和行進(jìn)行操作,查詢其范圍,然后執(zhí)行更多操作。目前,示例代碼僅將該數(shù)據(jù)幀輸出到終端。
運(yùn)行代碼。你的輸出會(huì)和下面的輸出有些許不同,因?yàn)檫@些數(shù)字都是隨機(jī)生成的,但是格式都是一樣的。
(example) $ python3 ./parse.py
red green blue
0 0.31 0.96 0.47
1 0.95 0.17 0.64
2 0.00 0.23 0.59
3 0.22 0.16 0.42
4 0.53 0.52 0.18
5 0.76 0.80 0.28
6 0.68 0.69 0.46
7 0.75 0.52 0.27
8 0.53 0.76 0.96
9 0.01 0.81 0.79
假設(shè)你只需要數(shù)據(jù)集中的紅色值(red
),你可以通過(guò)聲明數(shù)據(jù)幀的列名稱并有選擇地僅打印你感興趣的列來(lái)做到這一點(diǎn):
from pandas import read_csv, DataFrame
import pandas as pd
FILE = open('sample.csv','r')
DATAFRAME = pd.read_csv(FILE)
# define columns
DATAFRAME.columns = [ 'red','green','blue' ]
print(DATAFRAME['red'])
現(xiàn)在運(yùn)行代碼,你只會(huì)得到紅色列:
(example) $ python3 ./parse.py
0 0.31
1 0.95
2 0.00
3 0.22
4 0.53
5 0.76
6 0.68
7 0.75
8 0.53
9 0.01
Name: red, dtype: float64
處理數(shù)據(jù)表是經(jīng)常使用 Pandas 解析數(shù)據(jù)的好方法。從數(shù)據(jù)幀中選擇數(shù)據(jù)的方法有很多,你嘗試的次數(shù)越多就越習(xí)慣。
可視化你的數(shù)據(jù)
很多人偏愛(ài)可視化信息已不是什么秘密,這是圖表和圖形成為與高層管理人員開會(huì)的主要內(nèi)容的原因,也是“信息圖”在新聞界如此流行的原因。數(shù)據(jù)科學(xué)家的工作之一是幫助其他人理解大量數(shù)據(jù)樣本,并且有一些庫(kù)可以幫助你完成這項(xiàng)任務(wù)。將 Pandas 與可視化庫(kù)結(jié)合使用可以對(duì)數(shù)據(jù)進(jìn)行可視化解釋。一個(gè)流行的可視化開源庫(kù)是 Seaborn,它基于開源的 Matplotlib。
安裝 Seaborn 和 Matplotlib
你的 Python 虛擬環(huán)境還沒(méi)有 Seaborn 和 Matplotlib,所以用 pip3
安裝它們。安裝 Seaborn 的時(shí)候,也會(huì)安裝 Matplotlib 和很多其它的庫(kù)。
(example) $ pip3 install seaborn
為了使 Matplotlib 顯示圖形,你還必須安裝 PyGObject 和 Pycairo。這涉及到編譯代碼,只要你安裝了必需的頭文件和庫(kù),pip3
便可以為你執(zhí)行此操作。你的 Python 虛擬環(huán)境不了解這些依賴庫(kù),因此你可以在環(huán)境內(nèi)部或外部執(zhí)行安裝命令。
在 Fedora 和 CentOS 上:
(example) $ sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel \
sqlite sqlite-devel openssl-devel tk-devel git python3-cairo-devel \
cairo-gobject-devel gobject-introspection-devel
在 Ubuntu 和 Debian 上:
(example) $ sudo apt install -y libgirepository1.0-dev build-essential \
libbz2-dev libreadline-dev libssl-dev zlib1g-dev libsqlite3-dev wget \
curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libcairo2-dev
一旦它們安裝好了,你可以安裝 Matplotlib 需要的 GUI 組件。
(example) $ pip3 install PyGObject pycairo
用 Seaborn 和 Matplotlib 顯示圖形
在你最喜歡的文本編輯器新建一個(gè)叫 vizualize.py
的文件。要?jiǎng)?chuàng)建數(shù)據(jù)的線形圖可視化,首先,你必須導(dǎo)入必要的 Python 模塊 —— 先前代碼示例中使用的 Pandas 模塊:
#!/usr/bin/env python3
from pandas import read_csv, DataFrame
import pandas as pd
接下來(lái),導(dǎo)入 Seaborn、Matplotlib 和 Matplotlib 的幾個(gè)組件,以便你可以配置生成的圖形:
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import rcParams
Matplotlib 可以將其輸出導(dǎo)出為多種格式,包括 PDF、SVG 和桌面上的 GUI 窗口。對(duì)于此示例,將輸出發(fā)送到桌面很有意義,因此必須將 Matplotlib 后端設(shè)置為 GTK3Agg
。如果你不使用 Linux,則可能需要使用 TkAgg
后端。
設(shè)置完 GUI 窗口以后,設(shè)置窗口大小和 Seaborn 預(yù)設(shè)樣式:
matplotlib.use('GTK3Agg')
rcParams['figure.figsize'] = 11,8
sns.set_style('darkgrid')
現(xiàn)在,你的顯示已配置完畢,代碼已經(jīng)很熟悉了。使用 Pandas 導(dǎo)入 sample.csv
文件,并定義數(shù)據(jù)幀的列:
FILE = open('sample.csv','r')
DATAFRAME = pd.read_csv(FILE)
DATAFRAME.columns = [ 'red','green','blue' ]
有了適當(dāng)格式的數(shù)據(jù),你可以將其繪制在圖形中。將每一列用作繪圖的輸入,然后使用 plt.show()
在 GUI 窗口中繪制圖形。plt.legend()
參數(shù)將列標(biāo)題與圖形上的每一行關(guān)聯(lián)(loc
參數(shù)將圖例放置在圖表之外而不是在圖表上方):
for i in DATAFRAME.columns:
DATAFRAME[i].plot()
plt.legend(bbox_to_anchor=(1, 1), loc=2, borderaxespad=1)
plt.show()
運(yùn)行代碼以獲得結(jié)果。
數(shù)據(jù)可視化
你的圖形可以準(zhǔn)確顯示 CSV 文件中包含的所有信息:值在 Y 軸上,索引號(hào)在 X 軸上,并且圖形中的線也被標(biāo)識(shí)出來(lái)了,以便你知道它們代表什么。然而,由于此代碼正在跟蹤顏色值(至少是假裝),所以線條的顏色不僅不直觀,而且違反直覺(jué)。如果你永遠(yuǎn)不需要分析顏色數(shù)據(jù),則可能永遠(yuǎn)不會(huì)遇到此問(wèn)題,但是你一定會(huì)遇到類似的問(wèn)題。在可視化數(shù)據(jù)時(shí),你必須考慮呈現(xiàn)數(shù)據(jù)的方法,以防止觀看者從你呈現(xiàn)的內(nèi)容中推斷出虛假信息。
為了解決此問(wèn)題(并展示一些可用的自定義設(shè)置),以下代碼為每條繪制的線分配了特定的顏色:
import matplotlib
from pandas import read_csv, DataFrame
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib import rcParams
matplotlib.use('GTK3Agg')
rcParams['figure.figsize'] = 11,8
sns.set_style('whitegrid')
FILE = open('sample.csv','r')
DATAFRAME = pd.read_csv(FILE)
DATAFRAME.columns = [ 'red','green','blue' ]
plt.plot(DATAFRAME['red'],'r-')
plt.plot(DATAFRAME['green'],'g-')
plt.plot(DATAFRAME['blue'],'b-')
plt.plot(DATAFRAME['red'],'ro')
plt.plot(DATAFRAME['green'],'go')
plt.plot(DATAFRAME['blue'],'bo')
plt.show()
這使用特殊的 Matplotlib 表示法為每列創(chuàng)建兩個(gè)圖。每列的初始圖分配有一種顏色(紅色為 r
,綠色為 g
,藍(lán)色為 b
)。這些是內(nèi)置的 Matplotlib 設(shè)置。 -
表示實(shí)線(雙破折號(hào),例如 r--
,將創(chuàng)建虛線)。為每個(gè)具有相同顏色的列創(chuàng)建第二個(gè)圖,但是使用 o
表示點(diǎn)或節(jié)點(diǎn)。為了演示內(nèi)置的 Seaborn 主題,請(qǐng)將 sns.set_style
的值更改為 whitegrid
。
改進(jìn)的數(shù)據(jù)可視化
停用你的虛擬環(huán)境
探索完 Pandas 和繪圖后,可以使用 deactivate
命令停用 Python 虛擬環(huán)境:
(example) $ deactivate
$
當(dāng)你想重新使用它時(shí),只需像在本文開始時(shí)一樣重新激活它即可。重新激活虛擬環(huán)境時(shí),你必須重新安裝模塊,但是它們是從緩存安裝的,而不是從互聯(lián)網(wǎng)下載的,因此你不必聯(lián)網(wǎng)。
無(wú)盡的可能性
Pandas、Matplotlib、Seaborn 和數(shù)據(jù)科學(xué)的真正力量是無(wú)窮的潛力,使你能夠以有意義和啟發(fā)性的方式解析、解釋和組織數(shù)據(jù)。下一步是使用你在本文中學(xué)到的新工具探索簡(jiǎn)單的數(shù)據(jù)集。Matplotlib 和 Seaborn 不僅有折線圖,還有很多其他功能,因此,請(qǐng)嘗試創(chuàng)建條形圖或餅圖或完全不一樣的東西。
數(shù)據(jù)科學(xué)是尋找隱藏在數(shù)據(jù)中的故事的新方法。讓開源成為你的媒介。