1,pandas的字符筛选
df1= df[df.基金名称.str.contains('sb')]
df2= df[df.基金名称.str.contains('yl')]
df3 = df[df.基金名称.str.contains('sb|yl')
对于特殊字符的筛选,遵循正则法则加\
df4 = df[df.code.str.contains('\.SZ|\.SH')
2,利率债,信用债判别
(1)发行人:财政局,农业发展银行,开发银行,进出口银行 ->利率债
lilv = df.发行人.str.contains('财政|农业发展银行|开发银行|进出口银行')
(2)类别判别:国债,政策性金融债,地方政府债,央行票据
lilv = (df.证券类别 == '国债') | (df.证券类别 == '政策性金融债')
df_yinhang.loc[lilv,'类别'] = '利率债'
df_yinhang.loc[~lilv,'类别'] = '信用债'
wind二级行业分类:政策银行债 为 利率债
3,修改日期格式
df['买卖时间'] = df['date'].apply(lambda x: \
x[0:4]+'年'+x[5:7]+'月'+x[8:]+'日')
4,修改需要字段
df.loc[df.clo== 'a','new_col'] = '1'
df.loc[df.col == 'b','new_col'] = '2'
df.loc[(df.col!='a') & (df.col!='b'),'new_col'] = '3'
df['new_col']= df.col.map({'a':'1','b':'0'})
df['new_col'].fillna('3',inplace=True)
对于非a,b的字段可以在map后用fillna填充
5,去掉字符和增加字符
注意,这是series的性质,而非dataframe,即使只有一列的dataframe,也没有.str的性质
(1)去掉某些字符
只要组合前面的字段
df.str.split('组合').str[0]
(2)增加某些字符
df.str.cat(len(df)*['组合'])
6,连接wind api
不知为何 要先w.start()
我记得之前是不需要的...
from WindPy import w
w.start()
7,wind api 常用函数总结
(1) 交易代码转证券代码
目前还找不到简称转wind id(问了几次客服,言左右顾其他,我觉得就是没有)
简称转wind id 可以先用excel 插件的功能函数刷一下
交易代码转证券代码 cg -> 工具 -> 指标转换
a = W.w.htocode(str(security),'bond',usedf=True).Data
b = pd.DataFrame(a).T
这里很奇怪,不加usedf=True不出来结果,加了也要用.Data来取数,取出来还是list格式,还要再转成Dataframe
(2)基本资料(发行人,分类)
这里在多维数据和日期数据都有,不想再加日期,就直接用多维数据即可
# 发行人,wind2级行业分类
a = W.w.wss("104506.IB", "issuerupdated,windl2type",usedf=True)
8,修改部分columns或index
df = df.rename(index={'北京':'bj'}, columns={'北京':'bj'})
9,连接数据库操作
主要问题是要对应代码
import pfms
df['基金代码'] = df['基金代码'].astype(str).str.zfill(6)
df['sql_ID'] = pd.Series(['PORT.']*len(df)).str.cat(df['基金代码'])
fund_tuple = tuple(df['sql_ID')
sql = """...{}
""".format(fund_tuple)
df2 = pd.read_sql(sql, pfms.pfms_sql)
df2.columns = ['sql_ID','规模']
df_f = pd.merge(df,df2,on='sql_ID')
10,空的位置用另一列填补fillna(可以加一列)
df['A列'].fillna(df['B列'],inplace=True)
网友评论