【PY從0到1】 一文掌握Pandas量化基礎

# 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數據結構

相關文章
相關標籤/搜索