0
votes

Toute façon pour les pandas de créer et de générer correspondant aux graphiques de requêtes de l'utilisateur, à l'aide de l'entrée ()?

J'ai une trame de données Pandas que j'ai obtenue en utilisant l'analyse d'IMDb. Je veux pouvoir créer et sortir certains barplots, correspondant à la demande des utilisateurs de input ().

from matplotlib import pyplot as plt 
import seaborn as sns
import pandas as pd

glo = []
from collections import Counter
for st in range(0, 10):
    for i in oscar_df['Genre'][st]:
            glo.append(i.strip())

os_df = pd.DataFrame(list(Counter(glo).items()), columns = ['G', 'Q'])
os_df.sort_values('G') 
os_df

ax = sns.barplot(x='Q',y='G', data=os_df, palette="hls", orient='h');
ax.set(xlabel='Number of Oscars', ylabel = None)

Par exemple, l'entrée est '30', puis le graphique correspondant dans la plage (10, 19) (considérant que df commence à partir des années 20 et qu'il y a 10 films dans chaque décennie) apparaît pour l'utilisateur. Le code du graphique est ci-dessous (oscar_df est le df original, peut fournir le code d'analyse):

   name      decade   genre
0  movie1    20s      adventure
1  movie2    20s      fantasy
... 
89 movie35   00s      drama
90 movie36   10s      sci-fi

Je pensais à une fstring et une boucle, et je cherchais un beaucoup, mais je n'ai pas trouvé grand-chose. Y a-t-il moyen de résoudre ce problème?


1 commentaires

Recherchez-vous une fonction de saisie utilisateur pour définir ce qu'il faut tracer?


3 Réponses :


0
votes

J'ai trouvé la réponse moi-même, mais peut-être pas la plus sophistiquée.

dex = str(input('Enter two last digits of the decade (for instanse: 30): ')+'s')

for i in range(len(oscar_df['Decade'])):
                    if (set(oscar_df['Decade'][i]) == set(dex)) == True:
                        for a in oscar_df['Genre'][i]:
                            glo.append(a.strip()) 

os_df = pd.DataFrame(list(Counter(glo).items()), columns = ['G', 'Q'])
    list.clear(glo)
    os_df.sort_values('G')     
    ax = sns.barplot(x='Q',y='G', data=os_df, palette="hls", orient='h')
    ax.set(xlabel='Amount of Academy Awards', ylabel = None);
    plt.title('Stats for the decade you have chosen', fontname='Helvetica',
         fontsize=18);


0 commentaires

1
votes

Je ne fais que publier quelques conseils utiles.

Je recommanderais de valider les réponses. Vous pouvez utiliser le module re (expressions régulières) et rechercher simplement deux chiffres dans la chaîne d'entrée. L'extrait de code suivant a également une boucle while qui se répétera jusqu'à ce qu'une réponse souhaitée soit entrée:

oscar_df.plot(x='genre', y='decade', kind='bar')

Vous pouvez utiliser .str.contains () pour filtrer un DataFrame. Ensuite, nous pouvons sauter les 's' sur la décennie:

df_counts.plot(kind='bar') # Very rudimentary.

Ou, gagnez du temps et obtenez simplement la colonne que vous voulez:

n = 10
df_top_n_count = df_decade[category].value_counts().sort_values(ascending=False)[:n]


0 commentaires

1
votes

Ne considérez aucune collection de boucle ou de contre-compteur, mais de filtrer simplement des lignes par entrée, puis exécutez un groupby compte: xxx


0 commentaires