# 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"
}