{"id":20200931,"url":"https://github.com/openclimatefix/uk-pvnet-app","last_synced_at":"2025-04-10T11:21:34.092Z","repository":{"id":188918051,"uuid":"679676136","full_name":"openclimatefix/uk-pvnet-app","owner":"openclimatefix","description":"Application for running PVNet in production","archived":false,"fork":false,"pushed_at":"2025-04-09T16:47:51.000Z","size":16648,"stargazers_count":2,"open_issues_count":11,"forks_count":20,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-09T17:35:34.236Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openclimatefix.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["openclimatefix"],"patreon":null,"open_collective":"openclimatefix","ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2023-08-17T11:19:30.000Z","updated_at":"2025-04-04T10:26:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"366e1b6d-0634-40c1-9dae-d3b1006a3974","html_url":"https://github.com/openclimatefix/uk-pvnet-app","commit_stats":{"total_commits":112,"total_committers":4,"mean_commits":28.0,"dds":0.4642857142857143,"last_synced_commit":"c6cc888cd538490e8f3489b426d35084699cf950"},"previous_names":["openclimatefix/pvnet_app","openclimatefix/uk-pvnet-app"],"tags_count":77,"template":false,"template_full_name":"openclimatefix/ocf-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fuk-pvnet-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fuk-pvnet-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fuk-pvnet-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openclimatefix%2Fuk-pvnet-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openclimatefix","download_url":"https://codeload.github.com/openclimatefix/uk-pvnet-app/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248208603,"owners_count":21065203,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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"}},"keywords":[],"created_at":"2024-11-14T04:46:12.407Z","updated_at":"2025-04-10T11:21:34.078Z","avatar_url":"https://github.com/openclimatefix.png","language":"Python","funding_links":["https://github.com/sponsors/openclimatefix","https://opencollective.com/openclimatefix"],"categories":[],"sub_categories":[],"readme":"# pvnet_app\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-14-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\n[![ease of contribution: medium](https://img.shields.io/badge/ease%20of%20contribution:%20medium-f4900c)](https://github.com/openclimatefix#how-easy-is-it-to-get-involved)\n\nInternal OCF application to run [PVNet](https://github.com/openclimatefix/PVNet) models and (optionally) [PVNet summation](https://github.com/openclimatefix/PVNet-summation) models for the UK in a live environment. This involves accessing weather data stored in AWS S3 buckets, processing and loading this data using either our `ocf-data-sampler` or `ocf_datapipes` libraries, pulling pre-trained models from HuggingFace and then producing solar PV power forecasts for the UK by feeding the processed weather data into the model. \n\nThe app supports multiple model versions being deployed to live environments and these can be ran with specific configurations which are set via environment variables.\n\n## Environment Variables\n\nThe following environment variables are used in the app:\n\n### Required Environment Variables\n\n- `DB_URL`: The URL for the database connection.\n- `NWP_UKV_ZARR_PATH`: The path to the UKV NWP data in Zarr format.\n- `NWP_ECMWF_ZARR_PATH`: The path to the ECMWF NWP data in Zarr format.\n- `SATELLITE_ZARR_PATH`: The path to the satellite data in Zarr format.\n\n### Optional Environment Variables\n\n#### These control the model(s) run\n\n- `RUN_CRITICAL_MODELS_ONLY`: Option to run critical models only. Defaults to false.\n- `DAY_AHEAD_MODEL`: Option to use day ahead model. Defaults to false.\n- `USE_OCF_DATA_SAMPLER`: Option to use OCF data sampler. Defaults to true.\n\n#### These control the saved results\n\n- `ALLOW_ADJUSTER`: Option to allow the adjuster to be used. If false this overwrites the adjuster \n  option in the model configs so it is not used. Defaults to true.\n- `ALLOW_SAVE_GSP_SUM`: Option to allow model to save the GSP sum. If false this overwrites the\n  model configs so saving of the GSP sum is not used. Defaults to false.\n\n#### These extra varaibles control validation and logging\n\n- `SENTRY_DSN`: Optional link to Sentry.\n- `ENVIRONMENT`: The environment this is running in. Defaults to local.\n- `FORECAST_VALIDATE_ZIG_ZAG_WARNING`: Threshold for warning on forecast zig-zag, defaults to 250MW.\n- `FORECAST_VALIDATE_ZIG_ZAG_ERROR`: Threshold for error on forecast zig-zag, defaults to 500MW.\n- `FORECAST_VALIDATE_SUN_ELEVATION_LOWER_LIMIT`, when the solar elevation is above this,\n  we expect positive forecast values. Defaults to 10 degrees.\n- `FILTER_BAD_FORECASTS`: If set to true and the forecast fails validation checks, it will not be \n  saved. Defaults to false, where all forecasts are saved even if they fail the checks.\n- `RAISE_MODEL_FAILURE`: Option to raise an exception if a model fails to run. If set to \"any\" it \n  will raise an exception if any model fails. If set to \"critical\" it will raise an exception if any\n  critical model fails. If not set, it will not raise an exception.\n\n### Examples\n\nHere are some examples of how to set these environment variables:\n\n```sh\nexport DB_URL=\"postgresql://user:password@localhost:5432/dbname\"\nexport NWP_UKV_ZARR_PATH=\"s3://bucket/path/to/ukv.zarr\"\nexport NWP_ECMWF_ZARR_PATH=\"s3://bucket/path/to/ecmwf.zarr\"\nexport SATELLITE_ZARR_PATH=\"s3://bucket/path/to/satellite.zarr\"\nexport ALLOW_ADJUSTER=\"true\"\nexport ALLOW_SAVE_GSP_SUM=\"false\"\nexport RUN_CRITICAL_MODELS_ONLY=\"true\"\nexport DAY_AHEAD_MODEL=\"false\"\nexport SENTRY_DSN=\"https://examplePublicKey@o0.ingest.sentry.io/0\"\nexport ENVIRONMENT=\"production\"\nexport USE_ECMWF_ONLY=\"false\"\nexport USE_OCF_DATA_SAMPLER=\"true\"\n```\n\n## ML Models Used for PVNet\n\n| Model Name                | Satellite | NWP UKV | NWP ECMWF | Legacy | PVNet Hugging Face Link | PVNet Summation Hugging Face Link |\n|---------------------------|-----------|---------|-----------|--------|--------------------------|----------------------------------|\n| **pvnet_v2**              | yes       | yes     | yes       | no     | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region/tree/f3135c47eb0f21320dbd8c590bdd03dfafc39bca) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_v2_summation/tree/01ca2b6e37a71deb446bb90471b44a1851d3e43f) |\n| **pvnet_ecmwf**           | no        | no      | yes       | no     | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region/tree/20b882bd4ceaee190a1c994d861f8e5d553ea843) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_v2_summation/tree/b40867abbc2e5163c9a665daf511cbf372cc5ac9) |\n| **pvnet-sat0**            | yes       | no      | no        | no     | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region/tree/d81a9cf8adca49739ea6a3d031e36510f44744a1) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_v2_summation/tree/7057e8c2baa065aa4024dd6b6381b71ac4879c87) |\n| **pvnet-sat0-only**       | yes       | no      | no        | no     | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region/tree/158f9aeb006dddc10ef67612a91e7175a87b8dd0) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_v2_summation/tree/c5371880120503646327dc2df2da2698de82982e) |\n| **pvnet-ukv-only**        | no        | yes     | no        | no     | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region/tree/4009df82e63e30546e2000728bff34b9c0520617) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_v2_summation/tree/1789cd9bdaded3896587efd54d3e9a257762fb63) |\n| **pvnet_day_ahead**       | no        | yes     | yes       | no     | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region_day_ahead/tree/263741ebb6b71559d113d799c9a579a973cc24ba) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_summation_uk_national_day_ahead/tree/7a2f26b94ac261160358b224944ef32998bd60ce) |\n| **Legacy pvnet_v2**       | yes       | yes     | yes       | yes    | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region/tree/aa73cdafd1db8df3c8b7f5ecfdb160989e7639ac) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_v2_summation/tree/a7fd71727f4cb2b933992b2108638985e24fa5a3) |\n| **Legacy pvnet_ecmwf**    | no        | no      | yes       | yes    | [HF Link](https://huggingface.co/openclimatefix/pvnet_uk_region/tree/c14f7427d9854d63430aa936ce45f55d3818d033) | [Summation HF Link](https://huggingface.co/openclimatefix/pvnet_v2_summation/tree/4fe6b1441b6dd549292c201ed85eee156ecc220c) |\n\n\n## Validation Checks\n\nWe run a number of different validation checks on the data and the forecasts that are made. \nThese are in place to ensure quality forecasts are made and saved to the database.\n\nBefore feeding data into the model(s) we check whether the data avilable is compatible with the \ndata that the model expects.\n\n### Satellite data\n\nWe check:\n- Whether 5 minute and/or 15 minute satellite data is available\n- If more than 5% of satellite data is NaN - if so the satellite data is treated as missing\n- If more that 10% of satellite data is zero - if so the satellite data is treated as missing\n- Whether there are any missing timestamps in the satellite data. We linearly interpolate\nany gaps less that 15 minutes.\n- Whether the exact timestamps that the model expects are all available after infilling and checks\n\n### NWP data\n\nWe check:\n- If the NWP data contains any NaNs - if so that NWP source is treated as missing\n- Whether the exact timestamps that the model expects from each NWP are available\n\n### ML batch checks\n\nJust before the batch data goes into the ML models, we check that \n- All the NWP are not zeros. We raise an error if, for any nwp provider, all the NWP data is zero. \n- TODO: https://github.com/openclimatefix/PVNet/issues/324\n\n### Forecast checks\n\nAfter the ML models have run, we check the following\n- The forecast is not above 110% of the national capacity. An error is raised if any forecast value is above 110% of the national capacity.\n- The forecast is not above 100 GW, any forecast value above 30 GW we get a warning but any forecast value above 100 GW we raise an error. \n- If the forecast goes up, then down, then up, more than 500 MW we raise an error. A warning is made for 250 MW. This stops zig-zag forecasts. \n- Check positive values in day. If the sun is up, we expect positive values. \n\n## Development\n\n### Running tests locally\n\nTo be able to run the tests locally it is recommended to use conda \u0026 pip and follow the steps from the Install requirements section onwards in the [Dockerfile](Dockerfile) or the install steps in the [conda-pytest.yaml](.github/workflows/conda-pytest.yaml) file and run tests the usual way via `python -m pytest`. Note if using certain macs you may need to install python \u003e= 3.11 to get this to work.\n\n### Running the app locally\n\nIt is possbile to run the app locally by setting the required environment variables listed at the top of the [app](pvnet_app/app.py), these should point to the relevant data sources and DBs for the environment you want to run the app in. You will need to make sure you have opened a connection to the DB, as well as authenticating against any cloud providers where data may be stored (e.g if using AWS S3 then can do this via the AWS CLI command `aws configure`), a simple [notebook](scripts/run_app_local_example.ipynb) has been created as an example.  \n\n\n## Contributors ✨\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/DubraskaS\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/87884444?v=4?s=100\" width=\"100px;\" alt=\"Dubraska Solórzano\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDubraska Solórzano\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=DubraskaS\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/dfulu\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/41546094?v=4?s=100\" width=\"100px;\" alt=\"James Fulton\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eJames Fulton\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=dfulu\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/zakwatts\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/47150349?v=4?s=100\" width=\"100px;\" alt=\"Megawattz\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMegawattz\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=zakwatts\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/peterdudfield\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/34686298?v=4?s=100\" width=\"100px;\" alt=\"Peter Dudfield\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003ePeter Dudfield\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=peterdudfield\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/DivyamAgg24\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/142659327?v=4?s=100\" width=\"100px;\" alt=\"DivyamAgg24\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDivyamAgg24\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=DivyamAgg24\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"http://github.com/aryanbhosale\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/36108149?v=4?s=100\" width=\"100px;\" alt=\"Aryan Bhosale\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAryan Bhosale\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=aryanbhosale\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/felix-e-h-p\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/137530077?v=4?s=100\" width=\"100px;\" alt=\"Felix\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFelix\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=felix-e-h-p\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/ADIMANV\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/68527614?v=4?s=100\" width=\"100px;\" alt=\"Aditya Sawant\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAditya Sawant\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=ADIMANV\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/Sukh-P\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/42407101?v=4?s=100\" width=\"100px;\" alt=\"Sukhil Patel\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eSukhil Patel\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=Sukh-P\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/alirashidAR\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/110668489?v=4?s=100\" width=\"100px;\" alt=\"Ali Rashid\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eAli Rashid\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=alirashidAR\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/mahmoud-40\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/116794637?v=4?s=100\" width=\"100px;\" alt=\"Mahmoud Abdulmawlaa\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMahmoud Abdulmawlaa\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=mahmoud-40\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/meghana-0211\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/136890863?v=4?s=100\" width=\"100px;\" alt=\"Meghana Sancheti\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eMeghana Sancheti\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=meghana-0211\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/mukiralad\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/67241568?v=4?s=100\" width=\"100px;\" alt=\"Dheeraj Mukirala\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDheeraj Mukirala\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=mukiralad\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n      \u003ctd align=\"center\" valign=\"top\" width=\"14.28%\"\u003e\u003ca href=\"https://github.com/utsav-pal\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/u/159793156?v=4?s=100\" width=\"100px;\" alt=\"utsav-pal\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eutsav-pal\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=utsav-pal\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/openclimatefix/uk-pvnet-app/commits?author=utsav-pal\" title=\"Documentation\"\u003e📖\u003c/a\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n[![OCF Logo](https://cdn.prod.website-files.com/62d92550f6774db58d441cca/6324a2038936ecda71599a8b_OCF_Logo_black_trans.png)](https://openclimatefix.org)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclimatefix%2Fuk-pvnet-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenclimatefix%2Fuk-pvnet-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenclimatefix%2Fuk-pvnet-app/lists"}