Organisation des données

Les données sont transversales dans les flux de travail en sciences. Elles alimentent l'analyse, et la modélisation. Les résultats qui en découlent sont aussi des données qui peuvent alimenter les travaux subséquents. Une bonne organisation des données facilitera le flux de travail.

Dicton. Proportions de temps voué aux calcul scientifique: 80% de nettoyage de données mal organisées, 20% de calcul.

Qu'est-ce qu'une donnée? De manière abstraite, il s'agit d'une valeur associée à une variable. Une variable peut être une dimension, une date, une couleur, le résultat d'un test statistique, à laquelle on attribue la valeur quantitative ou qualitative d'un chiffre, d'une chaîne de charactère, d'un symbole conventionné, etc. Par exemple, lorsque vous commandez un café latte végane, au latte est la valeur que vous attribuez à la variable type de café, et végane est la valeur de la variable type de lait.

Ce chapitre traite de l'importation, l'utilisation et l'exportation de données structurées, en Python, sous forme de vecteurs, matrices, tableaux et ensemble de tableaux (bases de données).

Bien qu'il soit toujour préférable d'organiser les structures qui accueilleront les données d'une expérience avant-même de procéder à la collecte de données, l'analyste doit s'attendre à réorganiser ses données en cours de route. Or, des données bien organisées au départ faciliteront aussi leur réoganisation.

Ce chapitre débute avec quelques définitions: les données et leurs types, les vecteurs, les matrices, les tableaux et les bases de données, ainsi que leur signification en Python. Puis nous verrons comment organiser un tableau selon quelques règles simples, mais importantes pour éviter les erreurs et les opérations fastidieuses pour reconstruire un tableau mal conçu. Ensuite, nous traiterons des formats de tableau courrant, pour enfin passer à l'utilisation de pandas, une bibliothèque Python utile pour effectuer des opérations sur les tableaux.

Types de données

Dans la section précédente, nous avons survoler différents types d'objets: réels, entiers, chaînes de caractères et booléens. Les données peuvent appartenir à d'autres types: dates, catégories ordinales (ordonnées: faible, moyen, élevé) et nominales (non ordonnées: espèces, cultivars, couleurs, unité pédodlogique, etc.).

Vecteurs

Dans la section d'introduction à Python, nous avons vu comment Python permet d'organiser des collections d'objets. Bien qu'il soit important de connaître leur existance pour apprendre à maîtriser Python, les listes et les dictionnaires sont peu pratiques pour le calcul. Par exemple, Python ne permet pas d'effectuer les opérations entre les scalaires et les listes.


In [1]:
ma_liste = [1, 2, 3, 4]
ma_liste + 1


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-0964f9b95f19> in <module>()
      1 ma_liste = [1, 2, 3, 4]
----> 2 ma_liste + 1

TypeError: can only concatenate list (not "int") to list

Pour les listes, il faudrait passer par des boucles...


In [2]:
ma_liste_2 = []
for i in range(len(ma_liste)): 
    ma_liste_2.append(ma_liste[i] + 1)
ma_liste_2


Out[2]:
[2, 3, 4, 5]

... ce qui est loin d'ête pratique. On préférera généralement utiliser des vecteurs, qui, grâce à la vectorisation, peuvent être soumis à des opérations avec des scalaires. Les vecteurs sont accessibles via la bibliothèque numpy. Par convention, les fonctions de numpy sont importés dans une instance np.


In [3]:
import numpy as np
mon_vecteur = np.array([1, 2, 3, 4])
mon_vecteur + 1


Out[3]:
array([2, 3, 4, 5])

Contrairement à une liste, un vecteur contient obligatoirement des valeurs même type. À défaut de définir un même type, numpy transformera chaque valeur en chaîne de caractère.


In [4]:
[1, 2, 3, 'grenouille'] # liste


Out[4]:
[1, 2, 3, 'grenouille']

In [5]:
np.array([1, 2, 3, 'grenouille']) # vecteur


Out[5]:
array(['1', '2', '3', 'grenouille'], 
      dtype='<U21')

Matrices

La matrice est une généralisation du vecteur. Alors que le vecteur a une seule dimension, la matrice acccepte un nombre le dimension $N$ (naturel positif) nécessaire pour l'application.


In [6]:
np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])


Out[6]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [7]:
np.array([[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
         [[10, 11, 12], [13, 14, 15], [16, 17, 18]]])


Out[7]:
array([[[ 1,  2,  3],
        [ 4,  5,  6],
        [ 7,  8,  9]],

       [[10, 11, 12],
        [13, 14, 15],
        [16, 17, 18]]])

Une matrice 2D peut indiquer l'élévation d'un point dans l'espace x, y. En 3D, vous pouvez inclure non seulement l'élévation, mais aussi l'épaisseur de solet d'autres variables. Ajouter une évolution dans le temps et vous obtenez une matrice 4D.

Vous ne pourrez toutefois pas ajouter une couche d'une variable catégorielle dans une matrice numérique: comme les vecteurs, les matrices ne contiennent qu'un seul type de données.

Elles sont utilisées surtout en modélisation. En analyse de données, on préférera les tableaux.

Tableaux

De manière générale, un tableau de données est une organisation de données en deux dimensions, comportant des lignes et des colonnes. Il est préférable de respecter la convention selon laquelle les lignes sont des observations et les colonnes sont des variables. Ainsi, un tableau est une collection de vecteurs de même longueur, chaque vecteur représentant une variable. Chaque variable est libre de prendre le type de données approprié. La position d'une donnée dans le vecteur correspond à une observation.

Base de données

Imaginez que vous consignez des données de différents sites (A, B et C), et que chaque site possède ses propres caractéristiques. Il est redondant de décrire le site pour chaque observation. Vous préférerez créer deux tableaux: un pour décrire vos observations, et un autre pour décrire les sites. De cette manière, vous créez une collection de tableaux intereliés: une base de données.

Dans Python, les données structurées en tableaux, ainsi que les opérations sur les tableaux, peuvent être gérés grâe à la bibliothèque pandas. Mais avant de se lancer dans l'utilisation de pandas, voyons quelques règles à suivre pour bien structurer ses données.

Organiser un tableau de données

Afin de reprérer chaque cellule d'un tableau, on attribue à chaque lignes et à chaque colonne colonnes un identifiant unique, que l'on nomme indice pour les lignes et entête pour les colonnes.

*Règle no 1. Une variable par colonne, une observation par ligne.*

Les unités expérimentales sont décrits par une ou plusieurs variables par des chiffres ou des lettres. Chaque variable devrait être présente en une seule colonne, et chaque ligne devrait correspondre à une unité expérimentale où ces variables ont été mesurées. La règle parait simple, mais elle est rarement respectée. Prenez par exemple le tableau suivant.

Site Traitement A Traitement B Traitement C
Sainte-Zéphirine 4.1 8.2 6.8
Sainte-Aurélie 5.8 5.9 NA
Saint-Serge-Étienne 2.9 3.4 4.6

Tableau 1. Rendements obtenus sur les sites expérimentaux selon les traitements.

Qu'est-ce qui cloche avec ce tableau? Chaque ligne est une observation, mais contient plussieurs observations d'une même variable, le rendement, qui devient étalé sur plusieurs colonnes. À bien y penser, le type de traitement est une variable et le rendement en est une autre:

Site Traitement Rendement
Sainte-Zéphirine A 4.1
Sainte-Zéphirine B 8.2
Sainte-Zéphirine C 6.8
Sainte-Aurélie A 5.8
Sainte-Aurélie B 5.9
Sainte-Aurélie C NA
Saint-Serge-Étienne A 2.9
Saint-Serge-Étienne B 3.4
Saint-Serge-Étienne C 4.6

Tableau 2. Rendements obtenus sur les sites expérimentaux selon les traitements.

Plus précisément, l'expression à bien y penser suggère une réflexion sur la signification des données. Certaines variables peuvent parfois être intégrées dans une même colonne, parfois pas. Par exemple, les concentrations en cuivre, zinc et plomb dans un sol contaminé peuvent être placés dans la même colonne "Concentration" ou déclinées en plusieurs colonnes Cu, Zn et Pb. La première version trouvera son utilité pour des créer des graphiques (chapitre 5), alors que la deuxième favorise le traitement statistique (chapitre 4).

*Règle no 2. Ne pas répéter les informations.*

Rerpenons la même expérience. Supposons que vous mesurez la précipitation à l'échelle du site.

Site Traitement Rendement Précipitations
Sainte-Zéphirine A 4.1 813
Sainte-Zéphirine B 8.2 813
Sainte-Zéphirine C 6.8 813
Sainte-Aurélie A 5.8 642
Sainte-Aurélie B 5.9 642
Sainte-Aurélie C NA 642
Saint-Serge-Étienne A 2.9 1028
Saint-Serge-Étienne B 3.4 1028
Saint-Serge-Étienne C 4.6 1028

Tableau 3. Rendements obtenus sur les sites expérimentaux selon les traitements.

Segmenter l'information en deux tableaux serait préférable.

Site Précipitations
Sainte-Zéphirine 813
Sainte-Aurélie 642
Saint-Serge-Étienne 1028

Tableau 4. Précipitations sur les sites expérimentaux.

Les tableaux 2 et 4, ensemble, forment une base de données (collection organisée de tableaux).

*Règle no 3. Ne pas bousiller les données.*

Par exemple.

  • Ajouter des commentaires dans des cellules. Si une cellule mérite d'être commentée, il est préférable de placer les commentaires soit dans un fichier décrivant le tableau de données, soit dans une colonne de commentaire justaposée à la colonne de la variable à commenter. Par exemple, si vous n'avez pas mesure le pH pour une observation, n'écrivez pas "échantillon contaminé" dans la cellule, mais annoter dans un fichier d'explication que l'échantillon no X a été contaminé. Si les commentaires sont systématique, il peut être pratique de les inscrire dans une colonne commentaire_pH.
  • Inscrition non systématiques. Il arrive souvent que des catégories d'une variable ou que des valeurs manquantes soient annotées différemment. Il arrive même que le séparateur décimal soit non systématique, parfois noté par un point, parfois par une virgule. Par exemple, une fois importés dans votre session, les catégories St-Ours et Saint-Ours seront traitées comme deux catégories distinctes. De même, les cellules correspondant à des valeurs manquantes ne devraient pas être inscrite parfois avec une cellule vide, parfois avec un point, parfois avec un tiret ou avec la mention NA. Le plus simple est de laisser systématiquement ces cellules vides.
  • Inclure des notes dans un tableau. La règle "une colonne, une variable" n'est pas respectée si on ajoute des notes un peu n'importe où sous ou à côté du tableau.
  • Ajouter des sommaires. Si vous ajoutez une ligne sous un tableau comprenant la moyenne de chaque colonne, qu'est-ce qui arrivera lorsque vous importerez votre tableau dans votre session de travail? La ligne sera considérée comme une observation supplémentaire.
  • Inclure une hiérarchie dans le entêtes. Afin de consigner des données de texture du sol, comprenant la proprotion de sable, de limon et d'argile, vous organisez votre entête en plusieurs lignes. Une ligne pour la catégorie de donnée, Texture, fusionnée sur trois colonnes, puis trois colonnes intitullées Sable, Limon et Argile. Votre tableau est joli, mais il ne pourra pas être importé conformément dans un votre session de calcul: on recherche une entête unique par colonne. Votre tableau de données devrait plutôt porter les entêtes Texture sable, Texture limon et Texture argile. Un conseil: réserver le travail esthétique à la toute fin d'un flux de travail.

Formats de tableau

Plusieurs outils sont à votre disposition pour créer des tableaux. Je vous présente ici les plus communs.

xls ou xlsx

Microsoft Excel est un logiciel de type tableur, ou chiffrier électronique. L'ancien format xls a été remplacé par le format xlsx avec l'arrivée de Microsoft Office 2010. Il s'agit d'un format propriétaire, dont l'alternative libre la plus connue est le format ods, popularisé par la suite bureautique LibreOffice. Les formats xls, xlsx ou ods sont davantage utilisés comme outils de calcul que d'entreposage de données. Ils contiennent des formules, des graphiques, du formattage de cellule, etc. Je ne les recommande pas pour stocker des données.

csv

Le format csv, pour comma separated values, est un fichier texte, que vous pouvez ouvrir avec n'importe quel éditeur de texte brut (Bloc note, Atom, Notepad++, etc.). Chaque colonne doit être délimitée par un caractère cohérent (conventionnellement une virgule, mais en français un point-virgule ou une tabulation pour éviter la confusion avec le séparateur décimal) et chaque ligne du tableau est un retour de ligne. Il est possible d'ouvrir et d'éditer les fichiers csv dans un éditeur texte, mais il est plus pratique de les ouvrir avec des tableurs (LibreOffice Calc, Microsoft Excel, Google Sheets, etc.).

Encodage. Puisque le format csv est un fichier texte, un souci particulier doit être porté sur la manière dont le texte est encodé. Les caractères accentués pourrait être importer incorrectement si vous importez votre tableau en spécifiant le mauvais encodage. Pour les fichiers en langues occidentales, l'encodage UTF-8 devrait être utilisé. Toutefois, par défaut, Excel utilise un encodage de Microsoft. Si le csv a été généré par Excel, il est préférable de l'ouvrir avec votre éditeur texte et de l'enregistrer dans l'encodage UTF-8.

json

Comme le format csv, le format json indique un fichier en texte clair. Il est utilisé davantage pour le partage de données des applications web. En analyse et modélisation, ce format est surtout utilisé pour les données géoréférencées. L'encodage est géré de la même manière qu'un fichier csv.

SQLite

SQLite est une application pour les bases de données relationnelles de type SQL qui n'a pas besoin de serveur pour fonctionner. Les bases de donnnées SQLite sont encodés dans des fichiers portant l'extension db, qui peuvent être facilement partagés.

Suggestion

En csv pour les petits tableaux, en sqlite pour les bases de données plus complexes. Ce cours se concentre toutefois sur les données de type csv.

Entreposer ses données

La manière la plus sécure pour entreposer ses données est de les confiner dans une base de données sécurisée sur un serveur sécurisé dans un environnement sécurisé. C'est aussi la manière la moins accessible. Des espaces de stockage nuagiques, comme Dropbox ou une option similaire, peuvent être pratiques pour les backups et le partage des données avec une équipe de travail (qui risque en retour de bousiller vos données). Le suivi de version est possible chez certains fournisseurs d'espace de stockage. Mais pour un suivi de version plus rigoureux, les espaces de développement (comme GitHub) sont plus appropriés: nous verrons d'ailleurs, plus loin dans le manuel, comment un projet de recherche peut tirer profit de GitHub. Dans tous les cas, il est important de garder (1) des copies anciennes pour y revenir en cas d'erreurs et (2) un petit fichier décrivant les changements effectués sur les données.

Manipuler des données avec pandas

La bibliothèque pandas est d'une aide préciseuse pour l'analyse de données en Python. Elle permet d'importer des données dans votre session de travail, de les explorer, de les transformer et de les exporter. Les tableaux de classe pandas peuvent être manipulés pour l'analyse et la modélisation grâce à d'autres bibliothèques, dont plusieurs sont couvertes dans ce manuel (statsmodels, scikit-learn, scikit-bio, etc.). Cette section se veut une brève introduction à pandas. Elle est loin de couvrir les nombreuses fonctionnalités qui sont offertes, qui sont couvertes de manière plus exhaustive dans le livre Python for Data Analysis (McKinney, 2016).

L'objet pandas.DataFrame

Le type d'objet central de pandas est le DataFrame, ou tableau. Des tableaux peuvent être importés depuis des fichiers csv, json ou depuis des bases de données. Importons notre Tableau 1 spécifié en format csv avec un ; en guise de délimiteur de colonne.

Opérations sur un tableau

Que ce soit pour inspecter vos donner, pour effectuer des calculs sur celles-ci ou en faire des graphiques, vous devez être en mesure de sélectionner les lignes et les colonnes visées. Dans cette section, nous couvrirons comment sélectionner les données, des manières de les filtrer, les trier, et effectuer des opérations mathématiques sur celles-ci.

Pour effectuer ces opérations, utilisons un tableau de données de culture de la chicouté (Rubus chamaemorus), un petit fruit nordique, tiré de Parent et al. (2013).

Comment importer des données?

Pour accéder aux fonctionnalités de pandas dans un environnement de travail, on utilise par convention la notation abrégée pd.


In [8]:
import pandas as pd

Pour importer un tableau csv, on utilise la fonction pandas.read_csv.


In [9]:
chicoute = pd.read_csv('data/chicoute.csv', sep=';', header=0, index_col=0, na_values='',
                 encoding='utf-8')

Les principaux arguments ont été spécifiés, bien qu'ils auraient pu être laissés par défaut.

  • filepath_or_buffer: le chemin vers le fichier. Ce chemin peut aussi bien être une adresse locale (telle que définit dans cet exemple) qu'une adresse internet (https://...).
  • sep: le symbole délimitant les colonnes.
  • header: le numéro de ligne utilisé pour le nom de l'entête.
  • index_col: le numéro de colonne utilisé pour l'index. Si False est spécifié, l'index de la ligne est automatiquement imputé. La valeur de l'argument est de 0, puisque l'identifiant unique du tableau chicoute est positionné à la première colonne (Python comment à compter à 0).
  • na_values: le symbole spécifiant une valeur manquante. L'argument na_values='' signifie que les cellules vides sont des données manquantes.
  • encoding: le format d'encodage du fichier.

D'autres arguments peuvent être spécifiés au besoin, et les répéter ici dupliquerait l'information de la documentation de la fonction read_csv de pandas. La documentation de pandas présente d'autres fonctions accessibles pour charger des données formattées en json, tsv, etc.

La méthode head permet d'afficher le haut du tableau, tout comme la méthode tail permet d'en afficher le bas.


In [10]:
chicoute.head(3)


Out[10]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 ... K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
1 BEAU A 1 NaN NaN NaN 5702454 490627 NaN 453.272218 ... 1.213369 0.435481 0.470311 0.09765 0.002578 0.000175 0.004698 0.100602 0.013281 0.001558
2 BEAU A 2 NaN NaN NaN 5702452 490634 NaN 460.911637 ... 1.215155 0.336792 0.439383 0.09961 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890
3 BEAU A 3 NaN NaN NaN 5702461 490638 NaN 651.897122 ... 1.049444 0.373216 0.420433 0.10440 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602

3 rows × 30 columns

Conformément aux règles de construction d'un tableau, pandas demande à ce que chaque colonne possède une entête unique, comme chaque ligne possède un indice unique, ce qui peut être vérifié avec les méthodes descriptives columns et index.


In [11]:
print("Entêtes:", chicoute.columns)
print("Indices:", chicoute.index)


Entêtes: Index(['CodeTourbiere', 'Ordre', 'Site', 'Traitement', 'DemiParcelle',
       'SousTraitement', 'Latitude_m', 'Longitude_m', 'Rendement_g.5m2',
       'TotalRamet_nombre.m2', 'TotalVegetatif_nombre.m2',
       'TotalFloral_nombre.m2', 'TotalMale_nombre.m2',
       'TotalFemelle_nombre.m2', 'FemelleFruit_nombre.m2',
       'FemelleAvorte_nombre.m2', 'SterileFleur_nombre.m2', 'C_pourc',
       'N_pourc', 'P_pourc', 'K_pourc', 'Ca_pourc', 'Mg_pourc', 'S_pourc',
       'B_pourc', 'Cu_pourc', 'Zn_pourc', 'Mn_pourc', 'Fe_pourc', 'Al_pourc'],
      dtype='object')
Indices: Int64Index([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
            18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
            35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
            52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
            69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
            86, 87, 88, 89, 90],
           dtype='int64', name='ID')

Les DataFrame et les Series

Dans un DataFrame de pandas, chaque colonne est une Series, à laquelle nous accédons ici avec un point suivi du nom de la colonne (nous verons plus tard comment soutirer précisément des éléments d'un tableau). Une Series peut être utilisée sans DataFrame, mais vous utiliserez probablement les Series en tant que colonnes d'un tableau.

La fonction type permet d'identifier le type de l'objet. chicoute, que nous avons importé d'un fichier csv, est un DataFrame.


In [12]:
print("Type d'un tableau:", type(chicoute))


Type d'un tableau: <class 'pandas.core.frame.DataFrame'>

Nous verrons dans la prochaine section une manière plus fiable de sélectionner une Series, mais notons pour cet exemple qu'une Series peut être accédée sous la forme tableau.colonne.


In [13]:
print("Type d'un tableau:", type(chicoute.CodeTourbiere))


Type d'un tableau: <class 'pandas.core.series.Series'>

Comment sélectionner et filtrer des données?

On utiliser le terme sélectionner lorsque l'on désire choisir une ou plusieurs lignes et colonnes d'un tableau (la plupart du temps des colonnes). L'action de filtrer signifie de sélectionner des axes (la plupart du temps des lignes) selon certains critères.

Une matrice n'est pas contrainte à une structure tabulaire (lignes et colonnes). Isoler les parties désirées d'une matrice se fait dans numpy comme pour une liste Python. Pour rappel, les éléments d'une liste sont sélectionnés par l'indice de leur position dans la liste à partir de 0, placé entre des crochets suivant le nom de l'objet.


In [14]:
ma_liste = ['premier', 'deuxième', 'troisième', 'quatrième']
ma_liste[1]


Out[14]:
'deuxième'

Dans numpy, on utilise aussi les crochets. Étant donné qu'une matrice est une liste de liste, les indices retenus sont ordonnés dans les crochets selon l'axe de la matrice (premier axe: lignes, deuxième axe: colonnes, troisième axe: profondeur, etc.). Les axes où l'on désire sélectionner tous les élément sont notés par un :.


In [15]:
ma_matrice = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
ma_matrice


Out[15]:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

In [16]:
ma_matrice[0, 1]


Out[16]:
2

In [17]:
ma_matrice[0, :]


Out[17]:
array([1, 2, 3])

In [18]:
ma_matrice[[0,2], 1]


Out[18]:
array([2, 8])

numpy est approprié pour effectué des sélections et des filtres. Néanmoins, les possibilités offertes par pandas en font un outil souvent plus approprié pour effectuer ces opérations. Avec pandas, certaines approches sont implicites, d'autres explicites.

Sélectionner

Il y a deux manières implicites de sélectionner une colonne. La première est d'inscrire le nom du tableau, un point, puis le nom de la colonne désirée. Cette manière de fonctionner entraînent plusieurs inconvénients: impossible d'appeler plusieurs colonnes, erreurs si le nom de la colonne contient des caractères spéciaux, conflits avec les fonctions. Bien que plusieurs travaillent avec cette notation, nous travaillerons ici avec la notation en crochets, [ ]. Entre les crochets, il est possible de noter une les caractères correspondant à la colonne désirée. Si l'on désire appeler plusieurs colonnes, elles doivent être appelées sous forme d'une liste Python, elle-même délimitée par des crochets (d'où les doubles-crochets).


In [19]:
chicoute['CodeTourbiere'].head()


Out[19]:
ID
1    BEAU
2    BEAU
3    BEAU
4    BEAU
5    BEAU
Name: CodeTourbiere, dtype: object

In [20]:
chicoute[['CodeTourbiere', 'Ordre']].head()


Out[20]:
CodeTourbiere Ordre
ID
1 BEAU A
2 BEAU A
3 BEAU A
4 BEAU A
5 BEAU A

Il est possible de créer une liste de noms de colonnes, puis de la placer entre les crochets.


In [21]:
chicoute.columns[17:]


Out[21]:
Index(['C_pourc', 'N_pourc', 'P_pourc', 'K_pourc', 'Ca_pourc', 'Mg_pourc',
       'S_pourc', 'B_pourc', 'Cu_pourc', 'Zn_pourc', 'Mn_pourc', 'Fe_pourc',
       'Al_pourc'],
      dtype='object')

In [22]:
fol_cols = chicoute.columns[17:] # noms des colonnes de concentration foliaire

In [23]:
chicoute[fol_cols].head()


Out[23]:
C_pourc N_pourc P_pourc K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
1 51.47 1.725 0.108283 1.213369 0.435481 0.470311 0.09765 0.002578 0.000175 0.004698 0.100602 0.013281 0.001558
2 51.29 2.183 0.098500 1.215155 0.336792 0.439383 0.09961 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890
3 50.55 2.122 0.070767 1.049444 0.373216 0.420433 0.10440 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602
4 51.58 1.948 0.090899 1.191574 0.500454 0.387801 0.09224 0.002578 0.000093 0.005497 0.031042 0.013455 0.000895
5 53.83 2.039 0.115247 0.946565 0.332687 0.471710 0.10620 0.002578 0.000037 0.005101 0.034550 0.012011 0.001021

Que venons-nous de faire?

  1. Visualiser les noms de colonne
  2. Sélectionner les noms de colonnes correspondants à des concentrations foliaires.
  3. Créer l'objet fol_cols contenant le nom des colonnes.
  4. Sélectionner les colonnes fol_cols du tableau chicoute

On peut travailler en exclusion avec la méthode drop, par exemple exclure la colonne Site.


In [24]:
chicoute.drop(fol_cols, axis=1).head()


Out[24]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 TotalVegetatif_nombre.m2 TotalFloral_nombre.m2 TotalMale_nombre.m2 TotalFemelle_nombre.m2 FemelleFruit_nombre.m2 FemelleAvorte_nombre.m2 SterileFleur_nombre.m2
ID
1 BEAU A 1 NaN NaN NaN 5702454 490627 NaN 453.272218 255.920550 197.351668 10.185893 187.165775 157.881334 8.912656 0.000000
2 BEAU A 2 NaN NaN NaN 5702452 490634 NaN 460.911637 333.587981 127.323657 0.000000 124.777184 71.301248 14.005602 2.546473
3 BEAU A 3 NaN NaN NaN 5702461 490638 NaN 651.897122 580.595875 71.301248 1.273237 70.028011 48.382990 19.098549 0.000000
4 BEAU A 4 NaN NaN NaN 5702453 490647 NaN 590.781767 440.539852 150.241915 104.405399 45.836516 39.470334 3.819710 0.000000
5 BEAU A 5 NaN NaN NaN 5702445 490654 NaN 564.043799 365.418895 198.624905 92.946269 105.678635 94.219506 2.546473 0.000000

Nous verrons plus tard, en plus de détails, en quoi consiste l'argument axis. Pour l'instant, retenons que plusieurs fonctions de pandas sont disponibles dans l'axe vertical, celui des lignes, (axis=0) et dans l'axe horizontal, celui des colonnes (axis=1).

Cette approche est implicite, parce que pandas interprète que vous désirez sélectionner des colonnes. Les méthodes de localisation par nom loc et de locatlisation par indice iloc sont, quant à elles, explicites. Elles découlent de la notation de numpy et sont valides pour les lignes et les colonnes. Alors que loc demande des Ìndex (des noms de colonne ou des noms de ligne), iloc est uniquement basé sur la position des lignes et des colonnes.


In [25]:
chicoute.loc[1:4, fol_cols]


Out[25]:
C_pourc N_pourc P_pourc K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
1 51.47 1.725 0.108283 1.213369 0.435481 0.470311 0.09765 0.002578 0.000175 0.004698 0.100602 0.013281 0.001558
2 51.29 2.183 0.098500 1.215155 0.336792 0.439383 0.09961 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890
3 50.55 2.122 0.070767 1.049444 0.373216 0.420433 0.10440 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602
4 51.58 1.948 0.090899 1.191574 0.500454 0.387801 0.09224 0.002578 0.000093 0.005497 0.031042 0.013455 0.000895

La fonction loc permet de sélectionner une suite de colonnes.


In [26]:
chicoute.loc[1:4, 'TotalRamet_nombre.m2':'TotalFemelle_nombre.m2']


Out[26]:
TotalRamet_nombre.m2 TotalVegetatif_nombre.m2 TotalFloral_nombre.m2 TotalMale_nombre.m2 TotalFemelle_nombre.m2
ID
1 453.272218 255.920550 197.351668 10.185893 187.165775
2 460.911637 333.587981 127.323657 0.000000 124.777184
3 651.897122 580.595875 71.301248 1.273237 70.028011
4 590.781767 440.539852 150.241915 104.405399 45.836516

Dans les exemples précédents, 1:4 est l'indice des lignes, qui est ici différent de la position, dont l'accès se fait via iloc. Alors que loc inclue tous les noms de colonne et d'indice, iloc fonctionne comme les sélections dans les listes et les matrices numpy: en incluant la première position et en excluant la dernière.


In [27]:
chicoute.iloc[0:4, 17:]


Out[27]:
C_pourc N_pourc P_pourc K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
1 51.47 1.725 0.108283 1.213369 0.435481 0.470311 0.09765 0.002578 0.000175 0.004698 0.100602 0.013281 0.001558
2 51.29 2.183 0.098500 1.215155 0.336792 0.439383 0.09961 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890
3 50.55 2.122 0.070767 1.049444 0.373216 0.420433 0.10440 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602
4 51.58 1.948 0.090899 1.191574 0.500454 0.387801 0.09224 0.002578 0.000093 0.005497 0.031042 0.013455 0.000895

Effectuer une sélection sur un tableau comme pour une matrice, c'est-à-dire sans iloc, retournera une erreur.


In [28]:
chicoute[0:4, 17:]


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-28-6b357d211c62> in <module>()
----> 1 chicoute[0:4, 17:]

~/bin/anaconda3/lib/python3.5/site-packages/pandas/core/frame.py in __getitem__(self, key)
   1962             return self._getitem_multilevel(key)
   1963         else:
-> 1964             return self._getitem_column(key)
   1965 
   1966     def _getitem_column(self, key):

~/bin/anaconda3/lib/python3.5/site-packages/pandas/core/frame.py in _getitem_column(self, key)
   1969         # get column
   1970         if self.columns.is_unique:
-> 1971             return self._get_item_cache(key)
   1972 
   1973         # duplicate columns & possible reduce dimensionality

~/bin/anaconda3/lib/python3.5/site-packages/pandas/core/generic.py in _get_item_cache(self, item)
   1641         """Return the cached item, item represents a label indexer."""
   1642         cache = self._item_cache
-> 1643         res = cache.get(item)
   1644         if res is None:
   1645             values = self._data.get(item)

TypeError: unhashable type: 'slice'

Filtrer

Un filtre est un vecteur booléen de même longueur que l'axe filtré (généralement le nombre de lignes). Effectué sur les lignes, chaque ligne conservée correspond à une valeur True dans le vecteur. Les lignes correspondant à la valeur False dans le vecteur filtrant seront excluent.


In [29]:
chicoute['CodeTourbiere'] == 'BEAU'


Out[29]:
ID
1      True
2      True
3      True
4      True
5      True
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    False
20    False
21    False
22    False
23    False
24    False
25    False
26    False
27    False
28    False
29    False
30    False
      ...  
61    False
62    False
63    False
64    False
65    False
66    False
67    False
68    False
69    False
70    False
71    False
72    False
73    False
74    False
75    False
76    False
77    False
78    False
79    False
80    False
81    False
82    False
83    False
84    False
85    False
86    False
87    False
88    False
89    False
90    False
Name: CodeTourbiere, Length: 90, dtype: bool

Le filtre est appliqué sur le tableau en le passant entre les crochets: pandas détecte automatiquement que vous désirez effectuer un fitlre sur les lignes. C'est pourquoi cette approche est implicite.


In [30]:
chicoute[chicoute['CodeTourbiere'] == 'BEAU']


Out[30]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 ... K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
1 BEAU A 1 NaN NaN NaN 5702454 490627 NaN 453.272218 ... 1.213369 0.435481 0.470311 0.09765 0.002578 0.000175 0.004698 0.100602 0.013281 0.001558
2 BEAU A 2 NaN NaN NaN 5702452 490634 NaN 460.911637 ... 1.215155 0.336792 0.439383 0.09961 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890
3 BEAU A 3 NaN NaN NaN 5702461 490638 NaN 651.897122 ... 1.049444 0.373216 0.420433 0.10440 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602
4 BEAU A 4 NaN NaN NaN 5702453 490647 NaN 590.781767 ... 1.191574 0.500454 0.387801 0.09224 0.002578 0.000093 0.005497 0.031042 0.013455 0.000895
5 BEAU A 5 NaN NaN NaN 5702445 490654 NaN 564.043799 ... 0.946565 0.332687 0.471710 0.10620 0.002578 0.000037 0.005101 0.034550 0.012011 0.001021

5 rows × 30 columns

Toute opération booléenne est valide.


In [31]:
chicoute[chicoute['N_pourc'] > 2.8]


Out[31]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 ... K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
11 2 6 11 fertilisant left Control 5702582 486522 0.00 66.4 ... 1.192675 0.403273 0.499008 0.1303 0.004164 0.000111 0.009994 0.026289 0.010000 0.001382
13 2 6 12 temoin left Control 5702562 486538 0.00 156.8 ... 1.061237 0.197001 0.547072 0.1385 0.003321 0.000986 0.008257 0.013331 0.011007 0.002797
14 2 6 12 temoin right B 5702562 486538 0.00 112.8 ... 1.326007 0.204416 0.499510 0.1378 0.003934 0.000671 0.007467 0.010920 0.010387 0.004158
15 2 7 13 fertilisant left Control 5702643 486498 0.00 152.4 ... 1.008934 0.315220 0.399586 0.1668 0.003321 0.000252 0.006911 0.004139 0.009132 0.001963
18 2 7 14 temoin right Control 5702627 486501 0.38 78.4 ... 1.206091 0.311528 0.469607 0.1571 0.004164 0.000686 0.011481 0.054341 0.017370 0.003759
22 2 8 16 temoin right Cu 5702537 486524 0.00 177.6 ... 1.222893 0.320198 0.449377 0.1296 0.004167 0.000869 0.006610 0.010440 0.009338 0.001999
23 2 9 17 fertilisant left Control 5702544 486327 0.00 65.6 ... 1.177441 0.365387 0.459838 0.1336 0.004164 0.000392 0.007018 0.008054 0.010646 0.002039
27 2 10 19 fertilisant left Control 5702478 486353 0.00 208.8 ... 1.269590 0.368932 0.480966 0.1515 0.003321 0.000469 0.006456 0.017736 0.010357 0.001924

8 rows × 30 columns

Les conditions booléennes peuvent être combinées avec les opérateurs et, &, et ou, |. Pour rappel,

Opération Résultat
Vrai et Vrai Vrai
Vrai et Faux Faux
Faux et Faux Faux
Vrai ou Vrai Vrai
Vrai ou Faux Vrai
Faux ou Faux Faux

Pour éviter les confusions liées aux préscéances d'opérations, pandas demande que les conditions soient spécifiées entre parenthèses.


In [32]:
chicoute[(chicoute['Ca_pourc'] < 0.4) & (chicoute['CodeTourbiere'] == 'BEAU')]


Out[32]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 ... K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
2 BEAU A 2 NaN NaN NaN 5702452 490634 NaN 460.911637 ... 1.215155 0.336792 0.439383 0.09961 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890
3 BEAU A 3 NaN NaN NaN 5702461 490638 NaN 651.897122 ... 1.049444 0.373216 0.420433 0.10440 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602
5 BEAU A 5 NaN NaN NaN 5702445 490654 NaN 564.043799 ... 0.946565 0.332687 0.471710 0.10620 0.002578 0.000037 0.005101 0.034550 0.012011 0.001021

3 rows × 30 columns

Pour spécifier quelques options de correspondances exactes, utilisez la méthode isin (utilisable seulement pour les pandas.Series).


In [33]:
chicoute[(chicoute['N_pourc'] > 2.8) | (chicoute['SousTraitement'].isin(['B', 'Cu']))]


Out[33]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 ... K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
ID
11 2 6 11 fertilisant left Control 5702582 486522 0.000000 66.4 ... 1.192675 0.403273 0.499008 0.13030 0.004164 0.000111 0.009994 0.026289 0.010000 0.001382
12 2 6 11 fertilisant right Cu 5702582 486522 0.000000 98.0 ... 1.241096 0.326899 0.479595 0.13010 0.004167 0.001177 0.009641 0.013245 0.010170 0.002334
13 2 6 12 temoin left Control 5702562 486538 0.000000 156.8 ... 1.061237 0.197001 0.547072 0.13850 0.003321 0.000986 0.008257 0.013331 0.011007 0.002797
14 2 6 12 temoin right B 5702562 486538 0.000000 112.8 ... 1.326007 0.204416 0.499510 0.13780 0.003934 0.000671 0.007467 0.010920 0.010387 0.004158
15 2 7 13 fertilisant left Control 5702643 486498 0.000000 152.4 ... 1.008934 0.315220 0.399586 0.16680 0.003321 0.000252 0.006911 0.004139 0.009132 0.001963
16 2 7 13 fertilisant right B 5702643 486498 0.000000 164.8 ... 0.831373 0.334868 0.449515 0.15080 0.003934 0.000287 0.007290 0.004868 0.009565 0.001844
17 2 7 14 temoin left Cu 5702627 486501 0.000000 158.8 ... 1.006785 0.372400 0.510872 0.13590 0.004167 0.000387 0.010543 0.048363 0.009650 0.002705
18 2 7 14 temoin right Control 5702627 486501 0.380000 78.4 ... 1.206091 0.311528 0.469607 0.15710 0.004164 0.000686 0.011481 0.054341 0.017370 0.003759
19 2 8 15 fertilisant left B 5702537 486517 0.000000 272.8 ... 1.206630 0.360007 0.468216 0.13110 0.003934 0.000811 0.006169 0.008995 0.009935 0.002522
22 2 8 16 temoin right Cu 5702537 486524 0.000000 177.6 ... 1.222893 0.320198 0.449377 0.12960 0.004167 0.000869 0.006610 0.010440 0.009338 0.001999
23 2 9 17 fertilisant left Control 5702544 486327 0.000000 65.6 ... 1.177441 0.365387 0.459838 0.13360 0.004164 0.000392 0.007018 0.008054 0.010646 0.002039
24 2 9 17 fertilisant right Cu 5702544 486327 0.000000 84.8 ... 1.135360 0.481876 0.473561 0.13120 0.004167 0.000293 0.008305 0.018797 0.009191 0.002605
26 2 9 18 temoin right B 5702540 486315 0.000000 72.0 ... 1.340692 0.359337 0.430543 0.11860 0.003934 0.000579 0.006692 0.004453 0.010732 0.002074
27 2 10 19 fertilisant left Control 5702478 486353 0.000000 208.8 ... 1.269590 0.368932 0.480966 0.15150 0.003321 0.000469 0.006456 0.017736 0.010357 0.001924
28 2 10 19 fertilisant right B 5702478 486353 0.000000 200.8 ... 1.174864 0.372228 0.519797 0.14200 0.003934 0.000346 0.005495 0.010896 0.010015 0.002113
29 2 10 20 temoin left Cu 5702494 486350 0.000000 236.8 ... 0.857632 0.376334 0.467814 0.14200 0.004167 0.000561 0.005553 0.019656 0.010376 0.002356
66 1 1 1 fertilisant left B 5702078 486544 63.989625 484.4 ... 0.987797 0.363668 0.404057 0.13850 0.003503 0.000037 0.005492 0.008877 0.010873 0.001382
69 1 1 2 temoin right Cu 5702099 486528 8.696253 200.0 ... 0.485066 0.323779 0.632981 0.09878 0.003503 0.000037 0.006705 0.009545 0.019436 0.003096
71 1 2 3 fertilisant right Cu 5702120 486488 48.954573 272.0 ... 0.892246 0.378598 0.493814 0.14670 0.003503 0.000037 0.005441 0.002298 0.015774 0.001461
72 1 2 4 temoin left B 5702129 486488 54.067095 398.0 ... 1.179087 0.194070 0.388499 0.13820 0.003503 0.000037 0.005431 0.014267 0.010846 0.001323
74 1 3 5 fertilisant left Cu 5702106 486458 6.064000 514.4 ... 0.667452 0.422956 0.478808 0.13950 0.003503 0.000037 0.004901 0.009242 0.014436 0.001913
76 1 3 6 temoin left B 5702112 486465 3.982000 394.8 ... 0.683467 0.300906 0.451658 0.12930 0.003503 0.000037 0.005345 0.007557 0.018702 0.002654
78 1 4 7 fertilisant left B 5702076 486499 28.709263 377.6 ... 0.832510 0.262589 0.511956 0.12840 0.003503 0.000037 0.007033 0.027094 0.017099 0.001989
81 1 4 8 temoin right Cu 5702081 486504 23.057676 354.4 ... 0.713145 0.319070 0.505159 0.10110 0.003503 0.001122 0.007330 0.024631 0.021298 0.001954
82 1 5 9 fertilisant left Cu 5702162 486505 12.440253 520.0 ... 0.936532 0.216790 0.453508 0.16250 0.003503 0.000037 0.004622 0.060574 0.020478 0.002338
84 1 5 10 temoin left B 5702160 486514 5.188000 243.6 ... 1.323548 0.316611 0.452370 0.19900 0.003503 0.000249 0.004267 0.041827 0.014546 0.001378

26 rows × 30 columns

Sélectionner et filtrer

Si l'approche implicite peut s'avérer simple pour rapidement sélectionner ou filtrer un tableau, elle risque de meer à des erreurs lorsqu'un tableau doit subit une sélection et un filtre. La fonction loc permet de gérer des sélections et des filtres.


In [34]:
chicoute.loc[chicoute.Ordre == 'A', ['Site', 'CodeTourbiere', 'Latitude_m', 'Longitude_m']]


Out[34]:
Site CodeTourbiere Latitude_m Longitude_m
ID
1 1 BEAU 5702454 490627
2 2 BEAU 5702452 490634
3 3 BEAU 5702461 490638
4 4 BEAU 5702453 490647
5 5 BEAU 5702445 490654

Comment effectuer un sommaire?

Inspecter un tableau fait partie des premières étapes d'un flux de travail. La méthode dtypes, pour data types permet d'obtenir le type de données pour chaque colonne. Une colonne dont on devrait s'attendre être un nombre réel (float64), mais importée sous le type object indique souvent une erreur dans le fichier csv, possiblement due à une cellule annotée, l'utilisation non systématique de la notation d'une cellule vide. Une colonne de type object peut apparaître sous forme d'int64, même si le ficheir csv ne contient pas d'erreur. C'est le cas, par exemple, d'un numéro de site, dont le chiffre ne constitue pas une métrique.


In [35]:
chicoute.dtypes


Out[35]:
CodeTourbiere                object
Ordre                        object
Site                          int64
Traitement                   object
DemiParcelle                 object
SousTraitement               object
Latitude_m                    int64
Longitude_m                   int64
Rendement_g.5m2             float64
TotalRamet_nombre.m2        float64
TotalVegetatif_nombre.m2    float64
TotalFloral_nombre.m2       float64
TotalMale_nombre.m2         float64
TotalFemelle_nombre.m2      float64
FemelleFruit_nombre.m2      float64
FemelleAvorte_nombre.m2     float64
SterileFleur_nombre.m2      float64
C_pourc                     float64
N_pourc                     float64
P_pourc                     float64
K_pourc                     float64
Ca_pourc                    float64
Mg_pourc                    float64
S_pourc                     float64
B_pourc                     float64
Cu_pourc                    float64
Zn_pourc                    float64
Mn_pourc                    float64
Fe_pourc                    float64
Al_pourc                    float64
dtype: object

Ajustons le type de la colonne Site pour qu'elle prenne le type category, qui restreint les valeurs d'une colonne à prendre une valeur parmi des niveaux prédéterminés.


In [68]:
chicoute['Site'] = chicoute['Site'].astype('category')

La méthode describre présente un sommaire des données en calculant certaines statistiques.


In [69]:
chicoute.describe()


Out[69]:
Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 TotalVegetatif_nombre.m2 TotalFloral_nombre.m2 TotalMale_nombre.m2 TotalFemelle_nombre.m2 FemelleFruit_nombre.m2 FemelleAvorte_nombre.m2 ... Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc Remplissage_pourc
count 9.000000e+01 90.000000 40.000000 90.000000 86.000000 86.000000 86.000000 86.000000 72.000000 86.000000 ... 90.000000 90.000000 90.000000 90.000000 90.000000 90.000000 90.000000 90.000000 90.000000 90.000000
mean 5.701840e+06 485295.544444 13.328513 251.255911 199.024515 52.075858 24.400232 27.527575 19.966321 8.494000 ... 0.388439 0.498014 0.134718 0.003091 0.000409 0.006662 0.033452 0.015149 0.002695 45.411253
std 1.915498e+03 6452.325843 21.557681 156.056608 139.126951 40.414169 26.865528 29.826415 23.786318 14.517165 ... 0.102243 0.084709 0.039346 0.000670 0.000642 0.002060 0.025192 0.005874 0.001326 1.633300
min 5.695688e+06 459873.000000 0.000000 40.743570 22.918258 4.800000 0.000000 2.546473 0.400000 0.000000 ... 0.194070 0.364834 0.070000 0.001820 0.000037 0.003267 0.002298 0.009132 0.000895 42.053644
25% 5.701868e+06 485927.000000 0.000000 122.700000 86.261777 22.918258 3.300000 10.339419 7.639419 1.273237 ... 0.323119 0.449411 0.110700 0.002563 0.000037 0.005493 0.012048 0.010907 0.001920 44.296943
50% 5.702129e+06 486500.000000 0.945000 212.915253 161.250522 43.000000 15.278839 17.188694 11.459129 3.073237 ... 0.374775 0.479202 0.130050 0.003181 0.000213 0.006320 0.027872 0.014254 0.002362 45.132274
75% 5.702537e+06 486544.750000 15.627912 347.800000 263.780138 69.521008 36.512656 31.957729 22.829565 10.139419 ... 0.435456 0.520374 0.144600 0.003503 0.000461 0.007194 0.050051 0.017271 0.003339 46.565744
max 5.706394e+06 491955.000000 72.435183 651.897122 580.595875 198.624905 104.405399 187.165775 157.881334 76.800000 ... 0.876606 0.861527 0.280900 0.004167 0.004249 0.016240 0.104450 0.052065 0.009334 48.910790

8 rows × 25 columns

Le sommaire ne présente que 24 des 33 colonnes. La raison est que l'argument include de describe prend par défaut la valeur ['float64'], soit une liste ne spécifiant que les colonnes contenant des nombres réels. On pourait forcer le sommaire à inclure tous les types de données, mais puisque les statistiques associées aux types de données sont différentes, il est préférable de les segmenter.


In [71]:
chicoute.describe(include=['object', 'category'])


Out[71]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Station
count 90 90 90 40 40 40 90
unique 12 20 20 2 2 3 3
top 2 C 1 fertilisant left Control B
freq 20 5 12 20 20 20 72

Les dimensions du tableau sont données par le descriptif .shape


In [39]:
chicoute.shape


Out[39]:
(90, 30)

Pourquoi certaines commandes ont des parenthèses, et d'autres pas? Les deux types de commandes découlent de l'instrance de l'objet, ici un DataFrame. Les commandes accompagnées de parenthèses appellent une action par une fonction. Celles qui n'en ont pas appelent un attribu, un élément descriptif.

Action. grenouille.saute()

Description. grenouille.couleur

pandas vous permet d'être plus spécifique sur les statistiques désirées. Supposons que vous désirez effectuer des calculs sur les concentrations en nutriment retrouvées dans les tissus foliaires.


In [40]:
chicoute[fol_cols].mean(axis=0)


Out[40]:
C_pourc     50.279111
N_pourc      2.199411
P_pourc      0.138896
K_pourc      0.888700
Ca_pourc     0.388439
Mg_pourc     0.498014
S_pourc      0.134718
B_pourc      0.003091
Cu_pourc     0.000409
Zn_pourc     0.006662
Mn_pourc     0.033452
Fe_pourc     0.015149
Al_pourc     0.002695
dtype: float64

Nous avons sélectionné les colonnes désirées dans le tableau chicoute, demander la moyenne, à travers les lignes, l'axe vertical 0 (axis=0).

De la même manière, nous pourrions calculer la somme des concentrations sur chaque ligne. Puisque ce sont des pourcentages, le reste des constituants foliaires occupent $100 - \Sigma ~ nutriments$. Cette valeur de remplissage peut être insérée comme une novuelle colonne.


In [41]:
chicoute['Remplissage_pourc'] = 100 - chicoute[fol_cols].sum(axis=1)
fol_cols_R = chicoute.columns[17:] # noms des colonnes de concentration foliaire, en ajoutant le remplissage
chicoute[fol_cols_R].mean(axis=0)


Out[41]:
C_pourc              50.279111
N_pourc               2.199411
P_pourc               0.138896
K_pourc               0.888700
Ca_pourc              0.388439
Mg_pourc              0.498014
S_pourc               0.134718
B_pourc               0.003091
Cu_pourc              0.000409
Zn_pourc              0.006662
Mn_pourc              0.033452
Fe_pourc              0.015149
Al_pourc              0.002695
Remplissage_pourc    45.411253
dtype: float64

Aggrégation

Avec describe ou des opérations plus spécifiques, vous obtenez des sommaires globaux. Si vous désirez plutôt stratifier vos sommaires selon des groupes, par exemple une moyenne par tourbières. Cette approche s'appelle l'aggrégation. La méthode groupby permet d'effectuer des calculs par groupe et sous-groupes.

Par exemple, calculons la médiane des pourcentages en nutrients pour chaque tourbière. Pour ce faire, nous avons besoin de l'information de regroupement, CodeTourbiere, ainsi que les données de concentration. L'objet fol_cols est de type Index, qui ne peut (à ma connaissance) être modifié à moins d'être préalablement transformé en liste Python.


In [42]:
loc_cols = list(fol_cols)
loc_cols.append('CodeTourbiere') # ou loc_cols = list(fol_cols) + ['CodeTourbiere']
loc_cols


Out[42]:
['C_pourc',
 'N_pourc',
 'P_pourc',
 'K_pourc',
 'Ca_pourc',
 'Mg_pourc',
 'S_pourc',
 'B_pourc',
 'Cu_pourc',
 'Zn_pourc',
 'Mn_pourc',
 'Fe_pourc',
 'Al_pourc',
 'CodeTourbiere']

Puis lançons la commande en chaîne:

  • loc pour isoler les colonnes dont nous avons besoin,
  • groupby pour regrouper les données selon la colonne spécifiée
  • median pour l'opération à effectuer sur ces groupes

In [43]:
chicoute.loc[:, loc_cols].groupby('CodeTourbiere').median()


Out[43]:
C_pourc N_pourc P_pourc K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
CodeTourbiere
1 51.075 2.2175 0.153478 0.867125 0.308759 0.460216 0.13160 0.003503 0.000037 0.005466 0.012821 0.016051 0.001916
2 49.345 2.7775 0.173205 1.185058 0.359672 0.471584 0.13305 0.004049 0.000567 0.006964 0.012331 0.010007 0.002224
BEAU 51.470 2.0390 0.098500 1.191574 0.373216 0.439383 0.09961 0.002578 0.000093 0.005497 0.072201 0.013455 0.001558
BP 51.240 2.1320 0.155964 0.754352 0.436820 0.511286 0.14370 0.002391 0.000037 0.005968 0.038321 0.012753 0.003590
BS2 52.180 1.8890 0.108064 1.085135 0.405428 0.458062 0.18790 0.002045 0.000037 0.006404 0.032914 0.013102 0.002481
MB 51.360 2.1100 0.114974 0.737710 0.435170 0.520310 0.12450 0.002965 0.000037 0.006448 0.046816 0.014382 0.001764
MR 50.820 1.9530 0.122603 0.906441 0.420845 0.456887 0.11450 0.001820 0.002127 0.005352 0.024742 0.018004 0.002492
NBM 52.040 2.0560 0.118178 0.824847 0.311635 0.434202 0.10400 0.002826 0.000037 0.004953 0.050373 0.013033 0.005911
NESP 48.170 1.7510 0.134419 0.850530 0.423396 0.591242 0.24890 0.002563 0.000523 0.006876 0.063370 0.021251 0.004145
NTP 51.560 1.8760 0.086949 0.397751 0.540665 0.555509 0.10920 0.003082 0.000308 0.007293 0.012224 0.015590 0.002030
SSP 49.110 1.8480 0.129730 0.686259 0.356937 0.467956 0.10090 0.002487 0.000293 0.005782 0.074914 0.011227 0.003347
WTP 47.780 1.7980 0.079926 0.556893 0.495880 0.705798 0.12480 0.003281 0.000197 0.011251 0.043264 0.017908 0.003433

Les groupes peuvent être classés en sous-groupes. De plus, une manière élégante de travailler avec les opérations en chaîne sur pandas est de segmenter les commandes en plusieurs lignes, avec la barre oblique inversée \ pour signaler que la ligne suivante est la suite de la ligne courrante.


In [44]:
chicoute.loc[:, list(fol_cols) + ['CodeTourbiere', 'Ordre']].\
    groupby(['CodeTourbiere', 'Ordre']).\
    count()


Out[44]:
C_pourc N_pourc P_pourc K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc
CodeTourbiere Ordre
1 1 4 4 4 4 4 4 4 4 4 4 4 4 4
2 4 4 4 4 4 4 4 4 4 4 4 4 4
3 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 4 4 4 4 4
5 4 4 4 4 4 4 4 4 4 4 4 4 4
2 10 4 4 4 4 4 4 4 4 4 4 4 4 4
6 4 4 4 4 4 4 4 4 4 4 4 4 4
7 4 4 4 4 4 4 4 4 4 4 4 4 4
8 4 4 4 4 4 4 4 4 4 4 4 4 4
9 4 4 4 4 4 4 4 4 4 4 4 4 4
BEAU A 5 5 5 5 5 5 5 5 5 5 5 5 5
BP H 5 5 5 5 5 5 5 5 5 5 5 5 5
BS2 G 5 5 5 5 5 5 5 5 5 5 5 5 5
MB C 5 5 5 5 5 5 5 5 5 5 5 5 5
MR I 5 5 5 5 5 5 5 5 5 5 5 5 5
NBM D 5 5 5 5 5 5 5 5 5 5 5 5 5
NESP J 5 5 5 5 5 5 5 5 5 5 5 5 5
NTP B 5 5 5 5 5 5 5 5 5 5 5 5 5
SSP F 5 5 5 5 5 5 5 5 5 5 5 5 5
WTP E 5 5 5 5 5 5 5 5 5 5 5 5 5

Comment tirer les données?

La méthode à utiliser est .sort_values(). Les arguments principaux que prennent cette méthode sont la colonne ou les colonnes sur lequelles baser le tri (by=) ainsi que l'ordre du tri (ascending=). Il est possible de spécifier un tri par colonne, mais le tri par ligne, avec l'argument par défaut axis=0, est généralement utilisé. La commande suivante effectue un tri descendant sur le rendement, puis ne conserve que les 10 premières lignes.


In [45]:
chicoute.sort_values(by='Rendement_g.5m2', ascending=False).head(10)


Out[45]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 ... Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc Remplissage_pourc
ID
67 1 1 1 fertilisant right Control 5702078 486544 72.435183 392.8 ... 0.330370 0.443625 0.10050 0.003503 0.000037 0.005567 0.013476 0.014564 0.001919 44.635034
66 1 1 1 fertilisant left B 5702078 486544 63.989625 484.4 ... 0.363668 0.404057 0.13850 0.003503 0.000037 0.005492 0.008877 0.010873 0.001382 43.482494
73 1 2 4 temoin right Control 5702129 486488 62.320034 450.0 ... 0.282503 0.518224 0.09399 0.003503 0.000037 0.006090 0.012166 0.021162 0.002493 44.276919
70 1 2 3 fertilisant left Control 5702120 486488 55.583192 328.0 ... 0.381351 0.407755 0.11340 0.003503 0.000037 0.003699 0.009081 0.009919 0.001050 43.430328
72 1 2 4 temoin left B 5702129 486488 54.067095 398.0 ... 0.194070 0.388499 0.13820 0.003503 0.000037 0.005431 0.014267 0.010846 0.001323 44.129301
71 1 2 3 fertilisant right Cu 5702120 486488 48.954573 272.0 ... 0.378598 0.493814 0.14670 0.003503 0.000037 0.005441 0.002298 0.015774 0.001461 43.183257
79 1 4 7 fertilisant right Control 5702076 486499 34.640063 554.8 ... 0.283974 0.463906 0.10010 0.003503 0.000037 0.006465 0.038320 0.016327 0.001924 46.570094
78 1 4 7 fertilisant left B 5702076 486499 28.709263 377.6 ... 0.262589 0.511956 0.12840 0.003503 0.000037 0.007033 0.027094 0.017099 0.001989 45.963264
81 1 4 8 temoin right Cu 5702081 486504 23.057676 354.4 ... 0.319070 0.505159 0.10110 0.003503 0.001122 0.007330 0.024631 0.021298 0.001954 46.909145
80 1 4 8 temoin left Control 5702081 486504 21.109928 327.6 ... 0.291566 0.450817 0.09706 0.003503 0.000230 0.005405 0.023804 0.012290 0.001416 46.006664

10 rows × 31 columns

Effectuer des calculs sur un tableau avec apply

Si vous êtes familiers avec Excel, vous avez probablement déjà effectué des calculs par ligne ou par colonne autres que des sommes ou des moyennes. Les méthodes df.sum(axis=0) ou df.mean(axis=1) sont des cas particuliers de la méthode apply, dont la fonction à exécuter est spécifiée dans l'argument func.


In [46]:
chicoute.loc[:, ['N_pourc', 'P_pourc', 'K_pourc']].mean(axis=0)


Out[46]:
N_pourc    2.199411
P_pourc    0.138896
K_pourc    0.888700
dtype: float64

In [47]:
chicoute.loc[:, ['N_pourc', 'P_pourc', 'K_pourc']].apply(func=np.mean, axis=0)


Out[47]:
N_pourc    2.199411
P_pourc    0.138896
K_pourc    0.888700
dtype: float64

Pourquoi utiliser apply? Pour appliquer des fonctions plus complexe. Ces fonctions peuvent être créées avec def, ou spéficiées en un seule ligne avec lambda. Par exemple, si vous cherchez à calculer la distance à vol d'oiseau entre chacune des mesures et une station météo située aux coordonnées [5702453, 490640], vous pourrez définir une fonction de Pythagore.


In [48]:
def dist_station(observation, station=[5702453, 490640]):
    return np.sqrt((observation[0]-station[0])**2 + (observation[1]-station[1])**2)

In [49]:
chicoute.loc[0:5, ['Latitude_m', 'Longitude_m']].apply(func=dist_station, axis=1)


Out[49]:
ID
1    13.038405
2     6.082763
3     8.246211
4     7.000000
5    16.124515
dtype: float64

Ou, plus simplement, définir une fonction lambda.


In [50]:
chicoute.loc[0:5, ['Latitude_m', 'Longitude_m']].\
    apply(func=lambda x: np.sqrt((x[0]-5702453)**2 + (x[1]-490640)**2),
          axis=1)


Out[50]:
ID
1    13.038405
2     6.082763
3     8.246211
4     7.000000
5    16.124515
dtype: float64

Des opération de type apply peuvent aussi être effectuées sur des matrices avec numpy, en utulisant la fonction numpy.apply_along_axis.


In [51]:
coord = chicoute.loc[0:5, ['Latitude_m', 'Longitude_m']].as_matrix()
coord


Out[51]:
array([[5702454,  490627],
       [5702452,  490634],
       [5702461,  490638],
       [5702453,  490647],
       [5702445,  490654]])

In [52]:
np.apply_along_axis(func1d=lambda x: np.sqrt((x[0]-5702453)**2 + (x[1]-490640)**2), axis=1, arr=coord)


Out[52]:
array([ 13.03840481,   6.08276253,   8.24621125,   7.        ,  16.1245155 ])

Tableau large - tableau long

Le tableau de la chicouté est formatté correctement selon les règles établies précédemment. Ce n'est pas toujours le cas. Reprenons l'exemple des traitements appliqués sur différents site, évoqué précement dans ce carnet.


In [53]:
experience = pd.DataFrame({'Site': ['Sainte-Zéphirine', 'Sainte-Aurélie', 'Saint-Serge-Étienne'],
                           'Traitement A': [4.1, 5.8, 2.9], 'Traitement B': [8.2, 5.9, 3.4],
                           'Traitement C': [6.8, np.NaN, 4.6]})
experience


Out[53]:
Site Traitement A Traitement B Traitement C
0 Sainte-Zéphirine 4.1 8.2 6.8
1 Sainte-Aurélie 5.8 5.9 NaN
2 Saint-Serge-Étienne 2.9 3.4 4.6

Pour transformer ce tableau en mode tidy (organisé), utilisons la méthode .merge(). Cette méthde prend, comme argument id_var, les colonnes qui ne doivent pas être fusionnées. Dans ce cas-ci, les sites.


In [54]:
experience_tidy = experience.melt(id_vars='Site')
experience_tidy


Out[54]:
Site variable value
0 Sainte-Zéphirine Traitement A 4.1
1 Sainte-Aurélie Traitement A 5.8
2 Saint-Serge-Étienne Traitement A 2.9
3 Sainte-Zéphirine Traitement B 8.2
4 Sainte-Aurélie Traitement B 5.9
5 Saint-Serge-Étienne Traitement B 3.4
6 Sainte-Zéphirine Traitement C 6.8
7 Sainte-Aurélie Traitement C NaN
8 Saint-Serge-Étienne Traitement C 4.6

La méthode .rename() permet de renommer les indices et les colonnes. Dans notre cas, nous allons renommer les colonnes variable et value. J'en profite pour introduire l'argument inplace, qui peut être évoqué pour de nombreuses méthodes dans pandas. Spécifier inplace=True signifie que les changements doivent être apportés au tableau. Par défaut inplace=False, de sorte que tableau.methode(..., inplace=True) est équivalent à tableau = tableau.methode(...).


In [55]:
experience_tidy.rename(columns={'variable': 'Traitement', 'value':'Rendement'}, inplace=True)
experience_tidy


Out[55]:
Site Traitement Rendement
0 Sainte-Zéphirine Traitement A 4.1
1 Sainte-Aurélie Traitement A 5.8
2 Saint-Serge-Étienne Traitement A 2.9
3 Sainte-Zéphirine Traitement B 8.2
4 Sainte-Aurélie Traitement B 5.9
5 Saint-Serge-Étienne Traitement B 3.4
6 Sainte-Zéphirine Traitement C 6.8
7 Sainte-Aurélie Traitement C NaN
8 Saint-Serge-Étienne Traitement C 4.6

L'opération inverse avec la méthode .pivot().


In [56]:
experience_tidy.pivot(index='Site', columns='Traitement', values='Rendement')


Out[56]:
Traitement Traitement A Traitement B Traitement C
Site
Saint-Serge-Étienne 2.9 3.4 4.6
Sainte-Aurélie 5.8 5.9 NaN
Sainte-Zéphirine 4.1 8.2 6.8

Des opérations de formatage plus complexes sont présentés dans la documentation de pandas.

Comment combiner des tableaux?

Nous avons introduit plus haut la notion de base de données. Nous voudrions peut-être utiliser le code des tourbières pour inclure leur nom, le type d'essai mené à ces tourbières, etc. Importons d'abord le tableau des noms liés aux codes.


In [57]:
tourbieres = pd.read_csv('data/tourbieres.csv', sep=';')
tourbieres


Out[57]:
Tourbiere CodeTourbiere Type TypeCulture
0 Beaulieu BEAU calibration naturel
1 Brador Path BP calibration naturel
2 Lichen (BS2E) 2 validation cultive sec
3 Mannys Brook MB calibration naturel
4 Middle Bay Road MR calibration naturel
5 North Est of Smelt Pond NESP calibration naturel
6 North of Blue Moon NBM calibration naturel
7 South of Smelt Pond SSP calibration naturel
8 Sphaigne (BS2F) BS2 validation cultive sec
9 Sphaigne (BS2F) 1 calibration naturel
10 West of Trout Pond WTP calibration naturel

Notre information est organisée en deux tableaux, liés par la colonne CodeTourbiere. Comment fusionner l'information pour qu'elle puisse être utilisée dans son ensemble? La fonction pandas.merge effectue cette opération typique avec les bases de données.


In [58]:
chicoute_merge = pd.merge(left=chicoute, right=tourbieres, on='CodeTourbiere')
chicoute_merge.loc[1:5, list(chicoute.columns[0:10]) + list(tourbieres.columns)]


Out[58]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 Tourbiere CodeTourbiere Type TypeCulture
1 BEAU A 2 NaN NaN NaN 5702452 490634 NaN 460.911637 Beaulieu BEAU calibration naturel
2 BEAU A 3 NaN NaN NaN 5702461 490638 NaN 651.897122 Beaulieu BEAU calibration naturel
3 BEAU A 4 NaN NaN NaN 5702453 490647 NaN 590.781767 Beaulieu BEAU calibration naturel
4 BEAU A 5 NaN NaN NaN 5702445 490654 NaN 564.043799 Beaulieu BEAU calibration naturel
5 BP H 1 NaN NaN NaN 5706394 484865 NaN 207.537560 Brador Path BP calibration naturel

Notez que j'ai voulu restreindre le nombre de colonne à afficher. Je m'y suis pris en combinant des noms de colonne en les additionnant sous forme de listes.

Nous pourrions procéder de la même manière pour fusionner des données climatiques. Le tableau chicoute ne possède pas d'indicateurs climatiques, mais il est possible de les soutirer de stations météos placées près des site. Ces données ne sont pas disponibles pour le tableau de la chicouté, alors j'utiliserai des données fictives pour l'exemple.

Voici ce qui pourrait être fait.

  1. Créer un tableau des stations météo ainsi que des indices météo associés à ces stations.
  2. Lier chaque site à une station (à la main où selon la plus petite distance entre le site et la station).
  3. Fusionner les inices climatiques aux sites, puis les sites aux mesures de rendement.

Ces opérations demandent habituellement du tâtonnement. Il serait surprenant que même une personne expérimentée soit en mesure de compiler ces opérations sans obtenir de message d'erreur, et retravailler jusqu'à obtenir le résultat souhaité. L'objectif de cette section est de vous présenté un flux de travail que vous pourriez être amenés à effectuer et de fournir quelques éléments nouveau pour mener à bien une opération. Il peut être frustant de ne pas saisir toutes les opérations: passez à travers cette section sans jugement. Si vous devez vous frotter à problème semblable, vous saurez que vous trouverez dans ce manuel une recette intéressante.

Créer le tableau des stations

Le tableau pourrait être monté avec un tableur (Excel), mais pour l'exemple, je vais le créer directement dans l'environnement de travail.


In [59]:
stations = pd.DataFrame({'Station': ['A', 'B', 'C'], 'Latitude_m': [5702453, 5701870, 5696421], 'Longitude_m': [490640, 484870, 485929], 't_moy_C': [13.8, 18.2, 16.3], 'prec_tot_mm': [687, 714, 732]})
stations


Out[59]:
Latitude_m Longitude_m Station prec_tot_mm t_moy_C
0 5702453 490640 A 687 13.8
1 5701870 484870 B 714 18.2
2 5696421 485929 C 732 16.3

Calculer les distances

Créons d'abord une fonction pour calculer les distances entre deux points en deux dimensions.


In [60]:
def eucldist(A, B):
    dist = np.sqrt((A[0] - B[0])**2 + (A[1] - B[1])**2)
    return(dist)

La fonction eucldist demande deux arguments. A correspondra au point du site, tandis que B correspondra au point de la station. Dans la fonction, les arguments sont décortiqués en [0] et [1]. Il faut donc que A et B soient des listes ou des vecteurs numpy. La méthode apply décortiquera les lignes du tableau principal de cette manière. Toutefois, il faudra s'assurer que les stations soient aussi des vecteurs. Après tâtonnement, on y arrivera ainsi.


In [61]:
stationA = stations.loc[stations.Station == 'A', ['Latitude_m', 'Longitude_m']].values[0, :]
stationB = stations.loc[stations.Station == 'B', ['Latitude_m', 'Longitude_m']].values[0, :]
stationC = stations.loc[stations.Station == 'C', ['Latitude_m', 'Longitude_m']].values[0, :]

Créons un nouveau tableau qui hébergera les données des distances entre chaque point. Ces distances sont calculés grâce à la méthode apply.


In [62]:
distances_stations = pd.DataFrame()
distances_stations['distA'] = chicoute.loc[:, ['Latitude_m', 'Longitude_m']].\
    apply(lambda x: eucldist(A=x, B=stationA), axis=1)
distances_stations['distB'] = chicoute.loc[:, ['Latitude_m', 'Longitude_m']].\
    apply(lambda x: eucldist(A=x, B=stationB), axis=1)
distances_stations['distC'] = chicoute.loc[:, ['Latitude_m', 'Longitude_m']].\
    apply(lambda x: eucldist(A=x, B=stationC), axis=1)

Identifier la station la plus proche

Dans le tableau de distance que nous venons de créer, ajoutons au tableau principal une colonne vide qui incluera le nom de la station correspondant à la plus faible distance. Ensuite, déterminons la distance la plus faible parmi les trois colonnes.


In [63]:
chicoute['Station'] = np.nan
distance_minimum = distances_stations.min(axis=1)

Les lignes du tableau de distance où la colonne distA est égale à la distance minimum sont gardée, et on sélectionn la colonne vide. Ces cellules correspondent aux endroits où la station A est la plus proche et prendrons la valeur A. Idem our B et C.


In [64]:
chicoute.loc[distances_stations.distA == distance_minimum, 'Station'] = 'A'
chicoute.loc[distances_stations.distB == distance_minimum, 'Station'] = 'B'
chicoute.loc[distances_stations.distC == distance_minimum, 'Station'] = 'C'

Nous obtenons une Series incluant les stations les plus proches, dont nous soutirons le vecteur avec la méthode .values.


In [65]:
chicoute.Station.values


Out[65]:
array(['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'A', 'A',
       'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B',
       'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'], dtype=object)

Fusionner les indices climatiques au tableau principal

La méthode merge permet d'effectuer des opérations entre les tableaux comme entre des bases de données. Fusionnons avec merge le tableau principal aux indices climatiques selon la colonne Station.


In [66]:
chicoute.merge(stations[['Station', 't_moy_C', 'prec_tot_mm']], on='Station')


Out[66]:
CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 ... B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc Remplissage_pourc Station t_moy_C prec_tot_mm
0 BEAU A 1 NaN NaN NaN 5702454 490627 NaN 453.272218 ... 0.002578 0.000175 0.004698 0.100602 0.013281 0.001558 44.357013 A 13.8 687
1 BEAU A 2 NaN NaN NaN 5702452 490634 NaN 460.911637 ... 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890 44.232327 A 13.8 687
2 BEAU A 3 NaN NaN NaN 5702461 490638 NaN 651.897122 ... 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602 45.211436 A 13.8 687
3 BEAU A 4 NaN NaN NaN 5702453 490647 NaN 590.781767 ... 0.002578 0.000093 0.005497 0.031042 0.013455 0.000895 44.155473 A 13.8 687
4 BEAU A 5 NaN NaN NaN 5702445 490654 NaN 564.043799 ... 0.002578 0.000037 0.005101 0.034550 0.012011 0.001021 42.103293 A 13.8 687
5 MB C 1 NaN NaN NaN 5699342 491931 NaN 218.996690 ... 0.002965 0.000037 0.006226 0.046816 0.014761 0.002658 44.557328 A 13.8 687
6 MB C 2 NaN NaN NaN 5699337 491935 NaN 282.658518 ... 0.002965 0.000037 0.009344 0.043878 0.016786 0.003315 45.296496 A 13.8 687
7 MB C 3 NaN NaN NaN 5699330 491947 NaN 291.571174 ... 0.002965 0.000460 0.006103 0.036144 0.014382 0.001764 44.692892 A 13.8 687
8 MB C 4 NaN NaN NaN 5699332 491955 NaN 235.548765 ... 0.002965 0.000037 0.006448 0.080084 0.013639 0.001466 43.837998 A 13.8 687
9 MB C 5 NaN NaN NaN 5699362 491949 NaN 243.188184 ... 0.002965 0.000037 0.006787 0.049085 0.014126 0.001513 43.352899 A 13.8 687
10 NTP B 1 NaN NaN NaN 5704088 487575 NaN 501.655208 ... 0.003082 0.000329 0.006927 0.012224 0.015056 0.001925 46.183463 A 13.8 687
11 NTP B 2 NaN NaN NaN 5704093 487572 NaN 588.235294 ... 0.003082 0.000306 0.007293 0.013821 0.015590 0.002030 44.603618 A 13.8 687
12 NTP B 3 NaN NaN NaN 5704093 487562 NaN 468.551057 ... 0.003082 0.000339 0.006236 0.010778 0.015551 0.002018 44.480395 A 13.8 687
13 BP H 1 NaN NaN NaN 5706394 484865 NaN 207.537560 ... 0.002391 0.000037 0.004973 0.050759 0.018834 0.003329 44.463967 B 18.2 714
14 BP H 2 NaN NaN NaN 5706307 484054 NaN 189.712249 ... 0.002391 0.000122 0.005520 0.052750 0.012753 0.003738 44.374737 B 18.2 714
15 BP H 3 NaN NaN NaN 5702280 484742 NaN 213.903743 ... 0.002391 0.000037 0.005968 0.038321 0.017019 0.003944 44.890092 B 18.2 714
16 BP H 4 NaN NaN NaN 5706324 484761 NaN 211.357270 ... 0.002391 0.000037 0.006813 0.028302 0.012288 0.003590 44.937054 B 18.2 714
17 BP H 5 NaN NaN NaN 5706364 484780 NaN 201.171378 ... 0.002391 0.000037 0.006185 0.035728 0.011836 0.003466 44.832258 B 18.2 714
18 2 6 11 fertilisant left Control 5702582 486522 0.000000 66.400000 ... 0.004164 0.000111 0.009994 0.026289 0.010000 0.001382 43.588771 B 18.2 714
19 2 6 11 fertilisant right Cu 5702582 486522 0.000000 98.000000 ... 0.004167 0.001177 0.009641 0.013245 0.010170 0.002334 44.520830 B 18.2 714
20 2 6 12 temoin left Control 5702562 486538 0.000000 156.800000 ... 0.003321 0.000986 0.008257 0.013331 0.011007 0.002797 44.564626 B 18.2 714
21 2 6 12 temoin right B 5702562 486538 0.000000 112.800000 ... 0.003934 0.000671 0.007467 0.010920 0.010387 0.004158 44.208250 B 18.2 714
22 2 7 13 fertilisant left Control 5702643 486498 0.000000 152.400000 ... 0.003321 0.000252 0.006911 0.004139 0.009132 0.001963 44.554386 B 18.2 714
23 2 7 13 fertilisant right B 5702643 486498 0.000000 164.800000 ... 0.003934 0.000287 0.007290 0.004868 0.009565 0.001844 45.145524 B 18.2 714
24 2 7 14 temoin left Cu 5702627 486501 0.000000 158.800000 ... 0.004167 0.000387 0.010543 0.048363 0.009650 0.002705 45.657380 B 18.2 714
25 2 7 14 temoin right Control 5702627 486501 0.380000 78.400000 ... 0.004164 0.000686 0.011481 0.054341 0.017370 0.003759 44.969252 B 18.2 714
26 2 8 15 fertilisant left B 5702537 486517 0.000000 272.800000 ... 0.003934 0.000811 0.006169 0.008995 0.009935 0.002522 45.594668 B 18.2 714
27 2 8 15 fertilisant right Control 5702537 486517 0.574000 208.800000 ... 0.003321 0.000963 0.006804 0.011416 0.009984 0.002107 48.106806 B 18.2 714
28 2 8 16 temoin left Control 5702537 486524 0.000000 219.200000 ... 0.004164 0.000682 0.007339 0.014088 0.009923 0.002540 45.298276 B 18.2 714
29 2 8 16 temoin right Cu 5702537 486524 0.000000 177.600000 ... 0.004167 0.000869 0.006610 0.010440 0.009338 0.001999 45.378242 B 18.2 714
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
60 1 1 1 fertilisant left B 5702078 486544 63.989625 484.400000 ... 0.003503 0.000037 0.005492 0.008877 0.010873 0.001382 43.482494 B 18.2 714
61 1 1 1 fertilisant right Control 5702078 486544 72.435183 392.800000 ... 0.003503 0.000037 0.005567 0.013476 0.014564 0.001919 44.635034 B 18.2 714
62 1 1 2 temoin left Control 5702099 486528 6.418000 213.200000 ... 0.003503 0.000037 0.005536 0.008103 0.010448 0.001573 43.994063 B 18.2 714
63 1 1 2 temoin right Cu 5702099 486528 8.696253 200.000000 ... 0.003503 0.000037 0.006705 0.009545 0.019436 0.003096 44.357527 B 18.2 714
64 1 2 3 fertilisant left Control 5702120 486488 55.583192 328.000000 ... 0.003503 0.000037 0.003699 0.009081 0.009919 0.001050 43.430328 B 18.2 714
65 1 2 3 fertilisant right Cu 5702120 486488 48.954573 272.000000 ... 0.003503 0.000037 0.005441 0.002298 0.015774 0.001461 43.183257 B 18.2 714
66 1 2 4 temoin left B 5702129 486488 54.067095 398.000000 ... 0.003503 0.000037 0.005431 0.014267 0.010846 0.001323 44.129301 B 18.2 714
67 1 2 4 temoin right Control 5702129 486488 62.320034 450.000000 ... 0.003503 0.000037 0.006090 0.012166 0.021162 0.002493 44.276919 B 18.2 714
68 1 3 5 fertilisant left Cu 5702106 486458 6.064000 514.400000 ... 0.003503 0.000037 0.004901 0.009242 0.014436 0.001913 43.858841 B 18.2 714
69 1 3 5 fertilisant right Control 5702106 486458 1.316000 574.000000 ... 0.003503 0.000037 0.007214 0.008552 0.017693 0.002330 43.573891 B 18.2 714
70 1 3 6 temoin left B 5702112 486465 3.982000 394.800000 ... 0.003503 0.000037 0.005345 0.007557 0.018702 0.002654 44.643497 B 18.2 714
71 1 3 6 temoin right Control 5702112 486465 2.914000 233.600000 ... 0.003503 0.000037 0.004695 0.007481 0.014568 0.001755 45.095307 B 18.2 714
72 1 4 7 fertilisant left B 5702076 486499 28.709263 377.600000 ... 0.003503 0.000037 0.007033 0.027094 0.017099 0.001989 45.963264 B 18.2 714
73 1 4 7 fertilisant right Control 5702076 486499 34.640063 554.800000 ... 0.003503 0.000037 0.006465 0.038320 0.016327 0.001924 46.570094 B 18.2 714
74 1 4 8 temoin left Control 5702081 486504 21.109928 327.600000 ... 0.003503 0.000230 0.005405 0.023804 0.012290 0.001416 46.006664 B 18.2 714
75 1 4 8 temoin right Cu 5702081 486504 23.057676 354.400000 ... 0.003503 0.001122 0.007330 0.024631 0.021298 0.001954 46.909145 B 18.2 714
76 1 5 9 fertilisant left Cu 5702162 486505 12.440253 520.000000 ... 0.003503 0.000037 0.004622 0.060574 0.020478 0.002338 46.767782 B 18.2 714
77 1 5 9 fertilisant right Control 5702162 486505 13.800573 328.000000 ... 0.003503 0.000037 0.004762 0.062190 0.023085 0.001993 46.717884 B 18.2 714
78 1 5 10 temoin left B 5702160 486514 5.188000 243.600000 ... 0.003503 0.000249 0.004267 0.041827 0.014546 0.001378 46.368081 B 18.2 714
79 1 5 10 temoin right Control 5702160 486514 6.500800 361.600000 ... 0.003503 0.000104 0.005507 0.052785 0.017224 0.001214 46.518977 B 18.2 714
80 WTP E 1 NaN NaN NaN 5700788 487075 NaN 224.089636 ... 0.003281 0.000197 0.011251 0.053950 0.017908 0.003433 47.688686 B 18.2 714
81 WTP E 2 NaN NaN NaN 5700776 487064 NaN 170.613700 ... 0.003281 0.000193 0.013833 0.029145 0.021284 0.003435 48.279739 B 18.2 714
82 WTP E 3 NaN NaN NaN 5700775 487060 NaN 154.061625 ... 0.003281 0.000341 0.016240 0.051262 0.017994 0.004484 48.894662 B 18.2 714
83 WTP E 4 NaN NaN NaN 5700770 487058 NaN 243.188184 ... 0.003281 0.000341 0.010384 0.043264 0.016663 0.003306 48.509453 B 18.2 714
84 WTP E 5 NaN NaN NaN 5700750 487053 NaN 252.100840 ... 0.003281 0.000170 0.010213 0.020153 0.016024 0.002637 48.407032 B 18.2 714
85 NBM D 1 NaN NaN NaN 5695688 485975 NaN 319.582378 ... 0.002826 0.000037 0.003859 0.066277 0.025958 0.009334 46.667518 C 16.3 732
86 NBM D 2 NaN NaN NaN 5696590 485972 NaN 379.424497 ... 0.002826 0.000037 0.004506 0.034232 0.021318 0.007816 43.435948 C 16.3 732
87 NBM D 3 NaN NaN NaN 5696607 485912 NaN 250.827604 ... 0.002826 0.000110 0.006681 0.027443 0.012210 0.004050 43.649964 C 16.3 732
88 NBM D 4 NaN NaN NaN 5696611 485903 NaN 210.084034 ... 0.002826 0.000037 0.004953 0.050373 0.012132 0.005911 43.728148 C 16.3 732
89 NBM D 5 NaN NaN NaN 5696612 485884 NaN 160.427807 ... 0.002826 0.000037 0.006561 0.080889 0.013033 0.003784 44.430138 C 16.3 732

90 rows × 34 columns

Aller plus loin

Pour terminer cette section, en voici des bibliothèques liées à pandas qui méritent une attention particulière.

pandas-profiling

La fonction describe fournit plusieurs renseignements utiles pour apprécier un tableau. pandas-profiling va un pas plus loin en fournissant un rapport détaillé d'un tableau. Pour l'installer, conda install pandas-profiling.


In [67]:
import pandas_profiling as pdp
%matplotlib inline
pdp.ProfileReport(chicoute)


/home/essicolo/bin/anaconda3/lib/python3.5/site-packages/pandas_profiling/base.py:133: MatplotlibDeprecationWarning: The set_axis_bgcolor function was deprecated in version 2.0. Use set_facecolor instead.
  plot.set_axis_bgcolor("w")
/home/essicolo/bin/anaconda3/lib/python3.5/site-packages/pandas_profiling/base.py:133: MatplotlibDeprecationWarning: The set_axis_bgcolor function was deprecated in version 2.0. Use set_facecolor instead.
  plot.set_axis_bgcolor("w")
/home/essicolo/bin/anaconda3/lib/python3.5/site-packages/pandas_profiling/base.py:133: MatplotlibDeprecationWarning: The set_axis_bgcolor function was deprecated in version 2.0. Use set_facecolor instead.
  plot.set_axis_bgcolor("w")
/home/essicolo/bin/anaconda3/lib/python3.5/site-packages/pandas_profiling/base.py:133: MatplotlibDeprecationWarning: The set_axis_bgcolor function was deprecated in version 2.0. Use set_facecolor instead.
  plot.set_axis_bgcolor("w")
Out[67]:

Overview

Dataset info

Number of variables 33
Number of observations 90
Total Missing (%) 7.4%
Total size in memory 23.3 KiB
Average record size in memory 264.9 B

Variables types

Numeric 25
Categorical 6
Date 0
Text (Unique) 0
Rejected 2

Warnings

  • DemiParcelle has 50 / 55.6% missing values Missing
  • FemelleAvorte_nombre.m2 has 4 / 4.4% missing values Missing
  • FemelleAvorte_nombre.m2 has 17 / 18.9% zeros
  • FemelleFruit_nombre.m2 is highly correlated with TotalFemelle_nombre.m2 (ρ = 0.90868) Rejected
  • Rendement_g.5m2 has 50 / 55.6% missing values Missing
  • Rendement_g.5m2 has 18 / 20.0% zeros
  • SousTraitement has 50 / 55.6% missing values Missing
  • SterileFleur_nombre.m2 has 4 / 4.4% missing values Missing
  • SterileFleur_nombre.m2 has 72 / 80.0% zeros
  • TotalFemelle_nombre.m2 has 4 / 4.4% missing values Missing
  • TotalFloral_nombre.m2 has 4 / 4.4% missing values Missing
  • TotalMale_nombre.m2 has 4 / 4.4% missing values Missing
  • TotalMale_nombre.m2 has 11 / 12.2% zeros
  • TotalVegetatif_nombre.m2 is highly correlated with TotalRamet_nombre.m2 (ρ = 0.9721) Rejected
  • Traitement has 50 / 55.6% missing values Missing

Variables

Al_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.002695
Minimum 0.00089534
Maximum 0.0093337
Zeros (%) 0.0%

Quantile statistics

Minimum 0.00089534
5-th percentile 0.0013478
Q1 0.0019199
Median 0.0023617
Q3 0.0033389
95-th percentile 0.0045182
Maximum 0.0093337
Range 0.0084384
Interquartile range 0.001419

Descriptive statistics

Standard deviation 0.0013255
Coef of variation 0.49185
Kurtosis 8.0771
Mean 0.002695
MAD 0.00093982
Skewness 2.2467
Sum 0.24255
Variance 1.757e-06
Memory size 800.0 B
Value Count Frequency (%)  
0.0016017086 1 1.1%
 
0.0041447006 1 1.1%
 
0.0020672805 1 1.1%
 
0.0026369616 1 1.1%
 
0.0021071254 1 1.1%
 
0.0035897835 1 1.1%
 
0.0033286327 1 1.1%
 
0.0010497082 1 1.1%
 
0.0014664813 1 1.1%
 
0.0020388508 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.0008953445 1 1.1%
 
0.001020535 1 1.1%
 
0.0010497082 1 1.1%
 
0.0012144548 1 1.1%
 
0.0013229884 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.0045462902 1 1.1%
 
0.0045860022 1 1.1%
 
0.0059106446 1 1.1%
 
0.0078156527 1 1.1%
 
0.0093337163 1 1.1%
 

B_pourc
Numeric

Distinct count 15
Unique (%) 16.7%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.0030909
Minimum 0.0018196
Maximum 0.0041675
Zeros (%) 0.0%

Quantile statistics

Minimum 0.0018196
5-th percentile 0.0019211
Q1 0.002563
Median 0.0031813
Q3 0.0035031
95-th percentile 0.0041658
Maximum 0.0041675
Range 0.0023479
Interquartile range 0.00094007

Descriptive statistics

Standard deviation 0.00066964
Coef of variation 0.21665
Kurtosis -0.82433
Mean 0.0030909
MAD 0.00056235
Skewness -0.13064
Sum 0.27818
Variance 4.4841e-07
Memory size 800.0 B
Value Count Frequency (%)  
0.0035030881 20 22.2%
 
0.0028262019 5 5.6%
 
0.0024871044 5 5.6%
 
0.0030820253 5 5.6%
 
0.0020451986 5 5.6%
 
0.00416382 5 5.6%
 
0.0029649481 5 5.6%
 
0.0023906367 5 5.6%
 
0.0032805291 5 5.6%
 
0.0025630194 5 5.6%
 
Other values (5) 25 27.8%
 

Minimum 5 values

Value Count Frequency (%)  
0.0018196077 5 5.6%
 
0.0020451986 5 5.6%
 
0.0023906367 5 5.6%
 
0.0024871044 5 5.6%
 
0.0025630194 5 5.6%
 

Maximum 5 values

Value Count Frequency (%)  
0.00332109 5 5.6%
 
0.0035030881 20 22.2%
 
0.0039342 5 5.6%
 
0.00416382 5 5.6%
 
0.00416746 5 5.6%
 

C_pourc
Numeric

Distinct count 84
Unique (%) 93.3%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 50.279
Minimum 46.72
Maximum 53.83
Zeros (%) 0.0%

Quantile statistics

Minimum 46.72
5-th percentile 47.642
Q1 49.137
Median 50.455
Q3 51.575
95-th percentile 52.515
Maximum 53.83
Range 7.11
Interquartile range 2.4375

Descriptive statistics

Standard deviation 1.6123
Coef of variation 0.032066
Kurtosis -0.73368
Mean 50.279
MAD 1.3714
Skewness -0.18108
Sum 4525.1
Variance 2.5994
Memory size 800.0 B
Value Count Frequency (%)  
51.77 2 2.2%
 
49.66 2 2.2%
 
49.32 2 2.2%
 
51.47 2 2.2%
 
50.96 2 2.2%
 
49.22 2 2.2%
 
52.65 1 1.1%
 
48.14 1 1.1%
 
51.56 1 1.1%
 
51.78 1 1.1%
 
Other values (74) 74 82.2%
 

Minimum 5 values

Value Count Frequency (%)  
46.72 1 1.1%
 
47.11 1 1.1%
 
47.29 1 1.1%
 
47.35 1 1.1%
 
47.57 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
52.65 1 1.1%
 
52.95 1 1.1%
 
53.22 1 1.1%
 
53.34 1 1.1%
 
53.83 1 1.1%
 

Ca_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.38844
Minimum 0.19407
Maximum 0.87661
Zeros (%) 0.0%

Quantile statistics

Minimum 0.19407
5-th percentile 0.25076
Q1 0.32312
Median 0.37478
Q3 0.43546
95-th percentile 0.5482
Maximum 0.87661
Range 0.68254
Interquartile range 0.11234

Descriptive statistics

Standard deviation 0.10224
Coef of variation 0.26321
Kurtosis 4.8537
Mean 0.38844
MAD 0.075342
Skewness 1.3245
Sum 34.96
Variance 0.010454
Memory size 800.0 B
Value Count Frequency (%)  
0.4208446394 1 1.1%
 
0.4145650213 1 1.1%
 
0.4354812579 1 1.1%
 
0.3283183641 1 1.1%
 
0.4351700608 1 1.1%
 
0.3303698811 1 1.1%
 
0.5952349024 1 1.1%
 
0.4017386462 1 1.1%
 
0.4057028305 1 1.1%
 
0.4353816175 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.1940698421 1 1.1%
 
0.1970008285 1 1.1%
 
0.2044158506 1 1.1%
 
0.216790073 1 1.1%
 
0.241074193 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.554359659 1 1.1%
 
0.5656862118 1 1.1%
 
0.5952349024 1 1.1%
 
0.6127845096 1 1.1%
 
0.8766059703 1 1.1%
 

CodeTourbiere
Categorical

Distinct count 12
Unique (%) 13.3%
Missing (%) 0.0%
Missing (n) 0
2
20
1
20
NBM
 
5
Other values (9)
45
Value Count Frequency (%)  
2 20 22.2%
 
1 20 22.2%
 
NBM 5 5.6%
 
MB 5 5.6%
 
BEAU 5 5.6%
 
NESP 5 5.6%
 
WTP 5 5.6%
 
BS2 5 5.6%
 
BP 5 5.6%
 
NTP 5 5.6%
 
Other values (2) 10 11.1%
 

Cu_pourc
Numeric

Distinct count 56
Unique (%) 62.2%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.00040899
Minimum 3.7e-05
Maximum 0.0042487
Zeros (%) 0.0%

Quantile statistics

Minimum 3.7e-05
5-th percentile 3.7e-05
Q1 3.7e-05
Median 0.0002132
Q3 0.00046057
95-th percentile 0.0018352
Maximum 0.0042487
Range 0.0042117
Interquartile range 0.00042357

Descriptive statistics

Standard deviation 0.00064155
Coef of variation 1.5686
Kurtosis 15.153
Mean 0.00040899
MAD 0.00039237
Skewness 3.4203
Sum 0.036809
Variance 4.1159e-07
Memory size 800.0 B
Value Count Frequency (%)  
3.7e-05 35 38.9%
 
0.0021268252 1 1.1%
 
0.0001038792 1 1.1%
 
0.000252 1 1.1%
 
0.0007411705 1 1.1%
 
0.000249149 1 1.1%
 
0.000671 1 1.1%
 
0.0023329078 1 1.1%
 
0.000811 1 1.1%
 
0.000579 1 1.1%
 
Other values (46) 46 51.1%
 

Minimum 5 values

Value Count Frequency (%)  
3.7e-05 35 38.9%
 
9.29404170651e-05 1 1.1%
 
0.0001038792 1 1.1%
 
0.0001096762 1 1.1%
 
0.000111 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.0019114388 1 1.1%
 
0.0020709583 1 1.1%
 
0.0021268252 1 1.1%
 
0.0023329078 1 1.1%
 
0.0042487033 1 1.1%
 

DemiParcelle
Categorical

Distinct count 3
Unique (%) 7.5%
Missing (%) 55.6%
Missing (n) 50
left
20
right
20
(Missing)
50
Value Count Frequency (%)  
left 20 22.2%
 
right 20 22.2%
 
(Missing) 50 55.6%
 

Fe_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.015149
Minimum 0.0091325
Maximum 0.052065
Zeros (%) 0.0%

Quantile statistics

Minimum 0.0091325
5-th percentile 0.009713
Q1 0.010907
Median 0.014254
Q3 0.017271
95-th percentile 0.023267
Maximum 0.052065
Range 0.042932
Interquartile range 0.0063642

Descriptive statistics

Standard deviation 0.0058739
Coef of variation 0.38775
Kurtosis 16.572
Mean 0.015149
MAD 0.0039877
Skewness 3.0919
Sum 1.3634
Variance 3.4503e-05
Memory size 800.0 B
Value Count Frequency (%)  
0.01477312 1 1.1%
 
0.009919468 1 1.1%
 
0.0160243247 1 1.1%
 
0.0100002127 1 1.1%
 
0.0166347299 1 1.1%
 
0.0127528697 1 1.1%
 
0.0095652041 1 1.1%
 
0.0234167782 1 1.1%
 
0.014435678 1 1.1%
 
0.0112273786 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.0091324628 1 1.1%
 
0.0091907588 1 1.1%
 
0.0093378645 1 1.1%
 
0.0095652041 1 1.1%
 
0.0096498041 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.0234167782 1 1.1%
 
0.0258924795 1 1.1%
 
0.0259581945 1 1.1%
 
0.027685856 1 1.1%
 
0.0520646598 1 1.1%
 

FemelleAvorte_nombre.m2
Numeric

Distinct count 38
Unique (%) 44.2%
Missing (%) 4.4%
Missing (n) 4
Infinite (%) 0.0%
Infinite (n) 0
Mean 8.494
Minimum 0
Maximum 76.8
Zeros (%) 18.9%

Quantile statistics

Minimum 0
5-th percentile 0
Q1 1.2732
Median 3.0732
Q3 10.139
95-th percentile 34.6
Maximum 76.8
Range 76.8
Interquartile range 8.8662

Descriptive statistics

Standard deviation 14.517
Coef of variation 1.7091
Kurtosis 11.269
Mean 8.494
MAD 8.744
Skewness 3.207
Sum 730.48
Variance 210.75
Memory size 800.0 B
Value Count Frequency (%)  
0.0 17 18.9%
 
1.2732365674 9 10.0%
 
2.5464731347 8 8.9%
 
3.8197097021 4 4.4%
 
2.4 4 4.4%
 
3.6 3 3.3%
 
12.8 2 2.2%
 
10.1858925388 2 2.2%
 
2.0 2 2.2%
 
12.4 2 2.2%
 
Other values (27) 33 36.7%
 
(Missing) 4 4.4%
 

Minimum 5 values

Value Count Frequency (%)  
0.0 17 18.9%
 
0.8 1 1.1%
 
1.2 2 2.2%
 
1.2732365674 9 10.0%
 
2.0 2 2.2%
 

Maximum 5 values

Value Count Frequency (%)  
36.0 1 1.1%
 
41.6 1 1.1%
 
59.8421186656 1 1.1%
 
74.8 1 1.1%
 
76.8 1 1.1%
 

FemelleFruit_nombre.m2
Highly correlated

This variable is highly correlated with TotalFemelle_nombre.m2 and should be ignored for analysis

Correlation 0.90868

ID
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 45.5
Minimum 1
Maximum 90
Zeros (%) 0.0%

Quantile statistics

Minimum 1
5-th percentile 5.45
Q1 23.25
Median 45.5
Q3 67.75
95-th percentile 85.55
Maximum 90
Range 89
Interquartile range 44.5

Descriptive statistics

Standard deviation 26.125
Coef of variation 0.57417
Kurtosis -1.2
Mean 45.5
MAD 22.5
Skewness 0
Sum 4095
Variance 682.5
Memory size 800.0 B
Value Count Frequency (%)  
90 1 1.1%
 
23 1 1.1%
 
25 1 1.1%
 
26 1 1.1%
 
27 1 1.1%
 
28 1 1.1%
 
29 1 1.1%
 
30 1 1.1%
 
31 1 1.1%
 
32 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
1 1 1.1%
 
2 1 1.1%
 
3 1 1.1%
 
4 1 1.1%
 
5 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
86 1 1.1%
 
87 1 1.1%
 
88 1 1.1%
 
89 1 1.1%
 
90 1 1.1%
 

K_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.8887
Minimum 0.34508
Maximum 1.5408
Zeros (%) 0.0%

Quantile statistics

Minimum 0.34508
5-th percentile 0.45493
Q1 0.6887
Median 0.86045
Q3 1.1329
95-th percentile 1.276
Maximum 1.5408
Range 1.1957
Interquartile range 0.44423

Descriptive statistics

Standard deviation 0.26532
Coef of variation 0.29855
Kurtosis -0.73314
Mean 0.8887
MAD 0.22189
Skewness 0.035294
Sum 79.983
Variance 0.070396
Memory size 800.0 B
Value Count Frequency (%)  
0.9127261677 1 1.1%
 
0.7131451472 1 1.1%
 
0.6590328952 1 1.1%
 
0.7131133592 1 1.1%
 
0.9877968277 1 1.1%
 
0.7342204822 1 1.1%
 
0.8241397643 1 1.1%
 
0.4850660678 1 1.1%
 
1.0940762308 1 1.1%
 
0.9275278775 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.345079117 1 1.1%
 
0.3942781758 1 1.1%
 
0.3977509605 1 1.1%
 
0.4191285679 1 1.1%
 
0.4540803732 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
1.2811678597 1 1.1%
 
1.323548484 1 1.1%
 
1.3260069593 1 1.1%
 
1.3406919687 1 1.1%
 
1.5407682978 1 1.1%
 

Latitude_m
Numeric

Distinct count 68
Unique (%) 75.6%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 5701800
Minimum 5695688
Maximum 5706394
Zeros (%) 0.0%

Quantile statistics

Minimum 5695688
5-th percentile 5697800
Q1 5701900
Median 5702100
Q3 5702500
95-th percentile 5704100
Maximum 5706394
Range 10706
Interquartile range 668.5

Descriptive statistics

Standard deviation 1915.5
Coef of variation 0.00033594
Kurtosis 2.7103
Mean 5701800
MAD 1225.9
Skewness -0.81919
Sum 513165587
Variance 3669100
Memory size 800.0 B
Value Count Frequency (%)  
5702537 4 4.4%
 
5702582 2 2.2%
 
5702106 2 2.2%
 
5702081 2 2.2%
 
5702478 2 2.2%
 
5702162 2 2.2%
 
5702078 2 2.2%
 
5702160 2 2.2%
 
5702544 2 2.2%
 
5702494 2 2.2%
 
Other values (58) 68 75.6%
 

Minimum 5 values

Value Count Frequency (%)  
5695688 1 1.1%
 
5696590 1 1.1%
 
5696607 1 1.1%
 
5696611 1 1.1%
 
5696612 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
5704096 1 1.1%
 
5706307 1 1.1%
 
5706324 1 1.1%
 
5706364 1 1.1%
 
5706394 1 1.1%
 

Longitude_m
Numeric

Distinct count 67
Unique (%) 74.4%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 485300
Minimum 459873
Maximum 491955
Zeros (%) 0.0%

Quantile statistics

Minimum 459873
5-th percentile 470780
Q1 485930
Median 486500
Q3 486540
95-th percentile 491360
Maximum 491955
Range 32082
Interquartile range 617.75

Descriptive statistics

Standard deviation 6452.3
Coef of variation 0.013296
Kurtosis 11.445
Mean 485300
MAD 3035.6
Skewness -3.4062
Sum 43676599
Variance 41633000
Memory size 800.0 B
Value Count Frequency (%)  
486488 4 4.4%
 
486524 2 2.2%
 
486499 2 2.2%
 
486544 2 2.2%
 
486528 2 2.2%
 
484875 2 2.2%
 
486315 2 2.2%
 
484475 2 2.2%
 
486504 2 2.2%
 
486327 2 2.2%
 
Other values (57) 68 75.6%
 

Minimum 5 values

Value Count Frequency (%)  
459873 1 1.1%
 
459875 1 1.1%
 
459880 1 1.1%
 
459894 1 1.1%
 
459915 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
491931 1 1.1%
 
491935 1 1.1%
 
491947 1 1.1%
 
491949 1 1.1%
 
491955 1 1.1%
 

Mg_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.49801
Minimum 0.36483
Maximum 0.86153
Zeros (%) 0.0%

Quantile statistics

Minimum 0.36483
5-th percentile 0.4016
Q1 0.44941
Median 0.4792
Q3 0.52037
95-th percentile 0.63437
Maximum 0.86153
Range 0.49669
Interquartile range 0.070963

Descriptive statistics

Standard deviation 0.084709
Coef of variation 0.17009
Kurtosis 4.1909
Mean 0.49801
MAD 0.060375
Skewness 1.6808
Sum 44.821
Variance 0.0071755
Memory size 800.0 B
Value Count Frequency (%)  
0.4508169967 1 1.1%
 
0.8615272743 1 1.1%
 
0.4387117906 1 1.1%
 
0.4493769707 1 1.1%
 
0.5364940812 1 1.1%
 
0.4050778713 1 1.1%
 
0.407755463 1 1.1%
 
0.4565271624 1 1.1%
 
0.4892317822 1 1.1%
 
0.4696073994 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.3648335975 1 1.1%
 
0.376200956 1 1.1%
 
0.3878006262 1 1.1%
 
0.3884986262 1 1.1%
 
0.3995855729 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.6355072082 1 1.1%
 
0.7057982681 1 1.1%
 
0.7522138365 1 1.1%
 
0.7582657119 1 1.1%
 
0.8615272743 1 1.1%
 

Mn_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.033452
Minimum 0.0022983
Maximum 0.10445
Zeros (%) 0.0%

Quantile statistics

Minimum 0.0022983
5-th percentile 0.0060436
Q1 0.012048
Median 0.027872
Q3 0.050051
95-th percentile 0.080527
Maximum 0.10445
Range 0.10215
Interquartile range 0.038003

Descriptive statistics

Standard deviation 0.025192
Coef of variation 0.75307
Kurtosis 0.19821
Mean 0.033452
MAD 0.020709
Skewness 0.92074
Sum 3.0107
Variance 0.00063464
Memory size 800.0 B
Value Count Frequency (%)  
0.0345496366 1 1.1%
 
0.0749136882 1 1.1%
 
0.0048678083 1 1.1%
 
0.0107775262 1 1.1%
 
0.0464957624 1 1.1%
 
0.0085516798 1 1.1%
 
0.0086432132 1 1.1%
 
0.004139029 1 1.1%
 
0.0543410557 1 1.1%
 
0.0140836039 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.0022982672 1 1.1%
 
0.004139029 1 1.1%
 
0.004453329 1 1.1%
 
0.0048140077 1 1.1%
 
0.0048678083 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.0808891248 1 1.1%
 
0.0865360911 1 1.1%
 
0.1004573573 1 1.1%
 
0.1006017713 1 1.1%
 
0.1044499177 1 1.1%
 

N_pourc
Numeric

Distinct count 88
Unique (%) 97.8%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 2.1994
Minimum 1.532
Maximum 3.099
Zeros (%) 0.0%

Quantile statistics

Minimum 1.532
5-th percentile 1.6628
Q1 1.8925
Median 2.1195
Q3 2.5772
95-th percentile 2.8845
Maximum 3.099
Range 1.567
Interquartile range 0.68475

Descriptive statistics

Standard deviation 0.39551
Coef of variation 0.17982
Kurtosis -0.8711
Mean 2.1994
MAD 0.3299
Skewness 0.44461
Sum 197.95
Variance 0.15643
Memory size 800.0 B
Value Count Frequency (%)  
1.983 2 2.2%
 
2.698 2 2.2%
 
2.548 1 1.1%
 
2.415 1 1.1%
 
1.95 1 1.1%
 
2.35 1 1.1%
 
2.309 1 1.1%
 
1.903 1 1.1%
 
1.672 1 1.1%
 
2.609 1 1.1%
 
Other values (78) 78 86.7%
 

Minimum 5 values

Value Count Frequency (%)  
1.532 1 1.1%
 
1.595 1 1.1%
 
1.626 1 1.1%
 
1.656 1 1.1%
 
1.657 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
2.903 1 1.1%
 
2.906 1 1.1%
 
2.92 1 1.1%
 
2.969 1 1.1%
 
3.099 1 1.1%
 

Ordre
Categorical

Distinct count 20
Unique (%) 22.2%
Missing (%) 0.0%
Missing (n) 0
C
 
5
A
 
5
J
 
5
Other values (17)
75
Value Count Frequency (%)  
C 5 5.6%
 
A 5 5.6%
 
J 5 5.6%
 
F 5 5.6%
 
D 5 5.6%
 
E 5 5.6%
 
H 5 5.6%
 
B 5 5.6%
 
G 5 5.6%
 
I 5 5.6%
 
Other values (10) 40 44.4%
 

P_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.1389
Minimum 0.070767
Maximum 0.23337
Zeros (%) 0.0%

Quantile statistics

Minimum 0.070767
5-th percentile 0.078663
Q1 0.11549
Median 0.13859
Q3 0.1628
95-th percentile 0.20701
Maximum 0.23337
Range 0.1626
Interquartile range 0.047306

Descriptive statistics

Standard deviation 0.037356
Coef of variation 0.26895
Kurtosis -0.14336
Mean 0.1389
MAD 0.029371
Skewness 0.25324
Sum 12.501
Variance 0.0013954
Memory size 800.0 B
Value Count Frequency (%)  
0.1512261525 1 1.1%
 
0.2244189658 1 1.1%
 
0.1280693715 1 1.1%
 
0.0848354981 1 1.1%
 
0.1863188972 1 1.1%
 
0.1389777086 1 1.1%
 
0.1323822306 1 1.1%
 
0.1721720058 1 1.1%
 
0.1684976158 1 1.1%
 
0.1477856146 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.07076705 1 1.1%
 
0.0720981405 1 1.1%
 
0.0755592931 1 1.1%
 
0.0759938153 1 1.1%
 
0.0776292521 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.2074803732 1 1.1%
 
0.2130140699 1 1.1%
 
0.2244189658 1 1.1%
 
0.2262651637 1 1.1%
 
0.233370693 1 1.1%
 

Remplissage_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 45.411
Minimum 42.054
Maximum 48.911
Zeros (%) 0.0%

Quantile statistics

Minimum 42.054
5-th percentile 43.348
Q1 44.297
Median 45.132
Q3 46.566
95-th percentile 48.463
Maximum 48.911
Range 6.8571
Interquartile range 2.2688

Descriptive statistics

Standard deviation 1.6333
Coef of variation 0.035967
Kurtosis -0.47608
Mean 45.411
MAD 1.342
Skewness 0.35354
Sum 4087
Variance 2.6677
Memory size 800.0 B
Value Count Frequency (%)  
44.276919253 1 1.1%
 
42.2196202187 1 1.1%
 
43.7115489551 1 1.1%
 
44.6350343278 1 1.1%
 
46.7178835105 1 1.1%
 
46.5318106577 1 1.1%
 
45.2982758181 1 1.1%
 
43.7281482057 1 1.1%
 
48.106805802 1 1.1%
 
44.9370544737 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
42.0536435293 1 1.1%
 
42.1032933111 1 1.1%
 
42.2196202187 1 1.1%
 
43.1832574735 1 1.1%
 
43.3444172015 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
48.5094529968 1 1.1%
 
48.5332817364 1 1.1%
 
48.6853833016 1 1.1%
 
48.8946618473 1 1.1%
 
48.9107895086 1 1.1%
 

Rendement_g.5m2
Numeric

Distinct count 24
Unique (%) 60.0%
Missing (%) 55.6%
Missing (n) 50
Infinite (%) 0.0%
Infinite (n) 0
Mean 13.329
Minimum 0
Maximum 72.435
Zeros (%) 20.0%

Quantile statistics

Minimum 0
5-th percentile 0
Q1 0
Median 0.945
Q3 15.628
95-th percentile 62.404
Maximum 72.435
Range 72.435
Interquartile range 15.628

Descriptive statistics

Standard deviation 21.558
Coef of variation 1.6174
Kurtosis 1.3322
Mean 13.329
MAD 16.603
Skewness 1.6296
Sum 533.14
Variance 464.73
Memory size 800.0 B
Value Count Frequency (%)  
0.0 18 20.0%
 
13.8005726316 1 1.1%
 
23.0576757895 1 1.1%
 
62.3200336842 1 1.1%
 
6.5008 1 1.1%
 
0.574 1 1.1%
 
8.6962526316 1 1.1%
 
34.6400631579 1 1.1%
 
55.5831915789 1 1.1%
 
0.38 1 1.1%
 
Other values (13) 13 14.4%
 
(Missing) 50 55.6%
 

Minimum 5 values

Value Count Frequency (%)  
0.0 18 20.0%
 
0.38 1 1.1%
 
0.574 1 1.1%
 
1.316 1 1.1%
 
2.914 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
54.0670947368 1 1.1%
 
55.5831915789 1 1.1%
 
62.3200336842 1 1.1%
 
63.9896252632 1 1.1%
 
72.4351831579 1 1.1%
 

S_pourc
Numeric

Distinct count 86
Unique (%) 95.6%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.13472
Minimum 0.07
Maximum 0.2809
Zeros (%) 0.0%

Quantile statistics

Minimum 0.07
5-th percentile 0.087294
Q1 0.1107
Median 0.13005
Q3 0.1446
95-th percentile 0.21185
Maximum 0.2809
Range 0.2109
Interquartile range 0.0339

Descriptive statistics

Standard deviation 0.039346
Coef of variation 0.29206
Kurtosis 3.1858
Mean 0.13472
MAD 0.027089
Skewness 1.5573
Sum 12.125
Variance 0.0015481
Memory size 800.0 B
Value Count Frequency (%)  
0.1385 2 2.2%
 
0.1301 2 2.2%
 
0.1303 2 2.2%
 
0.142 2 2.2%
 
0.1293 1 1.1%
 
0.1106 1 1.1%
 
0.13 1 1.1%
 
0.1176 1 1.1%
 
0.07 1 1.1%
 
0.2047 1 1.1%
 
Other values (76) 76 84.4%
 

Minimum 5 values

Value Count Frequency (%)  
0.07 1 1.1%
 
0.07279 1 1.1%
 
0.08244 1 1.1%
 
0.0865 1 1.1%
 
0.08711 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.2177 1 1.1%
 
0.2246 1 1.1%
 
0.2489 1 1.1%
 
0.2709 1 1.1%
 
0.2809 1 1.1%
 

Site
Numeric

Distinct count 20
Unique (%) 22.2%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 6.3333
Minimum 1
Maximum 20
Zeros (%) 0.0%

Quantile statistics

Minimum 1
5-th percentile 1
Q1 2
Median 4
Q3 9
95-th percentile 18
Maximum 20
Range 19
Interquartile range 7

Descriptive statistics

Standard deviation 5.4875
Coef of variation 0.86644
Kurtosis 0.11878
Mean 6.3333
MAD 4.4593
Skewness 1.159
Sum 570
Variance 30.112
Memory size 800.0 B
Value Count Frequency (%)  
1 12 13.3%
 
2 12 13.3%
 
3 12 13.3%
 
4 12 13.3%
 
5 12 13.3%
 
19 2 2.2%
 
6 2 2.2%
 
7 2 2.2%
 
8 2 2.2%
 
9 2 2.2%
 
Other values (10) 20 22.2%
 

Minimum 5 values

Value Count Frequency (%)  
1 12 13.3%
 
2 12 13.3%
 
3 12 13.3%
 
4 12 13.3%
 
5 12 13.3%
 

Maximum 5 values

Value Count Frequency (%)  
16 2 2.2%
 
17 2 2.2%
 
18 2 2.2%
 
19 2 2.2%
 
20 2 2.2%
 

SousTraitement
Categorical

Distinct count 4
Unique (%) 10.0%
Missing (%) 55.6%
Missing (n) 50
Control
20
B
 
10
Cu
 
10
(Missing)
50
Value Count Frequency (%)  
Control 20 22.2%
 
B 10 11.1%
 
Cu 10 11.1%
 
(Missing) 50 55.6%
 

Station
Categorical

Distinct count 3
Unique (%) 3.3%
Missing (%) 0.0%
Missing (n) 0
B
72
A
 
13
C
 
5
Value Count Frequency (%)  
B 72 80.0%
 
A 13 14.4%
 
C 5 5.6%
 

SterileFleur_nombre.m2
Numeric

Distinct count 10
Unique (%) 11.6%
Missing (%) 4.4%
Missing (n) 4
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.25968
Minimum 0
Maximum 3.8197
Zeros (%) 80.0%

Quantile statistics

Minimum 0
5-th percentile 0
Q1 0
Median 0
Q3 0
95-th percentile 1.8183
Maximum 3.8197
Range 3.8197
Interquartile range 0

Descriptive statistics

Standard deviation 0.71079
Coef of variation 2.7372
Kurtosis 10.314
Mean 0.25968
MAD 0.43481
Skewness 3.1713
Sum 22.332
Variance 0.50522
Memory size 800.0 B
Value Count Frequency (%)  
0.0 72 80.0%
 
1.2732365674 3 3.3%
 
0.4 2 2.2%
 
2.5464731347 2 2.2%
 
0.8 2 2.2%
 
1.2 2 2.2%
 
3.8197097021 1 1.1%
 
2.8 1 1.1%
 
2.0 1 1.1%
 
(Missing) 4 4.4%
 

Minimum 5 values

Value Count Frequency (%)  
0.0 72 80.0%
 
0.4 2 2.2%
 
0.8 2 2.2%
 
1.2 2 2.2%
 
1.2732365674 3 3.3%
 

Maximum 5 values

Value Count Frequency (%)  
1.2732365674 3 3.3%
 
2.0 1 1.1%
 
2.5464731347 2 2.2%
 
2.8 1 1.1%
 
3.8197097021 1 1.1%
 

TotalFemelle_nombre.m2
Numeric

Distinct count 60
Unique (%) 69.8%
Missing (%) 4.4%
Missing (n) 4
Infinite (%) 0.0%
Infinite (n) 0
Mean 27.528
Minimum 2.5465
Maximum 187.17
Zeros (%) 0.0%

Quantile statistics

Minimum 2.5465
5-th percentile 6.5746
Q1 10.339
Median 17.189
Q3 31.958
95-th percentile 76.3
Maximum 187.17
Range 184.62
Interquartile range 21.618

Descriptive statistics

Standard deviation 29.826
Coef of variation 1.0835
Kurtosis 11.198
Mean 27.528
MAD 19.069
Skewness 3.014
Sum 2367.4
Variance 889.62
Memory size 800.0 B
Value Count Frequency (%)  
10.1858925388 5 5.6%
 
7.6394194041 4 4.4%
 
14.0056022409 4 4.4%
 
20.3717850777 3 3.3%
 
17.825311943 3 3.3%
 
21.645021645 3 3.3%
 
16.5520753756 3 3.3%
 
8.9126559715 3 3.3%
 
15.2788388083 2 2.2%
 
7.2 2 2.2%
 
Other values (49) 54 60.0%
 
(Missing) 4 4.4%
 

Minimum 5 values

Value Count Frequency (%)  
2.5464731347 1 1.1%
 
4.4 1 1.1%
 
5.6 1 1.1%
 
6.0 1 1.1%
 
6.3661828368 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
76.8 1 1.1%
 
105.67863509 1 1.1%
 
124.777183601 1 1.1%
 
127.323656735 1 1.1%
 
187.165775401 1 1.1%
 

TotalFloral_nombre.m2
Numeric

Distinct count 69
Unique (%) 80.2%
Missing (%) 4.4%
Missing (n) 4
Infinite (%) 0.0%
Infinite (n) 0
Mean 52.076
Minimum 4.8
Maximum 198.62
Zeros (%) 0.0%

Quantile statistics

Minimum 4.8
5-th percentile 11.6
Q1 22.918
Median 43
Q3 69.521
95-th percentile 129.23
Maximum 198.62
Range 193.82
Interquartile range 46.603

Descriptive statistics

Standard deviation 40.414
Coef of variation 0.77606
Kurtosis 2.8099
Mean 52.076
MAD 29.863
Skewness 1.5974
Sum 4478.5
Variance 1633.3
Memory size 800.0 B
Value Count Frequency (%)  
49.6562261268 4 4.4%
 
28.0112044818 3 3.3%
 
22.9182582124 3 3.3%
 
52.2026992615 2 2.2%
 
19.0985485103 2 2.2%
 
48.3829895595 2 2.2%
 
32.8 2 2.2%
 
21.645021645 2 2.2%
 
45.2 2 2.2%
 
17.6 2 2.2%
 
Other values (58) 62 68.9%
 
(Missing) 4 4.4%
 

Minimum 5 values

Value Count Frequency (%)  
4.8 1 1.1%
 
6.0 1 1.1%
 
8.4 1 1.1%
 
8.9126559715 1 1.1%
 
11.6 2 2.2%
 

Maximum 5 values

Value Count Frequency (%)  
129.87012987 1 1.1%
 
134.8 1 1.1%
 
150.241914948 1 1.1%
 
197.35166794 1 1.1%
 
198.624904507 1 1.1%
 

TotalMale_nombre.m2
Numeric

Distinct count 61
Unique (%) 70.9%
Missing (%) 4.4%
Missing (n) 4
Infinite (%) 0.0%
Infinite (n) 0
Mean 24.4
Minimum 0
Maximum 104.41
Zeros (%) 12.2%

Quantile statistics

Minimum 0
5-th percentile 0
Q1 3.3
Median 15.279
Q3 36.513
95-th percentile 82.153
Maximum 104.41
Range 104.41
Interquartile range 33.213

Descriptive statistics

Standard deviation 26.866
Coef of variation 1.101
Kurtosis 1.1177
Mean 24.4
MAD 21.275
Skewness 1.3368
Sum 2098.4
Variance 721.76
Memory size 800.0 B
Value Count Frequency (%)  
0.0 11 12.2%
 
16.5520753756 4 4.4%
 
7.6394194041 3 3.3%
 
5.0929462694 3 3.3%
 
14.0056022409 2 2.2%
 
0.4 2 2.2%
 
42.0168067227 2 2.2%
 
1.2 2 2.2%
 
11.2 2 2.2%
 
3.2 2 2.2%
 
Other values (50) 53 58.9%
 
(Missing) 4 4.4%
 

Minimum 5 values

Value Count Frequency (%)  
0.0 11 12.2%
 
0.4 2 2.2%
 
0.8 1 1.1%
 
1.2 2 2.2%
 
1.2732365674 2 2.2%
 

Maximum 5 values

Value Count Frequency (%)  
82.8 1 1.1%
 
91.6730328495 1 1.1%
 
92.9462694169 1 1.1%
 
103.6 1 1.1%
 
104.405398523 1 1.1%
 

TotalRamet_nombre.m2
Numeric

Distinct count 86
Unique (%) 95.6%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 251.26
Minimum 40.744
Maximum 651.9
Zeros (%) 0.0%

Quantile statistics

Minimum 40.744
5-th percentile 65.874
Q1 122.7
Median 212.92
Q3 347.8
95-th percentile 559.88
Maximum 651.9
Range 611.15
Interquartile range 225.1

Descriptive statistics

Standard deviation 156.06
Coef of variation 0.62111
Kurtosis -0.34648
Mean 251.26
MAD 125.67
Skewness 0.76691
Sum 22613
Variance 24354
Memory size 800.0 B
Value Count Frequency (%)  
208.8 2 2.2%
 
189.712248536 2 2.2%
 
328.0 2 2.2%
 
243.188184365 2 2.2%
 
168.067226891 1 1.1%
 
224.089635854 1 1.1%
 
109.498344793 1 1.1%
 
86.5800865801 1 1.1%
 
64.9350649351 1 1.1%
 
501.655207538 1 1.1%
 
Other values (76) 76 84.4%
 

Minimum 5 values

Value Count Frequency (%)  
40.7435701553 1 1.1%
 
48.3829895595 1 1.1%
 
53.4759358289 1 1.1%
 
64.9350649351 1 1.1%
 
65.6 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
564.043799338 1 1.1%
 
574.0 1 1.1%
 
588.235294118 1 1.1%
 
590.781767252 1 1.1%
 
651.897122485 1 1.1%
 

TotalVegetatif_nombre.m2
Highly correlated

This variable is highly correlated with TotalRamet_nombre.m2 and should be ignored for analysis

Correlation 0.9721

Traitement
Categorical

Distinct count 3
Unique (%) 7.5%
Missing (%) 55.6%
Missing (n) 50
fertilisant
20
temoin
20
(Missing)
50
Value Count Frequency (%)  
fertilisant 20 22.2%
 
temoin 20 22.2%
 
(Missing) 50 55.6%
 

Zn_pourc
Numeric

Distinct count 90
Unique (%) 100.0%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 0.0066622
Minimum 0.0032669
Maximum 0.01624
Zeros (%) 0.0%

Quantile statistics

Minimum 0.0032669
5-th percentile 0.0044589
Q1 0.0054931
Median 0.0063202
Q3 0.0071935
95-th percentile 0.010472
Maximum 0.01624
Range 0.012973
Interquartile range 0.0017004

Descriptive statistics

Standard deviation 0.0020605
Coef of variation 0.30928
Kurtosis 5.836
Mean 0.0066622
MAD 0.0013858
Skewness 1.9856
Sum 0.59959
Variance 4.2456e-06
Memory size 800.0 B
Value Count Frequency (%)  
0.0074666247 1 1.1%
 
0.0056853891 1 1.1%
 
0.0061092421 1 1.1%
 
0.0036990506 1 1.1%
 
0.0068037821 1 1.1%
 
0.0046950304 1 1.1%
 
0.004420596 1 1.1%
 
0.0102133061 1 1.1%
 
0.0056261513 1 1.1%
 
0.0105429971 1 1.1%
 
Other values (80) 80 88.9%
 

Minimum 5 values

Value Count Frequency (%)  
0.0032669471 1 1.1%
 
0.0036990506 1 1.1%
 
0.003858587 1 1.1%
 
0.0042669299 1 1.1%
 
0.004420596 1 1.1%
 

Maximum 5 values

Value Count Frequency (%)  
0.0105429971 1 1.1%
 
0.0112509103 1 1.1%
 
0.0114809328 1 1.1%
 
0.0138334151 1 1.1%
 
0.0162397733 1 1.1%
 

Sample

CodeTourbiere Ordre Site Traitement DemiParcelle SousTraitement Latitude_m Longitude_m Rendement_g.5m2 TotalRamet_nombre.m2 TotalVegetatif_nombre.m2 TotalFloral_nombre.m2 TotalMale_nombre.m2 TotalFemelle_nombre.m2 FemelleFruit_nombre.m2 FemelleAvorte_nombre.m2 SterileFleur_nombre.m2 C_pourc N_pourc P_pourc K_pourc Ca_pourc Mg_pourc S_pourc B_pourc Cu_pourc Zn_pourc Mn_pourc Fe_pourc Al_pourc Remplissage_pourc Station
ID
1 BEAU A 1 NaN NaN NaN 5702454 490627 NaN 453.272218 255.920550 197.351668 10.185893 187.165775 157.881334 8.912656 0.000000 51.47 1.725 0.108283 1.213369 0.435481 0.470311 0.09765 0.002578 0.000175 0.004698 0.100602 0.013281 0.001558 44.357013 A
2 BEAU A 2 NaN NaN NaN 5702452 490634 NaN 460.911637 333.587981 127.323657 0.000000 124.777184 71.301248 14.005602 2.546473 51.29 2.183 0.098500 1.215155 0.336792 0.439383 0.09961 0.002578 0.000407 0.007288 0.078297 0.014773 0.001890 44.232327 A
3 BEAU A 3 NaN NaN NaN 5702461 490638 NaN 651.897122 580.595875 71.301248 1.273237 70.028011 48.382990 19.098549 0.000000 50.55 2.122 0.070767 1.049444 0.373216 0.420433 0.10440 0.002578 0.000037 0.007132 0.072201 0.014754 0.001602 45.211436 A
4 BEAU A 4 NaN NaN NaN 5702453 490647 NaN 590.781767 440.539852 150.241915 104.405399 45.836516 39.470334 3.819710 0.000000 51.58 1.948 0.090899 1.191574 0.500454 0.387801 0.09224 0.002578 0.000093 0.005497 0.031042 0.013455 0.000895 44.155473 A
5 BEAU A 5 NaN NaN NaN 5702445 490654 NaN 564.043799 365.418895 198.624905 92.946269 105.678635 94.219506 2.546473 0.000000 53.83 2.039 0.115247 0.946565 0.332687 0.471710 0.10620 0.002578 0.000037 0.005101 0.034550 0.012011 0.001021 42.103293 A

Commandes usuelles.

  • Sommaire
    • df.head(5). Afficher les 5 premières lignes du tableau.
    • df.tail(5). Afficher les 5 dernières lignes du tableau.
    • df.describe(). Afficher les statistiques sommaires du tableau.
  • Importer / exporter
    • pd.read_csv(). Importer un tableau.
    • pd.to_csv(). Exporter un tableau

Références

Python for Data Analysis (McKinney, 2016). Wickham, H. (2014) https://www.jstatsoft.org/index.php/jss/article/view/v059i10/v59i10.pdf

Parent L.E., Parent, S.É., Herbert-Gentile, V., Naess, K. et Lapointe, L. 2013. Mineral Balance Plasticity of Cloudberry (Rubus chamaemorus) in Quebec-Labrador Bogs. American Journal of Plant Sciences, 4, 1508-1520. DOI: 10.4236/ajps.2013.47183