| Table des matières | Traitement de données >

Introduction

Objectifs

  • Se familiariser avec Python et les Jupyter Notebook
    • comprendre les exemples présentés tout au long du cours, en traitement de données, données spatiales, analyse statistique et fouille de données
  • Commencer avec quelques exemples
    • de jeux de donnees et leurs attributs
    • de notions d'algorithmes: structures de donnees et de contrôle

Références

Bonnes pratiques

Wilson G, Aruliah DA, Brown CT, Chue Hong NP, Davis M, Guy RT, et al. (2014) Best Practices for Scientific Computing. PLoS Biol 12(1): e1001745. https://doi.org/10.1371/journal.pbio.1001745

  • Write Programs for People, Not Computers
  • Let the Computer Do the Work
  • Make Incremental Changes
  • Don't Repeat Yourself (or Others)
  • Plan for Mistakes
  • Optimize Software Only after It Works Correctly
  • Document Design and Purpose, Not Mechanics
  • Collaborate

Principes

  • Automatiser, "soyez fainéant !": un ordinateur est idiot et idéal pour les taches répétitives: permet de traiter de larges ensembles de données
  • Réutiliser votre code
  • Devenir autonome: résoudre un autre problème, apprendre un autre langage
  • Apprendre à contrôler son ordinateur: au lieu de se limiter aux programmes pensés et écrits par d'autres
  • Comprendre ce qu'il est possible de programmer, et comment le faire: le but n'est pas d'apprendre Python, mais un langage de programmation moderne et puissant
  • Assurer la répétabilité et traçabilité de vos traitements de données pour faire du travail de bonne qualité

Méthode

  • Développement itératif: faire la chose la plus simple qui peut marcher ("do the simplest thing that could possibly work") et raffiner (re-factoriser)
  • Ne pas se répéter: éviter la duplication de code
  • Style de programmation
    • choisir un style d'écriture et s'y tenir
    • utiliser des noms explicites, éviter les commentaires: si les commentaires sont trop long, cela veut dire que le code est compliqué et pourrait être simplifié
  • Attention aux détails et patience
    • reconnaître les différences
    • il faut rester rationnel
    • l'ordinateur est idiot et suit vos instructions les unes après les autres: s'il y a un bug, c'est vous qui l'avez créé

Python

  • Avantages
    • Orienté-objet: ré-utilisation du code
    • Libre ("open source"): gratuit à utiliser et distribuer
    • Flexibilité
    • Largement utilisé et bonne documentation: automatiser VISSIM, Aimsun, QGIS et ArcGIS
    • Plus facile à lire et apprendre que d'autres langages: relire et reprendre votre code dans 6 mois est comme écrire pour être relu par un autre être humain
    • Multi-plateforme, langage "glue", "Bindings" pour de nombreux langages et bibliothèques
    • Bibliothèques scientifiques, visualisation, SIG: scipy, numpy, matplotlib, pandas, scikit-image, scikit-learn, shapely, geopandas
  • Faiblesses: vitesse (langage interprété), manque de certains outils de calcul numérique et statistique (matlab)
  • Description
    • Langage interprété et interpréteur
    • Version 3 vs 2
    • Code = fichier texte, extension .py
    • Les commentaires commencent par #
    • Scripts et modules (bibliothèques)
    • Large bibliothèque standard ("standard library", "batteries included") http://docs.python.org/library/

In [1]:
# esprit de Python
import this


The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Ligne de commande et interpréteur

  • Ne pas avoir peur d'écrire
  • L'interpréteur est une calculatrice
  • Simplifié par la complétion automatique et l'historique des commandes (+ facilités syntaxiques)
    • Ligne de commande avancée: IPython
  • Évaluer des expressions et des variables
    • help, ?

In [2]:
print("Hello World")
s = "Hello World"
print(s)
reponse = input('Bonjour, comment vous appelez-vous ? ')
print('Bonjour '+reponse)
#%run ./00-script1.py


Hello World
Hello World
Bonjour, comment vous appelez-vous ? Nicolas
Bonjour Nicolas

Jupyter Notebook

  • Environnement computationnel interactif web pour créer des carnets ("notebooks")
    • document JSON contenant une liste ordonnée de cellule d'entrée/sortie qui peuvent contenir du code, du texte, des formules mathématiques, des graphiques, etc.
  • Versions Python, R, Julia
  • Les notebooks peuvent être convertis dans plusieurs formats standards ouverts (HTML, diapositifs, LaTeX, PDF, ReStructuredText, Markdown, Python)
  • Processus de travail similaire à l'interpréteur
  • Outil de communication

Types de données de base

  • booléen (binaire)
  • numérique: entier, réel
  • chaîne de caractère
  • liste, tuple, ensembles
  • dictionnaire

In [3]:
type('Hello')


Out[3]:
str

In [4]:
type(4)


Out[4]:
int

In [5]:
type(4.5)


Out[5]:
float

In [6]:
type(True)


Out[6]:
bool

In [7]:
type([])


Out[7]:
list

In [8]:
type([2,3])


Out[8]:
list

In [9]:
type({})


Out[9]:
dict

In [10]:
type({1: 'sdfasd', 'g': [1,2]})


Out[10]:
dict

In [11]:
# enregistrement vide
class A:
    pass
a = A()
a.x = 10
a.y = -2.3
type(a)


Out[11]:
__main__.A

In [12]:
a = 2
a = 2.3
a = 'hello' # les variables n'ont pas de type
b = a + 3 # les valeurs ont un type


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-4f27c0a98914> in <module>
      2 a = 2.3
      3 a = 'hello' # les variables n'ont pas de type
----> 4 b = a + 3 # les valeurs ont un type

TypeError: must be str, not int

In [13]:
# conversions entre types
int('3')


Out[13]:
3

In [14]:
str(3)


Out[14]:
'3'

In [15]:
# opération
i=1
i == 1


Out[15]:
True

In [16]:
i+=1
i == 1


Out[16]:
False

In [17]:
i == 2


Out[17]:
True

Exercice

Écrire un programme qui demande une vitesse et calcule le temps et la distance nécessaire pour s'arrêter. Le temps de perception réaction est 1.5 s et la décélération du véhicule est -1 m/s2.


In [18]:
print('À quelle vitesse roule le véhicule (km/h) ?')
vitesse = None
temps = None
distance = None
print('Le temps de freinage est', temps, 'et la distance de freinage est', distance)


À quelle vitesse roule le véhicule (km/h) ?
Le temps de freinage est None et la distance de freinage est None

In [19]:
# listes
a = list(range(10))
print(a)
print(a[0]) # index commence à 0
print(a[-1])
print(a[-2])
a[2] = -10
# méthodes
print(a)
a.sort()
print(a)
a.append(-100)
print(a)
del a[0]
print(a)
a[3] = 'hello'
print(a)


[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0
9
8
[0, 1, -10, 3, 4, 5, 6, 7, 8, 9]
[-10, 0, 1, 3, 4, 5, 6, 7, 8, 9]
[-10, 0, 1, 3, 4, 5, 6, 7, 8, 9, -100]
[0, 1, 3, 4, 5, 6, 7, 8, 9, -100]
[0, 1, 3, 'hello', 5, 6, 7, 8, 9, -100]

In [20]:
# appartenance
1 in a


Out[20]:
True

In [21]:
0 in a


Out[21]:
True

In [22]:
# références
b = list(range(10))
c = b
c[3] = 'bug'
print(b)


[0, 1, 2, 'bug', 4, 5, 6, 7, 8, 9]

In [23]:
# "list comprehensions"
a = list(range(10))
doubles = [2*x for x in a]
print(doubles)
carres = [x*x for x in a]
print(carres)


[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Structures de contrôle

  • Séquences d’opérations
  • Conditionnelles: test si [condition] alors [opération1] (sinon [opération2])
  • Boucles:
    • tant que [condition] [opération]
    • itérateur (compteur) pour [ensemble] [opération]

In [24]:
# boucles
a = list(range(5))
for x in a: 
    print(x)
for i in range(len(a)): 
    print(a[i])
i = 0
while i<len(a):
    print(a[i])
    i += 1
# test
from numpy.random import random_sample
b = random_sample(10)
print(b)
for x in b:
    if x > 0.5:
        print(x)
    else:
        print('Nombre plus petit que 0.5', x)
# list comprehensions avec test
c = [x for x in b if x>0.5]
print(c)


0
1
2
3
4
0
1
2
3
4
0
1
2
3
4
[0.19793965 0.40980556 0.19221751 0.87605324 0.06912574 0.5466043
 0.41900689 0.88357638 0.27238171 0.71398546]
Nombre plus petit que 0.5 0.1979396540260806
Nombre plus petit que 0.5 0.4098055584584911
Nombre plus petit que 0.5 0.19221750602182341
0.8760532444554535
Nombre plus petit que 0.5 0.06912573991682291
0.5466043021681537
Nombre plus petit que 0.5 0.4190068922923156
0.8835763790876662
Nombre plus petit que 0.5 0.2723817149363178
0.7139854642524808
[0.8760532444554535, 0.5466043021681537, 0.8835763790876662, 0.7139854642524808]

Exercice

  1. Modifier le programme de calcul du temps et de la distance de freinage pour donner les réponses pour différentes valeurs de décélération, entre -0.5 et -6 m/s^2 (avec un incrément de -0.5 m/s^2).
    1. Faire un graphique du temps (ou de la distance) de freinage en fonction de la vitesse pour différentes valeurs de décélération
  2. Transformer le programme pour demander à l'utilisateur s'il veut continuer avec d'autres valeurs de vitesses, et ré-itérer la question et les calculs (tant que l'utilisateur veut continuer).
  3. Compter le nombre de chiffres plus petits que 0.5 dans la liste c.

Bibliothèques scientifiques

  • numpy: vecteurs, matrices, etc.
  • scipy: fonctions scientifiques, en particulier statistiques
  • matplotlib: graphiques et visualisation
  • pandas: structures de données (interface et similarité avec SQL)
  • statsmodels: modèles statistiques
  • scikit-learn: apprentissage automatique

In [25]:
import urllib.request
import zipfile
import io

import matplotlib.mlab as pylab
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
%matplotlib inline

In [26]:
# exemples numpy
a = np.arange(10) # similaire a range(10), retourne une array
b = np.zeros((4,5))
c = np.ones((4,5))
a = np.random.random_sample(10)
# éviter les boucles, extraire des sous-vecteurs (comme avec matlab)
b = a>0.5
print(b)
c = a[b]
print(a)
print(c)


[ True False  True False  True False  True  True False False]
[0.50874747 0.02739748 0.51588658 0.17946384 0.82089852 0.47083582
 0.73320021 0.69296238 0.14363161 0.11122486]
[0.50874747 0.51588658 0.82089852 0.73320021 0.69296238]

In [27]:
# charger des matrices
data = np.loadtxt('./donnees/vitesse-debit.txt')
plt.plot(data[:,0], data[:,1], 'o')
data.mean(0)


Out[27]:
array([  73.26293397, 1447.27109541])

Exercice

Sachant que la première colonne du fichier vitesse-debit.txt est la vitesse moyenne et la seconde le débit, calculer la densité (égale au débit divisé par la vitesse) et tracer le graphique de la vitesse en fonction de la densité.


In [28]:
# jeu de données de voitures http://lib.stat.cmu.edu/DASL/Datafiles/Cars.html
text = '''Country	Car	MPG	Weight	Drive_Ratio	Horsepower	Displacement	Cylinders
U.S.	Buick Estate Wagon	16.9	4.360	2.73	155	350	8
U.S.	Ford Country Squire Wagon	15.5	4.054	2.26	142	351	8
U.S.	Chevy Malibu Wagon	19.2	3.605	2.56	125	267	8
U.S.	Chrysler LeBaron Wagon	18.5	3.940	2.45	150	360	8
U.S.	Chevette	30.0	2.155	3.70	68	98	4
Japan	Toyota Corona	27.5	2.560	3.05	95	134	4
Japan	Datsun 510	27.2	2.300	3.54	97	119	4
U.S.	Dodge Omni	30.9	2.230	3.37	75	105	4
Germany	Audi 5000	20.3	2.830	3.90	103	131	5
Sweden	Volvo 240 GL	17.0	3.140	3.50	125	163	6
Sweden	Saab 99 GLE	21.6	2.795	3.77	115	121	4
France	Peugeot 694 SL	16.2	3.410	3.58	133	163	6
U.S.	Buick Century Special	20.6	3.380	2.73	105	231	6
U.S.	Mercury Zephyr	20.8	3.070	3.08	85	200	6
U.S.	Dodge Aspen	18.6	3.620	2.71	110	225	6
U.S.	AMC Concord D/L	18.1	3.410	2.73	120	258	6
U.S.	Chevy Caprice Classic	17.0	3.840	2.41	130	305	8
U.S.	Ford LTD	17.6	3.725	2.26	129	302	8
U.S.	Mercury Grand Marquis	16.5	3.955	2.26	138	351	8
U.S.	Dodge St Regis	18.2	3.830	2.45	135	318	8
U.S.	Ford Mustang 4	26.5	2.585	3.08	88	140	4
U.S.	Ford Mustang Ghia	21.9	2.910	3.08	109	171	6
Japan	Mazda GLC	34.1	1.975	3.73	65	86	4
Japan	Dodge Colt	35.1	1.915	2.97	80	98	4
U.S.	AMC Spirit	27.4	2.670	3.08	80	121	4
Germany	VW Scirocco	31.5	1.990	3.78	71	89	4
Japan	Honda Accord LX	29.5	2.135	3.05	68	98	4
U.S.	Buick Skylark	28.4	2.670	2.53	90	151	4
U.S.	Chevy Citation	28.8	2.595	2.69	115	173	6
U.S.	Olds Omega	26.8	2.700	2.84	115	173	6
U.S.	Pontiac Phoenix	33.5	2.556	2.69	90	151	4
U.S.	Plymouth Horizon	34.2	2.200	3.37	70	105	4
Japan	Datsun 210	31.8	2.020	3.70	65	85	4
Italy	Fiat Strada	37.3	2.130	3.10	69	91	4
Germany	VW Dasher	30.5	2.190	3.70	78	97	4
Japan	Datsun 810	22.0	2.815	3.70	97	146	6
Germany	BMW 320i	21.5	2.600	3.64	110	121	4
Germany	VW Rabbit	31.9	1.925	3.78	71	89	4
'''
s = io.StringIO(text)
data = pd.read_csv(s, delimiter = '\t')
#data.to_csv('cars.txt', index=False)
print(data.info())
data


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 38 entries, 0 to 37
Data columns (total 8 columns):
Country         38 non-null object
Car             38 non-null object
MPG             38 non-null float64
Weight          38 non-null float64
Drive_Ratio     38 non-null float64
Horsepower      38 non-null int64
Displacement    38 non-null int64
Cylinders       38 non-null int64
dtypes: float64(3), int64(3), object(2)
memory usage: 2.5+ KB
None
Out[28]:
Country Car MPG Weight Drive_Ratio Horsepower Displacement Cylinders
0 U.S. Buick Estate Wagon 16.9 4.360 2.73 155 350 8
1 U.S. Ford Country Squire Wagon 15.5 4.054 2.26 142 351 8
2 U.S. Chevy Malibu Wagon 19.2 3.605 2.56 125 267 8
3 U.S. Chrysler LeBaron Wagon 18.5 3.940 2.45 150 360 8
4 U.S. Chevette 30.0 2.155 3.70 68 98 4
5 Japan Toyota Corona 27.5 2.560 3.05 95 134 4
6 Japan Datsun 510 27.2 2.300 3.54 97 119 4
7 U.S. Dodge Omni 30.9 2.230 3.37 75 105 4
8 Germany Audi 5000 20.3 2.830 3.90 103 131 5
9 Sweden Volvo 240 GL 17.0 3.140 3.50 125 163 6
10 Sweden Saab 99 GLE 21.6 2.795 3.77 115 121 4
11 France Peugeot 694 SL 16.2 3.410 3.58 133 163 6
12 U.S. Buick Century Special 20.6 3.380 2.73 105 231 6
13 U.S. Mercury Zephyr 20.8 3.070 3.08 85 200 6
14 U.S. Dodge Aspen 18.6 3.620 2.71 110 225 6
15 U.S. AMC Concord D/L 18.1 3.410 2.73 120 258 6
16 U.S. Chevy Caprice Classic 17.0 3.840 2.41 130 305 8
17 U.S. Ford LTD 17.6 3.725 2.26 129 302 8
18 U.S. Mercury Grand Marquis 16.5 3.955 2.26 138 351 8
19 U.S. Dodge St Regis 18.2 3.830 2.45 135 318 8
20 U.S. Ford Mustang 4 26.5 2.585 3.08 88 140 4
21 U.S. Ford Mustang Ghia 21.9 2.910 3.08 109 171 6
22 Japan Mazda GLC 34.1 1.975 3.73 65 86 4
23 Japan Dodge Colt 35.1 1.915 2.97 80 98 4
24 U.S. AMC Spirit 27.4 2.670 3.08 80 121 4
25 Germany VW Scirocco 31.5 1.990 3.78 71 89 4
26 Japan Honda Accord LX 29.5 2.135 3.05 68 98 4
27 U.S. Buick Skylark 28.4 2.670 2.53 90 151 4
28 U.S. Chevy Citation 28.8 2.595 2.69 115 173 6
29 U.S. Olds Omega 26.8 2.700 2.84 115 173 6
30 U.S. Pontiac Phoenix 33.5 2.556 2.69 90 151 4
31 U.S. Plymouth Horizon 34.2 2.200 3.37 70 105 4
32 Japan Datsun 210 31.8 2.020 3.70 65 85 4
33 Italy Fiat Strada 37.3 2.130 3.10 69 91 4
34 Germany VW Dasher 30.5 2.190 3.70 78 97 4
35 Japan Datsun 810 22.0 2.815 3.70 97 146 6
36 Germany BMW 320i 21.5 2.600 3.64 110 121 4
37 Germany VW Rabbit 31.9 1.925 3.78 71 89 4

In [29]:
#data.describe(include = 'all')
data.describe()


Out[29]:
MPG Weight Drive_Ratio Horsepower Displacement Cylinders
count 38.000000 38.000000 38.000000 38.000000 38.000000 38.000000
mean 24.760526 2.862895 3.093421 101.736842 177.289474 5.394737
std 6.547314 0.706870 0.517657 26.444929 88.876747 1.603029
min 15.500000 1.915000 2.260000 65.000000 85.000000 4.000000
25% 18.525000 2.207500 2.695000 78.500000 105.000000 4.000000
50% 24.250000 2.685000 3.080000 100.000000 148.500000 4.500000
75% 30.375000 3.410000 3.625000 123.750000 229.500000 6.000000
max 37.300000 4.360000 3.900000 155.000000 360.000000 8.000000

In [30]:
data['Country'].value_counts().plot(kind='bar')
data[['Car', 'Country']].describe()


Out[30]:
Car Country
count 38 38
unique 38 6
top Chrysler LeBaron Wagon U.S.
freq 1 22

In [31]:
# exemple de vecteur ou enregistrement
data.loc[0]


Out[31]:
Country                       U.S.
Car             Buick Estate Wagon
MPG                           16.9
Weight                        4.36
Drive_Ratio                   2.73
Horsepower                     155
Displacement                   350
Cylinders                        8
Name: 0, dtype: object

Exercice

  1. Quel est le type des attributs?
  2. Proposer une méthode pour déterminer le pays avec les véhicules les plus économes

In [32]:
plt.scatter(data.Weight, data.MPG)


Out[32]:
<matplotlib.collections.PathCollection at 0x7f15324dc780>

In [33]:
# comptages vélo
filename, message = urllib.request.urlretrieve('http://donnees.ville.montreal.qc.ca/dataset/f170fecc-18db-44bc-b4fe-5b0b6d2c7297/resource/6caecdd0-e5ac-48c1-a0cc-5b537936d5f6/download/comptagevelo20162.csv')
data = pd.read_csv(filename)
print(data.info())
plt.plot(data['CSC (Côte Sainte-Catherine)'])


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 366 entries, 0 to 365
Data columns (total 20 columns):
Date                           366 non-null object
Unnamed: 1                     366 non-null object
Berri1                         366 non-null int64
Boyer                          366 non-null int64
Brébeuf                        366 non-null int64
CSC (Côte Sainte-Catherine)    344 non-null float64
Maisonneuve_2                  321 non-null float64
Maisonneuve_3                  366 non-null int64
Notre-Dame                     366 non-null int64
Parc                           366 non-null int64
PierDup                        366 non-null int64
Pont_Jacques_Cartier           366 non-null int64
Rachel / Hôtel de Ville        197 non-null float64
Rachel / Papineau              366 non-null int64
René-Lévesque                  366 non-null int64
Saint-Antoine                  366 non-null int64
Saint-Urbain                   366 non-null int64
Totem_Laurier                  366 non-null int64
University                     366 non-null int64
Viger                          366 non-null int64
dtypes: float64(3), int64(15), object(2)
memory usage: 57.3+ KB
None
Out[33]:
[<matplotlib.lines.Line2D at 0x7f153258db38>]

In [34]:
# 01/01/16 était un vendredi, le 4 était un lundi
cscComptage = np.array(data['CSC (Côte Sainte-Catherine)'].tolist()[4:4+51*7]).reshape(51,7)
for r in cscComptage:
    plt.plot(r)
plt.xticks(range(7),['lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche'])
plt.ylabel('Nombre de cyclistes')


Out[34]:
Text(0, 0.5, 'Nombre de cyclistes')

In [35]:
plt.imshow(cscComptage, interpolation = 'none', aspect = 'auto')
plt.colorbar()


Out[35]:
<matplotlib.colorbar.Colorbar at 0x7f15303859b0>

Exercice

  1. Les semaines sont-elle bien représentées?
  2. À quoi correspondent les bandes blanches dans l'image?

In [36]:
# données bixi
filename, message = urllib.request.urlretrieve('https://montreal.bixi.com/c/bixi/file_db/data_all.file/BixiMontrealRentals2018.zip')
zip=zipfile.ZipFile(filename)
data = pd.read_csv(zip.open(zip.namelist()[0]))

In [37]:
print(data.info())
print(data.describe())
# reflechir aux types, sens de moyenner des codes de station


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 236982 entries, 0 to 236981
Data columns (total 6 columns):
start_date            236982 non-null object
start_station_code    236982 non-null int64
end_date              236982 non-null object
end_station_code      236982 non-null int64
duration_sec          236982 non-null int64
is_member             236982 non-null int64
dtypes: int64(4), object(2)
memory usage: 10.8+ MB
None
       start_station_code  end_station_code   duration_sec      is_member
count       236982.000000     236982.000000  236982.000000  236982.000000
mean          6331.585150       6329.277595     732.055034       0.873379
std            408.427612        422.346590     580.180470       0.332549
min           4000.000000       4000.000000      61.000000       0.000000
25%           6118.000000       6104.000000     325.000000       1.000000
50%           6209.000000       6205.000000     565.000000       1.000000
75%           6395.000000       6401.000000     979.000000       1.000000
max          10002.000000      10002.000000    7189.000000       1.000000

In [38]:
# données météo d'Environnement Canada
#filename, message = urllib.request.urlretrieve('http://climate.weather.gc.ca/climate_data/bulk_data_f.html?format=csv&stationID=10761&Year=2017&Month=1&Day=1&timeframe=2&submit=Download+Data')
filename, message = urllib.request.urlretrieve('http://climate.weather.gc.ca/climate_data/bulk_data_f.html?format=csv&stationID=10761&Year=2017&Month=7&Day=1&timeframe=1&submit=Download+Data')
data = pd.read_csv(filename, skiprows = 15, delimiter = ',')

In [39]:
print(data.info())
plt.plot(data['Hum. rel (%)'])
plt.show()
#data.describe()
# plt.plot


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 744 entries, 0 to 743
Data columns (total 24 columns):
Date/Heure                          744 non-null object
Année                               744 non-null int64
Mois                                744 non-null int64
Jour                                744 non-null int64
Heure                               744 non-null object
Temp (°C)                           742 non-null object
Temp Indicateur                     0 non-null float64
Point de rosée (°C)                 742 non-null object
Point de rosée Indicateur           0 non-null float64
Hum. rel (%)                        742 non-null float64
Hum. rel. Indicateur                0 non-null float64
Dir. du vent (10s deg)              741 non-null float64
Dir. du vent Indicateur             0 non-null float64
Vit. du vent (km/h)                 742 non-null float64
Vit. du vent Indicateur             0 non-null float64
Visibilité (km)                     0 non-null float64
Visibilité Indicateur               0 non-null float64
Pression à la station (kPa)         742 non-null object
Pression à la station Indicateur    0 non-null float64
Hmdx                                363 non-null float64
Hmdx Indicateur                     0 non-null float64
Refroid. éolien                     0 non-null float64
Refroid. éolien Indicateur          0 non-null float64
Temps                               742 non-null object
dtypes: float64(15), int64(3), object(6)
memory usage: 139.6+ KB
None