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