前言
使用python做數據分析已經不是什麼新的技術,如上圖所示,早已被用於各個行業。特別是最近兩年,python的應用範圍越來越廣,各種培訓機構也大力推出了python相關課程,在某些省份已經將python作爲初高中必修課程,也被納入到計算機等級考試中。我們有理由相信,python未來的使用會越來越廣,而我個人認爲這裏最有意思的應該是數據分析。比如,馬雲就知道浙江女性的胸圍最小,新疆男人最浪漫,而這全部是基於對淘寶數據得出的。
這些只是數據分析的一個基礎應用場景,數據分析在未來將會大大滴改變生活方式。
數據分析我們該學習什麼?要做數據分析,我認爲必須學習以下知識:
基於上圖中的知識列表,我將編寫本系列教程,教程目錄如下:
- python高級編程之AI數據分析-基礎庫
- python高級編程之AI數據分析-語法要點
- python高級編程之AI數據分析-數據導入導出
- python高級編程之AI數據分析-提取和篩選
- python高級編程之AI數據分析-數據處理
- python高級編程之AI數據分析-統計分析
- python高級編程之AI數據分析-可視化
從本篇開始,按照上圖中的知識圖譜,我們逐個模塊講解。
環境配置
我們使用python進行數據控制、處理、整理、分析,這需要用到大量的第三方庫,我們該如何管理這些庫?如果在做多個項目時,每個項目的環境要求不一致,這樣會不會出現環境上的衝突?Anaconda是做企業級大數據分析,在數據分析、可視化、機器學習方面應用非常廣。
1Anaconda簡述
Anaconda是一個用於科學計算的Python發行版,支持 Linux, Mac, Windows系統,提供了包管理與環境管理的功能,可以很方便地解決多版本python並存、切換以及各種第三方包安裝問題。Anaconda利用工具/命令conda
來進行package和environment的管理,並且已經包含了Python和相關的配套工具。這裏先解釋下conda、anaconda這些概念的差別。conda
可以理解爲一個工具,也是一個可執行命令,其核心功能是包管理與環境管理。包管理與pip的使用類似,環境管理則允許用戶方便地安裝不同版本的python並可以快速切換。Anaconda則是一個打包的集合,裏面預裝好了conda、某個版本的python、衆多packages、科學計算工具等等,所以也稱爲Python的一種發行版。其實還有Miniconda,顧名思義,它只包含最基本的內容——python與conda,以及相關的必須依賴項,對於空間要求嚴格的用戶,Miniconda是一種選擇。進入下文之前,說明一下conda的設計理念——conda將幾乎所有的工具、第三方包都當做package對待,甚至包括python和conda自身!因此,conda打破了包管理與環境管理的約束,能非常方便地安裝各種版本python、各種package並方便地切換。2 Anaconda安裝
可以從這裏下載 Anaconda 的安裝程序以及查看安裝說明。無論是 Windows、Linux 還是 MAC 的 OSX 系統,都可以找到對應的安裝軟件。如果你的電腦是64位則儘量選64位版本。至於 Python 的版本是 2.7 還是 3.x,這裏推薦你使用 Python3,因爲 Python2 終將停止維護。可能目前市面上大多數教程使用的都還是 Python2,這也不用着急,因爲在 Anaconda 中可以同時管理兩個 Python 版本的環境。
根據提示進行安裝,完成後你大概會驚訝地發現電腦中多了好多應用,不用擔心,我們一項項來看:
- Anaconda Navigator :用於管理工具包和環境的圖形用戶界面,後續涉及的衆多管理命令也可以在 Navigator 中手工實現。
Jupyter notebook :基於web的交互式計算環境,可以編輯易於人們閱讀的文檔,用於展示數據分析的過程。
qtconsole :一個可執行 IPython 的仿終端圖形界面程序,相比 Python Shell 界面,qtconsole 可以直接顯示代碼生成的圖形,實現多行代碼輸入執行,以及內置許多有用的功能和函數。
spyder :一個使用Python語言、跨平臺的、科學運算集成開發環境。
安裝完成後,我們還需要對所有工具包進行升級,以避免可能發生的錯誤。打開你電腦的終端,在命令行中輸入:
conda upgrade --all
在終端詢問是否安裝如下升級版本時,輸入 y
。
有的情況下,你可能會遇到找不到 conda 命令的錯誤提示,這很可能是環境路徑設置的問題,需要添加conda環境變量:export PATH=xxx/anaconda/bin:$PATH
, 其中xxx替換成anaconda的安裝路徑。
至此,安裝完成,下面讓我們看一下如何用 Anaconda 管理工具包和環境。
- 3 Anaconda常用命令
安裝一個 package:
conda install package_name
這裏 package_name 是需要安裝包的名稱。你也可以同時安裝多個包,比如同時安裝numpy 、scipy 和 pandas,則執行如下命令:
conda install numpy scipy pandas
你也可以指定安裝的版本,比如安裝 1.1 版本的 numpy :
conda install numpy=1.10
移除一個 package:
conda remove package_name
升級 package 版本:
conda update package_name
查看所有的 packages:
conda list
如果你記不清 package 的具體名稱,也可以進行模糊查詢:
conda search search_term
數據分析基礎庫
上面已經講述了Python數據分析的環境管理,接下來講解數據分析常用的基礎庫:
- 1.Numpy
numpy是什麼?
NumPy 是一個 Python 包。 它代表 “Numeric Python”。 它是一個由多維數組對象和用於處理數組的例程集合組成的庫。
numpy能做什麼?
使用NumPy,開發人員可以執行以下操作:
a.數組的算數和邏輯運算;
b.傅立葉變換和用於圖形操作的例程;
c.與線性代數有關的操作, NumPy 擁有線性代數和隨機數生成的內置函數;
d.與 SciPy(Scientific Python)和 Matplotlib(繪圖庫)一起使用, 用於替代 MatLab;
NumPy最重要的一個特點就是其N維數組對象(即ndarray),該對象是一個快速而靈活的大數據集容器。你可以利用這種數組對整塊數據執行一些數學計算。
ndarray是一個通用的同構數據多維容器,也就是說,其中的所有元素必須是相同類型的。每個數組都有一個shape(一個表示各維度大小的元組)和一個dtype(一個用於說明數組數據類型的對象)。以下是ndarray常用的一些函數,很多數據分析不需要用到這些函數,但此處進行總結,以便查找。
首先,我們看一下ndarray數組中元素的數據類型。
- 數據類型
dtype(數據類型)是一個特殊的對象,它含有ndarray將一塊內存解釋爲特定數據類型所需的信息,它包含基本數據類型和對象型,這也是Numpy強大和靈活的原因之一。
類型 | 類型代碼 | 說明 |
---|---|---|
int8、uint8 | i1、u1 | 有符號和無符號的8位(1個字節)整形 |
int16、uint16 | i2、u2 | 有符號和無符號的16位(2個字節)整形 |
int32、uint32 | i4、u4 | 有符號和無符號的32位(4個字節)整形 |
int64、uint64 | i8、u8 | 有符號和無符號的64位(8個字節)整形 |
float16 | f2 | 半精度浮點數 |
float32 | f4或f | 標準的單精度浮點數。與C的float兼容 |
float64 | f8或d | 標準的雙精度浮點數。與C的double和Python的float對象兼容 |
float128 | f16或g | 擴展精度浮點數 |
complex64、complex128 | c8、c16 | 分別用兩個32位、64位或128位浮點數表示的複數 |
bool | ? | 存儲True和False值的布爾類型 |
object | O | python的對象類型 |
string_ | S | 固定長度的字符串類型(每個字符1個字節),S10表示長度爲10的字符串 |
unicode_ | U | 固定長度的unicode類型(字節數由平臺決定)。跟字符串的定義方式一樣(如U10) |
ndarray常用的函數可以分爲幾種:
-
創建函數
ndarray創建數據的函數有很多,最常用的是以下幾種,可以按照要求直接生成對應的數組:
函數 | 說明 | 用法 |
---|---|---|
array | 將輸入數據(列表、元組、數組等)轉換爲ndarray。要麼推斷出dtype,要麼顯示制定的dtype。 | arr=np.array([1,2,3],dtype=np.float64) |
asarray | 將輸入轉換成ndarray,如果輸入本身就是一個ndarray就不進行復制 | arr=np.asarray([[1,1],[1,1]]) |
arange | 類似於內置range,但返回的是一個ndarray而不是列表 | np.arange(3) 相當於 array([1,2,3]) |
ones | 根據指定的形狀和dtype創建一個全1數組,並根據其形狀和dtype創建一個全1數組 | arr=np.ones((3,), dtype=int) 輸出 array([1,1,1]) |
ones_like | 以另一個數組爲參數,並根據其形狀和dtype創建一個全1數組 | 定義x=array([[0, 1],[3, 4]]),y=np.ones_like(x),則y=array([[1,1],[1,1]]) |
zeros、zeros_like | 同上 | 同上 |
empty、empty_like | 創建新數組,只分配內存空間但不填充任何值 | 同上 |
eye | 創建一個正方形N*N單位矩陣(對角線爲1,其餘0),可以偏移 | x = np.eye(5, k=2, dtype=int)(第一個數字爲N,代表正方形的維數。k爲偏移量,dtype爲類型) |
identity | 創建一個正方形N*N單位矩陣(對角線爲1,其餘0),不可偏移 | x = identity(5, dtype=int)(第一個數字爲N,代表正方形的維數。dtype爲類型) |
- 一元二元函數
ndarray有很多函數,下面列舉一些常用的一元(unary)函數和二元(binary)函數,一元函數主要有:
函數 | 說明 |
---|---|
abs、fabs | 計算整數、浮點數或複數的絕對值。對於非複數值,可以使用更快的fabs |
sqrt | 計算各元素的平方根。相當於arr**0.5 |
square | 計算各元素的平方,相當於arr**2 |
exp | 計算各元素的指數 |
log、log10、log2、log1p | 分別爲自然對數(底數爲e)、底數爲10的log、底數爲2的log、log(1+x) |
sign | 計算各元素的正負號:1(正數)、0(零)、-1(複數) |
ceil | 計算各元素的ceiling值,即大於等於該值的最小整數 |
floor | 計算各元素的floor值,即小於等於該值的最大整數 |
rint | 把各元素四捨五入到最接近的整數,保留dtype |
modf | 將數組的小數和整數部分以兩個獨立的數組形式返回 |
isnan | 返回一個表示“哪些值是NaN(這不是一個數字)”的布爾型數組 |
isfinite、isinf | 分別返回一個表示“哪些元素是有窮的(非inf、非NaN)”或“哪些元素是無窮”的布爾型數組 |
cos、cosh、sin、sinh、tan、tanh | 普通型和雙曲型三角函數 |
arccos、arccosh、arcsin、arcsinh、arctan、arctanh | 反三角函數 |
logucal_not | 計算各元素not x的真值。相當於-arr |
二元函數主要有:
函數 | 說明 | |
---|---|---|
add | 將數組中對應的元素相加 | |
substract | 將第一個數組中減去第二個數組中的元素 | |
multiply | 數組元素相乘 | |
divide、floor_divide | 除法或向下圓整除法(丟棄餘數) | |
power | 對於第一個數組中的元素A,根據第二個數組中的相應元素B,計算A的B次方 | |
maximum、fmax | 元素級的最大值計算、fmax將忽略NaN | |
minimum、fmin | 元素級的最小值計算、fmin將忽略NaN | |
mod | 元素級的求模計算(除法的餘數) | |
copysign | 將第二個數組中的值的符號複製給第一個數組中的值 | |
greate、greate_equal、less、less_equal | 執行元素級的比較運算,最終產生布爾型數組。相當於>、>=、<、<=、==、!= | |
logical_and、logical_or、logical_xor | 執行元素級的真值邏輯運算。相當於&、 | 、^ |
- 統計函數
函數 | 說明 |
---|---|
sum | 對數組中全部或某軸向的元素求和。零長度的數組的sum爲0 |
mean | 算數平均數。零長度的數組的mean爲NaN |
std、var | 分別爲標準差和方差,自由度可調(默認爲n) |
min、max | 最大值和最小值 |
argmin、argmax | 分別爲最大和最小元素的索引 |
cumsum | 所有元素的累計和 |
cumprod | 所有元素的累計積 |
- 運算函數
函數 | 說明 |
---|---|
unique(x) | 計算x中的唯一元素,並返回有序的結果 |
intersect1d(x,y) | 計算x和y中的公共元素,並返回有序結果 |
union1d(x,y) | 計算x和y的並集,並返回有序結果 |
in1d(x,y) | 得到一個表示“x的元素是否包含於y”的布爾型數組 |
setdiff1d(x,y) | 集合的差,即元素在x中且不在y中 |
setxor1d(x,y) | 集合的對稱差,即存在於一個數組中但不同時存在於兩個數組中的元素 |
- 線性函數(numpy.linalg)
函數 | 說明 |
---|---|
diag | 以一維數組的形式返回方陣的對角線(或非對角線)元素,或將一維數組轉換成爲方陣(非對角線元素爲0) |
dot | 矩陣乘法 |
trace | 計算對角線元素的和 |
det | 計算矩陣行列式 |
eig | 計算方陣的本徵值和本徵向量) |
inv | 計算方陣的逆) |
pinv | 計算矩陣的Moore-Penrose僞逆 |
qr | 計算QR分解 |
svd | 計算奇異值分解(SVD) |
solve | 解線性方程組Ax=b,其中A爲一個方陣 |
lstsq | 計算Ax=b的最小二乘解 |
- 隨機函數(numpy.random)
函數 | 說明 |
---|---|
seed | 確定隨機數生成器的種子 |
permutation | 返回一個序列的隨機排列和返回一個隨機排列的範圍 |
shuffle | 對一個序列就地隨機排序 |
rand | 產生均勻分佈的樣本值 |
randint | 從給定的上下限範圍內隨機選取整數 |
randn | 產生正態分佈(平均值爲0,標準差爲1)的樣本值,類似於MATLAB接口 |
binomial | 產生二項分佈的樣本值 |
normal | 產生正態(高斯)分佈的樣本值 |
beta | 產生Beta分佈的樣本值 |
chisquare | 產生卡方分佈的樣本值 |
gamma | 產生Gamma分佈的樣本值 |
uniform | 產生在[0,1)中均勻分佈的樣本值 |
- 2.pandas
以下內容摘自十分鐘搞定pandas,
本文是對pandas官方網站上《10 Minutes to pandas》的一個簡單的翻譯,原文在這裏。這篇文章是對pandas的一個簡單的介紹,詳細的介紹請參考:Cookbook 。習慣上,我們會按下面格式引入所需要的包:
一、 創建對象
可以通過 Data Structure Intro Setion 來查看有關該節內容的詳細信息。
1、可以通過傳遞一個list對象來創建一個Series,pandas會默認創建整型索引:
2、通過傳遞一個numpy array,時間索引以及列標籤來創建一個DataFrame:
3、通過傳遞一個能夠被轉換成類似序列結構的字典對象來創建一個DataFrame:
4、查看不同列的數據類型:
5、如果你使用的是IPython,使用Tab自動補全功能會自動識別所有的屬性以及自定義的列,下圖中是所有能夠被自動識別的屬性的一個子集:
二、 查看數據
詳情請參閱:Basics Section
1、 查看frame中頭部和尾部的行:
2、 顯示索引、列和底層的numpy數據:
3、 describe()函數對於數據的快速統計彙總:
4、 對數據的轉置:
5、 按軸進行排序
6、 按值進行排序
三、 選擇
雖然標準的Python/Numpy的選擇和設置表達式都能夠直接派上用場,但是作爲工程使用的代碼,我們推薦使用經過優化的pandas數據訪問方式: .at, .iat, .loc, .iloc 和 .ix詳情請參閱Indexing and Selecing Data 和 MultiIndex / Advanced Indexing。
1、 選擇一個單獨的列,這將會返回一個Series,等同於df.A:
2、 通過[]進行選擇,這將會對行進行切片
1、 使用標籤來獲取一個交叉的區域
2、 通過標籤來在多個軸上進行選擇
3、 標籤切片
4、 對於返回的對象進行維度縮減
5、 獲取一個標量
6、 快速訪問一個標量(與上一個方法等價)
1、 通過傳遞數值進行位置選擇(選擇的是行)
2、 通過數值進行切片,與numpy/python中的情況類似
3、 通過指定一個位置的列表,與numpy/python中的情況類似
4、 對行進行切片
5、 對列進行切片
6、 獲取特定的值
1、 使用一個單獨列的值來選擇數據:
2、 使用where操作來選擇數據:
3、 使用isin()方法來過濾:
l 設置
1、 設置一個新的列:
2、 通過標籤設置新的值:
3、 通過位置設置新的值:
4、 通過一個numpy數組設置一組新值:
上述操作結果如下:
5、 通過where操作來設置新的值:
四、 缺失值處理
在pandas中,使用np.nan來代替缺失值,這些值將默認不會包含在計算中,詳情請參閱:Missing Data Section。
1、 reindex()方法可以對指定軸上的索引進行改變/增加/刪除操作,這將返回原始數據的一個拷貝:
2、 去掉包含缺失值的行:
3、 對缺失值進行填充:
4、 對數據進行布爾填充:
五、 相關操作
詳情請參與 Basic Section On Binary Ops
l 統計(相關操作通常情況下不包括缺失值)
1、 執行描述性統計:
2、 在其他軸上進行相同的操作:
3、 對於擁有不同維度,需要對齊的對象進行操作。Pandas會自動的沿着指定的維度進行廣播:
l Apply
1、 對數據應用函數:
l 直方圖
具體請參照:Histogramming and Discretization
l 字符串方法
Series對象在其str屬性中配備了一組字符串處理方法,可以很容易的應用到數組中的每個元素,如下段代碼所示。更多詳情請參考:Vectorized String Methods.
六、 合併
Pandas提供了大量的方法能夠輕鬆的對Series,DataFrame和Panel對象進行各種符合各種邏輯關係的合併操作。具體請參閱:Merging section
l Concat
l Join 類似於SQL類型的合併,具體請參閱:Database style joining
l Append 將一行連接到一個DataFrame上,具體請參閱Appending:
七、 分組
對於”group by”操作,我們通常是指以下一個或多個操作步驟:
l (Splitting)按照一些規則將數據分爲不同的組;
l (Applying)對於每組數據分別執行一個函數;
l (Combining)將結果組合到一個數據結構中;
詳情請參閱:Grouping section
1、 分組並對每個分組執行sum函數:
2、 通過多個列進行分組形成一個層次索引,然後執行函數:
八、 Reshaping
詳情請參閱 Hierarchical Indexing 和 Reshaping。
l Stack
l 數據透視表,詳情請參閱:Pivot Tables.
可以從這個數據中輕鬆的生成數據透視表:
九、 時間序列
Pandas在對頻率轉換進行重新採樣時擁有簡單、強大且高效的功能(如將按秒採樣的數據轉換爲按5分鐘爲單位進行採樣的數據)。這種操作在金融領域非常常見。具體參考:Time Series section。
1、 時區表示:
2、 時區轉換:
3、 時間跨度轉換:
4、 時期和時間戳之間的轉換使得可以使用一些方便的算術函數。
十、 Categorical
從0.15版本開始,pandas可以在DataFrame中支持Categorical類型的數據,詳細 介紹參看:categorical introduction和API documentation。
1、 將原始的grade轉換爲Categorical數據類型:
2、 將Categorical類型數據重命名爲更有意義的名稱:
3、 對類別進行重新排序,增加缺失的類別:
4、 排序是按照Categorical的順序進行的而不是按照字典順序進行:
5、 對Categorical列進行排序時存在空的類別:
十一、 畫圖
對於DataFrame來說,plot是一種將所有列及其標籤進行繪製的簡便方法:
十二、 導入和保存數據
1、 寫入csv文件:
2、 從csv文件中讀取:
l HDF5,參考:HDFStores
1、 寫入HDF5存儲:
2、 從HDF5存儲中讀取:
1、 寫入excel文件:
2、 從excel文件中讀取:
小結:ndarray是Numpy最重要的一個類,這篇文章中總結了其部分常用函數,以便查找。!