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
相关产品推荐
相关产品推荐

