[PYTHON] Lassen Sie uns die von der Präfektur Shimane veröffentlichten Daten zum Flusswasserstand visualisieren

Einführung

Als ich gestern fortfuhr, fragte ich mich, ob ich mit den von der Präfektur Shimane veröffentlichten Daten etwas unternehmen könnte, und es scheint, dass die Wasserstandsdaten des Flusses über einen weiten Bereich veröffentlicht werden. Deshalb habe ich versucht, dies zu visualisieren.

[Präfektur Shimane] Täglich aktuelle Daten zum Flusswasserstand (für 40 Tage)

Überprüfen Sie das Verfahren

Zeigen Sie die Struktur der öffentlichen Seite an

Katalogseite

Zunächst gibt es eine Katalogseite.

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

Flusswasserstand Seite

Auf der Katalogseite befindet sich eine Seite mit "Flusswasserstandsdaten".

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

Tägliche Datenseite

Es scheint, dass die täglich alle 10 Minuten gespeicherten Flusswasserstandsdaten in CSV gespeichert werden. Wenn Sie beispielsweise die Daten für den 30. Juni herunterladen möchten, greifen Sie auf die folgende URL zu.

https://shimane-opendata.jp/db/dataset/010010/resource/88f86c3b-b609-45a2-b3b9-1949c459aeae

  1. Juli ...

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

Das? Die URL variiert stark von Tag zu Tag.

Tägliche CSV

Darüber hinaus lautet die CSV-URL ...

https://shimane-opendata.jp/storage/download/bf1d010d-940d-4f9e-82b0-2a3609300320/suii_10min_20200701.csv

Ja, es ist schwer zu bedienen!

Verfahren

Versuchen wir also die Visualisierungsarbeit wie folgt.

  1. Rufen Sie die tägliche Seiten-URL von der Seite mit den Flusswasserdaten ab
  2. Rufen Sie die CSV-URL von der täglichen URL-Seite ab
  3. Rufen Sie Daten von der erhaltenen CSV-URL ab
  4. Datenverarbeitung
  5. Visualisierung

Übrigens werden wir auch dieses Mal Colaboratory verwenden.

Holen Sie sich die URL der täglichen Seite

Rufen Sie die tägliche Seiten-URL mit dem folgenden Skript ab.

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)

CSV-URL abrufen

Rufen Sie die CSV-URL mit dem folgenden Skript ab.

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)

Holen Sie sich Daten von der URL und erstellen Sie einen Datenrahmen

Lesen Sie die Daten direkt von der oben angegebenen URL. Der Zeichencode lautet übrigens Shift JIS, und die ersten 5 Zeilen enthalten andere Informationen als Daten, sodass diese ausgeschlossen sind.

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

Datenbestätigung und -verarbeitung

python


df.info()

Sie können die Spalteninformationen abrufen, indem Sie die obigen Schritte ausführen.

<class 'pandas.core.frame.DataFrame'>
Int64Index: 2016 entries, 6 to 149
Data columns (total 97 columns):
 #   Column   Non-Null Count  Dtype 
---  ------   --------------  ----- 
0 Observatorium 2016 nicht-null   object
1 Iwasakibashi 2016 nicht-null   object
2 Otani 2016 nicht-null   object
3 Tamayugawa 2016 nicht-null   object
4 Kashima 2016 nicht-null   object
5 Mabashi River 2016 nicht-null   object
6 Hizugawa Wassertor stromaufwärts 2016 nicht-null   object
7 Downstream of Hitsugawa Water Gate 2016 nicht-null   object
8 Kitada River Water Gate Upstream 2016 nicht-null   object
9 Stromabwärts des Kitada River Water Gate 2016 nicht-null   object
10 Kyobashi River 2016 nicht-null   object
11 Kyobashi River Water Gate Upstream 2016 nicht-null   object
12 Kyobashi River Water Gate Downstream 2016 nicht-null   object
13 Upper Tekai Water Gate 2016 nicht-null   object
14 Stromabwärts des Tekai Water Gate 2016 nicht-null   object
15 Kanobashi 2016 nicht-null   object
16 Izumokyo 2016 nicht-null   object
17 Nunobe 2016 nicht-null   object
18 Owatari 2016 nicht-null   object
19 Yada 2016 nicht-null   object
20 Iiribashi 2016 nicht-null   object
21 Sa Shimoyama 2016 nicht-null   object
22 Großvater Tanigawa 2016 nicht-null   object
23 Hirotsuru Bridge 2016 nicht-null   object
24 Yasuki Ohashi 2016 nicht-null   object
25 Yoshidabashi 2016 nicht-null   object
26 Hinodebashi 2016 nicht-null   object
27 Kakeai Ohashi 2016 nicht-null   object
28 Sakayamabashi 2016 nicht-null   object
29 Kandabashi 1 2016 nicht-null   object
30 Hachiguchibashi 2016 nicht-null   object
31 Yagami 2016 nicht-null   object
32 Yokota Shin Ohashi 2016 nicht-null   object
33 Sansei Ohashi 2016 nicht-null   object
34 Shimbashi 2016 nicht-null   object
35 Takasegawa 2016 nicht-null   object
36 Goemonbashi 2016 nicht-null   object
37 Ron Tagawa 2016 nicht-null   object
38 Yutanigawa 2016 nicht-null   object
39 Nishihirata 2016 nicht-null   object
40 Ichibunbashi 2016 nicht-null   object
41 Nie 2016 nicht-null   object
42 Sada 2016 nicht-null   object
43 Kimurabashi 2016 nicht-null   object
44 Shin Naitogawa 2016 nicht-null   object
45 Akakawa 2016 nicht-null   object
46 Flow Bridge 2016 nicht-null   object
47 Touma River 2016 nicht-null   object
48 Kansai Lake 2016 nicht-null   object
49 Inogen 2016 nicht-null   object
50 Untermundfeder 2016 nicht-null   object
51 Kawai Bridge 2016 nicht-null   object
52 Yokaichibashi 2016 nicht-null   object
53 Masahara Bridge 2016 nicht-null   object
54 Exit 2016 nicht-null   object
55 Sonnenaufgang 2016 nicht-null   object
56 Kandabashi 2 2016 nicht-null   object
57 Nagahisa 2016 nicht-null   object
58 Kute 2016 nicht-null   object
59 Sashimi 2016 nicht-null   object
60 Takuno 2016 nicht-null   object
61 Zenkojibashi 2016 nicht-null   object
62 Furuichibashi 2016 nicht-null   object
63 Eo 2016 nicht-null   object
64 Tochiya 2016 nicht-null   object
65 Chikahara 2016 nicht-null   object
66 Hinuki 2016 nicht-null   object
67 Sieg 2016 nicht-null   object
68 Toji 2016 nicht-null   object
69 Fuchubashi 2016 nicht-null   object
70 Shimoraihara 2016 nicht-null   object
71 Sunako 2016 nicht-null   object
72 Sannomiyabashi 2016 nicht-null   object
73 Nakashiba Bridge 2016 nicht-null   object
74 Hamada Ohashi 2016 nicht-null   object
75 Hamada 2016 nicht-null   object
76 Nakaba 2016 nicht-null   object
77 Misumi 2016 nicht-null   object
78 Nishikawachi 2016 nicht-null   object
79 Keikawabashi 2016 nicht-null   object
80 Omichibashi 2016 nicht-null   object
81 Showabashi 2016 nicht-null   object
82 Somewa 2016 nicht-null   object
83 Asakura 2016 nicht-null   object
84 Kiamigawa 2016 nicht-null   object
85 Too Bridge 2016 nicht-null   object
86 Aioi Bridge 2016 nicht-null   object
87 Asahibashi 2016 nicht-null   object
88 Machida 2016 nicht-null   object
89 Nakajo 2016 nicht-null   object
90 Yaogawa 2016 nicht-null   object
91 Hatabashi 2016 nicht-null   object
92 Shintsutsumi Bridge 2016 nicht-null   object
93 Kiyomibashi 2016 nicht-null   object
94 Goka Ohashi 2016 nicht-null   object
95 Tomankawa 2016 nicht-null   object
96 Mita 2016 nicht-null   object
dtypes: object(97)
memory usage: 1.5+ MB

Jeder scheint numerische Daten als Zeichenfolge zu haben, da Dtype ein Objekt ist ...

Wenn Sie ein wenig hineinschauen, scheinen die Zeichenfolgen "nicht erfasst", "fehlende Daten" und "Wartung" enthalten zu sein. Nachdem diese Zeicheninformationen entfernt wurden, werden sie in einen realen Wert konvertiert. Da die Datums- und Uhrzeitdaten auch eine Zeichenfolge sind, muss diese ebenfalls in einen seriellen Wert konvertiert werden.

Führen Sie also das folgende Skript aus.

python


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

df = df.replace('Nicht gesammelt', '-1')
df = df.replace('Vermisst', '-1')
df = df.replace('Instandhaltung', '-1')

cols = df.columns[1:]

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

Visualisierung

Versuchen Sie, das Diagramm zu zeichnen, nachdem Sie die Umgebung so eingestellt haben, dass die japanische Anzeige nicht merkwürdig wird.

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

Es hat seit neulich geregnet, daher ist es offensichtlich, dass der Wasserstand steigt.

Nun, was machen wir jetzt?

Recommended Posts

Lassen Sie uns die von der Präfektur Shimane veröffentlichten Daten zum Flusswasserstand visualisieren
Lassen Sie uns die von der Präfektur Shimane veröffentlichten Niederschlagsdaten visualisieren
Lassen Sie uns den Bevölkerungsübergang von Matsue City, Präfektur Shimane, mit offenen Daten überprüfen
Gzip komprimiert Daten durch Streaming
Visualisierung von Daten nach Präfektur
Versuchen Sie, den Wert des Wasserstandsmessers durch maschinelles Lernen unter Verwendung der offenen Daten von Data City Sabae vorherzusagen
Spielen wir mit dem von TIS erstellten Unternehmensanalysedatensatz "CoARiJ"
Spielen wir mit dem von TIS erstellten Unternehmensanalysedatensatz "CoARiJ"
Berechnen wir den Übergang der Grundreproduktionszahl des neuen Koronavirus nach Präfektur