[PYTHON] Visualisons les données de niveau d'eau de la rivière publiées par la préfecture de Shimane

introduction

Dans la continuité d'hier, je me demandais si je pouvais faire quelque chose en utilisant les données publiées par M. Shimane, et il semble que les données sur le niveau d'eau de la rivière soient diffusées sur une large gamme, alors j'ai essayé de visualiser cela.

[Préfecture de Shimane] Dernières données quotidiennes sur le niveau de l'eau de la rivière (pendant 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 niveau d'eau de la rivière

Il y a une page de "Données sur le niveau des eaux fluviales" dans la page catalogue.

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

Page de données quotidiennes

Il semble que les données de niveau d'eau de la rivière enregistrées toutes les 10 minutes sur une base quotidienne 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/010010/resource/88f86c3b-b609-45a2-b3b9-1949c459aeae

1er Juillet ...

https://shimane-opendata.jp/db/dataset/010010/resource/2db49bb8-1e87-4f7d-9bc3-3e3c5d188044

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/bf1d010d-940d-4f9e-82b0-2a3609300320/suii_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 de données sur le niveau d'eau
  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/010010"

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)

Obtenez des données depuis l'URL et créez un bloc de données

Lisez les données directement à partir de l'URL obtenue ci-dessus. À propos, le code de caractère est Shift JIS, et les 5 premières lignes contiennent des informations autres que des données, ce qui est exclu.

python


import pandas as pd

df = pd.DataFrame()

for url in urls:
    df = pd.concat([df, pd.read_csv(url, encoding="Shift_JIS").iloc[6:]])

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: 2016 entries, 6 to 149
Data columns (total 97 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
0 Observatoire 2016 non-null   object
1 Iwasakibashi 2016 non-null   object
2 Otani 2016 non-null   object
3 Tamayugawa 2016 non-null   object
4 Kashima 2016 non-null   object
5 Rivière Mabashi 2016 non-null   object
6 Porte d'eau Hizugawa en amont 2016 non-null   object
7 En aval de Hitsugawa Water Gate 2016 non-null   object
8 Porte d'eau de la rivière Kitada en amont 2016 non-null   object
9 En aval de la porte d'eau de la rivière Kitada 2016 non-null   object
10 Rivière Kyobashi 2016 non-null   object
11 Porte d'eau de la rivière Kyobashi en amont 2016 non-null   object
12 Porte d'eau de la rivière Kyobashi en aval 2016 non-null   object
13 Upper Tekai Water Gate 2016 non-null   object
14 En aval de Tekai Water Gate 2016 non-null   object
15 Kanobashi 2016 non-null   object
16 Izumokyo 2016 non-null   object
17 Nunobe 2016 non-null   object
18 Owatari 2016 non-null   object
19 Yada 2016 non-null   object
20 Iiribashi 2016 non-null   object
21 Sa Shimoyama 2016 non-null   object
22 Grand-père Tanigawa 2016 non-null   object
23 Pont Hirotsuru 2016 non-null   object
24 Yasuki Ohashi 2016 non-null   object
25 Yoshidabashi 2016 non-null   object
26 Hinodebashi 2016 non-null   object
27 Kakeai Ohashi 2016 non-null   object
28 Sakayamabashi 2016 non-null   object
29 Kandabashi 1 2016 non-null   object
30 Hachiguchibashi 2016 non-null   object
31 Yagami 2016 non-null   object
32 Yokota Shin Ohashi 2016 non-null   object
33 Sansei Ohashi 2016 non-null   object
34 Shimbashi 2016 non-null   object
35 Takasegawa 2016 non-null   object
36 Goemonbashi 2016 non-null   object
37 Ron Tagawa 2016 non-null   object
38 Yutanigawa 2016 non-null   object
39 Nishihirata 2016 non-null   object
40 Ichibunbashi 2016 non-null   object
41 Nie 2016 non-null   object
42 Sada 2016 non-null   object
43 Kimurabashi 2016 non-null   object
44 Shin Naitogawa 2016 non-null   object
45 Akakawa 2016 non-null   object
46 Flow Bridge 2016 non-null   object
47 Rivière Touma 2016 non-null   object
48 Lac Kansai 2016 non-null   object
49 Inogen 2016 non-null   object
50 Plume de la bouche inférieure 2016 non-null   object
51 Pont Kawai 2016 non-null   object
52 Yokaichibashi 2016 non-null   object
53 Pont Masahara 2016 non-null   object
54 Sortie 2016 non-null   object
55 sunrise 2016 non-null   object
56 Kandabashi 2 2016 non-null   object
57 Nagahisa 2016 non-null   object
58 Kute 2016 non-null   object
59 Sashimi 2016 non-null   object
60 Takuno 2016 non-null   object
61 Zenkojibashi 2016 non-null   object
62 Furuichibashi 2016 non-null   object
63 Eo 2016 non-null   object
64 Tochiya 2016 non-null   object
65 Chikahara 2016 non-null   object
66 Hinuki 2016 non-null   object
67 Victoire 2016 non-null   object
68 Toji 2016 non-null   object
69 Fuchubashi 2016 non-null   object
70 Shimoraihara 2016 non-null   object
71 Sunako 2016 non-null   object
72 Sannomiyabashi 2016 non-null   object
73 Pont Nakashiba 2016 non-null   object
74 Hamada Ohashi 2016 non-null   object
75 Hamada 2016 non-null   object
76 Nakaba 2016 non-null   object
77 Misumi 2016 non-null   object
78 Nishikawachi 2016 non-null   object
79 Keikawabashi 2016 non-null   object
80 Omichibashi 2016 non-null   object
81 Showabashi 2016 non-null   object
82 Somewa 2016 non-null   object
83 Asakura 2016 non-null   object
84 Kiamigawa 2016 non-null   object
85 Too Bridge 2016 non-null   object
86 Pont Aioi 2016 non-null   object
87 Asahibashi 2016 non-null   object
88 Machida 2016 non-null   object
89 Nakajo 2016 non-null   object
90 Yaogawa 2016 non-null   object
91 Hatabashi 2016 non-null   object
92 Pont Shintsutsumi 2016 non-null   object
93 Kiyomibashi 2016 non-null   object
94 Goka Ohashi 2016 non-null   object
95 Tomankawa 2016 non-null   object
96 Mita 2016 non-null   object
dtypes: object(97)
memory usage: 1.5+ MB

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

Aussi, si vous regardez un peu à l'intérieur, il semble que les chaînes de caractères «non collectées», «données manquantes» et «maintenance» soient incluses. 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 valeur de série.

Alors, exécutez le script suivant.

python


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

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":"2020-07-13"][cols[:5]].plot(figsize=(15,5))
plt.show()

Unknown-5.png

Unknown-6.png

Il pleut depuis l'autre jour, il est donc évident que le niveau de l'eau monte.

Eh bien, qu'allons-nous faire maintenant?

Recommended Posts

Visualisons les données de niveau d'eau de la rivière publiées par la préfecture de Shimane
Visualisons les données pluviométriques publiées par la préfecture de Shimane
Vérifions la transition démographique de la ville de Matsue, préfecture de Shimane avec des données ouvertes
Gzip compresser les données en streaming
Visualisation des données par préfecture
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
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