四、Python資料挖掘(Pandas庫)
目錄:
- 四、Python資料挖掘(Pandas庫)
- 一、Pandas 簡介
- 二、Pandas 三大結構之——DataFrame
- 1.DataFrame 的創建
- pd.DataFrame(data, index, columns, dtype=None, copy=False)
- pd.DataFrame(dict)
- pd.date_range(start=, end=, periods=, freq=, closed=None)
- 2.DataFrame 的屬性
- 3.DataFrame 重設索引
- DataFrame陣列.index[下標]
- DataFrame陣列.columns[下標]
- new_ = DataFrame陣列.reset_index(drop=False)
- new_ = DataFrame陣列.set_index(keys, drop=True)
- 4.其他常用方法
- DataFrame陣列.T
- DataFrame陣列.head([num=5])
- DataFrame陣列.tail([num=5])
- DataFrame陣列.iloc[行下標/start:stop[, start:stop]]
- 三、Pandas 三大結構之——Panel
- 1.MultiIndex
- DataFrame陣列.index.levels
- 2.Panel
- pd.Panel(data, items, major_axis, minor_axis, copy=False, dtype=None)
- 四、Pandas 三大結構之——Series
- 1.Series 的屬性
- 2.Series 的創建
- pd.Series(data, index)
- 五、基本資料操作
- 1.資料的索引/訪問
- (1)直接索引(先列后行)
- DataFrame陣列[column][index]
- DataFrame陣列[start:stop]
- (2)按標簽索引(先行后列)
- DataFrame陣列.loc[index][column] DataFrame陣列.loc[index, column]
- (3)按下標索引(先行后列)
- DataFrame陣列.iloc[行下標/start:stop[, start:stop]]
- (4)擴展:屬性訪問法
- 2.資料的賦值
- 訪問需要修改的值 = 值
- 3.排序
- (1)對 DataFrame 進行排序
- DataFrame陣列.sort_values(by=, ascending=True)
- DataFrame陣列.sort_index()
- (2)對 Series 進行排序
- Series陣列.sort_values(ascending=True)
- Series陣列.sort_index()
- 4.算術運算與邏輯運算
- (1)算術運算
- 訪問要進行運算的值 運算式
- (2)邏輯運算
- 直接訪問元素的邏輯運算式 ? 布爾陣列
- DataFrame/Series陣列[布爾陣列]
- DataFrame/Series陣列[布爾陣列] = 值
- DataFrame/Series陣列.query("列索引屬性的邏輯運算式")
- DataFrame/Series陣列[列索引].isin(values)
- (3)統計運算
- DataFrame/Series陣列.describe()
- (4)自定義運算
- DataFrame/Series陣列.apply(func[, axis=0])
- 5.Pandas 繪圖
- DataFrame/Series陣列.plot(x=?, y=?, kind=?)
- 六、檔案的讀取與存盤據
- 1.CSV 檔案的讀寫
- pd.read_csv(filepath_or_buffer, usecols=[ ], names=[ ])
- DataFrame/Series陣列.to_csv(...)
- 2.HDF5 檔案的讀寫
- pd.read_hdf(...)
- DataFrame/Series陣列.to_hdf(...)
- 3.JSON 檔案的讀寫
- pd.read_json(...)
- DataFrame/Series陣列.to_json(...)
一、Pandas 簡介
- Pandas是什么?
Pandas 以 Numpy 為基礎,借力 Numpy 模塊在計算方面性能高的優勢;其次,Pandas 基于 Matplotlib,能夠簡便的畫圖;Pandas 還具有獨特的資料結構
- 為什么使用 Pandas?
Pandas 具有便捷的資料處理能力,例如上一節 三、Python資料挖掘(Numpy庫)中我們知道了,通過 Numpy 的 genfromtxt() 函式讀取資料檔案中的字串時,會出現 nan 的情況,但 Pandas 解決了這些問題,具有便捷的資料處理能力,讀取檔案方便,并且封裝了 Matplotlib 和 Numpy 的畫圖和計算
二、Pandas 三大結構之——DataFrame
對于 Numpy 中的 ndarray,它只儲存資料,但不包含資料的意義,而 DataFrame 的結構上,既有行索引,又有列索引的二維陣列
可以類比于 SQL 中的一張關系表:一般 DataFrame 中行索引是指不同的事物,而列索引是指事物的屬性(重要)
Pandas 一般會和 Numpy 配合著來使用
匯入模塊:
import pandas as pd
1.DataFrame 的創建
pd.DataFrame(data, index, columns, dtype=None, copy=False)
回傳 二維陣列data 的 DataFrame 結構
index 行索引陳述句,陣列
columns 列索引陳述句,陣列
注:只回傳新陣列,不改變原陣列
例:

還可以通過傳入字典來定義 DataFrame:
pd.DataFrame(dict)
以字典的方式創建 DataFrame 陣列
字典 key值 作為列索引
例:

Pandas 中的特殊索引——時間序列:
pd.date_range(start=, end=, periods=, freq=, closed=None)
生成一個固定間隔時間的時間序列,可以用作 DataFrame 的索引
start= 開始日期,格式為:“2021-01-01”(不含時間) 或 "2021-01-01 00:00:00(含時間)"
end= 結束日期,格式和 start= 一致
periods= 生成的時間序列的個數
freq= 頻率,即時間間隔
closed= 把原輸出結果輸出為開/閉區間:
“closed=left” 表示輸出區間為左閉右開
“closed=right” 表示輸出區間為左開右閉
| freq 頻率 | 含義 |
|---|---|
| D | 一天 |
| W | 一周 |
| W-SUN | 一周,以星期天為起始,等同于"W" |
| W-MON | 一周,以星期一為起始 |
| W-TUE | 一周,以星期二為起始 |
| W-WED | 一周,以星期三為起始 |
| W-THU | 一周,以星期四為起始 |
| W-FRI | 一周,以星期五為起始 |
| W-SAT | 一周,以星期六為起始 |
| M | 一個月,以月結束為界,如:“2018-11-30”, “2018-12-31” |
| MS | 一個月,以月起始為界,如:“2021-01-01”, “2021-02-01” |
| S | 一秒 |
| T/min | 一分鐘 |
| H | 一個小時 |
| A/Y | 一年,以年結束為界,如:“2020-12-31” |
更詳細的內容,可參考下述文章:
- 【pandas】 之 pandas.date_range 函式
- 此外,還可以指定數值,如:5D 表示5天;3H 表示三個小時
例:

2.DataFrame 的屬性
| 屬性 | 含義 |
|---|---|
| shape | 形狀 |
| index | 行索引 |
| columns | 列索引 |
| values | 表格內容-值 |
例:



3.DataFrame 重設索引
由于這些屬性都是由陣列構成,因此也可以進行一些訪問操作
訪問行索引:
DataFrame陣列.index[下標]
訪問行索引中的某一個值
注:DataFrame 規定,不能直接通過 DataFrame陣列.index[下標] = 值 修改行索引,不能單獨修改,只能整體修改
例:

訪問列索引:
DataFrame陣列.columns[下標]
訪問列索引中的某一個值
注:DataFrame 規定,不能直接通過 DataFrame陣列.columns[下標] = 值 修改列索引,不能單獨修改,只能整體修改
例:

重設索引:
new_ = DataFrame陣列.reset_index(drop=False)
重新設定新的索引
drop= 決定是否洗掉原索引,如果 drop=False,則不洗掉原索引,會把原行索引加到第一列中
注:只回傳新陣列 new_ ,不改變原陣列
例:

以某列值設定為新的索引:
new_ = DataFrame陣列.set_index(keys, drop=True)
以某列的值設定為新的索引,key為某列的索引
keys 索引,可以設定多個索引
drop 決定是否洗掉作為索引參考后的該列:
drop=Fales 當設定了某列的值為新的索引后,保留這一列
drop=True 當設定了某列的值為新的索引后,不保留這一列,即 列數-1
注:只回傳新陣列 new_ ,不改變原陣列
- 以某一列的值作為新的索引,可以類比于 SQL 的主碼,規定主碼為索引
- 當設定多列作為索引時,可以類比于 SQL 的主碼,主碼可以由多個屬性組成
例:把 “name” 作為新的行索引

例:設定多個行索引

4.其他常用方法
DataFrame陣列.T
同樣可以實作行和列的轉置
DataFrame陣列.head([num=5])
回傳 DataFrame 陣列前5行的內容
num 可以指定行數,默認為5行DataFrame陣列.tail([num=5])
回傳 DataFrame 陣列后5行的內容
num 可以指定行數,默認為5行
- 后面兩個方法一般用于結構的查看
訪問某一行整行、某一整列或部分資料:
DataFrame陣列.iloc[行下標/start:stop[, start:stop]]
用于訪問 DataFrrame 中所選的資料
行下標/start:stop 可以是指 行下標 所索引的行,也可以是某些行 start:stop
start:stop 列的范圍,預設時為所有列,這個不能是下標
后面會作更詳細的介紹
例:

三、Pandas 三大結構之——Panel
MultiIndex 與 Panel:
1.MultiIndex
MultiIndex 就是多層或分層索引物件,簡單來說,在 DataFrame 具有多列行索引時, MultiIndex 就是多列行索引物件
例:

- 索引的名字分別是 name 和 sex
例:通過 index.索引的名字 可以訪問指定索引
DataFrame陣列.index.levels
顯示索引的內容

2.Panel
Panel 是用于存盤三維陣列的結構,其大致結構類似于 DataFrame
通常會把 Pnael 當作 DataFrame(資料幀) 的容器
pd.Panel(data, items, major_axis, minor_axis, copy=False, dtype=None)
回傳 三維陣列data 的 Panel 結構
data 三維陣列
items - axis 0 每個專案對應于內部包含的資料幀(DataFrame)
major_axis - axis 1 它是每個資料幀(DataFrame)的行索引
minor_axis - axis 2 它是每個資料幀(DataFrame)的列
注:只回傳新陣列 new_ ,不改變原陣列
- Panel 了解即可,Panel 從版本0.20.0開始棄用:推薦的用于表示3D資料的方法是 DataFrame 上的 MultiIndex 方法
四、Pandas 三大結構之——Series
Series 可以是 DataFrame 中的某一行,視為一維陣列
它包含 索引index (0, 1, 2, 3…) 和 值value 屬性,這里的 index 指的是 Series的列索引——即一維陣列的索引,而不是 DataFrame 的行索引

可以把 DataFrame 理解為 Series 的容器
1.Series 的屬性
| 屬性 | 含義 |
|---|---|
| index | 索引 |
| values | 值 |
2.Series 的創建
pd.Series(data, index)
回傳 一維陣列data 的 Series 結構
data 一維陣列
index 索引陳述句,陣列
例:
直接創建:

通過 DataFrame 創建:

- 會沿用原 DataFrame 的列索引作為 Series 的索引
通過字典創建:

五、基本資料操作
1.資料的索引/訪問
(1)直接索引(先列后行)
DataFrame陣列[column][index]
通過 列和行 的索引訪問 DataFrame 中的值
column 列索引,可以是一個陣列
index 行索引,可以是一個陣列,可以預設
注:當 column 是一個陣列時,index 不能指定任何值(重要)
注:[ ][ ] 是先列后行,不是先行后列DataFrame陣列[start:stop]
讀取下標在區間 [start, stop) 內的行,無法指定列
例:
索引到某一值:

訪問整列資料:

通過陣列訪問某些組合的資料:

- 注:上述情況中 index 是陣列,column 不能指定任何值

(2)按標簽索引(先行后列)
DataFrame陣列.loc[index][column]
DataFrame陣列.loc[index, column]通過 行和列 的索引訪問 DataFrame 中的值,上述兩種方法效果一樣,都可以
index 行索引,可以是一個陣列
column 列索引,可以是一個陣列
loc() 不會受到直接訪問那樣的限制
例:
索引到某一值:

通過陣列訪問部分值:

- 可以配合 DataFrame陣列.index[ ] 使用
(3)按下標索引(先行后列)
DataFrame陣列.iloc[行下標/start:stop[, start:stop]]
用于訪問 DataFrrame 中所選的資料
行下標/start:stop 可以是指 行下標 所索引的行,也可以是某些行 start:stop
start:stop 列的范圍,預設時為所有列,這個不能是下標
例:
通過 start:stop 訪問部分值:

- 可以配合 DataFrame陣列.columns.get_indexer(columns) 來使用,該方法的作用是通過索引來獲取索引所在位置的 列下標
通過行下標訪問部分值:

(4)擴展:屬性訪問法
當列索引是以字母為開頭時,列索引就是該 DataFrame/Series陣列 的屬性,可以用訪問屬性的方法來訪問列
例:

2.資料的賦值
可以進行整體賦值,也可以單獨賦值:
訪問需要修改的值 = 值
可以實作整體賦值或單獨賦值
例:

更多方法不再列舉
3.排序
(1)對 DataFrame 進行排序
排序有兩種形式,一種是根據內容進行排序,一種是根據行索引進行排序
DataFrame陣列.sort_values(by=, ascending=True)
取單個索引(列)或多個索引(列),根據這些索引的內容進行排序
by 可以是根據某個索引(列)的值,也可以根據多個索引的值進行排序,如:by=[“Chinese”, “Math”],則優先根據 Chinese 索引進行排序,若 Chinese 索引值有相等項時,再根據 Math 索引
ascending=False 降序排序
ascending=True 升序排序,默認
注:只回傳新陣列,不改變原陣列DataFrame陣列.sort_index()
根據行索引進行排序
注:只回傳新陣列,不改變原陣列
例:

(2)對 Series 進行排序
由于 Series 是一個一維陣列,因此較簡單
Series陣列.sort_values(ascending=True)
根據 Series 陣列內容進行排序
ascending=False 降序排序
ascending=True 升序排序,默認
注:只回傳新陣列,不改變原陣列Series陣列.sort_index()
根據索引進行排序
注:只回傳新陣列,不改變原陣列
4.算術運算與邏輯運算
(1)算術運算
直接進行運算:
訪問要進行運算的值 運算式
可以直接進行運算
例:

通過方法進行運算:
| 運算方法 | 含義 |
|---|---|
| DataFrame/Series陣列.add(other) | 加運算:DataFrame/Series陣列元素 + other |
| DataFrame/Series陣列.sub(other) | 減運算:DataFrame/Series陣列元素 - other |
| DataFrame/Series陣列.mul(other) | 乘運算:DataFrame/Series陣列元素 * other |
| DataFrame/Series陣列.div(other) | 除運算:DataFrame/Series陣列元素 / other |
| DataFrame/Series陣列.mod(other) | 除(取整)運算:DataFrame/Series陣列元素 % other |
| DataFrame/Series陣列.pow(other) | 冪運算:DataFrame/Series陣列元素 ** other |
陣列與陣列/自身之間運算(形狀相同時):
例:

(2)邏輯運算
直接訪問元素的邏輯運算式 ? 布爾陣列
布爾邏輯運算式 ? 布爾陣列
進行基本的邏輯運算,該運算式記為“布爾陣列”(重要)
例:

邏輯運算子:
| 邏輯運算子 | 含義 |
|---|---|
| > | 大于 |
| < | 小于 |
| != | 不等于 |
| | | 或 |
| & | 與 |
- 注:出現報錯時可能是優先級問題,使用 ( ) 表明優先級
例:

DataFrame/Series陣列[布爾陣列]
布爾索引,索引布爾陣列中為 True 的元素,并回傳這些元素所在行索引
DataFrame/Series陣列[布爾陣列] = 值
將布爾陣列中為 True 的行索引進行統一賦值(整行賦值)
例:
DataFrame/Series陣列[布爾陣列]:

DataFrame/Series陣列[布爾陣列] = 值:

邏輯運算函式:
當列索引是以字母為開頭時,列索引就是該 DataFrame/Series陣列 的屬性
當索引以字母為開頭時,才可以使用下面這個方法:
DataFrame/Series陣列.query(“列索引屬性的邏輯運算式”)
根據邏輯運算子訪問符合邏輯運算式的行
可以代替 DataFrame/Series陣列[布爾陣列] 的作用
例:直接使用列索引——屬性即可

DataFrame/Series陣列[列索引].isin(values)
檢驗 DataFrame/Series陣列[列索引] 列中對應的值是否為 values,當 DataFrame/Series陣列[列索引] 中某個位置的 這個值等于values 或 這個值在values中 時,則該值所在行對應位置為 True,否則對應位置為 False
DataFrame/Series陣列[列索引] 為索引出的某列的值
values 可以是一個值,也可以是一個陣列
例:檢驗 “2021-01-02” 列是否有 2 或 3

再把這些符合的行索引出來:

(3)統計運算
DataFrame/Series陣列.describe()
能夠直接得出很多統計結果:count、mean、std、min、max…
例:

- ?%分位數:指把一組資料從小到大進行排列后,前 ?% 的數小于或等于該數——分位數
統計運算方法:
| 統計運算方法 | 含義 |
|---|---|
| DataFrame/Series陣列.sum([axis=0]) | (默認按列)統計總和 |
| DataFrame/Series陣列.mean([axis=0]) | (默認按列)統計平均值 |
| DataFrame/Series陣列.median([axis=0]) | (默認按列)統計中值 |
| DataFrame/Series陣列.max([axis=0]) | (默認按列)查找最大值 |
| DataFrame/Series陣列.min([axis=0]) | (默認按列)查找最小值 |
| DataFrame/Series陣列.mode([axis=0]) | (默認按列)統計眾數 |
| DataFrame/Series陣列.abs([axis=0]) | 顯示所有值的絕對值 |
| DataFrame/Series陣列.std([axis=0]) | (默認按列)統計標準差 |
| DataFrame/Series陣列.var([axis=0]) | (默認按列)統計方差 |
| DataFrame/Series陣列.idxmax([axis=0]) | (默認按列)找出最大值所在位置 |
| DataFrame/Series陣列.idxmin([axis=0]) | (默認按列)找出最小值所在位置 |
- 注:由于 DataFrame/Series陣列 的列索引默認視為類似 SQL 中 事物的屬性,因此這些方法在設計時都是按列統計,因為按行統計(屬性之間)沒意義
例:

累計統計方法:
| 累計統計方法 | 含義 |
|---|---|
| DataFrame/Series陣列cumsum() | 前1/2/3/…/n個數逐個累加求和 |
| DataFrame/Series陣列cummax() | 前1/2/3/…/n個數的最大值 |
| DataFrame/Series陣列cumin() | 前1/2/3/…/n個數的最小值 |
| DataFrame/Series陣列cumprod() | 前1/2/3/…/n個數逐個累計求積 |
例:求一支股票的總漲跌幅

還可以畫圖顯示總漲跌幅

(4)自定義運算
DataFrame/Series陣列.apply(func[, axis=0])
讓 DataFrame/Series陣列 (默認按列)執行自定義的運算
func 自定義的運算
axis=0 默認按列統計
例:定義一個對列的 最大值-最小值 的函式

- lambda運算式:x 指代的就是 stock1 物件
5.Pandas 繪圖
DataFrame/Series陣列.plot(x=?, y=?, kind=?)
繪制簡單圖
x=? 圖表的x軸,用列索引指定,如:x="name"
y=? 圖表的y軸,用列索引指定,如:y="score"
kind=? 圖表的型別,如:kind=“scatter” 就是散點圖
| kind引數 | 含義 |
|---|---|
| line | 折線圖 |
| hist | 直方圖 |
| scatter | 散點圖 |
| bar | 柱狀圖 |
例:

六、檔案的讀取與存盤據
| Format Type | Data Description | Reader | Writer |
|---|---|---|---|
| text | CSV | read_csv | to_csv |
| text | JSON | read_json | to_json |
| text | HTML | read_html | to_html |
| text | Local clipboard | read_cliipboard | to_cliipboard |
| binary | MS Excel | read_excel | to_excel |
| binary | HDF5 Format | read_hdf | to_hdf |
| binary | Feather Formal | read_feather | to_feather |
| binary | Parquet Formal | read_parquet | to_parquet |
| binary | Msgpack | read_msgpack | to_msgpack |
| binary | Stata | read_stata | to_stata |
| binary | SAS | read_sas | |
| binary | Python Pickle Fomat | read_pickle | to_pickle |
| SQL | SQL | read_sql | to_sql |
| SQL | Google Big Query | read_gbq | to_gbq |
- text: .text檔案
- binary:二進制檔案
- SQL:資料庫檔案
- 注:最常用的是CSV、HDF5 和 JSON 檔案
下面介紹三種最常用的檔案型別的讀取與存盤
1.CSV 檔案的讀寫
讀取:
pd.read_csv(filepath_or_buffer, usecols=[ ], names=[ ])
讀取 csv 檔案
filepath_or_buffer 檔案路徑,帶擴展名
usecols=[ ] 指定讀取的列索引,串列形式
names=[ ] 當指定的 CSV 檔案沒有索引欄位時,讀取 CSV 檔案時會默認把第一行資料作為列索引,這非常不好,這個時候需要自己添加欄位,串列形式
例:打開當前目錄下 stock_day 下的 stock_day.csv 檔案,并獲取 high、low、open 和 close 列
import pandas as pd
pd.read_csv("./stock_day/stock_day.csv", usecols=["high", "low", "open", "close"])
寫入:
DataFrame/Series陣列.to_csv(…)
把 DataFrame/Series陣列 內容讀取到 csv 檔案中,帶擴展名
path_or_buf 檔案路徑,檔案不存在時則創建新檔案
columns=[ ] 指定寫入的列索引,串列形式
mode= “w”:覆寫,“a”:追加
index=True 是否寫入行索引,默認為 True
header=True 是否寫入列索引,默認為 True
例:把 前10行 的 open、close 列資料寫入檔案
import pandas as pd
data[:10].to_csv("test.csv", columns=["open", "close"])
2.HDF5 檔案的讀寫
hdf5 是存盤三維資料的檔案,這里的鍵則是指定了不同的二維表
讀取:
pd.read_hdf(…)
讀取 hdf5 檔案
filepath_or_buffer 檔案路徑,帶擴展名
key 讀取的鍵
mode 打開檔案的模式
寫入:
DataFrame/Series陣列.to_hdf(…)
寫入 hdf5 檔案
filepath_or_buffer 檔案路徑,帶擴展名
key 指定鍵——指定要讀取這張二維表時的鍵
mode= “w”:覆寫,“a”:追加,默認為追加,即追加一個新的鍵的二維表
擴展:
優先選擇使用 HDF5 檔案存盤
- 其速度最快,是 pandas 默認支持的
- 支持壓縮,使用的方法是 blosc,可以提高磁盤利用率,節省空間
- HDF5 是跨平臺的,可以潛移到 Hadoop 上
3.JSON 檔案的讀寫
JSON 檔案是以一行作為一個樣本

讀取:
pd.read_json(…)
讀取 json 檔案
filepath_or_buffer 檔案路徑,帶擴展名
orient=“records” 讀取檔案后的展示方式,一般為 “records”(默認)
lines=False是否按行讀取 json 物件,默認不是按行讀取,一般選擇 lines=True 按行讀取
寫入:
DataFrame/Series陣列.to_json(…)
讀取 json 檔案
filepath_or_buffer 檔案路徑,帶擴展名
orient= 讀取檔案后的展示方式,一般選擇 orient=“records” 即可
lines=False是否按行寫入 json 物件,默認不是按行寫入,一般選擇 lines=True 按行寫入
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264838.html
標籤:python
上一篇:面向物件---多型
