{"id":350823,"name":"hydromodel","description":"A Python implementation of conceptual hydrological models, with a focus on the XinAnJiang (XAJ) model, one of the most widely-used rainfall-runoff models, especially in China and Asian regions.","url":"https://github.com/ouyangwenyu/hydromodel","last_synced_at":"2026-08-13T18:03:07.276Z","repository":{"id":38305445,"uuid":"182603604","full_name":"OuyangWenyu/hydromodel","owner":"OuyangWenyu","description":"新安江等水文模型","archived":false,"fork":false,"pushed_at":"2026-06-13T13:37:14.000Z","size":40712,"stargazers_count":256,"open_issues_count":14,"forks_count":128,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-08-10T16:20:56.397Z","etag":null,"topics":["gr4j","hydrological-modelling","hymod","xinanjiang"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OuyangWenyu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2019-04-22T01:41:35.000Z","updated_at":"2026-08-07T00:55:34.000Z","dependencies_parsed_at":"2026-08-10T16:24:26.788Z","dependency_job_id":null,"html_url":"https://github.com/OuyangWenyu/hydromodel","commit_stats":null,"previous_names":["ouyangwenyu/hydromodel","ouyangwenyu/hydro-model-xaj"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/OuyangWenyu/hydromodel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OuyangWenyu","download_url":"https://codeload.github.com/OuyangWenyu/hydromodel/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36530573,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-11T02:00:06.871Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":"OuyangWenyu","name":"OuyangWenyu","uuid":"10172837","kind":"user","description":"","email":"","website":null,"location":"Dalian, China","twitter":null,"company":"Dalian University of Technology","icon_url":"https://avatars.githubusercontent.com/u/10172837?u=b4a66b7f9e3e9680dccc8c3a9998a74758390501\u0026v=4","repositories_count":6,"last_synced_at":"2023-03-06T14:39:34.411Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/OuyangWenyu","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2022-11-16T16:54:34.689Z","updated_at":"2023-03-06T14:39:34.443Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OuyangWenyu","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OuyangWenyu/repositories"},"packages":[],"commits":{"id":11171150,"full_name":"OuyangWenyu/hydromodel","default_branch":"master","total_commits":187,"total_committers":6,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":31.166666666666668,"dds":0.2887700534759359,"past_year_total_commits":16,"past_year_total_committers":2,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":8.0,"past_year_dds":0.0625,"last_synced_at":"2026-08-06T16:31:58.045Z","last_synced_commit":"674c5c61efbe9778932bfa076a6baeb5d721ad71","created_at":"2025-09-15T10:41:36.454Z","updated_at":"2026-08-06T16:31:57.507Z","committers":[{"name":"ouyangwenyu","email":"wenyuouyang@outlook.com","login":"OuyangWenyu","count":133},{"name":"owenyy","email":"ouyangwenyu@mail.dlut.edu.cn","login":null,"count":26},{"name":"zhuanglaihong","email":"zhuanglaihong@gmail.com","login":"zhuanglaihong","count":15},{"name":"wangjingyi1999","email":"115329855+wangjingyi1999","login":"wangjingyi1999","count":10},{"name":"wangmengyun","email":"wmyun1998@163.com","login":"wangmengyun1998","count":2},{"name":"xiaoning","email":"qliuxiaoning@outlook.com","login":"xiaonig","count":1}],"past_year_committers":[{"name":"zhuanglaihong","email":"zhuanglaihong@gmail.com","login":"zhuanglaihong","count":15},{"name":"OuyangWenyu","email":"wenyuouyang@outlook.com","login":"OuyangWenyu","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-10T00:00:10.517Z","repositories_count":6626317,"commits_count":918527988,"contributors_count":39008798,"owners_count":1330482,"committers_count":3291265,"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":"OuyangWenyu/hydromodel","html_url":"https://github.com/OuyangWenyu/hydromodel","last_synced_at":"2026-08-10T16:11:23.882Z","status":"error","issues_count":33,"pull_requests_count":0,"avg_time_to_close_issue":19106537.391304348,"avg_time_to_close_pull_request":null,"issues_closed_count":23,"pull_requests_closed_count":0,"pull_request_authors_count":0,"issue_authors_count":21,"avg_comments_per_issue":2.7272727272727275,"avg_comments_per_pull_request":null,"merged_pull_requests_count":0,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":5,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":3,"past_year_avg_comments_per_issue":0.6,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2025-08-30T17:49:25.441Z","updated_at":"2026-08-10T16:11:23.882Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/OuyangWenyu%2Fhydromodel/issues","issue_labels_count":{"bug":8},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":30,"OWNER":2,"CONTRIBUTOR":1},"pull_request_author_associations_count":{},"issue_authors":{"KiltAB":5,"hgoldcn":2,"HarryYuGuangzhou":2,"iFence":2,"Myfootnotsmelly":2,"Wushaox":2,"zhaoliyang1":2,"OuyangWenyu":2,"Smile-L-up":2,"chqbb":1,"SureWyatt":1,"xyh-994-star":1,"KmBase":1,"yizhih":1,"Billcui123":1,"Jealours":1,"shituxingzhehhl":1,"wangjingyi1999":1,"funny000":1,"nnuxdw":1,"xuzifann":1},"pull_request_authors":{},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-11T00:00:06.821Z","repositories_count":14792246,"issues_count":28398879,"pull_requests_count":93565992,"authors_count":11433712,"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":{"bug":3},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":3,"OWNER":2},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{"hgoldcn":2,"OuyangWenyu":2,"SureWyatt":1},"past_year_pull_request_authors":{},"maintainers":[{"login":"OuyangWenyu","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/OuyangWenyu"}],"active_maintainers":[{"login":"OuyangWenyu","count":2,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/OuyangWenyu"}]},"events":{"total":{"ReleaseEvent":6,"DeleteEvent":3,"MemberEvent":2,"ForkEvent":19,"IssuesEvent":5,"WatchEvent":47,"IssueCommentEvent":5,"PushEvent":24,"CreateEvent":2},"last_year":{"ReleaseEvent":5,"DeleteEvent":3,"MemberEvent":2,"ForkEvent":5,"IssuesEvent":2,"WatchEvent":13,"IssueCommentEvent":3,"PushEvent":20}},"keywords":["gr4j","hydrological-modelling","hymod","xinanjiang"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/docs.yml","sha":null,"kind":"manifest","created_at":"2024-05-23T03:47:48.651Z","updated_at":"2024-05-23T03:47:48.651Z","repository_link":"https://github.com/OuyangWenyu/hydromodel/blob/master/.github/workflows/docs.yml","dependencies":[{"id":18235464914,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":18235464915,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/pypi.yml","sha":null,"kind":"manifest","created_at":"2024-05-23T03:47:48.663Z","updated_at":"2024-05-23T03:47:48.663Z","repository_link":"https://github.com/OuyangWenyu/hydromodel/blob/master/.github/workflows/pypi.yml","dependencies":[{"id":18235464925,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":18235464926,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"uv.lock","sha":null,"kind":"lockfile","created_at":"2026-08-10T16:24:24.858Z","updated_at":"2026-08-10T16:24:24.858Z","repository_link":"https://github.com/OuyangWenyu/hydromodel/blob/master/uv.lock","dependencies":[{"id":26031341588,"package_name":"affine","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341589,"package_name":"aiobotocore","ecosystem":"pypi","requirements":"2.13.3","direct":false,"kind":"runtime","optional":false},{"id":26031341590,"package_name":"aiodns","ecosystem":"pypi","requirements":"3.5.0","direct":false,"kind":"runtime","optional":false},{"id":26031341591,"package_name":"aiofiles","ecosystem":"pypi","requirements":"24.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341592,"package_name":"aiohappyeyeballs","ecosystem":"pypi","requirements":"2.6.1","direct":false,"kind":"runtime","optional":false},{"id":26031341593,"package_name":"aiohttp","ecosystem":"pypi","requirements":"3.12.14","direct":false,"kind":"runtime","optional":false},{"id":26031341594,"package_name":"aiohttp-client-cache","ecosystem":"pypi","requirements":"0.13.0","direct":false,"kind":"runtime","optional":false},{"id":26031341599,"package_name":"aioitertools","ecosystem":"pypi","requirements":"0.12.0","direct":false,"kind":"runtime","optional":false},{"id":26031341600,"package_name":"aiosignal","ecosystem":"pypi","requirements":"1.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341601,"package_name":"aiosqlite","ecosystem":"pypi","requirements":"0.21.0","direct":false,"kind":"runtime","optional":false},{"id":26031341602,"package_name":"alabaster","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341603,"package_name":"appnope","ecosystem":"pypi","requirements":"0.1.4","direct":false,"kind":"runtime","optional":false},{"id":26031341604,"package_name":"aqua-fetch","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341605,"package_name":"argon2-cffi","ecosystem":"pypi","requirements":"25.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341606,"package_name":"argon2-cffi-bindings","ecosystem":"pypi","requirements":"21.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341607,"package_name":"asttokens","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341608,"package_name":"async-retriever","ecosystem":"pypi","requirements":"0.19.3","direct":false,"kind":"runtime","optional":false},{"id":26031341615,"package_name":"attrs","ecosystem":"pypi","requirements":"25.3.0","direct":false,"kind":"runtime","optional":false},{"id":26031341616,"package_name":"babel","ecosystem":"pypi","requirements":"2.17.0","direct":false,"kind":"runtime","optional":false},{"id":26031341617,"package_name":"backports-tarfile","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341618,"package_name":"backrefs","ecosystem":"pypi","requirements":"5.9","direct":false,"kind":"runtime","optional":false},{"id":26031341619,"package_name":"beautifulsoup4","ecosystem":"pypi","requirements":"4.13.4","direct":false,"kind":"runtime","optional":false},{"id":26031341620,"package_name":"black","ecosystem":"pypi","requirements":"25.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341621,"package_name":"bleach","ecosystem":"pypi","requirements":"6.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341622,"package_name":"bmipy","ecosystem":"pypi","requirements":"2.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341623,"package_name":"bokeh","ecosystem":"pypi","requirements":"3.7.3","direct":false,"kind":"runtime","optional":false},{"id":26031341624,"package_name":"boto3","ecosystem":"pypi","requirements":"1.34.162","direct":false,"kind":"runtime","optional":false},{"id":26031341625,"package_name":"botocore","ecosystem":"pypi","requirements":"1.34.162","direct":false,"kind":"runtime","optional":false},{"id":26031341626,"package_name":"brotli","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341627,"package_name":"brotlicffi","ecosystem":"pypi","requirements":"1.1.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341628,"package_name":"bump2version","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341629,"package_name":"cachetools","ecosystem":"pypi","requirements":"6.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341630,"package_name":"cartopy","ecosystem":"pypi","requirements":"0.24.1","direct":false,"kind":"runtime","optional":false},{"id":26031341631,"package_name":"cattrs","ecosystem":"pypi","requirements":"25.1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341632,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.7.14","direct":false,"kind":"runtime","optional":false},{"id":26031341634,"package_name":"cffi","ecosystem":"pypi","requirements":"1.17.1","direct":false,"kind":"runtime","optional":false},{"id":26031341635,"package_name":"cfgrib","ecosystem":"pypi","requirements":"0.9.15.0","direct":false,"kind":"runtime","optional":false},{"id":26031341637,"package_name":"cfgv","ecosystem":"pypi","requirements":"3.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341639,"package_name":"cftime","ecosystem":"pypi","requirements":"1.6.4.post1","direct":false,"kind":"runtime","optional":false},{"id":26031341641,"package_name":"chardet","ecosystem":"pypi","requirements":"5.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341642,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.4.2","direct":false,"kind":"runtime","optional":false},{"id":26031341643,"package_name":"click","ecosystem":"pypi","requirements":"8.2.1","direct":false,"kind":"runtime","optional":false},{"id":26031341644,"package_name":"click-plugins","ecosystem":"pypi","requirements":"1.1.1.2","direct":false,"kind":"runtime","optional":false},{"id":26031341645,"package_name":"cligj","ecosystem":"pypi","requirements":"0.7.2","direct":false,"kind":"runtime","optional":false},{"id":26031341646,"package_name":"cloudpickle","ecosystem":"pypi","requirements":"3.1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341647,"package_name":"codetiming","ecosystem":"pypi","requirements":"1.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341648,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":26031341649,"package_name":"comm","ecosystem":"pypi","requirements":"0.2.2","direct":false,"kind":"runtime","optional":false},{"id":26031341650,"package_name":"contourpy","ecosystem":"pypi","requirements":"1.3.2","direct":false,"kind":"runtime","optional":false},{"id":26031341651,"package_name":"coverage","ecosystem":"pypi","requirements":"7.9.2","direct":false,"kind":"runtime","optional":false},{"id":26031341652,"package_name":"crc32c","ecosystem":"pypi","requirements":"2.7.1","direct":false,"kind":"runtime","optional":false},{"id":26031341653,"package_name":"cryptography","ecosystem":"pypi","requirements":"45.0.5","direct":false,"kind":"runtime","optional":false},{"id":26031341654,"package_name":"cssselect2","ecosystem":"pypi","requirements":"0.8.0","direct":false,"kind":"runtime","optional":false},{"id":26031341655,"package_name":"cycler","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":26031341656,"package_name":"cytoolz","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341657,"package_name":"dask","ecosystem":"pypi","requirements":"2025.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341658,"package_name":"dataretrieval","ecosystem":"pypi","requirements":"1.0.12","direct":false,"kind":"runtime","optional":false},{"id":26031341659,"package_name":"deap","ecosystem":"pypi","requirements":"1.4.3","direct":false,"kind":"runtime","optional":false},{"id":26031341660,"package_name":"debugpy","ecosystem":"pypi","requirements":"1.8.14","direct":false,"kind":"runtime","optional":false},{"id":26031341661,"package_name":"decorator","ecosystem":"pypi","requirements":"5.2.1","direct":false,"kind":"runtime","optional":false},{"id":26031341662,"package_name":"defusedxml","ecosystem":"pypi","requirements":"0.7.1","direct":false,"kind":"runtime","optional":false},{"id":26031341663,"package_name":"distlib","ecosystem":"pypi","requirements":"0.3.9","direct":false,"kind":"runtime","optional":false},{"id":26031341664,"package_name":"distributed","ecosystem":"pypi","requirements":"2025.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341665,"package_name":"docutils","ecosystem":"pypi","requirements":"0.21.2","direct":false,"kind":"runtime","optional":false},{"id":26031341666,"package_name":"donfig","ecosystem":"pypi","requirements":"0.8.1.post1","direct":false,"kind":"runtime","optional":false},{"id":26031341667,"package_name":"easy-mpl","ecosystem":"pypi","requirements":"0.21.5","direct":false,"kind":"runtime","optional":false},{"id":26031341679,"package_name":"eccodes","ecosystem":"pypi","requirements":"2.42.0","direct":false,"kind":"runtime","optional":false},{"id":26031341680,"package_name":"et-xmlfile","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341681,"package_name":"executing","ecosystem":"pypi","requirements":"2.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341682,"package_name":"fastjsonschema","ecosystem":"pypi","requirements":"2.21.1","direct":false,"kind":"runtime","optional":false},{"id":26031341683,"package_name":"filelock","ecosystem":"pypi","requirements":"3.18.0","direct":false,"kind":"runtime","optional":false},{"id":26031341684,"package_name":"findlibs","ecosystem":"pypi","requirements":"0.1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341685,"package_name":"fiona","ecosystem":"pypi","requirements":"1.10.1","direct":false,"kind":"runtime","optional":false},{"id":26031341686,"package_name":"flake8","ecosystem":"pypi","requirements":"7.3.0","direct":false,"kind":"runtime","optional":false},{"id":26031341687,"package_name":"flexcache","ecosystem":"pypi","requirements":"0.3","direct":false,"kind":"runtime","optional":false},{"id":26031341688,"package_name":"flexparser","ecosystem":"pypi","requirements":"0.4","direct":false,"kind":"runtime","optional":false},{"id":26031341689,"package_name":"fonttools","ecosystem":"pypi","requirements":"4.58.5","direct":false,"kind":"runtime","optional":false},{"id":26031341690,"package_name":"frozenlist","ecosystem":"pypi","requirements":"1.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341691,"package_name":"fsspec","ecosystem":"pypi","requirements":"2024.12.0","direct":false,"kind":"runtime","optional":false},{"id":26031341692,"package_name":"geopandas","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341693,"package_name":"ghp-import","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341694,"package_name":"gitdb","ecosystem":"pypi","requirements":"4.0.12","direct":false,"kind":"runtime","optional":false},{"id":26031341695,"package_name":"gitpython","ecosystem":"pypi","requirements":"3.1.45","direct":false,"kind":"runtime","optional":false},{"id":26031341696,"package_name":"greenlet","ecosystem":"pypi","requirements":"3.2.3","direct":false,"kind":"runtime","optional":false},{"id":26031341697,"package_name":"griffe","ecosystem":"pypi","requirements":"1.14.0","direct":false,"kind":"runtime","optional":false},{"id":26031341698,"package_name":"h5netcdf","ecosystem":"pypi","requirements":"1.6.3","direct":false,"kind":"runtime","optional":false},{"id":26031341699,"package_name":"h5py","ecosystem":"pypi","requirements":"3.14.0","direct":false,"kind":"runtime","optional":false},{"id":26031341700,"package_name":"hydrodataset","ecosystem":"pypi","requirements":"*","direct":false,"kind":"runtime","optional":false},{"id":26031341701,"package_name":"hydrodatasource","ecosystem":"pypi","requirements":"*","direct":false,"kind":"runtime","optional":false},{"id":26031341702,"package_name":"hydroerr","ecosystem":"pypi","requirements":"1.24","direct":false,"kind":"runtime","optional":false},{"id":26031341703,"package_name":"hydromodel","ecosystem":"pypi","requirements":"0.3.0","direct":false,"kind":"runtime","optional":false},{"id":26031341704,"package_name":"hydrosignatures","ecosystem":"pypi","requirements":"0.19.3","direct":false,"kind":"runtime","optional":false},{"id":26031341705,"package_name":"hydrotopo","ecosystem":"pypi","requirements":"0.1.2","direct":false,"kind":"runtime","optional":false},{"id":26031341706,"package_name":"hydroutils","ecosystem":"pypi","requirements":"*","direct":false,"kind":"runtime","optional":false},{"id":26031341707,"package_name":"id","ecosystem":"pypi","requirements":"1.5.0","direct":false,"kind":"runtime","optional":false},{"id":26031341708,"package_name":"identify","ecosystem":"pypi","requirements":"2.6.12","direct":false,"kind":"runtime","optional":false},{"id":26031341709,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"runtime","optional":false},{"id":26031341710,"package_name":"igraph","ecosystem":"pypi","requirements":"0.11.9","direct":false,"kind":"runtime","optional":false},{"id":26031341711,"package_name":"imagesize","ecosystem":"pypi","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":26031341712,"package_name":"importlib-metadata","ecosystem":"pypi","requirements":"8.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341713,"package_name":"inflate64","ecosystem":"pypi","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":26031341714,"package_name":"iniconfig","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341715,"package_name":"intake","ecosystem":"pypi","requirements":"2.0.8","direct":false,"kind":"runtime","optional":false},{"id":26031341735,"package_name":"ipykernel","ecosystem":"pypi","requirements":"6.29.5","direct":false,"kind":"runtime","optional":false},{"id":26031341736,"package_name":"ipython","ecosystem":"pypi","requirements":"9.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341737,"package_name":"ipython-pygments-lexers","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341738,"package_name":"itsdangerous","ecosystem":"pypi","requirements":"2.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341739,"package_name":"jaraco-classes","ecosystem":"pypi","requirements":"3.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341740,"package_name":"jaraco-context","ecosystem":"pypi","requirements":"6.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341742,"package_name":"jaraco-functools","ecosystem":"pypi","requirements":"4.2.1","direct":false,"kind":"runtime","optional":false},{"id":26031341743,"package_name":"jedi","ecosystem":"pypi","requirements":"0.19.2","direct":false,"kind":"runtime","optional":false},{"id":26031341744,"package_name":"jeepney","ecosystem":"pypi","requirements":"0.9.0","direct":false,"kind":"runtime","optional":false},{"id":26031341745,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.6","direct":false,"kind":"runtime","optional":false},{"id":26031341746,"package_name":"jmespath","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341747,"package_name":"joblib","ecosystem":"pypi","requirements":"1.5.1","direct":false,"kind":"runtime","optional":false},{"id":26031341748,"package_name":"jsonschema","ecosystem":"pypi","requirements":"4.25.0","direct":false,"kind":"runtime","optional":false},{"id":26031341749,"package_name":"jsonschema-specifications","ecosystem":"pypi","requirements":"2025.4.1","direct":false,"kind":"runtime","optional":false},{"id":26031341750,"package_name":"jupyter-client","ecosystem":"pypi","requirements":"8.6.3","direct":false,"kind":"runtime","optional":false},{"id":26031341751,"package_name":"jupyter-core","ecosystem":"pypi","requirements":"5.8.1","direct":false,"kind":"runtime","optional":false},{"id":26031341752,"package_name":"jupyterlab-pygments","ecosystem":"pypi","requirements":"0.3.0","direct":false,"kind":"runtime","optional":false},{"id":26031341753,"package_name":"jupytext","ecosystem":"pypi","requirements":"1.17.2","direct":false,"kind":"runtime","optional":false},{"id":26031341754,"package_name":"kerchunk","ecosystem":"pypi","requirements":"0.2.8","direct":false,"kind":"runtime","optional":false},{"id":26031341755,"package_name":"keyring","ecosystem":"pypi","requirements":"25.6.0","direct":false,"kind":"runtime","optional":false},{"id":26031341756,"package_name":"kiwisolver","ecosystem":"pypi","requirements":"1.4.8","direct":false,"kind":"runtime","optional":false},{"id":26031341757,"package_name":"livereload","ecosystem":"pypi","requirements":"2.7.1","direct":false,"kind":"runtime","optional":false},{"id":26031341758,"package_name":"llvmlite","ecosystem":"pypi","requirements":"0.44.0","direct":false,"kind":"runtime","optional":false},{"id":26031341759,"package_name":"locket","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341760,"package_name":"loguru","ecosystem":"pypi","requirements":"0.7.3","direct":false,"kind":"runtime","optional":false},{"id":26031341761,"package_name":"lxml","ecosystem":"pypi","requirements":"6.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341762,"package_name":"lz4","ecosystem":"pypi","requirements":"4.4.4","direct":false,"kind":"runtime","optional":false},{"id":26031341763,"package_name":"markdown","ecosystem":"pypi","requirements":"3.8.2","direct":false,"kind":"runtime","optional":false},{"id":26031341764,"package_name":"markdown-callouts","ecosystem":"pypi","requirements":"0.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341765,"package_name":"markdown-it-py","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341766,"package_name":"markupsafe","ecosystem":"pypi","requirements":"3.0.2","direct":false,"kind":"runtime","optional":false},{"id":26031341767,"package_name":"matplotlib","ecosystem":"pypi","requirements":"3.10.3","direct":false,"kind":"runtime","optional":false},{"id":26031341768,"package_name":"matplotlib-inline","ecosystem":"pypi","requirements":"0.1.7","direct":false,"kind":"runtime","optional":false},{"id":26031341769,"package_name":"mccabe","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341770,"package_name":"mdit-py-plugins","ecosystem":"pypi","requirements":"0.4.2","direct":false,"kind":"runtime","optional":false},{"id":26031341771,"package_name":"mdurl","ecosystem":"pypi","requirements":"0.1.2","direct":false,"kind":"runtime","optional":false},{"id":26031341772,"package_name":"mergedeep","ecosystem":"pypi","requirements":"1.3.4","direct":false,"kind":"runtime","optional":false},{"id":26031341773,"package_name":"minio","ecosystem":"pypi","requirements":"7.2.15","direct":false,"kind":"runtime","optional":false},{"id":26031341774,"package_name":"mistune","ecosystem":"pypi","requirements":"3.1.3","direct":false,"kind":"runtime","optional":false},{"id":26031341775,"package_name":"mkdocs","ecosystem":"pypi","requirements":"1.6.1","direct":false,"kind":"runtime","optional":false},{"id":26031341776,"package_name":"mkdocs-autorefs","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":26031341777,"package_name":"mkdocs-get-deps","ecosystem":"pypi","requirements":"0.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341778,"package_name":"mkdocs-git-revision-date-localized-plugin","ecosystem":"pypi","requirements":"1.4.7","direct":false,"kind":"runtime","optional":false},{"id":26031341779,"package_name":"mkdocs-git-revision-date-plugin","ecosystem":"pypi","requirements":"0.3.2","direct":false,"kind":"runtime","optional":false},{"id":26031341789,"package_name":"mkdocs-jupyter","ecosystem":"pypi","requirements":"0.25.1","direct":false,"kind":"runtime","optional":false},{"id":26031341790,"package_name":"mkdocs-material","ecosystem":"pypi","requirements":"9.6.16","direct":false,"kind":"runtime","optional":false},{"id":26031341791,"package_name":"mkdocs-material-extensions","ecosystem":"pypi","requirements":"1.3.1","direct":false,"kind":"runtime","optional":false},{"id":26031341792,"package_name":"mkdocs-pdf-export-plugin","ecosystem":"pypi","requirements":"0.5.10","direct":false,"kind":"runtime","optional":false},{"id":26031341794,"package_name":"mkdocstrings","ecosystem":"pypi","requirements":"0.30.0","direct":false,"kind":"runtime","optional":false},{"id":26031341795,"package_name":"mkdocstrings-crystal","ecosystem":"pypi","requirements":"0.3.7","direct":false,"kind":"runtime","optional":false},{"id":26031341805,"package_name":"mkdocstrings-python","ecosystem":"pypi","requirements":"1.18.2","direct":false,"kind":"runtime","optional":false},{"id":26031341806,"package_name":"mkdocstrings-python-legacy","ecosystem":"pypi","requirements":"0.2.7","direct":false,"kind":"runtime","optional":false},{"id":26031341807,"package_name":"more-itertools","ecosystem":"pypi","requirements":"10.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341808,"package_name":"msgpack","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341809,"package_name":"multidict","ecosystem":"pypi","requirements":"6.6.3","direct":false,"kind":"runtime","optional":false},{"id":26031341810,"package_name":"multivolumefile","ecosystem":"pypi","requirements":"0.2.3","direct":false,"kind":"runtime","optional":false},{"id":26031341811,"package_name":"muskingumcunge","ecosystem":"pypi","requirements":"0.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341812,"package_name":"mypy-extensions","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341813,"package_name":"narwhals","ecosystem":"pypi","requirements":"1.47.0","direct":false,"kind":"runtime","optional":false},{"id":26031341814,"package_name":"nbclient","ecosystem":"pypi","requirements":"0.10.2","direct":false,"kind":"runtime","optional":false},{"id":26031341815,"package_name":"nbconvert","ecosystem":"pypi","requirements":"7.16.6","direct":false,"kind":"runtime","optional":false},{"id":26031341816,"package_name":"nbformat","ecosystem":"pypi","requirements":"5.10.4","direct":false,"kind":"runtime","optional":false},{"id":26031341817,"package_name":"nest-asyncio","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":26031341818,"package_name":"netcdf4","ecosystem":"pypi","requirements":"1.7.2","direct":false,"kind":"runtime","optional":false},{"id":26031341819,"package_name":"networkx","ecosystem":"pypi","requirements":"3.5","direct":false,"kind":"runtime","optional":false},{"id":26031341820,"package_name":"nh3","ecosystem":"pypi","requirements":"0.2.21","direct":false,"kind":"runtime","optional":false},{"id":26031341821,"package_name":"nodeenv","ecosystem":"pypi","requirements":"1.9.1","direct":false,"kind":"runtime","optional":false},{"id":26031341822,"package_name":"numba","ecosystem":"pypi","requirements":"0.61.2","direct":false,"kind":"runtime","optional":false},{"id":26031341823,"package_name":"numcodecs","ecosystem":"pypi","requirements":"0.16.1","direct":false,"kind":"runtime","optional":false},{"id":26031341824,"package_name":"numpy","ecosystem":"pypi","requirements":"2.2.6","direct":false,"kind":"runtime","optional":false},{"id":26031341825,"package_name":"openpyxl","ecosystem":"pypi","requirements":"3.1.5","direct":false,"kind":"runtime","optional":false},{"id":26031341826,"package_name":"orjson","ecosystem":"pypi","requirements":"3.10.18","direct":false,"kind":"runtime","optional":false},{"id":26031341827,"package_name":"owslib","ecosystem":"pypi","requirements":"0.34.1","direct":false,"kind":"runtime","optional":false},{"id":26031341828,"package_name":"packaging","ecosystem":"pypi","requirements":"25.0","direct":false,"kind":"runtime","optional":false},{"id":26031341829,"package_name":"paginate","ecosystem":"pypi","requirements":"0.5.7","direct":false,"kind":"runtime","optional":false},{"id":26031341830,"package_name":"pandas","ecosystem":"pypi","requirements":"2.3.1","direct":false,"kind":"runtime","optional":false},{"id":26031341831,"package_name":"pandocfilters","ecosystem":"pypi","requirements":"1.5.1","direct":false,"kind":"runtime","optional":false},{"id":26031341832,"package_name":"parso","ecosystem":"pypi","requirements":"0.8.4","direct":false,"kind":"runtime","optional":false},{"id":26031341833,"package_name":"partd","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":26031341834,"package_name":"pathspec","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":26031341835,"package_name":"pexpect","ecosystem":"pypi","requirements":"4.9.0","direct":false,"kind":"runtime","optional":false},{"id":26031341836,"package_name":"pillow","ecosystem":"pypi","requirements":"11.3.0","direct":false,"kind":"runtime","optional":false},{"id":26031341837,"package_name":"pint","ecosystem":"pypi","requirements":"0.24.4","direct":false,"kind":"runtime","optional":false},{"id":26031341838,"package_name":"pint-pandas","ecosystem":"pypi","requirements":"0.7.1","direct":false,"kind":"runtime","optional":false},{"id":26031341839,"package_name":"pint-xarray","ecosystem":"pypi","requirements":"0.5.0","direct":false,"kind":"runtime","optional":false},{"id":26031341840,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.3.8","direct":false,"kind":"runtime","optional":false},{"id":26031341841,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":26031341842,"package_name":"polars","ecosystem":"pypi","requirements":"1.31.0","direct":false,"kind":"runtime","optional":false},{"id":26031341843,"package_name":"pre-commit","ecosystem":"pypi","requirements":"4.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341844,"package_name":"prompt-toolkit","ecosystem":"pypi","requirements":"3.0.51","direct":false,"kind":"runtime","optional":false},{"id":26031341845,"package_name":"propcache","ecosystem":"pypi","requirements":"0.3.2","direct":false,"kind":"runtime","optional":false},{"id":26031341846,"package_name":"psutil","ecosystem":"pypi","requirements":"7.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341847,"package_name":"psycopg2-binary","ecosystem":"pypi","requirements":"2.9.10","direct":false,"kind":"runtime","optional":false},{"id":26031341848,"package_name":"ptyprocess","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341849,"package_name":"pure-eval","ecosystem":"pypi","requirements":"0.2.3","direct":false,"kind":"runtime","optional":false},{"id":26031341850,"package_name":"py7zr","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341851,"package_name":"pyarrow","ecosystem":"pypi","requirements":"20.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341852,"package_name":"pybcj","ecosystem":"pypi","requirements":"1.0.6","direct":false,"kind":"runtime","optional":false},{"id":26031341853,"package_name":"pycares","ecosystem":"pypi","requirements":"4.9.0","direct":false,"kind":"runtime","optional":false},{"id":26031341854,"package_name":"pycodestyle","ecosystem":"pypi","requirements":"2.14.0","direct":false,"kind":"runtime","optional":false},{"id":26031341855,"package_name":"pycparser","ecosystem":"pypi","requirements":"2.22","direct":false,"kind":"runtime","optional":false},{"id":26031341856,"package_name":"pycryptodome","ecosystem":"pypi","requirements":"3.23.0","direct":false,"kind":"runtime","optional":false},{"id":26031341857,"package_name":"pycryptodomex","ecosystem":"pypi","requirements":"3.23.0","direct":false,"kind":"runtime","optional":false},{"id":26031341858,"package_name":"pydyf","ecosystem":"pypi","requirements":"0.11.0","direct":false,"kind":"runtime","optional":false},{"id":26031341859,"package_name":"pyflakes","ecosystem":"pypi","requirements":"3.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341860,"package_name":"pygeohydro","ecosystem":"pypi","requirements":"0.19.4","direct":false,"kind":"runtime","optional":false},{"id":26031341861,"package_name":"pygeoogc","ecosystem":"pypi","requirements":"0.19.4","direct":false,"kind":"runtime","optional":false},{"id":26031341862,"package_name":"pygeoutils","ecosystem":"pypi","requirements":"0.19.5","direct":false,"kind":"runtime","optional":false},{"id":26031341863,"package_name":"pygments","ecosystem":"pypi","requirements":"2.19.2","direct":false,"kind":"runtime","optional":false},{"id":26031341864,"package_name":"pykalman","ecosystem":"pypi","requirements":"0.10.1","direct":false,"kind":"runtime","optional":false},{"id":26031341865,"package_name":"pymdown-extensions","ecosystem":"pypi","requirements":"10.16.1","direct":false,"kind":"runtime","optional":false},{"id":26031341866,"package_name":"pynhd","ecosystem":"pypi","requirements":"0.19.4","direct":false,"kind":"runtime","optional":false},{"id":26031341867,"package_name":"pyogrio","ecosystem":"pypi","requirements":"0.11.0","direct":false,"kind":"runtime","optional":false},{"id":26031341868,"package_name":"pyparsing","ecosystem":"pypi","requirements":"3.2.3","direct":false,"kind":"runtime","optional":false},{"id":26031341869,"package_name":"pyphen","ecosystem":"pypi","requirements":"0.17.2","direct":false,"kind":"runtime","optional":false},{"id":26031341870,"package_name":"pyppmd","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341871,"package_name":"pyproj","ecosystem":"pypi","requirements":"3.7.1","direct":false,"kind":"runtime","optional":false},{"id":26031341872,"package_name":"pyproject-api","ecosystem":"pypi","requirements":"1.9.1","direct":false,"kind":"runtime","optional":false},{"id":26031341873,"package_name":"pyshp","ecosystem":"pypi","requirements":"2.3.1","direct":false,"kind":"runtime","optional":false},{"id":26031341874,"package_name":"pytest","ecosystem":"pypi","requirements":"8.4.1","direct":false,"kind":"runtime","optional":false},{"id":26031341875,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"6.2.1","direct":false,"kind":"runtime","optional":false},{"id":26031341876,"package_name":"pytest-mock","ecosystem":"pypi","requirements":"3.14.1","direct":false,"kind":"runtime","optional":false},{"id":26031341877,"package_name":"pytest-runner","ecosystem":"pypi","requirements":"6.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341878,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":26031341879,"package_name":"pytkdocs","ecosystem":"pypi","requirements":"0.16.5","direct":false,"kind":"runtime","optional":false},{"id":26031341880,"package_name":"pytz","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":26031341881,"package_name":"pywavelets","ecosystem":"pypi","requirements":"1.9.0","direct":false,"kind":"runtime","optional":false},{"id":26031341882,"package_name":"pywin32","ecosystem":"pypi","requirements":"311","direct":false,"kind":"runtime","optional":false},{"id":26031341883,"package_name":"pywin32-ctypes","ecosystem":"pypi","requirements":"0.2.3","direct":false,"kind":"runtime","optional":false},{"id":26031341884,"package_name":"pyyaml","ecosystem":"pypi","requirements":"6.0.2","direct":false,"kind":"runtime","optional":false},{"id":26031341885,"package_name":"pyyaml-env-tag","ecosystem":"pypi","requirements":"1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341886,"package_name":"pyzmq","ecosystem":"pypi","requirements":"27.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341887,"package_name":"pyzstd","ecosystem":"pypi","requirements":"0.18.0","direct":false,"kind":"runtime","optional":false},{"id":26031341888,"package_name":"rasterio","ecosystem":"pypi","requirements":"1.4.3","direct":false,"kind":"runtime","optional":false},{"id":26031341889,"package_name":"readme-renderer","ecosystem":"pypi","requirements":"44.0","direct":false,"kind":"runtime","optional":false},{"id":26031341890,"package_name":"referencing","ecosystem":"pypi","requirements":"0.36.2","direct":false,"kind":"runtime","optional":false},{"id":26031341891,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.4","direct":false,"kind":"runtime","optional":false},{"id":26031341892,"package_name":"requests-cache","ecosystem":"pypi","requirements":"1.2.1","direct":false,"kind":"runtime","optional":false},{"id":26031341893,"package_name":"requests-toolbelt","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341894,"package_name":"rfc3986","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341895,"package_name":"rich","ecosystem":"pypi","requirements":"14.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341896,"package_name":"rioxarray","ecosystem":"pypi","requirements":"0.19.0","direct":false,"kind":"runtime","optional":false},{"id":26031341897,"package_name":"roman-numerals-py","ecosystem":"pypi","requirements":"3.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341898,"package_name":"rpds-py","ecosystem":"pypi","requirements":"0.26.0","direct":false,"kind":"runtime","optional":false},{"id":26031341899,"package_name":"s3fs","ecosystem":"pypi","requirements":"2024.12.0","direct":false,"kind":"runtime","optional":false},{"id":26031341900,"package_name":"s3transfer","ecosystem":"pypi","requirements":"0.10.4","direct":false,"kind":"runtime","optional":false},{"id":26031341901,"package_name":"scikit-base","ecosystem":"pypi","requirements":"0.12.3","direct":false,"kind":"runtime","optional":false},{"id":26031341902,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"1.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341903,"package_name":"scipy","ecosystem":"pypi","requirements":"1.16.0","direct":false,"kind":"runtime","optional":false},{"id":26031341904,"package_name":"seaborn","ecosystem":"pypi","requirements":"0.13.2","direct":false,"kind":"runtime","optional":false},{"id":26031341905,"package_name":"secretstorage","ecosystem":"pypi","requirements":"3.3.3","direct":false,"kind":"runtime","optional":false},{"id":26031341906,"package_name":"setuptools","ecosystem":"pypi","requirements":"80.9.0","direct":false,"kind":"runtime","optional":false},{"id":26031341907,"package_name":"shapely","ecosystem":"pypi","requirements":"2.1.1","direct":false,"kind":"runtime","optional":false},{"id":26031341908,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":26031341909,"package_name":"smmap","ecosystem":"pypi","requirements":"5.0.2","direct":false,"kind":"runtime","optional":false},{"id":26031341910,"package_name":"snowballstemmer","ecosystem":"pypi","requirements":"3.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341911,"package_name":"sortedcontainers","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341912,"package_name":"soupsieve","ecosystem":"pypi","requirements":"2.7","direct":false,"kind":"runtime","optional":false},{"id":26031341913,"package_name":"sphinx","ecosystem":"pypi","requirements":"8.2.3","direct":false,"kind":"runtime","optional":false},{"id":26031341914,"package_name":"sphinxcontrib-applehelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341915,"package_name":"sphinxcontrib-devhelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341916,"package_name":"sphinxcontrib-htmlhelp","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341917,"package_name":"sphinxcontrib-jsmath","ecosystem":"pypi","requirements":"1.0.1","direct":false,"kind":"runtime","optional":false},{"id":26031341918,"package_name":"sphinxcontrib-qthelp","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341919,"package_name":"sphinxcontrib-serializinghtml","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341920,"package_name":"spotpy","ecosystem":"pypi","requirements":"1.6.6","direct":false,"kind":"runtime","optional":false},{"id":26031341921,"package_name":"sqlalchemy","ecosystem":"pypi","requirements":"2.0.41","direct":false,"kind":"runtime","optional":false},{"id":26031341922,"package_name":"stack-data","ecosystem":"pypi","requirements":"0.6.3","direct":false,"kind":"runtime","optional":false},{"id":26031341923,"package_name":"tblib","ecosystem":"pypi","requirements":"3.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341924,"package_name":"texttable","ecosystem":"pypi","requirements":"1.7.0","direct":false,"kind":"runtime","optional":false},{"id":26031341925,"package_name":"threadpoolctl","ecosystem":"pypi","requirements":"3.6.0","direct":false,"kind":"runtime","optional":false},{"id":26031341926,"package_name":"tinycss2","ecosystem":"pypi","requirements":"1.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341927,"package_name":"tinyhtml5","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341928,"package_name":"tokenize-rt","ecosystem":"pypi","requirements":"6.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341929,"package_name":"tomli","ecosystem":"pypi","requirements":"2.2.1","direct":false,"kind":"runtime","optional":false},{"id":26031341930,"package_name":"toolz","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341931,"package_name":"tornado","ecosystem":"pypi","requirements":"6.5.1","direct":false,"kind":"runtime","optional":false},{"id":26031341932,"package_name":"tox","ecosystem":"pypi","requirements":"4.28.3","direct":false,"kind":"runtime","optional":false},{"id":26031341933,"package_name":"tqdm","ecosystem":"pypi","requirements":"4.67.1","direct":false,"kind":"runtime","optional":false},{"id":26031341934,"package_name":"traitlets","ecosystem":"pypi","requirements":"5.14.3","direct":false,"kind":"runtime","optional":false},{"id":26031341935,"package_name":"twine","ecosystem":"pypi","requirements":"6.1.0","direct":false,"kind":"runtime","optional":false},{"id":26031341936,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.14.1","direct":false,"kind":"runtime","optional":false},{"id":26031341937,"package_name":"tzdata","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":26031341938,"package_name":"tzfpy","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341939,"package_name":"ujson","ecosystem":"pypi","requirements":"5.10.0","direct":false,"kind":"runtime","optional":false},{"id":26031341940,"package_name":"url-normalize","ecosystem":"pypi","requirements":"2.2.1","direct":false,"kind":"runtime","optional":false},{"id":26031341941,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.5.0","direct":false,"kind":"runtime","optional":false},{"id":26031341942,"package_name":"virtualenv","ecosystem":"pypi","requirements":"20.31.2","direct":false,"kind":"runtime","optional":false},{"id":26031341943,"package_name":"watchdog","ecosystem":"pypi","requirements":"6.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341944,"package_name":"wcwidth","ecosystem":"pypi","requirements":"0.2.13","direct":false,"kind":"runtime","optional":false},{"id":26031341945,"package_name":"weasyprint","ecosystem":"pypi","requirements":"66.0","direct":false,"kind":"runtime","optional":false},{"id":26031341946,"package_name":"webencodings","ecosystem":"pypi","requirements":"0.5.1","direct":false,"kind":"runtime","optional":false},{"id":26031341947,"package_name":"wget","ecosystem":"pypi","requirements":"3.2","direct":false,"kind":"runtime","optional":false},{"id":26031341948,"package_name":"wheel","ecosystem":"pypi","requirements":"0.45.1","direct":false,"kind":"runtime","optional":false},{"id":26031341949,"package_name":"win32-setctime","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":26031341950,"package_name":"wrapt","ecosystem":"pypi","requirements":"1.17.2","direct":false,"kind":"runtime","optional":false},{"id":26031341951,"package_name":"xarray","ecosystem":"pypi","requirements":"2025.7.1","direct":false,"kind":"runtime","optional":false},{"id":26031341952,"package_name":"xlrd","ecosystem":"pypi","requirements":"2.0.2","direct":false,"kind":"runtime","optional":false},{"id":26031341953,"package_name":"xyzservices","ecosystem":"pypi","requirements":"2025.4.0","direct":false,"kind":"runtime","optional":false},{"id":26031341954,"package_name":"yarl","ecosystem":"pypi","requirements":"1.20.1","direct":false,"kind":"runtime","optional":false},{"id":26031341955,"package_name":"zarr","ecosystem":"pypi","requirements":"3.0.10","direct":false,"kind":"runtime","optional":false},{"id":26031341956,"package_name":"zict","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":26031341957,"package_name":"zipp","ecosystem":"pypi","requirements":"3.23.0","direct":false,"kind":"runtime","optional":false},{"id":26031341958,"package_name":"zopfli","ecosystem":"pypi","requirements":"0.2.3.post1","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"pyproject.toml","sha":null,"kind":"manifest","created_at":"2026-08-10T16:24:24.463Z","updated_at":"2026-08-10T16:24:24.463Z","repository_link":"https://github.com/OuyangWenyu/hydromodel/blob/master/pyproject.toml","dependencies":[{"id":26031341491,"package_name":"ipykernel","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341492,"package_name":"numba","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341493,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341494,"package_name":"deap","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341495,"package_name":"spotpy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341496,"package_name":"pyyaml","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341497,"package_name":"bmipy","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341525,"package_name":"pyarrow","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341526,"package_name":"pytest","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341527,"package_name":"requests","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341528,"package_name":"setuptools","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341529,"package_name":"wheel","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341530,"package_name":"muskingumcunge","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341556,"package_name":"pytest-mock","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341557,"package_name":"rich","ecosystem":"pypi","requirements":"\u003e=14.0.0","direct":true,"kind":"runtime","optional":false},{"id":26031341558,"package_name":"pandas","ecosystem":"pypi","requirements":"\u003e=2.3.1","direct":true,"kind":"runtime","optional":false},{"id":26031341559,"package_name":"numpy","ecosystem":"pypi","requirements":"\u003e=2.2.6","direct":true,"kind":"runtime","optional":false},{"id":26031341560,"package_name":"netcdf4","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":26031341561,"package_name":"aqua-fetch","ecosystem":"pypi","requirements":"[all]","direct":true,"kind":"runtime","optional":false},{"id":26031341562,"package_name":"hydroutils","ecosystem":"pypi","requirements":"\u003e=0.1.0","direct":true,"kind":"runtime","optional":false},{"id":26031341565,"package_name":"hydrodataset","ecosystem":"pypi","requirements":"\u003e=0.2.3","direct":true,"kind":"runtime","optional":false},{"id":26031341571,"package_name":"hydrodatasource","ecosystem":"pypi","requirements":"\u003e=0.2.0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/build.yml","sha":null,"kind":"manifest","created_at":"2026-08-10T16:24:24.395Z","updated_at":"2026-08-10T16:24:24.395Z","repository_link":"https://github.com/OuyangWenyu/hydromodel/blob/master/.github/workflows/build.yml","dependencies":[{"id":26031341462,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":26031341463,"package_name":"astral-sh/setup-uv","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]}],"score":7.39018142822643,"created_at":"2026-04-06T08:34:19.121Z","updated_at":"2026-08-13T18:03:07.280Z","avatar_url":"https://github.com/OuyangWenyu.png","language":"Jupyter Notebook","category":"Hydrosphere","sub_category":"Freshwater and Hydrology","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# hydromodel\n\n[![image](https://img.shields.io/pypi/v/hydromodel.svg)](https://pypi.python.org/pypi/hydromodel)\n[![image](https://img.shields.io/conda/vn/conda-forge/hydromodel.svg)](https://anaconda.org/conda-forge/hydromodel)\n[![image](https://pyup.io/repos/github/OuyangWenyu/hydromodel/shield.svg)](https://pyup.io/repos/github/OuyangWenyu/hydromodel)\n\n**A lightweight Python package for hydrological model calibration and evaluation, featuring the XinAnJiang (XAJ) model.**\n\n- Free software: GNU General Public License v3\n- Documentation: https://OuyangWenyu.github.io/hydromodel\n\n## What is hydromodel\n\n`hydromodel` is a Python implementation of conceptual hydrological models, with a focus on the **XinAnJiang (XAJ) model** - one of the most widely-used rainfall-runoff models, especially in China and Asian regions.\n\n**Key Features:**\n- **XAJ Model Variants**: Standard XAJ and optimized versions (xaj_mz with MizuRoute)\n- **Multiple Calibration Algorithms**:\n  - **SCE-UA**: Shuffled Complex Evolution with spotpy\n  - **GA**: Genetic Algorithm with DEAP\n  - **scipy**: L-BFGS-B, SLSQP, and other gradient-based methods\n- **Multi-Basin Support**: Efficient calibration and evaluation for multiple basins simultaneously\n- **Unified Results Format**: All algorithms save results in standardized JSON + CSV format\n- **Comprehensive Evaluation Metrics**: NSE, KGE, RMSE, PBIAS, and more\n- **Unified API**: Consistent interfaces for calibration, evaluation, and simulation\n- **Flexible Data Integration**: Seamless support for CAMELS datasets via [hydrodataset](https://github.com/OuyangWenyu/hydrodataset) and custom data via [hydrodatasource](https://github.com/OuyangWenyu/hydrodatasource)\n- **Configuration-Based Workflow**: YAML configuration for reproducibility\n- **Progress Tracking**: Real-time progress display and intermediate results saving\n\n## Why hydromodel?\n\n**For Researchers:**\n- Battle-tested XAJ implementations used in published research\n- Configuration-based workflow ensures reproducibility\n- Easy to extend with new models or calibration algorithms\n\n**For Practitioners:**\n- Simple YAML configuration, minimal coding required\n- Handles multi-basin calibration efficiently\n- Integration with global CAMELS series datasets (20+ variants)\n- Clear documentation and examples\n\n## Installation\n\n### For Users\n\n```bash\npip install hydromodel hydrodataset hydrodatasource\n```\n\nOr using `uv` (faster):\n\n```bash\nuv pip install hydromodel hydrodataset hydrodatasource\n```\n\n### Development Setup\n\nFor developers, it is recommended to use `uv` to manage the environment, as this project has local dependencies (e.g., `hydroutils`, `hydrodataset`, `hydrodatasource`).\n\n1. **Clone the repository:**\n   ```bash\n   git clone https://github.com/OuyangWenyu/hydromodel.git\n   cd hydromodel\n   ```\n\n2. **Sync the environment with `uv`:**\n   This command will install all dependencies, including the local editable packages.\n   ```bash\n   uv sync --all-extras\n   ```\n\n### Configuration\n\n#### Option 1: Use Default Paths (Recommended for Quick Start)\n\nNo configuration needed! `hydromodel` automatically uses default paths:\n\n**Default data directory:**\n- **Windows:** `C:\\Users\\YourUsername\\hydromodel_data\\`\n- **macOS/Linux:** `~/hydromodel_data/`\n\nThe default structure (aqua_fetch automatically creates uppercase dataset directories):\n```\n~/hydromodel_data/\n├── datasets-origin/\n│   ├── CAMELS_US/        # CAMELS US dataset (created by aqua_fetch)\n│   ├── CAMELS_AUS/       # CAMELS Australia dataset (if used)\n│   └── ...               # Other datasets\n├── datasets-interim/        # Your custom basin data\n└── ...\n```\n\n#### Option 2: Custom Paths (For Advanced Users)\n\nCreate `~/hydro_setting.yml` to specify custom paths:\n\n```yaml\nlocal_data_path:\n  root: 'D:/data'\n  datasets-origin: 'D:/data'             # For CAMELS datasets (aqua_fetch adds CAMELS_US automatically)\n  datasets-interim: 'D:/data/my_basins'     # For custom data\n```\n\n**Important**: For CAMELS datasets, provide only the `datasets-origin` directory. The system automatically appends the uppercase dataset directory name (e.g., `CAMELS_US`, `CAMELS_AUS`). **If your data is in `D:/data/CAMELS_US/`, set `datasets-origin: 'D:/data'`**.\n\n## How to Use\n\n### 1. Data Preparation\n\n**Using CAMELS Datasets (hydrodataset):**\n\nGetting public datasets using hydrodataset\n\n```bash\npip install hydrodataset\n```\nRun the following code to download data to your directory\n```python\nfrom hydrodataset.camels_us import CamelsUs\n\n# Auto-downloads if not found. Provide datasets-origin directory (e.g., \"D:/data\")\n# aqua_fetch automatically appends dataset name, creating \"D:/data/CAMELS_US/\"\nds = CamelsUs(data_path)\nbasin_ids = ds.read_object_ids()  # Get basin IDs\n```\n\n**Note:** First-time download may take some time. The complete CAMELS dataset is approximately 70GB (including zipped and unzipped files).\n\n**Available datasets:** please see [README.md in hydrodataset](https://github.com/OuyangWenyu/hydrodataset?tab=readme-ov-file#supported-datasets)\n\n**Using Custom Data (hydrodatasource):**\n\nFor your own data to be read using hydrodatasource, it needs to be prepared in the format of  `selfmadehydrodataset` :\n\n```bash\npip install hydrodatasource\n```\n\n**Data structure:**\n```\n/path/to/your_data_root/\n    └── my_custom_dataset/              # your dataset name\n        ├── attributes/\n        │   └── attributes.csv\n        ├── shapes/\n        │   └── basins.shp\n        └── timeseries/\n            ├── 1D/                     # One sub folder per time resolution (e.g. 1D/3h/1h)\n            │   ├── basin_01.csv\n            │   ├── basin_02.csv\n            │   └── ...\n            └── 1D_units_info.json      # JSON file containing unit information\n```\n\n**Required files and formats:**\n\n1. **attributes/attributes.csv**: Basin metadata with required columns\n   - `basin_id`: Unique basin identifier (e.g., \"basin_001\")\n   - `area`: Basin area in km² (mapped to `basin_area` internally)\n   - Additional columns: Any basin attributes (e.g., elevation, slope)\n\n2. **shapes/basins.shp**: Basin boundary shapefiles (all 4 files required: .shp, .shx, .dbf, .prj)\n   - Must contain `BASIN_ID` column (uppercase) matching basin IDs in attributes.csv\n   - Geometries: Polygon features defining basin boundaries\n   - Coordinate system: Any valid CRS (e.g., EPSG:4326 for WGS84)\n\n3. **timeseries/{time_scale}/{basin_id}.csv**: Time series data for each basin\n   - `time`: Datetime column (e.g., \"2010-01-01\")\n   - Variable columns: `prcp`, `PET`, `streamflow` (or your chosen variable names)\n   - Format: CSV with header row\n\n4. **timeseries/{time_scale}_units_info.json**: Variable units metadata\n   - JSON format: `{\"variable_name\": \"unit\"}` (e.g., `{\"prcp\": \"mm/day\"}`)\n   - Must match variable names in time series files\n\n\nFor detailed format specifications and examples, see:\n- [Data Guide](docs/data_guide.md) - Complete guide for both CAMELS and custom data\n- [hydrodatasource documentation](https://github.com/OuyangWenyu/hydrodatasource) - Source package\n- `configs/example_config_selfmade.yaml` - Complete configuration example for custom datasets\n\n### 2. Quick Start: Calibration, Evaluation, Simulation, and Visualization\n\n**Option 1: Use Command-Line Scripts (Recommended for Beginners)**\n\nWe provide ready-to-use scripts for model calibration, evaluation, simulation, and visualization:\n\n```bash\n# 1. Calibration (saves config files by default)\npython scripts/run_xaj_calibration.py --config configs/example_config.yaml\n\n# 2. Evaluation on test period\npython scripts/run_xaj_evaluate.py --calibration-dir results/xaj_mz_SCE_UA \n\n# 3. Simulation with custom parameters (no calibration required!)\npython scripts/run_xaj_simulate.py --config configs/example_simulate_config.yaml --param-file configs/example_xaj_params.yaml --plot\n\n# 4. Visualization (time series plots with precipitation and streamflow)\npython scripts/visualize.py --eval-dir results/xaj_mz_SCE_UA/evaluation_test\n\n# Visualize specific basins\npython scripts/visualize.py --eval-dir results/xaj_mz_SCE_UA/evaluation_test --basins 01013500\n\n```\n\n**Configuration Files:**\n\nEdit the appropriate configuration file for your data type:\n- `configs/example_config.yaml` - For continuous time series data (e.g., CAMELS datasets)\n- `configs/example_config_selfmade.yaml` - For custom data and flood event datasets\n\nAll configuration options work with the same unified API. For detailed flood event data usage, see [Usage Guide - Flood Event Data](docs/usage.md#flood-event-data).\n\n**Option 2: Use Python API (For Advanced Users)**\n\n```python\nfrom hydromodel.trainers.unified_calibrate import calibrate\nfrom hydromodel.trainers.unified_evaluate import evaluate\n\nconfig = {\n    \"data_cfgs\": {\n        \"data_source_type\": \"camels_us\",\n        \"basin_ids\": [\"01013500\"],\n        \"train_period\": [\"1985-10-01\", \"1995-09-30\"],\n        \"test_period\": [\"2005-10-01\", \"2014-09-30\"],\n        \"warmup_length\": 365,\n        \"variables\": [\"precipitation\", \"potential_evapotranspiration\", \"streamflow\"]\n    },\n    \"model_cfgs\": {\n        \"model_name\": \"xaj_mz\",\n    },\n    \"training_cfgs\": {\n        \"algorithm_name\": \"SCE_UA\",\n        \"algorithm_params\": {\"rep\": 5000, \"ngs\": 1000},\n        \"loss_config\": {\"type\": \"time_series\", \"obj_func\": \"RMSE\"},\n        \"output_dir\": \"results\",\n        \"experiment_name\": \"my_experiment\",\n    },\n    \"evaluation_cfgs\": {\n        \"metrics\": [\"NSE\", \"KGE\", \"RMSE\"],\n    },\n}\n\nresults = calibrate(config)  # Calibrate\nevaluate(config, param_dir=\"results/my_experiment\", eval_period=\"test\")  # Evaluate\n```\n\nResults are saved in the `results/` directory.\n\n## Core API\n\n### Configuration Structure\n\nThe unified API uses a configuration dictionary with four main sections:\n\n```python\nconfig = {\n    \"data_cfgs\": {\n        \"data_source_type\": \"camels_us\",       # Dataset type\n        \"basin_ids\": [\"01013500\"],             # Basin IDs to calibrate\n        \"train_period\": [\"1990-10-01\", \"2000-09-30\"],\n        \"test_period\": [\"2000-10-01\", \"2010-09-30\"],\n        \"warmup_length\": 365,                  # Warmup days\n        \"variables\": [\"precipitation\", \"potential_evapotranspiration\", \"streamflow\"],\n    },\n    \"model_cfgs\": {\n        \"model_name\": \"xaj_mz\",                # Model variant\n        \"model_params\": {\n            \"source_type\": \"sources\",\n            \"source_book\": \"HF\",\n            \"kernel_size\": 15,                 # Muskingum routing kernel\n        },\n    },\n    \"training_cfgs\": {\n        \"algorithm_name\": \"GA\",                # Algorithm: SCE_UA, GA, or scipy\n\n        # Algorithm-specific parameters (choose one based on algorithm_name)\n\n        # For SCE-UA (Shuffled Complex Evolution):\n        \"SCE_UA\": {\n            \"rep\": 1000,                       # Iterations (5000+ recommended)\n            \"ngs\": 1000,                       # Number of complexes\n            \"kstop\": 500,                      # Stop if no improvement\n            \"peps\": 0.1,                       # Parameter convergence\n            \"pcento\": 0.1,                     # Percentage change allowed\n            \"random_seed\": 1234,\n        },\n\n        # For GA (Genetic Algorithm):\n        \"GA\": {\n            \"pop_size\": 80,                    # Population size\n            \"n_generations\": 50,               # Generations (100+ recommended)\n            \"cx_prob\": 0.7,                    # Crossover probability\n            \"mut_prob\": 0.2,                   # Mutation probability\n            \"random_seed\": 1234,\n        },\n\n        # For scipy (gradient-based optimization):\n        \"scipy\": {\n            \"method\": \"SLSQP\",                 # L-BFGS-B, SLSQP, TNC, etc.\n            \"max_iterations\": 500,             # Maximum iterations\n        },\n\n        \"loss_config\": {\n            \"type\": \"time_series\",\n            \"obj_func\": \"RMSE\",                # RMSE, NSE, or KGE\n        },\n        \"output_dir\": \"results\",\n        \"experiment_name\": \"my_exp\",\n        \"save_config\": True,                   # Save config files to output directory (default: True)\n    },\n    \"evaluation_cfgs\": {\n        \"metrics\": [\"NSE\", \"KGE\", \"RMSE\", \"PBIAS\"],\n    },\n}\n```\n**Configuration for custom datasets:**\n\nSee `configs/example_config_selfmade.yaml` for a complete example. Custom datasets require additional parameters:\n\n```python\n\"data_cfgs\": {\n  \"dataset\": \"selfmadehydrodataset\"     # or \"floodevent\" for flood event data\n  \"dataset_name\": \"my_basin_data\"       # Your dataset folder name (REQUIRED)\n  \"time_unit\": [\"1D\"]                  # Time resolution (e.g., [\"1h\"], [\"3h\"], [\"1D\"])\n  \"datasource_kwargs\":{                # Optional additional parameters\n    \"offset_to_utc\": False             # Whether to convert local time to UTC\n    }              \n  \"is_event_data\": True                # Whether floodevent data\n  # ... other standard parameters (basin_ids, variables, periods, etc.)\n```\n\n**Key differences from CAMELS datasets:**\n- `dataset_name`: Specifies your custom dataset folder name (required)\n- `time_unit`: Must match the subdirectory names in `timeseries/` folder\n- `datasource_kwargs`: Optional parameters for data preprocessing\n\n### Calibration API\n\n```python\nfrom hydromodel.trainers.unified_calibrate import calibrate\n\nresults = calibrate(config)\n```\n\n**Output:** Calibration results saved to `{output_dir}/{experiment_name}/`\n\n**Saved files:**\n```\nresults/my_exp/\n├── calibration_results.json          # Best parameters for all basins (unified format)\n├── {basin_id}_sceua.csv              # SCE-UA detailed iteration history\n├── {basin_id}_ga.csv                 # GA generation history with parameters\n├── {basin_id}_scipy.csv              # scipy iteration history with parameters\n├── calibration_config.yaml           # Configuration used (saved if save_config=True)\n└── param_range.yaml                  # Parameter ranges for current model only (saved if save_config=True)\n```\n\n**Notes:**\n- `calibration_results.json`: Always saved, contains best parameters\n- `calibration_config.yaml` and `param_range.yaml`: Only saved if `save_config=True` (default)\n- `param_range.yaml`: Contains parameter ranges for the current model only (e.g., only `xaj_mz`, not all models)\n- In `calibration_config.yaml`, `param_range_file` is set to the actual saved path\n\n**Available algorithms:**\n- `SCE_UA` / `sceua`: Shuffled Complex Evolution (recommended for global optimization)\n- `GA` / `genetic_algorithm`: Genetic Algorithm with DEAP (flexible, handles complex landscapes)\n- `scipy` / `scipy_minimize`: scipy.optimize methods (fast for smooth objectives)\n\n### Evaluation API\n\n```python\nfrom hydromodel.trainers.unified_evaluate import evaluate\n\n# Evaluate on test period\ntest_results = evaluate(config, param_dir=\"results/my_exp\", eval_period=\"test\")\n\n# Evaluate on training period\ntrain_results = evaluate(config, param_dir=\"results/my_exp\", eval_period=\"train\")\n\n# Evaluate on custom period\ncustom_results = evaluate(\n    config,\n    param_dir=\"results/my_exp\",\n    eval_period=\"custom\",\n    custom_period=[\"2010-10-01\", \"2015-09-30\"]\n)\n```\n\n**Output:** Evaluation results in `{param_dir}/evaluation_{period}/`\n- `basins_metrics.csv` - Performance metrics\n- `basins_norm_params.csv` - Calibrated parameters (normalized [0,1])\n- `basins_denorm_params.csv` - Denormalized parameters (physical values)\n- `xaj_mz_evaluation_results.nc` - Full simulation results (NetCDF)\n\n**Parameter Loading Priority:**\n1. `calibration_results.json` (⭐ Recommended, works for all algorithms)\n2. `{basin_id}_ga.csv` (GA algorithm CSV)\n3. `{basin_id}_scipy.csv` (scipy algorithm CSV)\n4. `{basin_id}_sceua.csv` (SCE-UA algorithm CSV)\n5. `{basin_id}_calibrate_params.txt` (Legacy format)\n\n**Available metrics:** NSE, KGE, RMSE, PBIAS, FHV, FLV, FMS\n\n### Understanding Results Format\n\n**calibration_results.json structure:**\n```json\n{\n  \"01013500\": {\n    \"convergence\": \"success\",\n    \"objective_value\": 1.234567,\n    \"best_params\": {\n      \"xaj\": {\n        \"K\": 0.567890,\n        \"B\": 0.234567,\n        \"IM\": 0.045678,\n        ...\n      }\n    },\n    \"algorithm_info\": {\n      \"generations\": 50,\n      \"population_size\": 80,\n      ...\n    }\n  }\n}\n```\n\n**CSV files (GA/scipy) structure:**\n```csv\ngeneration,objective_value,param_K,param_B,param_IM,...\n0,3.456,0.567,0.234,0.045,...\n1,2.345,0.589,0.256,0.047,...\n```\n\n**Why two formats?**\n- **JSON**: Best parameters only, works with all algorithms, used by evaluation\n- **CSV**: Full iteration/generation history, useful for convergence analysis\n\n### Simulation API\n\n**Important:** Simulation does NOT require prior calibration!\n\n`UnifiedSimulator` provides a flexible interface for running model simulations with any parameter values:\n\n```python\nfrom hydromodel.trainers.unified_simulate import UnifiedSimulator\nfrom hydromodel.datasets.unified_data_loader import UnifiedDataLoader\n\n# Load data\ndata_loader = UnifiedDataLoader(config[\"data_cfgs\"])\np_and_e, qobs = data_loader.load_data()\n\n# Define parameters (from calibration, literature, or custom values)\nparameters = {\n    \"K\": 0.75, \"B\": 0.25, \"IM\": 0.06,\n    \"UM\": 18.0, \"LM\": 80.0, \"DM\": 95.0,\n    # ... other parameters\n}\n\n# Create simulator\nmodel_config = {\n    \"model_name\": \"xaj_mz\",\n    \"parameters\": parameters\n}\nsimulator = UnifiedSimulator(model_config, basin_config)\n\n# Run simulation\nresults = simulator.simulate(\n    inputs=p_and_e,\n    qobs=qobs,\n    warmup_length=365\n)\n\n# Extract results\nqsim = results[\"qsim\"]  # Simulated streamflow\n```\n\n**Command-line usage:**\n\n```bash\n# Using custom parameters (works with any parameter values)\npython scripts/run_xaj_simulate.py \\\n    --config configs/example_simulate_config.yaml \\\n    --param-file configs/example_xaj_params.yaml \\\n    --output simulation_results.csv \\\n    --plot\n\n# Using calibrated parameters from SCE-UA (CSV format)\npython scripts/run_xaj_simulate.py \\\n    --param-file results/xaj_mz_SCE_UA/01013500_sceua.csv \\\n    --plot\n```\n\n**Use cases:**\n- Parameter sensitivity analysis\n- Model comparison\n- Scenario testing with custom parameters\n- Literature parameter validation\n\nFor detailed API documentation and advanced usage, see [Usage Guide - Model Simulation](docs/usage.md#model-simulation).\n\n## Project Structure\n\n```\nhydromodel/\n├── hydromodel/\n│   ├── models/                      # Model implementations\n│   │   ├── xaj.py                   # Standard XAJ model\n│   │   ├── gr4j.py                  # GR4J model\n│   │   └── ...\n│   ├── trainers/                    # Calibration, evaluation, and simulation\n│   │   ├── unified_calibrate.py     # Calibration API\n│   │   ├── unified_evaluate.py      # Evaluation API\n│   │   └── unified_simulate.py      # Simulation API\n│   └── datasets/                    # Data preprocessing and visualization\n│       ├── unified_data_loader.py   # Data loader\n│       ├── data_visualize.py        # Visualization functions\n│       └── ...\n├── scripts/                         # Command-line interface scripts\n│   ├── run_xaj_calibration.py       # Calibration script\n│   ├── run_xaj_evaluate.py          # Evaluation script\n│   ├── run_xaj_simulate.py          # Simulation script\n│   └── visualize.py                 # Visualization CLI\n├── configs/                         # Configuration files\n└── docs/                            # Documentation\n```\n\n## Documentation\n\n- **Quick Start**: [docs/quickstart.md](docs/quickstart.md)\n- **Usage Guide**: [docs/usage.md](docs/usage.md)\n- **API Reference**: https://OuyangWenyu.github.io/hydromodel\n\n## References\n\n- Allen, R.G., L. Pereira, D. Raes, and M. Smith, 1998. Crop Evapotranspiration, Food and Agriculture Organization of\n  the United Nations, Rome, Italy. FAO publication 56. ISBN 92-5-104219-5. 290p.\n- Duan, Q., Sorooshian, S., and Gupta, V. (1992), Effective and efficient global optimization for conceptual\n  rainfall-runoff models, Water Resour. Res., 28( 4), 1015– 1031, doi:10.1029/91WR02985.\n- François-Michel De Rainville, Félix-Antoine Fortin, Marc-André Gardner, Marc Parizeau, and Christian Gagné. 2012.\n  DEAP: a python framework for evolutionary algorithms. In Proceedings of the 14th annual conference companion on\n  Genetic and evolutionary computation (GECCO '12). Association for Computing Machinery, New York, NY, USA, 85–92.\n  DOI:https://doi.org/10.1145/2330784.2330799\n- Houska T, Kraft P, Chamorro-Chavez A, Breuer L (2015) SPOTting Model Parameters Using a Ready-Made Python Package.\n  PLoS ONE 10(12): e0145180. https://doi.org/10.1371/journal.pone.0145180\n- Mizukami, N., Clark, M. P., Sampson, K., Nijssen, B., Mao, Y., McMillan, H., Viger, R. J., Markstrom, S. L., Hay, L.\n  E., Woods, R., Arnold, J. R., and Brekke, L. D.: mizuRoute version 1: a river network routing tool for a continental\n  domain water resources applications, Geosci. Model Dev., 9, 2223–2238, https://doi.org/10.5194/gmd-9-2223-2016, 2016.\n- Zhao, R.J., Zhuang, Y. L., Fang, L. R., Liu, X. R., Zhang, Q. S. (ed) (1980) The Xinanjiang model, Hydrological\n  Forecasting Proc., Oxford Symp., IAHS Publication, Wallingford, U.K.\n- Zhao, R.J., 1992. The xinanjiang model applied in China. J Hydrol 135 (1–4), 371–381.\n\n**Related Projects:**\n- [hydrodataset](https://github.com/OuyangWenyu/hydrodataset) - CAMELS and other datasets\n- [hydrodatasource](https://github.com/OuyangWenyu/hydrodatasource) - Data preparation utilities\n- [torchhydro](https://github.com/OuyangWenyu/torchhydro) - PyTorch-based hydrological models\n\n## Citation\n\nIf you use hydromodel in your research, please cite:\n\n```bibtex\n@software{hydromodel,\n  author = {Ouyang, Wenyu},\n  title = {hydromodel: A Python Package for Hydrological Model Calibration},\n  year = {2025},\n  url = {https://github.com/OuyangWenyu/hydromodel}\n}\n```\n\n## Contributing\n\nContributions are welcome! For major changes, please open an issue first.\n\n```bash\ngit clone https://github.com/OuyangWenyu/hydromodel.git\ncd hydromodel\nuv sync --all-extras\npytest tests/\n```\n\n## License\n\nGNU General Public License v3.0 - see [LICENSE](LICENSE) file.\n\n## Contact\n\n- **Author**: Wenyu Ouyang\n- **Email**: wenyuouyang@outlook.com\n- **GitHub**: https://github.com/OuyangWenyu/hydromodel\n- **Issues**: https://github.com/OuyangWenyu/hydromodel/issues\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.1145/2330784.2330799","https://doi.org/10.1371/journal.pone.0145180","https://doi.org/10.5194/gmd-9-2223-2016"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["hydrology","water-resources"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/350823","html_url":"https://ost.ecosyste.ms/projects/350823"}