[PYTHON] Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (2)

Dessinons un "front de type carte météorologique" par apprentissage automatique basé sur des données météorologiques (2) Récit de visualisation des données météorologiques en entrée

La dernière fois, [dessinons un "front de type carte météorologique" par apprentissage automatique basé sur les données météorologiques (1)](https://qiita.com/m-taque/items/80a87052fde00fb96fab "Basé sur les données météorologiques," J'ai posté l'ensemble du flux en essayant de dessiner un "front de type carte météo" par apprentissage automatique (1) "). La partie 2 résume l'histoire jusqu'à la visualisation des données numériques au format GPV.

0. Mon environnement

J'utilise un environnement Mac OS. J'avais l'habitude d'étudier avec Mac book pro et iPhone (Pythonista), mais je l'ai acheté lors du renouvellement du Mac mini. En conséquence, il était bon d'augmenter la mémoire.

Matériel et logiciel

Mac mini(2018) Processeur Intel Core i7 6 cœurs à 3,2 GHz Mémoire DDR4 de 32 Go à 2667 MHz

OS macOS Catalina Quand il a été introduit pour la première fois, c'était un mojave d'une génération.

Environnement de développement

Bien qu'atom soit inclus dans l'environnement de développement intégré, je ne l'utilise pas beaucoup. Parce que c'est la génération qui est arrivée à tout avec vi ...

1. Données météorologiques relatives à la ligne de front

1.1 Quelle est la cible pour tracer la ligne de front?

** Les fronts ** sont analysés par l'Agence météorologique et sont représentés dans ** Asian Ground Analysis Map (ASAS) ** et ** Breaking Weather Map (SPAS) **.

À propos de la carte météo de la page d'accueil de l'Agence météorologique

À titre d'exemple, celui de 21h00 UTC le 2 décembre 2019 est affiché. SPAS_COLOR_201912021200.v8.512.png

C'est la ** carte météo ** que nous visons.

D'autre part, les données météorologiques obtenues cette fois de l'Université de Kyoto sont le ** Global Forecast Model (GSM) **, qui est l'un des modèles de prévision numérique de l'Agence météorologique.

Veuillez voir ci-dessous pour des explications telles que les prévisions numériques. Quelle est la prévision numérique sur le site Web de l'Agence météorologique

Les données GSM comprennent des données sur des facteurs météorologiques tels que ** température ** et ** pression **, mais je ne sais pas où ** est la ligne de front **. On peut dire que cet apprentissage automatique consiste à apprendre de ces données GSM qu '«il reconnaît où la ligne de front doit être tracée et trace la ligne de front» comme ** carte météo **.

Ensuite, ciblons les données de l'heure initiale du GSM. En effet, c'est le même que l'heure cible lorsque l'Agence météorologique analyse et crée la carte météorologique, et on pense que presque les mêmes conditions météorologiques sont exprimées.

Données d'heure initiale et valeurs observées Sur la base des données temporelles initiales, le GSM calculera les conditions atmosphériques futures, par exemple après 3 heures, 6 heures, etc. Les «données temporelles initiales» ici sont les «conditions atmosphériques les plus déroutantes» obtenues à partir d'un point d'observation fini à un certain moment à des positions régulières de la grille en utilisant pleinement les méthodes statistiques. C'est ce qu'on appelle "l'analyse objective" et "l'assimilation des données", qui a récemment commencé à être appliquée à divers domaines, est utilisée depuis un certain temps. [Analyse objective de la page d'accueil de l'Agence météorologique](https://www.jma.go.jp/jma/kishou/know/whitep/1-3-3.html "Analyse objective")

1.2 Facteurs météorologiques qui déterminent la ligne de front

La ligne de front est la frontière entre des groupes aériens aux propriétés différentes, et généralement c'est la limite entre ** air chaud ** et ** air froid **, mais lorsque vous visualisez les données météorologiques, il semble qu'une telle frontière existe partout. Je vais.

Tout d'abord, comment décidez-vous où tracer la ligne de front? Il n'y a pas beaucoup d'histoire spécifique dans les livres spécialisés sur la météorologie, mais j'ai trouvé que le livre de référence pour l'examen de prévisionniste météorologique a une telle description (dans l'examen de prévisionniste météorologique, regardez la carte météo). L'analyse de première ligne est un grand genre en raison du problème de dessin des fronts météorologiques).

[Texte Easy Pass de Meteorological Forecaster](https://www.amazon.co.jp/ Texte Easy Pass de Meteorological Forecaster-% E3% 80% 88 Compétences pratiques> / 4774149950 / ref = pd_sbs_14_img_1 / 355-1239468-1368320? _encoding = UTF8 & pd_rd_i = 4774149950 & pd_rd_r = 5f510193-a636-44b6-9ee7-011e7278ba9c & pd_rd_w = wCuCw & pd_rd_wg = ZGywm & pf_rd_p = ca22fd73-0f1e-4b39-9917-c84a20b3f3a8 & pf_rd_r = R77VP37VM7V6TX7BMPWE & psc = 1 & refRID = R77VP37VM7V6TX7BMPWE « météo Texte du Forecaster Easy Pass ") 51RlzcuwIBL.SX351_BO1,204,203,200.jpg

selon lui,

  1. Limite côté air chaud où sont concentrées les ** isothermes ** (sol, surface 850 hPa)
  2. L'extrémité sud (surface de 850 hPa) où sont concentrées les ** lignes de température équivalentes **
  3. ** La partie où la vitesse et la direction du vent ** changent soudainement
  4. Juger de manière exhaustive ** la zone humide ** et ** le bassin ascendant **

Il semble tracer une ligne de front sur cette base. Donc, il semble bon d'utiliser les éléments météorologiques qui correspondent à ceux-ci.

  1. pygrib

2.1 Qu'est-ce que pygrib?

pygrib est une bibliothèque capable de lire les fichiers au format GRIB2. Par exemple, la méthode d'installation est expliquée par les ancêtres suivants.

Préparer un environnement pour toucher les fichiers au format grib2 avec python (édition Docker)

2.2 Ouvrir le fichier GRIB

ʻOuvrez le fichier avec la méthode open` pour obtenir l'objet.

pygrib-open.py


import pygrib
import sys
import numpy as np
import math

(Omis)

# GRIB file settings.
_sourcedir = "./hogehoge/"
_GSMfilename = _sourcedir + "Z__C_RJTD_" + _yearstr + _monstr + _daystr + _hrstr + "0000_GSM_GPV_Rgl_FD0000_grib2.bin"

# Open GRIB file
grbs = pygrib.open(_GSMfilename)

Pour _yearstr, _monstr, _daystr et _hrstr, indiquez l'année, le mois, le jour et l'heure cibles sous forme de chaînes de caractères. Extrayez les données souhaitées de l'objet grbs en utilisant la méthode select avec quelques paramètres.

2.3 Extraire en spécifiant l'élément météorologique, le plan d'altitude et l'heure de prévision

Cette fois, nous en utiliserons trois, parameterName, level et ForecastTime.

Les noms de paramètres spécifiques varient en fonction de l'institution qui publie les données et du modèle météorologique. Dans le cas des données publiées par l'Agence météorologique japonaise

Site Web de l'Agence météorologique: Informations techniques sur les matériaux de distribution

Comme expliqué dans, n'est-il pas censé utiliser pygrib, et que doit-on spécifier pour parameterName? Je ne peux pas vous en parler.

Tableau 2-1. Paramètre spécifié pour parameterName

Paramètre spécifié Contenu
Pressure reduced to MSL Pression de correction du niveau de la mer((Unité Pa)
Temperature Température (notez qu'il s'agit d'une température absolue)
Relative humidity Humidité relative
Vertical velocity [pressure] Vitesse verticale du vent (coordonnées de pression)
u-component of wind Composante est-ouest de la vitesse horizontale du vent
v-component of wind Composante nord-sud de la vitesse horizontale du vent
Geopotential height Altitude géopotentielle
Low cloud cover Moins de nuages de nuages
Medium cloud cover Montant du nuage moyen
High cloud cover Nuage supérieur
Total cloud cover Volume total du cloud

Tableau 2-2. Paramètres de spécification de niveau

Paramètre spécifié Contenu
850 850hPa données de surface
700 Données de surface 700hPa
500 Données sur une surface de 500hPa
300 Données de surface 300hPa
0 Données de surface du sol (utilisées à la pression de correction du niveau de la mer)
2 Données de surface du sol (utilisées pour la température et l'humidité relative)
10 Données de surface au sol (utilisées à la vitesse du vent horizontal)

Tableau 2-3. Paramètres spécifiés de ForecastTime

Paramètre spécifié Contenu
0 Prévoir l'heure initiale
6 Données 6 heures après l'heure initiale
12 Données 12 heures après l'heure initiale
(Suite à intervalles de 6 heures par la suite)

En spécifiant une combinaison de ces éléments, vous pouvez extraire le type et l'altitude des données météorologiques que vous souhaitez utiliser à partir du fichier au format GRIB2.

pygrib-select.py



#- parameterName for select from GRIB file

letter_mslp = "Pressure reduced to MSL"
letter_tmp  = "Temperature"
letter_rh   = "Relative humidity"
letter_vv   = "Vertical velocity [pressure]"
letter_wu   = "u-component of wind"
letter_wv   = "v-component of wind"
letter_gh   = "Geopotential height"
letter_lc   = "Low cloud cover"
letter_mc   = "Medium cloud cover"
letter_hc   = "High cloud cover"
letter_tc   = "Total cloud cover"

#-- Surface

grb_tmp = grbs.select(parameterName=letter_tmp  , level=2 , forecastTime=0)
grb_prs = grbs.select(parameterName=letter_mslp , level=0 , forecastTime=0)
grb_wu  = grbs.select(parameterName=letter_wu   , level=10, forecastTime=0)
grb_wv  = grbs.select(parameterName=letter_wv   , level=10, forecastTime=0)
grb_rh  = grbs.select(parameterName=letter_rh   , level=2 , forecastTime=0)

#-- 850 hPa level

grb_tmp85 = grbs.select(parameterName=letter_tmp  , level=850 , forecastTime=0)
grb_wu85  = grbs.select(parameterName=letter_wu   , level=850 , forecastTime=0)
grb_wv85  = grbs.select(parameterName=letter_wv   , level=850 , forecastTime=0)
grb_rh85  = grbs.select(parameterName=letter_rh   , level=850 , forecastTime=0)
grb_gh85  = grbs.select(parameterName=letter_gh   , level=850 , forecastTime=0) 

#-- 700 hPa level 

grb_tmp70 = grbs.select(parameterName=letter_tmp  , level=700 , forecastTime=0)
grb_rh70  = grbs.select(parameterName=letter_rh   , level=700 , forecastTime=0)
grb_vv70  = grbs.select(parameterName=letter_vv   , level=700 , forecastTime=0)

#-- 500 hPa level

grb_tmp50 = grbs.select(parameterName=letter_tmp  , level=500 , forecastTime=0)
grb_wu50  = grbs.select(parameterName=letter_wu   , level=500 , forecastTime=0)
grb_wv50  = grbs.select(parameterName=letter_wv   , level=500 , forecastTime=0)
grb_rh50  = grbs.select(parameterName=letter_rh   , level=500 , forecastTime=0)
grb_gh50  = grbs.select(parameterName=letter_gh   , level=500 , forecastTime=0)

#-- 300 hPa level

grb_wu30  = grbs.select(parameterName=letter_wu   , level=300 , forecastTime=0)
grb_wv30  = grbs.select(parameterName=letter_wv   , level=300 , forecastTime=0)
grb_rh30  = grbs.select(parameterName=letter_rh   , level=300 , forecastTime=0) 

#-- Cloud coverage

grb_lc  = grbs.select(parameterName=letter_lc   , forecastTime=0)
grb_mc  = grbs.select(parameterName=letter_mc   , forecastTime=0)
grb_hc  = grbs.select(parameterName=letter_hc   , forecastTime=0)
grb_tc  = grbs.select(parameterName=letter_tc   , forecastTime=0)

Par exemple, les données de température sur la surface 850hPa sont accessibles sous la forme de grb_tmp85.values.

  1. MetPy

3.1 À propos de MetPy

Metpy est un projet qui dispose de divers outils liés à la météo.

[Page d'accueil Metpy](https://unidata.github.io/MetPy/latest/index.html «Metpy»)

May, R. M., Arms, S. C., Marsh, P., Bruning, E., Leeman, J. R., Goebbert, K., Thielen, J. E., and Bruick, Z., 2020: MetPy: A Python Package for Meteorological Data. Version 1.0.0rc1, Unidata, Accessed 14 January 2020. [Available online at https://github.com/Unidata/MetPy.] doi:10.5065/D6WW7G29.

3.2 Calcul du niveau de température équivalent, etc.

Le ** niveau de température équivalent ** doit être dérivé par calcul des valeurs de ** température ** et ** humidité relative ** obtenues directement à partir de GPV, mais la bibliothèque de calcul suivante incluse dans le calcul de MetPy est utilisée. Il peut être calculé facilement.

Calculer la ** température du point de rosée ** à partir de `` rosée_rh ** température ** et ** humidité relative ** ʻEquivalent_potential_temperature ** Le niveau de température équivalent ** est calculé à partir de ** température du point de rosée **, ** pression **, ** température **.

4. Ceci et cela de la carte

4.1 Méthode de projection

Puisque la position de la ligne de front est apprise à partir de la carte météorologique de rupture, il est nécessaire de faire correspondre le format et la plage de dessin de la carte image visualisée avec la carte météorologique de rupture.

Dois-je faire correspondre? C'est peut-être une exagération. C'était nécessaire dans ma méthode. Il peut être possible de créer un apprentissage automatique qui trace une ligne de front appropriée à partir d'un grand nombre de données, même si la plage est différente.

Puisque la terre est une sphère, vous savez qu'il existe différentes méthodes pour créer une carte plate, mais si vous regardez de près la carte météorologique préliminaire, elle est écrite plus étroite vers les latitudes plus élevées.

Les cartes météorologiques pour bulletins (SPAS) sont basées sur une projection stéréo polaire plutôt que sur une projection Mercator. Les informations techniques suivantes fournies par l'Agence météorologique comprennent ** "La carte est projetée à l'aide d'une projection stéréo polaire basée sur 60 degrés de latitude nord et 140 degrés de longitude est." ** Il y a une description qui. Information technique sur les matériaux de distribution (météorologie) n ° 358 Ces informations seront ensuite utilisées lors de la superposition des données sur la carte à l'aide du fond de carte matplotlib.

4.2 Plage de dessin

Je n'avais pas d'autre choix que de lire ceci sur la carte météorologique de rupture. Les paramètres de Basemap sont la latitude et la longitude du coin inférieur gauche et supérieur droit. J'ai compris la valeur spécifiée par ** Trial and Error ** comment elle est réellement imagée.

Le résultat est le suivant. Le point de base de la stéréo polaire est spécifié par lat_0 et lon_0. La latitude et la longitude en bas à gauche sont (115 ° E, 9 ° N) et la partie supérieure droite est (178 ° E, 54 ° N).

python


Basemap(projection='stere', llcrnrlat=9, urcrnrlat=54, llcrnrlon=115, urcrnrlon=178, lat_0=60,  lon_0=140, resolution='i' )

Sur cette base, j'ai dessiné la pression au sol (pression de correction du niveau de la mer) de UTC à 12h00 le 2 décembre. gsm_prs_srf_2019120212.v8.512.png Le graphique des temps de rupture est ci-dessous. SPAS_COLOR_201912021200.v8.512.png

Le GSM étant à l'origine des données mondiales, il y a suffisamment de données pour couvrir tout ce qui se trouve sur la terre, mais seule cette plage est utilisée. Je me sens un peu inutile. Bien qu'il s'agisse d'une carte visualisée, il y a des endroits où les bords sont un peu plus inquiétants que la carte météo, mais ce n'est pas grave.

5. Visualisation avec matplotlib

5.1 À propos de la visualisation

Je ne pense pas que vous ayez plus besoin d'expliquer matplotlib.

Les données météorologiques sont des données numériques alignées (latitude, longitude) sur la surface du sol ou sur une surface isobare à haute pression. Ceci est visualisé de sorte que CNN soit facile à apprendre, plutôt que d'être facile à voir pour les humains.

Il existe des cartes de contour et des diagrammes isobares pour visualiser des données bidimensionnelles. Dans les prévisions météorologiques, la gamme de couleurs de la température est silencieusement changée entre l'été et l'hiver, mais cette fois, compte tenu de l'apprentissage, nous la garderons dans la même gamme tout au long de l'année.

value_range.py


levels_prs    = np.arange(930.0,1080.0,4.0) #Pression de correction du niveau de la mer 930-Intervalle 1080hPa 4hPa
levels_tmp    = np.arange(210,316,2)        #Température(Kelvin) 210-Intervalle 316K 2K
levels_tmps   = np.arange(-35,45,2)         #Température(Celsius)-Intervalle de 35 ° C à 45 ° C 2 ° C
levels_dp     = np.arange(0,80,10)          #Température du point de rosée(Celsius)Non utilisé pour la visualisation
levels_dp2    = np.arange(0,3,1)            #Humidité(Celsius)0 ° C à 3 ° C intervalle de 1 ° C
levels_vv     = np.arange(-5,5,0.5)         #Vitesse verticale(P/s)  -5P/s-5P/s 0.5P/intervalle de s
levels_ept    = np.arange(200,400,3)        #Température équivalente(Kelvin) 200-Intervalle 400K 3K
levels_cld    = np.arange(-20,110,5)        #Volume du cloud(%)        0-110
levels_rh     = np.arange(0.0,110.0,5)      #Humidité relative(%)     0-110 5%intervalle
levels_gh_300 = np.arange(7000,10000,40)    #Altitude géopotentielle 7000-Intervalle de 10000m 40m
levels_gh_500 = np.arange(4500,6200,40)     #Altitude géopotentielle 4500-6200m intervalle de 40m
levels_gh_850 = np.arange(1000,2000,40)     #Altitude géopotentielle 1000-Intervalle de 2000m à 40m
levels_gh_700 = np.arange(2000,4000,40)     #Altitude géopotentielle 2000-Intervalle de 4000m à 40m

5.2 Visualisation des plumes, des contours et des courbes de niveau des flèches

Les types suivants d'entrées CNN sont utilisés cette fois.

  1. Surface du sol ** Température du vent Pression **
  2. 850hPa de surface ** Température du vent Pression ** (** Altitude géopotentielle **)
  3. 500hPa de surface ** Pression de température du vent ** (** Altitude géopotentielle **) Le vent exprime la vitesse et la direction du vent avec un diagramme en plumes de flèches (en utilisant la méthode des barbes de matplotlib). Remplacez le diagramme de contour pour la pression et le diagramme de contour et le contour de couleur pour la température. La pression est exprimée dans le ciel par l'élément appelé altitude géopotentielle. Dans le monde de la météorologie, les éléments météorologiques supérieurs sont représentés comme une distribution de hauteurs à une certaine pression. La pression atmosphérique diminue de façon exponentielle à mesure que l'altitude augmente. En fonction des pressions haute et basse, la hauteur du niveau de pression spécifié augmentera ou diminuera. C'est ce qu'on appelle l'altitude géopotentielle. Les candidats pour les ** fronts ** sont des zones où la température change rapidement et des zones où la direction du vent change rapidement. La source pour dessiner ces trois types de données les uns sur les autres est indiquée ci-dessous.

windmap



def windmap( u , v , values , levels , cmap , _save_filename , values2 , levels2 ):
        # u,v Composante est-ouest de la vitesse du vent, composante nord-sud de la vitesse du vent
        #valeurs données de pression
        #valeurs2 données de température
        # levels,niveaux de coloration 2
        #carte des couleurs cmap
        # _save_nom de fichier Enregistrer le nom de fichier

        fig,ax = plt.subplots(figsize=(6,5.8)) #Créer un diagramme
        plt.subplots_adjust(left=0.01, right=0.98, top=0.99, bottom=0.01) #Ajuster les marges

        #Créer une carte de projection stéréo polaire avec Basemap
        m = Basemap(projection='stere', llcrnrlat=9, urcrnrlat=54, llcrnrlon=115, urcrnrlon=178, lat_0=60,  lon_0=140, resolution='i' )
        m.drawparallels(np.arange(-80.,81.,10.))      #Tracez la ligne de latitude par incréments de 10 °
        m.drawmeridians(np.arange(-180.,181.,10.))    #Tracez une ligne de longitude par incréments de 10 °
        m.drawcoastlines()                            #Dessinez un littoral
        
        lons_s = lons[::5, ::5]   #Les points de dessin Kazeyaha sont sautés par 5 éléments
        lats_s = lats[::5, ::5]   #Les points de dessin Kazeyaha sont sautés par 5 éléments
        
        x , y    = m(lons, lats)     #Conversion de la latitude et de la longitude en coordonnées de dessin de fond de carte
        xs , ys  = m(lons_s, lats_s) #Conversion de la latitude et de la longitude en coordonnées de dessin de fond de carte
        us = u[::5, ::5]             #Les données de vent (composante est-ouest) sont ignorées par 5 éléments
        vs = v[::5, ::5]             #Les données de vent (composante nord-sud) sont ignorées par 5 éléments
        
        m.contour(  x , y , values  , levels=levels  , linewidths=0.7 , colors='k' )
        #Créer des courbes de niveau pour les valeurs
        m.contour(  x , y , values2 , levels=levels2 , linewidths=0.3 , colors='k' )
        #Créer des courbes de niveau pour les valeurs2
        m.contourf( x , y , values2 , levels2 , cmap=cmap )
        #Carte de contour couleur(values2)Créer par écrasement
        m.barbs( xs , ys , us , vs  , length=4.5 )
        #Créer une figure Yaha en écrasant
        fig.savefig(_save_filename)

5.3 Visualisation avec carte de contour

  1. Surface 850hPa ** Niveau de température équivalent ** Tout d'abord, il y a une quantité appelée ** niveau de température **, qui est la température lorsque l'air d'intérêt est porté à 1000 hPa. Lorsque l'air descend et la compression adiabatique, la température augmente, et quand elle augmente et l'expansion adiabatique se dilate, la température diminue. La quantité d'un tel concept est utilisée car il est difficile de comparer l'énergie thermique de l'air à moins qu'elle ne soit comparée à la même pression. De plus, si l'air contient de la vapeur d'eau, il libère de la chaleur latente et monte en température à mesure que la température baisse et se condense. Par conséquent, la quantité qui prend en compte la condensation de la vapeur d'eau est appelée le ** niveau de température équivalent **. Un indice qui évalue simultanément «la chaleur et l'humidité» lorsque vous entendez dans les prévisions météorologiques, comme à la fin de la saison des pluies, «de l'air chaud et humide viendra du sud et il pleuvra très fortement pour stimuler la ligne de front». est. Bien qu'il s'agisse d'un candidat pour la ** première ligne **, la zone où le niveau de température équivalent change soudainement est une zone prometteuse pour les candidats de première ligne.

  2. Surface 700hPa ** Humidité ** L'humidité est la différence entre la température et la température du point de rosée. Puisque la température du point de rosée est la température à laquelle la vapeur d'eau se condense, plus ce ** nombre d'humidité ** est petit, plus il est facile pour l'air de se condenser, c'est-à-dire que la quantité de vapeur d'eau est proche de la quantité de vapeur d'eau saturée, indiquant que l'air est humide. Dans la carte météorologique de grande hauteur publiée par l'Agence météorologique, la partie où l'humidité est de 3 ° C ou moins est tissée et est désignée comme ** zone humide **. Au voisinage du centre de la dépression et ** devant le front chaud **, l'air est souvent humide et pluvieux.

  3. Surface 700hPa ** Vent vertical ** La vitesse verticale du vent représente le mouvement vertical de l'air. Il peut monter lorsque l'air se rassemble et qu'il n'y a nulle part où aller, ou lorsqu'il frappe une pente de montagne. Lorsqu'elle monte, la température baisse et lorsqu'elle atteint la température du point de rosée, la vapeur d'eau contenue dans l'air se condense. Puisqu'il s'agit du début de l'activité des précipitations, les vents verticaux sont étroitement liés à l'activité des précipitations. De plus, ** le développement de basses pressions tempérées nécessite la montée de l'air le long de la surface avant chaude à l'avant et la chute de l'air le long du front froid à l'arrière **, donc un vent vertical est requis pour les phénomènes météorologiques y compris l'avant. Est grandement impliqué.

Ceux-ci sont visualisés par les sources suivantes. Par rapport à la précédente, il n'y a pas de carte Yaha et une autre carte de contour.

drawmap


def drawmap( values , levels , cmap , _save_filename ) :
        fig,ax = plt.subplots(figsize=(6,5.8))
        plt.subplots_adjust(left=0.01, right=0.98, top=0.99, bottom=0.01)
        m = Basemap(projection='stere', llcrnrlat=9, urcrnrlat=54, llcrnrlon=115, urcrnrlon=178, lat_0=60,  lon_0=140, resolution='i' )
        
        m.drawparallels(np.arange(-80.,81.,10.))
        m.drawmeridians(np.arange(-180.,181.,10.))
        m.drawcoastlines()
        x , y = m(lons, lats)
        #
        m.contour(  x , y , values , levels=levels , linewidths=0.5 , colors='k' )
        m.contourf( x , y , values , levels , cmap=cmap )
        #
        fig.savefig(_save_filename)

5.4 Fréquence de création des données de visualisation GSM

GSM effectue les valeurs initiales quatre fois par jour. Les heures sont 0 heures, 6 heures, 12 heures et 18 heures en UTC. En revanche, des cartes météo de rupture sont créées toutes les 3 heures sauf à minuit. En d'autres termes, en même temps, la valeur initiale et la carte météo sont alignées trois fois à 6h00, 12h00 et 18h00. J'ai décidé de faire des entrées et des données sur les enseignants pendant 3 ans.

Ci-dessous, une vidéo de janvier et août 2019. Les données ont été téléchargées à partir de la base de données GPV publiée par l'Institute for Living Areas de l'Université de Kyoto.

[Base de données sur les zones de survie de l'Institut de recherche sur la survie de l'Université de Kyoto](http://database.rish.kyoto-u.ac.jp/arch/jmadata/gpv-original.html "Base de données sur les zones de survie de l'Institut de recherche sur la survie de l'Université de Kyoto" Données de l'agence météorologique )

Je n'ai pas changé la gamme de couleurs, vous pouvez donc voir la différence entre l'été et l'hiver. Contrairement à un diagramme de visualisation normal, cela devient un bruit d'apprentissage, je n'ai donc pas ajouté de légende.

Vent / pression / température au sol janvier 2019 (le rouge est plus chaud, le bleu est plus froid) ww_wndsrf01.gif Vent / pression / température au sol août 2019 (le rouge est plus chaud, le bleu est plus froid) ww_wndsrf08.gif 850hPa Vent / Pression / Température Janvier 2019 (le rouge est plus chaud, le bleu est plus froid) ww_wnd8501.gif 850hPa Vent / Pression / Température Août 2019 (le rouge est plus chaud, le bleu est plus froid) ww_wnd8508.gif Vent / Pression / Température 500hPa Janvier 2019 (le rouge est plus chaud, le bleu est plus froid) ww_wnd5001.gif Vent / Pression / Température 500hPa Août 2019 (le rouge est plus chaud, le bleu est plus froid) ww_wnd5008.gif 850hPa température équivalente janvier 2019 (plus rouge est plus chaud et plus humide) ww_ept8501.gif 850hPa température équivalente août 2019 (plus rouge est plus chaud et plus humide) ww_ept8508.gif Humidité 700hPa Janvier 2019 (plus bleu, humidité inférieure = humide) ww_situ7001.gif Humidité 700hPa Août 2019 (plus bleu, humidité inférieure = humide) ww_situ7008.gif 700hPa Vent vertical janvier 2019 (le rouge est un flux ascendant, le bleu est un flux descendant) ww_vvl7001.gif 700hPa Vent vertical d'août 2019 (le rouge est un flux ascendant, le bleu est un flux descendant) ww_vvl7008.gif

Carte météo de rupture janvier 2019 ww201901.gif Carte météo de rupture août 2019 ww201908.gif

Résumé

Cette fois, c'est devenu très long, mais j'ai posté jusqu'à la visualisation des données météorologiques, qui est l'entrée pour l'apprentissage automatique. La prochaine fois, je publierai sur la façon d'extraire la ligne de front de la carte météorologique préliminaire, qui sont les données de l'enseignant pour l'apprentissage automatique.

[La prochaine fois: dessinons un "front de type carte météorologique" par apprentissage automatique basé sur les données météorologiques (3)](https://qiita.com/m-taque/items/4d5bb45e6b5dc42dc833 " Dessinons un "front de type carte météo" par apprentissage automatique (3) ")

Addenda

Comment identifier parameterName à partir du fichier GRIB2

C'est un peu flou, mais cela ouvre le fichier GRIB2 et répertorie les données qu'il contient.

>>> import pygrib
>>> grbs=pygrib.open("Z__C_RJTD_20181209000000_GSM_GPV_Rgl_FD0000_grib2.bin")
>>> for grb in grbs:
...     grb
... 
1:Pressure reduced to MSL:Pa (instant):regular_ll:meanSea:level 0:fcst time 0 hrs:from 201812090000
2:Surface pressure:Pa (instant):regular_ll:surface:level 0:fcst time 0 hrs:from 201812090000
3:10 metre U wind component:m s**-1 (instant):regular_ll:heightAboveGround:level 10 m:fcst time 0 hrs:from 201812090000
4:10 metre V wind component:m s**-1 (instant):regular_ll:heightAboveGround:level 10 m:fcst time 0 hrs:from 201812090000
5:2 metre temperature:K (instant):regular_ll:heightAboveGround:level 2 m:fcst time 0 hrs:from 201812090000
6:2 metre relative humidity:% (instant):regular_ll:heightAboveGround:level 2 m:fcst time 0 hrs:from 201812090000
7:Low cloud cover:% (instant):regular_ll:surface:level 0:fcst time 0 hrs:from 201812090000
8:Medium cloud cover:% (instant):regular_ll:surface:level 0:fcst time 0 hrs:from 201812090000
9:High cloud cover:% (instant):regular_ll:surface:level 0:fcst time 0 hrs:from 201812090000
10:Total cloud cover:% (instant):regular_ll:surface:level 0:fcst time 0 hrs:from 201812090000
11:Geopotential Height:gpm (instant):regular_ll:isobaricInhPa:level 100000.0 Pa:fcst time 0 hrs:from 201812090000
12:U component of wind:m s**-1 (instant):regular_ll:isobaricInhPa:level 100000.0 Pa:fcst time 0 hrs:from 201812090000
13:V component of wind:m s**-1 (instant):regular_ll:isobaricInhPa:level 100000.0 Pa:fcst time 0 hrs:from 201812090000

(Omis)

98:Vertical velocity:Pa s**-1 (instant):regular_ll:isobaricInhPa:level 2000.0 Pa:fcst time 0 hrs:from 201812090000
99:Geopotential Height:gpm (instant):regular_ll:isobaricInhPa:level 1000.0 Pa:fcst time 0 hrs:from 201812090000
100:U component of wind:m s**-1 (instant):regular_ll:isobaricInhPa:level 1000.0 Pa:fcst time 0 hrs:from 201812090000
101:V component of wind:m s**-1 (instant):regular_ll:isobaricInhPa:level 1000.0 Pa:fcst time 0 hrs:from 201812090000
102:Temperature:K (instant):regular_ll:isobaricInhPa:level 1000.0 Pa:fcst time 0 hrs:from 201812090000
103:Vertical velocity:Pa s**-1 (instant):regular_ll:isobaricInhPa:level 1000.0 Pa:fcst time 0 hrs:from 201812090000

Ici, par exemple, pour obtenir le `` paramaterName '' du 100ème enregistrement (il semble qu'il s'agisse de messages dans GRIB),

>>> f=grbs[100]
>>> f['parameterName']
'u-component of wind'

Vous pouvez vous y référer en spécifiant `` parameterName '' pour la clé.

pygrib documentation Si vous regardez, le premier champ après la liste est à l'origine un paramètre appelé nom, donc il ressemble à grb = grbs.select (nom = 'U composant du vent') [0] Il semble être utilisé pour le supprimer.

Cependant, à un moment donné, j'ai rencontré un message dans lequel le nom n'était pas défini et, à la suite de diverses recherches, je suis arrivé à parameterName. Je n'ai pas rencontré de message qui n'a pas cet ensemble jusqu'à présent.

En passant, la liste des clés de chaque message peut être récupérée comme suit.

>>> f.keys()
['globalDomain', 'GRIBEditionNumber', 'tablesVersionLatest', 'grib2divider', 'is_efas', 'angleSubdivisions', 'missingValue', 'ieeeFloats', 'isHindcast', 'section0Length', 'identifier', 'discipline', 'editionNumber', 'totalLength', 'sectionNumber', 'section1Length', 'numberOfSection', 'centre', 'centreDescription', 'subCentre', 'tablesVersion', 'masterDir', 'localTablesVersion', 'significanceOfReferenceTime', 'year', 'month', 'day', 'hour', 'minute', 'second', 'dataDate', 'julianDay', 'dataTime', 'productionStatusOfProcessedData', 'typeOfProcessedData', 'md5Section1', 'selectStepTemplateInterval', 'selectStepTemplateInstant', 'stepType', 'is_chemical', 'is_chemical_distfn', 'is_aerosol', 'is_aerosol_optical', 'setCalendarId', 'deleteCalendarId', 'is_uerra', 'sectionNumber', 'grib2LocalSectionPresent', 'deleteLocalDefinition', 'sectionNumber', 'gridDescriptionSectionPresent', 'section3Length', 'numberOfSection', 'sourceOfGridDefinition', 'numberOfDataPoints', 'numberOfOctectsForNumberOfPoints', 'interpretationOfNumberOfPoints', 'PLPresent', 'gridDefinitionTemplateNumber', 'gridDefinitionDescription', 'shapeOfTheEarth', 'scaleFactorOfRadiusOfSphericalEarth', 'scaledValueOfRadiusOfSphericalEarth', 'scaleFactorOfEarthMajorAxis', 'scaledValueOfEarthMajorAxis', 'scaleFactorOfEarthMinorAxis', 'scaledValueOfEarthMinorAxis', 'radius', 'Ni', 'Nj', 'basicAngleOfTheInitialProductionDomain', 'mBasicAngle', 'angleMultiplier', 'mAngleMultiplier', 'subdivisionsOfBasicAngle', 'angleDivisor', 'latitudeOfFirstGridPoint', 'longitudeOfFirstGridPoint', 'resolutionAndComponentFlags', 'resolutionAndComponentFlags1', 'resolutionAndComponentFlags2', 'iDirectionIncrementGiven', 'jDirectionIncrementGiven', 'uvRelativeToGrid', 'resolutionAndComponentFlags6', 'resolutionAndComponentFlags7', 'resolutionAndComponentFlags8', 'ijDirectionIncrementGiven', 'latitudeOfLastGridPoint', 'longitudeOfLastGridPoint', 'iDirectionIncrement', 'jDirectionIncrement', 'scanningMode', 'iScansNegatively', 'jScansPositively', 'jPointsAreConsecutive', 'alternativeRowScanning', 'iScansPositively', 'scanningMode5', 'scanningMode6', 'scanningMode7', 'scanningMode8', 'g2grid', 'latitudeOfFirstGridPointInDegrees', 'longitudeOfFirstGridPointInDegrees', 'latitudeOfLastGridPointInDegrees', 'longitudeOfLastGridPointInDegrees', 'iDirectionIncrementInDegrees', 'jDirectionIncrementInDegrees', 'latLonValues', 'latitudes', 'longitudes', 'distinctLatitudes', 'distinctLongitudes', 'gridType', 'md5Section3', 'sectionNumber', 'section4Length', 'numberOfSection', 'NV', 'neitherPresent', 'productDefinitionTemplateNumber', 'genVertHeightCoords', 'parameterCategory', 'parameterNumber', 'parameterUnits', 'parameterName', 'typeOfGeneratingProcess', 'backgroundProcess', 'generatingProcessIdentifier', 'hoursAfterDataCutoff', 'minutesAfterDataCutoff', 'indicatorOfUnitOfTimeRange', 'stepUnits', 'forecastTime', 'startStep', 'endStep', 'stepRange', 'stepTypeInternal', 'validityDate', 'validityTime', 'typeOfFirstFixedSurface', 'unitsOfFirstFixedSurface', 'nameOfFirstFixedSurface', 'scaleFactorOfFirstFixedSurface', 'scaledValueOfFirstFixedSurface', 'typeOfSecondFixedSurface', 'unitsOfSecondFixedSurface', 'nameOfSecondFixedSurface', 'scaleFactorOfSecondFixedSurface', 'scaledValueOfSecondFixedSurface', 'pressureUnits', 'typeOfLevel', 'level', 'bottomLevel', 'topLevel', 'tempPressureUnits', 'paramIdECMF', 'paramId', 'shortNameECMF', 'shortName', 'unitsECMF', 'units', 'nameECMF', 'name', 'cfNameECMF', 'cfName', 'cfVarNameECMF', 'cfVarName', 'modelName', 'ifsParam', 'PVPresent', 'deletePV', 'md5Section4', 'lengthOfHeaders', 'md5Headers', 'sectionNumber', 'section5Length', 'numberOfSection', 'numberOfValues', 'dataRepresentationTemplateNumber', 'packingType', 'referenceValue', 'referenceValueError', 'binaryScaleFactor', 'decimalScaleFactor', 'optimizeScaleFactor', 'bitsPerValue', 'typeOfOriginalFieldValues', 'md5Section5', 'sectionNumber', 'section6Length', 'numberOfSection', 'bitMapIndicator', 'bitmapPresent', 'md5Section6', 'sectionNumber', 'section7Length', 'numberOfSection', 'codedValues', 'values', 'packingError', 'unpackedError', 'maximum', 'minimum', 'average', 'numberOfMissing', 'standardDeviation', 'skewness', 'kurtosis', 'isConstant', 'changeDecimalPrecision', 'decimalPrecision', 'setBitsPerValue', 'getNumberOfValues', 'scaleValuesBy', 'offsetValuesBy', 'productType', 'md5Section7', 'section8Length', 'analDate', 'validDate']

Bien qu'il ne soit pas utilisé dans ce dessin de première ligne, c'est le parameterName utilisé lors de la visualisation du MSM.

Paramètre spécifié Contenu
Pressure reduced to MSL Pression de correction du niveau de la mer
Temperature Température
Relative humidity Humidité relative
Vertical velocity [pressure] Vitesse verticale (coordonnées de pression)
u-component of wind Composante est-ouest de la vitesse du vent
v-component of wind Composante nord-sud de la vitesse du vent
Geopotential height Altitude géopotentielle
Total precipitation Précipitation
Downward short-wave radiation flux Rayonnement à ondes courtes descendant
Low cloud cover Moins de nuages de nuages
Medium cloud cover Montant du nuage moyen
High cloud cover Nuage supérieur
Total cloud cover Volume total du cloud

Recommended Posts

Essayez de dessiner un "front de type carte météorologique" par apprentissage automatique basé sur des données météorologiques (5)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur les données météorologiques (3)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (1)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (4)
Essayez de dessiner un "front de type carte météo" par apprentissage automatique basé sur des données météorologiques (2)
Essayez de prédire la demande de puissance par l'apprentissage automatique
Histoire de l'analyse de données par apprentissage automatique
Les débutants en apprentissage automatique essaient de créer un arbre de décision
Essayez de dessiner une courbe de Bézier
Comment collecter des données d'apprentissage automatique
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage ((1) Implémentation du blackjack)
Recherche de blogs techniques par machine learning en mettant l'accent sur la "facilité de compréhension"
Essayez de prédire la valeur de la jauge de niveau d'eau par apprentissage automatique en utilisant les données ouvertes de Data City Sabae
[Apprentissage automatique] Créez un modèle d'apprentissage automatique en effectuant un apprentissage par transfert avec votre propre ensemble de données
Essayez de dessiner une courbe de vie avec python
Notes sur l'apprentissage automatique (mises à jour de temps en temps)
Essayez de créer une nouvelle commande sous Linux
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage (② Enregistrer l'environnement dans le gymnase)
Créer un environnement Python d'apprentissage automatique sur Mac OS
Essayez de prédire le taux de change (FX) avec un apprentissage automatique non approfondi
Prédiction de données chronologiques par AutoML (apprentissage automatique automatique)
[Apprentissage automatique] Essayez de détecter des objets à l'aide de la recherche sélective
xgboost: modèle d'apprentissage automatique efficace pour les données de table
Introduction à l'apprentissage automatique à partir de Simple Perceptron
Windows10 (x64) Créer nativement un environnement d'apprentissage automatique
Comment dessiner de manière interactive un pipeline d'apprentissage automatique avec scikit-learn et l'enregistrer au format HTML
Visualisation des données avec Python - La méthode de dessin simultané de graphes basés sur les attributs avec "Facet" est trop pratique
Essayez de faire une stratégie de blackjack en renforçant l'apprentissage (③ Renforcer l'apprentissage dans votre propre environnement OpenAI Gym))
Introduction à l'apprentissage automatique
Créer un environnement d'étude d'apprentissage automatique Python avec macOS Sierra
Créer un environnement d'apprentissage automatique sur Mac (pyenv, deeplearning, opencv)
Essayez de créer un réseau de neurones / d'apprentissage en profondeur avec scratch
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Collectez des données d'apprentissage automatique en grattant des bases de données publiques biosourcées
Introduction à l'apprentissage automatique avec scikit-learn - De l'acquisition de données à l'optimisation des paramètres
Utilisation d'icrawler plus simple pour la collecte de données d'apprentissage automatique
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
Dockerfile pour créer un environnement de science des données basé sur pip3
Les débutants en apprentissage automatique tentent de contacter Naive Bayes (2) - Mise en œuvre
Créez une IA qui identifie le visage de Zuckerberg grâce à l'apprentissage en profondeur ③ (Apprentissage des données)
Paramètres d'environnement d'apprentissage automatique basés sur Python3 sur Mac (coexistence avec Python2)
Les débutants en apprentissage automatique tentent de contacter Naive Bayes (1) - Théorie
Utilisation des données ouvertes de Data City Sabae pour prédire la valeur de la jauge de niveau d'eau par apprentissage automatique Partie 2
J'étais frustré par Kaggle, alors j'ai essayé de trouver une bonne propriété locative en grattant et en apprentissage automatique
Étapes rapides pour créer un environnement d'apprentissage automatique à l'aide de Jupyter Notebook sur macOS Sierra avec anaconda