Выполните группировку с запросом, используемым в аргументе для linregress

1

Я разделил блок данных "full_df2" с помощью столбца "фильтр". Затем я помещаю различные имена групп фильтров в список "unique_list". Я хочу выполнить итерацию через свой фреймворк с помощью следующего кода, чтобы я мог получить график для каждой группы. "Рейтинг" и "hhs" - это столбцы в моем кадре данных, на которые я буду запускать регрессию.

Когда я запускаю код ниже, я получаю эту ошибку. ValueError: слишком много значений для распаковки (ожидается 4). Я попытался добавить.split(',') в конце строки 2, но он не помогает. Я занимаюсь серфингом через доски, пытаясь преодолеть эту ошибку. Я новичок в Python. Таким образом, любая помощь и объяснение были бы весьма признательны.

Вот некоторые примеры данных и реальный код, который я использовал.

    full_df2 = np.array([['Letter', 'Sync', 'Status', 'filter', 'Rating', 'hhs'],
                ['A', 'And', 'Off', 'A And Off', .4, 300],
                ['A', 'And', 'On', 'A And On', .5, 300]
                ['A', 'Or', 'Off', 'A Or Off', .7, 300]
                ['A', 'Or', 'On', 'A Or On', .3, 300]
                ['A', 'Between', 'Off', 'A Between Off', .6, 300]
                ['A', 'Between', 'On', 'A Between On', .4, 300]
                ['A', 'And', 'Off', 'A And Off', .6, 400],
                ['A', 'And', 'On', 'A And On', .4, 400]
                ['A', 'Or', 'Off', 'A Or Off', .3, 400]
                ['A', 'Or', 'On', 'A Or On', .4, 400]
                ['A', 'Between', 'Off', 'A Between Off', .3, 400]
                ['A', 'Between', 'On', 'A Between On', .8, 400]
                ['A', 'And', 'Off', 'A And Off', .4, 250],
                ['A', 'And', 'On', 'A And On', .5, 250]
                ['A', 'Or', 'Off', 'A Or Off', .7, 250]
                ['A', 'Or', 'On', 'A Or On', .3, 250]
                ['A', 'Between', 'Off', 'A Between Off', .6, 250]
                ['A', 'Between', 'On', 'A Between On', .4, 250]
                ])

    unique_df = dict(tuple(full_df2.groupby(['Letter', 'Sync', 'Status', 'filter'])))
    unique_list = ([x[-1] for x in unique_df])
    for x in unique_list:
       print (x)


for p in unique_list:
  slope, intercept, r_value, p_value, std_err = stats.linregress(full_df2.query("filter == @p")[['rating']], full_df2.query("filter == @p")[['hhs']])
  filter_df = full_df2.query("filter == @p")
  ax = sns.regplot(x="rating", y="hhs", data=filter_df, color='b', 
  line_kws={'label':"y={0:.1f}x+{1:.1f}".format(slope,intercept)})
  ax.legend()
  ax.set_title(p)
  plt.show() 
  print(slope)

Это полная ошибка:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-29-75511dada630> in <module>()
      1 for p in unique_list:
----> 2     slope, intercept, r_value, p_value, std_err = stats.linregress(full_df2.query("filter == @p")[['rating']], full_df2.query("filter == @p")[['hhs']])
      3     #result = [stats.linregress(data[key]['num'],data[key]['com']) for key in keys]
      4     #slope, intercept, r_value, p_value, std_err =
      5     #.split(',')

~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\stats\_stats_mstats_common.py in linregress(x, y)
     91 
     92     # average sum of squares:
---> 93     ssxm, ssxym, ssyxm, ssym = np.cov(x, y, bias=1).flat
     94     r_num = ssxym
     95     r_den = np.sqrt(ssxm * ssym)

ValueError: too many values to unpack (expected 4)
  • 0
    Не могли бы вы добавить образец данных? и полное сообщение об ошибке, чтобы увидеть, где именно это происходит ...
  • 0
    Что произойдет, если вы напечатаете строку 2, а не назначите ее?
Показать ещё 6 комментариев
Теги:
pandas
scikit-learn

1 ответ

1
Лучший ответ

Согласно нашим комментариям выше, проблема, которую вы имеете, - это форма вашего ввода. Самый простой способ заставить его работать - изменить вход linregress на это:

stats.linregress(full_df2.query("filter == @p")['rating'], full_df2.query("filter == @p")['hhs'])

Лично я бы написал его следующим образом:

stats.linregress(full_df2.loc[full_df2.filter == p, 'rating'], full_df2.loc[full_df2.filter == p, 'hhs'])

Ещё вопросы

Сообщество Overcoder
Наверх