File size: 2,884 Bytes
d30adf0
fa51aa8
8896740
baa2a05
db9bec1
 
 
6e598b9
6f24fe3
6e598b9
db9bec1
8105114
2784e1a
7385a00
8105114
0b2b2dc
b66d6cf
 
 
6f18e1d
3c192d2
0d8e071
ca434e3
40ccda1
 
 
 
8f8fccd
 
40ccda1
 
 
 
a524393
964ebb9
40ccda1
e5adb55
 
 
 
 
40ccda1
 
 
 
e5adb55
 
 
0b199f9
40ccda1
 
0b199f9
 
40ccda1
 
 
 
e5b8ed8
40ccda1
 
 
 
6fbfd97
fd2bdcb
6fbfd97
b0dfe85
40ccda1
 
6fbfd97
4509ea8
e5adb55
0d8e071
e5adb55
 
f9b278b
bba8de4
e5adb55
22762a8
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import streamlit as st
import pandas as pd
import numpy as np

astations = [
	["hongkongobservatory","HKO",22.3022566,114.1722662,"Hong Kong Observatory"],
	["kingspark","KP",22.3115408,114.1685675,"Observatory Meteorological Station, King's Park"],
]
astationcolumns = ['akey','astationcode','alatitude','alongitude','atitle',]

acontainer1 = st.empty()
acontainer2 = st.empty()
acontainer3 = st.empty()
acontainer4 = st.empty()

def asubmit(aparam):
	import datetime
	from io import StringIO

	adf2 = aparam["adataframe"]
	aselecteditem = adf2.loc[adf2["atitle"]==aparam["aselected"], "astationcode"]
	aselectedrow = adf2[adf2["atitle"]==aparam["aselected"]]
	aselectedindex = adf2.index[adf2["atitle"]==aparam["aselected"]].tolist()

	adf3 = pd.DataFrame(
		[
			[
				aselectedrow["alatitude"][aselectedindex[0]],
				aselectedrow["alongitude"][aselectedindex[0]],
			]
		],
		columns=['lat', 'lon']
	)
	aparam["acontainer"].map(adf3)

	abacklogmax = 10

	atimezone = os.environ['TZ']
#	os.environ['TZ'] = 'Europe/London'
	os.environ['TZ'] = 'Asia/Hong Kong'
	time.tzset()
	atoday = datetime.date.today()
	ayear = int(atoday.strftime("%Y"))-0
	amonth = int(atoday.strftime("%m"))
	amonthday = int(atoday.strftime("%d"))
	os.environ['TZ'] = atimezone
	time.tzset()

	atitles = aparam["acolumntitles"]

	csvString = ""
	csvString += (",").join(atitles)
	adf3 = pd.DataFrame(columns=atitles)
	for i in range((ayear-abacklogmax),ayear,1):
		alink = ("https://data.weather.gov.hk/weatherAPI/opendata/opendata.php?dataType=CLMTEMP&year={}&rformat=csv&station={}").format(str(i),aselecteditem.values[0])
		adf4 = pd.read_csv(alink, skiprows=[0,1,2], skipfooter=3, engine='python', on_bad_lines='skip')

		adf4 = adf4.reset_index()  # make sure indexes pair with number of rows
		for index, row in adf4.iterrows():
			if (row[2]!=amonth) or (row[3]!=amonthday):
				continue

			adate = ("{}{:02d}{:02d}").format(row[1], row[2], row[3])
			csvString += '\n'+(",").join([adate,str(row[4])])
			st.write(row[0],adate)
			adf3 = adf3.append({"Date":adate,"Celsius":(row[4]),}, ignore_index=True)
			break
	adf3 = pd.read_csv(StringIO(csvString), sep=",")
	aparam["acontainer"].dataframe(adf3)

# Trend projection for same date of current year with past year references of same date
	from sklearn.linear_model import LinearRegression
	lr = LinearRegression()
	lr.fit(adf3[['Date']].astype('float').astype('int32'), adf3['Celsius'])

	atrendproject = [20230223,]
	st.dataframe(pd.merge(pd.DataFrame([atrendproject]), pd.DataFrame(lr.predict(np.array([atrendproject]))), left_index=True, right_index=True))

adf = pd.DataFrame(
	astations,
	columns=astationcolumns
)
aoption = acontainer1.selectbox(
	'Which station?',
	adf['atitle']
)
if acontainer2.button("Submit") == True:
	asubmit(aparam={"aselected":aoption,"acontainer":acontainer3,"adataframe":adf,"acolumntitles":['Date','Celsius'],})