# 2【PY從0到1】 一文掌握Pandas量化基礎 # Numpy和pandas是什麼關係呢? # 在我看來,np偏向於數據細節處理,pd更偏向於表格總體的處理。 # 要記住的pd內部的數據結構採用的是array,因此np是pd地基。 # 下面就讓咱們來看看pandas的基本使用方法。 # 導入庫: import numpy as np import pandas as pd import warnings; warnings.simplefilter('ignore') # 1> Series的構建與使用 # Series是最簡單的pd裏的數據結構。 # 用pd.Series創建。 # 這與np.array有殊途同歸之處。 # 要注意的是pd支持列表,也支持傳入字典。 df = pd.Series([1,2,3,4,5,6]) df2 = pd.Series({'a':1,'b':2,'c':3}) print(type(df.values)) # 咱們能夠看到df的類型是ndarray:<class 'numpy.ndarray'> # 兩個查看DataFrame的方法: df.head() # 查看前五個 df.tail() # 查看後五個 # pd的索引和表格名稱 df.name = 'Series1' df.index.name = '序號' print(df.head()) # 序號 # 0 1 # 1 2 # 2 3 # 3 4 # 4 5 # Name: Series1, dtype: int64 # 咱們在生成Series時也能夠指定索引名稱。 df = pd.Series(range(3,9), index = ['a', 'b', 'c', 'd', 'e','f']) # 2> Series切片 # Series裏的切片所有根據索引進行的。 df[0] df['a'] df[1:3] df[['a','d']] print(df['c':'d']) # 注意用索引切片是有頭有尾的。 # c 5 # d 6 # dtype: int64 # 2> DataFrame的構建 # DataFrame能夠當作是無數個Series組成的表格。 # ① 用np.DataFrame()創建 # 這裏一樣能夠給pd傳入列表或字典。 np.random.seed(10) df = np.random.randint(-5,6,size=(5,6)) df = pd.DataFrame(df, columns = ['a', 'b', 'c', 'd','e','f'], index = [1,2,3,4,5]) print(df.head(2)) # a b c d e f # 1 -1 1 5 4 -5 -1 # 2 5 1 -1 4 3 -5 # 3> DaraFram的切片 # ① 經過標籤獲取 df['a',axis=1] # 獲取a列。*也能夠寫成df.a df[['a']] # 返回值能夠包括列標籤。 # df.ix[0] # 新版pandas已經刪除。 df.loc[1] # 獲取行標籤爲1的行。 df.loc[[1]] # 返回值能夠包括行標籤。 df.loc[[1,3,5]] # 獲取第1,3,5行。 df.loc[1:5] # 獲取1到5行,有頭有尾。 df.loc[[1,3],['b']] # 選取一三行和b列 # **作切片時,用索引切就是有頭無尾,用標籤切就是有頭有尾。 # ② 按索引位置切片 df.iloc[1:3] # 按索引從0到3(不包括3) df.iloc[0:2,0] #三行索引0到2,列索引0 # 4> DataFrame重要屬性與修改 print(df.index) # 獲取索引名 # 輸出以下:Int64Index([1, 2, 3, 4, 5], dtype='int64') df.columns # 獲取列名 df.sum() # 按列求和,axis=1爲按行求和。 df.mean() # 求平均數。 df.cumsum() # 按列累計求和。 df.describe() # 求經常使用統計量。 df.rename(columns={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E', 'f':'F'},index={1:'one'}, inplace=True) # 對列和行標籤修改,並替換原df print(df) # A B C D E F # one -5 1 -4 -2 4 4 # 2 1 -1 0 5 5 3 # 3 5 5 -5 -3 4 -3 # 4 2 3 -4 -2 5 -4 # 5 3 0 0 3 -1 1 df[:] = df[:].astype('f') # 數據改成浮點數。 df['G'] = pd.DataFrame(np.arange(5,dtype='f'), index=['one',2,5,4,3]) # 增長一列 del(df['G']) # 刪除一列 np.random.seed(100) df1 = pd.DataFrame(np.random.random((6,3)), columns = ['a', 'b','c']) df2 = pd.DataFrame(np.random.random((3,3)), columns = ['a', 'b', 'c']) df3 = df1 + df2 print(df3) # a b c # 0 1.359630 0.552443 0.856222 # 1 1.784806 0.822368 0.457681 # 2 0.846160 1.198685 0.142395 # 3 NaN NaN NaN # 4 NaN NaN NaN # 5 NaN NaN NaN # 出錯的地方pd會自動補齊NaN df3.fillna(0, inplace=True) # 將NaN的值替換爲0。 # 5> DataFrame條件選值 print(df) # A B C D E F # one 4.0 -1.0 -5.0 -4.0 4.0 -5.0 # 2 -4.0 5.0 3.0 4.0 -5.0 5.0 # 3 3.0 1.0 -1.0 -2.0 -5.0 -1.0 # 4 1.0 3.0 5.0 -4.0 3.0 -1.0 # 5 -4.0 -2.0 1.0 0.0 -2.0 4.0 print(df[df.A > 0]) # 選出A列大於零的全部行。相同的寫法:df[df[A]>0] # A B C D E F # one 4.0 -1.0 -5.0 -4.0 4.0 -5.0 # 3 3.0 1.0 -1.0 -2.0 -5.0 -1.0 # 4 1.0 3.0 5.0 -4.0 3.0 -1.0 # 多條件選行: df[(df.A > 0)|(df.B > 0)|(df.C > 0)] df[(df.A > 0) * 1 + (df.B > 0) * 1 == 2] # A和B都大於0的行 df[(df.A > 0) * 1 + (df.B > 0) * 1 >= 1] # A和B只要有一個大於0的行 # 6> DataFrame的Apply函數 np.random.seed(12) # 隨機種子 a = np.random.randn(9, 6) # 生成九行六列的Ndarray a.round(5) # 保留五位小數 df = pd.DataFrame(a) # 創建DataFrame dates = pd.date_range('2017-1-1', periods=9, freq='5D') # 生成時間,periods爲數據量,freq爲數據間隔。 column = ['a','b','c','d','e','f'] #行標籤 df.index = dates # 指定索引 df.columns = column # 指定行標籤 def square_fun(x): a = x**2 return a df.apply(square_fun,axis=0) # 將df數據所有用square_fun函數計算。或 df.apply(lambda x: x ** 0.5) # axis=0爲按列,axis=1爲按行。 # 7> DataFrame的排序 df.sort_index(ascending=False) # 按索引升序排列,將ascending改成True是降序。 df.sort_index(axis=1,ascending=False) # 按行標籤升序排列。 df.sort_values(by= 'b', ascending= False) # 按b列升序排列。 # 8> DataFrame 處理缺失值 df_nan = np.sqrt(df).head() print(df_nan) # 對df元素開方。 # a b c d e f # 2017-01-01 0.687740 NaN 0.492381 NaN 0.867838 NaN # 2017-01-06 0.071604 NaN NaN 1.694644 NaN 0.687355 # 2017-01-11 1.046879 NaN 1.158601 NaN 1.006238 NaN # 2017-01-16 NaN 1.099907 0.708429 0.372621 0.800476 0.726177 # 2017-01-21 NaN NaN NaN NaN NaN NaN # df_nan.isnull() # 判斷df_nan中的空值。 # df_nan.dropna() # 刪除df_nan中的空值(行中有空值就會刪除這一行)。axis=1(列中有空值就會刪除這一列) df_nan.fillna(0,inplace=True) # 空值用0填充,並替換df_nan. print(df_nan.round(3)) # a b c d e f # 2017-01-01 0.688 0.0 0.492 0.000 0.868 0.000 # 2017-01-06 0.072 0.0 0.000 1.695 0.000 0.687 # 2017-01-11 1.047 0.0 1.159 0.000 1.006 0.000 # 2017-01-16 0.000 1.1 0.708 0.373 0.800 0.726 # 2017-01-21 0.000 0.0 0.000 0.000 0.000 0.000
# 2【PY從0到1】 一文掌握Pandas量化基礎
# Numpy和pandas是什麼關係呢?# 在我看來,np偏向於數據細節處理,pd更偏向於表格總體的處理。# 要記住的pd內部的數據結構採用的是array,因此np是pd地基。# 下面就讓咱們來看看pandas的基本使用方法。
# 導入庫:import numpy as npimport pandas as pdimport warnings; warnings.simplefilter('ignore')
# 1> Series的構建與使用# Series是最簡單的pd裏的數據結構。
# 用pd.Series創建。# 這與np.array有殊途同歸之處。# 要注意的是pd支持列表,也支持傳入字典。df = pd.Series([1,2,3,4,5,6])df2 = pd.Series({'a':1,'b':2,'c':3})print(type(df.values)) # 咱們能夠看到df的類型是ndarray:<class 'numpy.ndarray'>
# 兩個查看DataFrame的方法:df.head() # 查看前五個df.tail() # 查看後五個
# pd的索引和表格名稱df.name = 'Series1'df.index.name = '序號'print(df.head())# 序號# 0 1# 1 2# 2 3# 3 4# 4 5# Name: Series1, dtype: int64
# 咱們在生成Series時也能夠指定索引名稱。df = pd.Series(range(3,9), index = ['a', 'b', 'c', 'd', 'e','f'])
# 2> Series切片# Series裏的切片所有根據索引進行的。df[0]df['a']df[1:3]df[['a','d']]print(df['c':'d']) # 注意用索引切片是有頭有尾的。# c 5# d 6# dtype: int64
# 2> DataFrame的構建# DataFrame能夠當作是無數個Series組成的表格。
# ① 用np.DataFrame()創建# 這裏一樣能夠給pd傳入列表或字典。np.random.seed(10)df = np.random.randint(-5,6,size=(5,6))df = pd.DataFrame(df, columns = ['a', 'b', 'c', 'd','e','f'], index = [1,2,3,4,5])print(df.head(2))# a b c d e f# 1 -1 1 5 4 -5 -1# 2 5 1 -1 4 3 -5
# 3> DaraFram的切片
# ① 經過標籤獲取df['a',axis=1] # 獲取a列。*也能夠寫成df.adf[['a']] # 返回值能夠包括列標籤。# df.ix[0] # 新版pandas已經刪除。df.loc[1] # 獲取行標籤爲1的行。df.loc[[1]] # 返回值能夠包括行標籤。df.loc[[1,3,5]] # 獲取第1,3,5行。df.loc[1:5] # 獲取1到5行,有頭有尾。df.loc[[1,3],['b']] # 選取一三行和b列# **作切片時,用索引切就是有頭無尾,用標籤切就是有頭有尾。
# ② 按索引位置切片df.iloc[1:3] # 按索引從0到3(不包括3)df.iloc[0:2,0] #三行索引0到2,列索引0
# 4> DataFrame重要屬性與修改print(df.index) # 獲取索引名# 輸出以下:Int64Index([1, 2, 3, 4, 5], dtype='int64')df.columns # 獲取列名df.sum() # 按列求和,axis=1爲按行求和。df.mean() # 求平均數。 df.cumsum() # 按列累計求和。df.describe() # 求經常使用統計量。df.rename(columns={'a':'A', 'b':'B', 'c':'C', 'd':'D', 'e':'E', 'f':'F'},index={1:'one'}, inplace=True) # 對列和行標籤修改,並替換原dfprint(df)# A B C D E F# one -5 1 -4 -2 4 4# 2 1 -1 0 5 5 3# 3 5 5 -5 -3 4 -3# 4 2 3 -4 -2 5 -4# 5 3 0 0 3 -1 1
df[:] = df[:].astype('f') # 數據改成浮點數。
df['G'] = pd.DataFrame(np.arange(5,dtype='f'), index=['one',2,5,4,3]) # 增長一列del(df['G']) # 刪除一列
np.random.seed(100)df1 = pd.DataFrame(np.random.random((6,3)), columns = ['a', 'b','c'])df2 = pd.DataFrame(np.random.random((3,3)), columns = ['a', 'b', 'c'])df3 = df1 + df2 print(df3)# a b c# 0 1.359630 0.552443 0.856222# 1 1.784806 0.822368 0.457681# 2 0.846160 1.198685 0.142395# 3 NaN NaN NaN# 4 NaN NaN NaN# 5 NaN NaN NaN# 出錯的地方pd會自動補齊NaNdf3.fillna(0, inplace=True) # 將NaN的值替換爲0。
# 5> DataFrame條件選值print(df)# A B C D E F# one 4.0 -1.0 -5.0 -4.0 4.0 -5.0# 2 -4.0 5.0 3.0 4.0 -5.0 5.0# 3 3.0 1.0 -1.0 -2.0 -5.0 -1.0# 4 1.0 3.0 5.0 -4.0 3.0 -1.0# 5 -4.0 -2.0 1.0 0.0 -2.0 4.0
print(df[df.A > 0]) # 選出A列大於零的全部行。相同的寫法:df[df[A]>0]# A B C D E F# one 4.0 -1.0 -5.0 -4.0 4.0 -5.0# 3 3.0 1.0 -1.0 -2.0 -5.0 -1.0# 4 1.0 3.0 5.0 -4.0 3.0 -1.0
# 多條件選行:df[(df.A > 0)|(df.B > 0)|(df.C > 0)]df[(df.A > 0) * 1 + (df.B > 0) * 1 == 2] # A和B都大於0的行df[(df.A > 0) * 1 + (df.B > 0) * 1 >= 1] # A和B只要有一個大於0的行
# 6> DataFrame的Apply函數np.random.seed(12) # 隨機種子a = np.random.randn(9, 6) # 生成九行六列的Ndarraya.round(5) # 保留五位小數df = pd.DataFrame(a) # 創建DataFramedates = pd.date_range('2017-1-1', periods=9, freq='5D') # 生成時間,periods爲數據量,freq爲數據間隔。column = ['a','b','c','d','e','f'] #行標籤df.index = dates # 指定索引df.columns = column # 指定行標籤
def square_fun(x): a = x**2 return a
df.apply(square_fun,axis=0) # 將df數據所有用square_fun函數計算。或 df.apply(lambda x: x ** 0.5)# axis=0爲按列,axis=1爲按行。
# 7> DataFrame的排序
df.sort_index(ascending=False) # 按索引升序排列,將ascending改成True是降序。df.sort_index(axis=1,ascending=False) # 按行標籤升序排列。df.sort_values(by= 'b', ascending= False) # 按b列升序排列。
# 8> DataFrame 處理缺失值
df_nan = np.sqrt(df).head()print(df_nan) # 對df元素開方。# a b c d e f# 2017-01-01 0.687740 NaN 0.492381 NaN 0.867838 NaN# 2017-01-06 0.071604 NaN NaN 1.694644 NaN 0.687355# 2017-01-11 1.046879 NaN 1.158601 NaN 1.006238 NaN# 2017-01-16 NaN 1.099907 0.708429 0.372621 0.800476 0.726177# 2017-01-21 NaN NaN NaN NaN NaN NaN
# df_nan.isnull() # 判斷df_nan中的空值。# df_nan.dropna() # 刪除df_nan中的空值(行中有空值就會刪除這一行)。axis=1(列中有空值就會刪除這一列)df_nan.fillna(0,inplace=True) # 空值用0填充,並替換df_nan.print(df_nan.round(3))# a b c d e f# 2017-01-01 0.688 0.0 0.492 0.000 0.868 0.000# 2017-01-06 0.072 0.0 0.000 1.695 0.000 0.687# 2017-01-11 1.047 0.0 1.159 0.000 1.006 0.000# 2017-01-16 0.000 1.1 0.708 0.373 0.800 0.726# 2017-01-21 0.000 0.0 0.000 0.000 0.000 0.000數據結構