Poursuivant avant-hier, je me demandais si je pouvais faire quelque chose en utilisant les données publiées par la préfecture de M. Shimane, et il semble que les données pluviométriques aient été publiées sur une large gamme, alors j'ai essayé de visualiser cela.
[Préfecture de Shimane] Dernières données de précipitations quotidiennes (pour 40 jours)
Tout d'abord, il y a une page de catalogue.
https://shimane-opendata.jp/db/organization/main
Il y a une page "données pluviométriques" dans la page du catalogue.
https://shimane-opendata.jp/db/dataset/010009
Il semble que les données pluviométriques enregistrées toutes les 10 minutes quotidiennement soient enregistrées au format CSV. Par exemple, si vous souhaitez télécharger les données du 30 juin, accédez à l'URL suivante.
https://shimane-opendata.jp/db/dataset/010009/resource/1a8248dd-cd5e-4985-b01f-6ac79fe72140
1er Juillet ...
https://shimane-opendata.jp/db/dataset/010009/resource/0c9ba4db-b8eb-4b90-8e38-10abf0fd01ee
cette? L'URL varie considérablement d'un jour à l'autre.
De plus, l'URL CSV est ...
https://shimane-opendata.jp/storage/download/1ddaef55-cc94-490c-bd3f-7efeec17fcf9/uryo_10min_20200701.csv
Oui, c'est difficile à utiliser!
Alors, essayons le travail de visualisation par la procédure suivante.
En passant, cette fois aussi, nous utiliserons Colaboratory.
Obtenez l'URL de la page quotidienne avec le script suivant.
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)
Obtenez l'URL CSV avec le script suivant.
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)
Lisez les données directement à partir de l'URL obtenue ci-dessus. Cependant, comme CSV est mélangé toutes les 10 minutes et toutes les heures, seules les 10 minutes sont ciblées ici. En passant, notez que le code de caractère est Shift JIS et que les deux premières lignes contiennent des informations autres que des données, excluez-les donc.
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()
Vous pouvez obtenir les informations de colonne en exécutant ce qui précède.
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2880 entries, 2 to 145
Columns: 345 entries,Observatoire à Sans nom: 344
dtypes: object(345)
memory usage: 7.6+ MB
... il y a aussi 345 colonnes.
Si vous regardez les données téléchargées dans Excel, vous pouvez voir qu'il y a des précipitations de 10 minutes et des précipitations cumulées pour chaque observatoire, et la colonne des précipitations cumulées est vide, j'ai donc décidé d'exclure la colonne des précipitations cumulées. Je vais.
À propos, l'explication des précipitations cumulées est la suivante.
Les précipitations cumulées sont la quantité cumulée de précipitations du début de la pluie à la fin de la pluie. La définition du début de la pluie est lorsque la pluie est de 0,0 mm à 0,5 mm ou plus, et la définition de la fin de la pluie est lorsque la pluie dépasse 6 heures après que la pluie n'est plus comptée. Réinitialiser.
Tout le monde semble avoir des données numériques sous forme de chaîne de caractères car Dtype est un objet ...
De plus, si vous regardez à l'intérieur, il semble que les caractères «non collectés», «données manquantes» et «maintenance» soient inclus. Après avoir supprimé ces informations de caractère, elles sont converties en une valeur réelle. Étant donné que les données de date et d'heure sont également une chaîne de caractères, elles doivent également être converties en une valeur de série.
Alors, exécutez le script suivant.
python
for col in df.columns:
if col.find("name") > 0:
df.pop(col)
df.index = df["Observatoire"].map(lambda _: pd.to_datetime(_))
df = df.sort_index()
df = df.replace('Non collecté', '-1')
df = df.replace('Disparu', '-1')
df = df.replace('Entretien', '-1')
cols = df.columns[1:]
for col in cols:
df[col] = df[col].astype("float")
Essayez de dessiner le graphique après avoir défini l'environnement afin que l'affichage japonais ne devienne pas étrange.
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()
Vous pouvez voir la pluie de ces derniers jours en un coup d'œil.
Eh bien, qu'allons-nous faire maintenant?
Recommended Posts