用Python入門數(shù)據(jù)科學(xué)
使用 Python 開展數(shù)據(jù)科學(xué)為你提供了潛力,使你能夠以有意義和啟發(fā)性的方式解析、解釋和組織數(shù)據(jù)。
數(shù)據(jù)科學(xué)是計算領(lǐng)域一個令人興奮的新領(lǐng)域,它圍繞分析、可視化和關(guān)聯(lián)以解釋我們的計算機收集的有關(guān)世界的信息而建立。當然,稱其為“新”領(lǐng)域有點不誠實,因為該學(xué)科是統(tǒng)計學(xué)、數(shù)據(jù)分析和普通而古老的科學(xué)觀察派生而來的。
但是數(shù)據(jù)科學(xué)是這些學(xué)科的形式化分支,擁有自己的流程和工具,并且可以廣泛應(yīng)用于以前從未產(chǎn)生過大量不可管理數(shù)據(jù)的學(xué)科(例如視覺效果)。數(shù)據(jù)科學(xué)是一個新的機會,可以重新審視海洋學(xué)、氣象學(xué)、地理學(xué)、制圖學(xué)、生物學(xué)、醫(yī)學(xué)和健康以及娛樂行業(yè)的數(shù)據(jù),并更好地了解其中的模式、影響和因果關(guān)系。
像其他看似包羅萬象的大型領(lǐng)域一樣,知道從哪里開始探索數(shù)據(jù)科學(xué)可能會令人生畏。有很多資源可以幫助數(shù)據(jù)科學(xué)家使用自己喜歡的編程語言來實現(xiàn)其目標,其中包括流行的編程語言之一:Python。使用 Pandas、Matplotlib 和 Seaborn 這些庫,你可以學(xué)習數(shù)據(jù)科學(xué)的基本工具集。
如果你對 Python 的基本用法不是很熟悉,請在繼續(xù)之前先閱讀我的 Python 介紹。
創(chuàng)建 Python 虛擬環(huán)境
程序員有時會忘記在開發(fā)計算機上安裝了哪些庫,這可能導(dǎo)致他們提供了在自己計算機上可以運行,但由于缺少庫而無法在所有其它電腦上運行的代碼。Python 有一個系統(tǒng)旨在避免這種令人不快的意外:虛擬環(huán)境。虛擬環(huán)境會故意忽略你已安裝的所有 Python 庫,從而有效地迫使你一開始使用通常的 Python 進行開發(fā)。
為了用 venv
激活虛擬環(huán)境, 為你的環(huán)境取個名字 (我會用 example
) 并且用下面的指令創(chuàng)建它:
$ python3 -m venv example
導(dǎo)入該環(huán)境的 bin
目錄里的 activate
文件以激活它:
$ source ./example/bin/activate
(example) $
你現(xiàn)在“位于”你的虛擬環(huán)境中。這是一個干凈的狀態(tài),你可以在其中構(gòu)建針對該問題的自定義解決方案,但是額外增加了需要有意識地安裝依賴庫的負擔。
安裝 Pandas 和 NumPy
你必須在新環(huán)境中首先安裝的庫是 Pandas 和 NumPy。這些庫在數(shù)據(jù)科學(xué)中很常見,因此你肯定要時不時安裝它們。
Pandas 是使用 BSD 許可證的開源庫,可輕松處理數(shù)據(jù)結(jié)構(gòu)以進行分析。它依賴于 NumPy,這是一個提供多維數(shù)組、線性代數(shù)和傅立葉變換等等的科學(xué)庫。使用 pip3
安裝兩者:
(example) $ pip3 install pandas
安裝 Pandas 還會安裝 NumPy,因此你無需同時指定兩者。一旦將它們安裝到虛擬環(huán)境中,安裝包就會被緩存,這樣,當你再次安裝它們時,就不必從互聯(lián)網(wǎng)上下載它們。
這些是你現(xiàn)在僅需的庫。接下來,你需要一些樣本數(shù)據(jù)。
生成樣本數(shù)據(jù)集
數(shù)據(jù)科學(xué)都是關(guān)于數(shù)據(jù)的,幸運的是,科學(xué)、計算和政府組織可以提供許多免費和開放的數(shù)據(jù)集。雖然這些數(shù)據(jù)集是用于教育的重要資源,但它們具有比這個簡單示例所需的數(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()))
這將生成一個名為 sample.csv
的文件,該文件由隨機生成的浮點數(shù)組成,這些浮點數(shù)在本示例中表示 RGB 值(在視覺效果中通常是數(shù)百個跟蹤值)。你可以將 CSV 文件用作 Pandas 的數(shù)據(jù)源。
使用 Pandas 提取數(shù)據(jù)
Pandas 的基本功能之一是可以提取數(shù)據(jù)和處理數(shù)據(jù),而無需程序員編寫僅用于解析輸入的新函數(shù)。如果你習慣于自動執(zhí)行此操作的應(yīng)用程序,那么這似乎不是很特別,但請想象一下在 LibreOffice 中打開 CSV 并且必須編寫公式以在每個逗號處拆分值。Pandas 可以讓你免受此類低級操作的影響。以下是一些簡單的代碼,可用于提取和打印以逗號分隔的值的文件:
#!/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 庫的組件。Pandas 庫功能豐富,因此在尋找除本文中基本功能以外的功能時,你會經(jīng)常參考它的文檔。
接下來,通過打開你創(chuàng)建的 sample.csv
文件創(chuàng)建變量 FILE
。Pandas 模塊 read_csv
(在第二行中導(dǎo)入)使用該變量來創(chuàng)建數(shù)據(jù)幀。在 Pandas 中,數(shù)據(jù)幀是二維數(shù)組,通??梢哉J為是表格。數(shù)據(jù)放入數(shù)據(jù)幀中后,你可以按列和行進行操作,查詢其范圍,然后執(zhí)行更多操作。目前,示例代碼僅將該數(shù)據(jù)幀輸出到終端。
運行代碼。你的輸出會和下面的輸出有些許不同,因為這些數(shù)字都是隨機生成的,但是格式都是一樣的。
(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
),你可以通過聲明數(shù)據(jù)幀的列名稱并有選擇地僅打印你感興趣的列來做到這一點:
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)在運行代碼,你只會得到紅色列:
(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ù)越多就越習慣。
可視化你的數(shù)據(jù)
很多人偏愛可視化信息已不是什么秘密,這是圖表和圖形成為與高層管理人員開會的主要內(nèi)容的原因,也是“信息圖”在新聞界如此流行的原因。數(shù)據(jù)科學(xué)家的工作之一是幫助其他人理解大量數(shù)據(jù)樣本,并且有一些庫可以幫助你完成這項任務(wù)。將 Pandas 與可視化庫結(jié)合使用可以對數(shù)據(jù)進行可視化解釋。一個流行的可視化開源庫是 Seaborn,它基于開源的 Matplotlib。
安裝 Seaborn 和 Matplotlib
你的 Python 虛擬環(huán)境還沒有 Seaborn 和 Matplotlib,所以用 pip3
安裝它們。安裝 Seaborn 的時候,也會安裝 Matplotlib 和很多其它的庫。
(example) $ pip3 install seaborn
為了使 Matplotlib 顯示圖形,你還必須安裝 PyGObject 和 Pycairo。這涉及到編譯代碼,只要你安裝了必需的頭文件和庫,pip3
便可以為你執(zhí)行此操作。你的 Python 虛擬環(huán)境不了解這些依賴庫,因此你可以在環(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 顯示圖形
在你最喜歡的文本編輯器新建一個叫 vizualize.py
的文件。要創(chuàng)建數(shù)據(jù)的線形圖可視化,首先,你必須導(dǎo)入必要的 Python 模塊 —— 先前代碼示例中使用的 Pandas 模塊:
#!/usr/bin/env python3
from pandas import read_csv, DataFrame
import pandas as pd
接下來,導(dǎo)入 Seaborn、Matplotlib 和 Matplotlib 的幾個組件,以便你可以配置生成的圖形:
import seaborn as sns
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import rcParams
Matplotlib 可以將其輸出導(dǎo)出為多種格式,包括 PDF、SVG 和桌面上的 GUI 窗口。對于此示例,將輸出發(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' ]
有了適當格式的數(shù)據(jù),你可以將其繪制在圖形中。將每一列用作繪圖的輸入,然后使用 plt.show()
在 GUI 窗口中繪制圖形。plt.legend()
參數(shù)將列標題與圖形上的每一行關(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()
運行代碼以獲得結(jié)果。
數(shù)據(jù)可視化
你的圖形可以準確顯示 CSV 文件中包含的所有信息:值在 Y 軸上,索引號在 X 軸上,并且圖形中的線也被標識出來了,以便你知道它們代表什么。然而,由于此代碼正在跟蹤顏色值(至少是假裝),所以線條的顏色不僅不直觀,而且違反直覺。如果你永遠不需要分析顏色數(shù)據(jù),則可能永遠不會遇到此問題,但是你一定會遇到類似的問題。在可視化數(shù)據(jù)時,你必須考慮呈現(xiàn)數(shù)據(jù)的方法,以防止觀看者從你呈現(xiàn)的內(nèi)容中推斷出虛假信息。
為了解決此問題(并展示一些可用的自定義設(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)建兩個圖。每列的初始圖分配有一種顏色(紅色為 r
,綠色為 g
,藍色為 b
)。這些是內(nèi)置的 Matplotlib 設(shè)置。 -
表示實線(雙破折號,例如 r--
,將創(chuàng)建虛線)。為每個具有相同顏色的列創(chuàng)建第二個圖,但是使用 o
表示點或節(jié)點。為了演示內(nèi)置的 Seaborn 主題,請將 sns.set_style
的值更改為 whitegrid
。
改進的數(shù)據(jù)可視化
停用你的虛擬環(huán)境
探索完 Pandas 和繪圖后,可以使用 deactivate
命令停用 Python 虛擬環(huán)境:
(example) $ deactivate
$
當你想重新使用它時,只需像在本文開始時一樣重新激活它即可。重新激活虛擬環(huán)境時,你必須重新安裝模塊,但是它們是從緩存安裝的,而不是從互聯(lián)網(wǎng)下載的,因此你不必聯(lián)網(wǎng)。
無盡的可能性
Pandas、Matplotlib、Seaborn 和數(shù)據(jù)科學(xué)的真正力量是無窮的潛力,使你能夠以有意義和啟發(fā)性的方式解析、解釋和組織數(shù)據(jù)。下一步是使用你在本文中學(xué)到的新工具探索簡單的數(shù)據(jù)集。Matplotlib 和 Seaborn 不僅有折線圖,還有很多其他功能,因此,請嘗試創(chuàng)建條形圖或餅圖或完全不一樣的東西。
數(shù)據(jù)科學(xué)是尋找隱藏在數(shù)據(jù)中的故事的新方法。讓開源成為你的媒介。