#!/usr/bin/env python3
"""跑完之后加的**描述性**诊断，不是新的检验，也不在预注册里。

目的只有一个：说清楚那个被检出的正向关联到底来自哪一层变异 ——
城市之间（哪座城市面对哪片海）还是城市内部（同一座城市旅游涨了、水质变没变）。
"""
from __future__ import annotations

import csv
import json
import math
import statistics
from pathlib import Path

CODE = Path(__file__).resolve().parent
WORK = CODE.parent

rows = [r for r in csv.DictReader((WORK / "data" / "panel.csv").open(encoding="utf-8"))
        if all(r[k] for k in ("water_good_pct", "tourism_visitors", "resident_pop",
                              "secondary_gdp"))]
by_city = {}
for r in rows:
    by_city.setdefault(r["city"], []).append(r)

out = {"_note": "跑完之后加的描述性诊断，不是预注册的检验，不产生任何 p 值。",
       "n_rows": len(rows), "cities": {}}
ys = [float(r["water_good_pct"]) for r in rows]
out["y_overall"] = {"min": min(ys), "max": max(ys), "sd": statistics.pstdev(ys),
                    "range_pp": max(ys) - min(ys)}
within_sd, city_means = [], []
for c, rs in sorted(by_city.items()):
    y = [float(r["water_good_pct"]) for r in rs]
    t = [float(r["tourism_visitors"]) for r in rs]
    entry = {"n_years": len(rs), "years": [int(r["year"]) for r in rs],
             "water_values": y, "water_within_sd": statistics.pstdev(y),
             "water_within_range_pp": max(y) - min(y),
             "visitors_values": t,
             "visitors_within_ratio_max_over_min": max(t) / min(t)}
    city_means.append(statistics.fmean(y))
    if len(rs) >= 2:
        within_sd.append(statistics.pstdev(y))
    out["cities"][c] = entry
out["between_city_sd_of_city_means"] = statistics.pstdev(city_means)
out["mean_within_city_sd_multi_year_cities_only"] = (
    statistics.fmean(within_sd) if within_sd else None)
out["reading"] = (
    "城市之间的差异远大于城市内部：城市均值的标准差 "
    f"{out['between_city_sd_of_city_means']:.2f} 个百分点，"
    f"而有多年数据的城市内部标准差平均只有 "
    f"{out['mean_within_city_sd_multi_year_cities_only']:.2f} 个百分点。"
    "同期这些城市的旅游人次在城市内部有成倍变化。也就是说，被检出的那个正向关联"
    "几乎完全来自城市之间的对比，不是来自任何一座城市自己旅游涨落时水质的变化。")
(WORK / "results" / "diagnostics.json").write_text(
    json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8")
print(json.dumps(out, ensure_ascii=False, indent=1))
