{"id":314701,"name":"StationBench","description":"A Python library for benchmarking weather forecasts against weather station data. It provides tools to calculate metrics, visualize results, and compare different forecast models.","url":"https://github.com/juaai/stationbench","last_synced_at":"2026-04-08T03:30:35.359Z","repository":{"id":272622260,"uuid":"914418039","full_name":"juaAI/stationbench","owner":"juaAI","description":"Benchmarking of weather forecasts based on station observations","archived":false,"fork":false,"pushed_at":"2025-07-01T11:06:23.000Z","size":691713,"stargazers_count":86,"open_issues_count":4,"forks_count":4,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-23T09:04:39.212Z","etag":null,"topics":["benchmarking","forecasting","weather"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/stationbench/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juaAI.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-09T15:00:48.000Z","updated_at":"2026-03-13T13:07:10.000Z","dependencies_parsed_at":"2025-01-15T17:35:45.194Z","dependency_job_id":"bbc2f8b6-771b-4732-b23b-576f2709f9aa","html_url":"https://github.com/juaAI/stationbench","commit_stats":null,"previous_names":["juaai/stationbench"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/juaAI/stationbench","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaAI%2Fstationbench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaAI%2Fstationbench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaAI%2Fstationbench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaAI%2Fstationbench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juaAI","download_url":"https://codeload.github.com/juaAI/stationbench/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaAI%2Fstationbench/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31126512,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-28T20:32:38.821Z","status":"ssl_error","status_checked_at":"2026-03-28T20:24:19.814Z","response_time":79,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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"}},"owner":{"login":"juaAI","name":"Jua","uuid":"77738808","kind":"organization","description":"next generation environmental insights platform","email":null,"website":"jua.ai","location":"Germany","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/77738808?v=4","repositories_count":2,"last_synced_at":"2023-07-06T16:35:15.792Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/juaAI","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-07-06T16:35:16.058Z","updated_at":"2023-07-06T16:35:16.058Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juaAI","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juaAI/repositories"},"packages":[],"commits":{"id":9751497,"full_name":"juaai/stationbench","default_branch":"main","total_commits":39,"total_committers":5,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":7.8,"dds":0.4871794871794872,"past_year_total_commits":2,"past_year_total_committers":2,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":1.0,"past_year_dds":0.5,"last_synced_at":"2026-03-28T23:01:42.502Z","last_synced_commit":"ebe376214b29938667270aebb0bf728f67a8eaef","created_at":"2025-04-20T00:18:59.042Z","updated_at":"2026-03-28T23:01:22.858Z","committers":[{"name":"leoniewgnr","email":"42536262+leoniewgnr","login":"leoniewgnr","count":20},{"name":"Andreas Schlueter","email":"andreas.schlueter@jua.ai","login":"aschl","count":16},{"name":"kevinjuaai","email":"120418359+kevinjuaai","login":"kevinjuaai","count":1},{"name":"Niall Siegenheim","email":"niall.siegenheim@gmail.com","login":"niasie","count":1},{"name":"Alexander Jakob Dautel","email":"howtodowtle","login":"howtodowtle","count":1}],"past_year_committers":[{"name":"kevinjuaai","email":"120418359+kevinjuaai","login":"kevinjuaai","count":1},{"name":"Niall Siegenheim","email":"niall.siegenheim@gmail.com","login":"niasie","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaai%2Fstationbench/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-03-31T00:00:13.296Z","repositories_count":6205853,"commits_count":927721320,"contributors_count":35814326,"owners_count":1143204,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"juaai/stationbench","html_url":"https://github.com/juaai/stationbench","last_synced_at":"2026-03-22T20:00:48.304Z","status":"error","issues_count":15,"pull_requests_count":54,"avg_time_to_close_issue":2528493.4545454546,"avg_time_to_close_pull_request":161289.2857142857,"issues_closed_count":11,"pull_requests_closed_count":49,"pull_request_authors_count":6,"issue_authors_count":7,"avg_comments_per_issue":0.13333333333333333,"avg_comments_per_pull_request":0.35185185185185186,"merged_pull_requests_count":49,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":5,"past_year_avg_time_to_close_issue":5034628.5,"past_year_avg_time_to_close_pull_request":2776197.5,"past_year_issues_closed_count":2,"past_year_pull_requests_closed_count":2,"past_year_pull_request_authors_count":3,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":0.5,"past_year_avg_comments_per_pull_request":0.6,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":2,"created_at":"2025-04-20T00:19:02.275Z","updated_at":"2026-03-22T20:00:48.304Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaai%2Fstationbench","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/juaai%2Fstationbench/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":7,"CONTRIBUTOR":5,"COLLABORATOR":3},"pull_request_author_associations_count":{"CONTRIBUTOR":50,"NONE":4},"issue_authors":{"roansong":4,"leoniewgnr":3,"deepweather":3,"aschl":2,"mrshll":1,"manmeet3591":1,"kevinjuaai":1},"pull_request_authors":{"leoniewgnr":34,"aschl":13,"howtodowtle":2,"kevinjuaai":2,"niasie":2,"martibosch":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-03-26T00:00:54.173Z","repositories_count":13935866,"issues_count":34662903,"pull_requests_count":113356105,"authors_count":11210164,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":3,"COLLABORATOR":1},"past_year_pull_request_author_associations_count":{"NONE":3,"CONTRIBUTOR":2},"past_year_issue_authors":{"deepweather":1,"kevinjuaai":1,"manmeet3591":1,"mrshll":1},"past_year_pull_request_authors":{"kevinjuaai":2,"niasie":2,"martibosch":1},"maintainers":[{"login":"deepweather","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/deepweather"}],"active_maintainers":[{"login":"deepweather","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/deepweather"}]},"events":{"total":{"ReleaseEvent":3,"DeleteEvent":24,"PullRequestEvent":38,"ForkEvent":3,"IssuesEvent":18,"WatchEvent":69,"IssueCommentEvent":10,"PublicEvent":1,"PushEvent":75,"PullRequestReviewEvent":64,"PullRequestReviewCommentEvent":42,"CreateEvent":22},"last_year":{"DeleteEvent":7,"PullRequestEvent":2,"ForkEvent":3,"IssuesEvent":2,"WatchEvent":65,"IssueCommentEvent":2,"PushEvent":11,"PullRequestReviewEvent":1,"CreateEvent":2}},"keywords":["benchmarking","forecasting","weather"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/lint.yml","sha":null,"kind":"manifest","created_at":"2025-01-15T17:35:10.900Z","updated_at":"2025-01-15T17:35:10.900Z","repository_link":"https://github.com/juaAI/stationbench/blob/main/.github/workflows/lint.yml","dependencies":[{"id":21487221936,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":21487221981,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":21487221982,"package_name":"snok/install-poetry","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/tests.yml","sha":null,"kind":"manifest","created_at":"2025-01-15T17:35:12.394Z","updated_at":"2025-01-15T17:35:12.394Z","repository_link":"https://github.com/juaAI/stationbench/blob/main/.github/workflows/tests.yml","dependencies":[{"id":21487222265,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":21487222266,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":21487222267,"package_name":"snok/install-poetry","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"poetry.lock","sha":null,"kind":"lockfile","created_at":"2025-01-15T17:35:12.740Z","updated_at":"2025-01-15T17:35:12.740Z","repository_link":"https://github.com/juaAI/stationbench/blob/main/poetry.lock","dependencies":[{"id":21487222294,"package_name":"aiohappyeyeballs","ecosystem":"pypi","requirements":"2.4.4","direct":false,"kind":"runtime","optional":false},{"id":21487222295,"package_name":"aiohttp","ecosystem":"pypi","requirements":"3.11.11","direct":false,"kind":"runtime","optional":false},{"id":21487222296,"package_name":"aiosignal","ecosystem":"pypi","requirements":"1.3.2","direct":false,"kind":"runtime","optional":false},{"id":21487222297,"package_name":"annotated-types","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":21487222298,"package_name":"appnope","ecosystem":"pypi","requirements":"0.1.4","direct":false,"kind":"runtime","optional":false},{"id":21487222299,"package_name":"asciitree","ecosystem":"pypi","requirements":"0.3.3","direct":false,"kind":"runtime","optional":false},{"id":21487222385,"package_name":"asttokens","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487222427,"package_name":"attrs","ecosystem":"pypi","requirements":"24.3.0","direct":false,"kind":"runtime","optional":false},{"id":21487222429,"package_name":"build","ecosystem":"pypi","requirements":"1.2.2.post1","direct":false,"kind":"runtime","optional":false},{"id":21487222430,"package_name":"cachecontrol","ecosystem":"pypi","requirements":"0.14.2","direct":false,"kind":"runtime","optional":false},{"id":21487222492,"package_name":"cachetools","ecosystem":"pypi","requirements":"5.5.0","direct":false,"kind":"runtime","optional":false},{"id":21487222493,"package_name":"certifi","ecosystem":"pypi","requirements":"2024.12.14","direct":false,"kind":"runtime","optional":false},{"id":21487222494,"package_name":"cffi","ecosystem":"pypi","requirements":"1.17.1","direct":false,"kind":"runtime","optional":false},{"id":21487222548,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.4.1","direct":false,"kind":"runtime","optional":false},{"id":21487222582,"package_name":"cleo","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":21487222664,"package_name":"click","ecosystem":"pypi","requirements":"8.1.8","direct":false,"kind":"runtime","optional":false},{"id":21487222689,"package_name":"cloudpickle","ecosystem":"pypi","requirements":"3.1.0","direct":false,"kind":"runtime","optional":false},{"id":21487222692,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":21487222714,"package_name":"comm","ecosystem":"pypi","requirements":"0.2.2","direct":false,"kind":"runtime","optional":false},{"id":21487222726,"package_name":"coverage","ecosystem":"pypi","requirements":"7.6.10","direct":false,"kind":"runtime","optional":false},{"id":21487222727,"package_name":"crashtest","ecosystem":"pypi","requirements":"0.4.1","direct":false,"kind":"runtime","optional":false},{"id":21487222863,"package_name":"cryptography","ecosystem":"pypi","requirements":"44.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487222865,"package_name":"dask","ecosystem":"pypi","requirements":"2024.12.1","direct":false,"kind":"runtime","optional":false},{"id":21487222985,"package_name":"debugpy","ecosystem":"pypi","requirements":"1.8.11","direct":false,"kind":"runtime","optional":false},{"id":21487223037,"package_name":"decorator","ecosystem":"pypi","requirements":"5.1.1","direct":false,"kind":"runtime","optional":false},{"id":21487223104,"package_name":"distlib","ecosystem":"pypi","requirements":"0.3.9","direct":false,"kind":"runtime","optional":false},{"id":21487223148,"package_name":"distributed","ecosystem":"pypi","requirements":"2024.12.1","direct":false,"kind":"runtime","optional":false},{"id":21487223311,"package_name":"docker-pycreds","ecosystem":"pypi","requirements":"0.4.0","direct":false,"kind":"runtime","optional":false},{"id":21487223422,"package_name":"dulwich","ecosystem":"pypi","requirements":"0.21.7","direct":false,"kind":"runtime","optional":false},{"id":21487223671,"package_name":"executing","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":21487223672,"package_name":"fasteners","ecosystem":"pypi","requirements":"0.19","direct":false,"kind":"runtime","optional":false},{"id":21487223740,"package_name":"fastjsonschema","ecosystem":"pypi","requirements":"2.21.1","direct":false,"kind":"runtime","optional":false},{"id":21487223741,"package_name":"filelock","ecosystem":"pypi","requirements":"3.16.1","direct":false,"kind":"runtime","optional":false},{"id":21487223764,"package_name":"frozenlist","ecosystem":"pypi","requirements":"1.5.0","direct":false,"kind":"runtime","optional":false},{"id":21487223765,"package_name":"fsspec","ecosystem":"pypi","requirements":"2024.12.0","direct":false,"kind":"runtime","optional":false},{"id":21487223782,"package_name":"gcsfs","ecosystem":"pypi","requirements":"2024.12.0","direct":false,"kind":"runtime","optional":false},{"id":21487223875,"package_name":"gitdb","ecosystem":"pypi","requirements":"4.0.12","direct":false,"kind":"runtime","optional":false},{"id":21487223876,"package_name":"gitpython","ecosystem":"pypi","requirements":"3.1.44","direct":false,"kind":"runtime","optional":false},{"id":21487223885,"package_name":"google-api-core","ecosystem":"pypi","requirements":"2.24.0","direct":false,"kind":"runtime","optional":false},{"id":21487223886,"package_name":"google-auth","ecosystem":"pypi","requirements":"2.37.0","direct":false,"kind":"runtime","optional":false},{"id":21487223887,"package_name":"google-auth-oauthlib","ecosystem":"pypi","requirements":"1.2.1","direct":false,"kind":"runtime","optional":false},{"id":21487223888,"package_name":"google-cloud-core","ecosystem":"pypi","requirements":"2.4.1","direct":false,"kind":"runtime","optional":false},{"id":21487223889,"package_name":"google-cloud-storage","ecosystem":"pypi","requirements":"2.19.0","direct":false,"kind":"runtime","optional":false},{"id":21487223890,"package_name":"google-crc32c","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":21487223891,"package_name":"google-resumable-media","ecosystem":"pypi","requirements":"2.7.2","direct":false,"kind":"runtime","optional":false},{"id":21487223892,"package_name":"googleapis-common-protos","ecosystem":"pypi","requirements":"1.66.0","direct":false,"kind":"runtime","optional":false},{"id":21487223893,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"runtime","optional":false},{"id":21487224019,"package_name":"importlib-metadata","ecosystem":"pypi","requirements":"8.5.0","direct":false,"kind":"runtime","optional":false},{"id":21487224020,"package_name":"iniconfig","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487224021,"package_name":"installer","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":21487224022,"package_name":"ipykernel","ecosystem":"pypi","requirements":"6.29.5","direct":false,"kind":"runtime","optional":false},{"id":21487224155,"package_name":"ipython","ecosystem":"pypi","requirements":"8.31.0","direct":false,"kind":"runtime","optional":false},{"id":21487224156,"package_name":"jaraco-classes","ecosystem":"pypi","requirements":"3.4.0","direct":false,"kind":"runtime","optional":false},{"id":21487224283,"package_name":"jedi","ecosystem":"pypi","requirements":"0.19.2","direct":false,"kind":"runtime","optional":false},{"id":21487224284,"package_name":"jeepney","ecosystem":"pypi","requirements":"0.8.0","direct":false,"kind":"runtime","optional":false},{"id":21487224285,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.5","direct":false,"kind":"runtime","optional":false},{"id":21487224347,"package_name":"jsonschema","ecosystem":"pypi","requirements":"4.23.0","direct":false,"kind":"runtime","optional":false},{"id":21487224372,"package_name":"jsonschema-specifications","ecosystem":"pypi","requirements":"2024.10.1","direct":false,"kind":"runtime","optional":false},{"id":21487224373,"package_name":"jupyter-client","ecosystem":"pypi","requirements":"8.6.3","direct":false,"kind":"runtime","optional":false},{"id":21487224473,"package_name":"jupyter-core","ecosystem":"pypi","requirements":"5.7.2","direct":false,"kind":"runtime","optional":false},{"id":21487224541,"package_name":"keyring","ecosystem":"pypi","requirements":"24.3.1","direct":false,"kind":"runtime","optional":false},{"id":21487224542,"package_name":"locket","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487224680,"package_name":"markupsafe","ecosystem":"pypi","requirements":"3.0.2","direct":false,"kind":"runtime","optional":false},{"id":21487224716,"package_name":"matplotlib-inline","ecosystem":"pypi","requirements":"0.1.7","direct":false,"kind":"runtime","optional":false},{"id":21487224717,"package_name":"more-itertools","ecosystem":"pypi","requirements":"10.5.0","direct":false,"kind":"runtime","optional":false},{"id":21487224780,"package_name":"msgpack","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":21487224781,"package_name":"multidict","ecosystem":"pypi","requirements":"6.1.0","direct":false,"kind":"runtime","optional":false},{"id":21487224782,"package_name":"nbformat","ecosystem":"pypi","requirements":"5.10.4","direct":false,"kind":"runtime","optional":false},{"id":21487224783,"package_name":"nest-asyncio","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":21487224817,"package_name":"numcodecs","ecosystem":"pypi","requirements":"0.13.1","direct":false,"kind":"runtime","optional":false},{"id":21487224936,"package_name":"numpy","ecosystem":"pypi","requirements":"2.2.1","direct":false,"kind":"runtime","optional":false},{"id":21487224937,"package_name":"oauthlib","ecosystem":"pypi","requirements":"3.2.2","direct":false,"kind":"runtime","optional":false},{"id":21487224938,"package_name":"packaging","ecosystem":"pypi","requirements":"24.2","direct":false,"kind":"runtime","optional":false},{"id":21487224963,"package_name":"pandas","ecosystem":"pypi","requirements":"2.2.3","direct":false,"kind":"runtime","optional":false},{"id":21487225058,"package_name":"parso","ecosystem":"pypi","requirements":"0.8.4","direct":false,"kind":"runtime","optional":false},{"id":21487225152,"package_name":"partd","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":21487225288,"package_name":"pexpect","ecosystem":"pypi","requirements":"4.9.0","direct":false,"kind":"runtime","optional":false},{"id":21487225289,"package_name":"pkginfo","ecosystem":"pypi","requirements":"1.12.0","direct":false,"kind":"runtime","optional":false},{"id":21487225290,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.3.6","direct":false,"kind":"runtime","optional":false},{"id":21487225291,"package_name":"plotly","ecosystem":"pypi","requirements":"5.24.1","direct":false,"kind":"runtime","optional":false},{"id":21487225292,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.5.0","direct":false,"kind":"runtime","optional":false},{"id":21487225293,"package_name":"poetry","ecosystem":"pypi","requirements":"1.8.5","direct":false,"kind":"runtime","optional":false},{"id":21487225398,"package_name":"poetry-core","ecosystem":"pypi","requirements":"1.9.1","direct":false,"kind":"runtime","optional":false},{"id":21487225452,"package_name":"poetry-exec-plugin","ecosystem":"pypi","requirements":"0.3.6","direct":false,"kind":"runtime","optional":false},{"id":21487225625,"package_name":"poetry-plugin-export","ecosystem":"pypi","requirements":"1.8.0","direct":false,"kind":"runtime","optional":false},{"id":21487225702,"package_name":"prompt-toolkit","ecosystem":"pypi","requirements":"3.0.48","direct":false,"kind":"runtime","optional":false},{"id":21487225703,"package_name":"propcache","ecosystem":"pypi","requirements":"0.2.1","direct":false,"kind":"runtime","optional":false},{"id":21487225704,"package_name":"proto-plus","ecosystem":"pypi","requirements":"1.25.0","direct":false,"kind":"runtime","optional":false},{"id":21487225705,"package_name":"protobuf","ecosystem":"pypi","requirements":"5.29.3","direct":false,"kind":"runtime","optional":false},{"id":21487225737,"package_name":"psutil","ecosystem":"pypi","requirements":"6.1.1","direct":false,"kind":"runtime","optional":false},{"id":21487225764,"package_name":"ptyprocess","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":21487225765,"package_name":"pure-eval","ecosystem":"pypi","requirements":"0.2.3","direct":false,"kind":"runtime","optional":false},{"id":21487225908,"package_name":"pyasn1","ecosystem":"pypi","requirements":"0.6.1","direct":false,"kind":"runtime","optional":false},{"id":21487225937,"package_name":"pyasn1-modules","ecosystem":"pypi","requirements":"0.4.1","direct":false,"kind":"runtime","optional":false},{"id":21487225938,"package_name":"pycparser","ecosystem":"pypi","requirements":"2.22","direct":false,"kind":"runtime","optional":false},{"id":21487225963,"package_name":"pydantic","ecosystem":"pypi","requirements":"2.10.5","direct":false,"kind":"runtime","optional":false},{"id":21487225964,"package_name":"pydantic-core","ecosystem":"pypi","requirements":"2.27.2","direct":false,"kind":"runtime","optional":false},{"id":21487225965,"package_name":"pygments","ecosystem":"pypi","requirements":"2.19.1","direct":false,"kind":"runtime","optional":false},{"id":21487225966,"package_name":"pyproject-hooks","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":21487225967,"package_name":"pytest","ecosystem":"pypi","requirements":"8.3.4","direct":false,"kind":"runtime","optional":false},{"id":21487226022,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"4.1.0","direct":false,"kind":"runtime","optional":false},{"id":21487226096,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":21487226097,"package_name":"pytz","ecosystem":"pypi","requirements":"2024.2","direct":false,"kind":"runtime","optional":false},{"id":21487226195,"package_name":"pywin32","ecosystem":"pypi","requirements":"308","direct":false,"kind":"runtime","optional":false},{"id":21487226196,"package_name":"pywin32-ctypes","ecosystem":"pypi","requirements":"0.2.3","direct":false,"kind":"runtime","optional":false},{"id":21487226198,"package_name":"pyyaml","ecosystem":"pypi","requirements":"6.0.2","direct":false,"kind":"runtime","optional":false},{"id":21487226271,"package_name":"pyzmq","ecosystem":"pypi","requirements":"26.2.0","direct":false,"kind":"runtime","optional":false},{"id":21487226272,"package_name":"rapidfuzz","ecosystem":"pypi","requirements":"3.11.0","direct":false,"kind":"runtime","optional":false},{"id":21487226467,"package_name":"referencing","ecosystem":"pypi","requirements":"0.35.1","direct":false,"kind":"runtime","optional":false},{"id":21487226561,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.3","direct":false,"kind":"runtime","optional":false},{"id":21487226604,"package_name":"requests-oauthlib","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487226708,"package_name":"requests-toolbelt","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487226709,"package_name":"rpds-py","ecosystem":"pypi","requirements":"0.22.3","direct":false,"kind":"runtime","optional":false},{"id":21487226710,"package_name":"rsa","ecosystem":"pypi","requirements":"4.9","direct":false,"kind":"runtime","optional":false},{"id":21487226711,"package_name":"ruff","ecosystem":"pypi","requirements":"0.4.2","direct":false,"kind":"runtime","optional":false},{"id":21487226712,"package_name":"scipy","ecosystem":"pypi","requirements":"1.15.1","direct":false,"kind":"runtime","optional":false},{"id":21487226713,"package_name":"secretstorage","ecosystem":"pypi","requirements":"3.3.3","direct":false,"kind":"runtime","optional":false},{"id":21487226818,"package_name":"sentry-sdk","ecosystem":"pypi","requirements":"2.19.2","direct":false,"kind":"runtime","optional":false},{"id":21487226887,"package_name":"setproctitle","ecosystem":"pypi","requirements":"1.3.4","direct":false,"kind":"runtime","optional":false},{"id":21487226918,"package_name":"setuptools","ecosystem":"pypi","requirements":"75.8.0","direct":false,"kind":"runtime","optional":false},{"id":21487226919,"package_name":"shellingham","ecosystem":"pypi","requirements":"1.5.4","direct":false,"kind":"runtime","optional":false},{"id":21487226920,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":21487226921,"package_name":"smmap","ecosystem":"pypi","requirements":"5.0.2","direct":false,"kind":"runtime","optional":false},{"id":21487226922,"package_name":"sortedcontainers","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":21487226923,"package_name":"stack-data","ecosystem":"pypi","requirements":"0.6.3","direct":false,"kind":"runtime","optional":false},{"id":21487226924,"package_name":"tblib","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487227026,"package_name":"tenacity","ecosystem":"pypi","requirements":"9.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487227027,"package_name":"toml","ecosystem":"pypi","requirements":"0.10.2","direct":false,"kind":"runtime","optional":false},{"id":21487227028,"package_name":"tomlkit","ecosystem":"pypi","requirements":"0.13.2","direct":false,"kind":"runtime","optional":false},{"id":21487227029,"package_name":"toolz","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487227076,"package_name":"tornado","ecosystem":"pypi","requirements":"6.4.2","direct":false,"kind":"runtime","optional":false},{"id":21487227115,"package_name":"traitlets","ecosystem":"pypi","requirements":"5.14.3","direct":false,"kind":"runtime","optional":false},{"id":21487227116,"package_name":"trove-classifiers","ecosystem":"pypi","requirements":"2025.1.10.15","direct":false,"kind":"runtime","optional":false},{"id":21487227117,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.12.2","direct":false,"kind":"runtime","optional":false},{"id":21487227186,"package_name":"tzdata","ecosystem":"pypi","requirements":"2024.2","direct":false,"kind":"runtime","optional":false},{"id":21487227244,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false},{"id":21487227245,"package_name":"virtualenv","ecosystem":"pypi","requirements":"20.28.1","direct":false,"kind":"runtime","optional":false},{"id":21487227292,"package_name":"wandb","ecosystem":"pypi","requirements":"0.19.2","direct":false,"kind":"runtime","optional":false},{"id":21487227293,"package_name":"wcwidth","ecosystem":"pypi","requirements":"0.2.13","direct":false,"kind":"runtime","optional":false},{"id":21487227294,"package_name":"xarray","ecosystem":"pypi","requirements":"2024.11.0","direct":false,"kind":"runtime","optional":false},{"id":21487227566,"package_name":"xattr","ecosystem":"pypi","requirements":"1.1.4","direct":false,"kind":"runtime","optional":false},{"id":21487227636,"package_name":"yarl","ecosystem":"pypi","requirements":"1.18.3","direct":false,"kind":"runtime","optional":false},{"id":21487227637,"package_name":"zarr","ecosystem":"pypi","requirements":"2.18.4","direct":false,"kind":"runtime","optional":false},{"id":21487227846,"package_name":"zict","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":21487228095,"package_name":"zipp","ecosystem":"pypi","requirements":"3.21.0","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2025-01-15T17:35:43.767Z","updated_at":"2025-01-15T17:35:43.767Z","repository_link":"https://github.com/juaAI/stationbench/blob/main/pyproject.toml","dependencies":[{"id":21487228313,"package_name":"python","ecosystem":"pypi","requirements":"~3.11","direct":true,"kind":"runtime","optional":false},{"id":21487228661,"package_name":"xarray","ecosystem":"pypi","requirements":"^2024.1.1","direct":true,"kind":"runtime","optional":false},{"id":21487228662,"package_name":"pandas","ecosystem":"pypi","requirements":"^2.2.0","direct":true,"kind":"runtime","optional":false},{"id":21487228663,"package_name":"dask","ecosystem":"pypi","requirements":"^2024.1.1","direct":true,"kind":"runtime","optional":false},{"id":21487228664,"package_name":"wandb","ecosystem":"pypi","requirements":"^0.19.2","direct":true,"kind":"runtime","optional":false},{"id":21487228665,"package_name":"plotly","ecosystem":"pypi","requirements":"^5.18.0","direct":true,"kind":"runtime","optional":false},{"id":21487228666,"package_name":"zarr","ecosystem":"pypi","requirements":"^2.16.1","direct":true,"kind":"runtime","optional":false},{"id":21487228667,"package_name":"gcsfs","ecosystem":"pypi","requirements":"^2024.2.0","direct":true,"kind":"runtime","optional":false},{"id":21487228668,"package_name":"scipy","ecosystem":"pypi","requirements":"^1.12.0","direct":true,"kind":"runtime","optional":false},{"id":21487228669,"package_name":"nbformat","ecosystem":"pypi","requirements":"^5.10.4","direct":true,"kind":"runtime","optional":false},{"id":21487228670,"package_name":"ruff","ecosystem":"pypi","requirements":"0.4.2","direct":true,"kind":"develop","optional":false},{"id":21487228671,"package_name":"pytest","ecosystem":"pypi","requirements":"^8.0.0","direct":true,"kind":"develop","optional":false},{"id":21487228672,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"^4.1.0","direct":true,"kind":"develop","optional":false},{"id":21487228673,"package_name":"poetry-exec-plugin","ecosystem":"pypi","requirements":"^0.3.6","direct":true,"kind":"develop","optional":false},{"id":21487228674,"package_name":"ipykernel","ecosystem":"pypi","requirements":"^6.29.5","direct":true,"kind":"develop","optional":false}]}],"score":6.1092475827643655,"created_at":"2025-04-20T00:17:26.415Z","updated_at":"2026-04-08T03:30:35.373Z","avatar_url":"https://github.com/juaAI.png","language":"Python","category":"Atmosphere","sub_category":"Meteorological Observation and Forecast","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# StationBench\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14671604.svg)](https://doi.org/10.5281/zenodo.14671604) [![Jua.ai](https://img.shields.io/badge/Website-jua.ai-blue)](https://www.jua.ai/) [![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/company/juaai/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\nStationBench is a Python library for benchmarking weather forecasts against weather station data. It provides tools to calculate metrics, visualize results, and compare different forecast models.\n\n## Features\n\n- Pre-processed ground truth data from 10,000+ weather stations around the world included in the package\n- Calculate RMSE and other metrics between forecasts and ground truth data\n- Support for multiple weather variables (temperature, wind speed, solar radiation)\n- Regional analysis capabilities (Europe, North America, Global, etc.)\n- Integration with Weights \u0026 Biases for experiment tracking\n\n## Installation\n\n```bash\npip install stationbench\n```\n\n## Documentation\n\nFull documentation is available in the [docs/](./docs/) directory:\n- [Setup](docs/setup.md) - How to setup StationBench\n- [Tutorial](docs/tutorial.ipynb) - Basic usage of StationBench\n\n## Quick Start\n\n### Data Format Requirements\n\n#### Forecast Data\n- Must include dimensions: latitude, longitude, time\n- Variables should include:\n  - 10m_wind_speed (or custom name)\n  - 2m_temperature (or custom name)\n\n#### Ground Truth Data\n\nStationbench comes with ready-to-use weather stations from around the world. The benchmarking data is a subset of the [Meteostat](https://dev.meteostat.net/) dataset. It contains weather data from 2018-2024 for 10m wind speed and 2m temperature. The data is provided by the following organizations:\n- Deutscher Wetterdienst\n- NOAA\n- Government of Canada\n- MET Norway\n- European Data Portal\n- Offene Daten Österreich\n\nSource: [Meteostat](https://dev.meteostat.net/) ([CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/legalcode))\n\nThe benchmarking data can be accessed from `https://opendata.jua.ai/stationbench/meteostat_benchmark.zarr`.\n\n![Map of weather stations used for benchmarking](https://opendata.jua.ai/stationbench/stations_2023_map.png)\n\n![Number of stations reporting over time](https://opendata.jua.ai/stationbench/stations_2018-2024.png)\n\nBesides the provided benchmarking data, you can also use your own ground truth data. The ground truth data must be in zarr format and must include the following dimensions and coordinates:\n- Must include dimensions: station_id, time\n- Must include coordinates: latitude, longitude\n\n### Calculate Metrics\nThis script computes metrics by comparing forecast data against ground truth data for specified time periods and regions. Output are RMSE, MBE and skill scores for different variables and lead times in the format of the ground truth data.\n\n#### Options\n- `--forecast`: Location of the forecast data (required)\n- `--stations`: Location of the ground truth data (defaults to https://opendata.jua.ai/stationbench/meteostat_benchmark.zarr)\n- `--start_date`: Start date for benchmarking (required)\n- `--end_date`: End date for benchmarking (required)\n- `--output`: Output path for benchmarks (required)\n- `--region`: Region to benchmark (see `regions.py` for available regions)\n- `--name_10m_wind_speed`: Name of 10m wind speed variable (optional)\n- `--name_2m_temperature`: Name of 2m temperature variable (optional)\n- `--use_dask`: Enable parallel computation with Dask (recommended for datasets \u003e10GB)\n- `--n_workers`: Number of Dask workers to use (default: 4, only used if --use_dask is set and no client exists)\n\nIf variable name is not provided, no metrics will be computed for that variable.\n\n### Compare forecasts\n\nAfter generating the metrics, you can use the `compare_forecasts.py` script to compute metrics, create visualizations, and log the results to Weights \u0026 Biases (W\u0026B).\n\n#### What it does\n\nThe `compare_forecasts.py` script:\n1. Computes RMSE (Root Mean Square Error) and skill scores for different variables and lead time ranges.\n2. Generates geographical scatter plots showing the spatial distribution of errors.\n3. Creates line plots showing the temporal evolution of errors.\n4. Saves all visualizations and metrics to a directory, optionally logs to Weights \u0026 Biases.\n\n#### Options\n- `--benchmark_datasets_locs`: Dictionary of reference benchmark locations, the skill score is computed between the first and the second dataset (required)\n- `--regions`: Comma-separated list of regions, see `regions.py` for available regions (required)\n- `--wandb_run_name`: Weights \u0026 Biases run name (optional), if not provided, Weights \u0026 Biases will not be used\n- `--output_dir`: Output directory for results (optional, defaults to `stationbench-results`)\n\n### Usage\n\nStationBench can be used either as a Python package or through command-line interfaces.\n\n#### Python Package Usage\n\n```python\nimport stationbench\n\n# Calculate metrics\nstationbench.calculate_metrics(\n    forecast=\"path/to/forecast.zarr\",\n    start_date=\"2023-01-01\",\n    end_date=\"2023-12-31\",\n    output=\"path/to/forecast_metrics.zarr\",\n    region=\"europe\",\n    name_10m_wind_speed=\"10si\",\n    name_2m_temperature=\"2t\"\n)\n\n# Compare forecasts\nstationbench.compare_forecasts(\n    benchmark_datasets_locs={\"HRES\": \"path/to/hres_metrics.zarr\", \"ENS\": \"path/to/ens_metrics.zarr\"},\n    regions=[\"europe\"]\n)\n```\n\n#### Command-Line Usage\n\nCalculate metrics for a forecast dataset:\n\n```bash\nstationbench-calculate \\\n    --forecast path/to/forecast.zarr \\\n    --start_date 2023-01-01 \\\n    --end_date 2023-12-31 \\\n    --output path/to/forecast_metrics.zarr \\\n    --region europe \\\n    --name_10m_wind_speed \"10si\" \\\n    --name_2m_temperature \"2t\"\n    [--use_dask]  # Optional: Enable parallel computation with Dask\n    [--n_workers 4]  # Optional: Number of Dask workers to use\n```\nFor small datasets, it's recommended to run without Dask. For large datasets\n(\u003e10GB), enabling Dask with `--use_dask` can improve performance.\n\nCompare forecasts:\n```bash\nstationbench-compare \\\n    --benchmark_datasets_locs '{\"HRES\": \"path/to/hres_metrics.zarr\", \"ENS\": \"path/to/ens_metrics.zarr\"}' \\\n    --regions europe \\\n    [--wandb_run_name \"run_name\"] \\\n    [--output_dir \"path/to/output_dir\"]\n```\n\n## Contributing\n\nWe welcome contributions! Please see our [CONTRIBUTING.md](CONTRIBUTING.md) for details.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Metrics\n\nStationBench calculates the following verification metrics:\n\n- **RMSE (Root Mean Square Error)**: Measures the average magnitude of forecast errors, giving greater weight to larger errors\n- **MBE (Mean Bias Error)**: Measures the average direction and magnitude of forecast bias. Positive values indicate the forecast tends to overpredict, while negative values indicate underprediction.\n\nWe plan to add more benchmarking metrics in the future...\n\n## Regional Analysis\n\nStationBench supports several predefined regions and allows you to create custom regions.\n\nFor details on creating and using custom regions, see the [Custom Regions Guide](docs/guides/custom_regions.md).\n\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.5281/zenodo.14671604"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/314701","html_url":"https://ost.ecosyste.ms/projects/314701"}