[PYTHON] Wenn Sie Daten zum Flusswasserstand und zum Niederschlag haben, möchten Sie diese überlagern, oder?

Einführung

Ich habe einen Artikel veröffentlicht, um die Daten des Flusswasserspiegels und des Niederschlags vom anderen Tag zu lesen, aber ich möchte verschiedene Meinungen erhalten und dieses Mal möchte ich diese beiden Daten überlappen. Auch wenn man bedenkt, dass man neulich zur gleichen Zeit den Zustand des starken Regens sehen kann, denke ich, dass es ziemlich aktuell ist.

Daten lesen

Erstellen Sie eine Funktion zum Lesen aller Daten basierend auf den folgenden bisher erstellten Artikeln.

python


#Bibliothek
import requests
from bs4 import BeautifulSoup
import pandas as pd

#Holen Sie sich ein bestimmtes Tag in der URL
def get_tag_from_html(urlName, tag):
  url = requests.get(urlName)
  soup = BeautifulSoup(url.content, "html.parser")
  return soup.find_all(tag)

#Rufen Sie die URL der Datenseite von der Katalogseite ab
def get_page_urls_from_catalog(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

#CSV-URL von der Datenseite abrufen
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]

#Verarbeiten Sie die erfassten CSV-Daten
def data_cleansing(df):
  
  print("set timestamp as index.")
  df.index = df["Observatorium"].map(lambda _: pd.to_datetime(_))
  df = df.sort_index()
  
  print("replace words to -1.")
  df = df.replace('Nicht gesammelt', '-1')
  df = df.replace('Vermisst', '-1')
  df = df.replace('Instandhaltung', '-1')

  print("edit name of columns.")
  cols = df.columns.tolist()
  for i in range(len(cols)):
    if cols[i].find("name") > 0:
      cols[i] = cols[i-1] + "_Akkumulation"
  df.columns = cols

  print("change data type to float.")
  cols = df.columns[1:]
  for col in cols:
    df[col] = df[col].astype("float")

  return df

#Erfassung von Niederschlagsdaten
def get_rain_data():

  urlName = urlBase + "/db/dataset/010009"

  urlNames = get_page_urls_from_catalog(urlName)

  urls = []

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

  df = pd.DataFrame()

  for url in urls:
    #Nur für Daten alle 10 Minuten
    if url.find("10min") > 0:
      df = pd.concat([df, pd.read_csv(url, encoding="Shift_JIS").iloc[2:]])

  return data_cleansing(df)

#Erfassung von Flusswasserstandsdaten
def get_level_data():

  urlName = urlBase + "/db/dataset/010010"

  urlNames = get_page_urls_from_catalog(urlName)

  urls = []

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

  df = pd.DataFrame()

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

  return data_cleansing(df)

#Legen Sie die Domain-URL fest
urlBase = "https://shimane-opendata.jp"

Dieses Mal ermöglichen wir es, sowohl die Niederschlagsmenge als auch die kumulierte Niederschlagsmenge in den Niederschlagsdaten zu verwenden.

Verwenden Sie die obige Funktion, um den Flusswasserstand und die Niederschlagsdaten wie folgt abzurufen.

python


df_rain = get_rain_data()
df_level = get_level_data()

Visualisierung

Vorbereitung

Seien Sie darauf vorbereitet, dass japanische Zeichen in der Grafik nicht verstümmelt werden.

python


#Vorbereitung zur Visualisierung
!pip install japanize_matplotlib

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

sns.set(font="IPAexGothic")

Regenfall

Lassen Sie uns nur 5 extrahieren und ein Diagramm erstellen.

python


cols = df_rain.columns[1:]
df_rain[cols[:5]].plot(figsize=(15,5))

Unknown.png

Sie können sehen, dass die Regenmenge vom 13. sehr stark ist.

Flusswasserstand

Auf die gleiche Weise werde ich einige Auszüge extrahieren und grafisch darstellen.

python


cols = df_level.columns[1:]
df_level[cols[:5]].plot(figsize=(15,5))

Unknown-2.png

Ebenso können Sie sehen, dass der Wasserstand steigt, wenn es viel regnet.

Überlagerung

Ermitteln Sie den Bereich, in dem sowohl der Flusswasserspiegel als auch der Niederschlag in den Datumsinformationen der Daten vorhanden sind.

python


idx_min = df_rain.index.min()
idx_max = df_rain.index.max()

idx_min = idx_min if df_level.index.min() < idx_min else df_level.index.min()
idx_max = idx_max if df_level.index.max() > idx_max else df_level.index.max()

Erstellen Sie eine Funktion zum Erfassen der Daten zum Flusswasserstand und zum Niederschlag, indem Sie den Spaltennamen angeben.

python


def get_marged_dataframe(cols_rain, cols_level):

  df = pd.DataFrame()

  df = df_rain[idx_min:idx_max][cols_rain]

  new_cols = []
  for col in cols_rain:
    new_cols.append(col + "_Regenfall[mm]")

  df.columns = new_cols

  for col in cols_level:
    df[col + "_Wasserstand[cm]"] = df_level[idx_min: idx_max][col] * 100

  df.tail()
  return df

Erstellen Sie mit der obigen Funktion eine Funktion, um einen Spaltennamen anzugeben und grafisch darzustellen.

python


def plot(cols_rain, cols_level):
  df = get_marged_dataframe(cols_rain, cols_level)

  #Zeichnen Sie den gesamten Bereich
  df.plot(figsize=(15,5))
  plt.show()

  #Unentschieden nach dem 12. Juli
  df["2020-07-12":].plot(figsize=(15,5))
  plt.show()

Zeichnen Sie ein Diagramm, indem Sie eine entsprechende Spalte angeben.

python


cols_rain = ["Matsue_gawa_Akkumulation"]
cols_level = ["Kyobashi Fluss"]

plot(cols_rain, cols_level)

Unknown-3.png

Unknown-4.png

Hier scheint der Flusswasserspiegel in Teile unterteilt zu sein, die wahrscheinlich mit Regenfällen korrelieren, und Teile, die unwahrscheinlich sind.

Vielleicht ist die Auswirkung von steigendem Wasser bei Flut größer als die Niederschlagsmenge. Auch die Niederschlagsmenge kann beeinträchtigt werden, wenn sie ein bestimmtes Niveau überschreitet.

... Ich bin kein Experte, also bin ich mir nicht sicher. Schweiß

Auf jeden Fall stellte ich fest, dass Daten, die vorhanden waren, leicht visualisiert und separate Daten überlagert und untersucht werden konnten.

Wenn Sie ein solches Bedürfnis haben, freuen wir uns von Ihnen zu hören! Wenn Sie die Daten haben, wird es meiner Meinung nach Spaß machen, verschiedene Dinge zu tun, wenn Sie sie auf die gleiche Weise veröffentlichen.

Recommended Posts

Wenn Sie Daten zum Flusswasserstand und zum Niederschlag haben, möchten Sie diese überlagern, oder?
Ich möchte wissen, ob Sie Python auf Mac ・ Iroha installieren