資料分析利器之Pandas
Pandas是一個python的開源庫,它基於Numpy,提供了多種高效能且易於使用的資料結構。Pandas最初被用作金融資料分析工具而開發,由於它有著強大的功能,目前廣泛應用於資料分析、機器學習以及量化投資等。下面來跟隨作者一起認識下Pandas吧!
1 如何開始
Pandas安裝方式十分簡單,如果使用Anaconda,Anaconda預設就已經為我們安裝好了Pandas,直接拿來用就可以了,推薦使用這種方式。
如果不用Anaconda,只需執行如下命令即可:
pip install pandas
像其他python庫一樣,使用之前需要匯入,通常採用如下方式:
import pandas as pd
2 Pandas資料結構
Pandas的資料結構包括 Series
、 DataFrame
以及 Panel
,這些資料結構基於 Numpy
,因此效率很高。其中 DataFrame
最為常用,是Pandas最主要的資料結構。所有Pandas資料結構都是值可變的,除 Series
外都是大小(Size)可變的, Series
大小不可變。
Series
Series
是一維的類似的陣列的物件,它包含一個陣列的資料(任意NumPy的資料型別)和一個與陣列關聯的索引 。
>>> import pandas as pd>>> import numpy as np>>> s = pd.Series(np.random.randn(4))>>> s0 0.1027801 1.5230012 1.7700673 0.437553dtype: float64
可以看到Pandas預設為我們生成了索引,它的結構如下表所示:
0 | 1 | 2 | 3 |
---|---|---|---|
0.102780 | 1.523001 | 1.770067 | 0.437553 |
我們也可以使用 index
關鍵字為其指定索引:
>>> s = pd.Series(np.random.randn(4), index=['a', 'b', 'c', 'd'])>>> sa -0.316668b 0.083363c -0.520227d -1.024034dtype: float64
DataFrame
DataFrame是二維的、類似表格的物件,是使用最為廣泛的Pandas資料結構。DataFrame有行和列的索引,訪問便捷。它可以被看作是Series的字典:
>>> data = {'name': ['張三', '李四', '王五'],... 'gender': ['M', 'F', 'M'],... 'height': [174, 160, 185],... 'weight': [80, 48, 70]}>>> frame = pd.DataFrame(data)>>> frame name gender height weight0 張三 M 174 801 李四 F 160 482 王五 M 185 70
結構如下表所示
name | gender | height | weight | |
---|---|---|---|---|
0 | 張三 | M | 174 | 80 |
1 | 李四 | F | 160 | 48 |
2 | 王五 | M | 185 | 70 |
一方面,我們可以使用 columns
關鍵字指定DataFrame列的順序,DataFrame的列將會嚴格按照 columns
所指定的順序排列;另一方面,與Series相同,我們可以使用 index
關鍵字為其指定索引:
>>> frame2 = pd.DataFrame(data, columns=['name', 'gender', 'weight'],... index=['one', 'two', 'three'])>>> >>> frame2 name gender weightone 張三 M 80two 李四 F 48three 王五 M 70
需要注意的是,DataFrame的同一列允許有不同型別的值(數字,字串,布林等),這便意味著:我們可以將 王五
的 weight
設定為 F
。
3 資料訪問和遍歷
DataFrame支援按下標訪問:
>>> frame2.iloc[0]
name 張三
gender M
weight 80
Name: one, dtype: object
>>> frame2.iloc[0]['weight']
80
也支援按索引訪問:
>>> frame2.loc['two']
name 李四
gender F
weight 48
Name: two, dtype: object
>>> frame2.loc['two']['name']
'李四'
因此,DataFrame也支援如下兩種遍歷方式:
>>> for i in range(0, len(frame2)):... print(frame2.iloc[i])*** 輸出結果略 ***
>>> for index, row in frame2.iterrows():... print(row)*** 輸出結果略 ***
4 新增和刪除列
如果我們想增加一列,也非常方便,如計算BMI指數:
>>> frame['BMI'] = frame['weight']/(frame['height']*frame['height']/10000)>>> frame name gender height weight BMI0 張三 M 174 80 26.4235701 李四 F 160 48 18.7500002 王五 M 185 70 20.452885
僅需一行程式碼而無需遍歷。
刪除列:
>>> del frame2['gender']>>> frame2 name weightone 張三 80two 李四 48three 王五 70
5 新增和刪除行
新增行
>>> frame3 = pd.DataFrame([['小紅', 46], ['小明', 68]], columns = ['name', 'weight'], index=['four', 'five'])>>> frame4 = frame2.append(frame3)>>> frame4 name weightone 張三 80two 李四 48three 王五 70four 小紅 46five 小明 68
刪除行
>>> frame4.drop('four') name weightone 張三 80two 李四 48three 王五 70five 小明 68
6 資料篩選
按下標取出前兩條記錄
>>> frame[:2] name gender height weight BMI0 張三 M 174 80 26.423571 李四 F 160 48 18.75000
按其他條件篩選
如找到BMI>20的記錄:
>>> mask = (frame['BMI'] > 20)>>> frame.loc[mask] name gender height weight BMI0 張三 M 174 80 26.4235702 王五 M 185 70 20.452885
DataFrame還支援許多其他的操作,篇幅有限,在此不一一展開。
7 Panel
Panel是三維的資料結構,可以看作是DataFrame的字典,這種資料結構使用很少,此處略過不提。
Pandas實戰
學習技術是為了更好的工作和生活,拋開應用,技術也就失去了存在的意義。本文開篇中提到,Pandas作為資料分析工具的一個重要應用場景是量化投資,在此我想分享一下使用pandas的一個場景:
我想篩選出A股市場中過去60個交易日表現好的那些股票。關於表現好,也許每個人都有自己的看法,我的標準如下
漲幅夠大,區間累計漲幅達60%以上
回撤小,區間內任意單個交易日跌幅不超過7%,包括高開低走7%(套人的不算好股票);區間內任意連續兩個交易日累計跌幅不超過10%,包括連續兩個交易日高開低走10%
我使用的資料來源是TuShare,它提供了A股復權日線圖,不過它沒有提供復權資料的每日漲跌幅,所以我們需要對他進行處理:
>>> import tushare as ts>>> import talib as tl>>> data = ts.get_k_data('300573', autype='qfq')>>> data['p_change'] = tl.ROC(data['close'], 1)
此處使用了TALib,一個開源的金融資料分析工具。
完成初步的資料處理之後,我們就可以執行篩選條件了,擷取程式碼片段如下:
threshold = 60
if len(data) < threshold:
return False
data = data.tail(n=threshold)
ratio_increase = (data.iloc[-1]['close'] - data.iloc[0]['close']) / data.iloc[0]['close']
if ratio_increase < 0.6:
return False
for i in range(1, len(data)):
if data.iloc[i - 1]['p_change'] < -7 \
or (data.iloc[i]['close'] - data.iloc[i]['open'])/data.iloc[i]['open'] * 100 < -7 \
or data.iloc[i - 1]['p_change'] + data.iloc[i]['p_change'] < -10 \
or (data.iloc[i]['close'] - data.iloc[i - 1]['open']) / data.iloc[i - 1]['open'] * 100 < -10:
return False
return True
最後的結果如下:
[('603986', '兆易創新'), ('603882', '金域醫學'), ('603501', '韋爾股份'), ('300782', '卓勝微'), ('300622', '博士眼鏡'), ('300502', '新易盛'), ('300492', '山鼎設計'), ('300433', '藍思科技'), ('300223', '北京君正'), ('002917', '金奧博'), ('002892', '科力爾'), ('002876', '三利譜'), ('002850', '科達利'), ('002819', '東方中科'), ('002600', '領益智造'), ('002241', '歌爾股份'), ('000049', '德賽電池')]
可以看到其中科技股獨領風騷,誰讓我們大A是科技牛呢?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2661013/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python資料分析之pandasPython
- Python資料分析之Pandas篇Python
- 資料分析---pandas模組
- Python - pandas 資料分析Python
- 使用pandas進行資料分析
- Pandas之:深入理解Pandas的資料結構資料結構
- pandas 學習(1): pandas 資料結構之Series資料結構
- pandas 學習(2): pandas 資料結構之DataFrame資料結構
- Python 資料科學之 PandasPython資料科學
- 資料分析-pandas資料處理清洗常用總結
- Python資料分析(二): Pandas技巧 (1)Python
- Python資料分析庫pandas基本操作Python
- Python資料分析(二): Pandas技巧 (2)Python
- Python資料分析之 pandas彙總和計算描述統計Python
- Python資料分析庫之pandas,你該這麼學!No.1Python
- 資料分析實際案例之:pandas在泰坦尼特號乘客資料中的使用
- 資料分析實際案例之:pandas在餐廳評分資料中的使用
- Pandas 資料分析——Merge 資料拼接圖文詳解
- 利用Tushare資料介面+pandas進行股票資料分析
- 資料預處理之 pandas 讀表
- Pandas 資料分析——超好用的 Groupby 詳解
- 用 Python 進行資料分析 pandas (一)Python
- Python入門教程—資料分析工具PandasPython
- Pandas 資料分析 5 個實用小技巧
- Python利用pandas處理資料與分析Python
- python-資料分析-Pandas-3、DataFrame-資料重塑Python
- Pandas庫基礎分析——資料生成和訪問
- 多快好省地使用pandas分析大型資料集
- pandas-profiling資料分析預覽
- python-資料分析-Pandas-1、Series物件Python物件
- Pandas之:Pandas高階教程以鐵達尼號真實資料為例
- python-資料分析-Pandas-4、DataFrame-資料透視Python
- 新一代資料分析利器:Google Dremel原理分析KLGoREM
- 基於python的大資料分析實戰學習筆記-pandas之DataFramePython大資料筆記
- SQL與Pandas大資料分析效能對比(Haki Benita)SQL大資料
- 大資料平行計算利器之MPI/OpenMP大資料
- [譯] 使用 Pandas 對 Kaggle 資料集進行統計資料分析
- Python資料分析 Pandas模組 基礎資料結構與簡介Python資料結構