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)
Zunächst gibt es eine Katalogseite.
https://shimane-opendata.jp/db/organization/main
Auf der Katalogseite befindet sich eine Seite mit "Flusswasserstandsdaten".
https://shimane-opendata.jp/db/dataset/010010
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
https://shimane-opendata.jp/db/dataset/010010/resource/2db49bb8-1e87-4f7d-9bc3-3e3c5d188044
Das? Die URL variiert stark von Tag zu Tag.
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!
Versuchen wir also die Visualisierungsarbeit wie folgt.
Übrigens werden wir auch dieses Mal Colaboratory verwenden.
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)
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)
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
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")
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()
Es hat seit neulich geregnet, daher ist es offensichtlich, dass der Wasserstand steigt.
Nun, was machen wir jetzt?
Recommended Posts