You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计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)

修正说明

  1. 用字典替代空DataFrame:字典可以高效累加计数,彻底解决无行DataFrame的赋值问题。
  2. 统计所有≥3的连续子段:当连续K线被打断时,遍历从3到当前连续长度的所有值,逐一累加计数,解决中间长度列缺失的问题。
  3. 处理末尾未被打断的连续段:循环结束后额外检查一次,避免最后一段连续K线未被统计。
  4. 列排序:对结果列按名称排序,方便查看连续长度的顺序。

内容的提问来源于stack exchange,提问作者Sewatech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:25:44