pandas 常用操作 group apply sum filter concat 调整列顺序

本文详细介绍Pandas库在处理大数据集时的高效操作方法,包括数据读取、清洗、转换、聚合及输出等关键步骤,适用于金融、量化交易等领域的数据分析人员。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目里计算量较大 需要用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)

``` {智能估值体系V14} 大盘过滤:=INDEXC>MA(INDEXC,60) AND INDEXC>MA(INDEXC,120); {新增大盘趋势过滤器} DYNPETTM:=IF(FINANCE(1)>300000000 AND FINANCE(4)>150000000, CLOSE/((FINANCE(1)/MAX(FINANCE(4),120000000)+0.000001)*0.82)* {优化系数至0.82} (1+0.18*INDUSTRYF(1013)),1000); {替换为通达信行业函数} PB_RATE:=IF(FINANCE(34)>0.88 AND CLOSE>5.5, CLOSE/((FINANCE(34)*0.88+REF(FINANCE(34),1)*0.12)*0.95+0.000001),1000); {优化权重参数} {修正PEG计算V5} PEG_VAL:=DYNPETTM/MAX(FINANCE(30)/REF(MAX(FINANCE(30),0.01),4),1.28); {调整分母系数至1.28} {分形波动率V21} VAR_PERIOD:=IF(VOLATILITY(89)<0.018,377, {替换为通达信波动率函数} IF(VOLATILITY(89)<0.04,233,89)); SLOW_LEN:=IF(VOLATILITY(89)>0.2,INT(VAR_PERIOD*1.618),CEILING(VAR_PERIOD*2.118)); {行业轮动V14} HY_RET:=EMA((INDEXC/REF(INDEXC,5)-1)*100,5)*1.42; {增强行业动量系数} TRANS_MAT:=EMA((SUM((IND_RATIO>REF(IND_RATIO,5))*(REF(IND_RATIO,5)>REF(IND_RATIO,21)),21)+ SUM((IND_RATIO>REF(IND_RATIO,5))*(REF(IND_RATIO,5)>REF(IND_RATIO,34)),34))/2/ (SUM(REF(IND_RATIO,5)>REF(IND_RATIO,21),55)+0.0001),5)*1.15; {增加过渡矩阵权重} {行业筛选V4} SECTOR_FLT:=SECTOR_STR>REF(SECTOR_STR,34)*1.22 {提升强度阈值} AND CTOP_SECT AND CROSS(EMA(SECTOR_STR,5),EMA(SECTOR_STR,13)) {缩短EMA周期} AND SLOPE(SECTOR_STR,3)>SLOPE(SECTOR_STR,8)*1.35; {增强斜率对比} {三维共振V7} DIF:=EMA(CLOSE,8)-EMA(CLOSE,21); {缩短周期提高灵敏度} DEA:=EMA(DIF,5); MACD_COND:=DIF>DEA AND DEA>REF(DEA,3); {新增趋势确认条件} {资金流向V6} BIGBUY:=SUM(IF(VOL/FINANCE(7)>=0.01 AND COUNT(VOL/FINANCE(7)>=0.008,3)=3, AMOUNT*0.82,0),3); {提高主力资金系数} FUNDFLOW:=(BIGBUY-BIGSELL)/FINANCE(7)*100*1.25; {增加资金流权重} {情绪启动V4} 情绪启动:=CROSS(MARKET_SENT,1.35) AND COUNT(MARKET_SENT>1.15,3)>=2 {提高触发阈值} AND CLOSE>EMA(CLOSE,233)*1.18; {新增趋势确认} {终极信号V8} 盘后选股:=大盘过滤 AND DYNPETTM<8.8 AND PB_RATE<1.65 {加入大盘过滤} AND PEG_VAL<0.48 {降低PEG阈值} AND EVERY(CLOSE>EMA(CLOSE,55),8) {延长趋势确认周期} AND FINANCE(30)/REF(MAX(FINANCE(30),0.01),4)>1.68 AND EVERY(VOL>MA(VOL,55)*1.35,5) {增加放量天数} AND MACD_COND AND CLOSE/EMA(CLOSE,55)>1.28 AND VOL/EMA(VOL,55)>1.55; {盘中预警V3} 盘中预警:CROSS(CLOSE,BOLL_UPPER) AND VOL>MA(VOL,34)*3.5 {新增布林带突破} AND FUNDFLOW>REF(FUNDFLOW,1)*1.25 AND 情绪启动 AND CLOSE>HHV(HIGH,21) AND 大盘过滤; {资金流验证V13} LHB_DATA:=FINANCE(244)/CAPITAL*100; {修正龙虎榜函数} CAPITAL_INFLOW:=SUM(AMO,8)/SUM(AMO,34)>0.95 {缩短统计周期} AND EVERY(V>REF(V,1)*1.25,5) AND (MAIN_FUND-REF(MAIN_FUND,5))/CAPITAL>0.18; {信号衰减模型V3} DECAY_WEIGHT:=EXP(-0.08*(BARSLAST(盘后选股))); //优化衰减系数 SIGNAL_EMA:EMA(盘后选股*DECAY_WEIGHT,8); DRAWICON(盘后选股 AND 盘中预警, LOW, 1);```你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【使用Python构建回测系统测试选股代码的有效性?用2018-2024年全A股周期回测验证此代码选股逻辑的准确性和胜率,评估月胜率达到多少?评估有效信号准确率达到多少?】,同时此代码还有什么可提升的空间,提出可行性的优化建议和方案,如何选到选股胜率达到月胜率提高至75%以上,有效信号准确率95%以上,选到资金持续流入,股票市场情绪启动,盘中异动启动主升浪的股票,及日线盘中预警选股和盘后选股,并帮我调整参数并找到最佳选股参数计算关系和信号触发条件。请帮我检查并改正错误点补全正确代码,,并替换为通达信支持的函数,生成调整优化后通达信完整代码。
最新发布
04-03
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值