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

使用np.append结合条件时如何为数组填充NaN值?

问题:生成含新日目标价与其余NaN的等长K线数组

需求说明

需要生成一个和输入K线数据长度完全一致的数组:仅在新一天的第一根K线位置填入当日开盘价上涨100%的目标价,其余所有位置填充NaN。

原始代码(仅收集新日目标价)

原始函数仅提取了每个新日的目标价,但返回数组长度远小于K线总数:

def prices(open, index):
    gap_amount = 100
    prices_array = np.array([])
    index = index.vbt.to_ns()
    day = 0
    target_price = 0
    first_bar_of_day = 0

    for i in range(open.shape[0]):
        first_bar_of_day = 0

        day_changed = vbt.utils.datetime_nb.day_changed_nb(index[i - 1], index[i])
        
        # if we have a new day
        if (day_changed):
            day = day + 1
            # print(f'day {day}')
            first_bar_of_day = i
            fist_open_price_of_day = open[first_bar_of_day]
            target_price = increaseByPercentage(fist_open_price_of_day, gap_amount)

            prices_array = np.append(prices_array, target_price)

    return prices_array

调用方式:

prices_array = prices(df['open'], df.index)
print(prices_array, 'prices_array')

返回结果(仅包含新日目标价,长度不足):

[ 1.953  12.14    2.4     2.36    6.04    6.6     2.62    2.8     3.94
  2.      5.16    3.28    5.74    3.6     2.48    4.2     4.02    2.72
  5.52    3.34    3.84    2.02    2.58    4.76    2.28    3.54    2.54
  3.7     3.38    3.4     6.68    2.48    7.2     4.5     5.66    4.48
  5.92    5.26    4.06    3.96    4.      4.42    2.62    1.76    3.66
  5.5     3.82    1.8002  3.02    7.78    2.32    4.6     3.34    0.899
  1.52    5.28    5.1     2.88  ] prices_array

尝试的错误代码(全NaN结果)

尝试用np.insert填充,但返回全NaN数组:

def prices(close, open, index):
    gap_amount = 100
    prices_array = np.array([])
    index = index.vbt.to_ns()
    day = 0
    target_price = 10000
    first_bar_of_day = 0

    for i in range(open.shape[0]):
        first_bar_of_day = 0

        day_changed = vbt.utils.datetime_nb.day_changed_nb(index[i - 1], index[i])
        
        # if we have a new day
        if (day_changed):
            day = day + 1
            # print(f'day {day}')
            first_bar_of_day = i
            fist_open_price_of_day = open[first_bar_of_day]
            target_price = increaseByPercentage(fist_open_price_of_day, gap_amount)

        # if close goes above or equal to target price
        if (close[i] >= target_price):
            prices_array = np.insert(prices_array, i, target_price)
        else:
            prices_array = np.insert(prices_array, i, np.nan)

    return prices_array

返回结果:

[nan nan nan ... nan nan nan] prices_array

解决方案

错误根源:初始target_price设为10000导致大部分收盘价无法触发赋值,且np.insert在循环中效率极低易出错。修改后的代码如下:

import numpy as np

def prices(open_series, index):
    gap_amount = 100
    # 初始化和K线长度一致的全NaN数组
    prices_array = np.full(open_series.shape[0], np.nan)
    index_ns = index.vbt.to_ns()

    for i in range(open_series.shape[0]):
        # 处理第一根K线(必然是新日起点)
        if i == 0:
            prices_array[i] = increaseByPercentage(open_series.iloc[i], gap_amount)
            continue
        
        # 判断是否进入新一天
        if vbt.utils.datetime_nb.day_changed_nb(index_ns[i-1], index_ns[i]):
            prices_array[i] = increaseByPercentage(open_series.iloc[i], gap_amount)
        # 非新日位置保持NaN,无需额外操作

    return prices_array

关键改进点

  • 用np.full直接初始化等长全NaN数组,避免循环中动态修改数组的低效与错误;
  • 单独处理i=0的情况,避免i-1索引越界;
  • 仅在新日触发时赋值目标价,其余位置保留初始NaN;
  • 变量名open改为open_series,规避与Python内置函数冲突;
  • 移除无关的close参数(若后续需要收盘价判断可重新添加)。

调用方式不变:

prices_array = prices(df['open'], df.index)

返回数组将与K线数据长度一致,仅新日第一根K线位置有目标价,其余为NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 22:45:40