aidmind


Nameaidmind JSON
Version 1.0.1 PyPI version JSON
download
home_pagehttps://github.com/yourorg/aidmind
SummaryUnsupervised machine learning for humanitarian needs assessment and visualization
upload_time2025-11-02 09:59:55
maintainerNone
docs_urlNone
authorAidMind Team
requires_python>=3.8
licenseNone
keywords humanitarian needs assessment machine learning clustering geospatial visualization aid ngo international development
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # AidMind

**Unsupervised machine learning for humanitarian needs assessment at ANY geographic level**

AidMind is a production-ready Python tool that enables humanitarian data analysts to quickly identify areas with the highest need for aid using unsupervised machine learning. Works with **provinces, districts, villages, refugee camps, neighborhoods, or any custom geographic units**. It automatically clusters geographic units, ranks them by need level, and generates interactive choropleth maps with discrete color-coded need levels.

**Fully generalized**: Works with any CSV structure and any GeoJSON boundaries.

---

## Features

- **Works at ANY geographic level**: Provinces, districts, villages, refugee camps, neighborhoods, or any custom zones
- **Completely generalized**: Works with ANY CSV structure and ANY column names
- **Easy to use**: Single function call with dataset path
- **Flexible inputs**: Works with any numeric indicators (any column names accepted)
- **Custom boundaries**: Use your own GeoJSON for villages or custom units
- **Automatic preprocessing**: Handles missing values, duplicates, and name variations
- **Intelligent clustering**: Uses KMeans to identify need patterns across indicators
- **Geographic visualization**: Generates interactive HTML maps with 4 discrete need levels (high, medium, low, lowest)
- **Online or offline**: Use GeoBoundaries or custom GeoJSON files
- **International ready**: Works with any country, any admin level (ADM1, ADM2, ADM3, custom)
- **CSV export**: Outputs structured data with need scores, ranks, and levels
- **Professional logging**: Transparent processing with diagnostic information

---

## Installation

### Option 1: Pip install (recommended)

```bash
pip install aidmind
```

### Option 2: From source

```bash
git clone https://github.com/yourorg/aidmind.git
cd aidmind
pip install -r requirements.txt
pip install -e .
```

### Requirements

- Python 3.8+
- pandas >= 2.0
- numpy >= 1.24
- scikit-learn >= 1.3
- folium >= 0.15
- requests >= 2.31
- pycountry >= 22.3.5
- branca >= 0.7
- shapely >= 2.0

---

## Quick Start

### Province-level (with GeoBoundaries)

```python
from aidmind import analyze_needs

# Analyze provinces
output = analyze_needs("provinces.csv", "Afghanistan", admin_level="ADM1")
print(f"Map saved to: {output}")
```

### District-level (with GeoBoundaries)

```python
# Analyze districts
output = analyze_needs(
    "districts.csv",
    "Afghanistan",
    admin_level="ADM2",
    admin_col="district"
)
```

### Village-level (with custom boundaries)

```python
# Analyze villages using your own GeoJSON
output = analyze_needs(
    "villages.csv",
    local_geojson="village_boundaries.geojson",
    admin_col="village_name"
)
```

### Any custom geographic unit

```python
# Works with refugee camps, neighborhoods, health zones, etc.
output = analyze_needs(
    "refugee_camps.csv",
    local_geojson="camp_boundaries.geojson",
    admin_col="camp_name",
    fixed_thresholds=(0.25, 0.50, 0.75)  # Optional: fixed thresholds
)
```

### Command line

```bash
# Province-level
python -m aidmind provinces.csv "Afghanistan" --admin-level ADM1

# District-level
python -m aidmind districts.csv "Kenya" --admin-level ADM2 --admin-col district

# Village-level with custom boundaries
python -m aidmind villages.csv --geojson villages.geojson --admin-col village_name
```

**See [USAGE_EXAMPLES.md](USAGE_EXAMPLES.md) for complete documentation with 10+ examples.**

---

## Data Requirements

### Required

- **One geographic unit column**: Any column with location names (province, district, village, camp, zone, etc.)
- **At least one numeric indicator**: Any metric columns with numeric values

### Supported formats

- **CSV files** with UTF-8 encoding
- **ANY column names**: Tool auto-detects geographic column and uses all numeric columns
- **GeoJSON boundaries**: Either from GeoBoundaries or your own custom file

### Example: Province-level

```csv
province,health_index,education_index,income_index,food_security,water_access
Kabul,0.75,0.80,0.70,0.85,0.78
Kandahar,0.45,0.40,0.50,0.35,0.44
Herat,0.60,0.65,0.55,0.60,0.63
```

### Example: Village-level

```csv
village_name,health_access,school_access,water_quality,food_availability
Qala-e-Fatullah,0.30,0.25,0.40,0.35
Deh-e-Bagh,0.45,0.40,0.55,0.50
Karez-e-Mir,0.25,0.20,0.35,0.30
```

### Example: Refugee camps

```csv
camp_name,shelter,water,sanitation,food,health
Camp Dadaab 1,0.40,0.35,0.30,0.45,0.50
Camp Kakuma,0.55,0.50,0.45,0.60,0.65
Camp Nyarugusu,0.30,0.25,0.20,0.35,0.40
```

### Handling duplicates

If you have multiple records per unit (e.g., `Kabul_1`, `Kabul_2`), the tool automatically:
- Strips trailing numeric suffixes
- Aggregates by averaging indicators

---

## How It Works

### 1. **Preprocessing**
   - Auto-detects admin column or uses specified `admin_col`
   - Aggregates duplicate admin records by averaging
   - Imputes missing numeric values with median
   - Standardizes all indicators (zero mean, unit variance)

### 2. **Need Assessment**
   - Computes composite need score (mean of standardized indicators)
   - Applies KMeans clustering (3-5 clusters depending on data size)
   - Ranks clusters by mean need score

### 3. **Name Harmonization**
   - Normalizes admin names (lowercase, remove special characters)
   - Applies fuzzy matching to align with GeoBoundaries names
   - Logs match rate and coverage improvements

### 4. **Visualization**
   - Fetches admin boundaries from GeoBoundaries (or uses local file)
   - Assigns discrete color levels based on quartiles or fixed thresholds:
     - **High** (red-700): Top 25% need scores
     - **Medium** (red-400): 50th-75th percentile
     - **Low** (green-300): 25th-50th percentile
     - **Lowest** (green-600): Bottom 25%
   - Generates interactive Folium map with tooltips

### 5. **Output**
   - HTML map: `output/needs_map_<ISO3>.html`
   - CSV scores: `output/needs_scores_<ISO3>.csv`

---

## Outputs

### Interactive HTML Map

- Choropleth with 4 discrete color levels
- Hover tooltips showing: Province, Need Score, Need Rank, Level
- Legend with color key
- Highlight on hover

### CSV Export

Example `needs_scores_AFG.csv`:

```csv
admin1,need_score,need_rank,cluster,need_level
Kabul,0.142,3,2,lowest
Kandahar,0.856,0,0,high
Herat,0.487,2,1,medium
```

---

## Advanced Usage

### Fixed thresholds for cross-country comparison

```python
# Use consistent cutoffs across all countries
output = analyze_needs(
    "country1.csv",
    "Afghanistan",
    fixed_thresholds=(0.25, 0.50, 0.75)
)
```

### Offline mode with local boundaries

```python
# No internet required after initial download
output = analyze_needs(
    "data.csv",
    "Kenya",
    local_geojson="boundaries/kenya_adm1.geojson"
)
```

### ADM2 (district-level) analysis

```python
output = analyze_needs(
    "district_data.csv",
    "Ethiopia",
    admin_level="ADM2",
    admin_col="district"
)
```

---

## Troubleshooting

### Low match rate warning

**Problem**: `WARNING: Low admin name match rate: 45%`

**Solution**:
- Ensure admin names in your dataset match official names in GeoBoundaries
- Check for typos, spelling variations, or extra characters
- Use official admin names from [GeoBoundaries](https://www.geoboundaries.org/)
- Or provide a local GeoJSON with matching name properties

### No numeric columns found

**Problem**: `ValueError: No numeric feature columns found`

**Solution**:
- Ensure at least one column contains numeric values
- Check for non-numeric characters in indicator columns
- Remove or fix text values in numeric columns

### Admin column not detected

**Problem**: `ValueError: Could not detect an admin name column`

**Solution**:
- Rename your admin column to: `province`, `admin1`, `region`, or `state`
- Or specify it explicitly: `admin_col="your_column_name"`

### Empty or very small dataset

**Problem**: `WARNING: Dataset has only 2 rows`

**Solution**:
- AidMind requires at least 3 rows for clustering
- For reliable results, use datasets with 10+ admin units

---

## API Reference

### `analyze_needs()`

```python
def analyze_needs(
    dataset_path: str,
    country_name: Optional[str] = None,
    output_html_path: Optional[str] = None,
    *,
    admin_level: Optional[str] = None,
    admin_col: Optional[str] = None,
    local_geojson: Optional[str] = None,
    fixed_thresholds: Optional[Tuple[float, float, float]] = None,
) -> str
```

**Parameters**:
- `dataset_path` (str): Path to CSV file with geographic units and indicators
- `country_name` (str, optional): Country name (e.g., "Afghanistan", "Kenya"). Required only if using GeoBoundaries. Can be None if providing `local_geojson`
- `output_html_path` (str, optional): Custom output path for HTML
- `admin_level` (str, optional): Admin level ("ADM1", "ADM2", "ADM3", or any custom). Only used with GeoBoundaries
- `admin_col` (str, optional): Name of geographic unit column (auto-detected if None)
- `local_geojson` (str, optional): Path to local GeoJSON boundaries. Use this for villages or custom units
- `fixed_thresholds` (tuple, optional): (q25, q50, q75) for color levels

**Returns**:
- `str`: Path to generated HTML file

**Raises**:
- `FileNotFoundError`: If dataset or local_geojson not found
- `ValueError`: If invalid inputs, empty dataset, or both country_name and local_geojson missing

**Examples**:
```python
# Province-level with GeoBoundaries
analyze_needs("provinces.csv", "Afghanistan", admin_level="ADM1")

# District-level with GeoBoundaries
analyze_needs("districts.csv", "Kenya", admin_level="ADM2")

# Village-level with custom boundaries
analyze_needs("villages.csv", local_geojson="villages.geojson")

# Custom zones
analyze_needs("camps.csv", local_geojson="camps.geojson", admin_col="camp_name")
```

---

## Use Cases

### Humanitarian Organizations

- **Rapid needs assessment**: Identify priority areas for intervention
- **Resource allocation**: Visualize where aid is most needed
- **Monitoring & evaluation**: Track changes in need levels over time
- **Reporting**: Generate maps and data exports for donors

### Example Organizations

- UN agencies (UNHCR, UNICEF, WFP)
- International NGOs (MSF, Oxfam, Save the Children)
- National disaster management agencies
- Research institutions studying humanitarian crises

---

## Best Practices

### Data Quality

1. **Use official admin names** from GeoBoundaries or national sources
2. **Include multiple indicators** (3-5+) for robust assessment
3. **Check for outliers** and data quality issues before analysis
4. **Document data sources** and collection methodology

### Interpretation

1. **Need scores are relative** within the dataset (0-1 scale)
2. **Clustering is unsupervised**: No ground truth labels used
3. **Combine with qualitative data** for complete picture
4. **Validate results** with local experts and stakeholders

### Production Deployment

1. **Use fixed thresholds** for consistent cross-country comparison
2. **Cache boundaries locally** for offline or restricted environments
3. **Version control datasets** and track changes over time
4. **Automate workflows** with CI/CD pipelines

---

## Examples

See `examples/` directory for:
- `basic_usage.ipynb`: Step-by-step tutorial
- `multi_country.py`: Batch processing multiple countries
- `custom_config.py`: Advanced configuration options

---

## Contributing

We welcome contributions! Please:
1. Fork the repository
2. Create a feature branch
3. Add tests for new functionality
4. Submit a pull request

See `CONTRIBUTING.md` for detailed guidelines.

---

## License

MIT License - see [LICENSE](LICENSE) file for details.

---

## Citation

If you use AidMind in your research or reports, please cite:

```
AidMind: Unsupervised Machine Learning for Humanitarian Needs Assessment
Version 1.0.0
https://github.com/yourorg/aidmind
```

---

## Support

- **Issues**: [GitHub Issues](https://github.com/yourorg/aidmind/issues)
- **Discussions**: [GitHub Discussions](https://github.com/yourorg/aidmind/discussions)
- **Email**: support@aidmind.org

---

## Acknowledgments

- **GeoBoundaries**: For providing open administrative boundary data
- **Humanitarian Data Exchange**: For inspiring accessible data tools
- **Open-source community**: For the amazing libraries this tool builds on

---

## Changelog

See [CHANGELOG.md](CHANGELOG.md) for version history and updates.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/yourorg/aidmind",
    "name": "aidmind",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "humanitarian, needs assessment, machine learning, clustering, geospatial, visualization, aid, NGO, international development",
    "author": "AidMind Team",
    "author_email": "support@aidmind.org",
    "download_url": "https://files.pythonhosted.org/packages/d7/0b/5047a0d98bdd2b93c9d7deb92ea30770b19164856bd4bb65c794221a212e/aidmind-1.0.1.tar.gz",
    "platform": null,
    "description": "# AidMind\n\n**Unsupervised machine learning for humanitarian needs assessment at ANY geographic level**\n\nAidMind is a production-ready Python tool that enables humanitarian data analysts to quickly identify areas with the highest need for aid using unsupervised machine learning. Works with **provinces, districts, villages, refugee camps, neighborhoods, or any custom geographic units**. It automatically clusters geographic units, ranks them by need level, and generates interactive choropleth maps with discrete color-coded need levels.\n\n**Fully generalized**: Works with any CSV structure and any GeoJSON boundaries.\n\n---\n\n## Features\n\n- **Works at ANY geographic level**: Provinces, districts, villages, refugee camps, neighborhoods, or any custom zones\n- **Completely generalized**: Works with ANY CSV structure and ANY column names\n- **Easy to use**: Single function call with dataset path\n- **Flexible inputs**: Works with any numeric indicators (any column names accepted)\n- **Custom boundaries**: Use your own GeoJSON for villages or custom units\n- **Automatic preprocessing**: Handles missing values, duplicates, and name variations\n- **Intelligent clustering**: Uses KMeans to identify need patterns across indicators\n- **Geographic visualization**: Generates interactive HTML maps with 4 discrete need levels (high, medium, low, lowest)\n- **Online or offline**: Use GeoBoundaries or custom GeoJSON files\n- **International ready**: Works with any country, any admin level (ADM1, ADM2, ADM3, custom)\n- **CSV export**: Outputs structured data with need scores, ranks, and levels\n- **Professional logging**: Transparent processing with diagnostic information\n\n---\n\n## Installation\n\n### Option 1: Pip install (recommended)\n\n```bash\npip install aidmind\n```\n\n### Option 2: From source\n\n```bash\ngit clone https://github.com/yourorg/aidmind.git\ncd aidmind\npip install -r requirements.txt\npip install -e .\n```\n\n### Requirements\n\n- Python 3.8+\n- pandas >= 2.0\n- numpy >= 1.24\n- scikit-learn >= 1.3\n- folium >= 0.15\n- requests >= 2.31\n- pycountry >= 22.3.5\n- branca >= 0.7\n- shapely >= 2.0\n\n---\n\n## Quick Start\n\n### Province-level (with GeoBoundaries)\n\n```python\nfrom aidmind import analyze_needs\n\n# Analyze provinces\noutput = analyze_needs(\"provinces.csv\", \"Afghanistan\", admin_level=\"ADM1\")\nprint(f\"Map saved to: {output}\")\n```\n\n### District-level (with GeoBoundaries)\n\n```python\n# Analyze districts\noutput = analyze_needs(\n    \"districts.csv\",\n    \"Afghanistan\",\n    admin_level=\"ADM2\",\n    admin_col=\"district\"\n)\n```\n\n### Village-level (with custom boundaries)\n\n```python\n# Analyze villages using your own GeoJSON\noutput = analyze_needs(\n    \"villages.csv\",\n    local_geojson=\"village_boundaries.geojson\",\n    admin_col=\"village_name\"\n)\n```\n\n### Any custom geographic unit\n\n```python\n# Works with refugee camps, neighborhoods, health zones, etc.\noutput = analyze_needs(\n    \"refugee_camps.csv\",\n    local_geojson=\"camp_boundaries.geojson\",\n    admin_col=\"camp_name\",\n    fixed_thresholds=(0.25, 0.50, 0.75)  # Optional: fixed thresholds\n)\n```\n\n### Command line\n\n```bash\n# Province-level\npython -m aidmind provinces.csv \"Afghanistan\" --admin-level ADM1\n\n# District-level\npython -m aidmind districts.csv \"Kenya\" --admin-level ADM2 --admin-col district\n\n# Village-level with custom boundaries\npython -m aidmind villages.csv --geojson villages.geojson --admin-col village_name\n```\n\n**See [USAGE_EXAMPLES.md](USAGE_EXAMPLES.md) for complete documentation with 10+ examples.**\n\n---\n\n## Data Requirements\n\n### Required\n\n- **One geographic unit column**: Any column with location names (province, district, village, camp, zone, etc.)\n- **At least one numeric indicator**: Any metric columns with numeric values\n\n### Supported formats\n\n- **CSV files** with UTF-8 encoding\n- **ANY column names**: Tool auto-detects geographic column and uses all numeric columns\n- **GeoJSON boundaries**: Either from GeoBoundaries or your own custom file\n\n### Example: Province-level\n\n```csv\nprovince,health_index,education_index,income_index,food_security,water_access\nKabul,0.75,0.80,0.70,0.85,0.78\nKandahar,0.45,0.40,0.50,0.35,0.44\nHerat,0.60,0.65,0.55,0.60,0.63\n```\n\n### Example: Village-level\n\n```csv\nvillage_name,health_access,school_access,water_quality,food_availability\nQala-e-Fatullah,0.30,0.25,0.40,0.35\nDeh-e-Bagh,0.45,0.40,0.55,0.50\nKarez-e-Mir,0.25,0.20,0.35,0.30\n```\n\n### Example: Refugee camps\n\n```csv\ncamp_name,shelter,water,sanitation,food,health\nCamp Dadaab 1,0.40,0.35,0.30,0.45,0.50\nCamp Kakuma,0.55,0.50,0.45,0.60,0.65\nCamp Nyarugusu,0.30,0.25,0.20,0.35,0.40\n```\n\n### Handling duplicates\n\nIf you have multiple records per unit (e.g., `Kabul_1`, `Kabul_2`), the tool automatically:\n- Strips trailing numeric suffixes\n- Aggregates by averaging indicators\n\n---\n\n## How It Works\n\n### 1. **Preprocessing**\n   - Auto-detects admin column or uses specified `admin_col`\n   - Aggregates duplicate admin records by averaging\n   - Imputes missing numeric values with median\n   - Standardizes all indicators (zero mean, unit variance)\n\n### 2. **Need Assessment**\n   - Computes composite need score (mean of standardized indicators)\n   - Applies KMeans clustering (3-5 clusters depending on data size)\n   - Ranks clusters by mean need score\n\n### 3. **Name Harmonization**\n   - Normalizes admin names (lowercase, remove special characters)\n   - Applies fuzzy matching to align with GeoBoundaries names\n   - Logs match rate and coverage improvements\n\n### 4. **Visualization**\n   - Fetches admin boundaries from GeoBoundaries (or uses local file)\n   - Assigns discrete color levels based on quartiles or fixed thresholds:\n     - **High** (red-700): Top 25% need scores\n     - **Medium** (red-400): 50th-75th percentile\n     - **Low** (green-300): 25th-50th percentile\n     - **Lowest** (green-600): Bottom 25%\n   - Generates interactive Folium map with tooltips\n\n### 5. **Output**\n   - HTML map: `output/needs_map_<ISO3>.html`\n   - CSV scores: `output/needs_scores_<ISO3>.csv`\n\n---\n\n## Outputs\n\n### Interactive HTML Map\n\n- Choropleth with 4 discrete color levels\n- Hover tooltips showing: Province, Need Score, Need Rank, Level\n- Legend with color key\n- Highlight on hover\n\n### CSV Export\n\nExample `needs_scores_AFG.csv`:\n\n```csv\nadmin1,need_score,need_rank,cluster,need_level\nKabul,0.142,3,2,lowest\nKandahar,0.856,0,0,high\nHerat,0.487,2,1,medium\n```\n\n---\n\n## Advanced Usage\n\n### Fixed thresholds for cross-country comparison\n\n```python\n# Use consistent cutoffs across all countries\noutput = analyze_needs(\n    \"country1.csv\",\n    \"Afghanistan\",\n    fixed_thresholds=(0.25, 0.50, 0.75)\n)\n```\n\n### Offline mode with local boundaries\n\n```python\n# No internet required after initial download\noutput = analyze_needs(\n    \"data.csv\",\n    \"Kenya\",\n    local_geojson=\"boundaries/kenya_adm1.geojson\"\n)\n```\n\n### ADM2 (district-level) analysis\n\n```python\noutput = analyze_needs(\n    \"district_data.csv\",\n    \"Ethiopia\",\n    admin_level=\"ADM2\",\n    admin_col=\"district\"\n)\n```\n\n---\n\n## Troubleshooting\n\n### Low match rate warning\n\n**Problem**: `WARNING: Low admin name match rate: 45%`\n\n**Solution**:\n- Ensure admin names in your dataset match official names in GeoBoundaries\n- Check for typos, spelling variations, or extra characters\n- Use official admin names from [GeoBoundaries](https://www.geoboundaries.org/)\n- Or provide a local GeoJSON with matching name properties\n\n### No numeric columns found\n\n**Problem**: `ValueError: No numeric feature columns found`\n\n**Solution**:\n- Ensure at least one column contains numeric values\n- Check for non-numeric characters in indicator columns\n- Remove or fix text values in numeric columns\n\n### Admin column not detected\n\n**Problem**: `ValueError: Could not detect an admin name column`\n\n**Solution**:\n- Rename your admin column to: `province`, `admin1`, `region`, or `state`\n- Or specify it explicitly: `admin_col=\"your_column_name\"`\n\n### Empty or very small dataset\n\n**Problem**: `WARNING: Dataset has only 2 rows`\n\n**Solution**:\n- AidMind requires at least 3 rows for clustering\n- For reliable results, use datasets with 10+ admin units\n\n---\n\n## API Reference\n\n### `analyze_needs()`\n\n```python\ndef analyze_needs(\n    dataset_path: str,\n    country_name: Optional[str] = None,\n    output_html_path: Optional[str] = None,\n    *,\n    admin_level: Optional[str] = None,\n    admin_col: Optional[str] = None,\n    local_geojson: Optional[str] = None,\n    fixed_thresholds: Optional[Tuple[float, float, float]] = None,\n) -> str\n```\n\n**Parameters**:\n- `dataset_path` (str): Path to CSV file with geographic units and indicators\n- `country_name` (str, optional): Country name (e.g., \"Afghanistan\", \"Kenya\"). Required only if using GeoBoundaries. Can be None if providing `local_geojson`\n- `output_html_path` (str, optional): Custom output path for HTML\n- `admin_level` (str, optional): Admin level (\"ADM1\", \"ADM2\", \"ADM3\", or any custom). Only used with GeoBoundaries\n- `admin_col` (str, optional): Name of geographic unit column (auto-detected if None)\n- `local_geojson` (str, optional): Path to local GeoJSON boundaries. Use this for villages or custom units\n- `fixed_thresholds` (tuple, optional): (q25, q50, q75) for color levels\n\n**Returns**:\n- `str`: Path to generated HTML file\n\n**Raises**:\n- `FileNotFoundError`: If dataset or local_geojson not found\n- `ValueError`: If invalid inputs, empty dataset, or both country_name and local_geojson missing\n\n**Examples**:\n```python\n# Province-level with GeoBoundaries\nanalyze_needs(\"provinces.csv\", \"Afghanistan\", admin_level=\"ADM1\")\n\n# District-level with GeoBoundaries\nanalyze_needs(\"districts.csv\", \"Kenya\", admin_level=\"ADM2\")\n\n# Village-level with custom boundaries\nanalyze_needs(\"villages.csv\", local_geojson=\"villages.geojson\")\n\n# Custom zones\nanalyze_needs(\"camps.csv\", local_geojson=\"camps.geojson\", admin_col=\"camp_name\")\n```\n\n---\n\n## Use Cases\n\n### Humanitarian Organizations\n\n- **Rapid needs assessment**: Identify priority areas for intervention\n- **Resource allocation**: Visualize where aid is most needed\n- **Monitoring & evaluation**: Track changes in need levels over time\n- **Reporting**: Generate maps and data exports for donors\n\n### Example Organizations\n\n- UN agencies (UNHCR, UNICEF, WFP)\n- International NGOs (MSF, Oxfam, Save the Children)\n- National disaster management agencies\n- Research institutions studying humanitarian crises\n\n---\n\n## Best Practices\n\n### Data Quality\n\n1. **Use official admin names** from GeoBoundaries or national sources\n2. **Include multiple indicators** (3-5+) for robust assessment\n3. **Check for outliers** and data quality issues before analysis\n4. **Document data sources** and collection methodology\n\n### Interpretation\n\n1. **Need scores are relative** within the dataset (0-1 scale)\n2. **Clustering is unsupervised**: No ground truth labels used\n3. **Combine with qualitative data** for complete picture\n4. **Validate results** with local experts and stakeholders\n\n### Production Deployment\n\n1. **Use fixed thresholds** for consistent cross-country comparison\n2. **Cache boundaries locally** for offline or restricted environments\n3. **Version control datasets** and track changes over time\n4. **Automate workflows** with CI/CD pipelines\n\n---\n\n## Examples\n\nSee `examples/` directory for:\n- `basic_usage.ipynb`: Step-by-step tutorial\n- `multi_country.py`: Batch processing multiple countries\n- `custom_config.py`: Advanced configuration options\n\n---\n\n## Contributing\n\nWe welcome contributions! Please:\n1. Fork the repository\n2. Create a feature branch\n3. Add tests for new functionality\n4. Submit a pull request\n\nSee `CONTRIBUTING.md` for detailed guidelines.\n\n---\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n---\n\n## Citation\n\nIf you use AidMind in your research or reports, please cite:\n\n```\nAidMind: Unsupervised Machine Learning for Humanitarian Needs Assessment\nVersion 1.0.0\nhttps://github.com/yourorg/aidmind\n```\n\n---\n\n## Support\n\n- **Issues**: [GitHub Issues](https://github.com/yourorg/aidmind/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/yourorg/aidmind/discussions)\n- **Email**: support@aidmind.org\n\n---\n\n## Acknowledgments\n\n- **GeoBoundaries**: For providing open administrative boundary data\n- **Humanitarian Data Exchange**: For inspiring accessible data tools\n- **Open-source community**: For the amazing libraries this tool builds on\n\n---\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for version history and updates.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Unsupervised machine learning for humanitarian needs assessment and visualization",
    "version": "1.0.1",
    "project_urls": {
        "Bug Tracker": "https://github.com/yourorg/aidmind/issues",
        "Documentation": "https://github.com/yourorg/aidmind#readme",
        "Homepage": "https://github.com/yourorg/aidmind",
        "Source Code": "https://github.com/yourorg/aidmind"
    },
    "split_keywords": [
        "humanitarian",
        " needs assessment",
        " machine learning",
        " clustering",
        " geospatial",
        " visualization",
        " aid",
        " ngo",
        " international development"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e8918da1116d2b842ab8e5753aef0b335a6205ade278f5f64a5cbbf90a6a8b8f",
                "md5": "852a6ef3d6e1bcb07aac1fada1a13ae8",
                "sha256": "a59f5b16290aab7d565c4760d0f0b03cdffeaaf5ac52c34eead4385defa096f4"
            },
            "downloads": -1,
            "filename": "aidmind-1.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "852a6ef3d6e1bcb07aac1fada1a13ae8",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 15987,
            "upload_time": "2025-11-02T09:59:54",
            "upload_time_iso_8601": "2025-11-02T09:59:54.345572Z",
            "url": "https://files.pythonhosted.org/packages/e8/91/8da1116d2b842ab8e5753aef0b335a6205ade278f5f64a5cbbf90a6a8b8f/aidmind-1.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "d70b5047a0d98bdd2b93c9d7deb92ea30770b19164856bd4bb65c794221a212e",
                "md5": "8c1a9c1f260dc77345a1d28063b7fe7b",
                "sha256": "79e6e1405150c56ff5488a66b937c599d467c42798d0bd217b09ec6bfc392005"
            },
            "downloads": -1,
            "filename": "aidmind-1.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "8c1a9c1f260dc77345a1d28063b7fe7b",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 20433,
            "upload_time": "2025-11-02T09:59:55",
            "upload_time_iso_8601": "2025-11-02T09:59:55.915278Z",
            "url": "https://files.pythonhosted.org/packages/d7/0b/5047a0d98bdd2b93c9d7deb92ea30770b19164856bd4bb65c794221a212e/aidmind-1.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-11-02 09:59:55",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourorg",
    "github_project": "aidmind",
    "github_not_found": true,
    "lcname": "aidmind"
}
        
Elapsed time: 2.29822s