使用statsmodels计算经验分布函数时出现报错的问题排查
经验分布函数(ECDF)绘制报错:ValueError: x and y do not have the same shape 原因及解决办法
错误原因
statsmodels的ECDF类要求输入的样本数据是一维数组/列表,但你定义的price_values是二维列表(每个元素都是单独的子列表),传入ECDF后会被当作二维数组处理,内部计算时因形状不匹配抛出x and y do not have the same shape错误。另外后续np.linspace(min(sample), max(sample))也会因为二维数组的min/max返回单元素数组,导致生成的x也是二维,后续绘图也会出现问题。
解决办法
把二维的样本数据转换成一维即可,有两种简单实现方式:
方式1:用numpy的flatten()方法转一维
修改样本定义部分,将二维列表转成numpy数组后再扁平化:
sample = np.array(price_values).flatten()
方式2:用列表推导式拆成一维列表
直接处理原始的二维列表:
sample = [item for sublist in price_values for item in sublist]
修改后的完整代码
import numpy as np import statsmodels.api as sm import matplotlib.pyplot as plt price_values = [[4.2], [4.1], [4], [3.8], [3.9], [4.2], [4.5], [4.8], [5.2], [5.2], [5.2], [5.6], [5.2], [5.1], [5.3], [6], [6.2], [6.3], [6.2], [6], [5.5] , [5.2], [4.8], [4.6]] # 方式1:numpy扁平化(二选一即可) sample = np.array(price_values).flatten() # 方式2:列表推导式 # sample = [item for sublist in price_values for item in sublist] ecdf = sm.distributions.ECDF(sample) x = np.linspace(min(sample), max(sample)) y = ecdf(x) plt.step(x, y) plt.show()
内容的提问来源于stack exchange,提问作者PeterBe
相关产品推荐
相关产品推荐

