prev: Matplotlib | home

Pandas


https://pandas.pydata.org/

Pandas permet de travailler facilement avec certains types de données:

  • données tabulaires. ex : table SQL ou feuille Excel.

  • séries temporelles

  • et d’autres …

Les données peuvent être chargées depuis différentes sources (csv, excel, sql, …) et sont exposées principalement par deux structures de données : Series (1D) et DataFrame (2D).

Pandas apporte en particulier une réponse pour:

  • la gestion des dates

  • la gestion des données manquantes

note: les données utilisées sont issues de https://public.opendatasoft.com/explore/dataset/donnees-synop-essentielles-omm

[1]:
import pandas as pd
import matplotlib
[2]:
df = pd.read_csv("donnees-synop-essentielles-omm.csv", sep=';')
df.Date = pd.to_datetime(df.Date, utc=True)
df.head(5)
[2]:
ID OMM station Date Pression au niveau mer Variation de pression en 3 heures Type de tendance barométrique Direction du vent moyen 10 mn Vitesse du vent moyen 10 mn Température Point de rosée Humidité ... Type nuage 3 Hauteur de base 3 Nébulosité couche nuageuse 4 Type nuage 4 Hauteur de base 4 Coordonnees Nom Type de tendance barométrique.1 Temps passé 1.1 Temps présent.1
0 7240 2018-08-08 15:00:00+00:00 101380 -130.0 7.0 250.0 4.0 298.65 285.45 44 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 7.0 NaN 0
1 7240 2018-08-09 18:00:00+00:00 102000 200.0 2.0 250.0 2.9 289.45 286.75 84 ... NaN 2940.0 NaN NaN NaN 47.4445, 0.727333 TOURS 2.0 NaN 0
2 7240 2018-08-10 06:00:00+00:00 102500 120.0 3.0 250.0 2.3 285.85 284.25 90 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 3.0 NaN 0
3 7240 2018-08-15 15:00:00+00:00 102030 -150.0 8.0 320.0 2.1 298.05 285.95 47 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 8.0 NaN 0
4 7240 2018-08-18 03:00:00+00:00 102440 10.0 0.0 330.0 0.7 285.65 283.15 85 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 0.0 NaN 0

5 rows × 64 columns

[3]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 26071 entries, 0 to 26070
Data columns (total 64 columns):
 #   Column                                                     Non-Null Count  Dtype
---  ------                                                     --------------  -----
 0   ID OMM station                                             26071 non-null  int64
 1   Date                                                       26071 non-null  datetime64[ns, UTC]
 2   Pression au niveau mer                                     26071 non-null  int64
 3   Variation de pression en 3 heures                          26062 non-null  float64
 4   Type de tendance barométrique                              26062 non-null  float64
 5   Direction du vent moyen 10 mn                              26036 non-null  float64
 6   Vitesse du vent moyen 10 mn                                26037 non-null  float64
 7   Température                                                26071 non-null  float64
 8   Point de rosée                                             26071 non-null  float64
 9   Humidité                                                   26071 non-null  int64
 10  Visibilité horizontale                                     26069 non-null  float64
 11  Temps présent                                              25999 non-null  object
 12  Temps passé 1                                              7958 non-null   object
 13  Temps passé 2                                              7114 non-null   float64
 14  Nebulosité totale                                          19664 non-null  float64
 15  Nébulosité  des nuages de l' étage inférieur               18503 non-null  float64
 16  Hauteur de la base des nuages de l'étage inférieur         18511 non-null  float64
 17  Type des nuages de l'étage inférieur                       9864 non-null   float64
 18  Type des nuages de l'étage moyen                           8899 non-null   float64
 19  Type des nuages de l'étage supérieur                       8655 non-null   float64
 20  Pression station                                           26071 non-null  int64
 21  Niveau barométrique                                        0 non-null      float64
 22  Géopotentiel                                               0 non-null      float64
 23  Variation de pression en 24 heures                         11702 non-null  float64
 24  Température minimale sur 12 heures                         6514 non-null   float64
 25  Température minimale sur 24 heures                         0 non-null      float64
 26  Température maximale sur 12 heures                         6514 non-null   float64
 27  Température maximale sur 24 heures                         0 non-null      float64
 28  Température minimale du sol sur 12 heures                  13485 non-null  float64
 29  Méthode de mesure Température du thermomètre mouillé       0 non-null      float64
 30  Température du thermomètre mouillé                         0 non-null      float64
 31  Rafale sur les 10 dernières minutes                        11840 non-null  float64
 32  Rafales sur une période                                    26007 non-null  float64
 33  Periode de mesure de la rafale                             26051 non-null  float64
 34  Etat du sol                                                12572 non-null  float64
 35  Hauteur totale de la couche de neige, glace, autre au sol  15887 non-null  float64
 36  Hauteur de la neige fraîche                                10499 non-null  float64
 37  Periode de mesure de la neige fraiche                      9543 non-null   float64
 38  Précipitations dans la dernière heure                      26007 non-null  float64
 39  Précipitations dans les 3 dernières heures                 26013 non-null  float64
 40  Précipitations dans les 6 dernières heures                 15246 non-null  float64
 41  Précipitations dans les 12 dernières heures                15154 non-null  float64
 42  Précipitations dans les 24 dernières heures                13254 non-null  float64
 43  Phénomène spécial 1                                        14283 non-null  float64
 44  Phénomène spécial 2                                        14273 non-null  float64
 45  Phénomène spécial 3                                        8318 non-null   float64
 46  Phénomène spécial 4                                        61 non-null     float64
 47  Nébulosité couche nuageuse 1                               15269 non-null  float64
 48  Type nuage 1                                               9358 non-null   float64
 49  Hauteur de base 1                                          14635 non-null  float64
 50  Nébulosité couche nuageuse 2                               6281 non-null   float64
 51  Type nuage 2                                               3490 non-null   float64
 52  Hauteur de base 2                                          6138 non-null   float64
 53  Nébulosité couche nuageuse 3                               1622 non-null   float64
 54  Type nuage 3                                               516 non-null    float64
 55  Hauteur de base 3                                          1622 non-null   float64
 56  Nébulosité couche nuageuse 4                               2 non-null      float64
 57  Type nuage 4                                               203 non-null    float64
 58  Hauteur de base 4                                          2 non-null      float64
 59  Coordonnees                                                26071 non-null  object
 60  Nom                                                        26071 non-null  object
 61  Type de tendance barométrique.1                            26062 non-null  float64
 62  Temps passé 1.1                                            7958 non-null   object
 63  Temps présent.1                                            25999 non-null  object
dtypes: datetime64[ns, UTC](1), float64(53), int64(4), object(6)
memory usage: 12.7+ MB
[4]:
df.describe()
[4]:
ID OMM station Pression au niveau mer Variation de pression en 3 heures Type de tendance barométrique Direction du vent moyen 10 mn Vitesse du vent moyen 10 mn Température Point de rosée Humidité Visibilité horizontale ... Nébulosité couche nuageuse 2 Type nuage 2 Hauteur de base 2 Nébulosité couche nuageuse 3 Type nuage 3 Hauteur de base 3 Nébulosité couche nuageuse 4 Type nuage 4 Hauteur de base 4 Type de tendance barométrique.1
count 26071.0 26071.000000 26062.000000 26062.000000 26036.000000 26037.000000 26071.000000 26071.000000 26071.000000 26069.000000 ... 6281.000000 3490.000000 6138.000000 1622.000000 516.000000 1622.000000 2.0 203.000000 2.000000 26062.000000
mean 7240.0 101727.889226 0.034533 4.338654 183.604624 3.326124 285.248964 280.782876 76.787657 26243.515670 ... 6.078013 4.205731 2605.171065 6.835388 4.695736 2666.134402 6.0 8.216749 4350.000000 4.338654
std 0.0 892.362431 121.018307 2.697870 105.004084 1.848995 7.135546 5.411169 17.055975 17644.988344 ... 1.695055 2.609169 2263.468510 1.210954 3.110655 2028.994254 0.0 0.821924 2333.452378 2.697870
min 7240.0 97010.000000 -940.000000 0.000000 0.000000 0.000000 261.850000 258.150000 17.000000 30.000000 ... 1.000000 0.000000 180.000000 1.000000 0.000000 360.000000 6.0 0.000000 2700.000000 0.000000
25% 7240.0 101230.000000 -70.000000 2.000000 80.000000 2.100000 280.150000 277.050000 66.000000 12000.000000 ... 5.000000 3.000000 990.000000 6.000000 3.000000 1230.000000 6.0 8.000000 3525.000000 2.000000
50% 7240.0 101770.000000 0.000000 4.000000 200.000000 3.100000 284.950000 281.150000 81.000000 24000.000000 ... 7.000000 6.000000 1680.000000 7.000000 6.000000 1800.000000 6.0 8.000000 4350.000000 4.000000
75% 7240.0 102300.000000 70.000000 7.000000 270.000000 4.500000 290.050000 284.850000 91.000000 35870.000000 ... 7.000000 6.000000 3480.000000 8.000000 8.000000 3300.000000 6.0 9.000000 5175.000000 7.000000
max 7240.0 104290.000000 1200.000000 8.000000 360.000000 17.500000 309.850000 294.450000 100.000000 75000.000000 ... 8.000000 9.000000 8000.000000 8.000000 9.000000 8000.000000 6.0 9.000000 6000.000000 8.000000

8 rows × 57 columns

[5]:
df.shape
[5]:
(26071, 64)
[6]:
df[50:53]
[6]:
ID OMM station Date Pression au niveau mer Variation de pression en 3 heures Type de tendance barométrique Direction du vent moyen 10 mn Vitesse du vent moyen 10 mn Température Point de rosée Humidité ... Type nuage 3 Hauteur de base 3 Nébulosité couche nuageuse 4 Type nuage 4 Hauteur de base 4 Coordonnees Nom Type de tendance barométrique.1 Temps passé 1.1 Temps présent.1
50 7240 2012-04-06 15:00:00+00:00 100910 -200.0 8.0 10.0 4.6 287.25 279.85 61 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 8.0 NaN 10
51 7240 2012-04-13 03:00:00+00:00 100610 -50.0 6.0 270.0 1.5 276.75 274.65 86 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 6.0 NaN 1
52 7240 2012-09-11 21:00:00+00:00 101950 170.0 1.0 320.0 2.6 287.65 282.05 69 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 1.0 Nuages couvrant plus de la moitié du ciel pend... 2

3 rows × 64 columns

[7]:
df.columns
[7]:
Index(['ID OMM station', 'Date', 'Pression au niveau mer',
       'Variation de pression en 3 heures', 'Type de tendance barométrique',
       'Direction du vent moyen 10 mn', 'Vitesse du vent moyen 10 mn',
       'Température', 'Point de rosée', 'Humidité', 'Visibilité horizontale',
       'Temps présent', 'Temps passé 1', 'Temps passé 2', 'Nebulosité totale',
       'Nébulosité  des nuages de l' étage inférieur',
       'Hauteur de la base des nuages de l'étage inférieur',
       'Type des nuages de l'étage inférieur',
       'Type des nuages de l'étage moyen',
       'Type des nuages de l'étage supérieur', 'Pression station',
       'Niveau barométrique', 'Géopotentiel',
       'Variation de pression en 24 heures',
       'Température minimale sur 12 heures',
       'Température minimale sur 24 heures',
       'Température maximale sur 12 heures',
       'Température maximale sur 24 heures',
       'Température minimale du sol sur 12 heures',
       'Méthode de mesure Température du thermomètre mouillé',
       'Température du thermomètre mouillé',
       'Rafale sur les 10 dernières minutes', 'Rafales sur une période',
       'Periode de mesure de la rafale', 'Etat du sol',
       'Hauteur totale de la couche de neige, glace, autre au sol',
       'Hauteur de la neige fraîche', 'Periode de mesure de la neige fraiche',
       'Précipitations dans la dernière heure',
       'Précipitations dans les 3 dernières heures',
       'Précipitations dans les 6 dernières heures',
       'Précipitations dans les 12 dernières heures',
       'Précipitations dans les 24 dernières heures', 'Phénomène spécial 1',
       'Phénomène spécial 2', 'Phénomène spécial 3', 'Phénomène spécial 4',
       'Nébulosité couche nuageuse 1', 'Type nuage 1', 'Hauteur de base 1',
       'Nébulosité couche nuageuse 2', 'Type nuage 2', 'Hauteur de base 2',
       'Nébulosité couche nuageuse 3', 'Type nuage 3', 'Hauteur de base 3',
       'Nébulosité couche nuageuse 4', 'Type nuage 4', 'Hauteur de base 4',
       'Coordonnees', 'Nom', 'Type de tendance barométrique.1',
       'Temps passé 1.1', 'Temps présent.1'],
      dtype='object')
[8]:
df["Date"]
[8]:
0       2018-08-08 15:00:00+00:00
1       2018-08-09 18:00:00+00:00
2       2018-08-10 06:00:00+00:00
3       2018-08-15 15:00:00+00:00
4       2018-08-18 03:00:00+00:00
                   ...
26066   2018-09-08 03:00:00+00:00
26067   2018-12-12 03:00:00+00:00
26068   2018-12-05 15:00:00+00:00
26069   2018-12-04 00:00:00+00:00
26070   2018-11-29 12:00:00+00:00
Name: Date, Length: 26071, dtype: datetime64[ns, UTC]
[9]:
df["Date"].max()
[9]:
Timestamp('2019-01-30 21:00:00+0000', tz='UTC')
[10]:
df["Date"].min()
[10]:
Timestamp('2010-01-01 00:00:00+0000', tz='UTC')
[11]:
df[["Date", "Température"]].head()
[11]:
Date Température
0 2018-08-08 15:00:00+00:00 298.65
1 2018-08-09 18:00:00+00:00 289.45
2 2018-08-10 06:00:00+00:00 285.85
3 2018-08-15 15:00:00+00:00 298.05
4 2018-08-18 03:00:00+00:00 285.65
[12]:
df["Température"].min()
[12]:
261.85
[13]:
df["Température"] == df["Température"].min()
[13]:
0        False
1        False
2        False
3        False
4        False
         ...
26066    False
26067    False
26068    False
26069    False
26070    False
Name: Température, Length: 26071, dtype: bool
[14]:
df[df["Température"] == df["Température"].min()]
[14]:
ID OMM station Date Pression au niveau mer Variation de pression en 3 heures Type de tendance barométrique Direction du vent moyen 10 mn Vitesse du vent moyen 10 mn Température Point de rosée Humidité ... Type nuage 3 Hauteur de base 3 Nébulosité couche nuageuse 4 Type nuage 4 Hauteur de base 4 Coordonnees Nom Type de tendance barométrique.1 Temps passé 1.1 Temps présent.1
21810 7240 2012-02-09 06:00:00+00:00 103740 10.0 2.0 310.0 1.0 261.85 260.55 89 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 2.0 NaN 10

1 rows × 64 columns

[15]:
df[df["Température"] == df["Température"].max()][["Date", "Température"]]
[15]:
Date Température
7993 2016-07-19 15:00:00+00:00 309.85
[16]:
df.plot(x="Date", y="Température")
[16]:
<Axes: xlabel='Date'>
../_images/scientific-python_pandas_19_1.png
[17]:
ax = df.plot(x="Date", y="Température", linestyle="", marker=".", legend=False)
ax.set_ylabel('Température')
[17]:
Text(0, 0.5, 'Température')
../_images/scientific-python_pandas_20_1.png
[18]:
ax = df.plot(x="Humidité", y="Température", linestyle="", marker=".", legend=False)
ax.set_ylabel('Température')
[18]:
Text(0, 0.5, 'Température')
../_images/scientific-python_pandas_21_1.png
[19]:
tdf = df.set_index("Date").sort_index()
[20]:
tdf.head()
[20]:
ID OMM station Pression au niveau mer Variation de pression en 3 heures Type de tendance barométrique Direction du vent moyen 10 mn Vitesse du vent moyen 10 mn Température Point de rosée Humidité Visibilité horizontale ... Type nuage 3 Hauteur de base 3 Nébulosité couche nuageuse 4 Type nuage 4 Hauteur de base 4 Coordonnees Nom Type de tendance barométrique.1 Temps passé 1.1 Temps présent.1
Date
2010-01-01 00:00:00+00:00 7240 99320 0.0 5.0 30.0 4.6 276.55 275.55 93 4000.0 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 5.0 Pluie 60
2010-01-01 03:00:00+00:00 7240 99400 70.0 3.0 20.0 4.6 274.95 273.95 93 2600.0 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 3.0 NaN 10
2010-01-01 06:00:00+00:00 7240 99610 210.0 3.0 360.0 5.1 274.05 272.55 90 7000.0 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 3.0 NaN 20
2010-01-01 09:00:00+00:00 7240 99950 330.0 3.0 360.0 4.6 273.65 271.75 87 6000.0 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 3.0 NaN 0
2010-01-01 12:00:00+00:00 7240 100250 300.0 2.0 330.0 5.7 273.65 270.95 82 10000.0 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 2.0 NaN 0

5 rows × 63 columns

[21]:
df.head()
[21]:
ID OMM station Date Pression au niveau mer Variation de pression en 3 heures Type de tendance barométrique Direction du vent moyen 10 mn Vitesse du vent moyen 10 mn Température Point de rosée Humidité ... Type nuage 3 Hauteur de base 3 Nébulosité couche nuageuse 4 Type nuage 4 Hauteur de base 4 Coordonnees Nom Type de tendance barométrique.1 Temps passé 1.1 Temps présent.1
0 7240 2018-08-08 15:00:00+00:00 101380 -130.0 7.0 250.0 4.0 298.65 285.45 44 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 7.0 NaN 0
1 7240 2018-08-09 18:00:00+00:00 102000 200.0 2.0 250.0 2.9 289.45 286.75 84 ... NaN 2940.0 NaN NaN NaN 47.4445, 0.727333 TOURS 2.0 NaN 0
2 7240 2018-08-10 06:00:00+00:00 102500 120.0 3.0 250.0 2.3 285.85 284.25 90 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 3.0 NaN 0
3 7240 2018-08-15 15:00:00+00:00 102030 -150.0 8.0 320.0 2.1 298.05 285.95 47 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 8.0 NaN 0
4 7240 2018-08-18 03:00:00+00:00 102440 10.0 0.0 330.0 0.7 285.65 283.15 85 ... NaN NaN NaN NaN NaN 47.4445, 0.727333 TOURS 0.0 NaN 0

5 rows × 64 columns

[22]:
tdf.plot(y=["Température", "Humidité"])
[22]:
<Axes: xlabel='Date'>
../_images/scientific-python_pandas_25_1.png
[23]:
import matplotlib.pyplot as plt

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

tdf.plot(y="Température", ax=ax1, legend=False, linestyle="", marker=".", color="r")
tdf.plot(y="Humidité", ax=ax2, legend=False, linestyle="", marker=".", color="b")

[23]:
<Axes: xlabel='Date'>
../_images/scientific-python_pandas_26_1.png
[24]:
import matplotlib.pyplot as plt

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

tdf['2010':'2011'].plot(y="Température", ax=ax1, legend=False, linestyle="", marker=".", color="r")
tdf['2010':'2011'].plot(y="Humidité", ax=ax2, legend=False, linestyle="", marker=".", color="b")
[24]:
<Axes: xlabel='Date'>
../_images/scientific-python_pandas_27_1.png
[25]:
import matplotlib.pyplot as plt

fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

rtdf = tdf[["Température", "Humidité"]].rolling("30d").median()

rtdf.plot(y="Température", ax=ax1, legend=False, color="r")
rtdf.plot(y="Humidité", ax=ax2, legend=False, color="b")

[25]:
<Axes: xlabel='Date'>
../_images/scientific-python_pandas_28_1.png