IndexError
было вызвано использованием чисел с плавающей запятой вместо целых чисел для индексации массивов. - Массивы не могут быть проиндексированы массивом как
data_bc[column]
или data[column]
- Используйте enumerate для правильного индексирования массивов.
- Данные могут иметь числа с плавающей запятой, но float нельзя использовать для индексации массивов.
- Нет причин преобразовывать массив в фрейм данных и обратно в массив.
- Я добавил, возврат списка параметров
lambda
из boxcox
. - Наконец, если вы думаете о массиве как о фрейме данных, то
boxcox
применяется к строкам, а не к столбцам. - Массив необходимо транспонировать, чтобы
boxcox
применялось к столбцам - Результат
st_bc
теперь будет соответствовать применению boxcox
к кадру данных, как показано во втором часть этого решения.
import numpy
import scipy
def st_bc(data):
data = data.T
data_bc = np.zeros_like(data)
lams = list()
for i, column in enumerate(list(data)):
data_bc[i], lam = scipy.stats.boxcox(data[i])
lams.append(lam)
return data_bc.T, lams
np.random.seed(1)
data = np.random.randint(1, 100, size=(100, 4)).astype('float64')
bc_array, lams_list = st_bc(data)
# print(data[:5, :])
array([[38., 13., 73., 10.],
[76., 6., 80., 65.],
[17., 2., 77., 72.],
[ 7., 26., 51., 21.],
[19., 85., 12., 29.]])
# print(bc_array[:5, :])
array([[13.5733518 , 7.08438022, 25.44409142, 7.32995319],
[21.63925203, 3.54921753, 27.16422209, 41.78155162],
[ 7.64782254, 0.88958263, 26.43324502, 45.75934397],
[ 3.75096568, 12.33694984, 19.64519548, 14.97979832],
[ 8.30355027, 29.84841173, 6.46011688, 20.18489135]])
# print(lams_list)
[0.6140869325642362,
0.6923022809975391,
0.6763741407884145,
0.8662712497789992]
Использование фрейма данных
- Применить
boxcox
ко всему фрейму данных - См. что результат соответствует выводу
st_bc
.
import pandas as pd
import scipy
import numpy as np
np.random.seed(1)
df = pd.DataFrame(np.random.randint(1,100,size=(100, 4)), columns=list('ABCD'))
# apply boxcox
(a_bc, a_lam), (b_bc, b_lam), (c_bc, c_lam), (d_bc, d_lam) = df.apply(scipy.stats.boxcox)
# put the boxcox result in a dataframe
bc_df = pd.DataFrame({'a': a_bc, 'b': b_bc, 'c': c_bc, 'd': d_bc})
# dispaly(bc_df.head())
a b c d
0 13.573352 7.084380 25.444091 7.329953
1 21.639252 3.549218 27.164222 41.781552
2 7.647823 0.889583 26.433245 45.759344
3 3.750966 12.336950 19.645195 14.979798
4 8.303550 29.848412 6.460117 20.184891
# print(a_lam, b_lam, c_lam, d_lam)
0.6140869325642362 0.6923022809975391 0.6763741407884145 0.8662712497789992