灰太狼的數據世界(二)
- 2019 年 10 月 6 日
- 筆記
上一篇數據文章中,我們介紹了Numpy裡面的一些結構,那麼這次我們來介紹一些更好玩的東西—-Pandas。Pandas這個東西在數據的世界裡用的還是很頻繁的,主要是用起來會比較方便。相對Numpy而言的話,pandas屬於那種青出於藍而勝於藍這樣的一個角色。pandas是基於numpy的基礎上進行開發的,所以安裝pandas的時候會自帶性的把numpy也安裝上去。

上期的內容我們主要是針對Numpy裡面的一些數據結構和統計函數做了一番介紹,了解了ndarry是怎樣的一個結構(說白了就是一個數據,或是一個矩陣),那麼今天我們來看看,在Pandas裡面又有怎樣的一個數據結構呢?

今天我們就主要來聊聊Series~~~~
Pandas Series
Pandas裡面的Serise是一種類似於一維數組的對象,是由一組數據(各種NumPy數據類型)以及一組與之相關的數據標籤(即索引)組成。僅由一組數據也可產生簡單的Series對象。(注意:Series中的索引值是可以重複的)
我們可以看一下下面這一張圖:

這樣的一列就是一個Series。 對於每一列而言,他們都是一個series,這就像資料庫表裡面的列。
那我們來看看下面這張圖,如何來創建一個Series。

直接使用pandas去找Series就可以啦!
import pandas as pd a = pd.Series([1, 2, 3, 4]) b = pd.Series(data=[1, 2, 3, 4], index=['a', 'b', 'c', 'd']) print(a) print(b)

我們來看一下運行結果:
a的運行結果就是一列索引對應著一列值(索引的值和給的值是一一對應的~~就和python裡面的字典一樣)。如果沒有指定索引的值,默認是從0開始的,就和python裡面的list取值是一樣的。
如果需要改變索引,只需要在Series方法裡面加上index參數即可修改索引,不過要注意的是,給定數據的長度要和索引的長度是一樣的,這樣才會生效,否則就會報錯。
下面我們來看一下series的屬性:
|
編號 |
屬性/方法 |
描述 |
|---|---|---|
|
1 |
axes |
返回行軸標籤列表。 |
|
2 |
dtype |
返回對象的數據類型(dtype)。 |
|
3 |
empty |
如果系列為空,則返回True。 |
|
4 |
ndim |
返回底層數據的維數,默認定義:1。 |
|
5 |
size |
返回基礎數據中的元素數。 |
|
6 |
values |
將系列作為ndarray返回。 |
|
7 |
head() |
返回前n行。 |
|
8 |
tail() |
返回最後n行。 |
下面問題來了,我們如何結合Numpy去創建一個Series呢?
import numpy as np import pandas as pd data = np.array(['Amy', 'Ben', 'Candy', 'David']) A = pd.Series(data) print(A)
我們可以直接把ndarray生成的數據當作參數放到Serise裡面。

如果想指定索引的值可以加上index參數:
import numpy as np import pandas as pd data = np.array(['Amy', 23, '女', 99]) A = pd.Series(data, index=["name", "age", "gender", "point"]) print(A)

那如何使用字典創建Series呢?
data = {'a': 1, 'b': 2, 'c': 3} B = pd.Series(data) print(B)

也是直接創建即可。
講完了創建那就來說一說取值吧,Series裡面的值如何取出來呢?
Series值的獲取主要有兩種方式:
1、通過方括弧+索引的方式讀取對應索引的數據,有可能返回多條數據。
2、通過方括弧+下標值的方式讀取對應下標值的數據,下標值的取值範圍為:
[0,len(Series.values));
另外下標值也可以是負數,表示從右往左獲取數據。
import pandas as pd A = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) print(A[1]) print(A['a']) print(A['d'])
可以使用默認索引,也可以使用給定的索引。

它還可以像python裡面的list一樣進行切片。
import pandas as pd A = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e']) print(A[:3]) print(A[4:2:-1]) print(A['a':'d']) print(A['e':'c':-1])

Series裡面的刪除操作使用的是drop方法和pop方法:
import pandas as pd series1 = pd.Series([10, 20, 30, 40], index=list('abcd')) # 刪除元素返回副本 print(series1.drop('c')) print(series1.drop(['a', 'd'])) # 刪除源數據中的元素 series1.pop('d') print(series1)

使用drop方法的時候會生成一個新的Series,新的Series裡面就是刪除該元素的Series,
使用pop方法刪除,就是對原來的Series進行修改刪除。
如果你想在Series中插入值的話,和字典的原理是一樣的:
import pandas as pd series1 = pd.Series([10, 20, 30, 40], index=list('abcd')) # 新增一個標籤索引值為f,值為100的元素 series1['f'] = 100 print(series1)

當然還可以使用append方法進行添加,但是和剛剛不一樣的是,他會生成一個新的Series來存儲添加後的數據:
series2 = pd.Series([100, 200], index=['g', 'h']) series3 = series1.append(series2) print(series3)

最後我們來說一下Series裡面的統計函數。
1、求和函數SUM
import pandas as pd val = [1000, 201, None, 104] t = pd.Series(val, index=[1, 2, 3, 4]) print(t) print('sum=', t.sum())

數學達到高數水平的可以簡單看看下面這個表達式:

2、均值函數MEAN
import pandas as pd val = [1000, 201, None, 104] t = pd.Series(val, index=[1, 2, 3, 4]) print(t) print('average=', t.mean())

同樣的,數學表達式如下:

3、最大函數MAX
max函數可以返回series里最大值,而idxmax返回的是其index或者label。
import pandas as pd val = [1000, 201, None, 104] t = pd.Series(val, index=[1, 2, 3, 4]) print('max=', t.max())

4、方差函數VAR
方差說起來比較抽象,算起來就是拿每個數和平均數做差再平方,注意考量的就是這串數據的穩定性。方差越小越好,
舉個例子,小明的高考衝刺模擬五次成績是303,321,339,288,403,小剛的成績是,323,351,343,328,311請問哪個同學的成績更加穩定?
(不要問分數為什麼這麼低——-江蘇省高考)
很明顯我們可以看到小剛的成績更加趨於穩定,因為小剛成績的波動範圍比較小,不像小明,波動的比較大。
那麼我們用方差來論證這個觀點:
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.var()) print('xiaogang=', p.var())

很明顯我們可以看到,小剛的方差更小,所以小剛的成績更加穩定。
數學公式如下:

5、標準差函數STD
說的簡單一點,他就是和方差一樣的,也是考量一組數據的穩定性,具體值就是方差開平方。也就是把上面那個表達式的平方去掉即可。
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.std()) print('xiaogang=', p.std())

數學表達式:

6、平均絕對離差函數MAD
平均絕對離差是用樣本數據相對於其平均值的絕對距離來度量數據的離散程度。
畫個圖你就懂了:

紅線就是平均值,紅色的小點點就是一組數據,距離紅線越近就越偏向穩定。用肉眼看來,很明顯上面一個數據會比較好。
我們依舊用小明和小剛的分數來算平均絕對離差:
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.mad()) print('xiaogang=', p.mad())

還是小剛的數據比較小。
數學表達式:

(每個數據減去均值求絕對值,如何再求這些絕對值的平均值)
總的來說,我們期望數據的離散程度越小越好(就是分布的範圍越小越好)。
上面的三個函數,都是用來計算數據的離散程度的。
7、協方差函數COV
表達式:

(別問我啥意思了,根據上面的表達式,自己猜一下吧-_-!
提示:方差是協方差的一種特殊情況,即當兩個變數是相同的情況)
看下面的程式碼理解一下:
import pandas as pd xiaoming = [303, 321, 339, 288, 403] xiaogang = [323, 351, 343, 328, 311] average_xiaoming = pd.Series([330.8, 330.8, 330.8, 330.8, 330.8]) average_xiaogang = pd.Series([331.2, 331.2, 331.2, 331.2, 331.2]) t = pd.Series(xiaoming) p = pd.Series(xiaogang) print('xiaoming=', t.cov(average_xiaoming)) print('xiaogang=', p.cov(average_xiaogang))

8、偏太值函數SKEW
偏態值用于衡量成績分布服從正態分布的程度
正態分布,又叫常態分布,像一隻倒扣的鐘。兩頭低,中間高,左右對稱。大部分數據集中在平均值,小部分在兩端,如下圖:

import pandas as pd xiaoming = [303, 321, 339, 288, 403] t = pd.Series(xiaoming) print('xiaoming=', t.skew())

9、峰度函數KURT
峰度(Kurtosis)衡量實數隨機變數概率分布的峰態。峰度高就意味著方差增大是由低頻度的大於或小於平均值的極端差值引起的。

在相同的標準差下,峰度係數越大,分布就有更多的極端值,那麼其餘值必然要更加集中在眾數周圍,其分布必然就更加陡峭。
import pandas as pdxiaoming = [303, 321, 339, 288, 403] t = pd.Series(xiaoming) print('xiaoming=', t.kurt())

關於Series的內容差不多到這裡就結束啦!有問題可以私信進行提問哦!(因為暫不支援留言,只能私信啦!)
