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

mplfinance绘制散点图遇ValueError:零尺寸数组求最大值无单位元

问题核心

当down_pip_diff_signal数组全为np.nan时,mplfinance的make_addplot无法生成有效的散点图——因为散点图要求至少存在一个非空数据点,全空数组会触发报错。


解决方案

方案1:提前判断有效数据,按需生成散点图

先优化原函数的逻辑(用向量操作替代循环,提升效率同时更易判断数据有效性),再在生成散点图前检查是否存在有效信号:

import numpy as np
import pandas as pd

def get_down_pip_diff(diff, price):
    # 用numpy向量操作替代循环,直接生成信号数组
    signal = np.where(diff < 0, price * 1.018, np.nan)
    return signal

# 生成信号
down_pip_diff_signal = get_down_pip_diff(df['Pip_Diff'], df['close'])

# 检查是否存在非nan的有效数据
has_valid_points = not pd.isna(down_pip_diff_signal).all()

# 仅当有有效数据时,才创建散点图的addplot对象
addplots = []
if has_valid_points:
    addplots.append(
        mpf.make_addplot(
            down_pip_diff_signal, 
            type='scatter', 
            panel=0, 
            markersize=100, 
            marker='o', 
            color='r'
        )
    )

# 绘制图表时传入addplots
mpf.plot(df, addplot=addplots, ...)  # 补充你的其他绘图参数

方案2:全空时返回空数组,让mplfinance自动忽略

如果希望保持函数调用流程不变,可以修改函数,当检测到全空数组时返回空列表,mplfinance会自动跳过该散点图的绘制:

def get_down_pip_diff(diff, price):
    signal = np.where(diff < 0, price * 1.018, np.nan)
    # 若全为nan,返回空数组
    if pd.isna(signal).all():
        return []
    return signal

# 后续调用流程不变
down_pip_diff_signal = get_down_pip_diff(df['Pip_Diff'], df['close'])
mpf.make_addplot(down_pip_diff_signal, type='scatter', panel=0, markersize=100, marker='o', color='r')

补充优化说明

原函数的循环写法在处理大数据集时效率较低,改用np.where的向量操作能大幅提升运行速度,同时更符合pandas/numpy的惯用处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:37:40