【PY從0到1】 一文掌握Pandas量化進階

# 一文掌握Pandas量化進階

# 這節課學習Pandas更深的內容。

# 導入庫:
import numpy as np
import pandas as pd

# 製做DataFrame
np.random.seed(10)
period = pd.date_range('2017-1-1', periods=10000, freq='D')
df = pd.DataFrame(np.random.randn(10000, 4),
                  columns=['Data1', 'Data2', 'Data3', 'Data4'],
                  index = period)
print(df.head())
#                Data1     Data2     Data3     Data4
# 2017-01-01  1.331587  0.715279 -1.545400 -0.008384
# 2017-01-02  0.621336 -0.720086  0.265512  0.108549
# 2017-01-03  0.004291 -0.174600  0.433026  1.203037
# 2017-01-04 -0.965066  1.028274  0.228630  0.445138
# 2017-01-05 -1.136602  0.135137  1.484537 -1.079805

# 1> Group操做

# ① 一重分組
df['G1'] = np.random.choice(['A','B','C','D'],10000) # 新加一列用做分組。
grouped = df.groupby('G1')
print(grouped.size()) # 查看分組狀況。
# G1
# A    2484
# B    2491
# C    2502
# D    2523
# dtype: int64

grouped.sum() # 分組求和
grouped.max() # 尋找分組最大的
grouped.mean() # 分組求平均 
grouped.describe() # 分組統計量
np.transpose(grouped.describe()) # 轉置

print(grouped.get_group('A').head()) # 挑出分組爲A的DataFrame。

# ②雙重分組
# 再創建一個分組
df['G2'] = np.random.choice(['S','Y'],10000)
grouped = df.groupby(['G1','G2']) # 哪一個分組在前面就先按哪一個分組分類。

# 聚合運算。按G一、G2分組後,分別求Data1和Data2的平均值和最大值。
print(grouped.agg({'Data1':np.mean, 'Data2':np.max})) 


# 2> 合併操做

# 創建DataFrame
df1 = pd.DataFrame(['1','2','3','4'],
                   index=['a','b','c','g'],
                   columns=['A'])

df2 = pd.DataFrame(['5','6','7','8'],
                   index=['a','b','e','f'],
                   columns=['B'])

# ① 用concat合併DataFrame
df = pd.concat((df1,df2),axis=1,ignore_index=False) # 橫向合併
print(df)
#      A    B
# a    1    5
# b    2    6
# c    3  NaN
# g    4  NaN
# e  NaN    7
# f  NaN    8
# 自動按索引合併,爲空不會報錯。

# ② DataFrame內置合併方法

df = pd.DataFrame({'A': df1['A'], 'B': df2['B']}) 

 
# ③ Join操做(有條件的合併)

df1.join(df2,how='left') # 按df1的索引合併,left是默認值,還能夠寫right,inner,outer。


# ④ Merge操做
df1 = pd.DataFrame(['1','2','3','4'],
                   index=['a','b','c','d'],
                   columns=['A',])

df2 = pd.DataFrame(['5','6','7','8'],
                   index=['a','b','c','d'],
                   columns=['B',])

c = pd.Series(['10','11','12','13'],
              index=['a','b','c','d'])



# df1和df2都新增一列。
df1['C'] = c   
df2['C'] = c

# 合併
print(pd.merge(df1,df2,on='C')) # 該函數默認將同樣的列合併。on的默認值在這裏就是C.
#    A   C  B
# 0  1  10  5
# 1  2  11  6
# 2  3  12  7
# 3  4  13  8
# 索引會重置。
# 注意,慎用這裏的on參數.當C內的數據有重複時,用on參數達不到預想的合併效果。
# 轉而用下面的方法合併。(根據索引合併)
print(pd.merge(df1,
         df2, 
         left_index=True, 
         right_index=True, 
         suffixes=['_df1','_df2']))
#    A C_df1  B C_df2
# a  1    10  5    10
# b  2    11  6    11
# c  3    12  7    12
# d  4    13  8    13
# 其中還有how參數,inner和outer。當df1和df2不一樣長度時,讀者能夠本身嘗試下效果。


# 3> 層次化索引

np.random.seed(10)
df = pd.Series(np.random.randn(5),                 
               index=[['a', 'a', 'b','b', 'b'],
                      [1,2,1,2,3]])
print(df)
# a  1    1.331587
#    2    0.715279
# b  1   -1.545400
#    2   -0.008384
#    3    0.621336
# a,b爲level 0,123爲level 1。
# dtype: float64

# 用unstack()從新排列
df.unstack()
df.unstack().T # 轉置
df.unstack().stack() # 逆運算

print(df.sum(level=0)) # 按level0聚合
# a    2.046865
# b   -0.932448
# dtype: float64
print(df.sum(level=1)) # 按level1聚合
# 1   -0.213814
# 2    0.706895
# 3    0.621336
# dtype: float64
相關文章
相關標籤/搜索