1. 程式人生 > 其它 >python-量化交易-2-pandas資料讀取

python-量化交易-2-pandas資料讀取

技術標籤:量化交易python

讀取資料到一個數據框架中,dataframe = pd.read_csv(file_path,index_col = [‘交易日期’],error_bad_lines = False)

1.常見引數

指定編碼方式

encoding = ‘gbk’

跳過第一行資料

Skiprows = 1,

將某一列的資料作為下標索引

index_col = ['交易日期']

僅讀取前n行資料

n_rows = n

只讀取特定的列

usecols = ['股票程式碼''收盤價']

忽略存在空值的錯誤的行,

error_bad_lines = False

如果表格中出現了字串"null"將這個位置之別為變數NULL

na_values = 'null'

指定某一列的字串為實際上的時間戳: 這個引數會將字串的日期轉換為datetime格式的資料

parse_date = ['交易日期']

2.獲取指定元素

有兩種確定元素的方法:

1:label

df[index索引][列索引]
df[1999-9-9]['收盤價']

2:position

df[0,0]----->第一行第一個元素

3.檢視資料

取出行的數量

df.shape[0]

輸出每一列的名字

for _ in df.colums:
	print(_)

輸出資料型別:

print(df.dtypes)

隨機抽取三行

df.sample(
n = 3)

隨機抽取60%的資料

df.sample(frac = 0.6)

輸出對每一列的計數count,均值mean,標準差,最小值min,最大值max等(只對數字numerical型別的資料有效)

df.describe()

在列太多的時候可以不換行(拓展表示)-以展示資料全貌

pd.set_option('expand_frame_repr',False)

改變輸出資料的浮點數精度(不會改變資料本身)

pd.set_option('precision',1)

每一列的最大寬度:

pd.set_option('display.max_rows',100)

選取一列,返回一個series

#單列
#用一個括號[]返回的是series型別,兩個括號[[]]返回的是dataframe,且如果要使用多列索引,
#必須傳入一個label的list,也就是最裡面的括號中應當是一個字串list。
df['colum1']
df[['colum1']]
#多個列
df[['colum1','colum2','colum2']]

選取指定的兩行

df[['第一行的index','第二行的index']]

根據列名/行名,選取一定範圍內的多個列

df.loc[:,'列from':'列to']

df.loc['行from':'行to','列from':'列to']

#單獨一個:是“所有”

讀取指定位置的元素

df.loc['1999-9-9','收盤價']
df.at['1999-9-9','收盤價']

df.iloc 通過使用position來讀取資料 index-location------------>iloc

df.iloc[0]#讀取第一行 返回series型別

df.iloc[1:3]#第一到第二行(3是不包含的)
#對比---->loc--使用列名稱/行名稱進行索引,如果用的是df.loc[:,'AC.TO':'RY.TO'] 最後一個label會被包含在內

###4.對列進行操作

對整列進行加和操作(比如字串拼接,數字加和)

df['xxx']+'abcd'

df['xxx']*100

新增加一列:

#這一列所有的值是xxx
df['交易所'] = 'xxx'
#將新計算出來的結果作為新的一列
df['a+b'] = df['aaa']+df['bbb']

輸出兩列/行值的平均值:

#兩列
df[['xxx','yyy']].mean(axis = 0)#返回的結果是一個series
#一整行
df[['xxx','yyy']].mean(axis = 1)#返回的結果是一個series

### 收盤價 開盤價| 最高價 最低價

分位數(quantile(0.3))意味著排在第百分之3-%的數

fd['xxx'].quantile(0.3)

Shift 函式

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.shift.html

如果是負的就是向上移動

df.shift(periods=3)
            Col1  Col2  Col3
2020-01-01   NaN   NaN   NaN
2020-01-02   NaN   NaN   NaN
2020-01-03   NaN   NaN   NaN
2020-01-04  10.0  13.0  17.0
2020-01-05  20.0  23.0  27.0
df.shift(periods=3, fill_value=0)
            Col1  Col2  Col3
2020-01-01     0     0     0
2020-01-02     0     0     0
2020-01-03     0     0     0
2020-01-04    10    13    17
2020-01-05    20    23    27

刪除一列

del df['xxx']#一次只能刪除一個
df.drop(['收盤價'],axis = 1, inplace = True)
#一次可以刪多個,引數inplace是false,不會變更原來的資料,需要用變數接收返回的資料(開闢新的記憶體空間)
#inplace = True是直接在資料上做操作,可以不用返回值。(沒有開闢新的空間)

求漲跌幅:

df['收盤價'].diff(-1)

求漲跌幅變化的百分比pct_change()

df['收盤價'].pct_change(1)

計算累加(累計成交量)cummulative sum

df['累計成交量'] = df['成交量'].cumsum()
#計算的是從一開始到現在的求和
#cumprod()可以計算累計乘----類似於計算複利,比如每天是前一天的120%一年後這個數字變成了多少

排名:

df['收盤價'].rank(ascend = True)
#ascending ---->升序
#pct----->按照百分比進行排名
#如果排名中出現了0.5代表值有重複。

統計數字出現的頻率

df['xxx'].value_counts()

4.資料篩選

選取股票程式碼為BB.TO的資料

df[df['股票程式碼'] == 'RBC.TO']
#其中df['股票程式碼'] == 'RBC.TO'單純返回一個bool運算的結果,
#外層的df[]負責根據返回的布林運算結果進行列印

輸出該股票資料的index

df[df['股票程式碼'] == 'RBC.TO'].index

判斷我的股票程式碼是不是在一個列表裡面

輸出多個股票的dataframe

df[df['股票程式碼'].isin(['stock1','stock2','stock3'])]

如何處理多個條件?

#總之可以將條件放在
df[]中,返回對應的dataframe

#多條件寫法(中間的邏輯運算可以去與或者或等,只要是返回 布林結果即可)
df[條件1 & 條件2]
#例子
df[df['開盤價']>100 & df['收盤價']<200]


5. 空值處理

建立缺失值


#篩選出需要修改的行index
#找出所有股票時間等於2020-02-01的那一行。並返回下標
index = df[df['交易日期'].isin(['2020-02-01'])].index
#根據這些下標在表格中增加新的一列,並在股和要求的位置寫入交易日期
# 其他位置為NaN
#新的一列名為‘月頭’
df.loc[index,'月頭'] = df['交易日期']

刪除缺失值

df.dropna(subset = ['特徵1','特徵2','特徵3'],how = 'any')
# 這裡的how還有可能是‘all’
# 這種情況下只有subset中的特徵都為空的時候才會刪除這一行

補全缺失值

# 1
df.fillna(value = '需要將空值替換的值',inplace = True)
# inplcae = Trueb表示對資料本身進行操作,不用另外開闢記憶體
# 2
df['某一列'].fillna(value = '需要將空值替換的值')
#3 向上尋找並填充(forward fill)
# 向上尋找一個非空值並填充這個值-----填充非交易日的收盤價很有用
df['某一列'].fillna(method = 'ffill')
#4 向下尋找並填充(backward fill)
df['某一列'].fillna(method = 'bfill')

尋找缺失值

#找出缺失值:
df.isnull()
df.notnull()
#應用
df[df['收盤價'].isnull()]#將收盤價為空的行計算出來

將伺服器返回的資料變為list

stock_code_list = ['sh600000', 'sz000002', 'sh600002']
url = "http://hq.sinajs.cn/list=" + ",".join(stock_code_list)

# =====抓取資料
content = urlopen(url).read().decode('gbk')  # 從網路上獲取資訊
# print(content)
# exit()
# =====將資料轉換成DataFrame
content = content.strip()  # 去掉文字前後的空格、回車
# print(content)
# exit()
data_line = content.split('\n')  # 每行是一個股票的資料
# print(data_line)
# exit()
data_line = [i.replace('var hq_str_', '').split(',') for i in data_line]
# print(data_line)
# exit()
df = pd.DataFrame(data_line, dtype='float')  #

Extra

+ Split 函式
content = '1,2,3,4,5;;;;;'
print(f"content is {content}")
content = content.strip(';')
print(f"after strip \';\'content is {content}")
print(type(content))
content = content.split(',')
print(f"after split(,) content is {content}")
print(f"The data type is: {type(content)}")

==========output==========
content is 1,2,3,4,5;;;;;
after strip ';'content is 1,2,3,4,5
<class 'str'>
after split(,) content is ['1', '2', '3', '4', '5']
The data type is: <class 'list'>