rrayhka commited on
Commit
d0e04e1
·
1 Parent(s): 8f4b8cc
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.keras filter=lfs diff=lfs merge=lfs -text
37
+ *.xlsx filter=lfs diff=lfs merge=lfs -text
data/Bangkalan 1th hourly.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/Sby 1th hourly.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/cluster/climate_data_clustered.csv ADDED
The diff for this file is too large to render. See raw diff
 
data/forecast/bkl_temp_forecast.csv ADDED
@@ -0,0 +1,722 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ,predicted_mean
2
+ 2024-12-01 00:00:00,25.75564011224913
3
+ 2024-12-01 01:00:00,25.804853419179715
4
+ 2024-12-01 02:00:00,25.646551777811514
5
+ 2024-12-01 03:00:00,25.357466408591787
6
+ 2024-12-01 04:00:00,25.039106142017793
7
+ 2024-12-01 05:00:00,25.060145566221884
8
+ 2024-12-01 06:00:00,25.431559908821033
9
+ 2024-12-01 07:00:00,27.217842477791805
10
+ 2024-12-01 08:00:00,28.915450202255908
11
+ 2024-12-01 09:00:00,30.28317559989064
12
+ 2024-12-01 10:00:00,31.50871587345861
13
+ 2024-12-01 11:00:00,32.110298901969585
14
+ 2024-12-01 12:00:00,32.57832860540959
15
+ 2024-12-01 13:00:00,32.61997978622767
16
+ 2024-12-01 14:00:00,32.414577149692654
17
+ 2024-12-01 15:00:00,31.40735268649523
18
+ 2024-12-01 16:00:00,30.48877350167867
19
+ 2024-12-01 17:00:00,29.630934798247864
20
+ 2024-12-01 18:00:00,28.71068438775244
21
+ 2024-12-01 19:00:00,28.30099404598097
22
+ 2024-12-01 20:00:00,27.757692572441766
23
+ 2024-12-01 21:00:00,27.424700999785802
24
+ 2024-12-01 22:00:00,27.183282635975903
25
+ 2024-12-01 23:00:00,26.839623594744555
26
+ 2024-12-02 00:00:00,26.46699626804185
27
+ 2024-12-02 01:00:00,26.30607273187693
28
+ 2024-12-02 02:00:00,26.052969158023206
29
+ 2024-12-02 03:00:00,25.697366037048187
30
+ 2024-12-02 04:00:00,25.34465261066593
31
+ 2024-12-02 05:00:00,25.236522782644407
32
+ 2024-12-02 06:00:00,25.561901884452226
33
+ 2024-12-02 07:00:00,27.2432081208362
34
+ 2024-12-02 08:00:00,28.953927739512203
35
+ 2024-12-02 09:00:00,30.26854234379021
36
+ 2024-12-02 10:00:00,31.52377199153433
37
+ 2024-12-02 11:00:00,32.1318417538884
38
+ 2024-12-02 12:00:00,32.55536592644389
39
+ 2024-12-02 13:00:00,32.56424655911457
40
+ 2024-12-02 14:00:00,32.35114201118766
41
+ 2024-12-02 15:00:00,31.449286176209487
42
+ 2024-12-02 16:00:00,30.500966156255796
43
+ 2024-12-02 17:00:00,29.720265799283457
44
+ 2024-12-02 18:00:00,28.79890097711376
45
+ 2024-12-02 19:00:00,28.363350434011416
46
+ 2024-12-02 20:00:00,27.76806696607173
47
+ 2024-12-02 21:00:00,27.422346415186095
48
+ 2024-12-02 22:00:00,27.172102735117228
49
+ 2024-12-02 23:00:00,26.78629648112922
50
+ 2024-12-03 00:00:00,26.438570965092307
51
+ 2024-12-03 01:00:00,26.25623412434445
52
+ 2024-12-03 02:00:00,26.019244872056003
53
+ 2024-12-03 03:00:00,25.671784710749847
54
+ 2024-12-03 04:00:00,25.318535684630337
55
+ 2024-12-03 05:00:00,25.198352792274264
56
+ 2024-12-03 06:00:00,25.535303821607446
57
+ 2024-12-03 07:00:00,27.19301270908241
58
+ 2024-12-03 08:00:00,28.906352576122504
59
+ 2024-12-03 09:00:00,30.20372133810071
60
+ 2024-12-03 10:00:00,31.486308566892465
61
+ 2024-12-03 11:00:00,32.05686445195554
62
+ 2024-12-03 12:00:00,32.523271704091
63
+ 2024-12-03 13:00:00,32.49624459343999
64
+ 2024-12-03 14:00:00,32.32219156141258
65
+ 2024-12-03 15:00:00,31.447771362649842
66
+ 2024-12-03 16:00:00,30.46756218352439
67
+ 2024-12-03 17:00:00,29.691165243443244
68
+ 2024-12-03 18:00:00,28.77177994085518
69
+ 2024-12-03 19:00:00,28.329944844312024
70
+ 2024-12-03 20:00:00,27.73914229641467
71
+ 2024-12-03 21:00:00,27.38323848874745
72
+ 2024-12-03 22:00:00,27.176464372479014
73
+ 2024-12-03 23:00:00,26.799783237673786
74
+ 2024-12-04 00:00:00,26.428340693468357
75
+ 2024-12-04 01:00:00,26.248682118612358
76
+ 2024-12-04 02:00:00,25.995738625060596
77
+ 2024-12-04 03:00:00,25.63911050742803
78
+ 2024-12-04 04:00:00,25.284124386199938
79
+ 2024-12-04 05:00:00,25.16497946060392
80
+ 2024-12-04 06:00:00,25.491752741915157
81
+ 2024-12-04 07:00:00,27.159419142988455
82
+ 2024-12-04 08:00:00,28.871569884937117
83
+ 2024-12-04 09:00:00,30.17743966374689
84
+ 2024-12-04 10:00:00,31.443478006628812
85
+ 2024-12-04 11:00:00,32.03894826722654
86
+ 2024-12-04 12:00:00,32.474833018768415
87
+ 2024-12-04 13:00:00,32.469678716659786
88
+ 2024-12-04 14:00:00,32.269527632194524
89
+ 2024-12-04 15:00:00,31.38244442966596
90
+ 2024-12-04 16:00:00,30.421644724056883
91
+ 2024-12-04 17:00:00,29.64635196002715
92
+ 2024-12-04 18:00:00,28.725592493956384
93
+ 2024-12-04 19:00:00,28.286549717649013
94
+ 2024-12-04 20:00:00,27.690128325242135
95
+ 2024-12-04 21:00:00,27.340256491134486
96
+ 2024-12-04 22:00:00,27.10445445697995
97
+ 2024-12-04 23:00:00,26.71961112449321
98
+ 2024-12-05 00:00:00,26.365027316730966
99
+ 2024-12-05 01:00:00,26.182507806912717
100
+ 2024-12-05 02:00:00,25.940872507573978
101
+ 2024-12-05 03:00:00,25.590684642504293
102
+ 2024-12-05 04:00:00,25.23681086252373
103
+ 2024-12-05 05:00:00,25.116364690217516
104
+ 2024-12-05 06:00:00,25.45041867083695
105
+ 2024-12-05 07:00:00,27.110330768340855
106
+ 2024-12-05 08:00:00,28.82339649263209
107
+ 2024-12-05 09:00:00,30.122794982564752
108
+ 2024-12-05 10:00:00,31.401110769363857
109
+ 2024-12-05 11:00:00,31.97828433280794
110
+ 2024-12-05 12:00:00,32.43642589873153
111
+ 2024-12-05 13:00:00,32.41505630820907
112
+ 2024-12-05 14:00:00,32.23405801069165
113
+ 2024-12-05 15:00:00,31.356702721337765
114
+ 2024-12-05 16:00:00,30.38151270452293
115
+ 2024-12-05 17:00:00,29.60571464264385
116
+ 2024-12-05 18:00:00,28.68595963549169
117
+ 2024-12-05 19:00:00,28.244759617677246
118
+ 2024-12-05 20:00:00,27.652260559042272
119
+ 2024-12-05 21:00:00,27.297902592459764
120
+ 2024-12-05 22:00:00,27.083405451746508
121
+ 2024-12-05 23:00:00,26.704393975422892
122
+ 2024-12-06 00:00:00,26.337515082909572
123
+ 2024-12-06 01:00:00,26.15701303675241
124
+ 2024-12-06 02:00:00,25.907128321303777
125
+ 2024-12-06 03:00:00,25.552238052505725
126
+ 2024-12-06 04:00:00,25.197544207207955
127
+ 2024-12-06 05:00:00,25.078006411072636
128
+ 2024-12-06 06:00:00,25.406753898684254
129
+ 2024-12-06 07:00:00,27.072272453161577
130
+ 2024-12-06 08:00:00,28.784675902733998
131
+ 2024-12-06 09:00:00,30.088763004644658
132
+ 2024-12-06 10:00:00,31.358161912990386
133
+ 2024-12-06 11:00:00,31.94863693561403
134
+ 2024-12-06 12:00:00,32.39058703302546
135
+ 2024-12-06 13:00:00,32.380995121674935
136
+ 2024-12-06 14:00:00,32.186072075492696
137
+ 2024-12-06 15:00:00,31.301674609136903
138
+ 2024-12-06 16:00:00,30.33693664997764
139
+ 2024-12-06 17:00:00,29.561527253517745
140
+ 2024-12-06 18:00:00,28.641041689074992
141
+ 2024-12-06 19:00:00,28.201402519343773
142
+ 2024-12-06 20:00:00,27.606037737943563
143
+ 2024-12-06 21:00:00,27.25493719946918
144
+ 2024-12-06 22:00:00,27.024950789874104
145
+ 2024-12-06 23:00:00,26.64168830421194
146
+ 2024-12-07 00:00:00,26.283753757085915
147
+ 2024-12-07 01:00:00,26.10177921099894
148
+ 2024-12-07 02:00:00,25.857895560466865
149
+ 2024-12-07 03:00:00,25.506425776496812
150
+ 2024-12-07 04:00:00,25.152327886072733
151
+ 2024-12-07 05:00:00,25.03212641643171
152
+ 2024-12-07 06:00:00,25.3647344694057
153
+ 2024-12-07 07:00:00,27.02617105052551
154
+ 2024-12-07 08:00:00,28.739056640081223
155
+ 2024-12-07 09:00:00,30.03973073100246
156
+ 2024-12-07 10:00:00,31.315619034294425
157
+ 2024-12-07 11:00:00,31.89641462685448
158
+ 2024-12-07 12:00:00,32.35014642579155
159
+ 2024-12-07 13:00:00,32.33198318558916
160
+ 2024-12-07 14:00:00,32.14719307016787
161
+ 2024-12-07 15:00:00,31.267922280420326
162
+ 2024-12-07 16:00:00,30.295577721470384
163
+ 2024-12-07 17:00:00,29.51988699707019
164
+ 2024-12-07 18:00:00,28.59993303369465
165
+ 2024-12-07 19:00:00,28.159157515468777
166
+ 2024-12-07 20:00:00,27.565877108061215
167
+ 2024-12-07 21:00:00,27.212405872298447
168
+ 2024-12-07 22:00:00,26.993690892242963
169
+ 2024-12-07 23:00:00,26.61352105444182
170
+ 2024-12-08 00:00:00,26.24907815673775
171
+ 2024-12-08 01:00:00,26.068174733305003
172
+ 2024-12-08 02:00:00,25.81992439785708
173
+ 2024-12-08 03:00:00,25.465965671659852
174
+ 2024-12-08 04:00:00,25.111434091108972
175
+ 2024-12-08 05:00:00,24.991715342295674
176
+ 2024-12-08 06:00:00,25.32151427234786
177
+ 2024-12-08 07:00:00,26.985920859020883
178
+ 2024-12-08 08:00:00,28.69845564439508
179
+ 2024-12-08 09:00:00,30.001613058948188
180
+ 2024-12-08 10:00:00,31.27277953913668
181
+ 2024-12-08 11:00:00,31.860618156965398
182
+ 2024-12-08 12:00:00,32.30577720398419
183
+ 2024-12-08 13:00:00,32.29385065075769
184
+ 2024-12-08 14:00:00,32.10168752563461
185
+ 2024-12-08 15:00:00,31.21868657026998
186
+ 2024-12-08 16:00:00,30.25187673984948
187
+ 2024-12-08 17:00:00,29.476390823367222
188
+ 2024-12-08 18:00:00,28.556050050487208
189
+ 2024-12-08 19:00:00,28.11610133444015
190
+ 2024-12-08 20:00:00,27.521304207297753
191
+ 2024-12-08 21:00:00,27.169557937979455
192
+ 2024-12-08 22:00:00,26.942641544687607
193
+ 2024-12-08 23:00:00,26.5602213532034
194
+ 2024-12-09 00:00:00,26.200514143915193
195
+ 2024-12-09 01:00:00,26.018831312611514
196
+ 2024-12-09 02:00:00,25.77375831888895
197
+ 2024-12-09 03:00:00,25.42161062640954
198
+ 2024-12-09 04:00:00,25.067394609878896
199
+ 2024-12-09 05:00:00,24.947324603472406
200
+ 2024-12-09 06:00:00,25.27916754425514
201
+ 2024-12-09 07:00:00,26.941413040909097
202
+ 2024-12-09 08:00:00,28.654203084611456
203
+ 2024-12-09 09:00:00,29.955553541027125
204
+ 2024-12-09 10:00:00,31.230155786816834
205
+ 2024-12-09 11:00:00,31.812869654713776
206
+ 2024-12-09 12:00:00,32.264266530069165
207
+ 2024-12-09 13:00:00,32.24780194296083
208
+ 2024-12-09 14:00:00,32.06100367558728
209
+ 2024-12-09 15:00:00,31.18071692879408
210
+ 2024-12-09 16:00:00,30.209879834239516
211
+ 2024-12-09 17:00:00,29.43424489984957
212
+ 2024-12-09 18:00:00,28.51418558289178
213
+ 2024-12-09 19:00:00,28.07363525424858
214
+ 2024-12-09 20:00:00,27.479941740116143
215
+ 2024-12-09 21:00:00,27.12694032389613
216
+ 2024-12-09 22:00:00,26.905991563564285
217
+ 2024-12-09 23:00:00,26.525208803661993
218
+ 2024-12-10 00:00:00,26.162055745006157
219
+ 2024-12-10 01:00:00,25.980940035916497
220
+ 2024-12-10 02:00:00,25.733555099285947
221
+ 2024-12-10 03:00:00,25.380089636403326
222
+ 2024-12-10 04:00:00,25.025644004448125
223
+ 2024-12-10 05:00:00,24.905829584120923
224
+ 2024-12-10 06:00:00,25.236185232649934
225
+ 2024-12-10 07:00:00,26.90000321134994
226
+ 2024-12-10 08:00:00,28.61260752045832
227
+ 2024-12-10 09:00:00,29.915272780851275
228
+ 2024-12-10 10:00:00,31.187375046621742
229
+ 2024-12-10 11:00:00,31.77381785735485
230
+ 2024-12-10 12:00:00,32.22067587579176
231
+ 2024-12-10 13:00:00,32.207513316649596
232
+ 2024-12-10 14:00:00,32.01681139577978
233
+ 2024-12-10 15:00:00,31.134549698994118
234
+ 2024-12-10 16:00:00,30.1666429789442
235
+ 2024-12-10 17:00:00,29.39111647559097
236
+ 2024-12-10 18:00:00,28.470852361696686
237
+ 2024-12-10 19:00:00,28.03073978671413
238
+ 2024-12-10 20:00:00,27.436243245765233
239
+ 2024-12-10 21:00:00,27.08415511714247
240
+ 2024-12-10 22:00:00,26.858864103513657
241
+ 2024-12-10 23:00:00,26.47688989226706
242
+ 2024-12-11 00:00:00,26.11624415128313
243
+ 2024-12-11 01:00:00,25.934715784584686
244
+ 2024-12-11 02:00:00,25.689013096560288
245
+ 2024-12-11 03:00:00,25.336506488413924
246
+ 2024-12-11 04:00:00,24.982227932467485
247
+ 2024-12-11 05:00:00,24.862227538910812
248
+ 2024-12-11 06:00:00,25.193665392078795
249
+ 2024-12-11 07:00:00,26.85633917905929
250
+ 2024-12-11 08:00:00,28.569078635009557
251
+ 2024-12-11 09:00:00,29.87078719907612
252
+ 2024-12-11 10:00:00,31.144708535744243
253
+ 2024-12-11 11:00:00,31.728438040257256
254
+ 2024-12-11 12:00:00,32.17859868605497
255
+ 2024-12-11 13:00:00,32.16303345852076
256
+ 2024-12-11 14:00:00,31.975171969315333
257
+ 2024-12-11 15:00:00,31.094347313677115
258
+ 2024-12-11 16:00:00,30.124308352994547
259
+ 2024-12-11 17:00:00,29.348702951551015
260
+ 2024-12-11 18:00:00,28.428587854904766
261
+ 2024-12-11 19:00:00,27.988156755388438
262
+ 2024-12-11 20:00:00,27.394244524164773
263
+ 2024-12-11 21:00:00,27.04149185627374
264
+ 2024-12-11 22:00:00,26.819360414510676
265
+ 2024-12-11 23:00:00,26.43825314395271
266
+ 2024-12-12 00:00:00,26.075782992969703
267
+ 2024-12-12 01:00:00,25.894554890037213
268
+ 2024-12-12 02:00:00,25.647628140453683
269
+ 2024-12-12 03:00:00,25.294423836841847
270
+ 2024-12-12 04:00:00,24.940023710682308
271
+ 2024-12-12 05:00:00,24.820158637596112
272
+ 2024-12-12 06:00:00,25.150809041696316
273
+ 2024-12-12 07:00:00,26.814315381656616
274
+ 2024-12-12 08:00:00,28.526956500148128
275
+ 2024-12-12 09:00:00,29.82936118914297
276
+ 2024-12-12 10:00:00,31.101958907683002
277
+ 2024-12-12 11:00:00,31.687662706495082
278
+ 2024-12-12 12:00:00,32.135420247797725
279
+ 2024-12-12 13:00:00,32.12160328386542
280
+ 2024-12-12 14:00:00,31.93167499954463
281
+ 2024-12-12 15:00:00,31.049804703678255
282
+ 2024-12-12 16:00:00,30.081317234121514
283
+ 2024-12-12 17:00:00,29.305769241626443
284
+ 2024-12-12 18:00:00,28.38554571493968
285
+ 2024-12-12 19:00:00,27.945346384754814
286
+ 2024-12-12 20:00:00,27.351008989811852
287
+ 2024-12-12 21:00:00,26.998739863394256
288
+ 2024-12-12 22:00:00,26.77430940920269
289
+ 2024-12-12 23:00:00,26.392571322981436
290
+ 2024-12-13 00:00:00,26.031428675040896
291
+ 2024-12-13 01:00:00,25.849982089933828
292
+ 2024-12-13 02:00:00,25.60394600935819
293
+ 2024-12-13 03:00:00,25.251249372802285
294
+ 2024-12-13 04:00:00,24.89693770528291
295
+ 2024-12-13 05:00:00,24.776974168399114
296
+ 2024-12-13 06:00:00,25.108197547342606
297
+ 2024-12-13 07:00:00,26.771098093311956
298
+ 2024-12-13 08:00:00,28.483810765498
299
+ 2024-12-13 09:00:00,29.78570893021311
300
+ 2024-12-13 10:00:00,31.059269758522095
301
+ 2024-12-13 11:00:00,31.643536993354193
302
+ 2024-12-13 12:00:00,32.09304311558481
303
+ 2024-12-13 13:00:00,32.07795405532959
304
+ 2024-12-13 14:00:00,31.88952964174283
305
+ 2024-12-13 15:00:00,31.008420189429014
306
+ 2024-12-13 16:00:00,30.038803801925315
307
+ 2024-12-13 17:00:00,29.263214036718264
308
+ 2024-12-13 18:00:00,28.34306940743328
309
+ 2024-12-13 19:00:00,27.902701433964822
310
+ 2024-12-13 20:00:00,27.308673402668802
311
+ 2024-12-13 21:00:00,26.956052434955833
312
+ 2024-12-13 22:00:00,26.733294820748593
313
+ 2024-12-13 23:00:00,26.352015737554456
314
+ 2024-12-14 00:00:00,25.98990715304867
315
+ 2024-12-14 01:00:00,25.8086195430358
316
+ 2024-12-14 02:00:00,25.56193538126205
317
+ 2024-12-14 03:00:00,25.2088693488128
318
+ 2024-12-14 04:00:00,24.85449331576482
319
+ 2024-12-14 05:00:00,24.73460142450396
320
+ 2024-12-14 06:00:00,25.06540788737691
321
+ 2024-12-14 07:00:00,26.728749229749816
322
+ 2024-12-14 08:00:00,28.441409837023226
323
+ 2024-12-14 09:00:00,29.743676566108658
324
+ 2024-12-14 10:00:00,31.016536602847015
325
+ 2024-12-14 11:00:00,31.60184913070832
326
+ 2024-12-14 12:00:00,32.05008292571892
327
+ 2024-12-14 13:00:00,32.03591948620691
328
+ 2024-12-14 14:00:00,31.84640080489729
329
+ 2024-12-14 15:00:00,30.96473773682193
330
+ 2024-12-14 16:00:00,29.995942788583687
331
+ 2024-12-14 17:00:00,29.22038341862897
332
+ 2024-12-14 18:00:00,28.30018138089908
333
+ 2024-12-14 19:00:00,27.859936118045123
334
+ 2024-12-14 20:00:00,27.26568298319078
335
+ 2024-12-14 21:00:00,26.913318027224285
336
+ 2024-12-14 22:00:00,26.68934319749517
337
+ 2024-12-14 23:00:00,26.307730128017564
338
+ 2024-12-15 00:00:00,25.94632439195597
339
+ 2024-12-15 01:00:00,25.764921106233487
340
+ 2024-12-15 02:00:00,25.518708510479904
341
+ 2024-12-15 03:00:00,25.165911263102334
342
+ 2024-12-15 04:00:00,24.81158206461189
343
+ 2024-12-15 05:00:00,24.691638041548142
344
+ 2024-12-15 06:00:00,25.022747866797133
345
+ 2024-12-15 07:00:00,26.68576847064787
346
+ 2024-12-15 08:00:00,28.398466962130403
347
+ 2024-12-15 09:00:00,29.700465511188714
348
+ 2024-12-15 10:00:00,30.973835467815025
349
+ 2024-12-15 11:00:00,31.558387404757898
350
+ 2024-12-15 12:00:00,32.00754698852034
351
+ 2024-12-15 13:00:00,31.99271003573356
352
+ 2024-12-15 14:00:00,31.803987581002595
353
+ 2024-12-15 15:00:00,30.92272734266853
354
+ 2024-12-15 16:00:00,29.953334687157884
355
+ 2024-12-15 17:00:00,29.177753200579176
356
+ 2024-12-15 18:00:00,28.257592935195046
357
+ 2024-12-15 19:00:00,27.81725838390581
358
+ 2024-12-15 20:00:00,27.22316904209072
359
+ 2024-12-15 21:00:00,26.870617803231355
360
+ 2024-12-15 22:00:00,26.647528661099727
361
+ 2024-12-15 23:00:00,26.26615861145196
362
+ 2024-12-16 00:00:00,25.904241458850937
363
+ 2024-12-16 01:00:00,25.722922342726605
364
+ 2024-12-16 02:00:00,25.476366619426628
365
+ 2024-12-16 03:00:00,25.123373794848384
366
+ 2024-12-16 04:00:00,24.769010517933864
367
+ 2024-12-16 05:00:00,24.64910442775088
368
+ 2024-12-16 06:00:00,24.979993516171287
369
+ 2024-12-16 07:00:00,26.643247500328155
370
+ 2024-12-16 08:00:00,28.355918425965896
371
+ 2024-12-16 09:00:00,29.658112111973786
372
+ 2024-12-16 10:00:00,30.931111033469215
373
+ 2024-12-16 11:00:00,31.516216402348427
374
+ 2024-12-16 12:00:00,31.964702350587277
375
+ 2024-12-16 13:00:00,31.950355469068477
376
+ 2024-12-16 14:00:00,31.76105365267737
377
+ 2024-12-16 15:00:00,30.87950030166165
378
+ 2024-12-16 16:00:00,29.910542558381895
379
+ 2024-12-16 17:00:00,29.134977164614376
380
+ 2024-12-16 18:00:00,28.2147865042444
381
+ 2024-12-16 19:00:00,27.774516922271037
382
+ 2024-12-16 20:00:00,27.18030839904492
383
+ 2024-12-16 21:00:00,26.827892705982393
384
+ 2024-12-16 22:00:00,26.604159107297065
385
+ 2024-12-16 23:00:00,26.222612228118813
386
+ 2024-12-17 00:00:00,25.86106719966342
387
+ 2024-12-17 01:00:00,25.67968683886398
388
+ 2024-12-17 02:00:00,25.433380786889032
389
+ 2024-12-17 03:00:00,25.080530270963514
390
+ 2024-12-17 04:00:00,24.726191790674573
391
+ 2024-12-17 05:00:00,24.606258099231646
392
+ 2024-12-17 06:00:00,24.937307803309572
393
+ 2024-12-17 07:00:00,26.600391971982717
394
+ 2024-12-17 08:00:00,28.31308295547086
395
+ 2024-12-17 09:00:00,29.615134653167768
396
+ 2024-12-17 10:00:00,30.888403552500108
397
+ 2024-12-17 11:00:00,31.473106225395533
398
+ 2024-12-17 12:00:00,31.92208233385478
399
+ 2024-12-17 13:00:00,31.907378859739076
400
+ 2024-12-17 14:00:00,31.71849860668464
401
+ 2024-12-17 15:00:00,30.83715853446971
402
+ 2024-12-17 16:00:00,29.867884334192844
403
+ 2024-12-17 17:00:00,29.09230723074612
404
+ 2024-12-17 18:00:00,28.17213868680623
405
+ 2024-12-17 19:00:00,27.731821830939086
406
+ 2024-12-17 20:00:00,27.137700028179236
407
+ 2024-12-17 21:00:00,26.78518570736427
408
+ 2024-12-17 22:00:00,26.561921037284005
409
+ 2024-12-17 23:00:00,26.180502825313166
410
+ 2024-12-18 00:00:00,25.818687026616523
411
+ 2024-12-18 01:00:00,25.637351229534993
412
+ 2024-12-18 02:00:00,25.390863508174423
413
+ 2024-12-18 03:00:00,25.03790944361149
414
+ 2024-12-18 04:00:00,24.683552920450648
415
+ 2024-12-18 05:00:00,24.5636393126274
416
+ 2024-12-18 06:00:00,24.894572147265794
417
+ 2024-12-18 07:00:00,26.55777987948631
418
+ 2024-12-18 08:00:00,28.27045626819726
419
+ 2024-12-18 09:00:00,29.57261128143999
420
+ 2024-12-18 10:00:00,30.845683735674932
421
+ 2024-12-18 11:00:00,31.43067942392548
422
+ 2024-12-18 12:00:00,31.879298875063007
423
+ 2024-12-18 13:00:00,31.864854869903095
424
+ 2024-12-18 14:00:00,31.67566787296301
425
+ 2024-12-18 15:00:00,30.79417261180638
426
+ 2024-12-18 16:00:00,29.825128676451744
427
+ 2024-12-18 17:00:00,29.049560093367646
428
+ 2024-12-18 18:00:00,28.12937545675766
429
+ 2024-12-18 19:00:00,27.68909299899065
430
+ 2024-12-18 20:00:00,27.094908095456915
431
+ 2024-12-18 21:00:00,26.742465539564048
432
+ 2024-12-18 22:00:00,26.518859661010715
433
+ 2024-12-18 23:00:00,26.1373478263841
434
+ 2024-12-19 00:00:00,25.77572904936532
435
+ 2024-12-19 01:00:00,25.594360826200212
436
+ 2024-12-19 02:00:00,25.348005293691003
437
+ 2024-12-19 03:00:00,24.995126574654186
438
+ 2024-12-19 04:00:00,24.64078318010334
439
+ 2024-12-19 05:00:00,24.520854958752295
440
+ 2024-12-19 06:00:00,24.851872831587507
441
+ 2024-12-19 07:00:00,26.514990654749653
442
+ 2024-12-19 08:00:00,28.22767766311909
443
+ 2024-12-19 09:00:00,29.529757500441104
444
+ 2024-12-19 10:00:00,30.802972894840075
445
+ 2024-12-19 11:00:00,31.38775537510794
446
+ 2024-12-19 12:00:00,31.83663434229725
447
+ 2024-12-19 13:00:00,31.82200153866085
448
+ 2024-12-19 14:00:00,31.633037739051268
449
+ 2024-12-19 15:00:00,30.751655398670344
450
+ 2024-12-19 16:00:00,29.782443914691743
451
+ 2024-12-19 17:00:00,29.006869131900718
452
+ 2024-12-19 18:00:00,28.086696204867273
453
+ 2024-12-19 19:00:00,27.646388717867467
454
+ 2024-12-19 20:00:00,27.05224972861252
455
+ 2024-12-19 21:00:00,26.699754954110627
456
+ 2024-12-19 22:00:00,26.476397350499017
457
+ 2024-12-19 23:00:00,26.094953638915175
458
+ 2024-12-20 00:00:00,25.733191502192728
459
+ 2024-12-20 01:00:00,25.551846873353803
460
+ 2024-12-20 02:00:00,25.305395155720365
461
+ 2024-12-20 03:00:00,24.952461612704713
462
+ 2024-12-20 04:00:00,24.598108665328724
463
+ 2024-12-20 05:00:00,24.478191077279742
464
+ 2024-12-20 06:00:00,24.80914707341779
465
+ 2024-12-20 07:00:00,26.472330317482367
466
+ 2024-12-20 08:00:00,28.185009598625495
467
+ 2024-12-20 09:00:00,29.48714413651566
468
+ 2024-12-20 10:00:00,30.760255522768013
469
+ 2024-12-20 11:00:00,31.345193140447908
470
+ 2024-12-20 12:00:00,31.79388327489208
471
+ 2024-12-20 13:00:00,31.779387847477107
472
+ 2024-12-20 14:00:00,31.590261641864757
473
+ 2024-12-20 15:00:00,30.708797136469713
474
+ 2024-12-20 16:00:00,29.73970756659388
475
+ 2024-12-20 17:00:00,28.964137294921414
476
+ 2024-12-20 18:00:00,28.043955847600042
477
+ 2024-12-20 19:00:00,27.60366657272509
478
+ 2024-12-20 20:00:00,27.009494174672323
479
+ 2024-12-20 21:00:00,26.657037396214303
480
+ 2024-12-20 22:00:00,26.43349913927327
481
+ 2024-12-20 23:00:00,26.052005859036218
482
+ 2024-12-21 00:00:00,25.69034803573176
483
+ 2024-12-21 01:00:00,25.50898623885505
484
+ 2024-12-21 02:00:00,25.262604508803975
485
+ 2024-12-21 03:00:00,24.90971085758828
486
+ 2024-12-21 04:00:00,24.55536486117422
487
+ 2024-12-21 05:00:00,24.43543953597139
488
+ 2024-12-21 06:00:00,24.766440555708186
489
+ 2024-12-21 07:00:00,26.42957619728918
490
+ 2024-12-21 08:00:00,28.142261101026154
491
+ 2024-12-21 09:00:00,29.444355836914195
492
+ 2024-12-21 10:00:00,30.717542903047256
493
+ 2024-12-21 11:00:00,31.302367637446192
494
+ 2024-12-21 12:00:00,31.751195173046824
495
+ 2024-12-21 13:00:00,31.736599785999957
496
+ 2024-12-21 14:00:00,31.5475917525435
497
+ 2024-12-21 15:00:00,30.666187033219735
498
+ 2024-12-21 16:00:00,29.69700875447777
499
+ 2024-12-21 17:00:00,28.92143520036133
500
+ 2024-12-21 18:00:00,28.00125995269253
501
+ 2024-12-21 19:00:00,27.56095742605335
502
+ 2024-12-21 20:00:00,26.966809337383225
503
+ 2024-12-21 21:00:00,26.614324911705623
504
+ 2024-12-21 22:00:00,26.39091810429874
505
+ 2024-12-21 23:00:00,26.00946089190718
506
+ 2024-12-22 00:00:00,25.64772716659613
507
+ 2024-12-22 01:00:00,25.466377861770226
508
+ 2024-12-22 02:00:00,25.219945206363242
509
+ 2024-12-22 03:00:00,24.867022528511068
510
+ 2024-12-22 04:00:00,24.512671474339644
511
+ 2024-12-22 05:00:00,24.39275177895428
512
+ 2024-12-22 06:00:00,24.723720037982485
513
+ 2024-12-22 07:00:00,26.38689031675678
514
+ 2024-12-22 08:00:00,28.099571129302383
515
+ 2024-12-22 09:00:00,29.401694826486924
516
+ 2024-12-22 10:00:00,30.67482682535333
517
+ 2024-12-22 11:00:00,31.259733697483924
518
+ 2024-12-22 12:00:00,31.70846125530908
519
+ 2024-12-22 13:00:00,31.6939386023053
520
+ 2024-12-22 14:00:00,31.504844582751094
521
+ 2024-12-22 15:00:00,30.623396361039394
522
+ 2024-12-22 16:00:00,29.654282629898987
523
+ 2024-12-22 17:00:00,28.878711464200922
524
+ 2024-12-22 18:00:00,27.95853170545311
525
+ 2024-12-22 19:00:00,27.518238821250307
526
+ 2024-12-22 20:00:00,26.924073044242892
527
+ 2024-12-22 21:00:00,26.571608735626768
528
+ 2024-12-22 22:00:00,26.34810628104812
529
+ 2024-12-22 23:00:00,25.966622824459993
530
+ 2024-12-23 00:00:00,25.60494432804198
531
+ 2024-12-23 01:00:00,25.423585933573147
532
+ 2024-12-23 02:00:00,25.177190333194886
533
+ 2024-12-23 03:00:00,24.824288776115054
534
+ 2024-12-23 04:00:00,24.46994140214067
535
+ 2024-12-23 05:00:00,24.350017610307788
536
+ 2024-12-23 06:00:00,24.68100970714677
537
+ 2024-12-23 07:00:00,26.344154782715908
538
+ 2024-12-23 08:00:00,28.05683857215212
539
+ 2024-12-23 09:00:00,29.358941196107924
540
+ 2024-12-23 10:00:00,30.632113263798814
541
+ 2024-12-23 11:00:00,31.21696036970978
542
+ 2024-12-23 12:00:00,31.665760674779918
543
+ 2024-12-23 13:00:00,31.651185098001573
544
+ 2024-12-23 14:00:00,31.46215364486963
545
+ 2024-12-23 15:00:00,30.580737076981567
546
+ 2024-12-23 16:00:00,29.611576378801125
547
+ 2024-12-23 17:00:00,28.836003475208255
548
+ 2024-12-23 18:00:00,27.915826998875644
549
+ 2024-12-23 19:00:00,27.47552709850672
550
+ 2024-12-23 20:00:00,26.8813741921378
551
+ 2024-12-23 21:00:00,26.528895245660493
552
+ 2024-12-23 22:00:00,26.305462387231618
553
+ 2024-12-23 23:00:00,25.923998026817497
554
+ 2024-12-24 00:00:00,25.56227934397013
555
+ 2024-12-24 01:00:00,25.380927563436018
556
+ 2024-12-24 02:00:00,25.134505000552945
557
+ 2024-12-24 03:00:00,24.78158807527761
558
+ 2024-12-24 04:00:00,24.42723802346613
559
+ 2024-12-24 05:00:00,24.307317212348412
560
+ 2024-12-24 06:00:00,24.6382919639819
561
+ 2024-12-24 07:00:00,26.301455378264126
562
+ 2024-12-24 08:00:00,28.014137001613033
563
+ 2024-12-24 09:00:00,29.316254959169992
564
+ 2024-12-24 10:00:00,30.58939787141531
565
+ 2024-12-24 11:00:00,31.17428846526948
566
+ 2024-12-24 12:00:00,31.623035836958902
567
+ 2024-12-24 13:00:00,31.608498769326964
568
+ 2024-12-24 14:00:00,31.419421790728723
569
+ 2024-12-24 15:00:00,30.537982190437194
570
+ 2024-12-24 16:00:00,29.568855667079617
571
+ 2024-12-24 17:00:00,28.793284028038382
572
+ 2024-12-24 18:00:00,27.873105163308335
573
+ 2024-12-24 19:00:00,27.432810368141574
574
+ 2024-12-24 20:00:00,26.83864809665638
575
+ 2024-12-24 21:00:00,26.486179801186946
576
+ 2024-12-24 22:00:00,26.262696302221883
577
+ 2024-12-24 23:00:00,25.881218046779175
578
+ 2024-12-25 00:00:00,25.519528604950693
579
+ 2024-12-25 01:00:00,25.33817201189172
580
+ 2024-12-25 02:00:00,25.091769067848276
581
+ 2024-12-25 03:00:00,24.738863324997013
582
+ 2024-12-25 04:00:00,24.38451522167129
583
+ 2024-12-25 05:00:00,24.26459224168339
584
+ 2024-12-25 06:00:00,24.595579614280958
585
+ 2024-12-25 07:00:00,26.258729684689033
586
+ 2024-12-25 08:00:00,27.971412884157065
587
+ 2024-12-25 09:00:00,29.27351968446198
588
+ 2024-12-25 10:00:00,30.54668381120554
589
+ 2024-12-25 11:00:00,31.13154276174655
590
+ 2024-12-25 12:00:00,31.580328649572145
591
+ 2024-12-25 13:00:00,31.56576356136969
592
+ 2024-12-25 14:00:00,31.376719708656022
593
+ 2024-12-25 15:00:00,30.49529686752811
594
+ 2024-12-25 16:00:00,29.526145477401904
595
+ 2024-12-25 17:00:00,28.750572918229697
596
+ 2024-12-25 18:00:00,27.830395791379217
597
+ 2024-12-25 19:00:00,27.390097281492956
598
+ 2024-12-25 20:00:00,26.795941824386308
599
+ 2024-12-25 21:00:00,26.44346577887967
600
+ 2024-12-25 22:00:00,26.220019127698773
601
+ 2024-12-25 23:00:00,25.83855098275356
602
+ 2024-12-26 00:00:00,25.47684026416077
603
+ 2024-12-26 01:00:00,25.2954871728593
604
+ 2024-12-26 02:00:00,25.0490699534779
605
+ 2024-12-26 03:00:00,24.69615607391286
606
+ 2024-12-26 04:00:00,24.341806552802332
607
+ 2024-12-26 05:00:00,24.22188515095847
608
+ 2024-12-26 06:00:00,24.552863340111404
609
+ 2024-12-26 07:00:00,26.21602311997818
610
+ 2024-12-26 08:00:00,27.92870517260809
611
+ 2024-12-26 09:00:00,29.230820091310758
612
+ 2024-12-26 10:00:00,30.503968781660646
613
+ 2024-12-26 11:00:00,31.088850756957342
614
+ 2024-12-26 12:00:00,31.537608619126424
615
+ 2024-12-26 13:00:00,31.52306391964835
616
+ 2024-12-26 14:00:00,31.33399596340939
617
+ 2024-12-26 15:00:00,30.452560927741484
618
+ 2024-12-26 16:00:00,29.483427631525657
619
+ 2024-12-26 17:00:00,28.707855741872176
620
+ 2024-12-26 18:00:00,27.787677350481154
621
+ 2024-12-26 19:00:00,27.347381543551705
622
+ 2024-12-26 20:00:00,26.753221128070432
623
+ 2024-12-26 21:00:00,26.400750721755625
624
+ 2024-12-26 22:00:00,26.177277258868138
625
+ 2024-12-26 23:00:00,25.79580175717954
626
+ 2024-12-27 00:00:00,25.43410652028734
627
+ 2024-12-27 01:00:00,25.252750880987485
628
+ 2024-12-27 02:00:00,25.006344048829664
629
+ 2024-12-27 03:00:00,24.65343608981554
630
+ 2024-12-27 04:00:00,24.299087600333674
631
+ 2024-12-27 05:00:00,24.179165050178295
632
+ 2024-12-27 06:00:00,24.51014992151928
633
+ 2024-12-27 07:00:00,26.1733026364522
634
+ 2024-12-27 08:00:00,27.885985523560706
635
+ 2024-12-27 09:00:00,29.18809453503982
636
+ 2024-12-27 10:00:00,30.461254457437093
637
+ 2024-12-27 11:00:00,31.04611967913496
638
+ 2024-12-27 12:00:00,31.494897933729167
639
+ 2024-12-27 13:00:00,31.48033839871869
640
+ 2024-12-27 14:00:00,31.29128798102818
641
+ 2024-12-27 15:00:00,30.409861818524178
642
+ 2024-12-27 16:00:00,29.440715356561014
643
+ 2024-12-27 17:00:00,28.665142979742836
644
+ 2024-12-27 18:00:00,27.744965508474714
645
+ 2024-12-27 19:00:00,27.304667734781546
646
+ 2024-12-27 20:00:00,26.710510927183037
647
+ 2024-12-27 21:00:00,26.358036417599603
648
+ 2024-12-27 22:00:00,26.1345824638258
649
+ 2024-12-27 23:00:00,25.75311231515502
650
+ 2024-12-28 00:00:00,25.39140581324857
651
+ 2024-12-28 01:00:00,25.210052027959385
652
+ 2024-12-28 02:00:00,24.963637637702828
653
+ 2024-12-28 03:00:00,24.610725370693597
654
+ 2024-12-28 04:00:00,24.25637613056347
655
+ 2024-12-28 05:00:00,24.13645441595878
656
+ 2024-12-28 06:00:00,24.467434425111456
657
+ 2024-12-28 07:00:00,26.13059228073161
658
+ 2024-12-28 08:00:00,27.843274560644982
659
+ 2024-12-28 09:00:00,29.145387870421764
660
+ 2024-12-28 10:00:00,30.41853961999764
661
+ 2024-12-28 11:00:00,31.003417032186366
662
+ 2024-12-28 12:00:00,31.452180448555392
663
+ 2024-12-28 13:00:00,31.437631708385116
664
+ 2024-12-28 14:00:00,31.24856852904758
665
+ 2024-12-28 15:00:00,30.367135910126386
666
+ 2024-12-28 16:00:00,29.397999028010766
667
+ 2024-12-28 17:00:00,28.622427005670264
668
+ 2024-12-28 18:00:00,27.702248864889285
669
+ 2024-12-28 19:00:00,27.261952522280588
670
+ 2024-12-28 20:00:00,26.667793089463323
671
+ 2024-12-28 21:00:00,26.315321565558325
672
+ 2024-12-28 22:00:00,26.091853416286913
673
+ 2024-12-28 23:00:00,25.710379372577492
674
+ 2024-12-29 00:00:00,25.34868106748026
675
+ 2024-12-29 01:00:00,25.16732593314957
676
+ 2024-12-29 02:00:00,24.920917042423863
677
+ 2024-12-29 03:00:00,24.568007910059045
678
+ 2024-12-29 04:00:00,24.213659216126235
679
+ 2024-12-29 05:00:00,24.09373689354632
680
+ 2024-12-29 06:00:00,24.42472044059332
681
+ 2024-12-29 07:00:00,26.08787455567382
682
+ 2024-12-29 08:00:00,27.80055727740312
683
+ 2024-12-29 09:00:00,29.10266745959167
684
+ 2024-12-29 10:00:00,30.375825155991606
685
+ 2024-12-29 11:00:00,30.960693697962718
686
+ 2024-12-29 12:00:00,31.4094679111313
687
+ 2024-12-29 13:00:00,31.394911316266512
688
+ 2024-12-29 14:00:00,31.205857422739328
689
+ 2024-12-29 15:00:00,30.32442950172785
690
+ 2024-12-29 16:00:00,29.355285648987884
691
+ 2024-12-29 17:00:00,28.579713368717314
692
+ 2024-12-29 18:00:00,27.659535715096762
693
+ 2024-12-29 19:00:00,27.219238331182112
694
+ 2024-12-29 20:00:00,26.625080808563702
695
+ 2024-12-29 21:00:00,26.272607112177074
696
+ 2024-12-29 22:00:00,26.049149292034684
697
+ 2024-12-29 23:00:00,25.667678082488443
698
+ 2024-12-30 00:00:00,25.305973813112796
699
+ 2024-12-30 01:00:00,25.124619660390792
700
+ 2024-12-30 02:00:00,24.878206768018558
701
+ 2024-12-30 03:00:00,24.52529535477937
702
+ 2024-12-30 04:00:00,24.17094626341474
703
+ 2024-12-30 05:00:00,24.05102438321837
704
+ 2024-12-30 06:00:00,24.38200535597259
705
+ 2024-12-30 07:00:00,26.04516219279753
706
+ 2024-12-30 08:00:00,27.757844593046464
707
+ 2024-12-30 09:00:00,29.059957050975065
708
+ 2024-12-30 10:00:00,30.333110420262653
709
+ 2024-12-30 11:00:00,30.917985416507136
710
+ 2024-12-30 12:00:00,31.366751773555507
711
+ 2024-12-30 13:00:00,31.352200894034784
712
+ 2024-12-30 14:00:00,31.163140243834757
713
+ 2024-12-30 15:00:00,30.281708904463677
714
+ 2024-12-30 16:00:00,29.312570123788124
715
+ 2024-12-30 17:00:00,28.536998031196283
716
+ 2024-12-30 18:00:00,27.616820023101162
717
+ 2024-12-30 19:00:00,27.1765233968763
718
+ 2024-12-30 20:00:00,26.582364484331944
719
+ 2024-12-30 21:00:00,26.229892368717167
720
+ 2024-12-30 22:00:00,26.006427032747627
721
+ 2024-12-30 23:00:00,25.624953760967433
722
+ 2024-12-31 00:00:00,25.26325383140452
data/forecast/sby_temp_forecast.csv ADDED
@@ -0,0 +1,722 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ,predicted_mean
2
+ 2024-12-01 00:00:00,25.755652109608953
3
+ 2024-12-01 01:00:00,25.84705944621293
4
+ 2024-12-01 02:00:00,25.70474014499642
5
+ 2024-12-01 03:00:00,25.408997792246417
6
+ 2024-12-01 04:00:00,25.086473995360915
7
+ 2024-12-01 05:00:00,25.115547838103215
8
+ 2024-12-01 06:00:00,25.483763000596884
9
+ 2024-12-01 07:00:00,27.27305755920862
10
+ 2024-12-01 08:00:00,28.915858364554964
11
+ 2024-12-01 09:00:00,30.260484855601433
12
+ 2024-12-01 10:00:00,31.493251719574204
13
+ 2024-12-01 11:00:00,32.063534660795824
14
+ 2024-12-01 12:00:00,32.650418799086864
15
+ 2024-12-01 13:00:00,32.57755304666795
16
+ 2024-12-01 14:00:00,32.38069361878522
17
+ 2024-12-01 15:00:00,31.398621301384463
18
+ 2024-12-01 16:00:00,30.368548718918472
19
+ 2024-12-01 17:00:00,29.602711326091537
20
+ 2024-12-01 18:00:00,28.63104454751469
21
+ 2024-12-01 19:00:00,28.274348664686787
22
+ 2024-12-01 20:00:00,27.669378927907953
23
+ 2024-12-01 21:00:00,27.356794119699128
24
+ 2024-12-01 22:00:00,27.146871463913783
25
+ 2024-12-01 23:00:00,26.78948141393262
26
+ 2024-12-02 00:00:00,26.429367987578786
27
+ 2024-12-02 01:00:00,26.311968820044957
28
+ 2024-12-02 02:00:00,26.08247724707548
29
+ 2024-12-02 03:00:00,25.72772915654309
30
+ 2024-12-02 04:00:00,25.379599076258224
31
+ 2024-12-02 05:00:00,25.279645990853385
32
+ 2024-12-02 06:00:00,25.605352479091263
33
+ 2024-12-02 07:00:00,27.289793821954156
34
+ 2024-12-02 08:00:00,28.93966188441016
35
+ 2024-12-02 09:00:00,30.224304427096627
36
+ 2024-12-02 10:00:00,31.495749011645785
37
+ 2024-12-02 11:00:00,32.08020659428269
38
+ 2024-12-02 12:00:00,32.625401513679904
39
+ 2024-12-02 13:00:00,32.50044402662706
40
+ 2024-12-02 14:00:00,32.28903951870856
41
+ 2024-12-02 15:00:00,31.42867438933968
42
+ 2024-12-02 16:00:00,30.34287719051351
43
+ 2024-12-02 17:00:00,29.674119170067602
44
+ 2024-12-02 18:00:00,28.702936781162656
45
+ 2024-12-02 19:00:00,28.323657573294803
46
+ 2024-12-02 20:00:00,27.666695999368805
47
+ 2024-12-02 21:00:00,27.35112723054397
48
+ 2024-12-02 22:00:00,27.140543422182795
49
+ 2024-12-02 23:00:00,26.73351435903267
50
+ 2024-12-03 00:00:00,26.391666392058177
51
+ 2024-12-03 01:00:00,26.25980433599441
52
+ 2024-12-03 02:00:00,26.046810892736016
53
+ 2024-12-03 03:00:00,25.69738107753806
54
+ 2024-12-03 04:00:00,25.34284719817384
55
+ 2024-12-03 05:00:00,25.23469388388523
56
+ 2024-12-03 06:00:00,25.57204633737897
57
+ 2024-12-03 07:00:00,27.234239292831948
58
+ 2024-12-03 08:00:00,28.88793951917211
59
+ 2024-12-03 09:00:00,30.15932163095859
60
+ 2024-12-03 10:00:00,31.45348637408567
61
+ 2024-12-03 11:00:00,31.98810866411552
62
+ 2024-12-03 12:00:00,32.58736206131052
63
+ 2024-12-03 13:00:00,32.43198329292393
64
+ 2024-12-03 14:00:00,32.27010392763684
65
+ 2024-12-03 15:00:00,31.424998820356958
66
+ 2024-12-03 16:00:00,30.318470395361786
67
+ 2024-12-03 17:00:00,29.64134899461026
68
+ 2024-12-03 18:00:00,28.668222897713786
69
+ 2024-12-03 19:00:00,28.283426425211086
70
+ 2024-12-03 20:00:00,27.62995078961191
71
+ 2024-12-03 21:00:00,27.297167856890155
72
+ 2024-12-03 22:00:00,27.13084698648436
73
+ 2024-12-03 23:00:00,26.740608269594766
74
+ 2024-12-04 00:00:00,26.37719012352379
75
+ 2024-12-04 01:00:00,26.24385457776717
76
+ 2024-12-04 02:00:00,26.012592580445332
77
+ 2024-12-04 03:00:00,25.655233673797742
78
+ 2024-12-04 04:00:00,25.303805647915144
79
+ 2024-12-04 05:00:00,25.194311550683764
80
+ 2024-12-04 06:00:00,25.520015707190193
81
+ 2024-12-04 07:00:00,27.1931854625111
82
+ 2024-12-04 08:00:00,28.844177237026877
83
+ 2024-12-04 09:00:00,30.122234472140654
84
+ 2024-12-04 10:00:00,31.400984731177182
85
+ 2024-12-04 11:00:00,31.974764018580583
86
+ 2024-12-04 12:00:00,32.529884619824564
87
+ 2024-12-04 13:00:00,32.39493788095019
88
+ 2024-12-04 14:00:00,32.19399424497279
89
+ 2024-12-04 15:00:00,31.344034321090025
90
+ 2024-12-04 16:00:00,30.250283566463704
91
+ 2024-12-04 17:00:00,29.585130618820422
92
+ 2024-12-04 18:00:00,28.613512819459007
93
+ 2024-12-04 19:00:00,28.231667084859073
94
+ 2024-12-04 20:00:00,27.572523528165306
95
+ 2024-12-04 21:00:00,27.252835249402285
96
+ 2024-12-04 22:00:00,27.052335959604143
97
+ 2024-12-04 23:00:00,26.646309692406955
98
+ 2024-12-05 00:00:00,26.300562856972153
99
+ 2024-12-05 01:00:00,26.167533933861527
100
+ 2024-12-05 02:00:00,25.95129809443231
101
+ 2024-12-05 03:00:00,25.600354597842394
102
+ 2024-12-05 04:00:00,25.246163844770976
103
+ 2024-12-05 05:00:00,25.13723386679373
104
+ 2024-12-05 06:00:00,25.472583927457148
105
+ 2024-12-05 07:00:00,27.136017875975472
106
+ 2024-12-05 08:00:00,28.789316109177182
107
+ 2024-12-05 09:00:00,30.061468197048992
108
+ 2024-12-05 10:00:00,31.353401580035243
109
+ 2024-12-05 11:00:00,31.894140014193987
110
+ 2024-12-05 12:00:00,32.48637874007479
111
+ 2024-12-05 13:00:00,32.33393914002703
112
+ 2024-12-05 14:00:00,32.16594643078811
113
+ 2024-12-05 15:00:00,31.32060116462225
114
+ 2024-12-05 16:00:00,30.21581343521147
115
+ 2024-12-05 17:00:00,29.54095357447607
116
+ 2024-12-05 18:00:00,28.56806160544649
117
+ 2024-12-05 19:00:00,28.183625402286015
118
+ 2024-12-05 20:00:00,27.52905153709105
119
+ 2024-12-05 21:00:00,27.198282719170187
120
+ 2024-12-05 22:00:00,27.026666488442075
121
+ 2024-12-05 23:00:00,26.633773079910842
122
+ 2024-12-06 00:00:00,26.273167823136536
123
+ 2024-12-06 01:00:00,26.139818314445634
124
+ 2024-12-06 02:00:00,25.91095232067805
125
+ 2024-12-06 03:00:00,25.554608995987806
126
+ 2024-12-06 04:00:00,25.20272597877771
127
+ 2024-12-06 05:00:00,25.09328443781548
128
+ 2024-12-06 06:00:00,25.420531202477754
129
+ 2024-12-06 07:00:00,27.09209942843409
130
+ 2024-12-06 08:00:00,28.743464441323727
131
+ 2024-12-06 09:00:00,30.020551271599665
132
+ 2024-12-06 10:00:00,31.30143867738706
133
+ 2024-12-06 11:00:00,31.86989151888708
134
+ 2024-12-06 12:00:00,32.43098764100468
135
+ 2024-12-06 13:00:00,32.29320385168861
136
+ 2024-12-06 14:00:00,32.09757137027512
137
+ 2024-12-06 15:00:00,31.24839041689951
138
+ 2024-12-06 16:00:00,30.152843155922472
139
+ 2024-12-06 17:00:00,29.4861519049574
140
+ 2024-12-06 18:00:00,28.514328600052966
141
+ 2024-12-06 19:00:00,28.132058454019038
142
+ 2024-12-06 20:00:00,27.473637162150865
143
+ 2024-12-06 21:00:00,27.15216050233661
144
+ 2024-12-06 22:00:00,26.95632030598209
145
+ 2024-12-06 23:00:00,26.552398388778787
146
+ 2024-12-07 00:00:00,26.20425982576245
147
+ 2024-12-07 01:00:00,26.071175036997776
148
+ 2024-12-07 02:00:00,25.852906432064202
149
+ 2024-12-07 03:00:00,25.50109335591521
150
+ 2024-12-07 04:00:00,25.147273040294312
151
+ 2024-12-07 05:00:00,25.038258188876434
152
+ 2024-12-07 06:00:00,25.372304367853122
153
+ 2024-12-07 07:00:00,27.037044156323763
154
+ 2024-12-07 08:00:00,28.690031617421017
155
+ 2024-12-07 09:00:00,29.96297597374124
156
+ 2024-12-07 10:00:00,31.253133936030427
157
+ 2024-12-07 11:00:00,31.798328944696
158
+ 2024-12-07 12:00:00,32.38555927099761
159
+ 2024-12-07 13:00:00,32.23547521578059
160
+ 2024-12-07 14:00:00,32.06303787954116
161
+ 2024-12-07 15:00:00,31.21707820675764
162
+ 2024-12-07 16:00:00,30.11377520271047
163
+ 2024-12-07 17:00:00,29.440230688597087
164
+ 2024-12-07 18:00:00,28.467510557765973
165
+ 2024-12-07 19:00:00,28.08342220094785
166
+ 2024-12-07 20:00:00,27.428228675593097
167
+ 2024-12-07 21:00:00,27.098953925838927
168
+ 2024-12-07 22:00:00,26.92344259443369
169
+ 2024-12-07 23:00:00,26.52877489369203
170
+ 2024-12-08 00:00:00,26.170174568030962
171
+ 2024-12-08 01:00:00,26.03686734244427
172
+ 2024-12-08 02:00:00,25.809705671802263
173
+ 2024-12-08 03:00:00,25.454090889356877
174
+ 2024-12-08 04:00:00,25.101896239668697
175
+ 2024-12-08 05:00:00,24.992523148186702
176
+ 2024-12-08 06:00:00,25.32086344828147
177
+ 2024-12-08 07:00:00,26.991333265147674
178
+ 2024-12-08 08:00:00,28.642959233204774
179
+ 2024-12-08 09:00:00,29.919379717804997
180
+ 2024-12-08 10:00:00,31.20175822098681
181
+ 2024-12-08 11:00:00,31.766470358223323
182
+ 2024-12-08 12:00:00,32.331769771565554
183
+ 2024-12-08 13:00:00,32.19200757374511
184
+ 2024-12-08 14:00:00,32.00010571046286
185
+ 2024-12-08 15:00:00,31.151443018268555
186
+ 2024-12-08 16:00:00,30.05464827221349
187
+ 2024-12-08 17:00:00,29.386854890422093
188
+ 2024-12-08 18:00:00,28.414887342875048
189
+ 2024-12-08 19:00:00,28.032324730994063
190
+ 2024-12-08 20:00:00,27.374422514528874
191
+ 2024-12-08 21:00:00,27.051691628847806
192
+ 2024-12-08 22:00:00,26.859121065839624
193
+ 2024-12-08 23:00:00,26.45668750364599
194
+ 2024-12-09 00:00:00,26.10686632572977
195
+ 2024-12-09 01:00:00,25.973745741672587
196
+ 2024-12-09 02:00:00,25.75404682411566
197
+ 2024-12-09 03:00:00,25.40162229975035
198
+ 2024-12-09 04:00:00,25.048063442906656
199
+ 2024-12-09 05:00:00,24.938990962339304
200
+ 2024-12-09 06:00:00,25.272119440015125
201
+ 2024-12-09 07:00:00,26.9377807998501
202
+ 2024-12-09 08:00:00,28.590549287481647
203
+ 2024-12-09 09:00:00,29.86405271643552
204
+ 2024-12-09 10:00:00,31.152959483577074
205
+ 2024-12-09 11:00:00,31.70129350351659
206
+ 2024-12-09 12:00:00,32.284996598173436
207
+ 2024-12-09 13:00:00,32.13657263971421
208
+ 2024-12-09 14:00:00,31.96100475204696
209
+ 2024-12-09 15:00:00,31.114610353789132
210
+ 2024-12-09 16:00:00,30.012354091277757
211
+ 2024-12-09 17:00:00,29.339734561194312
212
+ 2024-12-09 18:00:00,28.367135471057978
213
+ 2024-12-09 19:00:00,27.98329250324273
214
+ 2024-12-09 20:00:00,27.327663324639065
215
+ 2024-12-09 21:00:00,26.99944104784745
216
+ 2024-12-09 22:00:00,26.82118601865866
217
+ 2024-12-09 23:00:00,26.425269301953936
218
+ 2024-12-10 00:00:00,26.068080959903597
219
+ 2024-12-10 01:00:00,25.9348037512399
220
+ 2024-12-10 02:00:00,25.708842343554497
221
+ 2024-12-10 03:00:00,25.35374066228941
222
+ 2024-12-10 04:00:00,25.00132660166769
223
+ 2024-12-10 05:00:00,24.89200185778265
224
+ 2024-12-10 06:00:00,25.2211122587819
225
+ 2024-12-10 07:00:00,26.890808712169246
226
+ 2024-12-10 08:00:00,28.54261843611081
227
+ 2024-12-10 09:00:00,29.818569758943305
228
+ 2024-12-10 10:00:00,31.101998228391075
229
+ 2024-12-10 11:00:00,31.66407620950512
230
+ 2024-12-10 12:00:00,32.232335558110364
231
+ 2024-12-10 13:00:00,32.09118025536882
232
+ 2024-12-10 14:00:00,31.90190544871411
233
+ 2024-12-10 15:00:00,31.053607575781367
234
+ 2024-12-10 16:00:00,29.95593443248407
235
+ 2024-12-10 17:00:00,29.287364843114364
236
+ 2024-12-10 18:00:00,28.315295722121313
237
+ 2024-12-10 19:00:00,27.93252718548412
238
+ 2024-12-10 20:00:00,27.2749905502049
239
+ 2024-12-10 21:00:00,26.951376462749604
240
+ 2024-12-10 22:00:00,26.761108322626555
241
+ 2024-12-10 23:00:00,26.35972288969296
242
+ 2024-12-11 00:00:00,26.008716822274135
243
+ 2024-12-11 01:00:00,25.875571047584423
244
+ 2024-12-11 02:00:00,25.654864909523965
245
+ 2024-12-11 03:00:00,25.302009807651526
246
+ 2024-12-11 04:00:00,24.948635072789948
247
+ 2024-12-11 05:00:00,24.839522019683354
248
+ 2024-12-11 06:00:00,25.172004254556512
249
+ 2024-12-11 07:00:00,26.838314594019238
250
+ 2024-12-11 08:00:00,28.490928879987067
251
+ 2024-12-11 09:00:00,29.76482601313721
252
+ 2024-12-11 10:00:00,31.052851684527813
253
+ 2024-12-11 11:00:00,31.60339619880478
254
+ 2024-12-11 12:00:00,32.18461541614802
255
+ 2024-12-11 13:00:00,32.03736050362532
256
+ 2024-12-11 14:00:00,31.859588079257424
257
+ 2024-12-11 15:00:00,31.0128875378699
258
+ 2024-12-11 16:00:00,29.911368396090772
259
+ 2024-12-11 17:00:00,29.239400233646712
260
+ 2024-12-11 18:00:00,28.266886380493617
261
+ 2024-12-11 19:00:00,27.883216217582905
262
+ 2024-12-11 20:00:00,27.22728025533694
263
+ 2024-12-11 21:00:00,26.89979913142419
264
+ 2024-12-11 22:00:00,26.719611987228692
265
+ 2024-12-11 23:00:00,26.32281571576102
266
+ 2024-12-12 00:00:00,25.96662169281297
267
+ 2024-12-12 01:00:00,25.83336562317664
268
+ 2024-12-12 02:00:00,25.608249440799035
269
+ 2024-12-12 03:00:00,25.25350908557244
270
+ 2024-12-12 04:00:00,24.9009405160015
271
+ 2024-12-12 05:00:00,24.791649819158135
272
+ 2024-12-12 06:00:00,25.121302525220617
273
+ 2024-12-12 07:00:00,26.79045437682462
274
+ 2024-12-12 08:00:00,28.44239350158435
275
+ 2024-12-12 09:00:00,29.718014441154814
276
+ 2024-12-12 10:00:00,31.002182296347303
277
+ 2024-12-12 11:00:00,31.562405305445985
278
+ 2024-12-12 12:00:00,32.13274903979247
279
+ 2024-12-12 13:00:00,31.990612713250542
280
+ 2024-12-12 14:00:00,31.803187879162845
281
+ 2024-12-12 15:00:00,30.955146911235122
282
+ 2024-12-12 16:00:00,29.856855201146466
283
+ 2024-12-12 17:00:00,29.187739006146057
284
+ 2024-12-12 18:00:00,28.215598357162065
285
+ 2024-12-12 19:00:00,27.832684808488413
286
+ 2024-12-12 20:00:00,27.17540561563374
287
+ 2024-12-12 21:00:00,26.851169577769713
288
+ 2024-12-12 22:00:00,26.662522803156282
289
+ 2024-12-12 23:00:00,26.261875462784
290
+ 2024-12-13 00:00:00,25.910034996441112
291
+ 2024-12-13 01:00:00,25.77687148258875
292
+ 2024-12-13 02:00:00,25.55545606006885
293
+ 2024-12-13 03:00:00,25.202297745618424
294
+ 2024-12-13 04:00:00,24.849052669433913
295
+ 2024-12-13 05:00:00,24.73991104519881
296
+ 2024-12-13 06:00:00,25.07193819602553
297
+ 2024-12-13 07:00:00,26.738705546859734
298
+ 2024-12-13 08:00:00,28.391211244042974
299
+ 2024-12-13 09:00:00,29.665385623636976
300
+ 2024-12-13 10:00:00,30.9527908275495
301
+ 2024-12-13 11:00:00,31.504891971527307
302
+ 2024-12-13 12:00:00,32.08436204293865
303
+ 2024-12-13 13:00:00,31.93793037236728
304
+ 2024-12-13 14:00:00,31.758605513666218
305
+ 2024-12-13 15:00:00,30.911689386301695
306
+ 2024-12-13 16:00:00,29.810689324825677
307
+ 2024-12-13 17:00:00,29.139179855320148
308
+ 2024-12-13 18:00:00,28.166726026034898
309
+ 2024-12-13 19:00:00,27.78317755231396
310
+ 2024-12-13 20:00:00,27.127025553101493
311
+ 2024-12-13 21:00:00,26.800066348910576
312
+ 2024-12-13 22:00:00,26.61851860968361
313
+ 2024-12-13 23:00:00,26.221102955930967
314
+ 2024-12-14 00:00:00,25.86560913230533
315
+ 2024-12-14 01:00:00,25.732367948773163
316
+ 2024-12-14 02:00:00,25.50784697389595
317
+ 2024-12-14 03:00:00,25.153361064397288
318
+ 2024-12-14 04:00:00,24.80068368965499
319
+ 2024-12-14 05:00:00,24.691416968734917
320
+ 2024-12-14 06:00:00,25.021451565919037
321
+ 2024-12-14 07:00:00,26.690219909055166
322
+ 2024-12-14 08:00:00,28.342250157845896
323
+ 2024-12-14 09:00:00,29.617638441588664
324
+ 2024-12-14 10:00:00,30.902326972078583
325
+ 2024-12-14 11:00:00,31.46124371024289
326
+ 2024-12-14 12:00:00,32.033055268625816
327
+ 2024-12-14 13:00:00,31.890228105314822
328
+ 2024-12-14 14:00:00,31.704106021551002
329
+ 2024-12-14 15:00:00,30.856245966075257
330
+ 2024-12-14 16:00:00,29.757518661373194
331
+ 2024-12-14 17:00:00,29.08801754679121
332
+ 2024-12-14 18:00:00,28.11582652780986
333
+ 2024-12-14 19:00:00,27.732810861688737
334
+ 2024-12-14 20:00:00,27.075712959740798
335
+ 2024-12-14 21:00:00,26.751038944519433
336
+ 2024-12-14 22:00:00,26.56353393518398
337
+ 2024-12-14 23:00:00,26.163406359451645
338
+ 2024-12-15 00:00:00,25.81097830954755
339
+ 2024-12-15 01:00:00,25.677802303780616
340
+ 2024-12-15 02:00:00,25.455887403281316
341
+ 2024-12-15 03:00:00,25.102515566592054
342
+ 2024-12-15 04:00:00,24.74936179602298
343
+ 2024-12-15 05:00:00,24.6402000520049
344
+ 2024-12-15 06:00:00,24.971906732733956
345
+ 2024-12-15 07:00:00,26.638995910887996
346
+ 2024-12-15 08:00:00,28.291425139870064
347
+ 2024-12-15 09:00:00,29.565794756356457
348
+ 2024-12-15 10:00:00,30.85276302719052
349
+ 2024-12-15 11:00:00,31.405960349503452
350
+ 2024-12-15 12:00:00,31.984198672686933
351
+ 2024-12-15 13:00:00,31.838346728939005
352
+ 2024-12-15 14:00:00,31.65792864627993
353
+ 2024-12-15 15:00:00,30.810860703311793
354
+ 2024-12-15 16:00:00,29.71022617808521
355
+ 2024-12-15 17:00:00,29.039039720058394
356
+ 2024-12-15 18:00:00,28.066628159569298
357
+ 2024-12-15 19:00:00,27.68316537935236
358
+ 2024-12-15 20:00:00,27.02686124694983
359
+ 2024-12-15 21:00:00,26.700269578526385
360
+ 2024-12-15 22:00:00,26.517763708540645
361
+ 2024-12-15 23:00:00,26.119911885902457
362
+ 2024-12-16 00:00:00,25.764911142504594
363
+ 2024-12-16 01:00:00,25.63168044176413
364
+ 2024-12-16 02:00:00,25.407578611893882
365
+ 2024-12-16 03:00:00,25.05327188302775
366
+ 2024-12-16 04:00:00,24.70051788770477
367
+ 2024-12-16 05:00:00,24.59126805062527
368
+ 2024-12-16 06:00:00,24.921571575463577
369
+ 2024-12-16 07:00:00,26.590069852010636
370
+ 2024-12-16 08:00:00,28.242164270326413
371
+ 2024-12-16 09:00:00,29.517388717880205
372
+ 2024-12-16 10:00:00,30.802443907814126
373
+ 2024-12-16 11:00:00,31.360440770238434
374
+ 2024-12-16 12:00:00,31.933285970024663
375
+ 2024-12-16 13:00:00,31.78997231959417
376
+ 2024-12-16 14:00:00,31.604767632357117
377
+ 2024-12-16 15:00:00,30.757034975395143
378
+ 2024-12-16 16:00:00,29.65800092505036
379
+ 2024-12-16 17:00:00,28.98822875017327
380
+ 2024-12-16 18:00:00,28.016002260649486
381
+ 2024-12-16 19:00:00,27.632914683441562
382
+ 2024-12-16 20:00:00,26.97594444651519
383
+ 2024-12-16 21:00:00,26.650962007723276
384
+ 2024-12-16 22:00:00,26.464261029276322
385
+ 2024-12-16 23:00:00,26.064499471703172
386
+ 2024-12-17 00:00:00,25.711657645568625
387
+ 2024-12-17 01:00:00,25.578472842997865
388
+ 2024-12-17 02:00:00,25.356206210201822
389
+ 2024-12-17 03:00:00,25.002684011193164
390
+ 2024-12-17 04:00:00,24.64959453802087
391
+ 2024-12-17 05:00:00,24.540418625655505
392
+ 2024-12-17 06:00:00,24.871899631403604
393
+ 2024-12-17 07:00:00,26.53921544029419
394
+ 2024-12-17 08:00:00,28.19159082038375
395
+ 2024-12-17 09:00:00,29.466097922652107
396
+ 2024-12-17 10:00:00,30.7527585052966
397
+ 2024-12-17 11:00:00,31.30672775618167
398
+ 2024-12-17 12:00:00,31.884098682500703
399
+ 2024-12-17 13:00:00,31.738654982270013
400
+ 2024-12-17 14:00:00,31.557467051510596
401
+ 2024-12-17 15:00:00,30.71029220002368
402
+ 2024-12-17 16:00:00,29.609915085353435
403
+ 2024-12-17 17:00:00,28.938956091947606
404
+ 2024-12-17 18:00:00,27.966574297136617
405
+ 2024-12-17 19:00:00,27.583171862268667
406
+ 2024-12-17 20:00:00,26.926760597703048
407
+ 2024-12-17 21:00:00,26.60042774789615
408
+ 2024-12-17 22:00:00,26.41724716241491
409
+ 2024-12-17 23:00:00,26.019088189731654
410
+ 2024-12-18 00:00:00,25.664434673335084
411
+ 2024-12-18 01:00:00,25.53121135457451
412
+ 2024-12-18 02:00:00,25.30740468653732
413
+ 2024-12-18 03:00:00,24.953224136638056
414
+ 2024-12-18 04:00:00,24.60041618511694
415
+ 2024-12-18 05:00:00,24.491178237634717
416
+ 2024-12-18 06:00:00,24.821671141275225
417
+ 2024-12-18 07:00:00,26.489979236982354
418
+ 2024-12-18 08:00:00,28.142118843465298
419
+ 2024-12-18 09:00:00,29.417227917606414
420
+ 2024-12-18 10:00:00,30.702541309050066
421
+ 2024-12-18 11:00:00,31.25989039515571
422
+ 2024-12-18 12:00:00,31.83346348501876
423
+ 2024-12-18 13:00:00,31.689807250452564
424
+ 2024-12-18 14:00:00,31.50524859367269
425
+ 2024-12-18 15:00:00,30.657605650719532
426
+ 2024-12-18 16:00:00,29.55835559015231
427
+ 2024-12-18 17:00:00,28.888392534667705
428
+ 2024-12-18 18:00:00,27.916141066794786
429
+ 2024-12-18 19:00:00,27.533002849813407
430
+ 2024-12-18 20:00:00,26.876122514570586
431
+ 2024-12-18 21:00:00,26.55092288395979
432
+ 2024-12-18 22:00:00,26.364788103909415
433
+ 2024-12-18 23:00:00,25.965284296253355
434
+ 2024-12-19 00:00:00,25.612151088977146
435
+ 2024-12-19 01:00:00,25.478960091698827
436
+ 2024-12-19 02:00:00,25.25644576908727
437
+ 2024-12-19 03:00:00,24.902817684962297
438
+ 2024-12-19 04:00:00,24.54977349000441
439
+ 2024-12-19 05:00:00,24.440587600291618
440
+ 2024-12-19 06:00:00,24.77190968576166
441
+ 2024-12-19 07:00:00,26.439385087973207
442
+ 2024-12-19 08:00:00,28.091722547683048
443
+ 2024-12-19 09:00:00,29.366326467412538
444
+ 2024-12-19 10:00:00,30.652770376093297
445
+ 2024-12-19 11:00:00,31.20728321892996
446
+ 2024-12-19 12:00:00,31.78404332454437
447
+ 2024-12-19 13:00:00,31.638887109319764
448
+ 2024-12-19 14:00:00,31.457157051676596
449
+ 2024-12-19 15:00:00,30.609906915231377
450
+ 2024-12-19 16:00:00,29.50971106902525
451
+ 2024-12-19 17:00:00,28.83891225616165
452
+ 2024-12-19 18:00:00,27.86655142233544
453
+ 2024-12-19 19:00:00,27.483191482650604
454
+ 2024-12-19 20:00:00,26.8267047756364
455
+ 2024-12-19 21:00:00,26.500554185849357
456
+ 2024-12-19 22:00:00,26.31689846584634
457
+ 2024-12-19 23:00:00,25.9185231981606
458
+ 2024-12-20 00:00:00,25.564114198951355
459
+ 2024-12-20 01:00:00,25.4308960785796
460
+ 2024-12-20 02:00:00,25.207297263448304
461
+ 2024-12-20 03:00:00,24.853205568753165
462
+ 2024-12-20 04:00:00,24.50035962128773
463
+ 2024-12-20 05:00:00,24.39113004645761
464
+ 2024-12-20 06:00:00,24.7217563106141
465
+ 2024-12-20 07:00:00,26.389930481010435
466
+ 2024-12-20 08:00:00,28.04210190899198
467
+ 2024-12-20 09:00:00,29.317129737198147
468
+ 2024-12-20 10:00:00,30.602624954095152
469
+ 2024-12-20 11:00:00,31.15951787624216
470
+ 2024-12-20 12:00:00,31.733603546156885
471
+ 2024-12-20 13:00:00,31.58970606390841
472
+ 2024-12-20 14:00:00,31.405602341651857
473
+ 2024-12-20 15:00:00,30.558022575286408
474
+ 2024-12-20 16:00:00,29.458620400362225
475
+ 2024-12-20 17:00:00,28.788522926790623
476
+ 2024-12-20 18:00:00,27.81625386916906
477
+ 2024-12-20 19:00:00,27.433079991668983
478
+ 2024-12-20 20:00:00,26.776262965174382
479
+ 2024-12-20 21:00:00,26.450910388126623
480
+ 2024-12-20 22:00:00,26.265174324877897
481
+ 2024-12-20 23:00:00,25.865852024663738
482
+ 2024-12-21 00:00:00,25.512513626843777
483
+ 2024-12-21 01:00:00,25.379318267253588
484
+ 2024-12-21 02:00:00,25.156629521521726
485
+ 2024-12-21 03:00:00,24.802926873118267
486
+ 2024-12-21 04:00:00,24.44991456307023
487
+ 2024-12-21 05:00:00,24.340721647311305
488
+ 2024-12-21 06:00:00,24.6719318211522
489
+ 2024-12-21 07:00:00,26.339519608949576
490
+ 2024-12-21 08:00:00,27.991830365135332
491
+ 2024-12-21 09:00:00,29.26650246370228
492
+ 2024-12-21 10:00:00,30.55279379061957
493
+ 2024-12-21 11:00:00,31.107689430803674
494
+ 2024-12-21 12:00:00,31.684019396595726
495
+ 2024-12-21 13:00:00,31.53906562825695
496
+ 2024-12-21 14:00:00,31.35695380496682
497
+ 2024-12-21 15:00:00,30.509650652868483
498
+ 2024-12-21 16:00:00,29.40958245587982
499
+ 2024-12-21 17:00:00,28.738896442123156
500
+ 2024-12-21 18:00:00,27.76655036901838
501
+ 2024-12-21 19:00:00,27.383220354433302
502
+ 2024-12-21 20:00:00,26.726680520861358
503
+ 2024-12-21 21:00:00,26.40065827854513
504
+ 2024-12-21 22:00:00,26.216667968903533
505
+ 2024-12-21 23:00:00,25.818140386318767
506
+ 2024-12-22 00:00:00,25.46390357606567
507
+ 2024-12-22 01:00:00,25.330689116398315
508
+ 2024-12-22 02:00:00,25.107236671243253
509
+ 2024-12-22 03:00:00,24.75320754836572
510
+ 2024-12-22 04:00:00,24.400334844163627
511
+ 2024-12-22 05:00:00,24.29111116535351
512
+ 2024-12-22 06:00:00,24.621831341959624
513
+ 2024-12-22 07:00:00,26.289911202177933
514
+ 2024-12-22 08:00:00,27.942105038852656
515
+ 2024-12-22 09:00:00,29.217075653687107
516
+ 2024-12-22 10:00:00,30.502698912033278
517
+ 2024-12-22 11:00:00,31.05927060360861
518
+ 2024-12-22 12:00:00,31.63371723229685
519
+ 2024-12-22 13:00:00,31.489649863477045
520
+ 2024-12-22 14:00:00,31.305866506024064
521
+ 2024-12-22 15:00:00,30.458331228599494
522
+ 2024-12-22 16:00:00,29.35882193477447
523
+ 2024-12-22 17:00:00,28.688629804011935
524
+ 2024-12-22 18:00:00,27.716348359692773
525
+ 2024-12-22 19:00:00,27.33314937006231
526
+ 2024-12-22 20:00:00,26.676376925575987
527
+ 2024-12-22 21:00:00,26.350916643676825
528
+ 2024-12-22 22:00:00,26.16546135672291
529
+ 2024-12-22 23:00:00,25.766266874014317
530
+ 2024-12-23 00:00:00,25.41278398105303
531
+ 2024-12-23 01:00:00,25.279585549523663
532
+ 2024-12-23 02:00:00,25.056773975064132
533
+ 2024-12-23 03:00:00,24.70301881851015
534
+ 2024-12-23 04:00:00,24.35002896180948
535
+ 2024-12-23 05:00:00,24.240831098310224
536
+ 2024-12-23 06:00:00,24.571962464003455
537
+ 2024-12-23 07:00:00,26.239629393708693
538
+ 2024-12-23 08:00:00,27.891921345277943
539
+ 2024-12-23 09:00:00,29.166641455369074
540
+ 2024-12-23 10:00:00,30.452825334237964
541
+ 2024-12-23 11:00:00,31.0079905402403
542
+ 2024-12-23 12:00:00,31.58401760165242
543
+ 2024-12-23 13:00:00,31.439206396371596
544
+ 2024-12-23 14:00:00,31.256825733786513
545
+ 2024-12-23 15:00:00,30.40948524807548
546
+ 2024-12-23 16:00:00,29.309506941641136
547
+ 2024-12-23 17:00:00,28.638900360993812
548
+ 2024-12-23 18:00:00,27.666564682386223
549
+ 2024-12-23 19:00:00,27.28325574105062
550
+ 2024-12-23 20:00:00,26.626678495766964
551
+ 2024-12-23 21:00:00,26.300746635714926
552
+ 2024-12-23 22:00:00,26.11652070811439
553
+ 2024-12-23 23:00:00,25.71788586540711
554
+ 2024-12-24 00:00:00,25.36377031058371
555
+ 2024-12-24 01:00:00,25.23055842878369
556
+ 2024-12-24 02:00:00,25.007209057337665
557
+ 2024-12-24 03:00:00,24.653223997522012
558
+ 2024-12-24 04:00:00,24.300332451231128
559
+ 2024-12-24 05:00:00,24.191112924397153
560
+ 2024-12-24 06:00:00,24.52189923413218
561
+ 2024-12-24 07:00:00,26.18991268114132
562
+ 2024-12-24 08:00:00,27.84212229801345
563
+ 2024-12-24 09:00:00,29.11705262320257
564
+ 2024-12-24 10:00:00,30.402766048312554
565
+ 2024-12-24 11:00:00,30.95911152938127
566
+ 2024-12-24 12:00:00,31.53381234516819
567
+ 2024-12-24 13:00:00,31.389625342257634
568
+ 2024-12-24 14:00:00,31.20606758563752
569
+ 2024-12-24 15:00:00,30.358563637316532
570
+ 2024-12-24 16:00:00,29.258978910382208
571
+ 2024-12-24 17:00:00,28.588720122044084
572
+ 2024-12-24 18:00:00,27.61642995501486
573
+ 2024-12-24 19:00:00,27.23321328142702
574
+ 2024-12-24 20:00:00,26.576472231582326
575
+ 2024-12-24 21:00:00,26.250936103947584
576
+ 2024-12-24 22:00:00,26.065678539606306
577
+ 2024-12-24 23:00:00,25.66657406596048
578
+ 2024-12-25 00:00:00,25.31298941954854
579
+ 2024-12-25 01:00:00,25.1797888247602
580
+ 2024-12-25 02:00:00,24.95689075433434
581
+ 2024-12-25 03:00:00,24.60309862155089
582
+ 2024-12-25 04:00:00,24.2501245764931
583
+ 2024-12-25 05:00:00,24.140923228796062
584
+ 2024-12-25 06:00:00,24.471999097806915
585
+ 2024-12-25 07:00:00,26.1397217592284
586
+ 2024-12-25 08:00:00,27.792000468590338
587
+ 2024-12-25 09:00:00,29.066754388387537
588
+ 2024-12-25 10:00:00,30.352862602361466
589
+ 2024-12-25 11:00:00,30.908217636561
590
+ 2024-12-25 12:00:00,31.484031392767204
591
+ 2024-12-25 13:00:00,31.339320580364284
592
+ 2024-12-25 14:00:00,31.156750601199565
593
+ 2024-12-25 15:00:00,30.309383825165675
594
+ 2024-12-25 16:00:00,29.20946881964234
595
+ 2024-12-25 17:00:00,28.53891817577529
596
+ 2024-12-25 18:00:00,27.56658981697062
597
+ 2024-12-25 19:00:00,27.18329571541323
598
+ 2024-12-25 20:00:00,26.5266921248094
599
+ 2024-12-25 21:00:00,26.20082391193037
600
+ 2024-12-25 22:00:00,26.016432062208597
601
+ 2024-12-25 23:00:00,25.617721686943735
602
+ 2024-12-26 00:00:00,25.263691520170543
603
+ 2024-12-26 01:00:00,25.130481453704203
604
+ 2024-12-26 02:00:00,24.907204666744192
605
+ 2024-12-26 03:00:00,24.553250636128226
606
+ 2024-12-26 04:00:00,24.200345821242042
607
+ 2024-12-26 05:00:00,24.09112921822887
608
+ 2024-12-26 06:00:00,24.421962098900515
609
+ 2024-12-26 07:00:00,26.089928777740568
610
+ 2024-12-26 08:00:00,27.742149507024667
611
+ 2024-12-26 09:00:00,29.017051460253324
612
+ 2024-12-26 10:00:00,30.302828380780984
613
+ 2024-12-26 11:00:00,30.85901456445459
614
+ 2024-12-26 12:00:00,31.43389437874736
615
+ 2024-12-26 13:00:00,31.289623129533176
616
+ 2024-12-26 14:00:00,31.106224240976047
617
+ 2024-12-26 15:00:00,30.258742354603758
618
+ 2024-12-26 16:00:00,29.15910450768841
619
+ 2024-12-26 17:00:00,28.48879877909841
620
+ 2024-12-26 18:00:00,27.51650246953844
621
+ 2024-12-26 19:00:00,27.133273342911227
622
+ 2024-12-26 20:00:00,26.476554401167117
623
+ 2024-12-26 21:00:00,26.150964862980008
624
+ 2024-12-26 22:00:00,25.96584653486441
625
+ 2024-12-26 23:00:00,25.566805445583217
626
+ 2024-12-27 00:00:00,25.21314914441096
627
+ 2024-12-27 01:00:00,25.079947026256068
628
+ 2024-12-27 02:00:00,24.8569880453874
629
+ 2024-12-27 03:00:00,24.503169873950284
630
+ 2024-12-27 04:00:00,24.15020696344837
631
+ 2024-12-27 05:00:00,24.041003162179912
632
+ 2024-12-27 06:00:00,24.372039950437742
633
+ 2024-12-27 07:00:00,26.039801858123063
634
+ 2024-12-27 08:00:00,27.692071242325156
635
+ 2024-12-27 09:00:00,28.96684897091085
636
+ 2024-12-27 10:00:00,30.252903901680348
637
+ 2024-12-27 11:00:00,30.80839261285973
638
+ 2024-12-27 12:00:00,31.384056159581075
639
+ 2024-12-27 13:00:00,31.239416043823407
640
+ 2024-12-27 14:00:00,31.05671274795983
641
+ 2024-12-27 15:00:00,30.209327458285653
642
+ 2024-12-27 16:00:00,29.109457029251637
643
+ 2024-12-27 17:00:00,28.438945776054467
644
+ 2024-12-27 18:00:00,27.4666225718536
645
+ 2024-12-27 19:00:00,27.083338920465167
646
+ 2024-12-27 20:00:00,26.426716777491954
647
+ 2024-12-27 21:00:00,26.10089338493988
648
+ 2024-12-27 22:00:00,25.91638469289234
649
+ 2024-12-27 23:00:00,25.517621127615
650
+ 2024-12-28 00:00:00,25.16365109109029
651
+ 2024-12-28 01:00:00,25.03044230298158
652
+ 2024-12-28 02:00:00,24.807216630002618
653
+ 2024-12-28 03:00:00,24.453284450143077
654
+ 2024-12-28 04:00:00,24.100370291514647
655
+ 2024-12-28 05:00:00,23.991155747455522
656
+ 2024-12-28 06:00:00,24.322021423371755
657
+ 2024-12-28 07:00:00,25.989955168076158
658
+ 2024-12-28 08:00:00,27.642183722718627
659
+ 2024-12-28 09:00:00,28.91706569641819
660
+ 2024-12-28 10:00:00,30.202887330406735
661
+ 2024-12-28 11:00:00,30.758961336885424
662
+ 2024-12-28 12:00:00,31.333967201891493
663
+ 2024-12-28 13:00:00,31.189636626446543
664
+ 2024-12-28 14:00:00,31.006349612748725
665
+ 2024-12-28 15:00:00,30.158883262396454
666
+ 2024-12-28 16:00:00,29.05920800840072
667
+ 2024-12-28 17:00:00,28.388869224494403
668
+ 2024-12-28 18:00:00,27.41656858936547
669
+ 2024-12-28 19:00:00,27.033330693310333
670
+ 2024-12-28 20:00:00,26.376627320086385
671
+ 2024-12-28 21:00:00,26.051000170198606
672
+ 2024-12-28 22:00:00,25.865979892206276
673
+ 2024-12-28 23:00:00,25.46698343818243
674
+ 2024-12-29 00:00:00,25.11327667774178
675
+ 2024-12-29 01:00:00,24.980073486832456
676
+ 2024-12-29 02:00:00,24.75707161284171
677
+ 2024-12-29 03:00:00,24.403235104989715
678
+ 2024-12-29 04:00:00,24.050280035439894
679
+ 2024-12-29 05:00:00,23.941074506366927
680
+ 2024-12-29 06:00:00,24.272083773966013
681
+ 2024-12-29 07:00:00,25.939873318862755
682
+ 2024-12-29 08:00:00,27.59213613628909
683
+ 2024-12-29 09:00:00,28.86693063101904
684
+ 2024-12-29 10:00:00,30.152948039766258
685
+ 2024-12-29 11:00:00,30.70853088624907
686
+ 2024-12-29 12:00:00,31.284088655480147
687
+ 2024-12-29 13:00:00,31.139498324286432
688
+ 2024-12-29 14:00:00,30.95670114682923
689
+ 2024-12-29 15:00:00,30.109302819853134
690
+ 2024-12-29 16:00:00,29.0094637815743
691
+ 2024-12-29 17:00:00,28.33898026727926
692
+ 2024-12-29 18:00:00,27.366660692949395
693
+ 2024-12-29 19:00:00,26.983384400567925
694
+ 2024-12-29 20:00:00,26.326749193019776
695
+ 2024-12-29 21:00:00,26.000957362933296
696
+ 2024-12-29 22:00:00,25.816366390542488
697
+ 2024-12-29 23:00:00,25.417565368868622
698
+ 2024-12-30 00:00:00,25.063637676053293
699
+ 2024-12-30 01:00:00,24.930429788163774
700
+ 2024-12-30 02:00:00,24.707240109640413
701
+ 2024-12-30 03:00:00,24.35332331707933
702
+ 2024-12-30 04:00:00,24.00040257858942
703
+ 2024-12-30 05:00:00,23.89118948444533
704
+ 2024-12-30 06:00:00,24.222078254766473
705
+ 2024-12-30 07:00:00,25.889988807258902
706
+ 2024-12-30 08:00:00,27.542222872517225
707
+ 2024-12-30 09:00:00,28.817090776636263
708
+ 2024-12-30 10:00:00,30.10294389783533
709
+ 2024-12-30 11:00:00,30.658938909154998
710
+ 2024-12-30 12:00:00,31.234033539049054
711
+ 2024-12-30 13:00:00,31.08966118608384
712
+ 2024-12-30 14:00:00,30.906452954640372
713
+ 2024-12-30 15:00:00,30.0589975447504
714
+ 2024-12-30 16:00:00,28.959295948695875
715
+ 2024-12-30 17:00:00,28.288933887242187
716
+ 2024-12-30 18:00:00,27.316630206048423
717
+ 2024-12-30 19:00:00,26.933386134563833
718
+ 2024-12-30 20:00:00,26.276693724688787
719
+ 2024-12-30 21:00:00,25.951040088648647
720
+ 2024-12-30 22:00:00,25.766088857534207
721
+ 2024-12-30 23:00:00,25.367123835649974
722
+ 2024-12-31 00:00:00,25.01338154180225
data/model/cnn.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
data/model/cnnModel.keras ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7191af5a3ad7e8eb103508a9ac5a9dd8ae9c7a19cabb7e9c1d5ede8444851737
3
+ size 38517504
data/model/wp_CNN_test_preprocess.ipynb ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import numpy as np\n",
10
+ "import pandas as pd"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 2,
16
+ "metadata": {},
17
+ "outputs": [],
18
+ "source": [
19
+ "from keras.preprocessing.image import load_img, img_to_array"
20
+ ]
21
+ },
22
+ {
23
+ "cell_type": "code",
24
+ "execution_count": 3,
25
+ "metadata": {},
26
+ "outputs": [],
27
+ "source": [
28
+ "img_width, img_height = 256, 256"
29
+ ]
30
+ },
31
+ {
32
+ "cell_type": "code",
33
+ "execution_count": 4,
34
+ "metadata": {},
35
+ "outputs": [],
36
+ "source": [
37
+ "def preprocess_image(path):\n",
38
+ " img = load_img(path, target_size = (img_height, img_width))\n",
39
+ " a = img_to_array(img)\n",
40
+ " a = np.expand_dims(a, axis = 0)\n",
41
+ " a /= 255.\n",
42
+ " return a"
43
+ ]
44
+ },
45
+ {
46
+ "cell_type": "code",
47
+ "execution_count": 5,
48
+ "metadata": {},
49
+ "outputs": [],
50
+ "source": [
51
+ "test_images_dir = '../dataset/alien_test/'"
52
+ ]
53
+ },
54
+ {
55
+ "cell_type": "code",
56
+ "execution_count": 6,
57
+ "metadata": {},
58
+ "outputs": [],
59
+ "source": [
60
+ "test_df = pd.read_csv('../dataset/test.csv')\n",
61
+ "\n",
62
+ "test_dfToList = test_df['Image_id'].tolist()\n",
63
+ "test_ids = [str(item) for item in test_dfToList]"
64
+ ]
65
+ },
66
+ {
67
+ "cell_type": "code",
68
+ "execution_count": 7,
69
+ "metadata": {},
70
+ "outputs": [],
71
+ "source": [
72
+ "test_images = [test_images_dir+item for item in test_ids]\n",
73
+ "test_preprocessed_images = np.vstack([preprocess_image(fn) for fn in test_images])"
74
+ ]
75
+ },
76
+ {
77
+ "cell_type": "code",
78
+ "execution_count": 8,
79
+ "metadata": {},
80
+ "outputs": [],
81
+ "source": [
82
+ "np.save('../test_preproc_CNN.npy', test_preprocessed_images)"
83
+ ]
84
+ },
85
+ {
86
+ "cell_type": "code",
87
+ "execution_count": null,
88
+ "metadata": {},
89
+ "outputs": [],
90
+ "source": []
91
+ }
92
+ ],
93
+ "metadata": {
94
+ "kernelspec": {
95
+ "display_name": "Python 3 (ipykernel)",
96
+ "language": "python",
97
+ "name": "python3"
98
+ },
99
+ "language_info": {
100
+ "codemirror_mode": {
101
+ "name": "ipython",
102
+ "version": 3
103
+ },
104
+ "file_extension": ".py",
105
+ "mimetype": "text/x-python",
106
+ "name": "python",
107
+ "nbconvert_exporter": "python",
108
+ "pygments_lexer": "ipython3",
109
+ "version": "3.11.9"
110
+ }
111
+ },
112
+ "nbformat": 4,
113
+ "nbformat_minor": 4
114
+ }
data/model/wp_EDA_preprocessing.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
data/model/wp_confusion_matrix.ipynb ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import os\n",
10
+ "import numpy as np\n",
11
+ "import pandas as pd\n",
12
+ "import matplotlib.pyplot as plt\n",
13
+ "\n",
14
+ "import warnings\n",
15
+ "warnings.filterwarnings(\"ignore\")"
16
+ ]
17
+ },
18
+ {
19
+ "cell_type": "code",
20
+ "execution_count": 2,
21
+ "metadata": {},
22
+ "outputs": [],
23
+ "source": [
24
+ "from tensorflow.keras.models import load_model"
25
+ ]
26
+ },
27
+ {
28
+ "cell_type": "code",
29
+ "execution_count": 3,
30
+ "metadata": {},
31
+ "outputs": [],
32
+ "source": [
33
+ "test_preprocessed_images = np.load('../test_preproc_CNN.npy')"
34
+ ]
35
+ },
36
+ {
37
+ "cell_type": "code",
38
+ "execution_count": 4,
39
+ "metadata": {},
40
+ "outputs": [],
41
+ "source": [
42
+ "model_path = '../scripts/cnnModel.keras'"
43
+ ]
44
+ },
45
+ {
46
+ "cell_type": "code",
47
+ "execution_count": 5,
48
+ "metadata": {},
49
+ "outputs": [],
50
+ "source": [
51
+ "model = load_model(model_path)"
52
+ ]
53
+ },
54
+ {
55
+ "cell_type": "code",
56
+ "execution_count": 6,
57
+ "metadata": {},
58
+ "outputs": [
59
+ {
60
+ "name": "stdout",
61
+ "output_type": "stream",
62
+ "text": [
63
+ "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 14ms/step\n"
64
+ ]
65
+ }
66
+ ],
67
+ "source": [
68
+ "#Prediction Function\n",
69
+ "array = model.predict(test_preprocessed_images, batch_size=1, verbose=1)\n",
70
+ "y_pred = np.argmax(array, axis=1)"
71
+ ]
72
+ },
73
+ {
74
+ "cell_type": "code",
75
+ "execution_count": 7,
76
+ "metadata": {},
77
+ "outputs": [],
78
+ "source": [
79
+ "test_df = pd.read_csv('../dataset/test.csv')\n",
80
+ "y_true = test_df['labels']"
81
+ ]
82
+ },
83
+ {
84
+ "cell_type": "code",
85
+ "execution_count": 8,
86
+ "metadata": {},
87
+ "outputs": [],
88
+ "source": [
89
+ "from sklearn.metrics import confusion_matrix\n",
90
+ "conf_mat = confusion_matrix(y_true, y_pred)"
91
+ ]
92
+ },
93
+ {
94
+ "cell_type": "code",
95
+ "execution_count": 9,
96
+ "metadata": {},
97
+ "outputs": [],
98
+ "source": [
99
+ "train_dir = '../weather_pred/Data/training/'\n",
100
+ "classes = os.listdir(train_dir)"
101
+ ]
102
+ },
103
+ {
104
+ "cell_type": "code",
105
+ "execution_count": 10,
106
+ "metadata": {},
107
+ "outputs": [],
108
+ "source": [
109
+ "import itertools\n",
110
+ "def plot_confusion_matrix(cm, classes,\n",
111
+ " normalize=False,\n",
112
+ " title='Confusion matrix',\n",
113
+ " cmap=plt.cm.Reds):\n",
114
+ " \"\"\"\n",
115
+ " This function prints and plots the confusion matrix.\n",
116
+ " Normalization can be applied by setting `normalize=True`.\n",
117
+ " \"\"\"\n",
118
+ " plt.imshow(cm, interpolation='nearest', cmap=cmap)\n",
119
+ " plt.title(title)\n",
120
+ " plt.colorbar()\n",
121
+ " tick_marks = np.arange(len(classes))\n",
122
+ " plt.xticks(tick_marks, classes, rotation=45)\n",
123
+ " plt.yticks(tick_marks, classes)\n",
124
+ "\n",
125
+ " if normalize:\n",
126
+ " cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]\n",
127
+ " cm = cm.round(2)\n",
128
+ " #print(\"Normalized confusion matrix\")\n",
129
+ " else:\n",
130
+ " cm=cm\n",
131
+ " #print('Confusion matrix, without normalization')\n",
132
+ "\n",
133
+ " #print(cm)\n",
134
+ "\n",
135
+ " thresh = cm.max() / 2.\n",
136
+ " for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):\n",
137
+ " plt.text(j, i, cm[i, j],\n",
138
+ " horizontalalignment=\"center\",\n",
139
+ " color=\"white\" if cm[i, j] > thresh else \"black\")\n",
140
+ "\n",
141
+ " plt.tight_layout()\n",
142
+ " plt.ylabel('True label')\n",
143
+ " plt.xlabel('Predicted label')"
144
+ ]
145
+ },
146
+ {
147
+ "cell_type": "code",
148
+ "execution_count": 11,
149
+ "metadata": {},
150
+ "outputs": [
151
+ {
152
+ "data": {
153
+ "image/png": "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kFlXhadX1apVsX37dmzYsAHlypXDlClT8Pvvv8PLyyvdbfBUOBEREREBAJo2bYqmTZt+9euZWBIRERHJQAHdnjqW47Q0T4UTERERkVawYklEREQkA0lKWnTWvu6aThMrlkRERESkFaxYEhEREclA+v//dNl+ZmPFkoiIiIi0ghVLIiIiIhlk1r3CMxMrlkRERESkFUwsiYiIiEgreCqciIiISAY8FU5ERERElAZWLImIiIhkoACg0GFZUSF013aa+8z8XRIRERFRdsSKJREREZEMOEE6EREREVEaWLEkIiIikokcV27rEiuWRERERKQVrFgSERERyUCSkhZdtp/ZWLEkIiIiIq1gxZKIiIhIBrzzDhERERFRGlixJCIiIpKBAhIUOqwr6rLttPdJRERERKQFrFgSERERyYBjLImIiIiI0sCKJREREZEMOI8lEREREVEaWLEkIiIikgHHWBIRERERpYEVSyIiIiIZSP//ny7bz2ysWBIRERGRVrBiSURERCQDhZS06LL9zMaKJRERERFpBSuWZDCiO/4gdwgGT+nqLHcIBEDxUz+5QyAAiX+vkTsEg5b4PkbuEHhVOBERERFRWlixJCIiIpIBK5ZERERERGlgxZKIiIhIBpzHkoiIiIgoDaxYEhEREclAkpIWXbaf2VixJCIiIiKtYMWSiIiISAYK6LbCJ0f1kBVLIiIiItIKViyJiIiIZMB5LImIiIiI0sCKJREREZEcJAlSNrssnBVLIiIiItIKViyJiIiIZMAxlkREREREaWDFkoiIiEgGrFgSEREREaWBFUsiIiIiGUg6vipcp1ecp4EVSyIiIiLSClYsiYiIiGSgkJIWXbaf2VixJCIiIiKtYMWSiIiISAaSQoKkw7KiJMN14axYEhEREZFWsGJJREREJANJ0u3tvGW4KJwVSyIiIiLSDlYsiYiIiGTAiiURERERURpYsSQiIiKSAe+8Q0RERESUBiaWRERERDJIHmOpyyUjJk2apK6iJi+lS5fOUBs8FU5EREREAICyZcvi8OHD6sfGxhlLFZlYEhEREclAH8dYGhsbI3/+/F+9T54KJyIiIiIAwL1791CwYEEUK1YMXl5eePz4cYZez4olERERUTYWERGh8VipVEKpVKbYrnr16li1ahWcnJzw7NkzTJ48GbVr18b169dhaWmZrn2xYklEREQkg8y6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DDjGkoiIiIgoDaxYEhEREclAUiQtumw/s7FiSURERERawYolERERkQw4xpKIiIiIKA2sWBIRERHJQSElLbpsP5OxYklEREREWsGKJREREZEcJB3feodjLImIiIgoq2LFkoiIiEgGvCqciIiIiCgNrFgSERERyYFXhRMRERERpY6JJRERERFpBU+FExEREcmB0w0REREREaWOFUsiIiIiGUgKCZIOL7DRZdtpYWKZSRL//QuJOc3kDsOgmW84IHcIBi+64w9yh0AAzIeXlDsEAoCC7Ac5GUVEABgpdxjZDhNLIiIiIjlwjCURERERUepYsSQiIiKSgSTpeIwlK5ZERERElFWxYklEREQkB46xJCIiIiJKHSuWRERERHJQANDlXJMylA9ZsSQiIiIiDdOmTYMkSfD19c3Q61ixJCIiIpKBJEk6vXL7a9s+f/48lixZgvLly2f4taxYEhEREREAICoqCl5eXli2bBly586d4dczsSQiIiKSg0LS/QIgIiJCY4mLi0szpP79++PHH3+Eu7v71x3SV72KiIiIiLIEe3t7WFtbqxd/f/9Ut/vrr79w8eLFNJ9PD46xJCIiIpJDJs1jGRoaCisrK/VqpVKZYtPQ0FAMHjwYhw4dgqmp6VfvkoklERERUTZmZWWlkVim5sKFCwgLC0PlypXV6xITE3H8+HH88ccfiIuLg5GR0Rf3xcSSiIiISAaSImnRZfvp1aBBA1y7dk1jXdeuXVG6dGmMGjUqXUklwMSSiIiIyOBZWlqiXLlyGuvMzc1hY2OTYv3npCux3LVrV7obbN68ebq3JSIiIjJY2fBe4elKLFu2bJmuxiRJQmJi4rfEQ0RERER64OjRoxl+TboSS5VKleGGiYiIiChtkkKCpMN7heuy7bR805DR2NhYbcVBRERERFlchhPLxMRETJkyBYUKFYKFhQUePnwIABg/fjyWL1+u9QCJiIiIsqXkMZa6XDJZhhPLqVOnYtWqVZgxYwZMTEzU68uVK4c///xTq8ERERERUdaR4cRy9erVWLp0Kby8vDTmNKpQoQJu376t1eCIiIiIsq1Muld4ph5SRl/w9OlTlChRIsV6lUqFhIQErQRFRERERFlPhhPLMmXKIDAwMMX6LVu2oFKlSloJioiIiCi7kyRJ50tmy/CddyZMmABvb288ffoUKpUK27Ztw507d7B69Wrs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d4iIiIiIUpelKpZERERE2UY2vCqcFUsiIiIi0gomlkRERERykKT/jbPUyZKxiqW/vz+qVq0KS0tL2NraomXLlrhz506G2mBiSUREREQ4duwY+vfvjzNnzuDQoUNISEhAo0aNEB0dne42OMaSiIiISA66nmsyg21/OvPOqlWrYGtriwsXLqBOnTrpaoOJJREREVE2FhERofE4vbefDg8PBwDkyZMn3fviqXAiIiIiOeh0fOX/5si0t7eHtbW1evH39/9iaCqVCr6+vqhZsybKlSuX7kNixZKIiIgoGwsNDYWVlZX6cXqqlf3798f169dx4sSJDO2LiSURERGRHDJpHksrKyuNxPJLBgwYgD179uD48eMoXLhwhnbJxJKIiIiIIITAwIEDsX37dhw9ehRFixbNcBtMLImIiIjkoGf3Cu/fvz/Wr1+PnTt3wtLSEs+fPwcAWFtbw8zMLF1t8OIdIiIiIsKiRYsQHh6OunXrokCBAupl48aN6W6DFUsiIiIiOejZPJZCiG/eJSuWRERERKQVrFgSERERyUGhSFp02X4mY8WSiIiIiLSCFUsiIiIiWeh4jCV02XbqWLEkIiIiIq1gxZKIiIhIDno2j6U2sGJJRERERFrBxJKIiIiItIKnwomIiIjkoGcTpGsDK5ZEREREpBWsWBIRERHJgROkExERERGljhVLIiIiIjlwjCURERERUepYsSQiIiKSgyTpeIJ0ViyJiIiIKItixZKIiIhIDhxjSURERESUOlYsiYiIiOQgKXQ8xpLzWBIRERFRFsWKJREREZEcFFLSosv2MxkrlkRERESkFaxYEhEREcmBYyyJiIiIiFLHiiURERGRHDiPJRERERFR6lixJCIiIpIDx1gSEREREaWOFUsiIgNjPHyO3CEQgD7mheUOwaDFQ8gdAiRJgqTDcZC6bDstrFgSERERkVawYklEREQkB46xJCIiIiJKHSuWRERERHJgxZKIiIiIKHWsWBIRERHJQZIABe+8Q0RERESUAiuWRERERHLgGEsiIiIiotSxYklEREQkB0nS7ThIjrEkIiIioqyKFUsiIiIiOUiSjsdYsmJJRERERFkUK5ZEREREcuAYSyIiIiKi1LFiSURERCQHzmNJRERERJQ6ViyJiIiI5KDQ8b3Cddl2WrvM9D0SERERUbbEiiURERGRHDjGkoiIiIgodaxY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",
154
+ "text/plain": [
155
+ "<Figure size 700x600 with 2 Axes>"
156
+ ]
157
+ },
158
+ "metadata": {},
159
+ "output_type": "display_data"
160
+ }
161
+ ],
162
+ "source": [
163
+ "np.set_printoptions(precision=2)\n",
164
+ "\n",
165
+ "fig1 = plt.figure(figsize=(7,6))\n",
166
+ "plot_confusion_matrix(conf_mat, classes=classes, title='Confusion matrix, without normalization')\n",
167
+ "#fig1.savefig('../cm_wo_norm.jpg')\n",
168
+ "plt.show()"
169
+ ]
170
+ },
171
+ {
172
+ "cell_type": "code",
173
+ "execution_count": 12,
174
+ "metadata": {},
175
+ "outputs": [
176
+ {
177
+ "data": {
178
+ "image/png": "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vx7Lli0DANW0/n79+mH37t2YNm0a7t69iwULFuCvv/5KNe3fxcUF3377LYYPH44OHTrA1DT9ZUeIiIiIcrJs17EEgMmTJ6NNmzbo1KkTKlWqhHv37mHv3r2wsbEBABQrVgwbN27E5s2bUb58ecybN081K9zYOPl5yjVq1MD8+fMxbdo0uLm5Yc+ePRg0aBBMTFKv/detWzfEx8d/9jY4ERERUUYpJEnrm87PSedH/AIDBw5EaGio6rWJiQlmzZqFV69e4cOHDzh27BgqV66stk+LFi1w9+5dfPjwAYcOHcKbN29QpEgRtY5j9+7d8eTJE7x//x5btmxBaGgoSpQoker4T58+haura6pjEBEREdG/svxyQ19q7ty5qFy5MvLmzYvjx4/jt99+Q9++fdXq/P7772jQoAHMzMzw119/Yfny5Zg7d67q/ejoaISGhuKPP/7AhAkTdH0KREREpMe0PQ6S61hq0N27dzFhwgS8ffsWRYsWxc8//wx/f3+1OmfOnMGUKVMQFRWF4sWLY9asWfDz81O937dvX6xZswZeXl68DU5ERET0GXrbsZw+fTqmT5/+yTrr16//5PvLli1TTfohIiIi0iRJy88K1+pzyNORLcZYEhEREVHWp7cZSyIiIqKsTB/HWDJjSUREREQawYwlERERkQyYsSQiIiIiSgczlkREREQykBQSJIUWZ4ULzgonIiIiomyKGUsiIiIiGXCMJRERERFROpixJCIiIpKBQpKg0GJaUZttp3tMnR+RiIiIiPQSM5ZEREREMuAYSyIiIiKidDBjSURERCQDSZIgaTGtqM2208OMJRERERFpBDOWRERERDKQoOUxltprOl3MWBIRERGRRjBjSURERCQDjrEkIiIiIkoHM5ZEREREctDyOpZyDLJkxpKIiIiINIIZSyIiIiIZcIwlEREREVE6mLEkIiIikoGkSN602b6uMWNJRERERBrBjCURERGRDDjGkoiIiIgoHcxYEhEREclBISVv2mxfx5ixJCIiIiKNYMaSiIiISA6Slh+9wzGWRERERJRdMWNJREREJAPOCiciIiIiSgczlkRERERy4KxwIiIiIqK0sWNJRERERBrBW+FEREREcuByQ0REREREaWPGkoiIiEgGkkKCpMUJNtpsOz3sWOpI0sG1SMptKncYOZrZmj1yh5DjxXT4Tu4QCIDZkJJy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",
179
+ "text/plain": [
180
+ "<Figure size 700x600 with 2 Axes>"
181
+ ]
182
+ },
183
+ "metadata": {},
184
+ "output_type": "display_data"
185
+ }
186
+ ],
187
+ "source": [
188
+ "np.set_printoptions(precision=2)\n",
189
+ "\n",
190
+ "fig2 = plt.figure(figsize=(7,6))\n",
191
+ "plot_confusion_matrix(conf_mat, classes=classes, normalize = True, title='Normalized Confusion matrix')\n",
192
+ "fig2.savefig('../cm_norm.jpg')\n",
193
+ "plt.show()"
194
+ ]
195
+ },
196
+ {
197
+ "cell_type": "code",
198
+ "execution_count": null,
199
+ "metadata": {},
200
+ "outputs": [],
201
+ "source": []
202
+ }
203
+ ],
204
+ "metadata": {
205
+ "kernelspec": {
206
+ "display_name": "Python 3 (ipykernel)",
207
+ "language": "python",
208
+ "name": "python3"
209
+ },
210
+ "language_info": {
211
+ "codemirror_mode": {
212
+ "name": "ipython",
213
+ "version": 3
214
+ },
215
+ "file_extension": ".py",
216
+ "mimetype": "text/x-python",
217
+ "name": "python",
218
+ "nbconvert_exporter": "python",
219
+ "pygments_lexer": "ipython3",
220
+ "version": "3.11.9"
221
+ }
222
+ },
223
+ "nbformat": 4,
224
+ "nbformat_minor": 4
225
+ }
data/model/wp_prediction_and_log-loss.ipynb ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 2,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import numpy as np\n",
10
+ "import pandas as pd"
11
+ ]
12
+ },
13
+ {
14
+ "cell_type": "code",
15
+ "execution_count": 3,
16
+ "metadata": {},
17
+ "outputs": [],
18
+ "source": [
19
+ "from tensorflow.keras.models import load_model"
20
+ ]
21
+ },
22
+ {
23
+ "cell_type": "code",
24
+ "execution_count": 4,
25
+ "metadata": {},
26
+ "outputs": [],
27
+ "source": [
28
+ "img_width, img_height = 256, 256"
29
+ ]
30
+ },
31
+ {
32
+ "cell_type": "code",
33
+ "execution_count": 5,
34
+ "metadata": {},
35
+ "outputs": [],
36
+ "source": [
37
+ "test_preprocessed_images = np.load('../test_preproc_CNN.npy')"
38
+ ]
39
+ },
40
+ {
41
+ "cell_type": "code",
42
+ "execution_count": 6,
43
+ "metadata": {},
44
+ "outputs": [],
45
+ "source": [
46
+ "model_path = '../scripts/cnnModel.keras'"
47
+ ]
48
+ },
49
+ {
50
+ "cell_type": "code",
51
+ "execution_count": 7,
52
+ "metadata": {},
53
+ "outputs": [
54
+ {
55
+ "name": "stderr",
56
+ "output_type": "stream",
57
+ "text": [
58
+ "C:\\Users\\akhyar\\AppData\\Roaming\\Python\\Python311\\site-packages\\keras\\src\\saving\\saving_lib.py:719: UserWarning: Skipping variable loading for optimizer 'rmsprop', because it has 26 variables whereas the saved optimizer has 50 variables. \n",
59
+ " saveable.load_own_variables(weights_store.get(inner_path))\n"
60
+ ]
61
+ }
62
+ ],
63
+ "source": [
64
+ "#Load the pre-trained models\n",
65
+ "model = load_model(model_path)"
66
+ ]
67
+ },
68
+ {
69
+ "cell_type": "code",
70
+ "execution_count": 8,
71
+ "metadata": {},
72
+ "outputs": [
73
+ {
74
+ "name": "stdout",
75
+ "output_type": "stream",
76
+ "text": [
77
+ "\u001b[1m30/30\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m1s\u001b[0m 13ms/step\n"
78
+ ]
79
+ }
80
+ ],
81
+ "source": [
82
+ "#Prediction Function\n",
83
+ "y_pred = model.predict(test_preprocessed_images, batch_size=1, verbose=1)\n",
84
+ "#y_pred = np.argmax(array, axis=1)"
85
+ ]
86
+ },
87
+ {
88
+ "cell_type": "code",
89
+ "execution_count": 9,
90
+ "metadata": {},
91
+ "outputs": [],
92
+ "source": [
93
+ "test_df = pd.read_csv('../dataset/test.csv')\n",
94
+ "y_true = test_df['labels']"
95
+ ]
96
+ },
97
+ {
98
+ "cell_type": "code",
99
+ "execution_count": 10,
100
+ "metadata": {},
101
+ "outputs": [
102
+ {
103
+ "name": "stdout",
104
+ "output_type": "stream",
105
+ "text": [
106
+ "0.8849632600653125\n"
107
+ ]
108
+ }
109
+ ],
110
+ "source": [
111
+ "from sklearn.metrics import log_loss\n",
112
+ "loss = log_loss(y_true, y_pred, normalize=True, sample_weight=None, labels=None)\n",
113
+ "print(loss)"
114
+ ]
115
+ }
116
+ ],
117
+ "metadata": {
118
+ "kernelspec": {
119
+ "display_name": "Python 3 (ipykernel)",
120
+ "language": "python",
121
+ "name": "python3"
122
+ },
123
+ "language_info": {
124
+ "codemirror_mode": {
125
+ "name": "ipython",
126
+ "version": 3
127
+ },
128
+ "file_extension": ".py",
129
+ "mimetype": "text/x-python",
130
+ "name": "python",
131
+ "nbconvert_exporter": "python",
132
+ "pygments_lexer": "ipython3",
133
+ "version": "3.11.9"
134
+ }
135
+ },
136
+ "nbformat": 4,
137
+ "nbformat_minor": 4
138
+ }
data/predict/3526.json ADDED
The diff for this file is too large to render. See raw diff
 
data/predict/3578.json ADDED
The diff for this file is too large to render. See raw diff
 
data/predict/clear-day.png ADDED
data/predict/label_encoder.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:27b30c4ed02896818303f36a2cc0ceed60a4718b0b739a1bf452f7c1c3fc968d
3
+ size 554
data/predict/label_encoder_bgkln.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:27b30c4ed02896818303f36a2cc0ceed60a4718b0b739a1bf452f7c1c3fc968d
3
+ size 554
data/predict/model_rf.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8fd4bde0e3feb4885329a9af1a1fe93a1232f487186da4aea061723bd3c3a370
3
+ size 66745009
data/predict/model_rf_bgkln.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f083207178f1a0bc9592b15f172f5532a225da1b0ce4bb2ae382b3be862e857f
3
+ size 22559217
data/predict/rain.png ADDED
data/predict/sun-cloudy.png ADDED
data/predict/sun.png ADDED
main.py ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request, redirect
2
+ from werkzeug.utils import secure_filename
3
+ from programs.map import *
4
+ from programs.predict_cuaca import *
5
+ from datetime import datetime
6
+ import os
7
+ import numpy as np
8
+ from tensorflow.keras.models import load_model
9
+ from PIL import Image
10
+ import requests
11
+ import sys
12
+ import pandas as pd
13
+ import json
14
+ import joblib
15
+
16
+ app = Flask(__name__)
17
+
18
+
19
+ model = load_model('data/model/cnnModel.keras')
20
+
21
+ # Tentukan ukuran gambar yang dibutuhkan oleh model
22
+ img_width, img_height = 256, 256
23
+
24
+ # Tentukan direktori penyimpanan gambar yang diupload
25
+ app.config['UPLOAD_FOLDER'] = 'static/uploads'
26
+ if not os.path.exists(app.config['UPLOAD_FOLDER']):
27
+ os.makedirs(app.config['UPLOAD_FOLDER'])
28
+
29
+
30
+ @app.route('/', methods=['POST', 'GET'])
31
+ def home():
32
+ sby_timeseries, sby_temp, bkl_timeseries, bkl_temp = get_forecast_data()
33
+ sby_data, bkl_data = get_combined_data()
34
+
35
+ filename = ''
36
+ predicted_class = ''
37
+ if request.method == 'POST':
38
+ if 'file' not in request.files:
39
+ return redirect(request.url)
40
+
41
+ file = request.files['file']
42
+ if file.filename == '':
43
+ return redirect(request.url)
44
+
45
+ if file:
46
+ # Simpan gambar yang diupload
47
+ filename = secure_filename(file.filename)
48
+ file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
49
+ file.save(file_path)
50
+
51
+ # Proses gambar untuk prediksi
52
+ img = Image.open(file_path).convert('RGB')
53
+ img = img.resize((img_width, img_height))
54
+ img_array = np.array(img) / 255.0 # Normalisasi gambar
55
+ img_array = np.expand_dims(img_array, axis=0) # Tambahkan dimensi batch
56
+
57
+ prediction = model.predict(img_array)
58
+ class_idx = np.argmax(prediction, axis=1)[0]
59
+
60
+ class_names = ['Berawan', 'Berkabut', 'Hujan', 'Cerah', 'Sunrise']
61
+ predicted_class = class_names[class_idx]
62
+
63
+ return render_template('index.html',
64
+ h_now=datetime.now().strftime('%H'),
65
+ d_now=datetime.now().strftime('%d'),
66
+ dname_now=datetime.now().strftime('%A'),
67
+
68
+ sby_timeseries=sby_timeseries,
69
+ sby_temp=sby_temp,
70
+ bkl_timeseries=bkl_timeseries,
71
+ bkl_temp=bkl_temp,
72
+
73
+ sby_data=sby_data,
74
+ bkl_data=bkl_data,
75
+
76
+ filename=filename, predicted_class=predicted_class
77
+ )
78
+
79
+ @app.route('/cuaca', methods=['POST', 'GET'])
80
+ def prediksi_cuaca():
81
+ wilayah = request.args.get('wilayah')
82
+ filename = ''
83
+ predicted_class = ''
84
+ if request.method == 'POST':
85
+ if 'file' not in request.files:
86
+ return redirect(request.url)
87
+
88
+ file = request.files['file']
89
+ if file.filename == '':
90
+ return redirect(request.url)
91
+
92
+ if file:
93
+ # Simpan gambar yang diupload
94
+ filename = secure_filename(file.filename)
95
+ file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
96
+ file.save(file_path)
97
+
98
+ # Proses gambar untuk prediksi
99
+ img = Image.open(file_path).convert('RGB')
100
+ img = img.resize((img_width, img_height))
101
+ img_array = np.array(img) / 255.0 # Normalisasi gambar
102
+ img_array = np.expand_dims(img_array, axis=0) # Tambahkan dimensi batch
103
+
104
+ prediction = model.predict(img_array)
105
+ class_idx = np.argmax(prediction, axis=1)[0]
106
+
107
+ class_names = ['Berawan', 'Berkabut', 'Hujan', 'Cerah', 'Sunrise']
108
+ predicted_class = class_names[class_idx]
109
+
110
+
111
+ if request.method == 'GET':
112
+ if not wilayah:
113
+ return redirect('/cuaca?wilayah=surabaya')
114
+ if wilayah.lower() == "surabaya":
115
+ pred_class_weather, pred_logo_weather, pred_color_weather, pred_rgb_weather , df_weather, pred_icon_weather = predict_sby()
116
+ json_sby = 'data/predict/3578.json'
117
+ with open(json_sby) as f:
118
+ json_geo = json.load(f)
119
+ json_coor1 = -7.2890784
120
+ json_coor2 = 112.7786537
121
+
122
+ if wilayah.lower() == "bangkalan":
123
+ pred_class_weather, pred_logo_weather, pred_color_weather, pred_rgb_weather , df_weather, pred_icon_weather = predict_bangkalan()
124
+ json_bkl = 'data/predict/3526.json'
125
+ with open(json_bkl) as f:
126
+ json_geo = json.load(f)
127
+ json_coor1 = -7.0416324
128
+ json_coor2 = 112.9204642
129
+
130
+ if wilayah.lower() not in ['surabaya', 'bangkalan']:
131
+ return redirect('/cuaca?wilayah=surabaya')
132
+
133
+
134
+
135
+ return render_template('prediksi_cuaca.html',
136
+ h_now=datetime.now().strftime('%H'),
137
+ d_now=datetime.now().strftime('%d'),
138
+ dname_now=datetime.now().strftime('%A'),
139
+ pred_class_weather=pred_class_weather,
140
+ pred_logo_weather=pred_logo_weather,
141
+ pred_color_weather=pred_color_weather,
142
+ pred_rgb_weather=pred_rgb_weather,
143
+ df_weather=df_weather,
144
+ pred_icon_weather=pred_icon_weather,
145
+ json_geo=json_geo,
146
+ json_coor1=json_coor1,
147
+ json_coor2=json_coor2,
148
+ filename=filename, predicted_class=predicted_class
149
+ )
150
+
151
+ @app.route("/cluster", methods=['POST', 'GET'])
152
+ def hello():
153
+ peta_persebaran = folium.Map(location=[-2.5, 118], zoom_start=5)
154
+
155
+ df = pd.read_csv('data/cluster/climate_data_clustered.csv')
156
+
157
+ colors = ['red', 'yellow', 'green']
158
+
159
+ risk_mapping = {'low risk': 0 , 'medium risk': 1, 'high risk': 2 }
160
+
161
+ y_kmeans = df['cluster'].map(risk_mapping)
162
+
163
+ # Tambahkan kluster ke peta
164
+ for i in range(len(y_kmeans)):
165
+ clusternya = y_kmeans[i]
166
+
167
+ folium.CircleMarker(
168
+ location=[-7.2053, 112.7353],
169
+ radius=13,
170
+ color=colors[clusternya],
171
+ fill=True,
172
+ fill_color=colors[clusternya],
173
+ fill_opacity=0.1,
174
+ ).add_to(peta_persebaran)
175
+
176
+ peta_persebaran.save('./templates/peta_persebaran.html')
177
+ data = df.to_html(classes='table table-striped')
178
+ return render_template('index_cluster.html', dataframe=data)
179
+
180
+ if __name__ == '__main__':
181
+ import os
182
+ os.environ['FLASK_ENV'] = 'development'
183
+ app.run(host='0.0.0.0', port=8001, debug=True)
programs/load_data.py ADDED
@@ -0,0 +1,61 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import pandas as pd
2
+ import datetime
3
+
4
+ def get_time(data, time=datetime.datetime.now()):
5
+ current_date = time.strftime("%Y-%m-%d %H")
6
+ return data[data['date'] == current_date]
7
+
8
+ def get_data(data):
9
+ df = pd.read_csv(data, parse_dates=[0])
10
+ df.rename(columns={df.columns[0]: 'date'}, inplace=True)
11
+ df['date'] = df['date'].dt.strftime("%Y-%m-%d %H")
12
+ df = get_time(df)
13
+ timeseries = df.date.values
14
+ temp = df.predicted_mean.values
15
+ return timeseries, temp
16
+
17
+ def get_data_all(data):
18
+ df = pd.read_csv(data, parse_dates=[0])
19
+ df.rename(columns={df.columns[0]: 'date'}, inplace=True)
20
+ df['years'] = df['date'].dt.strftime("%Y")
21
+ df['months'] = df['date'].dt.strftime("%m")
22
+ df['days'] = df['date'].dt.strftime("%A")
23
+ df['daysn'] = df['date'].dt.strftime("%d")
24
+ df['hours'] = df['date'].dt.strftime("%H").astype(int)
25
+ df['temp'] = df.predicted_mean.values.astype(int)
26
+ df = df[df['hours'] % 3 == 0]
27
+ return df.drop(columns=['predicted_mean'])
28
+
29
+ def to_dict(df):
30
+ data_dict = {}
31
+
32
+ # Loop through years
33
+ for year in df['years'].unique():
34
+ data_dict[year] = {}
35
+
36
+ # Filter data for the current year
37
+ year_data = df[df['years'] == year]
38
+
39
+ # Loop through months
40
+ for month in year_data['months'].unique():
41
+ data_dict[year][month] = {}
42
+
43
+ # Filter data for the current month
44
+ month_data = year_data[year_data['months'] == month]
45
+
46
+ # Loop through unique dates
47
+ for date in month_data['daysn'].unique():
48
+ data_dict[year][month][date] = {}
49
+
50
+ # Filter data for the current date
51
+ date_data = month_data[month_data['daysn'] == date]
52
+ # Get the name of the day
53
+ day_name = date_data['days'].values[0]
54
+ data_dict[year][month][date]['day_name'] = day_name
55
+
56
+ # Loop through the hours and store the corresponding temperature
57
+ for hour in date_data['hours'].unique():
58
+ temp = date_data[date_data['hours'] == hour]['temp'].values[0]
59
+ data_dict[year][month][date][hour] = temp
60
+
61
+ return data_dict
programs/map.py ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import folium
2
+ from .load_data import *
3
+
4
+
5
+ # Data Forecast
6
+ bkl_data = 'data/forecast/bkl_temp_forecast.csv'
7
+ sby_data = 'data/forecast/sby_temp_forecast.csv'
8
+
9
+
10
+ # Generate map
11
+ sby_coords = [-7.246, 112.738]
12
+ bkl_coords = [-7.030, 112.747]
13
+
14
+ map = folium.Map(location=[-7.169,112.779], zoom_start=11, max_zoom=16, min_zoom=10,
15
+ tiles="https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png",
16
+ attr='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors & <a href="https://carto.com/attributions">CARTO</a>'
17
+ )
18
+
19
+ def get_forecast_data():
20
+ sby_timeseries, sby_temp = get_data(sby_data)
21
+ bkl_timeseries, bkl_temp = get_data(bkl_data)
22
+ return\
23
+ sby_timeseries, sby_temp,\
24
+ bkl_timeseries, bkl_temp
25
+
26
+ def get_combined_data():
27
+ sby_data_all = to_dict(get_data_all(bkl_data))
28
+ bkl_data_all = to_dict(get_data_all(bkl_data))
29
+ return\
30
+ sby_data_all, \
31
+ bkl_data_all
programs/predict_cuaca.py ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ from datetime import datetime
3
+ import pandas as pd
4
+ import joblib
5
+
6
+
7
+
8
+ def predict_sby():
9
+ api = 'https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/Surabaya,ID/today?unitGroup=metric&include=hours&key=AQCL3EG5SNW9XDN44A67J95UB'
10
+
11
+ response = requests.get(api)
12
+
13
+ if response.status_code == 200:
14
+ weather_data = response.json()
15
+ else:
16
+ print(f"Error: {response.status_code}")
17
+ print(response.text)
18
+
19
+
20
+ rounded_current_hour = datetime.now().replace(minute=0, second=0, microsecond=0).strftime('%H:%M:%S') # Misal: '01:00:00'
21
+
22
+ print(f"Rounded current hour: {rounded_current_hour}")
23
+ selected_hour = next((hour for hour in weather_data['days'][0]['hours'] if hour['datetime'] == rounded_current_hour), None)
24
+
25
+ sby_weather = pd.DataFrame(selected_hour, index=[0])
26
+ df_tes = sby_weather.copy()
27
+ df_tes.drop(columns=['snowdepth', 'snow', 'preciptype', 'precipprob', 'precip', 'datetime', 'icon', 'stations', 'source', 'datetime', 'datetimeEpoch', 'solarradiation', 'solarenergy', 'uvindex' , 'severerisk', 'pressure'], inplace=True)
28
+ label_mapping = {
29
+ 'Partially cloudy': 'Cloudy',
30
+ 'Rain, Partially cloudy': 'Rain',
31
+ 'Overcast': 'Cloudy',
32
+ 'Rain, Overcast': 'Rain',
33
+ 'Clear': 'Clear',
34
+ 'Rain': 'Rain'
35
+ }
36
+ # Mengganti label pada kolom 'conditions'
37
+ df_tes['conditions'] = df_tes['conditions'].map(label_mapping)
38
+
39
+ label_encoder = joblib.load('data/predict/label_encoder.pkl')
40
+ model = joblib.load('data/predict/model_rf.pkl')
41
+ df_tes['conditions'] = label_encoder.transform(df_tes['conditions'])
42
+
43
+ df_tes = df_tes[['temp', 'feelslike', 'dew', 'humidity', 'windgust', 'windspeed',
44
+ 'winddir', 'cloudcover', 'visibility']]
45
+
46
+ predicted_class_origin = model.predict(df_tes)
47
+
48
+ predicted_class_decode = label_encoder.inverse_transform(predicted_class_origin.reshape(-1))
49
+
50
+ if predicted_class_decode[0] == 'Cloudy':
51
+ pred_logo = 'static/sun-cloudy.png'
52
+ pred_color = '#BCCCDC'
53
+ pred_rgb = 'rgba(188, 204, 220, 0.2)'
54
+ pred_icon = 'fa-solid fa-cloud'
55
+ elif predicted_class_decode[0] == 'Clear':
56
+ pred_logo = 'static/sun.png'
57
+ pred_color = '#B1F0F7'
58
+ pred_rgb = 'rgba(177, 240, 247, 0.2)'
59
+ pred_icon = 'fa-solid fa-sun'
60
+ elif predicted_class_decode[0] == 'Rain':
61
+ pred_logo = 'static/rain.png'
62
+ pred_color = '#63839c'
63
+ pred_rgb = 'rgba(99, 131, 156, 0.2)'
64
+ pred_icon = 'fa-solid fa-cloud-showers-heavy'
65
+
66
+
67
+ return predicted_class_decode[0], pred_logo, pred_color, pred_rgb, df_tes, pred_icon
68
+
69
+
70
+ def predict_bangkalan():
71
+ api = 'https://weather.visualcrossing.com/VisualCrossingWebServices/rest/services/timeline/Bangkalan,ID/today?unitGroup=metric&include=hours&key=AQCL3EG5SNW9XDN44A67J95UB'
72
+
73
+ response = requests.get(api)
74
+
75
+ if response.status_code == 200:
76
+ weather_data = response.json()
77
+ else:
78
+ print(f"Error: {response.status_code}")
79
+ print(response.text)
80
+
81
+
82
+ rounded_current_hour = datetime.now().replace(minute=0, second=0, microsecond=0).strftime('%H:%M:%S') # Misal: '01:00:00'
83
+
84
+ print(f"Rounded current hour: {rounded_current_hour}")
85
+ selected_hour = next((hour for hour in weather_data['days'][0]['hours'] if hour['datetime'] == rounded_current_hour), None)
86
+
87
+ sby_weather = pd.DataFrame(selected_hour, index=[0])
88
+ df_tes = sby_weather.copy()
89
+ df_tes.drop(columns=['snowdepth', 'snow', 'preciptype', 'precipprob', 'precip', 'datetime', 'icon', 'stations', 'source', 'datetime', 'datetimeEpoch', 'solarradiation', 'solarenergy', 'uvindex' , 'severerisk', 'pressure'], inplace=True)
90
+ label_mapping = {
91
+ 'Partially cloudy': 'Cloudy',
92
+ 'Rain, Partially cloudy': 'Rain',
93
+ 'Overcast': 'Cloudy',
94
+ 'Rain, Overcast': 'Rain',
95
+ 'Clear': 'Clear',
96
+ 'Rain': 'Rain'
97
+ }
98
+ # Mengganti label pada kolom 'conditions'
99
+ df_tes['conditions'] = df_tes['conditions'].map(label_mapping)
100
+
101
+ label_encoder = joblib.load('data/predict/label_encoder_bgkln.pkl')
102
+ model = joblib.load('data/predict/model_rf_bgkln.pkl')
103
+ df_tes['conditions'] = label_encoder.transform(df_tes['conditions'])
104
+
105
+ df_tes = df_tes[['temp', 'feelslike', 'dew', 'humidity', 'windgust', 'windspeed',
106
+ 'winddir', 'cloudcover', 'visibility']]
107
+
108
+ predicted_class_origin = model.predict(df_tes)
109
+
110
+ predicted_class_decode = label_encoder.inverse_transform(predicted_class_origin.reshape(-1))
111
+
112
+ if predicted_class_decode[0] == 'Cloudy':
113
+ pred_logo = 'static/sun-cloudy.png'
114
+ pred_color = '#BCCCDC'
115
+ pred_rgb = 'rgba(188, 204, 220, 0.2)'
116
+ pred_icon = 'fa-solid fa-cloud'
117
+ elif predicted_class_decode[0] == 'Clear':
118
+ pred_logo = 'static/sun.png'
119
+ pred_color = '#B1F0F7'
120
+ pred_rgb = 'rgba(177, 240, 247, 0.2)'
121
+ pred_icon = 'fa-solid fa-sun'
122
+ elif predicted_class_decode[0] == 'Rain':
123
+ pred_logo = 'static/rain.png'
124
+ pred_color = '#63839c'
125
+ pred_rgb = 'rgba(99, 131, 156, 0.2)'
126
+ pred_icon = 'fa-solid fa-cloud-showers-heavy'
127
+
128
+
129
+ return predicted_class_decode[0], pred_logo, pred_color, pred_rgb, df_tes, pred_icon
130
+
requirements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ folium
2
+ jinja2
3
+ requests
4
+ pandas
5
+ flask
6
+ tensorflow
7
+ pillow
8
+ numpy
static/cloudicon.png ADDED
static/clouds.png ADDED
static/feelslike.png ADDED
static/humidity.png ADDED
static/low-visibility.png ADDED
static/meteorology.png ADDED
static/rain.png ADDED
static/storm.png ADDED
static/sun-cloudy.png ADDED
static/sun.png ADDED
static/temp.png ADDED
static/weather-forecast.png ADDED
static/wind.png ADDED
templates/index.html ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+
5
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
6
+
7
+ <script>
8
+ L_NO_TOUCH = false;
9
+ L_DISABLE_3D = false;
10
+ </script>
11
+
12
+ <style>html, body {width: 100%;height: 100%;margin: 0;padding: 0;}</style>
13
+ <style>#map {position:absolute;top:0;bottom:0;right:0;left:0;}</style>
14
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/leaflet.js"></script>
15
+ <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
16
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
17
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js"></script>
18
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/leaflet.css"/>
19
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"/>
20
+ <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css"/>
21
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css"/>
22
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css"/>
23
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css"/>
24
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css">
25
+
26
+ <meta name="viewport" content="width=device-width,
27
+ initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
28
+ <style>
29
+ #map_38eb5ea6a30ae8bbf12217ea861d0106 {
30
+ position: relative;
31
+ width: 100.0%;
32
+ height: 100.0%;
33
+ left: 0.0%;
34
+ top: 0.0%;
35
+ }
36
+ .leaflet-container { font-size: 1rem; }
37
+ </style>
38
+
39
+ </head>
40
+ <body>
41
+
42
+ <div class="info-time position-absolute fw-bold p-3 rounded font-size-1.2rem" style="top: 12px; left: 50px; z-index: 9999; background-color: #d49500; color:white;">
43
+ <span>{{ d_now }} {{ dname_now }} - {{ h_now }}:00</span>
44
+ </div>
45
+
46
+ <div data-bs-toggle="modal" data-bs-target="#klasifikasiCuaca" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 border-1" style="top: 60px; right: 20px; z-index: 999; cursor: pointer;">
47
+ <span>Klasifikasi Cuaca</span>
48
+ <img src="{{ url_for('static', filename='cloudicon.png') }}" alt="icon cuaca" style="height: 50px;">
49
+ </div>
50
+ <a href="/" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 mt-4" style="top: 120px; right: 20px; z-index: 999">
51
+ <span class="me-2 text-dark" >Peramalan Cuaca</span>
52
+ <img src="{{ url_for('static', filename='weather-forecast.png') }}" alt="icon cuaca" style="height: 50px" />
53
+ </a>
54
+ <a href="/cuaca" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 mt-4" style="top: 190px; right: 20px; z-index: 999">
55
+ <span class="me-2 text-dark" >Prediksi Cuaca</span>
56
+ <img src="{{ url_for('static', filename='meteorology.png') }}" alt="icon cuaca" style="height: 50px" />
57
+ </a>
58
+ <a href="/cluster" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 mt-4" style="top: 260px; right: 20px; z-index: 999">
59
+ <span class="me-2 text-dark" >Tingkat Resiko Cuaca Ekstrim</span>
60
+ <img src="{{ url_for('static', filename='storm.png') }}" alt="icon cuaca" style="height: 50px" />
61
+ </a>
62
+
63
+ <!-- Modal -->
64
+ <div class="modal fade" id="klasifikasiCuaca" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
65
+ <div class="modal-dialog modal-dialog-centered">
66
+ <div class="modal-content">
67
+ <div class="modal-header">
68
+ <h1 class="modal-title fs-5" id="staticBackdropLabel">Klasifikasi Cuaca</h1>
69
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
70
+ </div>
71
+ <div class="modal-body">
72
+ Masukkan gambar yang ingin diklasifikasikan:
73
+ <p>
74
+ <form action="{{ url_for('home') }}" method="POST" enctype="multipart/form-data">
75
+ <label for="file">Pilih Gambar:</label>
76
+ <input type="file" class="form-control" name="file" required>
77
+ <hr>
78
+ {% if predicted_class %}
79
+ Hasil prediksi dari: <img src="{{ url_for('static', filename='uploads/' + filename) }}" alt="Uploaded Image" style="max-width: 100%; height: auto;"><br>
80
+ dengan cuaca: <b>{{ predicted_class }}</b>
81
+ {% endif %}
82
+ </div>
83
+ <div class="modal-footer">
84
+ <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
85
+ <button type="submit" class="btn btn-primary">Prediksi</button>
86
+ </form>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+
92
+
93
+ <!-- Map Canvas -->
94
+ <div class="folium-map" id="map_38eb5ea6a30ae8bbf12217ea861d0106" ></div>
95
+
96
+
97
+ <!-- Surabaya Temperature Forecasting -->
98
+ <div class="offcanvas offcanvas-bottom h-30" style="opacity: 0.8;" tabindex="-1" id="surabayaOffCanvas" aria-labelledby="offcanvasBottomLabel" data-bs-backdrop='false' >
99
+ <div class="offcanvas-header">
100
+ <h5 class="offcanvas-title" id="offcanvasBottomLabel"><b>Peramalan suhu Surabaya 2024</b></h5>
101
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
102
+ </div>
103
+
104
+ <div class="offcanvas-body">
105
+ <div class="d-flex ps-5">
106
+ <div class="row flex-nowrap">
107
+ <div class="col-auto">
108
+ <div class="hourly-weather sticky-top" style="top: 0;">
109
+ <div>Days</div>
110
+ <div>Hours</div>
111
+ <div>Celsius</div>
112
+ </div>
113
+ </div>
114
+ <div class="d-flex flex-nowrap gap-5 ">
115
+ {% for year, months in sby_data.items() %}
116
+ {% for month, days in months.items() %}
117
+ {% for day, data in days.items() %}
118
+ <div class="day-column" style="display: inline-block; width: 240px; vertical-align: top;">
119
+ <h5 class="text-center fw-bold">{{ data['day_name'] }} {{ day }}</h5>
120
+ <div class="d-flex flex-wrap gap-3">
121
+ {% for hour, temp in data.items() if hour != 'day_name' %}
122
+ {% set current_hour = h_now | int %}
123
+ <div class="hourly-weather {% if day == d_now and hour == current_hour %}bg-warning rounded text-white'{% endif %}">
124
+ <div class="fw-bold">{{ hour }}</div>
125
+ <div>{{ temp }}°</div>
126
+ </div>
127
+ {% endfor %}
128
+ </div>
129
+ <div class="temperature-line"></div>
130
+ </div>
131
+ {% endfor %}
132
+ {% endfor %}
133
+ {% endfor %}
134
+ </div>
135
+ </div>
136
+ </div>
137
+ </div>
138
+ </div>
139
+
140
+ <!-- Bangkalan Temperature Forecasting -->
141
+ <div class="offcanvas offcanvas-bottom h-30" style="opacity: 0.8;" tabindex="-1" id="bangkalanOffCanvas" aria-labelledby="offcanvasBottomLabel" data-bs-backdrop='false' >
142
+ <div class="offcanvas-header">
143
+ <h5 class="offcanvas-title" id="offcanvasBottomLabel"><b>Peramalan suhu Bangkalan 2024</b></h5>
144
+ <button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
145
+ </div>
146
+
147
+ <div class="offcanvas-body">
148
+ <div class="d-flex ps-5">
149
+ <div class="row flex-nowrap">
150
+ <div class="col-auto">
151
+ <div class="hourly-weather sticky-top" style="top: 0;">
152
+ <div>Days</div>
153
+ <div>Hours</div>
154
+ <div>Celsius</div>
155
+ </div>
156
+ </div>
157
+ <div class="d-flex flex-nowrap gap-5 ">
158
+ {% for year, months in bkl_data.items() %}
159
+ {% for month, days in months.items() %}
160
+ {% for day, data in days.items() %}
161
+ <div class="day-column" style="display: inline-block; width: 240px; vertical-align: top;">
162
+ <h5 class="text-center fw-bold">{{ data['day_name'] }} {{ day }}</h5>
163
+ <div class="d-flex flex-wrap gap-3">
164
+ {% for hour, temp in data.items() if hour != 'day_name' %}
165
+ {% set current_hour = h_now | int %}
166
+ <div class="hourly-weather {% if day == d_now and hour == current_hour %}bg-warning rounded text-white{% endif %}">
167
+ <div class="fw-bold">{{ hour }}</div>
168
+ <div>{{ temp }}°</div>
169
+ </div>
170
+ {% endfor %}
171
+ </div>
172
+ <div class="temperature-line"></div>
173
+ </div>
174
+ {% endfor %}
175
+ {% endfor %}
176
+ {% endfor %}
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ </div>
182
+
183
+ </body>
184
+ <script>
185
+
186
+ if ( window.history.replaceState ) {
187
+ window.history.replaceState( null, null, window.location.href );
188
+ }
189
+
190
+ let predicted = "{{ predicted_class }}"
191
+ document.addEventListener("DOMContentLoaded", function() {
192
+ if(predicted){
193
+ var myModal = new bootstrap.Modal(document.getElementById('klasifikasiCuaca'), {
194
+ keyboard: false
195
+ });
196
+ myModal.show();
197
+ }
198
+ });
199
+
200
+ // Control map
201
+ var map_38eb5ea6a30ae8bbf12217ea861d0106 = L.map(
202
+ "map_38eb5ea6a30ae8bbf12217ea861d0106",
203
+ {
204
+ center: [-7.169, 112.779],
205
+ crs: L.CRS.EPSG3857,
206
+ zoom: 11,
207
+ zoomControl: true,
208
+ preferCanvas: false,
209
+ }
210
+ );
211
+
212
+
213
+ // Source map layout
214
+ var tile_layer_4fb0ad090cde9f05f658f5dc4c7863ec = L.tileLayer(
215
+ "https://{s}.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png",
216
+ {"attribution": "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors \u0026 \u003ca href=\"https://carto.com/attributions\"\u003eCARTO\u003c/a\u003e", "detectRetina": false, "maxZoom": 16, "minZoom": 10, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}
217
+ );
218
+ tile_layer_4fb0ad090cde9f05f658f5dc4c7863ec.addTo(map_38eb5ea6a30ae8bbf12217ea861d0106);
219
+
220
+
221
+
222
+ // Marker Surabaya Coordinate
223
+ var marker = L.marker(
224
+ [-7.246, 112.738],
225
+ {}
226
+ ).addTo(map_38eb5ea6a30ae8bbf12217ea861d0106);
227
+
228
+ var div_icon = L.divIcon({"className": "empty", "html": "<div data-bs-toggle='offcanvas' data-bs-target='#surabayaOffCanvas' style='font-size: 14px; color: black;'><b>Surabaya {{ sby_temp[0].round(2) }}℃</b></div>"});
229
+ marker.setIcon(div_icon);
230
+
231
+ marker.on('click', function() {
232
+ $('#tempModal').modal('show');
233
+ });
234
+
235
+
236
+ // Marker Bangkalan Coordinate
237
+ var marker = L.marker(
238
+ [-7.03, 112.747],
239
+ {}
240
+ ).addTo(map_38eb5ea6a30ae8bbf12217ea861d0106);
241
+
242
+ var div_icon = L.divIcon({"className": "empty", "html": "<div data-bs-toggle='offcanvas' data-bs-target='#bangkalanOffCanvas' style='font-size: 14px; color: black;'><b>Bangkalan {{ bkl_temp[0].round(2) }}℃</b></div>"});
243
+ marker.setIcon(div_icon);
244
+
245
+ marker.on('click', function() {
246
+ $('#tempModal').modal('show');
247
+ });
248
+
249
+ </script>
250
+ </html>
templates/index_cluster.html ADDED
The diff for this file is too large to render. See raw diff
 
templates/peta_persebaran.html ADDED
The diff for this file is too large to render. See raw diff
 
templates/prediksi_cuaca.html ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+
5
+ <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
6
+
7
+ <script>
8
+ L_NO_TOUCH = false;
9
+ L_DISABLE_3D = false;
10
+ </script>
11
+
12
+ <style>html, body {width: 100%;height: 100%;margin: 0;padding: 0;}</style>
13
+ <style>#map {position:absolute;top:0;bottom:0;right:0;left:0;}</style>
14
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/leaflet.js"></script>
15
+ <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
16
+ <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
17
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js"></script>
18
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/leaflet.css"/>
19
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"/>
20
+ <link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css"/>
21
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css"/>
22
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css"/>
23
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/python-visualization/folium/folium/templates/leaflet.awesome.rotate.min.css"/>
24
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css">
25
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/leaflet-draw/dist/leaflet.draw.css" />
26
+ <script src="https://cdn.jsdelivr.net/npm/leaflet-draw/dist/leaflet.draw.js"></script>
27
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.1/css/all.min.css">
28
+
29
+
30
+
31
+ <meta name="viewport" content="width=device-width,
32
+ initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
33
+ <style>
34
+ #map_38eb5ea6a30ae8bbf12217ea861d0106 {
35
+ position: relative;
36
+ width: 100.0%;
37
+ height: 100.0%;
38
+ left: 0.0%;
39
+ top: 0.0%;
40
+ }
41
+ .leaflet-container { font-size: 1rem; }
42
+
43
+ .weather-marker {
44
+ font-size: 14px;
45
+ color: white;
46
+ background: rgba(0, 123, 255, 0.8);
47
+ border-radius: 10px;
48
+ padding: 5px;
49
+ }
50
+ </style>
51
+
52
+ </head>
53
+ <body>
54
+
55
+ <!-- <div class="info-time position-absolute fw-bold p-3 rounded font-size-1.2rem" style="top: 12px; left: 50px; z-index: 9999; background-color: #d49500; color:white;">
56
+ <span>{{ d_now }} {{ dname_now }} - {{ h_now }}:00</span>
57
+ </div> -->
58
+
59
+ <div data-bs-toggle="modal" data-bs-target="#klasifikasiCuaca" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 border-1" style="top: 60px; right: 20px; z-index: 999; cursor: pointer;">
60
+ <span class="me-2" >Klasifikasi Cuaca</span>
61
+ <img src="{{ url_for('static', filename='cloudicon.png') }}" alt="icon cuaca" style="height: 50px;">
62
+ </div>
63
+ <a href="/" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 mt-4" style="top: 120px; right: 20px; z-index: 999">
64
+ <span class="me-2 text-dark" >Peramalan Cuaca</span>
65
+ <img src="{{ url_for('static', filename='weather-forecast.png') }}" alt="icon cuaca" style="height: 50px" />
66
+ </a>
67
+ <a href="/cuaca" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 mt-4" style="top: 190px; right: 20px; z-index: 999">
68
+ <span class="me-2 text-dark" >Prediksi Cuaca</span>
69
+ <img src="{{ url_for('static', filename='meteorology.png') }}" alt="icon cuaca" style="height: 50px" />
70
+ </a>
71
+ <a href="/cluster" class="position-absolute shadow bg-body-tertiary fw-bold rounded p-1 mt-4" style="top: 260px; right: 20px; z-index: 999">
72
+ <span class="me-2 text-dark" >Tingkat Resiko Cuaca Ekstrim</span>
73
+ <img src="{{ url_for('static', filename='storm.png') }}" alt="icon cuaca" style="height: 50px" />
74
+ </a>
75
+ <!-- Modal -->
76
+ <div class="modal fade" id="klasifikasiCuaca" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
77
+ <div class="modal-dialog modal-dialog-centered">
78
+ <div class="modal-content">
79
+ <div class="modal-header">
80
+ <h1 class="modal-title fs-5" id="staticBackdropLabel">Klasifikasi Cuaca</h1>
81
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
82
+ </div>
83
+ <div class="modal-body">
84
+ Masukkan gambar yang ingin diklasifikasikan:
85
+ <p>
86
+ <form action="{{ url_for('home') }}" method="POST" enctype="multipart/form-data">
87
+ <label for="file">Pilih Gambar:</label>
88
+ <input type="file" class="form-control" name="file" required>
89
+ <hr>
90
+ {% if predicted_class %}
91
+ Hasil prediksi dari: <img src="{{ url_for('static', filename='uploads/' + filename) }}" alt="Uploaded Image" style="max-width: 100%; height: auto;"><br>
92
+ dengan cuaca: <b>{{ predicted_class }}</b>
93
+ {% endif %}
94
+ </div>
95
+ <div class="modal-footer">
96
+ <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
97
+ <button type="submit" class="btn btn-primary">Prediksi</button>
98
+ </form>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+
104
+
105
+ <!-- Map Canvas -->
106
+ <!-- <div class="folium-map" id="map_38eb5ea6a30ae8bbf12217ea861d0106" ></div> -->
107
+
108
+ <div class="container-fluid py-2 sticky-top bg-body-tertiary">
109
+ <nav class="navbar navbar-expand-lg bg-body-tertiary">
110
+ <div class="container-fluid">
111
+ <div class="me-5 info-time fw-bold p-3 rounded font-size-1.2rem" style=" background-color: #d49500; color:white;">
112
+ <span>{{ d_now }} {{ dname_now }} - {{ h_now }}:00</span>
113
+ </div>
114
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
115
+ <span class="navbar-toggler-icon"></span>
116
+ </button>
117
+ <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
118
+ <div class="navbar-nav gap-3">
119
+ <a href="/cuaca?wilayah=surabaya" class="me-2 info-time fw-bold p-3 border border-1 border-light rounded font-size-1.2rem" style=" background-color: #213b5e; color:white;">
120
+ Surabaya <i class="{{pred_icon_sby}} ms-2"></i>
121
+ </a>
122
+ <a href="/cuaca?wilayah=bangkalan" class="info-time fw-bold p-3 border border-1 border-light rounded font-size-1.2rem" style=" background-color: #213b5e; color:white;">
123
+ Bangkalan <i class="{{pred_icon_bkl}} ms-2"></i>
124
+ </a>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </nav>
129
+ </div>
130
+
131
+ <div style="max-height: 300px;" class="container mt-4">
132
+ <div style="background-color: #213b5e; max-height: 300px;" class="row align-items-start w-75 rounded">
133
+ <div style="background-color: #213b5e;" class="col-6 rounded">
134
+ <div style="background-color: #213b5e;" class="h1 p-3 text-light" >
135
+ {{request.args.get('wilayah')}}
136
+ </div>
137
+
138
+ <div class="d-flex flex-row row mt-3">
139
+ <div class="col-3" ><img style="height: 100px; width: 100px;" src="{{pred_logo_weather}}" alt="" srcset=""></div>
140
+ <div class="col-9 text-light" ><h2>{{pred_class_weather}}</h2>
141
+ <h2>{{df_weather['temp'][0]}} °C</h2></div>
142
+ </div>
143
+ </div>
144
+ <div class="col-6 p-0 rounded">
145
+ <div class="folium-map" id="map_38eb5ea6a30ae8bbf12217ea861d0106" style="height: 300px;"></div>
146
+ </div>
147
+ </div>
148
+ </div>
149
+
150
+ <div class="container mt-4 mb-4">
151
+ <h1>Weather Detail</h1>
152
+ <div style="background-color: #213b5e;" class="row align-items-start w-75 rounded text-light gap-3 p-3">
153
+ <div style="height: 200px; background-color: rgba(255, 255, 255, 0.15);" class="col rounded p-3">
154
+ <div class="h2">Temperature</div>
155
+ <div class="flex-row row mt-5" >
156
+ <img class="col-6" style="height: 80px; width: 80px;" src="static/temp.png" alt="" srcset="">
157
+ <div class="col-8 fs-1 d-flex align-items-center" >
158
+ <div style="font-size: 4rem;">{{df_weather['temp'][0]}} °c</div>
159
+ </div>
160
+ </div>
161
+ </div>
162
+ <div style="height: 200px; background-color: rgba(255, 255, 255, 0.15);" class="col rounded p-3">
163
+ <div class="h2">Feels Like</div>
164
+ <div class="flex-row row mt-5" >
165
+ <img class="col-6" style="height: 80px; width: 80px;" src="static/feelslike.png" alt="" srcset="">
166
+ <div class="col-8 fs-1 d-flex align-items-center" >
167
+ <div style="font-size: 4rem;">{{df_weather['feelslike'][0]}} °c</div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ <div style="height: 200px; background-color: rgba(255, 255, 255, 0.15);" class="col rounded p-3">
172
+ <div class="h2">Humidity</div>
173
+ <div class="flex-row row mt-5" >
174
+ <img class="col-6" style="height: 80px; width: 80px;" src="static/humidity.png" alt="" srcset="">
175
+ <div class="col-8 fs-1 d-flex align-items-center" >
176
+ <div style="font-size: 4rem;">{{df_weather['humidity'][0]}} %</div>
177
+ </div>
178
+ </div>
179
+ </div>
180
+ </div>
181
+ <div style="background-color: #213b5e;" class="row align-items-start w-75 rounded text-light gap-3 mt-2 p-3">
182
+ <div style="height: 200px; background-color: rgba(255, 255, 255, 0.15);" class="col rounded p-3">
183
+ <div class="h2">Wind</div>
184
+ <div class="flex-row row mt-5" >
185
+ <img class="col-6" style="height: 80px; width: 80px;" src="static/wind.png" alt="" srcset="">
186
+ <div class="col-8 fs-1 d-flex align-items-center" >
187
+ <div style="font-size: 4rem;">3{{df_weather['windspeed'][0]}} kph</div>
188
+ </div>
189
+ </div>
190
+ </div>
191
+ <div style="height: 200px; background-color: rgba(255, 255, 255, 0.15);" class="col rounded p-3">
192
+ <div class="h2">Cloud Cover</div>
193
+ <div class="flex-row row mt-5" >
194
+ <img class="col-6" style="height: 80px; width: 80px;" src="static/clouds.png" alt="" srcset="">
195
+ <div class="col-8 fs-1 d-flex align-items-center" >
196
+ <div style="font-size: 4rem;">{{df_weather['cloudcover'][0]}} %</div>
197
+ </div>
198
+ </div>
199
+ </div>
200
+ <div style="height: 200px; background-color: rgba(255, 255, 255, 0.15);" class="col rounded p-3">
201
+ <div class="h2">Visibility</div>
202
+ <div class="flex-row row mt-5" >
203
+ <img class="col-6" style="height: 80px; width: 80px;" src="static/low-visibility.png" alt="" srcset="">
204
+ <div class="col-8 fs-1 d-flex align-items-center" >
205
+ <div style="font-size: 4rem;">{{df_weather['visibility'][0]}} km</div>
206
+ </div>
207
+ </div>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ </div>
212
+
213
+ <div class="h-25" ></div>
214
+
215
+
216
+
217
+ </body>
218
+ <script>
219
+
220
+ if ( window.history.replaceState ) {
221
+ window.history.replaceState( null, null, window.location.href );
222
+ }
223
+ let predicted = "{{ predicted_class }}"
224
+ document.addEventListener("DOMContentLoaded", function() {
225
+ if(predicted){
226
+ var myModal = new bootstrap.Modal(document.getElementById('klasifikasiCuaca'), {
227
+ keyboard: false
228
+ });
229
+ myModal.show();
230
+ }
231
+ });
232
+ var map_38eb5ea6a30ae8bbf12217ea861d0106 = L.map(
233
+ "map_38eb5ea6a30ae8bbf12217ea861d0106",
234
+ {
235
+ center: ['{{json_coor1}}', '{{json_coor2}}'],
236
+ crs: L.CRS.EPSG3857,
237
+ zoom: 10,
238
+ zoomControl: true,
239
+ preferCanvas: false,
240
+ }
241
+ );
242
+
243
+
244
+
245
+ // Source map layout
246
+ var tile_layer_colored = L.tileLayer(
247
+ "https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png",
248
+ {
249
+ attribution: "\u0026copy; \u003ca href=\"https://www.openstreetmap.org/copyright\"\u003eOpenStreetMap\u003c/a\u003e contributors \u0026 \u003ca href=\"https://carto.com/attributions\"\u003eCARTO\u003c/a\u003e",
250
+ detectRetina: false,
251
+ maxZoom: 16,
252
+ minZoom: 10,
253
+ noWrap: false,
254
+ opacity: 1,
255
+ subdomains: "abc",
256
+ tms: false
257
+ }
258
+ );
259
+ tile_layer_colored.addTo(map_38eb5ea6a30ae8bbf12217ea861d0106);
260
+
261
+ var wilayahGeoJSON = JSON.parse('{{ json_geo | tojson | safe }}');
262
+
263
+ // Tambahkan GeoJSON untuk wilayah Surabaya
264
+ var wilayahLayer = L.geoJSON(wilayahGeoJSON, {
265
+ style: {
266
+ color: "{{ pred_color_weather }}",
267
+ weight: 2,
268
+ fillColor: "{{ pred_color_weather }}",
269
+ fillOpacity: 0.5
270
+ }
271
+ }).addTo(map_38eb5ea6a30ae8bbf12217ea861d0106);
272
+
273
+ var wilayahCenter = wilayahLayer.getBounds().getCenter();
274
+ var surabayaMarker = L.marker(wilayahCenter, {
275
+ icon: L.divIcon({
276
+ className: "weather-marker",
277
+ html: `<div style="text-align:center;">
278
+ <b>{{request.args.get('wilayah')}}</b><br>
279
+ <b><i class="{{pred_icon_weather}} me-2"></i></b>{{pred_class_weather}}
280
+ </div>`,
281
+ iconSize: [80, 50]
282
+ })
283
+ });
284
+ wilayahLayer.addLayer(surabayaMarker);
285
+
286
+
287
+
288
+ </script>
289
+ </html>