<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 On souhaite regarder uniquement les pokémons de 1ère génération. Il va donc falloir filtrer nos données
On va donc crée une nouvelle variable qui aura uniquement les pokémons de "Generation" = 1
Step1:  Voila comment sélectionner des données sur un DataFrame existant 
Step2:  Regardons les stats de Pikachu maintenant. Pour afficher les données, on n'a pas besoin de créer une nouvelle variable. Tout dépend de l'analyse que vous voulez faire par la suite
Step3:  On peut regarder quelle pokemon a le plus d'HP
Pandas dispose de fonctions simples et user-friendly. Pour trouver le maximum, il suffit de donner 
Step4:  Si l'on souhaite regarder plus de 2 mesures, on utilise ".boxplot()" de Seaborn 
Step5:  Le problème ici c'est que Total est beaucoup plus grand que les autres mesures. De plus "#" ne sert pas à grand chose non plus
On va donc sélection uniquement les colonnes qui sont interessantes ('HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def','Speed')
Step6:  On retrouve notre "Chansey" tout en haut sur la variable "HP"
Step7:  Maintenant on va créer de nouvelle mesures
l'Attack et la Defence doivent jouer un grand role (avis aux pro-gamer Pokemon GO !)
Les additionner nous permettrais d'avoir une nouvelle vision sur nos pokémons
Step8:  Un message en rouge (warning) apparait
, don't worry. Pandas vous indique que le DataFrame pokemon provient d'un autre DataFrame (data) et que ces 2 DataFrame n'aurons plus la même structure.
Step9:  Il y a un point particulier a plus de 280 ;)
Step10:  Amuser vous à faire des graphique grâce à la fonction de Seaborn ".lmplot(...)"
Cette fonction prend en argument (pour plus de détail tapez "sns.lmplot?" ) 
Step11:  Seaborn fait automatiquement une regression sur ces 2 mesures. C'est à dire qu'il essait de tiret un trait qui va minimiser l'erreur avec les points
Step12:  Les points qui sont au dessus peuvent etre considérés comme supérieur et sont en dessous comme inférieur.
Regardons un peu les types de pokemon maintenant 
Step13:  Le graphique est un peu trop petit et on ne peux pas distinger les types
Step14:  De type 2 
Step15:  Utilisation de "groupby“ afin de regrouper les données sur des valeurs 
Step16:  On souhaite supprimer les mesures "#", "Total" et "Legendary" qui ne servent pas à grand chose ici...
<ASSISTANT_TASK:>
Python Code:
pokemon = data[data.Generation == 1]
Explanation: On souhaite regarder uniquement les pokémons de 1ère génération. Il va donc falloir filtrer nos données
On va donc crée une nouvelle variable qui aura uniquement les pokémons de "Generation" = 1
End of explanation
Image(url="http://i.giphy.com/yidUzHnBk32Um9aMMw.gif")
pokemon
Explanation: Voila comment sélectionner des données sur un DataFrame existant :)
End of explanation
# Afficher les données de Pikachu :
pokemon[pokemon.Name == 'Pikachu']
# Creer une variable de attribut de Pikachu
Pikachu = pokemon[pokemon.Name == 'Pikachu']
Pikachu
Image(url="http://i.giphy.com/xuXzcHMkuwvf2.gif")
Explanation: Regardons les stats de Pikachu maintenant. Pour afficher les données, on n'a pas besoin de créer une nouvelle variable. Tout dépend de l'analyse que vous voulez faire par la suite
End of explanation
# le plus grand nombre d'HP dans le DataFrame pokemon
pokemon['HP'].max()
# Si l'on souhaite trouver le pokemon en question il suffit de faire comme pour la sélection de Pikachu :
pokemon[pokemon['HP'] == 250]
# On peux très bien le faire de façon dynamique :
pokemon[pokemon['HP'] == pokemon['HP'].max()]
# On affiche un graphique HP/Attack :
pokemon.plot(x='HP', y='Attack', kind='scatter')
# On indique quelle mesure on désire pour l'axe "x" et "y" ainsi que le type de graphique
Explanation: On peut regarder quelle pokemon a le plus d'HP
Pandas dispose de fonctions simples et user-friendly. Pour trouver le maximum, il suffit de donner :
Le DataFrame (le nom de la variable)
l'attribut (son nom) : "Attack" etc...
la fonction à exécuter (en l'occurence .max() ici)
End of explanation
sns.boxplot(data=pokemon)
Explanation: Si l'on souhaite regarder plus de 2 mesures, on utilise ".boxplot()" de Seaborn :
End of explanation
sns.boxplot(data=pokemon[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def','Speed']])
Explanation: Le problème ici c'est que Total est beaucoup plus grand que les autres mesures. De plus "#" ne sert pas à grand chose non plus
On va donc sélection uniquement les colonnes qui sont interessantes ('HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def','Speed')
End of explanation
pokemon.describe()
Explanation: On retrouve notre "Chansey" tout en haut sur la variable "HP"
End of explanation
pokemon['Att_Def'] = pokemon['Attack'] + pokemon['Defense']
pokemon.head()
pokemon['my_def'] = pokemon['HP'] + pokemon['Defense']
pokemon.plot(x='my_def', y='Att_Def', kind='scatter')
#pokemon.head()
Explanation: Maintenant on va créer de nouvelle mesures
l'Attack et la Defence doivent jouer un grand role (avis aux pro-gamer Pokemon GO !)
Les additionner nous permettrais d'avoir une nouvelle vision sur nos pokémons
End of explanation
sns.boxplot(pokemon.Att_Def)
Explanation: Un message en rouge (warning) apparait
, don't worry. Pandas vous indique que le DataFrame pokemon provient d'un autre DataFrame (data) et que ces 2 DataFrame n'aurons plus la même structure.
End of explanation
pokemon[pokemon.Att_Def >= 280]
pokemon.sort_values('Att_Def', ascending=0).head(8)
Image(url="http://i.giphy.com/gPjzE0ivYud5C.gif")
Explanation: Il y a un point particulier a plus de 280 ;)
End of explanation
sns.lmplot(x='Sp. Atk', y='Sp. Def', data=pokemon)
Explanation: Amuser vous à faire des graphique grâce à la fonction de Seaborn ".lmplot(...)"
Cette fonction prend en argument (pour plus de détail tapez "sns.lmplot?" ) : 
x : Mesure sur l'axe "x" --> x=...
y : Mesure sur l'axe "y" --> y=...
data : Nom de la variable du DataFrame --> data=...
End of explanation
pokemon[(pokemon['Sp. Atk'] >= 180)]
Explanation: Seaborn fait automatiquement une regression sur ces 2 mesures. C'est à dire qu'il essait de tiret un trait qui va minimiser l'erreur avec les points
End of explanation
# De façon écrite :
pokemon['Type 1'].value_counts()
# par un graphique :
sns.countplot(pokemon['Type 1'])
Explanation: Les points qui sont au dessus peuvent etre considérés comme supérieur et sont en dessous comme inférieur.
Regardons un peu les types de pokemon maintenant :
End of explanation
# On prend l'ensemble des type 1 possible en valeurs
list_type_1 = pokemon['Type 1'].unique()        # Comme une liste de toutes les valeurs possible de "Type 1"
# Un peu de custom dans nos graphiques :
plt.figure(figsize=(12,8))                       # Tu vas créer un graphique de taille un peu plus grand
graph = sns.countplot(pokemon['Type 1'])            # Notre graphique que l'on met en variable
graph.set_xticklabels(list_type_1, rotation=20)     # On dit qu'il faut faire une rotation de nos valeur "Type 1"
Explanation: Le graphique est un peu trop petit et on ne peux pas distinger les types
End of explanation
# Vous pouvez copier / coller le code au dessous en changeant "Type 1" -> "Type 2"
# On prend l'ensemble des type 1 possible en valeurs
list_type_2 = pokemon['Type 2'].unique()        # Comme une liste de toutes les valeurs possible de "Type 1"
# Un peu de custom dans nos graphiques :
plt.figure(figsize=(12,8));                         # Tu vas créer un graphique de taille un peu plus grand
graph = sns.countplot(pokemon['Type 2'])            # Notre graphique que l'on met en variable
graph.set_xticklabels(list_type_2, rotation=20)     # O
Explanation: De type 2 :
End of explanation
generation = data.groupby('Generation').mean()
generation
Explanation: Utilisation de "groupby“ afin de regrouper les données sur des valeurs :
On reprend donc nos DataFrame "data" pour analyser l'évolution des Generation
End of explanation
# Help fonction drop
#generation.drop?
generation = generation.drop(['#', 'Total', 'Legendary'], axis=1)  # axis = 1 sont les colonnes / 0 sont les lignes
generation
generation.plot(figsize=(12, 8))  # figsize permet de choisir la taille du graphique
Explanation: On souhaite supprimer les mesures "#", "Total" et "Legendary" qui ne servent pas à grand chose ici...
End of explanation
<END_TASK>