import pandas as pd
import numpy as np
#Afin d'éviter ce genre d'erreur: "SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame"
pd.options.mode.chained_assignment = None # default='warn'
def etiquette_serie_sans_mot(etiquette_serie, mots):
"""Transforme les séries Tonne en Kg"""
for mot in mots:
if mot in etiquette_serie:
return False
return True
def split_milliers(nombre):
"""Diviser les milliers par une marque, ex: 5346578 -> 5'346'578 """
nombre = int(nombre)
nombre = str(nombre)
nombre = list(nombre)
i = -3
multiple_3 = len(nombre)%3
x = len(nombre)//3
if (multiple_3 == 0) or (nombre[0] == "-"):
x -= 1
if len(nombre)>3:
for millier in range(x):
nombre.insert(i,"'")
i -= 4
return "".join(nombre)
def dict_sum_series(list_series, df):
"""Applique un .sum() sur chaque séries données
Les séries doivent être numériques"""
valeurs_cat = {}
for serie in list_series:
valeurs_cat[serie] = serie
valeurs_cat[serie] = df[serie].sum()
return valeurs_cat
#Afin de créer des graphiques plus travaillés pour un .ptt, j'envoie des données dans un fichier Excel ciblé
def savedto_excel(df, slide_name):
"""
Envoie les valeurs et les clés correspondantes dans une feuille Excel à chaque fois créée
dans le fichier data-slides.xlsx de mon GoogleDrive
-- UTILISATION PRIVÉE --
"""
with pd.ExcelWriter("data-slides.xlsx",
mode='a', engine="openpyxl", if_sheet_exists="overlay" ) as writer:
df.to_excel(writer, sheet_name=slide_name)
dossier_data = "DATA-FAO"
#Importation du fichier population.csv
population = pd.read_csv(dossier_data +'/population.csv')
#Importation du fichier dispo_alimentaire.csv
dispo_alimentaire = pd.read_csv(dossier_data +"/dispo_alimentaire.csv")
#Importation du fichier aide_alimentaire.csv
aide_alimentaire = pd.read_csv(dossier_data +"/aide_alimentaire.csv")
#Importation du fichier sous_nutrition.csv
sous_nutrition = pd.read_csv(dossier_data +"/sous_nutrition.csv")
#Importation du fichier cereales.csv
infos_cereales = pd.read_csv(dossier_data + "/FAOSTAT_cereales.csv")
#Afficher les dimensions du dataset
print("Le tableau comporte {} observation(s) ou article(s)".format(population.shape[0]))
print("Le tableau comporte {} colonne(s)".format(population.shape[1]))
Le tableau comporte 1416 observation(s) ou article(s) Le tableau comporte 3 colonne(s)
#Création du dataframe
df_population = pd.DataFrame(population)
#Consulter le nombre de colonnes
#La nature des données dans chacune des colonnes
#Le nombre de valeurs présentes dans chacune des colonnes
df_population.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1416 entries, 0 to 1415 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 1416 non-null object 1 Année 1416 non-null int64 2 Valeur 1416 non-null float64 dtypes: float64(1), int64(1), object(1) memory usage: 33.3+ KB
#Affichage les 5 premières lignes de la table
df_population.head()
Zone | Année | Valeur | |
---|---|---|---|
0 | Afghanistan | 2013 | 32269.589 |
1 | Afghanistan | 2014 | 33370.794 |
2 | Afghanistan | 2015 | 34413.603 |
3 | Afghanistan | 2016 | 35383.032 |
4 | Afghanistan | 2017 | 36296.113 |
#Nous allons harmoniser les unités. Pour cela, nous avons décidé de multiplier la population par 1000
#Multiplication de la colonne valeur par 1000
df_population["Valeur"] = df_population["Valeur"].astype("int") * 1000
#Changement du nom de la colonne Valeur par Population
df_population.rename(columns={"Valeur":"Population"}, inplace=True)
#Affichage les 5 premières lignes de la table pour voir les modifications
df_population.head()
Zone | Année | Population | |
---|---|---|---|
0 | Afghanistan | 2013 | 32269000 |
1 | Afghanistan | 2014 | 33370000 |
2 | Afghanistan | 2015 | 34413000 |
3 | Afghanistan | 2016 | 35383000 |
4 | Afghanistan | 2017 | 36296000 |
#Création du dataframe disponibilité alimentaire
df_dispo_alimentaire = pd.DataFrame(dispo_alimentaire)
#Afficher les dimensions du dataset
df_dispo_alimentaire.shape
(15605, 18)
#Consulter le nombre de colonnes
print("\nLe tableau comporte {} séries:\n".format(df_dispo_alimentaire.shape[1]))
df_dispo_alimentaire.info()
Le tableau comporte 18 séries: <class 'pandas.core.frame.DataFrame'> RangeIndex: 15605 entries, 0 to 15604 Data columns (total 18 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 15605 non-null object 1 Produit 15605 non-null object 2 Origine 15605 non-null object 3 Aliments pour animaux 2720 non-null float64 4 Autres Utilisations 5496 non-null float64 5 Disponibilité alimentaire (Kcal/personne/jour) 14241 non-null float64 6 Disponibilité alimentaire en quantité (kg/personne/an) 14015 non-null float64 7 Disponibilité de matière grasse en quantité (g/personne/jour) 11794 non-null float64 8 Disponibilité de protéines en quantité (g/personne/jour) 11561 non-null float64 9 Disponibilité intérieure 15382 non-null float64 10 Exportations - Quantité 12226 non-null float64 11 Importations - Quantité 14852 non-null float64 12 Nourriture 14015 non-null float64 13 Pertes 4278 non-null float64 14 Production 9180 non-null float64 15 Semences 2091 non-null float64 16 Traitement 2292 non-null float64 17 Variation de stock 6776 non-null float64 dtypes: float64(15), object(3) memory usage: 2.1+ MB
#remplacement des NaN dans le dataset par des 0
df_dispo_alimentaire.fillna(0, inplace=True)
#Affichage les 5 premières lignes de la table
df_dispo_alimentaire.head()
Zone | Produit | Origine | Aliments pour animaux | Autres Utilisations | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | Disponibilité de matière grasse en quantité (g/personne/jour) | Disponibilité de protéines en quantité (g/personne/jour) | Disponibilité intérieure | Exportations - Quantité | Importations - Quantité | Nourriture | Pertes | Production | Semences | Traitement | Variation de stock | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | Abats Comestible | animale | 0.0 | 0.0 | 5.0 | 1.72 | 0.20 | 0.77 | 53.0 | 0.0 | 0.0 | 53.0 | 0.0 | 53.0 | 0.0 | 0.0 | 0.0 |
1 | Afghanistan | Agrumes, Autres | vegetale | 0.0 | 0.0 | 1.0 | 1.29 | 0.01 | 0.02 | 41.0 | 2.0 | 40.0 | 39.0 | 2.0 | 3.0 | 0.0 | 0.0 | 0.0 |
2 | Afghanistan | Aliments pour enfants | vegetale | 0.0 | 0.0 | 1.0 | 0.06 | 0.01 | 0.03 | 2.0 | 0.0 | 2.0 | 2.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | Afghanistan | Ananas | vegetale | 0.0 | 0.0 | 0.0 | 0.00 | 0.00 | 0.00 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | Afghanistan | Bananes | vegetale | 0.0 | 0.0 | 4.0 | 2.70 | 0.02 | 0.05 | 82.0 | 0.0 | 82.0 | 82.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
#Multiplication de toutes les lignes contenant des milliers de tonnes en Kg
serie_sans_tonne = ["(Kcal/personne/jour)", "(kg/personne/an)","(g/personne/jour)"]
for serie in df_dispo_alimentaire:
if (df_dispo_alimentaire[serie].dtype == "float64") and (etiquette_serie_sans_mot(serie, serie_sans_tonne)):
df_dispo_alimentaire[serie] = df_dispo_alimentaire[serie] * 1000 * 1000
df_dispo_alimentaire.rename(columns={serie:serie +" (kg)"}, inplace=True)
#Affichage les 5 premières lignes de la table
df_dispo_alimentaire.head()
Zone | Produit | Origine | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | Disponibilité de matière grasse en quantité (g/personne/jour) | Disponibilité de protéines en quantité (g/personne/jour) | Disponibilité intérieure (kg) | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | Abats Comestible | animale | 0.0 | 0.0 | 5.0 | 1.72 | 0.20 | 0.77 | 53000000.0 | 0.0 | 0.0 | 53000000.0 | 0.0 | 53000000.0 | 0.0 | 0.0 | 0.0 |
1 | Afghanistan | Agrumes, Autres | vegetale | 0.0 | 0.0 | 1.0 | 1.29 | 0.01 | 0.02 | 41000000.0 | 2000000.0 | 40000000.0 | 39000000.0 | 2000000.0 | 3000000.0 | 0.0 | 0.0 | 0.0 |
2 | Afghanistan | Aliments pour enfants | vegetale | 0.0 | 0.0 | 1.0 | 0.06 | 0.01 | 0.03 | 2000000.0 | 0.0 | 2000000.0 | 2000000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | Afghanistan | Ananas | vegetale | 0.0 | 0.0 | 0.0 | 0.00 | 0.00 | 0.00 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | Afghanistan | Bananes | vegetale | 0.0 | 0.0 | 4.0 | 2.70 | 0.02 | 0.05 | 82000000.0 | 0.0 | 82000000.0 | 82000000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
#Création du dataframe aide alimentaire
df_aide_alimentaire = pd.DataFrame(aide_alimentaire)
#Afficher les dimensions du dataset
df_aide_alimentaire.shape
(1475, 4)
#Consulter le nombre de colonnes
print("\nLe tableau comporte {} séries:\n".format(df_aide_alimentaire.shape[1]))
df_aide_alimentaire.info()
Le tableau comporte 4 séries: <class 'pandas.core.frame.DataFrame'> RangeIndex: 1475 entries, 0 to 1474 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Pays bénéficiaire 1475 non-null object 1 Année 1475 non-null int64 2 Produit 1475 non-null object 3 Valeur 1475 non-null int64 dtypes: int64(2), object(2) memory usage: 46.2+ KB
#Affichage les 5 premières lignes de la table
df_aide_alimentaire.head()
Pays bénéficiaire | Année | Produit | Valeur | |
---|---|---|---|---|
0 | Afghanistan | 2013 | Autres non-céréales | 682 |
1 | Afghanistan | 2014 | Autres non-céréales | 335 |
2 | Afghanistan | 2013 | Blé et Farin | 39224 |
3 | Afghanistan | 2014 | Blé et Farin | 15160 |
4 | Afghanistan | 2013 | Céréales | 40504 |
#Changement du nom de la colonne Pays bénéficiaire par Zone
df_aide_alimentaire.rename(columns={"Pays bénéficiaire":"Zone"}, inplace=True)
#Changement du nom de la colonne Valeur par Aide_alimentaire
df_aide_alimentaire.rename(columns={"Valeur":"Aide alimentaire"}, inplace=True)
#Multiplication de la colonne Aide_alimentaire qui contient des tonnes par 1000 pour avoir des kg
df_aide_alimentaire["Aide alimentaire"] = df_aide_alimentaire["Aide alimentaire"] * 1000
#Changement du nom de la colonne Aide alimentaire par Aide alimentaire (kg)
df_aide_alimentaire.rename(columns={"Aide alimentaire":"Aide alimentaire (kg)"}, inplace=True)
#Affichage les 5 premières lignes de la table
df_aide_alimentaire.head()
Zone | Année | Produit | Aide alimentaire (kg) | |
---|---|---|---|---|
0 | Afghanistan | 2013 | Autres non-céréales | 682000 |
1 | Afghanistan | 2014 | Autres non-céréales | 335000 |
2 | Afghanistan | 2013 | Blé et Farin | 39224000 |
3 | Afghanistan | 2014 | Blé et Farin | 15160000 |
4 | Afghanistan | 2013 | Céréales | 40504000 |
#Création du dataframe aide alimentaire
df_sous_nutrition = pd.DataFrame(sous_nutrition)
#Afficher les dimensions du dataset
df_sous_nutrition.shape
(1218, 3)
#Consulter le nombre de colonnes
print("\nLe tableau comporte {} séries:\n".format(df_sous_nutrition.shape[1]))
df_sous_nutrition.info()
Le tableau comporte 3 séries: <class 'pandas.core.frame.DataFrame'> RangeIndex: 1218 entries, 0 to 1217 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 1218 non-null object 1 Année 1218 non-null object 2 Valeur 624 non-null object dtypes: object(3) memory usage: 28.7+ KB
#Afficher les 5 premières lignes de la table
df_sous_nutrition.head()
Zone | Année | Valeur | |
---|---|---|---|
0 | Afghanistan | 2012-2014 | 8.6 |
1 | Afghanistan | 2013-2015 | 8.8 |
2 | Afghanistan | 2014-2016 | 8.9 |
3 | Afghanistan | 2015-2017 | 9.7 |
4 | Afghanistan | 2016-2018 | 10.5 |
#Conversion de la colonne (avec l'argument errors=coerce qui permet de convertir automatiquement les lignes qui ne sont pas des nombres en NaN)
df_sous_nutrition['Valeur'] = pd.to_numeric(df_sous_nutrition['Valeur'], errors="coerce")
#Puis remplacement des NaN en 0
df_sous_nutrition.fillna(0, inplace=True)
#Vérification de valeurs manquantes dans Valeur
df_sous_nutrition.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1218 entries, 0 to 1217 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 1218 non-null object 1 Année 1218 non-null object 2 Valeur 1218 non-null float64 dtypes: float64(1), object(2) memory usage: 28.7+ KB
#Changement du nom de la colonne Valeur par sous_nutrition
df_sous_nutrition.rename(columns={"Valeur":"Sous nutrition"}, inplace=True)
#Multiplication de la colonne sous_nutrition par 1000000
df_sous_nutrition["Sous nutrition"] = df_sous_nutrition["Sous nutrition"] * 1000000
#Afficher les 5 premières lignes de la table
df_sous_nutrition.head()
Zone | Année | Sous nutrition | |
---|---|---|---|
0 | Afghanistan | 2012-2014 | 8600000.0 |
1 | Afghanistan | 2013-2015 | 8800000.0 |
2 | Afghanistan | 2014-2016 | 8900000.0 |
3 | Afghanistan | 2015-2017 | 9700000.0 |
4 | Afghanistan | 2016-2018 | 10500000.0 |
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_population = df_population["Zone"].unique()
len(zones_population)
236
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_dispo_alim = df_dispo_alimentaire["Zone"].unique()
len(zones_dispo_alim)
174
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_aide_alim = df_aide_alimentaire["Zone"].unique()
len(zones_aide_alim)
76
#Récupération des zones afin de vérifier que chaque zone sera écrit de la même manière entre les différents dataframe
zones_ss_nutrition = df_sous_nutrition["Zone"].unique()
len(zones_ss_nutrition)
203
#Création de la liste de toutes les zones des 3 dataframe
total_listes = zones_dispo_alim.tolist() + zones_aide_alim.tolist() + zones_ss_nutrition.tolist()
Pays = []
#Comparaison des noms de zone entre la plus grande base de données(zones_population) et toutes les autres zones
#En partant du principe que la casse est respéctée
for zone_unique in zones_population:
for zone in total_listes:
#Si le nom de la zone de la liste total_listes est dans le nom de la zone zone_unique
if (zone.find(zone_unique) != -1):
Pays.append(zone.partition(zone_unique))
#Si le nom de la zone de la liste zone_unique est dans le nom de la zone total_listes
elif (zone_unique.find(zone) != -1):
Pays.append(zone_unique.partition(zone))
#Ajout des zones potentiellement concernées
differentes_zones = []
for i in Pays:
if i[0] != i[2]:
differentes_zones.append(i)
differentes_zones
[('République démocratique du ', 'Congo', ''), ('République démocratique du ', 'Congo', ''), ('', 'Guinée', '-Bissau'), ('', 'Guinée', '-Bissau'), ('', 'Guinée', ' équatoriale'), ('', 'Guinée', '-Bissau'), ('Papouasie-Nouvelle-', 'Guinée', ''), ('', 'Guinée', ' équatoriale'), ('', 'Guinée', ' équatoriale'), ('', 'Guinée', ' équatoriale'), ('', 'Guinée', '-Bissau'), ('', 'Guinée', '-Bissau'), ('', 'Guinée', '-Bissau'), ("Royaume-Uni de Grande-Bretagne et d'", 'Irlande', ' du Nord'), ('Papouasie-Nouvelle-', 'Guinée', ''), ('Papouasie-Nouvelle-', 'Guinée', ''), ('Papouasie-Nouvelle-', 'Guinée', ''), ('République démocratique du ', 'Congo', ''), ('République démocratique du ', 'Congo', ''), ('République démocratique du ', 'Congo', ''), ("Royaume-Uni de Grande-Bretagne et d'", 'Irlande', ' du Nord'), ('', 'Royaume-Uni', " de Grande-Bretagne et d'Irlande du Nord"), ("Royaume-Uni de Grande-Bretagne et d'", 'Irlande', ' du Nord'), ('', 'Samoa', ' américaines'), ('', 'Samoa', ' américaines'), ('', 'Samoa', ' américaines'), ('', 'Soudan', ' du Sud'), ('', 'Soudan', ' du Sud'), ('', 'Soudan', ' du Sud'), ('', 'Soudan', ' du Sud'), ('', 'Soudan', ' du Sud'), ('', 'Tchéquie', ' (la)')]
Il y existe effectivement plusieurs pays portant le mot Guinée, Congo, Soudan et Samoa.
En revanche, nous pouvons normaliser les zones Royaume-Uni et Tchéquie.
#Remplacement des variation de noms de zones par un nom strictement similaire à chacun
royaume_uni = "Royaume-Uni"
tchequie = "Tchéquie"
list_df = [df_aide_alimentaire, df_dispo_alimentaire, df_sous_nutrition, df_population]
for df in list_df:
for zone_unique in df["Zone"]:
if zone_unique.find(royaume_uni) != -1:
df["Zone"].replace(zone_unique,royaume_uni, inplace=True)
elif zone_unique.find(tchequie) != -1:
df["Zone"].replace(zone_unique,tchequie, inplace=True)
# Il faut tout d'abord faire une jointure entre la table population et la table sous nutrition, en ciblant l'année 2017
#Sélection année 2017 et visualisation du nombre de pays dans le tableau sous_nutrition
df_sous_nutrition_2017 = df_sous_nutrition.loc[df_sous_nutrition["Année"] == "2016-2018"]
#Suppression de la colonne année pour éviter une redondance lors de la jointure
df_sous_nutrition_2017.drop(columns="Année", inplace=True)
df_sous_nutrition_2017.info()
<class 'pandas.core.frame.DataFrame'> Index: 203 entries, 4 to 1216 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 203 non-null object 1 Sous nutrition 203 non-null float64 dtypes: float64(1), object(1) memory usage: 4.8+ KB
#Sélection année 2017 et visualisation du nombre de pays dans le tableau population
df_population_2017 = df_population.loc[df_population["Année"] == 2017]
df_population_2017.info()
<class 'pandas.core.frame.DataFrame'> Index: 236 entries, 4 to 1414 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 236 non-null object 1 Année 236 non-null int64 2 Population 236 non-null int32 dtypes: int32(1), int64(1), object(1) memory usage: 6.5+ KB
# Merge sur df_population_2017 car plus de pays
df_sous_nutrition = df_population_2017.merge(df_sous_nutrition_2017, on='Zone')
df_sous_nutrition.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 203 entries, 0 to 202 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 203 non-null object 1 Année 203 non-null int64 2 Population 203 non-null int32 3 Sous nutrition 203 non-null float64 dtypes: float64(1), int32(1), int64(1), object(1) memory usage: 5.7+ KB
#Affichage du dataset
df_sous_nutrition.head()
Zone | Année | Population | Sous nutrition | |
---|---|---|---|---|
0 | Afghanistan | 2017 | 36296000 | 10500000.0 |
1 | Afrique du Sud | 2017 | 57009000 | 3100000.0 |
2 | Albanie | 2017 | 2884000 | 100000.0 |
3 | Algérie | 2017 | 41389000 | 1300000.0 |
4 | Allemagne | 2017 | 82658000 | 0.0 |
df_sous_nutrition.tail()
Zone | Année | Population | Sous nutrition | |
---|---|---|---|---|
198 | Venezuela (République bolivarienne du) | 2017 | 29402000 | 8000000.0 |
199 | Viet Nam | 2017 | 94600000 | 6500000.0 |
200 | Yémen | 2017 | 27834000 | 0.0 |
201 | Zambie | 2017 | 16853000 | 0.0 |
202 | Zimbabwe | 2017 | 14236000 | 0.0 |
#Calcul et affichage du nombre de personnes en état de sous nutrition
ss_nourris = df_sous_nutrition["Sous nutrition"].sum()
print("Il y a",split_milliers(ss_nourris)," personnes en sous nutrition dans le monde en 2017.")
Il y a 535'700'000 personnes en sous nutrition dans le monde en 2017.
#Calcul et affichage du nombre total de personnes sur le globe
population = df_sous_nutrition["Population"].sum()
print("Il y a",split_milliers(population)," personnes dans le monde en 2017.")
Il y a 7'543'700'000 personnes dans le monde en 2017.
#Calcul et affichage de la proportion de personnes sous-nourries sur Terre
ratio_ss_nourri = ss_nourris * 100 / population
print("Il y a {}% personnes en sous nutrition dans le monde en 2017.".format(ratio_ss_nourri.round(2)))
Il y a 7.1% personnes en sous nutrition dans le monde en 2017.
#Combien mange en moyenne un être humain ?
#Source => https://www.msdmanuals.com/fr/accueil/multimedia/table/nombre-de-calories-n%C3%A9cessaires-estim%C3%A9-dapr%C3%A8s-l%C3%A2ge-le-sexe-et-le-niveau-dactivit%C3%A9-physique
"""
Nombre de calories nécessaires estimé d’après l’âge, le sexe et le niveau d’activité physique (en kcal/jour/pers)
Moyennes calculées sur le sexe et l'activité moyenne (Sedentaire + Actif)
Moyenne Jeunes enfants (âgés de 2 à 6 ans): 1250
Moyenne Enfants plus âgés et adolescents (âgés de 7 à 18 ans): 1950
Moyenne Adultes (âgés de 19 à 60 ans): 2250
Moyenne Adultes (âgés de 61 ans et plus): 1975
Moyenne global : 1856 -> arrondi à 1900 kcal (stable chaque année)
"""
kcal_moy_pers_jour = 1900
print("La consommation moyenne dans le monde est de {} calories par personne et par jour.".format(kcal_moy_pers_jour))
La consommation moyenne dans le monde est de 1900 calories par personne et par jour.
#On veut faire une jointure entre le df_population et df_dispo_alimentaire, mais avant vérifions leur taille
print("Nombre de zone pour:\n df_dispo_alimentaire =",df_dispo_alimentaire["Zone"].unique().shape[0],
"\n df_sous_nutrition =",df_sous_nutrition["Zone"].unique().shape[0])
Nombre de zone pour: df_dispo_alimentaire = 174 df_sous_nutrition = 203
#Il semble manquer des zones dans le df_dispo_alimentaire
zones_ss_nutr = df_sous_nutrition["Zone"].unique()
zones_disp_alim = df_dispo_alimentaire["Zone"].unique()
zones_manquantes = []
for zone in zones_ss_nutr:
if zone not in zones_disp_alim:
zones_manquantes.append(zone)
print(len(zones_manquantes),"zones manquantes, dont:", zones_manquantes)
29 zones manquantes, dont: ['Andorre', 'Bahreïn', 'Bhoutan', 'Burundi', 'Comores', 'Érythrée', 'Groenland', 'Guinée équatoriale', 'Îles Cook', 'Îles Marshall', 'Libye', 'Micronésie (États fédérés de)', 'Nauru', 'Nioué', 'Palaos', 'Palestine', 'Papouasie-Nouvelle-Guinée', 'Porto Rico', 'Qatar', 'République arabe syrienne', 'République démocratique du Congo', 'Samoa américaines', 'Seychelles', 'Singapour', 'Somalie', 'Soudan du Sud', 'Tokélaou', 'Tonga', 'Tuvalu']
Ce sont majoritairement des ìles qui ne sont pas recencées dans le data frame df_dispo_alimentaire
#On commence par faire une jointure entre le data frame population et Dispo_alimentaire afin d'ajouter dans ce dernier la population
#Merge sur df_sous_nutrition pour garder les zones non_renseignées de df_dispo_alimentaire
df_sous_nutrition = df_sous_nutrition.merge(df_dispo_alimentaire, how="left", on='Zone')
#Affichage du nouveau dataframe
df_sous_nutrition.info()
df_sous_nutrition.head()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 15634 entries, 0 to 15633 Data columns (total 21 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 15634 non-null object 1 Année 15634 non-null int64 2 Population 15634 non-null int32 3 Sous nutrition 15634 non-null float64 4 Produit 15605 non-null object 5 Origine 15605 non-null object 6 Aliments pour animaux (kg) 15605 non-null float64 7 Autres Utilisations (kg) 15605 non-null float64 8 Disponibilité alimentaire (Kcal/personne/jour) 15605 non-null float64 9 Disponibilité alimentaire en quantité (kg/personne/an) 15605 non-null float64 10 Disponibilité de matière grasse en quantité (g/personne/jour) 15605 non-null float64 11 Disponibilité de protéines en quantité (g/personne/jour) 15605 non-null float64 12 Disponibilité intérieure (kg) 15605 non-null float64 13 Exportations - Quantité (kg) 15605 non-null float64 14 Importations - Quantité (kg) 15605 non-null float64 15 Nourriture (kg) 15605 non-null float64 16 Pertes (kg) 15605 non-null float64 17 Production (kg) 15605 non-null float64 18 Semences (kg) 15605 non-null float64 19 Traitement (kg) 15605 non-null float64 20 Variation de stock (kg) 15605 non-null float64 dtypes: float64(16), int32(1), int64(1), object(3) memory usage: 2.4+ MB
Zone | Année | Population | Sous nutrition | Produit | Origine | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | ... | Disponibilité de protéines en quantité (g/personne/jour) | Disponibilité intérieure (kg) | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | 2017 | 36296000 | 10500000.0 | Abats Comestible | animale | 0.0 | 0.0 | 5.0 | 1.72 | ... | 0.77 | 53000000.0 | 0.0 | 0.0 | 53000000.0 | 0.0 | 53000000.0 | 0.0 | 0.0 | 0.0 |
1 | Afghanistan | 2017 | 36296000 | 10500000.0 | Agrumes, Autres | vegetale | 0.0 | 0.0 | 1.0 | 1.29 | ... | 0.02 | 41000000.0 | 2000000.0 | 40000000.0 | 39000000.0 | 2000000.0 | 3000000.0 | 0.0 | 0.0 | 0.0 |
2 | Afghanistan | 2017 | 36296000 | 10500000.0 | Aliments pour enfants | vegetale | 0.0 | 0.0 | 1.0 | 0.06 | ... | 0.03 | 2000000.0 | 0.0 | 2000000.0 | 2000000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | Afghanistan | 2017 | 36296000 | 10500000.0 | Ananas | vegetale | 0.0 | 0.0 | 0.0 | 0.00 | ... | 0.00 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
4 | Afghanistan | 2017 | 36296000 | 10500000.0 | Bananes | vegetale | 0.0 | 0.0 | 4.0 | 2.70 | ... | 0.05 | 82000000.0 | 0.0 | 82000000.0 | 82000000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
5 rows × 21 columns
df_sous_nutrition.tail()
Zone | Année | Population | Sous nutrition | Produit | Origine | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | ... | Disponibilité de protéines en quantité (g/personne/jour) | Disponibilité intérieure (kg) | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
15629 | Zimbabwe | 2017 | 14236000 | 0.0 | Viande de Suides | animale | 0.0 | 0.0 | 24.0 | 2.65 | ... | 0.83 | 37000000.0 | 0.0 | 6000000.0 | 37000000.0 | 0.0 | 32000000.0 | 0.0 | 0.0 | 0.0 |
15630 | Zimbabwe | 2017 | 14236000 | 0.0 | Viande de Volailles | animale | 0.0 | 0.0 | 17.0 | 4.97 | ... | 1.69 | 70000000.0 | 0.0 | 6000000.0 | 70000000.0 | 0.0 | 64000000.0 | 0.0 | 0.0 | 0.0 |
15631 | Zimbabwe | 2017 | 14236000 | 0.0 | Viande, Autre | animale | 0.0 | 1000000.0 | 7.0 | 2.29 | ... | 1.12 | 34000000.0 | 3000000.0 | 1000000.0 | 32000000.0 | 0.0 | 36000000.0 | 0.0 | 0.0 | 0.0 |
15632 | Zimbabwe | 2017 | 14236000 | 0.0 | Vin | vegetale | 0.0 | 0.0 | 1.0 | 0.27 | ... | 0.00 | 4000000.0 | 0.0 | 2000000.0 | 4000000.0 | 0.0 | 2000000.0 | 0.0 | 0.0 | 0.0 |
15633 | Zimbabwe | 2017 | 14236000 | 0.0 | Épices, Autres | vegetale | 0.0 | 0.0 | 1.0 | 0.06 | ... | 0.02 | 1000000.0 | 0.0 | 0.0 | 1000000.0 | 0.0 | 1000000.0 | 0.0 | 0.0 | 0.0 |
5 rows × 21 columns
#Création de la colonne dispo_kcal avec calcul des kcal disponibles mondialement
df_sous_nutrition["Disponibilité alimentaire (Kcal)"] = df_sous_nutrition["Disponibilité alimentaire (Kcal/personne/jour)"] * df_sous_nutrition["Population"] * 365
#Création de la variable contenant le total de calories disponibles mondialement pour la consommation humaine
kcal_dispo_monde = df_sous_nutrition["Disponibilité alimentaire (Kcal)"].sum()
print("Il y a",split_milliers(kcal_dispo_monde), "kcal disponibles au niveau mondial sur une année.")
Il y a 7'731'400'519'315'000 kcal disponibles au niveau mondial sur une année.
#Calcul du nombre d'humains pouvant être nourris
capacite_pop_mondiale = kcal_dispo_monde / kcal_moy_pers_jour / 365
print("Il est possible de nourrir",split_milliers(capacite_pop_mondiale),
"personnes à raison de", split_milliers(kcal_moy_pers_jour),
"kcal par personnes et par jour pendant une année.")
Il est possible de nourrir 11'148'378'542 personnes à raison de 1'900 kcal par personnes et par jour pendant une année.
# Calcule de la population mondiale en 2017
df_temp = df_sous_nutrition.groupby(["Zone"])["Population"].mean()
df_temp = df_temp.reset_index()
#Création de la variable contenant la population mondiale en 2017
population_mondiale = df_temp["Population"].sum()
#Transfert des données avec les végétaux dans un nouveau dataframe
df_vegetaux = df_sous_nutrition.loc[df_sous_nutrition["Origine"] == "vegetale"].reset_index()
#Affichage de la taille du data frame
df_vegetaux.shape
(11896, 23)
#Calcul du nombre de kcal disponible pour les végétaux
kcal_vege_dispo_monde = df_vegetaux["Disponibilité alimentaire (Kcal)"].sum()
print("Il y a",split_milliers(kcal_vege_dispo_monde), "kcal végétales disponibles au niveau mondial sur une année.")
Il y a 6'368'999'610'730'000 kcal végétales disponibles au niveau mondial sur une année.
#Calcul du nombre d'humains pouvant être nourris avec les végétaux
capacite_vege_pop_mondiale = kcal_vege_dispo_monde / kcal_moy_pers_jour / 365
print("Il est possible de nourrir",split_milliers(capacite_vege_pop_mondiale),
"personnes à raison de", split_milliers(kcal_moy_pers_jour),
"calories végétales par personnes et par jour pendant une année.")
Il est possible de nourrir 9'183'849'474 personnes à raison de 1'900 calories végétales par personnes et par jour pendant une année.
#Calcul du ratio de calories végétales sur le total des calories
ratio_vege = round(kcal_vege_dispo_monde * 100 / kcal_dispo_monde,2)
print("Les calories végétales représentent {}% des calories totales disponibles.".format(ratio_vege))
Les calories végétales représentent 82.38% des calories totales disponibles.
#Affichage global du data frame
df_sous_nutrition.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 15634 entries, 0 to 15633 Data columns (total 22 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Zone 15634 non-null object 1 Année 15634 non-null int64 2 Population 15634 non-null int32 3 Sous nutrition 15634 non-null float64 4 Produit 15605 non-null object 5 Origine 15605 non-null object 6 Aliments pour animaux (kg) 15605 non-null float64 7 Autres Utilisations (kg) 15605 non-null float64 8 Disponibilité alimentaire (Kcal/personne/jour) 15605 non-null float64 9 Disponibilité alimentaire en quantité (kg/personne/an) 15605 non-null float64 10 Disponibilité de matière grasse en quantité (g/personne/jour) 15605 non-null float64 11 Disponibilité de protéines en quantité (g/personne/jour) 15605 non-null float64 12 Disponibilité intérieure (kg) 15605 non-null float64 13 Exportations - Quantité (kg) 15605 non-null float64 14 Importations - Quantité (kg) 15605 non-null float64 15 Nourriture (kg) 15605 non-null float64 16 Pertes (kg) 15605 non-null float64 17 Production (kg) 15605 non-null float64 18 Semences (kg) 15605 non-null float64 19 Traitement (kg) 15605 non-null float64 20 Variation de stock (kg) 15605 non-null float64 21 Disponibilité alimentaire (Kcal) 15605 non-null float64 dtypes: float64(17), int32(1), int64(1), object(3) memory usage: 2.6+ MB
#Création d'une boucle for pour afficher les différentes valeurs en fonction des colonnes aliments pour animaux, pertes, nourritures, etc...
cat_disponibilites = ["Production (kg)", "Importations - Quantité (kg)",
"Exportations - Quantité (kg)", "Variation de stock (kg)", "Disponibilité intérieure (kg)"]
#Création d'un dictionnaire avec chaque série aggrégée en somme
dict_series = dict_sum_series(cat_disponibilites, df_sous_nutrition)
#Calcul Disponibilité interieur par les mouvements
a = dict_series["Production (kg)"] + dict_series["Importations - Quantité (kg)"] - dict_series["Exportations - Quantité (kg)"] + dict_series["Variation de stock (kg)"]
#Récupération de la Disponibilité interieur
b = dict_series["Disponibilité intérieure (kg)"]
#Calcul Disponibilité interieur par la distribution des ressources
#Création d'une boucle for pour afficher les différentes valeurs en fonction des colonnes aliments pour animaux, pertes, nourritures,
cat_disponibilites = [ "Aliments pour animaux (kg)", "Pertes (kg)", "Nourriture (kg)",
"Semences (kg)", "Traitement (kg)", "Autres Utilisations (kg)"]
#Création d'un dictionnaire avec chaque série aggrégée en somme
dict_series = dict_sum_series(cat_disponibilites, df_sous_nutrition)
c = 0
for serie in dict_series:
c += dict_series[serie]
print("\nIl y a:\n",split_milliers(b),"k tonnes de Disponibilité intérieur\n",
split_milliers(a),"k tonnes de Prod. + Import. - Export. + Variation\n",
split_milliers(c),"k tonnes d'Alim. animaux + Pertes + Nourriture + Semences + Traitement + Autres util.")
Il y a: 9'848'994'000'000 k tonnes de Disponibilité intérieur 9'849'173'000'000 k tonnes de Prod. + Import. - Export. + Variation 9'858'592'000'000 k tonnes d'Alim. animaux + Pertes + Nourriture + Semences + Traitement + Autres util.
#Organisation des données pour Excel
for serie in dict_series:
print(split_milliers(dict_series[serie]),"kg dédiés pour:", serie)
dict_series = pd.DataFrame(list(dict_series.items()))
1'304'245'000'000 kg dédiés pour: Aliments pour animaux (kg) 453'698'000'000 kg dédiés pour: Pertes (kg) 4'876'258'000'000 kg dédiés pour: Nourriture (kg) 154'681'000'000 kg dédiés pour: Semences (kg) 2'204'687'000'000 kg dédiés pour: Traitement (kg) 865'023'000'000 kg dédiés pour: Autres Utilisations (kg)
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°7
savedto_excel( dict_series, "Slide 7")
#Création d'une liste avec toutes les variables selon Julien Laole (exercice)
#Julien propose d'ajouter le Soja -> Soja == légumineuse sèche != céréale
cereales = ["Blé","Riz (Eq Blanchi)","Orge","Maïs","Seigle","Avoine","Millet","Sorgho","Céréales, Autres"]
cereales
['Blé', 'Riz (Eq Blanchi)', 'Orge', 'Maïs', 'Seigle', 'Avoine', 'Millet', 'Sorgho', 'Céréales, Autres']
#Vérification qu'il n'en manque pas
verif_cereales = df_vegetaux["Produit"].unique()
#Passage d'un array (matrice de 1) en liste
verif_cereales = verif_cereales.tolist()
verif_cereales
['Agrumes, Autres', 'Aliments pour enfants', 'Ananas', 'Bananes', 'Bière', 'Blé', 'Boissons Alcooliques', 'Café', 'Coco (Incl Coprah)', 'Céréales, Autres', 'Dattes', 'Edulcorants Autres', 'Feve de Cacao', 'Fruits, Autres', 'Graines de coton', 'Graines de tournesol', 'Huil Plantes Oleif Autr', 'Huile Graines de Coton', "Huile d'Arachide", "Huile d'Olive", 'Huile de Colza&Moutarde', 'Huile de Palme', 'Huile de Soja', 'Huile de Sésame', 'Huile de Tournesol', 'Légumes, Autres', 'Légumineuses Autres', 'Maïs', 'Miel', 'Millet', 'Miscellanees', 'Noix', 'Olives', 'Oranges, Mandarines', 'Orge', 'Plantes Oleiferes, Autre', 'Poivre', 'Pommes', 'Pommes de Terre', 'Raisin', 'Riz (Eq Blanchi)', 'Sucre Eq Brut', 'Sucre, betterave', 'Sucre, canne', 'Sésame', 'Thé', 'Tomates', 'Vin', 'Épices, Autres', 'Alcool, non Comestible', 'Arachides Decortiquees', 'Avoine', 'Bananes plantains', 'Boissons Fermentés', 'Citrons & Limes', 'Girofles', 'Graines Colza/Moutarde', 'Haricots', 'Huile de Coco', 'Huile de Germe de Maïs', 'Huile de Palmistes', 'Ignames', 'Manioc', 'Oignons', 'Palmistes', 'Pamplemousse', 'Patates douces', 'Piments', 'Pois', 'Racines nda', 'Seigle', 'Soja', 'Sorgho', 'Huile de Son de Riz', 'Sucre non centrifugé']
#Création d'un dataframe avec les informations uniquement pour ces céréales
df_cereales = df_sous_nutrition.loc[df_sous_nutrition["Produit"].isin(cereales)]
#Affichage de la taille du data frame
df_cereales.shape
(1497, 22)
#Affichage du data frame
df_cereales.head()
Zone | Année | Population | Sous nutrition | Produit | Origine | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | ... | Disponibilité intérieure (kg) | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | Disponibilité alimentaire (Kcal) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
7 | Afghanistan | 2017 | 36296000 | 10500000.0 | Blé | vegetale | 0.0 | 0.0 | 1369.0 | 160.23 | ... | 5.992000e+09 | 0.0 | 1.173000e+09 | 4.895000e+09 | 775000000.0 | 5.169000e+09 | 322000000.0 | 0.0 | -350000000.0 | 1.813657e+13 |
12 | Afghanistan | 2017 | 36296000 | 10500000.0 | Céréales, Autres | vegetale | 0.0 | 0.0 | 0.0 | 0.00 | ... | 0.000000e+00 | 0.0 | 0.000000e+00 | 0.000000e+00 | 0.0 | 0.000000e+00 | 0.0 | 0.0 | 0.0 | 0.000000e+00 |
32 | Afghanistan | 2017 | 36296000 | 10500000.0 | Maïs | vegetale | 200000000.0 | 0.0 | 21.0 | 2.50 | ... | 3.130000e+08 | 0.0 | 1.000000e+06 | 7.600000e+07 | 31000000.0 | 3.120000e+08 | 5000000.0 | 0.0 | 0.0 | 2.782088e+11 |
34 | Afghanistan | 2017 | 36296000 | 10500000.0 | Millet | vegetale | 0.0 | 0.0 | 3.0 | 0.40 | ... | 1.300000e+07 | 0.0 | 0.000000e+00 | 1.200000e+07 | 1000000.0 | 1.300000e+07 | 0.0 | 0.0 | 0.0 | 3.974412e+10 |
40 | Afghanistan | 2017 | 36296000 | 10500000.0 | Orge | vegetale | 360000000.0 | 0.0 | 26.0 | 2.92 | ... | 5.240000e+08 | 0.0 | 1.000000e+07 | 8.900000e+07 | 52000000.0 | 5.140000e+08 | 22000000.0 | 0.0 | 0.0 | 3.444490e+11 |
5 rows × 22 columns
#Affichage de la proportion d'alimentation animale
cat_disponibilites = ["Aliments pour animaux (kg)", "Disponibilité intérieure (kg)"]
dict_series = dict_sum_series(cat_disponibilites, df_cereales)
#Création du ratio
ratio_cereales_animale = dict_series["Aliments pour animaux (kg)"] * 100 / dict_series["Disponibilité intérieure (kg)"]
print("Il y a {}% des céréales qui sont dédiés à l'alimentation animale.".format(ratio_cereales_animale.round(2)))
Il y a 36.29% des céréales qui sont dédiés à l'alimentation animale.
#Affichage de la proportion d'alimentation humaine
cat_disponibilites = ["Nourriture (kg)", "Disponibilité intérieure (kg)"]
dict_series = dict_sum_series(cat_disponibilites, df_cereales)
ratio_cereales_humain = dict_series["Nourriture (kg)"] * 100 / dict_series["Disponibilité intérieure (kg)"]
print("Il y a", ratio_cereales_humain.round(2),"% des céréales qui sont dédiés à l'alimentation humaine.")
Il y a 42.75 % des céréales qui sont dédiés à l'alimentation humaine.
#Affichage de la proportion d'utilisations diverses
cat_disponibilites = ["Pertes (kg)","Semences (kg)","Traitement (kg)",
"Autres Utilisations (kg)", "Disponibilité intérieure (kg)"]
dict_series = dict_sum_series(cat_disponibilites, df_cereales)
autres_utilisations = dict_series["Pertes (kg)"] + dict_series["Semences (kg)"] + dict_series["Traitement (kg)"] + dict_series["Autres Utilisations (kg)"]
ratio_cereales_divers = autres_utilisations * 100 / dict_series["Disponibilité intérieure (kg)"]
print("Il y a", ratio_cereales_divers.round(2),"% des céréales qui sont dédiés à diverses utilisations ou pertes.")
Il y a 20.98 % des céréales qui sont dédiés à diverses utilisations ou pertes.
#Vérification que l'on tombe bien sur un total à 100%
Test_parts_disponibilite_cereales = ratio_cereales_animale + ratio_cereales_humain + ratio_cereales_divers
Test_parts_disponibilite_cereales.round(1)
100.0
#On va envoyer les valeurs si dessus dans notre fichier excel
#Création du dictionnaire de valeurs
dict_ratio_cereales = pd.DataFrame(list({
"Alimentation animaux":ratio_cereales_animale,
"Alimentations humaine":ratio_cereales_humain,
"Utilisations diverses & pertes":ratio_cereales_divers
}.items()))
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°8
savedto_excel(dict_ratio_cereales,"Slide 8")
#Nous allons regarder comment sont distribués les différents céréales
#Création du dataframe
df_details_cereales = df_cereales.groupby(["Produit"])[["Aliments pour animaux (kg)", "Disponibilité intérieure (kg)","Nourriture (kg)"]].sum().reset_index()
df_details_cereales
Produit | Aliments pour animaux (kg) | Disponibilité intérieure (kg) | Nourriture (kg) | |
---|---|---|---|---|
0 | Avoine | 1.625100e+10 | 2.340700e+10 | 3.903000e+09 |
1 | Blé | 1.296680e+11 | 6.794980e+11 | 4.578240e+11 |
2 | Céréales, Autres | 1.903500e+10 | 2.748500e+10 | 5.324000e+09 |
3 | Maïs | 5.461160e+11 | 9.557990e+11 | 1.251840e+11 |
4 | Millet | 3.306000e+09 | 2.991100e+10 | 2.304000e+10 |
5 | Orge | 9.265800e+10 | 1.404390e+11 | 6.794000e+09 |
6 | Riz (Eq Blanchi) | 3.359400e+10 | 4.756560e+11 | 3.772860e+11 |
7 | Seigle | 8.099000e+09 | 1.656700e+10 | 5.502000e+09 |
8 | Sorgho | 2.480800e+10 | 5.823700e+10 | 2.415300e+10 |
#Affichage de la proportion des différents céréales pour l'alimentation animale
dict_details_cereales_animale = {}
#Création des ratios Quantité animale vs Quantité intérieur
for produit in df_details_cereales["Produit"]:
produit_animal = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Aliments pour animaux (kg)"].sum()
produit_interieur = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Disponibilité intérieure (kg)"].sum()
dict_details_cereales_animale[produit] = round( produit_animal * 100 / produit_interieur, 2)
#Organisation des données pour Excel
dict_details_cereales_animale = pd.DataFrame(list(dict_details_cereales_animale.items()))
dict_details_cereales_animale.rename(columns={0:"Produit", 1:"Ratio Quantité animale / Quantité intérieur"}, inplace=True)
dict_details_cereales_animale
Produit | Ratio Quantité animale / Quantité intérieur | |
---|---|---|
0 | Avoine | 69.43 |
1 | Blé | 19.08 |
2 | Céréales, Autres | 69.26 |
3 | Maïs | 57.14 |
4 | Millet | 11.05 |
5 | Orge | 65.98 |
6 | Riz (Eq Blanchi) | 7.06 |
7 | Seigle | 48.89 |
8 | Sorgho | 42.60 |
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°8 - détail animale
savedto_excel(dict_details_cereales_animale,"Slide 8 - details animale")
#Affichage de la proportion des différents céréales pour l'alimentation humaine
dict_details_cereales_humaine = {}
#Création des ratios Quantité nourriture vs Quantité intérieur
for produit in df_details_cereales["Produit"]:
produit_nourriture = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Nourriture (kg)"].sum()
produit_interieur = df_details_cereales.loc[df_details_cereales["Produit"] == produit]["Disponibilité intérieure (kg)"].sum()
dict_details_cereales_humaine[produit] = round(produit_nourriture * 100 /produit_interieur, 2)
#Organisation des données pour Excel
dict_details_cereales_humaine = pd.DataFrame(list(dict_details_cereales_humaine.items()))
dict_details_cereales_humaine.rename(columns={0:"Produit", 1:"Ratio Quantité nourriture / Quantité intérieur"}, inplace=True)
dict_details_cereales_humaine
Produit | Ratio Quantité nourriture / Quantité intérieur | |
---|---|---|
0 | Avoine | 16.67 |
1 | Blé | 67.38 |
2 | Céréales, Autres | 19.37 |
3 | Maïs | 13.10 |
4 | Millet | 77.03 |
5 | Orge | 4.84 |
6 | Riz (Eq Blanchi) | 79.32 |
7 | Seigle | 33.21 |
8 | Sorgho | 41.47 |
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°8 - détail humaine
savedto_excel( dict_details_cereales_humaine, "Slide 8 - details humain")
#Création de la colonne proportion par pays
df_sous_nutrition["Ratio de population sous nourrie (%)"] = round(df_sous_nutrition["Sous nutrition"] * 100 / df_sous_nutrition["Population"],2)
#Création d'un dataframe temporaire avec les données aggrégées par Pays
df_temp = df_sous_nutrition.groupby(["Zone"])[["Population","Sous nutrition","Ratio de population sous nourrie (%)"]].mean().reset_index()
#Affichage après trie des 10 pires pays
df_temp.sort_values("Ratio de population sous nourrie (%)",ascending=False, inplace=True)
df_temp.head(10)
Zone | Population | Sous nutrition | Ratio de population sous nourrie (%) | |
---|---|---|---|---|
72 | Haïti | 10982000.0 | 5300000.0 | 48.26 |
151 | République populaire démocratique de Corée | 25429000.0 | 12000000.0 | 47.19 |
99 | Madagascar | 25570000.0 | 10500000.0 | 41.06 |
95 | Libéria | 4702000.0 | 1800000.0 | 38.28 |
91 | Lesotho | 2091000.0 | 800000.0 | 38.26 |
174 | Tchad | 15016000.0 | 5700000.0 | 37.96 |
143 | Rwanda | 11980000.0 | 4200000.0 | 35.06 |
112 | Mozambique | 28649000.0 | 9400000.0 | 32.81 |
177 | Timor-Leste | 1243000.0 | 400000.0 | 32.18 |
0 | Afghanistan | 36296000.0 | 10500000.0 | 28.93 |
#Organisation des données pour Excel
dict_toppays_ssnourris = {}
for zone in df_temp["Zone"]:
dict_toppays_ssnourris[zone] = df_temp.loc[df_temp["Zone"] == zone]["Ratio de population sous nourrie (%)"].sum()
dict_toppays_ssnourris = pd.DataFrame(list(dict_toppays_ssnourris.items()))
dict_toppays_ssnourris.rename(columns={0:"Zone", 1:"Ratio de population sous nourrie (%)"}, inplace=True)
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°9
savedto_excel( dict_toppays_ssnourris,"Slide 9")
#Calcul du total de l'aide alimentaire par pays
total_aide_alim_pays = df_aide_alimentaire.groupby(["Zone"])["Aide alimentaire (kg)"].sum()
#Affichage après trie des 10 pays qui ont bénéficié le plus de l'aide alimentaire
total_aide_alim_pays = total_aide_alim_pays.sort_values(ascending=False).head(10).reset_index()
total_aide_alim_pays
Zone | Aide alimentaire (kg) | |
---|---|---|
0 | République arabe syrienne | 1858943000 |
1 | Éthiopie | 1381294000 |
2 | Yémen | 1206484000 |
3 | Soudan du Sud | 695248000 |
4 | Soudan | 669784000 |
5 | Kenya | 552836000 |
6 | Bangladesh | 348188000 |
7 | Somalie | 292678000 |
8 | République démocratique du Congo | 288502000 |
9 | Niger | 276344000 |
#Organisation des données pour l'envoie vers Excel
dict_toppays_aide = {}
for zone in total_aide_alim_pays["Zone"]:
dict_toppays_aide[zone] = total_aide_alim_pays.loc[total_aide_alim_pays["Zone"] == zone]["Aide alimentaire (kg)"].sum()
dict_toppays_aide = pd.DataFrame(list(dict_toppays_aide.items()))
dict_toppays_aide.rename(columns={0:"Zone", 1:"Aide alimentaire (kg)"}, inplace=True)
dict_toppays_aide
Zone | Aide alimentaire (kg) | |
---|---|---|
0 | République arabe syrienne | 1858943000 |
1 | Éthiopie | 1381294000 |
2 | Yémen | 1206484000 |
3 | Soudan du Sud | 695248000 |
4 | Soudan | 669784000 |
5 | Kenya | 552836000 |
6 | Bangladesh | 348188000 |
7 | Somalie | 292678000 |
8 | République démocratique du Congo | 288502000 |
9 | Niger | 276344000 |
#Envoie des valeurs affichées ci-dessus dans un fichier Excel pour le slide n°10
savedto_excel(dict_toppays_aide, "Slide 10")
#Création d'un dataframe avec la zone, l'année et l'aide alimentaire puis groupby sur zone et année
df_aide_alim_global = df_aide_alimentaire.groupby(["Zone","Année"])["Aide alimentaire (kg)"].sum().reset_index()
df_aide_alim_global
Zone | Année | Aide alimentaire (kg) | |
---|---|---|---|
0 | Afghanistan | 2013 | 128238000 |
1 | Afghanistan | 2014 | 57214000 |
2 | Algérie | 2013 | 35234000 |
3 | Algérie | 2014 | 18980000 |
4 | Algérie | 2015 | 17424000 |
... | ... | ... | ... |
223 | Égypte | 2013 | 1122000 |
224 | Équateur | 2013 | 1362000 |
225 | Éthiopie | 2013 | 591404000 |
226 | Éthiopie | 2014 | 586624000 |
227 | Éthiopie | 2015 | 203266000 |
228 rows × 3 columns
#Création d'une liste contenant les 5 pays qui ont le plus bénéficiées de l'aide alimentaire (sur toutes les années)
df_aide_alim_global_total = df_aide_alim_global.groupby(["Zone"])["Aide alimentaire (kg)"].sum().reset_index()
df_aide_alim_global_total = df_aide_alim_global_total.sort_values(["Aide alimentaire (kg)"], ascending=False)
#Récupération des zones du top 5
top5_pays_aides = []
for zone in df_aide_alim_global_total["Zone"].iloc[:5]:
top5_pays_aides.append(zone)
top5_pays_aides
['République arabe syrienne', 'Éthiopie', 'Yémen', 'Soudan du Sud', 'Soudan']
#On filtre sur le dataframe avec notre liste
#Affichage des pays avec l'aide alimentaire par année
df_top5_pays_aides = df_aide_alim_global.loc[df_aide_alim_global["Zone"].isin(top5_pays_aides)]
df_top5_pays_aides
Zone | Année | Aide alimentaire (kg) | |
---|---|---|---|
157 | République arabe syrienne | 2013 | 563566000 |
158 | République arabe syrienne | 2014 | 651870000 |
159 | République arabe syrienne | 2015 | 524949000 |
160 | République arabe syrienne | 2016 | 118558000 |
189 | Soudan | 2013 | 330230000 |
190 | Soudan | 2014 | 321904000 |
191 | Soudan | 2015 | 17650000 |
192 | Soudan du Sud | 2013 | 196330000 |
193 | Soudan du Sud | 2014 | 450610000 |
194 | Soudan du Sud | 2015 | 48308000 |
214 | Yémen | 2013 | 264764000 |
215 | Yémen | 2014 | 103840000 |
216 | Yémen | 2015 | 372306000 |
217 | Yémen | 2016 | 465574000 |
225 | Éthiopie | 2013 | 591404000 |
226 | Éthiopie | 2014 | 586624000 |
227 | Éthiopie | 2015 | 203266000 |
Afin de simplifier la vue graphique
#Création d'un tableau des années disponibles
annees_existantes = df_top5_pays_aides["Année"].unique()
#Création des colonne pour ces années
for annee in annees_existantes:
df_top5_pays_aides[annee] = 0
#Insertion des valeurs des aides pour chaque année et chaque pays
for zone in df_top5_pays_aides["Zone"].unique():
for annee in annees_existantes:
aide_alim_pays = df_top5_pays_aides.loc[(df_top5_pays_aides["Zone"] == zone) & (df_top5_pays_aides["Année"] == annee)]["Aide alimentaire (kg)"].mean()
df_top5_pays_aides[annee].loc[df_top5_pays_aides["Zone"] == zone] = aide_alim_pays
#Suppression des colonnes inutiles
df_top5_pays_aides.drop(columns={"Année","Aide alimentaire (kg)"}, inplace=True)
#Suppression des lignes en doublons
df_top5_pays_aides.drop_duplicates(subset="Zone", keep="first", inplace=True)
df_top5_pays_aides
Zone | 2013 | 2014 | 2015 | 2016 | |
---|---|---|---|---|---|
157 | République arabe syrienne | 563566000 | 651870000 | 524949000 | 118558000.0 |
189 | Soudan | 330230000 | 321904000 | 17650000 | NaN |
192 | Soudan du Sud | 196330000 | 450610000 | 48308000 | NaN |
214 | Yémen | 264764000 | 103840000 | 372306000 | 465574000.0 |
225 | Éthiopie | 591404000 | 586624000 | 203266000 | NaN |
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide 11
savedto_excel(df_top5_pays_aides,'Slide 11')
#Calcul de la disponibilité en kcal par personne par jour par pays
df_disponibilite = df_sous_nutrition.groupby(["Zone"])["Disponibilité alimentaire (Kcal/personne/jour)"].sum()
#Affichage des 10 pays qui ont le moins de dispo alimentaire par personne en 2017 - 1er essai
df_disponibilite.sort_values(ascending=True).head(10)
Zone République démocratique du Congo 0.0 Burundi 0.0 Groenland 0.0 Porto Rico 0.0 Papouasie-Nouvelle-Guinée 0.0 Palestine 0.0 Samoa américaines 0.0 Palaos 0.0 Bhoutan 0.0 Seychelles 0.0 Name: Disponibilité alimentaire (Kcal/personne/jour), dtype: float64
#Ces pays ne semblent pas renseignés, vérifions
df_disponibilite = df_disponibilite.reset_index()
#Création de la liste des pays concernés
zones_dispo_null = []
for zone in df_disponibilite.loc[df_disponibilite["Disponibilité alimentaire (Kcal/personne/jour)"] == 0]["Zone"]:
zones_dispo_null.append(zone)
zones_dispo_null
['Andorre', 'Bahreïn', 'Bhoutan', 'Burundi', 'Comores', 'Groenland', 'Guinée équatoriale', 'Libye', 'Micronésie (États fédérés de)', 'Nauru', 'Nioué', 'Palaos', 'Palestine', 'Papouasie-Nouvelle-Guinée', 'Porto Rico', 'Qatar', 'République arabe syrienne', 'République démocratique du Congo', 'Samoa américaines', 'Seychelles', 'Singapour', 'Somalie', 'Soudan du Sud', 'Tokélaou', 'Tonga', 'Tuvalu', 'Érythrée', 'Îles Cook', 'Îles Marshall']
#Vérifions si les données sont toutes null ou manquantes
df_sous_nutrition.loc[df_sous_nutrition["Zone"].isin(zones_dispo_null)].head()
Zone | Année | Population | Sous nutrition | Produit | Origine | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | ... | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | Disponibilité alimentaire (Kcal) | Ratio de population sous nourrie (%) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
435 | Andorre | 2017 | 77000 | 0.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.0 |
1255 | Bahreïn | 2017 | 1494000 | 0.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.0 |
1888 | Bhoutan | 2017 | 745000 | 0.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.0 |
2539 | Burundi | 2017 | 10827000 | 0.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.0 |
3563 | Comores | 2017 | 813000 | 0.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.0 |
5 rows × 23 columns
#Suppression de ces pays du dataframe df_disponibilite
zones_a_drop = df_disponibilite.loc[df_disponibilite["Zone"].isin(zones_dispo_null)].index
df_disponibilite.drop(zones_a_drop, inplace=True)
#Affichage des 10 pays qui ont le moins de dispo alimentaire par personne en 2017 - 2ème essai
df_disponibilite.sort_values(["Disponibilité alimentaire (Kcal/personne/jour)"],ascending=True).head(10)
Zone | Disponibilité alimentaire (Kcal/personne/jour) | |
---|---|---|
145 | République centrafricaine | 1879.0 |
192 | Zambie | 1924.0 |
99 | Madagascar | 2056.0 |
0 | Afghanistan | 2087.0 |
72 | Haïti | 2089.0 |
151 | République populaire démocratique de Corée | 2093.0 |
174 | Tchad | 2109.0 |
193 | Zimbabwe | 2113.0 |
125 | Ouganda | 2126.0 |
177 | Timor-Leste | 2129.0 |
#Affichage des 10 pays qui ont le plus de dispo alimentaire par personne en 2017
df_disponibilite.sort_values(["Disponibilité alimentaire (Kcal/personne/jour)"], ascending=False).head(10)
Zone | Disponibilité alimentaire (Kcal/personne/jour) | |
---|---|---|
12 | Autriche | 3770.0 |
18 | Belgique | 3737.0 |
184 | Turquie | 3708.0 |
198 | États-Unis d'Amérique | 3682.0 |
81 | Israël | 3610.0 |
79 | Irlande | 3602.0 |
82 | Italie | 3578.0 |
97 | Luxembourg | 3540.0 |
194 | Égypte | 3518.0 |
4 | Allemagne | 3503.0 |
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide 12
savedto_excel(df_disponibilite, 'Slide 12')
#Création d'un dataframe avec uniquement la Thaïlande
df_thailande = df_sous_nutrition.loc[df_sous_nutrition["Zone"] == "Thaïlande"]
df_thailande.head()
Zone | Année | Population | Sous nutrition | Produit | Origine | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | ... | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | Disponibilité alimentaire (Kcal) | Ratio de population sous nourrie (%) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
14331 | Thaïlande | 2017 | 69209000 | 6200000.0 | Abats Comestible | animale | 0.0 | 0.0 | 3.0 | 1.11 | ... | 5.000000e+06 | 33000000.0 | 75000000.0 | 0.0 | 4.500000e+07 | 0.0 | 0.0 | 0.0 | 7.578386e+10 | 8.96 |
14332 | Thaïlande | 2017 | 69209000 | 6200000.0 | Agrumes, Autres | vegetale | 0.0 | 0.0 | 0.0 | 0.09 | ... | 6.000000e+06 | 2000000.0 | 6000000.0 | 0.0 | 1.200000e+07 | 0.0 | 2000000.0 | 0.0 | 0.000000e+00 | 8.96 |
14333 | Thaïlande | 2017 | 69209000 | 6200000.0 | Alcool, non Comestible | vegetale | 0.0 | 358000000.0 | 0.0 | 0.00 | ... | 1.100000e+08 | 21000000.0 | 0.0 | 0.0 | 4.470000e+08 | 0.0 | 0.0 | 0.0 | 0.000000e+00 | 8.96 |
14334 | Thaïlande | 2017 | 69209000 | 6200000.0 | Aliments pour enfants | vegetale | 0.0 | 0.0 | 2.0 | 0.18 | ... | 7.000000e+06 | 19000000.0 | 12000000.0 | 0.0 | 0.000000e+00 | 0.0 | 0.0 | 0.0 | 5.052257e+10 | 8.96 |
14335 | Thaïlande | 2017 | 69209000 | 6200000.0 | Ananas | vegetale | 0.0 | 0.0 | 10.0 | 10.02 | ... | 1.449000e+09 | 9000000.0 | 671000000.0 | 110000000.0 | 2.209000e+09 | 0.0 | 0.0 | 13000000.0 | 2.526128e+11 | 8.96 |
5 rows × 23 columns
#Calcul de la sous nutrition en Thaïlande
ratio_ss_nutrition_thai = df_thailande["Ratio de population sous nourrie (%)"].mean().round(2)
pop_ss_nutrition_thai = df_thailande["Sous nutrition"].mean()
print("Il y a {} personnes en sous nutrition en Thaïlande, soit {}% de la population du pays."
.format(split_milliers(pop_ss_nutrition_thai), ratio_ss_nutrition_thai))
Il y a 6'200'000 personnes en sous nutrition en Thaïlande, soit 8.96% de la population du pays.
#Combien il y a t-il de calories disponibles par personnes/jour?
df_thailande["Disponibilité alimentaire (Kcal/personne/jour)"].sum()
2785.0
2785 calories par pers/jour qui est supérieur à la moyenne necessaire de 1900 calorie et pourtant il y a 9% de population sous-nourrie
#On crée un dataframe dédié au manioc
df_manioc = df_thailande.loc[df_thailande["Produit"] == "Manioc"]
df_manioc
Zone | Année | Population | Sous nutrition | Produit | Origine | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité alimentaire (Kcal/personne/jour) | Disponibilité alimentaire en quantité (kg/personne/an) | ... | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | Disponibilité alimentaire (Kcal) | Ratio de population sous nourrie (%) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
14381 | Thaïlande | 2017 | 69209000 | 6200000.0 | Manioc | vegetale | 1.800000e+09 | 2.081000e+09 | 40.0 | 13.0 | ... | 2.521400e+10 | 1.250000e+09 | 871000000.0 | 1.511000e+09 | 3.022800e+10 | 0.0 | 0.0 | 0.0 | 1.010451e+12 | 8.96 |
1 rows × 23 columns
#Valeurs qui nous interresse
manioc_animaux = df_manioc["Aliments pour animaux (kg)"].sum()
manioc_humain = df_manioc["Nourriture (kg)"].sum()
manioc_pertes = df_manioc["Pertes (kg)"].sum()
manioc_exporte = df_manioc["Exportations - Quantité (kg)"].sum()
manioc_dispo = df_manioc["Disponibilité intérieure (kg)"].sum()
manioc_autres = manioc_dispo - manioc_animaux - manioc_humain - manioc_pertes
#Calcul de la proportion de manioc pour animaux, pour humain, pour autres-utilsations et exportée par rapport à la nourriture
ratio_manioc_dispo_export = manioc_exporte / manioc_humain
ratio_manioc_dispo_animaux = manioc_animaux / manioc_humain
ratio_manioc_pertes = manioc_pertes / manioc_humain
ratio_manioc_dispo_autres = manioc_autres / manioc_humain
print("La Thaïlande exporte",ratio_manioc_dispo_export.round(1),"fois plus de manioc qu'elle n'en utilise pour nourrir sa population.\n",
ratio_manioc_dispo_animaux.round(1),"fois plus de manioc pour animaux qu'elle n'en utilise pour nourrir sa population.\n",
ratio_manioc_pertes.round(1),"fois plus de manioc pour les pertes qu'elle n'en utilise pour nourrir sa population.\n",
ratio_manioc_dispo_autres.round(1),"fois plus de manioc pour d'autres utilisations qu'elle n'en utilise pour nourrir sa population.\n"
)
La Thaïlande exporte 28.9 fois plus de manioc qu'elle n'en utilise pour nourrir sa population. 2.1 fois plus de manioc pour animaux qu'elle n'en utilise pour nourrir sa population. 1.7 fois plus de manioc pour les pertes qu'elle n'en utilise pour nourrir sa population. 2.4 fois plus de manioc pour d'autres utilisations qu'elle n'en utilise pour nourrir sa population.
#Répartition du manioc
part_manioc_animaux = round(manioc_animaux / manioc_dispo * 100, 2)
part_manioc_humain = round(manioc_humain / manioc_dispo * 100, 2)
part_manioc_autres = round(manioc_autres / manioc_dispo * 100, 2)
part_manioc_pertes = round(manioc_pertes / manioc_dispo * 100, 2)
print(part_manioc_animaux,"% sont destinés pour l'usage animal.\n",
part_manioc_humain,"% sont destinés pour l'alimentation.\n",
part_manioc_pertes,"% sont des pertes.\n",
part_manioc_autres,"% sont destinés pour d'autres usages.\n"
)
28.74 % sont destinés pour l'usage animal. 13.9 % sont destinés pour l'alimentation. 24.12 % sont des pertes. 33.24 % sont destinés pour d'autres usages.
Hypothèses à confirmer:
#Il y a t-il d'autres pays dans le cas de la Thaïlande?
variables_interressantes = ["Zone", "Population","Sous nutrition","Produit","Origine","Disponibilité alimentaire (Kcal/personne/jour)",
"Aliments pour animaux (kg)","Autres Utilisations (kg)",
"Disponibilité intérieure (kg)","Exportations - Quantité (kg)", "Importations - Quantité (kg)",
"Nourriture (kg)", "Pertes (kg)", "Production (kg)", "Semences (kg)","Traitement (kg)",
"Variation de stock (kg)", "Ratio de population sous nourrie (%)"]
#Récupération des zones qui ont assez de disponibilité alimentaire totale (kcal/jour/pers) afin de montrer d'autre incohérences
df_temp = df_sous_nutrition.groupby("Zone")["Disponibilité alimentaire (Kcal/personne/jour)"].sum().reset_index()
zones_supmoy_calories = df_temp.loc[df_temp["Disponibilité alimentaire (Kcal/personne/jour)"] >= kcal_moy_pers_jour]["Zone"].unique().tolist()
#Création du dataframe avec seulement les zones sous-nourries ET une dispo alimentaire global suffisante
df_zones_ss_nourries = df_sous_nutrition.loc[(df_sous_nutrition["Ratio de population sous nourrie (%)"] > 0)
&
(df_sous_nutrition["Zone"].isin(zones_supmoy_calories)), variables_interressantes
]
df_zones_ss_nourries = df_zones_ss_nourries.reset_index(drop=True)
df_zones_ss_nourries.head()
Zone | Population | Sous nutrition | Produit | Origine | Disponibilité alimentaire (Kcal/personne/jour) | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité intérieure (kg) | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | Ratio de population sous nourrie (%) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Afghanistan | 36296000 | 10500000.0 | Abats Comestible | animale | 5.0 | 0.0 | 0.0 | 53000000.0 | 0.0 | 0.0 | 53000000.0 | 0.0 | 53000000.0 | 0.0 | 0.0 | 0.0 | 28.93 |
1 | Afghanistan | 36296000 | 10500000.0 | Agrumes, Autres | vegetale | 1.0 | 0.0 | 0.0 | 41000000.0 | 2000000.0 | 40000000.0 | 39000000.0 | 2000000.0 | 3000000.0 | 0.0 | 0.0 | 0.0 | 28.93 |
2 | Afghanistan | 36296000 | 10500000.0 | Aliments pour enfants | vegetale | 1.0 | 0.0 | 0.0 | 2000000.0 | 0.0 | 2000000.0 | 2000000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 28.93 |
3 | Afghanistan | 36296000 | 10500000.0 | Ananas | vegetale | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 28.93 |
4 | Afghanistan | 36296000 | 10500000.0 | Bananes | vegetale | 4.0 | 0.0 | 0.0 | 82000000.0 | 0.0 | 82000000.0 | 82000000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 28.93 |
# On calcule la proportion Exportation/Nourriture
df_zones_ss_nourries["Ratio Exportation/Nourriture (%)"] = (df_zones_ss_nourries["Exportations - Quantité (kg)"] / df_zones_ss_nourries["Nourriture (kg)"]*100).round(2)
#Remplacement des valeurs infinies par des NaN
df_zones_ss_nourries.replace([np.inf, -np.inf], np.nan, inplace=True)
#Suppression des NaN
df_zones_ss_nourries.dropna(inplace=True)
#Suppression des ratios Exportation/Nourriture inférieurs à 100%
df_zones_ss_nourries.drop((df_zones_ss_nourries.loc[df_zones_ss_nourries["Ratio Exportation/Nourriture (%)"] < 100]).index, axis = 0, inplace=True)
df_zones_ss_nourries.head()
Zone | Population | Sous nutrition | Produit | Origine | Disponibilité alimentaire (Kcal/personne/jour) | Aliments pour animaux (kg) | Autres Utilisations (kg) | Disponibilité intérieure (kg) | Exportations - Quantité (kg) | Importations - Quantité (kg) | Nourriture (kg) | Pertes (kg) | Production (kg) | Semences (kg) | Traitement (kg) | Variation de stock (kg) | Ratio de population sous nourrie (%) | Ratio Exportation/Nourriture (%) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
64 | Afrique du Sud | 57009000 | 3100000.0 | Ananas | vegetale | 1.0 | 0.0 | 0.0 | 48000000.0 | 72000000.0 | 14000000.0 | 43000000.0 | 5000000.0 | 101000000.0 | 0.0 | 0.0 | 4000000.0 | 5.44 | 167.44 |
74 | Afrique du Sud | 57009000 | 3100000.0 | Boissons Fermentés | vegetale | 0.0 | 0.0 | 0.0 | 1000000.0 | 122000000.0 | 7000000.0 | 1000000.0 | 0.0 | 64000000.0 | 0.0 | 0.0 | 51000000.0 | 5.44 | 12200.00 |
77 | Afrique du Sud | 57009000 | 3100000.0 | Citrons & Limes | vegetale | 0.0 | 0.0 | 0.0 | 33000000.0 | 253000000.0 | 2000000.0 | 20000000.0 | 13000000.0 | 257000000.0 | 0.0 | 0.0 | 27000000.0 | 5.44 | 1265.00 |
81 | Afrique du Sud | 57009000 | 3100000.0 | Céréales, Autres | vegetale | 1.0 | 8000000.0 | 0.0 | 12000000.0 | 10000000.0 | 3000000.0 | 4000000.0 | 0.0 | 19000000.0 | 0.0 | 0.0 | 0.0 | 5.44 | 250.00 |
82 | Afrique du Sud | 57009000 | 3100000.0 | Dattes | vegetale | 0.0 | 0.0 | 0.0 | 1000000.0 | 2000000.0 | 2000000.0 | 1000000.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 5.44 | 200.00 |
#Combien il y a de pays en sous-nutrition
df_temp = df_sous_nutrition.loc[(df_sous_nutrition["Ratio de population sous nourrie (%)"] > 0),["Zone","Ratio de population sous nourrie (%)"]]
df_temp = df_temp.groupby("Zone")["Ratio de population sous nourrie (%)"].mean().reset_index()
nombre_zones_ssnourries = len(df_temp["Zone"].tolist())
print("Il y a",nombre_zones_ssnourries, "zones avec une population en sous-nutrition.")
Il y a 84 zones avec une population en sous-nutrition.
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide extra 2
savedto_excel(df_temp, 'Slide extra 2')
#Combien de pays dans le cas de la Thaïlande par rapport au nombre de pays en sous-nutrition?
nombre_zones_ssnourries_export = len(df_zones_ss_nourries["Zone"].unique().tolist())
ratio_casthailande = nombre_zones_ssnourries_export * 100 / nombre_zones_ssnourries
print("Il y a", nombre_zones_ssnourries_export, "pays qui sont dans le cas de la Thaïlande. Soit",
ratio_casthailande.__round__(1),"% des pays avec une population en sous-nutrition.\nIls ont une population en sous-nutrition et pourtant ils exportent plus qu'ils n'en dédient à la nourriture."
)
Il y a 74 pays qui sont dans le cas de la Thaïlande. Soit 88.1 % des pays avec une population en sous-nutrition. Ils ont une population en sous-nutrition et pourtant ils exportent plus qu'ils n'en dédient à la nourriture.
#Quels pays n'est pas autonome avec sa production
zones_dependantes = df_sous_nutrition.groupby("Zone")[["Production (kg)", "Nourriture (kg)", "Importations - Quantité (kg)"]].sum()
zones_dependantes["Ratio Nourriture/Production (%)"] = round( zones_dependantes["Nourriture (kg)"] / zones_dependantes["Production (kg)"] * 100,2)
#Sélection des pays qui ont plus de Nourriture qu'ils ne produisent ( et donc qui importe beaucoup)
zones_dependantes = zones_dependantes.loc[zones_dependantes["Ratio Nourriture/Production (%)"] >= 100].reset_index()
zones_dependantes.head()
Zone | Production (kg) | Nourriture (kg) | Importations - Quantité (kg) | Ratio Nourriture/Production (%) | |
---|---|---|---|---|---|
0 | Algérie | 2.635900e+10 | 3.172900e+10 | 1.740300e+10 | 120.37 |
1 | Antigua-et-Barbuda | 2.000000e+07 | 5.800000e+07 | 6.300000e+07 | 290.00 |
2 | Arabie saoudite | 8.878000e+09 | 1.795600e+10 | 2.772600e+10 | 202.25 |
3 | Bahamas | 1.790000e+08 | 3.120000e+08 | 2.990000e+08 | 174.30 |
4 | Bermudes | 6.000000e+06 | 5.100000e+07 | 7.700000e+07 | 850.00 |
#Envoie des données du dataframe dans le fichier Excel - Sheet name: Slide Extra 1
savedto_excel(zones_dependantes, 'Slide Extra 1')
#Top 5 des pays qui sont le plus dépendant
zones_dependantes.sort_values(["Ratio Nourriture/Production (%)"], ascending=False).head(5)
Zone | Production (kg) | Nourriture (kg) | Importations - Quantité (kg) | Ratio Nourriture/Production (%) | |
---|---|---|---|---|---|
9 | Chine - RAS de Macao | 1.600000e+07 | 3.680000e+08 | 3.670000e+08 | 2300.00 |
8 | Chine - RAS de Hong-Kong | 4.700000e+08 | 5.778000e+09 | 9.510000e+09 | 1229.36 |
4 | Bermudes | 6.000000e+06 | 5.100000e+07 | 7.700000e+07 | 850.00 |
38 | Émirats arabes unis | 1.192000e+09 | 6.548000e+09 | 1.532700e+10 | 549.33 |
11 | Djibouti | 7.600000e+07 | 3.930000e+08 | 1.628000e+09 | 517.11 |
#Récupération des zones dépendantes
list_zones_dependantes = zones_dependantes["Zone"].unique().tolist()
# Pays où les pays dependants ont un ratio de population sous nourrie positif
zones_dependantes_ssnourries = df_sous_nutrition.loc[(df_sous_nutrition["Zone"].isin(list_zones_dependantes)) & (df_sous_nutrition["Ratio de population sous nourrie (%)"] > 0),["Zone", "Ratio de population sous nourrie (%)"]].groupby("Zone").mean()
list_zones_dependantes_ssnourries = zones_dependantes_ssnourries.reset_index()["Zone"].tolist()
list_zones_dependantes_ssnourries
['Algérie', 'Arabie saoudite', 'Botswana', 'Chine, Taiwan Province de', 'Gambie', 'Géorgie', 'Iraq', 'Jordanie', 'Lesotho', 'Liban', 'Libéria', 'Mauritanie', 'Mongolie', 'Oman', 'Sénégal', 'Timor-Leste', 'Émirats arabes unis']
print("Il y a :",len(list_zones_dependantes),"pays dépendants de l'importation, dont", len(list_zones_dependantes_ssnourries), "avec une population sous-nourrie.")
Il y a : 39 pays dépendants de l'importation, dont 17 avec une population sous-nourrie.