Installation Python, Pip et Jupyter¶
Python et pip (package installer for python) :¶
Vérifier que python et pip sont installés¶
Installer python¶
Mettre à jour python¶
Mettre à jour pip¶
Jupyter :¶
Installer jupyter¶
Démarrer jupyter¶
Ecrire dans un fichier notebook¶
Colorer les titres de Jupyter¶
Chargement, analyse et statistiques d'un fichier CSV¶
Chargement¶
In [193]:
import pandas as pd # il faut charger la bibliothèque pandas
# on charge un fichier csv par exemple pour produire un df : un dataframe
# un df, c'est la table de base de travail en pandas, l'équivalent d'une table de BD SQL
df = pd.read_csv("villes_virgule.csv")
Premières analyses du df¶
Afficher tout : select * from villes - df seul¶
In [194]:
# df tout seul affiche les 5 premières et 5 dernières lignes : pas besoin de print
# équivalent à SELECT * from villes
df
Out[194]:
dep | nom | cp | nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | Ozan | 1190 | 618 | 469 | 500 | 93 | 6.60 | 4.91667 | 46.38330 | 170.0 | 205.0 |
1 | 1 | Cormoranche-sur-Saône | 1290 | 1058 | 903 | 1000 | 107 | 9.85 | 4.83333 | 46.23330 | 168.0 | 211.0 |
2 | 1 | Plagne | 1130 | 129 | 83 | 100 | 20 | 6.20 | 5.73333 | 46.18330 | 560.0 | 922.0 |
3 | 1 | Tossiat | 1250 | 1406 | 1111 | 1400 | 138 | 10.17 | 5.31667 | 46.13330 | 244.0 | 501.0 |
4 | 1 | Pouillat | 1250 | 88 | 58 | 100 | 14 | 6.23 | 5.43333 | 46.33330 | 333.0 | 770.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
36695 | 976 | Sada | 97640 | 10195 | 10195 | 10195 | 933 | 10.92 | 45.10470 | -12.84860 | NaN | NaN |
36696 | 976 | Tsingoni | 97680 | 10454 | 10454 | 10454 | 300 | 34.76 | 45.10700 | -12.78970 | NaN | NaN |
36697 | 971 | Saint-Barthélemy | 97133 | 8938 | 8938 | 8938 | 372 | 24.00 | -62.83330 | 17.91670 | NaN | NaN |
36698 | 971 | Saint-Martin | 97150 | 36979 | 36979 | 36979 | 695 | 53.20 | 18.09130 | -63.08290 | NaN | NaN |
36699 | 975 | Saint-Pierre-et-Miquelon | 97500 | 6080 | 6080 | 6080 | 25 | 242.00 | 46.71070 | 1.71819 | NaN | NaN |
36700 rows × 12 columns
select * from villes - df.loc[:,:]¶
In [195]:
# [:,:] veut dire : [ slice de toutes les lignes , slice de toutes les colonnes]
df.loc[:,:]
Out[195]:
dep | nom | cp | nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | Ozan | 1190 | 618 | 469 | 500 | 93 | 6.60 | 4.91667 | 46.38330 | 170.0 | 205.0 |
1 | 1 | Cormoranche-sur-Saône | 1290 | 1058 | 903 | 1000 | 107 | 9.85 | 4.83333 | 46.23330 | 168.0 | 211.0 |
2 | 1 | Plagne | 1130 | 129 | 83 | 100 | 20 | 6.20 | 5.73333 | 46.18330 | 560.0 | 922.0 |
3 | 1 | Tossiat | 1250 | 1406 | 1111 | 1400 | 138 | 10.17 | 5.31667 | 46.13330 | 244.0 | 501.0 |
4 | 1 | Pouillat | 1250 | 88 | 58 | 100 | 14 | 6.23 | 5.43333 | 46.33330 | 333.0 | 770.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
36695 | 976 | Sada | 97640 | 10195 | 10195 | 10195 | 933 | 10.92 | 45.10470 | -12.84860 | NaN | NaN |
36696 | 976 | Tsingoni | 97680 | 10454 | 10454 | 10454 | 300 | 34.76 | 45.10700 | -12.78970 | NaN | NaN |
36697 | 971 | Saint-Barthélemy | 97133 | 8938 | 8938 | 8938 | 372 | 24.00 | -62.83330 | 17.91670 | NaN | NaN |
36698 | 971 | Saint-Martin | 97150 | 36979 | 36979 | 36979 | 695 | 53.20 | 18.09130 | -63.08290 | NaN | NaN |
36699 | 975 | Saint-Pierre-et-Miquelon | 97500 | 6080 | 6080 | 6080 | 25 | 242.00 | 46.71070 | 1.71819 | NaN | NaN |
36700 rows × 12 columns
nombre de lignes et de colonnes du df¶
In [196]:
df.shape # affiche le nombre de lignes et de colonnes du df
Out[196]:
(36700, 12)
In [197]:
df.shape[1] # affiche le nombbre de colonnes du df
Out[197]:
12
In [198]:
# ou bien, plus classique :
print("nombre de colonnes :", df.shape[1])
nombre de colonnes : 12
3 premières lignes : select * from villes limit 3 - select * from ville limit¶
In [199]:
df.head(3) # les 3 premières lignes
Out[199]:
dep | nom | cp | nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | Ozan | 1190 | 618 | 469 | 500 | 93 | 6.60 | 4.91667 | 46.3833 | 170.0 | 205.0 |
1 | 1 | Cormoranche-sur-Saône | 1290 | 1058 | 903 | 1000 | 107 | 9.85 | 4.83333 | 46.2333 | 168.0 | 211.0 |
2 | 1 | Plagne | 1130 | 129 | 83 | 100 | 20 | 6.20 | 5.73333 | 46.1833 | 560.0 | 922.0 |
3 dernières lignes¶
In [200]:
df.tail(3) # les 3 dernières lignes
Out[200]:
dep | nom | cp | nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
36697 | 971 | Saint-Barthélemy | 97133 | 8938 | 8938 | 8938 | 372 | 24.0 | -62.8333 | 17.91670 | NaN | NaN |
36698 | 971 | Saint-Martin | 97150 | 36979 | 36979 | 36979 | 695 | 53.2 | 18.0913 | -63.08290 | NaN | NaN |
36699 | 975 | Saint-Pierre-et-Miquelon | 97500 | 6080 | 6080 | 6080 | 25 | 242.0 | 46.7107 | 1.71819 | NaN | NaN |
Premières statisques du df¶
describe()¶
In [201]:
# synthèse statistique générale par attribut numérique
df.describe()
Out[201]:
nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | |
---|---|---|---|---|---|---|---|---|---|
count | 3.670000e+04 | 3.670000e+04 | 3.670000e+04 | 36700.000000 | 36700.000000 | 36700.000000 | 36700.000000 | 36568.000000 | 36568.000000 |
mean | 1.768011e+03 | 1.644065e+03 | 1.751080e+03 | 154.996049 | 17.257375 | 2.786424 | 46.691117 | 193.157569 | 391.109166 |
std | 1.475622e+04 | 1.397527e+04 | 1.460775e+04 | 704.510109 | 143.746399 | 2.966138 | 5.751918 | 194.694120 | 449.305955 |
min | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000 | 0.040000 | -62.833300 | -63.082900 | -5.000000 | 2.000000 |
25% | 1.940000e+02 | 1.760000e+02 | 2.000000e+02 | 18.000000 | 6.400000 | 0.700000 | 45.150000 | 62.000000 | 140.000000 |
50% | 4.300000e+02 | 3.810000e+02 | 4.000000e+02 | 39.000000 | 10.755000 | 2.650000 | 47.383300 | 138.000000 | 236.000000 |
75% | 1.061000e+03 | 9.370000e+02 | 1.000000e+03 | 91.000000 | 18.370000 | 4.883330 | 48.833300 | 253.000000 | 435.000000 |
max | 2.243833e+06 | 2.125851e+06 | 2.211000e+06 | 26660.000000 | 18360.000000 | 49.443600 | 55.697200 | 1785.000000 | 4807.000000 |
info()¶
In [202]:
# pour avoir le type des attribut et le nombre de non null
# à noter l'attribut : Non-Null Count avec les valeurs : 36568 non-null
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 36700 entries, 0 to 36699 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 dep 36699 non-null object 1 nom 36700 non-null object 2 cp 36700 non-null object 3 nb_hab_2010 36700 non-null int64 4 nb_hab_1999 36700 non-null int64 5 nb_hab_2012 36700 non-null int64 6 dens 36700 non-null int64 7 surf 36700 non-null float64 8 long 36700 non-null float64 9 lat 36700 non-null float64 10 alt_min 36568 non-null float64 11 alt_max 36568 non-null float64 dtypes: float64(5), int64(4), object(3) memory usage: 3.4+ MB
isnull().sum() : compter le nombre de valeurs null de chaque attribut¶
In [203]:
# compter le nombre de valeurs null de chaque attribut
df.isnull().sum()
Out[203]:
dep 1 nom 0 cp 0 nb_hab_2010 0 nb_hab_1999 0 nb_hab_2012 0 dens 0 surf 0 long 0 lat 0 alt_min 132 alt_max 132 dtype: int64
unique() : nombre de valeurs différentes pour chaque attribut¶
In [204]:
# avoir le cardinal du domaine réel de chaque attribut ( = nombre de valeurs différentes)
df.nunique()
Out[204]:
dep 102 nom 34034 cp 6082 nb_hab_2010 5666 nb_hab_1999 5391 nb_hab_2012 607 dens 1663 surf 5190 long 4125 lat 3791 alt_min 1143 alt_max 2153 dtype: int64
Nettoyage des données¶
suppression des lignes avec des valeurs null¶
In [205]:
# dropna() supprime toute les lignes qui contiennent des valeurs non renseignées.
# pour faire des statistiques, c'est mieux !
df = df.dropna()
Vérification du dropna : df.info() et df.describe()¶
In [206]:
df.info()
<class 'pandas.core.frame.DataFrame'> Index: 36567 entries, 1 to 36567 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 dep 36567 non-null object 1 nom 36567 non-null object 2 cp 36567 non-null object 3 nb_hab_2010 36567 non-null int64 4 nb_hab_1999 36567 non-null int64 5 nb_hab_2012 36567 non-null int64 6 dens 36567 non-null int64 7 surf 36567 non-null float64 8 long 36567 non-null float64 9 lat 36567 non-null float64 10 alt_min 36567 non-null float64 11 alt_max 36567 non-null float64 dtypes: float64(5), int64(4), object(3) memory usage: 3.6+ MB
In [207]:
df.describe()
Out[207]:
nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | |
---|---|---|---|---|---|---|---|---|---|
count | 3.656700e+04 | 3.656700e+04 | 3.656700e+04 | 36567.000000 | 36567.000000 | 36567.000000 | 36567.000000 | 36567.000000 | 36567.000000 |
mean | 1.716658e+03 | 1.598204e+03 | 1.699669e+03 | 153.985780 | 14.875004 | 2.752669 | 46.976012 | 193.158203 | 391.114256 |
std | 1.470363e+04 | 1.393169e+04 | 1.455402e+04 | 703.678614 | 14.948032 | 2.641770 | 2.209327 | 194.696744 | 449.311045 |
min | 0.000000e+00 | 0.000000e+00 | 0.000000e+00 | 0.000000 | 0.040000 | -5.095550 | 41.388100 | -5.000000 | 2.000000 |
25% | 1.940000e+02 | 1.750000e+02 | 2.000000e+02 | 18.000000 | 6.390000 | 0.700000 | 45.166700 | 62.000000 | 140.000000 |
50% | 4.270000e+02 | 3.790000e+02 | 4.000000e+02 | 39.000000 | 10.720000 | 2.633330 | 47.400000 | 138.000000 | 236.000000 |
75% | 1.050000e+03 | 9.255000e+02 | 1.000000e+03 | 90.000000 | 18.300000 | 4.866670 | 48.833300 | 253.000000 | 435.000000 |
max | 2.243833e+06 | 2.125851e+06 | 2.211000e+06 | 26660.000000 | 758.930000 | 9.529730 | 51.083300 | 1785.000000 | 4807.000000 |
SELECT * FROM df -> .loc[]¶
In [208]:
# df est un tableau à 2 dimensions: lignes et colonnes
# il vaut mieux utiliser .loc
# toutes les lignes : slice ":" ou 10:20
# toutes les colonnes : slice ":" ou une liste ["col1", "col2] ]
# df.loc[:,:] = SELECT * FROM df
# df.loc[10:20,:] = SELECT * FROM df LIMIT 10, 20
# df.loc[:,["nb_hab_2012"]] = SELECT nb_hab_2012 FROM DF
df.loc[:,:]
Out[208]:
dep | nom | cp | nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | Cormoranche-sur-Saône | 1290 | 1058 | 903 | 1000 | 107 | 9.85 | 4.83333 | 46.2333 | 168.0 | 211.0 |
2 | 1 | Plagne | 1130 | 129 | 83 | 100 | 20 | 6.20 | 5.73333 | 46.1833 | 560.0 | 922.0 |
3 | 1 | Tossiat | 1250 | 1406 | 1111 | 1400 | 138 | 10.17 | 5.31667 | 46.1333 | 244.0 | 501.0 |
4 | 1 | Pouillat | 1250 | 88 | 58 | 100 | 14 | 6.23 | 5.43333 | 46.3333 | 333.0 | 770.0 |
5 | 1 | Torcieu | 1230 | 698 | 643 | 700 | 65 | 10.72 | 5.40000 | 45.9167 | 257.0 | 782.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
36563 | 2B | Piazzole | 20229 | 47 | 43 | 0 | 12 | 3.86 | 9.40195 | 42.3934 | 277.0 | 1185.0 |
36564 | 2B | San-Gavino-d'Ampugnani | 20213 | 85 | 79 | 100 | 26 | 3.22 | 9.42251 | 42.4123 | 138.0 | 600.0 |
36565 | 2B | Verdèse | 20229 | 38 | 18 | 0 | 37 | 1.02 | 9.36473 | 42.3917 | 318.0 | 653.0 |
36566 | 2B | Polveroso | 20229 | 40 | 22 | 0 | 20 | 1.96 | 9.36501 | 42.4009 | 315.0 | 1048.0 |
36567 | 2B | Scata | 20213 | 44 | 44 | 0 | 15 | 2.80 | 9.40140 | 42.4164 | 160.0 | 640.0 |
36567 rows × 12 columns
Projection SQL (choix des colonnes)¶
choix de colonnes¶
In [209]:
# df est un tableau à 2 dimensions: lignes et colonnes
# il vaut mieux utiliser .loc
# toutes les lignes : slice ":" ou 10:20
# toutes les colonnes : slice ":" ou une liste ["col1", "col2] ]
# df.loc[:;] = SELECT * FROM df
# df.loc[10:20,:] = SELECT * FROM df LIMIT 10, 20
# df.loc[:,["nb_hab_2012"]] = SELECT nb_hab_2012 FROM DF
df.loc[:,['nom', 'nb_hab_2012']]
Out[209]:
nom | nb_hab_2012 | |
---|---|---|
1 | Cormoranche-sur-Saône | 1000 |
2 | Plagne | 100 |
3 | Tossiat | 1400 |
4 | Pouillat | 100 |
5 | Torcieu | 700 |
... | ... | ... |
36563 | Piazzole | 0 |
36564 | San-Gavino-d'Ampugnani | 100 |
36565 | Verdèse | 0 |
36566 | Polveroso | 0 |
36567 | Scata | 0 |
36567 rows × 2 columns
création d'une colonne¶
In [210]:
df.loc[:,['diff_2012_2010']] = df['nb_hab_2012'] - df['nb_hab_2010']
df.loc[:,]
Out[210]:
dep | nom | cp | nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | dens | surf | long | lat | alt_min | alt_max | diff_2012_2010 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | Cormoranche-sur-Saône | 1290 | 1058 | 903 | 1000 | 107 | 9.85 | 4.83333 | 46.2333 | 168.0 | 211.0 | -58 |
2 | 1 | Plagne | 1130 | 129 | 83 | 100 | 20 | 6.20 | 5.73333 | 46.1833 | 560.0 | 922.0 | -29 |
3 | 1 | Tossiat | 1250 | 1406 | 1111 | 1400 | 138 | 10.17 | 5.31667 | 46.1333 | 244.0 | 501.0 | -6 |
4 | 1 | Pouillat | 1250 | 88 | 58 | 100 | 14 | 6.23 | 5.43333 | 46.3333 | 333.0 | 770.0 | 12 |
5 | 1 | Torcieu | 1230 | 698 | 643 | 700 | 65 | 10.72 | 5.40000 | 45.9167 | 257.0 | 782.0 | 2 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
36563 | 2B | Piazzole | 20229 | 47 | 43 | 0 | 12 | 3.86 | 9.40195 | 42.3934 | 277.0 | 1185.0 | -47 |
36564 | 2B | San-Gavino-d'Ampugnani | 20213 | 85 | 79 | 100 | 26 | 3.22 | 9.42251 | 42.4123 | 138.0 | 600.0 | 15 |
36565 | 2B | Verdèse | 20229 | 38 | 18 | 0 | 37 | 1.02 | 9.36473 | 42.3917 | 318.0 | 653.0 | -38 |
36566 | 2B | Polveroso | 20229 | 40 | 22 | 0 | 20 | 1.96 | 9.36501 | 42.4009 | 315.0 | 1048.0 | -40 |
36567 | 2B | Scata | 20213 | 44 | 44 | 0 | 15 | 2.80 | 9.40140 | 42.4164 | 160.0 | 640.0 | -44 |
36567 rows × 13 columns
renommage des colonnes¶
In [211]:
df=df.rename(columns={
'dep': 'code_departement',
'nom': 'nom_ville',
'cp': 'code_postal',
'dens': 'densite',
'surf': 'surface',
'long': 'longitude',
'lat': 'latitude',
'alt_min': 'altitude_min',
'alt_max': 'altitude_max',
})
df
Out[211]:
code_departement | nom_ville | code_postal | nb_hab_2010 | nb_hab_1999 | nb_hab_2012 | densite | surface | longitude | latitude | altitude_min | altitude_max | diff_2012_2010 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 1 | Cormoranche-sur-Saône | 1290 | 1058 | 903 | 1000 | 107 | 9.85 | 4.83333 | 46.2333 | 168.0 | 211.0 | -58 |
2 | 1 | Plagne | 1130 | 129 | 83 | 100 | 20 | 6.20 | 5.73333 | 46.1833 | 560.0 | 922.0 | -29 |
3 | 1 | Tossiat | 1250 | 1406 | 1111 | 1400 | 138 | 10.17 | 5.31667 | 46.1333 | 244.0 | 501.0 | -6 |
4 | 1 | Pouillat | 1250 | 88 | 58 | 100 | 14 | 6.23 | 5.43333 | 46.3333 | 333.0 | 770.0 | 12 |
5 | 1 | Torcieu | 1230 | 698 | 643 | 700 | 65 | 10.72 | 5.40000 | 45.9167 | 257.0 | 782.0 | 2 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
36563 | 2B | Piazzole | 20229 | 47 | 43 | 0 | 12 | 3.86 | 9.40195 | 42.3934 | 277.0 | 1185.0 | -47 |
36564 | 2B | San-Gavino-d'Ampugnani | 20213 | 85 | 79 | 100 | 26 | 3.22 | 9.42251 | 42.4123 | 138.0 | 600.0 | 15 |
36565 | 2B | Verdèse | 20229 | 38 | 18 | 0 | 37 | 1.02 | 9.36473 | 42.3917 | 318.0 | 653.0 | -38 |
36566 | 2B | Polveroso | 20229 | 40 | 22 | 0 | 20 | 1.96 | 9.36501 | 42.4009 | 315.0 | 1048.0 | -40 |
36567 | 2B | Scata | 20213 | 44 | 44 | 0 | 15 | 2.80 | 9.40140 | 42.4164 | 160.0 | 640.0 | -44 |
36567 rows × 13 columns
reorganisation des attributs¶
In [212]:
df = df[[
'nom_ville',
'code_departement',
'code_postal',
'nb_hab_1999',
'nb_hab_2010',
'nb_hab_2012',
'densite',
'surface',
'longitude',
'latitude',
'altitude_min',
'altitude_max'
]]
df
Out[212]:
nom_ville | code_departement | code_postal | nb_hab_1999 | nb_hab_2010 | nb_hab_2012 | densite | surface | longitude | latitude | altitude_min | altitude_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Cormoranche-sur-Saône | 1 | 1290 | 903 | 1058 | 1000 | 107 | 9.85 | 4.83333 | 46.2333 | 168.0 | 211.0 |
2 | Plagne | 1 | 1130 | 83 | 129 | 100 | 20 | 6.20 | 5.73333 | 46.1833 | 560.0 | 922.0 |
3 | Tossiat | 1 | 1250 | 1111 | 1406 | 1400 | 138 | 10.17 | 5.31667 | 46.1333 | 244.0 | 501.0 |
4 | Pouillat | 1 | 1250 | 58 | 88 | 100 | 14 | 6.23 | 5.43333 | 46.3333 | 333.0 | 770.0 |
5 | Torcieu | 1 | 1230 | 643 | 698 | 700 | 65 | 10.72 | 5.40000 | 45.9167 | 257.0 | 782.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
36563 | Piazzole | 2B | 20229 | 43 | 47 | 0 | 12 | 3.86 | 9.40195 | 42.3934 | 277.0 | 1185.0 |
36564 | San-Gavino-d'Ampugnani | 2B | 20213 | 79 | 85 | 100 | 26 | 3.22 | 9.42251 | 42.4123 | 138.0 | 600.0 |
36565 | Verdèse | 2B | 20229 | 18 | 38 | 0 | 37 | 1.02 | 9.36473 | 42.3917 | 318.0 | 653.0 |
36566 | Polveroso | 2B | 20229 | 22 | 40 | 0 | 20 | 1.96 | 9.36501 | 42.4009 | 315.0 | 1048.0 |
36567 | Scata | 2B | 20213 | 44 | 44 | 0 | 15 | 2.80 | 9.40140 | 42.4164 | 160.0 | 640.0 |
36567 rows × 12 columns
bilan¶
In [213]:
df
Out[213]:
nom_ville | code_departement | code_postal | nb_hab_1999 | nb_hab_2010 | nb_hab_2012 | densite | surface | longitude | latitude | altitude_min | altitude_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | Cormoranche-sur-Saône | 1 | 1290 | 903 | 1058 | 1000 | 107 | 9.85 | 4.83333 | 46.2333 | 168.0 | 211.0 |
2 | Plagne | 1 | 1130 | 83 | 129 | 100 | 20 | 6.20 | 5.73333 | 46.1833 | 560.0 | 922.0 |
3 | Tossiat | 1 | 1250 | 1111 | 1406 | 1400 | 138 | 10.17 | 5.31667 | 46.1333 | 244.0 | 501.0 |
4 | Pouillat | 1 | 1250 | 58 | 88 | 100 | 14 | 6.23 | 5.43333 | 46.3333 | 333.0 | 770.0 |
5 | Torcieu | 1 | 1230 | 643 | 698 | 700 | 65 | 10.72 | 5.40000 | 45.9167 | 257.0 | 782.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
36563 | Piazzole | 2B | 20229 | 43 | 47 | 0 | 12 | 3.86 | 9.40195 | 42.3934 | 277.0 | 1185.0 |
36564 | San-Gavino-d'Ampugnani | 2B | 20213 | 79 | 85 | 100 | 26 | 3.22 | 9.42251 | 42.4123 | 138.0 | 600.0 |
36565 | Verdèse | 2B | 20229 | 18 | 38 | 0 | 37 | 1.02 | 9.36473 | 42.3917 | 318.0 | 653.0 |
36566 | Polveroso | 2B | 20229 | 22 | 40 | 0 | 20 | 1.96 | 9.36501 | 42.4009 | 315.0 | 1048.0 |
36567 | Scata | 2B | 20213 | 44 | 44 | 0 | 15 | 2.80 | 9.40140 | 42.4164 | 160.0 | 640.0 |
36567 rows × 12 columns
enregistrement des tuples dans un fichier (utile pour créer le fichier SQL)¶
In [214]:
with open('tuples_villes.txt', 'w') as f:
# Parcourir chaque ligne et enregistrer dans le fichier
for row in df.itertuples(index=False):
# Ajouter des guillemets autour des chaînes de caractères
row_with_quotes = ['"' + str(value) + '"' if isinstance(value, str) else str(value) for value in row]
# Afficher la ligne avec des guillemets autour des chaînes de caractères
f.write('(NULL, ' + ', '.join(row_with_quotes) + '), \n')
Selection SQL (choix des lignes)¶
SELECT * FROM df WHERE nom_ville = "Plagne"¶
In [215]:
# SELECT * FROM df WHERE nom_ville = "Plagne"
df.loc[df['nom_ville'] == "Plagne", :]
Out[215]:
nom_ville | code_departement | code_postal | nb_hab_1999 | nb_hab_2010 | nb_hab_2012 | densite | surface | longitude | latitude | altitude_min | altitude_max | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | Plagne | 1 | 1130 | 83 | 129 | 100 | 20 | 6.20 | 5.73333 | 46.1833 | 560.0 | 922.0 |
11948 | Plagne | 31 | 31220 | 88 | 89 | 100 | 21 | 4.15 | 1.05000 | 43.1500 | 316.0 | 590.0 |
SELECT nom_ville, code_postal FROM df WHERE nom_ville = "Plagne"¶
In [216]:
# SELECT nom_ville, code_postal FROM df WHERE nom_ville = "Plagne"
df.loc[df['nom_ville'] == "Plagne", ['nom_ville', 'code_postal']]
Out[216]:
nom_ville | code_postal | |
---|---|---|
2 | Plagne | 1130 |
11948 | Plagne | 31220 |
SELECT nom_ville, code_postal, code_departement FROM df WHERE nom_ville = "Plagne" AND code_departement != 1¶
In [217]:
# SELECT nom_ville, code_postal, code_departement FROM df WHERE nom_ville = "Plagne" AND code_departement != 1
# attention, le code_departement n'est pas un int mais un objet : on le traite comme une string
# attention à parenthéser chaque condition car le & est propritaire sur le ==
df.loc[(df['nom_ville'] == "Plagne") & (df['code_departement'] != "1"), ['nom_ville', 'code_postal', 'code_departement']]
Out[217]:
nom_ville | code_postal | code_departement | |
---|---|---|---|
11948 | Plagne | 31220 | 31 |
SELECT nom_ville, code_departement, diff_012_2010 FROM df LIMIT 10¶
In [218]:
df.loc[
0:10,
[
"nom_ville",
"code_departement",
"nb_hab_2012",
"nb_hab_2010"
]]
Out[218]:
nom_ville | code_departement | nb_hab_2012 | nb_hab_2010 | |
---|---|---|---|---|
1 | Cormoranche-sur-Saône | 1 | 1000 | 1058 |
2 | Plagne | 1 | 100 | 129 |
3 | Tossiat | 1 | 1400 | 1406 |
4 | Pouillat | 1 | 100 | 88 |
5 | Torcieu | 1 | 700 | 698 |
6 | Replonges | 1 | 3300 | 3500 |
7 | Corcelles | 1 | 200 | 243 |
8 | Péron | 1 | 1900 | 2143 |
9 | Relevant | 1 | 400 | 466 |
10 | Chaveyriat | 1 | 900 | 927 |
Tris¶
In [219]:
# 1. Tri par 'code_departement' en ordre croissant (par défaut)
df.sort_values(by='code_departement')
# 2. Tri par 'code_departement' en ordre décroissant
df.sort_values(by='code_departement', ascending=False)
# 3. Tri par 'code_departement' en ordre croissant et 'nb_hab_2012' en ordre croissant
df = df.sort_values(by=['code_departement', 'nb_hab_2012'], ascending=[False, True])
In [220]:
df.loc[df['altitude_min'] > 1000, ['nom_ville', 'code_departement', 'altitude_min']].sort_values(by='altitude_min')
Out[220]:
nom_ville | code_departement | altitude_min | |
---|---|---|---|
30037 | La Giettaz | 73 | 1002.0 |
14347 | Autrans | 38 | 1005.0 |
9108 | Chapelle-des-Bois | 25 | 1006.0 |
17995 | La Chaze-de-Peyre | 48 | 1010.0 |
18012 | Laubies | 48 | 1010.0 |
... | ... | ... | ... |
1847 | Molines-en-Queyras | 5 | 1625.0 |
29970 | Bessans | 73 | 1673.0 |
1798 | Saint-Véran | 5 | 1756.0 |
30127 | Bonneval-sur-Arc | 73 | 1759.0 |
30114 | Val-d'Isère | 73 | 1785.0 |
235 rows × 3 columns
Fonctions de groupe : min, max, sum, count¶
In [221]:
total_nb_hab_2012 = df['nb_hab_2010'].sum()
total_nb_hab_2012
Out[221]:
np.int64(62773051)
Regroupements¶
GROUP BY basiques¶
Villes d'altidude_min > 1000 avec ['nom_ville', 'code_departement', 'altitude_min']¶
In [222]:
df_pour_gb = df.loc[df['altitude_min'] > 1000, ['nom_ville', 'code_departement', 'altitude_min']].sort_values(by='altitude_min')
df_pour_gb
Out[222]:
nom_ville | code_departement | altitude_min | |
---|---|---|---|
30037 | La Giettaz | 73 | 1002.0 |
14347 | Autrans | 38 | 1005.0 |
9108 | Chapelle-des-Bois | 25 | 1006.0 |
17995 | La Chaze-de-Peyre | 48 | 1010.0 |
18012 | Laubies | 48 | 1010.0 |
... | ... | ... | ... |
1847 | Molines-en-Queyras | 5 | 1625.0 |
29970 | Bessans | 73 | 1673.0 |
1798 | Saint-Véran | 5 | 1756.0 |
30127 | Bonneval-sur-Arc | 73 | 1759.0 |
30114 | Val-d'Isère | 73 | 1785.0 |
235 rows × 3 columns
Nombre de villes par département, et altitude moyenne des villes et altitude min des villes pour les villes d'altitude min > 1000 mètres, trié par département¶
In [223]:
# Conversion de 'code_departement' en entier avec astype(int)
df_pour_gb['code_departement'] = df_pour_gb['code_departement'].astype(int)
# le \ permet de passer à la ligne
resultats = df_pour_gb \
.groupby('code_departement') \
.agg(
nb_villes = ('nom_ville', 'count'), # Nombre de villes par département
altitude_moy = ('altitude_min', 'mean'), # Altitude moyenne par département
altitude_min = ('altitude_min', 'min') # Altitude minimale par département
) \
.sort_values(by='code_departement') # Tri par 'code_departement'
resultats
Out[223]:
nb_villes | altitude_moy | altitude_min | |
---|---|---|---|
code_departement | |||
4 | 20 | 1178.250000 | 1053.0 |
5 | 44 | 1226.613636 | 1014.0 |
6 | 6 | 1097.833333 | 1018.0 |
7 | 8 | 1091.875000 | 1056.0 |
9 | 5 | 1119.400000 | 1022.0 |
11 | 2 | 1101.500000 | 1069.0 |
15 | 8 | 1039.250000 | 1015.0 |
25 | 2 | 1012.000000 | 1006.0 |
26 | 1 | 1028.000000 | 1028.0 |
31 | 12 | 1152.416667 | 1021.0 |
38 | 8 | 1118.875000 | 1005.0 |
39 | 3 | 1085.333333 | 1042.0 |
43 | 11 | 1065.090909 | 1017.0 |
48 | 34 | 1092.676471 | 1010.0 |
63 | 1 | 1076.000000 | 1076.0 |
65 | 8 | 1108.375000 | 1038.0 |
66 | 38 | 1319.815789 | 1100.0 |
73 | 20 | 1278.500000 | 1002.0 |
74 | 4 | 1059.250000 | 1027.0 |
GROUP BY complexe¶
Présentation¶
Création de la nouvelle colonne 'categorie' en fonction de 'nb_hab_2012'¶
In [224]:
# Création de la nouvelle colonne 'categorie' en fonction de 'nb_hab_2012'
# Définir une fonction pour classer la population dans les catégories
def classer_ville_par_nb_hab(nb):
if nb < 1000: return 'inf_1_000'
elif nb < 10_000: return 'inf_10_000'
elif nb < 50_000: return 'inf_50_000'
elif nb < 100_000: return 'inf_100_000'
elif nb < 1_000_000: return 'inf_1_000_000'
else: return 'sup_1_000_000'
# Appliquer cette fonction à chaque valeur de 'nb_hab_2012' pour créer la nouvelle colonne 'categorie'
df['categorie'] = df['nb_hab_2012'].apply(classer_ville_par_nb_hab)
df
Out[224]:
nom_ville | code_departement | code_postal | nb_hab_1999 | nb_hab_2010 | nb_hab_2012 | densite | surface | longitude | latitude | altitude_min | altitude_max | categorie | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
36122 | Theuville | 95 | 95810 | 59 | 28 | 0 | 5 | 4.97 | 2.06667 | 49.1500 | 58.0 | 125.0 | inf_1_000 |
36128 | Charmont | 95 | 95420 | 32 | 28 | 0 | 7 | 3.83 | 1.78333 | 49.1333 | 78.0 | 153.0 | inf_1_000 |
36036 | Le Plessis-Luzarches | 95 | 95270 | 140 | 131 | 100 | 145 | 0.90 | 2.45000 | 49.1000 | 56.0 | 101.0 | inf_1_000 |
36055 | Épiais-lès-Louvres | 95 | 95380 | 60 | 88 | 100 | 25 | 3.42 | 2.55000 | 49.0333 | 90.0 | 121.0 | inf_1_000 |
36059 | Menouville | 95 | 95810 | 84 | 90 | 100 | 32 | 2.78 | 2.10000 | 49.1500 | 47.0 | 112.0 | inf_1_000 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
411 | Gex | 1 | 1170 | 7771 | 10372 | 9700 | 323 | 32.02 | 6.06667 | 46.3333 | 532.0 | 1614.0 | inf_10_000 |
374 | Bellegarde-sur-Valserine | 1 | 1200 | 10878 | 11790 | 11400 | 773 | 15.25 | 5.81667 | 46.1000 | 330.0 | 1542.0 | inf_50_000 |
201 | Ambérieu-en-Bugey | 1 | 1500 | 11432 | 13835 | 12800 | 562 | 24.60 | 5.35000 | 45.9500 | 237.0 | 753.0 | inf_50_000 |
275 | Oyonnax | 1 | 1100 | 24188 | 22650 | 23100 | 626 | 36.18 | 5.66667 | 46.2500 | 440.0 | 1082.0 | inf_50_000 |
375 | Bourg-en-Bresse | 1 | 1000 | 40628 | 40088 | 40200 | 1680 | 23.86 | 5.21667 | 46.2000 | 220.0 | 273.0 | inf_50_000 |
36567 rows × 13 columns
Création de la table avec la colonne 'categorie' en fonction de 'nb_hab_2012' pour les altitudes > 1000¶
In [225]:
# Création de la nouvelle colonne 'categorie' en fonction de 'nb_hab_2012'
# Définir une fonction du case when pour classer la population dans les catégories
def classer_ville_par_nb_hab(nb):
if nb < 1_000: return '1: inf_1_000'
elif nb < 10_000: return '2: inf_10_000'
elif nb < 50_000: return '3: inf_50_000'
elif nb < 100_000: return '4: inf_100_000'
elif nb < 1_000_000: return '5: inf_1_000_000'
else: return '6: sup_1_000_000'
# Appliquer cette fonction à chaque valeur de 'nb_hab_2012' pour créer la nouvelle colonne 'categorie'
df['categorie'] = df['nb_hab_2012'].apply(classer_ville_par_nb_hab)
# selection des villes d'altidude_min > 1000 avec ['nom_ville', 'code_departement', 'nb_hab_2012', 'categorie', 'altitude_min']
df_pour_gb = df.loc[
df['altitude_min'] > 1000,
['nom_ville', 'code_departement', 'nb_hab_2012', 'categorie', 'altitude_min']
].sort_values(by='altitude_min')
# Conversion de 'code_departement' en entier avec astype(int) pour pouvoir trier
df_pour_gb['code_departement'] = df_pour_gb['code_departement'].astype(int)
df_pour_gb
Out[225]:
nom_ville | code_departement | nb_hab_2012 | categorie | altitude_min | |
---|---|---|---|---|---|
30037 | La Giettaz | 73 | 400 | 1: inf_1_000 | 1002.0 |
14347 | Autrans | 38 | 1700 | 2: inf_10_000 | 1005.0 |
9108 | Chapelle-des-Bois | 25 | 300 | 1: inf_1_000 | 1006.0 |
17995 | La Chaze-de-Peyre | 48 | 200 | 1: inf_1_000 | 1010.0 |
18012 | Laubies | 48 | 200 | 1: inf_1_000 | 1010.0 |
... | ... | ... | ... | ... | ... |
1847 | Molines-en-Queyras | 5 | 300 | 1: inf_1_000 | 1625.0 |
29970 | Bessans | 73 | 300 | 1: inf_1_000 | 1673.0 |
1798 | Saint-Véran | 5 | 300 | 1: inf_1_000 | 1756.0 |
30127 | Bonneval-sur-Arc | 73 | 200 | 1: inf_1_000 | 1759.0 |
30114 | Val-d'Isère | 73 | 1600 | 2: inf_10_000 | 1785.0 |
235 rows × 5 columns
In [226]:
# On fait le group by sur la table précédente, avec le tri
# le \ permet de passer à la ligne
resultats = df_pour_gb \
.groupby(['categorie', 'code_departement']) \
.agg(
nb_villes = ('nom_ville', 'count'), # Nombre de villes par département
altitude_moy = ('altitude_min', 'mean'), # Altitude moyenne par département
altitude_min = ('altitude_min', 'min') # Altitude minimale par département
) \
.sort_values(by=['categorie', 'code_departement']) # Tri par 'code_departement'
resultats
Out[226]:
nb_villes | altitude_moy | altitude_min | ||
---|---|---|---|---|
categorie | code_departement | |||
1: inf_1_000 | 4 | 17 | 1186.823529 | 1053.0 |
5 | 40 | 1224.325000 | 1014.0 | |
6 | 6 | 1097.833333 | 1018.0 | |
7 | 8 | 1091.875000 | 1056.0 | |
9 | 5 | 1119.400000 | 1022.0 | |
11 | 2 | 1101.500000 | 1069.0 | |
15 | 8 | 1039.250000 | 1015.0 | |
25 | 2 | 1012.000000 | 1006.0 | |
26 | 1 | 1028.000000 | 1028.0 | |
31 | 12 | 1152.416667 | 1021.0 | |
38 | 6 | 1153.666667 | 1024.0 | |
39 | 2 | 1107.000000 | 1064.0 | |
43 | 11 | 1065.090909 | 1017.0 | |
48 | 34 | 1092.676471 | 1010.0 | |
63 | 1 | 1076.000000 | 1076.0 | |
65 | 8 | 1108.375000 | 1038.0 | |
66 | 34 | 1332.176471 | 1100.0 | |
73 | 17 | 1252.411765 | 1002.0 | |
74 | 1 | 1120.000000 | 1120.0 | |
2: inf_10_000 | 4 | 3 | 1129.666667 | 1079.0 |
5 | 3 | 1277.000000 | 1160.0 | |
38 | 2 | 1014.500000 | 1005.0 | |
39 | 1 | 1042.000000 | 1042.0 | |
66 | 4 | 1214.750000 | 1130.0 | |
73 | 3 | 1426.333333 | 1054.0 | |
74 | 3 | 1039.000000 | 1027.0 | |
3: inf_50_000 | 5 | 1 | 1167.000000 | 1167.0 |
having¶
In [227]:
# on part du df résultat de la requête suivante :
# transforme le résultat précédent en dataframe
resultats = resultats.reset_index()
# on fait un select basique
# le \ permet de passer à la ligne
resultats \
.loc[resultats['nb_villes']>6,:] \
.sort_values(by=['categorie', 'code_departement'])
Out[227]:
categorie | code_departement | nb_villes | altitude_moy | altitude_min | |
---|---|---|---|---|---|
0 | 1: inf_1_000 | 4 | 17 | 1186.823529 | 1053.0 |
1 | 1: inf_1_000 | 5 | 40 | 1224.325000 | 1014.0 |
3 | 1: inf_1_000 | 7 | 8 | 1091.875000 | 1056.0 |
6 | 1: inf_1_000 | 15 | 8 | 1039.250000 | 1015.0 |
9 | 1: inf_1_000 | 31 | 12 | 1152.416667 | 1021.0 |
12 | 1: inf_1_000 | 43 | 11 | 1065.090909 | 1017.0 |
13 | 1: inf_1_000 | 48 | 34 | 1092.676471 | 1010.0 |
15 | 1: inf_1_000 | 65 | 8 | 1108.375000 | 1038.0 |
16 | 1: inf_1_000 | 66 | 34 | 1332.176471 | 1100.0 |
17 | 1: inf_1_000 | 73 | 17 | 1252.411765 | 1002.0 |
In [ ]: