{"id":50648856,"url":"https://github.com/EValentyuk/AgroNDVI","last_synced_at":"2026-06-24T12:00:31.840Z","repository":{"id":360586091,"uuid":"1250455587","full_name":"EValentyuk/AgroNDVI","owner":"EValentyuk","description":"Pet-проект: спутниковый мониторинг рисовых полей и прогноз урожайности через Sentinel-2 + LightGBM + Streamlit","archived":false,"fork":false,"pushed_at":"2026-05-27T04:07:00.000Z","size":21319,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-27T04:24:56.540Z","etag":null,"topics":["agriculture","geopandas","lightgbm","ml-portfolio","ndvi","precision-agriculture","python","rasterio","remote-sensing","rice","russia","sentinel-2","streamlit","time-series"],"latest_commit_sha":null,"homepage":"https://evalentyuk.github.io/AgroNDVI/","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EValentyuk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-26T16:42:11.000Z","updated_at":"2026-05-27T04:07:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/EValentyuk/AgroNDVI","commit_stats":null,"previous_names":["evalentyuk/agrondvi"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/EValentyuk/AgroNDVI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EValentyuk%2FAgroNDVI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EValentyuk%2FAgroNDVI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EValentyuk%2FAgroNDVI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EValentyuk%2FAgroNDVI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EValentyuk","download_url":"https://codeload.github.com/EValentyuk/AgroNDVI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EValentyuk%2FAgroNDVI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34731256,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agriculture","geopandas","lightgbm","ml-portfolio","ndvi","precision-agriculture","python","rasterio","remote-sensing","rice","russia","sentinel-2","streamlit","time-series"],"created_at":"2026-06-07T16:00:22.266Z","updated_at":"2026-06-24T12:00:31.833Z","avatar_url":"https://github.com/EValentyuk.png","language":"Jupyter Notebook","funding_links":[],"categories":["What's Inside"],"sub_categories":[],"readme":"# AgroNDVI\n\n[![Open in Streamlit](https://static.streamlit.io/badges/streamlit_badge_black_white.svg)](https://agrondvi.streamlit.app/)\n[![Docs site](https://img.shields.io/badge/docs-evalentyuk.github.io%2FAgroNDVI-222?logo=github)](https://evalentyuk.github.io/AgroNDVI/)\n[![Smoke Test](https://github.com/EValentyuk/AgroNDVI/actions/workflows/smoke-test.yml/badge.svg)](https://github.com/EValentyuk/AgroNDVI/actions/workflows/smoke-test.yml)\n\n[![Python](https://img.shields.io/badge/Python-3.13-3776AB?logo=python\u0026logoColor=white)](https://www.python.org/)\n[![LightGBM](https://img.shields.io/badge/LightGBM-4.6-7BB661)](https://lightgbm.readthedocs.io/)\n[![Streamlit](https://img.shields.io/badge/Streamlit-1.57-FF4B4B?logo=streamlit\u0026logoColor=white)](https://streamlit.io/)\n[![rasterio](https://img.shields.io/badge/rasterio-1.5-1e7a1e)](https://rasterio.readthedocs.io/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Last commit](https://img.shields.io/github/last-commit/EValentyuk/AgroNDVI)](https://github.com/EValentyuk/AgroNDVI/commits/main)\n[![Repo size](https://img.shields.io/github/repo-size/EValentyuk/AgroNDVI)](https://github.com/EValentyuk/AgroNDVI)\n\nПроект по спутниковому мониторингу полей и прогнозу урожайности.\n\n\u003e 🚀 **[Live demo: agrondvi.streamlit.app](https://agrondvi.streamlit.app/)** -- интерактивный UI на Streamlit Cloud, 24/7, без установки.\n\u003e 📄 **[Документация: evalentyuk.github.io/AgroNDVI](https://evalentyuk.github.io/AgroNDVI/)** -- сайт с навигацией, картой и C4-диаграммами.\n\n![NDVI 20 полей за сезон 2023-2024](docs/images/ndvi_animation.gif)\n\nСезонная динамика NDVI 20 рисовых чеков Темрюкского района за полный год: октябрь 2023 → сентябрь 2024, 44 кадра, 11 секунд. Видна классическая рисовая кривая: затопление чеков → всходы → пик в августе → жатва.\n\nПринимает координаты полей в Краснодарском крае, скачивает Sentinel-2 за сезон, считает NDVI, объединяет с погодой и историческими данными урожайности, выдаёт прогноз ц/га и подсвечивает аномальные поля. Streamlit-приложение с интерактивной картой.\n\n\u003e **Главный методологический сигнал.** На датасете 20 точек простая LinearRegression на одной фиче `ndvi_peak` побеждает LightGBM на 18 фичах: MAPE 2.95% vs 4.39%, R² 0.70 vs 0.32. Это включено в отчёт **как есть** -- демонстрация зрелого понимания bias-variance trade-off, а не подхода «лишь бы LightGBM запустить». Разбор в [docs/experiments/2026-05-26-lgb-baseline.md](docs/experiments/2026-05-26-lgb-baseline.md), полный отчёт для работодателя -- в [docs/portfolio-report.md](docs/portfolio-report.md).\n\n## Демо в одном окне\n\n![Карта NDVI с границами полей](docs/images/03_fields_overlay.png)\n\n20 рисовых чеков Темрюкского района Краснодарского края, наложенных на NDVI-карту от 3 июня 2024. Цвет от охристого (вода / голая земля) до тёмно-зелёного (густая растительность). NDVI каждого поля подписан на самом полигоне.\n\n## Что внутри\n\n- **Спутниковые снимки:** Sentinel-2 L2A, 10 м/px, каждые 5 дней. Скачиваются через AWS Element 84 STAC (бесплатно, без VPN, без регистрации; Copernicus заблокирован для РФ);\n- **NDVI:** классический индекс вегетации (B08 - B04) / (B08 + B04), усреднённый по границам полей;\n- **Time-series ML:** LightGBM + 4 baseline-модели на исторических данных, Leave-One-Out CV, прогноз урожайности с метрикой MAPE;\n- **Anomaly detection:** 3 независимых метода (pointwise z-score + IsolationForest + L2-distance), объединение через mean-rank;\n- **UI:** Streamlit + folium + plotly. Карта 20 полей раскрашена по предсказанной урожайности, top-K аномалий в красной рамке. По клику -- индивидуальная кривая NDVI в коридоре 20 полей, погода сезона, OSM-метаданные.\n\n## Ключевые цифры\n\n- **45 снимков** Sentinel-2 за полный сезон октябрь 2023 -- сентябрь 2024;\n- **20 рисовых чеков** Темрюкского района из OpenStreetMap, площадь 722-1488 га;\n- **900 точек** NDVI time-series (20 × 45), **98.9%** валидных после SCL-маски;\n- **NDVI амплитуда сезона 0.587** -- от затопления чеков (-0.03 в январе) до пика биомассы (0.56 в августе);\n- **MAPE 2.95%** -- лучший baseline (LinearRegression на одной фиче), LOO-CV;\n- **End-to-end 10 минут** на полный прогон pipeline.\n\nПолная сводка -- в [docs/metrics.md](docs/metrics.md).\n\n## Иллюстрации\n\n| ![SCL](docs/images/02_scl_classification.png) | ![NDVI tile](docs/images/01_ndvi_full_tile.png) |\n|:---:|:---:|\n| SCL Scene Classification (зелёное -- вегетация, синее -- вода, жёлтое -- голая земля) | NDVI всего tile 110×110 км после SCL-маски |\n\n| ![NDVI series](docs/images/04_ndvi_series.png) |\n|:---:|\n| Сезонная динамика NDVI по 20 полям, медиана + IQR. Видна классическая рисовая кривая. |\n\n| ![NDVI vs weather](docs/images/05_ndvi_vs_weather.png) |\n|:---:|\n| NDVI + температура + GDD/осадки на одной шкале. Зимний провал NDVI совпадает с минусовыми температурами. |\n\n| ![Model compare](docs/images/06_model_compare.png) | ![Feature importance](docs/images/08_feature_importance.png) |\n|:---:|:---:|\n| 5 моделей × LOO-CV: baseline линейная регрессия на одной фиче бьёт LightGBM. | Top-фичи LightGBM. Все weather имеют gain=0 (константа для 20 полей). |\n\n| ![Anomaly heatmap](docs/images/09_anomaly_heatmap.png) |\n|:---:|\n| Heatmap z-score: видно «когда именно» поля отклонялись от медианы. F004 сплошной красный (выше нормы), F005 сплошной синий (ниже). |\n\n| ![Anomaly top curves](docs/images/10_anomaly_top_curves.png) |\n|:---:|\n| Top-3 аномалии: F004 (чемпион), F005 (отстающий), F017 (сдвинутый сезон). |\n\n## Стек\n\n- Python 3.13, venv в `.venv/`;\n- **Геоданные:** `rasterio 1.5` + GDAL 3.12, `geopandas 1.1`, `shapely 2.1`, `pyproj 3.7`, `folium 0.20`;\n- **ML:** `lightgbm 4.6`, `scikit-learn 1.8`;\n- **UI:** `streamlit 1.57`, `streamlit-folium 0.27`, `plotly 6.7`;\n- **API клиенты:** `pystac-client`, `osm2geojson`, `requests`;\n- **Источники данных:** AWS Element 84 STAC, Open Meteo, NASA POWER, OpenStreetMap. Все бесплатно, доступны из РФ без VPN.\n\n## Запуск\n\n### 0. Окружение (один раз)\n\n```powershell\ncd c:\\Projects\\AgroNDVI\npython -m venv .venv\n.venv\\Scripts\\pip install -r requirements.txt\n```\n\n### 1. Запустить готовый UI (если артефакты уже собраны)\n\n```powershell\n.venv\\Scripts\\streamlit.exe run src\\streamlit_app.py\n```\n\nОткрывается http://localhost:8501.\n\n### 2. Полный прогон pipeline с нуля\n\n```powershell\n.\\run_pipeline.ps1\n```\n\nСкрипт по очереди вызывает все этапы (см. [run_pipeline.ps1](run_pipeline.ps1)). Полный прогон ~10 минут.\n\n### 3. Запустить отдельные этапы\n\n```powershell\n# 1. найти серию Sentinel-2 за год\n.venv\\Scripts\\python.exe -X utf8 src\\find_sentinel.py --series --tile 37TDK --from 2023-10-01 --to 2024-09-30 --max-cloud 20\n\n# 2. скачать границы полей из OSM\n.venv\\Scripts\\python.exe -X utf8 src\\fetch_osm_fields.py\n\n# 3. скачать погоду\n.venv\\Scripts\\python.exe -X utf8 src\\fetch_weather.py\n\n# 4. посчитать серию NDVI по полям (7-10 минут, 6 параллельных потоков)\n.venv\\Scripts\\python.exe -X utf8 src\\ndvi_series.py --workers 6\n\n# 5. построить фичи + синтетический таргет\n.venv\\Scripts\\python.exe -X utf8 src\\feature_engineering.py\n\n# 6. обучить LightGBM + baselines + LOO-CV\n.venv\\Scripts\\python.exe -X utf8 src\\train_lgb.py\n\n# 7. anomaly detection (3 метода)\n.venv\\Scripts\\python.exe -X utf8 src\\anomaly.py\n\n# 8. построить все визуализации\n.venv\\Scripts\\python.exe -X utf8 src\\plot_ndvi_series.py\n.venv\\Scripts\\python.exe -X utf8 src\\plot_weather_ndvi.py\n.venv\\Scripts\\python.exe -X utf8 src\\plot_model_results.py\n.venv\\Scripts\\python.exe -X utf8 src\\plot_anomaly.py\n\n# 9. UI\n.venv\\Scripts\\streamlit.exe run src\\streamlit_app.py\n```\n\n## Структура\n\n```\n.\n├── README.md                       -- этот файл\n├── requirements.txt                -- 70+ пакетов\n├── run_pipeline.ps1                -- end-to-end запуск\n├── AgroNDVI-results.md             -- технический лог по дням\n├── AgroNDVI-journal.md             -- параллельный лог простым языком\n├── CLAUDE.md / MEMORY.md           -- инструкции для Claude Code\n│\n├── src/                            -- 12 Python-модулей\n│   ├── find_sentinel.py            -- STAC search с retry\n│   ├── fetch_osm_fields.py         -- Overpass API\n│   ├── fetch_weather.py            -- Open Meteo + NASA POWER\n│   ├── explore_sentinel.py         -- чтение удалённого COG\n│   ├── ndvi.py                     -- NDVI на полном tile\n│   ├── ndvi_series.py              -- параллельная серия NDVI по окну\n│   ├── zonal_stats.py              -- усреднение NDVI по полям\n│   ├── feature_engineering.py      -- 18 фичей + синтетический yield\n│   ├── train_lgb.py                -- LightGBM + 4 baseline + LOO-CV\n│   ├── anomaly.py                  -- 3 метода детекции\n│   ├── plot_*.py                   -- 4 скрипта визуализации\n│   ├── streamlit_app.py            -- интерактивный UI\n│   └── smoke_test.py               -- проверка стека\n│\n├── notebooks/\n│   └── 02_ndvi_explore.ipynb       -- exploratory ноутбук\n│\n├── docs/\n│   ├── brief.md                    -- постановка задачи + глоссарий\n│   ├── architecture.md             -- C4-диаграммы Mermaid\n│   ├── metrics.md                  -- сводка метрик\n│   ├── portfolio-report.md         -- отчёт для работодателя\n│   ├── sentinel-download.md        -- инструкция по доступу к Sentinel-2\n│   ├── experiments/\n│   │   ├── 2026-05-26-lgb-baseline.md   -- разбор ML эксперимента\n│   │   └── 2026-05-26-anomaly.md        -- разбор anomaly detection\n│   └── images/                     -- 10 скриншотов для README\n│\n├── data/                           -- НЕ в git (gitignored)\n│   ├── catalog/                    -- STAC JSON\n│   ├── fields/                     -- GeoJSON полей (попадает в git как исключение)\n│   ├── weather/                    -- CSV погоды\n│   ├── processed/                  -- NDVI series, features, anomaly\n│   └── preview/                    -- 15 PNG + 3 HTML\n│\n└── models/                         -- НЕ в git\n    └── lgb_yield.pkl               -- финальная модель LightGBM\n```\n\n## Документация\n\n- [docs/brief.md](docs/brief.md) -- постановка задачи, план на 7-10 дней, риски, глоссарий из 17 терминов;\n- [docs/architecture.md](docs/architecture.md) -- C4-диаграммы (Context + Container + Component) через Mermaid;\n- [docs/metrics.md](docs/metrics.md) -- сводная таблица метрик: данные / NDVI / модель / аномалии / время;\n- [docs/portfolio-report.md](docs/portfolio-report.md) -- отчёт для работодателя с привязкой к навыкам системного анализа;\n- [docs/sentinel-download.md](docs/sentinel-download.md) -- доступ к Sentinel-2 через AWS Element 84 STAC;\n- [docs/experiments/2026-05-26-lgb-baseline.md](docs/experiments/2026-05-26-lgb-baseline.md) -- эксперимент ML: 5 моделей, LOO-CV, feature importance;\n- [docs/experiments/2026-05-26-anomaly.md](docs/experiments/2026-05-26-anomaly.md) -- эксперимент anomaly: 3 метода, согласованность.\n\n## Связанные проекты\n\n- **MiniProctor** (https://github.com/EValentyuk/MiniProctor) -- проект на CV + Streamlit. Метрики precision/recall/F1, fine-tune YOLO, история про доменный сдвиг.\n\n## Статус\n\nВ разработке. Старт: 2026-05-25. Финализация и публикация: 2026-05-26 (день 10 плана).\n\n## Лицензия и контакты\n\n- Автор: Валентюк Евгений Григорьевич, e.valentyuk@yandex.ru;\n- GitHub: https://github.com/EValentyuk;\n- Код -- MIT, документация -- CC-BY 4.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEValentyuk%2FAgroNDVI","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FEValentyuk%2FAgroNDVI","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEValentyuk%2FAgroNDVI/lists"}