使用scipy.stats.gaussian_kde触发TypeError,请求排查解决
解决scipy.stats.gaussian_kde权重参数的类型错误
错误原因分析
报错TypeError: can't multiply sequence by non-int of type 'float'出现在numpy计算加权平均的步骤中,核心原因是权重数组(volume)的数据类型与目标数组(close)不匹配,或者数组中存在非数值类型元素,导致无法完成浮点乘法运算。
解决方案
1. 强制转换权重数组为浮点类型
将volume数组显式转换为float64类型,确保numpy可以正常执行加权运算:
# Separate for vol prof volume = np.asarray(df['Volume'], dtype=np.float64) close = np.asarray(df['Close'], dtype=np.float64)
2. 检查并清理缺失值/无效数据
如果数据中存在NaN、None或字符串类型元素,会导致数组类型异常,先检查并处理:
# 检查缺失值 print("Close列缺失值数量:", df['Close'].isna().sum()) print("Volume列缺失值数量:", df['Volume'].isna().sum()) # 清理缺失值(根据需求选择删除或填充) df = df.dropna(subset=['Close', 'Volume']) # 或者用均值填充:df['Volume'] = df['Volume'].fillna(df['Volume'].mean()) # 重新转换为numpy数组 volume = np.asarray(df['Volume'], dtype=np.float64) close = np.asarray(df['Close'], dtype=np.float64)
3. 验证数组形状与类型
转换后可以打印数组信息确认:
print("Close数组类型:", close.dtype) print("Close数组形状:", close.shape) print("Volume数组类型:", volume.dtype) print("Volume数组形状:", volume.shape)
确保两者都是浮点类型,且形状一致(一维数组,长度相同)。
修改后的完整代码片段
# Load data df = botc.ib.data_saver.get_df(SYMBOL.lower()) # 清理缺失值 df = df.dropna(subset=['Close', 'Volume']) # Separate for vol prof volume = np.asarray(df['Volume'], dtype=np.float64) close = np.asarray(df['Close'], dtype=np.float64) print("Close:") print(close) print("VOLUME:") print(volume) # Plot volume profile based on close px.histogram(df, x="Volume", y="Close", nbins=150, orientation='h').show() # Kernel Density Estimator kde_factor = 0.05 num_samples = 500 kde = stats.gaussian_kde(close, weights=volume, bw_method=kde_factor) xr = np.linspace(close.min(), close.max(), num_samples) kdy = kde(xr) ticks_per_sample = (xr.max() - xr.min()) / num_samples def get_dist_plot(c, v, kx, ky): fig = go.Figure() fig.add_trace(go.Histogram(name="Vol Profile", x=c, y=v, nbinsx=150, histfunc='sum', histnorm='probability density')) fig.add_trace(go.Scatter(name="KDE", x=kx, y=ky, mode='lines')) return fig get_dist_plot(close, volume, xr, kdy).show()
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

