# SAFE
Stratified Assessment of Forecasts over Earth
[Preprint](https://n-masi.github.io/papers/safe_masi.pdf) and [Website](https://n-masi.github.io/safe)
### Installation
`pip install safe-earth`
To build from source instead:
```
# get repo
git clone git@github.com:N-Masi/safe.git
# create dev environment
conda create -n safe.env
conda activate safe.env
pip install --file requirements.txt
conda install --channel conda-forge pygmt plotly typing_extensions
```
<!--
If you are an authorized contributor and want to upload a new version to pypi:
```
python3 -m build
python3 -m twine upload dist/*
```
-->
<!-- When running directly from the source repository, run files with `python -m safe_earth.<directory>.<file_without_extension>` while in the `src/` subdirectory. -->
### Example
An example of using the package to collect metrics on 6 AIWP models across the territory, subregion, and income
attributes is availabe in `demos/wb2_240x121.py`. It assesses the models using 2020 ERA5 data.
### Data Notes
To unify the coordinate system across all integrated data sources, latitude ranges [-90, 90] with index 0 at -90, and longitude [-180, 180) but with index 0 at 0 and a wraparound from 180 to -180 in the middle. This is because metadata sourced from pygeoboundaries_geolab follows this coordinate system, and it is easiest to bring tabular data into conformance.
### Testing
Run `pytest` in the of the source repository directory.
Raw data
{
"_id": null,
"home_page": null,
"name": "safe-earth",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "climate, earth, fairness, machine learning, stratification, weather",
"author": null,
"author_email": "Nick Masi <nicholas_masi@alumni.brown.edu>, Daniel Cai <daniel_cai@brown.edu>, Randall Balestriero <randall_balestriero@brown.edu>",
"download_url": "https://files.pythonhosted.org/packages/7c/5b/6c9662687013c2ecc8d2905b3402b1b2ea4aa2410693078d0b60ec05ae4f/safe_earth-0.0.17.tar.gz",
"platform": null,
"description": "# SAFE\nStratified Assessment of Forecasts over Earth\n\n[Preprint](https://n-masi.github.io/papers/safe_masi.pdf) and [Website](https://n-masi.github.io/safe)\n\n### Installation\n\n`pip install safe-earth`\n\nTo build from source instead:\n\n```\n# get repo\ngit clone git@github.com:N-Masi/safe.git\n\n# create dev environment\nconda create -n safe.env\nconda activate safe.env\npip install --file requirements.txt\nconda install --channel conda-forge pygmt plotly typing_extensions\n```\n<!-- \nIf you are an authorized contributor and want to upload a new version to pypi: \n\n```\npython3 -m build\npython3 -m twine upload dist/*\n```\n-->\n\n<!-- When running directly from the source repository, run files with `python -m safe_earth.<directory>.<file_without_extension>` while in the `src/` subdirectory. -->\n\n### Example\n\nAn example of using the package to collect metrics on 6 AIWP models across the territory, subregion, and income \nattributes is availabe in `demos/wb2_240x121.py`. It assesses the models using 2020 ERA5 data.\n\n### Data Notes\n\nTo unify the coordinate system across all integrated data sources, latitude ranges [-90, 90] with index 0 at -90, and longitude [-180, 180) but with index 0 at 0 and a wraparound from 180 to -180 in the middle. This is because metadata sourced from pygeoboundaries_geolab follows this coordinate system, and it is easiest to bring tabular data into conformance.\n\n### Testing\n\nRun `pytest` in the of the source repository directory.\n",
"bugtrack_url": null,
"license": null,
"summary": "Stratified Assessments of Forecasts over Earth",
"version": "0.0.17",
"project_urls": {
"Homepage": "https://n-masi.github.io/safe/",
"Repository": "https://github.com/n-masi/safe"
},
"split_keywords": [
"climate",
" earth",
" fairness",
" machine learning",
" stratification",
" weather"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "4e8a72a54ccc314c0bbb42dfe2140d9d6e8ee8a9390978d59a2a97ebf3b08a33",
"md5": "eb12f05f41f639cc285dd430af46c844",
"sha256": "5676fb37aba31767608fdf5e75aa00c1f817c440192fe0609e18a8d0a7edd468"
},
"downloads": -1,
"filename": "safe_earth-0.0.17-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "eb12f05f41f639cc285dd430af46c844",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": null,
"size": 26666891,
"upload_time": "2025-09-03T05:19:11",
"upload_time_iso_8601": "2025-09-03T05:19:11.378973Z",
"url": "https://files.pythonhosted.org/packages/4e/8a/72a54ccc314c0bbb42dfe2140d9d6e8ee8a9390978d59a2a97ebf3b08a33/safe_earth-0.0.17-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7c5b6c9662687013c2ecc8d2905b3402b1b2ea4aa2410693078d0b60ec05ae4f",
"md5": "fc220cb841fe71f876a68a5095080488",
"sha256": "e1181724cc5fed1d5a61d17f210b13e1d56fea3310ddf3e2fbe22ad84870a88f"
},
"downloads": -1,
"filename": "safe_earth-0.0.17.tar.gz",
"has_sig": false,
"md5_digest": "fc220cb841fe71f876a68a5095080488",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 26620253,
"upload_time": "2025-09-03T05:19:14",
"upload_time_iso_8601": "2025-09-03T05:19:14.095693Z",
"url": "https://files.pythonhosted.org/packages/7c/5b/6c9662687013c2ecc8d2905b3402b1b2ea4aa2410693078d0b60ec05ae4f/safe_earth-0.0.17.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-03 05:19:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "n-masi",
"github_project": "safe",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "numpy",
"specs": []
},
{
"name": "matplotlib",
"specs": []
},
{
"name": "pandas",
"specs": []
},
{
"name": "shapely",
"specs": []
},
{
"name": "tqdm",
"specs": []
},
{
"name": "lightning",
"specs": []
},
{
"name": "scikit-learn",
"specs": []
},
{
"name": "pyyaml",
"specs": []
},
{
"name": "torchvision",
"specs": []
},
{
"name": "torchaudio",
"specs": []
},
{
"name": "basemap",
"specs": []
},
{
"name": "xarray",
"specs": []
},
{
"name": "zarr",
"specs": []
},
{
"name": "kagglehub",
"specs": []
},
{
"name": "huggingface_hub",
"specs": []
},
{
"name": "geotiff",
"specs": []
},
{
"name": "cartopy",
"specs": []
},
{
"name": "geopy",
"specs": []
},
{
"name": "neuraloperator",
"specs": []
},
{
"name": "einops",
"specs": []
},
{
"name": "wandb",
"specs": []
},
{
"name": "kaggle",
"specs": []
},
{
"name": "gcsfs",
"specs": []
},
{
"name": "fsspec",
"specs": []
},
{
"name": "cfgrib",
"specs": []
},
{
"name": "cdsapi",
"specs": []
},
{
"name": "xesmf",
"specs": []
},
{
"name": "torch",
"specs": []
},
{
"name": "optuna",
"specs": []
},
{
"name": "dotenv",
"specs": []
},
{
"name": "rasterio",
"specs": []
},
{
"name": "geopandas",
"specs": []
},
{
"name": "pytest",
"specs": []
},
{
"name": "pytest-cov",
"specs": []
},
{
"name": "geojson",
"specs": []
},
{
"name": "requests_cache",
"specs": []
},
{
"name": "earthengine-api",
"specs": []
},
{
"name": "pygeoboundaries-geolab",
"specs": []
},
{
"name": "maskedtensor-nightly",
"specs": []
},
{
"name": "pytorch_lightning",
"specs": []
},
{
"name": "rich",
"specs": []
},
{
"name": "hydra-core",
"specs": []
},
{
"name": "wandb",
"specs": []
}
],
"lcname": "safe-earth"
}