本文是幫助 r 使用者增強技能和為資料科學進階而學習 python (從零開始)。畢竟,r 和 python 是資料科學從業者必需掌握的兩門最重要的程式設計語言。
python 是一門功能強大和多用途的程式設計語言,在過去幾年取得驚人發展。它過去用于 web 開發和遊戲開發,現在資料分析和機器學習也要用到它。資料分析和機器學習是 python 應用上相對新的分支。
作為初學者,學習 python 來做資料分析是比較痛苦的。為什麼?
在谷歌上搜尋“learn python ”,你會搜到海量教程,但内容隻是關于學習 python 做 web 開發應用。那你如何找到方法?
在本教程,我們将探讨 python 在執行資料操作任務上的基礎知識。同時,我們還将對比在 r 上是如何操作的。這種并行比較有助于你将 r 和 python 上的任務聯系起來。最後,我們将采用一個資料集來練習我們新掌握的 python 技能。
注意:閱讀這篇文章時最好具備一定的 r 基礎知識。
内容概要
為什麼學習 python(即使你已經懂 r )
了解 python 的資料類型和結構(與 r 對比)
用 python 寫代碼(與 r 對比)
用一個資料集實踐 python
為什麼學習 python(即使你已經懂r)
毫無疑問,r 在它自身的領域是極其強大的,實際上,它最初是用來做統計計算和操作。強大的社群支援使得初學者可以很快掌握 r .
但是, python 正迎頭趕上,無論成熟公司還是初創公司對python 的接受程度要遠遠大于 r 。
根據 indeed.com 提供的資料(2016年1月至2016年12月),“用 python 做機器學習”的招聘資訊數量要比“用 r 做機器學習” 增長快得多(約 123%)。這是因為:
python 以更好的方式支援機器學習覆寫的全部範圍。
python 不僅支援模型建構,而且支援模型部署。
相比 r , python 支援多種強大的諸如 keras、convnet,、theano 和 tensorflow 深度學習庫。
python的庫相對獨立,每個庫都擁有資料科學工作者所需要的所有函數。你不需要像在 r 中一樣在各種包之間來回查找一個函數。
了解 python 資料類型和結構(與 r 對比)
程式設計語言是基于它的變量和資料類型來了解複雜的資料集。是的,假設你有一個 100 萬行,50 列的資料集。程式設計語言會如何了解這些資料呢?
基本上,r 和 python 都有未定義資料類型。獨立和非獨立變量都有着不同的資料類型。解釋器根據資料類型配置設定記憶體。python 支援的資料類型包括:
1.數值型(numbers)——存儲數值。這些數值可以存儲為4種類型:整型,長整型,浮點型,複數型。讓我們分别了解。
整型(integer)—— 它指的是整數類型,比如 10 、13 、91、102 等。相當于 r 中的整型(integer)。
長整型(long)——它指的是用八進制或者十六進制表示的長整數,在 r 中,用 64 位包讀取十六進制值。
浮點型(float)——指的是小數值,比如 1.23 , 9.89 等, r 中浮點數包含在數值型(numeric)。
複數型(complex)——它指的是複數值,比如 as 2 + 3i, 5i 等。不過這種資料類型在資料中不太常見。
2.布爾型(boolean)——布爾型隻存儲兩個值(true 和 false)。在 r 中,它可以存儲為因子(factor)類型或字元(character)類型。r 和 python 的布爾值之間存在着微小的差别。在 r 中,布爾型存儲為 true 和 false。在 python 中,它們存儲為 true 和 false 。字母的情況有差異。
3.字元串(strings)——它存儲文本(字元)資料,如“elephant,”lotus,”等,相當于r的字元型(character)。
4.清單——它與 r 的清單資料類型相同。它能夠存儲多種變量類型的值,如字元串、整數、布爾值等。
5.元組—— r 中沒有元組類型,把元組看成是 r 中的向量,它的值不能改變。即它是不可變的。
6.字典—— 它提供支援 key-value 對的二維結構。簡而言之,把鍵(key )看作是列名,對(pair)看作是列值。
因為 r 是統計計算語言,所有操作資料和讀取變量的函數都是固有的。而另一方面,python 資料的分析、處理、可視化函數都是從外部庫調用。python 有多個用于資料操作和機器學習的庫。以下列舉最重要的幾個:
numpy——在python中它用于進行數值計算。它提供了龐大的諸如線性代數、統計等的數學函數庫。它主要用于建立數組。在 r 中,把數組看作清單。它包含一個類(數字或字元串或布爾)或多個類。它可以是一維或多元的。
scipy ——在python中它用于進行科學計算。
matplotlib——在 python 中它用于進行資料可視化。在 r,我們使用著名的 ggplot2 庫。
pandas ——對于資料處理任務它極其強大。在 r 中,我們使用 dplyr,data.table 等包。
scikit learn—— 它是實作機器學習算法的強大工具。實際上,它也是 python 中用來做機器學習的最好工具。它包含模組化所需的所有函數。
在某種程度上,對于資料科學工作者來說,最主要的是要掌握上面提到的 python 庫。但人們正開始使用的進階 python 庫有太多。是以,為了實際目标,你應該記住以下這些:
數組(array)——這與 r 的清單類似。它可以是多元的。它可以包含相同或多個類的資料。在多個類的情況下,會發生強制類型轉換。
清單(list)—— 相當于 r 中的清單。
資料框(data frame)——它是一個包含多個清單的二維結構。r中有内置函數 data.frame,python則從 pandas庫中調用 dataframe 函數。
矩陣(matrix)——它是二維(或多元)結構,包含同一類(或多個類)的所有值。把矩陣看成是向量的二維版。在r中,我們使用 matrix 函數。在python中,我們使用 numpy.column_stack 函數。
到這裡,我希望你已經明白了r和python中資料類型和資料結構的基本知識。現在,讓我們開始應用它們。
用python寫代碼(對比r)
建立清單
在 r 中,建立清單使用的是 list 函數
my_list <- list ('monday','specter',24,true)
typeof(my_list)
[1] "list"
在 python 中,建立清單使用的是方括号 [ ] 。
my_list = ['monday','specter',24,true]
type(my_list)
list
在 pandas 庫中也可以得到相同的輸出,在 pandas 中,清單稱為序列。在 python 中安裝 pandas,寫下:
#importing pandas library as pd notation (you can use any notation) #調用 pandas 庫
import pandas as pd
pd_list = pd.series(my_list)
pd_list
0 monday
1 specter
2 24
3 true
數字(0,1,2,3)表示數組索引。你注意到什麼了嗎?python 索引是從 0 開始,而 r 的索引從 1 開始。讓我們繼續了解清單子集在 r 和 python 的差別。
#create a list # 建立一個清單
new_list <- list(roll_number = 1:10, start_name = letters[1:10])
把 new_list 看作一列火車。這列火車有兩個名為 roll_number 和 start_name 的車廂 。在每個車廂中,有10人。是以,在清單建構子集中,我們可以提取車廂的值,車廂中的人等,等等。
#extract first coach information #提取第一個車廂資訊
new_list[1] #or
df['roll_number']
$roll_number
[1] 1 2 3 4 5 6 7 8 9 10
#extract only people sitting in first coach #提取坐在第一個車廂中的人
new_list[[1]] #or
df$roll_number
#[1] 1 2 3 4 5 6 7 8 9 10
如果你查詢一下 new_list [ 1 ] 的類型,你會發現它是一個清單,而 new_list [ [ 1 ] ] 類型是一個字元。類似地,在 python 中,你可以提取清單元件:
#create a new list #建立一個新清單
new_list = pd.series({'roll_number' : range(1,10),
'start_name' : map(chr, range(65,70))})
roll_number [1, 2, 3, 4, 5, 6, 7, 8, 9]
start_name [a, b, c, d, e]
dtype: object
#extracting first coach #提取第一個車廂
new_list[['roll_number']] #or
new_list[[0]]
#extract people sitting in first coach #提取坐在第一個車廂中的人
new_list['roll_number'] #or
new_list.roll_number
[1, 2, 3, 4, 5, 6, 7, 8, 9]
r 和 python 的清單索引有一個讓人困惑的差別。如果你注意到在 r 中 [[ ]] 表示擷取車廂的元素, 然而[[ ]] 在 python 中表示擷取車廂本身。
2. matrix 矩陣
矩陣是由向量(或數組)組合而成的二維結構。一般來說,矩陣包含同一類的元素。然而,即使你混合不同的類(字元串,布爾,數字等)中的元素,它仍會運作。r 和 python 在矩陣中建構子集的方法很相似,除了索引編号。重申,python 索引編号從 0 開始,r 索引編号從 1 開始。
在 r 中,矩陣可以這麼建立:
my_mat <- matrix(1:10,nrow = 5)
my_mat
#to select first row #選取第一行
my_mat[1,]
#to select second column #選取第二列
my_mat[,2]
在python中,我們會借助 numpy 數組建立一個矩陣。是以,我們先要加載 numpy 庫。
import numpy as np
a=np.array(range(10,15))
b=np.array(range(20,25))
c=np.array(range(30,35))
my_mat = np.column_stack([a,b,c])
#to select first row #選取第一行
my_mat[0,]
my_mat[:,1]
3. 資料框(data frames)
資料框為從多來源收集而來的松散的資料提供了一個急需的骨架。它類似電子表格的結構給資料科學工作者提供了一個很好的圖檔來展示資料集是什麼樣子。在r中,我們使用data.frame() 函數建立一個資料框。
data_set <- data.frame(name = c("sam","paul","tracy","peter"),
hair_colour = c("brown","white","black","black"),
score = c(45,89,34,39))
那麼,我們知道一個資料框是由向量(清單)的組合建立的。在 python 中建立資料框,我們将建立一個字典(數組的組合),并且在 pandas 庫的 dataframe()函數中附上字典。
data_set = pd.dataframe({'name' : ["sam","paul","tracy","peter"],
'hair_colour' : ["brown","white","black","black"],
'score' : [45,89,34,39]})
現在,讓我們看下操作 dataframe 最關鍵的部分,建構子集。實際上,大部分資料操作都包含從各個可能的角度切割資料框。讓我們逐個看下任務:
#select first column in r #在 r 中選取第一行
data_set$name # or
data_set[["name]] #or
data_set[1]
#select first column in python #在 python 中選取第一列
data_set['name'] #or
data_set.name #or
data_set[[0]]
#select multiple columns in r # 在 r 中選取多列
data_set[c('name','hair_colour')] #or
data_set[,c('name','hair_colour')]
#select multiple columns in python #在 python 中選取多行
data_set[['name','hair_colour']] #or
data_set.loc[:,['name','hair_colour']]
.loc 函數用于基于标簽的索引
到這裡我們大緻明白了 r 和 python 中的資料類型、結構和格式。讓我們用一個資料集來探索 python 中資料的其他面。
強大的 scikit-learn 庫包含一個内建的資料集庫。為了我們實踐的目的,我們将采用波士頓住房資料集(boston housing data set)。做資料分析時,它是一個很流行的資料集。
#import libraries #調用庫
from sklearn.datasets import load_boston
#store in a variable #存儲在一個變量中
boston = load_boston()
變量boston是一個字典。回顧一下,字典是key-value對的組合,讓我看下鍵(key)的資訊:
boston.keys()
['data', 'feature_names', 'descr', 'target']
現在我們知道我們需要的資料集駐留在key資料中。我們也看到,對于功能名稱有一個單獨的key。我認為資料集不會配置設定列名。讓我們來檢查下我們要處理的列名。
print(boston['feature_names'])
['crim' 'zn' 'indus' 'chas' 'nox' 'rm' 'age' 'dis' 'rad' 'tax' 'ptratio' 'b' 'lstat']
你能明白這些名稱嗎?我也不明白。現在,讓我們檢查下資料描述和了解每個變量的意義。
print(boston['descr'])
這個資料集有506行,13列。它包含幫助确定波士頓房價的多種特征。現在,讓我們建立一個資料框:
bos_data = pd.dataframe(boston['data'])
類似于 r , python 也有一個 head()函數讀入資料:
bos_data.head()
輸出顯示資料集沒有列名(如上所述)。将列名配置設定到資料框中是容易的。
bos_data.columns = boston['feature_names']
就像r中的 dim() 函數,python 有檢查資料集維數的 shape() 函數。為得到資料集的統計彙總,我們寫下:
bos_data.describe()
它顯示了資料中列的統計彙總。讓我們快速探索這個資料的其他方面。
#get first 10 rows #得到第一10行
bos_data.iloc[:10]
#select first 5 columns #選取第一個5列
bos_data.loc[:,'crim':'nox'] #or
bos_data.iloc[:,:5]
#filter columns based on a condition #基于條件篩選列
bos_data.query("crim > 0.05 & chas == 0")
#sample the data set #建構資料集樣本
bos_data.sample(n=10)
#sort values - default is ascending #分類上升的預設值
bos_data.sort_values(['crim']).head() #or
bos_data.sort_values(['crim'],ascending=false).head()
#rename a column #重命名一個列
bos_data.rename(columns={'crim' : 'crim_new'})
#find mean of selected columns #查找標明列的平均值
bos_data[['zn','rm']].mean()
#transform a numeric data into categorical #将數字資料轉換成分類
bos_data['zn_cat'] = pd.cut(bos_data['zn'],bins=5,labels=['a','b','c','d','e'])
#calculate the mean age for zn_cat variable #計算zn_cat變量的平均年齡
bos_data.groupby('zn_cat')['age'].sum()
此外,python 還允許我們建立透視表。是的! 就像 ms excel 或任何其他電子表格軟體,你可以建立一個資料透視表,更密切地了解資料。不幸的是,在 r 中建立一個資料透視表是一個相當複雜的過程。在 python 中,一個透視表需要行名、列名和要計算的值。如果我們不通過任何列名稱,得到的結果隻會像你使用 groupby 函數得到的。是以,讓我們建立另一個分類變量。
#create a new categorical variable #建立一個新的分類變量
bos_data['new_age'] = pd.cut(bos_data['age'],bins=3,labels=['young','old','very_old'])
#create a pivot table calculating mean age per zn_cat variable #建立一個透視表計算每個 zn_cat 變量的年齡
bos_data.pivot_table(values='dis',index='zn_cat',columns= 'new_age',aggfunc='mean')
這隻是冰山一角。下一步怎麼做?就像我們使用波士頓住房資料集,現在你可以試試安德森鸢尾花卉資料集(iris data)。它在sklearn_datasets 庫是可用的。嘗試深入探讨。記住,你練習越多,花費的時間越多,你就會變得越好。
總結
總體來說,學習這兩門語言會給你足夠的自信去處理任何類型的資料集。事實上,學習python最好的一面是它有完善的文檔可以用在numpy,pandas,scikit learn 庫,這足夠幫你跨越所有最初的障礙。
本文作者:佚名
來源:51cto