TypeError при чтении нескольких значений dict в функцию scipy - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть фрейм данных с несколькими категориальными функциями, на котором я пытаюсь выполнить проверку гипотезы Крускала-Уоллиса. Прямо сейчас я передаю y для каждого отдельного значения каждого из этих столбцов, собирая их сначала в dict:

# run h test on each categorical variable
alpha = 0.05
for c in X_categorical:
    samples = {}
    for s in set(d_test_data[c].tolist()):
        samples[s] = d_test_data["SalePrice"][d_test_data[c] == s].copy()
    stat, p = scipy.stats.kruskal(*samples)
    print(f"{c}: t-stat: {stat}, p: {p}")
    if p < alpha:
        print("reject null hypothesis", "\n")
    else:
        print("unable to reject null hypothesis", "\n")

Но затем я получаю следующую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-135-b25ef3aa14d5> in <module>
     19     for s in set(d_test_data[c].tolist()):
     20         samples[s] = d_test_data["SalePrice"][d_test_data[c] == s].copy()
---> 21     stat, p = scipy.stats.kruskal(*samples)
     22     print(f"{c}: t-stat: {stat}, p: {p}", "\n")
     23     if p < alpha:

c:\users\jpaul\appdata\local\programs\python\python37\lib\site-packages\scipy\stats\stats.py in kruskal(*args, **kwargs)
   5838         if arg.size == 0:
   5839             return KruskalResult(np.nan, np.nan)
-> 5840     n = np.asarray(list(map(len, args)))
   5841 
   5842     if 'nan_policy' in kwargs.keys():

TypeError: len() of unsized object

Что я могу сделать, чтобы функция принимала мои данные? Я пытался использовать to_list(), чтобы преобразовать их из pandas.Series в списки, прежде чем сохранять их в моем файле. Я все еще получаю ту же ошибку.

1 Ответ

1 голос
/ 02 ноября 2019

Без минимального воспроизводимого примера трудно сказать наверняка, но когда я смотрю на сигнатуру scipy.stats.kruskal, я бы предложил не пропускать

stat, p = scipy.stats.kruskal(*samples)

Поскольку samples является диктатом, *samples передаст ключи вашего диктанта в качестве последовательных аргументов. Это, вероятно, не то, что вы хотите. Может быть, вы хотите:

stat, p = scipy.stats.kruskal(*samples.values())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...