summaryrefslogtreecommitdiffstats
path: root/code/eval_depth_check.py
blob: 98dc1e457ec00145e76f39ebabb6140a20e3c978 (plain) (blame)
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
"""Does checking EFAS depth against the 30 m DEM help? Compared on every road piece in the AOIs
against the roads inside the observed 2021 extent (an incomplete reference: it misses water in
towns, so precision is a lower bound for both variants)."""
import numpy as np, pandas as pd, shapely

from paths import CACHE, OUTPUTS
from main import DATA
from risk_model import Area

THRESH = 0.3


def scores(flag, truth, length):
    tp, fp, fn = length[flag & truth].sum(), length[flag & ~truth].sum(), length[~flag & truth].sum()
    prec, rec = tp / max(tp + fp, 1), tp / max(tp + fn, 1)
    return dict(flagged_km=(tp + fp) / 1000, precision=prec, recall=rec, f1=2 * prec * rec / max(prec + rec, 1e-9))


if __name__ == "__main__":
    pieces = pd.DataFrame(pd.read_pickle(CACHE / "road_pieces.pkl"))
    rows = []
    for name, d in pieces.groupby("area"):
        folder = next(f for e in DATA.glob("ems_*") for f in e.glob(f"{name}_PRODUCT_*_vector"))
        area = Area(folder, rivers="cems")
        xy = shapely.get_coordinates(shapely.line_interpolate_point(d.geometry.values, 0.5, normalized=True))
        for rp in ("rp10", "rp100", "rp500"):
            for check in (False, True):
                rows.append(dict(area=name, rp=rp, dem_check=check, length=d.length_m.to_numpy(),
                                 truth=d.observed.to_numpy(bool), flag=area.depth(rp, xy, check) >= THRESH))
        print(name, flush=True)
        del area
    res = []
    for (rp, check), g in pd.DataFrame(rows).groupby(["rp", "dem_check"]):
        res.append(dict(rp=rp, dem_check=check, **scores(np.concatenate(g.flag.tolist()), np.concatenate(g.truth.tolist()),
                                                         np.concatenate(g.length.tolist()))))
    res = pd.DataFrame(res)
    (OUTPUTS / "eval").mkdir(parents=True, exist_ok=True)
    res.round(3).to_csv(OUTPUTS / "eval" / "depth_check.csv", index=False)
    print("\nRoad km flagged vs roads inside the observed 2021 extent")
    print(res.round(3).to_string(index=False))