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.
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()
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")
Extrayons seulement 5 et faisons un graphique.
python
cols = df_rain.columns[1:]
df_rain[cols[:5]].plot(figsize=(15,5))
Vous pouvez voir que la quantité de pluie à partir du 13 est très forte.
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))
De même, vous pouvez voir que le niveau de l'eau monte lorsqu'il y a beaucoup de pluie.
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)
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.