Retire dual storage mode and default runtime state to sqlite
This commit is contained in:
+276
-1326
File diff suppressed because it is too large
Load Diff
@@ -42,25 +42,25 @@
|
|||||||
"nws"
|
"nws"
|
||||||
],
|
],
|
||||||
"model_path": "artifacts\\models\\lgbm_daily_high.txt",
|
"model_path": "artifacts\\models\\lgbm_daily_high.txt",
|
||||||
"sample_count": 54,
|
"sample_count": 18,
|
||||||
"train_count": 42,
|
"train_count": 6,
|
||||||
"validation_count": 12,
|
"validation_count": 12,
|
||||||
"metrics": {
|
"metrics": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"sample_count": 12,
|
"sample_count": 12,
|
||||||
"lgbm_mae": 1.349,
|
"lgbm_mae": 7.992,
|
||||||
"deb_mae": 0.875,
|
"deb_mae": 2.375,
|
||||||
"best_single_mae": 0.325,
|
"best_single_mae": 1.05,
|
||||||
"median_mae": 0.758
|
"median_mae": 2.292
|
||||||
},
|
},
|
||||||
"full_sample": {
|
"full_sample": {
|
||||||
"sample_count": 54,
|
"sample_count": 18,
|
||||||
"lgbm_mae": 0.691,
|
"lgbm_mae": 3.034,
|
||||||
"deb_mae": 6.287,
|
"deb_mae": 1.689,
|
||||||
"best_single_mae": 5.431,
|
"best_single_mae": 0.822,
|
||||||
"median_mae": 6.265
|
"median_mae": 1.711
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"generated_at": "2026-04-02T16:27:44.816882Z",
|
"generated_at": "2026-04-15T16:41:56.814421Z",
|
||||||
"trained_at": "2026-04-02T16:27:44.816882Z"
|
"trained_at": "2026-04-15T16:41:56.814421Z"
|
||||||
}
|
}
|
||||||
@@ -1,20 +1,20 @@
|
|||||||
{
|
{
|
||||||
"version": "emos-20260402162744",
|
"version": "emos-20260415164136",
|
||||||
"trained_at": "2026-04-02T16:27:44.114836+00:00",
|
"trained_at": "2026-04-15T16:41:36.704829+00:00",
|
||||||
"global": {
|
"global": {
|
||||||
"mu": {
|
"mu": {
|
||||||
"intercept": 1.54512641,
|
"intercept": -0.39094186,
|
||||||
"raw_mu_coef": 2.96105052,
|
"raw_mu_coef": 0.27476248,
|
||||||
"deb_coef": -1.53260815,
|
"deb_coef": 0.91159557,
|
||||||
"ens_median_coef": -0.72849343,
|
"ens_median_coef": -0.16959018,
|
||||||
"max_so_far_gap_coef": 9.52557689
|
"max_so_far_gap_coef": -0.94232523
|
||||||
},
|
},
|
||||||
"sigma": {
|
"sigma": {
|
||||||
"intercept": 0.67432479,
|
"intercept": -1.56485068,
|
||||||
"raw_sigma_coef": 0.6936692,
|
"raw_sigma_coef": 0.12930442,
|
||||||
"spread_coef": 0.08877484,
|
"spread_coef": 0.15947819,
|
||||||
"peak_flag_coef": -0.58374835,
|
"peak_flag_coef": 0.19328621,
|
||||||
"max_so_far_gap_coef": -0.8172477
|
"max_so_far_gap_coef": -0.08469752
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sigma_constraints": {
|
"sigma_constraints": {
|
||||||
@@ -29,60 +29,54 @@
|
|||||||
"max_bucket_brier_increase": 0.05
|
"max_bucket_brier_increase": 0.05
|
||||||
},
|
},
|
||||||
"blending": {
|
"blending": {
|
||||||
"alpha_mu": 0.0,
|
"alpha_mu": 1.0,
|
||||||
"alpha_sigma": 0.05
|
"alpha_sigma": 0.5
|
||||||
},
|
},
|
||||||
"cities": {
|
"cities": {
|
||||||
"ankara": {
|
"tokyo": {
|
||||||
"samples": 3,
|
|
||||||
"mu_bias": 1.271844,
|
|
||||||
"sigma_scale": 1.477644,
|
|
||||||
"confidence": 0.375
|
|
||||||
},
|
|
||||||
"hong kong": {
|
|
||||||
"samples": 4,
|
"samples": 4,
|
||||||
"mu_bias": 1.32008,
|
"mu_bias": 0.211244,
|
||||||
"sigma_scale": 1.04023,
|
"sigma_scale": 0.5,
|
||||||
"confidence": 0.5
|
"confidence": 0.5
|
||||||
},
|
},
|
||||||
"milan": {
|
"ankara": {
|
||||||
"samples": 3,
|
"samples": 11,
|
||||||
"mu_bias": -3.935178,
|
"mu_bias": 0.027471,
|
||||||
"sigma_scale": 2.0,
|
"sigma_scale": 0.5,
|
||||||
"confidence": 0.375
|
"confidence": 1.0
|
||||||
},
|
},
|
||||||
"shanghai": {
|
"istanbul": {
|
||||||
"samples": 3,
|
"samples": 12,
|
||||||
"mu_bias": 1.810495,
|
"mu_bias": 0.048913,
|
||||||
"sigma_scale": 2.0,
|
"sigma_scale": 0.5,
|
||||||
"confidence": 0.375
|
"confidence": 1.0
|
||||||
|
},
|
||||||
|
"hong kong": {
|
||||||
|
"samples": 12,
|
||||||
|
"mu_bias": -0.026823,
|
||||||
|
"sigma_scale": 1.020494,
|
||||||
|
"confidence": 1.0
|
||||||
},
|
},
|
||||||
"taipei": {
|
"taipei": {
|
||||||
"samples": 3,
|
"samples": 5,
|
||||||
"mu_bias": 3.577828,
|
"mu_bias": 0.192719,
|
||||||
"sigma_scale": 2.0,
|
"sigma_scale": 0.5,
|
||||||
"confidence": 0.375
|
"confidence": 0.625
|
||||||
},
|
|
||||||
"warsaw": {
|
|
||||||
"samples": 3,
|
|
||||||
"mu_bias": -0.625333,
|
|
||||||
"sigma_scale": 1.25968,
|
|
||||||
"confidence": 0.375
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"metrics": {
|
"metrics": {
|
||||||
"sample_count": 54,
|
"sample_count": 50,
|
||||||
"mean_crps": 3.792563,
|
"mean_crps": 0.278798,
|
||||||
"legacy_mean_crps": 4.308029,
|
"legacy_mean_crps": 1.26525,
|
||||||
"legacy_mean_mae": 4.51037,
|
"legacy_mean_mae": 1.4674,
|
||||||
"legacy_bucket_hit_rate": 0.537037,
|
"legacy_bucket_hit_rate": 0.54,
|
||||||
"legacy_bucket_brier": 0.833294,
|
"legacy_bucket_brier": 0.744518,
|
||||||
"selected_mean_crps": 4.249828,
|
"selected_mean_crps": 0.278798,
|
||||||
"selected_mean_mae": 4.51037,
|
"selected_mean_mae": 0.248457,
|
||||||
"selected_bucket_hit_rate": 0.555556,
|
"selected_bucket_hit_rate": 0.82,
|
||||||
"selected_bucket_brier": 0.831872,
|
"selected_bucket_brier": 0.369542,
|
||||||
"selected_score": 5.991436,
|
"selected_score": 0.8508,
|
||||||
"legacy_score": 6.078481,
|
"legacy_score": 2.660378,
|
||||||
"filled_actual_from_history": 0,
|
"filled_actual_from_history": 0,
|
||||||
"settlement_history_city_count": 30
|
"settlement_history_city_count": 30
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,257 +1,95 @@
|
|||||||
{
|
{
|
||||||
"summary": {
|
"summary": {
|
||||||
"sample_count": 54,
|
"sample_count": 17,
|
||||||
"filled_actual_from_history": 2,
|
"filled_actual_from_history": 0,
|
||||||
"legacy": {
|
"legacy": {
|
||||||
"mean_crps": 4.300621,
|
"mean_crps": 1.095786,
|
||||||
"mean_mae": 4.502963,
|
"mean_mae": 1.243529,
|
||||||
"bucket_hit_rate": 0.537037
|
"bucket_hit_rate": 0.588235
|
||||||
},
|
},
|
||||||
"emos": {
|
"emos": {
|
||||||
"mean_crps": 4.213889,
|
"mean_crps": 1.257578,
|
||||||
"mean_mae": 4.502963,
|
"mean_mae": 1.545328,
|
||||||
"bucket_hit_rate": 0.537037
|
"bucket_hit_rate": 0.352941
|
||||||
},
|
},
|
||||||
"delta": {
|
"delta": {
|
||||||
"crps": -0.086732,
|
"crps": 0.161791,
|
||||||
"mae": 0.0,
|
"mae": 0.301798,
|
||||||
"bucket_hit_rate": 0.0
|
"bucket_hit_rate": -0.235294
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"by_city": {
|
"by_city": {
|
||||||
"ankara": {
|
"ankara": {
|
||||||
"samples": 3,
|
"samples": 3,
|
||||||
"legacy_mean_crps": 0.327701,
|
"legacy_mean_crps": 2.707176,
|
||||||
"emos_mean_crps": 0.439705,
|
"emos_mean_crps": 2.632737,
|
||||||
"legacy_mean_mae": 0.066667,
|
"legacy_mean_mae": 3.0,
|
||||||
"emos_mean_mae": 0.066667,
|
"emos_mean_mae": 2.90439,
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"atlanta": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 30.449382,
|
|
||||||
"emos_mean_crps": 30.578432,
|
|
||||||
"legacy_mean_mae": 32.015,
|
|
||||||
"emos_mean_mae": 32.015,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"buenos aires": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 9.113412,
|
|
||||||
"emos_mean_crps": 8.759954,
|
|
||||||
"legacy_mean_mae": 10.27,
|
|
||||||
"emos_mean_mae": 10.27,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"chicago": {
|
|
||||||
"samples": 1,
|
|
||||||
"legacy_mean_crps": 1.250268,
|
|
||||||
"emos_mean_crps": 0.701085,
|
|
||||||
"legacy_mean_mae": 0.0,
|
|
||||||
"emos_mean_mae": 0.0,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"dallas": {
|
|
||||||
"samples": 1,
|
|
||||||
"legacy_mean_crps": 2.173363,
|
|
||||||
"emos_mean_crps": 0.701085,
|
|
||||||
"legacy_mean_mae": 0.0,
|
|
||||||
"emos_mean_mae": 0.0,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"hong kong": {
|
|
||||||
"samples": 4,
|
|
||||||
"legacy_mean_crps": 0.29509,
|
|
||||||
"emos_mean_crps": 0.387946,
|
|
||||||
"legacy_mean_mae": 0.075,
|
|
||||||
"emos_mean_mae": 0.075,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 0.75
|
|
||||||
},
|
|
||||||
"london": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 3.885033,
|
|
||||||
"emos_mean_crps": 3.866915,
|
|
||||||
"legacy_mean_mae": 4.135,
|
|
||||||
"emos_mean_mae": 4.135,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"lucknow": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 2.487193,
|
|
||||||
"emos_mean_crps": 2.342342,
|
|
||||||
"legacy_mean_mae": 3.205,
|
|
||||||
"emos_mean_mae": 3.205,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"madrid": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 6.27726,
|
|
||||||
"emos_mean_crps": 5.967277,
|
|
||||||
"legacy_mean_mae": 7.33,
|
|
||||||
"emos_mean_mae": 7.33,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"miami": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 28.637631,
|
|
||||||
"emos_mean_crps": 28.482516,
|
|
||||||
"legacy_mean_mae": 30.175,
|
|
||||||
"emos_mean_mae": 30.175,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"milan": {
|
|
||||||
"samples": 3,
|
|
||||||
"legacy_mean_crps": 4.401392,
|
|
||||||
"emos_mean_crps": 3.858031,
|
|
||||||
"legacy_mean_mae": 4.06,
|
|
||||||
"emos_mean_mae": 4.06,
|
|
||||||
"legacy_bucket_hit_rate": 0.666667,
|
|
||||||
"emos_bucket_hit_rate": 0.666667
|
|
||||||
},
|
|
||||||
"munich": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 3.145192,
|
|
||||||
"emos_mean_crps": 3.011312,
|
|
||||||
"legacy_mean_mae": 3.64,
|
|
||||||
"emos_mean_mae": 3.64,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"new york": {
|
|
||||||
"samples": 1,
|
|
||||||
"legacy_mean_crps": 3.692845,
|
|
||||||
"emos_mean_crps": 3.407357,
|
|
||||||
"legacy_mean_mae": 4.94,
|
|
||||||
"emos_mean_mae": 4.94,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"paris": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 4.013782,
|
|
||||||
"emos_mean_crps": 3.979293,
|
|
||||||
"legacy_mean_mae": 4.265,
|
|
||||||
"emos_mean_mae": 4.265,
|
|
||||||
"legacy_bucket_hit_rate": 0.5,
|
|
||||||
"emos_bucket_hit_rate": 0.5
|
|
||||||
},
|
|
||||||
"sao paulo": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 5.540967,
|
|
||||||
"emos_mean_crps": 5.272063,
|
|
||||||
"legacy_mean_mae": 6.57,
|
|
||||||
"emos_mean_mae": 6.57,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"seattle": {
|
|
||||||
"samples": 1,
|
|
||||||
"legacy_mean_crps": 0.315488,
|
|
||||||
"emos_mean_crps": 0.425909,
|
|
||||||
"legacy_mean_mae": 0.0,
|
|
||||||
"emos_mean_mae": 0.0,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"seoul": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 0.313754,
|
|
||||||
"emos_mean_crps": 0.412831,
|
|
||||||
"legacy_mean_mae": 0.15,
|
|
||||||
"emos_mean_mae": 0.15,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"shanghai": {
|
|
||||||
"samples": 3,
|
|
||||||
"legacy_mean_crps": 0.299116,
|
|
||||||
"emos_mean_crps": 0.394855,
|
|
||||||
"legacy_mean_mae": 0.1,
|
|
||||||
"emos_mean_mae": 0.1,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"shenzhen": {
|
|
||||||
"samples": 1,
|
|
||||||
"legacy_mean_crps": 0.798351,
|
|
||||||
"emos_mean_crps": 0.762787,
|
|
||||||
"legacy_mean_mae": 0.9,
|
|
||||||
"emos_mean_mae": 0.9,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"singapore": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 0.281993,
|
|
||||||
"emos_mean_crps": 0.37264,
|
|
||||||
"legacy_mean_mae": 0.15,
|
|
||||||
"emos_mean_mae": 0.15,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"taipei": {
|
|
||||||
"samples": 3,
|
|
||||||
"legacy_mean_crps": 0.356996,
|
|
||||||
"emos_mean_crps": 0.472738,
|
|
||||||
"legacy_mean_mae": 0.1,
|
|
||||||
"emos_mean_mae": 0.1,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"tel aviv": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 0.446758,
|
|
||||||
"emos_mean_crps": 0.578006,
|
|
||||||
"legacy_mean_mae": 0.3,
|
|
||||||
"emos_mean_mae": 0.3,
|
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"tokyo": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 0.450128,
|
|
||||||
"emos_mean_crps": 0.582151,
|
|
||||||
"legacy_mean_mae": 0.25,
|
|
||||||
"emos_mean_mae": 0.25,
|
|
||||||
"legacy_bucket_hit_rate": 0.5,
|
|
||||||
"emos_bucket_hit_rate": 1.0
|
|
||||||
},
|
|
||||||
"toronto": {
|
|
||||||
"samples": 2,
|
|
||||||
"legacy_mean_crps": 5.497916,
|
|
||||||
"emos_mean_crps": 5.240552,
|
|
||||||
"legacy_mean_mae": 6.33,
|
|
||||||
"emos_mean_mae": 6.33,
|
|
||||||
"legacy_bucket_hit_rate": 0.0,
|
|
||||||
"emos_bucket_hit_rate": 0.0
|
|
||||||
},
|
|
||||||
"warsaw": {
|
|
||||||
"samples": 3,
|
|
||||||
"legacy_mean_crps": 1.618875,
|
|
||||||
"emos_mean_crps": 1.553232,
|
|
||||||
"legacy_mean_mae": 2.056667,
|
|
||||||
"emos_mean_mae": 2.056667,
|
|
||||||
"legacy_bucket_hit_rate": 0.333333,
|
"legacy_bucket_hit_rate": 0.333333,
|
||||||
"emos_bucket_hit_rate": 0.333333
|
"emos_bucket_hit_rate": 0.333333
|
||||||
},
|
},
|
||||||
"wellington": {
|
"busan": {
|
||||||
"samples": 2,
|
"samples": 1,
|
||||||
"legacy_mean_crps": 0.364919,
|
"legacy_mean_crps": 0.264698,
|
||||||
"emos_mean_crps": 0.475875,
|
"emos_mean_crps": 0.797946,
|
||||||
"legacy_mean_mae": 0.15,
|
"legacy_mean_mae": 0.3,
|
||||||
"emos_mean_mae": 0.15,
|
"emos_mean_mae": 1.213185,
|
||||||
"legacy_bucket_hit_rate": 1.0,
|
"legacy_bucket_hit_rate": 1.0,
|
||||||
"emos_bucket_hit_rate": 1.0
|
"emos_bucket_hit_rate": 0.0
|
||||||
|
},
|
||||||
|
"chengdu": {
|
||||||
|
"samples": 1,
|
||||||
|
"legacy_mean_crps": 0.218827,
|
||||||
|
"emos_mean_crps": 0.321502,
|
||||||
|
"legacy_mean_mae": 0.3,
|
||||||
|
"emos_mean_mae": 0.539971,
|
||||||
|
"legacy_bucket_hit_rate": 1.0,
|
||||||
|
"emos_bucket_hit_rate": 0.0
|
||||||
|
},
|
||||||
|
"hong kong": {
|
||||||
|
"samples": 3,
|
||||||
|
"legacy_mean_crps": 0.321946,
|
||||||
|
"emos_mean_crps": 0.419198,
|
||||||
|
"legacy_mean_mae": 0.27,
|
||||||
|
"emos_mean_mae": 0.673605,
|
||||||
|
"legacy_bucket_hit_rate": 1.0,
|
||||||
|
"emos_bucket_hit_rate": 0.666667
|
||||||
|
},
|
||||||
|
"istanbul": {
|
||||||
|
"samples": 3,
|
||||||
|
"legacy_mean_crps": 1.308328,
|
||||||
|
"emos_mean_crps": 1.231189,
|
||||||
|
"legacy_mean_mae": 1.38,
|
||||||
|
"emos_mean_mae": 1.211693,
|
||||||
|
"legacy_bucket_hit_rate": 0.666667,
|
||||||
|
"emos_bucket_hit_rate": 0.666667
|
||||||
|
},
|
||||||
|
"seoul": {
|
||||||
|
"samples": 1,
|
||||||
|
"legacy_mean_crps": 0.208763,
|
||||||
|
"emos_mean_crps": 2.708973,
|
||||||
|
"legacy_mean_mae": 0.3,
|
||||||
|
"emos_mean_mae": 3.02868,
|
||||||
|
"legacy_bucket_hit_rate": 1.0,
|
||||||
|
"emos_bucket_hit_rate": 0.0
|
||||||
|
},
|
||||||
|
"taipei": {
|
||||||
|
"samples": 2,
|
||||||
|
"legacy_mean_crps": 0.767971,
|
||||||
|
"emos_mean_crps": 1.205469,
|
||||||
|
"legacy_mean_mae": 1.195,
|
||||||
|
"emos_mean_mae": 1.937374,
|
||||||
|
"legacy_bucket_hit_rate": 0.0,
|
||||||
|
"emos_bucket_hit_rate": 0.0
|
||||||
|
},
|
||||||
|
"tokyo": {
|
||||||
|
"samples": 3,
|
||||||
|
"legacy_mean_crps": 1.129263,
|
||||||
|
"emos_mean_crps": 0.763363,
|
||||||
|
"legacy_mean_mae": 1.3,
|
||||||
|
"emos_mean_mae": 1.081641,
|
||||||
|
"legacy_bucket_hit_rate": 0.333333,
|
||||||
|
"emos_bucket_hit_rate": 0.333333
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,7 +7,6 @@ from src.analysis.settlement_rounding import apply_city_settlement
|
|||||||
from loguru import logger
|
from loguru import logger
|
||||||
from src.database.runtime_state import (
|
from src.database.runtime_state import (
|
||||||
DailyRecordRepository,
|
DailyRecordRepository,
|
||||||
STATE_STORAGE_DUAL,
|
|
||||||
STATE_STORAGE_SQLITE,
|
STATE_STORAGE_SQLITE,
|
||||||
TrainingFeatureRecordRepository,
|
TrainingFeatureRecordRepository,
|
||||||
TruthRecordRepository,
|
TruthRecordRepository,
|
||||||
@@ -79,7 +78,7 @@ def load_history(filepath):
|
|||||||
logger.error(f"Error loading daily records from sqlite, fallback to file: {e}")
|
logger.error(f"Error loading daily records from sqlite, fallback to file: {e}")
|
||||||
|
|
||||||
if not os.path.exists(filepath):
|
if not os.path.exists(filepath):
|
||||||
if mode == STATE_STORAGE_DUAL:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
try:
|
try:
|
||||||
data = _daily_record_repo.load_all()
|
data = _daily_record_repo.load_all()
|
||||||
_history_cache = data
|
_history_cache = data
|
||||||
@@ -113,13 +112,12 @@ def save_history(filepath, data):
|
|||||||
_history_cache = data
|
_history_cache = data
|
||||||
mode = get_state_storage_mode()
|
mode = get_state_storage_mode()
|
||||||
|
|
||||||
if mode in {STATE_STORAGE_DUAL, STATE_STORAGE_SQLITE}:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
try:
|
try:
|
||||||
_daily_record_repo.replace_all(data)
|
_daily_record_repo.replace_all(data)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error saving daily records to sqlite: {e}")
|
logger.error(f"Error saving daily records to sqlite: {e}")
|
||||||
if mode == STATE_STORAGE_SQLITE:
|
return
|
||||||
return
|
|
||||||
|
|
||||||
if mode == STATE_STORAGE_SQLITE:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
return
|
return
|
||||||
@@ -891,15 +889,14 @@ def update_daily_record(
|
|||||||
for d in old_dates:
|
for d in old_dates:
|
||||||
del data[city][d]
|
del data[city][d]
|
||||||
|
|
||||||
if mode in {STATE_STORAGE_DUAL, STATE_STORAGE_SQLITE}:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
try:
|
try:
|
||||||
_daily_record_repo.upsert_record(city_name, date_str, existing)
|
_daily_record_repo.upsert_record(city_name, date_str, existing)
|
||||||
cutoff = (datetime.now() - timedelta(days=14)).strftime("%Y-%m-%d")
|
cutoff = (datetime.now() - timedelta(days=14)).strftime("%Y-%m-%d")
|
||||||
_daily_record_repo.delete_older_than(cutoff)
|
_daily_record_repo.delete_older_than(cutoff)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Error upserting daily record to sqlite city={city_name} date={date_str}: {e}")
|
logger.error(f"Error upserting daily record to sqlite city={city_name} date={date_str}: {e}")
|
||||||
if mode == STATE_STORAGE_SQLITE:
|
raise
|
||||||
raise
|
|
||||||
|
|
||||||
if mode != STATE_STORAGE_SQLITE:
|
if mode != STATE_STORAGE_SQLITE:
|
||||||
save_history(history_file, data)
|
save_history(history_file, data)
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ from typing import Any, Dict, List, Optional
|
|||||||
|
|
||||||
from src.database.runtime_state import (
|
from src.database.runtime_state import (
|
||||||
ProbabilitySnapshotRepository,
|
ProbabilitySnapshotRepository,
|
||||||
STATE_STORAGE_DUAL,
|
|
||||||
STATE_STORAGE_SQLITE,
|
STATE_STORAGE_SQLITE,
|
||||||
TrainingFeatureRecordRepository,
|
TrainingFeatureRecordRepository,
|
||||||
get_state_storage_mode,
|
get_state_storage_mode,
|
||||||
@@ -105,7 +104,7 @@ def load_snapshot_rows_for_day(
|
|||||||
root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
root_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
path = archive_path or os.path.join(root_dir, "data", "probability_training_snapshots.jsonl")
|
path = archive_path or os.path.join(root_dir, "data", "probability_training_snapshots.jsonl")
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
if mode == STATE_STORAGE_DUAL:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
return _snapshot_repo.load_rows_by_city_date(city_key, date_key)
|
return _snapshot_repo.load_rows_by_city_date(city_key, date_key)
|
||||||
return []
|
return []
|
||||||
|
|
||||||
@@ -260,7 +259,7 @@ def append_probability_snapshot(
|
|||||||
return
|
return
|
||||||
|
|
||||||
mode = get_state_storage_mode()
|
mode = get_state_storage_mode()
|
||||||
if mode in {STATE_STORAGE_DUAL, STATE_STORAGE_SQLITE}:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
_snapshot_repo.append_snapshot(payload)
|
_snapshot_repo.append_snapshot(payload)
|
||||||
_training_feature_repo.upsert_record(
|
_training_feature_repo.upsert_record(
|
||||||
city_key,
|
city_key,
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import time
|
|||||||
from loguru import logger
|
from loguru import logger
|
||||||
from src.database.runtime_state import (
|
from src.database.runtime_state import (
|
||||||
OpenMeteoCacheRepository,
|
OpenMeteoCacheRepository,
|
||||||
STATE_STORAGE_DUAL,
|
|
||||||
STATE_STORAGE_SQLITE,
|
STATE_STORAGE_SQLITE,
|
||||||
get_state_storage_mode,
|
get_state_storage_mode,
|
||||||
)
|
)
|
||||||
@@ -77,7 +76,7 @@ class OpenMeteoCacheMixin:
|
|||||||
self._disk_cache_last_mtime = current_mtime
|
self._disk_cache_last_mtime = current_mtime
|
||||||
if loaded:
|
if loaded:
|
||||||
logger.info(f"✅ 从磁盘加载 Open-Meteo 缓存 {loaded} 条 ({self._disk_cache_path})")
|
logger.info(f"✅ 从磁盘加载 Open-Meteo 缓存 {loaded} 条 ({self._disk_cache_path})")
|
||||||
if mode == STATE_STORAGE_DUAL:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
try:
|
try:
|
||||||
_open_meteo_cache_repo.replace_payload(saved, self._disk_cache_max_age_sec)
|
_open_meteo_cache_repo.replace_payload(saved, self._disk_cache_max_age_sec)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
@@ -124,7 +123,7 @@ class OpenMeteoCacheMixin:
|
|||||||
"multi_model": multi_model_snapshot,
|
"multi_model": multi_model_snapshot,
|
||||||
"saved_at": time.time(),
|
"saved_at": time.time(),
|
||||||
}
|
}
|
||||||
if mode in {STATE_STORAGE_DUAL, STATE_STORAGE_SQLITE}:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
_open_meteo_cache_repo.replace_payload(payload, self._disk_cache_max_age_sec)
|
_open_meteo_cache_repo.replace_payload(payload, self._disk_cache_max_age_sec)
|
||||||
self._disk_cache_last_mtime = _open_meteo_cache_repo.latest_updated_at()
|
self._disk_cache_last_mtime = _open_meteo_cache_repo.latest_updated_at()
|
||||||
if mode != STATE_STORAGE_SQLITE:
|
if mode != STATE_STORAGE_SQLITE:
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ from loguru import logger
|
|||||||
|
|
||||||
from src.database.runtime_state import (
|
from src.database.runtime_state import (
|
||||||
OfficialIntradayObservationRepository,
|
OfficialIntradayObservationRepository,
|
||||||
STATE_STORAGE_DUAL,
|
|
||||||
STATE_STORAGE_SQLITE,
|
STATE_STORAGE_SQLITE,
|
||||||
get_state_storage_mode,
|
get_state_storage_mode,
|
||||||
)
|
)
|
||||||
@@ -183,7 +182,7 @@ class SettlementSourceMixin:
|
|||||||
date_str = local_dt.strftime("%Y-%m-%d")
|
date_str = local_dt.strftime("%Y-%m-%d")
|
||||||
time_str = local_dt.strftime("%H:%M")
|
time_str = local_dt.strftime("%H:%M")
|
||||||
mode = get_state_storage_mode()
|
mode = get_state_storage_mode()
|
||||||
if mode not in {STATE_STORAGE_DUAL, STATE_STORAGE_SQLITE}:
|
if mode != STATE_STORAGE_SQLITE:
|
||||||
return [{"time": time_str, "temp": round(float(current_temp), 1)}]
|
return [{"time": time_str, "temp": round(float(current_temp), 1)}]
|
||||||
|
|
||||||
lock = self._get_settlement_series_lock()
|
lock = self._get_settlement_series_lock()
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ from src.database.db_manager import DBManager
|
|||||||
STATE_STORAGE_FILE = "file"
|
STATE_STORAGE_FILE = "file"
|
||||||
STATE_STORAGE_DUAL = "dual"
|
STATE_STORAGE_DUAL = "dual"
|
||||||
STATE_STORAGE_SQLITE = "sqlite"
|
STATE_STORAGE_SQLITE = "sqlite"
|
||||||
|
DEFAULT_STATE_STORAGE_MODE = STATE_STORAGE_SQLITE
|
||||||
VALID_STATE_STORAGE_MODES = {
|
VALID_STATE_STORAGE_MODES = {
|
||||||
STATE_STORAGE_FILE,
|
STATE_STORAGE_FILE,
|
||||||
STATE_STORAGE_DUAL,
|
|
||||||
STATE_STORAGE_SQLITE,
|
STATE_STORAGE_SQLITE,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -26,12 +26,17 @@ _LOGGED_MODES: set[str] = set()
|
|||||||
|
|
||||||
|
|
||||||
def get_state_storage_mode() -> str:
|
def get_state_storage_mode() -> str:
|
||||||
raw = str(os.getenv("POLYWEATHER_STATE_STORAGE_MODE") or STATE_STORAGE_DUAL).strip().lower()
|
raw = str(os.getenv("POLYWEATHER_STATE_STORAGE_MODE") or DEFAULT_STATE_STORAGE_MODE).strip().lower()
|
||||||
|
if raw == STATE_STORAGE_DUAL:
|
||||||
|
logger.warning(
|
||||||
|
f"POLYWEATHER_STATE_STORAGE_MODE={STATE_STORAGE_DUAL!r} is deprecated, normalize to {STATE_STORAGE_SQLITE}"
|
||||||
|
)
|
||||||
|
raw = STATE_STORAGE_SQLITE
|
||||||
if raw not in VALID_STATE_STORAGE_MODES:
|
if raw not in VALID_STATE_STORAGE_MODES:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
f"invalid POLYWEATHER_STATE_STORAGE_MODE={raw!r}, fallback to {STATE_STORAGE_DUAL}"
|
f"invalid POLYWEATHER_STATE_STORAGE_MODE={raw!r}, fallback to {DEFAULT_STATE_STORAGE_MODE}"
|
||||||
)
|
)
|
||||||
raw = STATE_STORAGE_DUAL
|
raw = DEFAULT_STATE_STORAGE_MODE
|
||||||
if raw not in _LOGGED_MODES:
|
if raw not in _LOGGED_MODES:
|
||||||
logger.info(f"runtime state storage mode={raw}")
|
logger.info(f"runtime state storage mode={raw}")
|
||||||
_LOGGED_MODES.add(raw)
|
_LOGGED_MODES.add(raw)
|
||||||
|
|||||||
@@ -289,13 +289,14 @@ def build_training_samples(
|
|||||||
history_data: Optional[Dict[str, Any]] = None,
|
history_data: Optional[Dict[str, Any]] = None,
|
||||||
snapshot_index: Optional[Dict[Tuple[str, str], Dict[str, Any]]] = None,
|
snapshot_index: Optional[Dict[Tuple[str, str], Dict[str, Any]]] = None,
|
||||||
) -> List[Dict[str, Any]]:
|
) -> List[Dict[str, Any]]:
|
||||||
|
mode = get_state_storage_mode()
|
||||||
if isinstance(history_data, dict):
|
if isinstance(history_data, dict):
|
||||||
runtime_history = history_data
|
runtime_history = history_data
|
||||||
elif get_state_storage_mode() == STATE_STORAGE_SQLITE:
|
elif mode == STATE_STORAGE_SQLITE:
|
||||||
runtime_history = DailyRecordRepository().load_all()
|
runtime_history = DailyRecordRepository().load_all()
|
||||||
else:
|
else:
|
||||||
runtime_history = load_history(_history_file_path())
|
runtime_history = load_history(_history_file_path())
|
||||||
if get_state_storage_mode() == STATE_STORAGE_SQLITE:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
truth_history = TruthRecordRepository().load_all()
|
truth_history = TruthRecordRepository().load_all()
|
||||||
training_feature_history = TrainingFeatureRecordRepository().load_all()
|
training_feature_history = TrainingFeatureRecordRepository().load_all()
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ from typing import Any, Dict, List, Optional, Tuple
|
|||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
from src.database.runtime_state import (
|
from src.database.runtime_state import (
|
||||||
STATE_STORAGE_DUAL,
|
|
||||||
STATE_STORAGE_SQLITE,
|
STATE_STORAGE_SQLITE,
|
||||||
TelegramAlertStateRepository,
|
TelegramAlertStateRepository,
|
||||||
get_state_storage_mode,
|
get_state_storage_mode,
|
||||||
@@ -208,11 +207,6 @@ def _load_state(path: str) -> Dict[str, Any]:
|
|||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.error(f"failed to load telegram push state from sqlite: {exc}")
|
logger.error(f"failed to load telegram push state from sqlite: {exc}")
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
if mode == STATE_STORAGE_DUAL:
|
|
||||||
try:
|
|
||||||
return _telegram_state_repo.load_state()
|
|
||||||
except Exception:
|
|
||||||
return {"last_by_city": {}, "by_signature": {}}
|
|
||||||
return {"last_by_city": {}, "by_signature": {}}
|
return {"last_by_city": {}, "by_signature": {}}
|
||||||
try:
|
try:
|
||||||
with open(path, "r", encoding="utf-8") as fh:
|
with open(path, "r", encoding="utf-8") as fh:
|
||||||
@@ -228,7 +222,7 @@ def _load_state(path: str) -> Dict[str, Any]:
|
|||||||
|
|
||||||
def _save_state(path: str, state: Dict[str, Any]) -> None:
|
def _save_state(path: str, state: Dict[str, Any]) -> None:
|
||||||
mode = get_state_storage_mode()
|
mode = get_state_storage_mode()
|
||||||
if mode in {STATE_STORAGE_DUAL, STATE_STORAGE_SQLITE}:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
_telegram_state_repo.save_state(state)
|
_telegram_state_repo.save_state(state)
|
||||||
if mode == STATE_STORAGE_SQLITE:
|
if mode == STATE_STORAGE_SQLITE:
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user