{"id":318989,"name":"Electricity Demand Data","description":"A Python-based project focused on collecting, processing, and forecasting hourly electricity demand data.","url":"https://github.com/open-energy-transition/demandcast","last_synced_at":"2026-05-27T03:02:17.442Z","repository":{"id":274639500,"uuid":"922666818","full_name":"open-energy-transition/demandcast","owner":"open-energy-transition","description":"Retrieve historic electricity demand, weather and socioeconomic data and generate synthetic future demand predictions using ML models","archived":false,"fork":false,"pushed_at":"2026-04-17T09:44:21.000Z","size":154177,"stargazers_count":31,"open_issues_count":5,"forks_count":7,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-14T21:06:59.553Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://open-energy-transition.github.io/demandcast/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/open-energy-transition.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":null,"security":"security.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-26T19:48:47.000Z","updated_at":"2026-05-10T21:36:18.000Z","dependencies_parsed_at":"2026-01-08T12:03:13.617Z","dependency_job_id":null,"html_url":"https://github.com/open-energy-transition/demandcast","commit_stats":null,"previous_names":["open-energy-transition/electric-demand-data","open-energy-transition/demandcast"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/open-energy-transition/demandcast","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-energy-transition","download_url":"https://codeload.github.com/open-energy-transition/demandcast/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33120450,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T18:38:32.183Z","status":"ssl_error","status_checked_at":"2026-05-16T18:38:29.903Z","response_time":115,"last_error":"SSL_read: 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":"open-energy-transition","name":"open-energy-transition","uuid":"131007753","kind":"organization","description":null,"email":null,"website":null,"location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/131007753?v=4","repositories_count":1,"last_synced_at":"2023-05-03T12:28:56.288Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/open-energy-transition","funding_links":[],"total_stars":null,"followers":null,"following":null,"created_at":"2023-05-03T12:28:56.289Z","updated_at":"2023-05-03T12:28:56.289Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-energy-transition","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-energy-transition/repositories"},"packages":[],"commits":{"id":10401100,"full_name":"open-energy-transition/demandcast","default_branch":"main","total_commits":70,"total_committers":5,"total_bot_commits":4,"total_bot_committers":1,"mean_commits":14.0,"dds":0.5714285714285714,"past_year_total_commits":51,"past_year_total_committers":4,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":12.75,"past_year_dds":0.5490196078431373,"last_synced_at":"2026-05-25T02:07:52.973Z","last_synced_commit":"c0dfeab3681d99c863dae63cf0e07be5e076fd91","created_at":"2025-06-20T00:05:27.004Z","updated_at":"2026-05-25T02:07:12.686Z","committers":[{"name":"Enrico Antonini","email":"50218270+eantonini","login":"eantonini","count":30},{"name":"Kevin Steijn","email":"193539781+ElectricMountains","login":"ElectricMountains","count":18},{"name":"Goli Vamsi Priya","email":"golivamsipriya22@gmail.com","login":"Vamsipriya22","count":17},{"name":"pre-commit-ci[bot]","email":"66853113+pre-commit-ci[bot]","login":"pre-commit-ci[bot]","count":4},{"name":"Copilot","email":"198982749+Copilot","login":"Copilot","count":1}],"past_year_committers":[{"name":"Enrico Antonini","email":"50218270+eantonini","login":"eantonini","count":23},{"name":"Goli Vamsi Priya","email":"golivamsipriya22@gmail.com","login":"Vamsipriya22","count":16},{"name":"Kevin Steijn","email":"193539781+ElectricMountains","login":"ElectricMountains","count":11},{"name":"Copilot","email":"198982749+Copilot","login":"Copilot","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-27T00:00:12.503Z","repositories_count":6242641,"commits_count":883113407,"contributors_count":34930998,"owners_count":1157951,"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":"open-energy-transition/demandcast","html_url":"https://github.com/open-energy-transition/demandcast","last_synced_at":"2026-05-15T14:10:59.381Z","status":null,"issues_count":7,"pull_requests_count":95,"avg_time_to_close_issue":3607057.5,"avg_time_to_close_pull_request":1357846.4567901234,"issues_closed_count":4,"pull_requests_closed_count":81,"pull_request_authors_count":5,"issue_authors_count":4,"avg_comments_per_issue":0.8571428571428571,"avg_comments_per_pull_request":0.25263157894736843,"merged_pull_requests_count":67,"bot_issues_count":0,"bot_pull_requests_count":5,"past_year_issues_count":7,"past_year_pull_requests_count":59,"past_year_avg_time_to_close_issue":3607057.5,"past_year_avg_time_to_close_pull_request":1409800.3555555556,"past_year_issues_closed_count":4,"past_year_pull_requests_closed_count":45,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":4,"past_year_avg_comments_per_issue":0.8571428571428571,"past_year_avg_comments_per_pull_request":0.2542372881355932,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":38,"created_at":"2025-06-20T00:05:27.652Z","updated_at":"2026-05-15T14:10:59.382Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-energy-transition%2Fdemandcast/issues","issue_labels_count":{"Enhancement":5,"Bug":2},"pull_request_labels_count":{"Python":70,"Docs":35,"GitHub Actions":21},"issue_author_associations_count":{"MEMBER":3,"COLLABORATOR":3,"NONE":1},"pull_request_author_associations_count":{"COLLABORATOR":53,"CONTRIBUTOR":33,"MEMBER":9},"issue_authors":{"ElectricMountains":3,"eantonini":2,"ekatef":1,"nd8696":1},"pull_request_authors":{"eantonini":35,"ElectricMountains":27,"Vamsipriya22":27,"pre-commit-ci[bot]":5,"Copilot":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-05-25T00:00:55.688Z","repositories_count":14693537,"issues_count":33976022,"pull_requests_count":111262843,"authors_count":11273256,"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":{"Enhancement":5,"Bug":2},"past_year_pull_request_labels_count":{"Python":39,"Docs":13,"GitHub Actions":11},"past_year_issue_author_associations_count":{"COLLABORATOR":3,"MEMBER":3,"NONE":1},"past_year_pull_request_author_associations_count":{"COLLABORATOR":24,"CONTRIBUTOR":22,"MEMBER":9},"past_year_issue_authors":{"ElectricMountains":3,"eantonini":2,"ekatef":1,"nd8696":1},"past_year_pull_request_authors":{"Vamsipriya22":21,"eantonini":18,"ElectricMountains":15,"Copilot":1},"maintainers":[{"login":"eantonini","count":37,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/eantonini"},{"login":"ElectricMountains","count":30,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ElectricMountains"},{"login":"ekatef","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ekatef"}],"active_maintainers":[{"login":"eantonini","count":20,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/eantonini"},{"login":"ElectricMountains","count":18,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ElectricMountains"},{"login":"ekatef","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ekatef"}]},"events":{"total":{"ReleaseEvent":1,"DeleteEvent":24,"PullRequestEvent":36,"IssuesEvent":15,"WatchEvent":6,"IssueCommentEvent":10,"PushEvent":268,"PullRequestReviewCommentEvent":54,"PullRequestReviewEvent":59,"CreateEvent":21},"last_year":{"ReleaseEvent":1,"DeleteEvent":24,"PullRequestEvent":36,"IssuesEvent":15,"WatchEvent":6,"IssueCommentEvent":10,"PushEvent":268,"PullRequestReviewCommentEvent":54,"PullRequestReviewEvent":59,"CreateEvent":21}},"keywords":[],"dependencies":[{"ecosystem":"docker","filepath":"ETL/Dockerfile","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:13.417Z","updated_at":"2025-12-15T21:19:13.417Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/ETL/Dockerfile","dependencies":[{"id":25770066619,"package_name":"python","ecosystem":"docker","requirements":"3.12","direct":true,"kind":"build","optional":false}]},{"ecosystem":"pypi","filepath":"webpage/pyproject.toml","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:35.665Z","updated_at":"2025-12-15T21:19:35.665Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/webpage/pyproject.toml","dependencies":[{"id":25770069273,"package_name":"mkdocs-material","ecosystem":"pypi","requirements":"\u003e=9.5.50","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"ETL/uv.lock","sha":null,"kind":"lockfile","created_at":"2025-12-15T21:19:22.656Z","updated_at":"2025-12-15T21:19:22.656Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/ETL/uv.lock","dependencies":[{"id":25770067353,"package_name":"affine","ecosystem":"pypi","requirements":"2.4.0","direct":false,"kind":"runtime","optional":false},{"id":25770067355,"package_name":"attrs","ecosystem":"pypi","requirements":"25.4.0","direct":false,"kind":"runtime","optional":false},{"id":25770067356,"package_name":"beautifulsoup4","ecosystem":"pypi","requirements":"4.14.2","direct":false,"kind":"runtime","optional":false},{"id":25770067357,"package_name":"brotli","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":25770067358,"package_name":"brotlicffi","ecosystem":"pypi","requirements":"1.2.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770067619,"package_name":"cachetools","ecosystem":"pypi","requirements":"6.2.2","direct":false,"kind":"runtime","optional":false},{"id":25770067620,"package_name":"cartopy","ecosystem":"pypi","requirements":"0.25.0","direct":false,"kind":"runtime","optional":false},{"id":25770067621,"package_name":"cdsapi","ecosystem":"pypi","requirements":"0.7.7","direct":false,"kind":"runtime","optional":false},{"id":25770067622,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.11.12","direct":false,"kind":"runtime","optional":false},{"id":25770067623,"package_name":"cffi","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770067624,"package_name":"cftime","ecosystem":"pypi","requirements":"1.6.5","direct":false,"kind":"runtime","optional":false},{"id":25770067667,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.4.4","direct":false,"kind":"runtime","optional":false},{"id":25770067668,"package_name":"click","ecosystem":"pypi","requirements":"8.3.1","direct":false,"kind":"runtime","optional":false},{"id":25770067669,"package_name":"click-plugins","ecosystem":"pypi","requirements":"1.1.1.2","direct":false,"kind":"runtime","optional":false},{"id":25770067686,"package_name":"cligj","ecosystem":"pypi","requirements":"0.7.2","direct":false,"kind":"runtime","optional":false},{"id":25770067700,"package_name":"cloudpickle","ecosystem":"pypi","requirements":"3.1.2","direct":false,"kind":"runtime","optional":false},{"id":25770067701,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":25770067702,"package_name":"contourpy","ecosystem":"pypi","requirements":"1.3.3","direct":false,"kind":"runtime","optional":false},{"id":25770067703,"package_name":"countryinfo","ecosystem":"pypi","requirements":"0.1.2","direct":false,"kind":"runtime","optional":false},{"id":25770067704,"package_name":"coverage","ecosystem":"pypi","requirements":"7.12.0","direct":false,"kind":"runtime","optional":false},{"id":25770067705,"package_name":"cpi","ecosystem":"pypi","requirements":"2.0.8","direct":false,"kind":"runtime","optional":false},{"id":25770067706,"package_name":"cycler","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":25770067707,"package_name":"dask","ecosystem":"pypi","requirements":"2025.11.0","direct":false,"kind":"runtime","optional":false},{"id":25770067708,"package_name":"ecmwf-datastores-client","ecosystem":"pypi","requirements":"0.4.1","direct":false,"kind":"runtime","optional":false},{"id":25770067960,"package_name":"entsoe-py","ecosystem":"pypi","requirements":"0.7.8","direct":false,"kind":"runtime","optional":false},{"id":25770067961,"package_name":"et-xmlfile","ecosystem":"pypi","requirements":"2.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770067962,"package_name":"etl","ecosystem":"pypi","requirements":"0.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770067993,"package_name":"flatbuffers","ecosystem":"pypi","requirements":"25.9.23","direct":false,"kind":"runtime","optional":false},{"id":25770067994,"package_name":"fonttools","ecosystem":"pypi","requirements":"4.60.1","direct":false,"kind":"runtime","optional":false},{"id":25770067995,"package_name":"fsspec","ecosystem":"pypi","requirements":"2025.10.0","direct":false,"kind":"runtime","optional":false},{"id":25770067996,"package_name":"geopandas","ecosystem":"pypi","requirements":"1.1.1","direct":false,"kind":"runtime","optional":false},{"id":25770067997,"package_name":"google-api-core","ecosystem":"pypi","requirements":"2.28.1","direct":false,"kind":"runtime","optional":false},{"id":25770067998,"package_name":"google-auth","ecosystem":"pypi","requirements":"2.43.0","direct":false,"kind":"runtime","optional":false},{"id":25770067999,"package_name":"google-cloud-core","ecosystem":"pypi","requirements":"2.5.0","direct":false,"kind":"runtime","optional":false},{"id":25770068000,"package_name":"google-cloud-storage","ecosystem":"pypi","requirements":"3.6.0","direct":false,"kind":"runtime","optional":false},{"id":25770068001,"package_name":"google-crc32c","ecosystem":"pypi","requirements":"1.7.1","direct":false,"kind":"runtime","optional":false},{"id":25770068002,"package_name":"google-resumable-media","ecosystem":"pypi","requirements":"2.8.0","direct":false,"kind":"runtime","optional":false},{"id":25770068003,"package_name":"googleapis-common-protos","ecosystem":"pypi","requirements":"1.72.0","direct":false,"kind":"runtime","optional":false},{"id":25770068004,"package_name":"h3","ecosystem":"pypi","requirements":"4.3.1","direct":false,"kind":"runtime","optional":false},{"id":25770068261,"package_name":"idna","ecosystem":"pypi","requirements":"3.11","direct":false,"kind":"runtime","optional":false},{"id":25770068262,"package_name":"inflate64","ecosystem":"pypi","requirements":"1.0.3","direct":false,"kind":"runtime","optional":false},{"id":25770068283,"package_name":"iniconfig","ecosystem":"pypi","requirements":"2.3.0","direct":false,"kind":"runtime","optional":false},{"id":25770068284,"package_name":"kiwisolver","ecosystem":"pypi","requirements":"1.4.9","direct":false,"kind":"runtime","optional":false},{"id":25770068285,"package_name":"locket","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770068342,"package_name":"logging","ecosystem":"pypi","requirements":"0.4.9.6","direct":false,"kind":"runtime","optional":false},{"id":25770068343,"package_name":"lxml","ecosystem":"pypi","requirements":"6.0.2","direct":false,"kind":"runtime","optional":false},{"id":25770068344,"package_name":"matplotlib","ecosystem":"pypi","requirements":"3.10.7","direct":false,"kind":"runtime","optional":false},{"id":25770068345,"package_name":"multiurl","ecosystem":"pypi","requirements":"0.3.7","direct":false,"kind":"runtime","optional":false},{"id":25770068524,"package_name":"multivolumefile","ecosystem":"pypi","requirements":"0.2.3","direct":false,"kind":"runtime","optional":false},{"id":25770068594,"package_name":"nepali-datetime","ecosystem":"pypi","requirements":"1.0.8.4","direct":false,"kind":"runtime","optional":false},{"id":25770068595,"package_name":"netcdf4","ecosystem":"pypi","requirements":"1.7.3","direct":false,"kind":"runtime","optional":false},{"id":25770068596,"package_name":"numpy","ecosystem":"pypi","requirements":"2.3.5","direct":false,"kind":"runtime","optional":false},{"id":25770068597,"package_name":"openpyxl","ecosystem":"pypi","requirements":"3.1.5","direct":false,"kind":"runtime","optional":false},{"id":25770068598,"package_name":"packaging","ecosystem":"pypi","requirements":"25.0","direct":false,"kind":"runtime","optional":false},{"id":25770068599,"package_name":"pandas","ecosystem":"pypi","requirements":"2.3.3","direct":false,"kind":"runtime","optional":false},{"id":25770068600,"package_name":"partd","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":25770068660,"package_name":"pillow","ecosystem":"pypi","requirements":"12.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770068661,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.5.0","direct":false,"kind":"runtime","optional":false},{"id":25770068662,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":25770068663,"package_name":"pprintpp","ecosystem":"pypi","requirements":"0.4.0","direct":false,"kind":"runtime","optional":false},{"id":25770068686,"package_name":"proto-plus","ecosystem":"pypi","requirements":"1.26.1","direct":false,"kind":"runtime","optional":false},{"id":25770068687,"package_name":"protobuf","ecosystem":"pypi","requirements":"6.33.1","direct":false,"kind":"runtime","optional":false},{"id":25770068688,"package_name":"psutil","ecosystem":"pypi","requirements":"7.1.3","direct":false,"kind":"runtime","optional":false},{"id":25770068689,"package_name":"py7zr","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770068690,"package_name":"pyarrow","ecosystem":"pypi","requirements":"22.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770068691,"package_name":"pyasn1","ecosystem":"pypi","requirements":"0.6.1","direct":false,"kind":"runtime","optional":false},{"id":25770068692,"package_name":"pyasn1-modules","ecosystem":"pypi","requirements":"0.4.2","direct":false,"kind":"runtime","optional":false},{"id":25770068693,"package_name":"pybcj","ecosystem":"pypi","requirements":"1.0.6","direct":false,"kind":"runtime","optional":false},{"id":25770068696,"package_name":"pycountry","ecosystem":"pypi","requirements":"24.6.1","direct":false,"kind":"runtime","optional":false},{"id":25770068697,"package_name":"pycountry-convert","ecosystem":"pypi","requirements":"0.7.2","direct":false,"kind":"runtime","optional":false},{"id":25770068698,"package_name":"pycparser","ecosystem":"pypi","requirements":"2.23","direct":false,"kind":"runtime","optional":false},{"id":25770068699,"package_name":"pycryptodomex","ecosystem":"pypi","requirements":"3.23.0","direct":false,"kind":"runtime","optional":false},{"id":25770068701,"package_name":"pygments","ecosystem":"pypi","requirements":"2.19.2","direct":false,"kind":"runtime","optional":false},{"id":25770068702,"package_name":"pyogrio","ecosystem":"pypi","requirements":"0.11.1","direct":false,"kind":"runtime","optional":false},{"id":25770068711,"package_name":"pyparsing","ecosystem":"pypi","requirements":"3.2.5","direct":false,"kind":"runtime","optional":false},{"id":25770068712,"package_name":"pyppmd","ecosystem":"pypi","requirements":"1.2.0","direct":false,"kind":"runtime","optional":false},{"id":25770068714,"package_name":"pyproj","ecosystem":"pypi","requirements":"3.7.2","direct":false,"kind":"runtime","optional":false},{"id":25770068731,"package_name":"pyshp","ecosystem":"pypi","requirements":"3.0.2.post1","direct":false,"kind":"runtime","optional":false},{"id":25770068736,"package_name":"pytest","ecosystem":"pypi","requirements":"9.0.1","direct":false,"kind":"runtime","optional":false},{"id":25770068737,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"7.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770068738,"package_name":"pytest-mock","ecosystem":"pypi","requirements":"3.15.1","direct":false,"kind":"runtime","optional":false},{"id":25770068747,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":25770068748,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"1.2.1","direct":false,"kind":"runtime","optional":false},{"id":25770068749,"package_name":"pytz","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":25770068750,"package_name":"pyyaml","ecosystem":"pypi","requirements":"6.0.3","direct":false,"kind":"runtime","optional":false},{"id":25770068751,"package_name":"pyzstd","ecosystem":"pypi","requirements":"0.18.0","direct":false,"kind":"runtime","optional":false},{"id":25770068788,"package_name":"rasterio","ecosystem":"pypi","requirements":"1.4.3","direct":false,"kind":"runtime","optional":false},{"id":25770068789,"package_name":"repoze-lru","ecosystem":"pypi","requirements":"0.7","direct":false,"kind":"runtime","optional":false},{"id":25770069130,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.5","direct":false,"kind":"runtime","optional":false},{"id":25770069131,"package_name":"rioxarray","ecosystem":"pypi","requirements":"0.20.0","direct":false,"kind":"runtime","optional":false},{"id":25770069132,"package_name":"rsa","ecosystem":"pypi","requirements":"4.9.1","direct":false,"kind":"runtime","optional":false},{"id":25770069133,"package_name":"sdmx1","ecosystem":"pypi","requirements":"2.23.1","direct":false,"kind":"runtime","optional":false},{"id":25770069134,"package_name":"shapely","ecosystem":"pypi","requirements":"2.1.2","direct":false,"kind":"runtime","optional":false},{"id":25770069135,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":25770069136,"package_name":"soupsieve","ecosystem":"pypi","requirements":"2.8","direct":false,"kind":"runtime","optional":false},{"id":25770069137,"package_name":"tailwind-colors","ecosystem":"pypi","requirements":"1.4.1","direct":false,"kind":"runtime","optional":false},{"id":25770069138,"package_name":"texttable","ecosystem":"pypi","requirements":"1.7.0","direct":false,"kind":"runtime","optional":false},{"id":25770069139,"package_name":"timezonefinder","ecosystem":"pypi","requirements":"8.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770069140,"package_name":"toolz","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770069141,"package_name":"tqdm","ecosystem":"pypi","requirements":"4.67.1","direct":false,"kind":"runtime","optional":false},{"id":25770069142,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.15.0","direct":false,"kind":"runtime","optional":false},{"id":25770069143,"package_name":"tzdata","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":25770069144,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.5.0","direct":false,"kind":"runtime","optional":false},{"id":25770069145,"package_name":"wheel","ecosystem":"pypi","requirements":"0.45.1","direct":false,"kind":"runtime","optional":false},{"id":25770069146,"package_name":"xarray","ecosystem":"pypi","requirements":"2025.11.0","direct":false,"kind":"runtime","optional":false},{"id":25770069147,"package_name":"xlrd","ecosystem":"pypi","requirements":"2.0.2","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"docker","filepath":"models/xgboost/Dockerfile","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:13.474Z","updated_at":"2025-12-15T21:19:13.474Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/models/xgboost/Dockerfile","dependencies":[{"id":25770066620,"package_name":"python","ecosystem":"docker","requirements":"3.12","direct":true,"kind":"build","optional":false}]},{"ecosystem":"pypi","filepath":"models/xgboost/pyproject.toml","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:35.255Z","updated_at":"2025-12-15T21:19:35.255Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/models/xgboost/pyproject.toml","dependencies":[{"id":25770069154,"package_name":"dask","ecosystem":"pypi","requirements":"\u003e=2025.3.0","direct":true,"kind":"runtime","optional":false},{"id":25770069155,"package_name":"dotenv","ecosystem":"pypi","requirements":"\u003e=0.9.9","direct":true,"kind":"runtime","optional":false},{"id":25770069156,"package_name":"fastapi","ecosystem":"pypi","requirements":"[standard]\u003e=0.115.12","direct":true,"kind":"runtime","optional":false},{"id":25770069157,"package_name":"matplotlib","ecosystem":"pypi","requirements":"\u003e=3.10.1","direct":true,"kind":"runtime","optional":false},{"id":25770069158,"package_name":"netcdf4","ecosystem":"pypi","requirements":"\u003e=1.7.2","direct":true,"kind":"runtime","optional":false},{"id":25770069159,"package_name":"pandas","ecosystem":"pypi","requirements":"\u003e=2.2.3","direct":true,"kind":"runtime","optional":false},{"id":25770069160,"package_name":"pyarrow","ecosystem":"pypi","requirements":"\u003e=19.0.1","direct":true,"kind":"runtime","optional":false},{"id":25770069161,"package_name":"pycountry","ecosystem":"pypi","requirements":"\u003e=24.6.1","direct":true,"kind":"runtime","optional":false},{"id":25770069162,"package_name":"pycountry-convert","ecosystem":"pypi","requirements":"\u003e=0.7.2","direct":true,"kind":"runtime","optional":false},{"id":25770069163,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"\u003e=1.6.1","direct":true,"kind":"runtime","optional":false},{"id":25770069164,"package_name":"tqdm","ecosystem":"pypi","requirements":"\u003e=4.67.1","direct":true,"kind":"runtime","optional":false},{"id":25770069165,"package_name":"xarray","ecosystem":"pypi","requirements":"\u003e=2025.7.1","direct":true,"kind":"runtime","optional":false},{"id":25770069166,"package_name":"xgboost-cpu","ecosystem":"pypi","requirements":"\u003e=3.0.0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"webpage/uv.lock","sha":null,"kind":"lockfile","created_at":"2025-12-15T21:19:35.723Z","updated_at":"2025-12-15T21:19:35.723Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/webpage/uv.lock","dependencies":[{"id":25770069274,"package_name":"babel","ecosystem":"pypi","requirements":"2.17.0","direct":false,"kind":"runtime","optional":false},{"id":25770069275,"package_name":"backrefs","ecosystem":"pypi","requirements":"5.9","direct":false,"kind":"runtime","optional":false},{"id":25770069291,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.7.14","direct":false,"kind":"runtime","optional":false},{"id":25770069292,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"3.4.2","direct":false,"kind":"runtime","optional":false},{"id":25770069293,"package_name":"click","ecosystem":"pypi","requirements":"8.2.1","direct":false,"kind":"runtime","optional":false},{"id":25770069294,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":25770069295,"package_name":"demandcast-documentation","ecosystem":"pypi","requirements":"0.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770069391,"package_name":"ghp-import","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770069392,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"runtime","optional":false},{"id":25770069393,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.6","direct":false,"kind":"runtime","optional":false},{"id":25770069394,"package_name":"markdown","ecosystem":"pypi","requirements":"3.8.2","direct":false,"kind":"runtime","optional":false},{"id":25770069395,"package_name":"markupsafe","ecosystem":"pypi","requirements":"3.0.2","direct":false,"kind":"runtime","optional":false},{"id":25770069396,"package_name":"mergedeep","ecosystem":"pypi","requirements":"1.3.4","direct":false,"kind":"runtime","optional":false},{"id":25770069401,"package_name":"mkdocs","ecosystem":"pypi","requirements":"1.6.1","direct":false,"kind":"runtime","optional":false},{"id":25770069402,"package_name":"mkdocs-get-deps","ecosystem":"pypi","requirements":"0.2.0","direct":false,"kind":"runtime","optional":false},{"id":25770069403,"package_name":"mkdocs-material","ecosystem":"pypi","requirements":"9.6.15","direct":false,"kind":"runtime","optional":false},{"id":25770069404,"package_name":"mkdocs-material-extensions","ecosystem":"pypi","requirements":"1.3.1","direct":false,"kind":"runtime","optional":false},{"id":25770069405,"package_name":"packaging","ecosystem":"pypi","requirements":"25.0","direct":false,"kind":"runtime","optional":false},{"id":25770069406,"package_name":"paginate","ecosystem":"pypi","requirements":"0.5.7","direct":false,"kind":"runtime","optional":false},{"id":25770069407,"package_name":"pathspec","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":25770069408,"package_name":"platformdirs","ecosystem":"pypi","requirements":"4.3.8","direct":false,"kind":"runtime","optional":false},{"id":25770069409,"package_name":"pygments","ecosystem":"pypi","requirements":"2.19.2","direct":false,"kind":"runtime","optional":false},{"id":25770069410,"package_name":"pymdown-extensions","ecosystem":"pypi","requirements":"10.16","direct":false,"kind":"runtime","optional":false},{"id":25770069411,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":25770069412,"package_name":"pyyaml","ecosystem":"pypi","requirements":"6.0.2","direct":false,"kind":"runtime","optional":false},{"id":25770069413,"package_name":"pyyaml-env-tag","ecosystem":"pypi","requirements":"1.1","direct":false,"kind":"runtime","optional":false},{"id":25770069415,"package_name":"requests","ecosystem":"pypi","requirements":"2.32.4","direct":false,"kind":"runtime","optional":false},{"id":25770069416,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":25770069417,"package_name":"urllib3","ecosystem":"pypi","requirements":"2.5.0","direct":false,"kind":"runtime","optional":false},{"id":25770069418,"package_name":"watchdog","ecosystem":"pypi","requirements":"6.0.0","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/docker-publish.yml","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:13.233Z","updated_at":"2025-12-15T21:19:13.233Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/.github/workflows/docker-publish.yml","dependencies":[{"id":25770066607,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25770066608,"package_name":"sigstore/cosign-installer","ecosystem":"actions","requirements":"v3.5.0","direct":true,"kind":"composite","optional":false},{"id":25770066609,"package_name":"docker/setup-buildx-action","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":25770066610,"package_name":"docker/login-action","ecosystem":"actions","requirements":"v3","direct":true,"kind":"composite","optional":false},{"id":25770066611,"package_name":"docker/metadata-action","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":25770066612,"package_name":"docker/build-push-action","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/docs.yml","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:13.303Z","updated_at":"2025-12-15T21:19:13.303Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/.github/workflows/docs.yml","dependencies":[{"id":25770066614,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25770066615,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":25770066616,"package_name":"actions/cache","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"ETL/pyproject.toml","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:13.530Z","updated_at":"2025-12-15T21:19:13.530Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/ETL/pyproject.toml","dependencies":[{"id":25770066623,"package_name":"beautifulsoup4","ecosystem":"pypi","requirements":"\u003e=4.13.3","direct":true,"kind":"runtime","optional":false},{"id":25770066624,"package_name":"cartopy","ecosystem":"pypi","requirements":"\u003e=0.24.1","direct":true,"kind":"runtime","optional":false},{"id":25770066629,"package_name":"cdsapi","ecosystem":"pypi","requirements":"\u003e=0.7.5","direct":true,"kind":"runtime","optional":false},{"id":25770066635,"package_name":"countryinfo","ecosystem":"pypi","requirements":"\u003e=0.1.2","direct":true,"kind":"runtime","optional":false},{"id":25770066660,"package_name":"cpi","ecosystem":"pypi","requirements":"\u003e=2.0.8","direct":true,"kind":"runtime","optional":false},{"id":25770066665,"package_name":"dask","ecosystem":"pypi","requirements":"\u003e=2025.11.0","direct":true,"kind":"runtime","optional":false},{"id":25770067015,"package_name":"entsoe-py","ecosystem":"pypi","requirements":"\u003e=0.6.18","direct":true,"kind":"runtime","optional":false},{"id":25770067058,"package_name":"geopandas","ecosystem":"pypi","requirements":"\u003e=1.0.1","direct":true,"kind":"runtime","optional":false},{"id":25770067105,"package_name":"google-cloud-storage","ecosystem":"pypi","requirements":"\u003e=3.1.0","direct":true,"kind":"runtime","optional":false},{"id":25770067106,"package_name":"logging","ecosystem":"pypi","requirements":"\u003e=0.4.9.6","direct":true,"kind":"runtime","optional":false},{"id":25770067198,"package_name":"matplotlib","ecosystem":"pypi","requirements":"\u003e=3.10.0","direct":true,"kind":"runtime","optional":false},{"id":25770067199,"package_name":"nepali-datetime","ecosystem":"pypi","requirements":"\u003e=1.0.8.4","direct":true,"kind":"runtime","optional":false},{"id":25770067201,"package_name":"netcdf4","ecosystem":"pypi","requirements":"\u003e=1.7.3","direct":true,"kind":"runtime","optional":false},{"id":25770067279,"package_name":"numpy","ecosystem":"pypi","requirements":"\u003e=2.2.2","direct":true,"kind":"runtime","optional":false},{"id":25770067280,"package_name":"openpyxl","ecosystem":"pypi","requirements":"\u003e=3.1.5","direct":true,"kind":"runtime","optional":false},{"id":25770067281,"package_name":"pandas","ecosystem":"pypi","requirements":"\u003e=2.2.3","direct":true,"kind":"runtime","optional":false},{"id":25770067282,"package_name":"py7zr","ecosystem":"pypi","requirements":"\u003e=0.22.0","direct":true,"kind":"runtime","optional":false},{"id":25770067290,"package_name":"pyarrow","ecosystem":"pypi","requirements":"\u003e=19.0.0","direct":true,"kind":"runtime","optional":false},{"id":25770067291,"package_name":"pycountry","ecosystem":"pypi","requirements":"\u003e=24.6.1","direct":true,"kind":"runtime","optional":false},{"id":25770067300,"package_name":"pycountry-convert","ecosystem":"pypi","requirements":"\u003e=0.7.2","direct":true,"kind":"runtime","optional":false},{"id":25770067301,"package_name":"pytest","ecosystem":"pypi","requirements":"\u003e=8.4.0","direct":true,"kind":"runtime","optional":false},{"id":25770067302,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"\u003e=1.0.1","direct":true,"kind":"runtime","optional":false},{"id":25770067303,"package_name":"pytz","ecosystem":"pypi","requirements":"\u003e=2025.1","direct":true,"kind":"runtime","optional":false},{"id":25770067304,"package_name":"pyyaml","ecosystem":"pypi","requirements":"\u003e=6.0.3","direct":true,"kind":"runtime","optional":false},{"id":25770067305,"package_name":"rasterio","ecosystem":"pypi","requirements":"\u003e=1.4.3","direct":true,"kind":"runtime","optional":false},{"id":25770067306,"package_name":"rioxarray","ecosystem":"pypi","requirements":"\u003e=0.19.0","direct":true,"kind":"runtime","optional":false},{"id":25770067307,"package_name":"sdmx1","ecosystem":"pypi","requirements":"\u003e=2.22.0","direct":true,"kind":"runtime","optional":false},{"id":25770067310,"package_name":"shapely","ecosystem":"pypi","requirements":"\u003e=2.0.7","direct":true,"kind":"runtime","optional":false},{"id":25770067311,"package_name":"tailwind-colors","ecosystem":"pypi","requirements":"\u003e=1.3.0","direct":true,"kind":"runtime","optional":false},{"id":25770067324,"package_name":"timezonefinder","ecosystem":"pypi","requirements":"\u003e=6.5.9","direct":true,"kind":"runtime","optional":false},{"id":25770067337,"package_name":"tqdm","ecosystem":"pypi","requirements":"\u003e=4.67.1","direct":true,"kind":"runtime","optional":false},{"id":25770067338,"package_name":"xarray","ecosystem":"pypi","requirements":"\u003e=2025.1.2","direct":true,"kind":"runtime","optional":false},{"id":25770067352,"package_name":"xlrd","ecosystem":"pypi","requirements":"\u003e=2.0.1","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/labeler.yml","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:13.358Z","updated_at":"2025-12-15T21:19:13.358Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/.github/workflows/labeler.yml","dependencies":[{"id":25770066618,"package_name":"actions/labeler","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"pypi","filepath":"models/xgboost/uv.lock","sha":null,"kind":"lockfile","created_at":"2025-12-15T21:19:35.478Z","updated_at":"2025-12-15T21:19:35.478Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/models/xgboost/uv.lock","dependencies":[{"id":25770069167,"package_name":"annotated-types","ecosystem":"pypi","requirements":"0.7.0","direct":false,"kind":"runtime","optional":false},{"id":25770069168,"package_name":"anyio","ecosystem":"pypi","requirements":"4.9.0","direct":false,"kind":"runtime","optional":false},{"id":25770069169,"package_name":"certifi","ecosystem":"pypi","requirements":"2025.4.26","direct":false,"kind":"runtime","optional":false},{"id":25770069170,"package_name":"cftime","ecosystem":"pypi","requirements":"1.6.4.post1","direct":false,"kind":"runtime","optional":false},{"id":25770069171,"package_name":"click","ecosystem":"pypi","requirements":"8.1.8","direct":false,"kind":"runtime","optional":false},{"id":25770069172,"package_name":"cloudpickle","ecosystem":"pypi","requirements":"3.1.1","direct":false,"kind":"runtime","optional":false},{"id":25770069173,"package_name":"colorama","ecosystem":"pypi","requirements":"0.4.6","direct":false,"kind":"runtime","optional":false},{"id":25770069174,"package_name":"contourpy","ecosystem":"pypi","requirements":"1.3.2","direct":false,"kind":"runtime","optional":false},{"id":25770069175,"package_name":"coverage","ecosystem":"pypi","requirements":"7.10.6","direct":false,"kind":"runtime","optional":false},{"id":25770069176,"package_name":"cycler","ecosystem":"pypi","requirements":"0.12.1","direct":false,"kind":"runtime","optional":false},{"id":25770069177,"package_name":"dask","ecosystem":"pypi","requirements":"2025.4.0","direct":false,"kind":"runtime","optional":false},{"id":25770069178,"package_name":"dnspython","ecosystem":"pypi","requirements":"2.7.0","direct":false,"kind":"runtime","optional":false},{"id":25770069179,"package_name":"dotenv","ecosystem":"pypi","requirements":"0.9.9","direct":false,"kind":"runtime","optional":false},{"id":25770069180,"package_name":"email-validator","ecosystem":"pypi","requirements":"2.2.0","direct":false,"kind":"runtime","optional":false},{"id":25770069181,"package_name":"fastapi","ecosystem":"pypi","requirements":"0.115.12","direct":false,"kind":"runtime","optional":false},{"id":25770069182,"package_name":"fastapi-cli","ecosystem":"pypi","requirements":"0.0.7","direct":false,"kind":"runtime","optional":false},{"id":25770069183,"package_name":"fonttools","ecosystem":"pypi","requirements":"4.57.0","direct":false,"kind":"runtime","optional":false},{"id":25770069184,"package_name":"fsspec","ecosystem":"pypi","requirements":"2025.3.2","direct":false,"kind":"runtime","optional":false},{"id":25770069185,"package_name":"h11","ecosystem":"pypi","requirements":"0.16.0","direct":false,"kind":"runtime","optional":false},{"id":25770069186,"package_name":"httpcore","ecosystem":"pypi","requirements":"1.0.9","direct":false,"kind":"runtime","optional":false},{"id":25770069187,"package_name":"httptools","ecosystem":"pypi","requirements":"0.6.4","direct":false,"kind":"runtime","optional":false},{"id":25770069188,"package_name":"httpx","ecosystem":"pypi","requirements":"0.28.1","direct":false,"kind":"runtime","optional":false},{"id":25770069189,"package_name":"idna","ecosystem":"pypi","requirements":"3.10","direct":false,"kind":"runtime","optional":false},{"id":25770069190,"package_name":"iniconfig","ecosystem":"pypi","requirements":"2.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770069191,"package_name":"jinja2","ecosystem":"pypi","requirements":"3.1.6","direct":false,"kind":"runtime","optional":false},{"id":25770069192,"package_name":"joblib","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":25770069193,"package_name":"kiwisolver","ecosystem":"pypi","requirements":"1.4.8","direct":false,"kind":"runtime","optional":false},{"id":25770069194,"package_name":"locket","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770069195,"package_name":"markdown-it-py","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770069196,"package_name":"markupsafe","ecosystem":"pypi","requirements":"3.0.2","direct":false,"kind":"runtime","optional":false},{"id":25770069197,"package_name":"matplotlib","ecosystem":"pypi","requirements":"3.10.1","direct":false,"kind":"runtime","optional":false},{"id":25770069198,"package_name":"mdurl","ecosystem":"pypi","requirements":"0.1.2","direct":false,"kind":"runtime","optional":false},{"id":25770069199,"package_name":"model-xgboost","ecosystem":"pypi","requirements":"0.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770069200,"package_name":"netcdf4","ecosystem":"pypi","requirements":"1.7.2","direct":false,"kind":"runtime","optional":false},{"id":25770069201,"package_name":"numpy","ecosystem":"pypi","requirements":"2.2.5","direct":false,"kind":"runtime","optional":false},{"id":25770069202,"package_name":"packaging","ecosystem":"pypi","requirements":"25.0","direct":false,"kind":"runtime","optional":false},{"id":25770069203,"package_name":"pandas","ecosystem":"pypi","requirements":"2.2.3","direct":false,"kind":"runtime","optional":false},{"id":25770069204,"package_name":"partd","ecosystem":"pypi","requirements":"1.4.2","direct":false,"kind":"runtime","optional":false},{"id":25770069205,"package_name":"pillow","ecosystem":"pypi","requirements":"11.2.1","direct":false,"kind":"runtime","optional":false},{"id":25770069206,"package_name":"pluggy","ecosystem":"pypi","requirements":"1.6.0","direct":false,"kind":"runtime","optional":false},{"id":25770069207,"package_name":"pprintpp","ecosystem":"pypi","requirements":"0.4.0","direct":false,"kind":"runtime","optional":false},{"id":25770069208,"package_name":"pyarrow","ecosystem":"pypi","requirements":"19.0.1","direct":false,"kind":"runtime","optional":false},{"id":25770069209,"package_name":"pycountry","ecosystem":"pypi","requirements":"24.6.1","direct":false,"kind":"runtime","optional":false},{"id":25770069210,"package_name":"pycountry-convert","ecosystem":"pypi","requirements":"0.7.2","direct":false,"kind":"runtime","optional":false},{"id":25770069211,"package_name":"pydantic","ecosystem":"pypi","requirements":"2.11.5","direct":false,"kind":"runtime","optional":false},{"id":25770069212,"package_name":"pydantic-core","ecosystem":"pypi","requirements":"2.33.2","direct":false,"kind":"runtime","optional":false},{"id":25770069213,"package_name":"pygments","ecosystem":"pypi","requirements":"2.19.1","direct":false,"kind":"runtime","optional":false},{"id":25770069214,"package_name":"pyparsing","ecosystem":"pypi","requirements":"3.2.3","direct":false,"kind":"runtime","optional":false},{"id":25770069215,"package_name":"pytest","ecosystem":"pypi","requirements":"8.4.1","direct":false,"kind":"runtime","optional":false},{"id":25770069216,"package_name":"pytest-cov","ecosystem":"pypi","requirements":"6.2.1","direct":false,"kind":"runtime","optional":false},{"id":25770069217,"package_name":"pytest-mock","ecosystem":"pypi","requirements":"3.14.1","direct":false,"kind":"runtime","optional":false},{"id":25770069218,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"2.9.0.post0","direct":false,"kind":"runtime","optional":false},{"id":25770069219,"package_name":"python-dotenv","ecosystem":"pypi","requirements":"1.1.0","direct":false,"kind":"runtime","optional":false},{"id":25770069220,"package_name":"python-multipart","ecosystem":"pypi","requirements":"0.0.20","direct":false,"kind":"runtime","optional":false},{"id":25770069221,"package_name":"pytz","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":25770069222,"package_name":"pyyaml","ecosystem":"pypi","requirements":"6.0.2","direct":false,"kind":"runtime","optional":false},{"id":25770069223,"package_name":"repoze-lru","ecosystem":"pypi","requirements":"0.7","direct":false,"kind":"runtime","optional":false},{"id":25770069224,"package_name":"rich","ecosystem":"pypi","requirements":"14.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770069225,"package_name":"rich-toolkit","ecosystem":"pypi","requirements":"0.14.6","direct":false,"kind":"runtime","optional":false},{"id":25770069226,"package_name":"scikit-learn","ecosystem":"pypi","requirements":"1.6.1","direct":false,"kind":"runtime","optional":false},{"id":25770069227,"package_name":"scipy","ecosystem":"pypi","requirements":"1.15.2","direct":false,"kind":"runtime","optional":false},{"id":25770069228,"package_name":"shellingham","ecosystem":"pypi","requirements":"1.5.4","direct":false,"kind":"runtime","optional":false},{"id":25770069229,"package_name":"six","ecosystem":"pypi","requirements":"1.17.0","direct":false,"kind":"runtime","optional":false},{"id":25770069230,"package_name":"sniffio","ecosystem":"pypi","requirements":"1.3.1","direct":false,"kind":"runtime","optional":false},{"id":25770069231,"package_name":"starlette","ecosystem":"pypi","requirements":"0.46.2","direct":false,"kind":"runtime","optional":false},{"id":25770069232,"package_name":"threadpoolctl","ecosystem":"pypi","requirements":"3.6.0","direct":false,"kind":"runtime","optional":false},{"id":25770069233,"package_name":"toolz","ecosystem":"pypi","requirements":"1.0.0","direct":false,"kind":"runtime","optional":false},{"id":25770069234,"package_name":"tqdm","ecosystem":"pypi","requirements":"4.67.1","direct":false,"kind":"runtime","optional":false},{"id":25770069235,"package_name":"typer","ecosystem":"pypi","requirements":"0.16.0","direct":false,"kind":"runtime","optional":false},{"id":25770069236,"package_name":"typing-extensions","ecosystem":"pypi","requirements":"4.13.2","direct":false,"kind":"runtime","optional":false},{"id":25770069237,"package_name":"typing-inspection","ecosystem":"pypi","requirements":"0.4.1","direct":false,"kind":"runtime","optional":false},{"id":25770069238,"package_name":"tzdata","ecosystem":"pypi","requirements":"2025.2","direct":false,"kind":"runtime","optional":false},{"id":25770069239,"package_name":"uvicorn","ecosystem":"pypi","requirements":"0.34.2","direct":false,"kind":"runtime","optional":false},{"id":25770069240,"package_name":"uvloop","ecosystem":"pypi","requirements":"0.21.0","direct":false,"kind":"runtime","optional":false},{"id":25770069241,"package_name":"watchfiles","ecosystem":"pypi","requirements":"1.0.5","direct":false,"kind":"runtime","optional":false},{"id":25770069242,"package_name":"websockets","ecosystem":"pypi","requirements":"15.0.1","direct":false,"kind":"runtime","optional":false},{"id":25770069243,"package_name":"wheel","ecosystem":"pypi","requirements":"0.45.1","direct":false,"kind":"runtime","optional":false},{"id":25770069244,"package_name":"xarray","ecosystem":"pypi","requirements":"2025.7.1","direct":false,"kind":"runtime","optional":false},{"id":25770069245,"package_name":"xgboost-cpu","ecosystem":"pypi","requirements":"3.0.0","direct":false,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/ci.yml","sha":null,"kind":"manifest","created_at":"2025-12-15T21:19:12.758Z","updated_at":"2025-12-15T21:19:12.758Z","repository_link":"https://github.com/open-energy-transition/demandcast/blob/main/.github/workflows/ci.yml","dependencies":[{"id":25770066598,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v4","direct":true,"kind":"composite","optional":false},{"id":25770066599,"package_name":"actions/setup-python","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false},{"id":25770066600,"package_name":"pre-commit/action","ecosystem":"actions","requirements":"v3.0.1","direct":true,"kind":"composite","optional":false},{"id":25770066606,"package_name":"astral-sh/setup-uv","ecosystem":"actions","requirements":"v5","direct":true,"kind":"composite","optional":false}]}],"score":5.19295685089021,"created_at":"2025-06-20T00:05:20.654Z","updated_at":"2026-05-27T03:02:17.443Z","avatar_url":"https://github.com/open-energy-transition.png","language":"Python","category":"Energy Systems","sub_category":"Load and Demand Forecasting","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"\u003ch1 align=\"center\"\u003e\u003cb\u003eDemandCast\u003c/b\u003e\u003c/h1\u003e\n\n\u003ch2 align=\"center\"\u003e\u003cb\u003eGlobal hourly electricity demand forecasting\u003c/b\u003e\u003c/h2\u003e\n\n\u003ch3 align=\"center\"\u003e\u003cb\u003eA project developed by\u003c/b\u003e\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://openenergytransition.org/\"\u003e\n        \u003cimg src=\"webpage/docs/figures/oet_logo.png\" alt=\"OET Logo\" width=\"256\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003e\u003cb\u003eSupported by\u003c/b\u003e\u003c/h3\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://www.breakthroughenergy.org/\"\u003e\n        \u003cimg src=\"webpage/docs/figures/be_logo.png\" alt=\"Breakthrough Energy Logo\" width=\"512\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n## Table of Contents\n- [About](#about)\n  - [Features](#features)\n    - [Feature roadmap](#feature-roadmap)\n- [Documentation](#documentation)\n- [Contributing](#contributing)\n- [Repository structure](#repository-structure)\n- [DemandCast structure](#demandcast-structure)\n- [Data sources](#data-sources)\n- [Dataset of global forecasts](#dataset-of-global-forecasts)\n- [Getting started](#basic-getting-started-guide)\n  - [1. Clone the repository](#1-clone-the-repository)\n  - [2. Set up your environment](#2-set-up-your-environment)\n  - [3. Run scripts](#3-run-scripts)\n- [Development workflow](#development-workflow)\n  - [Run tests and check test coverage](#run-tests-and-check-test-coverage)\n  - [Pre-commit and lint code](#pre-commit-and-lint-code)\n- [Maintainers](#maintainers)\n- [License](#license)\n\n## About\n\nDemandCast is a Python-based project focused on collecting, processing, and forecasting hourly electricity demand data. The aim of this project is to support energy planning studies by using machine learning models to generate hourly time series of future electricity demand or for countries without available data.\n\n### Features\n\n- Retrieval of hourly and sub-hourly electricity demand data from public sources.\n- Retrieval of weather and socio-economic data.\n- Training and validation of machine learning models.\n- Forecasting using trained machine learning models.\n- Modular design for adding new countries or data sources.\n- Support for reproducible, containerized development.\n\n#### Feature roadmap\n\nThe project is in active development and we are always looking for suggestions and contributions. Below is a non-exhaustive list of planned features:\n\n- Add support to forecast electricity demand in user-defined subnational regions.\n- Enhance model training by integrating new datasets:\n  - New countries and subdivisions with available electricity demand data,\n  - Sectoral electricity demand (agriculture, industry, transport, buildings),\n  - Adoption of EVs, air conditioning, and heat pumps.\n- Add and test new machine learning models for forecasting (e.g., [timesfm](https://github.com/google-research/timesfm)).\n- Add quality checks of electricity demand time series.\n- Improve validation by considering simultaneity of peaks between actual and forecast electricity demand.\n- Package the project for easier installation and usage.\n\n## Documentation\n\nThe [documentation](https://open-energy-transition.github.io/demandcast/) is currently hosted on GitHub pages connected to this repository. It is built with [mkdocs](https://github.com/squidfunk/mkdocs-material).\n\nTo run it locally:\n\n```bash\ncd webpage\nuv run mkdocs serve\n```\n\nOther online resources include:\n\n- [Paper](https://arxiv.org/abs/2510.08000) accepted at the [NeurIPS 2025 Workshop](https://www.climatechange.ai/papers/neurips2025/42): Tackling Climate Change with Machine Learning.\n- [Poster](https://s3.us-east-1.amazonaws.com/climate-change-ai/papers/neurips2025/42/poster.pdf) presented at the NeurIPS 2025 Workshop.\n- [Video presentation](https://recorder-v3.slideslive.com/?share=107690\u0026s=ed044008-3b06-4462-a839-b82b888eeb46) recorded for the NeurIPS 2025 Workshop.\n\n## Contributing\n\nWe welcome contributions in the form of:\n\n- Country-specific data retrieval modules\n- New or improved forecasting models\n- Documentation and testing enhancements\n\nPlease follow the repository’s structure and submit your changes via pull request.\n\nWe also would like to hear your feedback and suggestions. You can share your thoughts by completing this short [survey](https://forms.gle/nMYvCAfzbrUDjqRQ8).\n\n## Repository structure\n\n```\ndemandcast/\n├── .github/                        # Github specifics such as actions\n├── demandcast/\n│   ├── checks/                     # Modules to perform data availability and quality checks\n│   ├── config/                     # Configuration files for all scripts\n│   ├── figures/                    # Modules to plot figures and resulting figures\n│   ├── ml_models/                  # Machine learning models for forecasting electricity demand\n│   ├── retrievals/                 # Modules to retrieve data from various sources\n│   ├── shapes/                     # Scripts to generate shapes for non-standard subdivisions and resulting shapefiles\n│   ├── tests/                      # Unit tests for the utilities and retrieval scripts\n│   ├── utils/                      # Shared utilities for data fetching, processing, and uploading\n│   ├── .dockerignore               # Files and directories to ignore in Docker build context\n│   ├── .env                        # API keys (not included in repo)\n│   ├── .python-version             # Python version for the environment\n│   ├── Dockerfile                  # Dockerfile to create an image for the project\n│   ├── assemble.py                 # Script to assemble/preprocess data\n│   ├── check.py                    # Script to run data checks\n│   ├── cross_validate.py           # Script to cross-validate models\n│   ├── forecast.py                 # Script to generate forecasts\n│   ├── plot.py                     # Script to generate plots for the data\n│   ├── pyproject.toml              # Project configuration and dependencies\n│   ├── retrieve.py                 # Main script to download and process data\n│   ├── run_all.sh                  # Shell script to run all processes sequentially\n│   ├── train.py                    # Script to train models\n│   ├── upload.py                   # Script to upload data\n│   ├── uv.lock                     # Locked dependencies for the project\n│   └── validate.py                 # Script to validate data\n├── webpage/                        # Documentation website files (MkDocs)\n├── .gitattributes                  # Git attributes for handling line endings\n├── .gitignore                      # File lists that git ignores\n├── .pre-commit-config.yaml         # Pre-commit configuration\n├── CONTRIBUTING.md                 # Guide to contributing\n├── LICENSE                         # License file\n├── README.md                       # Project overview and instructions\n├── ruff.toml                       # Ruff configuration\n└── security.md                     # Security policy\n```\n\n## DemandCast structure\n\n![DemandCast](webpage/docs/figures/demandcast_illustration.png)\n\n## Data sources\n\nThe table below provides an overview of the data sources currently used in DemandCast for hourly and sub-hourly electricity demand, weather, and socio-economic data for both historical and future periods.\n\n|Data type|Data sources for the historical period|Data sources for the future period|\n|---|---|---|\n|Hourly and sub-hourly\u003cbr\u003eelectricity demand|Various public sources listed in the\u003cbr\u003e[Awesome Electricity Demand repository](https://github.com/open-energy-transition/Awesome-Electricity-Demand)| -- |\n|Temperature|[ERA5](https://cds.climate.copernicus.eu/datasets/reanalysis-era5-single-levels)|[CMIP6](https://cds.climate.copernicus.eu/datasets/projections-cmip6)|\n|Gridded population|[SEDAC GPW v4](https://data.ghg.center/sedac-popdensity-yeargrid5yr-v4.11/browseui/#sedac-popdensity-yeargrid5yr-v4.11/)|[Wang X. et al. (2022)](https://doi.org/10.6084/m9.figshare.19608594)|\n|National population|[World Bank](https://data.worldbank.org/indicator/SP.POP.TOTL)|[IIASA SSP Database](https://data.ece.iiasa.ac.at/ssp)|\n|Gridded GDP, PPP|[Wang T. et al. (2022)](https://zenodo.org/records/7898409)|[Wang T. et al. (2022)](https://zenodo.org/records/7898409)|\n|National GDP per capita, PPP|[World Bank](https://data.worldbank.org/indicator/NY.GDP.PCAP.PP.KD), [IMF](https://data.imf.org/en/Data-Explorer?datasetUrn=IMF.RES:WEO(6.0.0)\u0026INDICATOR=NGDPRPPPPC)|[IIASA SSP Database](https://data.ece.iiasa.ac.at/ssp)|\n|National annual electricity\u003cbr\u003edemand per capita|[Ember](https://ember-energy.org/data/yearly-electricity-data/), [World Bank](https://data.worldbank.org/indicator/EG.USE.ELEC.KH.PC)|[IIASA SSP Database](https://tntcat.iiasa.ac.at/SspDb)|\n\nThe map below shows the countries and subdivisions for which retrieval modules of electricity demand data are currently available in DemandCast.\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"webpage/docs/figures/available_entities_dark_mode.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"webpage/docs/figures/available_entities_light_mode.png\"\u003e\n  \u003cimg alt=\"Countries and subdivisions for which retrieval modules of electricity demand data are available\" src=\"webpage/docs/figures/available_entities.png\"\u003e\n\u003c/picture\u003e\n\nYou can find the code that we used to retrieve the data in their respective files inside the [demandcast/retrievals](https://github.com/open-energy-transition/demandcast/tree/main/demandcast/retrievals) folder.\n\nYou can find the electricity demand data that we retrieved at different points in time in this [Google Cloud Storage bucket](https://console.cloud.google.com/storage/browser/demandcast_data) (freely accessible with a Google account). Alternatively, the direct links to the data have the following format:\n\n```https://storage.googleapis.com/demandcast_data/{variable}/{country_or_subdivision_code}.parquet```\n\n## Dataset of global forecasts\n\nForecasted hourly electricity demand for 184 countries from 2000 to 2024 is available in this [Zenodo repository](https://doi.org/10.5281/zenodo.18374351).\n\nForecasts for future years, including different climate models and scenarios, will be included in a future release. However, DemandCast is already capable of generating these forecasts for users who wish to produce them independently.\n\n## Basic getting started guide\n\nAn extended getting started guide is available in the [documentation](https://open-energy-transition.github.io/demandcast/getting_started/).\n\n### 1. Clone the repository\n\n```bash\ngit clone https://github.com/open-energy-transition/demandcast.git\ncd demandcast\n```\n\n### 2. Set up your environment\n\nThis project uses [`uv`](https://github.com/astral-sh/uv) as a package manager to install the required dependencies and create an environment stored in `.venv`.\n\n`uv` can be used within the provided Dockerfile or installed standalone (see [installing uv](https://docs.astral.sh/uv/getting-started/installation/)).\n\nThe `demandcast` folder contains a `pyproject.toml` file that defines all the dependencies for the project.\n\nTo set up the environment, run:\n```bash\ncd demandcast\nuv sync\n```\n\nAlternatively, you may use a package manager of your choice (e.g., `conda`) to install the dependencies listed in the `pyproject.toml`. If you choose this approach, please adjust the commands below to align with the conventions of your selected package manager.\n\n### 3. Run scripts\n\nScripts can be run directly using:\n\n```bash\ncd demandcast\nuv run script.py\n```\n\nScripts accept configuration files to customize their behavior. Configuration files are located in `demandcast/config/`. The default name of the configuration file is `{script_name}_config.yaml`.\n\nJupyter notebooks ([details](https://docs.astral.sh/uv/guides/integration/jupyter/#using-jupyter-within-a-project)) can be launched with:\n\n```bash\ncd demandcast\nuv run --with jupyter jupyter lab --allow-root\n```\n\n## Development workflow\n\n### Run tests and check test coverage\n\n```bash\ncd demandcast\nuv run pytest --cov=utils --cov-report=term-missing\n```\n\n### Pre-commit and lint code\n\nTo ensure code quality, we use [pre-commit](https://pre-commit.com/) hooks. These hooks automatically run checks on your code before committing changes. Among the pre-commit hooks, we also use [ruff](https://docs.astral.sh/ruff/) to enforce code style and linting. All the pre-commit hooks are defined in the `.pre-commit-config.yaml` file.\n\nTo run pre-commit hooks, you can use:\n```bash\nuvx pre-commit\n```\n\n## Maintainers\n\nThe project is maintained by the [Open Energy Transition](https://openenergytransition.org/) team. The team members currently involved in this project are:\n\n- [Enrico Antonini](https://github.com/eantonini) (enrico.antonini at openenergytransition dot org)\n- [Vamsi Priya Goli](https://github.com/Vamsipriya22) (goli.vamsi at openenergytransition dot org)\n\n## License\n\nThis project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).\n","funding_links":[],"readme_doi_urls":["https://doi.org/10.6084/m9.figshare.19608594","https://doi.org/10.5281/zenodo.18374351"],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":["energy-system-model"],"project_url":"https://ost.ecosyste.ms/api/v1/projects/318989","html_url":"https://ost.ecosyste.ms/projects/318989"}