{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# QAZ.FARM: воспроизводимый старт анализа\n",
        "\n",
        "Ноутбук загружает публичный каталог и наборы QAZ.FARM, сверяет заявленные объёмы и показывает границы сопоставимости. Он использует только стандартную библиотеку Python. Условия повторного использования исходных данных определяет их поставщик."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "import json\n",
        "from pathlib import Path\n",
        "from urllib.request import urlopen\n",
        "\n",
        "BASE_URL = \"https://qaz.farm\"\n",
        "LOCAL_PUBLIC = Path(\"public\")\n",
        "\n",
        "def load_json(public_path):\n",
        "    local = LOCAL_PUBLIC / public_path.lstrip(\"/\")\n",
        "    if local.is_file():\n",
        "        return json.loads(local.read_text(encoding=\"utf-8\"))\n",
        "    with urlopen(BASE_URL + public_path, timeout=30) as response:\n",
        "        return json.load(response)\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "catalog = load_json(\"/data/data-assets.json\")\n",
        "comparison = load_json(\"/data/method-comparison.json\")\n",
        "assets = {item[\"id\"]: item for item in catalog[\"assets\"]}\n",
        "methods = {item[\"asset_id\"]: item for item in comparison[\"methods\"]}\n",
        "assert set(assets) == set(methods), \"Каталог и сравнение методик разошлись\"\n",
        "[(item[\"id\"], item[\"record_count\"], item[\"period\"]) for item in catalog[\"assets\"]]\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "def observed_count(asset_id):\n",
        "    asset = assets[asset_id]\n",
        "    payloads = [load_json(path) for path in asset[\"public_paths\"]]\n",
        "    if asset_id == \"historical-series\":\n",
        "        return sum(len(series[\"observations\"]) for series in payloads[0][\"series\"])\n",
        "    if asset_id == \"science-registry\":\n",
        "        return len(payloads[0][\"records\"])\n",
        "    if asset_id == \"un-comtrade-cereals\":\n",
        "        return sum(len(payload.get(\"observations\", [])) for payload in payloads)\n",
        "    if asset_id == \"water-season-2026\":\n",
        "        return len(payloads[0][\"limits\"]) + len(payloads[0][\"annual_water_use\"])\n",
        "    if asset_id == \"veterinary-bulletins-2026\":\n",
        "        return len(payloads[0][\"bulletins\"])\n",
        "    if asset_id == \"grain-storage-snapshots\":\n",
        "        return len(payloads[0][\"snapshots\"])\n",
        "    if asset_id == \"soilgrids-reference-points\":\n",
        "        return len(payloads[0][\"observations\"])\n",
        "    return len(payloads[0][\"observations\"])\n",
        "\n",
        "audit = []\n",
        "for asset_id, asset in assets.items():\n",
        "    actual = observed_count(asset_id)\n",
        "    audit.append({\"asset_id\": asset_id, \"declared\": asset[\"record_count\"], \"actual\": actual, \"ok\": actual == asset[\"record_count\"]})\n",
        "assert all(row[\"ok\"] for row in audit), audit\n",
        "audit\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {},
      "outputs": [],
      "source": [
        "analysis_passport = [\n",
        "    {\n",
        "        \"asset_id\": asset_id,\n",
        "        \"period\": assets[asset_id][\"period\"],\n",
        "        \"geography\": assets[asset_id][\"geography\"],\n",
        "        \"observation_unit\": method[\"observation_unit\"],\n",
        "        \"suitable_for\": method[\"suitable_for\"],\n",
        "        \"do_not_use_for\": method[\"do_not_use_for\"],\n",
        "    }\n",
        "    for asset_id, method in methods.items()\n",
        "]\n",
        "analysis_passport\n"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}
