统计UTC0时连续K线次数:NaN值及列缺失问题求助
问题描述
补充说明
我已找到并修正了出现NaN值的原因,但部分列缺失的问题仍未解决:(
我需要统计前几日UTC0时,至少3根连续绿K线(close > open)和红K线(close < open)的出现次数。代码会生成名为“Green_X”或“Red_X”的列,其中X代表连续K线的长度。但输出中虽能看到列名,值却为NaN;同时存在逻辑矛盾的列缺失情况,比如生成了Green_12列,却缺少Green_8、Green_10和Green_11列。
DataFrame更新核心逻辑
# 遍历UTC0时分组的行 for index, row in df_0.iterrows(): # 当前为绿K线(close > open) if row['close'] > row['open']: # 增加绿K线连续计数 green_formations += 1 # 若红K线连续数≥3则更新结果 if red_formations >= 3: if "Red_"+str(red_formations) in results_df.columns: results_df["Red_"+str(red_formations)] += 1; else: results_df["Red_"+str(red_formations)] = [1] red_formations = 0
完整代码
import pandas as pd import numpy as np # 加载数据框 df = pd.read_csv("/content/DATA/EURJPY Minute.csv",nrows = 50000) # 创建存储结果的数据框 results_df = pd.DataFrame() df['time'] = pd.to_datetime(df['time']) # 按小时分组数据框 df = df.groupby(df['time'].dt.hour).apply(lambda x: x) # 筛选UTC0时的分组 df_0 = df[df['time'].dt.hour == 0] # 初始化绿红K线连续计数 green_formations = 0 red_formations = 0 # 遍历UTC0时分组的行 for index, row in df_0.iterrows(): # 当前为绿K线(close > open) if row['close'] > row['open']: green_formations += 1 if red_formations >= 3: if "Red_"+str(red_formations) in results_df.columns: results_df["Red_"+str(red_formations)] += 1; else: results_df["Red_"+str(red_formations)] = [1] red_formations = 0 # 当前为红K线(close < open) elif row['close'] < row['open']: red_formations += 1 if green_formations >= 3: if "Green_"+str(green_formations) in results_df.columns: results_df["Green_"+str(green_formations)] +=1; else: results_df["Green_"+str(green_formations)] = [1] green_formations = 0 else: # 收盘价等于开盘价的情况 if green_formations >= 3: if "Green_"+str(green_formations) in results_df.columns: results_df["Green_"+str(green_formations)] +=1; else: results_df["Green_"+str(green_formations)] = [1] elif red_formations >= 3: if "Red_"+str(red_formations) in results_df.columns: results_df["Red_"+str(red_formations)] +=1; else: results_df["Red_"+str(red_formations)] = [1] green_formations=0 red_formations=0 # 输出结果 print(results_df)
输出结果
Empty DataFrame Columns: [Green_4, Red_3, Red_4, Red_5, Green_5, Green_3, Red_8, Green_7, Red_6, Green_6, Green_9, Green_12, Red_7, Red_9] Index: []
CSV样本数据
time open high low close volume 0 2011-02-08 09:22:00 111.598 111.627 111.580 111.614 56 1 2011-02-08 09:23:00 111.623 111.625 111.600 111.619 36 2 2011-02-08 09:24:00 111.613 111.636 111.603 111.611 42 3 2011-02-08 09:25:00 111.610 111.619 111.593 111.609 30 4 2011-02-08 09:26:00 111.611 111.644 111.602 111.628 46
问题分析与解决方案
核心问题1:结果DataFrame无行导致值异常
初始化的results_df是空DataFrame,直接给列赋值[1]只会创建列但没有有效索引行,后续+=1操作也无法正确累加,最终输出显示空DataFrame但有列名。
核心问题2:连续K线计数遗漏中间长度
当前逻辑只在连续K线被打断时(切换红绿K、出现十字星)才记录当前连续长度,比如一段12根的连续绿K,只会记录Green_12,不会统计其中包含的Green_8、Green_10、Green_11等所有≥3的子连续段。
修正后的代码
import pandas as pd import numpy as np # 加载数据框 df = pd.read_csv("/content/DATA/EURJPY Minute.csv", nrows=50000) df['time'] = pd.to_datetime(df['time']) # 筛选UTC0时的数据 df_0 = df[df['time'].dt.hour == 0] # 用字典统计更高效,避免空DataFrame的问题 results = {} # 初始化连续计数 green_streak = 0 red_streak = 0 for _, row in df_0.iterrows(): if row['close'] > row['open']: green_streak += 1 # 处理之前的红K连续段,统计所有≥3的长度 if red_streak >= 3: for length in range(3, red_streak + 1): key = f"Red_{length}" results[key] = results.get(key, 0) + 1 red_streak = 0 elif row['close'] < row['open']: red_streak += 1 # 处理之前的绿K连续段,统计所有≥3的长度 if green_streak >= 3: for length in range(3, green_streak + 1): key = f"Green_{length}" results[key] = results.get(key, 0) + 1 green_streak = 0 else: # 十字星,处理当前的连续段 if green_streak >= 3: for length in range(3, green_streak + 1): key = f"Green_{length}" results[key] = results.get(key, 0) + 1 if red_streak >= 3: for length in range(3, red_streak + 1): key = f"Red_{length}" results[key] = results.get(key, 0) + 1 green_streak = 0 red_streak = 0 # 遍历结束后,检查最后一段未被打断的连续段 if green_streak >= 3: for length in range(3, green_streak + 1): key = f"Green_{length}" results[key] = results.get(key, 0) + 1 if red_streak >= 3: for length in range(3, red_streak + 1): key = f"Red_{length}" results[key] = results.get(key, 0) + 1 # 转换为DataFrame并按列名排序 results_df = pd.DataFrame([results]) results_df = results_df.reindex(sorted(results_df.columns), axis=1) print(results_df)
修正说明
- 用字典替代空DataFrame:字典可以高效累加计数,彻底解决无行DataFrame的赋值问题。
- 统计所有≥3的连续子段:当连续K线被打断时,遍历从3到当前连续长度的所有值,逐一累加计数,解决中间长度列缺失的问题。
- 处理末尾未被打断的连续段:循环结束后额外检查一次,避免最后一段连续K线未被统计。
- 列排序:对结果列按名称排序,方便查看连续长度的顺序。
内容的提问来源于stack exchange,提问作者Sewatech
相关产品推荐
相关产品推荐

