File size: 15,859 Bytes
13fc29d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# ื“ื•"ื— ืžืฉื™ืžื” 2 โ€“ ื”ื‘ืืช ื ืชื•ื ื™ื ืž-IMS (Israel Meteorological Service)

---

## ืื™ืœื• ื ืชื•ื ื™ื ื ืœืงื—ื™ื ืž-IMS ื•ืื™ืš ื”ื ื ืฉืžืจื™ื

### ืžืงื•ืจ ื”ื ืชื•ื ื™ื

- **ืฉื™ืจื•ืช:** IMS (Israel Meteorological Service) โ€“ ืฉื™ืจื•ืช ื”ืžื˜ืื•ืจื•ืœื•ื’ื™ื” ื”ื™ืฉืจืืœื™.
- **ืžืžืฉืง:** API Envista โ€“ `https://api.ims.gov.il/v1/envista/stations/{STATION_ID}/data/{CHANNEL_ID}/?from=YYYY/MM/DD&to=YYYY/MM/DD`
- **ืชื—ื ื”:** **43 โ€“ ืฉื“ื” ื‘ื•ืงืจ** (ื“ื•ืžื” ืœืืงืœื™ื ื™ืจื•ื—ื; ืžื™ืงื•ื ื”ื›ืจื).
- **ืื™ืžื•ืช:** ื˜ื•ืงืŸ API ื‘ึพืžืฉืชื ื” ืกื‘ื™ื‘ื” `IMS_API_TOKEN` (ื ืฉืžืจ ืžืงื•ืžื™ืช ื‘ึพ`.env`, ืœื ื‘ึพgit).

### ืขืจื•ืฆื™ื (Channels) ืฉื ืœืงื—ื™ื

ืžื–ื”ื™ ื”ืขืจื•ืฆื™ื ืชืœื•ื™ื™ื ื‘ืชื—ื ื”. **ืœืชื—ื ื” 43 (ืฉื“ื” ื‘ื•ืงืจ)** ืžื•ื’ื“ืจื™ื ื‘ึพ`config/dev.yaml` ืชื—ืช `ims:`:

| ืขืจื•ืฅ IMS (ืžื–ื”ื”) | ืฉื IMS | ืžืฉืชื ื” ื‘ืคืœื˜ (ืกื›ืžื” ืงื ื•ื ื™ืช) | ื™ื—ื™ื“ื•ืช | ืชื™ืื•ืจ |
|-----------------|--------|---------------------------|--------|--------|
| 6  | TD   | `air_temperature_c` | ยฐC  | ื˜ืžืคืจื˜ื•ืจืช ืื•ื•ื™ืจ ื ื•ื›ื—ื™ืช |
| 8  | TDmax| `tdmax_c`            | ยฐC  | ื˜ืžืคืจื˜ื•ืจืช ืžืงืกื™ืžื•ื (ื‘ืžื”ืœืš ื”ืžืจื•ื•ื—) |
| 9  | TDmin| `tdmin_c`            | ยฐC  | ื˜ืžืคืจื˜ื•ืจืช ืžื™ื ื™ืžื•ื (ื‘ืžื”ืœืš ื”ืžืจื•ื•ื—) |
| 10 | Grad | `ghi_w_m2`           | W/mยฒ| ืงืจื™ื ื” ื’ืœื•ื‘ืœื™ืช ืื•ืคืงื™ืช (GHI) |

- ืื `channel_radiation` ืžื•ื’ื“ืจ ื›ึพ`null` ื‘ืชืฆื•ืจื” (ืชื—ื ื” ืœืœื Grad), ืขืžื•ื“ืช ื”ืงืจื™ื ื” ืœื ื ืžืฉื›ืช ื•ืžื•ืคื™ืขื” ืจืง ื˜ืžืคืจื˜ื•ืจื”.

### ื˜ื•ื•ื— ื–ืžืŸ ื•ืจื–ื•ืœื•ืฆื™ื”

- **ื˜ื•ื•ื— ื‘ืจื™ืจืช ืžื—ื“ืœ:** ืฉื ืชื™ื™ื ืื—ื•ืจื” ืžืชืืจื™ืš ื”ื”ืจืฆื” (ื ื™ืชืŸ ืœืฉื ื•ืช ืขื `--from`, `--to` ืื• `--years`).
- **ืจื–ื•ืœื•ืฆื™ื”:** ื ืชื•ื ื™ IMS ื‘ืชื“ื™ืจื•ืช 10 ื“ืงื•ืช; ื ืฉืžืจื™ื ื›ืคื™ ืฉื”ืชืงื‘ืœื• (ืœื ืžืฆื•ื ื ื™ื).
- **ื‘ืงืฉื•ืช:** ื˜ื•ื•ื— ืฉืœ ื™ื•ืชืจ ืžึพ60 ื™ื•ื ืžืคื•ืฆืœ ืœื—ืœืงื™ื (chunks) ื›ื“ื™ ืœืžื ื•ืข ืชื’ื•ื‘ื•ืช ืจื™ืงื•ืช ืžื”ึพAPI; ื‘ื™ืŸ ื‘ืงืฉื•ืช ื™ืฉ ื”ืฉื”ื™ื™ื” ืงืฆืจื”.

### ืขื™ื‘ื•ื“ ืœืคื ื™ ืฉืžื™ืจื”

1. **ื”ืžืจืช ื–ืžืŸ:** ื—ื•ืชืžื•ืช ื”ื–ืžืŸ ืžื’ื™ืขื•ืช ืžึพIMS ื‘ื–ืžืŸ ื™ืฉืจืืœ (UTC+2/UTC+3). ื›ืœ ื”ืชืืจื™ื›ื™ื ืžื•ืžืจื™ื ืœึพ**UTC** ืœืคื ื™ ืฉืžื™ืจื”.
2. **ืžื™ื–ื•ื’ ืขืจื•ืฆื™ื:** ื›ืœ ืขืจื•ืฅ ื ืžืฉืš ื‘ื ืคืจื“; ื”ืฉื•ืจื•ืช ืžืžื•ื–ื’ื•ืช ืœืคื™ `timestamp_utc` (ืื™ื—ื•ื“ ืื™ื ื“ืงืกื™ื โ€“ ื—ืกืจื™ื ืžืกื•ืžื ื™ื ื›ึพNaN).
3. **ืกื™ื ื•ืŸ ื˜ืžืคืจื˜ื•ืจื”:** ืขืจื›ื™ื ืžื—ื•ืฅ ืœื˜ื•ื•ื— **ึพ50 ืขื“ 60 ยฐC** (ืœืžืฉืœ ืขืจื•ืฅ Time hhmm ืฉื ื“ื‘ืง ื‘ื˜ืขื•ืช) ืžื•ื—ืœืคื™ื ื‘ึพNaN.
4. **ืžืงื•ืจ:** ื ื•ืกืคืช ืขืžื•ื“ื” `source` ืขื ื”ืขืจืš `ims`.

### ืื™ืคื” ื•ืื™ืš ื ืฉืžืจื™ื ื”ื ืชื•ื ื™ื

| ืคืจื™ื˜ | ืขืจืš |
|------|-----|
| **ืงื•ื‘ืฅ ืคืœื˜** | `data/ims_radiation_temperature.csv` (ื ืชื™ื‘: `config.data_paths.IMS_RADIATION_TEMPERATURE_CSV`) |
| **ืคื•ืจืžื˜** | CSV (ืคืกื™ืง ื›ืžืคืจื™ื“) |
| **ืงื™ื“ื•ื“** | ื‘ืจื™ืจืช ืžื—ื“ืœ ืฉืœ pandas (ื‘ื“ืจืš ื›ืœืœ UTF-8) |

**ืขืžื•ื“ื•ืช ื‘ืงื•ื‘ืฅ:**

| ืขืžื•ื“ื” | ืชื™ืื•ืจ | ื™ื—ื™ื“ื•ืช |
|--------|--------|--------|
| `timestamp_utc` | ื—ื•ืชืžืช ื–ืžืŸ (UTC) | ISO format, timezone-aware UTC |
| `air_temperature_c` | ื˜ืžืคืจื˜ื•ืจืช ืื•ื•ื™ืจ | ยฐC |
| `tdmax_c` | ื˜ืžืคืจื˜ื•ืจื” ืžืงืกื™ืžืœื™ืช | ยฐC |
| `tdmin_c` | ื˜ืžืคืจื˜ื•ืจื” ืžื™ื ื™ืžืœื™ืช | ยฐC |
| `ghi_w_m2` | ืงืจื™ื ื” ื’ืœื•ื‘ืœื™ืช ืื•ืคืงื™ืช (Grad) | W/mยฒ |
| `source` | ืžืงื•ืจ ื”ื ืชื•ืŸ | ืชืžื™ื“ `ims` |

- ืขืžื•ื“ื•ืช ืฉืœื ื ืžืฉื›ื• (ืœืžืฉืœ ืงืจื™ื ื” ืื ืื™ืŸ ืขืจื•ืฅ Grad) ืœื ื™ื•ืคื™ืขื• ืื• ื™ื”ื™ื• ืจื™ืงื•ืช.
- ืฉื•ืจื•ืช ืขื NaN ื‘ื—ืœืง ืžื”ืขืžื•ื“ื•ืช ืืคืฉืจื™ื•ืช (ืœืžืฉืœ ืื™ึพื”ืชืืžื” ื‘ื–ืžื ื™ื ื‘ื™ืŸ ืขืจื•ืฆื™ื).

### ืฉื™ืžื•ืฉ ื‘ื ืชื•ื ื™ื ื‘ืคืจื•ื™ืงื˜

- ื”ืงื•ื‘ืฅ ืžืฉืžืฉ ื›ึพ**ืžืงื•ืจ ืžื˜ืื•ืจื•ืœื•ื’ื™ื” (IMS)** ืœึพ**Ground Truth** (ืžืฉื™ืžื” 1 โ€“ Data fusion).
- ืกืงืจื™ืคื˜ื™ื ื ื•ืกืคื™ื: `scripts/gap_fill_future.py` ืžืžืœื ืคืขืจื™ื (ื›ื•ืœืœ ืขืชื™ื“) ื•ื™ื›ื•ืœ ืœื›ืชื•ื‘ ืœึพ`data/ims_radiation_temperature_gap_filled.csv`; `scripts/build_ground_truth.py` ืžืžื™ืจ/ืžืžื–ื’ ืœึพGround Truth (Parquet) ืœืคื™ ื”ืกื›ืžื” ื‘ึพ`context/05_ground_truth_schema.md`.

### ืืจื’ื•ืŸ ื”ื ืชื•ื ื™ื (ืช pipeline)

ืกื“ืจ ื”ืขื‘ื•ื“ื” ืœืคื™ ื”ืชื™ืขื•ื“:

1. **ื”ื•ืจื“ืช IMS (ื’ื•ืœืžื™)**  
   `python -m scripts.download_ims_data`  
   โ†’ ืคืœื˜: `data/ims_radiation_temperature.csv` (ืจื–ื•ืœื•ืฆื™ื” 10 ื“ืงื•ืช, UTC, ืกื™ื ื•ืŸ ื˜ืžืคืจื˜ื•ืจื” -50..60 ยฐC).

2. **ื”ืฉืœืžืช ืคืขืจื™ื (ื›ื•ืœืœ ืขืชื™ื“)**  
   `python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv`  
   โ†’ ืคืœื˜: `data/ims_radiation_temperature_gap_filled.csv` (ืจืฉืช ืจื’ื•ืœืจื™ืช, quality_flag).

3. **ื‘ื ื™ื™ืช Ground Truth (Parquet)**  
   `python -m scripts.build_ground_truth`  
   โ†’ ืคืœื˜: `data/ground_truth/ground_truth_2024_2025.parquet` + `ground_truth_metadata.json` (ืจื–ื•ืœื•ืฆื™ื” 15 ื“ืงื•ืช).

ื”ืจืฆืช ื›ืœ ื”ืฆืขื“ื™ื ื‘ืจืฆืฃ (ืื ืงื™ื™ื ืงื•ื‘ืฅ ื’ื•ืœืžื™):

```bash
python -m scripts.download_ims_data && \
python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv && \
python -m scripts.build_ground_truth
```

ืื• ืขื“ื›ื•ืŸ ืื•ื˜ื•ืžื˜ื™ (ื›ื•ืœืœ TB/DB): `python -m scripts.update_ground_truth`.

---

## ื ืกืคื— โ€“ ืคืงื•ื“ื•ืช API (ืžืงื•ืจ: ื”ืฉื™ืจื•ืช ื”ืžื˜ืื•ืจื•ืœื•ื’ื™)

ืชื™ืขื•ื“ ื–ื” ืžื‘ื•ืกืก ืขืœ ื”ืžืกืžืš ื”ืจืฉืžื™ **"ืžืžืฉืง ืขื‘ื•ืจ ืžืื’ืจ ื”ื ืชื•ื ื™ื ื”ืžื˜ืื•ืจื•ืœื•ื’ื™ื™ื ื”ืขืฉืจ ื“ืงืชื™ื™ื"** โ€“ ืžืฉืจื“ ื”ืชื—ื‘ื•ืจื”, ื”ืฉื™ืจื•ืช ื”ืžื˜ืื•ืจื•ืœื•ื’ื™ (ืชืืจื™ืš ืขื“ื›ื•ืŸ 11.05.2017). ืžืงื•ืจ: ืงื•ื‘ืฅ "ืคืงื•ื“ื•ืช API" ืžื”ืฉืž"ื˜. ื›ึพ85 ืชื—ื ื•ืช ืื•ื˜ื•ืžื˜ื™ื•ืช; ื”ื ืชื•ื ื™ื ื ืžืฉื›ื™ื ื‘ืคื•ืจืžื˜ JSON.

### ืื™ืžื•ืช (Authorization)

- **ืฉื™ื˜ื”:** `Authorization: ApiToken XXXX`
- **ืงื‘ืœืช TOKEN:** ืคื ื™ื™ื” ื‘ืžื™ื™ืœ ืœึพ**ims@ims.gov.il**
- ื‘ืคืจื•ื™ืงื˜: ืžืฉืชื ื” ืกื‘ื™ื‘ื” `IMS_API_TOKEN` (ื ืฉืžืจ ื‘ึพ`.env`).

### ืžื•ืกื›ืžืช ื–ืžืŸ

- **ื›ืœ ื”ืฉื ื” ืœืคื™ ื–ืžืŸ ืžืงื•ืžื™ ืชืงื ื™ (LST)** โ€“ ืฉืขื•ืŸ ื—ื•ืจืฃ.
- ื‘ืชืงื•ืคืช ืฉืขื•ืŸ ืงื™ืฅ ื™ืฉ ื”ืคืจืฉ ืฉืœ ืฉืขื” ื‘ื™ืŸ `datetime` ื”ืžื•ืฆื’ ืœื–ืžืŸ ื‘ืคื•ืขืœ (ืœืžืฉืœ ืื•ืงื˜ื•ื‘ืจ: 11:40+03:00 ืžื•ืฆื’ ื‘ืขื•ื“ ืฉื‘ืคื•ืขืœ 12:40).
- ื‘ืกืงืจื™ืคื˜ ืฉืœื ื•: ื›ืœ ื—ื•ืชืžื•ืช ื”ื–ืžืŸ ืžื•ืžืจื•ืช ืœึพ**UTC** ืœืคื ื™ ืฉืžื™ืจื”.

### ืžื˜ื”ึพื“ืื˜ื”: ืชื—ื ื•ืช ื•ืื–ื•ืจื™ื

ืžื–ื”ื™ ืžืง placeholders: `{%ST_ID%}` = ืžืกืคืจ ืชื—ื ื”, `{%REG_ID%}` = ืžืกืคืจ ืื–ื•ืจ, `{%CH_ID%}` = ืžืกืคืจ ืขืจื•ืฅ. ืชืืจื™ืš: `YYYY/MM/DD`, `MM` = ื—ื•ื“ืฉ (ืœืžืฉืœ 05), `DD` = ื™ื•ื (ืœืžืฉืœ 28).

**ืชื—ื ื•ืช:**

| ืชื™ืื•ืจ | ื›ืชื•ื‘ืช |
|--------|--------|
| ืžื™ื“ืข ืขืœ ื›ืœ ื”ืชื—ื ื•ืช | `https://api.ims.gov.il/v1/envista/stations` |
| ืžื™ื“ืข ืขืœ ืชื—ื ื” ืกืคืฆื™ืคื™ืช | `https://api.ims.gov.il/v1/envista/stations/{%ST_ID%}` |

ืชื’ื•ื‘ืช ืชื—ื ื” ื›ื•ืœืœืช: `name`, `location`, `regionId`, `monitors` (ืจืฉื™ืžืช ืขืจื•ืฆื™ื). ืœื›ืœ ืขืจื•ืฅ: `active`, `channelId`, `name`, `typeId`, `units`.

**ืื–ื•ืจื™ื:**

| ืชื™ืื•ืจ | ื›ืชื•ื‘ืช |
|--------|--------|
| ืžื™ื“ืข ืขืœ ื›ืœ ื”ืื–ื•ืจื™ื (ื›ื•ืœืœ ืชื—ื ื•ืช) | `https://api.ims.gov.il/v1/envista/regions` |
| ืžื™ื“ืข ืขืœ ืื–ื•ืจ ืกืคืฆื™ืคื™ | `https://api.ims.gov.il/v1/envista/regions/{%REG_ID%}` |

ืื–ื•ืจ ื›ื•ืœืœ: ืžืกืคืจ ืื–ื•ืจ, ืฉื, ืจืฉื™ืžืช ืชื—ื ื•ืช ื•ื”ืขืจื•ืฆื™ื ืฉืœื”ืŸ.

### ืžืฉื™ื›ืช ื ืชื•ื ื™ื ืžื˜ืื•ืจื•ืœื•ื’ื™ื™ื ืžืชื—ื ื”

ื‘ืกื™ืก: `https://api.ims.gov.il/v1/envista/stations/{%ST_ID%}/data/...`

**ื ืชื•ื ื™ื ืื—ืจื•ื ื™ื / ื™ืฉื ื™ื ื‘ื™ื•ืชืจ:**

| ืชื™ืื•ืจ | ื›ืชื•ื‘ืช |
|--------|--------|
| ืื—ืจื•ื ื™ื โ€“ ื›ืœ ื”ืขืจื•ืฆื™ื | `.../stations/{%ST_ID%}/data/latest` |
| ืื—ืจื•ื ื™ื โ€“ ืขืจื•ืฅ ืกืคืฆื™ืคื™ | `.../stations/{%ST_ID%}/data/{%CH_ID%}/latest` |
| ื™ืฉื ื™ื ื‘ื™ื•ืชืจ โ€“ ื›ืœ ื”ืขืจื•ืฆื™ื | `.../stations/{%ST_ID%}/data/earliest` |
| ื™ืฉื ื™ื ื‘ื™ื•ืชืจ โ€“ ืขืจื•ืฅ ืกืคืฆื™ืคื™ | `.../stations/{%ST_ID%}/data/{%CH_ID%}/earliest` |

**ื”ื™ื•ื / ื”ื—ื•ื“ืฉ ื”ื ื•ื›ื—ื™:**

| ืชื™ืื•ืจ | ื›ืชื•ื‘ืช |
|--------|--------|
| ื ืชื•ื ื™ื ืžื”ื™ื•ื โ€“ ื›ืœ ื”ืขืจื•ืฆื™ื | `.../stations/{%ST_ID%}/data/daily` |
| ื ืชื•ื ื™ื ืžื”ื™ื•ื โ€“ ืขืจื•ืฅ ืกืคืฆื™ืคื™ | `.../stations/{%ST_ID%}/data/{%CH_ID%}/daily` |
| ื ืชื•ื ื™ื ืžื”ื—ื•ื“ืฉ โ€“ ื›ืœ ื”ืขืจื•ืฆื™ื | `.../stations/{%ST_ID%}/data/monthly` |
| ื ืชื•ื ื™ื ืžื”ื—ื•ื“ืฉ โ€“ ืขืจื•ืฅ ืกืคืฆื™ืคื™ | `.../stations/{%ST_ID%}/data/{%CH_ID%}/monthly` |

**ื™ื•ื / ื—ื•ื“ืฉ ืžืกื•ื™ื:**

| ืชื™ืื•ืจ | ื›ืชื•ื‘ืช |
|--------|--------|
| ื™ื•ื ืžืกื•ื™ื โ€“ ื›ืœ ื”ืขืจื•ืฆื™ื | `.../stations/{%ST_ID%}/data/daily/YYYY/MM/DD` |
| ื™ื•ื ืžืกื•ื™ื โ€“ ืขืจื•ืฅ ืกืคืฆื™ืคื™ | `.../stations/{%ST_ID%}/data/daily/{%CH_ID%}/YYYY/MM/DD` |
| ื—ื•ื“ืฉ ืžืกื•ื™ื โ€“ ื›ืœ ื”ืขืจื•ืฆื™ื | `.../stations/{%ST_ID%}/data/monthly/YYYY/MM` |
| ื—ื•ื“ืฉ ืžืกื•ื™ื โ€“ ืขืจื•ืฅ ืกืคืฆื™ืคื™ | `.../stations/{%ST_ID%}/data/{%CH_ID%}/monthly/YYYY/MM` |

**ื˜ื•ื•ื— ืชืืจื™ื›ื™ื (ื–ื” ืžื” ืฉื”ืกืงืจื™ืคื˜ ืžืฉืชืžืฉ ื‘ื•):**

| ืชื™ืื•ืจ | ื›ืชื•ื‘ืช |
|--------|--------|
| ื˜ื•ื•ื— โ€“ ื›ืœ ื”ืขืจื•ืฆื™ื | `.../stations/{%ST_ID%}/data?from=YYYY/MM/DD&to=YYYY/MM/DD` |
| ื˜ื•ื•ื— โ€“ ืขืจื•ืฅ ืกืคืฆื™ืคื™ | `.../stations/{%ST_ID%}/data/{%CH_ID%}?from=YYYY/MM/DD&to=YYYY/MM/DD` |

### ืžื‘ื ื” ืชื’ื•ื‘ืช ื ืชื•ื ื™ื

- **ืžืกืคืจ ื”ืชื—ื ื”**
- **ื–ืžืŸ ื”ืžื“ื™ื“ื”** (`datetime`)
- **ืจืฉื™ืžืช ืขืจื•ืฆื™ื**, ืœื›ืœ ืขืจื•ืฅ:
  - `id` โ€“ ืžืก' ืขืจื•ืฅ
  - `name` โ€“ ืฉื ื”ืขืจื•ืฅ
  - `status` โ€“ **1** = ืชืงื™ืŸ, **2** = ืœื ืชืงื™ืŸ (ื›ืืฉืจ Status=2 ื”ื ืชื•ื ื™ื ืœื ืชืงื™ื ื™ื)
  - `valid` โ€“ `true` / `false`
  - ืขืจืš ืžืกืคืจื™ ืฉืœ ื”ืคืจืžื˜ืจ ื”ื ืžื“ื“

**ื”ืขืจื”:** ืœื ื›ืœ ื”ืชื—ื ื•ืช ืžื•ื“ื“ื•ืช ืืช ื›ืœ ื”ืžืฉืชื ื™ื; **ืžืก' ื”ืขืจื•ืฅ ืœืื•ืชื• ืžืฉืชื ื” ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื•ื ื” ืžืชื—ื ื” ืœืชื—ื ื”**. ื›ื“ื™ ืœื“ืขืช ืืช ืžืก' ื”ืขืจื•ืฅ โ€“ ืœื”ืจื™ืฅ ืžื˜ื”ึพื“ืื˜ื” ืขืœ ื”ืชื—ื ื” (ืื• `--list-stations` ื‘ืกืงืจื™ืคื˜).

### ืจืฉื™ืžืช ืžืฉืชื ื™ื ืžื˜ืื•ืจื•ืœื•ื’ื™ื™ื (CHANNEL) โ€“ ื ืกืคื— ื’'

ืžืฉืชื ื™ื ืฉื”ืชื—ื ื•ืช ืขืฉื•ื™ื•ืช ืœืžื“ื•ื“ (ืฉื ื”ืขืจื•ืฅ ื‘-API, ื™ื—ื™ื“ื•ืช, ืชื™ืื•ืจ):

| ืžืฉืชื ื” | ื™ื—ื™ื“ื•ืช | ืชื™ืื•ืจ |
|--------|--------|--------|
| BP   | mb     | ืœื—ืฅ ื‘ื’ื•ื‘ื” ื”ืชื—ื ื” |
| DiffR | w/mยฒ  | ืงืจื™ื ื” ืžืคื•ื–ืจืช |
| Grad  | w/mยฒ  | ืงืจื™ื ื” ื’ืœื•ื‘ืœื™ืช (GHI) |
| NIP   | w/mยฒ  | ืงืจื™ื ื” ื™ืฉื™ืจื” |
| Rain  | mm    | ื›ืžื•ืช ื’ืฉื |
| RH    | %     | ืœื—ื•ืช ื™ื—ืกื™ืช |
| STDwd | deg   | ืกื˜ื™ื™ืช ืชืงืŸ ืฉืœ ื›ื™ื•ื•ืŸ ื”ืจื•ื— |
| TD    | degC  | ื˜ืžืคืจื˜ื•ืจื” ื™ื‘ืฉื” (ืื•ื•ื™ืจ) |
| TDmax | degC  | ื˜ืžืคืจื˜ื•ืจืช ืžืงืกื™ืžื•ื |
| TDmin | degC  | ื˜ืžืคืจื˜ื•ืจืช ืžื™ื ื™ืžื•ื |
| TG    | degC  | ื˜ืžืคืจื˜ื•ืจื” ืœื™ื“ ื”ืงืจืงืข |
| Time  | hhmm  | ื–ืžืŸ ืกื™ื•ื 10 ื”ื“ืงื•ืช ื”ืžืงืกื™ืžืœื™ื•ืช |
| WD    | deg   | ื›ื™ื•ื•ืŸ ื”ืจื•ื— |
| WDmax | deg   | ื›ื™ื•ื•ืŸ ื”ืžืฉื‘ ื”ืขืœื™ื•ืŸ |
| WS    | m/sec | ืžื”ื™ืจื•ืช ื”ืจื•ื— |
| Ws10mm | m/sec | ืžื”ื™ืจื•ืช ืจื•ื— 10 ื“ืงืชื™ืช ืžืงืกื™ืžืœื™ืช |
| WS1mm | m/sec | ืžื”ื™ืจื•ืช ืจื•ื— ื“ืงืชื™ืช ืžืงืกื™ืžืœื™ืช |
| WSmax | m/sec | ืžื”ื™ืจื•ืช ื”ืžืฉื‘ ื”ืขืœื™ื•ืŸ |

ื‘ืคืจื•ื™ืงื˜ ื ืžืฉื›ื™ื ื›ื™ื•ื: **TD, TDmax, TDmin, Grad** (ืชื—ื ื” 43 โ€“ ืฉื“ื” ื‘ื•ืงืจ). ืฉืืจ ื”ืžืฉืชื ื™ื (ืœื—ืฅ, ื’ืฉื, ืจื•ื—, ืœื—ื•ืช, ืงืจื™ื ื” ืžืคื•ื–ืจืช/ื™ืฉื™ืจื” ื•ื›ื•') ื–ืžื™ื ื™ื ื‘ืื•ืชื• API ืœืคื™ ืžืก' ืขืจื•ืฅ ืœื›ืœ ืชื—ื ื”.

### ืฉื™ืžื•ืฉ ื‘-Fiddler (ื ืกืคื— ื‘')

ืœื‘ื“ื™ืงื•ืช: ื›ืœื™ ื—ื™ื ืžื™ Fiddler. ื‘-Composer: GET ืขื ื”ื›ืชื•ื‘ืช ื”ืจืฆื•ื™ื”, ื•ื‘ึพHeader: `Authorization: ApiToken XXXX`.

---

## ืžื” ื‘ื•ืฆืข

### 1. ืกืงืจื™ืคื˜ ื”ื•ืจื“ืช ื ืชื•ื ื™ื IMS (`scripts/download_ims_data.py`)

- **ืžื˜ืจื”:** ื”ื•ืจื“ืช ื ืชื•ื ื™ื ื”ื™ืกื˜ื•ืจื™ื™ื ืฉืœ ืงืจื™ื ื” (Grad โ‰ˆ GHI) ื•ื˜ืžืคืจื˜ื•ืจื” (TD, TDmax, TDmin) ืž-IMS ืœืฉื ืชื™ื™ื ืื—ื•ืจื”.
- **API:** `https://api.ims.gov.il/v1/envista/stations/{STATION_ID}/data/{CHANNEL_ID}/?from=YYYY/MM/DD&to=YYYY/MM/DD`
- **ืื™ืžื•ืช:** ื˜ื•ืงืŸ IMS โ€“ ืœื‘ืงืฉ ืž-ims@ims.gov.il (ืชื ืื™ ืฉื™ืžื•ืฉ: https://ims.gov.il/en/ObservationDataAPI).
- **ืžืฉืชื ื” ืกื‘ื™ื‘ื”:** `IMS_API_TOKEN` (ืื• `IMS_TOKEN`) โ€“ ืžื•ืžืœืฅ ืœื”ื’ื“ื™ืจ ื‘ึพ`.env`.
- **ืชืฆื•ืจื”:** ืชื—ื ื” ื•ืขืจื•ืฆื™ื ื‘ึพ`config/dev.yaml` ืชื—ืช `ims:` (ื‘ืจื™ืจืช ืžื—ื“ืœ: ืชื—ื ื” **43 โ€“ ืฉื“ื” ื‘ื•ืงืจ**, ื“ื•ืžื” ืœื™ืจื•ื—ื; ืชื—ื ื” 98 = ื ื‘ื˜ื™ื).
- **ืคืœื˜:** `data/ims_radiation_temperature.csv` ืขื ืขืžื•ื“ื•ืช ืงื ื•ื ื™ื•ืช: `timestamp_utc`, `air_temperature_c`, `ghi_w_m2`, `tdmax_c`, `tdmin_c`, `source=ims`. ื—ื•ืชืžื•ืช ื”ื–ืžืŸ ืžื•ืžืจื•ืช ืžื™ืฉืจืืœ (UTC+2/3) ืœ-UTC.

**ืฉื™ืžื•ืฉ:**
```bash
# ืจืฉื™ืžืช ืชื—ื ื•ืช (ื“ื•ืจืฉ ื˜ื•ืงืŸ)
python -m scripts.download_ims_data --list-stations

# ื”ื•ืจื“ื” ืœืฉื ืชื™ื™ื ืื—ื•ืจื” (ื‘ืจื™ืจืช ืžื—ื“ืœ)
python -m scripts.download_ims_data

# ื˜ื•ื•ื— ืชืืจื™ื›ื™ื ื™ื“ื ื™
python -m scripts.download_ims_data --from 2024-01-01 --to 2025-12-31 --station 43
```

**ื”ืขืจื”:** ืžื–ื”ื™ ื”ืขืจื•ืฆื™ื (channel IDs) ืชืœื•ื™ื™ื ื‘ืชื—ื ื”; ื™ืฉ ืœืืžืช ืžื•ืœ ื”-API ืื• ืชื™ืขื•ื“ IMS (ืœืžืฉืœ ืชื—ื ื” 28: TDmax=10, TDmin=11).

---

### 2. ืกืงืจื™ืคื˜ ื”ืฉืœืžืช ืคืขืจื™ื ืœืขืชื™ื“ (`scripts/gap_fill_future.py`)

- **ืžื˜ืจื”:** ื”ืฉืœืžืช ืคืขืจื™ื ื‘ืขืชื™ื“ โ€“ ืจืฉืช ื–ืžืŸ ืจื’ื•ืœืจื™ืช ืžื”ืชืืจื™ืš ื”ืื—ืจื•ืŸ ื‘ื ืชื•ื ื™ื ืขื“ ืชืืจื™ืš ืกื™ื•ื (ืื•ืคืฆื™ื•ื ืœื™), ืขื ืžื™ืœื•ื™ ืคืขืจื™ื ื‘-forward-fill ืื• ืื™ื ื˜ืจืคื•ืœืฆื™ื” ืœื™ื ื™ืืจื™ืช, ื•ืื•ืคืฆื™ื” ืœืžื™ื–ื•ื’ ืขื ืงื•ื‘ืฅ ืชื—ื–ื™ืช (ืœืžืฉืœ Open-Meteo).
- **ืงืœื˜:** ืงื•ื‘ืฅ IMS (ืื• ื›ืœ CSV ืขื `timestamp_utc` + ืขืžื•ื“ื•ืช ืžืกืคืจื™ื•ืช).
- **ืคืœื˜:** `data/ims_radiation_temperature_gap_filled.csv` ืขื ืขืžื•ื“ื” `quality_flag`: `observed` | `forward_fill` | `interpolated` | `forecast`.

**ืฉื™ืžื•ืฉ:**
```bash
# ื”ืฉืœืžืช ืคืขืจื™ื ืขื forward-fill ืขื“ ืกื•ืฃ ื”ื ืชื•ื ื™ื
python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv

# ื”ืืจื›ืช ืจืฉืช ืขื“ ืชืืจื™ืš ืขืชื™ื“ื™
python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv --end-date 2026-12-31

# ืžื™ืœื•ื™ ืขืชื™ื“ ืžืชื—ื–ื™ืช (ืœืžืฉืœ weather_forecast_cache)
python -m scripts.gap_fill_future --input data/ims_radiation_temperature.csv --forecast data/weather_forecast_cache.csv
```

---

### 3. ืขื“ื›ื•ื ื™ ืงื•ื ืคื™ื’ื•ืจืฆื™ื”

- **`config/data_paths.py`:** ื ื•ืกืคื• `IMS_RADIATION_TEMPERATURE_CSV`, `IMS_GAP_FILLED_CSV` ื•-CSV_SPECS ืžืชืื™ืžื™ื.
- **`config/dev.yaml`:** ื ื•ืกืฃ ื‘ืœื•ืง `ims:` ืขื `station_id`, `default_station_id`, ื•-channel IDs (ื ื™ืชืŸ ืœื”ืชืืžื” ืœืคื™ ืชื—ื ื”).
- **`config/env.example`:** ื ื•ืกืฃ `IMS_API_TOKEN` ืขื ื”ืขืจื” ืœื‘ืงืฉืช ื˜ื•ืงืŸ.

---

## ืžื” ื ืฉืืจ (ืื•ืคืฆื™ื•ื ืœื™)

- **ื•ืœื™ื“ืฆื™ื”:** ืœื”ืจื™ืฅ ื”ื•ืจื“ื” ืขื ื˜ื•ืงืŸ ืืžื™ืชื™ ื•ืœื•ื•ื“ื ื›ื™ืกื•ื™ ื•ืจื–ื•ืœื•ืฆื™ื” (ืฉืขืชื™/ื™ื•ืžื™) ืžื•ืœ ื“ืจื™ืฉื•ืช Ground Truth.
- **ื”ืชืืžืช ืชื—ื ื”/ืขืจื•ืฆื™ื:** ืชื—ื ื” 43 = ืฉื“ื” ื‘ื•ืงืจ (ื“ื•ืžื” ืœื™ืจื•ื—ื), ืชื—ื ื” 98 = ื ื‘ื˜ื™ื. ืœื”ืจื™ืฅ `--list-stations` ืœืขื“ื›ื•ืŸ ืชื—ื ื”/ืขืจื•ืฆื™ื.

---

## ืกื™ื›ื•ื

| ืคืจื™ื˜ | ืกื˜ื˜ื•ืก |
|------|--------|
| ืชื™ืขื•ื“/ื’ื™ืฉื” ืœ-IMS API | ื‘ื•ืฆืข โ€“ ืชื™ืขื•ื“ ื•ืกืงืจื™ืคื˜ |
| ืกืงืจื™ืคื˜ ื”ื•ืจื“ื” (ืฉื ืชื™ื™ื ืื—ื•ืจื”) | ื‘ื•ืฆืข โ€“ `download_ims_data.py` |
| ืžื™ืคื•ื™ ืœืกื›ืžื” ืงื ื•ื ื™ืช + CSV | ื‘ื•ืฆืข โ€“ `timestamp_utc`, `air_temperature_c`, `ghi_w_m2`, ื•ื›ื•' |
| ืกืงืจื™ืคื˜ ื”ืฉืœืžืช ืคืขืจื™ื ืœืขืชื™ื“ | ื‘ื•ืฆืข โ€“ `gap_fill_future.py` |
| ื•ืœื™ื“ืฆื™ื” ื›ื™ืกื•ื™/ืจื–ื•ืœื•ืฆื™ื” | ืžืžืชื™ืŸ โ€“ ื“ื•ืจืฉ ื˜ื•ืงืŸ IMS ื•ื”ืจืฆื” |