Ваши данные содержат значение 0 (индекс 134). Когда boxcox
говорит, что данные должны быть положительными, это означает строго положительные.
В чем смысл ваших данных? 0 имеет смысл? Это 0 на самом деле очень маленькое число, которое было округлено до 0?
Вы можете просто отбросить это 0. В качестве альтернативы, вы можете сделать что-то вроде следующего. (Это означает временное отбрасывание 0, а затем использование -1 / λ для преобразованного значения 0, где λ - параметр преобразования Бокса-Кокса.)
Сначала создайте некоторые данные, содержащие один 0 (все остальные значения положительные):
In [13]: np.random.seed(8675309)
In [14]: data = np.random.gamma(1, 1, size=405)
In [15]: data[100] = 0
(В своем коде вы бы заменили его, скажем, на data = df.values
.)
Скопируйте строго положительные данные в posdata
:
In [16]: posdata = data[data > 0]
Найдите оптимальное преобразование Бокса-Кокса и убедитесь, что λ положительно. Этот обходной путь не работает, если λ ≤ 0.
In [17]: bcdata, lam = boxcox(posdata)
In [18]: lam
Out[18]: 0.244049919975582
Создайте новый массив для хранения этого результата вместе с предельным значением преобразования 0 (которое равно -1 / λ):
In [19]: x = np.empty_like(data)
In [20]: x[data > 0] = bcdata
In [21]: x[data == 0] = -1/lam
На следующем графике показаны гистограммы data
и x
.
![plot](https://i.stack.imgur.com/Tg9vJ.png)