数据分析基础教程 ( 1 )
文章目錄
- 簡介
- Numpy
- Pandas
- Matplotlib
- Seaborn
- SciPy
- Scikit-Learn
- Numpy 基礎教程
- 安裝
- numpy 的引用
- 使用 ndarray 創建數組
- 數組索引、切片、賦值
- 基本的數組運算
- 隨機數
- Pandas 基礎教程
- 安裝
- Pandas 引用
- Pandas 數據結構
- Series
- DataFrame
- Pandas 輸出設置
- Pandas 數據的讀取與寫入
- DataFrame 排序
- DataFrame 去重
- Pandas 替換數據
- 切片與篩選
簡介
Numpy
NumPy是Python的一種開源的數值計算擴展,可用來存儲和處理大 型矩陣,比Python自身的列表結構要高效得多。NumPy底層使用 BLAS 作為向量,各種運算的速度也得到大幅提升。它主要包括:
強大的N維數組對象Array;
比較成熟的(廣播)函數庫;
用于整合C、C++和Fortran代碼的工具包;
實用的線性代數、傅里葉變換和隨機數生成函數,使 NumPy 和 稀疏矩陣運算包SciPy的配合使用更加方便。 另外,NumPy中的數據類型在 Pandas、Scikit-Learn、StatsModels 等庫中被作為基本數據類型使用。
Pandas
Python 之所以能成為強力的數據分析工具,和 Pandas 庫有很大的 關系。Pandas 的主要應用環境如下:
數據的導入與導出;
數據清理;
數據挖掘與探索;
為分析做數據處理與準備;
結合Scikit-Learn、StatsModels進行分析。
用得最多的Pandas對象是DataFrame,它是一個兩維數據 表結構,包含多行多列。
相對于 R等統計軟件,Pandas借鑒了 R的數據結構,因此擁有了 R 的很多方便的數據操作特性;在語法設計上,Pandas比R和Stata更嚴謹 且更簡潔易用;基于Python自動管理內存的能力,以及在很多細節上的 優化(比如在數據操作過程中的數據復制和引用),Pandas擁有了更好 的管理和計算大數據的能力。
Pandas的底層基于NumPy搭建,因此Pandas擁有了NumPy的全部優 點,比如Pandas定義的數據結構可以支持NumPy已經定義的計算,相當 于擁有了MATLAB的矩陣計算能力;NumPy原生的C接口也為擴展 Pandas的計算性能帶來了很大的方便。 對于金融用戶來講,Pandas提供了一系列適用于金融數據的高性能 時間序列與工具,例如Panel、時間Series等。
Matplotlib
Matplotlib是Python最著名的繪圖庫,提供了一整套和MATLAB相 似的命令API,十分適合進行交互式制圖。我們也可以很方便地將它作 為繪圖控件,嵌入GUI應用程序中Matplotlib 的文檔相當完備,而且在 Gallery 頁面中有上百幅縮略圖,打開后都有源程序。因此,如果需要繪制某種類型的圖,則只需在這個頁面中瀏覽、 復制、粘貼,就基本可以搞定。
Seaborn
Seaborn其實是在Matplotlib的基礎上進行了更高級的API封裝,從而 使作圖更容易。在大多數情況下使用 Seaborn 就能制作出非常有吸引力的圖,而使用Matplotlib就能制作出具有更多特色的圖。但是應該把Seaborn視為Matplotlib的補充,而不是替代物。
Seaborn默認的淺灰色背景與白色網絡線的靈感來源于Matplotlib, 卻比Matplotlib的顏色更加柔和。我們發現,圖對于傳播信息很有用, 幾乎在所有情況下,人們喜歡圖更甚于表。
SciPy
SciPy 包含致力于解決科學計算中常見問題的各個工具箱。它的不 同子模塊相當于不同的應用,例如插值、積分、優化、圖像處理、特殊 函數等。SciPy可以與其他標準科學計算程序庫進行比較,比如GSL(GNU C或C++科學計算庫)或者 MATLAB 工具箱。SciPy 是Python 中科學計 算程序的核心包,用于有效地計算NumPy矩陣,讓NumPy和SciPy協同 工作。
Scikit-Learn
Scikit-Learn 是基于 Python 的機器學習模塊,基于 BSD 開源許可 證。Scikit-Learn 的基本功能主要被分為6部分:分類、回歸、聚類、數 據降維、模型選擇和數據預處理,具體可以參考官方網站上的文檔。
對具體的機器學習問題的解決,通常可以分為三步:
數據準備與預處理;
模型選擇與訓練;
模型驗證與參數調優。
Scikit-Learn 封裝了這 些步驟,使建模的過程更方便、簡單和快捷。
Numpy 基礎教程
安裝
pip install numpy
numpy 的引用
import numpy as np使用 ndarray 創建數組
NumPy 的主要對象是 ndarray,該對象是一個快速、靈活的大數據容器。在此需要注意,在ndarray與Python中內置的list、tuple并不相同。在Python中,元素的數據類型可以不同;而在ndarray中,所有元素的數據類型必須相同。
data1 = [1,2,3,4] data2 = [5,6,7,8]arr1 = np.array(data1) arr1Output:
array([1, 2, 3, 4])創建一個4×2數組4 \times 2 數組4×2數組
arr2 = np.array([data1,data2]) arr2Output:
array([[1, 2, 3, 4],[5, 6, 7, 8]])創建全0的數組
np.zeros((3,3))Output:
array([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]])創建全1的數組
np.ones((3,3))Output:
array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])創建1-10 且為 2 的等差數列
np.arange(1,10,2)Output:
array([1, 3, 5, 7, 9])創建1-10且長度為4的等差數列
np.linspace(1,10,4)Output:
array([ 1., 4., 7., 10.])數組索引、切片、賦值
索引切片的操作類似于Python的內置函數list,只不過是從一維拓展到多維而已。首先,我們創建一個 3×33 \times 33×3 的 ndarray:
arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) arr2Output:
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])選取行
arr2[1]Output:
array([4, 5, 6])選取給定的行列值
arr2[1,1]Output:
5選取前幾行
arr2[:2]Output:
array([[1, 2, 3],[4, 5, 6]])選取前幾行與前幾列
arr2[:2,:2]Output:
array([[1, 2],[4, 5]])基本的數組運算
ndarray 的一大特色就是可以將代碼向量化。所謂向量化,就是對 一個復雜的對象進行整體操作,而不是對其中的單個元素進行循環。NumPy 的大部分代碼都是由 C 語言編寫的,并且進行了高度優化,這 大大加快了計算速度。
簡單的數學運算可以直接在ndarray上運行,例如:
Output:
array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])矩陣的加法
arr3 + arr3Output:
array([[ 2, 4, 6],[ 8, 10, 12],[14, 16, 18]])矩陣中對應元素相乘
arr3 * arr3Output:
array([[ 1, 4, 9],[16, 25, 36],[49, 64, 81]])矩陣中每一個元素乘以系數
arr3 * 2Output:
array([[ 2, 4, 6],[ 8, 10, 12],[14, 16, 18]])矩陣中每一個元素進行冪運算
arr3 ** 0.5Output:
array([[1. , 1.41421356, 1.73205081],[2. , 2.23606798, 2.44948974],[2.64575131, 2.82842712, 3. ]])在 NumPy 中還有一些內置的數學函數,可以幫助我們快速地對數
據進行統計計算,比如sum、max、mean、std等。
求和:
arr3.sum()Output:
45求標準差:
arr3.std()Output:
2.581988897471611求最大值:
arr3.max()Output:
9基本的數組統計方法
| sum | 對數組的全部或者軸向數據求和 |
| mean | 算術平均數 |
| std var | 標準差,方差 |
| min max | 最大值和最小值 |
| argmin argmax | 最小元素和最大元素的索引 |
| cumsum cumprod | 所有元素累計求和 所有元素累計求積 |
隨機數
NumPy還可以用來生成偽隨機數,負責這一功能的是其子庫 numpy.random。
首先,導入 numpy.random。為了更直觀地展示隨機數的生成過程,這里同時導入了Matplotlib,以將結果可視化:
import numpy.random as npr import matplotlib.pyplot as plt %matplotlib inline例如,npr.rand函數可以用來生成 [0,1)[0,1)[0,1)的隨機多維數組:
npr.rand(3,2)Output:
array([[0.45788024, 0.57343845],[0.2763168 , 0.68187916],[0.91109262, 0.40315501]])通過簡單的線性變換,即可將將隨機區間轉化為[2,4)[2,4)[2,4)
npr.rand(3,2)*2+2Output:
array([[3.06512178, 2.78121736],[3.06268945, 3.4561032 ],[3.08663582, 2.52355033]])下表展示了生成簡單隨機數的函數及其參數和描述。
| round | d0,d1 | 生成半開區間[0,1)[0,1)[0,1)內的多維隨機數 |
| randn | d0,d1 | 生成來自正態分布的多個樣本 |
| randint | low,high,size | 生成半開區間[low,high)[low,high)[low,high)內的隨機樣本整數 |
| chioce | a,size,raplace,p | 生成在給定的一維數組中的隨機樣本 |
許多金融模型,例如 BSM 模型、跳躍擴散模型、平方根擴散模型等,都依賴于正態分布。我們可以通過生成相應的隨機數,來將原本連續的金融模型離散化,從而進行近似模擬。在npr.random模塊中內置了很多分布函數,具體內容可以查閱NumPy的文檔。
作為例子,我們將如下分布的隨機數進行可視化。
Pandas 基礎教程
Pandas 是基于 NumPy 衍生出的一種工具,用于解決數據分析問 題,它納入了大量的庫和一些標準的數據模型,提供了可用于高效操作 大型數據集的工具,是使 Python 成為強大而高效的數據分析工具的重 要因素之一。
安裝
pip install dataframe
Pandas 引用
import pandas as pdPandas 數據結構
Pandas 的數據結構主要分為三種:Series(一維數組)、 DataFrame(二維的表格型數據結構)和Panel(三維數組)。
Series
Series指一維數組,與 NumPy中的一維 Array類似。Series、Array與 Python基本的數據結構List也很相近,其區別是:在List中的元素可以是 不同的數據類型,而在Array和Series中則只允許存儲相同的數據類型, 這樣可以更有效地使用內存,提高運算效率,Series增加了對應的標簽(label)以用于索引,可以包含0個或者多 個任意數據類型的實體。其中,標簽索引賦予了Series強大的存取元素 功能。除通過位置外,Series還允許通過索引標簽進行元素存取:
obj = pd.Series([40,12,-3,25]) objOutput:
0 40 1 12 2 -3 3 25 dtype: int64Series 的字符串表現形式為:索引在左邊,值在右邊。因為在建立 過程中沒有指定索引,所以Python會自動為我們加入一個0~n的整數索 引,我們可以通過數字獲取具體位置上的元素:
obj[0]Output:
40可以通過index與values獲取Series的索引與數據:
obj.index # 獲取索引 obj.valuesOutput:
array([40, 12, -3, 25], dtype=int64)當然,也可以在Series建立時就指定索引:
obj = pd.Series([40,12,-3,25],index = ['a','b','c','d']) objOutput:
a 40 b 12 c -3 d 25 dtype: int64可以直接通過索引獲取數值:
obj['c']Output:
-3對于Series的各種計算,其結果也會保留index:
obj[obj>15]Output:
a 40 d 25 dtype: int64另外,Series可以被轉換為字典:
obj.to_dict()Output:
{'a': 40, 'b': 12, 'c': -3, 'd': 25}DataFrame
DataFrame 指二維的表格型數據結構。在 DataFrame 有很多功能與 R 中的 data.frame類似,我們可以將DataFrame理解為Series的容器,也 就是說,在DataFrame中,多個Series共用了一個索引index。 在以字典或Series的字典的結構構建DataFrame時,最外面的字典對 應DataFrame的列,內嵌的字典及Series則是其中的每個值,例如:
d = {'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])} df = pd.DataFrame(d) dfOutput:
| a | 1.0 | 1 |
| b | 2.0 | 2 |
| c | 3.0 | 3 |
| d | NaN | 4 |
從字典的列表中構建 DataFrame 時,其中的每個字典代表的是每條 記錄(DataFrame中的一行),字典中每個值對應的是這條記錄的相關 屬性。同時可以看到,當由多個Series組成DataFrame時,Pandas會自動按 照index對齊數據,如果某個Series的index缺失,則Pandas會將其自動填 寫為np.nan。
Pandas 輸出設置
在 Pandas 中可以通過 set_option 設置 Pandas 的輸出格式,例如最 多顯示的行數、列數等:
pd.set_option('display.max_rows',1000) # 顯示的最大列數 pd.set_option('display.max_columns',20) # 顯示的最大列數 pd.set_option('precision',7) # 顯示小數點后的位數 pd.set_option('large_repr','truncate')Pandas 數據的讀取與寫入
Pandas可以方便地讀取本地文件如csv、txt、xlsx等,例如:
a = pd.read_csv('closeprice.csv') aOutput:
| 0 | 0 | 1 | 平安銀行 | 2017/6/20 | 9.12 |
| 1 | 1 | 2 | 萬科A | 2017/6/20 | 21.03 |
| 2 | 2 | 4 | 國農科技 | 2017/6/20 | 27.03 |
| 3 | 3 | 5 | 世紀星源 | 2017/6/20 | 5.45 |
| 4 | 4 | 6 | 深振業A | 2017/6/20 | 8.87 |
| 5 | 5 | 7 | 全新好 | 2017/6/20 | 15.87 |
我們可自行輸入pd.read_,使用代碼補全功能查看Pandas可以讀取的數據類型。
同理,可以使用to_,將DataFrame輸出到文件中:
DataFrame 排序
data = pd.DataFrame({'group':['a','a','a','b','b','b','c','c','c'],'ounce':[4,3,12,6,7.5,8,3,5,6]}) data.sort_values(by=['group','ounce'],inplace=True)上述代碼的作用就是先按照group降序排列,當group相同時再按照 ounces升序排列。參數中的 inplace=True 直接將排序后的結果存在 data,即直接用排序好的數據覆蓋原始數據。
DataFrame 去重
在大多數時候,在數據中會有重復的數據,在做分析前需要進行去 重
data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[3,2,1,3,3,4,4]}) dataOutput:
| 0 | one | 3 |
| 1 | one | 2 |
| 2 | one | 1 |
| 3 | two | 3 |
| 4 | two | 3 |
| 5 | two | 4 |
| 6 | two | 4 |
Output:
| 0 | one | 3 |
| 1 | one | 2 |
| 2 | one | 1 |
| 3 | two | 3 |
| 5 | two | 4 |
在不加任何參數時,Pandas會將完全相同的行去重:
data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[3,2,1,3,3,4,4]}) data.drop_duplicates(subset=['k1'],keep='last')Output:
| 2 | one | 1 |
| 6 | two | 4 |
當設置 subset為 k1時,只要 k1重復,Pandas就認為是重復的,可以 通過 keep參數確定需要保留哪個,一般在使用keep時先排序。 另外,如果需要查看重復的行,則可以進行如下操作:
data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[3,2,1,3,3,4,4]}) data[data.duplicated()]Output:
| 4 | two | 3 |
| 6 | two | 4 |
Pandas 替換數據
如果想批量替換數據中的指定數值,則可以使用 replace:
import numpy as np a.replace(1,np.nan)Output:
| 0 | 0.0 | NaN | 平安銀行 | 2017/6/20 | 9.12 |
| 1 | NaN | 2.0 | 萬科A | 2017/6/20 | 21.03 |
| 2 | 2.0 | 4.0 | 國農科技 | 2017/6/20 | 27.03 |
| 3 | 3.0 | 5.0 | 世紀星源 | 2017/6/20 | 5.45 |
| 4 | 4.0 | 6.0 | 深振業A | 2017/6/20 | 8.87 |
| 5 | 5.0 | 7.0 | 全新好 | 2017/6/20 | 15.87 |
如果想批量替換數據中的指定數值,則可以使用 replace:
也可以重命名某些列:
Output:
| 0 | 0.0 | NaN | 平安銀行 | 2017/6/20 | 9.12 |
| 1 | NaN | 2.0 | 萬科A | 2017/6/20 | 21.03 |
| 2 | 2.0 | 4.0 | 國農科技 | 2017/6/20 | 27.03 |
| 3 | 3.0 | 5.0 | 世紀星源 | 2017/6/20 | 5.45 |
| 4 | 4.0 | 6.0 | 深振業A | 2017/6/20 | 8.87 |
| 5 | 5.0 | 7.0 | 全新好 | 2017/6/20 | 15.87 |
切片與篩選
DataFame 有三種切片方法,分別問 loc,iloc和ix (注意: == pandas的1.0.0版本開始,移除了Series.ix and DataFrame.ix 方法 ==)
df.loc的第 1個參數是行標簽,第 2個參數為列標簽(為可選參數, 默認為所有列標簽),這兩個參數既可以是列表,也可以是單個字符。 如果這兩個參數都為列表,則返DataFrame,否則返回Series:
a.loc[:,['ticker','closePrice']]Output:
| 0 | 1 | 9.12 |
| 1 | 2 | 21.03 |
| 2 | 4 | 27.03 |
| 3 | 5 | 5.45 |
| 4 | 6 | 8.87 |
| 5 | 7 | 15.87 |
a.loc中的 : 表示所有的行。
df.loc的第 1個參數是行的位置,第 2個參數是列的位置(為可選參 數,默認為所有列標簽),這兩個參數既可以是列表,也可以是單個字符。如果兩個參數都是列表,則返回DataFrame,否則返回Series:
a.iloc[:4,[1,4]]Output:
| 0 | 1 | 9.12 |
| 1 | 2 | 21.03 |
| 2 | 4 | 27.03 |
總結
以上是生活随笔為你收集整理的数据分析基础教程 ( 1 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西普实验吧CTF-算术题
- 下一篇: 相册管理