[PYTHON] Si vous avez des données sur le niveau de l'eau et les précipitations, vous voudrez les superposer, n'est-ce pas?

introduction

J'ai posté un article pour lire les données de niveau d'eau et de précipitations de l'autre jour, mais j'aimerais recevoir divers avis et cette fois j'aimerais superposer ces deux données. De plus, étant donné que vous pourrez voir l'état des fortes pluies l'autre jour à la même heure, je pense que c'est assez opportun.

Lecture des données

Créez une fonction pour lire chaque donnée en fonction des articles suivants créés jusqu'à présent.

python


#Bibliothèque
import requests
from bs4 import BeautifulSoup
import pandas as pd

#Obtenez une balise spécifique dans l'URL
def get_tag_from_html(urlName, tag):
  url = requests.get(urlName)
  soup = BeautifulSoup(url.content, "html.parser")
  return soup.find_all(tag)

#Obtenez l'URL de la page de données à partir de la page du catalogue
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

#Obtenir l'URL CSV à partir de la page de données
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]

#Traiter les données CSV acquises
def data_cleansing(df):
  
  print("set timestamp as index.")
  df.index = df["Observatoire"].map(lambda _: pd.to_datetime(_))
  df = df.sort_index()
  
  print("replace words to -1.")
  df = df.replace('Non collecté', '-1')
  df = df.replace('Disparu', '-1')
  df = df.replace('Entretien', '-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] + "_Accumulation"
  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

#Acquisition des données pluviométriques
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:
    #Uniquement pour les données toutes les 10 minutes
    if url.find("10min") > 0:
      df = pd.concat([df, pd.read_csv(url, encoding="Shift_JIS").iloc[2:]])

  return data_cleansing(df)

#Acquisition de données sur le niveau des eaux fluviales
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)

#Définir l'URL du domaine
urlBase = "https://shimane-opendata.jp"

Cette fois, nous permettons d'utiliser à la fois la quantité de pluie et la quantité de précipitations cumulée dans les données de précipitations.

Utilisez la fonction ci-dessus pour obtenir les données sur le niveau d'eau du fleuve et les précipitations comme suit.

python


df_rain = get_rain_data()
df_level = get_level_data()

Visualisation

Préparation

Soyez prêt pour que les caractères japonais ne soient pas altérés dans le graphique.

python


#Préparation à la visualisation
!pip install japanize_matplotlib

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

sns.set(font="IPAexGothic")

pluie

Extrayons seulement 5 et faisons un graphique.

python


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

Unknown.png

Vous pouvez voir que la quantité de pluie à partir du 13 est très forte.

Niveau d'eau de la rivière

De la même manière, je vais extraire quelques extraits et les représenter graphiquement.

python


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

Unknown-2.png

De même, vous pouvez voir que le niveau de l'eau monte lorsqu'il y a beaucoup de pluie.

Recouvrir

Obtenez la plage dans laquelle le niveau d'eau du fleuve et les précipitations existent dans les informations de date des données.

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()

Créez une fonction pour acquérir les données du niveau de l'eau du fleuve et des précipitations en spécifiant le nom de la colonne.

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 + "_pluie[mm]")

  df.columns = new_cols

  for col in cols_level:
    df[col + "_Niveau d'eau[cm]"] = df_level[idx_min: idx_max][col] * 100

  df.tail()
  return df

À l'aide de la fonction ci-dessus, créez une fonction pour spécifier un nom de colonne et le représenter graphiquement.

python


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

  #Dessinez toute la plage
  df.plot(figsize=(15,5))
  plt.show()

  #Tirage après le 12 juillet
  df["2020-07-12":].plot(figsize=(15,5))
  plt.show()

Dessinez un graphique en spécifiant une colonne appropriée.

python


cols_rain = ["Matsue_gawa_Accumulation"]
cols_level = ["Rivière Kyobashi"]

plot(cols_rain, cols_level)

Unknown-3.png

Unknown-4.png

Ici, il semble que le niveau de l'eau du fleuve soit divisé en parties susceptibles d'être corrélées aux précipitations et en parties peu probables.

Peut-être que l'impact de la montée des eaux à marée haute est plus important que la quantité de pluie. En outre, la quantité de pluie peut être affectée lorsqu'elle dépasse un certain niveau.

... Je ne suis pas un expert, donc je ne suis pas sûr. Transpiration

Dans tous les cas, j'ai trouvé que s'il y avait des données, elles pouvaient être facilement visualisées et des données séparées pouvaient être superposées et examinées.

Si vous avez un tel besoin, nous sommes impatients de vous entendre! De plus, si vous avez les données, je pense que ce sera amusant de faire diverses choses si vous les publiez de la même manière.

Recommended Posts

Si vous avez des données sur le niveau de l'eau et les précipitations, vous voudrez les superposer, n'est-ce pas?
Je veux savoir si vous installez Python sur Mac ・ Iroha