notebook ini akan digunakan sebagai acuan pengembangan module bmkgkit
, berupa pembacaan excel dari bmkg online.
Berhubung untuk data metadata stasiun sudah disertakan dalam .bmkgkit
, akan langsung dipakai.
import numpy as np, pandas as pd, pathlib, matplotlib.pyplot as plt, seaborn as sns
%load_ext autoreload
%autoreload 2
%aimport hidrokit
from hidrokit.bmkgkit import metadata_station
metadata_station.head()
id_stat | name_stat | type_stat | region | provinsi | kabupaten | lintang_derajat | bujur_derajat | ketinggian_mdpl | soil | exposure | land_use | time_zone | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 11010101a | Bakongan | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 2.95000 | 97.4700 | 0 | NaN | NaN | NaN | +07:00 |
1 | 11010201a | Kluet Utara | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.59000 | 97.0000 | 0 | NaN | NaN | NaN | NaN |
2 | 11010301a | Kluet Selatan | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.03000 | 97.3800 | 0 | NaN | NaN | NaN | NaN |
3 | 11010401a | Labuhan Haji | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.54000 | 97.0100 | 0 | NaN | NaN | NaN | NaN |
4 | 11010501a | Meukek | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.54321 | 97.1523 | 0 | NaN | NaN | NaN | NaN |
rasanya tidak perlu digunakan kolom ketinggian.mdpl soil exposure land.use time.zone
metadata_station = metadata_station.drop(['ketinggian_mdpl', 'soil', 'exposure', 'land_use', 'time_zone'], axis=1)
metadata_station.head()
id_stat | name_stat | type_stat | region | provinsi | kabupaten | lintang_derajat | bujur_derajat | |
---|---|---|---|---|---|---|---|---|
0 | 11010101a | Bakongan | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 2.95000 | 97.4700 |
1 | 11010201a | Kluet Utara | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.59000 | 97.0000 |
2 | 11010301a | Kluet Selatan | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.03000 | 97.3800 |
3 | 11010401a | Labuhan Haji | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.54000 | 97.0100 |
4 | 11010501a | Meukek | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.54321 | 97.1523 |
Mari kita cek, data yang ada di bmkgonline
print(metadata_station.info())
<class 'pandas.core.frame.DataFrame'> Int64Index: 8028 entries, 0 to 8027 Data columns (total 8 columns): id_stat 8028 non-null object name_stat 8028 non-null object type_stat 8028 non-null object region 8028 non-null object provinsi 8028 non-null object kabupaten 8028 non-null object lintang_derajat 8028 non-null float64 bujur_derajat 8028 non-null float64 dtypes: float64(2), object(6) memory usage: 564.5+ KB None
print('Jumlah baris yang terdapat dalam metadata: ', metadata_station.shape[0])
Jumlah baris yang terdapat dalam metadata: 8028
print('Jumlah stasiun yang terdata di bmkg (berdasarkan id): ', metadata_station.id_stat.nunique())
print('Jumlah stasiun yang terdata di bmkg (berdasarkan nama): ', metadata_station.name_stat.nunique())
Jumlah stasiun yang terdata di bmkg (berdasarkan id): 8025 Jumlah stasiun yang terdata di bmkg (berdasarkan nama): 7147
Angkanya berbeda, yang seharusnya sama. Dugaan saya adalah, ada stasiun yang tidak memiliki id
. Atau ada beberapa stasiun yang memiliki id
serupa (mungkin kah itu?). Tidak mungkin ada nilai null
/ nan
, karena dari info, diketahui bahwa semua kolom merupakan non-null
.
print('Check id stasiun yang sama')
print(metadata_station.id_stat.value_counts(ascending=False).head(5))
id_stasiun_sama = metadata_station.id_stat.value_counts(ascending=False).iloc[:3].index.tolist()
Check id stasiun yang sama 97504 2 51010404a 2 33221801a 2 35101506a 1 35072101a 1 Name: id_stat, dtype: int64
Ternyata ada 3 id
stasiun yang menyimpan dua informasi stasiun. Stasiun tersebut
stasiun_sama_id = metadata_station.loc[metadata_station['id_stat'].isin(id_stasiun_sama),:]
stasiun_sama_id
id_stat | name_stat | type_stat | region | provinsi | kabupaten | lintang_derajat | bujur_derajat | |
---|---|---|---|---|---|---|---|---|
2418 | 33221801a | Ungaran / Genuk | Pos Hujan Kerjasama | Region II | Jawa Tengah | Kab. Semarang | -7.14651 | 110.4057 |
2455 | 33221801a | Ungaran / Genuk | Pos Hujan Kerjasama | Region II | Jawa Tengah | Kab. Semarang | -7.14651 | 110.4057 |
4250 | 51010404a | Nusasari | Pos Hujan Kerjasama | Region III | Bali | Kab. Jembrana | -8.28000 | 114.5100 |
4251 | 51010404a | Tetelan | Pos Hujan Kerjasama | Region III | Bali | Kab. Jembrana | -8.29000 | 114.5100 |
7231 | 97504 | Stasiun Geofisika Sorong | UPT | Region V | Papua Barat | Kota Sorong | -0.86000 | 131.2600 |
7232 | 97504 | Stasiun Geofisika Sorong | UPT | Region V | Papua Barat | Kota Sorong | -0.86000 | 131.2600 |
def sama_atau_tidak(posisi1):
posisi2 = posisi1+1
mask = (~(stasiun_sama_id.iloc[posisi1] == stasiun_sama_id.iloc[posisi2]))
id_stat = stasiun_sama_id.iloc[posisi1,0]
total_yang_tidak_sama = mask.sum()
if total_yang_tidak_sama:
return (f'stasiun {id_stat} sama dengan stasiun berikutnya? \n\t'
f'tidak, pada kolom {(mask[mask == True]).index.tolist()}')
else:
return (f'stasiun {id_stat} sama dengan stasiun berikutnya? \n\t'
f'iya')
print(sama_atau_tidak(0))
print(sama_atau_tidak(2))
print(sama_atau_tidak(4))
stasiun 33221801a sama dengan stasiun berikutnya? iya stasiun 51010404a sama dengan stasiun berikutnya? tidak, pada kolom ['name_stat', 'lintang_derajat'] stasiun 97504 sama dengan stasiun berikutnya? iya
Stasiun yang memiliki informasi yang sama akan dihapus dalam tabel
metadata_station = metadata_station.drop_duplicates(subset='id_stat', keep='first').reset_index(drop=True)
metadata_station.head(5)
id_stat | name_stat | type_stat | region | provinsi | kabupaten | lintang_derajat | bujur_derajat | |
---|---|---|---|---|---|---|---|---|
0 | 11010101a | Bakongan | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 2.95000 | 97.4700 |
1 | 11010201a | Kluet Utara | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.59000 | 97.0000 |
2 | 11010301a | Kluet Selatan | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.03000 | 97.3800 |
3 | 11010401a | Labuhan Haji | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.54000 | 97.0100 |
4 | 11010501a | Meukek | Pos Hujan Kerjasama | Region I | Nanggroe Aceh Darussalam | Kab. Aceh Selatan | 3.54321 | 97.1523 |
Bagaimana dengan kolom nama
?
nama_stasiun_sama = metadata_station.name_stat.value_counts()
print(nama_stasiun_sama.head(5),'\n')
print('25 stasiun yang muncul lebih dari satu kali: \n\t',
', '.join(nama_stasiun_sama[nama_stasiun_sama != 1].index.tolist()[:25]))
print()
print('Jumlah nama yang memiliki id stasiun lebih dari 1: \n\t',
(nama_stasiun_sama != 1).sum())
Karanganyar 6 Tanjung 5 Sukadana 5 Sidomulyo 5 Koto Baru 4 Name: name_stat, dtype: int64 25 stasiun yang muncul lebih dari satu kali: Karanganyar, Tanjung, Sukadana, Sidomulyo, Koto Baru, Bojong, Sukamaju, Bakung, Beji, Rembang, Guguk, Cubadak, Lambuya, Babadan, Ciawi, Cinangka, Sungai Tarab, Ombilin, Curug, Talawi, Lengkong, Blimbing, Wonorejo, Losari, Makmur Jumlah nama yang memiliki id stasiun lebih dari 1: 788
Ternyata ada beberapa stasiun yang memiliki nama yang sama, meski memiliki id
yang berbeda. Karena id
merupakan identitas utama dari stasiun, maka untuk nama
yang sama diabaikan.
Data akan disimpan dalam .csv
dengan nama clean_metadata_station
metadata_station.to_csv('out/clean_metadata_station.csv', index=False)
metadata_station.groupby('type_stat').count()
id_stat | name_stat | region | provinsi | kabupaten | lintang_derajat | bujur_derajat | |
---|---|---|---|---|---|---|---|
type_stat | |||||||
Pos Hujan Kerjasama | 6993 | 6993 | 6993 | 6993 | 6993 | 6993 | 6993 |
UPT | 179 | 179 | 179 | 179 | 179 | 179 | 179 |
aws | 853 | 853 | 853 | 853 | 853 | 853 | 853 |
Dari perintah diatas dapat diketahui jumlah tipe stasiun di Indonesia berdasarkan data BMKG:
stasiun_jabar = metadata_station[metadata_station.provinsi == 'Jawa Barat']
print('Banyaknya stasiun di Jawa Barat:', stasiun_jabar.shape[0])
stasiun_jabar.head()
Banyaknya stasiun di Jawa Barat: 884
id_stat | name_stat | type_stat | region | provinsi | kabupaten | lintang_derajat | bujur_derajat | |
---|---|---|---|---|---|---|---|---|
800 | 96751 | Stasiun Meteorologi Citeko | UPT | Region II | Jawa Barat | Kab. Bogor | -6.70000 | 106.85000 |
801 | 32010706g | AWS Mekarsari Cibinong | aws | Region II | Jawa Barat | Kab. Bogor | -6.41882 | 106.98320 |
802 | 32010103g | AWS Jagorawi Bogor | aws | Region II | Jawa Barat | Kab. Bogor | -6.27635 | 106.52164 |
803 | 32012603g | AWS Gunung Geulis | aws | Region II | Jawa Barat | Kab. Bogor | -6.62449 | 106.86200 |
804 | 32012512g | AWS Cibereum Bogor | aws | Region II | Jawa Barat | Kab. Bogor | -6.71067 | 106.95010 |
Diketahui bahwa ada 884 stasiun yang berlokasikan di Jawa Barat
stasiun_jabar.kabupaten.value_counts()
Kab. Bogor 92 Kab. Sukabumi 78 Kab. Cianjur 76 Kab. Karawang 59 Kab. Indramayu 57 Kab. Cirebon 55 Kab. Bandung 55 Kab. Ciamis 47 Kab. Tasikmalaya 47 Kab. Majalengka 42 Kab. Subang 40 Kab. Bandung Barat 35 Kab. Garut 33 Kab. Kuningan 28 Kab. Bekasi 26 Kab. Purwakarta 25 Kab. Sumedang 22 Kota Bandung 15 Kota Bogor 15 Kota Tasikmalaya 13 Kota Bekasi 10 Kota Banjar 6 Kota Depok 5 Kota Cirebon 2 Kota Sukabumi 1 Name: kabupaten, dtype: int64
Dari informasi diatas diketahui bahwa Kabupaten Bogor memiliki stasiun terbanyak dibandingkan daerah kabupaten lainnya.
stasiun_jabar[stasiun_jabar.kabupaten == 'Kota Bandung']
id_stat | name_stat | type_stat | region | provinsi | kabupaten | lintang_derajat | bujur_derajat | |
---|---|---|---|---|---|---|---|---|
1659 | 96783 | Stasiun Geofisika Bandung | UPT | Region II | Jawa Barat | Kota Bandung | -6.88356 | 107.59733 |
1660 | 32730701g | AWS Stageof Bandung | aws | Region II | Jawa Barat | Kota Bandung | -6.83390 | 107.59740 |
1661 | 32730501a | Lanud Husein | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.90197 | 107.57622 |
1662 | 32730601a | Cicendo | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.91205 | 107.60221 |
1663 | 32730801a | Bengkok | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.86389 | 107.62440 |
1664 | 32731301a | Tekaga Bodas | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.93240 | 107.63036 |
1665 | 33010102a | Lengkong/ Telaga Bodas | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.92601 | 107.62354 |
1666 | 32731302a | Lengkong | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.93307 | 107.63028 |
1667 | 32732201a | Margacinta | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.95302 | 107.64887 |
1668 | 32732501a | Cibiru | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.92421 | 107.71267 |
1669 | 32732601a | Cigending | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.89490 | 107.70846 |
1670 | 32732602a | Ujung Berung | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.92137 | 107.73850 |
1671 | 32732603a | Panglipur Galih | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.92470 | 107.59530 |
1672 | 32732604a | Gunung Kasur | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.90156 | 107.71025 |
1673 | 32732605a | Ujung Berung | Pos Hujan Kerjasama | Region II | Jawa Barat | Kota Bandung | -6.90612 | 107.70730 |
stasiun_jabar[['id_stat', 'lintang_derajat', 'bujur_derajat']]
id_stat | lintang_derajat | bujur_derajat | |
---|---|---|---|
800 | 96751 | -6.70000 | 106.85000 |
801 | 32010706g | -6.41882 | 106.98320 |
802 | 32010103g | -6.27635 | 106.52164 |
803 | 32012603g | -6.62449 | 106.86200 |
804 | 32012512g | -6.71067 | 106.95010 |
805 | 32012509g | -6.69796 | 106.93510 |
806 | 32010806b | -6.16028 | 107.14294 |
807 | 32010101a | -6.46040 | 106.85640 |
808 | 32010102a | -6.46571 | 106.86646 |
809 | 32010301a | -6.53690 | 106.89050 |
810 | 32010302a | -6.40000 | 106.68330 |
811 | 32010303a | -6.56933 | 106.86375 |
812 | 32010501a | -6.59281 | 106.90193 |
813 | 32010502a | -6.57586 | 106.69392 |
814 | 32010601a | -6.51348 | 107.08080 |
815 | 32010602a | -6.50470 | 107.08367 |
816 | 32010603a | -6.46790 | 107.06590 |
817 | 32010604a | -6.46849 | 107.05594 |
818 | 32010605a | -6.61980 | 107.15800 |
819 | 32010606a | -6.51135 | 107.04756 |
820 | 32010701a | -6.41430 | 106.96210 |
821 | 32010702a | -6.40928 | 106.97621 |
822 | 32010703a | -6.45348 | 106.63672 |
823 | 32010704a | -6.42320 | 107.02448 |
824 | 32010705a | -6.45258 | 106.95727 |
825 | 32010801a | -6.57782 | 107.06113 |
826 | 32010802a | -6.51103 | 107.12720 |
827 | 32010803a | -6.52720 | 107.18390 |
828 | 32010804a | -6.73680 | 106.81510 |
829 | 32010805a | -6.50430 | 107.13300 |
... | ... | ... | ... |
1680 | 32750303a | -6.25167 | 106.98513 |
1681 | 32750401a | -6.25531 | 106.97772 |
1682 | 32750402a | -6.27187 | 106.98230 |
1683 | 32750801a | -6.27177 | 106.92772 |
1684 | 32750901a | -6.27499 | 106.98286 |
1685 | 32109999a | -6.75000 | 108.27000 |
1693 | 32760101a | -6.40530 | 106.75890 |
1694 | 32760102a | -6.39917 | 106.78051 |
1695 | 32760301a | -6.40530 | 106.75890 |
1696 | 32760302a | -6.38763 | 106.76274 |
1697 | 32760303a | -6.42812 | 106.83875 |
1698 | 32780101f | -7.33082 | 108.20310 |
1699 | 32780301a | -7.32090 | 108.22259 |
1700 | 32780401a | -7.28605 | 108.19401 |
1701 | 32780402a | -7.28975 | 108.19622 |
1702 | 33011001a | -7.38529 | 108.18790 |
1703 | 32780501a | -7.38251 | 108.20729 |
1704 | 33011101a | -7.41334 | 108.20806 |
1705 | 32780502a | -7.41334 | 108.20806 |
1706 | 32780601a | -7.37305 | 108.21868 |
1707 | 32780602a | -7.34202 | 108.24953 |
1708 | 32780603a | -7.36385 | 108.26591 |
1709 | 32780604a | -7.36071 | 108.26705 |
1710 | 32780605a | -7.34361 | 108.24280 |
1711 | 32790101a | -7.37324 | 108.55860 |
1712 | 32790102a | -7.38794 | 108.54806 |
1713 | 32790103a | -7.41214 | 108.56145 |
1714 | 32790104a | -7.36546 | 108.53253 |
1715 | 32790201a | -7.36059 | 108.60508 |
1716 | 32790402a | -7.36626 | 108.62313 |
884 rows × 3 columns