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 ืืืจืฆื |
|