Распределение рейтингов кинолент по жанрам - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь построить среднюю оценку двух полов для каждого жанра mov ie на одном графике.

Мой dataset выглядит так:

      item_id                       title release_date  video_release_date  \
0            1            Toy Story (1995)  01-Jan-1995                 NaN   
1            4           Get Shorty (1995)  01-Jan-1995                 NaN   

...        ...                         ...          ...                 ...   
99995      748           Saint, The (1997)  14-Mar-1997                 NaN   
99996      751  Tomorrow Never Dies (1997)  01-Jan-1997                 NaN   

                                                imdb_url  unknown  Action  \
0      http://us.imdb.com/M/title-exact?Toy%20Story%2...        0       0   
1      http://us.imdb.com/M/title-exact?Get%20Shorty%...        0       1   

...                                                  ...      ...     ...   
99995  http://us.imdb.com/M/title-exact?Saint%2C%20Th...        0       1   
99996  http://us.imdb.com/M/title-exact?imdb-title-12...        0       1   

       Adventure  Animation  Childrens  ...  War  Western  user_id  rating  \
0              0          1          1  ...    0        0      308       4   
1              0          0          0  ...    0        0      308       5   

Код:

labels = ['Action', 'Adventure' , 'Animation' , 'Childrens' , 'Comedy' , 'Crime' , 'Documentary' , 'Drama' , 'Fantasy' , 'Film-Noir' , 'Horror' , 'Musical' , 'Mystery' , 'Romance' , 'Sci-Fi' , 'Thriller' , 'War' , 'Western']
male_values = all_male_users.iloc[:, 6:26]
female_values = all_female_users.iloc[:, 6:26]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots(figsize=(15,7))
rects1 = ax.bar(x - width/2, male_values.rating.mean(), width, label='Male')
rects2 = ax.bar(x + width/2, female_values.rating.mean(), width, label='Female')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Most preferred movie genres', fontsize=14)
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()

fig.tight_layout()
plt.show()

До сих пор он отображал общий средний балл для каждого пола, но не средний для каждого жанра mov ie. enter image description here

1 Ответ

1 голос
/ 17 июня 2020

Чтобы воспроизвести ваш пример, мне нужно было создать образец фрейма данных со случайными значениями (1000 для мужчин и женщин):

import numpy as np
import matplotlib.pyplot as plt

# create sample data
cols = ['Action', 'Adventure' , 'Animation' , 'Childrens' , 'Comedy' , 'Crime' , 'Documentary' , 'Drama' , 'Fantasy' , 'Film-Noir' , 'Horror' , 'Musical' , 'Mystery' , 'Romance' , 'Sci-Fi' , 'Thriller' , 'War' , 'Western', 'rating']
male_values = pd.DataFrame(columns = cols)
female_values = pd.DataFrame(columns = cols)

# define parameters for randomly recreated the dataframe
arr_dummy_genre = np.zeros(18, dtype = int)
arr_dummy_genre[0] = 1
range_rating = range(1,6)

# generate 1,000 random values
for i in range(1000):
    random_rating = float(np.random.choice(range_rating))
    random_genre = np.random.permutation(arr_dummy_genre)
    random_row = np.append(random_genre, random_rating)
    random_row
    male_values.loc[len(male_values)] = random_row

    random_rating = float(np.random.choice(range_rating))
    random_genre = np.random.permutation(arr_dummy_genre)
    random_row = np.append(random_genre, random_rating)
    random_row
    female_values.loc[len(female_values)] = random_row

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

Следующие шаги подготовили данные, чтобы представить их так, как вы хотите, отключив фиктивную переменную, представляющую жанр, и сгруппировали по genre:

    # reconstruct the dummified genre of the movie
    female_values['genre'] = pd.Series(female_values[labels].columns[np.where(female_values[labels]!=0)[1]])
    male_values['genre'] = pd.Series(male_values[labels].columns[np.where(male_values[labels]!=0)[1]])

    # group by genre
    gr_male_values = male_values.groupby('genre')['rating'].mean()
    gr_female_values = female_values.groupby('genre')['rating'].mean()

Теперь, используя тот же фрагмент кода, просто изменив сгруппированные данные, вы можете построить график так, как хотите:

labels = ['Action', 'Adventure' , 'Animation' , 'Childrens' , 'Comedy' , 'Crime' , 'Documentary' , 'Drama' , 'Fantasy' , 'Film-Noir' , 'Horror' , 'Musical' , 'Mystery' , 'Romance' , 'Sci-Fi' , 'Thriller' , 'War' , 'Western']

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots(figsize=(15,7))
rects1 = ax.bar(x - width/2, gr_male_values, width, label='Male')
rects2 = ax.bar(x + width/2, gr_female_values, width, label='Female')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Most preferred movie genres', fontsize=14)
ax.set_xticks(x)
ax.set_xticklabels(labels)
ax.legend()

fig.tight_layout()
plt.show()

Создание следующего сюжет, в моем случае совершенно случайный:

enter image description here

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