【问题标题】:ValueError: Data must not be constantValueError:数据不能是常数
【发布时间】:2020-09-18 19:23:07
【问题描述】:

我正在尝试使用 boxcox 转换来转换我的数据。由于值为 0,我考虑在ValueError: Data must be positive (boxcox scipy) 中找到以下方法,但现在我收到值错误,说数据不能保持不变。这是我的方法:

posdata = df1[df1['hotel'] > 0]['hotel']
bcdata, lam = boxcox(posdata)
bc = np.empty_like(df1['hotel'])
bc[df1['hotel'] > 0] = bcdata
bc[df1['hotel'] == 0] = -1/lam 

我收到此错误:

ValueError                                Traceback (most recent call last)
<ipython-input-163-551b3ccca575> in <module>
  1 posdata = df1[df1['hotel'] > 0]['hotel']
  2 bcdata, lam = boxcox(posdata)
  3 bc = np.empty_like(df1['hotel'])
  4 bc[df1['hotel'] > 0] = bcdata
  5 bc[df1['hotel'] == 0] = -1/lam

  ~\AppData\Roaming\Python\Python37\site-packages\scipy\stats\morestats.py in boxcox(x, lmbda, alpha)
  1040 
  1041     if np.all(x == x[0]):
  1042         raise ValueError("Data must not be constant.")
  1043 
  1044     if any(x <= 0):

  ValueError: Data must not be constant.

【问题讨论】:

  • posdata的内容是什么
  • posdata 只是一个变量,它具有从 df1 的酒店列中提取的系列。检查代码的第一行。内容是整数值。
  • 它表示您所有的postdata 值都相同,但boxcox 需要不同的值。您可以在第一行之后检查所有值是否与print(postdata.unique()) 相同。
  • @V.Ayrat 谢谢我明白了。不幸的是,我取了错误的列,其值为 0 和 1,并且当我取的值大于 0 时,只剩下值 1。这就是为什么它给我的错误不是恒定的。

标签: python pandas numpy


【解决方案1】:

使用sklearn 并在列向量中重塑您的数据:

from sklearn.preprocessing import PowerTransformer

fit = PowerTransformer(
   method = 'box-cox',
   scale = False,
)

transform = fit.fit(
   np.array(data).reshape(-1, 1)
)

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 2011-02-23
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2021-12-14
    • 2021-12-20
    相关资源
    最近更新 更多