使用多股票分钟数据计算当日最低价LOD出现SettingWithCopyWarning如何解决
问题解决方案
一、SettingWithCopyWarning 产生原因
这个警告的本质是你当前操作的df是从其他DataFrame切片生成的视图而非独立副本,pandas无法确定你修改df是否会连带修改原DataFrame,因此抛出警告。
二、最简单的直接修复方案
如果要保留你现有的循环写法,只需要在所有处理代码的最前面加一行,强制让df成为独立副本即可:
df = df.copy()
三、更优的高性能实现方案(推荐)
你的需求本质是按股票代码+交易日分组,对Low列计算累计最小值,用pandas原生向量化操作仅需几行代码即可完成,性能比循环提升百倍以上,也不会触发警告:
import pandas as pd # 确保Time列为datetime类型(如果已经转换过可跳过) df['Time'] = pd.to_datetime(df['Time']) # 提取交易日作为分组维度 df['trade_date'] = df['Time'].dt.date # 分组计算累计最低价,直接赋值给LOD列 df['LOD'] = df.groupby(['Symbol', 'trade_date'])['Low'].cummin() # 可选:删除临时生成的trade_date列 df.drop(columns=['trade_date'], inplace=True)
四、原有循环代码的其他问题
你现有的循环逻辑存在明显错误,即使消除警告也无法得到正确结果:
current_session = (df['Time'].iloc[i]).time()取的是时分秒,判断是否和前一行相等的逻辑完全错误,应该取.date()获取交易日才能判断是否属于同一天交易时段df.iloc[session_start:i, 'Low']写法错误,iloc的第二个参数只能传位置索引,不能传列名,会直接抛出参数错误- iterrows遍历大样本行情数据时性能极差,不适合分钟级全市场行情的处理场景
内容的提问来源于stack exchange,提问作者Trippy Dippy
相关产品推荐
相关产品推荐

