Files
next-tjwater-server/scripts/generate_fengxian_water_quality_points.py
T

83 lines
2.8 KiB
Python

"""Generate one reproducible Fengxian water-quality monitoring-point dataset."""
from __future__ import annotations
import argparse
import json
from pathlib import Path
import sys
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from app.native.wndb.core.connection import project_connection
from app.services.sensor_placement import optimize_sensor_placement_by_sensitivity
def find_existing_run(
project: str,
*,
sensor_count: int,
min_diameter: int,
) -> dict[str, object] | None:
with project_connection(project) as conn:
return conn.execute(
"""
SELECT run.run_id::text AS run_id, run.name, run.created_at,
result.payload
FROM analysis.runs AS run
JOIN LATERAL (
SELECT stored.payload
FROM analysis.results AS stored
WHERE stored.run_id = run.run_id
AND stored.result_type = 'sensor_placement'
ORDER BY stored.created_at DESC, stored.result_id DESC
LIMIT 1
) AS result ON true
WHERE run.run_type = 'sensor_placement'
AND run.status = 'completed'
AND result.payload->>'sensor_type' = 'water_quality'
AND result.payload->>'method' = 'sensitivity'
AND (result.payload->>'sensor_number')::integer = %s
AND (result.payload->>'minimum_diameter')::integer = %s
ORDER BY run.created_at DESC, run.run_id DESC
LIMIT 1
""",
(sensor_count, min_diameter),
).fetchone()
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--project", default="tjwater_v2")
parser.add_argument("--sensor-count", type=int, default=50)
parser.add_argument("--min-diameter", type=int, default=100)
parser.add_argument("--run-name", default="奉贤水质监测点灵敏度分析(50点)")
parser.add_argument("--created-by", default="tjwater")
parser.add_argument("--force", action="store_true")
args = parser.parse_args()
existing = find_existing_run(
args.project,
sensor_count=args.sensor_count,
min_diameter=args.min_diameter,
)
if existing is not None and not args.force:
print(json.dumps(dict(existing), ensure_ascii=False, default=str, indent=2))
return
created = optimize_sensor_placement_by_sensitivity(
project_code=args.project,
run_name=args.run_name,
sensor_count=args.sensor_count,
min_diameter=args.min_diameter,
created_by=args.created_by,
sensor_type="water_quality",
)
print(json.dumps(created, ensure_ascii=False, default=str, indent=2))
if __name__ == "__main__":
main()