Произошло исключение: TypeError: только массивы размера 1 могут быть преобразованы в скаляры Python

1

Это мой первый пост здесь. Я делаю проект на Python о статистике и прогнозе футбольных результатов. Я получил идеи этого проекта, и я пытался воссоздать его, но он дает мне ошибку, как это

Я переписываю код для своих нужд, но даже если я копирую и вставляю исходный код, он выдает мне ту же ошибку, в то время как в оригинальном сообщении все идет хорошо.

То, что часть кода инкриминируется:

ax1.bar(chel_home.index-0.4,chel_home.values,width=0.4,color="#034694",label="Chelsea")

И это просто говорит о том, что "только массивы размера 1 могут быть преобразованы в скаляры Python", но я не знаю, где может быть проблема, потому что это один из моих первых подходов к Python.

Полный код такой:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn
from scipy.stats import poisson,skellam

epl_1617 = pd.read_csv("http://www.football-data.co.uk/mmz4281/1617/E0.csv")
epl_1617 = epl_1617[['HomeTeam','AwayTeam','FTHG','FTAG']]
epl_1617 = epl_1617.rename(columns={'FTHG': 'HomeGoals', 'FTAG': 'AwayGoals'})
epl_1617.head()

epl_1617 = epl_1617[:-10]
epl_1617.mean()

    # construct Poisson  for each mean goals value
poisson_pred = np.column_stack([[poisson.pmf(i, epl_1617.mean()[j]) for i in range(8)] for j in range(2)])

# plot histogram of actual goals
plt.hist(epl_1617[['HomeGoals', 'AwayGoals']].values, range(9), 
         alpha=0.7, label=['Home', 'Away'],normed=True, color=["#FFA07A", "#20B2AA"])

# add lines for the Poisson distributions
pois1, = plt.plot([i-0.5 for i in range(1,9)], poisson_pred[:,0],
                  linestyle='-', marker='o',label="Home", color = '#CD5C5C')
pois2, = plt.plot([i-0.5 for i in range(1,9)], poisson_pred[:,1],
                  linestyle='-', marker='o',label="Away", color = '#006400')

leg=plt.legend(loc='upper right', fontsize=13, ncol=2)
leg.set_title("Poisson           Actual        ", prop = {'size':'14', 

'weight':'bold'})

    plt.xticks([i-0.5 for i in range(1,9)],[i for i in range(9)])
    plt.xlabel("Goals per Match",size=13)
    plt.ylabel("Proportion of Matches",size=13)
    plt.title("Number of Goals per Match (EPL 2016/17 Season)",size=14,fontweight='bold')
    plt.ylim([-0.004, 0.4])
    plt.tight_layout()
    plt.show()

    # probability of draw between home and away team
    skellam.pmf(0.0,  epl_1617.mean()[0],  epl_1617.mean()[1])

    # probability of home team winning by one goal
    skellam.pmf(1,  epl_1617.mean()[0],  epl_1617.mean()[1])

    skellam_pred = [skellam.pmf(i,  epl_1617.mean()[0],  epl_1617.mean()[1]) for i in range(-6,8)]

plt.hist(epl_1617[['HomeGoals']].values - epl_1617[['AwayGoals']].values, range(-6,8), 
         alpha=0.7, label='Actual',normed=True)
plt.plot([i+0.5 for i in range(-6,8)], skellam_pred,
                  linestyle='-', marker='o',label="Skellam", color = '#CD5C5C')
plt.legend(loc='upper right', fontsize=13)
plt.xticks([i+0.5 for i in range(-6,8)],[i for i in range(-6,8)])
plt.xlabel("Home Goals - Away Goals",size=13)
plt.ylabel("Proportion of Matches",size=13)
plt.title("Difference in Goals Scored (Home Team vs Away Team)",size=14,fontweight='bold')
plt.ylim([-0.004, 0.26])
plt.tight_layout()
plt.show()

До этого момента он прекрасно работает, а затем часть, которая дает мне эту ошибку:

fig,(ax1,ax2) = plt.subplots(2, 1)


chel_home = epl_1617[epl_1617['HomeTeam']=='Chelsea'][['HomeGoals']].apply(pd.value_counts,normalize=True)
chel_home_pois = [poisson.pmf(i,np.sum(np.multiply(chel_home.values.T,chel_home.index.T),axis=1)[0]) for i in range(8)]
sun_home = epl_1617[epl_1617['HomeTeam']=='Sunderland'][['HomeGoals']].apply(pd.value_counts,normalize=True)
sun_home_pois = [poisson.pmf(i,np.sum(np.multiply(sun_home.values.T,sun_home.index.T),axis=1)[0]) for i in range(8)]

chel_away = epl_1617[epl_1617['AwayTeam']=='Chelsea'][['AwayGoals']].apply(pd.value_counts,normalize=True)
chel_away_pois = [poisson.pmf(i,np.sum(np.multiply(chel_away.values.T,chel_away.index.T),axis=1)[0]) for i in range(8)]
sun_away = epl_1617[epl_1617['AwayTeam']=='Sunderland'][['AwayGoals']].apply(pd.value_counts,normalize=True)
sun_away_pois = [poisson.pmf(i,np.sum(np.multiply(sun_away.values.T,sun_away.index.T),axis=1)[0]) for i in range(8)]

ax1.bar(chel_home.index-0.4,chel_home.values,width=0.4,color="#034694",label="Chelsea")
ax1.bar(sun_home.index,sun_home.values,width=0.4,color="#EB172B",label="Sunderland")
pois1, = ax1.plot([i for i in range(8)], chel_home_pois,
                  linestyle='-', marker='o',label="Chelsea", color = "#0a7bff")
pois1, = ax1.plot([i for i in range(8)], sun_home_pois,
                  linestyle='-', marker='o',label="Sunderland", color = "#ff7c89")
leg=ax1.legend(loc='upper right', fontsize=12, ncol=2)
leg.set_title("Poisson                 Actual                ", prop = {'size':'14', 'weight':'bold'})
ax1.set_xlim([-0.5,7.5])
ax1.set_ylim([-0.01,0.65])
ax1.set_xticklabels([])
# mimicing the facet plots in ggplot2 with a bit of a hack
ax1.text(7.65, 0.585, '                Home                ', rotation=-90,
        bbox={'facecolor':'#ffbcf6', 'alpha':0.5, 'pad':5})
ax2.text(7.65, 0.585, '                Away                ', rotation=-90,
        bbox={'facecolor':'#ffbcf6', 'alpha':0.5, 'pad':5})

ax2.bar(chel_away.index-0.4,chel_away.values,width=0.4,color="#034694",label="Chelsea")
ax2.bar(sun_away.index,sun_away.values,width=0.4,color="#EB172B",label="Sunderland")
pois1, = ax2.plot([i for i in range(8)], chel_away_pois,
                  linestyle='-', marker='o',label="Chelsea", color = "#0a7bff")
pois1, = ax2.plot([i for i in range(8)], sun_away_pois,
                  linestyle='-', marker='o',label="Sunderland", color = "#ff7c89")
ax2.set_xlim([-0.5,7.5])
ax2.set_ylim([-0.01,0.65])
ax1.set_title("Number of Goals per Match (EPL 2016/17 Season)",size=14,fontweight='bold')
ax2.set_xlabel("Goals per Match",size=13)
ax2.text(-1.15, 0.9, 'Proportion of Matches', rotation=90, size=13)
plt.tight_layout()
plt.show()

Здесь должен появиться другой график, но вместо этого он просто говорит: "Только массивы размера 1 могут быть преобразованы в скаляры Python".

Я действительно не знаю, что делать, и я начинаю сходить с ума, поэтому очень надеюсь, что вы мне поможете. Заранее спасибо и всем хорошего дня!

  • 0
    Ваш код прекрасно работает для меня на matplotlib 2.2.2 , pandas '0.23.0' и python 3.6.5 . Я вижу, что вы используете normed=True который сейчас устарел и должен быть заменен density=True . Какие версии вы используете?
  • 0
    Я использую Python 3.6.0, что вы думаете, я должен делать?
Показать ещё 6 комментариев
Теги:
pandas
matplotlib

1 ответ

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

Проблема в том, что ваши массивы для гистограммы - это 2d массивы, и вы должны их сгладить. Это можно легко сделать с помощью .flatten() который преобразует 2d-массивы в вашем коде в 1-d-массивы. Если вы посмотрите на chel_home.values, это выглядит как

array([[0.33333333],
       [0.22222222],
       [0.22222222],
       [0.16666667],
       [0.05555556]])

тогда как вам нужно

array([0.33333333, 0.22222222, 0.22222222, 0.16666667, 0.05555556])

Просто замените команды построения в вашем коде следующими строками

ax1.bar(chel_home.index-0.4,chel_home.values.flatten(),width=0.4,color="#034694",label="Chelsea")
ax1.bar(sun_home.index, sun_home.values.flatten(),width=0.4,color="#EB172B",label="Sunderland")

ax2.bar(chel_away.index-0.4,chel_away.values.flatten(),width=0.4,color="#034694",label="Chelsea")
ax2.bar(sun_away.index,sun_away.values.flatten(),width=0.4,color="#EB172B",label="Sunderland")

Вы также можете использовать .ravel() вместо .flatten()

Изображение 174551

  • 0
    Добро пожаловать :) Рад помочь

Ещё вопросы

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