Als ich vorgestern fortfuhr, fragte ich mich, ob ich mit den von Mr. Shimane veröffentlichten Daten etwas unternehmen könnte, und es scheint, dass die Niederschlagsdaten über einen weiten Bereich veröffentlicht wurden, also habe ich versucht, dies zu visualisieren.
[Präfektur Shimane] Täglich aktuelle Niederschlagsdaten (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 "Niederschlagsdaten".
https://shimane-opendata.jp/db/dataset/010009
Es scheint, dass die täglich alle 10 Minuten gespeicherten Niederschlagsdaten 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/010009/resource/1a8248dd-cd5e-4985-b01f-6ac79fe72140
https://shimane-opendata.jp/db/dataset/010009/resource/0c9ba4db-b8eb-4b90-8e38-10abf0fd01ee
Das? Die URL variiert stark von Tag zu Tag.
Darüber hinaus lautet die CSV-URL ...
https://shimane-opendata.jp/storage/download/1ddaef55-cc94-490c-bd3f-7efeec17fcf9/uryo_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/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)
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. Da CSV jedoch alle 10 Minuten und jede Stunde gemischt wird, wird hier nur alle 10 Minuten angestrebt. Beachten Sie übrigens, dass der Zeichencode Shift JIS ist und die ersten beiden Zeilen andere Informationen als Daten enthalten. Schließen Sie sie daher aus.
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
python
df.info()
Sie können die Spalteninformationen abrufen, indem Sie die obigen Schritte ausführen.
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2880 entries, 2 to 145
Columns: 345 entries,Observatorium zu Unbenannt: 344
dtypes: object(345)
memory usage: 7.6+ MB
... gibt es auch 345 Spalten.
Wenn Sie sich die heruntergeladenen Daten in Excel ansehen, können Sie feststellen, dass es für jedes Observatorium 10-minütige Niederschläge und kumulative Niederschläge gibt und die Spalte für kumulative Niederschläge leer ist. Daher habe ich beschlossen, die Spalte für kumulative Niederschläge auszuschließen. Ich werde.
Die Erklärung des kumulierten Niederschlags lautet übrigens wie folgt.
Kumulativer Niederschlag ist die kumulierte Niederschlagsmenge vom Beginn des Regens bis zum Ende des Regens. Die Definition des Beginns des Regens ist, wenn der Niederschlag 0,0 mm bis 0,5 mm oder mehr beträgt, und die Definition des Endes des Niederschlags ist, wenn er 6 Stunden überschreitet, nachdem der Niederschlag nicht gezählt wurde, und der kumulierte Niederschlag am Ende des Niederschlags berechnet wird. Zurücksetzen.
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
for col in df.columns:
if col.find("name") > 0:
df.pop(col)
df.index = df["Observatorium"].map(lambda _: pd.to_datetime(_))
df = df.sort_index()
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":][cols[:5]].plot(figsize=(15,5))
plt.show()
Sie können den Regen der letzten Tage auf einen Blick sehen.
Nun, was machen wir jetzt?
Recommended Posts