项目里计算量较大 需要用pandas算 这里记录一下常用操作
import pandas as pd
# 常用配置
pd.set_option('mode.chained_assignment', None)
# 显示所有列
pd.set_option('display.max_columns', 500)
# 显示所有行
pd.set_option('display.max_rows', 500)
# # 设置value的显示长度为100,默认为50
pd.set_option('max_colwidth', 1000)
pd.set_option('expand_frame_repr', False)
# 读csv
pd.read_csv(ALL_DATA_PATH)
# list创建df
df = pd.DataFrame([])
# round
data = data.round(2)
# in操作 这里的ptf_resource 可以是list 或者dict
data = data[data.portfolio.isin(ptf_resource)]
def to_timestamp(s):
s = str(s)
time_array = time.strptime(s, "%Y%m%d")
timestamp = int(time.mktime(time_array))
return timestamp * 1000
# group 操作
for ptf_data, ptf_group in trading_day_group.groupby('portfolio'):
# 新增列 apply一个方法
ptf_group['trading_day_timestamp'] = ptf_group.trading_day.apply(to_timestamp)
# df转dict
leaf_data = ptf_group.to_dict(orient='records')
# apply 多列
result['today_sell'] = result[['feedcode', 'today_sell']]. \
apply(lambda x: x['today_sell'] // 100 if volume_func(x['feedcode']) else x['today_sell'], axis=1)
# 一些字段求加和
node = df[
['pnl', 'fee', 'net_pnl', 'turnover', 'nominal', 'ystd_nominal', 'today_pnl', 'ystd_pnl', 'itd_pnl',
'itd_fee', 'ytd_pnl', 'ytd_fee']].sum()
# 查找某条件固定的值
all[all.portfolio_id==22198].iloc[0].pnl
# 追加到文件
pnl_data.to_csv(PNL_PATH, mode='a', encoding='utf-8', header=False, index=False)
# 新建文件
result2.to_csv('C:\\Users\\aaa\\Desktop\\result_0826.csv', index=False)
# 累加
tmp['ytd_pnl'] = tmp['pnl'].cumsum()
# 排序
feed_data.sort_values(by='trading_day')
# 转换时间格式
feed_data['trading_day2'] = pd.to_datetime(feed_data['trading_day2'], format='%Y%m%d')
# 重设index
feed_data = feed_data.set_index('trading_day2')
# 连接df
pd.concat(final_feed_data, axis=0)
# NaN 转换为0
result2 = result2.fillna(0)
#重设index
result2 = result2.reset_index()
# filter部分
new_pnl_data = pnl_data[pnl_data['trading_day'] < day]
# 或
new_pnl_data = pnl_data[pnl_data.trading_day < day]
# 调整列顺序
df = df[['user_id','book_id','rating','mark_date']] # 调整列顺序为'user_id','book_id','rating','mark_date'
# 调整index为从1开始
df.index = range(1,len(df) + 1)
# 重命名列名
a.rename(columns={'A':'a', 'B':'b', 'C':'c'}, inplace = True)
# 添加列名
df.columns = ['trading_day', 'iq', 'account_id']
# 取不包含
df = df[~df['underlying_code'].isin(['000300.SH', '159919.SZ', '510050.SH', '510300.SH'])]
#groupby 多列
df.groupby(['underlying_code', 'group_tag']).sum()
# 将index列转换为普通列
df_g = df_g.reset_index('group_tag', drop=False)
# 删除列,不存在列时忽略(否则会报错)
mo_df.drop(['trading_day', 'portfolio_id', 'portfolio', 'feedcode'], axis=1, inplace=True, errors='ignore')
# 正则筛选行
ret = r'[0-9]{8}.S[HZ]'
option_df_spe = option_df[option_df.feedcode.str.contains(ret, regex=True)] # 股指期权
# 解决中文乱码
df.to_csv(file_name2, encoding='utf_8_sig')
# join操作
result = pd.merge(init_df, stock_event, how='left', on=['trading_day', 'feedcode'])
# 设置index
new_day.index = ['2021-07-20']
# index转换为datetime类型
new_day.index = pd.to_datetime(new_day.index)
# 普通列转换为datetime类型
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')
# 读取数据的时候,第0列作为index
dce_eg = pd.read_csv('D:\\limit_result_dce_eg.csv', index_col=0)
# append
ticker_df = ticker_df.append(new_day)
# 填充NaN值
import numpy as np
df.test = np.nan
# 修改符合条件某列的值
df.loc[df.ptf=='abc', 'trading_day'] = '20231117'
# 大数据量for循环loc取会很慢,推荐用 group
for index,today_df in df.groupby('date'):
print(index, today_df )
可以判断pandas中单个空值对象的方式:
1、利用pd.isnull(),pd.isna();
2、利用np.isnan();
3、利用is表达式;
4、利用in表达式。
不可以用来判断pandas单个空值对象的方式:
1、不可直接用==表达式判断;
2、不可直接用bool表达式判断;
3、不可直接用if语句判断。
df.equals(df2)