import pandas as pd
pop = pd.read_csv("data/FAO_2013_fr/fr_population.csv")
pop.head()
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | Symbole | Description du Symbole | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 30552 | NaN | Donnée officielle |
1 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 202 | Afrique du Sud | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 52776 | NaN | Donnée officielle |
2 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 3 | Albanie | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 3173 | NaN | Donnée officielle |
3 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 4 | Algérie | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 39208 | NaN | Donnée officielle |
4 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 79 | Allemagne | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 82727 | NaN | Donnée officielle |
pop.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 175 entries, 0 to 174 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Code Domaine 175 non-null object 1 Domaine 175 non-null object 2 Code zone 175 non-null int64 3 Zone 175 non-null object 4 Code Élément 175 non-null int64 5 Élément 175 non-null object 6 Code Produit 175 non-null int64 7 Produit 175 non-null object 8 Code année 175 non-null int64 9 Année 175 non-null int64 10 Unité 175 non-null object 11 Valeur 175 non-null int64 12 Symbole 1 non-null object 13 Description du Symbole 175 non-null object dtypes: int64(6), object(8) memory usage: 19.3+ KB
pop.columns = ['code_domaine', 'domaine', 'code_zone', 'zone', 'code_element', 'element',
'code_produit', 'produit', 'code_annee', 'annee', 'unite', 'valeur', 'symbole', 'description_symbole']
pop.tail()
code_domaine | domaine | code_zone | zone | code_element | element | code_produit | produit | code_annee | annee | unite | valeur | symbole | description_symbole | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
170 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 236 | Venezuela (République bolivarienne du) | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 30405 | NaN | Donnée officielle |
171 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 237 | Viet Nam | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 91680 | NaN | Donnée officielle |
172 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 249 | Yémen | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 24407 | NaN | Donnée officielle |
173 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 251 | Zambie | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 14539 | NaN | Donnée officielle |
174 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 181 | Zimbabwe | 511 | Population totale | 2501 | Population | 2013 | 2013 | 1000 personnes | 14150 | NaN | Donnée officielle |
.nunique()
pop.nunique()
code_domaine 1 domaine 1 code_zone 175 zone 175 code_element 1 element 1 code_produit 1 produit 1 code_annee 1 annee 1 unite 1 valeur 175 symbole 1 description_symbole 2 dtype: int64
.unique()
print(list(pop['code_domaine'].unique()))
print(list(pop['domaine'].unique()))
print(list(pop['code_element'].unique()))
print(list(pop['element'].unique()))
print(list(pop['code_produit'].unique()))
print(list(pop['produit'].unique()))
print(list(pop['code_annee'].unique()))
print(list(pop['annee'].unique()))
print(list(pop['unite'].unique()))
print(list(pop['symbole'].unique()))
print(list(pop['description_symbole'].unique()))
['FBSH'] ['Bilans Alimentaire (Ancienne méthodologie et population)'] [511] ['Population totale'] [2501] ['Population'] [2013] [2013] ['1000 personnes'] [nan, 'A'] ['Donnée officielle', 'Agrégat, peut inclure des données officielles, semi-officielles, estimées ou calculées']
'symbole'
et 'description_symbole'
ont 2 valeurs, les autres n'en ont qu'unemy_columns = ['code_zone', 'zone', 'valeur', 'symbole']
pop = pop[my_columns]
pop.head()
code_zone | zone | valeur | symbole | |
---|---|---|---|---|
0 | 2 | Afghanistan | 30552 | NaN |
1 | 202 | Afrique du Sud | 52776 | NaN |
2 | 3 | Albanie | 3173 | NaN |
3 | 4 | Algérie | 39208 | NaN |
4 | 79 | Allemagne | 82727 | NaN |
.value_counts()
pop['symbole'].value_counts()
A 1 Name: symbole, dtype: int64
pop.loc[pop['symbole'] == ('A')]
code_zone | zone | valeur | symbole | |
---|---|---|---|---|
33 | 351 | Chine | 1416667 | A |
print(pop.valeur.isnull().sum())
print(pop.valeur.isna().sum())
0 0
Les données sont en milliers
-> on multiplie par 1000 pour avoir la population mondiale
pop.valeur.sum()*1000
8413993000
On vérifie le nombre trouvé et on constate qu'il est trop important :
-> En effet, sur le site de la FAO, on constate que la population mondiale est estimée pour 2013 à 7210581976 personnes
--> on a donc une erreur de plus de 1 milliard
On avait constaté précédemment le cas particulier de la Chine qui était le seul pays à avoir une valeur pour la colonne 'symbole'
-> on regarde si la Chine n'apparait pas plusieurs fois grâce à un pattern (on va regarder si la chaîne de caractères "chine" apparait plusieurs fois)
pattern = pop.zone.str.contains("chine", case=False)
chaine_chine = pop[pattern]
print(chaine_chine)
code_zone zone valeur symbole 33 351 Chine 1416667 A 34 96 Chine - RAS de Hong-Kong 7204 NaN 35 128 Chine - RAS de Macao 566 NaN 36 41 Chine, continentale 1385567 NaN 37 214 Chine, Taiwan Province de 23330 NaN
1385567 + 7204 + 566 + 23330 = 1416667
'symbole'
a pour valeur 'A' (et qui correspond à une population de 1416667*1000 personnes)pop = pop.drop(pop[pop['symbole'] == 'A'].index)
# On calcule à nouveau la somme pour avoir la population mondiale
pop_mondiale = int(pop.valeur.sum()*1000)
print(f"La population mondiale en 2013 est de {pop_mondiale} personnes")
La population mondiale en 2013 est de 6997326000 personnes
Remarque :
-> Il est donc cohérent que le nombre obtenu pour la population mondiale soit plus important avec la méthode qui compte 237 pays qu'avec celui reposant sur la méthode agrégeant les données de 175 pays
Sur le site de la FAO, on trouve une explication sur la méthode de calcul des "bilans alimentaires"
http://www.fao.org/economic/ess/bilans-alimentaires/ess-fbs02/fr/.
Ainsi, selon cette explication, la "disponibilité alimentaire" peut se calculer :
"Pour un pays donné, la somme de la quantité totale des aliments produite et de la quantité importée, une fois ajustée des variations des stocks qui se sont produites au cours de la période de référence, donne l'approvisionnement disponible pendant cette période"
"Du côté de l'utilisation, une distinction est faite entre les quantités exportées, les aliments pour le bétail + les semences, les utilisations industrielles diverses, les pertes au cours du stockage et du transport, et les approvisionnements alimentaires disponibles pour la consommation humaine."
On peut donc en déduire l'équation suivante :
Remarque : Le mode de calcul de la disponibilité alimentaire a évolué au cours du temps au sein de a FAO. Cet organisme donne des précisions dans une de ses publications :
Les disponibilités peuvent donc être définies comme suit:
(a) Production + importations + baisses des stocks = disponibilités totales.
(b) Production + importations + variations des stocks (baisse ou augmentation) = quantités disponibles pour l'exportation et l'utilisation intérieure.
(c) Production + importations - exportations + variations des stocks (baisse ou augmentation) = quantités disponibles pour l'utilisation intérieure.
Au cours des années, la FAO a fait usage de chacun des trois concepts des «disponibilités». Dans les années récentes, c'est le concept © qui a été adopté pour les bilans alimentaires et leur publication, en vue de privilégier l'identification de la quantité du produit sous rubrique qui est disponible pour l'utilisation intérieure.
On va donc retenir la solution c) :
vegetaux = pd.read_csv("data/FAO_2013_fr/fr_vegetaux.csv")
vegetaux.head()
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | Symbole | Description du Symbole | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5511 | Production | 2511 | Blé | 2013 | 2013 | Milliers de tonnes | 5169.0 | S | Données standardisées |
1 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5611 | Importations - Quantité | 2511 | Blé | 2013 | 2013 | Milliers de tonnes | 1173.0 | S | Données standardisées |
2 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5072 | Variation de stock | 2511 | Blé | 2013 | 2013 | Milliers de tonnes | -350.0 | S | Données standardisées |
3 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5301 | Disponibilité intérieure | 2511 | Blé | 2013 | 2013 | Milliers de tonnes | 5992.0 | S | Données standardisées |
4 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5527 | Semences | 2511 | Blé | 2013 | 2013 | Milliers de tonnes | 322.0 | S | Données standardisées |
vegetaux.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 104871 entries, 0 to 104870 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Code Domaine 104871 non-null object 1 Domaine 104871 non-null object 2 Code zone 104871 non-null int64 3 Zone 104871 non-null object 4 Code Élément 104871 non-null int64 5 Élément 104871 non-null object 6 Code Produit 104871 non-null int64 7 Produit 104871 non-null object 8 Code année 104871 non-null int64 9 Année 104871 non-null int64 10 Unité 104871 non-null object 11 Valeur 104871 non-null float64 12 Symbole 104871 non-null object 13 Description du Symbole 104871 non-null object dtypes: float64(1), int64(5), object(8) memory usage: 11.2+ MB
vegetaux.nunique()
Code Domaine 1 Domaine 1 Code zone 175 Zone 175 Code Élément 15 Élément 15 Code Produit 75 Produit 75 Code année 1 Année 1 Unité 4 Valeur 6249 Symbole 3 Description du Symbole 3 dtype: int64
vegetaux.Produit.unique()
array(['Blé', 'Riz (Eq Blanchi)', 'Orge', 'Maïs', 'Millet', 'Céréales, Autres', 'Pommes de Terre', 'Sucre, canne', 'Sucre, betterave', 'Sucre Eq Brut', 'Edulcorants Autres', 'Miel', 'Légumineuses Autres', 'Noix', 'Graines de tournesol', 'Graines de coton', 'Coco (Incl Coprah)', 'Sésame', 'Olives', 'Plantes Oleiferes, Autre', 'Huile de Soja', "Huile d'Arachide", 'Huile de Tournesol', 'Huile de Colza&Moutarde', 'Huile Graines de Coton', 'Huile de Palme', 'Huile de Sésame', "Huile d'Olive", 'Huil Plantes Oleif Autr', 'Tomates', 'Légumes, Autres', 'Oranges, Mandarines', 'Agrumes, Autres', 'Bananes', 'Pommes', 'Ananas', 'Dattes', 'Raisin', 'Fruits, Autres', 'Café', 'Feve de Cacao', 'Thé', 'Poivre', 'Épices, Autres', 'Vin', 'Bière', 'Boissons Alcooliques', 'Aliments pour enfants', 'Miscellanees', 'Seigle', 'Avoine', 'Sorgho', 'Manioc', 'Patates douces', 'Ignames', 'Racines nda', 'Haricots', 'Pois', 'Soja', 'Arachides Decortiquees', 'Graines Colza/Moutarde', 'Palmistes', 'Huile de Palmistes', 'Huile de Coco', 'Huile de Germe de Maïs', 'Oignons', 'Citrons & Limes', 'Pamplemousse', 'Bananes plantains', 'Piments', 'Girofles', 'Boissons Fermentés', 'Alcool, non Comestible', 'Sucre non centrifugé', 'Huile de Son de Riz'], dtype=object)
vegetaux.duplicated().sum()
0
vegetaux.columns = ['code_domaine', 'domaine', 'code_zone', 'zone', 'code_element', 'element',
'code_produit', 'produit', 'code_annee', 'annee', 'unite', 'valeur', 'symbole', 'description_symbole']
ble_france = vegetaux[(vegetaux['code_zone'] == 68) & (vegetaux['code_produit'] == 2511)]
dispo_int = ble_france[ble_france['code_element'] == 5301]['valeur']
prod = ble_france[ble_france['code_element'] == 5511]['valeur']
importations = ble_france[ble_france['code_element'] == 5611]['valeur']
var_stocks = ble_france[ble_france['code_element'] == 5072]['valeur']
exportations = ble_france[ble_france['code_element'] == 5911]['valeur']
alim_animaux = ble_france[ble_france['code_element'] == 5521]['valeur']
semences = ble_france[ble_france['code_element'] == 5527]['valeur']
pertes = ble_france[ble_france['code_element'] == 5123]['valeur']
traitement = ble_france[ble_france['code_element'] == 5131]['valeur']
autres_utilisations = ble_france[ble_france['code_element'] == 5154]['valeur']
nourriture = ble_france[ble_france['code_element'] == 5142]['valeur']
# La disponibilité intérieure
qte1 = float(dispo_int)
print(f" - La disponibilité intérieure est de {qte1} milliers de tonnes")
# Production + Importation + Variation de stocks - Exportations
qte2 = float(prod) + float(importations) + float(var_stocks) - float(exportations)
print(f" - La quantité de la deuxième opération (Production + Importation + Variation de stocks - Exportations) est de {float(qte2)} milliers de tonnes")
# Aliments pour animaux + Semences + Pertes + Traitement + Autres utilisations (non alimentaires) + Nourriture
qte3 = float(alim_animaux) + float(semences) + float(pertes) + float(traitement) + float(autres_utilisations) + float(nourriture)
print(f" - Aliments pour animaux + Semences + Pertes + Traitement + Autres utilisations (non alimentaires) + Nourriture) est de {float(qte3)} milliers de tonnes")
print()
if qte1 == qte2 == qte3:
print("Les 3 quantités étant égales, l'égalité énoncée est correcte")
else:
print("Les 3 quantités ne sont pas égales, l'égalité n'est pas vérifiée")
- La disponibilité intérieure est de 20298.0 milliers de tonnes - La quantité de la deuxième opération (Production + Importation + Variation de stocks - Exportations) est de 20298.0 milliers de tonnes - Aliments pour animaux + Semences + Pertes + Traitement + Autres utilisations (non alimentaires) + Nourriture) est de 20298.0 milliers de tonnes Les 3 quantités étant égales, l'égalité énoncée est correcte
On a déjà importé les données des végétaux dans le df "vegetaux"
On importe les données des animaux
animaux = pd.read_csv("data/FAO_2013_fr/fr_animaux.csv")
animaux.head()
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | Symbole | Description du Symbole | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5511 | Production | 2731 | Viande de Bovins | 2013 | 2013 | Milliers de tonnes | 134.00 | S | Données standardisées |
1 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5611 | Importations - Quantité | 2731 | Viande de Bovins | 2013 | 2013 | Milliers de tonnes | 6.00 | S | Données standardisées |
2 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5301 | Disponibilité intérieure | 2731 | Viande de Bovins | 2013 | 2013 | Milliers de tonnes | 140.00 | S | Données standardisées |
3 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5142 | Nourriture | 2731 | Viande de Bovins | 2013 | 2013 | Milliers de tonnes | 140.00 | S | Données standardisées |
4 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 645 | Disponibilité alimentaire en quantité (kg/pers... | 2731 | Viande de Bovins | 2013 | 2013 | kg | 4.59 | Fc | Donnée calculée |
animaux.Produit.unique()
array(['Viande de Bovins', "Viande d'Ovins/Caprins", 'Viande de Volailles', 'Viande, Autre', 'Abats Comestible', 'Beurre, Ghee', 'Crème', 'Graisses Animales Crue', 'Oeufs', 'Lait - Excl Beurre', 'Poissons Eau Douce', 'Viande de Suides', 'Huiles de Poissons', 'Huiles de Foie de Poisso', 'Perciform', 'Poissons Pelagiques', 'Poissons Marins, Autres', 'Crustacés', 'Cephalopodes', 'Mollusques, Autres', 'Animaux Aquatiques Autre', 'Plantes Aquatiques', 'Viande de Anim Aquatiq'], dtype=object)
animaux.duplicated().sum()
0
animaux.columns = ['code_domaine', 'domaine', 'code_zone', 'zone', 'code_element', 'element',
'code_produit', 'produit', 'code_annee', 'annee', 'unite', 'valeur', 'symbole', 'description_symbole']
### On concatène les 2 tableaux (qui ont les mêmes colonnes)
# Mais avant on ajoute une colonne "origine", à chaque tableau avec pour valeurs 'vegetale' et 'animale'
vegetaux['origine'] = 'vegetale'
animaux['origine'] = 'animale'
# On concatène les tableaux
result = pd.concat([vegetaux, animaux])
### On va merger le df population et le df resultat
# Mais avant on arrange la structure du df "pop" :
# - on change le nom de la colonne pour la population (on remplace 'valeur' par 'pop_(M)')
pop_m = pop.rename(columns={'valeur':'pop_(M)'})
# - on supprime la colonne "symbole"
pop_only=pop_m.drop(['symbole'], axis=1)
# On merge les 2 tableaux (result et pop)
result = pd.merge(result,pop_only, how='inner')
### On supprime les colonnes inutiles
resultat=result.drop(['code_domaine', 'domaine', 'code_annee', 'unite', 'symbole', 'description_symbole'], axis=1)
# On renomme les colonnes de façon plus explicite
resultat.rename(columns={'code_zone': 'code_pays', 'zone' : 'pays'}, inplace=True)
resultat
code_pays | pays | code_element | element | code_produit | produit | annee | valeur | origine | pop_(M) | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2 | Afghanistan | 5511 | Production | 2511 | Blé | 2013 | 5169.0 | vegetale | 30552 |
1 | 2 | Afghanistan | 5611 | Importations - Quantité | 2511 | Blé | 2013 | 1173.0 | vegetale | 30552 |
2 | 2 | Afghanistan | 5072 | Variation de stock | 2511 | Blé | 2013 | -350.0 | vegetale | 30552 |
3 | 2 | Afghanistan | 5301 | Disponibilité intérieure | 2511 | Blé | 2013 | 5992.0 | vegetale | 30552 |
4 | 2 | Afghanistan | 5527 | Semences | 2511 | Blé | 2013 | 322.0 | vegetale | 30552 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
140914 | 181 | Zimbabwe | 5142 | Nourriture | 2775 | Plantes Aquatiques | 2013 | 0.0 | animale | 14150 |
140915 | 181 | Zimbabwe | 645 | Disponibilité alimentaire en quantité (kg/pers... | 2775 | Plantes Aquatiques | 2013 | 0.0 | animale | 14150 |
140916 | 181 | Zimbabwe | 664 | Disponibilité alimentaire (Kcal/personne/jour) | 2775 | Plantes Aquatiques | 2013 | 0.0 | animale | 14150 |
140917 | 181 | Zimbabwe | 674 | Disponibilité de protéines en quantité (g/pers... | 2775 | Plantes Aquatiques | 2013 | 0.0 | animale | 14150 |
140918 | 181 | Zimbabwe | 684 | Disponibilité de matière grasse en quantité (g... | 2775 | Plantes Aquatiques | 2013 | 0.0 | animale | 14150 |
140919 rows × 10 columns
element
.pivot_table
table = resultat.pivot_table(index=['code_pays', 'pays', 'pop_(M)', 'origine', 'annee', 'code_produit', 'produit'],
columns=['element'], values=['valeur'])
table = table.reset_index()
pd.set_option('display.max_columns', table.shape[1]+1)
table.head()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | valeur | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
element | Aliments pour animaux | Autres utilisations (non alimentaire) | 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 | 1 | Arménie | 2977 | animale | 2013 | 2731 | Viande de Bovins | NaN | 2.0 | 114.0 | 19.66 | 8.88 | 7.97 | 61.0 | 0.0 | 7.0 | 59.0 | NaN | 54.0 | NaN | NaN | 0.0 |
1 | 1 | Arménie | 2977 | animale | 2013 | 2732 | Viande d'Ovins/Caprins | NaN | NaN | 22.0 | 3.02 | 1.89 | 1.12 | 9.0 | NaN | 0.0 | 9.0 | NaN | 9.0 | NaN | NaN | NaN |
2 | 1 | Arménie | 2977 | animale | 2013 | 2733 | Viande de Suides | NaN | 2.0 | 72.0 | 9.67 | 6.72 | 2.53 | 31.0 | 1.0 | 19.0 | 29.0 | NaN | 13.0 | NaN | NaN | 0.0 |
3 | 1 | Arménie | 2977 | animale | 2013 | 2734 | Viande de Volailles | NaN | NaN | 45.0 | 13.35 | 2.82 | 4.51 | 40.0 | 0.0 | 32.0 | 40.0 | NaN | 8.0 | NaN | NaN | NaN |
4 | 1 | Arménie | 2977 | animale | 2013 | 2735 | Viande, Autre | NaN | NaN | 0.0 | 0.00 | 0.00 | 0.00 | 0.0 | 0.0 | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN |
table.columns = ['code_pays', 'pays', 'pop_(M)', 'origine', 'annee', 'code_produit', 'produit',
'alim_pour_animaux_(Mt)',
'autres_utilisations_(Mt)',
'dispo_alim_(kcal-p-j)',
'dispo_alim_qte_(kg-p-an)',
'dispo_mat_grasse_(g-p-j)',
'dispo_proteines_qte_(g-p-j)',
'dispo_interieure_(Mt)',
'exportations_(Mt)',
'importations_(Mt)',
'nourriture_(Mt)',
'pertes_(Mt)',
'production_(Mt)',
'semences_(Mt)',
'traitement_(Mt)',
'var_stocks_(Mt)']
table
que l'on vient de construireresultat
, à savoir le df d'originepd.set_option('display.max_columns', table.shape[1]+1) # Permet d'afficher toutes les colonnes
table[(table['pays'] == 'France') & (table['produit'] == 'Viande de Bovins')]
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | dispo_mat_grasse_(g-p-j) | dispo_proteines_qte_(g-p-j) | dispo_interieure_(Mt) | exportations_(Mt) | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4144 | 68 | France | 64291 | animale | 2013 | 2731 | Viande de Bovins | NaN | NaN | 76.0 | 23.81 | 4.02 | 9.4 | 1531.0 | 249.0 | 379.0 | 1531.0 | NaN | 1400.0 | NaN | 0.0 | 0.0 |
resultat[(resultat['pays'] == 'France') & (resultat['produit'] == 'Viande de Bovins')][['element', 'valeur']]
element | valeur | |
---|---|---|
50114 | Production | 1400.00 |
50115 | Importations - Quantité | 379.00 |
50116 | Variation de stock | 0.00 |
50117 | Exportations - Quantité | 249.00 |
50118 | Disponibilité intérieure | 1531.00 |
50119 | Traitement | -0.00 |
50120 | Nourriture | 1531.00 |
50121 | Disponibilité alimentaire en quantité (kg/pers... | 23.81 |
50122 | Disponibilité alimentaire (Kcal/personne/jour) | 76.00 |
50123 | Disponibilité de protéines en quantité (g/pers... | 9.40 |
50124 | Disponibilité de matière grasse en quantité (g... | 4.02 |
table[table['code_pays'] == 351]
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | dispo_mat_grasse_(g-p-j) | dispo_proteines_qte_(g-p-j) | dispo_interieure_(Mt) | exportations_(Mt) | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) |
---|
Je suppose que l'on cherche la disponibilté alimentaire en Kcal pour une année (pour chaque pays)
On connait :
la population de chaque pays en milliers : table['pop_(M)']
la disponibilité alimentaire exprimée en kcal par personne et par jour : table['dispo_alim_(kcal-p-j)']
---> pour passer des personnes à la pop nationale : table['pop_(M)'] * 1000
(* 1000 car la population est exprimée en milliers)
---> pour passer des jours à l'année : * 365
'dispo_alim_kcal'
table['dispo_alim_kcal'] = table['dispo_alim_(kcal-p-j)'] * (table['pop_(M)'] * 1000 * 365)
table.head()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | dispo_mat_grasse_(g-p-j) | dispo_proteines_qte_(g-p-j) | dispo_interieure_(Mt) | exportations_(Mt) | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Arménie | 2977 | animale | 2013 | 2731 | Viande de Bovins | NaN | 2.0 | 114.0 | 19.66 | 8.88 | 7.97 | 61.0 | 0.0 | 7.0 | 59.0 | NaN | 54.0 | NaN | NaN | 0.0 | 1.238730e+11 |
1 | 1 | Arménie | 2977 | animale | 2013 | 2732 | Viande d'Ovins/Caprins | NaN | NaN | 22.0 | 3.02 | 1.89 | 1.12 | 9.0 | NaN | 0.0 | 9.0 | NaN | 9.0 | NaN | NaN | NaN | 2.390531e+10 |
2 | 1 | Arménie | 2977 | animale | 2013 | 2733 | Viande de Suides | NaN | 2.0 | 72.0 | 9.67 | 6.72 | 2.53 | 31.0 | 1.0 | 19.0 | 29.0 | NaN | 13.0 | NaN | NaN | 0.0 | 7.823556e+10 |
3 | 1 | Arménie | 2977 | animale | 2013 | 2734 | Viande de Volailles | NaN | NaN | 45.0 | 13.35 | 2.82 | 4.51 | 40.0 | 0.0 | 32.0 | 40.0 | NaN | 8.0 | NaN | NaN | NaN | 4.889722e+10 |
4 | 1 | Arménie | 2977 | animale | 2013 | 2735 | Viande, Autre | NaN | NaN | 0.0 | 0.00 | 0.00 | 0.00 | 0.0 | 0.0 | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 0.000000e+00 |
Une donnée facilement accessible est celle de la disponibilité alimentaire totale en kcal par jour et par personne pour un pays donné
--> Calculons cette valeur, que l'on nommera kcal_j_p
, pour la France
# On calcule la disponibilité alimentaire en kcal global, en additionnant la disponibilité alimentaire de tous les produits
total_kcal = table[table['pays'] == 'France'].dispo_alim_kcal.sum()
# On calcule la population française
pop_fr = int(table[table['pays'] == 'France']['pop_(M)'].unique()*1000)
# On en déduit la disponibilité alimentaire en kcal pour chaque Français, par jour
kcal_j_p = total_kcal/pop_fr/365
kcal_j_p
3482.0
On connait :
la population de chaque pays en milliers : table['pop_(M)']
la Disponibilité de protéines en quantité exprimée en gramme par personne et par jour : table['dispo_proteines_qte_(g-p-j)']
---> pour passer des personnes à la pop nationale : table['pop_(M)'] * 1000
(* 1000 car la population est exprimée en milliers)
---> pour passer des jours à l'année : * 365
---> pour passer des grammes aux kg : table['dispo_proteines_qte_(g-p-j)'] / 1000
'dispo_alim_kg_proteines'
table['dispo_alim_kg_proteines'] = table['dispo_proteines_qte_(g-p-j)'] * (table['pop_(M)'] * 365)
table.head()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | ... | dispo_interieure_(Mt) | exportations_(Mt) | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Arménie | 2977 | animale | 2013 | 2731 | Viande de Bovins | NaN | 2.0 | 114.0 | 19.66 | ... | 61.0 | 0.0 | 7.0 | 59.0 | NaN | 54.0 | NaN | NaN | 0.0 | 1.238730e+11 | 8660241.85 |
1 | 1 | Arménie | 2977 | animale | 2013 | 2732 | Viande d'Ovins/Caprins | NaN | NaN | 22.0 | 3.02 | ... | 9.0 | NaN | 0.0 | 9.0 | NaN | 9.0 | NaN | NaN | NaN | 2.390531e+10 | 1216997.60 |
2 | 1 | Arménie | 2977 | animale | 2013 | 2733 | Viande de Suides | NaN | 2.0 | 72.0 | 9.67 | ... | 31.0 | 1.0 | 19.0 | 29.0 | NaN | 13.0 | NaN | NaN | 0.0 | 7.823556e+10 | 2749110.65 |
3 | 1 | Arménie | 2977 | animale | 2013 | 2734 | Viande de Volailles | NaN | NaN | 45.0 | 13.35 | ... | 40.0 | 0.0 | 32.0 | 40.0 | NaN | 8.0 | NaN | NaN | NaN | 4.889722e+10 | 4900588.55 |
4 | 1 | Arménie | 2977 | animale | 2013 | 2735 | Viande, Autre | NaN | NaN | 0.0 | 0.00 | ... | 0.0 | 0.0 | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 0.000000e+00 | 0.00 |
5 rows × 24 columns
Vous pouvez vérifier la cohérence de votre calcul en comparant ce ratio aux données disponibles sur internet, par exemple en cherchant la valeur calorique d'un oeuf.
Pour effectuer ce calcul, il nous faut 2 éléments :
table['dispo_alim_kcal']
table['nourriture_(Mt)'] * 1000000
On rajoute une colonne 'r_energie_poids_kcal-k'
table['r_energie_poids_kcal_kg'] = (table['dispo_alim_kcal'])/(table['nourriture_(Mt)'] * 1000000)
table.head()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | ... | exportations_(Mt) | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Arménie | 2977 | animale | 2013 | 2731 | Viande de Bovins | NaN | 2.0 | 114.0 | 19.66 | ... | 0.0 | 7.0 | 59.0 | NaN | 54.0 | NaN | NaN | 0.0 | 1.238730e+11 | 8660241.85 | 2099.541864 |
1 | 1 | Arménie | 2977 | animale | 2013 | 2732 | Viande d'Ovins/Caprins | NaN | NaN | 22.0 | 3.02 | ... | NaN | 0.0 | 9.0 | NaN | 9.0 | NaN | NaN | NaN | 2.390531e+10 | 1216997.60 | 2656.145556 |
2 | 1 | Arménie | 2977 | animale | 2013 | 2733 | Viande de Suides | NaN | 2.0 | 72.0 | 9.67 | ... | 1.0 | 19.0 | 29.0 | NaN | 13.0 | NaN | NaN | 0.0 | 7.823556e+10 | 2749110.65 | 2697.777931 |
3 | 1 | Arménie | 2977 | animale | 2013 | 2734 | Viande de Volailles | NaN | NaN | 45.0 | 13.35 | ... | 0.0 | 32.0 | 40.0 | NaN | 8.0 | NaN | NaN | NaN | 4.889722e+10 | 4900588.55 | 1222.430625 |
4 | 1 | Arménie | 2977 | animale | 2013 | 2735 | Viande, Autre | NaN | NaN | 0.0 | 0.00 | ... | 0.0 | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 0.000000e+00 | 0.00 | NaN |
5 rows × 25 columns
.unique()
pour connaître les différentes valeurstable_oeufs=table[table['produit'] == 'Oeufs']
round(table_oeufs['r_energie_poids_kcal_kg'],2).unique()
array([1397.06, 1393.94, 1331.87, 1222.77, 1306.21, inf, 1314.07, 1370.08, 1413.91, 1582.46, 1178.95, 1577.96, 1352.32, 1274.7 , 1290.91, 1341.5 , 1030.03, 1023.82, 1416.72, 1406.08, 1416.88, 902.52, 1382.92, 1032.1 , 1684.84, 1440.86, 1560.38, 1315.49, 1478.35, 1286.4 , 1082.35, 1324.99, 1296.6 , 1457.63, 1383.22, 1255.96, 1502.43, 1316.45, 1407.66, 1322.12, 1429.99, 1311.32, 1409.26, 1393.45, 1409.19, 1417.98, 1769.34, 955.94, 1349.73, 1220.56, 1012.33, 1405.13, 1397.58, 1220.04, 1401.83, 1431.53, 1299.04, 1304.72, 876. , 1506.28, 1266.45, 1466.43, 1406.55, 1391.87, 1284.8 , 1414.52, 1495.1 , 1420.51, 1410.6 , 1441.71, 1411.27, 1422.1 , 1297.68, 1411.99, 1524.24, 1448.45, 1422.33, 1401.94, 1184.58, 1315.3 , 1475.61, 1460.55, 1405.35, 1367.49, 1412.03, 1368.91, 1514.02, 1219.02, 1404.04, 1471.95, 1568.93, 1327.22, 1455.05, 1290.73, 1196.84, 1242.37, 1191.91, 1313.86, 1554.35, 1259.56, 1285.83, 1385.06, 1260.89, 1300.76, 1405.62, 1635.2 , 1419.79, 1200.48, 1388.85, 1257.55, 1301.66, 1267.39, 1396.39, 1361.83, 1253.65, 1374.99, 1299.55, 1292.12, 1454.74, 1404.61, 1371.3 , 1243.92, 1447.41, 1239.54, 1409.28, 2149.3 , 1395.61, 730.73, 795.7 , 704.45, 1425.64, 1345.71, 1111.79, 1432.95, 1394.76, 1419.4 , 1397.67, 1377.14, 1283.97, 1140.62, 1446.49, 1387.52, 1399.46, 1395.98, 1284.1 , 1537.93, 1244.1 , 1223.66, 1467.72, 1242.4 , 1467.59, 1373.38, 1143.03, 1417.11, 1397.97, 1401.72, 1264.35, 1298.82, 1398.8 , 1297.99, 1425.99, 1010.2 , 1484.76, 1216.13, 1418.54, 1329.97, 1388.61, 1424.75, 1458.62])
## On calcule aussi la moyenne
import numpy as np
table_oeufs_mean = table_oeufs.replace([np.inf, -np.inf, 0], np.nan)
table_oeufs_mean['r_energie_poids_kcal_kg'].mean()
1345.3003859252408
Les résultats sont proches de la valeur trouvée par ailleurs
--> Nos résultats paraissent cohérents
Vous pouvez vérifier la cohérence de votre calcul en comparant ce ratio aux données disponibles sur internet, par exemple en cherchant la teneur en protéines de l'avoine.
Pour effectuer ce calcul, il nous faut 2 éléments :
table['dispo_alim_kg_proteines']
table['nourriture_(Mt)'] * 1000000
On rajoute une colonne 'part_proteines_poids'
table['part_proteines_poids'] = table['dispo_alim_kg_proteines']/(table['nourriture_(Mt)'] * 1000000)
table.head()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | ... | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | part_proteines_poids | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Arménie | 2977 | animale | 2013 | 2731 | Viande de Bovins | NaN | 2.0 | 114.0 | 19.66 | ... | 7.0 | 59.0 | NaN | 54.0 | NaN | NaN | 0.0 | 1.238730e+11 | 8660241.85 | 2099.541864 | 0.146784 |
1 | 1 | Arménie | 2977 | animale | 2013 | 2732 | Viande d'Ovins/Caprins | NaN | NaN | 22.0 | 3.02 | ... | 0.0 | 9.0 | NaN | 9.0 | NaN | NaN | NaN | 2.390531e+10 | 1216997.60 | 2656.145556 | 0.135222 |
2 | 1 | Arménie | 2977 | animale | 2013 | 2733 | Viande de Suides | NaN | 2.0 | 72.0 | 9.67 | ... | 19.0 | 29.0 | NaN | 13.0 | NaN | NaN | 0.0 | 7.823556e+10 | 2749110.65 | 2697.777931 | 0.094797 |
3 | 1 | Arménie | 2977 | animale | 2013 | 2734 | Viande de Volailles | NaN | NaN | 45.0 | 13.35 | ... | 32.0 | 40.0 | NaN | 8.0 | NaN | NaN | NaN | 4.889722e+10 | 4900588.55 | 1222.430625 | 0.122515 |
4 | 1 | Arménie | 2977 | animale | 2013 | 2735 | Viande, Autre | NaN | NaN | 0.0 | 0.00 | ... | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 0.000000e+00 | 0.00 | NaN | NaN |
5 rows × 26 columns
table_avoine=table[table['produit'] == 'Avoine']
round(table_avoine['part_proteines_poids']*100,2).unique()
array([ 9.78, inf, nan, 8.4 , 8.52, 11.26, 5.64, 7.36, 5.33, 9.23, 10.37, 7.76, 8.79, 9.48, 8.82, 4.87, 9.15, 6.66, 10.31, 8.98, 9.53, 0. , 9.26, 8.22, 8.12, 8.24, 8.56, 11.41, 7.56, 8.63, 9.46, 7.45, 9.45, 6.26, 6.68, 10.16, 9.12, 9.1 , 9.03, 7.42, 5.69, 6.98, 12.15, 8.09, 6.82, 8.9 , 9.4 , 8.81, 6.67, 8.93, 6.02, 8.49, 13.45, 9.94, 7.69, 10.09, 8.47, 12.67, 7.51, 9.59, 7.19, 4.97, 8.45, 7.83, 8.07, 7.92, 8.72, 9.35, 7.71, 4.52, 9.67, 5.22, 8.75, 9.28, 8.78, 7.3 , 10.56, 7.2 , 11.45, 8.91, 8.11, 7.16, 13.89])
## On calcule aussi la moyenne
table_avoine_mean = table_avoine.replace([np.inf, -np.inf, 0], np.nan)
table_avoine_mean['part_proteines_poids'].mean() * 100
8.447081054780032
Les résultats sont proches de la valeur trouvée par ailleurs
--> Nos résultats paraissent cohérents
Citez 5 aliments parmi les 20 aliments les plus riches en protéines.
'table'
, et on le nomme 'table_max'
table_max = table.copy()
cols = ['pays', 'produit', 'part_proteines_poids', 'r_energie_poids_kcal_kg']
table_max[cols].head()
pays | produit | part_proteines_poids | r_energie_poids_kcal_kg | |
---|---|---|---|---|
0 | Arménie | Viande de Bovins | 0.146784 | 2099.541864 |
1 | Arménie | Viande d'Ovins/Caprins | 0.135222 | 2656.145556 |
2 | Arménie | Viande de Suides | 0.094797 | 2697.777931 |
3 | Arménie | Viande de Volailles | 0.122515 | 1222.430625 |
4 | Arménie | Viande, Autre | NaN | NaN |
cols_test = ['r_energie_poids_kcal_kg', 'part_proteines_poids']
for i in cols_test:
nb_0 = table_max[table_max[i] == 0]
print(f'Variable {i} :')
print(f' Nombre de valeurs égales à 0 : {nb_0[i].count()}')
print(f' Nombre de NaN : {table_max[i].isna().sum()}')
print(f' Valeur minimum : {table_max[i].min()}')
print(f' Valeur maximum : {table_max[i].max()}\n')
Variable r_energie_poids_kcal_kg : Nombre de valeurs égales à 0 : 1022 Nombre de NaN : 4629 Valeur minimum : 0.0 Valeur maximum : inf Variable part_proteines_poids : Nombre de valeurs égales à 0 : 871 Nombre de NaN : 5953 Valeur minimum : 0.0 Valeur maximum : inf
# On sélectionne des lignes où le ratio 'r_energie_poids_kcal_kg' est égal à inf
import numpy as np
temp = table_max[table_max['r_energie_poids_kcal_kg'] == np.inf]
temp.head()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | ... | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | part_proteines_poids | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
25 | 1 | Arménie | 2977 | vegetale | 2013 | 2515 | Seigle | 1.0 | NaN | 1.0 | 0.12 | ... | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | NaN | 0.0 | 1.086605e+09 | 21732.10 | inf | inf |
57 | 1 | Arménie | 2977 | vegetale | 2013 | 2580 | Huile d'Olive | NaN | 0.0 | 1.0 | 0.03 | ... | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 1.086605e+09 | NaN | inf | NaN |
58 | 1 | Arménie | 2977 | vegetale | 2013 | 2582 | Huile de Germe de Maïs | NaN | NaN | 3.0 | 0.14 | ... | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 3.259815e+09 | NaN | inf | NaN |
71 | 1 | Arménie | 2977 | vegetale | 2013 | 2619 | Dattes | NaN | NaN | 1.0 | 0.15 | ... | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 1.086605e+09 | 10866.05 | inf | inf |
86 | 1 | Arménie | 2977 | vegetale | 2013 | 2680 | Aliments pour enfants | NaN | NaN | 2.0 | 0.16 | ... | 0.0 | 0.0 | NaN | NaN | NaN | NaN | NaN | 2.173210e+09 | 76062.35 | inf | inf |
5 rows × 26 columns
On constate la présence de inf et de 0
---> Nous voulons calculer, pour tous les produits, la valeur moyenne mondiale des 2 ratios
-----> Il faut donc nettoyer notre série et traiter les valeurs 0 et infinies afin qu'elles n'influencent pas la valeur de la moyenne calculée
Remarques :
Dans cette série de données, la valeur 0 n'est pas à prendre en compte car elle n'a pas de signification : cela indique simplement que, pour le produit en question, le pays n'a pas de données à fournir
Concernant les valeurs infinies, on en rencontre car il s'agit d'un ratio.
En effet, c'est en divisant "0 par 0" que l'on obtient cette valeur (cf. le tableau ci-dessus)
import numpy as np
table_max = table_max.replace([np.inf, -np.inf, 0], np.nan)
table_max.tail()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | ... | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | part_proteines_poids | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
15600 | 276 | Soudan | 37964 | vegetale | 2013 | 2659 | Alcool, non Comestible | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
15601 | 276 | Soudan | 37964 | vegetale | 2013 | 2680 | Aliments pour enfants | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
15602 | 276 | Soudan | 37964 | vegetale | 2013 | 2745 | Miel | NaN | NaN | NaN | 0.02 | ... | NaN | 1.0 | NaN | 1.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
15603 | 276 | Soudan | 37964 | vegetale | 2013 | 2805 | Riz (Eq Blanchi) | NaN | NaN | 14.0 | 1.27 | ... | 33.0 | 48.0 | NaN | 17.0 | 1.0 | NaN | NaN | 1.939960e+11 | 3879920.8 | 4041.584167 | 0.080832 |
15604 | 276 | Soudan | 37964 | vegetale | 2013 | 2899 | Miscellanees | NaN | NaN | 7.0 | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 9.699802e+10 | 20369584.2 | NaN | NaN |
5 rows × 26 columns
.describe()
qu'il n'y a plus de valeurs égales à 0 ou à l'infinitable_max['r_energie_poids_kcal_kg'].describe()
count 8975.000000 mean 2760.893533 std 2814.960439 min 69.350000 25% 619.585185 50% 1702.360000 75% 3542.300834 max 19293.900000 Name: r_energie_poids_kcal_kg, dtype: float64
Pour calculer la moyenne mondiale du ratio "énergie/poids" pour chaque produit, on va utiliser la fonction 'groupby'
---> On va grouper par produits, et on pourra alors appliquer sur l'ensemble des éléments de cette colonne la fonction de calcul de la moyenne d'une variable (à savoir la fonction .mean()
), à savoir ici la variable 'r_energie_poids_kcal_kg'
Remarque : on applique aussi la fonction count()
afin de connaître le nombre de valeurs (c'est-à-dire le nombre de pays) qui ont contribué au calcul de la moyenne
On va ainsi avoir :
'r_energie_poids_kcal_kg'
pour chacun des produits (cf. la moyenne entre les pays qui ont une valeur valide et différente de 0 pour le ratio "énergie/poids" du produit concerné) table_max_kcal = table_max.groupby(['produit', 'code_produit']).agg(['mean','count'])['r_energie_poids_kcal_kg']
table_max_kcal.head()
mean | count | ||
---|---|---|---|
produit | code_produit | ||
Abats Comestible | 2736 | 1129.258163 | 161 |
Agrumes, Autres | 2614 | 248.981045 | 37 |
Alcool, non Comestible | 2659 | NaN | 0 |
Aliments pour enfants | 2680 | 3690.832338 | 83 |
Ananas | 2618 | 439.413583 | 121 |
.sort_values()
.reset_index()
pour afficher un index indicé table_max_kcal.columns = ['moy_kcal', 'nb_pays']
table_max_kcal = table_max_kcal.sort_values('moy_kcal', axis = 0, na_position="last", ascending=False)
table_max_kcal = table_max_kcal.reset_index()
table_max_kcal.head(20)
produit | code_produit | moy_kcal | nb_pays | |
---|---|---|---|---|
0 | Huiles de Foie de Poisso | 2782 | 9982.932500 | 2 |
1 | Huile de Sésame | 2579 | 9433.744729 | 35 |
2 | Huile de Son de Riz | 2581 | 9361.549883 | 12 |
3 | Huiles de Poissons | 2781 | 9003.715504 | 3 |
4 | Huile d'Arachide | 2572 | 8935.765811 | 76 |
5 | Huile d'Olive | 2580 | 8931.223447 | 85 |
6 | Huile de Germe de Maïs | 2582 | 8871.762566 | 78 |
7 | Huil Plantes Oleif Autr | 2586 | 8848.222893 | 120 |
8 | Huile de Palmistes | 2576 | 8789.540277 | 49 |
9 | Huile Graines de Coton | 2575 | 8750.320136 | 63 |
10 | Huile de Palme | 2577 | 8719.419872 | 105 |
11 | Huile de Tournesol | 2573 | 8693.245772 | 124 |
12 | Huile de Soja | 2571 | 8635.808245 | 134 |
13 | Huile de Colza&Moutarde | 2574 | 8627.372452 | 66 |
14 | Huile de Coco | 2578 | 8565.739255 | 73 |
15 | Graisses Animales Crue | 2737 | 7583.862063 | 145 |
16 | Beurre, Ghee | 2740 | 7331.424291 | 129 |
17 | Palmistes | 2562 | 6496.635000 | 2 |
18 | Sésame | 2561 | 5796.120413 | 69 |
19 | Arachides Decortiquees | 2556 | 5702.900100 | 136 |
'.sample()'
qui affichera aléatoirement 5 produits parmi les 20 possiblesrandom_kcal = table_max_kcal[:20]
prods = random_kcal.sample(5)
prods['moy_kcal'] = prods['moy_kcal'].round(2)
print('Parmi les 20 produits les plus caloriques, on peut citer :')
for i in range(0,5):
print(' - '+prods.iat[i,0]+' ('+str(prods.iat[i,2])+' kcal)')
Parmi les 20 produits les plus caloriques, on peut citer : - Huile d'Arachide (8935.77 kcal) - Huile de Colza&Moutarde (8627.37 kcal) - Huile Graines de Coton (8750.32 kcal) - Huile de Palmistes (8789.54 kcal) - Huil Plantes Oleif Autr (8848.22 kcal)
.describe()
qu'il n'y a plus de valeurs égales à 0 ou à l'infinitable_max['part_proteines_poids'].describe()
count 7851.000000 mean 0.075106 std 0.072431 min 0.000072 25% 0.009789 50% 0.067137 75% 0.114727 max 0.442599 Name: part_proteines_poids, dtype: float64
Pour calculer la moyenne mondiale du ratio "poids de protéines/poids total" pour chaque produit, on va utiliser la fonction 'groupby', en groupant sur les produits
table_max_proteines = table_max.groupby(['produit', 'code_produit']).agg(['mean','count'])['part_proteines_poids']
table_max_proteines.head(5)
mean | count | ||
---|---|---|---|
produit | code_produit | ||
Abats Comestible | 2736 | 0.175610 | 161 |
Agrumes, Autres | 2614 | 0.004426 | 47 |
Alcool, non Comestible | 2659 | NaN | 0 |
Aliments pour enfants | 2680 | 0.148832 | 94 |
Ananas | 2618 | 0.003079 | 109 |
table_max_proteines.columns = ['moy_proteines', 'nb_pays']
table_max_proteines
table_max_proteines = table_max_proteines.sort_values('moy_proteines', axis = 0, na_position="last", ascending=False)
table_max_proteines['moy_proteines'] = table_max_proteines['moy_proteines'].map('{:,.2%}'.format)
table_max_proteines=table_max_proteines.reset_index()
table_max_proteines.head(20)
produit | code_produit | moy_proteines | nb_pays | |
---|---|---|---|---|
0 | Graines Colza/Moutarde | 2558 | 28.54% | 1 |
1 | Soja | 2555 | 28.53% | 83 |
2 | Arachides Decortiquees | 2556 | 25.15% | 138 |
3 | Pois | 2547 | 22.32% | 111 |
4 | Légumineuses Autres | 2549 | 21.97% | 132 |
5 | Haricots | 2546 | 21.55% | 126 |
6 | Abats Comestible | 2736 | 17.56% | 161 |
7 | Sésame | 2561 | 17.50% | 73 |
8 | Viande, Autre | 2735 | 17.40% | 130 |
9 | Plantes Oleiferes, Autre | 2570 | 17.05% | 42 |
10 | Aliments pour enfants | 2680 | 14.88% | 94 |
11 | Viande de Bovins | 2731 | 14.38% | 171 |
12 | Cephalopodes | 2766 | 13.99% | 72 |
13 | Viande d'Ovins/Caprins | 2732 | 13.58% | 153 |
14 | Viande de Volailles | 2734 | 12.62% | 174 |
15 | Piments | 2641 | 12.10% | 86 |
16 | Poissons Pelagiques | 2763 | 11.93% | 167 |
17 | Graines de tournesol | 2557 | 11.18% | 28 |
18 | Poissons Marins, Autres | 2764 | 11.01% | 143 |
19 | Épices, Autres | 2645 | 10.74% | 121 |
.sample()
random_proteines = table_max_proteines[:20]
aliments = random_proteines.sample(5)
print('Parmi les 20 produits les riches en protéines, on peut citer :')
for i in range(0,5):
print(' - '+aliments.iat[i,0]+' ('+str(aliments.iat[i,2])+' de protéines)')
Parmis les 20 produits les riches en protéines, on peut citer : - Graines de tournesol (11.18% de protéines) - Épices, Autres (10.74% de protéines) - Abats Comestible (17.56% de protéines) - Piments (12.10% de protéines) - Arachides Decortiquees (25.15% de protéines)
table.columns
Index(['code_pays', 'pays', 'pop_(M)', 'origine', 'annee', 'code_produit', 'produit', 'alim_pour_animaux_(Mt)', 'autres_utilisations_(Mt)', 'dispo_alim_(kcal-p-j)', 'dispo_alim_qte_(kg-p-an)', 'dispo_mat_grasse_(g-p-j)', 'dispo_proteines_qte_(g-p-j)', 'dispo_interieure_(Mt)', 'exportations_(Mt)', 'importations_(Mt)', 'nourriture_(Mt)', 'pertes_(Mt)', 'production_(Mt)', 'semences_(Mt)', 'traitement_(Mt)', 'var_stocks_(Mt)', 'dispo_alim_kcal', 'dispo_alim_kg_proteines', 'r_energie_poids_kcal_kg', 'part_proteines_poids'], dtype='object')
table_capacite = table[['pays', 'pop_(M)', 'code_produit', 'produit', 'nourriture_(Mt)', 'r_energie_poids_kcal_kg','part_proteines_poids']]
table_capacite[table_capacite["pays"] == "France"]
pays | pop_(M) | code_produit | produit | nourriture_(Mt) | r_energie_poids_kcal_kg | part_proteines_poids | |
---|---|---|---|---|---|---|---|
4144 | France | 64291 | 2731 | Viande de Bovins | 1531.0 | 1164.880692 | 0.144077 |
4145 | France | 64291 | 2732 | Viande d'Ovins/Caprins | 211.0 | 2335.500071 | 0.126784 |
4146 | France | 64291 | 2733 | Viande de Suides | 2125.0 | 2738.645327 | 0.095963 |
4147 | France | 64291 | 2734 | Viande de Volailles | 1474.0 | 1544.248884 | 0.139460 |
4148 | France | 64291 | 2735 | Viande, Autre | 238.0 | 1183.170504 | 0.182405 |
... | ... | ... | ... | ... | ... | ... | ... |
4234 | France | 64291 | 2659 | Alcool, non Comestible | NaN | NaN | NaN |
4235 | France | 64291 | 2680 | Aliments pour enfants | 0.0 | NaN | NaN |
4236 | France | 64291 | 2745 | Miel | 35.0 | 2681.853143 | 0.006705 |
4237 | France | 64291 | 2805 | Riz (Eq Blanchi) | 314.0 | 3886.124777 | 0.075481 |
4238 | France | 64291 | 2899 | Miscellanees | NaN | NaN | NaN |
95 rows × 7 columns
On dispose des éléments suivants :
table_veg['dispo_interieure_(Mt)']
table_veg['r_energie_poids_(kcal-kg)']
On cherche la disponibilité mondiale exprimée en kcal
-> il faut donc choisir le kg comme unité de poids
-> on convertit les milliers de tonnes en kg en multipliant par 1000000
cols = ['dispo_interieure_(Mt)', 'r_energie_poids_kcal_kg']
table[cols] = table[cols].replace({0:np.nan})
table = table.replace(np.inf, 0)
table['dispo_interieure_kcal'] = table['dispo_interieure_(Mt)']* 1000000 * table['r_energie_poids_kcal_kg']
table_vegetal = table[table['origine'] == 'vegetale']
dispo_int_veg_monde_kcal = table_vegetal['dispo_interieure_kcal'].sum()
print(f'Pour les produits végétaux, la disponibilité intérieure mondiale est de {dispo_int_veg_monde_kcal} kcal.')
Pour les produits végétaux, la disponibilité intérieure mondiale est de 1.2312091265143276e+16 kcal.
Donnez les résultats en termes de calories, puis de protéines, et exprimez ensuite ces 2 résultats en pourcentage de la population mondiale.
Pour répondre à cette question, il faut que l'on quantifie les besoins des êtres humains en apports caloriques et en apports de protéines.
On peut se baser sur un travail de normalisation de ces besoins au niveau mondial réalisé par la FAO que l'on retouve dans son rapport MÉTHODOLOGIE DE LA FAO POUR MESURER LA PRÉVALENCE DE LA SOUS-ALIMENTATION de 2008.
Il est indiqué dans ce rapport que la moyenne mondiale est de 2414 kcal par personne par jour.
On va faire l'hypothèse que l'on souhaite maintenir ce niveau énergétique.
On va se baser sur les recommandations internationales, reprises par exemple dans le Vidal en France, à savoir environ 0,8g par kg (cf. par kg du poids d'une personne) par jour.
Les données dont nous disposons :
la disponibilité intérieure mondiale pour les produits végétaux : dispo_int_veg_monde_kcal
l'apport énergétique pour une personne : 2414 kcal
par jour
la population à nourrir : pop_mondiale
(en milliers)
Soit cap_veg_nourrir_nb_pers_kcal
le nombre de personnes qu'il est possible de nourrir avec la disponibilité intérieure mondiale des produits végétaux exprimée en kcal;
soit cap_veg_nourrir_relatif_kcal
la capacité relative de la disponibilité intérieure mondiale des produits végétaux, exprimée en kcal, à nourrir la population mondiale actuelle
cap_veg_nourrir_nb_pers_kcal = dispo_int_veg_monde_kcal / (2414*365)
cap_veg_nourrir_relatif_kcal = (cap_veg_nourrir_nb_pers_kcal / pop_mondiale) * 100
cap_veg_nourrir_relatif_kcal = cap_veg_nourrir_relatif_kcal.round(2)
Les données dont nous disposons :
la disponibilité intérieure mondiale en protéines : dispo_alim_kg_proteines
(en kg)
les besoins en protéines : 0,8g par kg par jour par personne
la population à nourrir : pop_mondiale
Nous savons que les recommandations en terme de protéines sont de 0,8g par kg par jour par personne.
Nous supposons que la population mondiale se compose d'hommes et de femmes à part égale, avec un poids moyen de 75kg pour les hommes et de 60kg pour les femmes.
Ainsi, les besoins (en g) d'une peronne sur un an sont de :
pour les hommes : 0,8 75 365, soit 21900g <=> 21,9kg
pour les femmes : 0,8 60 365, soit 17520g <=> 17.52kg
Soit besoins_prot_pers_an
les besoins en protéines d'une personne sur un an
besoins_prot_pers_an = (21.9 + 17.52) / 2
print(f'Les besoins annuels en protéines pour une personne sont en moyenne de {besoins_prot_pers_an} kg.')
Les besoins annuels en protéines pour une personne sont en moyenne de 19.71 kg.
cols = ['dispo_interieure_(Mt)', 'part_proteines_poids']
table[cols] = table[cols].replace({0:np.nan})
table['dispo_interieure_proteines'] = table['dispo_interieure_(Mt)']* 1000000 * table['part_proteines_poids']
table_vegetal = table[table['origine'] == 'vegetale']
dispo_int_veg_monde_proteines = table_vegetal['dispo_interieure_proteines'].sum()
Soit cap_veg_nourrir_nb_pers_proteines
le nombre de personnes qu'il est possible de nourrir avec la disponibilité intérieure mondiale des produits végétaux exprimée en protéines;
soit cap_veg_nourrir_relatif_proteines
la capacité relative de la disponibilité intérieure mondiale des produits végétaux, exprimée en protéines, à nourrir la population mondiale actuelle
cap_veg_nourrir_nb_pers_proteines = dispo_int_veg_monde_proteines / besoins_prot_pers_an
cap_veg_nourrir_relatif_proteines = (cap_veg_nourrir_nb_pers_proteines / pop_mondiale) * 100
cap_veg_nourrir_relatif_proteines = cap_veg_nourrir_relatif_proteines.round(2)
print('Avec la disponibilté intérieure mondiale des produits végétaux, il est possible de nourrir :')
print(f' - En terme de calories, {int(cap_veg_nourrir_nb_pers_kcal)} prsonnes, soit {cap_veg_nourrir_relatif_kcal}% de la population mondiale de 2013.')
print(f' - En terme de protéines, {int(cap_veg_nourrir_nb_pers_proteines)} prsonnes, soit {cap_veg_nourrir_relatif_proteines}% de la population mondiale de 2013.')
Avec la disponibilté intérieure mondiale des produits végétaux, il est possible de nourrir : - En terme de calories, 13973387278 prsonnes, soit 199.7% de la population mondiale de 2013. - En terme de protéines, 14722340646 prsonnes, soit 210.4% de la population mondiale de 2013.
Il serait donc possible de nourrir 2 fois la population actuelle avec les seuls produits végétaux, en supposant que toute la disponibilité soit utilisée comme nourriture (sans perte, sans autre usage, sans traitement...)
Donnez les résultats en termes de calories, puis de protéines, et exprimez ensuite ces 2 résultats en pourcentage de la population mondiale.
table_vegetal['nourriture_(Mt)']
table_vegetal['alim_pour_animaux_(Mt)']
table_vegetal['pertes_(Mt)']
dispo_veg_nourriture_hum_et_anim_et_pertes
la disposition alimentaire en produits végétaux de la nourriture pour humains et animaux et des pertes :dispo_veg_nourriture_hum_et_anim_et_pertes_kcal
exprimée en caloriesdispo_veg_nourriture_hum_et_anim_et_pertes_proteines
exprimées en protéinesdispo_veg_nourriture_hum_et_anim_et_pertes
en kg : dispo_veg_nourriture_hum_et_anim_et_pertes
* 1000000r_energie_poids_kcal_kg
2414 * 365
dispo_veg_nourriture_hum_et_anim_et_pertes_kcal = ((table_vegetal['nourriture_(Mt)'] + table_vegetal['alim_pour_animaux_(Mt)'] + table_vegetal['pertes_(Mt)']) * 1000000 * table_vegetal['r_energie_poids_kcal_kg']).sum()
dispo_veg_nourriture_hum_et_anim_et_pertes_kcal_nb_pers = int(dispo_veg_nourriture_hum_et_anim_et_pertes_kcal / (2414*365))
dispo_veg_nourriture_hum_et_anim_et_pertes_kcal_relatif = ((dispo_veg_nourriture_hum_et_anim_et_pertes_kcal_nb_pers / pop_mondiale) * 100)
dispo_veg_nourriture_hum_et_anim_et_pertes_kcal_relatif = round(dispo_veg_nourriture_hum_et_anim_et_pertes_kcal_relatif, 2)
dispo_veg_nourriture_hum_et_anim_et_pertes
en kg : dispo_veg_nourriture_hum_et_anim_et_pertes
* 1000000part_proteines_poids
besoins_prot_pers_an
dispo_veg_nourriture_hum_et_anim_et_pertes_proteines = ((table_vegetal['nourriture_(Mt)'] + table_vegetal['alim_pour_animaux_(Mt)'] + table_vegetal['pertes_(Mt)']) * 1000000 * table_vegetal['part_proteines_poids']).sum()
dispo_veg_nourriture_hum_et_anim_et_pertes_proteines_nb_pers = int(dispo_veg_nourriture_hum_et_anim_et_pertes_proteines / besoins_prot_pers_an)
dispo_veg_nourriture_hum_et_anim_et_pertes_proteines_relatif = ((dispo_veg_nourriture_hum_et_anim_et_pertes_proteines_nb_pers / pop_mondiale) * 100)
dispo_veg_nourriture_hum_et_anim_et_pertes_proteines_relatif = round(dispo_veg_nourriture_hum_et_anim_et_pertes_proteines_relatif, 2)
print('Avec la disponibilité alimentaire en produits végétaux de la nourriture pour humains et animaux et des pertes, il est possible de nourrir :')
print(f' - En terme de calories, {dispo_veg_nourriture_hum_et_anim_et_pertes_kcal_nb_pers} prsonnes, soit {dispo_veg_nourriture_hum_et_anim_et_pertes_kcal_relatif}% de la population mondiale de 2013.')
print(f' - En terme de protéines, {dispo_veg_nourriture_hum_et_anim_et_pertes_proteines_nb_pers} prsonnes, soit {dispo_veg_nourriture_hum_et_anim_et_pertes_proteines_relatif}% de la population mondiale de 2013.')
Avec la disponibilité alimentaire en produits végétaux de la nourriture pour humains et animaux et des pertes, il est possible de nourrir : - En terme de calories, 6926884527 prsonnes, soit 98.99% de la population mondiale de 2013. - En terme de protéines, 8139178175 prsonnes, soit 116.32% de la population mondiale de 2013.
En supposant que les pertes soient nulles, la part des végétaux utilisée à nourrir les humains et les animaux serait suffisante pour nourrir toute la population
(donc en gardant les utilisations non alimentaires des productions agricoles végétales actuelles telles quelles)
table['nourriture_(Mt)']
dispo_alim_monde_kcal = (table['nourriture_(Mt)'] * 1000000 * table['r_energie_poids_kcal_kg']).sum()
dispo_alim_monde_proteines = (table['nourriture_(Mt)'] * 1000000 * table['part_proteines_poids']).sum()
print('En 2013, la disponibilité alimentaire mondiale totale est de : ')
print(f' - {dispo_alim_monde_kcal} kcal')
print(f' - {dispo_alim_monde_proteines} kg de protéines')
En 2013, la disponibilité alimentaire mondiale totale est de : - 7360354597265000.0 kcal - 207145508486.90002 kg de protéines
dispo_alim_monde_kcal_nb_pers = int(dispo_alim_monde_kcal / (2414*365))
dispo_alim_monde_kcal_relatif = ((dispo_alim_monde_kcal_nb_pers / pop_mondiale) * 100)
dispo_alim_monde_kcal_relatif = round(dispo_alim_monde_kcal_relatif, 2)
dispo_alim_monde_proteines_nb_pers = int(dispo_alim_monde_proteines / besoins_prot_pers_an)
dispo_alim_monde_proteines_relatif = ((dispo_alim_monde_proteines_nb_pers / pop_mondiale) * 100)
dispo_alim_monde_proteines_relatif = round(dispo_alim_monde_proteines_relatif, 2)
print('Avec la disponibilité alimentaire mondiale totale, il est possible de nourrir :')
print(f' - En terme de calories, {dispo_alim_monde_kcal_nb_pers} personnes, soit {dispo_alim_monde_kcal_relatif}% de la population mondiale de 2013.')
print(f' - En terme de protéines, {dispo_alim_monde_proteines_nb_pers} personnes, soit {dispo_alim_monde_proteines_relatif}% de la population mondiale de 2013.')
Avec la disponibilité alimentaire mondiale totale, il est possible de nourrir : - En terme de calories, 8353502510 personnes, soit 119.38% de la population mondiale de 2013. - En terme de protéines, 10509665575 personnes, soit 150.2% de la population mondiale de 2013.
La disponibilité alimentaire est actuellement suffisante pour nourrir l'ensemble de la population mondiale.
Le problème n'est donc pas un manque de production mais plutôt une répartition inégale de cette disponibilité.
sous_alim = pd.read_csv("data/FAO_2013_fr/fr_sousalimentation.csv")
pd.set_option('display.max_columns', sous_alim.shape[1]+1)
sous_alim.head()
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | Symbole | Description du Symbole | Note | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FS | Données de la sécurité alimentaire | 2 | Afghanistan | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20122014 | 2012-2014 | millions | 7.9 | F | Estimation FAO | NaN |
1 | FS | Données de la sécurité alimentaire | 2 | Afghanistan | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20132015 | 2013-2015 | millions | 8.8 | F | Estimation FAO | NaN |
2 | FS | Données de la sécurité alimentaire | 2 | Afghanistan | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20142016 | 2014-2016 | millions | 9.6 | F | Estimation FAO | NaN |
3 | FS | Données de la sécurité alimentaire | 2 | Afghanistan | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20152017 | 2015-2017 | millions | 10.2 | F | Estimation FAO | NaN |
4 | FS | Données de la sécurité alimentaire | 2 | Afghanistan | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20162018 | 2016-2018 | millions | 10.6 | F | Estimation FAO | NaN |
sous_alim.describe(include="all")
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | Symbole | Description du Symbole | Note | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 1020 | 1020 | 1020.000000 | 1020 | 1020.0 | 1020 | 1020.0 | 1020 | 1.020000e+03 | 1020 | 1020 | 605 | 1020 | 1020 | 0.0 |
unique | 1 | 1 | NaN | 204 | NaN | 1 | NaN | 1 | NaN | 5 | 1 | 146 | 3 | 3 | NaN |
top | FS | Données de la sécurité alimentaire | NaN | Jordanie | NaN | Valeur | NaN | Nombre de personnes sous-alimentées (millions)... | NaN | 2016-2018 | millions | <0.1 | F | Estimation FAO | NaN |
freq | 1020 | 1020 | NaN | 5 | NaN | 1020 | NaN | 1020 | NaN | 204 | 1020 | 115 | 605 | 605 | NaN |
mean | NaN | NaN | 129.264706 | NaN | 6132.0 | NaN | 210011.0 | NaN | 2.014202e+07 | NaN | NaN | NaN | NaN | NaN | NaN |
std | NaN | NaN | 76.615019 | NaN | 0.0 | NaN | 0.0 | NaN | 1.415049e+04 | NaN | NaN | NaN | NaN | NaN | NaN |
min | NaN | NaN | 1.000000 | NaN | 6132.0 | NaN | 210011.0 | NaN | 2.012201e+07 | NaN | NaN | NaN | NaN | NaN | NaN |
25% | NaN | NaN | 62.500000 | NaN | 6132.0 | NaN | 210011.0 | NaN | 2.013202e+07 | NaN | NaN | NaN | NaN | NaN | NaN |
50% | NaN | NaN | 127.500000 | NaN | 6132.0 | NaN | 210011.0 | NaN | 2.014202e+07 | NaN | NaN | NaN | NaN | NaN | NaN |
75% | NaN | NaN | 193.250000 | NaN | 6132.0 | NaN | 210011.0 | NaN | 2.015202e+07 | NaN | NaN | NaN | NaN | NaN | NaN |
max | NaN | NaN | 351.000000 | NaN | 6132.0 | NaN | 210011.0 | NaN | 2.016202e+07 | NaN | NaN | NaN | NaN | NaN | NaN |
sous_alim.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1020 entries, 0 to 1019 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Code Domaine 1020 non-null object 1 Domaine 1020 non-null object 2 Code zone 1020 non-null int64 3 Zone 1020 non-null object 4 Code Élément 1020 non-null int64 5 Élément 1020 non-null object 6 Code Produit 1020 non-null int64 7 Produit 1020 non-null object 8 Code année 1020 non-null int64 9 Année 1020 non-null object 10 Unité 1020 non-null object 11 Valeur 605 non-null object 12 Symbole 1020 non-null object 13 Description du Symbole 1020 non-null object 14 Note 0 non-null float64 dtypes: float64(1), int64(4), object(10) memory usage: 119.7+ KB
sous_alim.Année.value_counts()
2016-2018 204 2015-2017 204 2013-2015 204 2012-2014 204 2014-2016 204 Name: Année, dtype: int64
sous_alim.Produit.value_counts()
Nombre de personnes sous-alimentées (millions) (moyenne sur 3 ans) 1020 Name: Produit, dtype: int64
sous_alim.nunique()
Code Domaine 1 Domaine 1 Code zone 204 Zone 204 Code Élément 1 Élément 1 Code Produit 1 Produit 1 Code année 5 Année 5 Unité 1 Valeur 146 Symbole 3 Description du Symbole 3 Note 0 dtype: int64
pattern = sous_alim.Zone.str.contains("chine", case=False)
chaine_chine = sous_alim[pattern]
pd.set_option('display.max_columns', chaine_chine.shape[1]+1)
chaine_chine.head()
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | Symbole | Description du Symbole | Note | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
185 | FS | Données de la sécurité alimentaire | 351 | Chine | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20122014 | 2012-2014 | millions | 137.7 | F | Estimation FAO | NaN |
186 | FS | Données de la sécurité alimentaire | 351 | Chine | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20132015 | 2013-2015 | millions | 130 | F | Estimation FAO | NaN |
187 | FS | Données de la sécurité alimentaire | 351 | Chine | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20142016 | 2014-2016 | millions | 125 | F | Estimation FAO | NaN |
188 | FS | Données de la sécurité alimentaire | 351 | Chine | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20152017 | 2015-2017 | millions | 123.1 | F | Estimation FAO | NaN |
189 | FS | Données de la sécurité alimentaire | 351 | Chine | 6132 | Valeur | 210011 | Nombre de personnes sous-alimentées (millions)... | 20162018 | 2016-2018 | millions | 122.4 | F | Estimation FAO | NaN |
La Chine apparait à nouveau 2 fois
----> on va supprimer le doublon
sous_alim = sous_alim.drop(sous_alim[sous_alim['Code zone'] == 351].index)
'Description du Symbole'
et les valeurs de 'Produit'
(cf. le nombre de pers sous-alimentées) associéessous_alim['Description du Symbole'].unique()
array(['Estimation FAO', 'Non rapportée', 'Non disponible'], dtype=object)
x = sous_alim[sous_alim['Description du Symbole'] == 'Non rapportée']
x.Valeur.unique()
array([nan], dtype=object)
y = sous_alim[sous_alim['Description du Symbole'] == 'Non disponible']
y.Valeur.unique()
array([nan], dtype=object)
z = sous_alim[sous_alim['Description du Symbole'] == 'Estimation FAO']
z.Valeur.unique()
array(['7.9', '8.8', '9.6', '10.2', '10.6', '2.6', '2.8', '3.2', '3.4', '3.5', '0.2', '1.7', '1.6', '8.1', '7.6', '7.4', '1.8', '2', '2.3', '1.5', '2.1', '0.1', '26.1', '25.8', '25.3', '24.7', '24.2', '<0.1', '1', '1.1', '2.2', '1.9', '0.5', '0.6', '0.4', '0.3', '3.6', '3.7', '3.8', '2.7', '2.4', '136.6', '129', '124', '122.1', '121.4', '0.9', '0.8', '4.1', '3.1', '4.7', '4.6', '3.9', '4', '4.2', '4.4', '0.7', '1.3', '23.8', '22.7', '21.9', '21.6', '2.5', '5.2', '5.3', '5.4', '1.2', '216.3', '210.4', '202.7', '196.9', '194.4', '22.6', '22.3', '22.5', '22', '9.1', '10.7', '11.1', '10', '10.5', '11.8', '13.3', '14.6', '8.2', '11.4', '3.3', '1.4', '5', '4.9', '4.8', '7', '7.3', '8.3', '6.6', '6.1', '5.8', '5.6', '5.7', '2.9', '13.4', '15.2', '17.4', '21.4', '25.6', '12.6', '13.6', '15.1', '16.5', '17.6', '38.1', '38.9', '39.3', '39.7', '40', '3', '14', '13.9', '10.9', '11.2', '11.7', '12.2', '16.4', '16.7', '17', '17.2', '4.3', '4.5', '7.8', '5.1', '5.5', '6.8', '10.4', '9.7', '9.2', '8.9', '7.2', '9.3', '11', '8', '8.5'], dtype=object)
Ainsi, seuls les éléments de 'Estimation FAO'
contiennent des données chiffrées (que des NaN pour les 2 autres valeurs possibles de 'Description du Symbole'
)
On définit un df qui ne contiendra que les les lignes pour lesquelles existent une valeur (autre que NaN) pour la variable 'nb_sous_alim_en_m'
On ne garde que les colonnes utiles et on en profite pour les renommer
ss_alim = sous_alim[sous_alim['Description du Symbole'] == 'Estimation FAO']
ss_alim = ss_alim[['Code zone', 'Zone', 'Année', 'Valeur']]
ss_alim.rename({'Code zone':'code_pays', 'Zone':'pays', 'Année':'annees', 'Valeur':'nb_sous_alim_en_m'}, axis=1, inplace=True)
ss_alim.head
<bound method NDFrame.head of code_pays pays annees nb_sous_alim_en_m 0 2 Afghanistan 2012-2014 7.9 1 2 Afghanistan 2013-2015 8.8 2 2 Afghanistan 2014-2016 9.6 3 2 Afghanistan 2015-2017 10.2 4 2 Afghanistan 2016-2018 10.6 ... ... ... ... ... 1015 181 Zimbabwe 2012-2014 6.6 1016 181 Zimbabwe 2013-2015 7.2 1017 181 Zimbabwe 2014-2016 7.8 1018 181 Zimbabwe 2015-2017 8.2 1019 181 Zimbabwe 2016-2018 8.5 [600 rows x 4 columns]>
Méthode choisie :
--> on va calculer le nombre de personnes souffrant de sous-alimentation pour chaque intervalle de temps, et ainsi voir son évolution entre 2013 et 2018
On va arranger les données :
*Pour les dates* :
--> on remplace l'intervalle des 3 ans par la valeur mediane
ss_alim['annees'] = ss_alim['annees'].replace({'2012-2014': str('2013'), '2013-2015': str('2014'), '2014-2016': str('2015'), '2015-2017': str('2016'), '2016-2018': str('2017')})
ss_alim['annees'] = ss_alim['annees'].apply(pd.to_numeric)
ss_alim.dtypes
code_pays int64 pays object annees int64 nb_sous_alim_en_m object dtype: object
*Pour les valeurs de `nb_sous_alim_en_m` <0.1* :
Il faut traiter ces valeurs car il ne s'agit pas de valeurs numériques : on ne peut pas s'en servir en l'état pour calculer la somme des personnes étant en sous-nutrition.
On fait un comptage de ces valeurs pour voir si elles sont ou non négligeables
ss_alim[ss_alim['nb_sous_alim_en_m'] == '<0.1'].value_counts().sum()
115
Le nombre d'occurences d'apparition de la valeur '<0.01'
est de 115, sur un total de 600 valeurs, ce qui n'est pas négligeable
---> Il faut donc en tenir compte
'<0.01'
par la valeur '0.05'
, c'est à dire la moitié de 0.1ss_alim['nb_sous_alim_en_m'] = ss_alim['nb_sous_alim_en_m'].replace('<0.1', float(0.05))
pd.set_option('display.max_rows', ss_alim.shape[0]+1)
ss_alim['nb_sous_alim_en_m'] = ss_alim['nb_sous_alim_en_m'].apply(pd.to_numeric)
ss_alim.head()
code_pays | pays | annees | nb_sous_alim_en_m | |
---|---|---|---|---|
0 | 2 | Afghanistan | 2013 | 7.9 |
1 | 2 | Afghanistan | 2014 | 8.8 |
2 | 2 | Afghanistan | 2015 | 9.6 |
3 | 2 | Afghanistan | 2016 | 10.2 |
4 | 2 | Afghanistan | 2017 | 10.6 |
ss_alim.dtypes
code_pays int64 pays object annees int64 nb_sous_alim_en_m float64 dtype: object
annee = [2013, 2014, 2015, 2016, 2017]
pop_monde = [7210581976, 7295290765, 7379797139, 7464022049, 7547858925]
print('Le nombre de personnes étant en sous-nutrition est de :')
t=0
for i in annee:
nb_ss_nut_annee = ss_alim[ss_alim['annees'] == i]
nb_ss_nut = int(nb_ss_nut_annee['nb_sous_alim_en_m'].sum())*1000000
part_ss_nut = (nb_ss_nut / pop_monde[t])*100
part_ss_nut = round(part_ss_nut, 2)
t +=1
print(f' - {nb_ss_nut} en {i}, soit {part_ss_nut}% de la population mondiale')
Le nombre de personnes étant en sous-nutrition est de : - 744000000 en 2013, soit 10.32% de la population mondiale - 736000000 en 2014, soit 10.09% de la population mondiale - 735000000 en 2015, soit 9.96% de la population mondiale - 741000000 en 2016, soit 9.93% de la population mondiale - 752000000 en 2017, soit 9.96% de la population mondiale
On constate que la proportion de personnes sous-alimentées au niveau mondial est relativement stable entre 2013 et 2017
Repérez dans vos données les informations concernant les céréales (par exemple en créant une colonne de type booléen nommée "is_cereal")
On charge les données relatives aux céréales
cereales = pd.read_csv("data/FAO_2013_fr/fr_céréales.csv")
cereales.head()
Code Domaine | Domaine | Code zone | Zone | Code Élément | Élément | Code Produit | Produit | Code année | Année | Unité | Valeur | Symbole | Description du Symbole | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5511 | Production | 2511 | Blé | 2013 | 2013 | Milliers de tonnes | 5169 | S | Données standardisées |
1 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5511 | Production | 2805 | Riz (Eq Blanchi) | 2013 | 2013 | Milliers de tonnes | 342 | S | Données standardisées |
2 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5511 | Production | 2513 | Orge | 2013 | 2013 | Milliers de tonnes | 514 | S | Données standardisées |
3 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5511 | Production | 2514 | Maïs | 2013 | 2013 | Milliers de tonnes | 312 | S | Données standardisées |
4 | FBSH | Bilans Alimentaire (Ancienne méthodologie et p... | 2 | Afghanistan | 5511 | Production | 2517 | Millet | 2013 | 2013 | Milliers de tonnes | 13 | S | Données standardisées |
cereales.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Code Domaine 891 non-null object 1 Domaine 891 non-null object 2 Code zone 891 non-null int64 3 Zone 891 non-null object 4 Code Élément 891 non-null int64 5 Élément 891 non-null object 6 Code Produit 891 non-null int64 7 Produit 891 non-null object 8 Code année 891 non-null int64 9 Année 891 non-null int64 10 Unité 891 non-null object 11 Valeur 891 non-null int64 12 Symbole 891 non-null object 13 Description du Symbole 891 non-null object dtypes: int64(6), object(8) memory usage: 97.6+ KB
Code Produit
et Produit
cereales = cereales[['Code Produit', 'Produit']]
cereales
Code Produit | Produit | |
---|---|---|
0 | 2511 | Blé |
1 | 2805 | Riz (Eq Blanchi) |
2 | 2513 | Orge |
3 | 2514 | Maïs |
4 | 2517 | Millet |
... | ... | ... |
886 | 2514 | Maïs |
887 | 2516 | Avoine |
888 | 2517 | Millet |
889 | 2518 | Sorgho |
890 | 2520 | Céréales, Autres |
891 rows × 2 columns
cereales_prod = cereales.drop_duplicates(keep = 'first')
cereales_prod
Code Produit | Produit | |
---|---|---|
0 | 2511 | Blé |
1 | 2805 | Riz (Eq Blanchi) |
2 | 2513 | Orge |
3 | 2514 | Maïs |
4 | 2517 | Millet |
9 | 2515 | Seigle |
10 | 2516 | Avoine |
12 | 2518 | Sorgho |
13 | 2520 | Céréales, Autres |
cereales_prod.columns = ['code_cereale', 'cereale']
cereales_prod
code_cereale | cereale | |
---|---|---|
0 | 2511 | Blé |
1 | 2805 | Riz (Eq Blanchi) |
2 | 2513 | Orge |
3 | 2514 | Maïs |
4 | 2517 | Millet |
9 | 2515 | Seigle |
10 | 2516 | Avoine |
12 | 2518 | Sorgho |
13 | 2520 | Céréales, Autres |
cereales_prod = cereales_prod.reset_index()
print('Les produits considérés comme des céréales par la FAO sont les suivants :')
for i in range(0,len(cereales_prod)):
print(f' - {cereales_prod.cereale[i]} (code {cereales_prod.code_cereale[i]})')
Les produits considérés comme des céréales par la FAO sont les suivants : - Blé (code 2511) - Riz (Eq Blanchi) (code 2805) - Orge (code 2513) - Maïs (code 2514) - Millet (code 2517) - Seigle (code 2515) - Avoine (code 2516) - Sorgho (code 2518) - Céréales, Autres (code 2520)
is_cereal
de type booléen dans notre df table
pour indiquer si le produit est considéré comme une céréale ou nonOn met comme valeur par défaut False
table.insert(7, 'is_cereal', False)
cereales_list = list(cereales_prod.cereale)
'is_cereal'
et on affiche une partie du df table
pour vérifier la prise en compte de la MAJtable.loc[table['produit'].isin(cereales_list), 'is_cereal'] = True
table.head()
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | is_cereal | ... | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | part_proteines_poids | dispo_interieure_kcal | dispo_interieure_proteines | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Arménie | 2977 | animale | 2013 | 2731 | Viande de Bovins | False | ... | NaN | 0.0 | 1.238730e+11 | 8660241.85 | 2099.541864 | 0.146784 | 1.280721e+11 | 8.953809e+06 |
1 | 1 | Arménie | 2977 | animale | 2013 | 2732 | Viande d'Ovins/Caprins | False | ... | NaN | NaN | 2.390531e+10 | 1216997.60 | 2656.145556 | 0.135222 | 2.390531e+10 | 1.216998e+06 |
2 | 1 | Arménie | 2977 | animale | 2013 | 2733 | Viande de Suides | False | ... | NaN | 0.0 | 7.823556e+10 | 2749110.65 | 2697.777931 | 0.094797 | 8.363112e+10 | 2.938704e+06 |
3 | 1 | Arménie | 2977 | animale | 2013 | 2734 | Viande de Volailles | False | ... | NaN | NaN | 4.889722e+10 | 4900588.55 | 1222.430625 | 0.122515 | 4.889722e+10 | 4.900589e+06 |
4 | 1 | Arménie | 2977 | animale | 2013 | 2735 | Viande, Autre | False | ... | NaN | NaN | 0.000000e+00 | 0.00 | NaN | NaN | NaN | NaN |
5 rows × 29 columns
table_cereales = table[table['is_cereal'] == True]
table_cereales
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | is_cereal | ... | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | part_proteines_poids | dispo_interieure_kcal | dispo_interieure_proteines | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
22 | 1 | Arménie | 2977 | vegetale | 2013 | 2511 | Blé | True | ... | 10.0 | -118.0 | 1.112684e+12 | 3.316318e+07 | 2860.368946 | 0.085252 | 1.584644e+12 | 4.722983e+07 |
23 | 1 | Arménie | 2977 | vegetale | 2013 | 2513 | Orge | True | ... | 7.0 | 0.0 | 0.000000e+00 | 0.000000e+00 | NaN | NaN | NaN | NaN |
24 | 1 | Arménie | 2977 | vegetale | 2013 | 2514 | Maïs | True | ... | NaN | NaN | 0.000000e+00 | 1.086605e+04 | NaN | NaN | NaN | NaN |
25 | 1 | Arménie | 2977 | vegetale | 2013 | 2515 | Seigle | True | ... | NaN | 0.0 | 1.086605e+09 | 2.173210e+04 | 0.000000 | NaN | 0.000000e+00 | NaN |
26 | 1 | Arménie | 2977 | vegetale | 2013 | 2516 | Avoine | True | ... | NaN | NaN | 2.173210e+09 | 9.779445e+04 | 2173.210000 | 0.097794 | 1.303926e+10 | 5.867667e+05 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
15539 | 276 | Soudan | 37964 | vegetale | 2013 | 2516 | Avoine | True | ... | NaN | NaN | 0.000000e+00 | NaN | NaN | NaN | NaN | NaN |
15540 | 276 | Soudan | 37964 | vegetale | 2013 | 2517 | Millet | True | ... | NaN | 0.0 | 8.591253e+11 | 2.244811e+07 | 3193.774424 | 0.083450 | 1.146565e+12 | 2.995863e+07 |
15541 | 276 | Soudan | 37964 | vegetale | 2013 | 2518 | Sorgho | True | ... | 147.0 | -900.0 | 8.147834e+12 | 2.326567e+08 | 2916.189578 | 0.083270 | 1.085697e+13 | 3.100146e+08 |
15542 | 276 | Soudan | 37964 | vegetale | 2013 | 2520 | Céréales, Autres | True | ... | NaN | NaN | 1.662823e+11 | 3.879921e+06 | 3464.215000 | 0.080832 | 1.662823e+11 | 3.879921e+06 |
15603 | 276 | Soudan | 37964 | vegetale | 2013 | 2805 | Riz (Eq Blanchi) | True | ... | NaN | 0.0 | 1.939960e+11 | 3.879921e+06 | 4041.584167 | 0.080832 | 1.980376e+11 | 3.960752e+06 |
1497 rows × 29 columns
table_cereales.replace(0, np.nan)
alim_cereales_pour_humains = table_cereales['nourriture_(Mt)'].sum()
alim_cereales_pour_animaux = table_cereales['alim_pour_animaux_(Mt)'].sum()
alim_cereales_totale = alim_cereales_pour_humains + alim_cereales_pour_animaux
part_animaux_alim_cereales_totale = (alim_cereales_pour_animaux / alim_cereales_totale)*100
part_animaux_alim_cereales_totale = round(part_animaux_alim_cereales_totale, 2)
print(f'La proportion (en termes de poids) destinée à l\'alimentation animale des produits végétaux considérés comme des céréales et destinés à l\'alimentation est de {part_animaux_alim_cereales_totale}%.')
La proportion (en termes de poids) destinée à l'alimentation animale des produits végétaux considérés comme des céréales et destinés à l'alimentation est de 45.91%.
Ainsi, près de la moitié des céréales produites à usage alimentaire dans le monde est utilisée pour nourrir des animaux.
Repérez les 15 produits les plus exportés par ce groupe de pays.
ss_alim
en limitant les données à l'année médiane 2013ss_alim_2013 = ss_alim[ss_alim['annees'] == 2013]
ss_alim_2013.head()
code_pays | pays | annees | nb_sous_alim_en_m | |
---|---|---|---|---|
0 | 2 | Afghanistan | 2013 | 7.9 |
5 | 202 | Afrique du Sud | 2013 | 2.6 |
10 | 3 | Albanie | 2013 | 0.2 |
15 | 4 | Algérie | 2013 | 1.7 |
30 | 7 | Angola | 2013 | 8.1 |
code_pays
et nb_sous_alim_en_m
ss_alim_2013 = ss_alim_2013[['code_pays', 'nb_sous_alim_en_m']]
ss_alim_2013.tail(3)
code_pays | nb_sous_alim_en_m | |
---|---|---|
1005 | 249 | 7.2 |
1010 | 251 | 7.0 |
1015 | 181 | 6.6 |
codes_pays
présents dans le df ss_alim_2013
sont bien présents dans le df général table
ss_alim_2013['code_pays'].value_counts()
liste_code_pays_ss_alim_2013 = list(ss_alim_2013['code_pays'])
liste_code_pays_table = list(table['code_pays'])
check = all(item in liste_code_pays_table for item in liste_code_pays_ss_alim_2013)
if check:
print ("Oui, liste_code_pays_table contient tous les éléments de liste_code_pays_ss_alim_2013")
else :
print ("Non, liste_code_pays_table ne contient pas tous les éléments de liste_code_pays_ss_alim_2013")
Oui, liste_code_pays_table contient tous les éléments de liste_code_pays_ss_alim_2013
nb_sous_alim_en_m
dans le df principal table
:code_pays
table
et on rajoute la colonne nb_sous_alim_en_m
du df ss_alim_2013
table = pd.merge(table, ss_alim_2013, on='code_pays', how='left')
table.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 15605 entries, 0 to 15604 Data columns (total 30 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 code_pays 15605 non-null int64 1 pays 15605 non-null object 2 pop_(M) 15605 non-null int64 3 origine 15605 non-null object 4 annee 15605 non-null int64 5 code_produit 15605 non-null int64 6 produit 15605 non-null object 7 is_cereal 15605 non-null bool 8 alim_pour_animaux_(Mt) 2720 non-null float64 9 autres_utilisations_(Mt) 5496 non-null float64 10 dispo_alim_(kcal-p-j) 14241 non-null float64 11 dispo_alim_qte_(kg-p-an) 14015 non-null float64 12 dispo_mat_grasse_(g-p-j) 11794 non-null float64 13 dispo_proteines_qte_(g-p-j) 11561 non-null float64 14 dispo_interieure_(Mt) 11283 non-null float64 15 exportations_(Mt) 12226 non-null float64 16 importations_(Mt) 14852 non-null float64 17 nourriture_(Mt) 14015 non-null float64 18 pertes_(Mt) 4278 non-null float64 19 production_(Mt) 9180 non-null float64 20 semences_(Mt) 2091 non-null float64 21 traitement_(Mt) 2292 non-null float64 22 var_stocks_(Mt) 6776 non-null float64 23 dispo_alim_kcal 14241 non-null float64 24 dispo_alim_kg_proteines 11561 non-null float64 25 r_energie_poids_kcal_kg 9954 non-null float64 26 part_proteines_poids 7851 non-null float64 27 dispo_interieure_kcal 9069 non-null float64 28 dispo_interieure_proteines 7843 non-null float64 29 nb_sous_alim_en_m 10536 non-null float64 dtypes: bool(1), float64(22), int64(4), object(3) memory usage: 3.6+ MB
nb_sous_alim_en_m
possède une valeur numériquetable_ss_nut = table.dropna(subset=['nb_sous_alim_en_m'])
table_ss_nut
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | is_cereal | ... | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | part_proteines_poids | dispo_interieure_kcal | dispo_interieure_proteines | nb_sous_alim_en_m | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | Arménie | 2977 | animale | 2013 | 2731 | Viande de Bovins | False | ... | 0.0 | 1.238730e+11 | 8660241.85 | 2099.541864 | 0.146784 | 1.280721e+11 | 8.953809e+06 | 0.1 |
1 | 1 | Arménie | 2977 | animale | 2013 | 2732 | Viande d'Ovins/Caprins | False | ... | NaN | 2.390531e+10 | 1216997.60 | 2656.145556 | 0.135222 | 2.390531e+10 | 1.216998e+06 | 0.1 |
2 | 1 | Arménie | 2977 | animale | 2013 | 2733 | Viande de Suides | False | ... | 0.0 | 7.823556e+10 | 2749110.65 | 2697.777931 | 0.094797 | 8.363112e+10 | 2.938704e+06 | 0.1 |
3 | 1 | Arménie | 2977 | animale | 2013 | 2734 | Viande de Volailles | False | ... | NaN | 4.889722e+10 | 4900588.55 | 1222.430625 | 0.122515 | 4.889722e+10 | 4.900589e+06 | 0.1 |
4 | 1 | Arménie | 2977 | animale | 2013 | 2735 | Viande, Autre | False | ... | NaN | 0.000000e+00 | 0.00 | NaN | NaN | NaN | NaN | 0.1 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
15600 | 276 | Soudan | 37964 | vegetale | 2013 | 2659 | Alcool, non Comestible | False | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 8.3 |
15601 | 276 | Soudan | 37964 | vegetale | 2013 | 2680 | Aliments pour enfants | False | ... | NaN | 0.000000e+00 | 0.00 | NaN | NaN | NaN | NaN | 8.3 |
15602 | 276 | Soudan | 37964 | vegetale | 2013 | 2745 | Miel | False | ... | NaN | 0.000000e+00 | NaN | NaN | NaN | NaN | NaN | 8.3 |
15603 | 276 | Soudan | 37964 | vegetale | 2013 | 2805 | Riz (Eq Blanchi) | True | ... | 0.0 | 1.939960e+11 | 3879920.80 | 4041.584167 | 0.080832 | 1.980376e+11 | 3.960752e+06 | 8.3 |
15604 | 276 | Soudan | 37964 | vegetale | 2013 | 2899 | Miscellanees | False | ... | NaN | 9.699802e+10 | 20369584.20 | NaN | NaN | NaN | NaN | 8.3 |
10536 rows × 30 columns
test_total_ss_nut = table.groupby('pays')['nb_sous_alim_en_m'].min()
test_total_ss_nut.sum()
744.8500000000001
On détermine les 15 produits les plus exportés par les pays dans lesquels la FAO recense des personnes en sous-nutrition
-> On réalise un groupy
par produit sur lesquels on réalise la somme des exportations réalisées par tous ces pays
-> Puis on trie les résultats par ordre décroissant en limitant le résultat aux 15 premiers éléments
table_ss_nut_exp_sum = table_ss_nut.groupby(['produit']).sum()['exportations_(Mt)'].sort_values(ascending=False).head(15)
table_ss_nut_exp_sum
produit Huile de Palme 46324.0 Maïs 37906.0 Manioc 35851.0 Riz (Eq Blanchi) 33093.0 Sucre Eq Brut 26098.0 Blé 25342.0 Légumes, Autres 20139.0 Bananes 17988.0 Lait - Excl Beurre 14973.0 Fruits, Autres 14690.0 Soja 14391.0 Poissons Pelagiques 14181.0 Tomates 8935.0 Pommes 7897.0 Oranges, Mandarines 7106.0 Name: exportations_(Mt), dtype: float64
table_ss_nut_exp_sum.index
Index(['Huile de Palme', 'Maïs', 'Manioc', 'Riz (Eq Blanchi)', 'Sucre Eq Brut', 'Blé', 'Légumes, Autres', 'Bananes', 'Lait - Excl Beurre', 'Fruits, Autres', 'Soja', 'Poissons Pelagiques', 'Tomates', 'Pommes', 'Oranges, Mandarines'], dtype='object', name='produit')
total_export = table_ss_nut_exp_sum.sum()
list_valeur_export_15 = list(table_ss_nut_exp_sum)
list_export_15 = list(table_ss_nut_exp_sum.index)
print('Ainsi, les 15 produits les plus exportés par ce groupe de pays sont les suivants :')
for i in range(15):
print(f' - {list_export_15[i]} ({round((list_valeur_export_15[i]/total_export)*100,2)}%)')
Ainsi, les 15 produits les plus exportés par ce groupe de pays sont les suivants : - Huile de Palme (14.26%) - Maïs (11.67%) - Manioc (11.03%) - Riz (Eq Blanchi) (10.19%) - Sucre Eq Brut (8.03%) - Blé (7.8%) - Légumes, Autres (6.2%) - Bananes (5.54%) - Lait - Excl Beurre (4.61%) - Fruits, Autres (4.52%) - Soja (4.43%) - Poissons Pelagiques (4.36%) - Tomates (2.75%) - Pommes (2.43%) - Oranges, Mandarines (2.19%)
Remarque : On peut déterminer parmi ces produits lesquels sont des céréales
liste_cereales_prod = []
for i in range(0,len(cereales_prod)):
liste_cereales_prod.append(cereales_prod.cereale[i])
liste_export_cereal=[]
liste_export_cereal=list(set(liste_cereales_prod).intersection(list_export_15))
liste_export_cereal
print(f'Parmi les 15 produits les plus exportés par les pays connaissant une sous-alimentation, {len(liste_export_cereal)} sont des céréales : ')
for i in liste_export_cereal:
print(f' - {i}')
Parmi les 15 produits les plus exportés par les pays connaissant une sous-alimentation, 3 sont des céréales : - Maïs - Blé - Riz (Eq Blanchi)
Groupez ces importations par produit, afin d'avoir une table contenant 1 ligne pour chacun des 15 produits.
Ensuite, calculez pour chaque produit les 2 quantités suivantes :
On ne se limite plus aux seuls pays souffrant de sous-nutrition
-> on se place à nouveau au niveau mondial
-> on prend table
comme df de référence
On détermine les 200 plus grandes importations des 15 produits les plus exportés par les pays connaissant de la sous-nutrition
On réalise cette opération en 2 étapes :
isin
pour sélectionner uniquement les 15 produits les plus exportés par les pays avec sous-nutritiontable_import_temp = table[['code_pays', 'pays', 'nb_sous_alim_en_m', 'code_produit', 'produit', 'importations_(Mt)', 'alim_pour_animaux_(Mt)', 'nourriture_(Mt)', 'autres_utilisations_(Mt)', 'dispo_interieure_(Mt)']]
table_import = table_import_temp.loc[table['produit'].isin(list_export_15)].sort_values('importations_(Mt)', ascending=False)
pd.set_option('display.max_columns', table_import.shape[1]+1)
table_import.tail(3)
code_pays | pays | nb_sous_alim_en_m | code_produit | produit | importations_(Mt) | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | |
---|---|---|---|---|---|---|---|---|---|---|
15533 | 276 | Soudan | 8.3 | 2763 | Poissons Pelagiques | NaN | NaN | 0.0 | 0.0 | NaN |
15544 | 276 | Soudan | 8.3 | 2532 | Manioc | NaN | NaN | 15.0 | NaN | 15.0 |
15583 | 276 | Soudan | 8.3 | 2615 | Bananes | NaN | NaN | 758.0 | NaN | 758.0 |
test = table_import.groupby(['produit', 'pays']).sum()['importations_(Mt)'].sort_values(ascending=False)
test.head()
produit pays Soja Chine, continentale 63381.0 Manioc Chine, continentale 29046.0 Maïs Japon 14403.0 Blé Égypte 10331.0 Maïs République de Corée 8755.0 Name: importations_(Mt), dtype: float64
groupby
pour grouper les importations par produits (importations obtenues par addition des importations de chaque pays de l'étape précédente)table_import_produit = table_import.groupby('produit').sum()['importations_(Mt)'].sort_values(ascending=False)
table_import_produit.head()
produit Blé 185377.0 Maïs 122691.0 Lait - Excl Beurre 116806.0 Soja 102082.0 Sucre Eq Brut 61615.0 Name: importations_(Mt), dtype: float64
table_produit
# On commence par déterminer les colonnes dont on a besoin
table_produit_temp = table[['pays', 'code_produit', 'produit', 'alim_pour_animaux_(Mt)', 'nourriture_(Mt)', 'autres_utilisations_(Mt)', 'dispo_interieure_(Mt)']]
table_produit_temp
pays | code_produit | produit | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | |
---|---|---|---|---|---|---|---|
0 | Arménie | 2731 | Viande de Bovins | NaN | 59.0 | 2.0 | 61.0 |
1 | Arménie | 2732 | Viande d'Ovins/Caprins | NaN | 9.0 | NaN | 9.0 |
2 | Arménie | 2733 | Viande de Suides | NaN | 29.0 | 2.0 | 31.0 |
3 | Arménie | 2734 | Viande de Volailles | NaN | 40.0 | NaN | 40.0 |
4 | Arménie | 2735 | Viande, Autre | NaN | 0.0 | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... |
15600 | Soudan | 2659 | Alcool, non Comestible | NaN | NaN | 0.0 | NaN |
15601 | Soudan | 2680 | Aliments pour enfants | NaN | 0.0 | NaN | NaN |
15602 | Soudan | 2745 | Miel | NaN | 1.0 | NaN | 1.0 |
15603 | Soudan | 2805 | Riz (Eq Blanchi) | NaN | 48.0 | NaN | 49.0 |
15604 | Soudan | 2899 | Miscellanees | NaN | NaN | NaN | NaN |
15605 rows × 7 columns
# Puis on ajoute une colonne 'nourriture totale' notée 'nour_totale_(Mt)'
table_t = table_produit_temp.copy()
table_t['nour_totale_(Mt)'] = table_produit_temp['alim_pour_animaux_(Mt)'] + table_produit_temp['nourriture_(Mt)']
table_produit_temp = table_t.copy()
table_produit_temp
pays | code_produit | produit | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | nour_totale_(Mt) | |
---|---|---|---|---|---|---|---|---|
0 | Arménie | 2731 | Viande de Bovins | NaN | 59.0 | 2.0 | 61.0 | NaN |
1 | Arménie | 2732 | Viande d'Ovins/Caprins | NaN | 9.0 | NaN | 9.0 | NaN |
2 | Arménie | 2733 | Viande de Suides | NaN | 29.0 | 2.0 | 31.0 | NaN |
3 | Arménie | 2734 | Viande de Volailles | NaN | 40.0 | NaN | 40.0 | NaN |
4 | Arménie | 2735 | Viande, Autre | NaN | 0.0 | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... |
15600 | Soudan | 2659 | Alcool, non Comestible | NaN | NaN | 0.0 | NaN | NaN |
15601 | Soudan | 2680 | Aliments pour enfants | NaN | 0.0 | NaN | NaN | NaN |
15602 | Soudan | 2745 | Miel | NaN | 1.0 | NaN | 1.0 | NaN |
15603 | Soudan | 2805 | Riz (Eq Blanchi) | NaN | 48.0 | NaN | 49.0 | NaN |
15604 | Soudan | 2899 | Miscellanees | NaN | NaN | NaN | NaN | NaN |
15605 rows × 8 columns
# On va ensuite limiter les produits aux seuls 15 produits les plus exportés par les pays avec sous-nutrition
table_produit_import = table_produit_temp[table_produit_temp['produit'].isin(list_export_15)]
table_produit_import.head(6)
pays | code_produit | produit | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | nour_totale_(Mt) | |
---|---|---|---|---|---|---|---|---|
12 | Arménie | 2763 | Poissons Pelagiques | 8.0 | 2.0 | 0.0 | 11.0 | 10.0 |
21 | Arménie | 2848 | Lait - Excl Beurre | 48.0 | 622.0 | NaN | 671.0 | 670.0 |
22 | Arménie | 2511 | Blé | 93.0 | 389.0 | 0.0 | 554.0 | 482.0 |
24 | Arménie | 2514 | Maïs | 96.0 | 0.0 | NaN | 102.0 | 96.0 |
31 | Arménie | 2532 | Manioc | 0.0 | NaN | NaN | NaN | NaN |
34 | Arménie | 2542 | Sucre Eq Brut | NaN | 98.0 | 0.0 | 93.0 | NaN |
# Enfin, on groupe par produit en effectuant la somme des quantités par pays
table_produit = table_produit_import.groupby('produit').sum()
pd.set_option('display.max_rows', table_produit.shape[0]+1)
table_produit
code_produit | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | nour_totale_(Mt) | |
---|---|---|---|---|---|---|
produit | ||||||
Bananes | 439320 | 871.0 | 85954.0 | 142.0 | 103992.0 | 6840.0 |
Blé | 436914 | 129668.0 | 457824.0 | 22424.0 | 679498.0 | 557241.0 |
Fruits, Autres | 456750 | 61.0 | 185475.0 | 128.0 | 205956.0 | 3927.0 |
Huile de Palme | 438090 | 0.0 | 15214.0 | 35191.0 | 50409.0 | 89.0 |
Lait - Excl Beurre | 495552 | 81973.0 | 629738.0 | 18768.0 | 748864.0 | 667942.0 |
Légumes, Autres | 453270 | 49366.0 | 762130.0 | 490.0 | 881716.0 | 643540.0 |
Manioc | 422844 | 87056.0 | 100637.0 | 35987.0 | 256664.0 | 174929.0 |
Maïs | 437436 | 546116.0 | 125184.0 | 189386.0 | 955799.0 | 665827.0 |
Oranges, Mandarines | 451703 | 11.0 | 86690.0 | 115.0 | 93728.0 | 199.0 |
Poissons Pelagiques | 477999 | 18817.0 | 21687.0 | 376.0 | 41024.0 | 40123.0 |
Pommes | 455358 | 663.0 | 70671.0 | 42.0 | 83685.0 | 4542.0 |
Riz (Eq Blanchi) | 488070 | 33594.0 | 377286.0 | 18464.0 | 475656.0 | 369508.0 |
Soja | 424130 | 17476.0 | 10648.0 | 638.0 | 267445.0 | 25930.0 |
Sucre Eq Brut | 442308 | 90.0 | 143648.0 | 13130.0 | 168864.0 | 19434.0 |
Tomates | 449973 | 1870.0 | 144080.0 | 77.0 | 159452.0 | 11360.0 |
On calcule les ratios demandés:
r_autres_ut_sur_disp_int
le ratio entre la quantité destinés aux "Autres utilisations" ('autres_utilisations_(Mt)'
) et la disponibilité intérieure ('dispo_interieure_(Mt)'
)r_nour_anim_sur_nour_totale
le ratio entre la quantité destinée à la nourriture animale ('alim_pour_animaux_(Mt)'
) et la quantité destinée à la nourriture animale et humaine (nour_totale_(Mt)
= 'alim_pour_animaux_(Mt)'
+ 'nourriture_(Mt)'
)On ajoute donc 2 colonnes au df table_produit
:
r_autres_ut_sur_disp_int
r_nour_anim_sur_nour_totale
# Ajout de 'r_autres_ut_sur_disp_int'
table_produit['r_autres_ut_sur_disp_int'] = table_produit['autres_utilisations_(Mt)'] / table_produit['dispo_interieure_(Mt)']
# Ajout de 'r_nour_anim_sur_nour_totale'
table_produit['r_nour_anim_sur_nour_totale'] = table_produit['alim_pour_animaux_(Mt)'] / table_produit['nour_totale_(Mt)']
table_produit
code_produit | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | nour_totale_(Mt) | r_autres_ut_sur_disp_int | r_nour_anim_sur_nour_totale | |
---|---|---|---|---|---|---|---|---|
produit | ||||||||
Bananes | 439320 | 871.0 | 85954.0 | 142.0 | 103992.0 | 6840.0 | 0.001365 | 0.127339 |
Blé | 436914 | 129668.0 | 457824.0 | 22424.0 | 679498.0 | 557241.0 | 0.033001 | 0.232696 |
Fruits, Autres | 456750 | 61.0 | 185475.0 | 128.0 | 205956.0 | 3927.0 | 0.000621 | 0.015533 |
Huile de Palme | 438090 | 0.0 | 15214.0 | 35191.0 | 50409.0 | 89.0 | 0.698109 | 0.000000 |
Lait - Excl Beurre | 495552 | 81973.0 | 629738.0 | 18768.0 | 748864.0 | 667942.0 | 0.025062 | 0.122725 |
Légumes, Autres | 453270 | 49366.0 | 762130.0 | 490.0 | 881716.0 | 643540.0 | 0.000556 | 0.076710 |
Manioc | 422844 | 87056.0 | 100637.0 | 35987.0 | 256664.0 | 174929.0 | 0.140211 | 0.497665 |
Maïs | 437436 | 546116.0 | 125184.0 | 189386.0 | 955799.0 | 665827.0 | 0.198144 | 0.820207 |
Oranges, Mandarines | 451703 | 11.0 | 86690.0 | 115.0 | 93728.0 | 199.0 | 0.001227 | 0.055276 |
Poissons Pelagiques | 477999 | 18817.0 | 21687.0 | 376.0 | 41024.0 | 40123.0 | 0.009165 | 0.468983 |
Pommes | 455358 | 663.0 | 70671.0 | 42.0 | 83685.0 | 4542.0 | 0.000502 | 0.145971 |
Riz (Eq Blanchi) | 488070 | 33594.0 | 377286.0 | 18464.0 | 475656.0 | 369508.0 | 0.038818 | 0.090915 |
Soja | 424130 | 17476.0 | 10648.0 | 638.0 | 267445.0 | 25930.0 | 0.002386 | 0.673968 |
Sucre Eq Brut | 442308 | 90.0 | 143648.0 | 13130.0 | 168864.0 | 19434.0 | 0.077755 | 0.004631 |
Tomates | 449973 | 1870.0 | 144080.0 | 77.0 | 159452.0 | 11360.0 | 0.000483 | 0.164613 |
table_produit.index
Index(['Bananes', 'Blé', 'Fruits, Autres', 'Huile de Palme', 'Lait - Excl Beurre', 'Légumes, Autres', 'Manioc', 'Maïs', 'Oranges, Mandarines', 'Poissons Pelagiques', 'Pommes', 'Riz (Eq Blanchi)', 'Soja', 'Sucre Eq Brut', 'Tomates'], dtype='object', name='produit')
# ratio entre la quantité destinés aux "Autres utilisations" et la disponibilité intérieure
r_autres_top3 = table_produit.sort_values('r_autres_ut_sur_disp_int', ascending=False).head(3)
r_autres_top3
code_produit | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | nour_totale_(Mt) | r_autres_ut_sur_disp_int | r_nour_anim_sur_nour_totale | |
---|---|---|---|---|---|---|---|---|
produit | ||||||||
Huile de Palme | 438090 | 0.0 | 15214.0 | 35191.0 | 50409.0 | 89.0 | 0.698109 | 0.000000 |
Maïs | 437436 | 546116.0 | 125184.0 | 189386.0 | 955799.0 | 665827.0 | 0.198144 | 0.820207 |
Manioc | 422844 | 87056.0 | 100637.0 | 35987.0 | 256664.0 | 174929.0 | 0.140211 | 0.497665 |
# ratio entre la quantité destinée à la nourriture animale et
# la quantité destinée à la nourriture animale et humaine
part_alim_anim_top3 = table_produit.sort_values('r_nour_anim_sur_nour_totale', ascending=False).head(3)
part_alim_anim_top3
code_produit | alim_pour_animaux_(Mt) | nourriture_(Mt) | autres_utilisations_(Mt) | dispo_interieure_(Mt) | nour_totale_(Mt) | r_autres_ut_sur_disp_int | r_nour_anim_sur_nour_totale | |
---|---|---|---|---|---|---|---|---|
produit | ||||||||
Maïs | 437436 | 546116.0 | 125184.0 | 189386.0 | 955799.0 | 665827.0 | 0.198144 | 0.820207 |
Soja | 424130 | 17476.0 | 10648.0 | 638.0 | 267445.0 | 25930.0 | 0.002386 | 0.673968 |
Manioc | 422844 | 87056.0 | 100637.0 | 35987.0 | 256664.0 | 174929.0 | 0.140211 | 0.497665 |
print('Valeur du ratio entre la quantité destinés aux "Autres utilisations" et la disponibilité intérieure la plus élevée pour les 3 produits suivants :')
for i in list(r_autres_top3.index):
x = round((r_autres_top3.loc[i, 'r_autres_ut_sur_disp_int'])*100, 2)
print(f' - {i} ({x}%)')
print()
print('Valeur du ratio entre la quantité destinée à la nourriture animale et la quantité destinée à la nourriture animale et humaine la plus élevée pour les 3 produits suivants :')
for i in list(part_alim_anim_top3.index):
x = round((part_alim_anim_top3.loc[i, 'r_nour_anim_sur_nour_totale'])*100, 2)
print(f' - {i} ({x}%)')
Valeur du ratio entre la quantité destinés aux "Autres utilisations" et la disponibilité intérieure la plus élevée pour les 3 produits suivants : - Huile de Palme (69.81%) - Maïs (19.81%) - Manioc (14.02%) Valeur du ratio entre la quantité destinée à la nourriture animale et la quantité destinée à la nourriture animale et humaine la plus élevée pour les 3 produits suivants : - Maïs (82.02%) - Soja (67.4%) - Manioc (49.77%)
Ainsi :
Si les USA baissent de 10% leur production de produits animaux, cela veut dire qu'une part moins importante de leurs produits 'cereales' sera utilisée pour l'alimentation des animaux :
==> Pour les produits 'cereales' des USA, la part de la disponibilité intérieure utilisée pour l'alimentation des animaux baisserait alors de 10%
Méthode :
['code_pays'] = 231
['is_cereal'] = True
['alim_pour_animaux_(Mt)'].sum()
resultat * 1000 * 0.1
usa_modif = table[(table['code_pays'] == 231) & (table['is_cereal'])]
usa_modif
code_pays | pays | pop_(M) | origine | annee | ... | r_energie_poids_kcal_kg | part_proteines_poids | dispo_interieure_kcal | dispo_interieure_proteines | nb_sous_alim_en_m | |
---|---|---|---|---|---|---|---|---|---|---|---|
14285 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 2718.295019 | 0.087811 | 9.256066e+13 | 2.990065e+09 | NaN |
14286 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 3650.581719 | 0.102216 | 1.776738e+13 | 4.974867e+08 | NaN |
14287 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 2743.761190 | 0.049805 | 8.033074e+14 | 1.458178e+10 | NaN |
14288 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 2685.485402 | 0.093992 | 9.318634e+11 | 3.261522e+07 | NaN |
14289 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 1754.587893 | 0.072954 | 4.907582e+12 | 2.040521e+08 | NaN |
14290 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | NaN | NaN | NaN | NaN | NaN |
14291 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 3464.958919 | 0.098999 | 1.511415e+13 | 4.318329e+08 | NaN |
14292 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 2920.465375 | 0.087614 | 7.914461e+11 | 2.374338e+07 | NaN |
14356 | 231 | États-Unis d'Amérique | 320051 | vegetale | 2013 | ... | 3817.948379 | 0.070526 | 1.190818e+13 | 2.199706e+08 | NaN |
9 rows × 30 columns
nb_t_lib = int(usa_modif['alim_pour_animaux_(Mt)'].sum() * 1000 * 0.1)
print(f'Si les USA diminuaient leur production de produits animaux de 10%, on pourrait libérer {nb_t_lib} tonnes de céréales')
Si les USA diminuaient leur production de produits animaux de 10%, on pourrait libérer 14009600 tonnes de céréales
table
du produit 'Manioc' dans le pays 'Thaïlande'thai_manioc = table[(table['pays'] == 'Thaïlande') & (table['produit'] == 'Manioc')]
pd.set_option('display.max_columns', thai_manioc.shape[1]+1)
thai_manioc
code_pays | pays | pop_(M) | origine | annee | code_produit | produit | is_cereal | alim_pour_animaux_(Mt) | autres_utilisations_(Mt) | dispo_alim_(kcal-p-j) | dispo_alim_qte_(kg-p-an) | dispo_mat_grasse_(g-p-j) | dispo_proteines_qte_(g-p-j) | dispo_interieure_(Mt) | exportations_(Mt) | importations_(Mt) | nourriture_(Mt) | pertes_(Mt) | production_(Mt) | semences_(Mt) | traitement_(Mt) | var_stocks_(Mt) | dispo_alim_kcal | dispo_alim_kg_proteines | r_energie_poids_kcal_kg | part_proteines_poids | dispo_interieure_kcal | dispo_interieure_proteines | nb_sous_alim_en_m | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
13366 | 216 | Thaïlande | 67011 | vegetale | 2013 | 2532 | Manioc | False | 1800.0 | 2081.0 | 40.0 | 13.0 | 0.05 | 0.14 | 6264.0 | 25214.0 | 1250.0 | 871.0 | 1511.0 | 30228.0 | NaN | 0.0 | 0.0 | 9.783606e+11 | 3424262.1 | 1123.261309 | 0.003931 | 7.036109e+12 | 2.462638e+07 | 5.6 |
Remarque : on interpretera la 'proportion' comme le rapport entre les exportations et la production
Pas de problème d'unité car les 2 éléments sont exprimés en milliers de tonnes
part_manioc_exp_thai = int(thai_manioc['exportations_(Mt)']) / int(thai_manioc['production_(Mt)'])
part_manioc_exp_thai = round(part_manioc_exp_thai*100, 2)
print(f'En 2013, en Thaïlande, les exportations de Manioc représentent {part_manioc_exp_thai}% de sa production (en volume)')
En 2013, en Thaïlande, les exportations de Manioc représentent 83.41% de sa production (en volume)
nb_sous_alim_en_m
est en millions : * 1000pop_(M)
est en millierspart_ss_nut_thai = float(thai_manioc['nb_sous_alim_en_m'] * 1000) / float(thai_manioc['pop_(M)'])
part_ss_nut_thai = round(part_ss_nut_thai *100, 2)
print(f'En 2013 en Thaïlande, {part_ss_nut_thai}% de la population souffre de sous-nutrition')
En 2013 en Thaïlande, 8.36% de la population souffre de sous-nutrition
pop_m.to_csv("data/data_part1_questions/pop_m.csv", index = False, header = True)
table.to_csv("data/data_part1_questions/table.csv", index = False, header = True)
ss_alim.to_csv("data/data_part1_questions/ss_alim.csv", index = False, header = True)
usa_modif.to_csv("data/data_part1_questions/usa_modif.csv", index = False, header = True)