学习笔记(三)
1.Fama-French三因子,计算SMB、HML
1)首先对因子分组,两种方法,map或where
data[‘HL’] = data[0].map(lambda x:‘H’ if x>50 else ‘L’)
data[‘HL1’] = np.where(data[0]>50,‘H’,‘L’)
如果分位数有两个(a和b,b>a),需要做两次map,但更推荐np.where,只需要一行
a,b = pd.quantile([0.3,0.7])
#a是第(n+1)*0.3个数,若非整数,则取相邻两个数中间
data[‘SB’] = data[1].map(lambda x:‘B’ if x>50 else ‘S’)
data[‘SB’] = data.apply(lambda x: ‘B’ if x[2]>b else data[‘SB’],axis = 1)
data[‘SB1’] = np.where(data[2]>b,‘B’,np.where(data[2]<a,‘S’,‘M’))
2)取出不同的组,例如取出B和H
data_BH = data.query(’(SB==“B”) & (HL==“H”)’)
需要注意query里面的写法,SB和HL是data的列,不加引号
3)取出不同组之后,计算多空收益率即可
2.最大值,df是一个dataframe
df.max()默认对列
df.max(axis=1),每一行计算最大值
np.maximum(a,b),可以用于期权
df.idxmax()默认对列,取出每列最大值的索引
df.idxmax(axis = 1)取出每行最大值的索引
3.对dataframe的列名重命名,使用字典形式
data = data.rename(columns = {‘0_HL’:‘HL’})
需要加columns,不加的话,默认对行索引
4.对Series相加相减,必须有相同的index,否则报错
若是dataframe相加,也会根据相同的index相加,若有nan,则相加后还是nan
若一定要相加,可以reset_index(drop=True)之后相加
如果对于nan和另一个数,想保留另一个数,可以fillna(0)之后相加
5.缺失值处理,np.nan不是np.nan
df.iloc[7,2] = np.nan #先令df第八行,第三列的数变成np.nan
df.iloc[7,2] == np.nan #再判断它是不是np.nan,结果报False
需要用别的判断方式
np.isnan(df.iloc[7,2])
pd.isnull(df.iloc[7,2])
pd.notnull(df.iloc[7,2])
有时候算收益率的时候,会出来inf,因为前面的数据是0,不要轻易fillna(0)。
如何剔除nan、inf?
df[~df.isin([np.nan,np.inf]).any(1)]#如果包含nan、inf,取反之后返回False,any(1)表示,只有全部为True,才返回True,any里面的1是指axis=1,对行
df.dropna(how=‘any’,axis=1) #dropna里面的axis=1,表示对列,某列里只要有np.nan,就删掉
how=‘any’/how=‘all’/thresh=10,axis=0
any表示有False的行全删掉
all表示全部是False的行才删掉
thresh=10表示某行有10个以下的观察值,才删掉它
例如说要筛选出上市一年以上的股票,threth=252
df[‘b’].str.contains(‘a’)
这个函数要求df[‘b’]列只有str,可以用来看是否有包含a这个字母
实际运用中,可以拿来筛选某个地区有哪些股票
df[‘b’].str.contains(‘浙江’)