Dans la continuité d'hier, je me demandais si je pouvais faire quelque chose en utilisant les données publiées par M. Shimane, et il semble que les données sur le niveau d'eau de la rivière soient diffusées sur une large gamme, alors j'ai essayé de visualiser cela.
Tout d'abord, il y a une page de catalogue.
https://shimane-opendata.jp/db/organization/main
Il y a une page de "Données sur le niveau des eaux fluviales" dans la page catalogue.
https://shimane-opendata.jp/db/dataset/010010
Il semble que les données de niveau d'eau de la rivière enregistrées toutes les 10 minutes sur une base quotidienne 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/010010/resource/88f86c3b-b609-45a2-b3b9-1949c459aeae
1er Juillet ...
https://shimane-opendata.jp/db/dataset/010010/resource/2db49bb8-1e87-4f7d-9bc3-3e3c5d188044
cette? L'URL varie considérablement d'un jour à l'autre.
De plus, l'URL CSV est ...
https://shimane-opendata.jp/storage/download/bf1d010d-940d-4f9e-82b0-2a3609300320/suii_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/010010"
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. À propos, le code de caractère est Shift JIS, et les 5 premières lignes contiennent des informations autres que des données, ce qui est exclu.
python
import pandas as pd
df = pd.DataFrame()
for url in urls:
df = pd.concat([df, pd.read_csv(url, encoding="Shift_JIS").iloc[6:]])
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: 2016 entries, 6 to 149
Data columns (total 97 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Observatoire 2016 non-null object
1 Iwasakibashi 2016 non-null object
2 Otani 2016 non-null object
3 Tamayugawa 2016 non-null object
4 Kashima 2016 non-null object
5 Rivière Mabashi 2016 non-null object
6 Porte d'eau Hizugawa en amont 2016 non-null object
7 En aval de Hitsugawa Water Gate 2016 non-null object
8 Porte d'eau de la rivière Kitada en amont 2016 non-null object
9 En aval de la porte d'eau de la rivière Kitada 2016 non-null object
10 Rivière Kyobashi 2016 non-null object
11 Porte d'eau de la rivière Kyobashi en amont 2016 non-null object
12 Porte d'eau de la rivière Kyobashi en aval 2016 non-null object
13 Upper Tekai Water Gate 2016 non-null object
14 En aval de Tekai Water Gate 2016 non-null object
15 Kanobashi 2016 non-null object
16 Izumokyo 2016 non-null object
17 Nunobe 2016 non-null object
18 Owatari 2016 non-null object
19 Yada 2016 non-null object
20 Iiribashi 2016 non-null object
21 Sa Shimoyama 2016 non-null object
22 Grand-père Tanigawa 2016 non-null object
23 Pont Hirotsuru 2016 non-null object
24 Yasuki Ohashi 2016 non-null object
25 Yoshidabashi 2016 non-null object
26 Hinodebashi 2016 non-null object
27 Kakeai Ohashi 2016 non-null object
28 Sakayamabashi 2016 non-null object
29 Kandabashi 1 2016 non-null object
30 Hachiguchibashi 2016 non-null object
31 Yagami 2016 non-null object
32 Yokota Shin Ohashi 2016 non-null object
33 Sansei Ohashi 2016 non-null object
34 Shimbashi 2016 non-null object
35 Takasegawa 2016 non-null object
36 Goemonbashi 2016 non-null object
37 Ron Tagawa 2016 non-null object
38 Yutanigawa 2016 non-null object
39 Nishihirata 2016 non-null object
40 Ichibunbashi 2016 non-null object
41 Nie 2016 non-null object
42 Sada 2016 non-null object
43 Kimurabashi 2016 non-null object
44 Shin Naitogawa 2016 non-null object
45 Akakawa 2016 non-null object
46 Flow Bridge 2016 non-null object
47 Rivière Touma 2016 non-null object
48 Lac Kansai 2016 non-null object
49 Inogen 2016 non-null object
50 Plume de la bouche inférieure 2016 non-null object
51 Pont Kawai 2016 non-null object
52 Yokaichibashi 2016 non-null object
53 Pont Masahara 2016 non-null object
54 Sortie 2016 non-null object
55 sunrise 2016 non-null object
56 Kandabashi 2 2016 non-null object
57 Nagahisa 2016 non-null object
58 Kute 2016 non-null object
59 Sashimi 2016 non-null object
60 Takuno 2016 non-null object
61 Zenkojibashi 2016 non-null object
62 Furuichibashi 2016 non-null object
63 Eo 2016 non-null object
64 Tochiya 2016 non-null object
65 Chikahara 2016 non-null object
66 Hinuki 2016 non-null object
67 Victoire 2016 non-null object
68 Toji 2016 non-null object
69 Fuchubashi 2016 non-null object
70 Shimoraihara 2016 non-null object
71 Sunako 2016 non-null object
72 Sannomiyabashi 2016 non-null object
73 Pont Nakashiba 2016 non-null object
74 Hamada Ohashi 2016 non-null object
75 Hamada 2016 non-null object
76 Nakaba 2016 non-null object
77 Misumi 2016 non-null object
78 Nishikawachi 2016 non-null object
79 Keikawabashi 2016 non-null object
80 Omichibashi 2016 non-null object
81 Showabashi 2016 non-null object
82 Somewa 2016 non-null object
83 Asakura 2016 non-null object
84 Kiamigawa 2016 non-null object
85 Too Bridge 2016 non-null object
86 Pont Aioi 2016 non-null object
87 Asahibashi 2016 non-null object
88 Machida 2016 non-null object
89 Nakajo 2016 non-null object
90 Yaogawa 2016 non-null object
91 Hatabashi 2016 non-null object
92 Pont Shintsutsumi 2016 non-null object
93 Kiyomibashi 2016 non-null object
94 Goka Ohashi 2016 non-null object
95 Tomankawa 2016 non-null object
96 Mita 2016 non-null object
dtypes: object(97)
memory usage: 1.5+ MB
Tout le monde semble avoir des données numériques sous forme de chaîne de caractères car Dtype est un objet ...
Aussi, si vous regardez un peu à l'intérieur, il semble que les chaînes de caractères «non collectées», «données manquantes» et «maintenance» soient incluses. 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 valeur de série.
Alors, exécutez le script suivant.
python
df.index = df["Observatoire"].map(lambda _: pd.to_datetime(_))
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":"2020-07-13"][cols[:5]].plot(figsize=(15,5))
plt.show()
Il pleut depuis l'autre jour, il est donc évident que le niveau de l'eau monte.
Eh bien, qu'allons-nous faire maintenant?
Recommended Posts