[PYTHON] Visualisons les données pluviométriques publiées par la préfecture de Shimane

introduction

Poursuivant avant-hier, je me demandais si je pouvais faire quelque chose en utilisant les données publiées par la préfecture de M. Shimane, et il semble que les données pluviométriques aient été publiées sur une large gamme, alors j'ai essayé de visualiser cela.

[Préfecture de Shimane] Dernières données de précipitations quotidiennes (pour 40 jours)

Vérifiez la procédure

Afficher la structure de la page publique

Page de catalogue

Tout d'abord, il y a une page de catalogue.

https://shimane-opendata.jp/db/organization/main

Page de pluie

Il y a une page "données pluviométriques" dans la page du catalogue.

https://shimane-opendata.jp/db/dataset/010009

Page de données quotidiennes

Il semble que les données pluviométriques enregistrées toutes les 10 minutes quotidiennement soient enregistrées au format CSV. Par exemple, si vous souhaitez télécharger les données du 30 juin, accédez à l'URL suivante.

https://shimane-opendata.jp/db/dataset/010009/resource/1a8248dd-cd5e-4985-b01f-6ac79fe72140

1er Juillet ...

https://shimane-opendata.jp/db/dataset/010009/resource/0c9ba4db-b8eb-4b90-8e38-10abf0fd01ee

cette? L'URL varie considérablement d'un jour à l'autre.

CSV quotidien

De plus, l'URL CSV est ...

https://shimane-opendata.jp/storage/download/1ddaef55-cc94-490c-bd3f-7efeec17fcf9/uryo_10min_20200701.csv

Oui, c'est difficile à utiliser!

procédure

Alors, essayons le travail de visualisation par la procédure suivante.

  1. Obtenez l'URL de la page quotidienne à partir de la page des données de précipitations
  2. Obtenez l'URL CSV à partir de la page URL quotidienne
  3. Obtenez des données à partir de l'URL CSV obtenue
  4. Traitement des données
  5. Visualisation

En passant, cette fois aussi, nous utiliserons Colaboratory.

Obtenez l'URL de la page quotidienne

Obtenez l'URL de la page quotidienne avec le script suivant.

python


import requests
from bs4 import BeautifulSoup

urlBase = "https://shimane-opendata.jp"
urlName = urlBase + "/db/dataset/010009"

def get_tag_from_html(urlName, tag):
  url = requests.get(urlName)
  soup = BeautifulSoup(url.content, "html.parser")
  return soup.find_all(tag)

def get_page_urls_from_catalogpage(urlName):
  urlNames = []
  elems = get_tag_from_html(urlName, "a")
  for elem in elems:
    try:
      string = elem.get("class")[0]
      if string in "heading":
        href = elem.get("href")
        if href.find("resource") > 0:
          urlNames.append(urlBase + href)
    except:
      pass
  return urlNames

urlNames = get_page_urls_from_catalogpage(urlName)
print(urlNames)

Obtenir l'URL CSV

Obtenez l'URL CSV avec le script suivant.

python


def get_csv_urls_from_url(urlName):
  urlNames = []
  elems = get_tag_from_html(urlName, "a")
  for elem in elems:
    try:
      href = elem.get("href")
      if href.find(".csv") > 0:
        urlNames.append(href)
    except:
      pass
  return urlNames[0]

urls = []

for urlName in urlNames:
  urls.append(get_csv_urls_from_url(urlName))

print(urls)

Récupérez les données de l'URL et créez un bloc de données

Lisez les données directement à partir de l'URL obtenue ci-dessus. Cependant, comme CSV est mélangé toutes les 10 minutes et toutes les heures, seules les 10 minutes sont ciblées ici. En passant, notez que le code de caractère est Shift JIS et que les deux premières lignes contiennent des informations autres que des données, excluez-les donc.

python


import pandas as pd

df = pd.DataFrame()

for url in urls:
    if url.find("10min") > 0:
        df = pd.concat([df, pd.read_csv(url, encoding="Shift_JIS").iloc[2:]])

df.shape

Confirmation et traitement des données

python


df.info()

Vous pouvez obtenir les informations de colonne en exécutant ce qui précède.

<class 'pandas.core.frame.DataFrame'>
Int64Index: 2880 entries, 2 to 145
Columns: 345 entries,Observatoire à Sans nom: 344
dtypes: object(345)
memory usage: 7.6+ MB

... il y a aussi 345 colonnes.

Si vous regardez les données téléchargées dans Excel, vous pouvez voir qu'il y a des précipitations de 10 minutes et des précipitations cumulées pour chaque observatoire, et la colonne des précipitations cumulées est vide, j'ai donc décidé d'exclure la colonne des précipitations cumulées. Je vais. スクリーンショット 2020-07-15 3.12.52.png

À propos, l'explication des précipitations cumulées est la suivante.

Les précipitations cumulées sont la quantité cumulée de précipitations du début de la pluie à la fin de la pluie. La définition du début de la pluie est lorsque la pluie est de 0,0 mm à 0,5 mm ou plus, et la définition de la fin de la pluie est lorsque la pluie dépasse 6 heures après que la pluie n'est plus comptée. Réinitialiser.

Tout le monde semble avoir des données numériques sous forme de chaîne de caractères car Dtype est un objet ...

De plus, si vous regardez à l'intérieur, il semble que les caractères «non collectés», «données manquantes» et «maintenance» soient inclus. Après avoir supprimé ces informations de caractère, elles sont converties en une valeur réelle. Étant donné que les données de date et d'heure sont également une chaîne de caractères, elles doivent également être converties en une valeur de série.

Alors, exécutez le script suivant.

python


for col in df.columns:
  if col.find("name") > 0:
    df.pop(col)

df.index = df["Observatoire"].map(lambda _: pd.to_datetime(_))
df = df.sort_index()

df = df.replace('Non collecté', '-1')
df = df.replace('Disparu', '-1')
df = df.replace('Entretien', '-1')

cols = df.columns[1:]

for col in cols:
  df[col] = df[col].astype("float")

Visualisation

Essayez de dessiner le graphique après avoir défini l'environnement afin que l'affichage japonais ne devienne pas étrange.

python


!pip install japanize_matplotlib

import matplotlib.pyplot as plt
import japanize_matplotlib 
import seaborn as sns

sns.set(font="IPAexGothic")

df[cols[:5]].plot(figsize=(15,5))
plt.show()

df["2020-07-12":][cols[:5]].plot(figsize=(15,5))
plt.show()

Unknown.png

Unknown-2.png

Vous pouvez voir la pluie de ces derniers jours en un coup d'œil.

Eh bien, qu'allons-nous faire maintenant?

Recommended Posts

Visualisons les données pluviométriques publiées par la préfecture de Shimane
Visualisons les données de niveau d'eau de la rivière publiées par la préfecture de Shimane
Visualisation des données par préfecture
Jouons avec le jeu de données d'analyse d'entreprise "CoARiJ" créé par TIS ①
Jouons avec le jeu de données d'analyse d'entreprise "CoARiJ" créé par TIS ②
Calculons la transition du nombre de reproduction de base du nouveau virus corona par préfecture
[Python] Visualisez les informations acquises par Wireshark
Visualisez les données d'exportation du journal Piyo
Visualisons la relation entre le salaire moyen et l'industrie avec des données XBRL et seaborn! (7/10)
Décidons le cours de date par optimisation de combinaison
Établissons un classement du nombre de reproductions efficaces du nouveau virus corona par préfecture