使用scaler.inverse_transform处理Series传入Seaborn绘图时触发ValueError的解决方法
scaler.inverse_transform处理Series传入Seaborn绘图时触发ValueError的解决方法
这个问题我之前也碰到过,核心原因很简单:StandardScaler的inverse_transform()方法必须接收二维结构的数据(比如DataFrame或者二维numpy数组),但你传入的anomaly_df['Close/Last']是一维的Pandas Series,这就触发了那个ValueError。
给你两种直接可行的修改方案,任选其一就行:
方案1:用[[]]包裹列名,生成二维DataFrame
把原来的Series改成单列DataFrame传入逆变换,之后用flatten()把返回的二维数组转成一维,适配Seaborn的绘图要求:
# 修正后的异常值绘图代码 sns.lineplot(x=anomaly_df['Date'], y=scaler.inverse_transform(anomaly_df[['Close/Last']]).flatten()) sns.scatterplot(x=anomalies['Date'], y=scaler.inverse_transform(anomalies[['Close/Last']]).flatten(), color='r') # 也可以用ravel()替代flatten(),效果一致
方案2:用to_frame()将Series转为DataFrame
这是另一种把一维Series转成二维DataFrame的方式,逻辑和上面完全一样:
# 另一种等效的写法 sns.lineplot(x=anomaly_df['Date'], y=scaler.inverse_transform(anomaly_df['Close/Last'].to_frame()).flatten()) sns.scatterplot(x=anomalies['Date'], y=scaler.inverse_transform(anomalies['Close/Last'].to_frame()).flatten(), color='r')
为什么这样改能解决问题?
StandardScaler是为多特征的数据集设计的,它的fit、transform、inverse_transform全都是基于二维数据工作的——哪怕你只处理一个特征,它也要求输入是“一列数据”的二维结构,而不是“一行数据”的一维结构。
你原来的代码里,anomaly_df['Close/Last']是一维Series,用[[]]或者to_frame()处理后,就变成了只有一列的DataFrame,刚好满足逆变换的输入要求。之后用flatten()把返回的二维数组转成一维,是因为Seaborn的绘图函数需要一维的数值序列作为y轴数据。
备注:内容来源于stack exchange,提问作者Asiedu
相关产品推荐
相关产品推荐

