IndexError: массивы, используемые в качестве индексов, должны иметь целочисленный (или логический) тип - Python - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь запустить приведенный ниже код, но получаю следующее сообщение об ошибке:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-105-43d3d8bbcec7> in <module>
      7     return data_bc
      8 
----> 9 st_bc(data = df.to_numpy())

<ipython-input-105-43d3d8bbcec7> in st_bc(data)
      4     data_bc = np.zeros_like(data)
      5     for column in list(data):
----> 6         data_bc[column], lam = scipy.stats.boxcox(data[column])
      7     return data_bc
      8 

IndexError: arrays used as indices must be of integer (or boolean) type

Если вы можете уточнить, как заставить его работать, я бы действительно подготовил его. *

Ответы [ 2 ]

1 голос
/ 14 июля 2020
  • 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
0 голосов
/ 14 июля 2020
In [92]: data = np.arange(12).reshape(3,4)                                                           
In [93]: data                                                                                        
Out[93]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

Посмотрите, что вы получите при итерации по 2d-массиву:

In [94]: for col in list(data): 
    ...:     print(col) 
    ...:                                                                                             
[0 1 2 3]
[4 5 6 7]
[ 8  9 10 11]

Вы получите строки массива. Нет смысла индексировать эту строку, data[col]. Вы можете напрямую использовать значение col. Если вам нужен индекс, используйте enumerate или for i in range(...):

Это основная проблема итерации c Python. Даже при использовании pandas и numpy стоит выучить основной язык :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...