python高級編程之AI數據分析-基礎庫

基礎庫.png

前言

使用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 。習慣上,我們會按下面格式引入所需要的包:

image
一、 創建對象
可以通過 Data Structure Intro Setion 來查看有關該節內容的詳細信息。
1、可以通過傳遞一個list對象來創建一個Series,pandas會默認創建整型索引:
image

2、通過傳遞一個numpy array,時間索引以及列標籤來創建一個DataFrame:
image

3、通過傳遞一個能夠被轉換成類似序列結構的字典對象來創建一個DataFrame:
image

4、查看不同列的數據類型:
image

5、如果你使用的是IPython,使用Tab自動補全功能會自動識別所有的屬性以及自定義的列,下圖中是所有能夠被自動識別的屬性的一個子集:
image
二、 查看數據
詳情請參閱:Basics Section
1、 查看frame中頭部和尾部的行:
image

2、 顯示索引、列和底層的numpy數據:
image

3、 describe()函數對於數據的快速統計彙總:
image

4、 對數據的轉置:
image

5、 按軸進行排序
image

6、 按值進行排序
image
三、 選擇
雖然標準的Python/Numpy的選擇和設置表達式都能夠直接派上用場,但是作爲工程使用的代碼,我們推薦使用經過優化的pandas數據訪問方式: .at, .iat, .loc, .iloc 和 .ix詳情請參閱Indexing and Selecing DataMultiIndex / Advanced Indexing
1、 選擇一個單獨的列,這將會返回一個Series,等同於df.A:
image

2、 通過[]進行選擇,這將會對行進行切片
image

1、 使用標籤來獲取一個交叉的區域
image

2、 通過標籤來在多個軸上進行選擇
image

3、 標籤切片
image

4、 對於返回的對象進行維度縮減
image

5、 獲取一個標量
image

6、 快速訪問一個標量(與上一個方法等價)
image

1、 通過傳遞數值進行位置選擇(選擇的是行)
image

2、 通過數值進行切片,與numpy/python中的情況類似
image

3、 通過指定一個位置的列表,與numpy/python中的情況類似
image

4、 對行進行切片
image

5、 對列進行切片
image

6、 獲取特定的值
image

1、 使用一個單獨列的值來選擇數據:
image

2、 使用where操作來選擇數據:
image

3、 使用isin()方法來過濾:
image

l 設置
1、 設置一個新的列:
image

2、 通過標籤設置新的值:
image

3、 通過位置設置新的值:
image

4、 通過一個numpy數組設置一組新值:
image

上述操作結果如下:
image

5、 通過where操作來設置新的值:
image

四、 缺失值處理
在pandas中,使用np.nan來代替缺失值,這些值將默認不會包含在計算中,詳情請參閱:Missing Data Section
1、 reindex()方法可以對指定軸上的索引進行改變/增加/刪除操作,這將返回原始數據的一個拷貝:
image

2、 去掉包含缺失值的行:
image

3、 對缺失值進行填充:
image

4、 對數據進行布爾填充:
image

五、 相關操作
詳情請參與 Basic Section On Binary Ops
l 統計(相關操作通常情況下不包括缺失值)
1、 執行描述性統計:
image

2、 在其他軸上進行相同的操作:
image

3、 對於擁有不同維度,需要對齊的對象進行操作。Pandas會自動的沿着指定的維度進行廣播:
image

l Apply
1、 對數據應用函數:
image

l 直方圖
具體請參照:Histogramming and Discretization
image

l 字符串方法
Series對象在其str屬性中配備了一組字符串處理方法,可以很容易的應用到數組中的每個元素,如下段代碼所示。更多詳情請參考:Vectorized String Methods.
image

六、 合併
Pandas提供了大量的方法能夠輕鬆的對Series,DataFrame和Panel對象進行各種符合各種邏輯關係的合併操作。具體請參閱:Merging section
l Concat
image

l Join 類似於SQL類型的合併,具體請參閱:Database style joining
image

l Append 將一行連接到一個DataFrame上,具體請參閱Appending
image

七、 分組
對於”group by”操作,我們通常是指以下一個或多個操作步驟:
l (Splitting)按照一些規則將數據分爲不同的組;
l (Applying)對於每組數據分別執行一個函數;
l (Combining)將結果組合到一個數據結構中;
詳情請參閱:Grouping section
image

1、 分組並對每個分組執行sum函數:
image

2、 通過多個列進行分組形成一個層次索引,然後執行函數:
image

八、 Reshaping
詳情請參閱 Hierarchical IndexingReshaping
l Stack
image

image

image

l 數據透視表,詳情請參閱:Pivot Tables.
image

可以從這個數據中輕鬆的生成數據透視表:
image

九、 時間序列
Pandas在對頻率轉換進行重新採樣時擁有簡單、強大且高效的功能(如將按秒採樣的數據轉換爲按5分鐘爲單位進行採樣的數據)。這種操作在金融領域非常常見。具體參考:Time Series section
image

1、 時區表示:
image

2、 時區轉換:
image

3、 時間跨度轉換:
image

4、 時期和時間戳之間的轉換使得可以使用一些方便的算術函數。
image

十、 Categorical
從0.15版本開始,pandas可以在DataFrame中支持Categorical類型的數據,詳細 介紹參看:categorical introductionAPI documentation
image

1、 將原始的grade轉換爲Categorical數據類型:
image

2、 將Categorical類型數據重命名爲更有意義的名稱:
image

3、 對類別進行重新排序,增加缺失的類別:
image

4、 排序是按照Categorical的順序進行的而不是按照字典順序進行:
image

5、 對Categorical列進行排序時存在空的類別:
image

十一、 畫圖
image

對於DataFrame來說,plot是一種將所有列及其標籤進行繪製的簡便方法:

image

image

十二、 導入和保存數據
1、 寫入csv文件:
image

2、 從csv文件中讀取:
image

l HDF5,參考:HDFStores
1、 寫入HDF5存儲:
image

2、 從HDF5存儲中讀取:
image

1、 寫入excel文件:
image

2、 從excel文件中讀取:
image

小結:ndarray是Numpy最重要的一個類,這篇文章中總結了其部分常用函數,以便查找。!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章