Apprendre Python avec ChemTHEATER 05-1

Partie 5 Graphique des données ChemTHEATER sur une carte (Partie 1)

Chap.0 Débit global

Dans la partie 5, la concentration de substance chimique mesurée est représentée sur une carte à l'aide des données ChemTHEATER. Pour ainsi dire, c'est un simple SIG.
Dans la première partie, nous visons à créer une animation en connectant le traitement des données au traçage sur la carte, et dans la seconde partie, les données d'image de sortie.

img05.png

Chargement de la bibliothèque Chap.1

Si vous n'avez pas installé Cartopy, installez-le à l'avance.

conda install -c conda-forge cartopy

Ensuite, chargez la bibliothèque suivante.

%matplotlib inline
import os
import numpy as np
import pandas as pd
import itertools
import matplotlib.pyplot as plt
from cartopy import crs as ccrs

Encore une fois, nous commencerons par importer les bibliothèques nécessaires au traitement.
La première ligne est, comme d'habitude, une commande pour afficher la sortie de matplotlib.
Dans la partie 5, les bibliothèques suivantes seront utilisées. (Reportez-vous à la deuxième ligne et aux suivantes)
Les deux sont déjà installés dans Anaconda3 (version Windows 64 bits).
Cette fois, nous utiliserons cartopy pour afficher la carte sur le graphique de matplotlib.

Bibliothèque Présentation But de l'utilisation cette fois URL officielle
os Bibliothèque standard Manipulation de répertoire https://docs.python.org/ja/3/library/os.html
NumPy Bibliothèque de calculs numériques Utilisé pour le calcul numérique en traitement statistique https://www.numpy.org
itertools Générer un itérateur 1
Bibliothèque standard
Utilisé pour rationaliser le traitement en boucle https://docs.python.org/ja/3/library/itertools.html
pandas Bibliothèque d'analyse des données Utilisé pour le traitement et le formatage des données https://pandas.pydata.org
Matplotlib Bibliothèque de dessins de graphes Utilisé pour la visualisation des données https://matplotlib.org
cartopy Bibliothèque de dessins de carte Utilisé pour la visualisation des données cartographiques https://scitools.org.uk/cartopy/docs/latest

Lecture des données Chap.2

Maintenant que la bibliothèque est prête, chargez les données. Puisque nous utiliserons les données des mammifères marins cette fois-ci, recherchez le type d'échantillon comme «Biotiques - Mammifères - Mammifères marins» dans la recherche d'échantillon de ChemTHEATER. Dans les résultats de la recherche, cliquez sur "Exporter les échantillons" et "Exporter les données de mesure" pour télécharger respectivement les fichiers de liste d'échantillons et de liste de valeurs de mesure. Enregistrez le fichier dans n'importe quel répertoire et lisez-le à partir de votre ordinateur portable comme suit.

data_file = "measureddata_20191002074038.tsv"    #Remplacez la chaîne de caractères saisie dans la variable par le nom de fichier tsv de vos données mesurées
data = pd.read_csv(data_file, delimiter="\t")
data = data.drop(["ProjectID", "ScientificName", "RegisterDate", "UpdateDate"], axis=1)    #Supprimer les colonnes en double lors de la jonction avec des échantillons ultérieurement
data
MeasuredID SampleID ChemicalID ChemicalName ExperimentID MeasuredValue AlternativeData Unit Remarks
0 1026 SAA000173 CH0000034 PCB4+PCB10 EXA000001 0.010 <1.00E-2 ng/g lipid NaN
1 1027 SAA000173 CH0000035 PCB8 EXA000001 0.010 <1.00E-2 ng/g lipid NaN
2 1028 SAA000173 CH0000037 PCB19 EXA000001 0.010 <1.00E-2 ng/g lipid NaN
3 1029 SAA000173 CH0000038 PCB22 EXA000001 0.010 <1.00E-2 ng/g lipid NaN
4 1030 SAA000173 CH0000039 PCB28 EXA000001 32.000 NaN ng/g lipid NaN
... ... ... ... ... ... ... ... ... ...
7098 27705 SAA002002 CH0000094 PCB208 EXA000001 77.249 NaN ng/g lipid NaN
7099 27706 SAA002002 CH0000088 PCB194 EXA000001 512.160 NaN ng/g lipid NaN
7100 27707 SAA002002 CH0000092 PCB205 EXA000001 3.000 <3.00E+0 ng/g lipid NaN
7101 27708 SAA002002 CH0000093 PCB206 EXA000001 81.947 NaN ng/g lipid NaN
7102 27709 SAA002002 CH0000095 PCB209 EXA000001 127.064 NaN ng/g lipid NaN

7103 rows × 9 columns

sample_file = "samples_20191002074035.tsv"    #Remplacez la chaîne de caractères entrée dans la variable par le nom de fichier tsv de vos échantillons
sample = pd.read_csv(sample_file, delimiter="\t")
sample
ProjectID SampleID SampleType TaxonomyID UniqCodeType UniqCode SampleName ScientificName ...
0 PRA000003 SAA000173 ST004 34892 es-BANK EW00884 M32582 Neophocaena phocaenoides ...
1 PRA000003 SAA000174 ST004 34892 es-BANK EW00888 M32588 Neophocaena phocaenoides ...
2 PRA000003 SAA000175 ST004 34892 es-BANK EW00932 M32580 Neophocaena phocaenoides ...
3 PRA000003 SAA000176 ST004 34892 es-BANK EW00929 M33556 Neophocaena phocaenoides ...
4 PRA000003 SAA000177 ST004 34892 es-BANK EW00934 M32548 Neophocaena phocaenoides ...
... ... ... ... ... ... ... ... ... ...
197 PRA000036 SAA002159 ST004 103596 es-BANK EW04779 060301-1 Peponocephala electra ...
198 PRA000036 SAA002160 ST004 103596 es-BANK EW00115 M32625 Peponocephala electra ...
199 PRA000036 SAA002161 ST004 103596 es-BANK EW00122 M32633 Peponocephala electra ...
200 PRA000036 SAA002162 ST004 103596 es-BANK EW00116 M32626 Peponocephala electra ...
201 PRA000036 SAA002163 ST004 103596 es-BANK EW00117 M32627 Peponocephala electra ...

202 rows × 66 columns

Chap.3 Préparation des données

Préparez-vous à pouvoir tracer le DataFrame lu au Chap.2 sur la carte. Tout d'abord, combinez les données mesurées et les échantillons et supprimez la colonne N / A.

df = pd.merge(data, sample, on="SampleID")

df = df.dropna(how='all', axis=1)
df
MeasuredID SampleID ChemicalID ChemicalName ExperimentID MeasuredValue AlternativeData Unit ...
0 1026 SAA000173 CH0000034 PCB4+PCB10 EXA000001 0.010 <1.00E-2 ng/g lipid ...
1 1027 SAA000173 CH0000035 PCB8 EXA000001 0.010 <1.00E-2 ng/g lipid ...
2 1028 SAA000173 CH0000037 PCB19 EXA000001 0.010 <1.00E-2 ng/g lipid ...
3 1029 SAA000173 CH0000038 PCB22 EXA000001 0.010 <1.00E-2 ng/g lipid ...
4 1030 SAA000173 CH0000039 PCB28 EXA000001 32.000 NaN ng/g lipid ...
... ... ... ... ... ... ... ... ... ...
7098 27705 SAA002002 CH0000094 PCB208 EXA000001 77.249 NaN ng/g lipid ...
7099 27706 SAA002002 CH0000088 PCB194 EXA000001 512.160 NaN ng/g lipid ...
7100 27707 SAA002002 CH0000092 PCB205 EXA000001 3.000 <3.00E+0 ng/g lipid ...
7101 27708 SAA002002 CH0000093 PCB206 EXA000001 81.947 NaN ng/g lipid ...
7102 27709 SAA002002 CH0000095 PCB209 EXA000001 127.064 NaN ng/g lipid ...

7103 rows × 39 columns

Ensuite, extrayez les données nécessaires. Cette fois, nous traiterons des données sur quatre types de substances chimiques (ΣPCBs, ΣDDTs, ΣCHLs, ΣHCHs) avec l'unité [ng / g lipid].

data_lipid = df[df["Unit"] == "ng/g lipid"]
data_lipid = data_lipid[(data_lipid["ChemicalName"] == "ΣPCBs") | (data_lipid["ChemicalName"] == "ΣDDTs") |
                        (data_lipid["ChemicalName"] == "ΣCHLs") | (data_lipid["ChemicalName"] == "ΣHCHs")]

Ceci termine l'extraction des données nécessaires. Pour confirmation, obtenez une liste des espèces et des noms chimiques inclus dans cet ensemble de données.

lipid_species = data_lipid["ScientificName"].unique()
lipid_chemicals = data_lipid["ChemicalName"].unique()

lipid_species, lipid_chemicals
(array(['Peponocephala electra', 'Neophocaena phocaenoides',
        'Sousa chinensis', 'Stenella coeruleoalba'], dtype=object),
 array(['ΣPCBs', 'ΣDDTs', 'ΣCHLs', 'ΣHCHs'], dtype=object))

Ici aussi, DataFrame / data_lipid est sorti au format CSV afin que les mêmes données puissent être utilisées dans la deuxième partie. La sortie CSV utilise la méthode to_csv de Pandas.

data_lipid.to_csv("data.csv")

Chap.4 Tracer sur la carte

Sec.4-1 Schéma de base

Ensuite, nous tracerons sur la carte, qui est la partie principale de ce temps. Mais d'abord, vérifions attentivement comment créer une carte.
Puisque le graphique sera cette fois sorti sur la carte, la carte sera sortie en premier. En Python, vous pouvez utiliser cartopy pour générer une carte sur matplotlib.

ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
plt.show()

output_05_01.png

Ensuite, vérifiez la capture qui est superposée sur la carte. Cette fois, les points dans l'espace bidimensionnel de latitude et de longitude sont tracés en tant que points de mesure, de sorte que les données sont dessinées sous forme de carte de dispersion.
Avant de dessiner, triez les données pour chaque espèce incluse dans data_lipid.

df_0 = data_lipid[(data_lipid["ChemicalName"] == "ΣPCBs") & (data_lipid["ScientificName"] == lipid_species[0])]    #ΣPCB de Kazuhagondou
df_1 = data_lipid[(data_lipid["ChemicalName"] == "ΣPCBs") & (data_lipid["ScientificName"] == lipid_species[1])]    #ΣPCB de Sunameri
df_2 = data_lipid[(data_lipid["ChemicalName"] == "ΣPCBs") & (data_lipid["ScientificName"] == lipid_species[2])]    #Sinaus Iro Dolphin ΣPCBs
df_3 = data_lipid[(data_lipid["ChemicalName"] == "ΣPCBs") & (data_lipid["ScientificName"] == lipid_species[3])]    #Suji Dolphin ΣPCBs

Lorsque les données sont davantage divisées, essayez de les réveiller dans un diagramme de dispersion. Le dessin graphique de matplotlib peut être superposé dessus, vous pouvez donc ajouter des images une par une.

fig = plt.figure()
ax = plt.axes()

#CollectionLongitudeFrom,Extraire les informations de latitude et de longitude de CollectionLatitudeFrom
ax.scatter(x = np.array(df_0["CollectionLongitudeFrom"]), y = np.array(df_0["CollectionLatitudeFrom"]), c = "red", alpha=0.5)
ax.scatter(x = np.array(df_1["CollectionLongitudeFrom"]), y = np.array(df_1["CollectionLatitudeFrom"]), c = "blue", alpha=0.5)
ax.scatter(x = np.array(df_2["CollectionLongitudeFrom"]), y = np.array(df_2["CollectionLatitudeFrom"]), c = "yellow", alpha=0.5)
ax.scatter(x = np.array(df_3["CollectionLongitudeFrom"]), y = np.array(df_3["CollectionLatitudeFrom"]), c = "green", alpha=0.5)
plt.show()

output_05_02.png

Sec.4-2 Diagramme de dispersion + projection cylindrique à distance régulière

Maintenant que nous avons dessiné la figure de base, dessinons-la en la superposant.

img09.png

fig = plt.figure()
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
ax.scatter(x = np.array(df_0["CollectionLongitudeFrom"]), y = np.array(df_0["CollectionLatitudeFrom"]), c = "red", alpha=0.5)
ax.scatter(x = np.array(df_1["CollectionLongitudeFrom"]), y = np.array(df_1["CollectionLatitudeFrom"]), c = "blue", alpha=0.5)
ax.scatter(x = np.array(df_2["CollectionLongitudeFrom"]), y = np.array(df_2["CollectionLatitudeFrom"]), c = "yellow", alpha=0.5)
ax.scatter(x = np.array(df_3["CollectionLongitudeFrom"]), y = np.array(df_3["CollectionLatitudeFrom"]), c = "green", alpha=0.5)
plt.show()

output_05_03.png

Sec.4-3 Amélioration de Sec.4-2

J'ai pu sortir pour le moment avec Sec.4-2. Cependant, dans l'état actuel, la portée de la carte est définie automatiquement. Ceci est uniquement traité automatiquement afin que toute la plage dans laquelle les données existent soit automatiquement traitée, de sorte que la plage change en fonction des données à traiter. Ici, la carte est fixée dans une plage appropriée.

En utilisant les méthodes set_xlim et set_ylim de matplotlib, la plage de la direction de l'axe X et la direction de l'axe Y du graphe à dessiner peut être déterminée respectivement.

img10.png

fig = plt.figure()
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
ax.scatter(x = np.array(df_0["CollectionLongitudeFrom"]), y = np.array(df_0["CollectionLatitudeFrom"]), c = "red", alpha=0.5)
ax.scatter(x = np.array(df_1["CollectionLongitudeFrom"]), y = np.array(df_1["CollectionLatitudeFrom"]), c = "blue", alpha=0.5)
ax.scatter(x = np.array(df_2["CollectionLongitudeFrom"]), y = np.array(df_2["CollectionLatitudeFrom"]), c = "yellow", alpha=0.5)
ax.scatter(x = np.array(df_3["CollectionLongitudeFrom"]), y = np.array(df_3["CollectionLatitudeFrom"]), c = "green", alpha=0.5)
ax.set_xlim(90,180)    #Plage dans le sens de l'axe X (longitudinal) pour dessiner
ax.set_ylim(15, 60)    #Plage dans la direction de l'axe Y (latitude) pour dessiner
ax.set_title("ΣPCBs")
plt.show()

output_05_04.png

Chap.5 Sortie en une seule feuille

Comme vous pouvez le voir dans

Chap.3, ce DataFrame contient des données de 4 types de substances chimiques, donc sortons-les sous la forme de 4 côte à côte. </ p>

Tout d'abord, comme nous l'avons fait au chapitre 4, nous trions les données pour chaque substance chimique, mais comme il y a 16 combinaisons au total (4 types de substances biologiques et chimiques chacune), nous les énumérerons ici. Collectivement, il prend la forme d'une lecture séquentielle lors du dessin. À ce stade, il est nécessaire de générer chaque combinaison (par exemple, les ΣPCB de Snameri), utilisez donc la fonction de l'itérateur de Python 1 pour produire directement. Nous demanderons 2 . En d'autres termes, le produit direct de la liste des substances chimiques (lipid_chemicals) et de la liste des noms d'espèces (lipid_species) est obtenu, et les 16 modèles de combinaison sont dérivés.

df_list = []
for k1, k2 in itertools.product(lipid_chemicals, lipid_species):
    df_list.append(data_lipid[(data_lipid["ChemicalName"] == k1) & (data_lipid["ScientificName"] == k2)])    #Extraire les données pour chaque combinaison

img11.png

ax = [0]*4
fig = plt.figure(figsize=(16, 9))
for i in range(4): 
    ax[i] = fig.add_subplot(2, 2, i+1, projection=ccrs.PlateCarree())    #Zone ajoutée pour dessiner un graphique
    ax[i].coastlines()
    ax[i].scatter(x = np.array(df_list[4*i+0]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+0]["CollectionLatitudeFrom"]),
                  c = "red", alpha=0.5)    #Kazuhagondou
    ax[i].scatter(x = np.array(df_list[4*i+1]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+1]["CollectionLatitudeFrom"]), 
                  c = "blue", alpha=0.5)    #Snameri
    ax[i].scatter(x = np.array(df_list[4*i+2]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+2]["CollectionLatitudeFrom"]), 
                  c = "yellow", alpha=0.5)    #Sinaus Iro Dolphin
    ax[i].scatter(x = np.array(df_list[4*i+3]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+3]["CollectionLatitudeFrom"]), 
                  c = "green", alpha=0.5)    #Dauphin Suji
    ax[i].set_xlim(90,180)
    ax[i].set_ylim(15, 60)
    ax[i].set_title(lipid_chemicals[i])
plt.show()

output_05_05.png

Cela ne reflète que les points de mesure, alors essayez également de tracer les valeurs mesurées sur la carte. Reflétons-le dans le rayon de chaque point de pulvérisation. Tout ce que vous avez à faire est d'assigner les données de la colonne MeasuredValue au paramètre s de la méthode scatter qui dessine le diagramme de dispersion.

fig = plt.figure(figsize=(16, 9))
for i in range(4): 
    ax[i] = fig.add_subplot(2, 2, i+1, projection=ccrs.PlateCarree())
    ax[i].coastlines()
    ax[i].scatter(x = np.array(df_list[4*i+0]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+0]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+0]["MeasuredValue"]), c = "red", alpha=0.5)
    ax[i].scatter(x = np.array(df_list[4*i+1]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+1]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+1]["MeasuredValue"]), c = "blue", alpha=0.5)
    ax[i].scatter(x = np.array(df_list[4*i+2]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+2]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+2]["MeasuredValue"]), c = "yellow", alpha=0.5)
    ax[i].scatter(x = np.array(df_list[4*i+3]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+3]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+3]["MeasuredValue"]), c = "green", alpha=0.5)
    ax[i].set_xlim(90,180)
    ax[i].set_ylim(15, 60)
    plt.title(lipid_chemicals[i])
plt.show()

output_05_06.png

Si la valeur de MeasuredValue est substituée telle qu'elle est dans le rayon du point de diffusion, le cercle du graphique de ΣDDT deviendra grand et tout se chevauchera, donc ajustez pour que le rayon soit petit. Ici, la taille est uniformément fixée à 1/10.

fig = plt.figure(figsize=(16, 9))
rate = [10,10,10,10]    #Échelle d'indication variable
for i in range(4): 
    ax[i] = fig.add_subplot(2, 2, i+1, projection=ccrs.PlateCarree())
    ax[i].coastlines()
    ax[i].scatter(x = np.array(df_list[4*i+0]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+0]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+0]["MeasuredValue"])/rate[i], c = "red", alpha=0.3)
    ax[i].scatter(x = np.array(df_list[4*i+1]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+1]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+1]["MeasuredValue"])/rate[i], c = "blue", alpha=0.3)
    ax[i].scatter(x = np.array(df_list[4*i+2]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+2]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+2]["MeasuredValue"])/rate[i], c = "yellow", alpha=0.3)
    ax[i].scatter(x = np.array(df_list[4*i+3]["CollectionLongitudeFrom"]), y = np.array(df_list[4*i+3]["CollectionLatitudeFrom"]), s=np.array(df_list[4*i+3]["MeasuredValue"])/rate[i], c = "green", alpha=0.3)
    ax[i].set_xlim(90,180)
    ax[i].set_ylim(15, 60)
    plt.title(lipid_chemicals[i])
plt.show()

output_05_07.png

Vous pouvez maintenant tracer les résultats de mesure sur la carte. Cependant, comme toutes les données sont affichées de manière superposée, il est très difficile de voir, et sur cette figure, les changements dans le temps ne peuvent être vus. Dans la deuxième partie, nous animerons pour résoudre ces problèmes.

note de bas de page

1 Un itérateur est un mécanisme qui accède à plusieurs reprises à l'élément suivant dans un type qui recueille des données telles qu'une liste.

2 Le produit direct consiste à créer un nouvel ensemble en extrayant un élément de chaque ensemble et en créant un ensemble comme indiqué dans la figure ci-dessous. Aussi avec le produit cartésien.

img12.png

Recommended Posts

Apprendre Python avec ChemTHEATER 05-1
Apprendre Python avec ChemTHEATER 02
Apprendre Python avec ChemTHEATER 01
"Orienté objet" appris avec python
Apprenez Python avec ChemTHEATER
Apprentissage amélioré à partir de Python
Apprentissage automatique avec Python! Préparation
apprentissage de python
Commencer avec l'apprentissage automatique Python
Traitement itératif Python appris avec ChemoInfomatics
Apprentissage automatique par python (1) Classification générale
Entrée / sortie avec Python (mémo d'apprentissage Python ⑤)
Expérience d'apprentissage Perceptron apprise avec Python
Mémo d'apprentissage "Scraping & Machine Learning avec Python"
FizzBuzz en Python3
Grattage avec Python
[Python] Note d'apprentissage 1
Notes d'apprentissage Python
Statistiques avec python
Grattage avec Python
Python avec Go
sortie d'apprentissage python
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Site d'apprentissage Python
Testé avec Python
Apprentissage Python jour 4
python commence par ()
avec syntaxe (Python)
Apprentissage en profondeur Python
apprentissage python (supplément)
Apprentissage profond × Python
Bingo avec python
Zundokokiyoshi avec python
notes d'apprentissage python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
[Exemple d'amélioration de Python] Apprentissage de Python avec Codecademy
Amplifiez les images pour l'apprentissage automatique avec Python
Apprentissage automatique avec python (2) Analyse de régression simple
[Shakyo] Rencontre avec Python pour l'apprentissage automatique
Analyse de données à partir de python (pré-traitement des données-apprentissage automatique)
[Python] Essayez facilement l'apprentissage amélioré (DQN) avec Keras-RL
Construction d'environnement AI / Machine Learning avec Python
Communication série avec Python
Zip, décompressez avec python
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
[Python] Introduction facile à l'apprentissage automatique avec python (SVM)
Grattage en Python (préparation)
Classe Python (mémo d'apprentissage Python ⑦)
Essayez de gratter avec Python.
Recherche séquentielle avec Python
Apprentissage automatique à partir de Python Personal Memorandum Part2
Module Python (mémo d'apprentissage Python ④)
Exécutez Python avec VBA