Kenya Planting Date Engine — detects planting dates for farm polygons using Sentinel-2, Sentinel-1 SAR, and CHIRPS rainfall signals across multiple seasons and years.
# Kenya Planting Date Engine
Detects planting dates for all 547 farm polygons across **multiple seasons and years**,
outputting rich phenological profiles ready for a downstream crop identification pipeline.
## What it produces
For each farm × season (e.g. LR-2024, SR-2024, LR-2025, SR-2025):
| Field | Source | Description |
|-------|--------|-------------|
| `estimated_planting_date` | Ensemble | Weighted combination of 3 signals |
| `confidence` / `confidence_level` | Ensemble | 0–1 score + HIGH/MEDIUM/LOW/UNCERTAIN |
| `peak_ndvi` | Sentinel-2 | Max NDVI during season |
| `peak_date` | Sentinel-2 | Date of peak greenness |
| `senescence_date` | Sentinel-2 | When NDVI drops to 70% of peak |
| `season_length_days` | Sentinel-2 | Greenup → senescence (crop cycle) |
| `ndvi_integral` | Sentinel-2 | Area under NDVI curve (photosynthetic activity) |
| `ndvi_rise_rate` | Sentinel-2 | NDVI/day from planting to peak (growth rate) |
| `ndvi_at_harvest` | Sentinel-2 | NDVI 90 days post-planting |
| `total_rainfall_mm` | CHIRPS | Total seasonal rainfall |
| `vv_baseline` | Sentinel-1 | Pre-season SAR backscatter |
| `vv_at_peak_ndvi` | Sentinel-1 | SAR at crop maturity |
| `cross_pol_at_peak` | Sentinel-1 | Volume scattering at maturity |
| `ndvi_timeseries` | Sentinel-2 | Full clean NDVI/EVI/NDWI series |
| `vv_timeseries` | Sentinel-1 | Full VV/VH SAR series |
All of the above are included in `*_crop_pipeline_feed.json` — the primary
output for your crop identification pipeline.
## Project structure
```
kenya_planting_engine/
├── app/
│ ├── core/
│ │ ├── config.py # AEZ season calendar + settings
│ │ ├── models.py # Pydantic models
│ │ ├── pipeline.py # Single-polygon processor
│ │ └── exporter.py # GeoJSON / CSV / JSON outputs
│ ├── algorithms/
│ │ └── detector.py # Rainfall + NDVI + SAR signals + ensemble
│ └── data/
│ ├── gee_client.py # GEE authentication (service account)
│ ├── sentinel2.py # Se …