diff --git a/.gitignore b/.gitignore
index a6338f3..01188d9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,4 +4,5 @@ logs/*
.DS_Store
sandbox
slurm*
-data
\ No newline at end of file
+data
+bld
\ No newline at end of file
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..135524a
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,5 @@
+{
+ "python.terminal.activateEnvInCurrentTerminal": true,
+ "quarto.path": "",
+ "quarto.usePipQuarto": false
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index 3b106e8..f987f3d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,201 +1,395 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright 2022, fastai
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+Attribution 4.0 International
+
+=======================================================================
+
+Creative Commons Corporation ("Creative Commons") is not a law firm and
+does not provide legal services or legal advice. Distribution of
+Creative Commons public licenses does not create a lawyer-client or
+other relationship. Creative Commons makes its licenses and related
+information available on an "as-is" basis. Creative Commons gives no
+warranties regarding its licenses, any material licensed under their
+terms and conditions, or any related information. Creative Commons
+disclaims all liability for damages resulting from their use to the
+fullest extent possible.
+
+Using Creative Commons Public Licenses
+
+Creative Commons public licenses provide a standard set of terms and
+conditions that creators and other rights holders may use to share
+original works of authorship and other material subject to copyright
+and certain other rights specified in the public license below. The
+following considerations are for informational purposes only, are not
+exhaustive, and do not form part of our licenses.
+
+ Considerations for licensors: Our public licenses are
+ intended for use by those authorized to give the public
+ permission to use material in ways otherwise restricted by
+ copyright and certain other rights. Our licenses are
+ irrevocable. Licensors should read and understand the terms
+ and conditions of the license they choose before applying it.
+ Licensors should also secure all rights necessary before
+ applying our licenses so that the public can reuse the
+ material as expected. Licensors should clearly mark any
+ material not subject to the license. This includes other CC-
+ licensed material, or material used under an exception or
+ limitation to copyright. More considerations for licensors:
+ wiki.creativecommons.org/Considerations_for_licensors
+
+ Considerations for the public: By using one of our public
+ licenses, a licensor grants the public permission to use the
+ licensed material under specified terms and conditions. If
+ the licensor's permission is not necessary for any reason--for
+ example, because of any applicable exception or limitation to
+ copyright--then that use is not regulated by the license. Our
+ licenses grant only permissions under copyright and certain
+ other rights that a licensor has authority to grant. Use of
+ the licensed material may still be restricted for other
+ reasons, including because others have copyright or other
+ rights in the material. A licensor may make special requests,
+ such as asking that all changes be marked or described.
+ Although not required by our licenses, you are encouraged to
+ respect those requests where reasonable. More considerations
+ for the public:
+ wiki.creativecommons.org/Considerations_for_licensees
+
+=======================================================================
+
+Creative Commons Attribution 4.0 International Public License
+
+By exercising the Licensed Rights (defined below), You accept and agree
+to be bound by the terms and conditions of this Creative Commons
+Attribution 4.0 International Public License ("Public License"). To the
+extent this Public License may be interpreted as a contract, You are
+granted the Licensed Rights in consideration of Your acceptance of
+these terms and conditions, and the Licensor grants You such rights in
+consideration of benefits the Licensor receives from making the
+Licensed Material available under these terms and conditions.
+
+
+Section 1 -- Definitions.
+
+ a. Adapted Material means material subject to Copyright and Similar
+ Rights that is derived from or based upon the Licensed Material
+ and in which the Licensed Material is translated, altered,
+ arranged, transformed, or otherwise modified in a manner requiring
+ permission under the Copyright and Similar Rights held by the
+ Licensor. For purposes of this Public License, where the Licensed
+ Material is a musical work, performance, or sound recording,
+ Adapted Material is always produced where the Licensed Material is
+ synched in timed relation with a moving image.
+
+ b. Adapter's License means the license You apply to Your Copyright
+ and Similar Rights in Your contributions to Adapted Material in
+ accordance with the terms and conditions of this Public License.
+
+ c. Copyright and Similar Rights means copyright and/or similar rights
+ closely related to copyright including, without limitation,
+ performance, broadcast, sound recording, and Sui Generis Database
+ Rights, without regard to how the rights are labeled or
+ categorized. For purposes of this Public License, the rights
+ specified in Section 2(b)(1)-(2) are not Copyright and Similar
+ Rights.
+
+ d. Effective Technological Measures means those measures that, in the
+ absence of proper authority, may not be circumvented under laws
+ fulfilling obligations under Article 11 of the WIPO Copyright
+ Treaty adopted on December 20, 1996, and/or similar international
+ agreements.
+
+ e. Exceptions and Limitations means fair use, fair dealing, and/or
+ any other exception or limitation to Copyright and Similar Rights
+ that applies to Your use of the Licensed Material.
+
+ f. Licensed Material means the artistic or literary work, database,
+ or other material to which the Licensor applied this Public
+ License.
+
+ g. Licensed Rights means the rights granted to You subject to the
+ terms and conditions of this Public License, which are limited to
+ all Copyright and Similar Rights that apply to Your use of the
+ Licensed Material and that the Licensor has authority to license.
+
+ h. Licensor means the individual(s) or entity(ies) granting rights
+ under this Public License.
+
+ i. Share means to provide material to the public by any means or
+ process that requires permission under the Licensed Rights, such
+ as reproduction, public display, public performance, distribution,
+ dissemination, communication, or importation, and to make material
+ available to the public including in ways that members of the
+ public may access the material from a place and at a time
+ individually chosen by them.
+
+ j. Sui Generis Database Rights means rights other than copyright
+ resulting from Directive 96/9/EC of the European Parliament and of
+ the Council of 11 March 1996 on the legal protection of databases,
+ as amended and/or succeeded, as well as other essentially
+ equivalent rights anywhere in the world.
+
+ k. You means the individual or entity exercising the Licensed Rights
+ under this Public License. Your has a corresponding meaning.
+
+
+Section 2 -- Scope.
+
+ a. License grant.
+
+ 1. Subject to the terms and conditions of this Public License,
+ the Licensor hereby grants You a worldwide, royalty-free,
+ non-sublicensable, non-exclusive, irrevocable license to
+ exercise the Licensed Rights in the Licensed Material to:
+
+ a. reproduce and Share the Licensed Material, in whole or
+ in part; and
+
+ b. produce, reproduce, and Share Adapted Material.
+
+ 2. Exceptions and Limitations. For the avoidance of doubt, where
+ Exceptions and Limitations apply to Your use, this Public
+ License does not apply, and You do not need to comply with
+ its terms and conditions.
+
+ 3. Term. The term of this Public License is specified in Section
+ 6(a).
+
+ 4. Media and formats; technical modifications allowed. The
+ Licensor authorizes You to exercise the Licensed Rights in
+ all media and formats whether now known or hereafter created,
+ and to make technical modifications necessary to do so. The
+ Licensor waives and/or agrees not to assert any right or
+ authority to forbid You from making technical modifications
+ necessary to exercise the Licensed Rights, including
+ technical modifications necessary to circumvent Effective
+ Technological Measures. For purposes of this Public License,
+ simply making modifications authorized by this Section 2(a)
+ (4) never produces Adapted Material.
+
+ 5. Downstream recipients.
+
+ a. Offer from the Licensor -- Licensed Material. Every
+ recipient of the Licensed Material automatically
+ receives an offer from the Licensor to exercise the
+ Licensed Rights under the terms and conditions of this
+ Public License.
+
+ b. No downstream restrictions. You may not offer or impose
+ any additional or different terms or conditions on, or
+ apply any Effective Technological Measures to, the
+ Licensed Material if doing so restricts exercise of the
+ Licensed Rights by any recipient of the Licensed
+ Material.
+
+ 6. No endorsement. Nothing in this Public License constitutes or
+ may be construed as permission to assert or imply that You
+ are, or that Your use of the Licensed Material is, connected
+ with, or sponsored, endorsed, or granted official status by,
+ the Licensor or others designated to receive attribution as
+ provided in Section 3(a)(1)(A)(i).
+
+ b. Other rights.
+
+ 1. Moral rights, such as the right of integrity, are not
+ licensed under this Public License, nor are publicity,
+ privacy, and/or other similar personality rights; however, to
+ the extent possible, the Licensor waives and/or agrees not to
+ assert any such rights held by the Licensor to the limited
+ extent necessary to allow You to exercise the Licensed
+ Rights, but not otherwise.
+
+ 2. Patent and trademark rights are not licensed under this
+ Public License.
+
+ 3. To the extent possible, the Licensor waives any right to
+ collect royalties from You for the exercise of the Licensed
+ Rights, whether directly or through a collecting society
+ under any voluntary or waivable statutory or compulsory
+ licensing scheme. In all other cases the Licensor expressly
+ reserves any right to collect such royalties.
+
+
+Section 3 -- License Conditions.
+
+Your exercise of the Licensed Rights is expressly made subject to the
+following conditions.
+
+ a. Attribution.
+
+ 1. If You Share the Licensed Material (including in modified
+ form), You must:
+
+ a. retain the following if it is supplied by the Licensor
+ with the Licensed Material:
+
+ i. identification of the creator(s) of the Licensed
+ Material and any others designated to receive
+ attribution, in any reasonable manner requested by
+ the Licensor (including by pseudonym if
+ designated);
+
+ ii. a copyright notice;
+
+ iii. a notice that refers to this Public License;
+
+ iv. a notice that refers to the disclaimer of
+ warranties;
+
+ v. a URI or hyperlink to the Licensed Material to the
+ extent reasonably practicable;
+
+ b. indicate if You modified the Licensed Material and
+ retain an indication of any previous modifications; and
+
+ c. indicate the Licensed Material is licensed under this
+ Public License, and include the text of, or the URI or
+ hyperlink to, this Public License.
+
+ 2. You may satisfy the conditions in Section 3(a)(1) in any
+ reasonable manner based on the medium, means, and context in
+ which You Share the Licensed Material. For example, it may be
+ reasonable to satisfy the conditions by providing a URI or
+ hyperlink to a resource that includes the required
+ information.
+
+ 3. If requested by the Licensor, You must remove any of the
+ information required by Section 3(a)(1)(A) to the extent
+ reasonably practicable.
+
+ 4. If You Share Adapted Material You produce, the Adapter's
+ License You apply must not prevent recipients of the Adapted
+ Material from complying with this Public License.
+
+
+Section 4 -- Sui Generis Database Rights.
+
+Where the Licensed Rights include Sui Generis Database Rights that
+apply to Your use of the Licensed Material:
+
+ a. for the avoidance of doubt, Section 2(a)(1) grants You the right
+ to extract, reuse, reproduce, and Share all or a substantial
+ portion of the contents of the database;
+
+ b. if You include all or a substantial portion of the database
+ contents in a database in which You have Sui Generis Database
+ Rights, then the database in which You have Sui Generis Database
+ Rights (but not its individual contents) is Adapted Material; and
+
+ c. You must comply with the conditions in Section 3(a) if You Share
+ all or a substantial portion of the contents of the database.
+
+For the avoidance of doubt, this Section 4 supplements and does not
+replace Your obligations under this Public License where the Licensed
+Rights include other Copyright and Similar Rights.
+
+
+Section 5 -- Disclaimer of Warranties and Limitation of Liability.
+
+ a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
+ EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
+ AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
+ ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
+ IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
+ WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
+ ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
+ KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
+ ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
+
+ b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
+ TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
+ NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
+ INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
+ COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
+ USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
+ ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
+ DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
+ IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
+
+ c. The disclaimer of warranties and limitation of liability provided
+ above shall be interpreted in a manner that, to the extent
+ possible, most closely approximates an absolute disclaimer and
+ waiver of all liability.
+
+
+Section 6 -- Term and Termination.
+
+ a. This Public License applies for the term of the Copyright and
+ Similar Rights licensed here. However, if You fail to comply with
+ this Public License, then Your rights under this Public License
+ terminate automatically.
+
+ b. Where Your right to use the Licensed Material has terminated under
+ Section 6(a), it reinstates:
+
+ 1. automatically as of the date the violation is cured, provided
+ it is cured within 30 days of Your discovery of the
+ violation; or
+
+ 2. upon express reinstatement by the Licensor.
+
+ For the avoidance of doubt, this Section 6(b) does not affect any
+ right the Licensor may have to seek remedies for Your violations
+ of this Public License.
+
+ c. For the avoidance of doubt, the Licensor may also offer the
+ Licensed Material under separate terms or conditions or stop
+ distributing the Licensed Material at any time; however, doing so
+ will not terminate this Public License.
+
+ d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
+ License.
+
+
+Section 7 -- Other Terms and Conditions.
+
+ a. The Licensor shall not be bound by any additional or different
+ terms or conditions communicated by You unless expressly agreed.
+
+ b. Any arrangements, understandings, or agreements regarding the
+ Licensed Material not stated herein are separate from and
+ independent of the terms and conditions of this Public License.
+
+
+Section 8 -- Interpretation.
+
+ a. For the avoidance of doubt, this Public License does not, and
+ shall not be interpreted to, reduce, limit, restrict, or impose
+ conditions on any use of the Licensed Material that could lawfully
+ be made without permission under this Public License.
+
+ b. To the extent possible, if any provision of this Public License is
+ deemed unenforceable, it shall be automatically reformed to the
+ minimum extent necessary to make it enforceable. If the provision
+ cannot be reformed, it shall be severed from this Public License
+ without affecting the enforceability of the remaining terms and
+ conditions.
+
+ c. No term or condition of this Public License will be waived and no
+ failure to comply consented to unless expressly agreed to by the
+ Licensor.
+
+ d. Nothing in this Public License constitutes or may be interpreted
+ as a limitation upon, or waiver of, any privileges and immunities
+ that apply to the Licensor or You, including from the legal
+ processes of any jurisdiction or authority.
+
+
+=======================================================================
+
+Creative Commons is not a party to its public licenses.
+Notwithstanding, Creative Commons may elect to apply one of its public
+licenses to material it publishes and in those instances will be
+considered the “Licensor.” The text of the Creative Commons public
+licenses is dedicated to the public domain under the CC0 Public Domain
+Dedication. Except for the limited purpose of indicating that material
+is shared under a Creative Commons public license or as otherwise
+permitted by the Creative Commons policies published at
+creativecommons.org/policies, Creative Commons does not authorize the
+use of the trademark "Creative Commons" or any other trademark or logo
+of Creative Commons without its prior written consent including,
+without limitation, in connection with any unauthorized modifications
+to any of its public licenses or any other arrangements,
+understandings, or agreements concerning use of licensed material. For
+the avoidance of doubt, this paragraph does not form part of the public
+licenses.
+
+Creative Commons may be contacted at creativecommons.org.
\ No newline at end of file
diff --git a/README.md b/README.md
index 04b9caa..f1a8874 100644
--- a/README.md
+++ b/README.md
@@ -1,28 +1,613 @@
-# ERA5 Exposure Aggregation Pipeline
+# The ERA5 Spatial Aggregation Pipeline
-This repository contains a pipeline for aggregating ERA5 environmental exposures data to a 0.1 degree grid. The pipeline is designed to be run on FASRC. We developed
-this pipeline using `nbdev`, which means that we can create modules and scripts from notebooks.
-Hence, all of the documentation for how the pipeline was developed and validated is
-available in `notes/index.ipynb` and the associated notebooks.
-## How to Review a PR
+
-To review a PR on this repository, follow these steps:
+``` python
+from era5_sandbox.core import *
+```
-0. Obtain an API key for the ERA5 datastore from [here](https://cds.climate.copernicus.eu/how-to-api), and ask Tinashe for access to the Golden Lab `googledriver` API key
+## era5_sandbox
-1. Clone this repository to your workspace on FASRC
+> Sandbox environment for era5 development
-2. Create a conda environment with `conda create -n era5_sandbox python=3.10` and install all of the necessary dependencies for the package with `pip install -e .`
+This package documents the development and implementation of functions
+and code for the Madagascar ERA5 dataset project. The goal is for
+exposure data to be made available at the daily resolution when
+possible. Finer resolutions shouldn’t ever be needed for our purposes,
+and it should then be relatively easy to aggregate at coarser
+resolutions, such as weekly or monthly. Additionally, we’ve extended
+this work to Nepal as well.
-3. Run the `core` module to test your API key and setup the data
-directory structure
+Variables should generally be made available from 2010 onward, as that’s
+where our clinic data starts.
-`python src/era5_sandbox/core.py`
+All data are ideally made available at the “healthshed” geographical
+level. Healthsheds are defined as geographical areas where people who
+live all go to the same clinic. There are a total of ~2700 public
+clinics in Madagascar, hence ~2700 healthsheds, with each healthshed
+containing ~10000 people on average.
-4. Symlink your local data directory to the original work
-`ln -s [YOUR WORKING DIRECTORY]/data /n/dominici_lab/lab/data_processing/csph-era5_sandbox/data`
+Preliminary list of environmental variables
-5. Dry run by removing a file from data `snakemake --dry-run`
+- [x] 2-m air temperature from ERA5: daily min, max, mean
-6. Run the pipeline `sbatch snakemake.sbatch`
+- [x] 2-m air dew point temperature from ERA5: daily min, max, mean
+
+- [x] Precipitation: daily total (ERA5)
+
+- [x] Soil moisture: daily average (ERA5)
+
+Variables from other sources:
+
+- [ ] Sea surface temperature: daily average and maximum in the nearest
+ neighbor for each healthshed.
+
+- [ ] Precipitation: daily total (CHIRPS)
+
+- [ ] Chlorophyll-A (Giacomo)
+
+- [ ] Wealth index: Available from Giacomo
+
+- [ ] NDVI
+
+- [ ] Tropical storm
+
+- [ ] Flooding
+
+- [ ] Deforestation
+
+- [ ] Linking/segmenting healthsheds into climate zones and other
+
+- [ ] Relative humidity: daily average (lower priority)
+
+Those from the ERA5 dataset will be housed here, but we may likely
+develop a separate repository for the other datasets.
+
+## Developer Guide
+
+This package is built and maintained with `nbdev`. If you are new to
+using `nbdev` here are some useful pointers to get you started.
+
+### Install era5_sandbox in Development mode
+
+``` sh
+# make sure era5_sandbox package is installed in development mode
+$ pip install -e .
+```
+
+To make changes, go to the “notes” directory and edit the notebooks as
+necessary. Each notebook refers to a module in the era5_sandbox package.
+Cells are exported to the module when the notebook is saved and you run
+the following command:
+
+``` sh
+$ nbdev_export
+```
+
+For e.g., to change functionality of the
+[`testAPI()`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi)
+function in the testAPI Hydra rule, you would edit the
+[`testAPI`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi)
+notebook in the `notes` directory `notes/testAPI.ipynb`, and then save
+that notebook and run `nbdev_export` to update the `core` module in the
+package.
+
+### How to Run the Pipeline
+
+The pipeline downloads ERA5 variables for a given date range and
+geographical bounding box. You can learn how each of these steps was by
+following the notebooks in `notes` in numerical order.
+
+> [!IMPORTANT]
+>
+> The pipeline has two implementations: one using `snakemake` and
+> `hydra`, and another using `pytask`. The `pytask` implementation is
+> the more recent one, and is recommended for future use. The
+> `snakemake` implementation is left here for reference to legacy code.
+
+#### Using `pytask`
+
+To run the pipeline, the `pytask` config at `note/20_pytask_config.qmd`
+should be reviewed and updated if necessary. The pipeline can then be
+run with the following command:
+
+``` sh
+$ sbatch pytask.sbatch
+```
+
+#### Using `snakemake` and `hydra`
+
+To run the pipeline, the config at `config/config.yaml` should be
+updated with the desired date range and geographical bounding box. The
+pipeline can then be run with the following command:
+
+``` sh
+sbatch snakemake.sbatch
+```
+
+### What Does the Pipeline Produce?
+
+Using `pytask`’s data catalog, you can investigate the downloaded raw
+data with python, eg.:
+
+``` python
+import xarray as xr
+from era5_sandbox.config import data_catalog
+from era5_sandbox.core import ClimateDataFileHandler
+
+ex_nc = list(data_catalog['download']['outputs']._entries).pop()
+ex_nc_path = data_catalog['download']['outputs'][ex_nc].load()
+
+with ClimateDataFileHandler(ex_nc_path) as handler:
+ ds = xr.open_dataset(handler.get_dataset("instant"))
+
+ds
+```
+
+
Describe the configuration file used by Hydra for the pipeline
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
cfg
+
DictConfig
+
None
+
Configuration file
+
+
+
Returns
+
None
+
+
+
+
+
+
+
+Exported source
+
def describe(
+ cfg: DictConfig=None, # Configuration file
+ )->None:
+"Describe the configuration file used by Hydra for the pipeline"
+
+if cfg isNone:
+print("No configuration file provided. Generating default configuration file.")
+ cfg = OmegaConf.create()
+
+print("This package fetches ERA5 data. The following is the config file used by Hydra for the pipeline:\n")
+print(OmegaConf.to_yaml(cfg))
We’re going to use a class to authenticate and interact with google drive. The goal is to have a simple interface to fetch the healthshed files dynamically from google drive in the pipeline.
+
+
+
+
+
+
+Important
+
+
+
+
This class was implemented when all of our data was stored on a private Google Drive. Since we have moved all of our data to FASRC, this will likely be deprecated in the near future.
*A class to handle Google Drive authentication and file management. This class uses the PyDrive2 library to authenticate with Google Drive using a service account.
+
It provides three methods: authenticating the account, getting the drive object, and downloading the healthshed files for madagascar.*
+
Here’s how we use it. The credentials for the data-pipeline service account are available in the sandbox folder, and the path to said folder is set in the config:
+
+
from hydra import initialize, compose
+from omegaconf import OmegaConf
+
+
+
# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+exceptExceptionas e:
+print(f"Error initializing Hydra: {e}")
+with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+
+
+
+
+
+
+Important
+
+
+
+
If we continue with pytask, we will not need to use hydra at all, and so the above strategy may get deprecated.
Here’s how we might check that the healthsheds are accessible in the drive:
+
+
# we're using the madagascar healthshed folder as an example
+folder_id = cfg.geographies.madagascar.healthsheds
+folder_name ="healthsheds2022.zip"
+file_list = drive.ListFile({'q': f" title='{folder_name}' and trashed = false "}).GetList()
+
+forfilein file_list:
+print(f"{file['title']} - {file['mimeType']}")
+
+
That being said, we can read in the healthsheds into geopandas by downloading them to a temp directory. The healthsheds must be a zipped shapefiles package with the files at the root of the zip directory.
+
+
with tempfile.TemporaryDirectory() as temp_dir:
+# Create a temporary directory to store the downloaded file
+ zip_path = os.path.join(temp_dir, folder_name)
+
+# Download file from Google Drive
+ file_obj = drive.CreateFile({'id': file_list[0]['id']})
+ file_obj.GetContentFile(zip_path)
+
+# Read shapefile directly from ZIP
+ gdf = gpd.read_file(f"zip://{zip_path}")
+
+
That works! So now we can patch the class to include this workflow:
Usually, when you download data, it comes out as a simple .nc file that can be opened with xarray. However, the CDS API has a few different file types that are not .nc files. For example, the ERA5 data is stored in a .grib file format. This is a common format for meteorological data, and it is used by the ECMWF. When a query has multiple variables, sometimes they are downloaded as a .zip file to separat the grib from the netcdf.
+
So, below, we define a class that can handle the file no matter what the type is. It will check the file type and then use the appropriate method to open it. The class will also have a method to check if the file is a .zip file, and if so, it will unzip it and return the path to the unzipped file.
A class to handle file operations for the Climate Data Store (CDS). This class provides unpack files downloaded from the CDS API. It must be able to handle the unpacking of files downloaded from the CDS API. This means that if the file is a basic netcdf, it should be passed to the netcdf handler. If the file is a zip, it should be handled by the zip handler in temp and the data returned as required.
+
+
import xarray as xr
+from fastcore.test import test_fail
+
+
+
eg_file = here() /"bld/2019_5_madagascar.nc"
+
+# this fails because the nc file downloaded has grib and netcdf in it, so
+# xr cannot handle it.
+def wont_work(multilayer_file):
+
+ ds = xr.open_dataset(multilayer_file)
+
+test_fail(
+ wont_work,
+ args=(eg_file)
+)
+
+# equivalent to saying try: wont_work(eg_file) Except: some error handling
+
+
The above fails because the download contains temperature and precipitation data, which get encoded silently as different formats. Even though it is one file, it contains both grib and netcdf data and is encoded as a .zip file. So we use the class to read it instead:
The above line for ds2 is commented out because the example file does not separate accumulation data.
+
+
+
+
ds1
+
+
+
#ds2
+
+
+
handler.cleanup()
+
+
Great! Let’s add a context handler and this can be added to the pipeline, so that with the entry and exit methods, we can now use the class in a with statement:
+
+
with ClimateDataFileHandler(eg_file) as handler:
+ ds1 = xr.open_dataset(handler.get_dataset("instant"))
+#ds2 = xr.open_dataset(handler.get_dataset("accum"))
+
+print(ds1)
+#print(ds2)
+
+
+
+
+
Tests and Main
+
In nbdev, our tests are embedded in the notebook. Whenever you export the notebook, all the cells that are specified to run are run, and hence, the tests are executed. The tests are also exported. This is a great way to ensure that your documentation is always up-to-date. For this module, we’re using the testAPI() function as our main test.
def testAPI(
+ cfg: DictConfig=None,
+ dataset:str="reanalysis-era5-pressure-levels"
+ )->bool:
+
+# parse config
+ testing=cfg.development_mode
+ output_path=here("data") /"testing"
+
+print(OmegaConf.to_yaml(cfg))
+
+try:
+ client = cdsapi.Client()
+
+# build request
+ request = {
+'product_type': ['reanalysis'],
+'variable': ['geopotential'],
+'year': ['2024'],
+'month': ['03'],
+'day': ['01'],
+'time': ['13:00'],
+'pressure_level': ['1000'],
+'data_format': 'grib',
+ }
+
+ target = output_path /'test_download.grib'
+
+print("Testing API connection by downloading a dummy dataset to {}...".format(output_path))
+
+ client.retrieve(dataset, request, target)
+
+ifnot testing:
+ os.remove(target)
+
+print("API connection test successful.")
+returnTrue
+
+exceptExceptionas e:
+print("API connection test failed.")
+print("Did you set up your API key with CDS? If not, please visit https://cds.climate.copernicus.eu/how-to-api#install-the-cds-api-client")
+print("Error: {}".format(e))
+returnFalse
+
+
+
We can see that this API tester tool works with Hydra configuration:
+
+
from hydra import initialize, compose
+from omegaconf import OmegaConf
+
+
+
# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+exceptExceptionas e:
+print(f"Error initializing Hydra: {e}")
+with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+describe(cfg)
+
+
+
+
Importing the Main Function
+
+
+
+
+
+
+Important
+
+
+
+
As mentioned, if we continue with pytask, we will not need to use hydra at all, and so the main function may get deprecated as pytask will handle the pipeline execution without __main__ scripts.
+
+
+
Important: using __main__ in nbdev and Hydra is a little bit tricky. We need to define the main function in the module ONLY ONCE and then when we export the notebook to script, we need to add the nbdev.imports.IN_NOTEBOOK variable. This way, the main function will only be executed when we run the notebook and not when we import the module.
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/00_core.md b/_docs/00_core.md
new file mode 100644
index 0000000..43d541c
--- /dev/null
+++ b/_docs/00_core.md
@@ -0,0 +1,529 @@
+# Core Module: Internal functions and testing
+
+
+## core
+
+> This is a core library for the ERA5 dataset pipeline. It defines a few
+> helpful functions such as an API tester to test your API key and
+> connection.
+
+
+
+
+Exported source
+
+``` python
+import os
+import cdsapi
+import hydra
+import json
+import tempfile
+import argparse
+import zipfile
+import shutil
+import geopandas as gpd
+from pathlib import Path
+from pydrive2.auth import GoogleAuth
+from pydrive2.drive import GoogleDrive
+from omegaconf import DictConfig, OmegaConf
+from pyprojroot import here
+from importlib import import_module
+```
+
+
+
+## Utilities
+
+Some utilities are provided to help you with the ERA5 dataset.
+
+------------------------------------------------------------------------
+
+source
+
+### describe
+
+> describe (cfg:omegaconf.dictconfig.DictConfig=None)
+
+*Describe the configuration file used by Hydra for the pipeline*
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
cfg
+
DictConfig
+
None
+
Configuration file
+
+
+
Returns
+
None
+
+
+
+
+
+
+
+Exported source
+
+``` python
+def describe(
+ cfg: DictConfig=None, # Configuration file
+ )-> None:
+ "Describe the configuration file used by Hydra for the pipeline"
+
+ if cfg is None:
+ print("No configuration file provided. Generating default configuration file.")
+ cfg = OmegaConf.create()
+
+ print("This package fetches ERA5 data. The following is the config file used by Hydra for the pipeline:\n")
+ print(OmegaConf.to_yaml(cfg))
+```
+
+
+
+In addition, we’ve defined 3 private functions to help with path
+expansion
+[`_expand_path`](https://TinasheMTapera.github.io/era5_sandbox/core.html#_expand_path),
+dynamic function importing
+[`_get_callable`](https://TinasheMTapera.github.io/era5_sandbox/core.html#_get_callable),
+and directory structure creation
+[`_create_directory_structure`](https://TinasheMTapera.github.io/era5_sandbox/core.html#_create_directory_structure).
+
+### A Simple Temperature Conversion Function
+
+------------------------------------------------------------------------
+
+source
+
+### kelvin_to_celsius
+
+> kelvin_to_celsius (kelvin:float)
+
+*Convert temperature from Kelvin to Celsius.*
+
+
+
+
+
+
Type
+
Details
+
+
+
+
+
kelvin
+
float
+
Temperature in Kelvin
+
+
+
Returns
+
float
+
Temperature in Celsius
+
+
+
+
+### A Class for Authenticating Google Drive
+
+We’re going to use a class to authenticate and interact with google
+drive. The goal is to have a simple interface to fetch the healthshed
+files dynamically from google drive in the pipeline.
+
+
+
+> **Important**
+>
+> This class was implemented when all of our data was stored on a
+> private Google Drive. Since we have moved all of our data to FASRC,
+> this will likely be deprecated in the near future.
+
+
+
+------------------------------------------------------------------------
+
+source
+
+### GoogleDriver
+
+> GoogleDriver (json_key_path=None)
+
+\*A class to handle Google Drive authentication and file management.
+This class uses the PyDrive2 library to authenticate with Google Drive
+using a service account.
+
+It provides three methods: authenticating the account, getting the drive
+object, and downloading the healthshed files for madagascar.\*
+
+Here’s how we use it. The credentials for the data-pipeline service
+account are available in the sandbox folder, and the path to said folder
+is set in the config:
+
+``` python
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+```
+
+``` python
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+```
+
+
+
+> **Important**
+>
+> If we continue with `pytask`, we will not need to use hydra at all,
+> and so the above strategy may get deprecated.
+
+
+
+``` python
+auth = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = auth.get_drive()
+```
+
+Here’s how we might check that the healthsheds are accessible in the
+drive:
+
+``` python
+# we're using the madagascar healthshed folder as an example
+folder_id = cfg.geographies.madagascar.healthsheds
+folder_name = "healthsheds2022.zip"
+file_list = drive.ListFile({'q': f" title='{folder_name}' and trashed = false "}).GetList()
+
+for file in file_list:
+ print(f"{file['title']} - {file['mimeType']}")
+```
+
+That being said, we can read in the healthsheds into geopandas by
+downloading them to a temp directory. The healthsheds must be a zipped
+shapefiles package with the files at the root of the zip directory.
+
+``` python
+with tempfile.TemporaryDirectory() as temp_dir:
+ # Create a temporary directory to store the downloaded file
+ zip_path = os.path.join(temp_dir, folder_name)
+
+ # Download file from Google Drive
+ file_obj = drive.CreateFile({'id': file_list[0]['id']})
+ file_obj.GetContentFile(zip_path)
+
+ # Read shapefile directly from ZIP
+ gdf = gpd.read_file(f"zip://{zip_path}")
+```
+
+That works! So now we can patch the class to include this workflow:
+
+------------------------------------------------------------------------
+
+source
+
+### GoogleDriver.read_healthsheds
+
+> GoogleDriver.read_healthsheds (healthshed_zip_name)
+
+And to check that it works:
+
+``` python
+driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = driver.get_drive()
+healthsheds = driver.read_healthsheds("healthsheds2022.zip")
+
+healthsheds.describe()
+```
+
+## CDS File Handler Type
+
+
+
+> **Important**
+>
+> This section may also be deprecated. Since adding `swvl1` to the
+> pipeline, we have not needed to use this class. We leave it here for
+> now for reference.
+
+
+
+We’re going to make a file handler type to help deal with CDS files.
+This is to fix
+[NSAPH-Data-Processing/era5_sandbox#13](https://github.com/NSAPH-Data-Processing/era5_sandbox/issues/13).
+
+Usually, when you download data, it comes out as a simple .nc file that
+can be opened with xarray. However, the CDS API has a few different file
+types that are not .nc files. For example, the ERA5 data is stored in a
+.grib file format. This is a common format for meteorological data, and
+it is used by the ECMWF. When a query has multiple variables, sometimes
+they are downloaded as a .zip file to separat the grib from the netcdf.
+
+So, below, we define a class that can handle the file no matter what the
+type is. It will check the file type and then use the appropriate method
+to open it. The class will also have a method to check if the file is a
+.zip file, and if so, it will unzip it and return the path to the
+unzipped file.
+
+------------------------------------------------------------------------
+
+source
+
+### ClimateDataFileHandler
+
+> ClimateDataFileHandler (input_path:str)
+
+*A class to handle file operations for the Climate Data Store (CDS).
+This class provides unpack files downloaded from the CDS API. It must be
+able to handle the unpacking of files downloaded from the CDS API. This
+means that if the file is a basic netcdf, it should be passed to the
+netcdf handler. If the file is a zip, it should be handled by the zip
+handler in temp and the data returned as required.*
+
+``` python
+import xarray as xr
+from fastcore.test import test_fail
+```
+
+``` python
+eg_file = here() / "bld/2019_5_madagascar.nc"
+
+# this fails because the nc file downloaded has grib and netcdf in it, so
+# xr cannot handle it.
+def wont_work(multilayer_file):
+
+ ds = xr.open_dataset(multilayer_file)
+
+test_fail(
+ wont_work,
+ args=(eg_file)
+)
+
+# equivalent to saying try: wont_work(eg_file) Except: some error handling
+```
+
+The above fails because the download contains temperature and
+precipitation data, which get encoded silently as different formats.
+Even though it is one file, it contains both grib and netcdf data and is
+encoded as a .zip file. So we use the class to read it instead:
+
+``` python
+handler = ClimateDataFileHandler(eg_file)
+handler.prepare()
+ds1 = xr.open_dataset(handler.get_dataset("instant"))
+#ds2 = xr.open_dataset(handler.get_dataset("accum"))
+```
+
+
+
+> **Important**
+>
+> The above line for `ds2` is commented out because the example file
+> does not separate accumulation data.
+
+
+
+``` python
+ds1
+```
+
+``` python
+#ds2
+```
+
+``` python
+handler.cleanup()
+```
+
+Great! Let’s add a context handler and this can be added to the
+pipeline, so that with the entry and exit methods, we can now use the
+class in a `with` statement:
+
+``` python
+with ClimateDataFileHandler(eg_file) as handler:
+ ds1 = xr.open_dataset(handler.get_dataset("instant"))
+ #ds2 = xr.open_dataset(handler.get_dataset("accum"))
+
+ print(ds1)
+ #print(ds2)
+```
+
+## Tests and Main
+
+In `nbdev`, our tests are embedded in the notebook. Whenever you export
+the notebook, all the cells that are specified to run are run, and
+hence, the tests are executed. The tests are also exported. This is a
+great way to ensure that your documentation is always up-to-date. For
+this module, we’re using the
+[`testAPI()`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi)
+function as our main test.
+
+------------------------------------------------------------------------
+
+source
+
+### testAPI
+
+> testAPI (cfg:omegaconf.dictconfig.DictConfig=None,
+> dataset:str='reanalysis-era5-pressure-levels')
+
+
+Exported source
+
+``` python
+def testAPI(
+ cfg: DictConfig=None,
+ dataset:str="reanalysis-era5-pressure-levels"
+ )-> bool:
+
+ # parse config
+ testing=cfg.development_mode
+ output_path=here("data") / "testing"
+
+ print(OmegaConf.to_yaml(cfg))
+
+ try:
+ client = cdsapi.Client()
+
+ # build request
+ request = {
+ 'product_type': ['reanalysis'],
+ 'variable': ['geopotential'],
+ 'year': ['2024'],
+ 'month': ['03'],
+ 'day': ['01'],
+ 'time': ['13:00'],
+ 'pressure_level': ['1000'],
+ 'data_format': 'grib',
+ }
+
+ target = output_path / 'test_download.grib'
+
+ print("Testing API connection by downloading a dummy dataset to {}...".format(output_path))
+
+ client.retrieve(dataset, request, target)
+
+ if not testing:
+ os.remove(target)
+
+ print("API connection test successful.")
+ return True
+
+ except Exception as e:
+ print("API connection test failed.")
+ print("Did you set up your API key with CDS? If not, please visit https://cds.climate.copernicus.eu/how-to-api#install-the-cds-api-client")
+ print("Error: {}".format(e))
+ return False
+```
+
+
+
+We can see that this API tester tool works with Hydra configuration:
+
+``` python
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+```
+
+``` python
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+describe(cfg)
+```
+
+### Importing the Main Function
+
+
+
+> **Important**
+>
+> As mentioned, if we continue with `pytask`, we will not need to use
+> hydra at all, and so the main function may get deprecated as `pytask`
+> will handle the pipeline execution without `__main__` scripts.
+
+
+
+Important: using `__main__` in nbdev and Hydra is a little bit tricky.
+We need to define the main function in the module ONLY ONCE and then
+when we export the notebook to script, we need to add the
+`nbdev.imports.IN_NOTEBOOK` variable. This way, the main function will
+only be executed when we run the notebook and not when we import the
+module.
+
+``` python
+from nbdev.imports import IN_NOTEBOOK
+```
+
+You’ll see this listed throughout the notebooks.
+
+------------------------------------------------------------------------
+
+source
+
+### main
+
+> main (cfg:omegaconf.dictconfig.DictConfig)
+
+
+Exported source
+
+``` python
+@hydra.main(version_base=None, config_path="../../conf", config_name="config")
+def main(cfg: DictConfig) -> None:
+
+ # Create the directory structure
+ _create_directory_structure(here() / "data", cfg.datapaths)
+
+ # test the api
+ testAPI(cfg=cfg)
+```
+
+
+
+``` python
+try: from nbdev.imports import IN_NOTEBOOK
+except: IN_NOTEBOOK=False
+
+if __name__ == "__main__" and not IN_NOTEBOOK:
+ main()
+```
diff --git a/_docs/01_download_raw_data.html b/_docs/01_download_raw_data.html
new file mode 100644
index 0000000..37dfd00
--- /dev/null
+++ b/_docs/01_download_raw_data.html
@@ -0,0 +1,969 @@
+
+
+
+
+
+
+
+
+
+Download Module: Downloading Raw Data from CDSAPI – era5_sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This module downloads the raw data from CDS and saves it in the local directory
+
+
+
We use a similar approach to the one in the tutorial to download the data to local storage.
+
The background functionality in this module involves downloading the bounding box of a region of interest, and sending that to the CDS API query. As such, we define two helper functions to fetch the OCHA/HDX shapefiles for a geographic region, and another to create the bounding box from the files.
def download_raw_era5(
+ cfg: DictConfig # hydra configuration file
+ )->None:
+'''
+ Send the query to the API and download the data
+ '''
+
+# parse the cfg
+ testing = cfg.development_mode # for testing
+ output_dir = here("data/input") # output directory
+
+ geography = cfg.query.geography
+
+ target = os.path.join(_expand_path(output_dir), "{}_{}_{}.nc".format(geography, cfg.query['year'], cfg.query['month']))
+
+ client = cdsapi.Client()
+
+ query = _validate_query(cfg.query)
+
+ dataset = cfg.dataset
+# to make sure the query is valid at the end
+del query['geography']
+
+# Send the query to the client
+ifnot testing:
+ bounds = create_bounding_box(cfg.geographies[geography]['shapefile'])
+ query['area'] = bounds
+ client.retrieve(dataset, query).download(target)
+
+print("Downloaded file to: {}".format(target))
+else:
+print(f"Testing mode. Not downloading data. Query is {query}")
+
+print("Done")
+
+
+
+
+
+
Tests and Main
+
Here we define some tests and the main function that will be used to download the data.
+
+
from hydra import initialize, compose
+from omegaconf import OmegaConf
+
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+exceptExceptionas e:
+print(f"Error initializing Hydra: {e}")
+with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode =False
+cfg.query['year'] =2017
+cfg.query['month'] =11
+#cfg.query['day'] = 1
+#cfg.query['time'] = "00:00"
+cfg.query['geography'] ="nepal"
+download_raw_era5(cfg)
@hydra.main(config_path="../../conf", config_name="config", version_base=None)
+def main(cfg: DictConfig) ->None:
+ download_raw_era5(cfg=cfg)
+# better approach would be to have the function only use the specific arguments of the config
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/01_download_raw_data.md b/_docs/01_download_raw_data.md
new file mode 100644
index 0000000..cb8d8b0
--- /dev/null
+++ b/_docs/01_download_raw_data.md
@@ -0,0 +1,315 @@
+# Download Module: Downloading Raw Data from CDSAPI
+
+
+## download
+
+> This module downloads the raw data from CDS and saves it in the local
+> directory
+
+
+
+We use a similar approach to the one in the tutorial to download the
+data to local storage.
+
+The background functionality in this module involves downloading the
+bounding box of a region of interest, and sending that to the CDS API
+query. As such, we define two helper functions to fetch the OCHA/HDX
+shapefiles for a geographic region, and another to create the bounding
+box from the files.
+
+------------------------------------------------------------------------
+
+source
+
+### fetch_GADM
+
+> fetch_GADM
+> (url:str='https://geodata.ucdavis.edu/gadm/gadm4.1/gpkg/gadm4
+> 1_MDG.gpkg', output_file:str='gadm41_MDG.gpkg')
+
+*Fetch the GADM bounding box for geographic region*
+
+
+
+------------------------------------------------------------------------
+
+source
+
+### create_bounding_box
+
+> create_bounding_box (zip_url_or_path:str, buffer_km:float=50,
+> round_to:int=1)
+
+*Create a bounding box from OCHA/HDX shapefile data with a buffer.*
+
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
zip_url_or_path
+
str
+
+
URL or local path to the zipped shapefile.
+
+
+
buffer_km
+
float
+
50
+
Buffer distance in kilometers to expand the bounding box.
+
+
+
round_to
+
int
+
1
+
Number of decimal places to round the bounding box coordinates.
+
+
+
Returns
+
list
+
+
Bounding box in the CDS API area format [North, West, South,
+East]
+
+
+
+
+
+Exported source
+
+``` python
+def create_bounding_box(
+ zip_url_or_path: str, # URL or local path to the zipped shapefile.
+ buffer_km: float = 50, # Buffer distance in kilometers to expand the bounding box.
+ round_to: int = 1 # Number of decimal places to round the bounding box coordinates.
+) -> list: # Bounding box in the CDS API area format [North, West, South, East]
+ '''
+ Create a bounding box from OCHA/HDX shapefile data with a buffer.
+ '''
+ with tempfile.TemporaryDirectory() as tmpdir:
+ # Download if it's a URL
+ if zip_url_or_path.startswith("http"):
+ response = requests.get(zip_url_or_path)
+ zip_path = os.path.join(tmpdir, "ocha_data.zip")
+ with open(zip_path, "wb") as f:
+ f.write(response.content)
+ else:
+ zip_path = zip_url_or_path
+
+ # Unzip
+ with zipfile.ZipFile(zip_path, 'r') as zip_ref:
+ zip_ref.extractall(tmpdir)
+
+ # Find the .shp file
+ shp_files = list(Path(tmpdir).rglob("*.shp"))
+ if not shp_files:
+ raise FileNotFoundError("No shapefile (.shp) found in the extracted archive.")
+ shp_path = str(shp_files[0]) # Use first found .shp
+
+ # Read shapefile
+ shape = gpd.read_file(shp_path)
+
+ # Reproject to projected CRS (you may want to detect the correct UTM zone)
+ shape_proj = shape.to_crs(epsg=32738)
+
+ # Apply buffer
+ buffered = shape_proj.geometry.buffer(buffer_km * 1000)
+
+ # Convert back to geographic coordinates
+ buffered_geo = gpd.GeoSeries(buffered, crs=shape_proj.crs).to_crs(epsg=4326)
+
+ # Get bounding box
+ bounds = buffered_geo.total_bounds # [min_x, min_y, max_x, max_y]
+ bbox = [
+ round(bounds[3], round_to), # North
+ round(bounds[0], round_to), # West
+ round(bounds[1], round_to), # South
+ round(bounds[2], round_to) # East
+ ]
+
+ return bbox
+```
+
+
+
+The primary function to download the data from CDSAPI is defined below.
+
+------------------------------------------------------------------------
+
+source
+
+### download_raw_era5
+
+> download_raw_era5 (cfg:omegaconf.dictconfig.DictConfig)
+
+*Send the query to the API and download the data*
+
+
+
+
+
+
Type
+
Details
+
+
+
+
+
cfg
+
DictConfig
+
hydra configuration file
+
+
+
Returns
+
None
+
+
+
+
+
+
+Exported source
+
+``` python
+def download_raw_era5(
+ cfg: DictConfig # hydra configuration file
+ )->None:
+ '''
+ Send the query to the API and download the data
+ '''
+
+ # parse the cfg
+ testing = cfg.development_mode # for testing
+ output_dir = here("data/input") # output directory
+
+ geography = cfg.query.geography
+
+ target = os.path.join(_expand_path(output_dir), "{}_{}_{}.nc".format(geography, cfg.query['year'], cfg.query['month']))
+
+ client = cdsapi.Client()
+
+ query = _validate_query(cfg.query)
+
+ dataset = cfg.dataset
+ # to make sure the query is valid at the end
+ del query['geography']
+
+ # Send the query to the client
+ if not testing:
+ bounds = create_bounding_box(cfg.geographies[geography]['shapefile'])
+ query['area'] = bounds
+ client.retrieve(dataset, query).download(target)
+
+ print("Downloaded file to: {}".format(target))
+ else:
+ print(f"Testing mode. Not downloading data. Query is {query}")
+
+ print("Done")
+```
+
+
+
+## Tests and Main
+
+Here we define some tests and the main function that will be used to
+download the data.
+
+``` python
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode = False
+cfg.query['year'] = 2017
+cfg.query['month'] = 11
+#cfg.query['day'] = 1
+#cfg.query['time'] = "00:00"
+cfg.query['geography'] = "nepal"
+download_raw_era5(cfg)
+```
+
+------------------------------------------------------------------------
+
+source
+
+### main
+
+> main (cfg:omegaconf.dictconfig.DictConfig)
+
+
+Exported source
+
+``` python
+@hydra.main(config_path="../../conf", config_name="config", version_base=None)
+def main(cfg: DictConfig) -> None:
+ download_raw_era5(cfg=cfg)
+ # better approach would be to have the function only use the specific arguments of the config
+```
+
+
diff --git a/_docs/02_aggregate.html b/_docs/02_aggregate.html
new file mode 100644
index 0000000..762b66f
--- /dev/null
+++ b/_docs/02_aggregate.html
@@ -0,0 +1,1556 @@
+
+
+
+
+
+
+
+
+
+Aggregate Module: Spatial Aggregation to Healthsheds – era5_sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Aggregate Module: Spatial Aggregation to Healthsheds
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
aggregate
+
+
This module aggregates the downloaded data into the respective output dataframes.
+
+
+
We prototyped the code in this module using a Jupyter notebook. The notebook is available in notes/prototypes/learning_aggregations_w_michelle_20250328.ipynb. The code in this module is a cleaned-up version of the code in that notebook. The notebook contains additional comments and explanations of the code, which may be helpful for understanding the code in this module.
+
The basic process is as follows:
+
+
Load the netCDF data in memory
+
Statistically aggregate the hourly data to daily data per exposure using resample()
+
Write out the data to tiff
+
Read the tiff data back in
+
Read in the shapefile that defines the healthsheds
+
Spatially aggregate the exposure data to the healthsheds
+
Quality check the aggregations
+
Write out final aggregations to tiff
+
+
+
+Exported source
+
import tempfile
+import rasterio
+import hydra
+import argparse
+import os
+
+import pandas as pd
+import geopandas as gpd
+import numpy as np
+import xarray as xr
+import matplotlib.pyplot as plt
+
+from dataclasses import dataclass, field
+from typing import Optional, Tuple
+from pyprojroot import here
+from hydra import initialize, compose
+from omegaconf import OmegaConf, DictConfig
+from tqdm import tqdm
+from math import ceil, floor
+from rasterstats.io import Raster
+from rasterstats.utils import boxify_points, rasterize_geom
+
+try: from era5_sandbox.core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius
+except: from core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius
We’re going to write a function that aggregates the data for a single exposure from a file. This file should be the single month data we got from the previous step in the pipeline.
resample_netcdf (fpath:str, resample:str='1D', agg_func:<built-
+ infunctioncallable>=<function mean at 0x145cb6c3b930>,
+ time_dim:str='valid_time', **xr_open_kwargs)
+
+
*Resample a netCDF file to a specified frequency and aggregation method.
+
Args: fpath (str): Path to the netCDF file. resample (str): Resampling frequency (e.g., ‘1H’, ‘1D’). agg_func (callable): Aggregation function (e.g., np.mean, np.sum).
+
Returns: xarray.Dataset: Resampled dataset.*
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
fpath
+
str
+
+
Path to the netCDF file.
+
+
+
resample
+
str
+
1D
+
Resampling frequency (e.g., ‘1H’, ‘1D’)
+
+
+
agg_func
+
callable
+
mean
+
Aggregation function (e.g., np.mean, np.sum).
+
+
+
time_dim
+
str
+
valid_time
+
Name of the time dimension in the dataset.
+
+
+
xr_open_kwargs
+
VAR_KEYWORD
+
+
+
+
+
Returns
+
Dataset
+
+
keywords for python’s xarray module
+
+
+
+
We pull the aggregation function from the config file:
+
+
var ='swvl1'
+agg_func = _get_callable(cfg['aggregation']['aggregation'][var]['hourly_to_daily'][0]['function'])
+
+
+
with ClimateDataFileHandler(eg_file) as handler:
+
+ ds_path = handler.get_dataset("instant")
+ resampled_data = resample_netcdf(ds_path, agg_func=agg_func)
+
+
I’m going to use a dataclass to represent the tiff data. This will allow us to easily pass around the data and metadata associated with the tiff file. Why? I’ve never used dataclasses and I’m curious about them — ChatGPT thinks this will make the code cleaner and easier to read.
The day to rasterise; 1 indexed just like human english
+
+
+
variable
+
str
+
+
The variable name to convert.
+
+
+
crs
+
str
+
EPSG:4326
+
Coordinate reference system (default is WGS84).
+
+
+
+
+
+Exported source
+
def netcdf_to_tiff(
+ ds: xr.Dataset, # The aggregated xarray dataset to convert.
+ band: int, # The day to rasterise; 1 indexed just like human english
+ variable: str, # The variable name to convert.
+ crs: str="EPSG:4326", # Coordinate reference system (default is WGS84).
+ ):
+
+"""
+ Convert a netCDF file to a GeoTIFF file.
+ """
+
+with tempfile.TemporaryDirectory() as tmpdirname:
+
+# Select the variable and time index
+ variable = ds[variable]
+ ds_ = variable.rio.set_spatial_dims(x_dim="longitude", y_dim="latitude")
+ ds_ = ds_.rio.write_crs(crs)
+# Save as GeoTIFF
+ ds_.rio.to_raster(f"{tmpdirname}/output.tif")
+# Load the raster file
+ raster_file = RasterFile(path=f"{tmpdirname}/output.tif", band=band).load()
+
+return raster_file
Super cool! The tiff file is created and the data is read back in correctly. Now we can move on to the next step, which is to aggregate the data by healthshed.
+
+
+
+
Polygon to Raster Cells
+
This function was initially shared from a previous NSAPH aggregation pipeline here. To better understand this, here is a ChatGPT explanation of the code:
+
+
This function, polygon_to_raster_cells, is doing a crucial first step in spatial alignment: it determines which raster cells are “touched” by each polygon geometry (e.g., administrative areas, watersheds, etc.).
+Essentially, this function helps figure out which pixels from a raster image fall inside each polygon (like a district, region, or shape). It does this by looking at each polygon one by one, zooming in on just the part of the raster that overlaps with that shape, and marking the pixels that are inside. This is kind of like placing a cookie cutter (the polygon) on a pixelated map (the raster) and seeing which pixels get cut.
+The result is a list where each item tells you the pixel locations that match a specific polygon. You can then use those pixel locations to pull out data from the raster, like temperatures or rainfall, and calculate statistics (like the average) for each shape. This is a key step when you want to summarize raster data within specific regions, like figuring out the average temperature in each county or how much vegetation is in each park.
Returns an index map for each vector geometry to indices in the raster source.
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
vectors
+
+
+
list of geometries from a shapefile
+
+
+
raster
+
+
+
the raster data as a numpy array
+
+
+
nodata
+
NoneType
+
None
+
the nodata value of the raster
+
+
+
affine
+
NoneType
+
None
+
the affine transform of the raster
+
+
+
all_touched
+
bool
+
False
+
whether to include all touched pixels
+
+
+
verbose
+
bool
+
False
+
+
+
+
kwargs
+
VAR_KEYWORD
+
+
+
+
+
Returns
+
list
+
+
A dictionary mapping vector the ids of geometries to locations (indices) in the raster source.
+
+
+
+
+
+Exported source
+
def polygon_to_raster_cells(
+ vectors, # list of geometries from a shapefile
+ raster, # the raster data as a numpy array
+ nodata=None, # the nodata value of the raster
+ affine=None, # the affine transform of the raster
+ all_touched=False, # whether to include all touched pixels
+ verbose=False,
+**kwargs,
+) ->list: # A dictionary mapping vector the ids of geometries to locations (indices) in the raster source.
+"""Returns an index map for each vector geometry to indices in the raster source."""
+
+ cell_map = []
+
+with Raster(raster, affine, nodata) as rast:
+# used later to crop raster and find start row and col
+ min_lon, dlon = affine.c, affine.a
+ max_lat, dlat = affine.f, -affine.e
+ H, W = rast.shape
+
+for geom in tqdm(vectors, disable=(not verbose)):
+if"Point"in geom.geom_type:
+ geom = boxify_points(geom, rast)
+
+# find geometry bounds to crop raster
+# the raster and geometry must be in the same lon/lat coordinate system
+ start_row =max(0, min(H -1, floor((max_lat - geom.bounds[3]) / dlat)))
+ start_col =min(W -1, max(0, floor((geom.bounds[0] - min_lon) / dlon)))
+ end_col =max(0, min(W -1, ceil((geom.bounds[2] - min_lon) / dlon)))
+ end_row =min(H -1, max(0, ceil((max_lat - geom.bounds[1]) / dlat)))
+ geom_bounds = (
+ min_lon + dlon * start_col, # left
+ max_lat - dlat * end_row -1e-12, # bottom
+ min_lon + dlon * end_col +1e-12, # right
+ max_lat - dlat * start_row, # top
+ )
+
+# crop raster to area of interest and rasterize
+ fsrc = rast.read(bounds=geom_bounds)
+ rv_array = rasterize_geom(geom, like=fsrc, all_touched=all_touched)
+ indices = np.nonzero(rv_array)
+
+iflen(indices[0]) >0:
+ indices = (indices[0] + start_row, indices[1] + start_col)
+assert0<= indices[0].min() < rast.shape[0]
+assert0<= indices[1].min() < rast.shape[1]
+else:
+pass# stop here for debug
+
+ cell_map.append(indices)
+
+return cell_map
+
+
+
To use this, we must define the polygon and raster data. The polygon data is the healthshed shapefile, and the raster data is the tiff file we created earlier. We can use the GoogleDriver class we defined in core to read in the shapefile.
res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=resampled_tiff.data, # the raster data above
+ nodata=resampled_tiff.nodata, # any intersections with no data, may have to be np.nan
+ affine=resampled_tiff.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+
+
The data below maps which grid entries fall into each of the regions in the shapefile (e.g. which pixel is in which state)
+
+
res_poly2cell[:5]
+
+
Last but not least, we aggregate these data to the healthshed level. We can use the rasterstats package to do this.
the unique identifier column name of the health sheds
+
+
+
aggregation_func
+
callable
+
nanmean
+
the aggregation function
+
+
+
aggregation_name
+
str
+
mean
+
the name of the aggregation function
+
+
+
Returns
+
GeoDataFrame
+
+
+
+
+
+
+
+Exported source
+
def aggregate_to_healthsheds(
+ res_poly2cell: list, # the result of polygon_to_raster_cells
+ raster: RasterFile, # the raster data
+ shapes: gpd.GeoDataFrame, # the shapes of the health sheds
+ names_column: str="fs_uid", # the unique identifier column name of the health sheds
+ aggregation_func: callable= np.nanmean, # the aggregation function
+ aggregation_name: str="mean"# the name of the aggregation function
+ ) -> gpd.GeoDataFrame:
+"""
+ Aggregate the raster data to the health sheds.
+ """
+
+ stats = []
+
+for indices in res_poly2cell:
+iflen(indices[0]) ==0:
+# no cells found for this polygon
+ stats.append(np.nan)
+else:
+ cells = raster.data[indices]
+ifsum(~np.isnan(cells)) ==0:
+# no valid cells found for this polygon
+ stats.append(np.nan)
+continue
+else:
+# compute MEAN of valid cells
+# but this stat can be ANYTHING
+ stats.append(aggregation_func(cells))
+
+# clean up the result into a dataframe
+ stats = pd.Series(stats)
+ shapes[aggregation_name] = stats
+ df = pd.DataFrame(
+ {"healthshed": shapes[names_column], aggregation_name: stats}
+ )
+ gdf = gpd.GeoDataFrame(df, geometry=shapes.geometry.values, crs=shapes.crs)
+return gdf
result.plot(column="mean_soil_moisture", legend=True)
+plt.title("Mean Soil Moisture (m^3 m^-3) by Health Shed Nov 2017 day 1")
+plt.show()
+
+
That looks great! The data is aggregated to the healthshed level, and we can see the differences in exposure across the healthsheds. We can also see that the data is not uniform across the healthsheds, which is what we expect.
+
+
+
+
Tests and Main
+
Now we can wrap this up in a main function that will simply take in the input file and generate this output. We can also add some tests to make sure the data is aggregated correctly; tests will run automatically in this notebook.
+
+
import random
+
+
+
# variables = ["t2m", "d2m"]
+# years = ["20{:02d}".format(m) for m in range(9, 24)]
+# months = [str(m) for m in range(1, 13)]
+# aggregations = [
+# ("Mean", np.nanmean),
+# ("Max", np.nanmax),
+# ("Min", np.nanmin)
+# ]
+
+# exposure_variable = random.choice(variables)
+# year = random.choice(years)
+# month = random.choice(months)
+# aggregation_str, agg_func = random.choice(aggregations)
+# input_file = here() / "data/input/{}_{}.nc".format(year, month)
+
+# with initialize(version_base=None, config_path="../conf"):
+# cfg = compose(config_name='config.yaml')
+
+# driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+# drive = driver.get_drive()
+# healthsheds = driver.read_healthsheds(cfg.GOOGLE_DRIVE_AUTH_JSON.healthsheds_id)
+
+# with ClimateDataFileHandler(input_file) as handler:
+# ds_path = handler.get_dataset("instant")
+# resampled_nc_file = resample_netcdf(ds_path, agg_func=agg_func)
+
+# days = len(resampled_nc_file.valid_time.values)
+# day = random.choice(range(1, days + 1))
+
+# resampled_tiff = netcdf_to_tiff(
+# ds=resampled_nc_file,
+# band=day, # the day we're aggregating
+# variable=exposure_variable,
+# crs="EPSG:4326"
+# )
+
+# res_poly2cell=polygon_to_raster_cells(
+# vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+# raster=resampled_tiff.data, # the raster data above
+# nodata=resampled_tiff.nodata, # any intersections with no data, may have to be np.nan
+# affine=resampled_tiff.transform, # some math thing need to revise
+# all_touched=True,
+# verbose=True
+# )
+
+# result = aggregate_to_healthsheds(
+# res_poly2cell=res_poly2cell,
+# raster=resampled_tiff,
+# shapes=healthsheds,
+# names_column="fs_uid",
+# aggregation_func=agg_func,
+# aggregation_name=exposure_variable
+# )
+
+# result.plot(column=exposure_variable, legend=True)
+# plt.title("{} {} (K) by Health Shed {}".format(aggregation_str, exposure_variable, input_file.stem))
+# plt.suptitle("Aggregation: {}, Day: {}".format(aggregation_str, str(day)))
+# plt.show()
+
+
+
+
+
+
+
+Note
+
+
+
+
Note: The above code is commented out to prevent execution during documentation generation. You can uncomment and run it in an appropriate environment to test the aggregation process.
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/02_aggregate.md b/_docs/02_aggregate.md
new file mode 100644
index 0000000..0291c2a
--- /dev/null
+++ b/_docs/02_aggregate.md
@@ -0,0 +1,988 @@
+# Aggregate Module: Spatial Aggregation to Healthsheds
+
+
+## aggregate
+
+> This module aggregates the downloaded data into the respective output
+> dataframes.
+
+
+
+We prototyped the code in this module using a Jupyter notebook. The
+notebook is available in
+`notes/prototypes/learning_aggregations_w_michelle_20250328.ipynb`. The
+code in this module is a cleaned-up version of the code in that
+notebook. The notebook contains additional comments and explanations of
+the code, which may be helpful for understanding the code in this
+module.
+
+The basic process is as follows:
+
+1. Load the netCDF data in memory
+2. Statistically aggregate the hourly data to daily data per exposure
+ using resample()
+3. Write out the data to tiff
+4. Read the tiff data back in
+5. Read in the shapefile that defines the healthsheds
+6. Spatially aggregate the exposure data to the healthsheds
+7. Quality check the aggregations
+8. Write out final aggregations to tiff
+
+
+Exported source
+
+``` python
+import tempfile
+import rasterio
+import hydra
+import argparse
+import os
+
+import pandas as pd
+import geopandas as gpd
+import numpy as np
+import xarray as xr
+import matplotlib.pyplot as plt
+
+from dataclasses import dataclass, field
+from typing import Optional, Tuple
+from pyprojroot import here
+from hydra import initialize, compose
+from omegaconf import OmegaConf, DictConfig
+from tqdm import tqdm
+from math import ceil, floor
+from rasterstats.io import Raster
+from rasterstats.utils import boxify_points, rasterize_geom
+
+try: from era5_sandbox.core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius
+except: from core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius
+```
+
+
+
+``` python
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+```
+
+We’re going to write a function that aggregates the data for a single
+exposure from a file. This file should be the single month data we got
+from the previous step in the pipeline.
+
+``` python
+eg_file = here() / "bld/2009_01_nepal.nc"
+```
+
+------------------------------------------------------------------------
+
+source
+
+### resample_netcdf
+
+> resample_netcdf (fpath:str, resample:str='1D', agg_func: infunctioncallable>=,
+> time_dim:str='valid_time', **xr_open_kwargs)
+
+\*Resample a netCDF file to a specified frequency and aggregation
+method.
+
+Args: fpath (str): Path to the netCDF file. resample (str): Resampling
+frequency (e.g., ‘1H’, ‘1D’). agg_func (callable): Aggregation function
+(e.g., np.mean, np.sum).
+
+Returns: xarray.Dataset: Resampled dataset.\*
+
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
fpath
+
str
+
+
Path to the netCDF file.
+
+
+
resample
+
str
+
1D
+
Resampling frequency (e.g., ‘1H’, ‘1D’)
+
+
+
agg_func
+
callable
+
mean
+
Aggregation function (e.g., np.mean, np.sum).
+
+
+
time_dim
+
str
+
valid_time
+
Name of the time dimension in the dataset.
+
+
+
xr_open_kwargs
+
VAR_KEYWORD
+
+
+
+
+
Returns
+
Dataset
+
+
keywords for python’s xarray module
+
+
+
+
+We pull the aggregation function from the config file:
+
+``` python
+var = 'swvl1'
+agg_func = _get_callable(cfg['aggregation']['aggregation'][var]['hourly_to_daily'][0]['function'])
+```
+
+``` python
+with ClimateDataFileHandler(eg_file) as handler:
+
+ ds_path = handler.get_dataset("instant")
+ resampled_data = resample_netcdf(ds_path, agg_func=agg_func)
+```
+
+I’m going to use a dataclass to represent the tiff data. This will allow
+us to easily pass around the data and metadata associated with the tiff
+file. Why? I’ve never used dataclasses and I’m curious about them —
+ChatGPT thinks this will make the code cleaner and easier to read.
+
+------------------------------------------------------------------------
+
+source
+
+### RasterFile
+
+> RasterFile (path:str, band:int)
+
+
+Exported source
+
+``` python
+@dataclass
+class RasterFile:
+ path: str
+ band: int # note that this is 1-indexed
+ data: Optional[np.ndarray] = field(default=None, init=False)
+ transform: Optional[rasterio.Affine] = field(default=None, init=False)
+ crs: Optional[str] = field(default=None, init=False)
+ nodata: Optional[float] = field(default=None, init=False)
+ bounds: Optional[Tuple[float, float, float, float]] = field(default=None, init=False)
+
+ def load(self):
+ """Load raster data and basic metadata."""
+ with rasterio.open(self.path) as src:
+ self.data = src.read(self.band) # each day gets one rasterfile
+ self.transform = src.transform
+ self.crs = src.crs
+ self.nodata = src.nodata
+ self.bounds = src.bounds
+ return self
+
+ def shape(self) -> Optional[Tuple[int, int]]:
+ """Return the shape of the raster data."""
+ return self.data.shape if self.data is not None else None
+
+ def __str__(self):
+ return f"RasterFile(path='{self.path}', shape={self.shape()}, crs='{self.crs}')"
+```
+
+
+
+Next, a function to write and read the netCDF to tiff:
+
+------------------------------------------------------------------------
+
+source
+
+### netcdf_to_tiff
+
+> netcdf_to_tiff (ds:xarray.core.dataset.Dataset, band:int, variable:str,
+> crs:str='EPSG:4326')
+
+*Convert a netCDF file to a GeoTIFF file.*
+
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
ds
+
Dataset
+
+
The aggregated xarray dataset to convert.
+
+
+
band
+
int
+
+
The day to rasterise; 1 indexed just like human english
+
+
+
variable
+
str
+
+
The variable name to convert.
+
+
+
crs
+
str
+
EPSG:4326
+
Coordinate reference system (default is WGS84).
+
+
+
+
+
+Exported source
+
+``` python
+def netcdf_to_tiff(
+ ds: xr.Dataset, # The aggregated xarray dataset to convert.
+ band: int, # The day to rasterise; 1 indexed just like human english
+ variable: str, # The variable name to convert.
+ crs: str = "EPSG:4326", # Coordinate reference system (default is WGS84).
+ ):
+
+ """
+ Convert a netCDF file to a GeoTIFF file.
+ """
+
+ with tempfile.TemporaryDirectory() as tmpdirname:
+
+ # Select the variable and time index
+ variable = ds[variable]
+ ds_ = variable.rio.set_spatial_dims(x_dim="longitude", y_dim="latitude")
+ ds_ = ds_.rio.write_crs(crs)
+ # Save as GeoTIFF
+ ds_.rio.to_raster(f"{tmpdirname}/output.tif")
+ # Load the raster file
+ raster_file = RasterFile(path=f"{tmpdirname}/output.tif", band=band).load()
+
+ return raster_file
+```
+
+
+
+Now to test it:
+
+``` python
+with ClimateDataFileHandler(eg_file) as handler:
+ ds_path = handler.get_dataset("instant")
+ resampled_nc = resample_netcdf(ds_path)
+
+print(resampled_nc)
+resampled_tiff = netcdf_to_tiff(
+ ds=resampled_nc,
+ band=28,
+ variable="swvl1",
+ crs="EPSG:4326"
+)
+```
+
+``` python
+resampled_tiff.data.shape, resampled_tiff.transform, resampled_tiff.crs, resampled_tiff.bounds
+```
+
+Super cool! The tiff file is created and the data is read back in
+correctly. Now we can move on to the next step, which is to aggregate
+the data by healthshed.
+
+## Polygon to Raster Cells
+
+This function was initially shared from a previous NSAPH aggregation
+pipeline
+[here](https://github.com/NSAPH-Data-Processing/air_pollution__aqdh/blob/2a8109075fe7a8fbf7c435cc34ffa97b63f5e133/utils/faster_zonal_stats.py#L17).
+To better understand this, here is a ChatGPT explanation of the code:
+
+> This function,
+> [`polygon_to_raster_cells`](https://TinasheMTapera.github.io/era5_sandbox/aggregate.html#polygon_to_raster_cells),
+> is doing a crucial first step in spatial alignment: it determines
+> which raster cells are “touched” by each polygon geometry (e.g.,
+> administrative areas, watersheds, etc.).
+> Essentially, this function helps figure out which pixels from a raster
+> image fall inside each polygon (like a district, region, or shape). It
+> does this by looking at each polygon one by one, zooming in on just
+> the part of the raster that overlaps with that shape, and marking the
+> pixels that are inside. This is kind of like placing a cookie cutter
+> (the polygon) on a pixelated map (the raster) and seeing which pixels
+> get cut.
+> The result is a list where each item tells you the pixel locations
+> that match a specific polygon. You can then use those pixel locations
+> to pull out data from the raster, like temperatures or rainfall, and
+> calculate statistics (like the average) for each shape. This is a key
+> step when you want to summarize raster data within specific regions,
+> like figuring out the average temperature in each county or how much
+> vegetation is in each park.
+
+------------------------------------------------------------------------
+
+source
+
+### polygon_to_raster_cells
+
+> polygon_to_raster_cells (vectors, raster, nodata=None, affine=None,
+> all_touched=False, verbose=False, **kwargs)
+
+*Returns an index map for each vector geometry to indices in the raster
+source.*
+
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
vectors
+
+
+
list of geometries from a shapefile
+
+
+
raster
+
+
+
the raster data as a numpy array
+
+
+
nodata
+
NoneType
+
None
+
the nodata value of the raster
+
+
+
affine
+
NoneType
+
None
+
the affine transform of the raster
+
+
+
all_touched
+
bool
+
False
+
whether to include all touched pixels
+
+
+
verbose
+
bool
+
False
+
+
+
+
kwargs
+
VAR_KEYWORD
+
+
+
+
+
Returns
+
list
+
+
A dictionary mapping vector the ids of geometries to
+locations (indices) in the raster source.
+
+
+
+
+
+Exported source
+
+``` python
+def polygon_to_raster_cells(
+ vectors, # list of geometries from a shapefile
+ raster, # the raster data as a numpy array
+ nodata=None, # the nodata value of the raster
+ affine=None, # the affine transform of the raster
+ all_touched=False, # whether to include all touched pixels
+ verbose=False,
+ **kwargs,
+) -> list: # A dictionary mapping vector the ids of geometries to locations (indices) in the raster source.
+ """Returns an index map for each vector geometry to indices in the raster source."""
+
+ cell_map = []
+
+ with Raster(raster, affine, nodata) as rast:
+ # used later to crop raster and find start row and col
+ min_lon, dlon = affine.c, affine.a
+ max_lat, dlat = affine.f, -affine.e
+ H, W = rast.shape
+
+ for geom in tqdm(vectors, disable=(not verbose)):
+ if "Point" in geom.geom_type:
+ geom = boxify_points(geom, rast)
+
+ # find geometry bounds to crop raster
+ # the raster and geometry must be in the same lon/lat coordinate system
+ start_row = max(0, min(H - 1, floor((max_lat - geom.bounds[3]) / dlat)))
+ start_col = min(W - 1, max(0, floor((geom.bounds[0] - min_lon) / dlon)))
+ end_col = max(0, min(W - 1, ceil((geom.bounds[2] - min_lon) / dlon)))
+ end_row = min(H - 1, max(0, ceil((max_lat - geom.bounds[1]) / dlat)))
+ geom_bounds = (
+ min_lon + dlon * start_col, # left
+ max_lat - dlat * end_row - 1e-12, # bottom
+ min_lon + dlon * end_col + 1e-12, # right
+ max_lat - dlat * start_row, # top
+ )
+
+ # crop raster to area of interest and rasterize
+ fsrc = rast.read(bounds=geom_bounds)
+ rv_array = rasterize_geom(geom, like=fsrc, all_touched=all_touched)
+ indices = np.nonzero(rv_array)
+
+ if len(indices[0]) > 0:
+ indices = (indices[0] + start_row, indices[1] + start_col)
+ assert 0 <= indices[0].min() < rast.shape[0]
+ assert 0 <= indices[1].min() < rast.shape[1]
+ else:
+ pass # stop here for debug
+
+ cell_map.append(indices)
+
+ return cell_map
+```
+
+
+
+To use this, we must define the polygon and raster data. The polygon
+data is the healthshed shapefile, and the raster data is the tiff file
+we created earlier. We can use the
+[`GoogleDriver`](https://TinasheMTapera.github.io/era5_sandbox/core.html#googledriver)
+class we defined in `core` to read in the shapefile.
+
+``` python
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = driver.get_drive()
+healthsheds = driver.read_healthsheds("Nepal_Healthsheds2024.zip")
+```
+
+``` python
+res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=resampled_tiff.data, # the raster data above
+ nodata=resampled_tiff.nodata, # any intersections with no data, may have to be np.nan
+ affine=resampled_tiff.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+```
+
+The data below maps which grid entries fall into each of the regions in
+the shapefile (e.g. which pixel is in which state)
+
+``` python
+res_poly2cell[:5]
+```
+
+Last but not least, we aggregate these data to the healthshed level. We
+can use the `rasterstats` package to do this.
+
+------------------------------------------------------------------------
+
+source
+
+### aggregate_to_healthsheds
+
+> aggregate_to_healthsheds (res_poly2cell:list, raster:__main__.RasterFile,
+> shapes:geopandas.geodataframe.GeoDataFrame,
+> names_column:str='fs_uid',
+> aggregation_func: infunctioncallable>= 0x145cb6bbbdf0>, aggregation_name:str='mean')
+
+*Aggregate the raster data to the health sheds.*
+
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
res_poly2cell
+
list
+
+
the result of polygon_to_raster_cells
+
+
+
raster
+
RasterFile
+
+
the raster data
+
+
+
shapes
+
GeoDataFrame
+
+
the shapes of the health sheds
+
+
+
names_column
+
str
+
fs_uid
+
the unique identifier column name of the health sheds
+
+
+
aggregation_func
+
callable
+
nanmean
+
the aggregation function
+
+
+
aggregation_name
+
str
+
mean
+
the name of the aggregation function
+
+
+
Returns
+
GeoDataFrame
+
+
+
+
+
+
+
+Exported source
+
+``` python
+def aggregate_to_healthsheds(
+ res_poly2cell: list, # the result of polygon_to_raster_cells
+ raster: RasterFile, # the raster data
+ shapes: gpd.GeoDataFrame, # the shapes of the health sheds
+ names_column: str = "fs_uid", # the unique identifier column name of the health sheds
+ aggregation_func: callable = np.nanmean, # the aggregation function
+ aggregation_name: str = "mean" # the name of the aggregation function
+ ) -> gpd.GeoDataFrame:
+ """
+ Aggregate the raster data to the health sheds.
+ """
+
+ stats = []
+
+ for indices in res_poly2cell:
+ if len(indices[0]) == 0:
+ # no cells found for this polygon
+ stats.append(np.nan)
+ else:
+ cells = raster.data[indices]
+ if sum(~np.isnan(cells)) == 0:
+ # no valid cells found for this polygon
+ stats.append(np.nan)
+ continue
+ else:
+ # compute MEAN of valid cells
+ # but this stat can be ANYTHING
+ stats.append(aggregation_func(cells))
+
+ # clean up the result into a dataframe
+ stats = pd.Series(stats)
+ shapes[aggregation_name] = stats
+ df = pd.DataFrame(
+ {"healthshed": shapes[names_column], aggregation_name: stats}
+ )
+ gdf = gpd.GeoDataFrame(df, geometry=shapes.geometry.values, crs=shapes.crs)
+ return gdf
+```
+
+
+
+And now we apply it:
+
+``` python
+result = aggregate_to_healthsheds(
+ res_poly2cell=res_poly2cell,
+ raster=resampled_tiff,
+ shapes=healthsheds,
+ names_column="fid",
+ aggregation_func=np.nanmean,
+ aggregation_name="mean_soil_moisture"
+)
+result.head()
+```
+
+And plot for QA:
+
+``` python
+result.plot(column="mean_soil_moisture", legend=True)
+plt.title("Mean Soil Moisture (m^3 m^-3) by Health Shed Nov 2017 day 1")
+plt.show()
+```
+
+That looks great! The data is aggregated to the healthshed level, and we
+can see the differences in exposure across the healthsheds. We can also
+see that the data is not uniform across the healthsheds, which is what
+we expect.
+
+## Tests and Main
+
+Now we can wrap this up in a main function that will simply take in the
+input file and generate this output. We can also add some tests to make
+sure the data is aggregated correctly; tests will run automatically in
+this notebook.
+
+``` python
+import random
+```
+
+``` python
+# variables = ["t2m", "d2m"]
+# years = ["20{:02d}".format(m) for m in range(9, 24)]
+# months = [str(m) for m in range(1, 13)]
+# aggregations = [
+# ("Mean", np.nanmean),
+# ("Max", np.nanmax),
+# ("Min", np.nanmin)
+# ]
+
+# exposure_variable = random.choice(variables)
+# year = random.choice(years)
+# month = random.choice(months)
+# aggregation_str, agg_func = random.choice(aggregations)
+# input_file = here() / "data/input/{}_{}.nc".format(year, month)
+
+# with initialize(version_base=None, config_path="../conf"):
+# cfg = compose(config_name='config.yaml')
+
+# driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+# drive = driver.get_drive()
+# healthsheds = driver.read_healthsheds(cfg.GOOGLE_DRIVE_AUTH_JSON.healthsheds_id)
+
+# with ClimateDataFileHandler(input_file) as handler:
+# ds_path = handler.get_dataset("instant")
+# resampled_nc_file = resample_netcdf(ds_path, agg_func=agg_func)
+
+# days = len(resampled_nc_file.valid_time.values)
+# day = random.choice(range(1, days + 1))
+
+# resampled_tiff = netcdf_to_tiff(
+# ds=resampled_nc_file,
+# band=day, # the day we're aggregating
+# variable=exposure_variable,
+# crs="EPSG:4326"
+# )
+
+# res_poly2cell=polygon_to_raster_cells(
+# vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+# raster=resampled_tiff.data, # the raster data above
+# nodata=resampled_tiff.nodata, # any intersections with no data, may have to be np.nan
+# affine=resampled_tiff.transform, # some math thing need to revise
+# all_touched=True,
+# verbose=True
+# )
+
+# result = aggregate_to_healthsheds(
+# res_poly2cell=res_poly2cell,
+# raster=resampled_tiff,
+# shapes=healthsheds,
+# names_column="fs_uid",
+# aggregation_func=agg_func,
+# aggregation_name=exposure_variable
+# )
+
+# result.plot(column=exposure_variable, legend=True)
+# plt.title("{} {} (K) by Health Shed {}".format(aggregation_str, exposure_variable, input_file.stem))
+# plt.suptitle("Aggregation: {}, Day: {}".format(aggregation_str, str(day)))
+# plt.show()
+```
+
+
+
+> **Note**
+>
+> **Note:** The above code is commented out to prevent execution during
+> documentation generation. You can uncomment and run it in an
+> appropriate environment to test the aggregation process.
+
+
+
+3.2 seconds per aggregation is pretty cool!
+
+``` python
+result.to_parquet(here() / "data/testing/test_aggregation.parquet")
+```
+
+------------------------------------------------------------------------
+
+source
+
+### aggregate_data
+
+> aggregate_data (cfg:omegaconf.dictconfig.DictConfig, input_file:str,
+> output_file:str, exposure_variable:str)
+
+*Aggregate raster data day-by-day and store all days and statistics as
+separate columns in a single Parquet file.*
+
+
+
+
+
+
Type
+
Details
+
+
+
+
+
cfg
+
DictConfig
+
the hydra config
+
+
+
input_file
+
str
+
the input netcdf file
+
+
+
output_file
+
str
+
the output parquet file
+
+
+
exposure_variable
+
str
+
Which variable in the dataset to aggregate
+
+
+
Returns
+
None
+
+
+
+
+
+
+Exported source
+
+``` python
+def aggregate_data(
+ cfg: DictConfig, # the hydra config
+ input_file: str, # the input netcdf file
+ output_file: str, # the output parquet file
+ exposure_variable: str # Which variable in the dataset to aggregate
+ ) -> None:
+ '''
+ Aggregate raster data day-by-day and store all days and statistics as separate columns in a single Parquet file.
+ '''
+
+ if cfg.development_mode:
+ describe(cfg)
+ return None
+
+ geography = cfg['query'].geography
+ year = cfg['query']['year']
+ month = cfg['query']['month']
+ daily_aggs = cfg['aggregation']['aggregation'][exposure_variable]['hourly_to_daily']
+ healthshed_aggs = cfg['aggregation']['aggregation'][exposure_variable]['daily_to_healthshed']
+
+ # Load healthsheds
+ driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+ drive = driver.get_drive()
+ healthsheds = driver.read_healthsheds(cfg.geographies[geography].healthsheds)
+
+ # Initialize output DataFrame
+ result_df = healthsheds[[cfg.geographies[geography].unique_id, "geometry"]].copy()
+
+ for daily_agg in daily_aggs:
+ print(f"Processing daily aggregation: {daily_agg['name']}...")
+
+ daily_agg_func = _get_callable(daily_agg['function'])
+
+ with ClimateDataFileHandler(input_file) as handler:
+ if exposure_variable in ["t2m", "d2m", "swvl1"]:
+ ds_path = handler.get_dataset("instant")
+ else:
+ ds_path = handler.get_dataset("accum")
+ resampled_nc_file = resample_netcdf(ds_path, agg_func=daily_agg_func)
+
+ for healthshed_agg in healthshed_aggs:
+ print(f"Aggregating to healthshed by: {healthshed_agg['name']}...")
+
+ # Get the number of days in the dataset
+ days = len(resampled_nc_file.valid_time.values)
+
+ # Get the aggregation function for healthshed
+ healthshed_agg_func = _get_callable(healthshed_agg['function'])
+ days = len(resampled_nc_file.valid_time.values)
+
+ for day in range(1, days + 1):
+ print(f"Processing day {day}...")
+
+ day_col = f"day_{day:02d}_daily_{daily_agg['name']}"
+ resampled_tiff = netcdf_to_tiff(
+ ds=resampled_nc_file,
+ band=day,
+ variable=exposure_variable,
+ crs="EPSG:4326"
+ )
+
+ result_poly2cell = polygon_to_raster_cells(
+ vectors=healthsheds.geometry.values,
+ raster=resampled_tiff.data,
+ nodata=resampled_tiff.nodata,
+ affine=resampled_tiff.transform,
+ all_touched=True,
+ verbose=True
+ )
+
+ res = aggregate_to_healthsheds(
+ res_poly2cell=result_poly2cell,
+ raster=resampled_tiff,
+ shapes=healthsheds,
+ names_column=cfg.geographies[geography].unique_id,
+ aggregation_func=healthshed_agg_func,
+ aggregation_name=exposure_variable
+ )
+
+ result_df[day_col] = res[exposure_variable]
+
+ print(f"Saving final monthly parquet file: {output_file}")
+ result_df.to_parquet(output_file, compression="snappy")
+ # return(result_df)
+```
+
+
+
+``` python
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode = False
+cfg.query['year'] = 2017
+cfg.query['month'] = 11
+cfg.query['geography'] = "nepal"
+
+variable = "swvl1"
+
+aggregate_data(cfg, here() / "bld/2017_11_nepal.nc", here() / "data/testing/test_nepal_aggregation.parquet", exposure_variable=variable)
+```
+
+``` python
+parquet_file = gpd.read_parquet(here() / "data/testing/test_nepal_aggregation.parquet")
+```
+
+``` python
+parquet_file
+```
+
+``` python
+parquet_file.plot(column="day_22_daily_mean", legend=True)
+```
+
+------------------------------------------------------------------------
+
+source
+
+### main
+
+> main (cfg:omegaconf.dictconfig.DictConfig)
+
+
+Exported source
+
+``` python
+@hydra.main(version_base=None, config_path="../../conf", config_name="config")
+def main(cfg: DictConfig) -> None:
+ # Parse command-line arguments
+ input_file = str(snakemake.input[0]) # First input file
+ output_file = str(snakemake.output[0])
+ geography = str(snakemake.params.geography)
+ aggregation_variable = str(snakemake.params.variable)
+
+ variables_dict = {
+ "2m_temperature": "t2m",
+ "2m_dewpoint_temperature": "d2m",
+ "volumetric_soil_water_layer_1": "swvl1",
+ "total_precipitation": "tp"
+ }
+
+ cfg['query']['geography'] = geography
+
+ aggregate_data(cfg, input_file=input_file, output_file=output_file, exposure_variable=variables_dict[aggregation_variable])
+```
+
+
diff --git a/_docs/03_publish.html b/_docs/03_publish.html
new file mode 100644
index 0000000..9793d35
--- /dev/null
+++ b/_docs/03_publish.html
@@ -0,0 +1,1098 @@
+
+
+
+
+
+
+
+
+
+Publish: Gather the Aggregated Data and Publish to DataVerse – era5_sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Publish: Gather the Aggregated Data and Publish to DataVerse
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
publish
+
+
This is the publish module for the ERA5 dataset pipeline. It defines a functions that make use of the pyDataverse library and API to publish our outputs to the Harvard Dataverse.
+
+
+
First, we’ll test out the API by pinging the Harvard DataVerse
#
+
+resp = search_api.search("Youth from Austria", data_type="dataset")
+results = resp.json()['data']['items']
+result = [x for x in results if"Youth from Austria"in x['name']][0]
+result
+
+
+
pid = result['global_id']
+
+
Now to look at the data we created using the NativeAPI again, and delete the dataset:
So, for the above file, we’ll end up with the LEGO path data/environmental/exposures_era5/healthshed_monthly/dewpoint_2024.parquet. In it, we should have the following columns:
+
healthshed_id year month day stat_1 stat_2 ... stat_n
+
This means we should read in all of the exposures for a single timepoint at once. I think the smart thing to do is use a glob string to gather all of the pertinent files. This will be the first function we export to the library:
Read in a list of geo dataframes from the same time frame and merge them
+
+
+
+
+
+
+
+
+
+
Type
+
Details
+
+
+
+
+
glob_string
+
str
+
string for the path to search for the pertinent files
+
+
+
polygon_id
+
str
+
the string signifying the healthshed ID of the polygon
+
+
+
exposure
+
str
+
the exposure name
+
+
+
Returns
+
list
+
+
+
+
+
+
+Exported source
+
def gather_exposure_geodataframes(
+ glob_string: str, # string for the path to search for the pertinent files
+ polygon_id: str, # the string signifying the healthshed ID of the polygon
+ exposure: str# the exposure name
+ )->list:
+"Read in a list of geo dataframes from the same time frame and merge them"
+
+# first get the initial one so we have the polygon ID and geometry
+ frames = glob.glob(str(glob_string))
+ initial_gdf=gpd.read_parquet(frames[0])
+ merged_df = []
+
+for f in tqdm(frames, desc="Processing files"):
+# read in as a regular dataframe by ignoring geometry
+ df = gpd.read_parquet(f).drop(["geometry"], axis=1)
+
+# get the year and month
+# Extract year and month
+ search_str =rf'_{exposure}_(\d{{4}})_(\d{{1,2}})\.parquet$'
+ match = re.search(search_str, f)
+
+if match:
+ year =int(match.group(1))
+ month =int(match.group(2))
+#print(f"Year: {year}, Month: {month}")
+else:
+raiseValueError(f"Could not extract year and month from filename: {search_str}{f}")
+
+ df['exposure'] = exposure
+ df['month'] = month
+ df['year'] = year
+
+# Step 1: Melt all day columns (leave 'month' and 'year' as identifiers)
+ df_long = df.melt(id_vars=[polygon_id, "exposure", "year", "month"], var_name="day_stat", value_name="value")
+
+# Step 2: Extract day and stat type from column names
+# Example column: "day_01_daily_mean"
+ df_long[["day", "stat"]] = df_long["day_stat"].str.extract(r"day_(\d{2})_daily_(mean|max|min|total)")
+
+# Optional: convert 'day' and month to integer
+ df_long["day"] = df_long["day"].astype(int)
+ df_long["month"] = df_long["month"].astype(int)
+
+# Drop the original combined column
+ df_long = df_long.drop(columns="day_stat")
+
+# Reorder columns
+ df_long = df_long[[polygon_id, "exposure", "year", "month", "day", "stat", "value"]]
+
+ df_long = df_long.sort_values(by=["year", "month", "day"])
+ df_clean = df_long.pivot(index=[polygon_id, "exposure", "year", "month", "day"], columns="stat", values="value").reset_index()
+ merged_df.append(df_clean)
+
+return [pd.concat(merged_df).reset_index(drop=True), initial_gdf[[polygon_id, "geometry"]]]
This returns one file with all of the geometries and one file with the statistics and exposures.
+
Now, with this, we can move on. The dataset was created in the UI and is available via search and test out how to upload it:
+
+
resp = search_api.search("ERA5", data_type="dataset")
+
+results = resp.json()['data']['items']
+
+result = [x for x in results if"ERA5"in x['name']][0]
+era5_pid = result['global_id']
+result
+
+
+
+Exported source
+
from pyDataverse.models import Datafile
+import os
+import pathlib
+
+
+
We’ll upload directly from file. In the case of ERA5 vs. LEGO, we store the file on disk as LEGO hierarchy, but to upload it to dataverse using a flat filename (since creating subdatasets to represent directories might be a bit of a hassle)
+
+
# assuming the file has a path on disk like:
+f_out ="environmental/exposures_era5/healthshed_daily/dewpoint_2024.parquet"
+os.makedirs(here() /"data"/"testing"/ os.path.dirname(f_out), exist_ok=True)
+aggregations, geo = merged
+aggregations.to_parquet(here() /"data"/"testing"/ f_out, index=False)
+
+datafile = Datafile()
+datafile.set({
+# the id of the era5 dataset
+"pid": era5_pid,
+# the path to the file on disk goes here
+"filename": str(here() /"data"/"testing"/ f_out),
+# use the "label" to name the file
+"label": f_out.replace("/", "-")
+})
Now, we just need a main function to upload this data. The final upload is one file per exposure per year, so these should be the variables we gather data for.
+
We should get some functionality to gather the groups of these files automatically, based on the hydra config:
@hydra.main(version_base=None, config_path="../../conf", config_name="config")
+def main(cfg: DictConfig) ->None:
+
+ variables_dict = {
+"2m_temperature": "t2m",
+"2m_dewpoint_temperature": "d2m",
+"volumetric_soil_water_layer_1": "swvl1",
+"total_precipitation": "tp"
+ }
+
+print(OmegaConf.to_yaml(cfg))
+
+#prep dataverse
+ api_token_file = here() /"sandbox/dataverse_api_key.yml"
+withopen(api_token_file, "r") as f:
+ apiconfig = yaml.load(f, Loader=yaml.BaseLoader)
+ api = NativeApi(apiconfig['base_url'], apiconfig['api_token'])
+ search_api = SearchApi(apiconfig['base_url'], apiconfig['api_token'])
+ resp = search_api.search("ERA5", data_type="dataset")
+
+ results = resp.json()['data']['items']
+
+ result = [x for x in results if"ERA5"in x['name']][0]
+ era5_pid = result['global_id']
+
+for geography in cfg.geographies:
+for year in cfg.query['year']:
+for variable, v in variables_dict.items():
+
+print(f"Processing {geography} for {variable} in {year}")
+ glob_string = here() /"data"/"intermediate"/f"*{geography}*{variable}*{year}*"
+print(f"Glob: {glob_string}")
+ polygon_id = cfg.geographies[geography]['unique_id']
+print(f"polygon_id: {polygon_id}")
+ merged = gather_exposure_geodataframes(glob_string, polygon_id, variable)
+print(merged[0].head())
+print(merged[1].head())
+
+ output_dir = here() /"data"/"output"
+
+ f_out =f"environmental/exposures_era5/healthshed_daily/{geography}_{v}_{year}.parquet"
+ os.makedirs(output_dir / os.path.dirname(f_out), exist_ok=True)
+ output_path = output_dir / f_out
+
+print(f"Writing to {output_path}")
+ merged[0].to_parquet(output_path, index=False)
+
+
+print(f"Uploading {f_out.replace('/', '-')} to Dataverse...")
+# upload to dataverse
+ datafile = Datafile()
+ datafile.set({
+"pid": era5_pid,
+"filename": str(output_path),
+"label": f_out.replace("/", "-")
+ })
+
+ resp = api.upload_datafile(era5_pid, output_path, datafile.json())
+assert resp.json()['status'] =="OK", f"Failed to upload datafile: {resp.text}"
+
+# also save the geometry for the region
+ merged[1].to_parquet(output_path.parent /f"{geography}_geometry.parquet", index=False)
+
+# and upload it to dataverse
+ datafile = Datafile()
+ datafile.set({
+"pid": era5_pid,
+"filename": str(output_path.parent /f"{geography}_geometry.parquet"),
+"label": f"{geography}_geometry.parquet"
+ })
+
+ resp = api.upload_datafile(era5_pid, output_path.parent /f"{geography}_geometry.parquet", datafile.json())
+assert resp.json()['status'] =="OK", f"Failed to upload geometry datafile: {resp.text}"
+
+print("All files processed and uploaded successfully.")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/03_publish.md b/_docs/03_publish.md
new file mode 100644
index 0000000..ee32f98
--- /dev/null
+++ b/_docs/03_publish.md
@@ -0,0 +1,511 @@
+# Publish: Gather the Aggregated Data and Publish to DataVerse
+
+
+## publish
+
+> This is the `publish` module for the ERA5 dataset pipeline. It defines
+> a functions that make use of the `pyDataverse` library and API to
+> publish our outputs to the Harvard Dataverse.
+
+
+
+First, we’ll test out the API by pinging the Harvard DataVerse
+
+
+Exported source
+
+``` python
+import hydra
+import yaml
+import json
+from tqdm import tqdm
+from pyprojroot import here
+```
+
+
+
+``` python
+api_token_file = here() / "sandbox/dataverse_api_key.yml"
+with open(api_token_file, "r") as f:
+ config = yaml.load(f, Loader=yaml.BaseLoader)
+```
+
+Now, following the [docs]() for the dataverse tutorial, load a NativeAPI
+up:
+
+
+Exported source
+
+``` python
+from pyDataverse.api import NativeApi
+```
+
+
+
+The NativeAPI is a catchall API object to be able to do general stuff:
+
+``` python
+api = NativeApi(config['base_url'], config['api_token'])
+resp=api.get_info_version()
+#resp.text()
+```
+
+``` python
+resp.json()
+```
+
+Looks good! Now that we know that it works, we can think more about how
+to publish data there.
+
+## Harvard Dataverse
+
+Let’s create a dummy dataset with the components we’re planning to
+upload, and then upload and promptly delete it.
+
+To do that, we must import the `models` module and create a Dataset
+object:
+
+``` python
+from pyDataverse.models import Dataset
+```
+
+``` python
+ds = Dataset()
+```
+
+This `ds` object is pretty straightforward since it doesn’t contain
+anything yet:
+
+``` python
+ds.get()
+```
+
+We can populate the object from the dummy data on the github repo:
+
+``` python
+from pyDataverse.utils import read_file
+from urllib.request import urlretrieve
+import tempfile
+```
+
+``` python
+# url for dummy data
+url = "https://raw.githubusercontent.com/gdcc/pyDataverse/refs/heads/main/tests/data/user-guide/dataset.json"
+
+
+with tempfile.NamedTemporaryFile(mode='w+') as tmp:
+ urlretrieve(url, tmp.name)
+ ds.from_json(read_file(tmp.name))
+```
+
+We have to validate the JSON correctly:
+
+``` python
+ds.validate_json()
+```
+
+Modifying it is easy:
+
+``` python
+ds.set({"title": "Youth from Austria 2005"})
+ds.get()
+```
+
+Now, to create the dataset we use the API:
+
+``` python
+# this is only run in interactive sessions for demo purposes
+resp = api.create_dataset(":root", ds.json())
+```
+
+If you caught the `resp` object, it contains the PID for the newly
+created dataset.
+
+However, if you didn’t you can use the SearchAPI to find it:
+
+
+Exported source
+
+``` python
+from pyDataverse.api import SearchApi
+```
+
+
+
+``` python
+search_api = SearchApi(config['base_url'], config['api_token'])
+```
+
+``` python
+#
+
+resp = search_api.search("Youth from Austria", data_type="dataset")
+results = resp.json()['data']['items']
+result = [x for x in results if "Youth from Austria" in x['name']][0]
+result
+```
+
+``` python
+pid = result['global_id']
+```
+
+Now to look at the data we created using the NativeAPI again, and delete
+the dataset:
+
+``` python
+uploaded_ds = api.get_dataset(pid)
+uploaded_ds.json()['data']
+
+resp = api.delete_dataset(pid)
+resp.json()
+```
+
+With that understanding, we can develop a quick module to do the
+following:
+
+1. Make the dataset LEGO Compatible
+2. Upload and publish the data to dataverse
+
+## LEGO Compatibility
+
+Let’s take an example file to use as a model for LEGO compatibility
+
+
+Exported source
+
+``` python
+import geopandas as gpd
+import pandas as pd
+import re
+import glob
+```
+
+
+
+``` python
+ex = gpd.read_parquet(here() / "bld/2009_06_madagascar_day_swvl1_mean.parquet")
+ex.describe()
+```
+
+We know that the LEGO data model should look like this:
+
+ /lego
+ ├──
+ │ ├── __
+ │ │ ├── __
+ │ │ │ ├── _yyyy.parquet
+
+So, for the above file, we’ll end up with the LEGO path
+`data/environmental/exposures_era5/healthshed_monthly/dewpoint_2024.parquet`.
+In it, we should have the following columns:
+
+ healthshed_id year month day stat_1 stat_2 ... stat_n
+
+This means we should read in all of the exposures for a single timepoint
+at once. I think the smart thing to do is use a glob string to gather
+all of the pertinent files. This will be the first function we export to
+the library:
+
+------------------------------------------------------------------------
+
+source
+
+### gather_exposure_geodataframes
+
+> gather_exposure_geodataframes (glob_string:str, polygon_id:str,
+> exposure:str)
+
+*Read in a list of geo dataframes from the same time frame and merge
+them*
+
+
+
+
+
+
+
+
+
+
+
Type
+
Details
+
+
+
+
+
glob_string
+
str
+
string for the path to search for the pertinent files
+
+
+
polygon_id
+
str
+
the string signifying the healthshed ID of the polygon
+
+
+
exposure
+
str
+
the exposure name
+
+
+
Returns
+
list
+
+
+
+
+
+
+Exported source
+
+``` python
+def gather_exposure_geodataframes(
+ glob_string: str, # string for the path to search for the pertinent files
+ polygon_id: str, # the string signifying the healthshed ID of the polygon
+ exposure: str # the exposure name
+ )-> list:
+ "Read in a list of geo dataframes from the same time frame and merge them"
+
+ # first get the initial one so we have the polygon ID and geometry
+ frames = glob.glob(str(glob_string))
+ initial_gdf=gpd.read_parquet(frames[0])
+ merged_df = []
+
+ for f in tqdm(frames, desc="Processing files"):
+ # read in as a regular dataframe by ignoring geometry
+ df = gpd.read_parquet(f).drop(["geometry"], axis=1)
+
+ # get the year and month
+ # Extract year and month
+ search_str = rf'_{exposure}_(\d{{4}})_(\d{{1,2}})\.parquet$'
+ match = re.search(search_str, f)
+
+ if match:
+ year = int(match.group(1))
+ month = int(match.group(2))
+ #print(f"Year: {year}, Month: {month}")
+ else:
+ raise ValueError(f"Could not extract year and month from filename: {search_str} {f}")
+
+ df['exposure'] = exposure
+ df['month'] = month
+ df['year'] = year
+
+ # Step 1: Melt all day columns (leave 'month' and 'year' as identifiers)
+ df_long = df.melt(id_vars=[polygon_id, "exposure", "year", "month"], var_name="day_stat", value_name="value")
+
+ # Step 2: Extract day and stat type from column names
+ # Example column: "day_01_daily_mean"
+ df_long[["day", "stat"]] = df_long["day_stat"].str.extract(r"day_(\d{2})_daily_(mean|max|min|total)")
+
+ # Optional: convert 'day' and month to integer
+ df_long["day"] = df_long["day"].astype(int)
+ df_long["month"] = df_long["month"].astype(int)
+
+ # Drop the original combined column
+ df_long = df_long.drop(columns="day_stat")
+
+ # Reorder columns
+ df_long = df_long[[polygon_id, "exposure", "year", "month", "day", "stat", "value"]]
+
+ df_long = df_long.sort_values(by=["year", "month", "day"])
+ df_clean = df_long.pivot(index=[polygon_id, "exposure", "year", "month", "day"], columns="stat", values="value").reset_index()
+ merged_df.append(df_clean)
+
+ return [pd.concat(merged_df).reset_index(drop=True), initial_gdf[[polygon_id, "geometry"]]]
+```
+
+
+
+``` python
+frames = here() / "data" / "testing" / "*madagascar*"
+
+merged = gather_exposure_geodataframes(frames, "fs_uid", "2m_dewpoint_temperature")
+merged[0].describe()
+```
+
+This returns one file with all of the geometries and one file with the
+statistics and exposures.
+
+Now, with this, we can move on. The dataset was created in the UI and is
+available via search and test out how to upload it:
+
+``` python
+resp = search_api.search("ERA5", data_type="dataset")
+
+results = resp.json()['data']['items']
+
+result = [x for x in results if "ERA5" in x['name']][0]
+era5_pid = result['global_id']
+result
+```
+
+
+Exported source
+
+``` python
+from pyDataverse.models import Datafile
+import os
+import pathlib
+```
+
+
+
+We’ll upload directly from file. In the case of ERA5 vs. LEGO, we store
+the file on disk as LEGO hierarchy, but to upload it to dataverse using
+a flat filename (since creating subdatasets to represent directories
+might be a bit of a hassle)
+
+``` python
+# assuming the file has a path on disk like:
+f_out = "environmental/exposures_era5/healthshed_daily/dewpoint_2024.parquet"
+os.makedirs(here() / "data" / "testing" / os.path.dirname(f_out), exist_ok=True)
+aggregations, geo = merged
+aggregations.to_parquet(here() / "data" / "testing" / f_out, index=False)
+
+datafile = Datafile()
+datafile.set({
+ # the id of the era5 dataset
+ "pid": era5_pid,
+ # the path to the file on disk goes here
+ "filename": str(here() / "data" / "testing" / f_out),
+ # use the "label" to name the file
+ "label": f_out.replace("/", "-")
+})
+```
+
+``` python
+resp = api.upload_datafile(era5_pid, str(here() / "data" / "testing" / f_out), datafile.json())
+```
+
+Pretty simple!
+
+Now, we just need a main function to upload this data. The final upload
+is one file per exposure per year, so these should be the variables we
+gather data for.
+
+We should get some functionality to gather the groups of these files
+automatically, based on the hydra config:
+
+
+Exported source
+
+``` python
+from hydra import initialize, compose
+from omegaconf import OmegaConf, DictConfig
+from tqdm import tqdm
+```
+
+
+
+``` python
+target_dir = here() / "data" / "intermediate"
+
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode = False
+#cfg.query['year'] = 2017
+#cfg.query['month'] = 11
+#cfg.query['geography'] = "nepal"
+```
+
+------------------------------------------------------------------------
+
+source
+
+### main
+
+> main (cfg:omegaconf.dictconfig.DictConfig)
+
+
+Exported source
+
+``` python
+@hydra.main(version_base=None, config_path="../../conf", config_name="config")
+def main(cfg: DictConfig) -> None:
+
+ variables_dict = {
+ "2m_temperature": "t2m",
+ "2m_dewpoint_temperature": "d2m",
+ "volumetric_soil_water_layer_1": "swvl1",
+ "total_precipitation": "tp"
+ }
+
+ print(OmegaConf.to_yaml(cfg))
+
+ #prep dataverse
+ api_token_file = here() / "sandbox/dataverse_api_key.yml"
+ with open(api_token_file, "r") as f:
+ apiconfig = yaml.load(f, Loader=yaml.BaseLoader)
+ api = NativeApi(apiconfig['base_url'], apiconfig['api_token'])
+ search_api = SearchApi(apiconfig['base_url'], apiconfig['api_token'])
+ resp = search_api.search("ERA5", data_type="dataset")
+
+ results = resp.json()['data']['items']
+
+ result = [x for x in results if "ERA5" in x['name']][0]
+ era5_pid = result['global_id']
+
+ for geography in cfg.geographies:
+ for year in cfg.query['year']:
+ for variable, v in variables_dict.items():
+
+ print(f"Processing {geography} for {variable} in {year}")
+ glob_string = here() / "data" / "intermediate" / f"*{geography}*{variable}*{year}*"
+ print(f"Glob: {glob_string}")
+ polygon_id = cfg.geographies[geography]['unique_id']
+ print(f"polygon_id: {polygon_id}")
+ merged = gather_exposure_geodataframes(glob_string, polygon_id, variable)
+ print(merged[0].head())
+ print(merged[1].head())
+
+ output_dir = here() / "data" / "output"
+
+ f_out = f"environmental/exposures_era5/healthshed_daily/{geography}_{v}_{year}.parquet"
+ os.makedirs(output_dir / os.path.dirname(f_out), exist_ok=True)
+ output_path = output_dir / f_out
+
+ print(f"Writing to {output_path}")
+ merged[0].to_parquet(output_path, index=False)
+
+
+ print(f"Uploading {f_out.replace('/', '-')} to Dataverse...")
+ # upload to dataverse
+ datafile = Datafile()
+ datafile.set({
+ "pid": era5_pid,
+ "filename": str(output_path),
+ "label": f_out.replace("/", "-")
+ })
+
+ resp = api.upload_datafile(era5_pid, output_path, datafile.json())
+ assert resp.json()['status'] == "OK", f"Failed to upload datafile: {resp.text}"
+
+ # also save the geometry for the region
+ merged[1].to_parquet(output_path.parent / f"{geography}_geometry.parquet", index=False)
+
+ # and upload it to dataverse
+ datafile = Datafile()
+ datafile.set({
+ "pid": era5_pid,
+ "filename": str(output_path.parent / f"{geography}_geometry.parquet"),
+ "label": f"{geography}_geometry.parquet"
+ })
+
+ resp = api.upload_datafile(era5_pid, output_path.parent / f"{geography}_geometry.parquet", datafile.json())
+ assert resp.json()['status'] == "OK", f"Failed to upload geometry datafile: {resp.text}"
+
+ print("All files processed and uploaded successfully.")
+```
+
+
diff --git a/_docs/10_pytask_demo.html b/_docs/10_pytask_demo.html
new file mode 100644
index 0000000..ca9be4b
--- /dev/null
+++ b/_docs/10_pytask_demo.html
@@ -0,0 +1,1114 @@
+
+
+
+
+
+
+
+
+
+Demo: How to Create Pipelines with pytask – era5_sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
In this notebook, we are demonstrating how to convert our snakemake workflow into a pytask workflow. We use the basic tutorial to demonstrate this, but continue to use nbdev for development of functions in notebooks.
+
pytask is a task management system that allows you to define tasks and their dependencies, similar to Snakemake. It is particularly useful for data science workflows.
+
There are a number of reasons to use pytask over snakemake: - Pythonic: pytask is designed to be purely Pythonic by default, allowing you to write tasks and entire pipelines as Python functions. - Flexibility: pytask allows you to define tasks and their dependencies in a more flexible way, using Python functions and decorators, as opposed to orchestrating numerous scripts. - Integration: pytask integrates well with other Python libraries, such as nbdev here, or hydra configurations if you need, allowing you to use your existing code, notebooks, or configs in your workflows. - Parallelism: pytask supports parallel execution of tasks with pytask-parallel, which can speed up your workflows significantly, especially for data processing tasks.
+
We’ll use nbdev to define the task functions, and then export them to the src directory. pytask is then invoked at the command line to run the tasks.
+
+
This demo task is taken from the tutorial at pytask documentation. At minimum, you need your package to contain the following in a config.py file:
The former tells Python where to find the source code and build directory for pytask objects and shims, while the latter tells pytask where to find the task definitions and dependency DAG.
To define a task, simply use the task_ prefix in the function name (or, if you are familiar and comfortable with decorators, use @pytask.mark.task). Be verbose and expressive in your use of type hints to specify the input and output data, so that pytask can automatically detect and handle the dependencies between tasks.
+
+
+
Defining Tracked Outputs
+
To define something as a tracked output, you can annotate the input of the task with Annotated[Path, Product], where Product is imported from pytask. This tells pytask that this is a product of the task and should be saved in the build directory.
+
In this example, we’re generating random data into a data frame and saving the object as a pickle in the bld directory (bld is the default build directory for pytask’s intermediate data). To get that directory, we use the BLD variable from the era5_sandbox.config module as above. This module itself could also be generated using nbdev if you want to keep your configuration in notebooks.
+
Using nbdev, we can also include all of the bells and whistles of function documentation.
def task_create_random_data(
+ seed: Annotated[int, 42], # Default seed for reproducibility
+ path_to_data: Annotated[Path, Product] = BLD /"data.pkl"# Path to the object in the build directory
+ ) ->None:
+"Create a random data set and save it as a pickle file. Return the path to the saved file."
+ rng = np.random.default_rng(seed)
+ beta =2
+
+ x = rng.normal(loc=5, scale=10, size=1_000)
+ epsilon = rng.standard_normal(1_000)
+
+ y = beta * x + epsilon
+
+ df = pd.DataFrame({"x": x, "y": y})
+
+# this is a tracked output, so we annotate the return value with `Annotated[Path, Product]`
+ df.to_pickle(path_to_data)
+
+
+
We can test the function directly in the notebook:
+
+
task_create_random_data(42)
+
+
Once this module and function are exported with nbdev_export, the functions are in a python package. We can then use the command line to look at the registered tasks:
+
+
pytask collect
+
+
Let’s add another task in the same module. This task plots the data we generated. To link the previous task to this one as a dependency, we can list the output of the previous task as an input to this one. This way, pytask will know that it needs to run the first task before this one.
Plot the data from the pickle file and save the plot. Note that this task: 1. depends on the data.pkl file created by the previous task, 2. does not return any value, but saves a plot to the build directory. So the side effect of the task is what we are interested in here (though this is probably bad practice).
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
path_to_data
+
Annotated
+
+
Path to the data file created by the previous task
def task_plot_data(
+ path_to_data: Annotated[Path, BLD /"data.pkl"], # Path to the data file created by the previous task
+ path_to_plot: Annotated[Path, Product] = BLD /"plot.png"# Path to the build directory for the plot
+) ->None:
+"""
+ Plot the data from the pickle file and save the plot. Note that this task:
+ 1. depends on the data.pkl file created by the previous task,
+ 2. does not return any value, but saves a plot to the build directory. So the side effect of the task is what we are interested in here (though this is probably bad practice).
+ """
+
+ df = pd.read_pickle(path_to_data)
+
+ _, ax = plt.subplots()
+ df.plot(x="x", y="y", ax=ax, kind="scatter")
+
+ plt.savefig(path_to_plot)
+ plt.close()
+
+
+
We now have a DAG of tasks that pytask can execute. To see the tasks, we can use the command line to create a pygraphviz graph of the tasks:
+
pytask dag
+
The DAG is saved as a pdf file, and you can view it using any viewer. Now, to run the pipeline, just invoke pytask at the command line:
+
pytask
+
In Jupyter or iPython, you can interact with the task outputs directly:
+
+
# list all the files in the build directory
+forfilein os.listdir(BLD):
+print(file)
+
+
We can use these to build subsequent tasks later.
+
+
+
+
More Complex Tasks & The Data Catalog
+
As we define more complex tasks, we can use the pytask data catalog to manage the inputs and outputs of our tasks. The data catalog allows us to imperatively name the data and their formats, making it easier to manage the data flow in our tasks. Importantly, we can define the data pythonically, which allows us to use the full power of Python to manipulate and transform our data. This is particularly more useful than snakemake’s approach, which requires you to define the data in a more static way using paths and a separate pseudo-language.
+
The content of the era5_sandbox.config module can be extended to include a data catalog:
With just this definition, we’re now able to refer directly to data by name in our tasks, and pytask will handle the paths and formats for us. This allows us to focus on the logic of our tasks rather than the details of data management.
+
+
+
+
+
+
+Note
+
+
+
+
This is a major advantage of pytask over snakemake, as it allows you to define the data in a more flexible and Pythonic way, while still maintaining the benefits of a task management system. It is a similar approach to building pipelines in R with targets, which allows you to define the data in a more flexible way.
+
+
+
Let’s create a task that modifies the data frame by adding a new column. This task will depend on the previous task’s output, and we will use the data catalog to define the input and output data.
def task_add_one(
+ path_to_data: Annotated[Path, BLD /"data.pkl"], # Path to the data file created by the previous task
+ node: Annotated[PickleNode, Product] = demo_catalog["mydata"]
+) ->None:
+"""
+ Add one to the 'y' column of the data frame and save it as a new pickle file.
+ """
+ df = pd.read_pickle(path_to_data)
+ df['z'] = df['y'] +1
+
+ node.save(df)
+
+
+
In this function, we’ve defined that the task relies on the output of the first task being there, the data.pkl file. But importantly, we’ve also defined our product as a node from the PickleNode module. This will allow pytask to handle the serialization and deserialization of the data frame automatically, so we don’t have to worry about the details of how the data is stored. We create the datacatalog in our config file, and then tell this task to create a Node in that catalog called mydata. Whatever we save with the node.save() method will be saved in the build directory, but more importantly will be indexed and hashed by pytask. This means that if the data changes, pytask will know to rerun the task.
+
To make this even more pythonic, we can modify the format of our task function so that the return type annotator is used as a node in the data catalog. This allows us to define the output of the task as a PickleNode, which will automatically handle the serialization and deserialization of the data frame.
+
+
+
+
+
+
+Note
+
+
+
+
This is another trick I’m deriving from {targets}. By formatting tasks as pure functions where inputs are parameters and targets are return type annotations, we can define the output of the task as a PickleNode, which will automatically handle the serialization and deserialization of the data frame. This again allows us to focus on the logic of our tasks rather than the details of data management.
+
+
+
So below, we’re directly accessing the data_catalog to get the mydata node, and then modifying it by adding a new column. It feels like we are doing this in place, such as in an iPython session, because we are allowing pytask to handle the serialization of the file on disk for us.
Add another column to the data frame stored in the PickleNode.
+
+
+
+
+
+
+
+
+
+
Type
+
Details
+
+
+
+
+
df
+
Annotated
+
which object in the catalog to fetch from the catalog with node.load()
+
+
+
Returns
+
Annotated
+
which object in the catalog to save the return value to
+
+
+
+
+
+Exported source
+
def task_add_another_column(
+ df: Annotated[pd.DataFrame, demo_catalog["mydata"]] # which object in the catalog to fetch from the catalog with node.load()
+) -> Annotated[pd.DataFrame, demo_catalog["mydata2"]]: # which object in the catalog to save the return value to
+"""
+ Add another column to the data frame stored in the PickleNode.
+ """
+
+# use the datacatalog directly to access the node
+# this is a bit like accessing the node in an iPython session, but pytask
+# will handle the serialization and deserialization for us
+ df['w'] = df['z'] * df['y']
+
+return df
+
+
+
To test this interactively, we’d have to import the data catalog’s object
+
+
df = demo_catalog["mydata"].load() # load the data frame from the PickleNode
+result = task_add_another_column(df) # call the task function with the loaded data frame
+
+
+
result
+
+
Now that we know it will work, we can invoke pytask:
+
+
pytask
+
+
Notice that the outputs are cached and not recomputed unless the inputs change. This is a key feature of pytask and other DAGs, allowing you to efficiently manage your data processing tasks without unnecessary recomputation.
+
+
+
+
Conclusion
+
The takeaway here is that with pytask, you can define pure functions that take inputs and return outputs, and build a DAG of tasks that can be executed in a flexible and efficient way. This allows you to focus on the logic of your tasks rather than the details of data management, while still maintaining the benefits of a task management system. The key elements are:
+
+
Task annotation: You define your tasks by creating pure functions that take inputs and return outputs, and use decorators or naming conventions to mark them as “tasks” in a dag
+
Input and output annotation: You define the inputs and outputs of your tasksusing type hints, and allow pytask to automatically detect and handle the dependencies between tasks.
+
Data catalog: You define your data in a Pythonic object in your config called data_catalog. As you iteratively develop your DAG, you add objects to the data catalog, which are called nodes. As long as a node is a pythonic object and has a pickle method, pytask will handle the serialization and deserialization of the data for you.
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/10_pytask_demo.md b/_docs/10_pytask_demo.md
new file mode 100644
index 0000000..d0a20e4
--- /dev/null
+++ b/_docs/10_pytask_demo.md
@@ -0,0 +1,603 @@
+# Demo: How to Create Pipelines with `pytask`
+
+
+## Data Preparation Demo
+
+> Data preparation task for `pytask` demo
+
+In this notebook, we are demonstrating how to convert our snakemake
+workflow into a `pytask` workflow. We use the basic tutorial to
+demonstrate this, but continue to use nbdev for development of functions
+in notebooks.
+
+`pytask` is a task management system that allows you to define tasks and
+their dependencies, similar to `Snakemake`. It is particularly useful
+for data science workflows.
+
+There are a number of reasons to use `pytask` over `snakemake`: -
+**Pythonic**: `pytask` is designed to be purely Pythonic by default,
+allowing you to write tasks and entire pipelines as Python functions. -
+**Flexibility**: `pytask` allows you to define tasks and their
+dependencies in a more flexible way, using Python functions and
+decorators, as opposed to orchestrating numerous scripts. -
+**Integration**: `pytask` integrates well with other Python libraries,
+such as `nbdev` here, or `hydra` configurations if you need, allowing
+you to use your existing code, notebooks, or configs in your
+workflows. - **Parallelism**: `pytask` supports parallel execution of
+tasks with `pytask-parallel`, which can speed up your workflows
+significantly, especially for data processing tasks.
+
+We’ll use nbdev to define the task functions, and then export them to
+the `src` directory. `pytask` is then invoked at the command line to run
+the tasks.
+
+
+
+This demo task is taken from the tutorial at [pytask
+documentation](https://pytask-dev.readthedocs.io/en/stable/tutorials/write_a_task.html).
+At minimum, you need your package to contain the following in a
+config.py file:
+
+``` md
+my_project
+│
+├───.pytask
+│
+├───bld
+│ └────...
+│
+├───src
+│ └───my_project
+│ ├────__init__.py
+│ ├────config.py
+│ └────...
+│
+└───pyproject.toml
+```
+
+``` python
+#contents of `era5_sandbox.config` module
+from pathlib import Path
+
+
+SRC = Path(__file__).parent.resolve()
+BLD = SRC.joinpath("..", "..", "bld").resolve()
+```
+
+Additionally, your pyproject.toml file should contain the following at
+minimum:
+
+``` toml
+[tool.pytask.ini_options]
+paths = ["src/era5_sandbox"]
+```
+
+The former tells Python where to find the source code and build
+directory for `pytask` objects and shims, while the latter tells
+`pytask` where to find the task definitions and dependency DAG.
+
+
+Exported source
+
+``` python
+import os
+from pathlib import Path
+from typing import Annotated
+
+import numpy as np
+import matplotlib.pyplot as plt
+import pandas as pd
+from era5_sandbox.config import BLD
+from era5_sandbox.config import data_catalog, demo_catalog
+
+from pytask import PickleNode
+from pytask import Product
+```
+
+
+
+### Defining Tasks
+
+To define a task, simply use the `task_` prefix in the function name
+(or, if you are familiar and comfortable with decorators, use
+`@pytask.mark.task`). Be verbose and expressive in your use of type
+hints to specify the input and output data, so that `pytask` can
+automatically detect and handle the dependencies between tasks.
+
+### Defining Tracked Outputs
+
+To define something as a tracked output, you can annotate the input of
+the task with `Annotated[Path, Product]`, where `Product` is imported
+from `pytask`. This tells `pytask` that this is a product of the task
+and should be saved in the build directory.
+
+In this example, we’re generating random data into a data frame and
+saving the object as a pickle in the `bld` directory (`bld` is the
+default build directory for `pytask`’s intermediate data). To get that
+directory, we use the `BLD` variable from the `era5_sandbox.config`
+module as above. This module itself could also be generated using
+`nbdev` if you want to keep your configuration in notebooks.
+
+Using `nbdev`, we can also include all of the bells and whistles of
+function documentation.
+
+------------------------------------------------------------------------
+
+source
+
+### task_create_random_data
+
+> task_create_random_data (seed:typing.Annotated[int,42], path_to_data:typi
+> ng.Annotated[pathlib.Path,ProductType()]=Path('/
+> net/rcstorenfs02/ifs/rc_labs/dominici_lab/lab/da
+> ta_processing/csph-era5_sandbox/bld/data.pkl'))
+
+*Create a random data set and save it as a pickle file. Return the path
+to the saved file.*
+
+
+
+
+Exported source
+
+``` python
+def task_create_random_data(
+ seed: Annotated[int, 42], # Default seed for reproducibility
+ path_to_data: Annotated[Path, Product] = BLD / "data.pkl" # Path to the object in the build directory
+ ) -> None:
+ "Create a random data set and save it as a pickle file. Return the path to the saved file."
+ rng = np.random.default_rng(seed)
+ beta = 2
+
+ x = rng.normal(loc=5, scale=10, size=1_000)
+ epsilon = rng.standard_normal(1_000)
+
+ y = beta * x + epsilon
+
+ df = pd.DataFrame({"x": x, "y": y})
+
+ # this is a tracked output, so we annotate the return value with `Annotated[Path, Product]`
+ df.to_pickle(path_to_data)
+```
+
+
+
+We can test the function directly in the notebook:
+
+``` python
+task_create_random_data(42)
+```
+
+Once this module and function are exported with `nbdev_export`, the
+functions are in a python package. We can then use the command line to
+look at the registered tasks:
+
+``` sh
+pytask collect
+```
+
+Let’s add another task in the same module. This task plots the data we
+generated. To link the previous task to this one as a dependency, we can
+list the output of the previous task as an input to this one. This way,
+`pytask` will know that it needs to run the first task before this one.
+
+------------------------------------------------------------------------
+
+source
+
+### task_plot_data
+
+> task_plot_data (path_to_data:typing.Annotated[pathlib.Path,Path('/net/rcs
+> torenfs02/ifs/rc_labs/dominici_lab/lab/data_processing/cs
+> ph-era5_sandbox/bld/data.pkl')], path_to_plot:typing.Anno
+> tated[pathlib.Path,ProductType()]=Path('/net/rcstorenfs02
+> /ifs/rc_labs/dominici_lab/lab/data_processing/csph-
+> era5_sandbox/bld/plot.png'))
+
+*Plot the data from the pickle file and save the plot. Note that this
+task: 1. depends on the data.pkl file created by the previous task, 2.
+does not return any value, but saves a plot to the build directory. So
+the side effect of the task is what we are interested in here (though
+this is probably bad practice).*
+
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
path_to_data
+
Annotated
+
+
Path to the data file created by the previous task
+
+
+Exported source
+
+``` python
+def task_plot_data(
+ path_to_data: Annotated[Path, BLD / "data.pkl"], # Path to the data file created by the previous task
+ path_to_plot: Annotated[Path, Product] = BLD / "plot.png" # Path to the build directory for the plot
+) -> None:
+ """
+ Plot the data from the pickle file and save the plot. Note that this task:
+ 1. depends on the data.pkl file created by the previous task,
+ 2. does not return any value, but saves a plot to the build directory. So the side effect of the task is what we are interested in here (though this is probably bad practice).
+ """
+
+ df = pd.read_pickle(path_to_data)
+
+ _, ax = plt.subplots()
+ df.plot(x="x", y="y", ax=ax, kind="scatter")
+
+ plt.savefig(path_to_plot)
+ plt.close()
+```
+
+
+
+We now have a DAG of tasks that `pytask` can execute. To see the tasks,
+we can use the command line to create a pygraphviz graph of the tasks:
+
+``` bash
+pytask dag
+```
+
+The DAG is saved as a pdf file, and you can view it using any viewer.
+Now, to run the pipeline, just invoke `pytask` at the command line:
+
+``` bash
+pytask
+```
+
+In Jupyter or iPython, you can interact with the task outputs directly:
+
+``` python
+# list all the files in the build directory
+for file in os.listdir(BLD):
+ print(file)
+```
+
+We can use these to build subsequent tasks later.
+
+## More Complex Tasks & The Data Catalog
+
+As we define more complex tasks, we can use the `pytask` data catalog to
+manage the inputs and outputs of our tasks. The data catalog allows us
+to imperatively name the data and their formats, making it easier to
+manage the data flow in our tasks. Importantly, we can define the data
+pythonically, which allows us to use the full power of Python to
+manipulate and transform our data. This is particularly more useful than
+snakemake’s approach, which requires you to define the data in a more
+static way using paths and a separate pseudo-language.
+
+The content of the `era5_sandbox.config` module can be extended to
+include a data catalog:
+
+``` python
+from pathlib import Path
+from pytask import DataCatalog, Product
+
+SRC = Path(__file__).parent.resolve()
+BLD = SRC.joinpath("..", "..", "bld").resolve()
+
+demo_catalog = DataCatalog()
+```
+
+With just this definition, we’re now able to refer directly to data by
+name in our tasks, and `pytask` will handle the paths and formats for
+us. This allows us to focus on the logic of our tasks rather than the
+details of data management.
+
+
+
+> **Note**
+>
+> This is a major advantage of `pytask` over `snakemake`, as it allows
+> you to define the data in a more flexible and Pythonic way, while
+> still maintaining the benefits of a task management system. It is a
+> similar approach to building pipelines in R with targets, which allows
+> you to define the data in a more flexible way.
+
+
+
+Let’s create a task that modifies the data frame by adding a new column.
+This task will depend on the previous task’s output, and we will use the
+data catalog to define the input and output data.
+
+------------------------------------------------------------------------
+
+source
+
+### task_add_one
+
+> task_add_one (path_to_data:typing.Annotated[pathlib.Path,Path('/net/rcsto
+> renfs02/ifs/rc_labs/dominici_lab/lab/data_processing/csph-
+> era5_sandbox/bld/data.pkl')], node:typing.Annotated[_pytask
+> .nodes.PickleNode,ProductType()]=PickleNode(path=Path('/net
+> /rcstorenfs02/ifs/rc_labs/dominici_lab/lab/data_processing/
+> csph-era5_sandbox/.pytask/data_catalogs/default/1eef510d81e
+> ea49161cd821b318aa999e630bdd292b093aa9a9319e9f282b984.pkl')
+> , name='mydata', attributes={'catalog_name': 'default'},
+> serializer=, deserializer= function load>))
+
+*Add one to the ‘y’ column of the data frame and save it as a new pickle
+file.*
+
+
+
+
+
+
+
+
+
+
+
+
Type
+
Default
+
Details
+
+
+
+
+
path_to_data
+
Annotated
+
+
Path to the data file created by the previous task
+
+
+Exported source
+
+``` python
+def task_add_one(
+ path_to_data: Annotated[Path, BLD / "data.pkl"], # Path to the data file created by the previous task
+ node: Annotated[PickleNode, Product] = demo_catalog["mydata"]
+) -> None:
+ """
+ Add one to the 'y' column of the data frame and save it as a new pickle file.
+ """
+ df = pd.read_pickle(path_to_data)
+ df['z'] = df['y'] + 1
+
+ node.save(df)
+```
+
+
+
+In this function, we’ve defined that the task relies on the output of
+the first task being there, the `data.pkl` file. But importantly, we’ve
+also defined our product as a `node` from the `PickleNode` module. This
+will allow `pytask` to handle the serialization and deserialization of
+the data frame automatically, so we don’t have to worry about the
+details of how the data is stored. We create the datacatalog in our
+config file, and then tell this task to create a Node in that catalog
+called `mydata`. Whatever we save with the `node.save()` method will be
+saved in the build directory, but more importantly *will be indexed and
+hashed by `pytask`*. This means that if the data changes, `pytask` will
+know to rerun the task.
+
+To make this even more pythonic, we can modify the format of our task
+function so that the return type annotator is used as a node in the data
+catalog. This allows us to define the output of the task as a
+`PickleNode`, which will automatically handle the serialization and
+deserialization of the data frame.
+
+
+
+> **Note**
+>
+> This is another trick I’m deriving from {targets}. By formatting tasks
+> as pure functions where inputs are parameters and targets are return
+> type annotations, we can define the output of the task as a
+> `PickleNode`, which will automatically handle the serialization and
+> deserialization of the data frame. This again allows us to focus on
+> the logic of our tasks rather than the details of data management.
+
+
+
+So below, we’re directly accessing the `data_catalog` to get the
+`mydata` node, and then modifying it by adding a new column. It *feels*
+like we are doing this in place, such as in an iPython session, because
+we are allowing `pytask` to handle the serialization of the file on disk
+for us.
+
+------------------------------------------------------------------------
+
+source
+
+### task_add_another_column
+
+> task_add_another_column (df:typing.Annotated[pandas.core.frame.DataFrame,
+> PickleNode(path=Path('/net/rcstorenfs02/ifs/rc_l
+> abs/dominici_lab/lab/data_processing/csph-era5_s
+> andbox/.pytask/data_catalogs/default/1eef510d81e
+> ea49161cd821b318aa999e630bdd292b093aa9a9319e9f28
+> 2b984.pkl'),name='mydata',attributes={'catalog_n
+> ame':'default'},serializer= infunctiondump>,deserializer= infunctionload>)])
+
+*Add another column to the data frame stored in the PickleNode.*
+
+
+
+
+
+
+
+
+
+
+
Type
+
Details
+
+
+
+
+
df
+
Annotated
+
which object in the catalog to fetch from the catalog with
+node.load()
+
+
+
Returns
+
Annotated
+
which object in the catalog to save the return value
+to
+
+
+
+
+
+Exported source
+
+``` python
+def task_add_another_column(
+ df: Annotated[pd.DataFrame, demo_catalog["mydata"]] # which object in the catalog to fetch from the catalog with node.load()
+) -> Annotated[pd.DataFrame, demo_catalog["mydata2"]]: # which object in the catalog to save the return value to
+ """
+ Add another column to the data frame stored in the PickleNode.
+ """
+
+ # use the datacatalog directly to access the node
+ # this is a bit like accessing the node in an iPython session, but pytask
+ # will handle the serialization and deserialization for us
+ df['w'] = df['z'] * df['y']
+
+ return df
+```
+
+
+
+To test this interactively, we’d have to import the data catalog’s
+object
+
+``` python
+df = demo_catalog["mydata"].load() # load the data frame from the PickleNode
+result = task_add_another_column(df) # call the task function with the loaded data frame
+```
+
+``` python
+result
+```
+
+Now that we know it will work, we can invoke pytask:
+
+``` sh
+pytask
+```
+
+Notice that the outputs are cached and not recomputed unless the inputs
+change. This is a key feature of `pytask` and other DAGs, allowing you
+to efficiently manage your data processing tasks without unnecessary
+recomputation.
+
+## Conclusion
+
+The takeaway here is that with `pytask`, you can define pure functions
+that take inputs and return outputs, and build a DAG of tasks that can
+be executed in a flexible and efficient way. This allows you to focus on
+the logic of your tasks rather than the details of data management,
+while still maintaining the benefits of a task management system. The
+key elements are:
+
+- **Task annotation**: You define your tasks by creating pure functions
+ that take inputs and return outputs, and use decorators or naming
+ conventions to mark them as “tasks” in a dag
+- **Input and output annotation**: You define the inputs and outputs of
+ your tasksusing type hints, and allow `pytask` to automatically detect
+ and handle the dependencies between tasks.
+- **Data catalog**: You define your data in a Pythonic object in your
+ config called `data_catalog`. As you iteratively develop your DAG, you
+ add objects to the data catalog, which are called nodes. As long as a
+ node is a pythonic object and has a pickle method, `pytask` will
+ handle the serialization and deserialization of the data for you.
diff --git a/_docs/20_pytask_config.html b/_docs/20_pytask_config.html
new file mode 100644
index 0000000..aaf6c2a
--- /dev/null
+++ b/_docs/20_pytask_config.html
@@ -0,0 +1,927 @@
+
+
+
+
+
+
+
+
+
+pytask Config: Defining the Pipeline Internals in pytask – era5_sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
pytask Config: Defining the Pipeline Internals in pytask
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
config
+
+
This is the config module for the pytask pipeline. This module defines the data catalog(s) and any hard-coded parameters that are used throughout the pipeline.
I’m adding a flag to the config that can be used for quick development. If you import this boolean variable, it can be used to skip tasks, setup samples, etc. on the fly by marking a task with the pytask.mark.skipif decorator. Change this to False when you’re ready to run the full pipeline.
+
+
+Exported source
+
DEV_MODE=True
+
+
+
+
+
The Data Catalog
+
To manage our pipeline, we’re going to use a nested data catalog structure. This way, we can easily return specific entries to specific tasks without having to manage multiple different data catalogs. Specifically, we’ll have a data catalog for each stage of the pipeline, and each catalog will have entries for the inputs, outputs, and any other parameters needed for that stage. This is similar to how we used Hydra configs, but using the pytask data catalog, we can more easily gather the data for a specific task in structured manner entirely in Python.
+
+
+Exported source
+
stages = ["mydata", 'mydata2', # from the demo, ignore
+"download", # download task
+"aggregate", # aggregation task
+"publish", # publishing task
+"viz"] # visualization task
+
+buckets = [
+"inputs", # any specific inputs, eg for carrying over between tasks
+"outputs", # specific output task returns
+"jobs", # job parameters as a dataframe
+"params"# any lingering hardcoded parameters
+ ]
+
+data_catalog = {
+
+ stage: {bucket: DataCatalog(name=f"{stage}_{bucket}") for bucket in buckets}
+for stage in stages
+}
+
+
+
+
+
The Download Task
+
A good strategy may be to set pipeline stage parameters in the config file, and then use the pytask data catalog to manage the data. This way, we can easily change the parameters without having to modify the code. This is especially useful for the API query, where we need to be able to set the parameter grid for the years and data types we want to download data for. So, let’s create an entry in the data catalog specifically for the download task.
+
A good strategy I thought about for grid parameter comprehension is to create a dataframe expands all the combinations of parameters, and then uses each combination to create the tasks which are then easily added to the data catalog. This way, we can still easily inspect the pipeline and see what tasks are being run, while also being able to easily change the parameters in the config file without too much hassle.
+
An important framework decision I’m making here is that each ROW of the dataframe corresponds to a single task, so that we can quickly understand at a glance what the task is doing, and also easily develop the code for the task itself. This is different from the hydra approach where a job is first specified by a default config, and then the parameters are swept over in multiple config files. This is a more flexible approach, IMO, because:
+
+
each row defines a single task run, so it’s easy to understand what the run is doing
+
it’s easy to add or remove runs by simply expanding the list of parameters and using dataframe filters to remove irrelevant parameter combinations
+
we don’t have to independently inspect and manage multiple different/overriding config files
+
it’s all in Python, so we can use the full power of the language to define the parameters and the tasks in a single sweep, not through the need of hydra+snakemake multi stage/multi-lingual config system
+
+
So, to do this, we define one job as a query to the CDS API that must contain: - The dataset (re-analysis) - The year - The month - All days in the month - All times of day (hour) - The geography (region), which will need: - The URL to the shapefile to calculate the bounding box
+
Given one combination of all of these, a single SLURM job can complete the first “task” in parallel by having a run assigned to each row of the dataframe.
+
+
+Exported source
+
# Dimensions
+years = [str(x) for x inrange(2009, 2025)] # 16 years
+months = [str(x).zfill(2) for x inrange(1, 13)] # 12 months
+geographies = ["madagascar", "nepal"] # 2 geographies
+
+# nested values; we want ALL days, times, and variables for each job
+days = [str(x).zfill(2) for x inrange(1, 32)]
+times = [f"{x:02d}:00"for x inrange(24)]
+variables = ["2m_dewpoint_temperature", "2m_temperature", "total_precipitation", "volumetric_soil_water_layer_1"]
+
+product_type ="reanalysis"
+
+# Map shapefiles to geography
+shapefiles = {
+"madagascar": "https://data.humdata.org/dataset/26fa506b-0727-4d9d-a590-d2abee21ee22/resource/ed94d52e-349e-41be-80cb-62dc0435bd34/download/mdg_adm_bngrc_ocha_20181031_shp.zip",
+"nepal": "https://data.humdata.org/dataset/07db728a-4f0f-4e98-8eb0-8fa9df61f01c/resource/2eb4c47f-fd6e-425d-b623-d35be1a7640e/download/npl_adm_nd_20240314_ab_shp.zip"
+}
+
+# Build row-wise combinations of (year, month, geography)
+rows = []
+for year in years:
+for month in months:
+for geo in geographies:
+ rows.append({
+"year": year,
+"month": month,
+"geography": geo,
+"shapefile": shapefiles[geo],
+"product_type": product_type,
+"day": days,
+"time": times,
+"variables": variables,
+"output": f"{year}_{month}_{geo}"
+ })
+
+# Create dataframe
+query_df = pd.DataFrame(rows)
+
+
+
+
query_df
+
+
+
print(f"Number of estimated jobs: {query_df.shape[0]}. Examples...")
+
+for i, row in query_df.sample(3).iterrows():
+print(f"Year: {row['year']}, Month: {row['month']}, Geography: {row['geography']}, Link: {row['shapefile']}, Variables: {row['variables']}")
+
+
Now add them to the catalog. We’re going to use a dictionary to nest data catalogs so that we can return specific task products to named data catalog nodes.
+
Our data catalog now has a download|jobs node with a queries_df entry that contains the dataframe of all the jobs to be run in this task.
To carry out the aggregation, we will follow similar logic to the original pipeline and use xarray to aggregate data into spatial and temporal averages. The aggregation task will take the downloaded data and compute the mean over the specified time period and spatial region. However, in this case, we want to aggregate the data diurnally, so we will need to fetch the sundown and sunrise times for the region and use them to compute the diurnal averages.
+
Once again, we will use a dataframe to define the parameters for the aggregation task.
+
Here we will use a dataframe with the jobs as rows; the first column is “input” which is the list of query names from the download task, and the last column is the output object name. Columns in between can be the parameters needed for the aggregation task, which then get expanded to the full list of jobs with itertools.product, explode or similar, and filtered as necessary.
+
For explanations of the parameters, see the Aggregation Task notebook’s final task_aggregate_data_diurnal function.
+
+
+Exported source
+
inputs = query_df["output"].tolist()
+outputs = [f"{i}_agg"for i in inputs]
+
+variable_dict = {
+"2m_dewpoint_temperature": "d2m",
+"2m_temperature": "t2m",
+"total_precipitation": "tp",
+"volumetric_soil_water_layer_1": "swvl1"
+}
+
+# list of params that get fed into the task functions
+agg_params = {
+"time": ["day", "night"],
+"solar_classification": ["before"],
+"variables": variables,
+"variables_short": [variable_dict[x] for x in variables],
+"aggregation_name": ["mean", "sum", "max", "min"]
+}
+
+from itertools import product
+import pandas as pd
+
+# expand all the params
+agg_params = pd.DataFrame(list(product(*agg_params.values())), columns=agg_params.keys())
+
+
+
Inspecting it:
+
+
agg_params
+
+
Let’s keep only rows where the variables and variables_short match
Great, and now keeping sum only for total precipitation (we don’t need mean, max, min for that variable), and removing sum for all other variables (we don’t need sum for temperature or soil moisture):
+
+
+Exported source
+
mask = (agg_params['variables_short'] =="tp") & (agg_params['aggregation_name'] !="sum")
+agg_params = agg_params[~mask]
+
+# remove rows where non-tp aggregation is sum
+mask = (agg_params['variables_short'] !="tp") & (agg_params['aggregation_name'] =="sum")
+agg_params = agg_params[~mask]
+
+
+
+
agg_params
+
+
Now we add the input and output columns by joining:
A few more configuration items need to be added, like the local timezone for each geography, the healthshed filename, the healthshed unique ID variable name in the shapefile, and whether the variable is instantaneous or accumulated:
+
+
+Exported source
+
aggregate_jobs['local_tz'] = aggregate_jobs['input'].apply(
+lambda x: "Asia/Kathmandu"if"nepal"in x else"Indian/Antananarivo"
+)
+aggregate_jobs['shapefile'] = aggregate_jobs['input'].apply(
+lambda x: "Nepal_Healthsheds2024.zip"if"nepal"in x else"healthsheds2022.zip"
+)
+
+aggregate_jobs['hshd_unique_id'] = aggregate_jobs['input'].apply(
+lambda x: "fid"if"nepal"in x else"fs_uid"
+)
+
+aggregate_jobs['climate_handler_var'] = aggregate_jobs['variables_short'].apply(
+lambda x: "accum"if x =="tp"else"instant"
+)
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/20_pytask_config.md b/_docs/20_pytask_config.md
new file mode 100644
index 0000000..689d80c
--- /dev/null
+++ b/_docs/20_pytask_config.md
@@ -0,0 +1,365 @@
+# `pytask` Config: Defining the Pipeline Internals in `pytask`
+
+
+## config
+
+> This is the config module for the `pytask` pipeline. This module
+> defines the data catalog(s) and any hard-coded parameters that are
+> used throughout the pipeline.
+
+
+
+
+Exported source
+
+``` python
+import pandas as pd
+
+from pathlib import Path
+from pyprojroot import here
+from pytask import DataCatalog
+
+
+SRC = here() / "src" / "era5_sandbox"
+BLD = here() / "bld"
+
+demo_catalog = DataCatalog()
+```
+
+
+
+## `DEV_MODE`: A Quick Development Flag
+
+I’m adding a flag to the config that can be used for quick development.
+If you import this boolean variable, it can be used to skip tasks, setup
+samples, etc. on the fly by `marking` a task with the
+`pytask.mark.skipif` decorator. Change this to `False` when you’re ready
+to run the full pipeline.
+
+
+Exported source
+
+``` python
+DEV_MODE=True
+```
+
+
+
+## The Data Catalog
+
+To manage our pipeline, we’re going to use a nested data catalog
+structure. This way, we can easily return specific entries to specific
+tasks without having to manage multiple different data catalogs.
+Specifically, we’ll have a data catalog for each stage of the pipeline,
+and each catalog will have entries for the inputs, outputs, and any
+other parameters needed for that stage. This is similar to how we used
+Hydra configs, but using the `pytask` data catalog, we can more easily
+gather the data for a specific task in structured manner entirely in
+Python.
+
+
+Exported source
+
+``` python
+stages = ["mydata", 'mydata2', # from the demo, ignore
+ "download", # download task
+ "aggregate", # aggregation task
+ "publish", # publishing task
+ "viz"] # visualization task
+
+buckets = [
+ "inputs", # any specific inputs, eg for carrying over between tasks
+ "outputs", # specific output task returns
+ "jobs", # job parameters as a dataframe
+ "params" # any lingering hardcoded parameters
+ ]
+
+data_catalog = {
+
+ stage: {bucket: DataCatalog(name=f"{stage}_{bucket}") for bucket in buckets}
+ for stage in stages
+}
+```
+
+
+
+## The Download Task
+
+A good strategy may be to set pipeline stage parameters in the config
+file, and then use the `pytask` data catalog to manage the data. This
+way, we can easily change the parameters without having to modify the
+code. This is especially useful for the API query, where we need to be
+able to set the parameter grid for the years and data types we want to
+download data for. So, let’s create an entry in the data catalog
+specifically for the download task.
+
+A good strategy I thought about for grid parameter comprehension is to
+create a dataframe expands all the combinations of parameters, and then
+uses each combination to create the tasks which are then easily added to
+the data catalog. This way, we can still easily inspect the pipeline and
+see what tasks are being run, while also being able to easily change the
+parameters in the config file without too much hassle.
+
+An important framework decision I’m making here is that each ROW of the
+dataframe corresponds to a single task, so that we can quickly
+understand at a glance what the task is doing, and also easily develop
+the code for the task itself. This is different from the hydra approach
+where a job is first specified by a default config, and then the
+parameters are swept over in multiple config files. This is a more
+flexible approach, IMO, because:
+
+1. each row defines a single task run, so it’s easy to understand what
+ the run is doing
+2. it’s easy to add or remove runs by simply expanding the list of
+ parameters and using dataframe filters to remove irrelevant
+ parameter combinations
+3. we don’t have to independently inspect and manage multiple
+ different/overriding config files
+4. it’s all in Python, so we can use the full power of the language to
+ define the parameters and the tasks in a single sweep, not through
+ the need of hydra+snakemake multi stage/multi-lingual config system
+
+So, to do this, we define one job as a query to the CDS API that must
+contain: - The dataset (re-analysis) - The year - The month - All days
+in the month - All times of day (hour) - The geography (region), which
+will need: - The URL to the shapefile to calculate the bounding box
+
+Given one combination of all of these, a single SLURM job can complete
+the first “task” in parallel by having a run assigned to each row of the
+dataframe.
+
+
+Exported source
+
+``` python
+# Dimensions
+years = [str(x) for x in range(2009, 2025)] # 16 years
+months = [str(x).zfill(2) for x in range(1, 13)] # 12 months
+geographies = ["madagascar", "nepal"] # 2 geographies
+
+# nested values; we want ALL days, times, and variables for each job
+days = [str(x).zfill(2) for x in range(1, 32)]
+times = [f"{x:02d}:00" for x in range(24)]
+variables = ["2m_dewpoint_temperature", "2m_temperature", "total_precipitation", "volumetric_soil_water_layer_1"]
+
+product_type = "reanalysis"
+
+# Map shapefiles to geography
+shapefiles = {
+ "madagascar": "https://data.humdata.org/dataset/26fa506b-0727-4d9d-a590-d2abee21ee22/resource/ed94d52e-349e-41be-80cb-62dc0435bd34/download/mdg_adm_bngrc_ocha_20181031_shp.zip",
+ "nepal": "https://data.humdata.org/dataset/07db728a-4f0f-4e98-8eb0-8fa9df61f01c/resource/2eb4c47f-fd6e-425d-b623-d35be1a7640e/download/npl_adm_nd_20240314_ab_shp.zip"
+}
+
+# Build row-wise combinations of (year, month, geography)
+rows = []
+for year in years:
+ for month in months:
+ for geo in geographies:
+ rows.append({
+ "year": year,
+ "month": month,
+ "geography": geo,
+ "shapefile": shapefiles[geo],
+ "product_type": product_type,
+ "day": days,
+ "time": times,
+ "variables": variables,
+ "output": f"{year}_{month}_{geo}"
+ })
+
+# Create dataframe
+query_df = pd.DataFrame(rows)
+```
+
+
+
+``` python
+query_df
+```
+
+``` python
+print(f"Number of estimated jobs: {query_df.shape[0]}. Examples...")
+
+for i, row in query_df.sample(3).iterrows():
+ print(f"Year: {row['year']}, Month: {row['month']}, Geography: {row['geography']}, Link: {row['shapefile']}, Variables: {row['variables']}")
+```
+
+Now add them to the catalog. We’re going to use a dictionary to nest
+data catalogs so that we can return specific task products to named data
+catalog nodes.
+
+Our data catalog now has a `download|jobs` node with a `queries_df`
+entry that contains the dataframe of all the jobs to be run in this
+task.
+
+``` python
+data_catalog['download']['jobs']['queries_df'].load().head()
+```
+
+## The Aggregation Task
+
+To carry out the aggregation, we will follow similar logic to the
+original pipeline and use xarray to aggregate data into spatial and
+temporal averages. The aggregation task will take the downloaded data
+and compute the mean over the specified time period and spatial region.
+However, in this case, we want to aggregate the data diurnally, so we
+will need to fetch the sundown and sunrise times for the region and use
+them to compute the diurnal averages.
+
+Once again, we will use a dataframe to define the parameters for the
+aggregation task.
+
+Here we will use a dataframe with the jobs as rows; the first column is
+“input” which is the list of query names from the download task, and the
+last column is the output object name. Columns in between can be the
+parameters needed for the aggregation task, which then get expanded to
+the full list of jobs with `itertools.product`, `explode` or similar,
+and filtered as necessary.
+
+For explanations of the parameters, see the Aggregation Task notebook’s
+final `task_aggregate_data_diurnal` function.
+
+
+Exported source
+
+``` python
+inputs = query_df["output"].tolist()
+outputs = [f"{i}_agg" for i in inputs]
+
+variable_dict = {
+ "2m_dewpoint_temperature": "d2m",
+ "2m_temperature": "t2m",
+ "total_precipitation": "tp",
+ "volumetric_soil_water_layer_1": "swvl1"
+}
+
+# list of params that get fed into the task functions
+agg_params = {
+ "time": ["day", "night"],
+ "solar_classification": ["before"],
+ "variables": variables,
+ "variables_short": [variable_dict[x] for x in variables],
+ "aggregation_name": ["mean", "sum", "max", "min"]
+}
+
+from itertools import product
+import pandas as pd
+
+# expand all the params
+agg_params = pd.DataFrame(list(product(*agg_params.values())), columns=agg_params.keys())
+```
+
+
+
+Inspecting it:
+
+``` python
+agg_params
+```
+
+Let’s keep only rows where the variables and variables_short match
+
+
+Exported source
+
+``` python
+agg_params = agg_params[agg_params.apply(lambda x: variable_dict[x['variables']] == x['variables_short'], axis=1)]
+```
+
+
+
+``` python
+agg_params
+```
+
+Great, and now keeping `sum` only for total precipitation (we don’t need
+mean, max, min for that variable), and removing `sum` for all other
+variables (we don’t need sum for temperature or soil moisture):
+
+
+Exported source
+
+``` python
+mask = (agg_params['variables_short'] == "tp") & (agg_params['aggregation_name'] != "sum")
+agg_params = agg_params[~mask]
+
+# remove rows where non-tp aggregation is sum
+mask = (agg_params['variables_short'] != "tp") & (agg_params['aggregation_name'] == "sum")
+agg_params = agg_params[~mask]
+```
+
+
+
+``` python
+agg_params
+```
+
+Now we add the input and output columns by joining:
+
+
+Exported source
+
+``` python
+inputs = pd.DataFrame({"input": inputs})
+aggregate_jobs = inputs.merge(agg_params, how="cross")
+```
+
+
+
+This result gives us the full list of jobs for the aggregation task. 20
+rows for the parameters, and 384 inputs/outputs, giving a total of 7680
+jobs:
+
+``` python
+assert aggregate_jobs.shape[0] == 20 * len(inputs)
+aggregate_jobs
+```
+
+A few more configuration items need to be added, like the local timezone
+for each geography, the healthshed filename, the healthshed unique ID
+variable name in the shapefile, and whether the variable is
+instantaneous or accumulated:
+
+
+Exported source
+
+``` python
+aggregate_jobs['local_tz'] = aggregate_jobs['input'].apply(
+ lambda x: "Asia/Kathmandu" if "nepal" in x else "Indian/Antananarivo"
+)
+aggregate_jobs['shapefile'] = aggregate_jobs['input'].apply(
+ lambda x: "Nepal_Healthsheds2024.zip" if "nepal" in x else "healthsheds2022.zip"
+)
+
+aggregate_jobs['hshd_unique_id'] = aggregate_jobs['input'].apply(
+ lambda x: "fid" if "nepal" in x else "fs_uid"
+)
+
+aggregate_jobs['climate_handler_var'] = aggregate_jobs['variables_short'].apply(
+ lambda x: "accum" if x == "tp" else "instant"
+)
+```
+
+
+
+``` python
+aggregate_jobs
+```
+
+Now we add this to the data catalog:
+
+
+Exported source
+
+``` python
+data_catalog['aggregate']['jobs'].add("jobs_df", aggregate_jobs)
+```
+
+
+
+Our data catalog now has an `aggregate|jobs` node with a `jobs_df` entry
+that contains the dataframe of all the jobs to be run in this task.
+
+``` python
+data_catalog['aggregate']['jobs']['jobs_df'].load().head()
+```
diff --git a/_docs/20_pytask_logger.html b/_docs/20_pytask_logger.html
new file mode 100644
index 0000000..bb3016d
--- /dev/null
+++ b/_docs/20_pytask_logger.html
@@ -0,0 +1,734 @@
+
+
+
+
+
+
+
+
+
+Logging: A simple logger to inject into pytask jobs – era5_sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
This module downloads the raw era5 data from the CDS API. It is similar to the original script, refactored for pytask.
+
+
+
We’re going to quickly refactor the pipeline to use pytask instead of hydra and snakemake. This will hopefully demonstrate a simpler and more flexible way to manage data pipelines in Python.
+
To start off, we need to create a function that queries the CDS API with one job. This function will be used to download the data for each query in the range specified in the data catalog in the config file.
+
Let’s take a look at the data catalog we created in the config module:
+
You can see the queries entry we created in the data catalog. Each query is a row of a dataframe that contains the parameters for the CDS API query.
In this way, we have a similar approach as Hydra configs, but, using the pytask data catalog, we can more easily gather the data for a specific task in structured manner entirely in Python.
This works! So now we just need to create a task_ function that pytask will recognise to parallelise the download of queries over:
+
+
How this works (with some help from GPT):
+
+
🧠 How pytask Discovers and Executes Tasks
+
When you run pytask, it automatically scans your project for Python files named task_*.py. In these files, it looks for: - Functions decorated with @task, or - Functions prefixed with task_
+
These functions are not executed immediately. Instead, pytask: 1. Imports each task_*.py module (just like Python would) 2. Registers any matching task functions as nodes in a directed acyclic graph (DAG) 3. Resolves dependencies by analyzing: - Input annotations (e.g., Annotated[x, DependsOn]) - Output declarations (e.g., return values or Product annotations) 4. Builds the DAG, where each task function is a node 5. Executes the tasks, respecting dependency order and skipping up-to-date nodes
+
So even though the task functions aren’t explicitly “run” in the Python code itself, pytask knows how and when to execute them — based on their position in the DAG.
+
+
+
🔄 How This Differs from Snakemake
+
In snakemake, you’re expected to define a series of explicitly executable rules, often using shell commands or Python scripts. You “stitch together” rules using filenames and wildcard matching.
+
In contrast: - 🐍 pytask is Python-native — tasks are just regular Python functions - ⚙️ It builds a DAG from those functions and tracks inputs/outputs automatically - 🧱 You are declaring nodes, not scripting execution
+
Think of your Python files not as scripts to run, but as a way to define and wire together declarative tasks that will be executed by the pytask engine.
+
+
Because we defined this task in a function and loop, we can easily debug a node in the DAG by simply calling it:
+
+
task_download_raw_data()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/21_pytask_download.md b/_docs/21_pytask_download.md
new file mode 100644
index 0000000..6ff9682
--- /dev/null
+++ b/_docs/21_pytask_download.md
@@ -0,0 +1,110 @@
+# Download: `download` Module as a `pytask` Task
+
+
+## task_download
+
+> This module downloads the raw era5 data from the CDS API. It is
+> similar to the original script, refactored for `pytask`.
+
+
+
+We’re going to quickly refactor the pipeline to use pytask instead of
+hydra and snakemake. This will hopefully demonstrate a simpler and more
+flexible way to manage data pipelines in Python.
+
+To start off, we need to create a function that queries the CDS API with
+one job. This function will be used to download the data for each query
+in the range specified in the data catalog in the config file.
+
+Let’s take a look at the data catalog we created in the config module:
+
+You can see the queries entry we created in the data catalog. Each query
+is a row of a dataframe that contains the parameters for the CDS API
+query.
+
+``` python
+queries = data_catalog['download']['jobs']['queries_df'].load()
+queries
+```
+
+We can test this query like we did in the original work:
+
+``` python
+example_query = queries.iloc[0]
+
+create_bounding_box(example_query['shapefile'])
+```
+
+In this way, we have a similar approach as Hydra configs, but, using the
+`pytask` data catalog, we can more easily gather the data for a specific
+task in structured manner entirely in Python.
+
+``` python
+client = cdsapi.Client()
+
+ex_bounding_box = create_bounding_box(example_query['shapefile'])
+
+request = {
+ "product_type": example_query['product_type'],
+ "variable": example_query['variables'],
+ "year": str(example_query['year']),
+ "month": str(example_query['month']),
+ "day": example_query['day'],
+ "time": example_query['time'],
+ "data_format": "netcdf",
+ "download_format": "unarchived",
+ "area": ex_bounding_box
+ }
+
+target = f"{example_query['output']}.nc"
+
+client.retrieve("reanalysis-era5-single-levels", request).download(target)
+```
+
+This works! So now we just need to create a `task_` function that pytask
+will recognise to parallelise the download of queries over:
+
+### How this works (with some help from GPT):
+
+#### 🧠 How pytask Discovers and Executes Tasks
+
+When you run pytask, it automatically scans your project for Python
+files named `task_*.py`. In these files, it looks for: - Functions
+decorated with `@task`, or - Functions prefixed with `task_`
+
+These functions are not executed immediately. Instead, `pytask`: 1.
+Imports each task\_\*.py module (just like Python would) 2. Registers
+any matching task functions as nodes in a directed acyclic graph (DAG)
+3. Resolves dependencies by analyzing: - Input annotations (e.g.,
+`Annotated[x, DependsOn]`) - Output declarations (e.g., `return` values
+or `Product` annotations) 4. Builds the DAG, where each task function is
+a node 5. Executes the tasks, respecting dependency order and skipping
+up-to-date nodes
+
+So even though the task functions aren’t explicitly “run” in the Python
+code itself, pytask knows how and when to execute them — based on their
+position in the DAG.
+
+#### 🔄 How This Differs from Snakemake
+
+In `snakemake`, you’re expected to define a series of explicitly
+executable rules, often using shell commands or Python scripts. You
+“stitch together” rules using filenames and wildcard matching.
+
+In contrast: - 🐍 pytask is Python-native — tasks are just regular
+Python functions - ⚙️ It builds a DAG from those functions and tracks
+inputs/outputs automatically - 🧱 You are declaring nodes, not scripting
+execution
+
+Think of your Python files not as scripts to run, but as a way to define
+and wire together declarative tasks that will be executed by the pytask
+engine.
+
+------------------------------------------------------------------------
+
+Because we defined this task in a function and loop, we can easily debug
+a node in the DAG by simply calling it:
+
+``` python
+task_download_raw_data()
+```
diff --git a/_docs/22_pytask_aggregate.html b/_docs/22_pytask_aggregate.html
new file mode 100644
index 0000000..221b794
--- /dev/null
+++ b/_docs/22_pytask_aggregate.html
@@ -0,0 +1,1189 @@
+
+
+
+
+
+
+
+
+
+Aggregation: The aggregation Module as a pytask Task – era5_sandbox
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Aggregation: The aggregation Module as a pytask Task
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
task_aggregate
+
+
This task aggregates the downloaded data into spatial and temporal averages. It uses xarray to compute summary statistics over the specified time period and spatial region. The aggregation is done diurnally, so we will fetch the sundown and sunrise times for the region and use them to compute the diurnal averages.
+
+
+
+
Diurnal Classification Based on Sun Position
+
To do diurnal classificaiton, we will need to fetch the sundown and sunrise times for the region and use them to compute the diurnal averages. We will use the astral library to get the sunrise and sunset times for the specified latitude and longitude. The aggregation will be done using xarray, which allows us to compute the mean over the specified time period and spatial region.
from astral import Observer, sun
+import pandas as pd
+import numpy as np
+from tqdm import tqdm
+import random
+import datetime
+from pytz import UTC
+
+
+
+
# get the location of a datapoint in the dataset
+lat, long= ds.coords["latitude"].values[0], ds.coords["longitude"].values[0]
+time = ds['valid_time'].values[0]
+dt = pd.to_datetime(time, utc=True)
#fetch a random time from valid_time
+options = ds['valid_time'].values
+
+random_time = random.choice(options)
+dt = pd.to_datetime(random_time, utc=True)
+sun_info = sun.sun(observer, date=dt)
+if dt < sun_info['sunrise']:
+print(f"Randomly selected time: {dt} is pre_dawn")
+elif dt >= sun_info['sunrise'] and dt < sun_info['sunset']:
+print(f"Randomly selected time: {dt} is day")
+else:
+print(f"Randomly selected time: {dt} is post_dusk")
+
+
This tells us that we can use the valid time for the specific location of each data point in the query and know based on the sun whether it was daytime or nighttime. The runtime will be limited only by the looping. Let’s put this in a function so that we can use the resampling in xarray.
+
The resampling approach will be a single function that can resample in three ways:
+
+
By calendar date, default (1 value per calendar date)
+
By diurnal class by calendar date (3 values, pre-dawn, day, post-dusk)
+
By solar date (2 values per calendar date, with night classified as “before” or “after”)
+
+
Therefore, we’ll need 2 internal functions; one to do diurnal, and one to do solar date bins.
+
Essentially, we are going to create an array-shaped index/mask, (time, latitude, longitude). As a demonstration, this loop goes through the first 24 time points in the dataset, and calculates the sun info for each latitude and longitude, assigning the values to an array:
+
+
times = ds['valid_time'].values[:24]
+lats = ds.coords['latitude'].values
+lons = ds.coords['longitude'].values
+
+result = np.full((len(times), len(lats), len(lons)), "", dtype=object)
+
+for i, dt inenumerate(times):
+
+for j, lat inenumerate(lats):
+
+for k, lon inenumerate(lons):
+
+# set the geographical position
+ observer = Observer(latitude=lat, longitude=lon, elevation=0)
+
+# use the time
+ dt = pd.to_datetime(dt, utc=True)
+
+# where/when is the sun at this time for this position
+ sun_info = sun.sun(observer, date=dt)
+ result[i, j, k] = sun_info
+
+
So we know that in the first hour, the sun goes up and comes down at slightly different times based on latitude and longitude. Take the first hour, for example:
+
+
print(result.shape)
+hour_1 =0# 0th index of the results
+
+min_lat =0
+min_lon =0
+max_lat =48
+max_lon =90
+print(f"Even though the reading came from the first HOUR of data UTC, the sun info at the minimum latitude/longitude is: {result[hour_1, min_lat, min_lon]}")
+
+print(f"this is different from the sun info at the maximum latitude/longitude is: {result[hour_1, max_lat, max_lon]}")
Compute the diurnal value for each data point in the dataset. This function iterates over each data point in the dataset, calculates the sunrise and sunset times for the given time, latitude and longitude, and returns whether or not that data point is before dawn, during the day, or after dusk.
+
+
ex=compute_diurnal_class_bins(ds)
+
+
So, for our 720 time points, we should find that if we take the set() of all the classifications within that slice, there should be a few of them with 2 classes. In other words, at any given hour, almost all of the readings are “day”, because it is daytime across all of Madagascar, but at certain timepoints, the sun is rising or setting in the northern part of the country and so some portion of the slice is classified differently:
+
+
+
+illustrated
+
+
+
+
for x inrange(720):
+print(set(ex[x].flatten()))
+
+
This works! Now we can do a similar, but slightly more complicated function to define “night” and “day”, where “night” includes all of the values after the sun goes down.
Compute the diurnal value for each data point in the dataset. This function iterates over each data point in the dataset, calculates the sunrise and sunset times for the given time, latitude and longitude, and returns whether or not that data point is daytime or nighttime. The definition of “nighttime” can be set to be all the darkness before the sun came up (before), or all the darkness after it went down (after).
+
+
+Exported source
+
def compute_solar_day_night_class_bins(
+ ds: xr.Dataset,
+ night_direction: Literal["before", "after"],
+ )->list:
+"""
+ Compute the diurnal value for each data point in the dataset.
+ This function iterates over each data point in the dataset,
+ calculates the sunrise and sunset times for the given time, latitude and longitude,
+ and returns whether or not that data point is daytime or nighttime.
+ The definition of "nighttime" can be set to be all the darkness before the sun
+ came up (before), or all the darkness after it went down (after).
+ """
+
+ times = ds['valid_time'].values
+ lats = ds.coords['latitude'].values
+ lons = ds.coords['longitude'].values
+
+ result = np.full((len(times), len(lats), len(lons)), "", dtype=object)
+ datetimes = np.full((len(times), len(lats), len(lons)), "", dtype=object)
+
+for i, dt inenumerate(tqdm(times, desc="Classifying data points by sun position")):
+# use the time
+ dt = pd.to_datetime(dt, utc=True)
+
+for j, lat inenumerate(lats):
+
+for k, lon inenumerate(lons):
+
+# set the geographical position
+ observer = Observer(latitude=lat, longitude=lon, elevation=0)
+if night_direction =="before":
+# Night is from previous sunset to today's sunrise
+ sun_today = sun.sun(observer, date=dt.date())
+ sun_prev = sun.sun(observer, date=(dt - pd.Timedelta(days=1)).date())
+ night_start = sun_prev["sunset"].astimezone(pd.Timestamp.utcnow().tz)
+ night_end = sun_today["sunrise"].astimezone(pd.Timestamp.utcnow().tz)
+
+# the reading is from yesterday's nighttime
+if night_start <= dt < night_end:
+ result[i, j, k] ="night"
+# the date counts as today
+ datetimes[i, j, k] = dt.date()
+
+# the reading is from daytime
+elif sun_today["sunrise"] <= dt < sun_today["sunset"]:
+ result[i, j, k] ="day"
+# the date counts as today
+ datetimes[i, j, k] = dt.date()
+
+# the reading is from today's nighttime, but counts as tomorrow's night
+else:
+ result[i, j, k] ="night"
+# the date is tomorrow
+ datetimes[i, j, k] = (dt + pd.Timedelta(days=1)).date()
+
+elif night_direction =="after":
+# Night is from today's sunset to next sunrise
+ sun_today = sun.sun(observer, date=dt.date())
+ sun_next = sun.sun(observer, date=(dt + pd.Timedelta(days=1)).date())
+ night_start = sun_today["sunset"].astimezone(pd.Timestamp.utcnow().tz)
+ night_end = sun_next["sunrise"].astimezone(pd.Timestamp.utcnow().tz)
+
+# the reading is from daytime
+if sun_today["sunrise"] <= dt < sun_today["sunset"]:
+ result[i, j, k] ="day"
+# the date counts as today
+ datetimes[i, j, k] = dt.date()
+# the reading is from tonight
+elif night_start <= dt < night_end:
+ result[i, j, k] ="night"
+# the date counts as today
+ datetimes[i, j, k] = dt.date()
+
+# the reading is from yesterday night
+else:
+# the date counts as yesterday
+ result[i, j, k] ="day"
+ datetimes[i, j, k] = (dt - pd.Timedelta(days=1)).date()
+else:
+raiseValueError(f"Invalid night_direction: {night_direction}")
+
+return result, datetimes
As before, we should see that most slices are homogenous, meaning most of the time, all the readings are from the day, but some slices should have day and night values:
+
+
for slice_ inrange(720):
+print(set(ex_class[slice_].flatten()))
+
+
The returned array can serve as new “variable indexes” for the dataset:
Looks great! These two rasters represent one calendar day of daytime and nighttime values.
+
+
Testing Polygon to Raster Cells & Healthshed Aggregation
+
The penultimate step of the aggregate pipeline in the original version is assigning each datapoint to the respective healthshed. The vectors argument comes from the healthshed, and represents each geographic polygon on the ground that we want to aggregate data to.
res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=raster_day.data, # the raster data above
+ nodata=np.nan, # any intersections with no data, may have to be np.nan
+ affine=raster_day.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+
+
This works fine. Finally, we aggregate to healthsheds:
+
+
from era5_sandbox.aggregate import aggregate_to_healthsheds
Below shows the result of aggregating the daytime dewpoint temperature to the healthshed level:
+
+
result_day
+
+
+
result_night
+
+
So from one input, we will have two outputs, one for daytime and one for nighttime, and this will have to loop over the bands (ie each day in the month).
+
+
+
+
+
Putting it all together in a pytask task
+
Below we define our pytask task to aggregate data to the healthshed level.
+
+
+Exported source
+
job_rows = data_catalog['aggregate']['jobs']['jobs_df'].load()
+
+aggregation_funcs = {
+"mean": np.nanmean,
+"sum": np.nansum,
+"max": np.nanmax,
+"min": np.nanmin
+}
+
+for i, job in job_rows.iterrows():
+#print(f"Job {i+1}: variable={job['variables']}, time={job['time']}, aggregation={job['aggregation_name']}")
+
+# parse the row into function parameters
+ input_file = data_catalog['download']['outputs'][job['input']]
+ solar_classification = job['solar_classification']
+ variable = job['variables_short']
+ time = job['time']
+ aggregation_func = aggregation_funcs[job['aggregation_name']]
+ aggregation_name = job['aggregation_name']
+
+ climate_handler_var = job['climate_handler_var']
+ local_tz = job['local_tz']
+
+ shapefile = job['shapefile']
+ hshd_unique_id = job['hshd_unique_id']
+
+ output_file = job['input'] +"_"+ job['time'] +"_"+ job['variables_short'] +"_"+ job['aggregation_name'] +".parquet"
+
+@task(id=output_file, name=f"Aggregate {output_file}", after="task_download_raw_data")
+def task_aggregate_data_diurnal(
+ input_file: Path = data_catalog['download']['outputs'][job['input']], # input data Path from the download task
+ aggregation_func: callable= aggregation_func, # the aggregation function
+ aggregation_name: str= aggregation_name, # the name of the aggregation function
+ time: Literal["day", "night"] = time, # whether to aggregate by day or night
+ night_direction: Literal["before", "after"] = solar_classification, # how to define night
+ variable: str= variable, # the variable to aggregate,
+ climate_handler_var: Literal["instant", "accum"] = climate_handler_var, # whether the variable is instant or accum,
+ local_tz: str= local_tz, # the local timezone for resampling
+ shapefile: str= shapefile, # the shapefile for the healthsheds,
+ hshd_unique_id: str= hshd_unique_id, # the unique id column in the shapefile,
+ output_file: str= output_file # the output file name
+ ) -> Annotated[Path, data_catalog['aggregate']['outputs'][output_file]]:
+"""
+ Task to aggregate data from a CDSAPI Query to the healthshed
+ level. Returns path to parquet file with aggregated data.
+ """
+
+ logger = setup_logger(output_file)
+
+ logger.info(f"Aggregating: {output_file}")
+
+# check if the string path exists
+# if os.path.exists(output_file):
+# logger.info(f"File {output_file} already exists. Skipping aggregation.")
+# return output_file
+
+# get input data
+ logger.info("Reading input data...")
+with ClimateDataFileHandler(input_file) as handler:
+ ds = xr.open_dataset(handler.get_dataset('instant'))
+
+#get the healthshed shapefile
+ logger.info(f"Reading healthshed shapefile from yaml {here()}...")
+withopen(here() /"conf"/"config.yaml") as f:
+ healthshed_config = yaml.safe_load(f)
+
+ key_path = here() / healthshed_config['GOOGLE_DRIVE_AUTH_JSON']['path']
+
+ driver = GoogleDriver(json_key_path=key_path)
+ drive = driver.get_drive()
+ healthsheds = driver.read_healthsheds(shapefile)
+
+# compute the diurnal classification bins
+ logger.info("Computing diurnal classification bins...")
+ class_bins, class_dts = compute_solar_day_night_class_bins(ds, night_direction)
+
+ ds_masked = ds.copy()
+
+# assign classifications
+ logger.info("Assigning classification bins to dataset...")
+ ds['solar_class'] = (('valid_time', 'latitude', 'longitude'), class_bins)
+ ds["solar_date"] = (("valid_time", "latitude", "longitude"), class_dts)
+
+# mask the dataset to the requested time
+ mask = ds["solar_class"] == time
+ ds_masked = ds_masked.where(mask)
+
+# set the local timezone
+ ds_masked = ds_masked.assign_coords(valid_time=pd.to_datetime(ds["valid_time"].values).tz_localize("UTC").tz_convert(local_tz))
+
+# resample by local date
+ logger.info("Resampling by local date...")
+ ds_rs = ds_masked.resample(valid_time="1D").reduce(aggregation_func)
+
+# convert to tiff
+ logger.info("Rasterizing resampled data...")
+ n_bands = ds_rs.dims['valid_time']
+
+# polygon to raster cells for the first band
+ logger.info("Converting polygons to raster cells...")
+ raster = netcdf_to_tiff(ds_rs, band=1, variable=variable)
+ res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=raster.data, # the raster data above
+ nodata=np.nan, # any intersections with no data, may have to be np.nan
+ affine=raster.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+ )
+
+ result_df = healthsheds[[hshd_unique_id, "geometry"]].copy()
+
+# loop over bands and aggregate to healthsheds
+for band in tqdm(range(1, n_bands +1)):
+ logger.info(f"Processing band {band} of {n_bands}...")
+
+ day = band # band is 1-indexed
+
+ day_col =f"day_{day:02d}"
+
+# calculate raster for this band
+ raster = netcdf_to_tiff(ds_rs, band=band, variable=variable)
+
+# aggregate to healthsheds
+ result = aggregate_to_healthsheds(
+ res_poly2cell=res_poly2cell,
+ raster=raster,
+ shapes=healthsheds,
+ names_column=hshd_unique_id,
+ aggregation_func=aggregation_func,
+ aggregation_name=variable
+ )
+
+# add band to result dataframe
+ result_df[day_col] = result[variable]
+
+# save to parquet
+ result_df.to_parquet(f"{BLD}/{output_file}")
+
+ logger.info("Aggregation complete.")
+
+return Path(f"{BLD}/{output_file}")
+
+
+
That should wrap it up! To test, we can run a single job:
+
+
# runs the last defined job only
+task_aggregate_data_diurnal()
This package documents the development and implementation of functions and code for the Madagascar ERA5 dataset project. The goal is for exposure data to be made available at the daily resolution when possible. Finer resolutions shouldn’t ever be needed for our purposes, and it should then be relatively easy to aggregate at coarser resolutions, such as weekly or monthly. Additionally, we’ve extended this work to Nepal as well.
+
Variables should generally be made available from 2010 onward, as that’s where our clinic data starts.
+
All data are ideally made available at the “healthshed” geographical level. Healthsheds are defined as geographical areas where people who live all go to the same clinic. There are a total of ~2700 public clinics in Madagascar, hence ~2700 healthsheds, with each healthshed containing ~10000 people on average.
+
Preliminary list of environmental variables
+
+
+
+
+
+
+
Variables from other sources:
+
+
+
+
+
+
+
+
+
+
+
+
+
Those from the ERA5 dataset will be housed here, but we may likely develop a separate repository for the other datasets.
+
+
+
Developer Guide
+
This package is built and maintained with nbdev. If you are new to using nbdev here are some useful pointers to get you started.
+
+
Install era5_sandbox in Development mode
+
# make sure era5_sandbox package is installed in development mode
+$ pip install -e .
+
To make changes, go to the “notes” directory and edit the notebooks as necessary. Each notebook refers to a module in the era5_sandbox package. Cells are exported to the module when the notebook is saved and you run the following command:
+
$ nbdev_export
+
For e.g., to change functionality of the testAPI() function in the testAPI Hydra rule, you would edit the testAPI notebook in the notes directory notes/testAPI.ipynb, and then save that notebook and run nbdev_export to update the core module in the package.
+
+
+
How to Run the Pipeline
+
The pipeline downloads ERA5 variables for a given date range and geographical bounding box. You can learn how each of these steps was by following the notebooks in notes in numerical order.
+
+
+
+
+
+
+Important
+
+
+
+
The pipeline has two implementations: one using snakemake and hydra, and another using pytask. The pytask implementation is the more recent one, and is recommended for future use. The snakemake implementation is left here for reference to legacy code.
+
+
+
+
Using pytask
+
To run the pipeline, the pytask config at note/20_pytask_config.qmd should be reviewed and updated if necessary. The pipeline can then be run with the following command:
+
$ sbatch pytask.sbatch
+
+
+
Using snakemake and hydra
+
To run the pipeline, the config at config/config.yaml should be updated with the desired date range and geographical bounding box. The pipeline can then be run with the following command:
+
sbatch snakemake.sbatch
+
+
+
+
What Does the Pipeline Produce?
+
Using pytask’s data catalog, you can investigate the downloaded raw data with python, eg.:
European Centre for Medium-Range Weather Forecasts
GRIB_subCentre :
0
Conventions :
CF-1.7
institution :
European Centre for Medium-Range Weather Forecasts
history :
2025-09-16T20:55 GRIB to CDM+CF via cfgrib-0.9.15.0/ecCodes-2.42.0 with {"source": "data.grib", "filter_by_keys": {}, "encode_cf": ["parameter", "time", "geography", "vertical"]}
+
+
+
And plot it with cartopy, eg.:
+
+
import matplotlib.pyplot as plt
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
+
+temperature = ds["t2m"]
+
+# Select a specific time step
+temperature_at_time = temperature.isel(valid_time=0)
+
+# Plot the data on a map
+plt.figure(figsize=(12, 8))
+ax = plt.axes(projection=ccrs.PlateCarree())
+temperature_at_time.plot(ax=ax, cmap="coolwarm", transform=ccrs.PlateCarree(), cbar_kwargs={"label": "Temperature (K)"})
+ax.coastlines()
+ax.add_feature(cfeature.BORDERS, linestyle=":")
+ax.set_title("Temperature at Time Step 0")
+plt.show()
+
+
+
+
+
+
+
+
+
You can also load the aggregated data:
+
+
import pandas as pd
+import geopandas as gpd
+from era5_sandbox.config import data_catalog
+
+ex_agg_path = data_catalog['aggregate']['outputs']['2019_08_madagascar_night_d2m_max.parquet'].load()
+
+gpd.read_parquet(ex_agg_path).describe()
+
+
+
+
+
+
+
+
+
day_01
+
day_02
+
day_03
+
day_04
+
day_05
+
day_06
+
day_07
+
day_08
+
day_09
+
day_10
+
day_11
+
day_12
+
day_13
+
day_14
+
day_15
+
day_16
+
day_17
+
day_18
+
day_19
+
day_20
+
day_21
+
day_22
+
day_23
+
day_24
+
day_25
+
day_26
+
day_27
+
day_28
+
day_29
+
day_30
+
day_31
+
day_32
+
+
+
+
+
count
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
+
+
mean
+
290.493048
+
290.145274
+
288.953153
+
288.503714
+
288.439820
+
288.304426
+
286.940995
+
287.186512
+
287.453656
+
287.843029
+
288.301938
+
288.778014
+
288.813762
+
288.667253
+
288.796892
+
288.547945
+
288.197632
+
287.882440
+
287.659818
+
289.291587
+
289.911503
+
288.760939
+
288.257644
+
288.271450
+
287.746390
+
288.379399
+
288.504720
+
287.665699
+
288.149861
+
288.266861
+
288.644028
+
288.224829
+
+
+
std
+
2.616922
+
2.832083
+
3.215642
+
3.566019
+
4.401416
+
4.198817
+
5.235795
+
4.444031
+
4.346305
+
3.435444
+
2.735781
+
2.864494
+
2.841268
+
3.080593
+
3.306217
+
2.938165
+
3.018303
+
2.849850
+
2.817690
+
2.600946
+
2.584079
+
3.161855
+
3.171827
+
2.983778
+
3.223380
+
2.918867
+
2.844314
+
3.052635
+
3.077292
+
3.093706
+
3.335983
+
3.296264
+
+
+
min
+
284.295898
+
281.673340
+
280.566406
+
280.509521
+
277.348145
+
279.243164
+
274.955078
+
274.682129
+
275.397461
+
279.498291
+
282.339111
+
282.188721
+
282.470703
+
281.371582
+
280.724609
+
280.093506
+
280.849121
+
281.123535
+
281.952148
+
282.186768
+
284.168945
+
282.519287
+
282.015381
+
280.578857
+
281.183838
+
281.146973
+
281.977539
+
281.014648
+
280.787842
+
281.631348
+
281.349854
+
280.615967
+
+
+
25%
+
288.031494
+
287.739014
+
286.978271
+
285.750488
+
284.326904
+
284.071289
+
281.695068
+
283.710449
+
284.153076
+
285.459717
+
286.141846
+
286.444092
+
286.505859
+
286.104004
+
286.114014
+
286.730225
+
286.005371
+
285.420166
+
285.230713
+
287.408203
+
287.744873
+
286.101318
+
285.243652
+
285.488281
+
285.170166
+
285.876465
+
286.145508
+
285.243164
+
285.579346
+
285.322754
+
285.930908
+
285.565186
+
+
+
50%
+
290.674316
+
290.331543
+
288.916260
+
288.472168
+
289.635742
+
289.390381
+
288.382568
+
287.926758
+
288.173096
+
287.859375
+
287.797852
+
288.716064
+
288.806641
+
288.789307
+
289.210938
+
288.769287
+
288.085205
+
287.698975
+
287.252930
+
289.310547
+
289.878418
+
288.511719
+
288.420166
+
288.263916
+
287.717041
+
288.661621
+
288.999023
+
287.485107
+
288.326416
+
288.429199
+
288.576416
+
288.093018
+
+
+
75%
+
292.828369
+
292.707764
+
291.609375
+
291.655762
+
291.987305
+
291.845459
+
291.671631
+
291.051758
+
291.288574
+
291.000244
+
290.813721
+
291.365967
+
291.540039
+
291.393799
+
291.756592
+
291.094727
+
290.893311
+
290.266602
+
290.166748
+
291.649902
+
291.970459
+
291.342285
+
290.443848
+
290.660400
+
290.400146
+
290.360840
+
290.854004
+
290.328125
+
290.827881
+
290.999268
+
291.598877
+
291.072754
+
+
+
max
+
296.467285
+
295.717529
+
295.837158
+
295.693604
+
295.723389
+
296.195557
+
295.589600
+
295.345703
+
294.754639
+
294.483154
+
294.952148
+
294.815430
+
294.623779
+
295.088135
+
295.036621
+
294.847900
+
294.224609
+
294.522949
+
294.728760
+
295.268066
+
295.507324
+
295.797363
+
296.297119
+
296.222900
+
295.492432
+
295.406006
+
294.629883
+
295.211670
+
295.363037
+
295.263184
+
295.446533
+
295.408691
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/_docs/index.md b/_docs/index.md
new file mode 100644
index 0000000..97efafe
--- /dev/null
+++ b/_docs/index.md
@@ -0,0 +1,928 @@
+# The ERA5 Spatial Aggregation Pipeline
+
+
+
+
+``` python
+from era5_sandbox.core import *
+```
+
+## era5_sandbox
+
+> Sandbox environment for era5 development
+
+This package documents the development and implementation of functions
+and code for the Madagascar ERA5 dataset project. The goal is for
+exposure data to be made available at the daily resolution when
+possible. Finer resolutions shouldn’t ever be needed for our purposes,
+and it should then be relatively easy to aggregate at coarser
+resolutions, such as weekly or monthly. Additionally, we’ve extended
+this work to Nepal as well.
+
+Variables should generally be made available from 2010 onward, as that’s
+where our clinic data starts.
+
+All data are ideally made available at the “healthshed” geographical
+level. Healthsheds are defined as geographical areas where people who
+live all go to the same clinic. There are a total of ~2700 public
+clinics in Madagascar, hence ~2700 healthsheds, with each healthshed
+containing ~10000 people on average.
+
+Preliminary list of environmental variables
+
+- ☒ 2-m air temperature from ERA5: daily min, max, mean
+
+- ☒ 2-m air dew point temperature from ERA5: daily min, max, mean
+
+- ☒ Precipitation: daily total (ERA5)
+
+- ☒ Soil moisture: daily average (ERA5)
+
+Variables from other sources:
+
+- ☐ Sea surface temperature: daily average and maximum in the nearest
+ neighbor for each healthshed.
+
+- ☐ Precipitation: daily total (CHIRPS)
+
+- ☐ Chlorophyll-A (Giacomo)
+
+- ☐ Wealth index: Available from Giacomo
+
+- ☐ NDVI
+
+- ☐ Tropical storm
+
+- ☐ Flooding
+
+- ☐ Deforestation
+
+- ☐ Linking/segmenting healthsheds into climate zones and other
+
+- ☐ Relative humidity: daily average (lower priority)
+
+Those from the ERA5 dataset will be housed here, but we may likely
+develop a separate repository for the other datasets.
+
+## Developer Guide
+
+This package is built and maintained with `nbdev`. If you are new to
+using `nbdev` here are some useful pointers to get you started.
+
+### Install era5_sandbox in Development mode
+
+``` sh
+# make sure era5_sandbox package is installed in development mode
+$ pip install -e .
+```
+
+To make changes, go to the “notes” directory and edit the notebooks as
+necessary. Each notebook refers to a module in the era5_sandbox package.
+Cells are exported to the module when the notebook is saved and you run
+the following command:
+
+``` sh
+$ nbdev_export
+```
+
+For e.g., to change functionality of the
+[`testAPI()`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi)
+function in the testAPI Hydra rule, you would edit the
+[`testAPI`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi)
+notebook in the `notes` directory `notes/testAPI.ipynb`, and then save
+that notebook and run `nbdev_export` to update the `core` module in the
+package.
+
+### How to Run the Pipeline
+
+The pipeline downloads ERA5 variables for a given date range and
+geographical bounding box. You can learn how each of these steps was by
+following the notebooks in `notes` in numerical order.
+
+
+
+> **Important**
+>
+> The pipeline has two implementations: one using `snakemake` and
+> `hydra`, and another using `pytask`. The `pytask` implementation is
+> the more recent one, and is recommended for future use. The
+> `snakemake` implementation is left here for reference to legacy code.
+
+
+
+#### Using `pytask`
+
+To run the pipeline, the `pytask` config at `note/20_pytask_config.qmd`
+should be reviewed and updated if necessary. The pipeline can then be
+run with the following command:
+
+``` sh
+$ sbatch pytask.sbatch
+```
+
+#### Using `snakemake` and `hydra`
+
+To run the pipeline, the config at `config/config.yaml` should be
+updated with the desired date range and geographical bounding box. The
+pipeline can then be run with the following command:
+
+``` sh
+sbatch snakemake.sbatch
+```
+
+### What Does the Pipeline Produce?
+
+Using `pytask`’s data catalog, you can investigate the downloaded raw
+data with python, eg.:
+
+``` python
+import xarray as xr
+from era5_sandbox.config import data_catalog
+from era5_sandbox.core import ClimateDataFileHandler
+
+ex_nc = list(data_catalog['download']['outputs']._entries).pop()
+ex_nc_path = data_catalog['download']['outputs'][ex_nc].load()
+
+with ClimateDataFileHandler(ex_nc_path) as handler:
+ ds = xr.open_dataset(handler.get_dataset("instant"))
+
+ds
+```
+
+
European Centre for Medium-Range Weather Forecasts
GRIB_subCentre :
0
Conventions :
CF-1.7
institution :
European Centre for Medium-Range Weather Forecasts
history :
2025-09-16T20:55 GRIB to CDM+CF via cfgrib-0.9.15.0/ecCodes-2.42.0 with {"source": "data.grib", "filter_by_keys": {}, "encode_cf": ["parameter", "time", "geography", "vertical"]}
+```
+
+:::
+:::
+
+
+And plot it with cartopy, eg.:
+
+::: {#cell-6 .cell exec_doc='null'}
+``` {.python .cell-code}
+import matplotlib.pyplot as plt
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
+
+temperature = ds["t2m"]
+
+# Select a specific time step
+temperature_at_time = temperature.isel(valid_time=0)
+
+# Plot the data on a map
+plt.figure(figsize=(12, 8))
+ax = plt.axes(projection=ccrs.PlateCarree())
+temperature_at_time.plot(ax=ax, cmap="coolwarm", transform=ccrs.PlateCarree(), cbar_kwargs={"label": "Temperature (K)"})
+ax.coastlines()
+ax.add_feature(cfeature.BORDERS, linestyle=":")
+ax.set_title("Temperature at Time Step 0")
+plt.show()
+```
+
+::: {.cell-output .cell-output-display}
+{width=897 height=640}
+:::
+:::
+
+
+You can also load the aggregated data:
+
+::: {#cell-8 .cell exec_doc='null'}
+``` {.python .cell-code}
+import pandas as pd
+import geopandas as gpd
+from era5_sandbox.config import data_catalog
+
+ex_agg_path = data_catalog['aggregate']['outputs']['2019_08_madagascar_night_d2m_max.parquet'].load()
+
+gpd.read_parquet(ex_agg_path).describe()
+```
+
+::: {.cell-output .cell-output-display}
+
+```{=html}
+
+
+
+
+
+
+
day_01
+
day_02
+
day_03
+
day_04
+
day_05
+
day_06
+
day_07
+
day_08
+
day_09
+
day_10
+
day_11
+
day_12
+
day_13
+
day_14
+
day_15
+
day_16
+
day_17
+
day_18
+
day_19
+
day_20
+
day_21
+
day_22
+
day_23
+
day_24
+
day_25
+
day_26
+
day_27
+
day_28
+
day_29
+
day_30
+
day_31
+
day_32
+
+
+
+
+
count
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
2701.000000
+
+
+
mean
+
290.493048
+
290.145274
+
288.953153
+
288.503714
+
288.439820
+
288.304426
+
286.940995
+
287.186512
+
287.453656
+
287.843029
+
288.301938
+
288.778014
+
288.813762
+
288.667253
+
288.796892
+
288.547945
+
288.197632
+
287.882440
+
287.659818
+
289.291587
+
289.911503
+
288.760939
+
288.257644
+
288.271450
+
287.746390
+
288.379399
+
288.504720
+
287.665699
+
288.149861
+
288.266861
+
288.644028
+
288.224829
+
+
+
std
+
2.616922
+
2.832083
+
3.215642
+
3.566019
+
4.401416
+
4.198817
+
5.235795
+
4.444031
+
4.346305
+
3.435444
+
2.735781
+
2.864494
+
2.841268
+
3.080593
+
3.306217
+
2.938165
+
3.018303
+
2.849850
+
2.817690
+
2.600946
+
2.584079
+
3.161855
+
3.171827
+
2.983778
+
3.223380
+
2.918867
+
2.844314
+
3.052635
+
3.077292
+
3.093706
+
3.335983
+
3.296264
+
+
+
min
+
284.295898
+
281.673340
+
280.566406
+
280.509521
+
277.348145
+
279.243164
+
274.955078
+
274.682129
+
275.397461
+
279.498291
+
282.339111
+
282.188721
+
282.470703
+
281.371582
+
280.724609
+
280.093506
+
280.849121
+
281.123535
+
281.952148
+
282.186768
+
284.168945
+
282.519287
+
282.015381
+
280.578857
+
281.183838
+
281.146973
+
281.977539
+
281.014648
+
280.787842
+
281.631348
+
281.349854
+
280.615967
+
+
+
25%
+
288.031494
+
287.739014
+
286.978271
+
285.750488
+
284.326904
+
284.071289
+
281.695068
+
283.710449
+
284.153076
+
285.459717
+
286.141846
+
286.444092
+
286.505859
+
286.104004
+
286.114014
+
286.730225
+
286.005371
+
285.420166
+
285.230713
+
287.408203
+
287.744873
+
286.101318
+
285.243652
+
285.488281
+
285.170166
+
285.876465
+
286.145508
+
285.243164
+
285.579346
+
285.322754
+
285.930908
+
285.565186
+
+
+
50%
+
290.674316
+
290.331543
+
288.916260
+
288.472168
+
289.635742
+
289.390381
+
288.382568
+
287.926758
+
288.173096
+
287.859375
+
287.797852
+
288.716064
+
288.806641
+
288.789307
+
289.210938
+
288.769287
+
288.085205
+
287.698975
+
287.252930
+
289.310547
+
289.878418
+
288.511719
+
288.420166
+
288.263916
+
287.717041
+
288.661621
+
288.999023
+
287.485107
+
288.326416
+
288.429199
+
288.576416
+
288.093018
+
+
+
75%
+
292.828369
+
292.707764
+
291.609375
+
291.655762
+
291.987305
+
291.845459
+
291.671631
+
291.051758
+
291.288574
+
291.000244
+
290.813721
+
291.365967
+
291.540039
+
291.393799
+
291.756592
+
291.094727
+
290.893311
+
290.266602
+
290.166748
+
291.649902
+
291.970459
+
291.342285
+
290.443848
+
290.660400
+
290.400146
+
290.360840
+
290.854004
+
290.328125
+
290.827881
+
290.999268
+
291.598877
+
291.072754
+
+
+
max
+
296.467285
+
295.717529
+
295.837158
+
295.693604
+
295.723389
+
296.195557
+
295.589600
+
295.345703
+
294.754639
+
294.483154
+
294.952148
+
294.815430
+
294.623779
+
295.088135
+
295.036621
+
294.847900
+
294.224609
+
294.522949
+
294.728760
+
295.268066
+
295.507324
+
295.797363
+
296.297119
+
296.222900
+
295.492432
+
295.406006
+
294.629883
+
295.211670
+
295.363037
+
295.263184
+
295.446533
+
295.408691
+
+
+
+
+```
+
+:::
+:::
+
+
diff --git a/_proc/index.ipynb b/_proc/index.ipynb
index b608fd6..43c2671 100644
--- a/_proc/index.ipynb
+++ b/_proc/index.ipynb
@@ -1,16 +1,13 @@
{
"cells": [
{
- "cell_type": "raw",
+ "cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
- "description: Sandbox environment for era5 development\n",
- "output-file: index.html\n",
- "title: era5_sandbox\n",
- "\n",
- "---\n",
- "\n"
+ "title: \"The ERA5 Spatial Aggregation Pipeline\"\n",
+ "exec_all: true\n",
+ "---"
]
},
{
@@ -20,11 +17,27 @@
""
]
},
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "language": "python"
+ },
+ "outputs": [],
+ "source": [
+ "#| hide: null\n",
+ "from era5_sandbox.core import *"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Here we are developing functions and code for the Madagascar ERA5 dataset project. The goal is for exposure data to be made available at the daily resolution when possible. Finer resolutions shouldn’t ever be needed for our purposes, and it should then be relatively easy to aggregate at coarser resolutions, such as weekly or monthly.\n",
+ "## era5_sandbox\n",
+ "\n",
+ "> Sandbox environment for era5 development\n",
+ "\n",
+ "This package documents the development and implementation of functions and code for the Madagascar ERA5 dataset project. The goal is for exposure data to be made available at the daily resolution when possible. Finer resolutions shouldn’t ever be needed for our purposes, and it should then be relatively easy to aggregate at coarser resolutions, such as weekly or monthly. Additionally, we've extended this work to Nepal as well.\n",
"\n",
"Variables should generally be made available from 2010 onward, as that’s where our clinic data starts.\n",
"\n",
@@ -32,11 +45,15 @@
"\n",
"Preliminary list of environmental variables\n",
"\n",
- "- [ ] 2-m air temperature from ERA5: daily min, max, mean\n",
+ "- [x] 2-m air temperature from ERA5: daily min, max, mean\n",
" \n",
- "- [ ] 2-m air dew point temperature from ERA5: daily min, max, mean\n",
+ "- [x] 2-m air dew point temperature from ERA5: daily min, max, mean\n",
"\n",
- "- [ ] Precipitation: daily total (ERA5)\n",
+ "- [x] Precipitation: daily total (ERA5)\n",
+ "\n",
+ "- [x] Soil moisture: daily average (ERA5)\n",
+ "\n",
+ "Variables from other sources:\n",
"\n",
"- [ ] Sea surface temperature: daily average and maximum in the nearest neighbor for each healthshed.\n",
"\n",
@@ -56,132 +73,615 @@
"\n",
"- [ ] Linking/segmenting healthsheds into climate zones and other \n",
"\n",
- "- [ ] Relative humidity: daily average (lower priority)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Developer Guide"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If you are new to using `nbdev` here are some useful pointers to get you started."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Install era5_sandbox in Development mode"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
+ "- [ ] Relative humidity: daily average (lower priority)\n",
+ "\n",
+ "Those from the ERA5 dataset will be housed here, but we may likely develop a separate repository for the other datasets.\n",
+ "\n",
+ "## Developer Guide\n",
+ "\n",
+ "This package is built and maintained with `nbdev`. If you are new to using `nbdev` here are some useful pointers to get you started.\n",
+ "\n",
+ "### Install era5_sandbox in Development mode\n",
+ "\n",
"```sh\n",
"# make sure era5_sandbox package is installed in development mode\n",
"$ pip install -e .\n",
+ "```\n",
"\n",
- "# To make changes, go to the \"notes\" directory and edit the notebooks as necessary.\n",
- "# Each notebook refers to a module in the era5_sandbox package. Cells are exported to the module\n",
- "# when the notebook is saved and you run the following command:\n",
+ "To make changes, go to the \"notes\" directory and edit the notebooks as necessary.\n",
+ "Each notebook refers to a module in the era5_sandbox package. Cells are exported to the module\n",
+ "when the notebook is saved and you run the following command:\n",
"\n",
+ "```sh\n",
"$ nbdev_export\n",
"```\n",
"\n",
- "For e.g., to change functionality of the [`testAPI()`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi) function in the testAPI Hydra rule, you would edit the [`testAPI`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi) notebook in the `notes` directory `notes/testAPI.ipynb`, and then save that notebook and run `nbdev_export` to update the `core` module in the package."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Usage"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Installation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Install latest from the GitHub [repository][repo]:\n",
+ "For e.g., to change functionality of the [`testAPI()`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi) function in the testAPI Hydra rule, you would edit the [`testAPI`](https://TinasheMTapera.github.io/era5_sandbox/core.html#testapi) notebook in the `notes` directory `notes/testAPI.ipynb`, and then save that notebook and run `nbdev_export` to update the `core` module in the package.\n",
+ "\n",
+ "### How to Run the Pipeline\n",
+ "\n",
+ "The pipeline downloads ERA5 variables for a given date range and geographical bounding box. You can learn how each of these steps was by following the notebooks in `notes` in numerical order.\n",
+ "\n",
+ "::: {.callout-important}\n",
+ "The pipeline has two implementations: one using `snakemake` and `hydra`, and another using `pytask`. The `pytask` implementation is the more recent one, and is recommended for future use. The `snakemake` implementation is left here for reference to legacy code.\n",
+ ":::\n",
+ "\n",
+ "#### Using `pytask`\n",
+ "\n",
+ "To run the pipeline, the `pytask` config at `note/20_pytask_config.qmd` should be reviewed\n",
+ "and updated if necessary. The pipeline can then be run with the following command:\n",
"\n",
"```sh\n",
- "$ pip install git+https://github.com/NSAPH-Data-Processing/era5_sandbox\n",
+ "$ sbatch pytask.sbatch\n",
"```\n",
"\n",
- "or clone and install in development mode:\n",
+ "#### Using `snakemake` and `hydra`\n",
+ "\n",
+ "To run the pipeline, the config at `config/config.yaml` should be updated with the desired date range and geographical bounding box. The pipeline can then be run with the following command:\n",
"\n",
"```sh\n",
- "$ git clone https://github.com/NSAPH-Data-Processing/era5_sandbox\n",
- "$ pip install -e .\n",
+ "sbatch snakemake.sbatch\n",
"```\n",
"\n",
+ "### What Does the Pipeline Produce?\n",
"\n",
- "[repo]: https://github.com/NSAPH-Data-Processing/era5_sandbox"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Documentation"
+ "Using `pytask`'s data catalog, you can investigate the downloaded raw data with python, eg.:"
]
},
{
- "cell_type": "markdown",
- "metadata": {},
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "language": "python"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
European Centre for Medium-Range Weather Forecasts
GRIB_subCentre :
0
Conventions :
CF-1.7
institution :
European Centre for Medium-Range Weather Forecasts
history :
2025-09-16T20:55 GRIB to CDM+CF via cfgrib-0.9.15.0/ecCodes-2.42.0 with {"source": "data.grib", "filter_by_keys": {}, "encode_cf": ["parameter", "time", "geography", "vertical"]}
"
+ ],
+ "text/plain": [
+ " Size: 53MB\n",
+ "Dimensions: (valid_time: 744, latitude: 49, longitude: 91)\n",
+ "Coordinates:\n",
+ " number int64 8B ...\n",
+ " * valid_time (valid_time) datetime64[ns] 6kB 2024-03-01 ... 2024-03-31T23:...\n",
+ " * latitude (latitude) float64 392B 30.8 30.7 30.6 30.5 ... 26.2 26.1 26.0\n",
+ " * longitude (longitude) float64 728B 79.6 79.7 79.8 79.9 ... 88.4 88.5 88.6\n",
+ " expver (valid_time) "
+ ]
+ },
+ "metadata": {
+ "image/png": {
+ "height": 640,
+ "width": 897
+ }
+ },
+ "output_type": "display_data"
+ }
+ ],
"source": [
- "The pipeline currently downloads ERA5 temperature and dew point temperature data for a given date range and geographical bounding box. You can learn each of these steps by following the notebooks in `notes` in numerical order.\n",
- "\n",
- "To run the pipeline, the config at `config/config.yaml` should be updated with the desired date range and geographical bounding box. The pipeline can then be run with the following command:\n",
- "\n",
- "```sh\n",
- "sbatch snakemake.sbatch\n",
- "```\n",
- "\n",
- "You can investigate the downloaded raw data with python, eg.:\n",
- "\n",
- "```python\n",
- "import xarray as xr\n",
+ "#| exec_doc: #\n",
"import matplotlib.pyplot as plt\n",
"import cartopy.crs as ccrs\n",
"import cartopy.feature as cfeature\n",
"\n",
- "### the path to any of the downloaded files\n",
- "file_path = \"/n/dominici_lab/lab/data_processing/csph-era5_sandbox/data/input/2010_01.nc\"\n",
- "data = xr.open_dataset(file_path)\n",
- "\n",
- "\n",
- "temperature = data[\"t2m\"]\n",
- "\n",
- "\n",
+ "temperature = ds[\"t2m\"]\n",
"\n",
"# Select a specific time step\n",
"temperature_at_time = temperature.isel(valid_time=0)\n",
@@ -193,8 +693,14 @@
"ax.coastlines()\n",
"ax.add_feature(cfeature.BORDERS, linestyle=\":\")\n",
"ax.set_title(\"Temperature at Time Step 0\")\n",
- "plt.show()\n",
- "```"
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can also load the aggregated data:"
]
},
{
@@ -206,8 +712,356 @@
"outputs": [
{
"data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
\n",
+ "
day_01
\n",
+ "
day_02
\n",
+ "
day_03
\n",
+ "
day_04
\n",
+ "
day_05
\n",
+ "
day_06
\n",
+ "
day_07
\n",
+ "
day_08
\n",
+ "
day_09
\n",
+ "
day_10
\n",
+ "
day_11
\n",
+ "
day_12
\n",
+ "
day_13
\n",
+ "
day_14
\n",
+ "
day_15
\n",
+ "
day_16
\n",
+ "
day_17
\n",
+ "
day_18
\n",
+ "
day_19
\n",
+ "
day_20
\n",
+ "
day_21
\n",
+ "
day_22
\n",
+ "
day_23
\n",
+ "
day_24
\n",
+ "
day_25
\n",
+ "
day_26
\n",
+ "
day_27
\n",
+ "
day_28
\n",
+ "
day_29
\n",
+ "
day_30
\n",
+ "
day_31
\n",
+ "
day_32
\n",
+ "
\n",
+ " \n",
+ " \n",
+ "
\n",
+ "
count
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
2701.000000
\n",
+ "
\n",
+ "
\n",
+ "
mean
\n",
+ "
290.493048
\n",
+ "
290.145274
\n",
+ "
288.953153
\n",
+ "
288.503714
\n",
+ "
288.439820
\n",
+ "
288.304426
\n",
+ "
286.940995
\n",
+ "
287.186512
\n",
+ "
287.453656
\n",
+ "
287.843029
\n",
+ "
288.301938
\n",
+ "
288.778014
\n",
+ "
288.813762
\n",
+ "
288.667253
\n",
+ "
288.796892
\n",
+ "
288.547945
\n",
+ "
288.197632
\n",
+ "
287.882440
\n",
+ "
287.659818
\n",
+ "
289.291587
\n",
+ "
289.911503
\n",
+ "
288.760939
\n",
+ "
288.257644
\n",
+ "
288.271450
\n",
+ "
287.746390
\n",
+ "
288.379399
\n",
+ "
288.504720
\n",
+ "
287.665699
\n",
+ "
288.149861
\n",
+ "
288.266861
\n",
+ "
288.644028
\n",
+ "
288.224829
\n",
+ "
\n",
+ "
\n",
+ "
std
\n",
+ "
2.616922
\n",
+ "
2.832083
\n",
+ "
3.215642
\n",
+ "
3.566019
\n",
+ "
4.401416
\n",
+ "
4.198817
\n",
+ "
5.235795
\n",
+ "
4.444031
\n",
+ "
4.346305
\n",
+ "
3.435444
\n",
+ "
2.735781
\n",
+ "
2.864494
\n",
+ "
2.841268
\n",
+ "
3.080593
\n",
+ "
3.306217
\n",
+ "
2.938165
\n",
+ "
3.018303
\n",
+ "
2.849850
\n",
+ "
2.817690
\n",
+ "
2.600946
\n",
+ "
2.584079
\n",
+ "
3.161855
\n",
+ "
3.171827
\n",
+ "
2.983778
\n",
+ "
3.223380
\n",
+ "
2.918867
\n",
+ "
2.844314
\n",
+ "
3.052635
\n",
+ "
3.077292
\n",
+ "
3.093706
\n",
+ "
3.335983
\n",
+ "
3.296264
\n",
+ "
\n",
+ "
\n",
+ "
min
\n",
+ "
284.295898
\n",
+ "
281.673340
\n",
+ "
280.566406
\n",
+ "
280.509521
\n",
+ "
277.348145
\n",
+ "
279.243164
\n",
+ "
274.955078
\n",
+ "
274.682129
\n",
+ "
275.397461
\n",
+ "
279.498291
\n",
+ "
282.339111
\n",
+ "
282.188721
\n",
+ "
282.470703
\n",
+ "
281.371582
\n",
+ "
280.724609
\n",
+ "
280.093506
\n",
+ "
280.849121
\n",
+ "
281.123535
\n",
+ "
281.952148
\n",
+ "
282.186768
\n",
+ "
284.168945
\n",
+ "
282.519287
\n",
+ "
282.015381
\n",
+ "
280.578857
\n",
+ "
281.183838
\n",
+ "
281.146973
\n",
+ "
281.977539
\n",
+ "
281.014648
\n",
+ "
280.787842
\n",
+ "
281.631348
\n",
+ "
281.349854
\n",
+ "
280.615967
\n",
+ "
\n",
+ "
\n",
+ "
25%
\n",
+ "
288.031494
\n",
+ "
287.739014
\n",
+ "
286.978271
\n",
+ "
285.750488
\n",
+ "
284.326904
\n",
+ "
284.071289
\n",
+ "
281.695068
\n",
+ "
283.710449
\n",
+ "
284.153076
\n",
+ "
285.459717
\n",
+ "
286.141846
\n",
+ "
286.444092
\n",
+ "
286.505859
\n",
+ "
286.104004
\n",
+ "
286.114014
\n",
+ "
286.730225
\n",
+ "
286.005371
\n",
+ "
285.420166
\n",
+ "
285.230713
\n",
+ "
287.408203
\n",
+ "
287.744873
\n",
+ "
286.101318
\n",
+ "
285.243652
\n",
+ "
285.488281
\n",
+ "
285.170166
\n",
+ "
285.876465
\n",
+ "
286.145508
\n",
+ "
285.243164
\n",
+ "
285.579346
\n",
+ "
285.322754
\n",
+ "
285.930908
\n",
+ "
285.565186
\n",
+ "
\n",
+ "
\n",
+ "
50%
\n",
+ "
290.674316
\n",
+ "
290.331543
\n",
+ "
288.916260
\n",
+ "
288.472168
\n",
+ "
289.635742
\n",
+ "
289.390381
\n",
+ "
288.382568
\n",
+ "
287.926758
\n",
+ "
288.173096
\n",
+ "
287.859375
\n",
+ "
287.797852
\n",
+ "
288.716064
\n",
+ "
288.806641
\n",
+ "
288.789307
\n",
+ "
289.210938
\n",
+ "
288.769287
\n",
+ "
288.085205
\n",
+ "
287.698975
\n",
+ "
287.252930
\n",
+ "
289.310547
\n",
+ "
289.878418
\n",
+ "
288.511719
\n",
+ "
288.420166
\n",
+ "
288.263916
\n",
+ "
287.717041
\n",
+ "
288.661621
\n",
+ "
288.999023
\n",
+ "
287.485107
\n",
+ "
288.326416
\n",
+ "
288.429199
\n",
+ "
288.576416
\n",
+ "
288.093018
\n",
+ "
\n",
+ "
\n",
+ "
75%
\n",
+ "
292.828369
\n",
+ "
292.707764
\n",
+ "
291.609375
\n",
+ "
291.655762
\n",
+ "
291.987305
\n",
+ "
291.845459
\n",
+ "
291.671631
\n",
+ "
291.051758
\n",
+ "
291.288574
\n",
+ "
291.000244
\n",
+ "
290.813721
\n",
+ "
291.365967
\n",
+ "
291.540039
\n",
+ "
291.393799
\n",
+ "
291.756592
\n",
+ "
291.094727
\n",
+ "
290.893311
\n",
+ "
290.266602
\n",
+ "
290.166748
\n",
+ "
291.649902
\n",
+ "
291.970459
\n",
+ "
291.342285
\n",
+ "
290.443848
\n",
+ "
290.660400
\n",
+ "
290.400146
\n",
+ "
290.360840
\n",
+ "
290.854004
\n",
+ "
290.328125
\n",
+ "
290.827881
\n",
+ "
290.999268
\n",
+ "
291.598877
\n",
+ "
291.072754
\n",
+ "
\n",
+ "
\n",
+ "
max
\n",
+ "
296.467285
\n",
+ "
295.717529
\n",
+ "
295.837158
\n",
+ "
295.693604
\n",
+ "
295.723389
\n",
+ "
296.195557
\n",
+ "
295.589600
\n",
+ "
295.345703
\n",
+ "
294.754639
\n",
+ "
294.483154
\n",
+ "
294.952148
\n",
+ "
294.815430
\n",
+ "
294.623779
\n",
+ "
295.088135
\n",
+ "
295.036621
\n",
+ "
294.847900
\n",
+ "
294.224609
\n",
+ "
294.522949
\n",
+ "
294.728760
\n",
+ "
295.268066
\n",
+ "
295.507324
\n",
+ "
295.797363
\n",
+ "
296.297119
\n",
+ "
296.222900
\n",
+ "
295.492432
\n",
+ "
295.406006
\n",
+ "
294.629883
\n",
+ "
295.211670
\n",
+ "
295.363037
\n",
+ "
295.263184
\n",
+ "
295.446533
\n",
+ "
295.408691
\n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
"text/plain": [
- "2"
+ " day_01 day_02 day_03 day_04 day_05 day_06 ... day_27 day_28 day_29 day_30 day_31 day_32\n",
+ "count 2701.000000 2701.000000 2701.000000 2701.000000 2701.000000 2701.000000 ... 2701.000000 2701.000000 2701.000000 2701.000000 2701.000000 2701.000000\n",
+ "mean 290.493048 290.145274 288.953153 288.503714 288.439820 288.304426 ... 288.504720 287.665699 288.149861 288.266861 288.644028 288.224829\n",
+ "std 2.616922 2.832083 3.215642 3.566019 4.401416 4.198817 ... 2.844314 3.052635 3.077292 3.093706 3.335983 3.296264\n",
+ "min 284.295898 281.673340 280.566406 280.509521 277.348145 279.243164 ... 281.977539 281.014648 280.787842 281.631348 281.349854 280.615967\n",
+ "25% 288.031494 287.739014 286.978271 285.750488 284.326904 284.071289 ... 286.145508 285.243164 285.579346 285.322754 285.930908 285.565186\n",
+ "50% 290.674316 290.331543 288.916260 288.472168 289.635742 289.390381 ... 288.999023 287.485107 288.326416 288.429199 288.576416 288.093018\n",
+ "75% 292.828369 292.707764 291.609375 291.655762 291.987305 291.845459 ... 290.854004 290.328125 290.827881 290.999268 291.598877 291.072754\n",
+ "max 296.467285 295.717529 295.837158 295.693604 295.723389 296.195557 ... 294.629883 295.211670 295.363037 295.263184 295.446533 295.408691\n",
+ "\n",
+ "[8 rows x 32 columns]"
]
},
"execution_count": null,
@@ -216,17 +1070,15 @@
}
],
"source": [
- "1+1"
+ "#| exec_doc: #\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "from era5_sandbox.config import data_catalog\n",
+ "\n",
+ "ex_agg_path = data_catalog['aggregate']['outputs']['2019_08_madagascar_night_d2m_max.parquet'].load()\n",
+ "\n",
+ "gpd.read_parquet(ex_agg_path).describe()"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {
- "language": "python"
- },
- "outputs": [],
- "source": []
}
],
"metadata": {
@@ -237,5 +1089,5 @@
}
},
"nbformat": 4,
- "nbformat_minor": 4
+ "nbformat_minor": 5
}
diff --git a/_proc/index_files/figure-html/cell-4-output-1.png b/_proc/index_files/figure-html/cell-4-output-1.png
new file mode 100644
index 0000000..6044c3d
Binary files /dev/null and b/_proc/index_files/figure-html/cell-4-output-1.png differ
diff --git a/_proc/sidebar.yml b/_proc/sidebar.yml
index c80eda4..caf3166 100644
--- a/_proc/sidebar.yml
+++ b/_proc/sidebar.yml
@@ -2,5 +2,15 @@ website:
sidebar:
contents:
- index.ipynb
+ - section: "Snakemake Modules"
- 00_core.ipynb
- 01_download_raw_data.ipynb
+ - 02_aggregate.ipynb
+ - 03_publish.ipynb
+ - section: "PyTask Modules"
+ - 20_pytask_config.ipynb
+ - 20_pytask_logger.ipynb
+ - 21_pytask_download.ipynb
+ - 22_pytask_aggregate.ipynb
+ - section: "PyTask Demo"
+ - 10_pytask_demo.ipynb
diff --git a/_proc/sidebar.yml.bak b/_proc/sidebar.yml.bak
new file mode 100644
index 0000000..caf3166
--- /dev/null
+++ b/_proc/sidebar.yml.bak
@@ -0,0 +1,16 @@
+website:
+ sidebar:
+ contents:
+ - index.ipynb
+ - section: "Snakemake Modules"
+ - 00_core.ipynb
+ - 01_download_raw_data.ipynb
+ - 02_aggregate.ipynb
+ - 03_publish.ipynb
+ - section: "PyTask Modules"
+ - 20_pytask_config.ipynb
+ - 20_pytask_logger.ipynb
+ - 21_pytask_download.ipynb
+ - 22_pytask_aggregate.ipynb
+ - section: "PyTask Demo"
+ - 10_pytask_demo.ipynb
diff --git a/dag.pdf b/dag.pdf
new file mode 100644
index 0000000..669b76b
Binary files /dev/null and b/dag.pdf differ
diff --git a/data b/data
new file mode 120000
index 0000000..b5d477b
--- /dev/null
+++ b/data
@@ -0,0 +1 @@
+/n/holylabs/LABS/cgolden_lab/Lab/projects/era5_database/era5_sandbox/data
\ No newline at end of file
diff --git a/environment.yml b/environment.yml
index a77c4df..19aabbb 100644
--- a/environment.yml
+++ b/environment.yml
@@ -435,4 +435,5 @@ dependencies:
- types-setuptools==76.0.0.20250313
- uritemplate==4.1.1
- watchdog==6.0.0
+ - -e .
prefix: /n/home03/ttapera/.conda/envs/era5_sandbox
diff --git a/index_files/figure-commonmark/cell-4-output-1.png b/index_files/figure-commonmark/cell-4-output-1.png
new file mode 100644
index 0000000..6044c3d
Binary files /dev/null and b/index_files/figure-commonmark/cell-4-output-1.png differ
diff --git a/nbdev_prepare.sh b/nbdev_prepare.sh
new file mode 100644
index 0000000..aa72626
--- /dev/null
+++ b/nbdev_prepare.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+#
+#SBATCH -p test # partition (queue)
+#SBATCH -c 2 # number of cores
+#SBATCH --mem 100GB # memory
+#SBATCH -t 0-02:00 # time (D-HH:MM)
+
+# build docs
+
+nbdev_prepare
\ No newline at end of file
diff --git a/notes/00_core.ipynb b/notes/00_core.ipynb
index 8e624fe..febefc2 100644
--- a/notes/00_core.ipynb
+++ b/notes/00_core.ipynb
@@ -4,38 +4,45 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "# core\n",
+ "---\n",
+ "title: \"Core Module: Internal functions and testing\"\n",
+ "exec_all: true\n",
+ "---\n",
"\n",
- "> This is a core library for the ERA5 dataset pipeline. It defines\n",
- "a few helpful functions such as an API tester to test your API key and connection."
+ "## core\n",
+ "\n",
+ "> This is a core library for the ERA5 dataset pipeline. It defines a few helpful functions such as an API tester to test your API key and connection."
]
},
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| default_exp core"
+ "#| default_exp core:\n",
+ "#"
]
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| hide\n",
+ "#| hide:\n",
+ "#\n",
"from nbdev.showdoc import *"
]
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
+ "#| exports:\n",
+ "#\n",
"import os\n",
"import cdsapi\n",
"import hydra\n",
@@ -50,7 +57,7 @@
"from pydrive2.drive import GoogleDrive\n",
"from omegaconf import DictConfig, OmegaConf\n",
"from pyprojroot import here\n",
- "from importlib import import_module\n"
+ "from importlib import import_module"
]
},
{
@@ -64,11 +71,12 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
+ "#| exports:\n",
+ "#\n",
"def describe(\n",
" cfg: DictConfig=None, # Configuration file\n",
" )-> None:\n",
@@ -84,11 +92,12 @@
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| exporti\n",
+ "#| exporti:\n",
+ "#\n",
"def _expand_path(\n",
" path: str # Path on user's machine\n",
" )-> str: # Expanded path\n",
@@ -105,11 +114,12 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| exporti\n",
+ "#| exporti:\n",
+ "#\n",
"def _get_callable(func_path):\n",
" \"\"\"Dynamically import a callable from a string path.\"\"\"\n",
" module_name, func_name = func_path.rsplit(\".\", 1)\n",
@@ -119,22 +129,18 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| exporti\n",
- "\n",
+ "#| exporti:\n",
+ "# a directory structure creator\n",
"def _create_directory_structure(\n",
" base_path: str, # The base directory where the structure will be created\n",
" structure: dict # A dictionary representing the directory structure\n",
" )->None:\n",
" \"\"\"\n",
" Recursively creates a directory structure from a dictionary.\n",
- "\n",
- " Args:\n",
- " base_path (str): The base directory where the structure will be created.\n",
- " structure (dict): A dictionary representing the directory structure.\n",
" \"\"\"\n",
" for folder, substructure in structure.items():\n",
" # Create the current directory\n",
@@ -146,23 +152,28 @@
" _create_directory_structure(current_path, substructure)"
]
},
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In addition, we've defined 3 private functions to help with path expansion `_expand_path`, dynamic function importing `_get_callable`, and directory structure creation `_create_directory_structure`.\n",
+ "\n",
+ "### A Simple Temperature Conversion Function"
+ ]
+ },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
- "\n",
- "def kelvin_to_celsius(kelvin):\n",
+ "#| export:\n",
+ "#\n",
+ "def kelvin_to_celsius(\n",
+ " kelvin: float # Temperature in Kelvin\n",
+ " ) -> float: # Temperature in Celsius\n",
" \"\"\"\n",
" Convert temperature from Kelvin to Celsius.\n",
- " \n",
- " Args:\n",
- " kelvin (float): Temperature in Kelvin.\n",
- " \n",
- " Returns:\n",
- " float: Temperature in Celsius.\n",
" \"\"\"\n",
" return kelvin - 273.15"
]
@@ -173,17 +184,24 @@
"source": [
"### A Class for Authenticating Google Drive\n",
"\n",
- "We're going to use a class to authenticate and interact with google drive. The goal is to have a simple interface to fetch the healthshed files dynamically from google drive in the pipeline."
+ "We're going to use a class to authenticate and interact with google drive. The goal is to have a simple interface to fetch the healthshed files dynamically from google drive in the pipeline.\n",
+ "\n",
+ "::: {.callout-important}\n",
+ "This class was implemented when all of our data\n",
+ "was stored on a private Google Drive. Since we\n",
+ "have moved all of our data to FASRC, this will\n",
+ "likely be deprecated in the near future.\n",
+ ":::"
]
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
- "\n",
+ "#| export:\n",
+ "#\n",
"class GoogleDriver:\n",
" \"\"\"\n",
" A class to handle Google Drive authentication and file management.\n",
@@ -225,25 +243,48 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from hydra import initialize, compose\n",
- "from omegaconf import OmegaConf\n",
- "\n",
+ "from omegaconf import OmegaConf"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
"# unfortunately, we have to use the initialize function to load the config file\n",
"# this is because the @hydra decorator does not work with Notebooks very well\n",
"# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248\n",
"# \n",
"# just use the relative path from the notebook to the config dir\n",
- "with initialize(version_base=None, config_path=\"../conf\"):\n",
- " cfg = compose(config_name='config.yaml')"
+ "try:\n",
+ " with initialize(version_base=None, config_path=\"../conf\"):\n",
+ " cfg = compose(config_name='config.yaml')\n",
+ "except Exception as e:\n",
+ " print(f\"Error initializing Hydra: {e}\")\n",
+ " with initialize(version_base=None, config_path=\"conf\"):\n",
+ " cfg = compose(config_name='config.yaml')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "::: {.callout-important}\n",
+ "If we continue with `pytask`, we will not need to\n",
+ "use hydra at all, and so the above strategy\n",
+ "may get deprecated.\n",
+ ":::"
]
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -260,17 +301,9 @@
},
{
"cell_type": "code",
- "execution_count": 11,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "healthsheds2022.zip - application/zip\n"
- ]
- }
- ],
+ "outputs": [],
"source": [
"# we're using the madagascar healthshed folder as an example\n",
"folder_id = cfg.geographies.madagascar.healthsheds\n",
@@ -290,7 +323,7 @@
},
{
"cell_type": "code",
- "execution_count": 12,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
@@ -303,9 +336,7 @@
" file_obj.GetContentFile(zip_path)\n",
"\n",
" # Read shapefile directly from ZIP\n",
- " gdf = gpd.read_file(f\"zip://{zip_path}\")\n",
- "\n",
- "\n"
+ " gdf = gpd.read_file(f\"zip://{zip_path}\")"
]
},
{
@@ -317,22 +348,23 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
+ "#| export:\n",
+ "#\n",
"from fastcore.basics import patch"
]
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
- "\n",
+ "#| export:\n",
+ "#\n",
"@patch\n",
"def read_healthsheds(self:GoogleDriver, healthshed_zip_name):\n",
"\n",
@@ -365,123 +397,9 @@
},
{
"cell_type": "code",
- "execution_count": 15,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
fs_pop
\n",
- "
n_uid
\n",
- "
n_instat
\n",
- "
n_comp
\n",
- "
n_shape
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
count
\n",
- "
2766.000000
\n",
- "
2766.000000
\n",
- "
2766.000000
\n",
- "
2766.000000
\n",
- "
2766.000000
\n",
- "
\n",
- "
\n",
- "
mean
\n",
- "
10493.058930
\n",
- "
7.480116
\n",
- "
6.318149
\n",
- "
1.010484
\n",
- "
1.036515
\n",
- "
\n",
- "
\n",
- "
std
\n",
- "
12127.817529
\n",
- "
7.263235
\n",
- "
4.939271
\n",
- "
0.112019
\n",
- "
0.393120
\n",
- "
\n",
- "
\n",
- "
min
\n",
- "
0.000000
\n",
- "
1.000000
\n",
- "
1.000000
\n",
- "
1.000000
\n",
- "
1.000000
\n",
- "
\n",
- "
\n",
- "
25%
\n",
- "
4344.750000
\n",
- "
4.000000
\n",
- "
3.000000
\n",
- "
1.000000
\n",
- "
1.000000
\n",
- "
\n",
- "
\n",
- "
50%
\n",
- "
7417.000000
\n",
- "
6.000000
\n",
- "
5.000000
\n",
- "
1.000000
\n",
- "
1.000000
\n",
- "
\n",
- "
\n",
- "
75%
\n",
- "
12531.250000
\n",
- "
9.000000
\n",
- "
8.000000
\n",
- "
1.000000
\n",
- "
1.000000
\n",
- "
\n",
- "
\n",
- "
max
\n",
- "
194782.000000
\n",
- "
104.000000
\n",
- "
62.000000
\n",
- "
3.000000
\n",
- "
15.000000
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " fs_pop n_uid n_instat n_comp n_shape\n",
- "count 2766.000000 2766.000000 2766.000000 2766.000000 2766.000000\n",
- "mean 10493.058930 7.480116 6.318149 1.010484 1.036515\n",
- "std 12127.817529 7.263235 4.939271 0.112019 0.393120\n",
- "min 0.000000 1.000000 1.000000 1.000000 1.000000\n",
- "25% 4344.750000 4.000000 3.000000 1.000000 1.000000\n",
- "50% 7417.000000 6.000000 5.000000 1.000000 1.000000\n",
- "75% 12531.250000 9.000000 8.000000 1.000000 1.000000\n",
- "max 194782.000000 104.000000 62.000000 3.000000 15.000000"
- ]
- },
- "execution_count": 15,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)\n",
"drive = driver.get_drive()\n",
@@ -496,6 +414,10 @@
"source": [
"## CDS File Handler Type\n",
"\n",
+ "::: {.callout-important}\n",
+ "This section may also be deprecated. Since adding `swvl1` to the pipeline, we have not needed to use this class. We leave it here for now for reference.\n",
+ ":::\n",
+ "\n",
"We're going to make a file handler type to help deal with CDS files. This is to fix [NSAPH-Data-Processing/era5_sandbox#13](https://github.com/NSAPH-Data-Processing/era5_sandbox/issues/13). \n",
"\n",
"Usually, when you download data, it comes out as a simple .nc file that can be opened with xarray. However, the CDS API has a few different file types that are not .nc files. For example, the ERA5 data is stored in a .grib file format. This is a common format for meteorological data, and it is used by the ECMWF. When a query has multiple variables, sometimes they are downloaded as a .zip file to separat the grib from the netcdf.\n",
@@ -505,12 +427,12 @@
},
{
"cell_type": "code",
- "execution_count": 16,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
- "\n",
+ "#| export:\n",
+ "#\n",
"class ClimateDataFileHandler:\n",
" \"\"\"\n",
" A class to handle file operations for the Climate Data Store (CDS).\n",
@@ -609,9 +531,16 @@
"outputs": [],
"source": [
"import xarray as xr\n",
- "from fastcore.test import test_fail\n",
- "\n",
- "eg_file = here() / \"data/input/madagascar_2023_10.nc\"\n",
+ "from fastcore.test import test_fail"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "eg_file = here() / \"bld/2019_5_madagascar.nc\"\n",
"\n",
"# this fails because the nc file downloaded has grib and netcdf in it, so\n",
"# xr cannot handle it.\n",
@@ -636,911 +565,46 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"handler = ClimateDataFileHandler(eg_file)\n",
"handler.prepare()\n",
"ds1 = xr.open_dataset(handler.get_dataset(\"instant\"))\n",
- "ds2 = xr.open_dataset(handler.get_dataset(\"accum\"))"
+ "#ds2 = xr.open_dataset(handler.get_dataset(\"accum\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "::: {.callout-important}\n",
+ "The above line for `ds2` is commented out because the example file does not separate accumulation data. \n",
+ ":::"
]
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
+ "outputs": [],
"source": [
+ "#| eval: false\n",
"parquet_file.plot(column=\"day_22_daily_mean\", legend=True)"
]
},
@@ -2920,7 +798,8 @@
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
+ "#| exports:\n",
+ "#\n",
"@hydra.main(version_base=None, config_path=\"../../conf\", config_name=\"config\")\n",
"def main(cfg: DictConfig) -> None:\n",
" # Parse command-line arguments\n",
@@ -2947,7 +826,7 @@
"metadata": {},
"outputs": [],
"source": [
- "#| export\n",
+ "#| export:\n",
"#| eval: false\n",
"try: from nbdev.imports import IN_NOTEBOOK\n",
"except: IN_NOTEBOOK=False\n",
@@ -2962,30 +841,19 @@
"metadata": {},
"outputs": [],
"source": [
- "#| hide\n",
+ "#| hide: \n",
+ "#\n",
"import nbdev; nbdev.nbdev_export()"
]
}
],
"metadata": {
"kernelspec": {
- "display_name": "era5_sandbox",
+ "display_name": "python3",
"language": "python",
"name": "python3"
- },
- "language_info": {
- "codemirror_mode": {
- "name": "ipython",
- "version": 3
- },
- "file_extension": ".py",
- "mimetype": "text/x-python",
- "name": "python",
- "nbconvert_exporter": "python",
- "pygments_lexer": "ipython3",
- "version": "3.11.11"
}
},
"nbformat": 4,
- "nbformat_minor": 2
+ "nbformat_minor": 5
}
diff --git a/notes/03_publish.ipynb b/notes/03_publish.ipynb
new file mode 100644
index 0000000..a9d3461
--- /dev/null
+++ b/notes/03_publish.ipynb
@@ -0,0 +1,719 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "title: \"Publish: Gather the Aggregated Data and Publish to DataVerse\"\n",
+ "engine: jupyter\n",
+ "---\n",
+ "\n",
+ "## publish \n",
+ "\n",
+ "> This is the `publish` module for the ERA5 dataset pipeline. It defines a functions that make use of the `pyDataverse` library and API to publish our outputs to the Harvard Dataverse."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| default_exp publish:\n",
+ "#"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| hide:\n",
+ "#\n",
+ "from nbdev.showdoc import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "First, we'll test out the API by pinging the Harvard DataVerse"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "import hydra\n",
+ "import yaml\n",
+ "import json\n",
+ "from tqdm import tqdm\n",
+ "from pyprojroot import here"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "api_token_file = here() / \"sandbox/dataverse_api_key.yml\"\n",
+ "with open(api_token_file, \"r\") as f:\n",
+ " config = yaml.load(f, Loader=yaml.BaseLoader)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, following the [docs]() for the dataverse tutorial, load a NativeAPI up:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "from pyDataverse.api import NativeApi"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The NativeAPI is a catchall API object to be able to do general stuff:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "api = NativeApi(config['base_url'], config['api_token'])\n",
+ "resp=api.get_info_version()\n",
+ "#resp.text()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "resp.json()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Looks good! Now that we know that it works, we can think more\n",
+ "about how to publish data there.\n",
+ "\n",
+ "## Harvard Dataverse\n",
+ "\n",
+ "Let's create a dummy dataset with the components we're\n",
+ "planning to upload, and then upload and promptly delete it.\n",
+ "\n",
+ "To do that, we must import the `models` module and create a Dataset object:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pyDataverse.models import Dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds = Dataset()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This `ds` object is pretty straightforward since it doesn't contain anything yet:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds.get()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can populate the object from the dummy data on the github repo:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from pyDataverse.utils import read_file\n",
+ "from urllib.request import urlretrieve\n",
+ "import tempfile"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# url for dummy data\n",
+ "url = \"https://raw.githubusercontent.com/gdcc/pyDataverse/refs/heads/main/tests/data/user-guide/dataset.json\"\n",
+ "\n",
+ "\n",
+ "with tempfile.NamedTemporaryFile(mode='w+') as tmp:\n",
+ " urlretrieve(url, tmp.name)\n",
+ " ds.from_json(read_file(tmp.name))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We have to validate the JSON correctly:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds.validate_json()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Modifying it is easy:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds.set({\"title\": \"Youth from Austria 2005\"})\n",
+ "ds.get()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now, to create the dataset we use the API:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "# this is only run in interactive sessions for demo purposes\n",
+ "resp = api.create_dataset(\":root\", ds.json())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you caught the `resp` object, it contains the PID for the newly created dataset.\n",
+ "\n",
+ "However, if you didn't you can use the SearchAPI to find it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "from pyDataverse.api import SearchApi"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "search_api = SearchApi(config['base_url'], config['api_token'])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "#\n",
+ "\n",
+ "resp = search_api.search(\"Youth from Austria\", data_type=\"dataset\")\n",
+ "results = resp.json()['data']['items']\n",
+ "result = [x for x in results if \"Youth from Austria\" in x['name']][0]\n",
+ "result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "pid = result['global_id']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now to look at the data we created using the NativeAPI again, and delete the dataset:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "\n",
+ "uploaded_ds = api.get_dataset(pid)\n",
+ "uploaded_ds.json()['data']\n",
+ "\n",
+ "resp = api.delete_dataset(pid)\n",
+ "resp.json()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "With that understanding, we can develop a quick module to do the following:\n",
+ "\n",
+ "1. Make the dataset LEGO Compatible\n",
+ "2. Upload and publish the data to dataverse\n",
+ "\n",
+ "## LEGO Compatibility\n",
+ "\n",
+ "Let's take an example file to use as a model for LEGO compatibility"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "import geopandas as gpd\n",
+ "import pandas as pd\n",
+ "import re\n",
+ "import glob"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ex = gpd.read_parquet(here() / \"bld/2009_06_madagascar_day_swvl1_mean.parquet\")\n",
+ "ex.describe()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We know that the LEGO data model should look like this:\n",
+ "\n",
+ "```\n",
+ "/lego\n",
+ "├── \n",
+ "│ ├── __\n",
+ "│ │ ├── __\n",
+ "│ │ │ ├── _yyyy.parquet\n",
+ "```\n",
+ "\n",
+ "So, for the above file, we'll end up with the LEGO path `data/environmental/exposures_era5/healthshed_monthly/dewpoint_2024.parquet`. In it, we should have the following columns:\n",
+ "\n",
+ "\n",
+ "```\n",
+ "healthshed_id year month day stat_1 stat_2 ... stat_n \n",
+ "```\n",
+ "\n",
+ "\n",
+ "This means we should read in all of the exposures for a single timepoint at once. \n",
+ "I think the smart thing to do is use a glob string to gather all of the pertinent files.\n",
+ "This will be the first function we export to the library:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# \n",
+ "\n",
+ "def gather_exposure_geodataframes(\n",
+ " glob_string: str, # string for the path to search for the pertinent files\n",
+ " polygon_id: str, # the string signifying the healthshed ID of the polygon\n",
+ " exposure: str # the exposure name\n",
+ " )-> list:\n",
+ " \"Read in a list of geo dataframes from the same time frame and merge them\"\n",
+ "\n",
+ " # first get the initial one so we have the polygon ID and geometry\n",
+ " frames = glob.glob(str(glob_string))\n",
+ " initial_gdf=gpd.read_parquet(frames[0])\n",
+ " merged_df = []\n",
+ " \n",
+ " for f in tqdm(frames, desc=\"Processing files\"):\n",
+ " # read in as a regular dataframe by ignoring geometry\n",
+ " df = gpd.read_parquet(f).drop([\"geometry\"], axis=1) \n",
+ " \n",
+ " # get the year and month\n",
+ " # Extract year and month\n",
+ " search_str = rf'_{exposure}_(\\d{{4}})_(\\d{{1,2}})\\.parquet$'\n",
+ " match = re.search(search_str, f)\n",
+ "\n",
+ " if match:\n",
+ " year = int(match.group(1))\n",
+ " month = int(match.group(2))\n",
+ " #print(f\"Year: {year}, Month: {month}\")\n",
+ " else:\n",
+ " raise ValueError(f\"Could not extract year and month from filename: {search_str} {f}\")\n",
+ " \n",
+ " df['exposure'] = exposure\n",
+ " df['month'] = month\n",
+ " df['year'] = year\n",
+ "\n",
+ " # Step 1: Melt all day columns (leave 'month' and 'year' as identifiers)\n",
+ " df_long = df.melt(id_vars=[polygon_id, \"exposure\", \"year\", \"month\"], var_name=\"day_stat\", value_name=\"value\")\n",
+ "\n",
+ " # Step 2: Extract day and stat type from column names\n",
+ " # Example column: \"day_01_daily_mean\"\n",
+ " df_long[[\"day\", \"stat\"]] = df_long[\"day_stat\"].str.extract(r\"day_(\\d{2})_daily_(mean|max|min|total)\")\n",
+ "\n",
+ " # Optional: convert 'day' and month to integer\n",
+ " df_long[\"day\"] = df_long[\"day\"].astype(int)\n",
+ " df_long[\"month\"] = df_long[\"month\"].astype(int)\n",
+ "\n",
+ " # Drop the original combined column\n",
+ " df_long = df_long.drop(columns=\"day_stat\")\n",
+ "\n",
+ " # Reorder columns\n",
+ " df_long = df_long[[polygon_id, \"exposure\", \"year\", \"month\", \"day\", \"stat\", \"value\"]]\n",
+ "\n",
+ " df_long = df_long.sort_values(by=[\"year\", \"month\", \"day\"])\n",
+ " df_clean = df_long.pivot(index=[polygon_id, \"exposure\", \"year\", \"month\", \"day\"], columns=\"stat\", values=\"value\").reset_index()\n",
+ " merged_df.append(df_clean)\n",
+ "\n",
+ " return [pd.concat(merged_df).reset_index(drop=True), initial_gdf[[polygon_id, \"geometry\"]]]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "frames = here() / \"data\" / \"testing\" / \"*madagascar*\"\n",
+ "\n",
+ "merged = gather_exposure_geodataframes(frames, \"fs_uid\", \"2m_dewpoint_temperature\")\n",
+ "merged[0].describe()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This returns one file with all of the geometries and one file\n",
+ "with the statistics and exposures.\n",
+ "\n",
+ "Now, with this, we can move on. The dataset was created in the UI and is available via search and test out how to upload it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "resp = search_api.search(\"ERA5\", data_type=\"dataset\")\n",
+ "\n",
+ "results = resp.json()['data']['items']\n",
+ "\n",
+ "result = [x for x in results if \"ERA5\" in x['name']][0]\n",
+ "era5_pid = result['global_id']\n",
+ "result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "from pyDataverse.models import Datafile\n",
+ "import os\n",
+ "import pathlib"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We'll upload directly from file. In the case of ERA5 vs. LEGO, we\n",
+ "store the file on disk as LEGO hierarchy, but to upload it to dataverse\n",
+ "using a flat filename (since creating subdatasets to represent directories might be \n",
+ "a bit of a hassle)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# assuming the file has a path on disk like:\n",
+ "f_out = \"environmental/exposures_era5/healthshed_daily/dewpoint_2024.parquet\"\n",
+ "os.makedirs(here() / \"data\" / \"testing\" / os.path.dirname(f_out), exist_ok=True)\n",
+ "aggregations, geo = merged\n",
+ "aggregations.to_parquet(here() / \"data\" / \"testing\" / f_out, index=False)\n",
+ "\n",
+ "datafile = Datafile()\n",
+ "datafile.set({\n",
+ " # the id of the era5 dataset \n",
+ " \"pid\": era5_pid,\n",
+ " # the path to the file on disk goes here\n",
+ " \"filename\": str(here() / \"data\" / \"testing\" / f_out),\n",
+ " # use the \"label\" to name the file\n",
+ " \"label\": f_out.replace(\"/\", \"-\")\n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "resp = api.upload_datafile(era5_pid, str(here() / \"data\" / \"testing\" / f_out), datafile.json())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Pretty simple!\n",
+ "\n",
+ "Now, we just need a main function to upload this data. The final upload is one file per\n",
+ "exposure per year, so these should be the variables we gather data for.\n",
+ "\n",
+ "We should get some functionality to gather the groups of these files automatically, based on\n",
+ "the hydra config:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "from hydra import initialize, compose\n",
+ "from omegaconf import OmegaConf, DictConfig\n",
+ "from tqdm import tqdm"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "target_dir = here() / \"data\" / \"intermediate\"\n",
+ "\n",
+ "try:\n",
+ " with initialize(version_base=None, config_path=\"../conf\"):\n",
+ " cfg = compose(config_name='config.yaml')\n",
+ "except Exception as e:\n",
+ " print(f\"Error initializing Hydra: {e}\")\n",
+ " with initialize(version_base=None, config_path=\"conf\"):\n",
+ " cfg = compose(config_name='config.yaml')\n",
+ "\n",
+ "cfg.development_mode = False\n",
+ "#cfg.query['year'] = 2017\n",
+ "#cfg.query['month'] = 11\n",
+ "#cfg.query['geography'] = \"nepal\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "@hydra.main(version_base=None, config_path=\"../../conf\", config_name=\"config\")\n",
+ "def main(cfg: DictConfig) -> None:\n",
+ "\n",
+ " variables_dict = {\n",
+ " \"2m_temperature\": \"t2m\",\n",
+ " \"2m_dewpoint_temperature\": \"d2m\",\n",
+ " \"volumetric_soil_water_layer_1\": \"swvl1\",\n",
+ " \"total_precipitation\": \"tp\"\n",
+ " }\n",
+ "\n",
+ " print(OmegaConf.to_yaml(cfg))\n",
+ "\n",
+ " #prep dataverse\n",
+ " api_token_file = here() / \"sandbox/dataverse_api_key.yml\"\n",
+ " with open(api_token_file, \"r\") as f:\n",
+ " apiconfig = yaml.load(f, Loader=yaml.BaseLoader)\n",
+ " api = NativeApi(apiconfig['base_url'], apiconfig['api_token'])\n",
+ " search_api = SearchApi(apiconfig['base_url'], apiconfig['api_token'])\n",
+ " resp = search_api.search(\"ERA5\", data_type=\"dataset\")\n",
+ "\n",
+ " results = resp.json()['data']['items']\n",
+ "\n",
+ " result = [x for x in results if \"ERA5\" in x['name']][0]\n",
+ " era5_pid = result['global_id']\n",
+ "\n",
+ " for geography in cfg.geographies:\n",
+ " for year in cfg.query['year']:\n",
+ " for variable, v in variables_dict.items():\n",
+ " \n",
+ " print(f\"Processing {geography} for {variable} in {year}\")\n",
+ " glob_string = here() / \"data\" / \"intermediate\" / f\"*{geography}*{variable}*{year}*\"\n",
+ " print(f\"Glob: {glob_string}\")\n",
+ " polygon_id = cfg.geographies[geography]['unique_id']\n",
+ " print(f\"polygon_id: {polygon_id}\")\n",
+ " merged = gather_exposure_geodataframes(glob_string, polygon_id, variable)\n",
+ " print(merged[0].head())\n",
+ " print(merged[1].head())\n",
+ "\n",
+ " output_dir = here() / \"data\" / \"output\" \n",
+ " \n",
+ " f_out = f\"environmental/exposures_era5/healthshed_daily/{geography}_{v}_{year}.parquet\"\n",
+ " os.makedirs(output_dir / os.path.dirname(f_out), exist_ok=True)\n",
+ " output_path = output_dir / f_out\n",
+ "\n",
+ " print(f\"Writing to {output_path}\")\n",
+ " merged[0].to_parquet(output_path, index=False)\n",
+ " \n",
+ "\n",
+ " print(f\"Uploading {f_out.replace('/', '-')} to Dataverse...\")\n",
+ " # upload to dataverse\n",
+ " datafile = Datafile()\n",
+ " datafile.set({\n",
+ " \"pid\": era5_pid,\n",
+ " \"filename\": str(output_path),\n",
+ " \"label\": f_out.replace(\"/\", \"-\")\n",
+ " })\n",
+ "\n",
+ " resp = api.upload_datafile(era5_pid, output_path, datafile.json())\n",
+ " assert resp.json()['status'] == \"OK\", f\"Failed to upload datafile: {resp.text}\"\n",
+ " \n",
+ " # also save the geometry for the region \n",
+ " merged[1].to_parquet(output_path.parent / f\"{geography}_geometry.parquet\", index=False)\n",
+ "\n",
+ " # and upload it to dataverse\n",
+ " datafile = Datafile()\n",
+ " datafile.set({\n",
+ " \"pid\": era5_pid,\n",
+ " \"filename\": str(output_path.parent / f\"{geography}_geometry.parquet\"),\n",
+ " \"label\": f\"{geography}_geometry.parquet\"\n",
+ " })\n",
+ "\n",
+ " resp = api.upload_datafile(era5_pid, output_path.parent / f\"{geography}_geometry.parquet\", datafile.json())\n",
+ " assert resp.json()['status'] == \"OK\", f\"Failed to upload geometry datafile: {resp.text}\"\n",
+ "\n",
+ " print(\"All files processed and uploaded successfully.\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| export:\n",
+ "#| eval: false\n",
+ "try: from nbdev.imports import IN_NOTEBOOK\n",
+ "except: IN_NOTEBOOK=False\n",
+ "\n",
+ "if __name__ == \"__main__\" and not IN_NOTEBOOK:\n",
+ " main()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| hide:\n",
+ "#\n",
+ "import nbdev; nbdev.nbdev_export()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "python3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notes/10_pytask_demo.ipynb b/notes/10_pytask_demo.ipynb
new file mode 100644
index 0000000..cdd3c73
--- /dev/null
+++ b/notes/10_pytask_demo.ipynb
@@ -0,0 +1,412 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "title: \"Demo: How to Create Pipelines with `pytask`\"\n",
+ "engine: jupyter\n",
+ "---\n",
+ "\n",
+ "## Data Preparation Demo\n",
+ "\n",
+ "> Data preparation task for `pytask` demo\n",
+ "\n",
+ "In this notebook, we are demonstrating how to convert our snakemake workflow into a `pytask` workflow. We use the basic tutorial to demonstrate this, but continue\n",
+ "to use nbdev for development of functions in notebooks.\n",
+ "\n",
+ "`pytask` is a task management system that allows you to define tasks and their dependencies, similar to `Snakemake`. It is particularly useful for data science workflows.\n",
+ "\n",
+ "There are a number of reasons to use `pytask` over `snakemake`:\n",
+ "- **Pythonic**: `pytask` is designed to be purely Pythonic by default, allowing you to write tasks and entire pipelines as Python functions.\n",
+ "- **Flexibility**: `pytask` allows you to define tasks and their dependencies in a more flexible way, using Python functions and decorators, as opposed to orchestrating numerous scripts.\n",
+ "- **Integration**: `pytask` integrates well with other Python libraries, such as `nbdev` here, or `hydra` configurations if you need, allowing you to use your existing code, notebooks, or configs in your workflows.\n",
+ "- **Parallelism**: `pytask` supports parallel execution of tasks with `pytask-parallel`, which can speed up your workflows significantly, especially for data processing tasks.\n",
+ "\n",
+ "We'll use nbdev to define the task functions, and then export them to the `src` directory. `pytask` is then invoked at the command line to run the tasks."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| default_exp task_data_preparation:\n",
+ "#"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This demo task is taken from the tutorial at [pytask documentation](https://pytask-dev.readthedocs.io/en/stable/tutorials/write_a_task.html). At minimum, you need your package to contain the following in a config.py file:\n",
+ "\n",
+ "```md\n",
+ "my_project\n",
+ "│\n",
+ "├───.pytask\n",
+ "│\n",
+ "├───bld\n",
+ "│ └────...\n",
+ "│\n",
+ "├───src\n",
+ "│ └───my_project\n",
+ "│ ├────__init__.py\n",
+ "│ ├────config.py\n",
+ "│ └────...\n",
+ "│\n",
+ "└───pyproject.toml\n",
+ "```\n",
+ "\n",
+ "```python\n",
+ "#contents of `era5_sandbox.config` module\n",
+ "from pathlib import Path\n",
+ "\n",
+ "\n",
+ "SRC = Path(__file__).parent.resolve()\n",
+ "BLD = SRC.joinpath(\"..\", \"..\", \"bld\").resolve()\n",
+ "```\n",
+ "\n",
+ "Additionally, your pyproject.toml file should contain the following at minimum:\n",
+ "\n",
+ "```toml\n",
+ "[tool.pytask.ini_options]\n",
+ "paths = [\"src/era5_sandbox\"]\n",
+ "```\n",
+ "\n",
+ "The former tells Python where to find the source code and build directory for `pytask` objects and shims, while the latter tells `pytask` where to find the task definitions and dependency DAG."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "import os\n",
+ "from pathlib import Path\n",
+ "from typing import Annotated\n",
+ "\n",
+ "import numpy as np\n",
+ "import matplotlib.pyplot as plt\n",
+ "import pandas as pd\n",
+ "from era5_sandbox.config import BLD\n",
+ "from era5_sandbox.config import data_catalog, demo_catalog\n",
+ "\n",
+ "from pytask import PickleNode\n",
+ "from pytask import Product"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Defining Tasks\n",
+ "\n",
+ "To define a task, simply use the `task_` prefix in the function name (or, if you are familiar and comfortable with decorators, use `@pytask.mark.task`). Be verbose and expressive in your use of type hints to specify the input and output data, so that `pytask` can automatically detect and handle the dependencies between tasks. \n",
+ "\n",
+ "### Defining Tracked Outputs\n",
+ "\n",
+ "To define something as a tracked output, you can annotate the input of the task with `Annotated[Path, Product]`, where `Product` is imported from `pytask`. This tells `pytask` that this is a product of the task and should be saved in the build directory.\n",
+ "\n",
+ "In this example, we're generating random data into a data frame and saving the object as a pickle in the `bld` directory (`bld` is the default build directory for `pytask`'s intermediate data). To get that directory, we use the `BLD` variable from the `era5_sandbox.config` module as above. This module itself could also be generated using `nbdev` if you want to keep your configuration in notebooks.\n",
+ "\n",
+ "Using `nbdev`, we can also include all of the bells and whistles of function documentation."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "def task_create_random_data(\n",
+ " seed: Annotated[int, 42], # Default seed for reproducibility\n",
+ " path_to_data: Annotated[Path, Product] = BLD / \"data.pkl\" # Path to the object in the build directory\n",
+ " ) -> None:\n",
+ " \"Create a random data set and save it as a pickle file. Return the path to the saved file.\"\n",
+ " rng = np.random.default_rng(seed)\n",
+ " beta = 2\n",
+ "\n",
+ " x = rng.normal(loc=5, scale=10, size=1_000)\n",
+ " epsilon = rng.standard_normal(1_000)\n",
+ "\n",
+ " y = beta * x + epsilon\n",
+ "\n",
+ " df = pd.DataFrame({\"x\": x, \"y\": y})\n",
+ "\n",
+ " # this is a tracked output, so we annotate the return value with `Annotated[Path, Product]`\n",
+ " df.to_pickle(path_to_data)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can test the function directly in the notebook:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "task_create_random_data(42)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Once this module and function are exported with `nbdev_export`, the functions are in a python package. We can then use the command line to look at the registered tasks:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "\n",
+ "%%sh\n",
+ "pytask collect"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's add another task in the same module. This task plots the data we generated. To link the previous task to this one as a dependency, we can list the output of the previous task as an input to this one. This way, `pytask` will know that it needs to run the first task before this one."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "def task_plot_data(\n",
+ " path_to_data: Annotated[Path, BLD / \"data.pkl\"], # Path to the data file created by the previous task\n",
+ " path_to_plot: Annotated[Path, Product] = BLD / \"plot.png\" # Path to the build directory for the plot\n",
+ ") -> None:\n",
+ " \"\"\"\n",
+ " Plot the data from the pickle file and save the plot. Note that this task:\n",
+ " 1. depends on the data.pkl file created by the previous task,\n",
+ " 2. does not return any value, but saves a plot to the build directory. So the side effect of the task is what we are interested in here (though this is probably bad practice).\n",
+ " \"\"\"\n",
+ "\n",
+ " df = pd.read_pickle(path_to_data)\n",
+ " \n",
+ " _, ax = plt.subplots()\n",
+ " df.plot(x=\"x\", y=\"y\", ax=ax, kind=\"scatter\")\n",
+ "\n",
+ " plt.savefig(path_to_plot)\n",
+ " plt.close()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We now have a DAG of tasks that `pytask` can execute. To see the tasks, we can use the command line to create a pygraphviz graph of the tasks:\n",
+ "\n",
+ "```bash\n",
+ "pytask dag\n",
+ "```\n",
+ "\n",
+ "The DAG is saved as a pdf file, and you can view it using any viewer. Now, to run the pipeline, just invoke `pytask` at the command line:\n",
+ "\n",
+ "```bash\n",
+ "pytask\n",
+ "```\n",
+ "\n",
+ "In Jupyter or iPython, you can interact with the task outputs directly:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "\n",
+ "# list all the files in the build directory\n",
+ "for file in os.listdir(BLD):\n",
+ " print(file)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can use these to build subsequent tasks later.\n",
+ "\n",
+ "## More Complex Tasks & The Data Catalog\n",
+ "\n",
+ "As we define more complex tasks, we can use the `pytask` data catalog to manage the inputs and outputs of our tasks. The data catalog allows us to imperatively name the data and their formats, making it easier to manage the data flow in our tasks. Importantly, we can define the data pythonically, which allows us to use the full power of Python to manipulate and transform our data. This is particularly more useful than snakemake's approach, which requires you to define the data in a more static way using paths and a separate pseudo-language.\n",
+ "\n",
+ "The content of the `era5_sandbox.config` module can be extended to include a data catalog:\n",
+ "\n",
+ "```python\n",
+ "from pathlib import Path\n",
+ "from pytask import DataCatalog, Product\n",
+ "\n",
+ "SRC = Path(__file__).parent.resolve()\n",
+ "BLD = SRC.joinpath(\"..\", \"..\", \"bld\").resolve()\n",
+ "\n",
+ "demo_catalog = DataCatalog()\n",
+ "```\n",
+ "\n",
+ "With just this definition, we're now able to refer directly to data by name in our tasks, and `pytask` will handle the paths and formats for us. This allows us to focus on the logic of our tasks rather than the details of data management.\n",
+ "\n",
+ ":::{.callout-note}\n",
+ "This is a major advantage of `pytask` over `snakemake`, as it allows you to define the data in a more flexible and Pythonic way, while still maintaining the benefits of a task management system. It is a similar approach to building pipelines in R with targets, which allows you to define the data in a more flexible way.\n",
+ ":::\n",
+ "\n",
+ "Let's create a task that modifies the data frame by adding a new column. This task will depend on the previous task's output, and we will use the data catalog to define the input and output data."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "def task_add_one(\n",
+ " path_to_data: Annotated[Path, BLD / \"data.pkl\"], # Path to the data file created by the previous task\n",
+ " node: Annotated[PickleNode, Product] = demo_catalog[\"mydata\"]\n",
+ ") -> None:\n",
+ " \"\"\"\n",
+ " Add one to the 'y' column of the data frame and save it as a new pickle file.\n",
+ " \"\"\"\n",
+ " df = pd.read_pickle(path_to_data)\n",
+ " df['z'] = df['y'] + 1\n",
+ " \n",
+ " node.save(df)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this function, we've defined that the task relies on the output of the first task being there, the `data.pkl` file. But importantly, we've also defined our product as a `node` from the `PickleNode` module. This will allow `pytask` to handle the serialization and deserialization of the data frame automatically, so we don't have to worry about the details of how the data is stored. We create the datacatalog in our config file, and then tell this task to create a Node in that catalog called `mydata`. Whatever we save with the `node.save()` method will be saved in the build directory, but more importantly _will be indexed and hashed by `pytask`_. This means that if the data changes, `pytask` will know to rerun the task.\n",
+ "\n",
+ "To make this even more pythonic, we can modify the format of our task function so that the return type annotator is used as a node in the data catalog. This allows us to define the output of the task as a `PickleNode`, which will automatically handle the serialization and deserialization of the data frame.\n",
+ "\n",
+ ":::{.callout-note}\n",
+ "This is another trick I'm deriving from {targets}. By formatting tasks as pure functions where inputs are parameters and targets are return type annotations, we can define the output of the task as a `PickleNode`, which will automatically handle the serialization and deserialization of the data frame. This again allows us to focus on the logic of our tasks rather than the details of data management.\n",
+ ":::\n",
+ "\n",
+ "So below, we're directly accessing the `data_catalog` to get the `mydata` node, and then modifying it by adding a new column. It _feels_ like we are doing this in place, such as in an iPython session, because we are allowing `pytask` to handle the serialization of the file on disk for us."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "def task_add_another_column(\n",
+ " df: Annotated[pd.DataFrame, demo_catalog[\"mydata\"]] # which object in the catalog to fetch from the catalog with node.load()\n",
+ ") -> Annotated[pd.DataFrame, demo_catalog[\"mydata2\"]]: # which object in the catalog to save the return value to\n",
+ " \"\"\"\n",
+ " Add another column to the data frame stored in the PickleNode.\n",
+ " \"\"\"\n",
+ "\n",
+ " # use the datacatalog directly to access the node\n",
+ " # this is a bit like accessing the node in an iPython session, but pytask\n",
+ " # will handle the serialization and deserialization for us\n",
+ " df['w'] = df['z'] * df['y']\n",
+ " \n",
+ " return df"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To test this interactively, we'd have to import the data catalog's object"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = demo_catalog[\"mydata\"].load() # load the data frame from the PickleNode\n",
+ "result = task_add_another_column(df) # call the task function with the loaded data frame"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "result"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now that we know it will work, we can invoke pytask:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "%%sh\n",
+ "pytask"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Notice that the outputs are cached and not recomputed unless the inputs change. This is a key feature of `pytask` and other DAGs, allowing you to efficiently manage your data processing tasks without unnecessary recomputation.\n",
+ "\n",
+ "## Conclusion\n",
+ "\n",
+ "The takeaway here is that with `pytask`, you can define pure functions that take inputs and return outputs, and build a DAG of tasks that can be executed in a flexible and efficient way. This allows you to focus on the logic of your tasks rather than the details of data management, while still maintaining the benefits of a task management system. The key elements are:\n",
+ "\n",
+ "- **Task annotation**: You define your tasks by creating pure functions that take inputs and return outputs, and use decorators or naming conventions to mark them as \"tasks\" in a dag\n",
+ "- **Input and output annotation**: You define the inputs and outputs of your tasksusing type hints, and allow `pytask` to automatically detect and handle the dependencies between tasks.\n",
+ "- **Data catalog**: You define your data in a Pythonic object in your config called `data_catalog`. As you iteratively develop your DAG, you add objects to the data catalog, which are called nodes. As long as a node is a pythonic object and has a pickle method, `pytask` will handle the serialization and deserialization of the data for you."
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "python3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notes/20_pytask_config.ipynb b/notes/20_pytask_config.ipynb
new file mode 100644
index 0000000..2ea8116
--- /dev/null
+++ b/notes/20_pytask_config.ipynb
@@ -0,0 +1,530 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "title: \"`pytask` Config: Defining the Pipeline Internals in `pytask`\"\n",
+ "engine: jupyter\n",
+ "---\n",
+ "\n",
+ "## config\n",
+ "\n",
+ "> This is the config module for the `pytask` pipeline. \n",
+ "This module defines the data catalog(s) and any hard-coded parameters that are used throughout the pipeline."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| default_exp config:\n",
+ "#"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| hide:\n",
+ "#\n",
+ "from nbdev.showdoc import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports: \n",
+ "#\n",
+ "\n",
+ "import pandas as pd\n",
+ "\n",
+ "from pathlib import Path\n",
+ "from pyprojroot import here\n",
+ "from pytask import DataCatalog\n",
+ "\n",
+ "\n",
+ "SRC = here() / \"src\" / \"era5_sandbox\"\n",
+ "BLD = here() / \"bld\"\n",
+ "\n",
+ "demo_catalog = DataCatalog()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## `DEV_MODE`: A Quick Development Flag\n",
+ "\n",
+ "I'm adding a flag to the config that can be used for quick development. \n",
+ "If you import this boolean variable, it can be used to skip tasks,\n",
+ "setup samples, etc. on the fly by `marking` a task with the `pytask.mark.skipif`\n",
+ "decorator. Change this to `False` when you're ready to run the full pipeline."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "DEV_MODE=True"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## The Data Catalog\n",
+ "\n",
+ "To manage our pipeline, we're going to use a nested data catalog structure.\n",
+ "This way, we can easily return specific entries to specific tasks\n",
+ "without having to manage multiple different data catalogs. Specifically,\n",
+ "we'll have a data catalog for each stage of the pipeline, and each catalog\n",
+ "will have entries for the inputs, outputs, and any other parameters needed\n",
+ "for that stage. This is similar to how we used Hydra configs, but\n",
+ "using the `pytask` data catalog, we can more easily gather the data\n",
+ "for a specific task in structured manner entirely in Python."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "stages = [\"mydata\", 'mydata2', # from the demo, ignore\n",
+ " \"download\", # download task\n",
+ " \"aggregate\", # aggregation task\n",
+ " \"publish\", # publishing task\n",
+ " \"viz\"] # visualization task\n",
+ "\n",
+ "buckets = [\n",
+ " \"inputs\", # any specific inputs, eg for carrying over between tasks\n",
+ " \"outputs\", # specific output task returns\n",
+ " \"jobs\", # job parameters as a dataframe\n",
+ " \"params\" # any lingering hardcoded parameters\n",
+ " ]\n",
+ "\n",
+ "data_catalog = {\n",
+ "\n",
+ " stage: {bucket: DataCatalog(name=f\"{stage}_{bucket}\") for bucket in buckets}\n",
+ " for stage in stages\n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## The Download Task\n",
+ "\n",
+ "A good strategy may be to set pipeline stage parameters in the config file, \n",
+ "and then use the `pytask` data catalog to manage the data. This way, we can\n",
+ "easily change the parameters without having to modify the code. This is especially \n",
+ "useful for the API query, where we need to be able to set the parameter grid for\n",
+ "the years and data types we want to download data for. So, let's create an entry in the data catalog specifically for the download task.\n",
+ "\n",
+ "A good strategy I thought about for grid parameter comprehension is to create a dataframe expands all the combinations of\n",
+ "parameters, and then uses each combination to create the tasks which are then \n",
+ "easily added to the data catalog. This way, we can still easily inspect the \n",
+ "pipeline and see what tasks are being run, while also being able to easily \n",
+ "change the parameters in the config file without too much hassle.\n",
+ "\n",
+ "An important framework decision I'm making here is that each ROW of the dataframe corresponds to a single task, so that we can quickly understand at a glance what the task is doing, and also easily develop the code for the task itself. This is different from the hydra approach where a job is first specified by a default config, and then the parameters are swept over in multiple config files. This is a more flexible approach, IMO, because:\n",
+ "\n",
+ "1. each row defines a single task run, so it's easy to understand what the run is doing\n",
+ "2. it's easy to add or remove runs by simply expanding the list of parameters and using dataframe filters to remove irrelevant parameter combinations\n",
+ "3. we don't have to independently inspect and manage multiple different/overriding config files\n",
+ "4. it's all in Python, so we can use the full power of the language to define\n",
+ " the parameters and the tasks in a single sweep, not through the need of\n",
+ " hydra+snakemake multi stage/multi-lingual config system\n",
+ "\n",
+ "So, to do this, we define one job as a query to the CDS API that must contain:\n",
+ "- The dataset (re-analysis)\n",
+ "- The year\n",
+ "- The month\n",
+ "- All days in the month\n",
+ "- All times of day (hour)\n",
+ "- The geography (region), which will need:\n",
+ " - The URL to the shapefile to calculate the bounding box\n",
+ "\n",
+ "Given one combination of all of these, a single SLURM job can complete the first \"task\" in parallel by having a run assigned to each row of the dataframe."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "\n",
+ "# a dataframe for the query parameters, with nested entries for days, times, and variables\n",
+ "# Dimensions\n",
+ "years = [str(x) for x in range(2009, 2025)] # 16 years\n",
+ "months = [str(x).zfill(2) for x in range(1, 13)] # 12 months\n",
+ "geographies = [\"madagascar\", \"nepal\"] # 2 geographies\n",
+ "\n",
+ "# nested values; we want ALL days, times, and variables for each job\n",
+ "days = [str(x).zfill(2) for x in range(1, 32)]\n",
+ "times = [f\"{x:02d}:00\" for x in range(24)]\n",
+ "variables = [\"2m_dewpoint_temperature\", \"2m_temperature\", \"total_precipitation\", \"volumetric_soil_water_layer_1\"]\n",
+ "\n",
+ "product_type = \"reanalysis\"\n",
+ "\n",
+ "# Map shapefiles to geography\n",
+ "shapefiles = {\n",
+ " \"madagascar\": \"https://data.humdata.org/dataset/26fa506b-0727-4d9d-a590-d2abee21ee22/resource/ed94d52e-349e-41be-80cb-62dc0435bd34/download/mdg_adm_bngrc_ocha_20181031_shp.zip\",\n",
+ " \"nepal\": \"https://data.humdata.org/dataset/07db728a-4f0f-4e98-8eb0-8fa9df61f01c/resource/2eb4c47f-fd6e-425d-b623-d35be1a7640e/download/npl_adm_nd_20240314_ab_shp.zip\"\n",
+ "}\n",
+ "\n",
+ "# Build row-wise combinations of (year, month, geography)\n",
+ "rows = []\n",
+ "for year in years:\n",
+ " for month in months:\n",
+ " for geo in geographies:\n",
+ " rows.append({\n",
+ " \"year\": year,\n",
+ " \"month\": month,\n",
+ " \"geography\": geo,\n",
+ " \"shapefile\": shapefiles[geo],\n",
+ " \"product_type\": product_type,\n",
+ " \"day\": days,\n",
+ " \"time\": times,\n",
+ " \"variables\": variables,\n",
+ " \"output\": f\"{year}_{month}_{geo}\"\n",
+ " })\n",
+ "\n",
+ "# Create dataframe\n",
+ "query_df = pd.DataFrame(rows)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "query_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(f\"Number of estimated jobs: {query_df.shape[0]}. Examples...\")\n",
+ "\n",
+ "for i, row in query_df.sample(3).iterrows():\n",
+ " print(f\"Year: {row['year']}, Month: {row['month']}, Geography: {row['geography']}, Link: {row['shapefile']}, Variables: {row['variables']}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now add them to the catalog. We're going to use a dictionary to\n",
+ "nest data catalogs so that we can return specific task products to\n",
+ "named data catalog nodes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| export:\n",
+ "# set up catalog\n",
+ "\n",
+ "data_catalog['download']['jobs'].add(\"queries_df\", query_df)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Our data catalog now has a `download|jobs` node with a `queries_df` entry that contains the dataframe of all the jobs to be run in this task."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data_catalog['download']['jobs']['queries_df'].load().head()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## The Aggregation Task\n",
+ "\n",
+ "To carry out the aggregation, we will follow similar logic to the original pipeline and use xarray to aggregate data into spatial and temporal averages. The aggregation task will take the downloaded data and compute the mean over the specified time period and spatial region. However, in this case, we want to aggregate the data diurnally, so we will need to fetch the sundown and sunrise times for the region and use them to compute the diurnal averages.\n",
+ "\n",
+ "Once again, we will use a dataframe to define the parameters for the aggregation task.\n",
+ "\n",
+ "Here we will use a dataframe with the jobs as rows;\n",
+ "the first column is \"input\" which is the list of query names from\n",
+ "the download task, and the last column is the output object name. Columns\n",
+ "in between can be the parameters needed for the aggregation task, which\n",
+ "then get expanded to the full list of jobs with `itertools.product`, `explode` or similar,\n",
+ "and filtered as necessary.\n",
+ "\n",
+ "For explanations of the parameters, see the Aggregation Task notebook's final `task_aggregate_data_diurnal` function."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "\n",
+ "# aggregate task parameters\n",
+ "\n",
+ "inputs = query_df[\"output\"].tolist()\n",
+ "outputs = [f\"{i}_agg\" for i in inputs]\n",
+ "\n",
+ "variable_dict = {\n",
+ " \"2m_dewpoint_temperature\": \"d2m\",\n",
+ " \"2m_temperature\": \"t2m\",\n",
+ " \"total_precipitation\": \"tp\",\n",
+ " \"volumetric_soil_water_layer_1\": \"swvl1\"\n",
+ "}\n",
+ "\n",
+ "# list of params that get fed into the task functions\n",
+ "agg_params = {\n",
+ " \"time\": [\"day\", \"night\"],\n",
+ " \"solar_classification\": [\"before\"],\n",
+ " \"variables\": variables,\n",
+ " \"variables_short\": [variable_dict[x] for x in variables],\n",
+ " \"aggregation_name\": [\"mean\", \"sum\", \"max\", \"min\"]\n",
+ "}\n",
+ "\n",
+ "from itertools import product\n",
+ "import pandas as pd\n",
+ "\n",
+ "# expand all the params\n",
+ "agg_params = pd.DataFrame(list(product(*agg_params.values())), columns=agg_params.keys())"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Inspecting it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "agg_params"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's keep only rows where the variables and variables_short match"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# quick filter to keep only matching rows\n",
+ "\n",
+ "agg_params = agg_params[agg_params.apply(lambda x: variable_dict[x['variables']] == x['variables_short'], axis=1)]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "agg_params"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Great, and now keeping `sum` only for total precipitation (we don't need mean, max, min for that variable), and removing `sum` for all other variables (we don't need sum for temperature or soil moisture):"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# remove rows where tp aggregation is not sum\n",
+ "mask = (agg_params['variables_short'] == \"tp\") & (agg_params['aggregation_name'] != \"sum\")\n",
+ "agg_params = agg_params[~mask]\n",
+ "\n",
+ "# remove rows where non-tp aggregation is sum\n",
+ "mask = (agg_params['variables_short'] != \"tp\") & (agg_params['aggregation_name'] == \"sum\")\n",
+ "agg_params = agg_params[~mask]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "agg_params"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we add the input and output columns by joining:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# set up inputs and parameters\n",
+ "inputs = pd.DataFrame({\"input\": inputs})\n",
+ "aggregate_jobs = inputs.merge(agg_params, how=\"cross\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This result gives us the full list of jobs for the aggregation task. 20 rows for the parameters,\n",
+ "and 384 inputs/outputs, giving a total of 7680 jobs:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "assert aggregate_jobs.shape[0] == 20 * len(inputs)\n",
+ "aggregate_jobs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A few more configuration items need to be added, like\n",
+ "the local timezone for each geography, the healthshed filename,\n",
+ "the healthshed unique ID variable name in the shapefile,\n",
+ "and whether the variable is instantaneous or accumulated:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# add a few more columns\n",
+ "aggregate_jobs['local_tz'] = aggregate_jobs['input'].apply(\n",
+ " lambda x: \"Asia/Kathmandu\" if \"nepal\" in x else \"Indian/Antananarivo\"\n",
+ ")\n",
+ "aggregate_jobs['shapefile'] = aggregate_jobs['input'].apply(\n",
+ " lambda x: \"Nepal_Healthsheds2024.zip\" if \"nepal\" in x else \"healthsheds2022.zip\"\n",
+ ")\n",
+ "\n",
+ "aggregate_jobs['hshd_unique_id'] = aggregate_jobs['input'].apply(\n",
+ " lambda x: \"fid\" if \"nepal\" in x else \"fs_uid\"\n",
+ ")\n",
+ "\n",
+ "aggregate_jobs['climate_handler_var'] = aggregate_jobs['variables_short'].apply(\n",
+ " lambda x: \"accum\" if x == \"tp\" else \"instant\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "aggregate_jobs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we add this to the data catalog:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# update catalog\n",
+ "data_catalog['aggregate']['jobs'].add(\"jobs_df\", aggregate_jobs)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Our data catalog now has an `aggregate|jobs` node with a `jobs_df` entry that contains the dataframe of all the jobs to be run in this task."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "data_catalog['aggregate']['jobs']['jobs_df'].load().head()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "python3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notes/20_pytask_logger.ipynb b/notes/20_pytask_logger.ipynb
new file mode 100644
index 0000000..e128bc1
--- /dev/null
+++ b/notes/20_pytask_logger.ipynb
@@ -0,0 +1,95 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "title: \"Logging: A simple logger to inject into `pytask` jobs\"\n",
+ "engine: jupyter\n",
+ "---\n",
+ "\n",
+ "## logger\n",
+ "\n",
+ "> A simple logger module for the pytask tasks"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| default_exp pytask_logger:\n",
+ "#|"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| hide:\n",
+ "# showdoc\n",
+ "from nbdev.showdoc import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# imports \n",
+ "\n",
+ "import logging\n",
+ "from pathlib import Path\n",
+ "from pyprojroot import here\n",
+ "from datetime import datetime\n",
+ "\n",
+ "LOG_DIR = here(\"logs\")\n",
+ "# get the date & time for the log file name\n",
+ "log_date = datetime.now().strftime(\"%Y-%m-%d\")\n",
+ "log_time = datetime.now().strftime(\"%H-%M-%S\")\n",
+ "LOG_DIR = here(\"logs\") / log_date / log_time"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# main function to setup a logger\n",
+ "\n",
+ "\n",
+ "\n",
+ "def setup_logger(name: str, log_path: Path=LOG_DIR, level=logging.INFO) -> logging.Logger:\n",
+ " log_path.mkdir(parents=True, exist_ok=True)\n",
+ " formatter = logging.Formatter('%(asctime)s — %(name)s — %(levelname)s — %(message)s')\n",
+ "\n",
+ " handler = logging.FileHandler(log_path / f\"{name}.log\", mode='a')\n",
+ " handler.setFormatter(formatter)\n",
+ "\n",
+ " logger = logging.getLogger(name)\n",
+ " logger.setLevel(level)\n",
+ " logger.addHandler(handler)\n",
+ " logger.propagate = False\n",
+ "\n",
+ " return logger"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "python3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notes/21_pytask_download.ipynb b/notes/21_pytask_download.ipynb
new file mode 100644
index 0000000..6fb2d46
--- /dev/null
+++ b/notes/21_pytask_download.ipynb
@@ -0,0 +1,257 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "title: \"Download: `download` Module as a `pytask` Task\"\n",
+ "engine: jupyter\n",
+ "---\n",
+ "\n",
+ "## task_download \n",
+ "\n",
+ "> This module downloads the raw era5 data from the CDS API. It is similar to the original script, refactored for `pytask`."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| default_exp task_download:\n",
+ "#|"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| hide:\n",
+ "# showdoc\n",
+ "from nbdev.showdoc import *"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We're going to quickly refactor the pipeline to use pytask instead of hydra and snakemake. This will hopefully demonstrate a simpler and more flexible way to manage data pipelines in Python.\n",
+ "\n",
+ "To start off, we need to create a function that queries the CDS API with one job. This function will be used to download the data for each query in the range specified in the data catalog in the config file.\n",
+ "\n",
+ "Let's take a look at the data catalog we created in the config module:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| export:\n",
+ "# necessary imports\n",
+ "import cdsapi\n",
+ "import pytask\n",
+ "import os\n",
+ "from pytask import task, Product\n",
+ "from pathlib import Path\n",
+ "from typing import Annotated\n",
+ "from pandas import Series\n",
+ "\n",
+ "from era5_sandbox.config import data_catalog\n",
+ "from era5_sandbox.config import BLD\n",
+ "from era5_sandbox.config import DEV_MODE\n",
+ "from era5_sandbox.pytask_logger import setup_logger\n",
+ "from era5_sandbox.download import fetch_GADM, create_bounding_box"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "You can see the queries entry we created in the data catalog. Each query is a row of a dataframe that contains the parameters for the CDS API query."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "queries = data_catalog['download']['jobs']['queries_df'].load()\n",
+ "queries"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can test this query like we did in the original work:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "example_query = queries.iloc[0]\n",
+ "\n",
+ "create_bounding_box(example_query['shapefile'])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "In this way, we have a similar approach as Hydra configs, but, using the `pytask` data catalog, we can more easily gather the data for a specific task in structured manner entirely in Python."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "\n",
+ "client = cdsapi.Client()\n",
+ "\n",
+ "ex_bounding_box = create_bounding_box(example_query['shapefile'])\n",
+ "\n",
+ "request = {\n",
+ " \"product_type\": example_query['product_type'],\n",
+ " \"variable\": example_query['variables'], \n",
+ " \"year\": str(example_query['year']),\n",
+ " \"month\": str(example_query['month']),\n",
+ " \"day\": example_query['day'],\n",
+ " \"time\": example_query['time'],\n",
+ " \"data_format\": \"netcdf\",\n",
+ " \"download_format\": \"unarchived\",\n",
+ " \"area\": ex_bounding_box\n",
+ " }\n",
+ "\n",
+ "target = f\"{example_query['output']}.nc\"\n",
+ "\n",
+ "client.retrieve(\"reanalysis-era5-single-levels\", request).download(target)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This works! So now we just need to create a `task_` function that pytask will recognise to parallelise the download of queries over:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| export:\n",
+ "# define the download task\n",
+ "\n",
+ "queries = data_catalog['download']['jobs']['queries_df'].load()\n",
+ "\n",
+ "for i, job in queries.iterrows():\n",
+ "\n",
+ " @task(id=job['output'], name=f\"Download {job['output']}\")\n",
+ " def task_download_raw_data(\n",
+ " _query: Series = job # The query object from the data catalog\n",
+ " )-> Annotated[Path, data_catalog['download']['outputs'][job['output']]]:\n",
+ " \n",
+ " logger = setup_logger(_query['output'])\n",
+ " output_path = BLD / f\"{_query['output']}.nc\"\n",
+ " logger.info(f\"Starting download for {_query['output']} to {output_path}\")\n",
+ "\n",
+ " # check if string file path exists\n",
+ " if os.path.exists(output_path):\n",
+ " logger.info(f\"File {output_path} already exists. Skipping download.\")\n",
+ " return output_path\n",
+ "\n",
+ " client = cdsapi.Client()\n",
+ " bounding_box = create_bounding_box(_query['shapefile'])\n",
+ " \n",
+ " request = {\n",
+ " \"product_type\": _query['product_type'],\n",
+ " \"variable\": _query['variables'], \n",
+ " \"year\": _query['year'],\n",
+ " \"month\": _query['month'],\n",
+ " \"day\": _query['day'],\n",
+ " \"time\": _query['time'],\n",
+ " \"data_format\": \"netcdf\",\n",
+ " \"download_format\": \"unarchived\",\n",
+ " \"area\": bounding_box\n",
+ " }\n",
+ " \n",
+ " client.retrieve(\"reanalysis-era5-land\", request).download(output_path)\n",
+ " logger.info(f\"Downloaded data for {_query['output']} to {output_path}\")\n",
+ "\n",
+ " return output_path"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### How this works (with some help from GPT):\n",
+ "\n",
+ "#### 🧠 How pytask Discovers and Executes Tasks\n",
+ "\n",
+ "When you run pytask, it automatically scans your project for Python files named `task_*.py`. In these files, it looks for:\n",
+ "- Functions decorated with `@task`, or\n",
+ "- Functions prefixed with `task_`\n",
+ "\n",
+ "These functions are not executed immediately. Instead, `pytask`:\n",
+ "1.\tImports each task_*.py module (just like Python would)\n",
+ "2.\tRegisters any matching task functions as nodes in a directed acyclic graph (DAG)\n",
+ "3.\tResolves dependencies by analyzing:\n",
+ " - Input annotations (e.g., `Annotated[x, DependsOn]`)\n",
+ " - Output declarations (e.g., `return` values or `Product` annotations)\n",
+ "4.\tBuilds the DAG, where each task function is a node\n",
+ "5.\tExecutes the tasks, respecting dependency order and skipping up-to-date nodes\n",
+ "\n",
+ "So even though the task functions aren’t explicitly “run” in the Python code itself, pytask knows how and when to execute them — based on their position in the DAG.\n",
+ "\n",
+ "#### 🔄 How This Differs from Snakemake\n",
+ "\n",
+ "In `snakemake`, you’re expected to define a series of explicitly executable rules, often using shell commands or Python scripts. You “stitch together” rules using filenames and wildcard matching.\n",
+ "\n",
+ "In contrast:\n",
+ "- 🐍 pytask is Python-native — tasks are just regular Python functions\n",
+ "- ⚙️ It builds a DAG from those functions and tracks inputs/outputs automatically\n",
+ "- 🧱 You are declaring nodes, not scripting execution\n",
+ "\n",
+ "Think of your Python files not as scripts to run, but as a way to define and wire together declarative tasks that will be executed by the pytask engine.\n",
+ "\n",
+ "---\n",
+ "\n",
+ "Because we defined this task in a function and loop, we can easily debug a node in the DAG by simply calling it:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "task_download_raw_data()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "python3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notes/22_pytask_aggregate.ipynb b/notes/22_pytask_aggregate.ipynb
new file mode 100644
index 0000000..6f0bccc
--- /dev/null
+++ b/notes/22_pytask_aggregate.ipynb
@@ -0,0 +1,906 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "---\n",
+ "title: \"Aggregation: The `aggregation` Module as a `pytask` Task\"\n",
+ "format: html\n",
+ "engine: jupyter\n",
+ "---\n",
+ "\n",
+ "# task_aggregate\n",
+ "\n",
+ "> This task aggregates the downloaded data into spatial and temporal averages. It uses xarray to compute summary statistics over the specified time period and spatial region. The aggregation is done diurnally, so we will fetch the sundown and sunrise times for the region and use them to compute the diurnal averages."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| default_exp task_aggregate:\n",
+ "#"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| hide:\n",
+ "# showdoc\n",
+ "\n",
+ "from nbdev.showdoc import *"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| export:\n",
+ "#\n",
+ "\n",
+ "import os\n",
+ "import tempfile\n",
+ "import rasterio\n",
+ "import yaml\n",
+ "import xarray as xr\n",
+ "from pyprojroot import here\n",
+ "from typing import Literal\n",
+ "from pytask import task, Product\n",
+ "from pathlib import Path\n",
+ "from typing import Annotated\n",
+ "from rasterstats.io import Raster\n",
+ "\n",
+ "from era5_sandbox.config import BLD, data_catalog\n",
+ "from era5_sandbox.pytask_logger import setup_logger\n",
+ "\n",
+ "from era5_sandbox.core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius\n",
+ "\n",
+ "from era5_sandbox.aggregate import polygon_to_raster_cells, aggregate_to_healthsheds, RasterFile, netcdf_to_tiff"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Diurnal Classification Based on Sun Position\n",
+ "\n",
+ "To do diurnal classificaiton, we will need to fetch the sundown and sunrise times for the region and use them to compute the diurnal averages. We will use the [astral library](https://astral.readthedocs.io/en/latest/) to get the sunrise and sunset times for the specified latitude and longitude. The aggregation will be done using xarray, which allows us to compute the mean over the specified time period and spatial region.\n",
+ "\n",
+ "Here's our example file:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "eg_file = data_catalog['download']['outputs']['2009_01_nepal'].load()\n",
+ "with ClimateDataFileHandler(eg_file) as handler:\n",
+ " \n",
+ " ds = xr.open_dataset(handler.get_dataset(\"instant\"))\n",
+ " #ds = xr.open_dataset(handler.get_dataset(\"accum\"))\n",
+ "\n",
+ "ds"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can see the astral library in action below:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "from astral import Observer, sun\n",
+ "import pandas as pd\n",
+ "import numpy as np\n",
+ "from tqdm import tqdm\n",
+ "import random\n",
+ "import datetime\n",
+ "from pytz import UTC"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# get the location of a datapoint in the dataset\n",
+ "lat, long = ds.coords[\"latitude\"].values[0], ds.coords[\"longitude\"].values[0]\n",
+ "time = ds['valid_time'].values[0]\n",
+ "dt = pd.to_datetime(time, utc=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "dt"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "observer = Observer(latitude=lat, longitude=long, elevation=0)\n",
+ "sun_info = sun.sun(observer, date=dt)\n",
+ "sun_info"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Astral is very fast:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%timeit\n",
+ "\n",
+ "#fetch a random time from valid_time\n",
+ "options = ds['valid_time'].values\n",
+ "\n",
+ "random_time = random.choice(options)\n",
+ "dt = pd.to_datetime(random_time, utc=True)\n",
+ "sun_info = sun.sun(observer, date=dt)\n",
+ "if dt < sun_info['sunrise']:\n",
+ " print(f\"Randomly selected time: {dt} is pre_dawn\")\n",
+ "elif dt >= sun_info['sunrise'] and dt < sun_info['sunset']:\n",
+ " print(f\"Randomly selected time: {dt} is day\")\n",
+ "else:\n",
+ " print(f\"Randomly selected time: {dt} is post_dusk\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This tells us that we can use the valid time for the specific location of each data point in the query and know based on the sun whether it was daytime or nighttime. The runtime will be limited only by the looping.\n",
+ "Let's put this in a function so that we can use the resampling in `xarray`.\n",
+ "\n",
+ "The resampling approach will be a single function that can resample in three ways:\n",
+ "\n",
+ "- By calendar date, default (1 value per calendar date)\n",
+ "- By diurnal class by calendar date (3 values, pre-dawn, day, post-dusk)\n",
+ "- By solar date (2 values per calendar date, with night classified as \"before\" or \"after\")\n",
+ "\n",
+ "Therefore, we'll need 2 internal functions; one to do diurnal, and one to do solar date bins.\n",
+ "\n",
+ "Essentially, we are going to create an array-shaped index/mask, (time, latitude, longitude). As a\n",
+ "demonstration, this loop goes through the first 24 time points in the dataset,\n",
+ "and calculates the sun info for each latitude and longitude, assigning the values to an array:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%time \n",
+ "times = ds['valid_time'].values[:24]\n",
+ "lats = ds.coords['latitude'].values\n",
+ "lons = ds.coords['longitude'].values\n",
+ "\n",
+ "result = np.full((len(times), len(lats), len(lons)), \"\", dtype=object)\n",
+ "\n",
+ "for i, dt in enumerate(times):\n",
+ "\n",
+ " for j, lat in enumerate(lats):\n",
+ "\n",
+ " for k, lon in enumerate(lons):\n",
+ " \n",
+ " # set the geographical position\n",
+ " observer = Observer(latitude=lat, longitude=lon, elevation=0)\n",
+ " \n",
+ " # use the time\n",
+ " dt = pd.to_datetime(dt, utc=True)\n",
+ "\n",
+ " # where/when is the sun at this time for this position\n",
+ " sun_info = sun.sun(observer, date=dt)\n",
+ " result[i, j, k] = sun_info"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "So we know that in the first hour, the sun goes up and comes down at slightly different\n",
+ "times based on latitude and longitude. Take the first hour, for example:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "print(result.shape)\n",
+ "hour_1 = 0 # 0th index of the results\n",
+ "\n",
+ "min_lat = 0\n",
+ "min_lon = 0\n",
+ "max_lat = 48\n",
+ "max_lon = 90\n",
+ "print(f\"Even though the reading came from the first HOUR of data UTC, the sun info at the minimum latitude/longitude is: {result[hour_1, min_lat, min_lon]}\")\n",
+ "\n",
+ "print(f\"this is different from the sun info at the maximum latitude/longitude is: {result[hour_1, max_lat, max_lon]}\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| export:\n",
+ "# define the basic diurnal classification function\n",
+ "\n",
+ "def compute_diurnal_class_bins(\n",
+ " ds: xr.Dataset\n",
+ " )-> np.ndarray:\n",
+ " \"\"\"\n",
+ " Compute the diurnal value for each data point in the dataset.\n",
+ " This function iterates over each data point in the dataset,\n",
+ " calculates the sunrise and sunset times for the given time, latitude and longitude,\n",
+ " and returns whether or not that data point is before dawn, during the day, or after dusk.\n",
+ " \"\"\"\n",
+ "\n",
+ " times = ds['valid_time'].values\n",
+ " lats = ds.coords['latitude'].values\n",
+ " lons = ds.coords['longitude'].values\n",
+ "\n",
+ " result = np.full((len(times), len(lats), len(lons)), \"\", dtype=object)\n",
+ "\n",
+ " for i, dt in enumerate(tqdm(times, desc=\"Classifying data points by sun position\")):\n",
+ " # use the time\n",
+ " dt = pd.to_datetime(dt, utc=True)\n",
+ "\n",
+ " for j, lat in enumerate(lats):\n",
+ "\n",
+ " for k, lon in enumerate(lons):\n",
+ " \n",
+ " # set the geographical position\n",
+ " observer = Observer(latitude=lat, longitude=lon, elevation=0)\n",
+ " \n",
+ " # where/when is the sun at this time for this position\n",
+ " sun_info = sun.sun(observer, date=dt)\n",
+ " \n",
+ " if dt < sun_info['sunrise']:\n",
+ " result[i, j, k] = \"pre_dawn\"\n",
+ " elif dt >= sun_info['sunrise'] and dt < sun_info['sunset']:\n",
+ " result[i, j, k] = \"day\"\n",
+ " else:\n",
+ " result[i, j, k] = \"post_dusk\"\n",
+ "\n",
+ " return result"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ex=compute_diurnal_class_bins(ds)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "So, for our 720 time points, we should find that\n",
+ "if we take the `set()` of all the classifications within that slice,\n",
+ "there should be a few of them with 2 classes.\n",
+ "In other words, at any given hour, almost all of\n",
+ "the readings are \"day\", because it is daytime across all\n",
+ "of Madagascar, _but_ at certain timepoints, the sun is rising\n",
+ "or setting in the northern part of the country and so some\n",
+ "portion of the slice is classified differently:\n",
+ "\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for x in range(720):\n",
+ " print(set(ex[x].flatten()))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This works! Now we can do a similar, but slightly more\n",
+ "complicated function to define \"night\" and \"day\",\n",
+ "where \"night\" includes all of the values after the sun goes down."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "# \n",
+ "\n",
+ "def compute_solar_day_night_class_bins(\n",
+ " ds: xr.Dataset,\n",
+ " night_direction: Literal[\"before\", \"after\"],\n",
+ " )-> list:\n",
+ " \"\"\"\n",
+ " Compute the diurnal value for each data point in the dataset.\n",
+ " This function iterates over each data point in the dataset,\n",
+ " calculates the sunrise and sunset times for the given time, latitude and longitude,\n",
+ " and returns whether or not that data point is daytime or nighttime.\n",
+ " The definition of \"nighttime\" can be set to be all the darkness before the sun\n",
+ " came up (before), or all the darkness after it went down (after).\n",
+ " \"\"\"\n",
+ "\n",
+ " times = ds['valid_time'].values\n",
+ " lats = ds.coords['latitude'].values\n",
+ " lons = ds.coords['longitude'].values\n",
+ "\n",
+ " result = np.full((len(times), len(lats), len(lons)), \"\", dtype=object)\n",
+ " datetimes = np.full((len(times), len(lats), len(lons)), \"\", dtype=object)\n",
+ "\n",
+ " for i, dt in enumerate(tqdm(times, desc=\"Classifying data points by sun position\")):\n",
+ " # use the time\n",
+ " dt = pd.to_datetime(dt, utc=True)\n",
+ "\n",
+ " for j, lat in enumerate(lats):\n",
+ "\n",
+ " for k, lon in enumerate(lons):\n",
+ " \n",
+ " # set the geographical position\n",
+ " observer = Observer(latitude=lat, longitude=lon, elevation=0)\n",
+ " if night_direction == \"before\":\n",
+ " # Night is from previous sunset to today's sunrise\n",
+ " sun_today = sun.sun(observer, date=dt.date())\n",
+ " sun_prev = sun.sun(observer, date=(dt - pd.Timedelta(days=1)).date())\n",
+ " night_start = sun_prev[\"sunset\"].astimezone(pd.Timestamp.utcnow().tz)\n",
+ " night_end = sun_today[\"sunrise\"].astimezone(pd.Timestamp.utcnow().tz)\n",
+ " \n",
+ " # the reading is from yesterday's nighttime\n",
+ " if night_start <= dt < night_end:\n",
+ " result[i, j, k] = \"night\"\n",
+ " # the date counts as today\n",
+ " datetimes[i, j, k] = dt.date()\n",
+ "\n",
+ " # the reading is from daytime\n",
+ " elif sun_today[\"sunrise\"] <= dt < sun_today[\"sunset\"]:\n",
+ " result[i, j, k] = \"day\"\n",
+ " # the date counts as today\n",
+ " datetimes[i, j, k] = dt.date()\n",
+ " \n",
+ " # the reading is from today's nighttime, but counts as tomorrow's night\n",
+ " else:\n",
+ " result[i, j, k] = \"night\"\n",
+ " # the date is tomorrow\n",
+ " datetimes[i, j, k] = (dt + pd.Timedelta(days=1)).date()\n",
+ "\n",
+ " elif night_direction == \"after\":\n",
+ " # Night is from today's sunset to next sunrise\n",
+ " sun_today = sun.sun(observer, date=dt.date())\n",
+ " sun_next = sun.sun(observer, date=(dt + pd.Timedelta(days=1)).date())\n",
+ " night_start = sun_today[\"sunset\"].astimezone(pd.Timestamp.utcnow().tz)\n",
+ " night_end = sun_next[\"sunrise\"].astimezone(pd.Timestamp.utcnow().tz)\n",
+ "\n",
+ " # the reading is from daytime\n",
+ " if sun_today[\"sunrise\"] <= dt < sun_today[\"sunset\"]:\n",
+ " result[i, j, k] = \"day\"\n",
+ " # the date counts as today\n",
+ " datetimes[i, j, k] = dt.date()\n",
+ " # the reading is from tonight\n",
+ " elif night_start <= dt < night_end:\n",
+ " result[i, j, k] = \"night\"\n",
+ " # the date counts as today\n",
+ " datetimes[i, j, k] = dt.date()\n",
+ "\n",
+ " # the reading is from yesterday night\n",
+ " else:\n",
+ " # the date counts as yesterday\n",
+ " result[i, j, k] = \"day\"\n",
+ " datetimes[i, j, k] = (dt - pd.Timedelta(days=1)).date()\n",
+ " else:\n",
+ " raise ValueError(f\"Invalid night_direction: {night_direction}\")\n",
+ "\n",
+ " return result, datetimes"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%%time\n",
+ "ex_class, ex_dt = compute_solar_day_night_class_bins(ds, \"before\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ex_class"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "As before, we should see that most slices are homogenous,\n",
+ "meaning most of the time, all the readings are from the day,\n",
+ "but some slices should have day and night values:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for slice_ in range(720):\n",
+ " print(set(ex_class[slice_].flatten()))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The returned array can serve as new \"variable indexes\" for the dataset:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds_masked = ds.copy()\n",
+ "ds_masked['solar_class'] = (('valid_time', 'latitude', 'longitude'), ex_class)\n",
+ "ds_masked[\"solar_date\"] = ((\"valid_time\", \"latitude\", \"longitude\"), ex_dt)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Diurnal Resampling\n",
+ "\n",
+ "Now, to see if it will resample by both solar day and diurnal class. Let's try by masking and making copies with NaN in the masked values:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds_day = ds_masked.where(ds_masked[\"solar_class\"] == \"day\").drop_vars([\"solar_class\", \"solar_date\"])\n",
+ "ds_night = ds_masked.where(ds_masked[\"solar_class\"] == \"night\").drop_vars([\"solar_class\", \"solar_date\"])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Next, we set the time zone for Madagascar since, to resample by day and night,\n",
+ "we should observe the local time:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds_day = ds_day.assign_coords(valid_time=pd.to_datetime(ds[\"valid_time\"].values).tz_localize(\"UTC\").tz_convert(\"Asia/Kathmandu\"))\n",
+ "ds_night = ds_night.assign_coords(valid_time=pd.to_datetime(ds[\"valid_time\"].values).tz_localize(\"UTC\").tz_convert(\"Asia/Kathmandu\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now if we can resample by day..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ds_day_rs = ds_day.resample(valid_time=\"1D\").reduce(np.nanmean)\n",
+ "ds_night_rs = ds_night.resample(valid_time=\"1D\").reduce(np.nanmean)\n",
+ "ds_day_rs"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Can we successfully convert this to a tiff?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from era5_sandbox.aggregate import netcdf_to_tiff"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "raster_day = netcdf_to_tiff(ds_day_rs, band=1, variable=\"d2m\")\n",
+ "raster_night = netcdf_to_tiff(ds_night_rs, band=1, variable=\"d2m\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Looks great! These two rasters represent one calendar day of daytime and nighttime values.\n",
+ "\n",
+ "### Testing Polygon to Raster Cells & Healthshed Aggregation\n",
+ "\n",
+ "The penultimate step of the aggregate pipeline in the original version is\n",
+ "assigning each datapoint to the respective healthshed. The `vectors` argument\n",
+ "comes from the healthshed, and represents each geographic polygon on the ground\n",
+ "that we want to aggregate data to."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from hydra import initialize, compose"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "try:\n",
+ " with initialize(version_base=None, config_path=\"../conf\"):\n",
+ " cfg = compose(config_name='config.yaml')\n",
+ "except Exception as e:\n",
+ " print(f\"Error initializing Hydra: {e}\")\n",
+ " with initialize(version_base=None, config_path=\"conf\"):\n",
+ " cfg = compose(config_name='config.yaml')\n",
+ "\n",
+ "driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)\n",
+ "drive = driver.get_drive()\n",
+ "healthsheds = driver.read_healthsheds(\"Nepal_Healthsheds2024.zip\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "res_poly2cell=polygon_to_raster_cells(\n",
+ " vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions\n",
+ " raster=raster_day.data, # the raster data above\n",
+ " nodata=np.nan, # any intersections with no data, may have to be np.nan\n",
+ " affine=raster_day.transform, # some math thing need to revise\n",
+ " all_touched=True, \n",
+ " verbose=True\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "This works fine. Finally, we aggregate to healthsheds:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from era5_sandbox.aggregate import aggregate_to_healthsheds"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "result_day = aggregate_to_healthsheds(\n",
+ " res_poly2cell=res_poly2cell,\n",
+ " raster=raster_day,\n",
+ " shapes=healthsheds,\n",
+ " names_column=\"fid\",\n",
+ " aggregation_func=np.nanmean,\n",
+ " aggregation_name=\"mean_dewpoint_day\"\n",
+ ")\n",
+ "\n",
+ "result_night = aggregate_to_healthsheds(\n",
+ " res_poly2cell=res_poly2cell,\n",
+ " raster=raster_night,\n",
+ " shapes=healthsheds,\n",
+ " names_column=\"fid\",\n",
+ " aggregation_func=np.nanmean,\n",
+ " aggregation_name=\"mean_dewpoint_night\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Below shows the result of aggregating the daytime dewpoint temperature to the healthshed level:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "result_day"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "result_night"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "So from one input, we will have two outputs, one for daytime and one for nighttime, and this will have to loop over the bands (ie each day in the month).\n",
+ "\n",
+ "# Putting it all together in a `pytask` task\n",
+ "\n",
+ "Below we define our `pytask` task to aggregate data to the healthshed level."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| exports:\n",
+ "#\n",
+ "\n",
+ "job_rows = data_catalog['aggregate']['jobs']['jobs_df'].load()\n",
+ "\n",
+ "aggregation_funcs = {\n",
+ " \"mean\": np.nanmean,\n",
+ " \"sum\": np.nansum,\n",
+ " \"max\": np.nanmax,\n",
+ " \"min\": np.nanmin\n",
+ "}\n",
+ "\n",
+ "for i, job in job_rows.iterrows():\n",
+ " #print(f\"Job {i+1}: variable={job['variables']}, time={job['time']}, aggregation={job['aggregation_name']}\")\n",
+ "\n",
+ " # parse the row into function parameters\n",
+ " input_file = data_catalog['download']['outputs'][job['input']]\n",
+ " solar_classification = job['solar_classification']\n",
+ " variable = job['variables_short']\n",
+ " time = job['time']\n",
+ " aggregation_func = aggregation_funcs[job['aggregation_name']]\n",
+ " aggregation_name = job['aggregation_name']\n",
+ "\n",
+ " climate_handler_var = job['climate_handler_var']\n",
+ " local_tz = job['local_tz']\n",
+ "\n",
+ " shapefile = job['shapefile']\n",
+ " hshd_unique_id = job['hshd_unique_id']\n",
+ "\n",
+ " output_file = job['input'] + \"_\" + job['time'] + \"_\" + job['variables_short'] + \"_\" + job['aggregation_name'] + \".parquet\"\n",
+ "\n",
+ " @task(id=output_file, name=f\"Aggregate {output_file}\", after=\"task_download_raw_data\")\n",
+ " def task_aggregate_data_diurnal(\n",
+ " input_file: Path = data_catalog['download']['outputs'][job['input']], # input data Path from the download task\n",
+ " aggregation_func: callable = aggregation_func, # the aggregation function\n",
+ " aggregation_name: str = aggregation_name, # the name of the aggregation function\n",
+ " time: Literal[\"day\", \"night\"] = time, # whether to aggregate by day or night\n",
+ " night_direction: Literal[\"before\", \"after\"] = solar_classification, # how to define night\n",
+ " variable: str = variable, # the variable to aggregate,\n",
+ " climate_handler_var: Literal[\"instant\", \"accum\"] = climate_handler_var, # whether the variable is instant or accum,\n",
+ " local_tz: str = local_tz, # the local timezone for resampling\n",
+ " shapefile: str = shapefile, # the shapefile for the healthsheds,\n",
+ " hshd_unique_id: str = hshd_unique_id, # the unique id column in the shapefile,\n",
+ " output_file: str = output_file # the output file name\n",
+ " ) -> Annotated[Path, data_catalog['aggregate']['outputs'][output_file]]:\n",
+ " \"\"\"\n",
+ " Task to aggregate data from a CDSAPI Query to the healthshed\n",
+ " level. Returns path to parquet file with aggregated data.\n",
+ " \"\"\"\n",
+ "\n",
+ " logger = setup_logger(output_file)\n",
+ "\n",
+ " logger.info(f\"Aggregating: {output_file}\")\n",
+ "\n",
+ " # check if the string path exists\n",
+ " # if os.path.exists(output_file):\n",
+ " # logger.info(f\"File {output_file} already exists. Skipping aggregation.\")\n",
+ " # return output_file\n",
+ "\n",
+ " # get input data\n",
+ " logger.info(\"Reading input data...\")\n",
+ " with ClimateDataFileHandler(input_file) as handler:\n",
+ " ds = xr.open_dataset(handler.get_dataset('instant'))\n",
+ "\n",
+ " #get the healthshed shapefile\n",
+ " logger.info(f\"Reading healthshed shapefile from yaml {here()}...\")\n",
+ " with open(here() / \"conf\" / \"config.yaml\") as f:\n",
+ " healthshed_config = yaml.safe_load(f)\n",
+ "\n",
+ " key_path = here() / healthshed_config['GOOGLE_DRIVE_AUTH_JSON']['path']\n",
+ "\n",
+ " driver = GoogleDriver(json_key_path=key_path)\n",
+ " drive = driver.get_drive()\n",
+ " healthsheds = driver.read_healthsheds(shapefile)\n",
+ "\n",
+ " # compute the diurnal classification bins\n",
+ " logger.info(\"Computing diurnal classification bins...\")\n",
+ " class_bins, class_dts = compute_solar_day_night_class_bins(ds, night_direction)\n",
+ "\n",
+ " ds_masked = ds.copy()\n",
+ "\n",
+ " # assign classifications\n",
+ " logger.info(\"Assigning classification bins to dataset...\")\n",
+ " ds['solar_class'] = (('valid_time', 'latitude', 'longitude'), class_bins)\n",
+ " ds[\"solar_date\"] = ((\"valid_time\", \"latitude\", \"longitude\"), class_dts)\n",
+ "\n",
+ " # mask the dataset to the requested time\n",
+ " mask = ds[\"solar_class\"] == time\n",
+ " ds_masked = ds_masked.where(mask)\n",
+ "\n",
+ " # set the local timezone\n",
+ " ds_masked = ds_masked.assign_coords(valid_time=pd.to_datetime(ds[\"valid_time\"].values).tz_localize(\"UTC\").tz_convert(local_tz))\n",
+ "\n",
+ " # resample by local date\n",
+ " logger.info(\"Resampling by local date...\")\n",
+ " ds_rs = ds_masked.resample(valid_time=\"1D\").reduce(aggregation_func)\n",
+ "\n",
+ " # convert to tiff\n",
+ " logger.info(\"Rasterizing resampled data...\")\n",
+ " n_bands = ds_rs.dims['valid_time']\n",
+ "\n",
+ " # polygon to raster cells for the first band\n",
+ " logger.info(\"Converting polygons to raster cells...\")\n",
+ " raster = netcdf_to_tiff(ds_rs, band=1, variable=variable)\n",
+ " res_poly2cell=polygon_to_raster_cells(\n",
+ " vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions\n",
+ " raster=raster.data, # the raster data above\n",
+ " nodata=np.nan, # any intersections with no data, may have to be np.nan\n",
+ " affine=raster.transform, # some math thing need to revise\n",
+ " all_touched=True, \n",
+ " verbose=True\n",
+ " )\n",
+ "\n",
+ " result_df = healthsheds[[hshd_unique_id, \"geometry\"]].copy()\n",
+ "\n",
+ " # loop over bands and aggregate to healthsheds\n",
+ " for band in tqdm(range(1, n_bands + 1)):\n",
+ " logger.info(f\"Processing band {band} of {n_bands}...\")\n",
+ " \n",
+ " day = band # band is 1-indexed\n",
+ "\n",
+ " day_col = f\"day_{day:02d}\"\n",
+ "\n",
+ " # calculate raster for this band\n",
+ " raster = netcdf_to_tiff(ds_rs, band=band, variable=variable)\n",
+ "\n",
+ " # aggregate to healthsheds\n",
+ " result = aggregate_to_healthsheds(\n",
+ " res_poly2cell=res_poly2cell,\n",
+ " raster=raster,\n",
+ " shapes=healthsheds,\n",
+ " names_column=hshd_unique_id,\n",
+ " aggregation_func=aggregation_func,\n",
+ " aggregation_name=variable\n",
+ " )\n",
+ " \n",
+ " # add band to result dataframe\n",
+ " result_df[day_col] = result[variable]\n",
+ "\n",
+ " # save to parquet\n",
+ " result_df.to_parquet(f\"{BLD}/{output_file}\")\n",
+ "\n",
+ " logger.info(\"Aggregation complete.\")\n",
+ " \n",
+ " return Path(f\"{BLD}/{output_file}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "That should wrap it up! To test, we can run a single job:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#| eval: false\n",
+ "# runs the last defined job only\n",
+ "task_aggregate_data_diurnal()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Or we can run the task in `pytask`:\n",
+ "\n",
+ "```bash\n",
+ "pytask build -k \"nepal and 2009\" --dry-run\n",
+ "```"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "python3",
+ "language": "python",
+ "name": "python3"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notes/IMG_740012467778-1.jpeg b/notes/IMG_740012467778-1.jpeg
new file mode 100644
index 0000000..52886eb
Binary files /dev/null and b/notes/IMG_740012467778-1.jpeg differ
diff --git a/notes/prototypes/aggregation_visualizer.Rmd b/notes/_prototypes/_aggregation_visualizer.Rmd
similarity index 100%
rename from notes/prototypes/aggregation_visualizer.Rmd
rename to notes/_prototypes/_aggregation_visualizer.Rmd
diff --git a/notes/_prototypes/_download_QA.qmd b/notes/_prototypes/_download_QA.qmd
new file mode 100644
index 0000000..d2d492b
--- /dev/null
+++ b/notes/_prototypes/_download_QA.qmd
@@ -0,0 +1,15 @@
+# Investigating The Download Results
+
+There are a couple of things we should do to QA our data downloads. Specifically, we want to come up with a way of ensuring our aggregations are valid and accurate. This will require some simple EDA.
+
+```{python}
+from pyprojroot import here
+import pandas as pd
+import os
+from hydra import initialize, compose
+from omegaconf import OmegaConf, DictConfig
+```
+
+```{python}
+eg_file = here() / "data/input/2010_1.nc"
+```
\ No newline at end of file
diff --git a/notes/_prototypes/_kenya_demo_01_intro.qmd b/notes/_prototypes/_kenya_demo_01_intro.qmd
new file mode 100644
index 0000000..6bbc193
--- /dev/null
+++ b/notes/_prototypes/_kenya_demo_01_intro.qmd
@@ -0,0 +1,247 @@
+---
+skip_showdoc: true
+---
+
+# Introduction to the ERA 5 Data
+
+The ERA5 dataset is the fifth iteration of the ECMWF ReAnalysis dataset, spanning from 1950 to the present. ECMWF is the "European Centre for Medium-Range Weather Forecasts".
+The dataset provides comprehensive and high-resolution historical weather and climate data. The source data is from the [Copernicus Climate Data Store (CDS)](https://cds.climate.copernicus.eu/#!/home). A comprehensive data documentation guide is available [here](https://confluence.ecmwf.int/display/CKB/ERA5%3A+data+documentation). In total, the entire CDS ERA data is over 10Petabytes.
+
+Fortunately for us, there are existing [Python](https://github.com/Climate-CAFE/era5-daily-heat-aggregation-python) and [R](https://github.com/Climate-CAFE/era5-daily-heat-aggregation) packages that have gone ahead and demonstrated extracting the data from the API for us, so we are going to use those to develop our workflow. Specifically, we're trying to understand the
+following characteristics of the data:
+
+* size,
+* how to download,
+* what are the key transformations to map things into the health sheds
+* two important variables:
+ * 2m air temp, and,
+ * 2m air dew point
+
+Let's get started
+
+Important: we need to install the CDS API first, so you'll need to grab an API key. First, you must register for an account and accept the T&Cs, afterwhich the page [here](https://ecmwf-projects.github.io/copernicus-training-c3s/cds-tutorial.html#install-the-cds-api-key) will autopopulate an API key for you. The following code shows a test case to make sure your API key works
+
+```{python}
+import cdsapi
+
+client = cdsapi.Client()
+
+dataset = 'reanalysis-era5-pressure-levels'
+request = {
+ 'product_type': ['reanalysis'],
+ 'variable': ['geopotential'],
+ 'year': ['2024'],
+ 'month': ['03'],
+ 'day': ['01'],
+ 'time': ['13:00'],
+ 'pressure_level': ['1000'],
+ 'data_format': 'grib',
+}
+target = 'download.grib'
+
+client.retrieve(dataset, request, target)
+```
+
+This demonstration is expected to amass 9GB of data for raw raster files (24 years, 12 files per year). The demonstration generates the 24 years of heat measures across Kenya administrative boundaries, in 1-month periods of ERA5-Land data across Kenya with three variables (2-m temp, dew point temp, skin temp)
+
+```{python}
+# imports as recommended by the github repo
+import cdsapi
+import geopandas as gpd
+import os
+```
+
+I'll use pyprojroot to specify a data path
+
+```{python}
+from pyprojroot.here import here
+
+ecmw_dir = here("data")
+```
+
+```{python}
+def create_dir(path):
+
+ if not os.path.exists(path):
+ os.makedirs(path)
+
+ return path
+```
+
+```{python}
+create_dir(ecmw_dir)
+```
+
+```{python}
+# create a directory for the kenya data
+create_dir(os.path.join(ecmw_dir, "Kenya_GADM"))
+```
+
+Next, we need to manually fetch this GADM file for Kenya from here: https://gadm.org/download_country.html
+
+This is a boundaries geopackage; GeoBoundaries is a global database of administrative boundaries (e.g., countries, states, provinces, districts). Hence, this file provides the
+boundaries for Kenyan regions
+
+```{python}
+kenya_shape = gpd.read_file(os.path.join(ecmw_dir, "Kenya_GADM/gadm41_KEN.gpkg"), layer = "ADM_ADM_0")
+```
+
+```{python}
+kenya_shape
+```
+
+The bounding box represents the coordinates of the shapefile, which is what we'll
+use to query Copernicus. Think of it like a mask provided in a file
+
+```{python}
+kenya_bbox = kenya_shape.total_bounds
+```
+
+```{python}
+kenya_bbox
+```
+
+Technical: Add a small buffer around the bounding box to ensure the whole region
+is queried, and round the parameters to a 0.1 resolution. A 0.1 resolution
+is applied because the resolution of netCDF ERA5 data is .25x.25
+https://confluence.ecmwf.int/display/CKB/ERA5%3A+What+is+the+spatial+reference
+
+```{python}
+kenya_bbox[0] = round(kenya_bbox[0], 1) - 0.1
+kenya_bbox[1] = round(kenya_bbox[1], 1) - 0.1
+kenya_bbox[2] = round(kenya_bbox[2], 1) + 0.1
+kenya_bbox[3] = round(kenya_bbox[3], 1) + 0.1
+```
+
+```{python}
+# to build a query, specify [xmin, ymin, xmax, ymax]
+query_area = [kenya_bbox[0], kenya_bbox[1], kenya_bbox[2], kenya_bbox[3]]
+```
+
+```{python}
+query_years = list(range(2000, 2024))
+query_years_str = [str(x) for x in query_years]
+
+query_months = list(range(1, 13))
+query_months_str = [str(x).zfill(2) for x in query_months]
+```
+
+```{python}
+output_dir = create_dir(os.path.join(ecmw_dir, "ERA5_out"))
+```
+
+```{python}
+for year_str in query_years_str:
+ # Track progress
+ print("Now processing year ", year_str, "\n")
+
+ # For each year, the query is divided into each month sections.
+ # If a request is too large, it will not be accepted by the CDS servers,
+ # so this division of requests is required.
+
+ for month_str in query_months_str:
+ # Track progress
+ print("Now processing month ", month_str, "\n")
+
+ # The below is the formatted API request language. All of the inputs
+ # specified below in proper formatting can be identified by forming a
+ # request using the Copernicus CDS point-and-click interface for data
+ # requests. https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-era5-land?tab=form
+ # Select the variables, timing, and netcdf as the output format, and then
+ # select "Show API Request" at the bottom of the screen.
+
+ # Note that the argument in the download() function is the file path and
+ # file name that data will be exported to and stored at. If using a loop,
+ # ensure that the unique features of each request are noted in the output.
+
+ # Note: need to create "ERA5_Out" subfolder on your path
+
+ dataset = "reanalysis-era5-land"
+ request = {
+ "product_type": "reanalysis",
+ "variable": ["2m_dewpoint_temperature",
+ "2m_temperature",
+ "skin_temperature"],
+ "year": year_str,
+ "month": month_str,
+ "day": [
+ "01", "02", "03",
+ "04", "05", "06",
+ "07", "08", "09",
+ "10", "11", "12",
+ "13", "14", "15",
+ "16", "17", "18",
+ "19", "20", "21",
+ "22", "23", "24",
+ "25", "26", "27",
+ "28", "29", "30",
+ "31"],
+ "time": [
+ "00:00", "01:00", "02:00",
+ "03:00", "04:00", "05:00",
+ "06:00", "07:00", "08:00",
+ "09:00", "10:00", "11:00",
+ "12:00", "13:00", "14:00",
+ "15:00", "16:00", "17:00",
+ "18:00", "19:00", "20:00",
+ "21:00", "22:00", "23:00"],
+ "data_format": "netcdf",
+ "download_format": "unarchived",
+ "area": query_area
+ }
+
+ client = cdsapi.Client()
+ client.retrieve(dataset, request).download(os.path.join(output_dir,
+ "{}_{}.nc".format(year_str, month_str)))
+```
+
+From the logs, it looks like one month of data takes approximately 10 minutes. In this query, we might end up with 48 hours of downloading for the full 24 years. Clearly this will need to be multithreaded/paralleled to be efficient.
+
+## Testing Soil Moisture Downloads
+
+```{python}
+import cdsapi
+
+dataset = "reanalysis-era5-land"
+request = {
+ "variable": ["volumetric_soil_water_layer_1"],
+ "year": "2009",
+ "month": "01",
+ "day": ["01"],
+ "time": ["01:00"],
+ "data_format": "netcdf",
+ "download_format": "unarchived"
+}
+
+client = cdsapi.Client()
+client.retrieve(dataset, request).download()
+```
+
+```{python}
+from pyprojroot.here import here
+
+ecmw_dir = here("notes/prototypes/")
+```
+
+```{python}
+ecmw_dir / "soil.nc"
+```
+
+```{python}
+import xarray
+import os
+
+temp_file = xarray.open_dataset(os.path.join(ecmw_dir / "soil.nc"), decode_coords="all")
+```
+
+```{python}
+temp_file
+```
+
+```{python}
+temp_file['swvl1'].plot()
+```
+
+```{python}
+
+```
\ No newline at end of file
diff --git a/notes/_prototypes/_kenya_demo_02_fishnet.qmd b/notes/_prototypes/_kenya_demo_02_fishnet.qmd
new file mode 100644
index 0000000..120d456
--- /dev/null
+++ b/notes/_prototypes/_kenya_demo_02_fishnet.qmd
@@ -0,0 +1,228 @@
+---
+skip_showdoc: true
+---
+
+# Part 2: Aggregation via Fishnet
+
+This script is the first in a two-step raster processing process. In this script a grid-based polygon will be derived from the raster grid of ERA5 data. The goal
+is to create a fishnet that can be used to extract ERA5 data from raster stack including ERA5 hourly data (this file). This will allow for extraction from raster stack
+without the large computational burden of a loop (as below)
+
+```{python}
+import geopandas as gpd
+import os
+import glob
+# xarray makes working with labelled multi-dimensional arrays in Python simple, efficient, and fun!
+import xarray
+# The rioxarray package is an extension of xarray designed
+# for working with raster (geospatial) data in Python.
+# It provides an easy way to read, write, and manipulate GeoTIFF and other raster formats while maintaining spatial metadata.
+import rioxarray
+# for geometric operations on vector data (points, lines, polygons). It allows users to create, manipulate, and analyze geometric shapes in 2D space
+import shapely
+from shapely.geometry import Polygon
+import numpy
+# you need to install gdal here, not osgeo
+# gdal is generally a translator library for raster and vector geospatial data formats
+from osgeo import gdal, ogr
+```
+
+```{python}
+# create a fishnet grid using GDAL
+def make_fishnet(outputGridfn,xmin,xmax,ymin,ymax,rows,cols):
+ # Calculate grid parameters
+ xmin = float(xmin)
+ xmax = float(xmax)
+ ymin = float(ymin)
+ ymax = float(ymax)
+ gridWidth = float((xmax-xmin) / cols)
+ gridHeight = float((ymax-ymin) / rows)
+
+ # Start grid cell envelope
+ ringXleftOrigin = xmin
+ ringXrightOrigin = xmin + gridWidth
+ ringYtopOrigin = ymax
+ ringYbottomOrigin = ymax-gridHeight
+
+ # Create the output shapefile
+ outDriver = ogr.GetDriverByName('ESRI Shapefile')
+ if os.path.exists(outputGridfn):
+ os.remove(outputGridfn)
+ outDataSource = outDriver.CreateDataSource(outputGridfn)
+ outLayer = outDataSource.CreateLayer(outputGridfn, geom_type=ogr.wkbPolygon)
+ # Add fields to the layer
+ featureDefn = outLayer.GetLayerDefn()
+
+ # Create grid cells
+ countcols = 0
+ while countcols < cols:
+ countcols += 1
+
+ # Reset envelope for rows
+ ringYtop = ringYtopOrigin
+ ringYbottom =ringYbottomOrigin
+ countrows = 0
+
+ while countrows < rows:
+ countrows += 1
+ ring = ogr.Geometry(ogr.wkbLinearRing)
+ ring.AddPoint(ringXleftOrigin, ringYtop)
+ ring.AddPoint(ringXrightOrigin, ringYtop)
+ ring.AddPoint(ringXrightOrigin, ringYbottom)
+ ring.AddPoint(ringXleftOrigin, ringYbottom)
+ ring.AddPoint(ringXleftOrigin, ringYtop)
+ poly = ogr.Geometry(ogr.wkbPolygon)
+ poly.AddGeometry(ring)
+
+ # Add new geom to layer
+ outFeature = ogr.Feature(featureDefn)
+ outFeature.SetGeometry(poly)
+ outLayer.CreateFeature(outFeature)
+ outFeature = None
+
+ # New envelope for next poly
+ ringYtop = ringYtop - gridHeight
+ ringYbottom = ringYbottom - gridHeight
+
+ # New envelope for next poly
+ ringXleftOrigin = ringXleftOrigin + gridWidth
+ ringXrightOrigin = ringXrightOrigin + gridWidth
+
+ # Save and close DataSources
+ outDataSource = None
+```
+
+```{python}
+from pyprojroot import here
+```
+
+```{python}
+era_dir = here("data/ERA5_out")
+```
+
+```{python}
+temp_file = xarray.open_dataset(os.path.join(era_dir, "2000_01.nc"), decode_coords="all")
+```
+
+```{python}
+
+```
+
+```{python}
+t0='2000-01-01T00:00:00.000000000'
+temp_file['t2m']['valid_time'][0]
+```
+
+```{python}
+list(temp_file['t2m']['valid_time'].data)
+```
+
+```{python}
+temp_file['t2m'][0].shape
+```
+
+```{python}
+import matplotlib.pyplot as plt
+from matplotlib.pyplot import figure
+#from matplotlib.pyplot
+import cartopy.feature as cfeature
+import cartopy.crs as ccrs
+# Ensure lat/lon are the correct names in your dataset
+
+var=temp_file['t2m'][0]
+
+lon = temp_file.coords.get("longitude")
+lat = temp_file.coords.get("latitude")
+
+plt.figure(figsize=(12, 6))
+ax = plt.axes(projection=ccrs.PlateCarree()) # Set projection for geographic map
+
+# Add map features
+ax.add_feature(cfeature.BORDERS, linestyle=":")
+ax.add_feature(cfeature.COASTLINE)
+
+ax.set_extent([lon.min() - 3, lon.max() + 3, lat.min() - 3, lat.max() + 3], crs=ccrs.PlateCarree())
+
+# Plot raster using lat/lon
+im = ax.pcolormesh(lon, lat, var, transform=ccrs.PlateCarree())
+
+# Add colorbar
+plt.colorbar(im, label=var.name)
+plt.title(f"{var.name} Spatial Distribution")
+
+plt.show()
+```
+
+```{python}
+lat
+```
+
+```{python}
+lon
+```
+
+```{python}
+temp_file['t2m']
+```
+
+```{python}
+era_files = glob.glob(os.path.join(era_dir, '*.nc'))
+```
+
+We read in the netcdf files and stack them in the 4th dimension by year
+
+```{python}
+era_stack = xarray.open_mfdataset(era_files, decode_coords="all")
+```
+
+```{python}
+era_stack
+```
+
+The data above does not have a [coordinate reference system](https://en.wikipedia.org/wiki/Spatial_reference_system), needed to interpret, transform, or align datasets. Hence, we assign the WGS84 standard
+
+```{python}
+era_stack.rio.write_crs("WGS 84", inplace=True)
+```
+
+Here, we are making a shapefile that is a fishnet grid of the raster extent.
+It will essentially be a polygon of lines surrounding each ERA5 cell
+
+```{python}
+era_extent = era_stack.rio.bounds()
+```
+
+```{python}
+xmin = era_extent[0]
+xmax = era_extent[2]
+ymin = era_extent[1]
+ymax = era_extent[3]
+
+height = era_stack.rio.height
+width = era_stack.rio.width
+
+era_coords = [(xmin, ymin), (xmin, ymax), (xmax, ymax), (xmax, ymin), (xmin, ymin)]
+era_polygon = Polygon(era_coords)
+```
+
+```{python}
+# implement the fishnet function
+make_fishnet(os.path.join(era_dir, 'era_fishnet.shp'), xmin,xmax,ymin,ymax,height,width)
+```
+
+```{python}
+ogr_shp = gpd.read_file(os.path.join(era_dir, 'era_fishnet.shp'))
+print(ogr_shp.crs) # this is none, so we have to set it
+
+# Set the CRS for the created fishnet shape file as the same one from the stacked raster files.
+new_crs = era_stack.rio.crs.data # Replace with the desired CRS
+ogr_shp = ogr_shp.set_crs(new_crs)
+```
+
+```{python}
+ogr_shp.to_file(os.path.join(era_dir, 'era_fishnet.shp'))
+```
+
+```{python}
+
+```
\ No newline at end of file
diff --git a/notes/_prototypes/_kenya_demo_03_aggregate.qmd b/notes/_prototypes/_kenya_demo_03_aggregate.qmd
new file mode 100644
index 0000000..2d90f2f
--- /dev/null
+++ b/notes/_prototypes/_kenya_demo_03_aggregate.qmd
@@ -0,0 +1,19 @@
+---
+skip_showdoc: true
+---
+
+# Part 3: Joining Fishnet to the Ward geometries
+
+In this file, we will join the fishnet, which is a polygon grid with lines
+surrounding the grid of the ERA5 raster with the Ward geometries that have
+been queried from the Database of Global Administrative Boundaries
+(gadm.org). In merging the polygon grid with the ward polygon data,
+we ensure that every ward will be aligned with the relevant
+ERA5 temperature metrics for the area.
+
+Next, we Create extraction points from the union of the wards and fishnet. These
+are what we can use to extract values from the raster that overlaps with
+with the points aligning to each wards (this file).
+
+Lastly, we Estimate the ward-level exposure to ERA5, accounting for the availability
+of data within the wards (this file)
\ No newline at end of file
diff --git a/notes/_prototypes/_learning_aggregations_w_michelle_20250328.qmd b/notes/_prototypes/_learning_aggregations_w_michelle_20250328.qmd
new file mode 100644
index 0000000..0b81808
--- /dev/null
+++ b/notes/_prototypes/_learning_aggregations_w_michelle_20250328.qmd
@@ -0,0 +1,719 @@
+---
+skip_showdoc: true
+---
+
+## Prototyping Spatial Aggregations
+
+We're going to learn how to aggregate the exposure data into daily values. This is useful for analyzing the data over a longer period of time, such as a week or a month, and is part of the larger goal of this project to aggregate the ERA5 dataset for Madagascar.
+
+
+Doing an aggregation of a netcdf file is relatively simple. What we need to do is read in the data, and then use the `xarray` library to group the data by time using a resampler method. We can then use the `mean` function to calculate the average value for each day.
+
+```{python}
+import xarray as xr
+import matplotlib.pyplot as plt
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
+from pyprojroot import here
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+```
+
+Let's look at the data that we've already downloaded. In the pipeline. We'll use the xarray library to open it up and inspect it.
+
+```{python}
+# Load the NetCDF file
+fpath = here() / "data/input/2010_1.nc"
+ds = xr.open_dataset(fpath)
+```
+
+This is a netcdf file. It has the following dimensions representing time series, as well as the variables we downloaded at specific locations:
+
+```{python}
+ds
+```
+
+We can see that our variables are accessible with indeces. The reason we have 744 time points is because it is hourly data for the entire month.
+
+Interestingly, we can simply use the `.resample()` method to create mathematically aggregated data.
+
+```{python}
+# Perform multiple aggregations
+daily_mean = ds.resample(valid_time="1D").mean() # Daily mean
+daily_max = ds.resample(valid_time="1D").max() # Daily max
+daily_min = ds.resample(valid_time="1D").min() # Daily min
+
+# Combine the results into a new dataset
+daily_aggregated = xr.Dataset({
+ "t2m_mean": daily_mean["t2m"],
+ "t2m_max": daily_max["t2m"],
+ "t2m_min": daily_min["t2m"],
+ "d2m_mean": daily_mean["d2m"],
+ "d2m_max": daily_max["d2m"],
+ "d2m_min": daily_min["d2m"]
+})
+
+daily_aggregated
+```
+
+Look at how this compares to the original data:
+
+```{python}
+ds
+```
+
+With data of this shape, we can plot the mean temperature over months
+
+```{python}
+# Select a specific grid point (e.g., latitude=-1, longitude=0)
+variable='mean'
+
+# note: we can use the isel method to select the grid point. In this case,
+# we are selecting the bottom-left grid point (latitude=-1, longitude=0) because we're selecting
+# the smallest value for latitude:
+# time=0: Selects the first time point.
+# latitude=-1: Selects the last latitude (bottom-most, as latitude is usually ordered from north to south).
+# longitude=0: Selects the first longitude (left-most).
+t2m_mean_point = daily_aggregated["t2m_" + variable].isel(latitude=-1, longitude=0)
+
+# Plot the time series
+plt.figure(figsize=(10, 6))
+t2m_mean_point.plot(label="Daily Mean t2m")
+plt.title("Daily Aggregated ({}) Temperature at Bottom-Left Grid Point".format(variable))
+plt.xlabel("Time")
+plt.ylabel("Temperature (K)")
+plt.legend()
+plt.grid()
+plt.show()
+```
+
+How does this compared to the disaggregated data?
+
+```{python}
+t2m_point = ds["t2m"].isel(latitude=-1, longitude=0)
+
+# Plot the time series
+plt.figure(figsize=(10, 6))
+t2m_point.plot(label="Daily Mean t2m")
+plt.title("Daily Disaggregated Temperature at Bottom-Left Grid Point")
+plt.xlabel("Time")
+plt.ylabel("Temperature (K)")
+plt.legend()
+plt.grid()
+plt.show()
+```
+
+These temperature plots match beautifully! This means our aggregation over the 31 days works!
+
+Let's look at the aggregation over a map:
+
+```{python}
+# Select the first day of t2m_mean
+variable="mean"
+t2m_mean_day1 = daily_aggregated["t2m_" + variable].isel(valid_time=0)
+
+# Set the absolute min and max for the color bar
+vmin = 270 # Minimum value (e.g., 270 K)
+vmax = 310 # Maximum value (e.g., 310 K)
+
+# Create a plot with Cartopy
+plt.figure(figsize=(10, 6))
+ax = plt.axes(projection=ccrs.PlateCarree()) # Use PlateCarree projection for latitude/longitude data
+
+# Plot the data
+t2m_mean_day1.plot(ax=ax, cmap="coolwarm", transform=ccrs.PlateCarree(), vmin=vmin, vmax=vmax, cbar_kwargs={"label": "Temperature (K)"})
+
+# Add Madagascar's border using Cartopy's built-in features
+ax.add_feature(cfeature.BORDERS, edgecolor="black", linewidth=1) # Add country borders
+ax.add_feature(cfeature.COASTLINE, edgecolor="black", linewidth=0.8) # Add coastlines
+
+# Optionally, zoom in on Madagascar
+ax.set_extent([43, 51, -26, -11], crs=ccrs.PlateCarree()) # Longitude and latitude bounds for Madagascar
+
+# Add gridlines
+ax.gridlines(draw_labels=True, linewidth=0.5, color="gray", alpha=0.5, linestyle="--")
+
+# Add a title
+plt.title("Mean Daily {} Temperature (Day 1)".format(variable))
+plt.show()
+```
+
+Looks great. Now, we need to see if we can do a spatial aggregation:
+
+>A mathematical aggregation like mean() involves summarizing data values (e.g., averaging) across a specific dimension, such as time, without considering spatial relationships. For example, calculating the daily mean temperature from hourly data is purely numerical.
+In contrast, a spatial aggregation using rasters and polygons involves summarizing data based on spatial boundaries. For example, when aggregating raster data (e.g., temperature) over a polygon (e.g., a country's boundary), the process involves selecting raster cells that fall within the polygon and computing a summary statistic (e.g., mean, sum) for those spatially defined areas. This type of aggregation accounts for geographic context and spatial relationships.
+
+To do this, we'll need to read in the shapefile that defines the shape of the polygon (ie the physical ground) and find the pixels of data that fall within the polygon. We can then use the `xarray` library to group the data by time using a resampler method. We can then use the `mean` function to calculate the average value for each day.
+
+```{python}
+import geopandas as gpd
+
+# we learned how to read in shapefiles in the kenya demo notebook
+zip_url_or_path = here() / "data/testing/gadm41_MDG.gpkg"
+
+shape = gpd.read_file(zip_url_or_path, layer = "ADM_ADM_1")
+```
+
+We are using the layer 1 of this shapefile from GADM.org. This refers to the states in red:
+
+
+
+When we read in the shapefile, the data in the `geometry` column is a specification of the polygons that represent geographic boundaries.
+
+```{python}
+shape
+```
+
+In a vector image such as a shapefile, the steps between each value are not guaranteed to be equal (unlike on a cartesian plane), so we need to think about how those values "project" onto a known Coordinate Reference System (CRS) that has equal steps.
+
+A quick note about CRS:
+
+> The WGS 84 (World Geodetic System 1984) is a widely used global Coordinate Reference System (CRS). It is the standard CRS for GPS (Global Positioning System) and is commonly used in geospatial applications. WGS 84 defines a geographic coordinate system based on a specific ellipsoid model of the Earth.
+
+> Key Features of WGS 84
+Type: Geographic Coordinate System (GCS).
+Coordinates are represented in latitude, longitude, and optionally altitude.
+Units: Degrees (for latitude and longitude).
+Ellipsoid: WGS 84 uses a reference ellipsoid with:
+Semi-major axis: 6,378,137 meters.
+Flattening: 1 / 298.257223563.
+Datum: The WGS 84 datum defines the origin and orientation of the coordinate system.
+EPSG Code: The EPSG code for WGS 84 is 4326.
+
+Spatial geometry is complicated and silly, hence [all maps are wrong](https://youtu.be/kIID5FDi2JQ?si=OZASX3i6Aglqwa4u).
+
+Nevertheless, we can see that the shapefile has a CRS of EPSG:4326, which is what we want:
+
+```{python}
+shape.crs
+```
+
+Were this different, we'd have to find some way to adjust these projections. For our netCDF file, however, we don't need to worry about this because the data themselves are created using a rasterized netCDF file, which is a standard format for storing gridded data. The data is already in a grid format, and the pixel values are already aligned with the geographic coordinates of the raster. In spatial geometry, we use degrees to represent the latitude and longitude of the corners of each pixel. This means that the data is already in a format that can be easily manipulated and analyzed using xarray and geopandas, because we refer to where the pixel is located in the world using degrees. It is essentially an absolute reference system.
+
+In the ERA5 dataset, the resolution is said to be 0.25 degrees, which means that each pixel represents a square area of approximately 25 km x 25 km at the equator. So at every unit of 0.25 degrees north-south or east-west, we have a new pixel of data, with a value for temperature or dewpoint or whatever. You can physically see each of these on the plot.
+
+Learn more about ERA5's resolution [here](https://confluence.ecmwf.int/display/CKB/ERA5%3A+What+is+the+spatial+reference).
+
+Now, in order to aggregate data spatially, we're pasting in a utility here for finding the intersecting values between our netcdf data and the polygons represented in our shapefile (ie the states, regions, etc.).
+
+Source: https://github.com/NSAPH-Data-Processing/air_pollution__aqdh/blob/main/utils/faster_zonal_stats.py
+
+```{python}
+import numpy as np
+from tqdm import tqdm
+from math import ceil, floor
+
+from rasterstats.io import Raster
+from rasterstats.utils import boxify_points, rasterize_geom
+```
+
+This function indexes each pixel and maps it to the polygon it falls within. A few notes about this function:
+
+- It uses the `rasterstats.io` library to read in a raster tiff file
+- It uses affine transformations to convert the pixel coordinates to geographic coordinates
+- It needs to know where there is no data in the raster file, so we need to set a `nodata` value
+- `all_touched` is a boolean that determines whether to include all pixels that touch the polygon or just the ones that are fully contained within it; this is a domain specific choice
+
+```{python}
+def polygon_to_raster_cells(
+ vectors,
+ raster,
+ band=1,
+ nodata=None,
+ affine=None,
+ all_touched=False,
+ verbose=False,
+ **kwargs,
+):
+ """Returns an index map for each vector geometry to indices in the raster source.
+
+ Parameters
+ ----------
+ vectors: list of geometries
+
+ raster: ndarray
+
+ nodata: float
+
+ affine: Affine instance
+
+ all_touched: bool, optional
+ Whether to include every raster cell touched by a geometry, or only
+ those having a center point within the polygon.
+ defaults to `False`
+
+ Returns
+ -------
+ dict
+ A dictionary mapping vector the ids of geometries to locations (indices) in the raster source.
+ """
+
+ cell_map = []
+
+ with Raster(raster, affine, nodata, band) as rast:
+ # used later to crop raster and find start row and col
+ min_lon, dlon = affine.c, affine.a
+ max_lat, dlat = affine.f, -affine.e
+ H, W = rast.shape
+
+ for geom in tqdm(vectors, disable=(not verbose)):
+ if "Point" in geom.geom_type:
+ geom = boxify_points(geom, rast)
+
+ # find geometry bounds to crop raster
+ # the raster and geometry must be in the same lon/lat coordinate system
+ start_row = max(0, min(H - 1, floor((max_lat - geom.bounds[3]) / dlat)))
+ start_col = min(W - 1, max(0, floor((geom.bounds[0] - min_lon) / dlon)))
+ end_col = max(0, min(W - 1, ceil((geom.bounds[2] - min_lon) / dlon)))
+ end_row = min(H - 1, max(0, ceil((max_lat - geom.bounds[1]) / dlat)))
+ geom_bounds = (
+ min_lon + dlon * start_col, # left
+ max_lat - dlat * end_row - 1e-12, # bottom
+ min_lon + dlon * end_col + 1e-12, # right
+ max_lat - dlat * start_row, # top
+ )
+
+ # crop raster to area of interest and rasterize
+ fsrc = rast.read(bounds=geom_bounds)
+ rv_array = rasterize_geom(geom, like=fsrc, all_touched=all_touched)
+ indices = np.nonzero(rv_array)
+
+ if len(indices[0]) > 0:
+ indices = (indices[0] + start_row, indices[1] + start_col)
+ assert 0 <= indices[0].min() < rast.shape[0]
+ assert 0 <= indices[1].min() < rast.shape[1]
+ else:
+ pass # stop here for debug
+
+ cell_map.append(indices)
+
+ return cell_map
+```
+
+So to implement this we need to first convert the netcdf to a tiff so that we can rasterize it to each of the polygons in the shapefile. We do this with `rioxarray`
+
+```{python}
+import rioxarray as rxr
+```
+
+First, we pick our variable of interest, then we set the spatial properties to make sure it conforms to the CRS we wanted
+
+```{python}
+temperature = daily_aggregated['t2m_mean']
+```
+
+```{python}
+temp_set = temperature.rio.set_spatial_dims(x_dim="longitude", y_dim="latitude")
+temp_set = temp_set.rio.write_crs("EPSG:4326")
+```
+
+Write it out to tiff and read it back in (there's no way to do this in memory)
+
+```{python}
+temp_set.rio.to_raster("temp.tif")
+```
+
+Now we can investigate the tiff and see that it has all the properties necessary for the function
+
+```{python}
+import rasterio
+
+src = rasterio.open("temp.tif")
+raster = src.read(1) # Numpy array
+profile = src.profile # Metadata
+transform = src.transform
+```
+
+```{python}
+# the number of data points
+src.count
+```
+
+```{python}
+# the affine transformation matrix:
+# Pixel size (resolution in x and y).
+# Origin (top-left corner in spatial coordinates).
+# Rotation (if the raster is not north-up).
+src.transform
+```
+
+```{python}
+# any missing data locations
+src.nodata
+```
+
+```{python}
+# the number of rows and columns
+print(src.width, src.height)
+```
+
+Fetch the array of data
+
+```{python}
+raster_array = src.read(1)
+```
+
+Function go brrrr
+
+```{python}
+res_poly2cell=polygon_to_raster_cells(
+ vectors = shape.geometry.values, # the geometries of the shapefile of the regions
+ raster=raster_array, # the raster data above
+ band=1, # the value of the day that we're using
+ nodata=src.nodata, # any intersections with no data, may have to be np.nan
+ affine=src.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+```
+
+The data below maps which grid entries fall into each of the regions in the shapefile (e.g. which pixel is in which state)
+
+```{python}
+res_poly2cell
+```
+
+```{python}
+len(res_poly2cell)
+```
+
+Look familiar?
+
+These are the 6 states in the shapefile. The values in the array are the indexes of the pixels in the netcdf file that fall within the polygon.
+Now, within each of these we can aggregate mathematically eg min max mean etc.
+
+```{python}
+# the values themselves
+raster_array
+```
+
+```{python}
+stats = []
+for indices in res_poly2cell:
+ if len(indices[0]) == 0:
+ # no cells found for this polygon
+ stats.append(np.nan)
+ else:
+ cells = raster[indices]
+ if sum(~np.isnan(cells)) == 0:
+ # no valid cells found for this polygon
+ stats.append(np.nan)
+ continue
+ else:
+ # compute MEAN of valid cells
+ # but this stat can be ANYTHING
+ stats.append(np.nanmean(cells))
+```
+
+```{python}
+stats
+```
+
+Looks like it worked!
+
+```{python}
+import pandas as pd
+
+pd.DataFrame({"l1_region": shape.NAME_1, "mean_31_day_temp": stats})
+```
+
+### Let's try it with Level 3 data
+
+```{python}
+# first get the shape of the polygons
+
+shape = gpd.read_file(zip_url_or_path, layer = "ADM_ADM_3")
+
+# get the new mapping of the pixels to the shapes in the region
+
+res_poly2cell = polygon_to_raster_cells(
+ vectors = shape.geometry.values, # the geometries of the shapefile of the regions
+ raster=raster_array, # the raster data above
+ band=1, # the value of the day that we're using
+ nodata=src.nodata, # any intersections with no data, may have to be np.nan
+ affine=src.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+```
+
+```{python}
+len(res_poly2cell)
+```
+
+```{python}
+# demonsttrate that because this is a "denser" set of polygons
+# this iwll take longer
+stats = []
+
+for indices in res_poly2cell:
+ if len(indices[0]) == 0:
+ # no cells found for this polygon
+ stats.append(np.nan)
+ else:
+ cells = raster[indices]
+ if sum(~np.isnan(cells)) == 0:
+ # no valid cells found for this polygon
+ stats.append(np.nan)
+ continue
+ else:
+ # compute mean of valid cells
+ stats.append(np.nanmean(cells))
+```
+
+```{python}
+stats
+```
+
+Now we have 110 mean temperatuers for each of the shapefile's regions.
+
+```{python}
+
+df = pd.DataFrame(
+ {"l3_territory": shape.NAME_3, "dummy_date_in_future": 1, "temp_vals": stats}
+ )
+```
+
+```{python}
+df
+```
+
+```{python}
+# now we plot it using the shape.geometry to get the shapefile's location for each region
+gdf = gpd.GeoDataFrame(df, geometry=shape.geometry.values, crs=shape.crs)
+gdf.plot(column="temp_vals", legend=True)
+plt.show()
+```
+
+We can test this out with our healthsheds file
+
+```{python}
+healthsheds = gpd.read_file(here() / "data/testing/mdg_healthsheds2022")
+```
+
+```{python}
+healthsheds
+```
+
+```{python}
+# there are NAs to remove
+healthsheds.dropna(subset = ['geometry'], inplace=True)
+```
+
+```{python}
+len(set(healthsheds.fs_uid))
+```
+
+```{python}
+# get the new mapping of the pixels to the shapes in the region
+
+res_poly2cell = polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=raster_array, # the raster data above
+ band=1, # the value of the day that we're using
+ nodata=src.nodata, # any intersections with no data, may have to be np.nan
+ affine=src.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+
+stats = []
+
+for indices in res_poly2cell:
+ if len(indices[0]) == 0:
+ # no cells found for this polygon
+ stats.append(np.nan)
+ else:
+ cells = raster[indices]
+ if sum(~np.isnan(cells)) == 0:
+ # no valid cells found for this polygon
+ stats.append(np.nan)
+ continue
+ else:
+ # compute mean of valid cells
+ stats.append(np.nanmean(cells))
+```
+
+```{python}
+df = pd.DataFrame(
+ {"healthshed": healthsheds.fs_uid, "dummy_date_in_future": 1, "temp_vals": stats}
+ )
+```
+
+```{python}
+# now we plot it using the shape.geometry to get the shapefile's location for each region
+gdf = gpd.GeoDataFrame(df, geometry=healthsheds.geometry.values, crs=shape.crs)
+gdf.plot(column="temp_vals", legend=True)
+plt.show()
+```
+
+Now that we've demonstrated how this could work, we can substitute the GADM shapefiles for our healthsheds, and put it in a pipeline!!!
+
+## Nepal
+
+We've modified the pipeline to now download Nepal as well. We'll test out an aggregation using the aggregation shapefiles we were provided by Dimeji. We probably want to decide on where to centralize data storage for files like this
+
+```{python}
+try: from era5_sandbox.core import GoogleDriver, _get_callable, describe
+except: from core import GoogleDriver, _get_callable, describe
+
+try: from era5_sandbox.download import download_raw_era5
+except: from download import download_raw_era5
+
+try: from era5_sandbox.aggregate import resample_netcdf, netcdf_to_tiff, polygon_to_raster_cells, aggregate_to_healthsheds
+except: from aggregate import resample_netcdf, netcdf_to_tiff, polygon_to_raster_cells, aggregate_to_healthsheds
+```
+
+```{python}
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+with initialize(version_base=None, config_path="../../conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode = False
+cfg.query['year'] = 2023
+cfg.query['month'] = 10
+cfg.query['day'] = 1
+cfg.query['time'] = "00:00"
+cfg.query['geography'] = "nepal"
+download_raw_era5(cfg)
+```
+
+Now let's read it in and run the aggregation:
+
+```{python}
+# Load the NetCDF file
+fpath = here() / "data/input/nepal_2023_10.nc"
+ds = xr.open_dataset(fpath)
+```
+
+```{python}
+ds
+```
+
+```{python}
+# Perform multiple aggregations
+daily_mean = ds.resample(valid_time="1D").mean() # Daily mean
+daily_max = ds.resample(valid_time="1D").max() # Daily max
+daily_min = ds.resample(valid_time="1D").min() # Daily min
+
+# Combine the results into a new dataset
+daily_aggregated = xr.Dataset({
+ "t2m_mean": daily_mean["t2m"],
+ "t2m_max": daily_max["t2m"],
+ "t2m_min": daily_min["t2m"],
+ "d2m_mean": daily_mean["d2m"],
+ "d2m_max": daily_max["d2m"],
+ "d2m_min": daily_min["d2m"]
+})
+
+daily_aggregated
+```
+
+```{python}
+# Select the first day of t2m_mean
+variable="mean"
+t2m_mean_day1 = daily_aggregated["t2m_" + variable].isel(valid_time=0)
+
+# Set the absolute min and max for the color bar
+vmin = 270 # Minimum value (e.g., 270 K)
+vmax = 310 # Maximum value (e.g., 310 K)
+
+# Create a plot with Cartopy
+plt.figure(figsize=(10, 6))
+ax = plt.axes(projection=ccrs.PlateCarree()) # Use PlateCarree projection for latitude/longitude data
+
+# Plot the data
+t2m_mean_day1.plot(ax=ax, cmap="coolwarm", transform=ccrs.PlateCarree(), vmin=vmin, vmax=vmax, cbar_kwargs={"label": "Temperature (K)"})
+
+# Add Madagascar's border using Cartopy's built-in features
+ax.add_feature(cfeature.BORDERS, edgecolor="black", linewidth=1) # Add country borders
+ax.add_feature(cfeature.COASTLINE, edgecolor="black", linewidth=0.8) # Add coastlines
+
+# Optionally, zoom in on Madagascar
+#ax.set_extent([43, 51, -26, -11], crs=ccrs.PlateCarree()) # Longitude and latitude bounds for Madagascar
+
+# Add gridlines
+ax.gridlines(draw_labels=True, linewidth=0.5, color="gray", alpha=0.5, linestyle="--")
+
+# Add a title
+plt.title("Mean Daily {} Temperature (Day 1)".format(variable))
+plt.show()
+```
+
+We're going to create the aggregations using the function we defined in the aggregate module
+
+```{python}
+resampled_nc = resample_netcdf(fpath)
+
+resampled_tiff = netcdf_to_tiff(
+ ds=resampled_nc,
+ variable="t2m",
+ crs="EPSG:4326"
+)
+```
+
+Now we fetch the shapefile for administrative aggregations using our googledriver class:
+
+```{python}
+driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = driver.get_drive()
+```
+
+```{python}
+shape = "Nepal_Healthsheds2024.zip"
+```
+
+```{python}
+healthsheds = driver.read_healthsheds(shape)
+```
+
+```{python}
+healthsheds.columns
+```
+
+```{python}
+healthsheds.describe()
+```
+
+```{python}
+len(set(healthsheds['fid'].values))
+```
+
+```{python}
+res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=resampled_tiff.data, # the raster data above
+ band=1, # the value of the day that we're using
+ nodata=resampled_tiff.nodata, # any intersections with no data, may have to be np.nan
+ affine=resampled_tiff.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+```
+
+```{python}
+result = aggregate_to_healthsheds(
+ res_poly2cell=res_poly2cell,
+ raster=resampled_tiff,
+ shapes=healthsheds,
+ names_column="fid",
+ aggregation_func=np.nanmean,
+ aggregation_name="mean_temperature"
+)
+result.head()
+```
+
+```{python}
+result.plot(column="mean_temperature", legend=True)
+plt.title("Mean Temperature (K) by Health Shed October 2023")
+plt.show()
+```
+
+This should work by slotting right into the pipeline, only changing the function for the names column
\ No newline at end of file
diff --git a/notes/prototypes/image.png b/notes/_prototypes/image.png
similarity index 100%
rename from notes/prototypes/image.png
rename to notes/_prototypes/image.png
diff --git a/notes/index.ipynb b/notes/index.ipynb
index 58de015..83e40d9 100644
--- a/notes/index.ipynb
+++ b/notes/index.ipynb
@@ -1,29 +1,34 @@
{
"cells": [
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "#| hide\n",
- "from era5_sandbox.core import *"
+ "---\n",
+ "title: \"The ERA5 Spatial Aggregation Pipeline\"\n",
+ "exec_all: true\n",
+ "---"
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": null,
"metadata": {},
+ "outputs": [],
"source": [
- "# era5_sandbox\n",
- "\n",
- "> Sandbox environment for era5 development"
+ "#| hide: null\n",
+ "from era5_sandbox.core import *"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Here we are developing functions and code for the Madagascar ERA5 dataset project. The goal is for exposure data to be made available at the daily resolution when possible. Finer resolutions shouldn’t ever be needed for our purposes, and it should then be relatively easy to aggregate at coarser resolutions, such as weekly or monthly.\n",
+ "## era5_sandbox\n",
+ "\n",
+ "> Sandbox environment for era5 development\n",
+ "\n",
+ "This package documents the development and implementation of functions and code for the Madagascar ERA5 dataset project. The goal is for exposure data to be made available at the daily resolution when possible. Finer resolutions shouldn’t ever be needed for our purposes, and it should then be relatively easy to aggregate at coarser resolutions, such as weekly or monthly. Additionally, we've extended this work to Nepal as well.\n",
"\n",
"Variables should generally be made available from 2010 onward, as that’s where our clinic data starts.\n",
"\n",
@@ -31,11 +36,15 @@
"\n",
"Preliminary list of environmental variables\n",
"\n",
- "- [ ] 2-m air temperature from ERA5: daily min, max, mean\n",
+ "- [x] 2-m air temperature from ERA5: daily min, max, mean\n",
" \n",
- "- [ ] 2-m air dew point temperature from ERA5: daily min, max, mean\n",
+ "- [x] 2-m air dew point temperature from ERA5: daily min, max, mean\n",
+ "\n",
+ "- [x] Precipitation: daily total (ERA5)\n",
"\n",
- "- [ ] Precipitation: daily total (ERA5)\n",
+ "- [x] Soil moisture: daily average (ERA5)\n",
+ "\n",
+ "Variables from other sources:\n",
"\n",
"- [ ] Sea surface temperature: daily average and maximum in the nearest neighbor for each healthshed.\n",
"\n",
@@ -55,132 +64,102 @@
"\n",
"- [ ] Linking/segmenting healthsheds into climate zones and other \n",
"\n",
- "- [ ] Relative humidity: daily average (lower priority)\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Developer Guide"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "If you are new to using `nbdev` here are some useful pointers to get you started."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Install era5_sandbox in Development mode"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
+ "- [ ] Relative humidity: daily average (lower priority)\n",
+ "\n",
+ "Those from the ERA5 dataset will be housed here, but we may likely develop a separate repository for the other datasets.\n",
+ "\n",
+ "## Developer Guide\n",
+ "\n",
+ "This package is built and maintained with `nbdev`. If you are new to using `nbdev` here are some useful pointers to get you started.\n",
+ "\n",
+ "### Install era5_sandbox in Development mode\n",
+ "\n",
"```sh\n",
"# make sure era5_sandbox package is installed in development mode\n",
"$ pip install -e .\n",
+ "```\n",
"\n",
- "# To make changes, go to the \"notes\" directory and edit the notebooks as necessary.\n",
- "# Each notebook refers to a module in the era5_sandbox package. Cells are exported to the module\n",
- "# when the notebook is saved and you run the following command:\n",
+ "To make changes, go to the \"notes\" directory and edit the notebooks as necessary.\n",
+ "Each notebook refers to a module in the era5_sandbox package. Cells are exported to the module\n",
+ "when the notebook is saved and you run the following command:\n",
"\n",
+ "```sh\n",
"$ nbdev_export\n",
"```\n",
"\n",
- "For e.g., to change functionality of the `testAPI()` function in the testAPI Hydra rule, you would edit the `testAPI` notebook in the `notes` directory `notes/testAPI.ipynb`, and then save that notebook and run `nbdev_export` to update the `core` module in the package."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Usage"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Installation"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Install latest from the GitHub [repository][repo]:\n",
+ "For e.g., to change functionality of the `testAPI()` function in the testAPI Hydra rule, you would edit the `testAPI` notebook in the `notes` directory `notes/testAPI.ipynb`, and then save that notebook and run `nbdev_export` to update the `core` module in the package.\n",
+ "\n",
+ "### How to Run the Pipeline\n",
+ "\n",
+ "The pipeline downloads ERA5 variables for a given date range and geographical bounding box. You can learn how each of these steps was by following the notebooks in `notes` in numerical order.\n",
+ "\n",
+ "::: {.callout-important}\n",
+ "The pipeline has two implementations: one using `snakemake` and `hydra`, and another using `pytask`. The `pytask` implementation is the more recent one, and is recommended for future use. The `snakemake` implementation is left here for reference to legacy code.\n",
+ ":::\n",
+ "\n",
+ "#### Using `pytask`\n",
+ "\n",
+ "To run the pipeline, the `pytask` config at `note/20_pytask_config.qmd` should be reviewed\n",
+ "and updated if necessary. The pipeline can then be run with the following command:\n",
"\n",
"```sh\n",
- "$ pip install git+https://github.com/NSAPH-Data-Processing/era5_sandbox\n",
+ "$ sbatch pytask.sbatch\n",
"```\n",
"\n",
- "or clone and install in development mode:\n",
+ "#### Using `snakemake` and `hydra`\n",
+ "\n",
+ "To run the pipeline, the config at `config/config.yaml` should be updated with the desired date range and geographical bounding box. The pipeline can then be run with the following command:\n",
"\n",
"```sh\n",
- "$ git clone https://github.com/NSAPH-Data-Processing/era5_sandbox\n",
- "$ pip install -e .\n",
+ "sbatch snakemake.sbatch\n",
"```\n",
"\n",
+ "### What Does the Pipeline Produce?\n",
"\n",
- "[repo]: https://github.com/NSAPH-Data-Processing/era5_sandbox"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Documentation"
+ "Using `pytask`'s data catalog, you can investigate the downloaded raw data with python, eg.:"
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": null,
"metadata": {},
+ "outputs": [],
"source": [
- "🚧Documentation is in development 🚧"
+ "#| exec_doc:\n",
+ "#\n",
+ "import xarray as xr\n",
+ "from era5_sandbox.config import data_catalog\n",
+ "from era5_sandbox.core import ClimateDataFileHandler\n",
+ "\n",
+ "ex_nc = list(data_catalog['download']['outputs']._entries).pop()\n",
+ "ex_nc_path = data_catalog['download']['outputs'][ex_nc].load()\n",
+ "\n",
+ "with ClimateDataFileHandler(ex_nc_path) as handler:\n",
+ " ds = xr.open_dataset(handler.get_dataset(\"instant\"))\n",
+ "\n",
+ "ds"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## How to use"
+ "And plot it with cartopy, eg.:"
]
},
{
- "cell_type": "markdown",
+ "cell_type": "code",
+ "execution_count": null,
"metadata": {},
+ "outputs": [],
"source": [
- "The pipeline currently downloads ERA5 temperature and dew point temperature data for a given date range and geographical bounding box. You can learn each of these steps by following the notebooks in `notes` in numerical order.\n",
- "\n",
- "To run the pipeline, the config at `config/config.yaml` should be updated with the desired date range and geographical bounding box. The pipeline can then be run with the following command:\n",
- "\n",
- "```sh\n",
- "sbatch snakemake.sbatch\n",
- "```\n",
- "\n",
- "You can investigate the downloaded raw data with python, eg.:\n",
- "\n",
- "```python\n",
- "import xarray as xr\n",
+ "#| exec_doc:\n",
+ "#\n",
"import matplotlib.pyplot as plt\n",
"import cartopy.crs as ccrs\n",
"import cartopy.feature as cfeature\n",
"\n",
- "### the path to any of the downloaded files\n",
- "file_path = \"/n/dominici_lab/lab/data_processing/csph-era5_sandbox/data/input/2010_01.nc\"\n",
- "data = xr.open_dataset(file_path)\n",
- "\n",
- "\n",
- "temperature = data[\"t2m\"]\n",
- "\n",
- "\n",
+ "temperature = ds[\"t2m\"]\n",
"\n",
"# Select a specific time step\n",
"temperature_at_time = temperature.isel(valid_time=0)\n",
@@ -192,28 +171,14 @@
"ax.coastlines()\n",
"ax.add_feature(cfeature.BORDERS, linestyle=\":\")\n",
"ax.set_title(\"Temperature at Time Step 0\")\n",
- "plt.show()\n",
- "```"
+ "plt.show()"
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "2"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
"source": [
- "1+1"
+ "You can also load the aggregated data:"
]
},
{
@@ -221,7 +186,17 @@
"execution_count": null,
"metadata": {},
"outputs": [],
- "source": []
+ "source": [
+ "#| exec_doc:\n",
+ "#\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "from era5_sandbox.config import data_catalog\n",
+ "\n",
+ "ex_agg_path = data_catalog['aggregate']['outputs']['2019_08_madagascar_night_d2m_max.parquet'].load()\n",
+ "\n",
+ "gpd.read_parquet(ex_agg_path).describe()"
+ ]
}
],
"metadata": {
@@ -232,5 +207,5 @@
}
},
"nbformat": 4,
- "nbformat_minor": 4
+ "nbformat_minor": 5
}
diff --git a/notes/logs/2025-03-17/12-59-36/.hydra/config.yaml b/notes/logs/2025-03-17/12-59-36/.hydra/config.yaml
deleted file mode 100644
index e675fff..0000000
--- a/notes/logs/2025-03-17/12-59-36/.hydra/config.yaml
+++ /dev/null
@@ -1,34 +0,0 @@
-query:
- product_type: reanalysis
- variable:
- - 2m_dewpoint_temperature
- - 2m_temperature
- - skin_temperature
- year:
- - 2010
- - 2011
- month:
- - 1
- - 2
- - 3
- day:
- - 1
- - 2
- - 3
- - 4
- - 5
- time:
- - 0
- - 6
- - 12
- - 18
- area:
- - 0
- - 360
- - -90
- - 90
- data_format: netcdf
- download_format: unarchived
-datapaths:
- input: null
- output: null
diff --git a/notes/logs/2025-03-17/12-59-36/.hydra/hydra.yaml b/notes/logs/2025-03-17/12-59-36/.hydra/hydra.yaml
deleted file mode 100644
index b04b55c..0000000
--- a/notes/logs/2025-03-17/12-59-36/.hydra/hydra.yaml
+++ /dev/null
@@ -1,155 +0,0 @@
-hydra:
- run:
- dir: logs/${now:%Y-%m-%d}/${now:%H-%M-%S}
- sweep:
- dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S}
- subdir: ${hydra.job.num}
- launcher:
- _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher
- sweeper:
- _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper
- max_batch_size: null
- params: null
- help:
- app_name: ${hydra.job.name}
- header: '${hydra.help.app_name} is powered by Hydra.
-
- '
- footer: 'Powered by Hydra (https://hydra.cc)
-
- Use --hydra-help to view Hydra specific help
-
- '
- template: '${hydra.help.header}
-
- == Configuration groups ==
-
- Compose your configuration from those groups (group=option)
-
-
- $APP_CONFIG_GROUPS
-
-
- == Config ==
-
- Override anything in the config (foo.bar=value)
-
-
- $CONFIG
-
-
- ${hydra.help.footer}
-
- '
- hydra_help:
- template: 'Hydra (${hydra.runtime.version})
-
- See https://hydra.cc for more info.
-
-
- == Flags ==
-
- $FLAGS_HELP
-
-
- == Configuration groups ==
-
- Compose your configuration from those groups (For example, append hydra/job_logging=disabled
- to command line)
-
-
- $HYDRA_CONFIG_GROUPS
-
-
- Use ''--cfg hydra'' to Show the Hydra config.
-
- '
- hydra_help: ???
- hydra_logging:
- version: 1
- formatters:
- simple:
- format: '[%(asctime)s][HYDRA] %(message)s'
- handlers:
- console:
- class: logging.StreamHandler
- formatter: simple
- stream: ext://sys.stdout
- root:
- level: INFO
- handlers:
- - console
- loggers:
- logging_example:
- level: DEBUG
- disable_existing_loggers: false
- job_logging:
- version: 1
- formatters:
- simple:
- format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s'
- handlers:
- console:
- class: logging.StreamHandler
- formatter: simple
- stream: ext://sys.stdout
- file:
- class: logging.FileHandler
- formatter: simple
- filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log
- root:
- level: INFO
- handlers:
- - console
- - file
- disable_existing_loggers: false
- env: {}
- mode: RUN
- searchpath: []
- callbacks: {}
- output_subdir: .hydra
- overrides:
- hydra:
- - hydra.mode=RUN
- task: []
- job:
- name: ipython-input-1-3f35d1394572
- chdir: null
- override_dirname: ''
- id: ???
- num: ???
- config_name: config
- env_set: {}
- env_copy: []
- config:
- override_dirname:
- kv_sep: '='
- item_sep: ','
- exclude_keys: []
- runtime:
- version: 1.3.2
- version_base: '1.3'
- cwd: /Users/tit420/projects/era5_sandbox/notes
- config_sources:
- - path: hydra.conf
- schema: pkg
- provider: hydra
- - path: /Users/tit420/projects/era5_sandbox/conf
- schema: file
- provider: main
- - path: ''
- schema: structured
- provider: schema
- output_dir: /Users/tit420/projects/era5_sandbox/notes/logs/2025-03-17/12-59-36
- choices:
- datapaths: datapaths
- hydra/env: default
- hydra/callbacks: null
- hydra/job_logging: default
- hydra/hydra_logging: default
- hydra/hydra_help: default
- hydra/help: default
- hydra/sweeper: basic
- hydra/launcher: basic
- hydra/output: default
- verbose: false
diff --git a/notes/logs/2025-03-17/12-59-36/.hydra/overrides.yaml b/notes/logs/2025-03-17/12-59-36/.hydra/overrides.yaml
deleted file mode 100644
index fe51488..0000000
--- a/notes/logs/2025-03-17/12-59-36/.hydra/overrides.yaml
+++ /dev/null
@@ -1 +0,0 @@
-[]
diff --git a/notes/logs/2025-03-17/12-59-36/ipython-input-1-3f35d1394572.log b/notes/logs/2025-03-17/12-59-36/ipython-input-1-3f35d1394572.log
deleted file mode 100644
index 10854a9..0000000
--- a/notes/logs/2025-03-17/12-59-36/ipython-input-1-3f35d1394572.log
+++ /dev/null
@@ -1,4 +0,0 @@
-[2025-03-17 12:59:37,230][datapi.legacy_api_client][INFO] - [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.
-[2025-03-17 12:59:37,232][datapi.legacy_api_client][WARNING] - [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the "Show API request code" tool on the dataset Download Form to check you are using the correct syntax for your API request.
-[2025-03-17 12:59:37,541][datapi.legacy_api_client][INFO] - Request ID is 94401c1f-cc22-4d58-acea-0cca463df9ab
-[2025-03-17 12:59:37,676][datapi.legacy_api_client][INFO] - status has been updated to accepted
diff --git a/notes/prototypes/download_QA.ipynb b/notes/prototypes/download_QA.ipynb
deleted file mode 100644
index 96e6b5a..0000000
--- a/notes/prototypes/download_QA.ipynb
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "id": "036be852",
- "metadata": {},
- "source": [
- "# Investigating The Download Results\n",
- "\n",
- "There are a couple of things we should do to QA our data downloads. Specifically, we want to come up with a way of ensuring our aggregations are valid and accurate. This will require some simple EDA."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "08094a12",
- "metadata": {},
- "outputs": [],
- "source": [
- "from pyprojroot import here\n",
- "import pandas as pd\n",
- "import os\n",
- "from hydra import initialize, compose\n",
- "from omegaconf import OmegaConf, DictConfig"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "c3e18bb3",
- "metadata": {},
- "outputs": [],
- "source": [
- "eg_file = here() / \"data/input/2010_1.nc\""
- ]
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "python3",
- "language": "python",
- "name": "python3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 5
-}
diff --git a/notes/prototypes/kenya_demo_01_intro.ipynb b/notes/prototypes/kenya_demo_01_intro.ipynb
deleted file mode 100644
index 8fdb30b..0000000
--- a/notes/prototypes/kenya_demo_01_intro.ipynb
+++ /dev/null
@@ -1,6142 +0,0 @@
-{
- "cells": [
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "---\n",
- "skip_showdoc: true\n",
- "---"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Introduction to the ERA 5 Data\n",
- "\n",
- "The ERA5 dataset is the fifth iteration of the ECMWF ReAnalysis dataset, spanning from 1950 to the present. ECMWF is the \"European Centre for Medium-Range Weather Forecasts\".\n",
- "The dataset provides comprehensive and high-resolution historical weather and climate data. The source data is from the [Copernicus Climate Data Store (CDS)](https://cds.climate.copernicus.eu/#!/home). A comprehensive data documentation guide is available [here](https://confluence.ecmwf.int/display/CKB/ERA5%3A+data+documentation). In total, the entire CDS ERA data is over 10Petabytes.\n",
- "\n",
- "Fortunately for us, there are existing [Python](https://github.com/Climate-CAFE/era5-daily-heat-aggregation-python) and [R](https://github.com/Climate-CAFE/era5-daily-heat-aggregation) packages that have gone ahead and demonstrated extracting the data from the API for us, so we are going to use those to develop our workflow. Specifically, we're trying to understand the\n",
- "following characteristics of the data:\n",
- "\n",
- "* size, \n",
- "* how to download, \n",
- "* what are the key transformations to map things into the health sheds\n",
- "* two important variables: \n",
- " * 2m air temp, and, \n",
- " * 2m air dew point\n",
- "\n",
- "Let's get started\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Important: we need to install the CDS API first, so you'll need to grab an API key. First, you must register for an account and accept the T&Cs, afterwhich the page [here](https://ecmwf-projects.github.io/copernicus-training-c3s/cds-tutorial.html#install-the-cds-api-key) will autopopulate an API key for you. The following code shows a test case to make sure your API key works"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 13:31:07,682 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 13:31:07,683 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 13:31:07,959 INFO Request ID is 07de689d-b7df-439b-b303-2214b8f3eec0\n",
- "2025-03-03 13:31:08,091 INFO status has been updated to accepted\n",
- "2025-03-03 13:34:00,781 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "fb379a3afd064123b72fc016bd7ea267",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "1fd5a2b7ad40b8c614c78061a75d30d0.grib: 0%| | 0.00/1.98M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "data": {
- "text/plain": [
- "'download.grib'"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import cdsapi\n",
- "\n",
- "client = cdsapi.Client()\n",
- "\n",
- "dataset = 'reanalysis-era5-pressure-levels'\n",
- "request = {\n",
- " 'product_type': ['reanalysis'],\n",
- " 'variable': ['geopotential'],\n",
- " 'year': ['2024'],\n",
- " 'month': ['03'],\n",
- " 'day': ['01'],\n",
- " 'time': ['13:00'],\n",
- " 'pressure_level': ['1000'],\n",
- " 'data_format': 'grib',\n",
- "}\n",
- "target = 'download.grib'\n",
- "\n",
- "client.retrieve(dataset, request, target)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This demonstration is expected to amass 9GB of data for raw raster files (24 years, 12 files per year). The demonstration generates the 24 years of heat measures across Kenya administrative boundaries, in 1-month periods of ERA5-Land data across Kenya with three variables (2-m temp, dew point temp, skin temp)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# imports as recommended by the github repo\n",
- "import cdsapi\n",
- "import geopandas as gpd\n",
- "import os\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "I'll use pyprojroot to specify a data path"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from pyprojroot.here import here\n",
- "\n",
- "ecmw_dir = here(\"data\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def create_dir(path):\n",
- "\n",
- " if not os.path.exists(path):\n",
- " os.makedirs(path)\n",
- "\n",
- " return path"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "create_dir(ecmw_dir)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# create a directory for the kenya data\n",
- "create_dir(os.path.join(ecmw_dir, \"Kenya_GADM\"))"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Next, we need to manually fetch this GADM file for Kenya from here: https://gadm.org/download_country.html\n",
- "\n",
- "This is a boundaries geopackage; GeoBoundaries is a global database of administrative boundaries (e.g., countries, states, provinces, districts). Hence, this file provides the\n",
- "boundaries for Kenyan regions"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "kenya_shape = gpd.read_file(os.path.join(ecmw_dir, \"Kenya_GADM/gadm41_KEN.gpkg\"), layer = \"ADM_ADM_0\")\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
GID_0
\n",
- "
COUNTRY
\n",
- "
geometry
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
KEN
\n",
- "
Kenya
\n",
- "
MULTIPOLYGON (((39.38014 -4.71792, 39.37986 -4...
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " GID_0 COUNTRY geometry\n",
- "0 KEN Kenya MULTIPOLYGON (((39.38014 -4.71792, 39.37986 -4..."
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "kenya_shape"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The bounding box represents the coordinates of the shapefile, which is what we'll\n",
- "use to query Copernicus. Think of it like a mask provided in a file"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "kenya_bbox = kenya_shape.total_bounds"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([33.909588 , -4.720417 , 41.92621613, 5.06116581])"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "kenya_bbox"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Technical: Add a small buffer around the bounding box to ensure the whole region \n",
- "is queried, and round the parameters to a 0.1 resolution. A 0.1 resolution\n",
- "is applied because the resolution of netCDF ERA5 data is .25x.25\n",
- "https://confluence.ecmwf.int/display/CKB/ERA5%3A+What+is+the+spatial+reference\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "kenya_bbox[0] = round(kenya_bbox[0], 1) - 0.1\n",
- "kenya_bbox[1] = round(kenya_bbox[1], 1) - 0.1\n",
- "kenya_bbox[2] = round(kenya_bbox[2], 1) + 0.1\n",
- "kenya_bbox[3] = round(kenya_bbox[3], 1) + 0.1"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# to build a query, specify [xmin, ymin, xmax, ymax]\n",
- "query_area = [kenya_bbox[0], kenya_bbox[1], kenya_bbox[2], kenya_bbox[3]]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "query_years = list(range(2000, 2024))\n",
- "query_years_str = [str(x) for x in query_years]\n",
- "\n",
- "query_months = list(range(1, 13))\n",
- "query_months_str = [str(x).zfill(2) for x in query_months]"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "output_dir = create_dir(os.path.join(ecmw_dir, \"ERA5_out\"))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2000 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 13:52:06,896 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 13:52:06,897 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 13:52:07,181 INFO Request ID is 56d97887-22e9-441c-b33c-2236e5feaa87\n",
- "2025-03-03 13:52:07,308 INFO status has been updated to accepted\n",
- "2025-03-03 13:52:15,943 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5e8426ff1c4d4f7c9c4bf7fe34369109",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "3f0a8829f1720f8fa1289e11eedada58.nc: 0%| | 0.00/23.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 13:52:26,335 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 13:52:26,336 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 13:52:26,730 INFO Request ID is 02e31b6b-e047-4f4b-bf56-4eda01d5d08a\n",
- "2025-03-03 13:52:27,070 INFO status has been updated to accepted\n",
- "2025-03-03 13:52:36,181 INFO status has been updated to running\n",
- "2025-03-03 14:02:50,214 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3818ec1261d94244826414c00c40038d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "bdfda68cb5ba4affec5b1f592ec6ed5f.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:02:56,179 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:02:56,180 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:02:56,555 INFO Request ID is 3e4ebcbc-7038-43b4-927b-b4ce291fd60f\n",
- "2025-03-03 14:02:56,703 INFO status has been updated to accepted\n",
- "2025-03-03 14:03:18,825 INFO status has been updated to running\n",
- "2025-03-03 14:11:18,070 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "da26cd78e6ce4e0391eb081bd3d1ed10",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "eadfd863f7f6a6f82d1f077b6f137cdf.nc: 0%| | 0.00/24.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:11:27,837 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:11:27,838 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:11:28,199 INFO Request ID is f2a01b32-4853-4d2d-a873-9986d4c668fa\n",
- "2025-03-03 14:11:28,358 INFO status has been updated to accepted\n",
- "2025-03-03 14:11:33,798 INFO status has been updated to running\n",
- "2025-03-03 14:17:48,663 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ea59bb3364f648b1a990fa22b58bc379",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "7790b627e1ed17c07398e4943ddc66f8.nc: 0%| | 0.00/20.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:17:54,131 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:17:54,132 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:17:54,453 INFO Request ID is 1cf8b1bc-ba8b-4865-a895-1634b22b0cb0\n",
- "2025-03-03 14:17:54,572 INFO status has been updated to accepted\n",
- "2025-03-03 14:18:03,340 INFO status has been updated to running\n",
- "2025-03-03 14:24:14,619 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "fd851f61eb294e7c94eeecad7903a30e",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "af8da5f83b8f4edfcfdc9e9b01e85167.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:24:18,644 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:24:18,645 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:24:18,893 INFO Request ID is 8d9297fa-d2d6-4cf8-8473-669175f205a6\n",
- "2025-03-03 14:24:19,004 INFO status has been updated to accepted\n",
- "2025-03-03 14:24:27,645 INFO status has been updated to running\n",
- "2025-03-03 14:30:40,248 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3b2a46c558c242578f2c7e5602495436",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "f222a9f45eec1093306d1f8bbf9bbdd2.nc: 0%| | 0.00/21.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:30:45,830 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:30:45,832 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:30:46,161 INFO Request ID is 13f963a5-df07-42b0-9535-40f5dd511890\n",
- "2025-03-03 14:30:46,284 INFO status has been updated to accepted\n",
- "2025-03-03 14:30:54,964 INFO status has been updated to running\n",
- "2025-03-03 14:37:06,377 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "6a9a32f3b00044ef9dfd2b15db9a892e",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a56370ec686f31437a5c9328b74e48da.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:37:13,309 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:37:13,310 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:37:13,713 INFO Request ID is 33d25bd3-d6a3-4faa-8b21-7e9d93faf9f2\n",
- "2025-03-03 14:37:13,869 INFO status has been updated to accepted\n",
- "2025-03-03 14:37:22,628 INFO status has been updated to running\n",
- "2025-03-03 14:41:33,768 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5877f53e1c974f13bda779dd1b2db544",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a393f6cb418b557a044ef0b4e0fb3b68.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:41:37,733 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:41:37,734 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:41:38,015 INFO Request ID is bc09a8e9-669b-4d05-85c4-e4cf6f0cc897\n",
- "2025-03-03 14:41:38,137 INFO status has been updated to accepted\n",
- "2025-03-03 14:41:46,811 INFO status has been updated to running\n",
- "2025-03-03 14:51:58,738 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3d87c52f8b2842bfa6745f921025fb64",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "53d56522c26bfa010f95b2a567bfba6b.nc: 0%| | 0.00/21.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 14:52:02,100 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 14:52:02,100 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 14:52:02,388 INFO Request ID is 241ee8b5-f821-40e3-85a2-8409879e70f9\n",
- "2025-03-03 14:52:02,514 INFO status has been updated to accepted\n",
- "2025-03-03 14:52:16,437 INFO status has been updated to running\n",
- "2025-03-03 15:00:13,552 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "679b476a4f144069996a0f2ac17a54a2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "f7c843ccd2d84ceb1b96e518a6aa2700.nc: 0%| | 0.00/23.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:00:27,786 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:00:27,788 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:00:28,099 INFO Request ID is 8105daba-e0c3-4645-99cb-5cfe48933195\n",
- "2025-03-03 15:00:28,306 INFO status has been updated to accepted\n",
- "2025-03-03 15:00:42,459 INFO status has been updated to running\n",
- "2025-03-03 15:04:48,209 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4c6742fa7b4b46288fc033cdbcd69d93",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "48275b1e8bd062eebd8362a189661294.nc: 0%| | 0.00/20.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:04:52,699 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:04:52,700 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:04:53,116 INFO Request ID is dd89e23a-cada-48d1-8c5f-4792a907f6c0\n",
- "2025-03-03 15:04:53,231 INFO status has been updated to accepted\n",
- "2025-03-03 15:05:07,118 INFO status has been updated to running\n",
- "2025-03-03 15:11:13,173 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "abb09e98a258494789bbf255afb60293",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "63a09f7c91b0eee81c2abc276659ff0.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2001 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:11:17,671 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:11:17,672 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:11:18,119 INFO Request ID is d39ace79-6b2b-46f1-9dfc-97a95c08be81\n",
- "2025-03-03 15:11:18,254 INFO status has been updated to accepted\n",
- "2025-03-03 15:11:27,207 INFO status has been updated to running\n",
- "2025-03-03 15:17:38,525 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "1addb50452054720a0c593ea70d5bbc8",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a6f5c95b97ba2a5ea63d74168362d060.nc: 0%| | 0.00/23.0M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:17:43,072 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:17:43,073 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:17:43,421 INFO Request ID is 24a2df52-8ea9-47b6-bd22-8e3bdb4abc41\n",
- "2025-03-03 15:17:43,550 INFO status has been updated to accepted\n",
- "2025-03-03 15:17:52,171 INFO status has been updated to running\n",
- "2025-03-03 15:22:03,113 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "8d7958687cfc4c11a2413e52a8f7053b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "7353a6681620a6ac4e57207c4c34cf7e.nc: 0%| | 0.00/19.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:22:06,759 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:22:06,759 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:22:07,172 INFO Request ID is 83ad483b-c8ad-4626-9ed2-49df53bca636\n",
- "2025-03-03 15:22:07,283 INFO status has been updated to accepted\n",
- "2025-03-03 15:22:15,995 INFO status has been updated to running\n",
- "2025-03-03 15:26:27,325 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "9d2d23c5b6894b20a0157f39177359e1",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "b49dba0c41e7c7174ed705b77edab42.nc: 0%| | 0.00/23.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:26:33,108 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:26:33,109 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:26:33,462 INFO Request ID is c07a211a-40ef-4b0a-b63e-605127309fa3\n",
- "2025-03-03 15:26:33,603 INFO status has been updated to accepted\n",
- "2025-03-03 15:26:42,257 INFO status has been updated to running\n",
- "2025-03-03 15:30:53,083 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "7fd7f4006a004d04ba330ed4e7c51b0f",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "53bf46ff597b3d357606e8cae56c470a.nc: 0%| | 0.00/20.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:30:56,589 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:30:56,591 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:30:56,905 INFO Request ID is ca147122-6e94-4fd4-a20b-ee88ec92653f\n",
- "2025-03-03 15:30:57,038 INFO status has been updated to accepted\n",
- "2025-03-03 15:31:05,718 INFO status has been updated to running\n",
- "2025-03-03 15:35:16,989 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c6c62232f90a42eb92e80811d4dac82a",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "c155f6e8757b8648c1ce728eaa1f0866.nc: 0%| | 0.00/23.0M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:35:21,024 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:35:21,025 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:35:21,366 INFO Request ID is d335b374-1775-4614-97a4-5a3821e02309\n",
- "2025-03-03 15:35:21,490 INFO status has been updated to accepted\n",
- "2025-03-03 15:35:30,131 INFO status has been updated to running\n",
- "2025-03-03 15:41:41,797 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a21c8103d97b4fbcb3d7d626855dbe39",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6146d7b9b2da8097fbe3021e1682cfa0.nc: 0%| | 0.00/21.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:41:45,590 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:41:45,591 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:41:45,881 INFO Request ID is 9a7bd182-69d5-462c-a4ab-b9785f1378da\n",
- "2025-03-03 15:41:46,002 INFO status has been updated to accepted\n",
- "2025-03-03 15:41:54,620 INFO status has been updated to running\n",
- "2025-03-03 15:50:06,189 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5d80258ccb0e4be69d1f2af58b985ecc",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "e2b5d31f1e484f56cbcc8ef7eaa61941.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:50:09,722 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:50:09,723 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:50:10,010 INFO Request ID is 12d44164-5b53-44d1-b59e-8014fc094cf1\n",
- "2025-03-03 15:50:10,148 INFO status has been updated to accepted\n",
- "2025-03-03 15:50:15,289 INFO status has been updated to running\n",
- "2025-03-03 15:58:30,547 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f46d6d7fda4841389190afe276996c42",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "edd45e6f0ef2cca4d8eacbffd0965bbb.nc: 0%| | 0.00/23.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 15:58:34,164 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 15:58:34,165 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 15:58:34,507 INFO Request ID is 47938f42-99b6-4950-b016-9d26a52a1c58\n",
- "2025-03-03 15:58:34,631 INFO status has been updated to accepted\n",
- "2025-03-03 15:58:43,316 INFO status has been updated to running\n",
- "2025-03-03 16:04:54,992 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a9c243a238ee4513a13098952a929a0b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "57793eca83ae1a510eed0c349ee3ec86.nc: 0%| | 0.00/21.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:04:59,087 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:04:59,087 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:04:59,386 INFO Request ID is 181de390-2ee5-4f22-9e30-eee697fa6cfb\n",
- "2025-03-03 16:04:59,600 INFO status has been updated to accepted\n",
- "2025-03-03 16:05:08,251 INFO status has been updated to running\n",
- "2025-03-03 16:09:19,270 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0152bc860eb4459586d1de04f8f1ab8a",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "df861e01490f4bb9f2b017dddbeb4c9a.nc: 0%| | 0.00/23.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:09:24,093 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:09:24,093 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:09:24,402 INFO Request ID is 05046ebf-a981-4608-a637-69fbf0be52c6\n",
- "2025-03-03 16:09:24,530 INFO status has been updated to accepted\n",
- "2025-03-03 16:09:33,211 INFO status has been updated to running\n",
- "2025-03-03 16:15:45,215 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "45c8338e59464e0d8f48ee97526b6d45",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "cc92abb473270b684e4311a89ea223b8.nc: 0%| | 0.00/21.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:15:48,551 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:15:48,552 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:15:48,865 INFO Request ID is 78c4cfb8-5e49-409b-af59-5aaea12c7443\n",
- "2025-03-03 16:15:49,009 INFO status has been updated to accepted\n",
- "2025-03-03 16:15:57,626 INFO status has been updated to running\n",
- "2025-03-03 16:22:09,151 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "cb4613bbd8ba4e21a711df600b63772a",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4030d07d1ca90f940aaf0bcdbbfc9a69.nc: 0%| | 0.00/23.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2002 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:22:14,128 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:22:14,128 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:22:14,432 INFO Request ID is 8ee4bafd-9b6e-4884-948a-eb86a903be4b\n",
- "2025-03-03 16:22:14,563 INFO status has been updated to accepted\n",
- "2025-03-03 16:22:23,215 INFO status has been updated to running\n",
- "2025-03-03 16:28:34,713 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0bfde1af72f5484da0066f93dc20559b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4952a6018fe09831b536f02cc68cfdaa.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:28:38,466 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:28:38,468 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:28:38,748 INFO Request ID is 7e7c46c6-7e33-4456-bb84-ab6abd905e73\n",
- "2025-03-03 16:28:38,899 INFO status has been updated to accepted\n",
- "2025-03-03 16:28:47,557 INFO status has been updated to running\n",
- "2025-03-03 16:34:58,844 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4a31e5296f324d15b80634dc6bac0675",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "746bfeac4672f082014b9bfc8629e0fc.nc: 0%| | 0.00/19.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:35:02,056 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:35:02,057 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:35:02,383 INFO Request ID is a1dbd535-ef6a-4ff8-843a-dc380bbfd9fc\n",
- "2025-03-03 16:35:02,490 INFO status has been updated to accepted\n",
- "2025-03-03 16:35:12,020 INFO status has been updated to running\n",
- "2025-03-03 16:41:23,295 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "33aa9295a7a04fd0a7b99504c7e7f575",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "f0aa24727636a12faf9e051c128a6dbf.nc: 0%| | 0.00/23.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:41:26,983 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:41:26,983 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:41:27,339 INFO Request ID is 169d5b0c-53e0-422a-a99b-753cb770b553\n",
- "2025-03-03 16:41:27,473 INFO status has been updated to accepted\n",
- "2025-03-03 16:41:32,657 INFO status has been updated to running\n",
- "2025-03-03 16:47:47,676 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "24c4463134554e47a9cac840f9637504",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "1139875c53f8ba5a2279763e094e82dd.nc: 0%| | 0.00/20.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:47:53,627 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:47:53,629 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:47:53,949 INFO Request ID is e057a82f-26c1-49c2-86d2-e803f4e609b9\n",
- "2025-03-03 16:47:54,149 INFO status has been updated to accepted\n",
- "2025-03-03 16:47:59,351 INFO status has been updated to running\n",
- "2025-03-03 16:54:14,219 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "6341e9f0f14d4777b0cd0cda7d0267d0",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "e6cd334a734633bf2677a41b64ef0503.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 16:54:17,476 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 16:54:17,477 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 16:54:17,808 INFO Request ID is 57f52ced-a466-46f7-8e89-60962b0b1e71\n",
- "2025-03-03 16:54:17,962 INFO status has been updated to accepted\n",
- "2025-03-03 16:54:26,612 INFO status has been updated to running\n",
- "2025-03-03 17:04:38,619 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "31579ab608ef461ba017145618f066ea",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "c549e11cbe2ac4ea745dfee071d5477c.nc: 0%| | 0.00/21.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 17:04:41,945 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 17:04:41,947 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 17:04:42,262 INFO Request ID is 0c4a12a8-9e3f-4479-903c-12218d4995cc\n",
- "2025-03-03 17:04:42,395 INFO status has been updated to accepted\n",
- "2025-03-03 17:04:56,207 INFO status has been updated to running\n",
- "2025-03-03 17:11:02,228 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3aba2d3e8e25401782014b3569373713",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4910d00a419d7e9af6772646a37c5ef2.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 17:11:05,552 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 17:11:05,553 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 17:11:05,923 INFO Request ID is 2a14a8a9-72bb-4ad5-be7b-66ea35cc5f78\n",
- "2025-03-03 17:11:06,092 INFO status has been updated to accepted\n",
- "2025-03-03 17:11:19,956 INFO status has been updated to running\n",
- "2025-03-03 17:17:26,215 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "8a72c7a0e6ef4ffe945d7883adcfd157",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "df18b33085c197ddb5ead7aad67e32ea.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 17:17:40,447 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 17:17:40,448 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 17:17:40,911 INFO Request ID is ab2a6b15-0383-4bda-877a-38c400783092\n",
- "2025-03-03 17:17:41,098 INFO status has been updated to accepted\n",
- "2025-03-03 17:17:49,765 INFO status has been updated to running\n",
- "2025-03-03 17:24:01,146 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4fa890dc303d49e585bfc82f8e8854fc",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "24747fb2834f85bc2bc161a526047576.nc: 0%| | 0.00/21.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 17:24:05,314 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 17:24:05,315 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 17:24:05,613 INFO Request ID is 2222bf20-78ae-480b-8866-d04fb0ebd22b\n",
- "2025-03-03 17:24:05,723 INFO status has been updated to accepted\n",
- "2025-03-03 17:24:14,410 INFO status has been updated to running\n",
- "2025-03-03 17:28:25,275 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3ac9d234b7794c09a5a177a2afb01906",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4a0047e55e40631d4257bc999430f369.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 17:28:28,643 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 17:28:28,644 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 17:28:28,930 INFO Request ID is 4247b9db-0eb8-4dd4-bea7-71a188cd7191\n",
- "2025-03-03 17:28:29,062 INFO status has been updated to accepted\n",
- "2025-03-03 17:28:37,733 INFO status has been updated to running\n",
- "2025-03-03 17:34:48,991 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "989127f5cdaa41c89febcfc02a57eddf",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "83f38bf86f197534418c3f793d00df51.nc: 0%| | 0.00/20.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 17:34:52,520 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 17:34:52,520 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 17:34:52,853 INFO Request ID is 54b41ffd-5411-438b-9209-5a1a48e726f2\n",
- "2025-03-03 17:34:52,983 INFO status has been updated to accepted\n",
- "2025-03-03 17:35:01,605 INFO status has been updated to running\n",
- "2025-03-03 17:41:12,968 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "bb06602689914d90b4f0992b600da0e0",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "c548caeddfbc3b57a873757af31bb3f2.nc: 0%| | 0.00/22.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2003 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 17:41:16,083 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 17:41:16,084 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 17:41:16,395 INFO Request ID is da7f6ab3-f9a4-4cf4-a336-8d4c6069eab6\n",
- "2025-03-03 17:41:16,530 INFO status has been updated to accepted\n",
- "2025-03-03 17:41:25,165 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/da7f6ab3-f9a4-4cf4-a336-8d4c6069eab6?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-03 18:40:35,507 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "aeccd1069d2d4f80a3b569d25da240ff",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "9cbcabcbc8259ee36e1d9c27c7bcd2e5.nc: 0%| | 0.00/22.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 18:41:15,737 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 18:41:15,738 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 18:41:16,175 INFO Request ID is 4516d2f1-5b65-4107-b5b8-4ce4d95e348a\n",
- "2025-03-03 18:41:16,336 INFO status has been updated to accepted\n",
- "2025-03-03 18:41:25,142 INFO status has been updated to running\n",
- "2025-03-03 18:45:36,530 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f32cb18bfec9432695ce7b6dc6dcb890",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "18bd057dcbf50d7d98976cc045d62028.nc: 0%| | 0.00/19.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 18:45:39,813 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 18:45:39,813 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 18:45:40,206 INFO Request ID is 34d46db0-4d01-40bd-b373-8162efa32401\n",
- "2025-03-03 18:45:40,364 INFO status has been updated to accepted\n",
- "2025-03-03 18:45:49,388 INFO status has been updated to running\n",
- "2025-03-03 18:52:02,740 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "260c24823bad44a9b4d6edd3745e2cf8",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "322964381fe45a66af5c5413fbf5644a.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 18:52:11,330 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 18:52:11,331 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 18:52:11,722 INFO Request ID is 4d879f72-cb55-4254-aa16-5a72ef43d23c\n",
- "2025-03-03 18:52:11,883 INFO status has been updated to accepted\n",
- "2025-03-03 18:52:20,741 INFO status has been updated to running\n",
- "2025-03-03 18:58:32,697 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "698cd55310a549a59ac746617016f236",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "9ae86c78223efe1a0ac750a2a221fc6d.nc: 0%| | 0.00/21.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 18:58:55,948 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 18:58:55,949 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 18:58:56,566 INFO Request ID is 6e70abd1-da04-4fb4-b969-e4048d40ef03\n",
- "2025-03-03 18:58:56,721 INFO status has been updated to accepted\n",
- "2025-03-03 18:59:10,952 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-03 20:16:37,571 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d12050ce8620478eb7420de671999c85",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "77351793564a16788bd9ff4ff003f15e.nc: 0%| | 0.00/24.0M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 20:16:41,181 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 20:16:41,182 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 20:16:41,558 INFO Request ID is c5b24a83-481b-4e13-8662-3174a3cc8038\n",
- "2025-03-03 20:16:41,704 INFO status has been updated to accepted\n",
- "2025-03-03 20:16:55,758 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-03 21:54:10,191 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0b315e9b63c7460b83f625e8d568fe5d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "7f99b74ab25ed4e8b5c181262f90162b.nc: 0%| | 0.00/21.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 21:54:13,686 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 21:54:13,687 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 21:54:14,053 INFO Request ID is aa63909b-dd55-4b50-9109-d97101407bb4\n",
- "2025-03-03 21:54:14,221 INFO status has been updated to accepted\n",
- "2025-03-03 21:54:23,021 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-03 22:46:05,448 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "934ff6b4de3f400087592ed675baab83",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "b5f4942e64b0f955a2a693d1e5bdbc64.nc: 0%| | 0.00/22.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-03 22:46:15,545 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-03 22:46:15,547 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-03 22:46:15,927 INFO Request ID is 20adab3a-13d3-4718-9b95-1545745ac571\n",
- "2025-03-03 22:46:16,445 INFO status has been updated to accepted\n",
- "2025-03-03 22:46:21,698 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-04 00:21:52,696 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "e6bc2de255b24d44b82a688b1ac10deb",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "d4ff59b4ec3fda00d4074896dbcb7bc.nc: 0%| | 0.00/23.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 00:22:07,044 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 00:22:07,059 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 00:22:07,433 INFO Request ID is 9e1dad3f-786e-4f36-8f48-a3d8b0e3d291\n",
- "2025-03-04 00:22:07,590 INFO status has been updated to accepted\n",
- "2025-03-04 00:22:16,404 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-04 03:10:29,610 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3d1ca201585140c6b40252677adf643f",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "132b6164c0ca36daaf324f4207628ff0.nc: 0%| | 0.00/21.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 03:10:33,344 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 03:10:33,344 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 03:10:33,702 INFO Request ID is 59d7b1b3-5a6c-4305-bec5-84d8a54588d2\n",
- "2025-03-04 03:10:33,859 INFO status has been updated to accepted\n",
- "2025-03-04 03:10:39,118 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-04 04:48:49,216 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a9b4fd82010141a8b465911b7149fb6f",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a555c239db00bc554d8244e8ad695672.nc: 0%| | 0.00/23.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 04:48:53,323 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 04:48:53,324 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 04:48:53,679 INFO Request ID is 16f644ad-e849-4a58-8214-d2e620a096e4\n",
- "2025-03-04 04:48:53,848 INFO status has been updated to accepted\n",
- "2025-03-04 04:48:59,101 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-04 06:27:39,088 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ea0bc53ce4b14fc6931c6e4017473dc2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "2f4822e1cbe36b79a3992ad7f01f4214.nc: 0%| | 0.00/21.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 06:27:49,122 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 06:27:49,123 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 06:27:49,516 INFO Request ID is 45635b7d-1128-402c-99ec-8a0ad7814c83\n",
- "2025-03-04 06:27:49,722 INFO status has been updated to accepted\n",
- "2025-03-04 06:27:55,019 INFO status has been updated to running\n",
- "2025-03-04 06:28:04,209 INFO status has been updated to accepted\n",
- "2025-03-04 06:28:12,005 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-04 08:01:27,064 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "cdb69efbd04542039c06314d43d8d306",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4bd60f841fa47583f79fc66a8401d0ad.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2004 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 08:01:32,319 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 08:01:32,320 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 08:01:33,516 INFO Request ID is bb759952-18b4-48d9-8d0e-954362686a6a\n",
- "2025-03-04 08:01:33,677 INFO status has been updated to accepted\n",
- "2025-03-04 08:01:38,967 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-04 09:38:12,083 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "533c3b3733754da480da0f570e6c9a0d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "d4f4e4aeb1a9248692853a5c3efbf89.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Recovering from connection error [HTTPSConnectionPool(host='object-store.os-api.cci2.ecmwf.int', port=443): Read timed out.], attemps 1 of 500\n",
- "Retrying in 120 seconds\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "df70a07129dc4c81ac58a29561de8df5",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "d4f4e4aeb1a9248692853a5c3efbf89.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 09:47:43,625 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 09:47:43,626 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 09:47:43,900 INFO Request ID is e3420e1c-4f8d-4251-964c-2e001a220819\n",
- "2025-03-04 09:47:44,024 INFO status has been updated to accepted\n",
- "2025-03-04 09:47:49,179 INFO status has been updated to running\n",
- "2025-03-04 09:54:04,081 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "fa56954c3f7647279dd7914b28b0a6bc",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6e51aaba6e9e394aec2c472dba256e72.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 09:54:10,509 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 09:54:10,510 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 09:54:10,838 INFO Request ID is beb2cc9b-50ba-4385-885a-74f82cd85646\n",
- "2025-03-04 09:54:11,012 INFO status has been updated to accepted\n",
- "2025-03-04 09:54:16,257 INFO status has been updated to running\n",
- "2025-03-04 10:02:32,275 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c2b9d4e5be4149cea9197ed0d9720794",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "577113643e225204be90c7d41e3255c1.nc: 0%| | 0.00/22.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:02:36,182 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:02:36,183 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:02:36,590 INFO Request ID is 0485dce7-9b91-4e4d-b46a-57c9dcb2acca\n",
- "2025-03-04 10:02:36,721 INFO status has been updated to accepted\n",
- "2025-03-04 10:02:45,458 INFO status has been updated to running\n",
- "2025-03-04 10:08:57,057 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "e2ff17238ba0422d98e9c9e1be546d8d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "b15d5bde5ff8d58b65a653eb30e811bc.nc: 0%| | 0.00/20.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:09:02,921 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:09:02,922 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:09:03,198 INFO Request ID is 6ee8d338-0f4e-4f05-a394-18607c0edb9d\n",
- "2025-03-04 10:09:03,336 INFO status has been updated to accepted\n",
- "2025-03-04 10:09:18,215 INFO status has been updated to running\n",
- "2025-03-04 10:15:24,462 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "9b4cacabfd754e16bb3ce53862f473b0",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "e9d63b8d3e4766add5c9adda544ffb77.nc: 0%| | 0.00/22.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:15:29,851 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:15:29,852 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:15:30,148 INFO Request ID is ad2bfc81-e9d2-4a1b-bb03-eee097b8ebff\n",
- "2025-03-04 10:15:30,286 INFO status has been updated to accepted\n",
- "2025-03-04 10:15:35,440 INFO status has been updated to running\n",
- "2025-03-04 10:21:50,350 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "2292fc2f3e9548ac93d018112cc55464",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "d4e93dc9a851bdcd8ae7c4f4fa7b61d9.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:21:56,973 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:21:56,974 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:21:57,348 INFO Request ID is 93a6680d-baa9-49e7-9a29-4224f5e24de2\n",
- "2025-03-04 10:21:57,495 INFO status has been updated to accepted\n",
- "2025-03-04 10:22:02,865 INFO status has been updated to running\n",
- "2025-03-04 10:22:11,652 INFO status has been updated to accepted\n",
- "2025-03-04 10:22:19,406 INFO status has been updated to running\n",
- "2025-03-04 10:28:17,758 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c72b83f0e0184bdbae2c7aa07950d9d2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "75ff3e1ccd6f92b7d8c8dbdd7d4ae92d.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:28:24,118 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:28:24,119 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:28:24,440 INFO Request ID is a70f92e0-ec80-493a-8b6a-41fa00b00119\n",
- "2025-03-04 10:28:24,574 INFO status has been updated to accepted\n",
- "2025-03-04 10:28:33,356 INFO status has been updated to running\n",
- "2025-03-04 10:34:44,894 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "36db07a5c15b40c1bfca3f9ad39fbd72",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4a6b2d7d1cb2482b423c99751d84a34d.nc: 0%| | 0.00/23.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:34:48,913 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:34:48,913 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:34:49,247 INFO Request ID is 8462b2cd-cd64-4afb-a331-929d6c36b6d3\n",
- "2025-03-04 10:34:49,385 INFO status has been updated to accepted\n",
- "2025-03-04 10:35:03,181 INFO status has been updated to running\n",
- "2025-03-04 10:41:09,230 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3b3d2a0de5f6442aae1c18c71a992953",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6b2313ffa46bdca1e1b8a0272157602c.nc: 0%| | 0.00/20.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:41:18,443 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:41:18,443 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:41:18,803 INFO Request ID is 9c4e4872-cc6d-4c69-b5e5-5e9611545f92\n",
- "2025-03-04 10:41:18,955 INFO status has been updated to accepted\n",
- "2025-03-04 10:41:27,708 INFO status has been updated to running\n",
- "2025-03-04 10:47:40,234 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "34ea4423541646c48f00affdebd94030",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "e69b8907411d58169a4757de7beb788c.nc: 0%| | 0.00/22.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:47:46,398 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:47:46,399 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:47:46,722 INFO Request ID is f9da7b12-259e-4213-ad8f-b09b805176a3\n",
- "2025-03-04 10:47:46,844 INFO status has been updated to accepted\n",
- "2025-03-04 10:48:08,549 INFO status has been updated to running\n",
- "2025-03-04 10:54:06,935 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "55f246a97b1f4d618acf2cc93904ec42",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "fba17f50666c361d8f4774e5e8c3d6aa.nc: 0%| | 0.00/21.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 10:54:12,500 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 10:54:12,501 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 10:54:12,796 INFO Request ID is 5d529887-5804-4e3e-8bfb-2a1a936f531e\n",
- "2025-03-04 10:54:13,007 INFO status has been updated to accepted\n",
- "2025-03-04 10:54:18,251 INFO status has been updated to running\n",
- "2025-03-04 11:00:33,100 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "9e54feb461444e8db65691c61e98104b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "3e0cb42efea037099b66d46828f8d149.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2005 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 11:00:37,145 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 11:00:37,146 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 11:00:37,503 INFO Request ID is a40e8775-d8b4-499e-baa7-f564cd05123c\n",
- "2025-03-04 11:00:37,635 INFO status has been updated to accepted\n",
- "2025-03-04 11:00:46,318 INFO status has been updated to running\n",
- "2025-03-04 11:06:57,519 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "2d344154229a474088606f9c4cf1f4f1",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "100dc6b3e4ef04c0b33734cde7d11ca5.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 11:07:01,610 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 11:07:01,611 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 11:07:02,019 INFO Request ID is 03fdd916-29b5-4d4e-923f-19e3bd66bca1\n",
- "2025-03-04 11:07:02,130 INFO status has been updated to accepted\n",
- "2025-03-04 11:07:23,700 INFO status has been updated to running\n",
- "2025-03-04 11:13:22,011 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "2c200dfce4eb4b198bc9702243b38ebe",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "82f6b0ec92e3083461af35420a4356b9.nc: 0%| | 0.00/19.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 11:13:26,175 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 11:13:26,176 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 11:13:26,462 INFO Request ID is dcf86bd8-5951-47eb-833b-f9971bf3f587\n",
- "2025-03-04 11:13:26,587 INFO status has been updated to accepted\n",
- "2025-03-04 11:13:31,737 INFO status has been updated to running\n",
- "2025-03-04 11:19:46,761 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "1e2e1d634e974b338c61a56e7110f1b0",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "5ca6b0c8145b049c15ae44413de55d25.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 11:19:53,689 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 11:19:53,690 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 11:19:54,001 INFO Request ID is 005fbc44-a1d1-4b23-ad05-0cd81f88ffea\n",
- "2025-03-04 11:19:54,132 INFO status has been updated to accepted\n",
- "2025-03-04 11:20:27,373 INFO status has been updated to running\n",
- "2025-03-04 11:32:15,333 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f89ee9a22fc045df89f9831224d0fc6a",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "ffc02554880287503940142e8a510d4a.nc: 0%| | 0.00/21.0M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 11:32:19,220 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 11:32:19,222 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 11:32:19,570 INFO Request ID is 6bb5e9c7-9b29-41ea-a109-389b8d991ac0\n",
- "2025-03-04 11:32:19,744 INFO status has been updated to accepted\n",
- "2025-03-04 11:42:40,683 INFO status has been updated to running\n",
- "2025-03-04 11:48:41,817 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ec52c053bfae4146b2017cd88a36c584",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "8f252a394e01bee76c3963e6dd84b52e.nc: 0%| | 0.00/21.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 11:48:47,592 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 11:48:47,592 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 11:48:47,914 INFO Request ID is 724fe9e0-d76b-42ba-8c5a-f38589b1efeb\n",
- "2025-03-04 11:48:48,047 INFO status has been updated to accepted\n",
- "2025-03-04 12:09:12,266 INFO status has been updated to running\n",
- "2025-03-04 12:15:13,455 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "b249ff9061424656a32e48f2c035e6cf",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "17d0d4b440635e196965c85a437e0f98.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 12:15:19,513 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 12:15:19,514 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 12:15:19,816 INFO Request ID is 3a4657cf-d697-48da-83ea-d110a50fd5e3\n",
- "2025-03-04 12:15:19,949 INFO status has been updated to accepted\n",
- "2025-03-04 12:27:41,331 INFO status has been updated to running\n",
- "2025-03-04 12:33:43,172 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c073ea87e29942e29837603c9b4f5fa5",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "3462d7892fbf021e487d38ff00ea729f.nc: 0%| | 0.00/22.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 12:33:53,005 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 12:33:53,006 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 12:33:53,308 INFO Request ID is d92c960f-bf32-43f7-becb-1a8c2023442a\n",
- "2025-03-04 12:33:53,430 INFO status has been updated to accepted\n",
- "2025-03-04 12:40:13,337 INFO status has been updated to running\n",
- "2025-03-04 12:46:14,388 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0e6ba7333efe4c998c402113e72275ac",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6f115164f9f9eb7585681eea3410cc27.nc: 0%| | 0.00/23.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 12:47:32,769 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 12:47:32,770 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 12:47:33,094 INFO Request ID is a128253d-b7b4-4b64-8a56-de57091c5433\n",
- "2025-03-04 12:47:33,525 INFO status has been updated to accepted\n",
- "2025-03-04 12:47:42,430 INFO status has been updated to running\n",
- "2025-03-04 12:53:54,370 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3c50aa5591ea400fa4f134699660d760",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a4366d50b0870de70d4c225f8b69a97.nc: 0%| | 0.00/21.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 12:54:02,725 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 12:54:02,725 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 12:54:03,069 INFO Request ID is 6587609e-a8d7-4dde-a82d-5869f63c94a0\n",
- "2025-03-04 12:54:03,186 INFO status has been updated to accepted\n",
- "2025-03-04 12:54:24,878 INFO status has been updated to running\n",
- "2025-03-04 13:02:24,112 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ba6b1efbea5849a6a61ec6fab07ba109",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "5bec83b48bd3580b8b513169027b6201.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 13:02:33,128 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 13:02:33,129 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 13:02:33,548 INFO Request ID is 4158b3e1-5c5b-4695-b4c6-ca3e14184cc7\n",
- "2025-03-04 13:02:33,721 INFO status has been updated to accepted\n",
- "2025-03-04 13:05:26,404 INFO status has been updated to running\n",
- "2025-03-04 13:10:53,924 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0478f7cd80a74621877898d6bdae7bd7",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "24b332ae08734d20c69fd626bf6f87d0.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 13:10:59,388 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 13:10:59,388 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 13:10:59,743 INFO Request ID is a4119521-697c-468c-8b0f-b3ac9dbc880d\n",
- "2025-03-04 13:10:59,854 INFO status has been updated to accepted\n",
- "2025-03-04 13:15:19,448 INFO status has been updated to running\n",
- "2025-03-04 13:19:20,182 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d3fc34ef118d450bbea3c0024fa6fd46",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "36c1d0e91f1d06cc96e4ee770c352d78.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2006 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 13:19:24,935 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 13:19:24,935 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 13:19:25,230 INFO Request ID is a2dc4d2a-68ee-4869-b1ef-72a164ee55d2\n",
- "2025-03-04 13:19:25,365 INFO status has been updated to accepted\n",
- "2025-03-04 13:43:36,177 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "8f43e95b0567426695f1742eaeb076a6",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "c4d21666dcb9762756b906901bb87ce3.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 13:43:55,145 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 13:43:55,146 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 13:43:55,439 INFO Request ID is 77c4a306-c706-4bc9-9812-3975e2b8e41e\n",
- "2025-03-04 13:43:55,552 INFO status has been updated to accepted\n",
- "2025-03-04 14:03:34,910 INFO status has been updated to running\n",
- "2025-03-04 14:07:35,576 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "553f597557ec4258bd105f550e2862c5",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "7fb6e3d31203a337a177b1affc94248a.nc: 0%| | 0.00/19.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 14:07:39,516 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 14:07:39,517 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 14:07:39,825 INFO Request ID is 23a1ad68-259b-46d4-b059-38a5861c05a0\n",
- "2025-03-04 14:07:39,955 INFO status has been updated to accepted\n",
- "2025-03-04 14:13:59,789 INFO status has been updated to running\n",
- "2025-03-04 14:22:01,316 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c3e6effa4081440d9ff5c4821c177313",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "91c8464e6133709207cc8f626fdacaa6.nc: 0%| | 0.00/23.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 14:22:08,354 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 14:22:08,355 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 14:22:08,630 INFO Request ID is bba66118-5631-4065-b679-e6478985fd2b\n",
- "2025-03-04 14:22:08,773 INFO status has been updated to accepted\n",
- "2025-03-04 14:32:29,918 INFO status has been updated to running\n",
- "2025-03-04 14:38:31,238 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "143edc1991c447b68cea880422eea505",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "5af1280a2e6c071c496ea4c2f3e31610.nc: 0%| | 0.00/21.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 14:38:36,698 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 14:38:36,699 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 14:38:37,015 INFO Request ID is b6296593-c255-4e69-9e96-6365d1f022a3\n",
- "2025-03-04 14:38:37,151 INFO status has been updated to accepted\n",
- "2025-03-04 14:44:57,211 INFO status has been updated to running\n",
- "2025-03-04 14:48:57,902 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "1ecdc6ef39b24e33b879916f8837db5e",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "717197501229ff5cf3a9c7135eb35efd.nc: 0%| | 0.00/23.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 14:49:02,332 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 14:49:02,333 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 14:49:02,660 INFO Request ID is 80e8f5ab-4412-42c8-92df-a73aa7f67004\n",
- "2025-03-04 14:49:02,857 INFO status has been updated to accepted\n",
- "2025-03-04 14:51:55,841 INFO status has been updated to running\n",
- "2025-03-04 14:57:23,648 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a2559e1f334f4a70aa26023e59cbecff",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6045a7a92a5d56f1b6ab92ef0f92315a.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 14:57:28,130 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 14:57:28,131 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 14:57:28,489 INFO Request ID is b61e8e4c-81d4-49c7-b4c6-fc501fcb0f13\n",
- "2025-03-04 14:57:28,655 INFO status has been updated to accepted\n",
- "2025-03-04 14:57:42,476 INFO status has been updated to running\n",
- "2025-03-04 15:05:49,261 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "13645182fdff46fcb84ff47672fad211",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "1b705fb48a6cddaebf381faa0524dd60.nc: 0%| | 0.00/22.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:05:52,832 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:05:52,832 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:05:53,178 INFO Request ID is 7f5f3573-8fc3-42eb-a2ed-3477c4ea04da\n",
- "2025-03-04 15:05:53,308 INFO status has been updated to accepted\n",
- "2025-03-04 15:06:07,216 INFO status has been updated to running\n",
- "2025-03-04 15:12:13,342 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4523e077de7244459a67c0ace1f6c41b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "173b48c7fd50609852dbcd6c2f153b89.nc: 0%| | 0.00/24.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:12:18,662 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:12:18,663 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:12:18,957 INFO Request ID is f4aff46e-2ba1-4942-8246-d88740abec0f\n",
- "2025-03-04 15:12:19,105 INFO status has been updated to accepted\n",
- "2025-03-04 15:12:27,876 INFO status has been updated to running\n",
- "2025-03-04 15:16:39,164 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f734601d66ff48e381f0d6bbc0498e27",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "182c849cd1af687aee9c38bd14da741f.nc: 0%| | 0.00/20.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:16:43,159 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:16:43,160 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:16:43,472 INFO Request ID is 70945f07-94e9-47cc-bef0-644bd1c86328\n",
- "2025-03-04 15:16:43,601 INFO status has been updated to accepted\n",
- "2025-03-04 15:16:52,326 INFO status has been updated to running\n",
- "2025-03-04 15:23:04,014 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "860b5e49035e4c8885f12a828ae61ea1",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "1dc116db561fe8dbb14db6782a9ef596.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:23:09,745 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:23:09,745 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:23:10,056 INFO Request ID is efe1500e-f60b-4691-965b-177fff6272f9\n",
- "2025-03-04 15:23:10,254 INFO status has been updated to accepted\n",
- "2025-03-04 15:23:19,170 INFO status has been updated to running\n",
- "2025-03-04 15:29:30,651 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "cac1be2657e643e7b1c7ac4767ae8444",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6a50f62d51e8045da1538c5fabcf8309.nc: 0%| | 0.00/22.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:29:36,745 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:29:36,746 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:29:37,269 INFO Request ID is a0ad1303-28b8-46a1-b413-5255290b5cbe\n",
- "2025-03-04 15:29:37,465 INFO status has been updated to accepted\n",
- "2025-03-04 15:29:46,379 INFO status has been updated to running\n",
- "2025-03-04 15:35:57,932 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "550d502bb3834a5bb5658f81e621dc7a",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "7c67de64aea1dfe0794d5a3008cc9624.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2007 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:36:01,967 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:36:01,968 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:36:02,360 INFO Request ID is e0d7d0a9-ab37-4f6c-9542-562c085792a7\n",
- "2025-03-04 15:36:02,481 INFO status has been updated to accepted\n",
- "2025-03-04 15:36:11,104 INFO status has been updated to running\n",
- "2025-03-04 15:42:22,339 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5f9313cb1c7146cba42bd220edc4c0b4",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "11e831d9caecec7e1fb12f5da2becf73.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:42:26,635 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:42:26,636 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:42:26,962 INFO Request ID is 77ae239a-d853-4366-b5ab-ecbec90ba32c\n",
- "2025-03-04 15:42:27,070 INFO status has been updated to accepted\n",
- "2025-03-04 15:42:35,718 INFO status has been updated to running\n",
- "2025-03-04 15:46:46,707 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "9390479c31134c29a8fc7f3280bec2c5",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "fbe37db7e9e90292a0bb04f046113bcc.nc: 0%| | 0.00/19.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 15:46:51,132 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 15:46:51,133 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 15:46:51,418 INFO Request ID is 11dac302-36ed-485c-acdb-663ecdfb3b2e\n",
- "2025-03-04 15:46:51,524 INFO status has been updated to accepted\n",
- "2025-03-04 15:47:00,159 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/11dac302-36ed-485c-acdb-663ecdfb3b2e?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/11dac302-36ed-485c-acdb-663ecdfb3b2e?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 2 of 500\n",
- "Retrying in 120 seconds\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/11dac302-36ed-485c-acdb-663ecdfb3b2e?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 3 of 500\n",
- "Retrying in 120 seconds\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/11dac302-36ed-485c-acdb-663ecdfb3b2e?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 4 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-04 22:18:35,613 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d2701bf43b734520bd134beaba73eed8",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "bf5ea2b1c1907fc99fe424f97a71a8c1.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Recovering from connection error [HTTPSConnectionPool(host='object-store.os-api.cci2.ecmwf.int', port=443): Read timed out.], attemps 1 of 500\n",
- "Retrying in 120 seconds\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "cfe996ba40fc4ea3985a3248f10a4ac5",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "bf5ea2b1c1907fc99fe424f97a71a8c1.nc: 72%|#######2 | 17.0M/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 22:58:42,093 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 22:58:42,094 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 22:58:42,469 INFO Request ID is 136468ea-fa06-46a2-b99c-03a925f1425f\n",
- "2025-03-04 22:58:42,645 INFO status has been updated to accepted\n",
- "2025-03-04 22:58:51,556 INFO status has been updated to running\n",
- "2025-03-04 23:16:37,990 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "911072bec1b14a26b1a98a5efbabebdf",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "dd07d89f067b8781572528ac2b5bb18c.nc: 0%| | 0.00/21.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-04 23:16:41,964 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-04 23:16:41,965 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-04 23:16:42,339 INFO Request ID is d625108a-9f82-474b-b46f-20d35ffa72f2\n",
- "2025-03-04 23:16:42,495 INFO status has been updated to accepted\n",
- "2025-03-04 23:16:48,275 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 00:52:09,706 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "51efb5038d984f36ae50dead378614ae",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4c0f98667c1d4390de9052c89cfe7a69.nc: 0%| | 0.00/23.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 00:52:13,673 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 00:52:13,674 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 00:52:14,051 INFO Request ID is a6f3b1ae-e374-4a33-ad09-6f4e47710096\n",
- "2025-03-05 00:52:14,213 INFO status has been updated to accepted\n",
- "2025-03-05 00:52:19,481 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 02:50:17,290 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a735255237ab4c4695b0f362bbc07dd2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "13e378d4e913dd77cd34f6e5ab1aec5f.nc: 0%| | 0.00/22.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 02:50:23,031 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 02:50:23,031 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 02:50:23,379 INFO Request ID is 6b93ef2e-60d8-4ce4-87cb-0739b8dad79f\n",
- "2025-03-05 02:50:23,522 INFO status has been updated to accepted\n",
- "2025-03-05 02:50:28,781 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 04:57:59,083 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "2541377e647d4fe4932557b5de4178df",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "13e7b2f75be1040dc90e501baf0fe901.nc: 0%| | 0.00/22.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 04:58:16,028 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 04:58:16,029 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 04:58:16,368 INFO Request ID is a3135c9c-e265-4cad-bae3-a9b07ecfe550\n",
- "2025-03-05 04:58:16,537 INFO status has been updated to accepted\n",
- "2025-03-05 04:58:25,390 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 07:37:53,120 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "edd34e27d5034ba79f7fb15abe29e098",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "3664413d6f266e22e4141928d2c8fd13.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 07:37:56,894 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 07:37:56,896 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 07:37:57,298 INFO Request ID is 988df20f-32f1-4e79-af39-f2929513bd0f\n",
- "2025-03-05 07:37:57,477 INFO status has been updated to accepted\n",
- "2025-03-05 07:38:02,718 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/988df20f-32f1-4e79-af39-f2929513bd0f?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 2 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 11:17:00,960 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "6f3645a9aec942aca89ca91059a818b9",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6305750f2c651fc9ef6aac03b3db5eef.nc: 0%| | 0.00/20.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 11:17:07,077 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 11:17:07,078 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 11:17:07,438 INFO Request ID is 66b5de59-1f90-44d6-8966-3b6114007b64\n",
- "2025-03-05 11:17:07,574 INFO status has been updated to accepted\n",
- "2025-03-05 11:17:13,020 INFO status has been updated to running\n",
- "2025-03-05 11:23:27,799 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d7edd5713277467b9809e0b3064e9366",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "168a1447d22a5befc8daa3ef3ee5b2f4.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 11:23:33,353 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 11:23:33,354 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 11:23:33,656 INFO Request ID is d1be8e5c-b3e9-4ae5-9294-e8052262b781\n",
- "2025-03-05 11:23:33,797 INFO status has been updated to accepted\n",
- "2025-03-05 11:23:39,024 INFO status has been updated to running\n",
- "2025-03-05 11:39:55,822 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4a806d78a9504ffb8977e6c35d92abf0",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "843997243436bef7669cba0f19e4a7e6.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 11:39:59,368 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 11:39:59,369 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 11:39:59,665 INFO Request ID is d6464ec5-94fc-468e-b993-0feee0f68cfa\n",
- "2025-03-05 11:39:59,785 INFO status has been updated to accepted\n",
- "2025-03-05 11:40:08,406 INFO status has been updated to running\n",
- "2025-03-05 11:46:19,717 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4d3918e51afe436d94c07fb6966173dc",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "b7b397f90f54f2061e6be9757bacb5c6.nc: 0%| | 0.00/22.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2008 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 11:46:23,596 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 11:46:23,597 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 11:46:23,925 INFO Request ID is 068bc61f-efe4-499a-a7ee-c66faea78077\n",
- "2025-03-05 11:46:24,050 INFO status has been updated to accepted\n",
- "2025-03-05 11:46:32,726 INFO status has been updated to running\n",
- "2025-03-05 11:52:44,043 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3e5204e03d13487eaa64f1dcfcb1b6ea",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "1e34586d8edd7e943717e61930bcb3c1.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 11:52:48,118 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 11:52:48,118 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 11:52:48,406 INFO Request ID is c997e23c-f539-494d-b6eb-2e96a946643b\n",
- "2025-03-05 11:52:48,538 INFO status has been updated to accepted\n",
- "2025-03-05 11:53:02,358 INFO status has been updated to running\n",
- "2025-03-05 11:53:10,077 INFO status has been updated to accepted\n",
- "2025-03-05 11:53:21,598 INFO status has been updated to running\n",
- "2025-03-05 12:07:09,782 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "66fa743a285f478e8c989a99f3d5e8c9",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "7e5825f226628cc6c730e2f8748875ed.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 12:07:13,233 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 12:07:13,234 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 12:07:13,515 INFO Request ID is 0f1a5bbc-6e12-48be-93e7-9fcf700ee9a1\n",
- "2025-03-05 12:07:13,647 INFO status has been updated to accepted\n",
- "2025-03-05 12:07:22,414 INFO status has been updated to running\n",
- "2025-03-05 12:13:33,899 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "636b6c0f843245a88627c2a2caba0ad4",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "bb00f6992d38fcb26d8dcbb7f444ba86.nc: 0%| | 0.00/23.0M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 12:13:38,567 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 12:13:38,568 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 12:13:38,844 INFO Request ID is c9d491f7-d9c8-46df-8879-bb260c1e2b2e\n",
- "2025-03-05 12:13:38,968 INFO status has been updated to accepted\n",
- "2025-03-05 12:13:52,891 INFO status has been updated to running\n",
- "2025-03-05 12:21:57,680 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "92f31a1e528a4f4896e9c68df0f2319b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "9315fa25477b1198aa064b3f756f300c.nc: 0%| | 0.00/20.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 12:22:01,146 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 12:22:01,147 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 12:22:01,437 INFO Request ID is 576292a5-567c-4777-b6cb-7824da3a60ad\n",
- "2025-03-05 12:22:01,584 INFO status has been updated to accepted\n",
- "Recovering from connection error [('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 12:32:41,612 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "fdb98e79170649fbb993149e015d1d09",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "15424c9a685be2bca1c2d0ae07a8d13d.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 12:32:47,798 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 12:32:47,799 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 12:32:48,140 INFO Request ID is 8b63ff28-efa7-4682-a59c-921c01d8474a\n",
- "2025-03-05 12:32:49,350 INFO status has been updated to accepted\n",
- "2025-03-05 12:32:58,123 INFO status has been updated to running\n",
- "2025-03-05 12:39:09,438 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c20cf06de95a4e80acd4b6c83158466a",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "ed9641587361892e6999d3bc2a922a53.nc: 0%| | 0.00/21.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 12:39:14,687 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 12:39:14,688 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 12:39:14,999 INFO Request ID is 3014599c-4862-458a-b74f-512270b35d57\n",
- "2025-03-05 12:39:15,107 INFO status has been updated to accepted\n",
- "2025-03-05 12:39:24,017 INFO status has been updated to running\n",
- "2025-03-05 12:45:35,571 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "01e9757e5e2f4c9ab41db699df0ba12d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "40af3114d25a8649d467c2483f969f22.nc: 0%| | 0.00/24.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 12:45:41,725 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 12:45:41,726 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 12:45:41,990 INFO Request ID is 5904eb2a-3fac-4989-a757-b60f25479405\n",
- "2025-03-05 12:45:42,105 INFO status has been updated to accepted\n",
- "2025-03-05 12:45:47,367 INFO status has been updated to running\n",
- "2025-03-05 12:52:02,362 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "05dc57567ea34217b689ffadd4e6c7ef",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "ae20755ce1d1a3deed046dc5bf3acf32.nc: 0%| | 0.00/24.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 12:52:11,083 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 12:52:11,084 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 12:52:11,555 INFO Request ID is 20ba67b8-f807-4ae1-8d0f-12c23f6b581c\n",
- "2025-03-05 12:52:11,662 INFO status has been updated to accepted\n",
- "2025-03-05 12:52:33,414 INFO status has been updated to running\n",
- "2025-03-05 13:02:40,959 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4618cfdf1d534baa8abc459e2ccf43ed",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6e5f1b489fbdece77d6be7f47c2b51e1.nc: 0%| | 0.00/21.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 13:02:47,251 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 13:02:47,252 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 13:02:47,617 INFO Request ID is 58c13e75-441e-49d7-8171-18a2e543822f\n",
- "2025-03-05 13:02:47,772 INFO status has been updated to accepted\n",
- "Recovering from connection error [('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 13:10:23,177 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "97ca272e5245440eb0decc4c84aa8d5b",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "5c3797eb7376b2651ac156c26dc61b96.nc: 0%| | 0.00/21.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 13:10:27,079 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 13:10:27,081 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 13:10:27,404 INFO Request ID is 1bf29d08-b15a-4fa9-accd-3440dcb00971\n",
- "2025-03-05 13:10:27,529 INFO status has been updated to accepted\n",
- "2025-03-05 13:10:36,343 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 13:23:42,141 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "be144c32decc44d0b516b7b1a5b95ad6",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "f904596a37761289db388e370fb0b1f1.nc: 0%| | 0.00/20.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 13:23:46,075 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 13:23:46,076 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 13:23:46,392 INFO Request ID is 53953d53-4e03-4a0b-b491-334b26ba406b\n",
- "2025-03-05 13:23:46,525 INFO status has been updated to accepted\n",
- "2025-03-05 13:23:51,635 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 13:42:24,578 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5c500efa026c46538d57148a53c0a09c",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "7d12dfca50361a747aba82fcdf4c5089.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2009 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 13:42:28,769 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 13:42:28,771 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 13:42:29,064 INFO Request ID is 40cf7143-f966-454f-b120-974e6ce15883\n",
- "2025-03-05 13:42:29,190 INFO status has been updated to accepted\n",
- "2025-03-05 13:42:34,362 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 13:50:48,121 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "6d5cfe2be62e440392a8f9d09c308ba2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "5a1e2972ab682c0a998e708a8df457e9.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 13:50:53,595 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 13:50:53,596 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 13:50:53,876 INFO Request ID is f8167f7c-8213-4ba9-9931-2ba98d325c28\n",
- "2025-03-05 13:50:54,012 INFO status has been updated to accepted\n",
- "2025-03-05 13:50:59,192 INFO status has been updated to running\n",
- "2025-03-05 13:57:13,963 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "6bedd2c60af048c89c1c6f8b308a18d1",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "49c39eac5e37ab9b001f21eff34ca219.nc: 0%| | 0.00/19.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 13:57:18,019 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 13:57:18,020 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 13:57:18,282 INFO Request ID is f47cc7e5-0e6a-4cdb-a640-ea92fb67292d\n",
- "2025-03-05 13:57:18,394 INFO status has been updated to accepted\n",
- "2025-03-05 13:57:23,544 INFO status has been updated to running\n",
- "2025-03-05 14:03:38,474 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "e0c27d2722f347659d757d54c229f413",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "8ab922a2e1b685282e9e4b33aa5cf5f2.nc: 0%| | 0.00/23.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 14:03:45,816 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 14:03:45,817 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 14:03:46,162 INFO Request ID is b018a4c8-6a92-4986-be84-30af66e5737a\n",
- "2025-03-05 14:03:46,303 INFO status has been updated to accepted\n",
- "2025-03-05 14:03:55,006 INFO status has been updated to running\n",
- "Recovering from connection error [('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/b018a4c8-6a92-4986-be84-30af66e5737a?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 2 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 14:21:52,638 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a76dbe6c671f400a83e785e9d2bde4dc",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a47e7af5675feb4a154920e3d062d2cb.nc: 0%| | 0.00/20.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Recovering from connection error [HTTPSConnectionPool(host='object-store.os-api.cci2.ecmwf.int', port=443): Read timed out.], attemps 1 of 500\n",
- "Retrying in 120 seconds\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "fd005bfb4f604d37a4ca8ec8532430c1",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a47e7af5675feb4a154920e3d062d2cb.nc: 40%|###9 | 8.00M/20.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 14:46:58,948 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 14:46:58,950 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 14:46:59,283 INFO Request ID is 1fb44581-a851-4b47-a087-8356b5adf38f\n",
- "2025-03-05 14:46:59,414 INFO status has been updated to accepted\n",
- "2025-03-05 14:47:04,576 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 15:49:41,591 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "88e0b2278c8748eba001ba1e16bc08b2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "13855fba0c6c849e7ee62d023b882ac0.nc: 0%| | 0.00/23.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 15:49:47,548 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 15:49:47,549 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 15:49:47,861 INFO Request ID is 2b5ccf1a-ebb0-4578-b51d-6fca8be55173\n",
- "2025-03-05 15:49:47,970 INFO status has been updated to accepted\n",
- "2025-03-05 15:49:57,329 INFO status has been updated to running\n",
- "2025-03-05 15:56:08,797 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "fc7110d17a734a77b27aba929c13a6b9",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "c9d81889505ffcd992d8c10facb325a5.nc: 0%| | 0.00/22.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 15:56:16,252 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 15:56:16,253 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 15:56:16,582 INFO Request ID is db0ab97e-f3a2-43dd-b105-88f64e79465b\n",
- "2025-03-05 15:56:16,689 INFO status has been updated to accepted\n",
- "2025-03-05 15:56:38,851 INFO status has been updated to running\n",
- "2025-03-05 16:02:37,204 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "dcc01ce8069d411fb4621a35eb15e660",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "f80579f2d5a443b7a606a6e2577c41ae.nc: 0%| | 0.00/22.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:02:41,428 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:02:41,429 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:02:41,707 INFO Request ID is b805f8f7-dc50-4e0e-8fcc-8ec1e2a0095b\n",
- "2025-03-05 16:02:41,846 INFO status has been updated to accepted\n",
- "2025-03-05 16:02:47,025 INFO status has been updated to running\n",
- "2025-03-05 16:09:02,579 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ae4a32abe8044a97bebea4eeb23b7f53",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "8d809ed725c708c1010957c33a5d4f3.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:09:07,792 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:09:07,793 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:09:08,098 INFO Request ID is 08853daf-b5b7-4a85-90a4-c58bc452691f\n",
- "2025-03-05 16:09:08,222 INFO status has been updated to accepted\n",
- "2025-03-05 16:09:16,868 INFO status has been updated to running\n",
- "2025-03-05 16:15:28,587 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "8555eec07d4a40e7a48e90d118cb41ae",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "8515e5575b4b14ae277ddf48a2a2e33a.nc: 0%| | 0.00/21.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:15:34,073 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:15:34,074 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:15:34,416 INFO Request ID is eec4c50d-6659-43da-9da8-9e3698748a77\n",
- "2025-03-05 16:15:34,546 INFO status has been updated to accepted\n",
- "2025-03-05 16:15:48,485 INFO status has been updated to running\n",
- "2025-03-05 16:21:55,347 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d87fb11fb96948f28668f64d21072116",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "e2f4f58439cf6dcbe2ad9bdfae67fe11.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:22:06,604 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:22:06,605 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:22:07,014 INFO Request ID is 79592a28-024c-42fa-8086-6326002dce86\n",
- "2025-03-05 16:22:07,142 INFO status has been updated to accepted\n",
- "2025-03-05 16:22:15,945 INFO status has been updated to running\n",
- "2025-03-05 16:28:27,261 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "51c6f77f369c41659cbfca6cb2d39f11",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "454c17344ed7995f132f3603830024a3.nc: 0%| | 0.00/20.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:28:31,637 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:28:31,638 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:28:31,950 INFO Request ID is 7f7279b9-7a8c-46af-898a-71a4af709cbe\n",
- "2025-03-05 16:28:32,090 INFO status has been updated to accepted\n",
- "2025-03-05 16:28:37,273 INFO status has been updated to running\n",
- "2025-03-05 16:34:52,454 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "dbead0546c2e400aa8f43e5275557e1a",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "c417fa3c63e2157769c6856f78ad1883.nc: 0%| | 0.00/22.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2010 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:34:56,298 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:34:56,299 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:34:56,634 INFO Request ID is 45d7bab5-b775-46c4-9e3b-2f7c7554c09d\n",
- "2025-03-05 16:34:56,766 INFO status has been updated to accepted\n",
- "2025-03-05 16:35:05,454 INFO status has been updated to running\n",
- "Recovering from connection error [('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 16:41:57,289 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "89d53065cdc34ea7aa343324760f3072",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6f16645d90b7d91a978bb803c6350a51.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:42:09,147 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:42:09,150 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:42:09,468 INFO Request ID is b0c59bb2-de75-4f84-89be-e84d42bd8ff4\n",
- "2025-03-05 16:42:09,615 INFO status has been updated to accepted\n",
- "2025-03-05 16:42:14,976 INFO status has been updated to running\n",
- "2025-03-05 16:48:29,803 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d009f12791d94c1689acc765b479ade2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "b79d505e1c85439bd0c58dc48e48dbbb.nc: 0%| | 0.00/19.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:48:34,053 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:48:34,054 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:48:34,375 INFO Request ID is 9b1eeb69-72bd-47d2-ac24-36eee403fc4a\n",
- "2025-03-05 16:48:34,504 INFO status has been updated to accepted\n",
- "2025-03-05 16:48:39,694 INFO status has been updated to running\n",
- "2025-03-05 16:54:54,632 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f18c14e16426400fbe2189bb0ad6777e",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "17e87627f6c7655d6d770c35f75fe922.nc: 0%| | 0.00/22.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 16:54:58,538 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 16:54:58,539 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 16:54:58,889 INFO Request ID is 84e0ef88-038b-492f-8f03-3a0439b700c4\n",
- "2025-03-05 16:54:58,999 INFO status has been updated to accepted\n",
- "2025-03-05 16:55:07,675 INFO status has been updated to running\n",
- "2025-03-05 17:01:18,996 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0e0bd1eca4db40f2b0490c783998421c",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "79fa1f7d510260bd8434c2c04e9f4746.nc: 0%| | 0.00/20.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 17:01:23,362 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 17:01:23,363 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 17:01:23,666 INFO Request ID is 6b91eb56-7c31-4072-bea8-cbcf3a34a13b\n",
- "2025-03-05 17:01:23,795 INFO status has been updated to accepted\n",
- "2025-03-05 17:01:28,985 INFO status has been updated to running\n",
- "2025-03-05 17:07:43,708 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "a548f88c4f084160bf638bdf30ae5313",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6dd5483f81b93fcb4e2daf8777dae2f8.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 17:07:47,411 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 17:07:47,412 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 17:07:47,814 INFO Request ID is 44cc0c8e-e089-4d2d-b843-6a89828cf8d2\n",
- "2025-03-05 17:07:47,953 INFO status has been updated to accepted\n",
- "2025-03-05 17:07:56,623 INFO status has been updated to running\n",
- "2025-03-05 17:14:07,963 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ba39a6121caa495bbd343dd8325b2e88",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "f3734ee429da7bd1ae15e76250a8bbe0.nc: 0%| | 0.00/21.0M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 17:14:11,673 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 17:14:11,673 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 17:14:11,954 INFO Request ID is 1c12e772-ad36-4145-8a28-fb30eeefc14e\n",
- "2025-03-05 17:14:12,087 INFO status has been updated to accepted\n",
- "2025-03-05 17:14:20,721 INFO status has been updated to running\n",
- "2025-03-05 17:14:25,895 INFO status has been updated to accepted\n",
- "2025-03-05 17:14:33,625 INFO status has been updated to running\n",
- "2025-03-05 17:20:31,925 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0f8c769de69a4fa2bfaae7f0cf2823d8",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "b4d3d4a02692f503a63ab6104301c5fa.nc: 0%| | 0.00/23.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 17:20:53,139 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 17:20:53,139 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 17:20:53,421 INFO Request ID is 99f4fa1a-ef94-44ee-a620-d64d99ccd36f\n",
- "2025-03-05 17:20:53,555 INFO status has been updated to accepted\n",
- "2025-03-05 17:21:15,069 INFO status has been updated to running\n",
- "2025-03-05 17:27:13,338 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ceb7a1102d5d458d9597c1afac60ecff",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "6b7aa232ef4004867ff85ee97fc502f5.nc: 0%| | 0.00/22.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 17:27:16,930 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 17:27:16,931 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 17:27:17,531 INFO Request ID is 92d24c8a-4191-429f-a2ba-d79aa6712671\n",
- "2025-03-05 17:27:17,664 INFO status has been updated to accepted\n",
- "2025-03-05 17:27:22,829 INFO status has been updated to running\n",
- "2025-03-05 17:43:35,034 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "62febdfde78048f38523ca9212f60306",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "99030ec08189b31efe35c93867ef9804.nc: 0%| | 0.00/20.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 17:43:40,812 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 17:43:40,813 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 17:43:41,147 INFO Request ID is c393962a-a55e-4562-ae70-2aff093f54bc\n",
- "2025-03-05 17:43:41,260 INFO status has been updated to accepted\n",
- "2025-03-05 17:44:24,568 INFO status has been updated to running\n",
- "Recovering from connection error [('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 17:56:09,076 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "c74c5d189205420c80e51e235a6d250f",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "14ef1186b080f60a4d19fcd97cfd6226.nc: 0%| | 0.00/22.6M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 17:56:22,628 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 17:56:22,629 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 17:56:22,903 INFO Request ID is 80a09a39-0dd9-4a25-87f7-24eb9182c78f\n",
- "2025-03-05 17:56:23,042 INFO status has been updated to accepted\n",
- "2025-03-05 17:56:29,059 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 19:33:07,346 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "0e2bba4e5da24c94a93b9c427f6a9dd2",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a992390493b85e2d48b02b277452b5da.nc: 0%| | 0.00/20.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 19:33:11,289 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 19:33:11,290 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 19:33:11,708 INFO Request ID is 0b3dd28d-dd49-45df-8afb-f522c84116eb\n",
- "2025-03-05 19:33:11,881 INFO status has been updated to accepted\n",
- "2025-03-05 19:33:25,913 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 20:33:42,305 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "516fbbc73a984348adfcfc46e1cfbb9c",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a57cfe91f5e1f87154c7563f96c107db.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2011 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 20:33:48,953 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 20:33:48,954 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 20:33:49,340 INFO Request ID is 892da5fd-5e83-4a2a-87e8-bd308affe3e2\n",
- "2025-03-05 20:33:49,493 INFO status has been updated to accepted\n",
- "2025-03-05 20:33:58,262 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-05 22:41:32,077 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "440f645d70634d6dac1bd0848796a737",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "b14b22381ec5afc41e72644dc8d701dd.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-05 22:41:42,110 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-05 22:41:42,111 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-05 22:41:42,584 INFO Request ID is 9bc4eec6-2f59-4b0d-814c-7ebd80ef9fc3\n",
- "2025-03-05 22:41:42,748 INFO status has been updated to accepted\n",
- "2025-03-05 22:41:51,545 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-06 00:34:53,968 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "bc173741973d4aa39fd61c64ebef20d1",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "ca76059e2a566add0765ed41603b1fcc.nc: 0%| | 0.00/19.7M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 03 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 00:34:57,820 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 00:34:57,822 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 00:34:58,258 INFO Request ID is 2bf01197-9dfd-45fc-80ec-f336348521d8\n",
- "2025-03-06 00:34:58,463 INFO status has been updated to accepted\n",
- "2025-03-06 00:35:12,587 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-06 03:23:12,625 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "44ef6773414b44d4b31bdcb8afe77ff5",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "45f31eebc002b35a503bb442aa4fbbb5.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 04 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 03:23:22,870 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 03:23:22,871 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 03:23:23,218 INFO Request ID is abb30cb9-1913-4c47-8936-efc61cbacd05\n",
- "2025-03-06 03:23:23,385 INFO status has been updated to accepted\n",
- "2025-03-06 03:23:28,677 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-06 05:00:45,944 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "5b78ded120214d208c82142cb569ea8d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "fa9b2b7aab0eebb7ef0b613581d2aedc.nc: 0%| | 0.00/21.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 05 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 05:00:50,251 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 05:00:50,252 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 05:00:50,671 INFO Request ID is 44c24dd2-8c3c-4f45-afec-84b626b77e44\n",
- "2025-03-06 05:00:50,822 INFO status has been updated to accepted\n",
- "2025-03-06 05:00:59,609 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-06 06:26:06,792 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "b31301665fd4439ca2ad11f1a15e2fe6",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "4af4a4d4842e6ea5d2baf841bca95c84.nc: 0%| | 0.00/23.0M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 06 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 06:26:10,302 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 06:26:10,303 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 06:26:10,656 INFO Request ID is a125828b-eda3-4068-83f2-1eed3ce5e1a0\n",
- "2025-03-06 06:26:10,827 INFO status has been updated to accepted\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-06 08:01:49,777 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "3598c8fba90d4f2d92cc4706f21edb07",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "d19ac6bccb5025b79ca4c85c08e9f044.nc: 0%| | 0.00/20.1M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 07 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 08:01:53,274 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 08:01:53,275 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 08:01:53,638 INFO Request ID is 5424c6d9-dd21-4a28-a1b1-fef9c28afac0\n",
- "2025-03-06 08:01:53,796 INFO status has been updated to accepted\n",
- "2025-03-06 08:02:02,603 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Max retries exceeded with url: /api/retrieve/v1/jobs/5424c6d9-dd21-4a28-a1b1-fef9c28afac0?log=True&request=True (Caused by NameResolutionError(\": Failed to resolve 'cds.climate.copernicus.eu' ([Errno 8] nodename nor servname provided, or not known)\"))], attemps 2 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-06 10:10:27,455 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "ea9da59b2aa046b79e659bf361a87c96",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "1a4f913cba0a5f56439a442d3fc437f7.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 08 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 10:11:06,185 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 10:11:06,186 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 10:11:06,713 INFO Request ID is 654ab4e7-d72c-490e-b758-dcfaec456c64\n",
- "2025-03-06 10:11:06,854 INFO status has been updated to accepted\n",
- "2025-03-06 10:11:15,738 INFO status has been updated to running\n",
- "Recovering from connection error [HTTPSConnectionPool(host='cds.climate.copernicus.eu', port=443): Read timed out. (read timeout=60)], attemps 1 of 500\n",
- "Retrying in 120 seconds\n",
- "2025-03-06 10:33:19,728 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "f9c90aefb5aa4e26b3a85789b1b7534f",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "593eed1e2f25b17aebd76573a7d633af.nc: 0%| | 0.00/23.4M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 09 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 10:33:23,795 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 10:33:23,795 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 10:33:24,109 INFO Request ID is 4d3ae6eb-7df7-4d8b-b2c5-e9186b5f3d94\n",
- "2025-03-06 10:33:24,238 INFO status has been updated to accepted\n",
- "2025-03-06 10:33:45,855 INFO status has been updated to running\n",
- "2025-03-06 10:39:44,564 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "4d7b005b6c504001916fcb07e8202c63",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "bac1c442f6c1d6acc8462fbb619209fc.nc: 0%| | 0.00/21.2M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 10 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 10:39:49,533 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 10:39:49,534 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 10:39:49,833 INFO Request ID is e10135dd-3323-4f07-88e0-4d5b85a600eb\n",
- "2025-03-06 10:39:49,945 INFO status has been updated to accepted\n",
- "2025-03-06 10:40:25,364 INFO status has been updated to running\n",
- "2025-03-06 10:44:12,177 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "2037de160e8a4ab49ccce1c2566e9e2d",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "a08d6791e29bf9ca54e72673eff8832e.nc: 0%| | 0.00/23.5M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 11 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 10:44:29,941 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 10:44:29,941 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 10:44:30,416 INFO Request ID is 3c82d50e-08af-463c-88d6-24fbf4381eae\n",
- "2025-03-06 10:44:30,628 INFO status has been updated to accepted\n",
- "2025-03-06 10:44:53,721 INFO status has been updated to running\n",
- "2025-03-06 10:50:54,038 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "bd17a9a226784c87b2ed251cdd29ce51",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "c0c85103951cd02a36abf4cddb9df38a.nc: 0%| | 0.00/20.9M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 12 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 10:51:01,012 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 10:51:01,013 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 10:51:01,330 INFO Request ID is 440220ff-e711-426f-8e40-2f392bce5cbb\n",
- "2025-03-06 10:51:01,461 INFO status has been updated to accepted\n",
- "2025-03-06 10:51:16,013 INFO status has been updated to running\n",
- "2025-03-06 10:57:22,301 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d9b019aff1dc496398c10c8b3c97273c",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "30c65ee5e68ffea1795a8156cd51650c.nc: 0%| | 0.00/23.3M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing year 2012 \n",
- "\n",
- "Now processing month 01 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 10:57:28,703 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 10:57:28,704 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 10:57:29,446 INFO Request ID is f1646491-2f20-4da2-abf2-731dc1d9f843\n",
- "2025-03-06 10:57:29,585 INFO status has been updated to accepted\n",
- "2025-03-06 11:03:51,419 INFO status has been updated to running\n",
- "2025-03-06 11:15:54,705 INFO status has been updated to successful\n"
- ]
- },
- {
- "data": {
- "application/vnd.jupyter.widget-view+json": {
- "model_id": "d3ae9541ef874543b5a89319c19c23c4",
- "version_major": 2,
- "version_minor": 0
- },
- "text/plain": [
- "357563ffc71c1b2eb9fc66bdfb45d7f1.nc: 0%| | 0.00/22.8M [00:00, ?B/s]"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Now processing month 02 \n",
- "\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-03-06 11:15:58,899 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-03-06 11:15:58,900 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-03-06 11:15:59,253 INFO Request ID is 754d82e7-8b3e-44ac-b487-59af4669ed00\n",
- "2025-03-06 11:15:59,369 INFO status has been updated to accepted\n"
- ]
- }
- ],
- "source": [
- "for year_str in query_years_str:\n",
- " # Track progress\n",
- " print(\"Now processing year \", year_str, \"\\n\")\n",
- "\n",
- " # For each year, the query is divided into each month sections. \n",
- " # If a request is too large, it will not be accepted by the CDS servers, \n",
- " # so this division of requests is required.\n",
- "\n",
- " for month_str in query_months_str:\n",
- " # Track progress\n",
- " print(\"Now processing month \", month_str, \"\\n\")\n",
- "\n",
- " # The below is the formatted API request language. All of the inputs\n",
- " # specified below in proper formatting can be identified by forming a \n",
- " # request using the Copernicus CDS point-and-click interface for data\n",
- " # requests. https://cds.climate.copernicus.eu/cdsapp#!/dataset/reanalysis-era5-land?tab=form\n",
- " # Select the variables, timing, and netcdf as the output format, and then \n",
- " # select \"Show API Request\" at the bottom of the screen. \n",
- " \n",
- " # Note that the argument in the download() function is the file path and \n",
- " # file name that data will be exported to and stored at. If using a loop, \n",
- " # ensure that the unique features of each request are noted in the output.\n",
- "\n",
- " # Note: need to create \"ERA5_Out\" subfolder on your path\n",
- " \n",
- " dataset = \"reanalysis-era5-land\"\n",
- " request = {\n",
- " \"product_type\": \"reanalysis\",\n",
- " \"variable\": [\"2m_dewpoint_temperature\",\n",
- " \"2m_temperature\",\n",
- " \"skin_temperature\"], \n",
- " \"year\": year_str,\n",
- " \"month\": month_str,\n",
- " \"day\": [ \n",
- " \"01\", \"02\", \"03\",\n",
- " \"04\", \"05\", \"06\",\n",
- " \"07\", \"08\", \"09\",\n",
- " \"10\", \"11\", \"12\",\n",
- " \"13\", \"14\", \"15\",\n",
- " \"16\", \"17\", \"18\",\n",
- " \"19\", \"20\", \"21\",\n",
- " \"22\", \"23\", \"24\",\n",
- " \"25\", \"26\", \"27\",\n",
- " \"28\", \"29\", \"30\",\n",
- " \"31\"],\n",
- " \"time\": [\n",
- " \"00:00\", \"01:00\", \"02:00\",\n",
- " \"03:00\", \"04:00\", \"05:00\",\n",
- " \"06:00\", \"07:00\", \"08:00\",\n",
- " \"09:00\", \"10:00\", \"11:00\",\n",
- " \"12:00\", \"13:00\", \"14:00\",\n",
- " \"15:00\", \"16:00\", \"17:00\",\n",
- " \"18:00\", \"19:00\", \"20:00\",\n",
- " \"21:00\", \"22:00\", \"23:00\"],\n",
- " \"data_format\": \"netcdf\",\n",
- " \"download_format\": \"unarchived\",\n",
- " \"area\": query_area\n",
- " }\n",
- "\n",
- " client = cdsapi.Client()\n",
- " client.retrieve(dataset, request).download(os.path.join(output_dir, \n",
- " \"{}_{}.nc\".format(year_str, month_str)))\n"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "From the logs, it looks like one month of data takes approximately 10 minutes. In this query, we might end up with 48 hours of downloading for the full 24 years. Clearly this will need to be multithreaded/paralleled to be efficient."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Testing Soil Moisture Downloads"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-05-13 12:55:08,967 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-05-13 12:55:08,968 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-05-13 12:55:09,296 INFO Request ID is 7cc51283-7f15-4176-9cca-5b596a7a2280\n",
- "2025-05-13 12:55:09,840 INFO status has been updated to accepted\n",
- "2025-05-13 12:55:43,013 INFO status has been updated to running\n",
- "2025-05-13 12:56:00,367 INFO status has been updated to successful\n",
- " \r"
- ]
- },
- {
- "data": {
- "text/plain": [
- "'aafb095eaccbe4c07bd91711fa10f7b7.nc'"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "import cdsapi\n",
- "\n",
- "dataset = \"reanalysis-era5-land\"\n",
- "request = {\n",
- " \"variable\": [\"volumetric_soil_water_layer_1\"],\n",
- " \"year\": \"2009\",\n",
- " \"month\": \"01\",\n",
- " \"day\": [\"01\"],\n",
- " \"time\": [\"01:00\"],\n",
- " \"data_format\": \"netcdf\",\n",
- " \"download_format\": \"unarchived\"\n",
- "}\n",
- "\n",
- "client = cdsapi.Client()\n",
- "client.retrieve(dataset, request).download()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {},
- "outputs": [],
- "source": [
- "from pyprojroot.here import here\n",
- "\n",
- "ecmw_dir = here(\"notes/prototypes/\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "PosixPath('/net/rcstorenfs02/ifs/rc_labs/dominici_lab/lab/data_processing/csph-era5_sandbox/notes/prototypes/soil.nc')"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "ecmw_dir / \"soil.nc\""
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 10,
- "metadata": {},
- "outputs": [],
- "source": [
- "import xarray\n",
- "import os\n",
- "\n",
- "temp_file = xarray.open_dataset(os.path.join(ecmw_dir / \"soil.nc\"), decode_coords=\"all\")"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 11,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
European Centre for Medium-Range Weather Forecasts
GRIB_subCentre :
0
Conventions :
CF-1.7
institution :
European Centre for Medium-Range Weather Forecasts
history :
2025-03-27T17:15 GRIB to CDM+CF via cfgrib-0.9.15.0/ecCodes-2.39.0 with {"source": "tmpznyjyhvw/data.grib", "filter_by_keys": {"stream": ["oper"], "stepType": ["instant"]}, "encode_cf": ["parameter", "time", "geography", "vertical"]}
"
- ],
- "text/plain": [
- " Size: 12MB\n",
- "Dimensions: (valid_time: 744, latitude: 59, longitude: 33)\n",
- "Coordinates:\n",
- " number int64 8B ...\n",
- " * valid_time (valid_time) datetime64[ns] 6kB 2010-01-01 ... 2010-01-31T23:...\n",
- " * latitude (latitude) float64 472B -11.6 -11.85 -12.1 ... -25.85 -26.1\n",
- " * longitude (longitude) float64 264B 42.7 42.95 43.2 ... 50.2 50.45 50.7\n",
- " expver (valid_time) "
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# Select a specific grid point (e.g., latitude=-1, longitude=0)\n",
- "variable='mean'\n",
- "\n",
- "# note: we can use the isel method to select the grid point. In this case,\n",
- "# we are selecting the bottom-left grid point (latitude=-1, longitude=0) because we're selecting\n",
- "# the smallest value for latitude:\n",
- "# time=0: Selects the first time point.\n",
- "# latitude=-1: Selects the last latitude (bottom-most, as latitude is usually ordered from north to south).\n",
- "# longitude=0: Selects the first longitude (left-most).\n",
- "t2m_mean_point = daily_aggregated[\"t2m_\" + variable].isel(latitude=-1, longitude=0)\n",
- "\n",
- "# Plot the time series\n",
- "plt.figure(figsize=(10, 6))\n",
- "t2m_mean_point.plot(label=\"Daily Mean t2m\")\n",
- "plt.title(\"Daily Aggregated ({}) Temperature at Bottom-Left Grid Point\".format(variable))\n",
- "plt.xlabel(\"Time\")\n",
- "plt.ylabel(\"Temperature (K)\")\n",
- "plt.legend()\n",
- "plt.grid()\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "How does this compared to the disaggregated data?"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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+9/dju3YsWPx3Xff4ejRo27nWThkZGQAANRqtdvj69atw4QJE5CWlgaDwYBRo0bhu+++E59/77338Ic//AEAMG7cOHEM7733XtDx1dXV4c4770SXLl2g0WjQs2dPPProo16p0ewYL1q0CP369YNer8ewYcOwceNG8DyPF154AT169EBqairGjx+PgwcPhnUM/BHsOnnqqafEBY+HH34YHMehtLQ05O+nvLwcCxcuxEUXXeQlvhgGgwG33HKL22OBzkFfKYgbN27EueeeC51Oh+LiYsydO9ftvAoHJvTY75zc79YzBZFd2//5z3/w6KOPori4GOnp6Zg4cSL2798vbhfNc58g5EARMIJIIKZOnQqlUukmYMrKytCvXz9cffXVyM7ORnl5Od58802cffbZ2LNnj7hqKIf77rsPCxcuxMcff4zZs2eLj+/ZswcrV66UPZnzxyWXXIIFCxZgzZo1GD16tM9tPvnkE9x5552455578OKLL0KhUODgwYPYs2ePuE1dXR0A4Mknn0RhYSGam5vx5ZdfYuzYsfjpp59EQdfS0oJx48ahrq4Ozz//PHr37o1ly5bhqquu8nrft99+G7fddhuuuOIK/OMf/0BjYyPmzZvns24NAF577TX07dsXL774ItLT09GnTx+sXLkSF154IYYPH4633noLGRkZ+OSTT3DVVVehtbVV/OHfuXMnJk2ahL59++L999+HwWDAW2+9hQ8//NDrfQ4cOICpU6fi/vvvR0pKCvbt24fnn38emzZtElM9H3/8cbS0tOC///0vNmzYIL62qKgIAHDbbbfhvffew7333ovnn38edXV1ePrppzFq1Cjs2LFDjKbOmzcP8+bNw6xZszBjxgwcP34ct9xyC+x2O/r16xfoqw2K3GPDmD17Ni6//HJ88skn2LZtGx555BHYbDbs378fl19+OW699Vb8+OOPeP7551FcXIw5c+a4vf71119HSUkJXnnlFTgcDvz973/HlClTsHr1aowcORKAcF6PGjVKXNwoLCzE999/j3vvvRc1NTV48skn3fY5d+5cjBw5Em+99RYUCgXy8/NRXV0NIPC5WFRUhGXLluHCCy/ErFmzxGuLibJQ+eqrr7B27Vo88cQTKCwsRH5+fsifxZNDhw7h2muvRY8ePaDRaLBjxw787W9/w759+7Bw4UIAQrrwrbfeikOHDuHL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BEEQRAfi448/RnZ2tvj3U089hTPPPLP9BkSEBAkwgiAIgiAIgogxM2fOBMdx4DgOarUaBQUFmDRpEhYuXAiHwxHSvi677DLs27cvquMrLS0Fx3H45JNPvJ477bTTwHEc3nvvvai+ZziMHTsW999/v9tju3btwrXXXotu3bpBr9djwIABePXVV9tngDIgAUYQBEEQBEEQceDCCy9EeXk5ysrKsHTpUowbNw733XcfLr74YthsNtn70ev1yM/Pj/r4unXrhkWLFrk9tnHjRlRUVCAlJSXq7xctduzYgby8PHz44YfYvXs3Hn30UcydOxevv/56ew/NJyTACIIgCIIgiA4Lz/Notdja5T+e50Maq1arRWFhIbp06YKhQ4fikUceweLFi7F06VK36NLLL7+MwYMHIyUlBd26dcOdd96J5uZm8XnPFEQpa9asgVqtRkVFhdvjDz74IEaPHh1wfNdddx1Wr16N48ePi48tXLgQ1113HVQq9+5VjY2NuPXWW5Gfn4/09HSMHz8eO3bsEJ8/dOgQLr30UhQUFCA1NRVnn302fvzxR7d9lJaW4tlnn8XNN9+MtLQ0dO/eHW+//bbf8c2cOROrV6/Gq6++KkYTy8rKcP311+PVV1/FmDFj0LNnT1x//fX44x//iC+++EJ87XvvvYfMzEx8++236NevHwwGA2bMmIGWlha8//77KC0tRVZWFu655x7Y7faAxylSqA8YQRAEQRAE0WFps9ox8Inv2+W99zx9AQyayKbT48ePxxlnnIEvvvgCs2fPBiDYnb/22msoLS3FkSNHcOedd+LPf/4zFixYEHR/o0ePRs+ePfHvf/8bf/rTnwAANpsNH374IZ577rmAry0oKMAFF1yA999/H4899hhaW1vx6aefYvXq1fjggw/E7Xiex0UXXYTs7GwsWbIEGRkZ+Ne//oUJEybg999/R3Z2NpqbmzF16lQ888wz0Ol0eP/99zFt2jTs378f3bt3F/f10ksv4a9//SseeeQR/Pe//8Udd9yB0aNHo3///l7je/XVV/H7779j0KBBePrppwEAOTk5aGlp8dq2sbHRS6S2trbitddewyeffIKmpiZcfvnluPzyy5GZmYklS5bg8OHDuOKKK3DeeefhqquuCnqsw4UiYARBEARBEATRjvTv3x9lZWXi3/fffz/GjRuHHj16YPz48fjrX/+K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nZ0B5zF33nkn5s6di7KyMtTX12Pp0qXYuXNnwDVPP/00zj33XNTW1kKSJGzdujU7g81z4plrfj+mhnjmeqR/P4Z7L0mShN27d2d7aMOGARghYVi9ejVuvPFG/OhHP8KWLVtwxhln4LzzzkNLS4t2zeLFi9Ha2qr9W7NmTRZHnL9Em2tZlrF06VJ8+umneO6557BlyxY0Nzdj4cKFGBwczPbQ847BwUHMmDED99xzT9j7p0yZgnvuuQfbtm3D66+/jvHjx2PRokU4cuRIhkea/8Saa/3a0draiocffhiSJOHzn/98hkea/6xfvx7Lly/Hpk2bsHbtWng8HixatChgjRgcHMRpp52GX/ziF1kcaf4Tz1wD/H5MBbHmulC+H4PfS62trZgwYUK2hzV8ZJLzXHnllfJFF10ky7Isv/TSS/Jpp50mV1RUyNXV1fL5558v7969W7t27969MgD5qaeekhcsWCAXFxfLJ554ovzGG29kafT5ycknnyxfd911Abcdd9xx8g9+8ANZlgP/JmR4RJvrnTt3ygDkDz/8ULvP4/HI1dXV8u9///tMD3VEAUB+5plnol7T29srA5BfffXVzAxqhBLPXF900UXyWWedlZkBjXA6OjpkAPL69etD7hPfkVu2bMn8wEYg4eaa34/pIXiuC+H7Mdp76fnnn5dnzZolW61WecKECfKtt94qu91u7X4A8n333ScvXrxYLioqksePHy//7W9/y9DIY0MFLM8YHBzEqlWr8M477+Bf//oXDAYDLr74Yvh8voDrfvSjH+G73/0utm7diilTpuDyyy+Hx+PJ0qjzC5fLhc2bN2PRokUBty9atAhvvPGG9vO6detQX1+PKVOm4Nprr0VHR0emh5r3xJprp9MJACgqKtLuMxqNsFgseP311zM61kLD5XLhwQcfREVFBWbMmJHt4Yxo2tvb8eKLL+Lqq6/O9lBGBL29vQCA6urqLI9k5BNprvn9mHqC57qQvx//+c9/4itf+QpWrlyJjz/+GA888AAeffRR3H777QHX3XLLLfj85z+P999/H1/5yldw+eWXY/v27VkadRDZjgBJbKKdAIgTkW3btsmy7D/de+ihh7RrPvroIxmAvH379kwMN+85dOiQDED+z3/+E3D77bffLk+ZMkWWZVn+61//Kr/wwgvytm3b5Oeff16eMWOGPHXqVNnhcGRj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",
- "text/plain": [
- "
"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "t2m_point = ds[\"t2m\"].isel(latitude=-1, longitude=0)\n",
- "\n",
- "# Plot the time series\n",
- "plt.figure(figsize=(10, 6))\n",
- "t2m_point.plot(label=\"Daily Mean t2m\")\n",
- "plt.title(\"Daily Disaggregated Temperature at Bottom-Left Grid Point\")\n",
- "plt.xlabel(\"Time\")\n",
- "plt.ylabel(\"Temperature (K)\")\n",
- "plt.legend()\n",
- "plt.grid()\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "These temperature plots match beautifully! This means our aggregation over the 31 days works!\n",
- "\n",
- "Let's look at the aggregation over a map:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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H0/ZV3cZn3zyiTuKW2W++OILfvvtN0aPHk1sbGylZRNC1Nqy55FHHuH+++8nOzubiIgIbrzxxlrlVxUGDRqERqPh8OHDFaZ7yiNJEkKICs9j1qxZFSzaPMnQoUOZOnUqISEhJCQkeFxebm4uixYtspvm++6771CpVLYPlqq+086ozjul1+sdfr2XWYvu2LHDzqpt0aJFVS5HbevSokULvv/+e7Kzs6u8b7CwsJC7774bk8nEU089ZTsvSVKF923Hjh38/fffxMTEVMjn0UcfZeDAgYwbNw61Ws0999xT7fJXhSNHjhASEuJwdK3gftyioABee+01l2luueUW5syZw5AhQ3j00Ue58sor0Wq1nDhxgtWrVzNixAiuu+46unfvTlBQEPfffz+TJ09Gq9UyZ84c/vvvP3cV147CwkI2btxo+/vIkSMsWLCAJUuW0KtXL2bOnGlLO2DAAHQ6HbfeeitPPfUURUVFzJgxg/Pnz9eqDLfffjvPPPMM69at43//+1+l0yzuJD4+nilTpvDcc89x5MgRrrnmGoKCgsjIyODff//Fx8eHl156CX9/f66++mrefPNNQkNDiY+PZ+3atXz++ecEBgZ6vJxlPPbYY8ybN4+rr76axx9/nLZt22KxWEhJSeH333/niSeeqLGScERISAgPPPAAKSkpJCUlsXTpUj777DMeeOAB2wdLVd9pZ1TnnWrTpg2//PILM2bM4IorrkClUtGpUyciIyPp378/06ZNIygoiLi4OFauXMkvv/xS5frWti69e/dGCME///zDwIEDK1xPSUlh48aNWCwWsrOzbRt1jx8/zttvv213z9ChQ3n55ZeZPHkyvXr1Yv/+/UyZMoWEhARMJpPDNkxOTmb16tXcfvvthIeHV6nOx48fZ9OmTQAcPnwYsM4ogPX30alTJ7v0GzdupFevXjVaZ1OoATWxrChvxecMRxt1jUajeOutt0S7du2EwWAQvr6+okWLFuK+++4TBw8etKXbsGGD6Natm/D29hZhYWHi7rvvFlu3bnVokeTj41NB9uTJk11a5AhxwVqr7PDx8RGJiYnihhtuED/99JOddVwZixcvtpW/cePGYtKkSTZrv/JWVFWx4ivP+PHjhUajESdOnHBZbiEqt44qs+j66aef7M5X9twWLFgg+vTpI/z9/YVerxdxcXHihhtuEH/88YctzYkT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",
- "text/plain": [
- "
"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# Select the first day of t2m_mean\n",
- "variable=\"mean\"\n",
- "t2m_mean_day1 = daily_aggregated[\"t2m_\" + variable].isel(valid_time=0)\n",
- "\n",
- "# Set the absolute min and max for the color bar\n",
- "vmin = 270 # Minimum value (e.g., 270 K)\n",
- "vmax = 310 # Maximum value (e.g., 310 K)\n",
- "\n",
- "# Create a plot with Cartopy\n",
- "plt.figure(figsize=(10, 6))\n",
- "ax = plt.axes(projection=ccrs.PlateCarree()) # Use PlateCarree projection for latitude/longitude data\n",
- "\n",
- "# Plot the data\n",
- "t2m_mean_day1.plot(ax=ax, cmap=\"coolwarm\", transform=ccrs.PlateCarree(), vmin=vmin, vmax=vmax, cbar_kwargs={\"label\": \"Temperature (K)\"})\n",
- "\n",
- "# Add Madagascar's border using Cartopy's built-in features\n",
- "ax.add_feature(cfeature.BORDERS, edgecolor=\"black\", linewidth=1) # Add country borders\n",
- "ax.add_feature(cfeature.COASTLINE, edgecolor=\"black\", linewidth=0.8) # Add coastlines\n",
- "\n",
- "# Optionally, zoom in on Madagascar\n",
- "ax.set_extent([43, 51, -26, -11], crs=ccrs.PlateCarree()) # Longitude and latitude bounds for Madagascar\n",
- "\n",
- "# Add gridlines\n",
- "ax.gridlines(draw_labels=True, linewidth=0.5, color=\"gray\", alpha=0.5, linestyle=\"--\")\n",
- "\n",
- "# Add a title\n",
- "plt.title(\"Mean Daily {} Temperature (Day 1)\".format(variable))\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Looks great. Now, we need to see if we can do a spatial aggregation:\n",
- "\n",
- ">A mathematical aggregation like mean() involves summarizing data values (e.g., averaging) across a specific dimension, such as time, without considering spatial relationships. For example, calculating the daily mean temperature from hourly data is purely numerical. \n",
- "In contrast, a spatial aggregation using rasters and polygons involves summarizing data based on spatial boundaries. For example, when aggregating raster data (e.g., temperature) over a polygon (e.g., a country's boundary), the process involves selecting raster cells that fall within the polygon and computing a summary statistic (e.g., mean, sum) for those spatially defined areas. This type of aggregation accounts for geographic context and spatial relationships."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "To do this, we'll need to read in the shapefile that defines the shape of the polygon (ie the physical ground) and find the pixels of data that fall within the polygon. We can then use the `xarray` library to group the data by time using a resampler method. We can then use the `mean` function to calculate the average value for each day."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import geopandas as gpd\n",
- "\n",
- "# we learned how to read in shapefiles in the kenya demo notebook\n",
- "zip_url_or_path = here() / \"data/testing/gadm41_MDG.gpkg\"\n",
- "\n",
- "shape = gpd.read_file(zip_url_or_path, layer = \"ADM_ADM_1\")\n"
- ]
- },
- {
- "attachments": {
- "image.png": {
- "image/png": "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BBBAAAEEEEAAAQQQQAABBBAgoOM1gAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggEAjChDQNSI2l0IAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEECAgI7XAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAKNKEBA14jYXAoBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABAjpeAwgggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgg0ogABXSNicykEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEECOh4DSCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCDQiAIEdI2IzaUQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQIKDjNYAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAIwoQ0DUiNpdCAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAgICO1wACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACjShAQNeI2FwKAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQI6XgMIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIINKIAAV0jYnMpBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBAjoeA0ggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0IgCBHSNiM2lEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEENhtA7qSkhKFhYUpIiKCZxEBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQACB3UZgtwjoKisr9d1332nx4sVasmSJli5dqtzcXAc5ISFBnTp10j777KPDDz9cgwYN2m3wG+JG/X6/cnJy1KpVq4Y4HedAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDYyQJNPqCzodyoUaO0fPnyelH06NFDr7/++h5fWbdgwQI9+uijWrlypUpLSzV16tQ9/jHX6wXATggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAExdosgGdrZobO3asXn31VXm93nozdu3aVe+//369999dd7QVhbfcckvw9gnoghTMIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAJNWqDJBnTPPPOMUwkXqtetWzcdc8wx6t27t3r27OmMQbd27VrNmTNH33zzjVNld9VVV+nyyy8PPWyPnCeg2yOfVh4UAggggAACCCCAAAIIIIAAAggggAACCCCAAAIINAOBJhnQ2THmLrzwwmqVc2eeeaZuvPHGbbZxtEGdHY+udevWe/xTR0C3xz/FPEAEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDYQwWaXEDn8/l0ySWXaOHChUHykSNH6tRTTw0u78hMXl6eFi1apPXr16tLly5ONV5cXFydp7T3FZhcLpfs19am0H3dbvfWdlNJSYmys7OVn5/vfBUWFjoBpB1Hr2PHjtu8Rs2AbvLkybWGl1u714qKCufa9vobN25UWVmZEhISnICzffv2zrVDH8fWzhN4cH6/X/YrMG3rcQf24ScCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggg0BwFmlxAN378eD344IPB56J///7OOHTBFX9yZuLEiRozZozS09OrncEGT507d9bNN9+sgw46qNq20IVzzz1Xy5Ytc1bZAPHaa68N3RycnzJliq6//npn2Z77559/Dm6zMwUFBXr44YedkNC25wwNtUJ3jI+P1ymnnKJrrrnGaeUZus3O1wzoam4PLNtr2bagdrIh3Ntvv63p06dr/vz5qqqqCuxW7afd/6677nKOC+xz0UUX6brrrqu2X+jCv/71L+fcdl1MTIx++OGHbQaMoccyjwACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgg0J4EmF9BdffXVmjlzZvA5eOmllzRo0KDg8vbOFBcXO4HY559/vs1DbZhmQzgbvEVERGyxb30Dui+++MIJt+wJagvobOXeySefvMX5t7bCBpSPP/74Fm07/0xAV99rX3bZZbLPgw3lApWMvXr1CgZwtd3r+eefryVLljibjjjiCD3xxBO17cY6BBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQKDZCzSpgK68vFxHHXWUbPtFO3Xr1k3vvffeDj1Jt912m7799tvgOTwej2wLyQ4dOmjlypVatWqVQls5XnDBBbrhhhuC+wdmdlZA17JlS6eCLykpyRlzb82aNVvc02mnnaY777wzcCvOz5oBnX08NhCsOd1yyy06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mjVrdPrppwcr+9q1a6dHHnlENjwMnRoroLPjvw0ZMkT2p53s4x4zZoxatmwZvB0bTrrdbnXr1s1Zt6MB3S+//KIrrrgieP7ATKtWrfT5559XqzgMbOMnAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBAdYEmGdDZW/zqq69kxz0LBFCB23a5XGrfvr0TOhUVFSk9PV2ZmZnB4KxTp07O+GiB/W+//XanFWNg2QZWNsyy46jZto2rV68OVs7ZfWwl3fXXXx/YvdrPkSNH6ssvvwyus+ey7S67dOnirLPBoj1fQUGBs2zv1Y6FFzptT0h2xx136Ouvv3YOP/LII/X444+HnkoPPvhgtccaHx+vvn37qqqqSrbCLisrS6eeeqrsfdtpe65d7UIhC3Y8wPnz54eskS666CJdd9111daxgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggULtAkw3o7O3asOvee+/VggULar/7rawdP368bFBnp5KSEmdstIkTJ25l702rbZh2/vnn65prrlF4eHit+9rAy45Vt3Dhwlq311y5swM662PH67NB5damrl276v3333c2N0RAZ8fpswah03vvvRes0gtdzzwCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggMCWAk06oLO36/P59Prrr8sGbDaQsu0sa5tsNVu/fv10/PHHO+0xIyIiqu1mK9/suHHr1q2rtt6GaDbEuvnmm532mdU21rJQWVmpZ599Vp999pny8/Nr2UNOq0cbEPbv31+jRo2qto8N+YYOHRpcN27cOA0YMCC4HDpjj50wYYKz6uijj3ZaaoZut/M2dLvnnntk20/WnGJiYnTUUUc5lYiBfU8++eTgbtu6dnCnGjN+v99p9ZmWluZssS0+7fPDhAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgggUD+BJh/QhT6MiooKrVq1SsuWLXPaSNrx4hISEmTHluvRo4diY2NDd6913rafXLx4sRPU2XHm+vTpIxtk/ZnJttZcunSpysrKnPuw4+TZLzsmW82A8M+cf3uOsZWCNsC0AaQ1sW1ArYvH49me09S5r22faccHtMGgney4gHaZCQEEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAoH4Cu1VAV7+HxF47U+CFF17Q2LFjnUvY8fc+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"
- }
- },
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "We are using the layer 1 of this shapefile from GADM.org. This refers to the states in red:\n",
- "\n",
- "\n",
- "\n",
- "When we read in the shapefile, the data in the `geometry` column is a specification of the polygons that represent geographic boundaries."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- "
\n",
- "
\n",
- "
GID_1
\n",
- "
GID_0
\n",
- "
COUNTRY
\n",
- "
NAME_1
\n",
- "
VARNAME_1
\n",
- "
NL_NAME_1
\n",
- "
TYPE_1
\n",
- "
ENGTYPE_1
\n",
- "
CC_1
\n",
- "
HASC_1
\n",
- "
ISO_1
\n",
- "
geometry
\n",
- "
\n",
- " \n",
- " \n",
- "
\n",
- "
0
\n",
- "
MDG.1_1
\n",
- "
MDG
\n",
- "
Madagascar
\n",
- "
Antananarivo
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
MG-T
\n",
- "
MULTIPOLYGON (((46.93914 -20.17013, 46.9386 -2...
\n",
- "
\n",
- "
\n",
- "
1
\n",
- "
MDG.2_1
\n",
- "
MDG
\n",
- "
Madagascar
\n",
- "
Antsiranana
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
MG-D
\n",
- "
MULTIPOLYGON (((50.15347 -16.0032, 50.15347 -1...
\n",
- "
\n",
- "
\n",
- "
2
\n",
- "
MDG.3_1
\n",
- "
MDG
\n",
- "
Madagascar
\n",
- "
Fianarantsoa
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
MG-F
\n",
- "
MULTIPOLYGON (((47.04934 -24.08504, 47.04925 -...
\n",
- "
\n",
- "
\n",
- "
3
\n",
- "
MDG.4_1
\n",
- "
MDG
\n",
- "
Madagascar
\n",
- "
Mahajanga
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
MG-M
\n",
- "
MULTIPOLYGON (((44.23931 -18.96421, 44.23931 -...
\n",
- "
\n",
- "
\n",
- "
4
\n",
- "
MDG.5_1
\n",
- "
MDG
\n",
- "
Madagascar
\n",
- "
Toamasina
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
MG-A
\n",
- "
MULTIPOLYGON (((47.67118 -20.36464, 47.6713 -2...
\n",
- "
\n",
- "
\n",
- "
5
\n",
- "
MDG.6_1
\n",
- "
MDG
\n",
- "
Madagascar
\n",
- "
Toliary
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
NA
\n",
- "
MULTIPOLYGON (((44.33236 -25.26931, 44.33236 -...
\n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " GID_1 GID_0 COUNTRY NAME_1 VARNAME_1 NL_NAME_1 TYPE_1 \\\n",
- "0 MDG.1_1 MDG Madagascar Antananarivo NA NA NA \n",
- "1 MDG.2_1 MDG Madagascar Antsiranana NA NA NA \n",
- "2 MDG.3_1 MDG Madagascar Fianarantsoa NA NA NA \n",
- "3 MDG.4_1 MDG Madagascar Mahajanga NA NA NA \n",
- "4 MDG.5_1 MDG Madagascar Toamasina NA NA NA \n",
- "5 MDG.6_1 MDG Madagascar Toliary NA NA NA \n",
- "\n",
- " ENGTYPE_1 CC_1 HASC_1 ISO_1 \\\n",
- "0 NA NA NA MG-T \n",
- "1 NA NA NA MG-D \n",
- "2 NA NA NA MG-F \n",
- "3 NA NA NA MG-M \n",
- "4 NA NA NA MG-A \n",
- "5 NA NA NA NA \n",
- "\n",
- " geometry \n",
- "0 MULTIPOLYGON (((46.93914 -20.17013, 46.9386 -2... \n",
- "1 MULTIPOLYGON (((50.15347 -16.0032, 50.15347 -1... \n",
- "2 MULTIPOLYGON (((47.04934 -24.08504, 47.04925 -... \n",
- "3 MULTIPOLYGON (((44.23931 -18.96421, 44.23931 -... \n",
- "4 MULTIPOLYGON (((47.67118 -20.36464, 47.6713 -2... \n",
- "5 MULTIPOLYGON (((44.33236 -25.26931, 44.33236 -... "
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "shape"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "In a vector image such as a shapefile, the steps between each value are not guaranteed to be equal (unlike on a cartesian plane), so we need to think about how those values \"project\" onto a known Coordinate Reference System (CRS) that has equal steps.\n",
- "\n",
- "A quick note about CRS:\n",
- "\n",
- "> The WGS 84 (World Geodetic System 1984) is a widely used global Coordinate Reference System (CRS). It is the standard CRS for GPS (Global Positioning System) and is commonly used in geospatial applications. WGS 84 defines a geographic coordinate system based on a specific ellipsoid model of the Earth. \n",
- "\n",
- "> Key Features of WGS 84 \n",
- "Type: Geographic Coordinate System (GCS). \n",
- "Coordinates are represented in latitude, longitude, and optionally altitude. \n",
- "Units: Degrees (for latitude and longitude). \n",
- "Ellipsoid: WGS 84 uses a reference ellipsoid with: \n",
- "Semi-major axis: 6,378,137 meters. \n",
- "Flattening: 1 / 298.257223563. \n",
- "Datum: The WGS 84 datum defines the origin and orientation of the coordinate system. \n",
- "EPSG Code: The EPSG code for WGS 84 is 4326. \n",
- "\n",
- "Spatial geometry is complicated and silly, hence [all maps are wrong](https://youtu.be/kIID5FDi2JQ?si=OZASX3i6Aglqwa4u).\n",
- "\n",
- "Nevertheless, we can see that the shapefile has a CRS of EPSG:4326, which is what we want:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "\n",
- "Name: WGS 84\n",
- "Axis Info [ellipsoidal]:\n",
- "- Lat[north]: Geodetic latitude (degree)\n",
- "- Lon[east]: Geodetic longitude (degree)\n",
- "Area of Use:\n",
- "- name: World.\n",
- "- bounds: (-180.0, -90.0, 180.0, 90.0)\n",
- "Datum: World Geodetic System 1984 ensemble\n",
- "- Ellipsoid: WGS 84\n",
- "- Prime Meridian: Greenwich"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "shape.crs"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Were this different, we'd have to find some way to adjust these projections. For our netCDF file, however, we don't need to worry about this because the data themselves are created using a rasterized netCDF file, which is a standard format for storing gridded data. The data is already in a grid format, and the pixel values are already aligned with the geographic coordinates of the raster. In spatial geometry, we use degrees to represent the latitude and longitude of the corners of each pixel. This means that the data is already in a format that can be easily manipulated and analyzed using xarray and geopandas, because we refer to where the pixel is located in the world using degrees. It is essentially an absolute reference system.\n",
- "\n",
- "In the ERA5 dataset, the resolution is said to be 0.25 degrees, which means that each pixel represents a square area of approximately 25 km x 25 km at the equator. So at every unit of 0.25 degrees north-south or east-west, we have a new pixel of data, with a value for temperature or dewpoint or whatever. You can physically see each of these on the plot.\n",
- "\n",
- "Learn more about ERA5's resolution [here](https://confluence.ecmwf.int/display/CKB/ERA5%3A+What+is+the+spatial+reference)."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now, in order to aggregate data spatially, we're pasting in a utility here for finding the intersecting values between our netcdf data and the polygons represented in our shapefile (ie the states, regions, etc.).\n",
- "\n",
- "Source: https://github.com/NSAPH-Data-Processing/air_pollution__aqdh/blob/main/utils/faster_zonal_stats.py"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import numpy as np\n",
- "from tqdm import tqdm\n",
- "from math import ceil, floor\n",
- "\n",
- "from rasterstats.io import Raster\n",
- "from rasterstats.utils import boxify_points, rasterize_geom"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This function indexes each pixel and maps it to the polygon it falls within. A few notes about this function:\n",
- "\n",
- "- It uses the `rasterstats.io` library to read in a raster tiff file\n",
- "- It uses affine transformations to convert the pixel coordinates to geographic coordinates\n",
- "- It needs to know where there is no data in the raster file, so we need to set a `nodata` value\n",
- "- `all_touched` is a boolean that determines whether to include all pixels that touch the polygon or just the ones that are fully contained within it; this is a domain specific choice"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "def polygon_to_raster_cells(\n",
- " vectors,\n",
- " raster,\n",
- " band=1,\n",
- " nodata=None,\n",
- " affine=None,\n",
- " all_touched=False,\n",
- " verbose=False,\n",
- " **kwargs,\n",
- "):\n",
- " \"\"\"Returns an index map for each vector geometry to indices in the raster source.\n",
- "\n",
- " Parameters\n",
- " ----------\n",
- " vectors: list of geometries\n",
- "\n",
- " raster: ndarray\n",
- "\n",
- " nodata: float\n",
- "\n",
- " affine: Affine instance\n",
- "\n",
- " all_touched: bool, optional\n",
- " Whether to include every raster cell touched by a geometry, or only\n",
- " those having a center point within the polygon.\n",
- " defaults to `False`\n",
- "\n",
- " Returns\n",
- " -------\n",
- " dict\n",
- " A dictionary mapping vector the ids of geometries to locations (indices) in the raster source.\n",
- " \"\"\"\n",
- "\n",
- " cell_map = []\n",
- "\n",
- " with Raster(raster, affine, nodata, band) as rast:\n",
- " # used later to crop raster and find start row and col\n",
- " min_lon, dlon = affine.c, affine.a\n",
- " max_lat, dlat = affine.f, -affine.e\n",
- " H, W = rast.shape\n",
- "\n",
- " for geom in tqdm(vectors, disable=(not verbose)):\n",
- " if \"Point\" in geom.geom_type:\n",
- " geom = boxify_points(geom, rast)\n",
- "\n",
- " # find geometry bounds to crop raster\n",
- " # the raster and geometry must be in the same lon/lat coordinate system\n",
- " start_row = max(0, min(H - 1, floor((max_lat - geom.bounds[3]) / dlat)))\n",
- " start_col = min(W - 1, max(0, floor((geom.bounds[0] - min_lon) / dlon)))\n",
- " end_col = max(0, min(W - 1, ceil((geom.bounds[2] - min_lon) / dlon)))\n",
- " end_row = min(H - 1, max(0, ceil((max_lat - geom.bounds[1]) / dlat)))\n",
- " geom_bounds = (\n",
- " min_lon + dlon * start_col, # left\n",
- " max_lat - dlat * end_row - 1e-12, # bottom\n",
- " min_lon + dlon * end_col + 1e-12, # right\n",
- " max_lat - dlat * start_row, # top\n",
- " )\n",
- "\n",
- " # crop raster to area of interest and rasterize\n",
- " fsrc = rast.read(bounds=geom_bounds)\n",
- " rv_array = rasterize_geom(geom, like=fsrc, all_touched=all_touched)\n",
- " indices = np.nonzero(rv_array)\n",
- "\n",
- " if len(indices[0]) > 0:\n",
- " indices = (indices[0] + start_row, indices[1] + start_col)\n",
- " assert 0 <= indices[0].min() < rast.shape[0]\n",
- " assert 0 <= indices[1].min() < rast.shape[1]\n",
- " else:\n",
- " pass # stop here for debug\n",
- "\n",
- " cell_map.append(indices)\n",
- "\n",
- " return cell_map"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "So to implement this we need to first convert the netcdf to a tiff so that we can rasterize it to each of the polygons in the shapefile. We do this with `rioxarray`"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import rioxarray as rxr"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "First, we pick our variable of interest, then we set the spatial properties to make sure it conforms to the CRS we wanted"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "temperature = daily_aggregated['t2m_mean']"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "temp_set = temperature.rio.set_spatial_dims(x_dim=\"longitude\", y_dim=\"latitude\")\n",
- "temp_set = temp_set.rio.write_crs(\"EPSG:4326\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Write it out to tiff and read it back in (there's no way to do this in memory)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "temp_set.rio.to_raster(\"temp.tif\")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now we can investigate the tiff and see that it has all the properties necessary for the function"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "import rasterio\n",
- "\n",
- "src = rasterio.open(\"temp.tif\")\n",
- "raster = src.read(1) # Numpy array\n",
- "profile = src.profile # Metadata\n",
- "transform = src.transform"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "31"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# the number of data points\n",
- "src.count\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "Affine(0.25, 0.0, 42.575,\n",
- " 0.0, -0.25000000000000006, -11.475)"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# the affine transformation matrix:\n",
- "# Pixel size (resolution in x and y).\n",
- "# Origin (top-left corner in spatial coordinates).\n",
- "# Rotation (if the raster is not north-up). \n",
- "src.transform"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# any missing data locations\n",
- "src.nodata"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "33 59\n"
- ]
- }
- ],
- "source": [
- "# the number of rows and columns\n",
- "print(src.width, src.height)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Fetch the array of data"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "raster_array = src.read(1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Function go brrrr"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- " 0%| | 0/6 [00:00, ?it/s]"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "/n/home03/ttapera/.conda/envs/era5_sandbox/lib/python3.11/site-packages/rasterstats/io.py:335: NodataWarning: Setting nodata to -999; specify nodata explicitly\n",
- " warnings.warn(\n",
- "100%|██████████| 6/6 [00:00<00:00, 37.66it/s]\n"
- ]
- }
- ],
- "source": [
- "res_poly2cell=polygon_to_raster_cells(\n",
- " vectors = shape.geometry.values, # the geometries of the shapefile of the regions\n",
- " raster=raster_array, # the raster data above\n",
- " band=1, # the value of the day that we're using\n",
- " nodata=src.nodata, # any intersections with no data, may have to be np.nan\n",
- " affine=src.transform, # some math thing need to revise\n",
- " all_touched=True, \n",
- " verbose=True\n",
- ")"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The data below maps which grid entries fall into each of the regions in the shapefile (e.g. which pixel is in which state)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[(array([24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26,\n",
- " 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28,\n",
- " 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29,\n",
- " 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31,\n",
- " 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33,\n",
- " 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34,\n",
- " 35, 35, 35, 35]),\n",
- " array([16, 13, 14, 15, 16, 17, 18, 19, 20, 21, 12, 13, 14, 15, 16, 17, 18,\n",
- " 19, 20, 21, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 11, 12, 13,\n",
- " 14, 15, 16, 17, 18, 19, 20, 21, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n",
- " 20, 21, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 12, 13, 14, 15,\n",
- " 16, 17, 18, 19, 20, 21, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 12,\n",
- " 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 14, 15, 16, 17, 18, 19, 20,\n",
- " 14, 15, 16, 17])),\n",
- " (array([ 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6,\n",
- " 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,\n",
- " 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10,\n",
- " 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,\n",
- " 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15,\n",
- " 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19]),\n",
- " array([26, 24, 25, 26, 27, 24, 25, 26, 27, 24, 25, 26, 27, 28, 23, 24, 25,\n",
- " 26, 27, 28, 29, 22, 23, 24, 25, 26, 27, 28, 29, 22, 23, 24, 25, 26,\n",
- " 27, 28, 29, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 21, 22, 23,\n",
- " 24, 25, 26, 27, 28, 29, 30, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,\n",
- " 24, 25, 26, 27, 28, 29, 30, 27, 28, 29, 30, 27, 28, 29, 30, 28, 29,\n",
- " 30, 31, 29, 30, 31, 29, 30, 31, 29, 30, 31, 30])),\n",
- " (array([33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35,\n",
- " 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36,\n",
- " 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38,\n",
- " 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39,\n",
- " 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,\n",
- " 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42,\n",
- " 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43,\n",
- " 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,\n",
- " 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46,\n",
- " 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 48, 48, 48,\n",
- " 48, 48, 48, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 51]),\n",
- " array([12, 13, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 12, 13, 14, 15, 16,\n",
- " 17, 18, 19, 20, 21, 22, 23, 24, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n",
- " 21, 22, 23, 24, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 12,\n",
- " 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 11, 12, 13, 14, 15, 16,\n",
- " 17, 18, 19, 20, 21, 22, 23, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,\n",
- " 21, 22, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 10, 11,\n",
- " 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 10, 11, 12, 13, 14, 15,\n",
- " 16, 17, 18, 19, 20, 21, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n",
- " 20, 21, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 9, 10,\n",
- " 11, 14, 15, 16, 17, 18, 19, 20, 15, 16, 17, 18, 19, 20, 15, 16, 17,\n",
- " 18, 19, 20, 15, 16, 17, 18, 19, 20, 16, 17, 18, 19, 17])),\n",
- " (array([10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12,\n",
- " 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14,\n",
- " 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16,\n",
- " 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17,\n",
- " 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,\n",
- " 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,\n",
- " 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20,\n",
- " 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21,\n",
- " 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22,\n",
- " 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23,\n",
- " 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24,\n",
- " 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25,\n",
- " 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26,\n",
- " 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27,\n",
- " 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28,\n",
- " 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32,\n",
- " 32]),\n",
- " array([20, 21, 22, 20, 21, 22, 23, 24, 25, 26, 20, 21, 22, 23, 24, 25, 26,\n",
- " 27, 19, 20, 21, 22, 23, 24, 25, 26, 27, 18, 19, 20, 21, 22, 23, 24,\n",
- " 25, 26, 27, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 15, 16, 17,\n",
- " 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 13, 14, 15, 16, 17, 18, 19,\n",
- " 20, 21, 22, 23, 24, 25, 26, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n",
- " 20, 21, 22, 23, 24, 25, 26, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n",
- " 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 5, 7, 8, 9, 10, 11, 12,\n",
- " 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 7, 8, 9,\n",
- " 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24, 25, 26, 6, 7,\n",
- " 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 6, 7, 8,\n",
- " 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 5, 6, 7,\n",
- " 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 4, 5,\n",
- " 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 5,\n",
- " 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 5,\n",
- " 6, 7, 8, 9, 10, 11, 12, 13, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n",
- " 4, 5, 6, 7, 8, 9, 6, 7, 8, 9, 6, 7, 8, 9, 10, 8, 9,\n",
- " 10])),\n",
- " (array([13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17,\n",
- " 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20,\n",
- " 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22,\n",
- " 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24,\n",
- " 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26,\n",
- " 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29,\n",
- " 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32,\n",
- " 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35,\n",
- " 35, 35]),\n",
- " array([27, 28, 27, 28, 29, 25, 26, 27, 28, 29, 25, 26, 27, 28, 29, 25, 26,\n",
- " 27, 28, 29, 26, 27, 28, 29, 21, 22, 23, 24, 26, 27, 28, 29, 21, 22,\n",
- " 23, 24, 25, 26, 27, 28, 29, 21, 22, 23, 24, 25, 26, 27, 28, 29, 21,\n",
- " 22, 23, 24, 25, 26, 27, 28, 29, 21, 22, 23, 24, 25, 26, 27, 21, 22,\n",
- " 23, 24, 25, 26, 27, 21, 22, 23, 24, 25, 26, 27, 21, 22, 23, 24, 25,\n",
- " 26, 27, 21, 22, 23, 24, 25, 26, 27, 21, 22, 23, 24, 25, 26, 21, 22,\n",
- " 23, 24, 25, 26, 21, 22, 23, 24, 25, 26, 21, 22, 23, 24, 25, 21, 22,\n",
- " 23, 24, 25, 20, 21, 22, 23, 24, 25, 20, 21, 22, 23, 24, 20, 21, 22,\n",
- " 23, 24])),\n",
- " (array([26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30,\n",
- " 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32,\n",
- " 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35,\n",
- " 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37,\n",
- " 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39,\n",
- " 39, 39, 39, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 40, 40,\n",
- " 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42,\n",
- " 42, 42, 42, 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44,\n",
- " 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,\n",
- " 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47,\n",
- " 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 48,\n",
- " 48, 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,\n",
- " 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51,\n",
- " 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52,\n",
- " 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53,\n",
- " 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54,\n",
- " 54, 54, 54, 54, 54, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 55, 56,\n",
- " 56, 56, 56]),\n",
- " array([ 9, 10, 8, 9, 10, 11, 12, 9, 10, 11, 12, 9, 10, 11, 6, 7, 8,\n",
- " 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 13, 7, 8, 9, 10, 11,\n",
- " 12, 13, 7, 8, 9, 10, 11, 12, 6, 7, 8, 9, 10, 11, 12, 6, 7,\n",
- " 8, 9, 10, 11, 12, 13, 5, 6, 7, 8, 9, 10, 11, 12, 13, 4, 5,\n",
- " 6, 7, 8, 9, 10, 11, 12, 4, 5, 6, 7, 8, 9, 10, 11, 12, 3,\n",
- " 4, 5, 6, 7, 8, 9, 10, 11, 12, 3, 4, 5, 6, 7, 8, 9, 10,\n",
- " 11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7,\n",
- " 8, 9, 10, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6,\n",
- " 7, 8, 9, 10, 12, 13, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14,\n",
- " 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 4, 5, 6, 7,\n",
- " 8, 9, 10, 11, 12, 13, 14, 15, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n",
- " 13, 14, 15, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 18,\n",
- " 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 4,\n",
- " 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 4, 5,\n",
- " 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 5, 6, 7, 8,\n",
- " 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 5, 6, 7, 8, 9, 10, 11,\n",
- " 12, 13, 14, 15, 16, 17, 18, 6, 7, 8, 9, 10, 11, 12, 13, 14, 9,\n",
- " 10, 11, 12]))]"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "res_poly2cell"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "6"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "len(res_poly2cell)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Look familiar?\n",
- "\n",
- "These are the 6 states in the shapefile. The values in the array are the indexes of the pixels in the netcdf file that fall within the polygon.\n",
- "Now, within each of these we can aggregate mathematically eg min max mean etc."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "array([[300.87808, 300.36603, 299.68634, ..., 300.49612, 300.53604,\n",
- " 300.56213],\n",
- " [300.89908, 300.4085 , 299.88904, ..., 300.50095, 300.53467,\n",
- " 300.54422],\n",
- " [300.9091 , 300.75906, 300.43503, ..., 300.51334, 300.5268 ,\n",
- " 300.52884],\n",
- " ...,\n",
- " [299.65125, 299.639 , 299.6254 , ..., 298.7499 , 298.93378,\n",
- " 299.17337],\n",
- " [299.4636 , 299.4493 , 299.42276, ..., 298.63046, 298.7523 ,\n",
- " 298.9044 ],\n",
- " [299.2504 , 299.22964, 299.1964 , ..., 298.59427, 298.63202,\n",
- " 298.73044]], shape=(59, 33), dtype=float32)"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "# the values themselves\n",
- "raster_array"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "stats = []\n",
- "for indices in res_poly2cell:\n",
- " if len(indices[0]) == 0:\n",
- " # no cells found for this polygon\n",
- " stats.append(np.nan)\n",
- " else:\n",
- " cells = raster[indices]\n",
- " if sum(~np.isnan(cells)) == 0:\n",
- " # no valid cells found for this polygon\n",
- " stats.append(np.nan)\n",
- " continue\n",
- " else:\n",
- " # compute MEAN of valid cells\n",
- " # but this stat can be ANYTHING\n",
- " stats.append(np.nanmean(cells))"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "[np.float32(296.20612),\n",
- " np.float32(298.52927),\n",
- " np.float32(298.51355),\n",
- " np.float32(299.2492),\n",
- " np.float32(296.9399),\n",
- " np.float32(301.9361)]"
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "stats"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Looks like it worked!"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
"
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "# now we plot it using the shape.geometry to get the shapefile's location for each region\n",
- "gdf = gpd.GeoDataFrame(df, geometry=healthsheds.geometry.values, crs=shape.crs)\n",
- "gdf.plot(column=\"temp_vals\", legend=True)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now that we've demonstrated how this could work, we can substitute the GADM shapefiles for our healthsheds, and put it in a pipeline!!!"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## Nepal\n",
- "\n",
- "We've modified the pipeline to now download Nepal as well. We'll test out an aggregation using the aggregation shapefiles we were provided by Dimeji. We probably want to decide on where to centralize data storage for files like this"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "try: from era5_sandbox.core import GoogleDriver, _get_callable, describe\n",
- "except: from core import GoogleDriver, _get_callable, describe\n",
- "\n",
- "try: from era5_sandbox.download import download_raw_era5\n",
- "except: from download import download_raw_era5\n",
- "\n",
- "try: from era5_sandbox.aggregate import resample_netcdf, netcdf_to_tiff, polygon_to_raster_cells, aggregate_to_healthsheds\n",
- "except: from aggregate import resample_netcdf, netcdf_to_tiff, polygon_to_raster_cells, aggregate_to_healthsheds"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "2025-04-22 15:40:17,129 INFO [2024-09-26T00:00:00] Watch our [Forum](https://forum.ecmwf.int/) for Announcements, news and other discussed topics.\n",
- "2025-04-22 15:40:17,130 WARNING [2024-06-16T00:00:00] CDS API syntax is changed and some keys or parameter names may have also changed. To avoid requests failing, please use the \"Show API request code\" tool on the dataset Download Form to check you are using the correct syntax for your API request.\n",
- "2025-04-22 15:40:21,113 INFO Request ID is ef1937bd-855a-4651-af70-550b72415172\n",
- "2025-04-22 15:40:21,266 INFO status has been updated to accepted\n",
- "2025-04-22 15:40:35,703 INFO status has been updated to successful\n",
- " "
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Done\n"
- ]
- },
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "\r"
- ]
- }
- ],
- "source": [
- "from hydra import initialize, compose\n",
- "from omegaconf import OmegaConf\n",
- "\n",
- "# unfortunately, we have to use the initialize function to load the config file\n",
- "# this is because the @hydra decorator does not work with Notebooks very well\n",
- "# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248\n",
- "# \n",
- "# just use the relative path from the notebook to the config dir\n",
- "with initialize(version_base=None, config_path=\"../../conf\"):\n",
- " cfg = compose(config_name='config.yaml')\n",
- "\n",
- "cfg.development_mode = False\n",
- "cfg.query['year'] = 2023\n",
- "cfg.query['month'] = 10\n",
- "cfg.query['day'] = 1\n",
- "cfg.query['time'] = \"00:00\"\n",
- "cfg.query['geography'] = \"nepal\"\n",
- "download_raw_era5(cfg)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Now let's read it in and run the aggregation:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "# Load the NetCDF file\n",
- "fpath = here() / \"data/input/nepal_2023_10.nc\"\n",
- "ds = xr.open_dataset(fpath)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
"
- ],
- "text/plain": [
- " healthshed mean_temperature \\\n",
- "0 1 292.330078 \n",
- "1 7 286.162109 \n",
- "2 8 282.460938 \n",
- "3 23 293.310547 \n",
- "4 24 295.396484 \n",
- "\n",
- " geometry \n",
- "0 POLYGON ((87.60719 27.37069, 87.60841 27.36969... \n",
- "1 POLYGON ((88.04438 27.4203, 88.04365 27.41925,... \n",
- "2 POLYGON ((88.14528 27.67003, 88.14526 27.66966... \n",
- "3 POLYGON ((88.0766 27.03545, 88.07695 27.03533,... \n",
- "4 POLYGON ((87.76435 26.92431, 87.76435 26.924, ... "
- ]
- },
- "execution_count": null,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "result = aggregate_to_healthsheds(\n",
- " res_poly2cell=res_poly2cell,\n",
- " raster=resampled_tiff,\n",
- " shapes=healthsheds,\n",
- " names_column=\"fid\",\n",
- " aggregation_func=np.nanmean,\n",
- " aggregation_name=\"mean_temperature\"\n",
- ")\n",
- "result.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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GOQLL+JcfPHFACxdujR+zOl08uqrr3LllVem7BMKhbj//vuprq5Gr9eTnZ3NFVdcQXd3d0K7l19+mdNOO438/HyMRiPTp0/nxz/+MV6vN6Hd5ZdfjsViYc+ePZx11llYLBaKi4u59dZbCQaDE77Guro6LrnkEnJyctDr9UyfPp3f/va3CW2WLVuGJEm8+OKL/OhHPyI/Px+LxcK5555LZ2cnbreb//mf/yErK4usrCyuuOKKJDXdgNr597//PdOmTUOv11NTU8NLL72UtKaOjg6++93vUlRUhE6no7y8nHvuuYdIJBJv09DQgCRJPProo9x///2Ul5ej1+v58MMPCQQC3HrrrcyZMwebzUZGRgaLFy/mjTfeSFqT1+vlT3/6U9wsM2BWuvvuu1NurANq4qFPnwOq+7/97W/MnTsXg8HAPffcM+ZrGY4333yT1tZWLr300mHbbNy4keOOOw6NRsOKFSsSBIUBLr30Unbv3s2HH3446pwDvPbaa8yaNQuDwUBFRQVPPPFE/JzH48Fut/Pd7343qV9DQwNqtZqf//znY55rrKxdu5bzzjuPjIwMDAYDc+fO5S9/+UtCm+7ubq699lpqamqwWCzk5ORw0kknjfr0/uyzz/K1r30NiG0IA9+HZ599NqHdmjVrOP744zGZTFRUVPDwww+Putn39vYCkJ+fn/K8SpX8U+h2u/ne975HVlYWmZmZXHjhhbS1tSW1e/nll+PqdIvFwumnn86GDRtSXl9VVVX8f/zPf/7ziGsejd/+9rd86UtfIicnB7PZzMyZM3n00UcJh8MJ7QZMGAdz38xmc0oh+aijjgKgubk5fuz1119HUZQEYQzgiiuuwO/38+6778aPpbrfqVi5ciXt7e1JY37ta1/DYrEccq3sQG2Iib4OR77wq05LS+OrX/0qf/zjH+PHli5dikql4utf/3pSe1mWOf/883n44Ye55JJLePvtt3n44Yd57733WLJkCX6/P962rq6Os846i6effpp3332Xm2++mb/85S+ce+65SeOGw2HOO+88Tj75ZN544w2uvPJKfvWrX/HII49M6Pq2b9/OwoUL2bp1K7/4xS/4+9//ztlnn82NN94Y3+yG8pOf/ISuri6effZZfvGLX7Bs2TIuvvhivvKVr2Cz2Vi6dCk//OEPee655/jJT36S1P/NN9/kiSee4N577+Wvf/0rpaWlXHzxxfz1r3+Nt+no6OCoo47in//8Jz/72c945513uOqqq3jooYf4zne+kzTmE088wQcffMD//u//8s4771BdXU0wGKSvr48f/OAHvP766yxdupTjjjuOCy+8MOFH8tNPP8VoNHLWWWfFzTJPPvnkQd3L9evXc9ttt3HjjTfy7rvv8pWvfGXc13Igb7/9Njk5OdTU1KQ8v2LFCpYsWUJOTg4rVqygoqIiZbv58+djsVh4++23x3QtGzdu5Oabb+b73/8+r732Gscccww33XQT//u//wuAxWLhyiuv5IUXXsDpdCb0ffLJJ9HpdMMK00NRFIVIJJL0SrWJfPjhhxx77LE4HA5+97vf8cYbbzBnzhy+/vWvJ2zofX19ANx11128/fbbPPPMM1RUVLBkyZIR7dJnn312XF3929/+Nv59OPvss+NtOjo6+OY3v8m3vvUt3nzzTc4880xuv/12nn/++RGvc8GCBWi1Wm666SZeeOEF2tvbR703V199NVqtlhdffJFHH32UZcuW8a1vfSuhzYMPPsjFF19MTU0Nf/nLX3juuedwu90cf/zxbN++Pd7u2Wef5YorrmD69Om8+uqr/PSnP+W+++7jgw8+GHUdw7F3714uueQSnnvuOf7+979z1VVX8fOf/zylAHmw9204BtY9Y8aM+LGtW7eSnZ1NXl5eQttZs2bFz4+XgT4DYwyg1Wqprq4+qDEngow0Ka/DEuULyjPPPKMAypo1a5QPP/xQAZStW7cqiqIoCxcuVC6//HJFURRlxowZygknnBDvt3TpUgVQXn311YTx1qxZowDKk08+mXI+WZaVcDisLF++XAGUTZs2xc99+9vfVgDlL3/5S0Kfs846S6mqqhrXdQHKddddF39/+umnK0VFRYrT6Uxod/311ysGg0Hp6+tTFEWJ34Nzzz03od3NN9+sAMqNN96YcPyCCy5QMjIykuY2Go1KR0dH/FgkElGqq6uVKVOmxI9997vfVSwWi9LY2JjQ/3//938VQNm2bZuiKIqyb98+BVAqKyuVUCg04nVHIhElHA4rV111lTJ37tyEc2azWfn2t7+d1Oeuu+5SUn1FB74b+/btix8rLS1V1Gq1smvXroS2Y72W4Zg+fbpyxhlnDLsGQLHZbEpXV9eI4yiKohx77LHKokWLRm1XWlqqSJKkbNy4MeH4qaeeqqSl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s3nz5oSnt+HCrFIx0Wuprq5m7969o7a7++67UalU3HXXXSiKwosvvpgkMNTX14/5B3Pbtm1s2rQpwRTx4osvYrVak7QGN954I9dccw1Op5Pc3Nx4RMFkUlVVxdSpU9m0aVNSzPyBSJKU9H+1efNmPv30U4qLi0fse+DT+2TR29uL1WpN+T+2c+dOYHTB8UBOP/10NBoNe/fu5Stf+cqw7aqqqsjPz2fp0qXccsst8f+JxsZGPvnkk3HPC6l/vxRFiYcXTiZNTU0sWbKEaDTKsmXLhhWMzj//fH7605/ypz/9iR/96Efx488++yxGo5Ezzjhj3HMvWrSI/Px8nn322QSH9r/+9a94PJ5DnmtBViTkCZaYnmj/z4vDRlgAEjLoDcc3vvENXnjhBc466yxuuukmjjrqKLRaLS0tLXz44Yecf/75fPnLX+aYY44hPT2da665hrvuugutVssLL7zApk2bDsGVDPL4449z3HHHcfzxx/O9732PsrIy3G43e/bs4a233pqQt3QqsrKyOOmkk7jzzjsxm808+eST7Ny5MyF88t577+W9997jmGOO4cYbb6SqqopAIEBDQwP/+Mc/+N3vfpfyyWIoA2GM1157LV/96ldpbm7mvvvuIz8/n7q6uoS2M2fOZNmyZbz11lvk5+djtVqpqqrirLPOIiMjg6uuuop7770XjUbDs88+mxCuNRoTvZYlS5Zw77334vP5MJlMI871s5/9DJVKxZ133omiKCxdujQuMPT29lJXVzdqYqcBCgoKOO+887j77rvJz8/n+eef57333uORRx5JWse3vvUtbr/9dj766CN++tOffmZC5+9//3vOPPNMTj/9dC6//HIKCwvp6+tjx44drF+/nldeeQWIffb33Xcfd911FyeccAK7du3i3nvvpby8fNRw1QFh6g9/+ANWqxWDwUB5eXlKNfp4+PDDD7npppv45je/yTHHHENmZiZdXV0sXbqUd999l8suu2zU7/SBlJWVce+993LHHXdQX1/PGWecQXp6Op2dnaxevRqz2cw999yDSqXivvvu4+qrr+bLX/4y3/nOd3A4HNx9990pTRPDMVTwPvXUU9HpdFx88cX88Ic/JBAI8NRTT9Hf3z+uaxiNrq4uTjzxRNrb23n66afp6uqiq6srfr6oqCh+32bMmMFVV13FXXfdhVqtZuHChfzrX//iD3/4A/fff3+CycDn8/GPf/wDIO6XtXz5cnp6ejCbzXGfIrVazaOPPsqll17Kd7/7XS6++GLq6ur44Q9/yKmnnnpQAshEkCfBDCGSMn1BUKvVvPnmmzz++OM899xzPPTQQ2g0GoqKijjhhBPiaq3MzEzefvttbr31Vr71rW9hNps5//zzefnll8ds750MampqWL9+Pffddx8//elP6erqwm63M3XqVM4666xJn++8885jxowZ/PSnP6WpqYnKykpeeOGFBKk9Pz+ftWvXct999/Hzn/+clpYWrFYr5eXl8R/E0bjiiivo6urid7/7HX/84x+pqKjgxz/+MS0tLUkhoY8//jjXXXcd3/jGN/D5fHHnsLS0tHhI67e+9S3sdjtXX301Z555JldfffWYrnei13LJJZfEQwDH8sT+05/+FJVKxR133IEsy7z00ktotVreeOMNtFotF1100ZjWPWfOHK644gruuusu6urqKCgo4Je//CXf//73k9oajUbOPfdcnn/+ea655poxjX8wnHjiiaxevZoHHniAm2++mf7+fjIzM6mpqUm4rjvuuAOfz8fTTz/No48+Sk1NDb/73e947bXXRk0fXV5ezmOPPcbjjz8ef5p95plnuPzyyye09qOPPporr7ySDz/8kOeee46enh6MRiM1NTX8+te/5nvf+95BjXv77bdTU1PD448/ztKlSwkGg+Tl5bFw4cKEz+Kqq64C4JFHHuHCCy+krKyMn/zkJyxfvnxMKbV9Pl+CFqG6ujoegnnhhReSmZnJJZdcwi233DKpSYq2b99OfX09QFLYKMTCY4em637yyScpLCzk17/+NR0dHZSVlfH4448nCcldXV1J/08D45SWlib4cXzrW99CrVbz8MMP8+yzz5KRkcFll102ojn6s2Jyqk4ensKCpCiHab1MwbiRJInrrruO3/zmN5/3Ug4rBiJr3nnnnYMe4/jjj6ekpIQXXnhhElcWIxQKUVZWxnHHHZeUIElw+BMOh8nPz+ekk04Sn+/nhMvlwmaz8eDqEzFYJvaMHfBE+MlRH+J0OhOyEn/ROTxFHIHgEPLQQw/x73//mzVr1hxU/48++og1a9Zw3333Teq6uru7WbFiBd/73vfo7Ozkxz/+8aSOL/h8cblcvP/++3z3u9+lt7c3HrYq+PyIIk3Ka6w89NBDLFy4EKvVSk5ODhdc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bh233XYbjY2NfPKTnxw4TghR8jyt9bD7xsNY451ITibmIAj42Mc+hlKKb3/72xM63ksvvZR169Zx9OhR/tf/+l9ce+21vPjii9TW1k6oeFevXs2//uu/smbNmtPyOzuSsXzG11133cDxS5Ys4eyzz2b69Ok8+uijfOQjH5lQ8fYn4n3oQx/i9ttvB2D58uU8//zzfPe73+Xiiy+eUPEe6/vf/z7XX3/9acmvgLHF+81vfpMXXniBRx55hOnTp/PMM8/w2c9+loaGBi6//PLTEvdEsXfv3pJliBP10bjllltYv349zz777HGPOd7vxNA8uCVLljB37lzOPvts1qxZw1lnnTW2gE9qaDFBNDU16W9961sl933lK1/R8+fP11prvX37dg3oNWvWlBxz1VVX6U984hPjFme/E8U71ESZWRhrzL7v66uvvlovXbpUHz16dDxDLHEyn/FQc+bMGfXq7e1yonjvvfdeLYTQlmUN3AAtpdTTp08f93i1PrXP+B//8R/fztBGdKJ4C4WCtm1bf+UrXyk55q/+6q/0BRdcMG5x9juZz/eZZ57RgF63bt14hTfMieLt6+vTjuPoX/7ylyXH3HjjjfrKK68ctzjfCgMzC8s+r6846/87pdvvL/u8BnRnZ+eYX/+WW27RTU1NeseOHcc95mR+J5RS2nEc/dBDD405hkmZs9DX14eUpaFbljVwpTBz5kzq6+t5/PHHBx73fZ+nn36aCy64YFxjhRPHOxGNJeYgCLj22mvZunUrTzzxBNXV1eMd5oA3+xlrrce0VvhWO1G8H//4x1m/fj3r1q0buDU2NnLHHXfwq1/9atzjhTf3Gbe2trJ3714aGhre7vCGOVG8ruuycuXKYVvRtmzZwvTp08ctzn4n8/ned999rFix4rTk2/Q7UbxBEBAEwaT72zcq9RbdxkhrzS233MJPf/pT/vu//5uZM2ce99iT+Z3YuHEjQRCc1P8vJ+UyxAc/+EG++tWv0tzczOLFi1m7di333HMPn/rUp4B4+eG2227jrrvuYu7cucydO5e77rqLVCrFH/3RH024eAHa2trYs2fPQJ2C/j9g9fX11NfXT7iYwzDkD/7gD1izZg2//OUviaKIlpYWIE6+Ge/tcieKt7e3l69+9atcddVVNDQ00Nrayre//W327dvHRz/60XGNdSzxVldXDxt8OY5DfX098+fPH/d44cQx9/T08KUvfYlrrrmGhoYGdu3axd/8zd8wZcoUPvzhD0+4eAHuuOMOrrvuOlatWsWll17KY489xi9+8QueeuqpCRkvxIlxP/nJT/jGN74x7jEOdaJ4y8vLufjii7njjjtIJpNMnz6dp59+mh/96Efcc889pzX2N2u8KzjefPPNPPjggzz88MNkMpmBv7HZbLZk6+NovxPbt2/nP/7jP3jf+97HlClTeP311/mLv/gLzjzzTC688MKxBz7mOYgJpKurS3/uc5/Tzc3NOpFI6FmzZum//du/1YVCYeAYpZS+8847dX19vfY8T69atUpv2LBhwsZ7//33v6mkl9MVc/9yyUi3J598csLFm8vl9Ic//GHd2NioXdfVDQ0N+qqrrjptCY5j+Z041ulOcDxRzH19ffqKK67QNTU12nEc3dzcrD/5yU/qPXv2TMh4+9133316zpw5OpFI6GXLlumf//znEzre//k//6dOJpO6o6PjtMTZbyzxHjx4UN9www26sbFRJxIJPX/+fP2Nb3xjIGl3suhfhrhsyV/pK5d98ZRuly35qzEvQxzvb+z9999fctxovxN79uzRq1at0lVVVdp1XT179mz9Z3/2Z7q1tfWkPoNJWWfBMAzDMMZLf52FyxbfgW2Nnoh4ImFU4Dcbv/6m6iycTpNyGcIwDMMwxt1Jlms+7jkmoUmZ4GgYhmEYxvgxMwuGYRiGMRbv4pkFM1gwDMMwjLFQwKnWSJuku0bNMoRhGIZhGKMyMwuGYRiGMQbjXWdhIjGDBcMwDMMYi3dxzoJZhjAMwzAMY1RmZsEwDMMwxkJpEKc4M6Am58yCGSwYhmEYxli8i5chzGDBMAzDMMbkLRgsMDkHCyZnwTAMwzCMUZmZBcMwDMMYC7MMYRiGYRjGqFR/l+hTPcfkY5YhDMMwDMMYlZlZMAzDMIyx0Cq+neo5JiEzWDAMwzCMsXgX5yyYZQjDMAzDMEZlZhYMwzAMYyzexQmOZrBgGIZhGGNhliEMwzAMwzBGZmYWDMMwDGMsNG/BzMJbEsm4M4MFwzAMwxiLd/EyhBksGIZhGMZYKAWcYp0ENTnrLJicBcMwDMMwRmVmFgzDMAxjLMwyhGEYhmEYo3oXDxbMMoRhGIZhGKMyMwuGYRiGMRamgqNhGIZhGKPRWqFPsWvkqT7/dDHLEIZhGIZhjMrMLBiGYRjGWGh96ssIkzTB0QwWDMMwDGMs9FuQszBJBwtmGcIwDMMwjFGZmQXDMAzDGAulQJxiguIkTXA0gwXDMAzDGIt38TKEGSwYhmEYxhhopdCnOLNgtk4ahmEYhvGOZGYWDMMwDGMszDKEYRiGYRijUhrEu3OwYJYhDMMwDMMYlZlZMAzDMIyx0Bo41a2Tk3NmwQwWDMMwDGMMtNLoU1yG0JN0sGCWIQzDMAzDGJWZWTAMwzCMsdCKU1+GmJx1FsxgwTAMwzDGwCxDGIZhGIZhHIeZWTAMwzCMMQh14ZSXEUKCtyia8WUGC4ZhGIYxCtd1qa+v59mW//uWnK++vh7Xdd+Sc40XoSfrAophGIZhjJN8Po/v+2/JuVzXJZFIvCXnGi9msGAYhmEYxqhMgqNhGIZhGKMygwXDMAzDMEZlBguGYRiGYYzKDBYMwzAMwxiVGSwYhmEYhjEqM1gwDMMwDGNUZrBgGIZhGMao/n8R8XEHEhRA3AAAAABJRU5ErkJggg==",
- "text/plain": [
- ""
- ]
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
- "source": [
- "result.plot(column=\"mean_temperature\", legend=True)\n",
- "plt.title(\"Mean Temperature (K) by Health Shed October 2023\")\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "This should work by slotting right into the pipeline, only changing the function for the names column"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": []
- }
- ],
- "metadata": {
- "kernelspec": {
- "display_name": "python3",
- "language": "python",
- "name": "python3"
- }
- },
- "nbformat": 4,
- "nbformat_minor": 2
-}
diff --git a/notes/sidebar.yml b/notes/sidebar.yml
index c80eda4..caf3166 100644
--- a/notes/sidebar.yml
+++ b/notes/sidebar.yml
@@ -2,5 +2,15 @@ website:
sidebar:
contents:
- index.ipynb
+ - section: "Snakemake Modules"
- 00_core.ipynb
- 01_download_raw_data.ipynb
+ - 02_aggregate.ipynb
+ - 03_publish.ipynb
+ - section: "PyTask Modules"
+ - 20_pytask_config.ipynb
+ - 20_pytask_logger.ipynb
+ - 21_pytask_download.ipynb
+ - 22_pytask_aggregate.ipynb
+ - section: "PyTask Demo"
+ - 10_pytask_demo.ipynb
diff --git a/notes_qmd/00_core.qmd b/notes_qmd/00_core.qmd
new file mode 100644
index 0000000..8159d54
--- /dev/null
+++ b/notes_qmd/00_core.qmd
@@ -0,0 +1,574 @@
+---
+title: "Core Module: Internal functions and testing"
+exec_all: true
+---
+
+## core
+
+> This is a core library for the ERA5 dataset pipeline. It defines a few helpful functions such as an API tester to test your API key and connection.
+
+
+```{python}
+#| default_exp core:
+#
+```
+
+```{python}
+#| hide:
+#
+from nbdev.showdoc import *
+```
+
+```{python}
+#| exports:
+#
+import os
+import cdsapi
+import hydra
+import json
+import tempfile
+import argparse
+import zipfile
+import shutil
+import geopandas as gpd
+from pathlib import Path
+from pydrive2.auth import GoogleAuth
+from pydrive2.drive import GoogleDrive
+from omegaconf import DictConfig, OmegaConf
+from pyprojroot import here
+from importlib import import_module
+```
+
+## Utilities
+
+Some utilities are provided to help you with the ERA5 dataset.
+
+```{python}
+#| exports:
+#
+def describe(
+ cfg: DictConfig=None, # Configuration file
+ )-> None:
+ "Describe the configuration file used by Hydra for the pipeline"
+
+ if cfg is None:
+ print("No configuration file provided. Generating default configuration file.")
+ cfg = OmegaConf.create()
+
+ print("This package fetches ERA5 data. The following is the config file used by Hydra for the pipeline:\n")
+ print(OmegaConf.to_yaml(cfg))
+```
+
+```{python}
+#| exporti:
+#
+def _expand_path(
+ path: str # Path on user's machine
+ )-> str: # Expanded path
+ "Expand the path on the user's machine for cross compatibility"
+
+ # Expand ~ to the user's home directory
+ path = os.path.expanduser(path)
+ # Expand environment variables
+ path = os.path.expandvars(path)
+ # Convert to absolute path
+ path = os.path.abspath(path)
+ return path
+```
+
+```{python}
+#| exporti:
+#
+def _get_callable(func_path):
+ """Dynamically import a callable from a string path."""
+ module_name, func_name = func_path.rsplit(".", 1)
+ module = import_module(module_name)
+ return getattr(module, func_name)
+```
+
+```{python}
+#| exporti:
+# a directory structure creator
+def _create_directory_structure(
+ base_path: str, # The base directory where the structure will be created
+ structure: dict # A dictionary representing the directory structure
+ )->None:
+ """
+ Recursively creates a directory structure from a dictionary.
+ """
+ for folder, substructure in structure.items():
+ # Create the current directory
+ current_path = os.path.join(base_path, folder)
+ os.makedirs(current_path, exist_ok=True)
+
+ # Recursively create subdirectories if substructure is a dictionary
+ if isinstance(substructure, dict):
+ _create_directory_structure(current_path, substructure)
+```
+
+In addition, we've defined 3 private functions to help with path expansion `_expand_path`, dynamic function importing `_get_callable`, and directory structure creation `_create_directory_structure`.
+
+### A Simple Temperature Conversion Function
+
+```{python}
+#| export:
+#
+def kelvin_to_celsius(
+ kelvin: float # Temperature in Kelvin
+ ) -> float: # Temperature in Celsius
+ """
+ Convert temperature from Kelvin to Celsius.
+ """
+ return kelvin - 273.15
+```
+
+### A Class for Authenticating Google Drive
+
+We're going to use a class to authenticate and interact with google drive. The goal is to have a simple interface to fetch the healthshed files dynamically from google drive in the pipeline.
+
+::: {.callout-important}
+This class was implemented when all of our data
+was stored on a private Google Drive. Since we
+have moved all of our data to FASRC, this will
+likely be deprecated in the near future.
+:::
+
+```{python}
+#| export:
+#
+class GoogleDriver:
+ """
+ A class to handle Google Drive authentication and file management.
+ This class uses the PyDrive2 library to authenticate with Google Drive using a service account.
+
+ It provides three methods: authenticating the account, getting the drive object, and downloading the healthshed files for madagascar.
+ """
+ def __init__(self, json_key_path=None):
+ self.json_key_path = json_key_path or os.getenv("GOOGLE_DRIVE_AUTH_JSON")
+ if not self.json_key_path or not os.path.isfile(self.json_key_path):
+ raise FileNotFoundError(f"Service account key file not found: {self.json_key_path}")
+ self.drive = self._authenticate()
+
+ def _authenticate(self):
+
+ settings = {
+ "client_config_backend": "service",
+ "service_config": {
+ "client_json_file_path": self.json_key_path
+ }
+ }
+ gauth = GoogleAuth(settings=settings)
+
+ gauth.ServiceAuth()
+
+ return GoogleDrive(gauth)
+
+ def get_drive(self):
+ return self.drive
+```
+
+Here's how we use it. The credentials for the data-pipeline service account are
+available in the sandbox folder, and the path to said folder is set in the config:
+
+```{python}
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+```
+
+```{python}
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+```
+
+::: {.callout-important}
+If we continue with `pytask`, we will not need to
+use hydra at all, and so the above strategy
+may get deprecated.
+:::
+
+```{python}
+auth = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = auth.get_drive()
+```
+
+Here's how we might check that the healthsheds are accessible in the drive:
+
+```{python}
+# we're using the madagascar healthshed folder as an example
+folder_id = cfg.geographies.madagascar.healthsheds
+folder_name = "healthsheds2022.zip"
+file_list = drive.ListFile({'q': f" title='{folder_name}' and trashed = false "}).GetList()
+
+for file in file_list:
+ print(f"{file['title']} - {file['mimeType']}")
+```
+
+That being said, we can read in the healthsheds into geopandas by downloading them to a temp directory. The healthsheds must be a zipped shapefiles package with the files at the root of the zip directory.
+
+```{python}
+with tempfile.TemporaryDirectory() as temp_dir:
+ # Create a temporary directory to store the downloaded file
+ zip_path = os.path.join(temp_dir, folder_name)
+
+ # Download file from Google Drive
+ file_obj = drive.CreateFile({'id': file_list[0]['id']})
+ file_obj.GetContentFile(zip_path)
+
+ # Read shapefile directly from ZIP
+ gdf = gpd.read_file(f"zip://{zip_path}")
+```
+
+That works! So now we can patch the class to include this workflow:
+
+```{python}
+#| export:
+#
+from fastcore.basics import patch
+```
+
+```{python}
+#| export:
+#
+@patch
+def read_healthsheds(self:GoogleDriver, healthshed_zip_name):
+
+ file_list = self.drive.ListFile({'q': f" title='{healthshed_zip_name}' and trashed = false "}).GetList()
+
+ with tempfile.TemporaryDirectory() as temp_dir:
+ # Create a temporary directory to store the downloaded file
+ zip_path = os.path.join(temp_dir, healthshed_zip_name)
+
+ # Download file from Google Drive
+ file_obj = self.drive.CreateFile({'id': file_list[0]['id']})
+ file_obj.GetContentFile(zip_path)
+
+ # Read shapefile directly from ZIP
+ gdf = gpd.read_file(f"zip://{zip_path}")
+
+ # we need to ensure that the healthsheds only contain valid polygons
+ gdf = gdf[gdf.geometry.notnull()]
+ gdf.reset_index(drop=True, inplace=True)
+
+ return gdf
+```
+
+And to check that it works:
+
+```{python}
+driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = driver.get_drive()
+healthsheds = driver.read_healthsheds("healthsheds2022.zip")
+
+healthsheds.describe()
+```
+
+## CDS File Handler Type
+
+::: {.callout-important}
+This section may also be deprecated. Since adding `swvl1` to the pipeline, we have not needed to use this class. We leave it here for now for reference.
+:::
+
+We're going to make a file handler type to help deal with CDS files. This is to fix [NSAPH-Data-Processing/era5_sandbox#13](https://github.com/NSAPH-Data-Processing/era5_sandbox/issues/13).
+
+Usually, when you download data, it comes out as a simple .nc file that can be opened with xarray. However, the CDS API has a few different file types that are not .nc files. For example, the ERA5 data is stored in a .grib file format. This is a common format for meteorological data, and it is used by the ECMWF. When a query has multiple variables, sometimes they are downloaded as a .zip file to separat the grib from the netcdf.
+
+So, below, we define a class that can handle the file no matter what the type is. It will check the file type and then use the appropriate method to open it. The class will also have a method to check if the file is a .zip file, and if so, it will unzip it and return the path to the unzipped file.
+
+```{python}
+#| export:
+#
+class ClimateDataFileHandler:
+ """
+ A class to handle file operations for the Climate Data Store (CDS).
+ This class provides unpack files downloaded from the CDS API. It must be able to
+ handle the unpacking of files downloaded from the CDS API. This means that
+ if the file is a basic netcdf, it should be passed to the netcdf handler. If
+ the file is a zip, it should be handled by the zip handler in temp and the
+ data returned as required.
+ """
+
+ def __init__(self, input_path: str):
+ """
+ Core initialization. It requires only the path. The flags are
+ then used to do the handling logic.
+ """
+ self.original_path = Path(input_path)
+
+ # major flag here for logic
+ self.is_zip = False
+
+ # the unzipping directory
+ self.unzipped_dir = None
+
+ # the instant data, such as temperature
+ self.instant_file = None
+
+ # the cumulative data, such as precipitation
+ self.accum_file = None
+
+ # any extraneous data
+ self.other_files = []
+
+ # ready to be used
+ self._prepared = False
+
+ def prepare(self):
+ """
+ Inspect the file and prepare the appropriate NetCDF paths.
+ """
+ if self._prepared:
+ return
+
+ if not self.original_path.exists():
+ raise FileNotFoundError(f"{self.original_path} does not exist")
+
+ # Detect ZIP by magic number
+ # chatgpt implementation here; this is a common way to check for zip files
+ with open(self.original_path, "rb") as f:
+ sig = f.read(4)
+ self.is_zip = sig == b'PK\x03\x04'
+
+ if self.is_zip:
+ self._unzip_and_scan()
+ else:
+ self.instant_file = str(self.original_path)
+
+ self._prepared = True
+
+ def _unzip_and_scan(self):
+ """Extract and identify stepType-specific NetCDFs from ZIP."""
+ self.unzipped_dir = tempfile.TemporaryDirectory()
+ with zipfile.ZipFile(self.original_path, 'r') as zip_ref:
+ zip_ref.extractall(self.unzipped_dir.name)
+
+ for f in Path(self.unzipped_dir.name).glob("*.nc"):
+ if "stepType-instant" in f.name:
+ self.instant_file = str(f)
+ elif "stepType-accum" in f.name:
+ self.accum_file = str(f)
+ else:
+ self.other_files.append(str(f))
+
+ def get_dataset(self, type: str = "instant") -> str:
+ """Get the appropriate dataset path ('instant' or 'accum')."""
+ self.prepare()
+
+ if type == "instant" and self.instant_file:
+ return self.instant_file
+ elif type == "accum" and self.accum_file:
+ return self.accum_file
+ elif type == "any":
+ return self.instant_file or self.accum_file or (self.other_files[0] if self.other_files else None)
+ else:
+ raise ValueError(f"No file found for requested type '{type}'")
+
+ def cleanup(self):
+ """Clean up any temporary directories created during unzip."""
+ if self.unzipped_dir is not None:
+ self.unzipped_dir.cleanup()
+```
+
+```{python}
+import xarray as xr
+from fastcore.test import test_fail
+```
+
+```{python}
+
+eg_file = here() / "bld/2019_5_madagascar.nc"
+
+# this fails because the nc file downloaded has grib and netcdf in it, so
+# xr cannot handle it.
+def wont_work(multilayer_file):
+
+ ds = xr.open_dataset(multilayer_file)
+
+test_fail(
+ wont_work,
+ args=(eg_file)
+)
+
+# equivalent to saying try: wont_work(eg_file) Except: some error handling
+```
+
+The above fails because the download contains temperature and precipitation data, which get encoded silently as different formats. Even though it is one file, it contains both grib and netcdf data and is encoded as a .zip file. So we use the class to read it instead:
+
+```{python}
+handler = ClimateDataFileHandler(eg_file)
+handler.prepare()
+ds1 = xr.open_dataset(handler.get_dataset("instant"))
+#ds2 = xr.open_dataset(handler.get_dataset("accum"))
+```
+
+::: {.callout-important}
+The above line for `ds2` is commented out because the example file does not separate accumulation data.
+:::
+
+```{python}
+ds1
+```
+
+```{python}
+#ds2
+```
+
+```{python}
+handler.cleanup()
+```
+
+Great! Let's add a context handler and this can be added to the pipeline,
+so that with the entry and exit methods, we can now use the class in a `with` statement:
+
+
+```{python}
+#| exporti:
+#
+@patch
+def __enter__(self:ClimateDataFileHandler):
+ self.prepare()
+ return self
+
+@patch
+def __exit__(self:ClimateDataFileHandler, exc_type, exc_val, exc_tb):
+ self.cleanup()
+```
+
+
+```{python}
+with ClimateDataFileHandler(eg_file) as handler:
+ ds1 = xr.open_dataset(handler.get_dataset("instant"))
+ #ds2 = xr.open_dataset(handler.get_dataset("accum"))
+
+ print(ds1)
+ #print(ds2)
+```
+
+## Tests and Main
+
+In `nbdev`, our tests are embedded in the notebook. Whenever you export the notebook, all the cells that are specified to run are run, and hence, the tests are executed. The tests are also exported. This is a great way to ensure that your documentation is always up-to-date. For this module, we're using the `testAPI()` function as our main test.
+
+```{python}
+#| exports:
+#
+def testAPI(
+ cfg: DictConfig=None,
+ dataset:str="reanalysis-era5-pressure-levels"
+ )-> bool:
+
+ # parse config
+ testing=cfg.development_mode
+ output_path=here("data") / "testing"
+
+ print(OmegaConf.to_yaml(cfg))
+
+ try:
+ client = cdsapi.Client()
+
+ # build request
+ request = {
+ 'product_type': ['reanalysis'],
+ 'variable': ['geopotential'],
+ 'year': ['2024'],
+ 'month': ['03'],
+ 'day': ['01'],
+ 'time': ['13:00'],
+ 'pressure_level': ['1000'],
+ 'data_format': 'grib',
+ }
+
+ target = output_path / 'test_download.grib'
+
+ print("Testing API connection by downloading a dummy dataset to {}...".format(output_path))
+
+ client.retrieve(dataset, request, target)
+
+ if not testing:
+ os.remove(target)
+
+ print("API connection test successful.")
+ return True
+
+ except Exception as e:
+ print("API connection test failed.")
+ print("Did you set up your API key with CDS? If not, please visit https://cds.climate.copernicus.eu/how-to-api#install-the-cds-api-client")
+ print("Error: {}".format(e))
+ return False
+```
+
+We can see that this API tester tool works with Hydra configuration:
+
+```{python}
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+```
+
+```{python}
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+describe(cfg)
+```
+
+### Importing the Main Function
+
+::: {.callout-important}
+As mentioned, if we continue with `pytask`, we will not need to use hydra at all, and so the main function
+may get deprecated as `pytask` will handle the pipeline execution without `__main__` scripts.
+:::
+
+Important: using `__main__` in nbdev and Hydra is a little bit tricky. We need to define the main function in the module ONLY ONCE and then when we export the notebook to script, we need to add the `nbdev.imports.IN_NOTEBOOK` variable. This way, the main function will only be executed when we run the notebook and not when we import the module.
+
+```python
+from nbdev.imports import IN_NOTEBOOK
+```
+
+You'll see this listed throughout the notebooks.
+
+```{python}
+#| exports:
+#
+@hydra.main(version_base=None, config_path="../../conf", config_name="config")
+def main(cfg: DictConfig) -> None:
+
+ # Create the directory structure
+ _create_directory_structure(here() / "data", cfg.datapaths)
+
+ # test the api
+ testAPI(cfg=cfg)
+```
+
+```{python}
+#| export: null
+#| eval: false
+try: from nbdev.imports import IN_NOTEBOOK
+except: IN_NOTEBOOK=False
+
+if __name__ == "__main__" and not IN_NOTEBOOK:
+ main()
+```
+
+```{python}
+#| hide:
+#
+import nbdev; nbdev.nbdev_export()
+```
\ No newline at end of file
diff --git a/notes_qmd/01_download_raw_data.qmd b/notes_qmd/01_download_raw_data.qmd
new file mode 100644
index 0000000..f55e2ab
--- /dev/null
+++ b/notes_qmd/01_download_raw_data.qmd
@@ -0,0 +1,259 @@
+---
+title: "Download Module: Downloading Raw Data from CDSAPI"
+engine: jupyter
+---
+
+## download
+
+> This module downloads the raw data from CDS and saves it in the local directory
+
+```{python}
+#| default_exp download:
+#
+```
+
+```{python}
+#| hide:
+#
+from nbdev.showdoc import *
+```
+
+We use a similar approach to the one in the tutorial to download the data
+to local storage.
+
+```{python}
+#| export:
+#
+import os
+import hydra
+import cdsapi
+import tempfile
+import zipfile
+import requests
+import geopandas as gpd
+from pathlib import Path
+from pyprojroot import here
+from shapely.geometry import box
+from omegaconf import DictConfig, ListConfig, OmegaConf
+
+try: from era5_sandbox.core import _expand_path
+except: from core import _expand_path
+```
+
+```{python}
+#| exporti:
+#
+def _validate_query(
+ query_body: DictConfig
+ )->bool:
+ '''
+ Check that the query is valid
+ ###TODO Not a good idea to overwrite components of the query body because the user may believe something and the function may give somehting else back
+ Better to just tell them something is wrong
+ '''
+
+ required_keys = ['product_type', 'variable', 'year', 'month', 'day', 'time', 'area', 'data_format', 'download_format']
+ if not all([key in query_body.keys() for key in required_keys]):
+ print(f"Missing required key in query. Required keys are {required_keys}")
+ print("Query validation failed")
+ raise ValueError("Invalid query")
+
+ if isinstance(query_body['year'], ListConfig):
+ query_body['year'] = [str(x).zfill(2) for x in query_body['year']]
+ else:
+ query_body['year'] = str(query_body['year'])
+ if isinstance(query_body['month'], ListConfig):
+ query_body['month'] = [str(x).zfill(2) for x in query_body['month']]
+ else:
+ query_body['month'] = str(query_body['month']).zfill(2)
+
+ if isinstance(query_body['day'], ListConfig):
+ query_body['day'] = [str(x).zfill(2) for x in query_body['day']]
+ else:
+ query_body['day'] = str(query_body['day']).zfill(2)
+
+ return OmegaConf.to_container(query_body, resolve=True)
+```
+
+The background functionality in this module involves downloading the
+bounding box of a region of interest, and sending that to the
+CDS API query. As such, we define two helper functions to
+fetch the OCHA/HDX shapefiles for a geographic region, and
+another to create the bounding box from the files.
+
+```{python}
+#| export:
+#
+def fetch_GADM(
+ url: str="https://geodata.ucdavis.edu/gadm/gadm4.1/gpkg/gadm41_MDG.gpkg", # URL to fetch the GADM data for Madagascar
+ output_file: str="gadm41_MDG.gpkg" # file path to save the GADM data
+ )-> str:
+ '''
+ Fetch the GADM bounding box for geographic region
+ '''
+
+ output_file_path = _expand_path(output_file)
+ if os.path.exists(output_file_path):
+ print("GADM data already exists")
+ return output_file_path
+
+ print("Fetching GADM bounding box data for region")
+ os.system("curl --output {} {}".format(output_file, url))
+ print("GADM data fetched")
+
+ return output_file_path
+```
+
+```{python}
+#| exports:
+#
+def create_bounding_box(
+ zip_url_or_path: str, # URL or local path to the zipped shapefile.
+ buffer_km: float = 50, # Buffer distance in kilometers to expand the bounding box.
+ round_to: int = 1 # Number of decimal places to round the bounding box coordinates.
+) -> list: # Bounding box in the CDS API area format [North, West, South, East]
+ '''
+ Create a bounding box from OCHA/HDX shapefile data with a buffer.
+ '''
+ with tempfile.TemporaryDirectory() as tmpdir:
+ # Download if it's a URL
+ if zip_url_or_path.startswith("http"):
+ response = requests.get(zip_url_or_path)
+ zip_path = os.path.join(tmpdir, "ocha_data.zip")
+ with open(zip_path, "wb") as f:
+ f.write(response.content)
+ else:
+ zip_path = zip_url_or_path
+
+ # Unzip
+ with zipfile.ZipFile(zip_path, 'r') as zip_ref:
+ zip_ref.extractall(tmpdir)
+
+ # Find the .shp file
+ shp_files = list(Path(tmpdir).rglob("*.shp"))
+ if not shp_files:
+ raise FileNotFoundError("No shapefile (.shp) found in the extracted archive.")
+ shp_path = str(shp_files[0]) # Use first found .shp
+
+ # Read shapefile
+ shape = gpd.read_file(shp_path)
+
+ # Reproject to projected CRS (you may want to detect the correct UTM zone)
+ shape_proj = shape.to_crs(epsg=32738)
+
+ # Apply buffer
+ buffered = shape_proj.geometry.buffer(buffer_km * 1000)
+
+ # Convert back to geographic coordinates
+ buffered_geo = gpd.GeoSeries(buffered, crs=shape_proj.crs).to_crs(epsg=4326)
+
+ # Get bounding box
+ bounds = buffered_geo.total_bounds # [min_x, min_y, max_x, max_y]
+ bbox = [
+ round(bounds[3], round_to), # North
+ round(bounds[0], round_to), # West
+ round(bounds[1], round_to), # South
+ round(bounds[2], round_to) # East
+ ]
+
+ return bbox
+```
+
+The primary function to download the data from CDSAPI is defined below.
+
+```{python}
+#| exports:
+#
+def download_raw_era5(
+ cfg: DictConfig # hydra configuration file
+ )->None:
+ '''
+ Send the query to the API and download the data
+ '''
+
+ # parse the cfg
+ testing = cfg.development_mode # for testing
+ output_dir = here("data/input") # output directory
+
+ geography = cfg.query.geography
+
+ target = os.path.join(_expand_path(output_dir), "{}_{}_{}.nc".format(geography, cfg.query['year'], cfg.query['month']))
+
+ client = cdsapi.Client()
+
+ query = _validate_query(cfg.query)
+
+ dataset = cfg.dataset
+ # to make sure the query is valid at the end
+ del query['geography']
+
+ # Send the query to the client
+ if not testing:
+ bounds = create_bounding_box(cfg.geographies[geography]['shapefile'])
+ query['area'] = bounds
+ client.retrieve(dataset, query).download(target)
+
+ print("Downloaded file to: {}".format(target))
+ else:
+ print(f"Testing mode. Not downloading data. Query is {query}")
+
+ print("Done")
+```
+
+## Tests and Main
+
+Here we define some tests and the main function that will be used to download the data.
+
+```{python}
+#| eval: false
+from hydra import initialize, compose
+from omegaconf import OmegaConf
+
+# unfortunately, we have to use the initialize function to load the config file
+# this is because the @hydra decorator does not work with Notebooks very well
+# this is a known issue with Hydra: https://gist.github.com/bdsaglam/586704a98336a0cf0a65a6e7c247d248
+#
+# just use the relative path from the notebook to the config dir
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode = False
+cfg.query['year'] = 2017
+cfg.query['month'] = 11
+#cfg.query['day'] = 1
+#cfg.query['time'] = "00:00"
+cfg.query['geography'] = "nepal"
+download_raw_era5(cfg)
+```
+
+```{python}
+#| exports:
+#
+@hydra.main(config_path="../../conf", config_name="config", version_base=None)
+def main(cfg: DictConfig) -> None:
+ download_raw_era5(cfg=cfg)
+ # better approach would be to have the function only use the specific arguments of the config
+```
+
+```{python}
+#| export:
+#| eval: false
+try: from nbdev.imports import IN_NOTEBOOK
+except: IN_NOTEBOOK=False
+
+if __name__ == "__main__" and not IN_NOTEBOOK:
+ print('Running from __main__ ...')
+
+ main()
+```
+
+```{python}
+#| hide:
+#
+import nbdev; nbdev.nbdev_export()
+```
\ No newline at end of file
diff --git a/notes_qmd/02_aggregate.qmd b/notes_qmd/02_aggregate.qmd
new file mode 100644
index 0000000..29f43fe
--- /dev/null
+++ b/notes_qmd/02_aggregate.qmd
@@ -0,0 +1,621 @@
+---
+title: "Aggregate Module: Spatial Aggregation to Healthsheds"
+execute:
+ freeze: auto
+engine: jupyter
+---
+
+## aggregate
+
+> This module aggregates the downloaded data into the respective output dataframes.
+
+```{python}
+#| default_exp aggregate:
+#
+```
+
+```{python}
+#| hide:
+#
+from nbdev.showdoc import *
+```
+
+We prototyped the code in this module using a Jupyter notebook. The notebook is available in `notes/prototypes/learning_aggregations_w_michelle_20250328.ipynb`. The code in this module is a cleaned-up version of the code in that notebook. The notebook contains additional comments and explanations of the code, which may be helpful for understanding the code in this module.
+
+The basic process is as follows:
+
+1. Load the netCDF data in memory
+2. Statistically aggregate the hourly data to daily data per exposure using resample()
+3. Write out the data to tiff
+4. Read the tiff data back in
+5. Read in the shapefile that defines the healthsheds
+6. Spatially aggregate the exposure data to the healthsheds
+7. Quality check the aggregations
+8. Write out final aggregations to tiff
+
+```{python}
+#| exports:
+#
+import tempfile
+import rasterio
+import hydra
+import argparse
+import os
+
+import pandas as pd
+import geopandas as gpd
+import numpy as np
+import xarray as xr
+import matplotlib.pyplot as plt
+
+from dataclasses import dataclass, field
+from typing import Optional, Tuple
+from pyprojroot import here
+from hydra import initialize, compose
+from omegaconf import OmegaConf, DictConfig
+from tqdm import tqdm
+from math import ceil, floor
+from rasterstats.io import Raster
+from rasterstats.utils import boxify_points, rasterize_geom
+
+try: from era5_sandbox.core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius
+except: from core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius
+```
+
+```{python}
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+```
+
+We're going to write a function that aggregates the data for a single exposure from a file. This file should be the single month data we got from the previous step in the pipeline.
+
+```{python}
+eg_file = here() / "bld/2009_01_nepal.nc"
+```
+
+```{python}
+#| export:
+#
+def resample_netcdf(
+ fpath: str, # Path to the netCDF file.
+ resample: str = "1D", # Resampling frequency (e.g., '1H', '1D')
+ agg_func: callable = np.mean, # Aggregation function (e.g., np.mean, np.sum).
+ time_dim: str = "valid_time", # Name of the time dimension in the dataset.
+ **xr_open_kwargs # keywords for python's xarray module
+ ) -> xr.Dataset:
+ """
+ Resample a netCDF file to a specified frequency and aggregation method.
+
+ Args:
+ fpath (str): Path to the netCDF file.
+ resample (str): Resampling frequency (e.g., '1H', '1D').
+ agg_func (callable): Aggregation function (e.g., np.mean, np.sum).
+
+ Returns:
+ xarray.Dataset: Resampled dataset.
+ """
+
+ ds = xr.open_dataset(fpath, **xr_open_kwargs)
+
+ if callable(agg_func):
+ # Use xarray's reduce method with the callable
+ return ds.resample({time_dim: resample}).reduce(agg_func)
+ else:
+ raise TypeError("agg_func must be a callable function like np.mean, np.max, etc.")
+```
+
+We pull the aggregation function from the config file:
+
+```{python}
+var = 'swvl1'
+agg_func = _get_callable(cfg['aggregation']['aggregation'][var]['hourly_to_daily'][0]['function'])
+```
+
+```{python}
+with ClimateDataFileHandler(eg_file) as handler:
+
+ ds_path = handler.get_dataset("instant")
+ resampled_data = resample_netcdf(ds_path, agg_func=agg_func)
+```
+
+I'm going to use a dataclass to represent the tiff data. This will allow us to easily pass around the data and metadata associated with the tiff file. Why? I've never used dataclasses and I'm curious about them — ChatGPT thinks this will make the code cleaner and easier to read.
+
+```{python}
+#| exports:
+#
+@dataclass
+class RasterFile:
+ path: str
+ band: int # note that this is 1-indexed
+ data: Optional[np.ndarray] = field(default=None, init=False)
+ transform: Optional[rasterio.Affine] = field(default=None, init=False)
+ crs: Optional[str] = field(default=None, init=False)
+ nodata: Optional[float] = field(default=None, init=False)
+ bounds: Optional[Tuple[float, float, float, float]] = field(default=None, init=False)
+
+ def load(self):
+ """Load raster data and basic metadata."""
+ with rasterio.open(self.path) as src:
+ self.data = src.read(self.band) # each day gets one rasterfile
+ self.transform = src.transform
+ self.crs = src.crs
+ self.nodata = src.nodata
+ self.bounds = src.bounds
+ return self
+
+ def shape(self) -> Optional[Tuple[int, int]]:
+ """Return the shape of the raster data."""
+ return self.data.shape if self.data is not None else None
+
+ def __str__(self):
+ return f"RasterFile(path='{self.path}', shape={self.shape()}, crs='{self.crs}')"
+```
+
+Next, a function to write and read the netCDF to tiff:
+
+```{python}
+#| exports:
+#
+def netcdf_to_tiff(
+ ds: xr.Dataset, # The aggregated xarray dataset to convert.
+ band: int, # The day to rasterise; 1 indexed just like human english
+ variable: str, # The variable name to convert.
+ crs: str = "EPSG:4326", # Coordinate reference system (default is WGS84).
+ ):
+
+ """
+ Convert a netCDF file to a GeoTIFF file.
+ """
+
+ with tempfile.TemporaryDirectory() as tmpdirname:
+
+ # Select the variable and time index
+ variable = ds[variable]
+ ds_ = variable.rio.set_spatial_dims(x_dim="longitude", y_dim="latitude")
+ ds_ = ds_.rio.write_crs(crs)
+ # Save as GeoTIFF
+ ds_.rio.to_raster(f"{tmpdirname}/output.tif")
+ # Load the raster file
+ raster_file = RasterFile(path=f"{tmpdirname}/output.tif", band=band).load()
+
+ return raster_file
+```
+
+Now to test it:
+
+```{python}
+with ClimateDataFileHandler(eg_file) as handler:
+ ds_path = handler.get_dataset("instant")
+ resampled_nc = resample_netcdf(ds_path)
+
+print(resampled_nc)
+resampled_tiff = netcdf_to_tiff(
+ ds=resampled_nc,
+ band=28,
+ variable="swvl1",
+ crs="EPSG:4326"
+)
+```
+
+```{python}
+resampled_tiff.data.shape, resampled_tiff.transform, resampled_tiff.crs, resampled_tiff.bounds
+```
+
+Super cool! The tiff file is created and the data is read back in correctly. Now we can move on to the next step, which is to aggregate the data by healthshed.
+
+## Polygon to Raster Cells
+
+This function was initially shared from a previous NSAPH aggregation pipeline [here](https://github.com/NSAPH-Data-Processing/air_pollution__aqdh/blob/2a8109075fe7a8fbf7c435cc34ffa97b63f5e133/utils/faster_zonal_stats.py#L17). To better understand this, here is a ChatGPT explanation of the code:
+
+> This function, `polygon_to_raster_cells`, is doing a crucial first step in spatial alignment: it determines which raster cells are “touched” by each polygon geometry (e.g., administrative areas, watersheds, etc.).
+Essentially, this function helps figure out which pixels from a raster image fall inside each polygon (like a district, region, or shape). It does this by looking at each polygon one by one, zooming in on just the part of the raster that overlaps with that shape, and marking the pixels that are inside. This is kind of like placing a cookie cutter (the polygon) on a pixelated map (the raster) and seeing which pixels get cut.
+The result is a list where each item tells you the pixel locations that match a specific polygon. You can then use those pixel locations to pull out data from the raster, like temperatures or rainfall, and calculate statistics (like the average) for each shape. This is a key step when you want to summarize raster data within specific regions, like figuring out the average temperature in each county or how much vegetation is in each park.
+
+```{python}
+#| exports:
+#
+def polygon_to_raster_cells(
+ vectors, # list of geometries from a shapefile
+ raster, # the raster data as a numpy array
+ nodata=None, # the nodata value of the raster
+ affine=None, # the affine transform of the raster
+ all_touched=False, # whether to include all touched pixels
+ verbose=False,
+ **kwargs,
+) -> list: # A dictionary mapping vector the ids of geometries to locations (indices) in the raster source.
+ """Returns an index map for each vector geometry to indices in the raster source."""
+
+ cell_map = []
+
+ with Raster(raster, affine, nodata) as rast:
+ # used later to crop raster and find start row and col
+ min_lon, dlon = affine.c, affine.a
+ max_lat, dlat = affine.f, -affine.e
+ H, W = rast.shape
+
+ for geom in tqdm(vectors, disable=(not verbose)):
+ if "Point" in geom.geom_type:
+ geom = boxify_points(geom, rast)
+
+ # find geometry bounds to crop raster
+ # the raster and geometry must be in the same lon/lat coordinate system
+ start_row = max(0, min(H - 1, floor((max_lat - geom.bounds[3]) / dlat)))
+ start_col = min(W - 1, max(0, floor((geom.bounds[0] - min_lon) / dlon)))
+ end_col = max(0, min(W - 1, ceil((geom.bounds[2] - min_lon) / dlon)))
+ end_row = min(H - 1, max(0, ceil((max_lat - geom.bounds[1]) / dlat)))
+ geom_bounds = (
+ min_lon + dlon * start_col, # left
+ max_lat - dlat * end_row - 1e-12, # bottom
+ min_lon + dlon * end_col + 1e-12, # right
+ max_lat - dlat * start_row, # top
+ )
+
+ # crop raster to area of interest and rasterize
+ fsrc = rast.read(bounds=geom_bounds)
+ rv_array = rasterize_geom(geom, like=fsrc, all_touched=all_touched)
+ indices = np.nonzero(rv_array)
+
+ if len(indices[0]) > 0:
+ indices = (indices[0] + start_row, indices[1] + start_col)
+ assert 0 <= indices[0].min() < rast.shape[0]
+ assert 0 <= indices[1].min() < rast.shape[1]
+ else:
+ pass # stop here for debug
+
+ cell_map.append(indices)
+
+ return cell_map
+```
+
+To use this, we must define the polygon and raster data. The polygon data is the healthshed shapefile, and the raster data is the tiff file we created earlier. We can use the `GoogleDriver` class we defined in `core` to read in the shapefile.
+
+```{python}
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = driver.get_drive()
+healthsheds = driver.read_healthsheds("Nepal_Healthsheds2024.zip")
+```
+
+```{python}
+res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=resampled_tiff.data, # the raster data above
+ nodata=resampled_tiff.nodata, # any intersections with no data, may have to be np.nan
+ affine=resampled_tiff.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+```
+
+The data below maps which grid entries fall into each of the regions in the shapefile (e.g. which pixel is in which state)
+
+```{python}
+res_poly2cell[:5]
+```
+
+Last but not least, we aggregate these data to the healthshed level. We can use the `rasterstats` package to do this.
+
+```{python}
+#| exports:
+#
+def aggregate_to_healthsheds(
+ res_poly2cell: list, # the result of polygon_to_raster_cells
+ raster: RasterFile, # the raster data
+ shapes: gpd.GeoDataFrame, # the shapes of the health sheds
+ names_column: str = "fs_uid", # the unique identifier column name of the health sheds
+ aggregation_func: callable = np.nanmean, # the aggregation function
+ aggregation_name: str = "mean" # the name of the aggregation function
+ ) -> gpd.GeoDataFrame:
+ """
+ Aggregate the raster data to the health sheds.
+ """
+
+ stats = []
+
+ for indices in res_poly2cell:
+ if len(indices[0]) == 0:
+ # no cells found for this polygon
+ stats.append(np.nan)
+ else:
+ cells = raster.data[indices]
+ if sum(~np.isnan(cells)) == 0:
+ # no valid cells found for this polygon
+ stats.append(np.nan)
+ continue
+ else:
+ # compute MEAN of valid cells
+ # but this stat can be ANYTHING
+ stats.append(aggregation_func(cells))
+
+ # clean up the result into a dataframe
+ stats = pd.Series(stats)
+ shapes[aggregation_name] = stats
+ df = pd.DataFrame(
+ {"healthshed": shapes[names_column], aggregation_name: stats}
+ )
+ gdf = gpd.GeoDataFrame(df, geometry=shapes.geometry.values, crs=shapes.crs)
+ return gdf
+```
+
+And now we apply it:
+
+```{python}
+result = aggregate_to_healthsheds(
+ res_poly2cell=res_poly2cell,
+ raster=resampled_tiff,
+ shapes=healthsheds,
+ names_column="fid",
+ aggregation_func=np.nanmean,
+ aggregation_name="mean_soil_moisture"
+)
+result.head()
+```
+
+And plot for QA:
+
+```{python}
+result.plot(column="mean_soil_moisture", legend=True)
+plt.title("Mean Soil Moisture (m^3 m^-3) by Health Shed Nov 2017 day 1")
+plt.show()
+```
+
+That looks great! The data is aggregated to the healthshed level, and we can see the differences in exposure across the healthsheds. We can also see that the data is not uniform across the healthsheds, which is what we expect.
+
+## Tests and Main
+
+Now we can wrap this up in a main function that will simply take in the input file and generate this output. We can also add some tests to make sure the data is aggregated correctly; tests will run automatically in this notebook.
+
+```{python}
+import random
+```
+
+
+```{python}
+#| eval: false
+
+
+# variables = ["t2m", "d2m"]
+# years = ["20{:02d}".format(m) for m in range(9, 24)]
+# months = [str(m) for m in range(1, 13)]
+# aggregations = [
+# ("Mean", np.nanmean),
+# ("Max", np.nanmax),
+# ("Min", np.nanmin)
+# ]
+
+# exposure_variable = random.choice(variables)
+# year = random.choice(years)
+# month = random.choice(months)
+# aggregation_str, agg_func = random.choice(aggregations)
+# input_file = here() / "data/input/{}_{}.nc".format(year, month)
+
+# with initialize(version_base=None, config_path="../conf"):
+# cfg = compose(config_name='config.yaml')
+
+# driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+# drive = driver.get_drive()
+# healthsheds = driver.read_healthsheds(cfg.GOOGLE_DRIVE_AUTH_JSON.healthsheds_id)
+
+# with ClimateDataFileHandler(input_file) as handler:
+# ds_path = handler.get_dataset("instant")
+# resampled_nc_file = resample_netcdf(ds_path, agg_func=agg_func)
+
+# days = len(resampled_nc_file.valid_time.values)
+# day = random.choice(range(1, days + 1))
+
+# resampled_tiff = netcdf_to_tiff(
+# ds=resampled_nc_file,
+# band=day, # the day we're aggregating
+# variable=exposure_variable,
+# crs="EPSG:4326"
+# )
+
+# res_poly2cell=polygon_to_raster_cells(
+# vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+# raster=resampled_tiff.data, # the raster data above
+# nodata=resampled_tiff.nodata, # any intersections with no data, may have to be np.nan
+# affine=resampled_tiff.transform, # some math thing need to revise
+# all_touched=True,
+# verbose=True
+# )
+
+# result = aggregate_to_healthsheds(
+# res_poly2cell=res_poly2cell,
+# raster=resampled_tiff,
+# shapes=healthsheds,
+# names_column="fs_uid",
+# aggregation_func=agg_func,
+# aggregation_name=exposure_variable
+# )
+
+# result.plot(column=exposure_variable, legend=True)
+# plt.title("{} {} (K) by Health Shed {}".format(aggregation_str, exposure_variable, input_file.stem))
+# plt.suptitle("Aggregation: {}, Day: {}".format(aggregation_str, str(day)))
+# plt.show()
+```
+
+::: {.callout-note}
+**Note:** The above code is commented out to prevent execution during documentation generation. You can uncomment and run it in an appropriate environment to test the aggregation process.
+:::
+
+3.2 seconds per aggregation is pretty cool!
+
+```{python}
+#| eval: false
+result.to_parquet(here() / "data/testing/test_aggregation.parquet")
+```
+
+```{python}
+#| exports:
+#
+def aggregate_data(
+ cfg: DictConfig, # the hydra config
+ input_file: str, # the input netcdf file
+ output_file: str, # the output parquet file
+ exposure_variable: str # Which variable in the dataset to aggregate
+ ) -> None:
+ '''
+ Aggregate raster data day-by-day and store all days and statistics as separate columns in a single Parquet file.
+ '''
+
+ if cfg.development_mode:
+ describe(cfg)
+ return None
+
+ geography = cfg['query'].geography
+ year = cfg['query']['year']
+ month = cfg['query']['month']
+ daily_aggs = cfg['aggregation']['aggregation'][exposure_variable]['hourly_to_daily']
+ healthshed_aggs = cfg['aggregation']['aggregation'][exposure_variable]['daily_to_healthshed']
+
+ # Load healthsheds
+ driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+ drive = driver.get_drive()
+ healthsheds = driver.read_healthsheds(cfg.geographies[geography].healthsheds)
+
+ # Initialize output DataFrame
+ result_df = healthsheds[[cfg.geographies[geography].unique_id, "geometry"]].copy()
+
+ for daily_agg in daily_aggs:
+ print(f"Processing daily aggregation: {daily_agg['name']}...")
+
+ daily_agg_func = _get_callable(daily_agg['function'])
+
+ with ClimateDataFileHandler(input_file) as handler:
+ if exposure_variable in ["t2m", "d2m", "swvl1"]:
+ ds_path = handler.get_dataset("instant")
+ else:
+ ds_path = handler.get_dataset("accum")
+ resampled_nc_file = resample_netcdf(ds_path, agg_func=daily_agg_func)
+
+ for healthshed_agg in healthshed_aggs:
+ print(f"Aggregating to healthshed by: {healthshed_agg['name']}...")
+
+ # Get the number of days in the dataset
+ days = len(resampled_nc_file.valid_time.values)
+
+ # Get the aggregation function for healthshed
+ healthshed_agg_func = _get_callable(healthshed_agg['function'])
+ days = len(resampled_nc_file.valid_time.values)
+
+ for day in range(1, days + 1):
+ print(f"Processing day {day}...")
+
+ day_col = f"day_{day:02d}_daily_{daily_agg['name']}"
+ resampled_tiff = netcdf_to_tiff(
+ ds=resampled_nc_file,
+ band=day,
+ variable=exposure_variable,
+ crs="EPSG:4326"
+ )
+
+ result_poly2cell = polygon_to_raster_cells(
+ vectors=healthsheds.geometry.values,
+ raster=resampled_tiff.data,
+ nodata=resampled_tiff.nodata,
+ affine=resampled_tiff.transform,
+ all_touched=True,
+ verbose=True
+ )
+
+ res = aggregate_to_healthsheds(
+ res_poly2cell=result_poly2cell,
+ raster=resampled_tiff,
+ shapes=healthsheds,
+ names_column=cfg.geographies[geography].unique_id,
+ aggregation_func=healthshed_agg_func,
+ aggregation_name=exposure_variable
+ )
+
+ result_df[day_col] = res[exposure_variable]
+
+ print(f"Saving final monthly parquet file: {output_file}")
+ result_df.to_parquet(output_file, compression="snappy")
+ # return(result_df)
+```
+
+```{python}
+#| eval: false
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode = False
+cfg.query['year'] = 2017
+cfg.query['month'] = 11
+cfg.query['geography'] = "nepal"
+
+variable = "swvl1"
+
+aggregate_data(cfg, here() / "bld/2017_11_nepal.nc", here() / "data/testing/test_nepal_aggregation.parquet", exposure_variable=variable)
+```
+
+```{python}
+#| eval: false
+parquet_file = gpd.read_parquet(here() / "data/testing/test_nepal_aggregation.parquet")
+```
+
+```{python}
+#| eval: false
+parquet_file
+```
+
+```{python}
+#| eval: false
+parquet_file.plot(column="day_22_daily_mean", legend=True)
+```
+
+```{python}
+#| exports:
+#
+@hydra.main(version_base=None, config_path="../../conf", config_name="config")
+def main(cfg: DictConfig) -> None:
+ # Parse command-line arguments
+ input_file = str(snakemake.input[0]) # First input file
+ output_file = str(snakemake.output[0])
+ geography = str(snakemake.params.geography)
+ aggregation_variable = str(snakemake.params.variable)
+
+ variables_dict = {
+ "2m_temperature": "t2m",
+ "2m_dewpoint_temperature": "d2m",
+ "volumetric_soil_water_layer_1": "swvl1",
+ "total_precipitation": "tp"
+ }
+
+ cfg['query']['geography'] = geography
+
+ aggregate_data(cfg, input_file=input_file, output_file=output_file, exposure_variable=variables_dict[aggregation_variable])
+```
+
+```{python}
+#| export:
+#| eval: false
+try: from nbdev.imports import IN_NOTEBOOK
+except: IN_NOTEBOOK=False
+
+if __name__ == "__main__" and not IN_NOTEBOOK:
+ main()
+```
+
+```{python}
+#| hide:
+#
+import nbdev; nbdev.nbdev_export()
+```
\ No newline at end of file
diff --git a/notes_qmd/03_publish.qmd b/notes_qmd/03_publish.qmd
new file mode 100644
index 0000000..5fb502c
--- /dev/null
+++ b/notes_qmd/03_publish.qmd
@@ -0,0 +1,456 @@
+---
+title: "Publish: Gather the Aggregated Data and Publish to DataVerse"
+engine: jupyter
+---
+
+## publish
+
+> This is the `publish` module for the ERA5 dataset pipeline. It defines a functions that make use of the `pyDataverse` library and API to publish our outputs to the Harvard Dataverse.
+
+```{python}
+#| default_exp publish:
+#
+```
+
+```{python}
+#| hide:
+#
+from nbdev.showdoc import *
+```
+
+First, we'll test out the API by pinging the Harvard DataVerse
+
+```{python}
+#| exports:
+#
+import hydra
+import yaml
+import json
+from tqdm import tqdm
+from pyprojroot import here
+```
+
+```{python}
+api_token_file = here() / "sandbox/dataverse_api_key.yml"
+with open(api_token_file, "r") as f:
+ config = yaml.load(f, Loader=yaml.BaseLoader)
+```
+
+Now, following the [docs]() for the dataverse tutorial, load a NativeAPI up:
+
+```{python}
+#| exports:
+#
+from pyDataverse.api import NativeApi
+```
+
+The NativeAPI is a catchall API object to be able to do general stuff:
+
+```{python}
+api = NativeApi(config['base_url'], config['api_token'])
+resp=api.get_info_version()
+#resp.text()
+```
+
+```{python}
+resp.json()
+```
+
+Looks good! Now that we know that it works, we can think more
+about how to publish data there.
+
+## Harvard Dataverse
+
+Let's create a dummy dataset with the components we're
+planning to upload, and then upload and promptly delete it.
+
+To do that, we must import the `models` module and create a Dataset object:
+
+```{python}
+from pyDataverse.models import Dataset
+```
+
+```{python}
+ds = Dataset()
+```
+
+This `ds` object is pretty straightforward since it doesn't contain anything yet:
+
+```{python}
+ds.get()
+```
+
+We can populate the object from the dummy data on the github repo:
+
+```{python}
+from pyDataverse.utils import read_file
+from urllib.request import urlretrieve
+import tempfile
+```
+
+```{python}
+# url for dummy data
+url = "https://raw.githubusercontent.com/gdcc/pyDataverse/refs/heads/main/tests/data/user-guide/dataset.json"
+
+
+with tempfile.NamedTemporaryFile(mode='w+') as tmp:
+ urlretrieve(url, tmp.name)
+ ds.from_json(read_file(tmp.name))
+```
+
+We have to validate the JSON correctly:
+
+```{python}
+ds.validate_json()
+```
+
+Modifying it is easy:
+
+```{python}
+ds.set({"title": "Youth from Austria 2005"})
+ds.get()
+```
+
+Now, to create the dataset we use the API:
+
+```{python}
+#| eval: false
+# this is only run in interactive sessions for demo purposes
+resp = api.create_dataset(":root", ds.json())
+```
+
+If you caught the `resp` object, it contains the PID for the newly created dataset.
+
+However, if you didn't you can use the SearchAPI to find it:
+
+```{python}
+#| exports:
+#
+from pyDataverse.api import SearchApi
+```
+
+```{python}
+search_api = SearchApi(config['base_url'], config['api_token'])
+```
+
+```{python}
+#| eval: false
+#
+
+resp = search_api.search("Youth from Austria", data_type="dataset")
+results = resp.json()['data']['items']
+result = [x for x in results if "Youth from Austria" in x['name']][0]
+result
+```
+
+```{python}
+#| eval: false
+pid = result['global_id']
+```
+
+Now to look at the data we created using the NativeAPI again, and delete the dataset:
+
+```{python}
+#| eval: false
+
+uploaded_ds = api.get_dataset(pid)
+uploaded_ds.json()['data']
+
+resp = api.delete_dataset(pid)
+resp.json()
+```
+
+With that understanding, we can develop a quick module to do the following:
+
+1. Make the dataset LEGO Compatible
+2. Upload and publish the data to dataverse
+
+## LEGO Compatibility
+
+Let's take an example file to use as a model for LEGO compatibility
+
+```{python}
+#| exports:
+#
+import geopandas as gpd
+import pandas as pd
+import re
+import glob
+```
+
+```{python}
+ex = gpd.read_parquet(here() / "bld/2009_06_madagascar_day_swvl1_mean.parquet")
+ex.describe()
+```
+
+We know that the LEGO data model should look like this:
+
+```
+/lego
+├──
+│ ├── __
+│ │ ├── __
+│ │ │ ├── _yyyy.parquet
+```
+
+So, for the above file, we'll end up with the LEGO path `data/environmental/exposures_era5/healthshed_monthly/dewpoint_2024.parquet`. In it, we should have the following columns:
+
+
+```
+healthshed_id year month day stat_1 stat_2 ... stat_n
+```
+
+
+This means we should read in all of the exposures for a single timepoint at once.
+I think the smart thing to do is use a glob string to gather all of the pertinent files.
+This will be the first function we export to the library:
+
+```{python}
+#| exports:
+#
+
+def gather_exposure_geodataframes(
+ glob_string: str, # string for the path to search for the pertinent files
+ polygon_id: str, # the string signifying the healthshed ID of the polygon
+ exposure: str # the exposure name
+ )-> list:
+ "Read in a list of geo dataframes from the same time frame and merge them"
+
+ # first get the initial one so we have the polygon ID and geometry
+ frames = glob.glob(str(glob_string))
+ initial_gdf=gpd.read_parquet(frames[0])
+ merged_df = []
+
+ for f in tqdm(frames, desc="Processing files"):
+ # read in as a regular dataframe by ignoring geometry
+ df = gpd.read_parquet(f).drop(["geometry"], axis=1)
+
+ # get the year and month
+ # Extract year and month
+ search_str = rf'_{exposure}_(\d{{4}})_(\d{{1,2}})\.parquet$'
+ match = re.search(search_str, f)
+
+ if match:
+ year = int(match.group(1))
+ month = int(match.group(2))
+ #print(f"Year: {year}, Month: {month}")
+ else:
+ raise ValueError(f"Could not extract year and month from filename: {search_str} {f}")
+
+ df['exposure'] = exposure
+ df['month'] = month
+ df['year'] = year
+
+ # Step 1: Melt all day columns (leave 'month' and 'year' as identifiers)
+ df_long = df.melt(id_vars=[polygon_id, "exposure", "year", "month"], var_name="day_stat", value_name="value")
+
+ # Step 2: Extract day and stat type from column names
+ # Example column: "day_01_daily_mean"
+ df_long[["day", "stat"]] = df_long["day_stat"].str.extract(r"day_(\d{2})_daily_(mean|max|min|total)")
+
+ # Optional: convert 'day' and month to integer
+ df_long["day"] = df_long["day"].astype(int)
+ df_long["month"] = df_long["month"].astype(int)
+
+ # Drop the original combined column
+ df_long = df_long.drop(columns="day_stat")
+
+ # Reorder columns
+ df_long = df_long[[polygon_id, "exposure", "year", "month", "day", "stat", "value"]]
+
+ df_long = df_long.sort_values(by=["year", "month", "day"])
+ df_clean = df_long.pivot(index=[polygon_id, "exposure", "year", "month", "day"], columns="stat", values="value").reset_index()
+ merged_df.append(df_clean)
+
+ return [pd.concat(merged_df).reset_index(drop=True), initial_gdf[[polygon_id, "geometry"]]]
+```
+
+```{python}
+frames = here() / "data" / "testing" / "*madagascar*"
+
+merged = gather_exposure_geodataframes(frames, "fs_uid", "2m_dewpoint_temperature")
+merged[0].describe()
+```
+
+This returns one file with all of the geometries and one file
+with the statistics and exposures.
+
+Now, with this, we can move on. The dataset was created in the UI and is available via search and test out how to upload it:
+
+```{python}
+resp = search_api.search("ERA5", data_type="dataset")
+
+results = resp.json()['data']['items']
+
+result = [x for x in results if "ERA5" in x['name']][0]
+era5_pid = result['global_id']
+result
+```
+
+```{python}
+#| exports:
+#
+
+from pyDataverse.models import Datafile
+import os
+import pathlib
+```
+
+We'll upload directly from file. In the case of ERA5 vs. LEGO, we
+store the file on disk as LEGO hierarchy, but to upload it to dataverse
+using a flat filename (since creating subdatasets to represent directories might be
+a bit of a hassle)
+
+```{python}
+# assuming the file has a path on disk like:
+f_out = "environmental/exposures_era5/healthshed_daily/dewpoint_2024.parquet"
+os.makedirs(here() / "data" / "testing" / os.path.dirname(f_out), exist_ok=True)
+aggregations, geo = merged
+aggregations.to_parquet(here() / "data" / "testing" / f_out, index=False)
+
+datafile = Datafile()
+datafile.set({
+ # the id of the era5 dataset
+ "pid": era5_pid,
+ # the path to the file on disk goes here
+ "filename": str(here() / "data" / "testing" / f_out),
+ # use the "label" to name the file
+ "label": f_out.replace("/", "-")
+})
+```
+
+```{python}
+#| eval: false
+resp = api.upload_datafile(era5_pid, str(here() / "data" / "testing" / f_out), datafile.json())
+```
+
+Pretty simple!
+
+Now, we just need a main function to upload this data. The final upload is one file per
+exposure per year, so these should be the variables we gather data for.
+
+We should get some functionality to gather the groups of these files automatically, based on
+the hydra config:
+
+```{python}
+#| exports:
+#
+from hydra import initialize, compose
+from omegaconf import OmegaConf, DictConfig
+from tqdm import tqdm
+```
+
+```{python}
+target_dir = here() / "data" / "intermediate"
+
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+cfg.development_mode = False
+#cfg.query['year'] = 2017
+#cfg.query['month'] = 11
+#cfg.query['geography'] = "nepal"
+```
+
+```{python}
+#| exports:
+#
+
+@hydra.main(version_base=None, config_path="../../conf", config_name="config")
+def main(cfg: DictConfig) -> None:
+
+ variables_dict = {
+ "2m_temperature": "t2m",
+ "2m_dewpoint_temperature": "d2m",
+ "volumetric_soil_water_layer_1": "swvl1",
+ "total_precipitation": "tp"
+ }
+
+ print(OmegaConf.to_yaml(cfg))
+
+ #prep dataverse
+ api_token_file = here() / "sandbox/dataverse_api_key.yml"
+ with open(api_token_file, "r") as f:
+ apiconfig = yaml.load(f, Loader=yaml.BaseLoader)
+ api = NativeApi(apiconfig['base_url'], apiconfig['api_token'])
+ search_api = SearchApi(apiconfig['base_url'], apiconfig['api_token'])
+ resp = search_api.search("ERA5", data_type="dataset")
+
+ results = resp.json()['data']['items']
+
+ result = [x for x in results if "ERA5" in x['name']][0]
+ era5_pid = result['global_id']
+
+ for geography in cfg.geographies:
+ for year in cfg.query['year']:
+ for variable, v in variables_dict.items():
+
+ print(f"Processing {geography} for {variable} in {year}")
+ glob_string = here() / "data" / "intermediate" / f"*{geography}*{variable}*{year}*"
+ print(f"Glob: {glob_string}")
+ polygon_id = cfg.geographies[geography]['unique_id']
+ print(f"polygon_id: {polygon_id}")
+ merged = gather_exposure_geodataframes(glob_string, polygon_id, variable)
+ print(merged[0].head())
+ print(merged[1].head())
+
+ output_dir = here() / "data" / "output"
+
+ f_out = f"environmental/exposures_era5/healthshed_daily/{geography}_{v}_{year}.parquet"
+ os.makedirs(output_dir / os.path.dirname(f_out), exist_ok=True)
+ output_path = output_dir / f_out
+
+ print(f"Writing to {output_path}")
+ merged[0].to_parquet(output_path, index=False)
+
+
+ print(f"Uploading {f_out.replace('/', '-')} to Dataverse...")
+ # upload to dataverse
+ datafile = Datafile()
+ datafile.set({
+ "pid": era5_pid,
+ "filename": str(output_path),
+ "label": f_out.replace("/", "-")
+ })
+
+ resp = api.upload_datafile(era5_pid, output_path, datafile.json())
+ assert resp.json()['status'] == "OK", f"Failed to upload datafile: {resp.text}"
+
+ # also save the geometry for the region
+ merged[1].to_parquet(output_path.parent / f"{geography}_geometry.parquet", index=False)
+
+ # and upload it to dataverse
+ datafile = Datafile()
+ datafile.set({
+ "pid": era5_pid,
+ "filename": str(output_path.parent / f"{geography}_geometry.parquet"),
+ "label": f"{geography}_geometry.parquet"
+ })
+
+ resp = api.upload_datafile(era5_pid, output_path.parent / f"{geography}_geometry.parquet", datafile.json())
+ assert resp.json()['status'] == "OK", f"Failed to upload geometry datafile: {resp.text}"
+
+ print("All files processed and uploaded successfully.")
+
+```
+
+```{python}
+#| export:
+#| eval: false
+try: from nbdev.imports import IN_NOTEBOOK
+except: IN_NOTEBOOK=False
+
+if __name__ == "__main__" and not IN_NOTEBOOK:
+ main()
+```
+
+```{python}
+#| hide:
+#
+import nbdev; nbdev.nbdev_export()
+```
\ No newline at end of file
diff --git a/notes_qmd/10_pytask_demo.qmd b/notes_qmd/10_pytask_demo.qmd
new file mode 100644
index 0000000..1757558
--- /dev/null
+++ b/notes_qmd/10_pytask_demo.qmd
@@ -0,0 +1,279 @@
+---
+title: "Demo: How to Create Pipelines with `pytask`"
+engine: jupyter
+---
+
+## Data Preparation Demo
+
+> Data preparation task for `pytask` demo
+
+In this notebook, we are demonstrating how to convert our snakemake workflow into a `pytask` workflow. We use the basic tutorial to demonstrate this, but continue
+to use nbdev for development of functions in notebooks.
+
+`pytask` is a task management system that allows you to define tasks and their dependencies, similar to `Snakemake`. It is particularly useful for data science workflows.
+
+There are a number of reasons to use `pytask` over `snakemake`:
+- **Pythonic**: `pytask` is designed to be purely Pythonic by default, allowing you to write tasks and entire pipelines as Python functions.
+- **Flexibility**: `pytask` allows you to define tasks and their dependencies in a more flexible way, using Python functions and decorators, as opposed to orchestrating numerous scripts.
+- **Integration**: `pytask` integrates well with other Python libraries, such as `nbdev` here, or `hydra` configurations if you need, allowing you to use your existing code, notebooks, or configs in your workflows.
+- **Parallelism**: `pytask` supports parallel execution of tasks with `pytask-parallel`, which can speed up your workflows significantly, especially for data processing tasks.
+
+We'll use nbdev to define the task functions, and then export them to the `src` directory. `pytask` is then invoked at the command line to run the tasks.
+
+```{python}
+#| default_exp task_data_preparation:
+#
+```
+
+This demo task is taken from the tutorial at [pytask documentation](https://pytask-dev.readthedocs.io/en/stable/tutorials/write_a_task.html). At minimum, you need your package to contain the following in a config.py file:
+
+```md
+my_project
+│
+├───.pytask
+│
+├───bld
+│ └────...
+│
+├───src
+│ └───my_project
+│ ├────__init__.py
+│ ├────config.py
+│ └────...
+│
+└───pyproject.toml
+```
+
+```python
+#contents of `era5_sandbox.config` module
+from pathlib import Path
+
+
+SRC = Path(__file__).parent.resolve()
+BLD = SRC.joinpath("..", "..", "bld").resolve()
+```
+
+Additionally, your pyproject.toml file should contain the following at minimum:
+
+```toml
+[tool.pytask.ini_options]
+paths = ["src/era5_sandbox"]
+```
+
+The former tells Python where to find the source code and build directory for `pytask` objects and shims, while the latter tells `pytask` where to find the task definitions and dependency DAG.
+
+```{python}
+#| exports:
+#
+import os
+from pathlib import Path
+from typing import Annotated
+
+import numpy as np
+import matplotlib.pyplot as plt
+import pandas as pd
+from era5_sandbox.config import BLD
+from era5_sandbox.config import data_catalog, demo_catalog
+
+from pytask import PickleNode
+from pytask import Product
+```
+
+
+### Defining Tasks
+
+To define a task, simply use the `task_` prefix in the function name (or, if you are familiar and comfortable with decorators, use `@pytask.mark.task`). Be verbose and expressive in your use of type hints to specify the input and output data, so that `pytask` can automatically detect and handle the dependencies between tasks.
+
+### Defining Tracked Outputs
+
+To define something as a tracked output, you can annotate the input of the task with `Annotated[Path, Product]`, where `Product` is imported from `pytask`. This tells `pytask` that this is a product of the task and should be saved in the build directory.
+
+In this example, we're generating random data into a data frame and saving the object as a pickle in the `bld` directory (`bld` is the default build directory for `pytask`'s intermediate data). To get that directory, we use the `BLD` variable from the `era5_sandbox.config` module as above. This module itself could also be generated using `nbdev` if you want to keep your configuration in notebooks.
+
+Using `nbdev`, we can also include all of the bells and whistles of function documentation.
+
+```{python}
+#| exports:
+#
+
+def task_create_random_data(
+ seed: Annotated[int, 42], # Default seed for reproducibility
+ path_to_data: Annotated[Path, Product] = BLD / "data.pkl" # Path to the object in the build directory
+ ) -> None:
+ "Create a random data set and save it as a pickle file. Return the path to the saved file."
+ rng = np.random.default_rng(seed)
+ beta = 2
+
+ x = rng.normal(loc=5, scale=10, size=1_000)
+ epsilon = rng.standard_normal(1_000)
+
+ y = beta * x + epsilon
+
+ df = pd.DataFrame({"x": x, "y": y})
+
+ # this is a tracked output, so we annotate the return value with `Annotated[Path, Product]`
+ df.to_pickle(path_to_data)
+```
+
+We can test the function directly in the notebook:
+
+```{python}
+task_create_random_data(42)
+```
+
+Once this module and function are exported with `nbdev_export`, the functions are in a python package. We can then use the command line to look at the registered tasks:
+
+```{python}
+#| eval: false
+
+%%sh
+pytask collect
+```
+
+Let's add another task in the same module. This task plots the data we generated. To link the previous task to this one as a dependency, we can list the output of the previous task as an input to this one. This way, `pytask` will know that it needs to run the first task before this one.
+
+```{python}
+#| exports:
+#
+
+def task_plot_data(
+ path_to_data: Annotated[Path, BLD / "data.pkl"], # Path to the data file created by the previous task
+ path_to_plot: Annotated[Path, Product] = BLD / "plot.png" # Path to the build directory for the plot
+) -> None:
+ """
+ Plot the data from the pickle file and save the plot. Note that this task:
+ 1. depends on the data.pkl file created by the previous task,
+ 2. does not return any value, but saves a plot to the build directory. So the side effect of the task is what we are interested in here (though this is probably bad practice).
+ """
+
+ df = pd.read_pickle(path_to_data)
+
+ _, ax = plt.subplots()
+ df.plot(x="x", y="y", ax=ax, kind="scatter")
+
+ plt.savefig(path_to_plot)
+ plt.close()
+```
+
+We now have a DAG of tasks that `pytask` can execute. To see the tasks, we can use the command line to create a pygraphviz graph of the tasks:
+
+```bash
+pytask dag
+```
+
+The DAG is saved as a pdf file, and you can view it using any viewer. Now, to run the pipeline, just invoke `pytask` at the command line:
+
+```bash
+pytask
+```
+
+In Jupyter or iPython, you can interact with the task outputs directly:
+
+```{python}
+#| eval: false
+
+# list all the files in the build directory
+for file in os.listdir(BLD):
+ print(file)
+```
+
+We can use these to build subsequent tasks later.
+
+## More Complex Tasks & The Data Catalog
+
+As we define more complex tasks, we can use the `pytask` data catalog to manage the inputs and outputs of our tasks. The data catalog allows us to imperatively name the data and their formats, making it easier to manage the data flow in our tasks. Importantly, we can define the data pythonically, which allows us to use the full power of Python to manipulate and transform our data. This is particularly more useful than snakemake's approach, which requires you to define the data in a more static way using paths and a separate pseudo-language.
+
+The content of the `era5_sandbox.config` module can be extended to include a data catalog:
+
+```python
+from pathlib import Path
+from pytask import DataCatalog, Product
+
+SRC = Path(__file__).parent.resolve()
+BLD = SRC.joinpath("..", "..", "bld").resolve()
+
+demo_catalog = DataCatalog()
+```
+
+With just this definition, we're now able to refer directly to data by name in our tasks, and `pytask` will handle the paths and formats for us. This allows us to focus on the logic of our tasks rather than the details of data management.
+
+:::{.callout-note}
+This is a major advantage of `pytask` over `snakemake`, as it allows you to define the data in a more flexible and Pythonic way, while still maintaining the benefits of a task management system. It is a similar approach to building pipelines in R with targets, which allows you to define the data in a more flexible way.
+:::
+
+Let's create a task that modifies the data frame by adding a new column. This task will depend on the previous task's output, and we will use the data catalog to define the input and output data.
+
+```{python}
+#| exports:
+#
+
+def task_add_one(
+ path_to_data: Annotated[Path, BLD / "data.pkl"], # Path to the data file created by the previous task
+ node: Annotated[PickleNode, Product] = demo_catalog["mydata"]
+) -> None:
+ """
+ Add one to the 'y' column of the data frame and save it as a new pickle file.
+ """
+ df = pd.read_pickle(path_to_data)
+ df['z'] = df['y'] + 1
+
+ node.save(df)
+```
+
+In this function, we've defined that the task relies on the output of the first task being there, the `data.pkl` file. But importantly, we've also defined our product as a `node` from the `PickleNode` module. This will allow `pytask` to handle the serialization and deserialization of the data frame automatically, so we don't have to worry about the details of how the data is stored. We create the datacatalog in our config file, and then tell this task to create a Node in that catalog called `mydata`. Whatever we save with the `node.save()` method will be saved in the build directory, but more importantly _will be indexed and hashed by `pytask`_. This means that if the data changes, `pytask` will know to rerun the task.
+
+To make this even more pythonic, we can modify the format of our task function so that the return type annotator is used as a node in the data catalog. This allows us to define the output of the task as a `PickleNode`, which will automatically handle the serialization and deserialization of the data frame.
+
+:::{.callout-note}
+This is another trick I'm deriving from {targets}. By formatting tasks as pure functions where inputs are parameters and targets are return type annotations, we can define the output of the task as a `PickleNode`, which will automatically handle the serialization and deserialization of the data frame. This again allows us to focus on the logic of our tasks rather than the details of data management.
+:::
+
+So below, we're directly accessing the `data_catalog` to get the `mydata` node, and then modifying it by adding a new column. It _feels_ like we are doing this in place, such as in an iPython session, because we are allowing `pytask` to handle the serialization of the file on disk for us.
+
+```{python}
+#| exports:
+#
+
+def task_add_another_column(
+ df: Annotated[pd.DataFrame, demo_catalog["mydata"]] # which object in the catalog to fetch from the catalog with node.load()
+) -> Annotated[pd.DataFrame, demo_catalog["mydata2"]]: # which object in the catalog to save the return value to
+ """
+ Add another column to the data frame stored in the PickleNode.
+ """
+
+ # use the datacatalog directly to access the node
+ # this is a bit like accessing the node in an iPython session, but pytask
+ # will handle the serialization and deserialization for us
+ df['w'] = df['z'] * df['y']
+
+ return df
+```
+
+To test this interactively, we'd have to import the data catalog's object
+
+```{python}
+df = demo_catalog["mydata"].load() # load the data frame from the PickleNode
+result = task_add_another_column(df) # call the task function with the loaded data frame
+```
+
+```{python}
+result
+```
+
+Now that we know it will work, we can invoke pytask:
+
+```{python}
+#| eval: false
+%%sh
+pytask
+```
+
+Notice that the outputs are cached and not recomputed unless the inputs change. This is a key feature of `pytask` and other DAGs, allowing you to efficiently manage your data processing tasks without unnecessary recomputation.
+
+## Conclusion
+
+The takeaway here is that with `pytask`, you can define pure functions that take inputs and return outputs, and build a DAG of tasks that can be executed in a flexible and efficient way. This allows you to focus on the logic of your tasks rather than the details of data management, while still maintaining the benefits of a task management system. The key elements are:
+
+- **Task annotation**: You define your tasks by creating pure functions that take inputs and return outputs, and use decorators or naming conventions to mark them as "tasks" in a dag
+- **Input and output annotation**: You define the inputs and outputs of your tasksusing type hints, and allow `pytask` to automatically detect and handle the dependencies between tasks.
+- **Data catalog**: You define your data in a Pythonic object in your config called `data_catalog`. As you iteratively develop your DAG, you add objects to the data catalog, which are called nodes. As long as a node is a pythonic object and has a pickle method, `pytask` will handle the serialization and deserialization of the data for you.
\ No newline at end of file
diff --git a/notes_qmd/20_pytask_config.qmd b/notes_qmd/20_pytask_config.qmd
new file mode 100644
index 0000000..0aff0fb
--- /dev/null
+++ b/notes_qmd/20_pytask_config.qmd
@@ -0,0 +1,332 @@
+---
+title: "`pytask` Config: Defining the Pipeline Internals in `pytask`"
+engine: jupyter
+---
+
+## config
+
+> This is the config module for the `pytask` pipeline.
+This module defines the data catalog(s) and any hard-coded parameters that are used throughout the pipeline.
+
+```{python}
+#| default_exp config:
+#
+```
+
+```{python}
+#| hide:
+#
+from nbdev.showdoc import *
+```
+
+```{python}
+#| exports:
+#
+
+import pandas as pd
+
+from pathlib import Path
+from pyprojroot import here
+from pytask import DataCatalog
+
+
+SRC = here() / "src" / "era5_sandbox"
+BLD = here() / "bld"
+
+demo_catalog = DataCatalog()
+```
+
+## `DEV_MODE`: A Quick Development Flag
+
+I'm adding a flag to the config that can be used for quick development.
+If you import this boolean variable, it can be used to skip tasks,
+setup samples, etc. on the fly by `marking` a task with the `pytask.mark.skipif`
+decorator. Change this to `False` when you're ready to run the full pipeline.
+
+```{python}
+#| exports:
+#
+DEV_MODE=True
+```
+
+## The Data Catalog
+
+To manage our pipeline, we're going to use a nested data catalog structure.
+This way, we can easily return specific entries to specific tasks
+without having to manage multiple different data catalogs. Specifically,
+we'll have a data catalog for each stage of the pipeline, and each catalog
+will have entries for the inputs, outputs, and any other parameters needed
+for that stage. This is similar to how we used Hydra configs, but
+using the `pytask` data catalog, we can more easily gather the data
+for a specific task in structured manner entirely in Python.
+
+```{python}
+#| exports:
+#
+
+stages = ["mydata", 'mydata2', # from the demo, ignore
+ "download", # download task
+ "aggregate", # aggregation task
+ "publish", # publishing task
+ "viz"] # visualization task
+
+buckets = [
+ "inputs", # any specific inputs, eg for carrying over between tasks
+ "outputs", # specific output task returns
+ "jobs", # job parameters as a dataframe
+ "params" # any lingering hardcoded parameters
+ ]
+
+data_catalog = {
+
+ stage: {bucket: DataCatalog(name=f"{stage}_{bucket}") for bucket in buckets}
+ for stage in stages
+}
+```
+
+
+## The Download Task
+
+A good strategy may be to set pipeline stage parameters in the config file,
+and then use the `pytask` data catalog to manage the data. This way, we can
+easily change the parameters without having to modify the code. This is especially
+useful for the API query, where we need to be able to set the parameter grid for
+the years and data types we want to download data for. So, let's create an entry in the data catalog specifically for the download task.
+
+A good strategy I thought about for grid parameter comprehension is to create a dataframe expands all the combinations of
+parameters, and then uses each combination to create the tasks which are then
+easily added to the data catalog. This way, we can still easily inspect the
+pipeline and see what tasks are being run, while also being able to easily
+change the parameters in the config file without too much hassle.
+
+An important framework decision I'm making here is that each ROW of the dataframe corresponds to a single task, so that we can quickly understand at a glance what the task is doing, and also easily develop the code for the task itself. This is different from the hydra approach where a job is first specified by a default config, and then the parameters are swept over in multiple config files. This is a more flexible approach, IMO, because:
+
+1. each row defines a single task run, so it's easy to understand what the run is doing
+2. it's easy to add or remove runs by simply expanding the list of parameters and using dataframe filters to remove irrelevant parameter combinations
+3. we don't have to independently inspect and manage multiple different/overriding config files
+4. it's all in Python, so we can use the full power of the language to define
+ the parameters and the tasks in a single sweep, not through the need of
+ hydra+snakemake multi stage/multi-lingual config system
+
+So, to do this, we define one job as a query to the CDS API that must contain:
+- The dataset (re-analysis)
+- The year
+- The month
+- All days in the month
+- All times of day (hour)
+- The geography (region), which will need:
+ - The URL to the shapefile to calculate the bounding box
+
+Given one combination of all of these, a single SLURM job can complete the first "task" in parallel by having a run assigned to each row of the dataframe.
+
+```{python}
+#| exports:
+
+# a dataframe for the query parameters, with nested entries for days, times, and variables
+# Dimensions
+years = [str(x) for x in range(2009, 2025)] # 16 years
+months = [str(x).zfill(2) for x in range(1, 13)] # 12 months
+geographies = ["madagascar", "nepal"] # 2 geographies
+
+# nested values; we want ALL days, times, and variables for each job
+days = [str(x).zfill(2) for x in range(1, 32)]
+times = [f"{x:02d}:00" for x in range(24)]
+variables = ["2m_dewpoint_temperature", "2m_temperature", "total_precipitation", "volumetric_soil_water_layer_1"]
+
+product_type = "reanalysis"
+
+# Map shapefiles to geography
+shapefiles = {
+ "madagascar": "https://data.humdata.org/dataset/26fa506b-0727-4d9d-a590-d2abee21ee22/resource/ed94d52e-349e-41be-80cb-62dc0435bd34/download/mdg_adm_bngrc_ocha_20181031_shp.zip",
+ "nepal": "https://data.humdata.org/dataset/07db728a-4f0f-4e98-8eb0-8fa9df61f01c/resource/2eb4c47f-fd6e-425d-b623-d35be1a7640e/download/npl_adm_nd_20240314_ab_shp.zip"
+}
+
+# Build row-wise combinations of (year, month, geography)
+rows = []
+for year in years:
+ for month in months:
+ for geo in geographies:
+ rows.append({
+ "year": year,
+ "month": month,
+ "geography": geo,
+ "shapefile": shapefiles[geo],
+ "product_type": product_type,
+ "day": days,
+ "time": times,
+ "variables": variables,
+ "output": f"{year}_{month}_{geo}"
+ })
+
+# Create dataframe
+query_df = pd.DataFrame(rows)
+```
+
+```{python}
+query_df
+```
+
+```{python}
+print(f"Number of estimated jobs: {query_df.shape[0]}. Examples...")
+
+for i, row in query_df.sample(3).iterrows():
+ print(f"Year: {row['year']}, Month: {row['month']}, Geography: {row['geography']}, Link: {row['shapefile']}, Variables: {row['variables']}")
+```
+
+Now add them to the catalog. We're going to use a dictionary to
+nest data catalogs so that we can return specific task products to
+named data catalog nodes.
+
+```{python}
+#| export:
+# set up catalog
+
+data_catalog['download']['jobs'].add("queries_df", query_df)
+```
+
+Our data catalog now has a `download|jobs` node with a `queries_df` entry that contains the dataframe of all the jobs to be run in this task.
+
+```{python}
+data_catalog['download']['jobs']['queries_df'].load().head()
+```
+
+## The Aggregation Task
+
+To carry out the aggregation, we will follow similar logic to the original pipeline and use xarray to aggregate data into spatial and temporal averages. The aggregation task will take the downloaded data and compute the mean over the specified time period and spatial region. However, in this case, we want to aggregate the data diurnally, so we will need to fetch the sundown and sunrise times for the region and use them to compute the diurnal averages.
+
+Once again, we will use a dataframe to define the parameters for the aggregation task.
+
+Here we will use a dataframe with the jobs as rows;
+the first column is "input" which is the list of query names from
+the download task, and the last column is the output object name. Columns
+in between can be the parameters needed for the aggregation task, which
+then get expanded to the full list of jobs with `itertools.product`, `explode` or similar,
+and filtered as necessary.
+
+For explanations of the parameters, see the Aggregation Task notebook's final `task_aggregate_data_diurnal` function.
+
+```{python}
+#| exports:
+
+# aggregate task parameters
+
+inputs = query_df["output"].tolist()
+outputs = [f"{i}_agg" for i in inputs]
+
+variable_dict = {
+ "2m_dewpoint_temperature": "d2m",
+ "2m_temperature": "t2m",
+ "total_precipitation": "tp",
+ "volumetric_soil_water_layer_1": "swvl1"
+}
+
+# list of params that get fed into the task functions
+agg_params = {
+ "time": ["day", "night"],
+ "solar_classification": ["before"],
+ "variables": variables,
+ "variables_short": [variable_dict[x] for x in variables],
+ "aggregation_name": ["mean", "sum", "max", "min"]
+}
+
+from itertools import product
+import pandas as pd
+
+# expand all the params
+agg_params = pd.DataFrame(list(product(*agg_params.values())), columns=agg_params.keys())
+```
+
+Inspecting it:
+
+```{python}
+agg_params
+```
+
+Let's keep only rows where the variables and variables_short match
+
+```{python}
+#| exports:
+# quick filter to keep only matching rows
+
+agg_params = agg_params[agg_params.apply(lambda x: variable_dict[x['variables']] == x['variables_short'], axis=1)]
+```
+
+```{python}
+agg_params
+```
+
+Great, and now keeping `sum` only for total precipitation (we don't need mean, max, min for that variable), and removing `sum` for all other variables (we don't need sum for temperature or soil moisture):
+
+```{python}
+#| exports:
+# remove rows where tp aggregation is not sum
+mask = (agg_params['variables_short'] == "tp") & (agg_params['aggregation_name'] != "sum")
+agg_params = agg_params[~mask]
+
+# remove rows where non-tp aggregation is sum
+mask = (agg_params['variables_short'] != "tp") & (agg_params['aggregation_name'] == "sum")
+agg_params = agg_params[~mask]
+```
+
+```{python}
+agg_params
+```
+
+Now we add the input and output columns by joining:
+
+```{python}
+#| exports:
+# set up inputs and parameters
+inputs = pd.DataFrame({"input": inputs})
+aggregate_jobs = inputs.merge(agg_params, how="cross")
+```
+
+This result gives us the full list of jobs for the aggregation task. 20 rows for the parameters,
+and 384 inputs/outputs, giving a total of 7680 jobs:
+
+```{python}
+assert aggregate_jobs.shape[0] == 20 * len(inputs)
+aggregate_jobs
+```
+
+A few more configuration items need to be added, like
+the local timezone for each geography, the healthshed filename,
+the healthshed unique ID variable name in the shapefile,
+and whether the variable is instantaneous or accumulated:
+
+```{python}
+#| exports:
+# add a few more columns
+aggregate_jobs['local_tz'] = aggregate_jobs['input'].apply(
+ lambda x: "Asia/Kathmandu" if "nepal" in x else "Indian/Antananarivo"
+)
+aggregate_jobs['shapefile'] = aggregate_jobs['input'].apply(
+ lambda x: "Nepal_Healthsheds2024.zip" if "nepal" in x else "healthsheds2022.zip"
+)
+
+aggregate_jobs['hshd_unique_id'] = aggregate_jobs['input'].apply(
+ lambda x: "fid" if "nepal" in x else "fs_uid"
+)
+
+aggregate_jobs['climate_handler_var'] = aggregate_jobs['variables_short'].apply(
+ lambda x: "accum" if x == "tp" else "instant"
+)
+```
+
+```{python}
+aggregate_jobs
+```
+
+Now we add this to the data catalog:
+
+```{python}
+#| exports:
+# update catalog
+data_catalog['aggregate']['jobs'].add("jobs_df", aggregate_jobs)
+```
+
+Our data catalog now has an `aggregate|jobs` node with a `jobs_df` entry that contains the dataframe of all the jobs to be run in this task.
+
+```{python}
+data_catalog['aggregate']['jobs']['jobs_df'].load().head()
+```
\ No newline at end of file
diff --git a/notes_qmd/20_pytask_logger.qmd b/notes_qmd/20_pytask_logger.qmd
new file mode 100644
index 0000000..430715f
--- /dev/null
+++ b/notes_qmd/20_pytask_logger.qmd
@@ -0,0 +1,57 @@
+---
+title: "Logging: A simple logger to inject into `pytask` jobs"
+engine: jupyter
+---
+
+## logger
+
+> A simple logger module for the pytask tasks
+
+```{python}
+#| default_exp pytask_logger:
+#|
+```
+
+```{python}
+#| hide:
+# showdoc
+from nbdev.showdoc import *
+```
+
+```{python}
+#| exports:
+# imports
+
+import logging
+from pathlib import Path
+from pyprojroot import here
+from datetime import datetime
+
+LOG_DIR = here("logs")
+# get the date & time for the log file name
+log_date = datetime.now().strftime("%Y-%m-%d")
+log_time = datetime.now().strftime("%H-%M-%S")
+LOG_DIR = here("logs") / log_date / log_time
+
+```
+
+```{python}
+#| exports:
+# main function to setup a logger
+
+
+
+def setup_logger(name: str, log_path: Path=LOG_DIR, level=logging.INFO) -> logging.Logger:
+ log_path.mkdir(parents=True, exist_ok=True)
+ formatter = logging.Formatter('%(asctime)s — %(name)s — %(levelname)s — %(message)s')
+
+ handler = logging.FileHandler(log_path / f"{name}.log", mode='a')
+ handler.setFormatter(formatter)
+
+ logger = logging.getLogger(name)
+ logger.setLevel(level)
+ logger.addHandler(handler)
+ logger.propagate = False
+
+ return logger
+```
\ No newline at end of file
diff --git a/notes_qmd/21_pytask_download.qmd b/notes_qmd/21_pytask_download.qmd
new file mode 100644
index 0000000..85f2e20
--- /dev/null
+++ b/notes_qmd/21_pytask_download.qmd
@@ -0,0 +1,170 @@
+---
+title: "Download: `download` Module as a `pytask` Task"
+engine: jupyter
+---
+
+## task_download
+
+> This module downloads the raw era5 data from the CDS API. It is similar to the original script, refactored for `pytask`.
+
+```{python}
+#| default_exp task_download:
+#|
+```
+
+```{python}
+#| hide:
+# showdoc
+from nbdev.showdoc import *
+```
+
+We're going to quickly refactor the pipeline to use pytask instead of hydra and snakemake. This will hopefully demonstrate a simpler and more flexible way to manage data pipelines in Python.
+
+To start off, we need to create a function that queries the CDS API with one job. This function will be used to download the data for each query in the range specified in the data catalog in the config file.
+
+Let's take a look at the data catalog we created in the config module:
+
+```{python}
+#| export:
+# necessary imports
+import cdsapi
+import pytask
+import os
+from pytask import task, Product
+from pathlib import Path
+from typing import Annotated
+from pandas import Series
+
+from era5_sandbox.config import data_catalog
+from era5_sandbox.config import BLD
+from era5_sandbox.config import DEV_MODE
+from era5_sandbox.pytask_logger import setup_logger
+from era5_sandbox.download import fetch_GADM, create_bounding_box
+
+```
+
+You can see the queries entry we created in the data catalog. Each query is a row of a dataframe that contains the parameters for the CDS API query.
+
+```{python}
+queries = data_catalog['download']['jobs']['queries_df'].load()
+queries
+```
+
+We can test this query like we did in the original work:
+
+
+```{python}
+example_query = queries.iloc[0]
+
+create_bounding_box(example_query['shapefile'])
+```
+
+In this way, we have a similar approach as Hydra configs, but, using the `pytask` data catalog, we can more easily gather the data for a specific task in structured manner entirely in Python.
+
+```{python}
+#| eval: false
+
+client = cdsapi.Client()
+
+ex_bounding_box = create_bounding_box(example_query['shapefile'])
+
+request = {
+ "product_type": example_query['product_type'],
+ "variable": example_query['variables'],
+ "year": str(example_query['year']),
+ "month": str(example_query['month']),
+ "day": example_query['day'],
+ "time": example_query['time'],
+ "data_format": "netcdf",
+ "download_format": "unarchived",
+ "area": ex_bounding_box
+ }
+
+target = f"{example_query['output']}.nc"
+
+client.retrieve("reanalysis-era5-single-levels", request).download(target)
+```
+
+This works! So now we just need to create a `task_` function that pytask will recognise to parallelise the download of queries over:
+
+```{python}
+#| export:
+# define the download task
+
+queries = data_catalog['download']['jobs']['queries_df'].load()
+
+for i, job in queries.iterrows():
+
+ @task(id=job['output'], name=f"Download {job['output']}")
+ def task_download_raw_data(
+ _query: Series = job # The query object from the data catalog
+ )-> Annotated[Path, data_catalog['download']['outputs'][job['output']]]:
+
+ logger = setup_logger(_query['output'])
+ output_path = BLD / f"{_query['output']}.nc"
+ logger.info(f"Starting download for {_query['output']} to {output_path}")
+
+ # check if string file path exists
+ if os.path.exists(output_path):
+ logger.info(f"File {output_path} already exists. Skipping download.")
+ return output_path
+
+ client = cdsapi.Client()
+ bounding_box = create_bounding_box(_query['shapefile'])
+
+ request = {
+ "product_type": _query['product_type'],
+ "variable": _query['variables'],
+ "year": _query['year'],
+ "month": _query['month'],
+ "day": _query['day'],
+ "time": _query['time'],
+ "data_format": "netcdf",
+ "download_format": "unarchived",
+ "area": bounding_box
+ }
+
+ client.retrieve("reanalysis-era5-land", request).download(output_path)
+ logger.info(f"Downloaded data for {_query['output']} to {output_path}")
+
+ return output_path
+```
+
+### How this works (with some help from GPT):
+
+#### 🧠 How pytask Discovers and Executes Tasks
+
+When you run pytask, it automatically scans your project for Python files named `task_*.py`. In these files, it looks for:
+- Functions decorated with `@task`, or
+- Functions prefixed with `task_`
+
+These functions are not executed immediately. Instead, `pytask`:
+1. Imports each task_*.py module (just like Python would)
+2. Registers any matching task functions as nodes in a directed acyclic graph (DAG)
+3. Resolves dependencies by analyzing:
+ - Input annotations (e.g., `Annotated[x, DependsOn]`)
+ - Output declarations (e.g., `return` values or `Product` annotations)
+4. Builds the DAG, where each task function is a node
+5. Executes the tasks, respecting dependency order and skipping up-to-date nodes
+
+So even though the task functions aren’t explicitly “run” in the Python code itself, pytask knows how and when to execute them — based on their position in the DAG.
+
+#### 🔄 How This Differs from Snakemake
+
+In `snakemake`, you’re expected to define a series of explicitly executable rules, often using shell commands or Python scripts. You “stitch together” rules using filenames and wildcard matching.
+
+In contrast:
+- 🐍 pytask is Python-native — tasks are just regular Python functions
+- ⚙️ It builds a DAG from those functions and tracks inputs/outputs automatically
+- 🧱 You are declaring nodes, not scripting execution
+
+Think of your Python files not as scripts to run, but as a way to define and wire together declarative tasks that will be executed by the pytask engine.
+
+---
+
+Because we defined this task in a function and loop, we can easily debug a node in the DAG by simply calling it:
+
+```{python}
+#| eval: false
+task_download_raw_data()
+```
diff --git a/notes_qmd/22_pytask_aggregate.qmd b/notes_qmd/22_pytask_aggregate.qmd
new file mode 100644
index 0000000..3868c8e
--- /dev/null
+++ b/notes_qmd/22_pytask_aggregate.qmd
@@ -0,0 +1,638 @@
+---
+title: "Aggregation: The `aggregation` Module as a `pytask` Task"
+format: html
+engine: jupyter
+---
+
+# task_aggregate
+
+> This task aggregates the downloaded data into spatial and temporal averages. It uses xarray to compute summary statistics over the specified time period and spatial region. The aggregation is done diurnally, so we will fetch the sundown and sunrise times for the region and use them to compute the diurnal averages.
+
+```{python}
+#| default_exp task_aggregate:
+#
+```
+
+```{python}
+#| hide:
+# showdoc
+
+from nbdev.showdoc import *
+
+```
+
+```{python}
+#| export:
+#
+
+import os
+import tempfile
+import rasterio
+import yaml
+import xarray as xr
+from pyprojroot import here
+from typing import Literal
+from pytask import task, Product
+from pathlib import Path
+from typing import Annotated
+from rasterstats.io import Raster
+
+from era5_sandbox.config import BLD, data_catalog
+from era5_sandbox.pytask_logger import setup_logger
+
+from era5_sandbox.core import GoogleDriver, _get_callable, describe, ClimateDataFileHandler, kelvin_to_celsius
+
+from era5_sandbox.aggregate import polygon_to_raster_cells, aggregate_to_healthsheds, RasterFile, netcdf_to_tiff
+
+```
+
+## Diurnal Classification Based on Sun Position
+
+To do diurnal classificaiton, we will need to fetch the sundown and sunrise times for the region and use them to compute the diurnal averages. We will use the [astral library](https://astral.readthedocs.io/en/latest/) to get the sunrise and sunset times for the specified latitude and longitude. The aggregation will be done using xarray, which allows us to compute the mean over the specified time period and spatial region.
+
+Here's our example file:
+
+```{python}
+
+eg_file = data_catalog['download']['outputs']['2009_01_nepal'].load()
+with ClimateDataFileHandler(eg_file) as handler:
+
+ ds = xr.open_dataset(handler.get_dataset("instant"))
+ #ds = xr.open_dataset(handler.get_dataset("accum"))
+
+ds
+
+```
+
+We can see the astral library in action below:
+
+```{python}
+#| exports:
+#
+from astral import Observer, sun
+import pandas as pd
+import numpy as np
+from tqdm import tqdm
+import random
+import datetime
+from pytz import UTC
+
+```
+
+```{python}
+# get the location of a datapoint in the dataset
+lat, long = ds.coords["latitude"].values[0], ds.coords["longitude"].values[0]
+time = ds['valid_time'].values[0]
+dt = pd.to_datetime(time, utc=True)
+
+```
+
+```{python}
+dt
+```
+
+```{python}
+observer = Observer(latitude=lat, longitude=long, elevation=0)
+sun_info = sun.sun(observer, date=dt)
+sun_info
+
+```
+
+Astral is very fast:
+```{python}
+%%timeit
+
+#fetch a random time from valid_time
+options = ds['valid_time'].values
+
+random_time = random.choice(options)
+dt = pd.to_datetime(random_time, utc=True)
+sun_info = sun.sun(observer, date=dt)
+if dt < sun_info['sunrise']:
+ print(f"Randomly selected time: {dt} is pre_dawn")
+elif dt >= sun_info['sunrise'] and dt < sun_info['sunset']:
+ print(f"Randomly selected time: {dt} is day")
+else:
+ print(f"Randomly selected time: {dt} is post_dusk")
+
+
+```
+
+This tells us that we can use the valid time for the specific location of each data point in the query and know based on the sun whether it was daytime or nighttime. The runtime will be limited only by the looping.
+Let's put this in a function so that we can use the resampling in `xarray`.
+
+The resampling approach will be a single function that can resample in three ways:
+
+- By calendar date, default (1 value per calendar date)
+- By diurnal class by calendar date (3 values, pre-dawn, day, post-dusk)
+- By solar date (2 values per calendar date, with night classified as "before" or "after")
+
+Therefore, we'll need 2 internal functions; one to do diurnal, and one to do solar date bins.
+
+Essentially, we are going to create an array-shaped index/mask, (time, latitude, longitude). As a
+demonstration, this loop goes through the first 24 time points in the dataset,
+and calculates the sun info for each latitude and longitude, assigning the values to an array:
+
+```{python}
+%%time
+times = ds['valid_time'].values[:24]
+lats = ds.coords['latitude'].values
+lons = ds.coords['longitude'].values
+
+result = np.full((len(times), len(lats), len(lons)), "", dtype=object)
+
+for i, dt in enumerate(times):
+
+ for j, lat in enumerate(lats):
+
+ for k, lon in enumerate(lons):
+
+ # set the geographical position
+ observer = Observer(latitude=lat, longitude=lon, elevation=0)
+
+ # use the time
+ dt = pd.to_datetime(dt, utc=True)
+
+ # where/when is the sun at this time for this position
+ sun_info = sun.sun(observer, date=dt)
+ result[i, j, k] = sun_info
+```
+
+So we know that in the first hour, the sun goes up and comes down at slightly different
+times based on latitude and longitude. Take the first hour, for example:
+
+```{python}
+print(result.shape)
+hour_1 = 0 # 0th index of the results
+
+min_lat = 0
+min_lon = 0
+max_lat = 48
+max_lon = 90
+print(f"Even though the reading came from the first HOUR of data UTC, the sun info at the minimum latitude/longitude is: {result[hour_1, min_lat, min_lon]}")
+
+print(f"this is different from the sun info at the maximum latitude/longitude is: {result[hour_1, max_lat, max_lon]}")
+```
+
+```{python}
+#| export:
+# define the basic diurnal classification function
+
+def compute_diurnal_class_bins(
+ ds: xr.Dataset
+ )-> np.ndarray:
+ """
+ Compute the diurnal value for each data point in the dataset.
+ This function iterates over each data point in the dataset,
+ calculates the sunrise and sunset times for the given time, latitude and longitude,
+ and returns whether or not that data point is before dawn, during the day, or after dusk.
+ """
+
+ times = ds['valid_time'].values
+ lats = ds.coords['latitude'].values
+ lons = ds.coords['longitude'].values
+
+ result = np.full((len(times), len(lats), len(lons)), "", dtype=object)
+
+ for i, dt in enumerate(tqdm(times, desc="Classifying data points by sun position")):
+ # use the time
+ dt = pd.to_datetime(dt, utc=True)
+
+ for j, lat in enumerate(lats):
+
+ for k, lon in enumerate(lons):
+
+ # set the geographical position
+ observer = Observer(latitude=lat, longitude=lon, elevation=0)
+
+ # where/when is the sun at this time for this position
+ sun_info = sun.sun(observer, date=dt)
+
+ if dt < sun_info['sunrise']:
+ result[i, j, k] = "pre_dawn"
+ elif dt >= sun_info['sunrise'] and dt < sun_info['sunset']:
+ result[i, j, k] = "day"
+ else:
+ result[i, j, k] = "post_dusk"
+
+ return result
+```
+
+```{python}
+ex=compute_diurnal_class_bins(ds)
+```
+
+So, for our 720 time points, we should find that
+if we take the `set()` of all the classifications within that slice,
+there should be a few of them with 2 classes.
+In other words, at any given hour, almost all of
+the readings are "day", because it is daytime across all
+of Madagascar, _but_ at certain timepoints, the sun is rising
+or setting in the northern part of the country and so some
+portion of the slice is classified differently:
+
+
+
+```{python}
+for x in range(720):
+ print(set(ex[x].flatten()))
+```
+
+This works! Now we can do a similar, but slightly more
+complicated function to define "night" and "day",
+where "night" includes all of the values after the sun goes down.
+
+```{python}
+#| exports:
+#
+
+def compute_solar_day_night_class_bins(
+ ds: xr.Dataset,
+ night_direction: Literal["before", "after"],
+ )-> list:
+ """
+ Compute the diurnal value for each data point in the dataset.
+ This function iterates over each data point in the dataset,
+ calculates the sunrise and sunset times for the given time, latitude and longitude,
+ and returns whether or not that data point is daytime or nighttime.
+ The definition of "nighttime" can be set to be all the darkness before the sun
+ came up (before), or all the darkness after it went down (after).
+ """
+
+ times = ds['valid_time'].values
+ lats = ds.coords['latitude'].values
+ lons = ds.coords['longitude'].values
+
+ result = np.full((len(times), len(lats), len(lons)), "", dtype=object)
+ datetimes = np.full((len(times), len(lats), len(lons)), "", dtype=object)
+
+ for i, dt in enumerate(tqdm(times, desc="Classifying data points by sun position")):
+ # use the time
+ dt = pd.to_datetime(dt, utc=True)
+
+ for j, lat in enumerate(lats):
+
+ for k, lon in enumerate(lons):
+
+ # set the geographical position
+ observer = Observer(latitude=lat, longitude=lon, elevation=0)
+ if night_direction == "before":
+ # Night is from previous sunset to today's sunrise
+ sun_today = sun.sun(observer, date=dt.date())
+ sun_prev = sun.sun(observer, date=(dt - pd.Timedelta(days=1)).date())
+ night_start = sun_prev["sunset"].astimezone(pd.Timestamp.utcnow().tz)
+ night_end = sun_today["sunrise"].astimezone(pd.Timestamp.utcnow().tz)
+
+ # the reading is from yesterday's nighttime
+ if night_start <= dt < night_end:
+ result[i, j, k] = "night"
+ # the date counts as today
+ datetimes[i, j, k] = dt.date()
+
+ # the reading is from daytime
+ elif sun_today["sunrise"] <= dt < sun_today["sunset"]:
+ result[i, j, k] = "day"
+ # the date counts as today
+ datetimes[i, j, k] = dt.date()
+
+ # the reading is from today's nighttime, but counts as tomorrow's night
+ else:
+ result[i, j, k] = "night"
+ # the date is tomorrow
+ datetimes[i, j, k] = (dt + pd.Timedelta(days=1)).date()
+
+ elif night_direction == "after":
+ # Night is from today's sunset to next sunrise
+ sun_today = sun.sun(observer, date=dt.date())
+ sun_next = sun.sun(observer, date=(dt + pd.Timedelta(days=1)).date())
+ night_start = sun_today["sunset"].astimezone(pd.Timestamp.utcnow().tz)
+ night_end = sun_next["sunrise"].astimezone(pd.Timestamp.utcnow().tz)
+
+ # the reading is from daytime
+ if sun_today["sunrise"] <= dt < sun_today["sunset"]:
+ result[i, j, k] = "day"
+ # the date counts as today
+ datetimes[i, j, k] = dt.date()
+ # the reading is from tonight
+ elif night_start <= dt < night_end:
+ result[i, j, k] = "night"
+ # the date counts as today
+ datetimes[i, j, k] = dt.date()
+
+ # the reading is from yesterday night
+ else:
+ # the date counts as yesterday
+ result[i, j, k] = "day"
+ datetimes[i, j, k] = (dt - pd.Timedelta(days=1)).date()
+ else:
+ raise ValueError(f"Invalid night_direction: {night_direction}")
+
+ return result, datetimes
+
+```
+
+```{python}
+%%time
+ex_class, ex_dt = compute_solar_day_night_class_bins(ds, "before")
+```
+
+```{python}
+ex_class
+```
+
+As before, we should see that most slices are homogenous,
+meaning most of the time, all the readings are from the day,
+but some slices should have day and night values:
+
+```{python}
+for slice_ in range(720):
+ print(set(ex_class[slice_].flatten()))
+```
+
+The returned array can serve as new "variable indexes" for the dataset:
+
+```{python}
+ds_masked = ds.copy()
+ds_masked['solar_class'] = (('valid_time', 'latitude', 'longitude'), ex_class)
+ds_masked["solar_date"] = (("valid_time", "latitude", "longitude"), ex_dt)
+```
+
+## Diurnal Resampling
+
+Now, to see if it will resample by both solar day and diurnal class. Let's try by masking and making copies with NaN in the masked values:
+
+```{python}
+ds_day = ds_masked.where(ds_masked["solar_class"] == "day").drop_vars(["solar_class", "solar_date"])
+ds_night = ds_masked.where(ds_masked["solar_class"] == "night").drop_vars(["solar_class", "solar_date"])
+```
+
+Next, we set the time zone for Madagascar since, to resample by day and night,
+we should observe the local time:
+
+```{python}
+ds_day = ds_day.assign_coords(valid_time=pd.to_datetime(ds["valid_time"].values).tz_localize("UTC").tz_convert("Asia/Kathmandu"))
+ds_night = ds_night.assign_coords(valid_time=pd.to_datetime(ds["valid_time"].values).tz_localize("UTC").tz_convert("Asia/Kathmandu"))
+```
+
+Now if we can resample by day...
+
+```{python}
+ds_day_rs = ds_day.resample(valid_time="1D").reduce(np.nanmean)
+ds_night_rs = ds_night.resample(valid_time="1D").reduce(np.nanmean)
+ds_day_rs
+```
+
+Can we successfully convert this to a tiff?
+
+```{python}
+from era5_sandbox.aggregate import netcdf_to_tiff
+```
+
+```{python}
+raster_day = netcdf_to_tiff(ds_day_rs, band=1, variable="d2m")
+raster_night = netcdf_to_tiff(ds_night_rs, band=1, variable="d2m")
+```
+
+Looks great! These two rasters represent one calendar day of daytime and nighttime values.
+
+### Testing Polygon to Raster Cells & Healthshed Aggregation
+
+The penultimate step of the aggregate pipeline in the original version is
+assigning each datapoint to the respective healthshed. The `vectors` argument
+comes from the healthshed, and represents each geographic polygon on the ground
+that we want to aggregate data to.
+
+```{python}
+from hydra import initialize, compose
+```
+
+```{python}
+try:
+ with initialize(version_base=None, config_path="../conf"):
+ cfg = compose(config_name='config.yaml')
+except Exception as e:
+ print(f"Error initializing Hydra: {e}")
+ with initialize(version_base=None, config_path="conf"):
+ cfg = compose(config_name='config.yaml')
+
+driver = GoogleDriver(json_key_path=here() / cfg.GOOGLE_DRIVE_AUTH_JSON.path)
+drive = driver.get_drive()
+healthsheds = driver.read_healthsheds("Nepal_Healthsheds2024.zip")
+```
+
+```{python}
+res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=raster_day.data, # the raster data above
+ nodata=np.nan, # any intersections with no data, may have to be np.nan
+ affine=raster_day.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+)
+```
+
+This works fine. Finally, we aggregate to healthsheds:
+
+```{python}
+from era5_sandbox.aggregate import aggregate_to_healthsheds
+
+```
+
+```{python}
+result_day = aggregate_to_healthsheds(
+ res_poly2cell=res_poly2cell,
+ raster=raster_day,
+ shapes=healthsheds,
+ names_column="fid",
+ aggregation_func=np.nanmean,
+ aggregation_name="mean_dewpoint_day"
+)
+
+result_night = aggregate_to_healthsheds(
+ res_poly2cell=res_poly2cell,
+ raster=raster_night,
+ shapes=healthsheds,
+ names_column="fid",
+ aggregation_func=np.nanmean,
+ aggregation_name="mean_dewpoint_night"
+)
+```
+
+Below shows the result of aggregating the daytime dewpoint temperature to the healthshed level:
+
+```{python}
+result_day
+```
+
+```{python}
+result_night
+```
+
+So from one input, we will have two outputs, one for daytime and one for nighttime, and this will have to loop over the bands (ie each day in the month).
+
+# Putting it all together in a `pytask` task
+
+Below we define our `pytask` task to aggregate data to the healthshed level.
+
+```{python}
+#| exports:
+#
+
+job_rows = data_catalog['aggregate']['jobs']['jobs_df'].load()
+
+aggregation_funcs = {
+ "mean": np.nanmean,
+ "sum": np.nansum,
+ "max": np.nanmax,
+ "min": np.nanmin
+}
+
+for i, job in job_rows.iterrows():
+ #print(f"Job {i+1}: variable={job['variables']}, time={job['time']}, aggregation={job['aggregation_name']}")
+
+ # parse the row into function parameters
+ input_file = data_catalog['download']['outputs'][job['input']]
+ solar_classification = job['solar_classification']
+ variable = job['variables_short']
+ time = job['time']
+ aggregation_func = aggregation_funcs[job['aggregation_name']]
+ aggregation_name = job['aggregation_name']
+
+ climate_handler_var = job['climate_handler_var']
+ local_tz = job['local_tz']
+
+ shapefile = job['shapefile']
+ hshd_unique_id = job['hshd_unique_id']
+
+ output_file = job['input'] + "_" + job['time'] + "_" + job['variables_short'] + "_" + job['aggregation_name'] + ".parquet"
+
+ @task(id=output_file, name=f"Aggregate {output_file}", after="task_download_raw_data")
+ def task_aggregate_data_diurnal(
+ input_file: Path = data_catalog['download']['outputs'][job['input']], # input data Path from the download task
+ aggregation_func: callable = aggregation_func, # the aggregation function
+ aggregation_name: str = aggregation_name, # the name of the aggregation function
+ time: Literal["day", "night"] = time, # whether to aggregate by day or night
+ night_direction: Literal["before", "after"] = solar_classification, # how to define night
+ variable: str = variable, # the variable to aggregate,
+ climate_handler_var: Literal["instant", "accum"] = climate_handler_var, # whether the variable is instant or accum,
+ local_tz: str = local_tz, # the local timezone for resampling
+ shapefile: str = shapefile, # the shapefile for the healthsheds,
+ hshd_unique_id: str = hshd_unique_id, # the unique id column in the shapefile,
+ output_file: str = output_file # the output file name
+ ) -> Annotated[Path, data_catalog['aggregate']['outputs'][output_file]]:
+ """
+ Task to aggregate data from a CDSAPI Query to the healthshed
+ level. Returns path to parquet file with aggregated data.
+ """
+
+ logger = setup_logger(output_file)
+
+ logger.info(f"Aggregating: {output_file}")
+
+ # check if the string path exists
+ # if os.path.exists(output_file):
+ # logger.info(f"File {output_file} already exists. Skipping aggregation.")
+ # return output_file
+
+ # get input data
+ logger.info("Reading input data...")
+ with ClimateDataFileHandler(input_file) as handler:
+ ds = xr.open_dataset(handler.get_dataset('instant'))
+
+ #get the healthshed shapefile
+ logger.info(f"Reading healthshed shapefile from yaml {here()}...")
+ with open(here() / "conf" / "config.yaml") as f:
+ healthshed_config = yaml.safe_load(f)
+
+ key_path = here() / healthshed_config['GOOGLE_DRIVE_AUTH_JSON']['path']
+
+ driver = GoogleDriver(json_key_path=key_path)
+ drive = driver.get_drive()
+ healthsheds = driver.read_healthsheds(shapefile)
+
+ # compute the diurnal classification bins
+ logger.info("Computing diurnal classification bins...")
+ class_bins, class_dts = compute_solar_day_night_class_bins(ds, night_direction)
+
+ ds_masked = ds.copy()
+
+ # assign classifications
+ logger.info("Assigning classification bins to dataset...")
+ ds['solar_class'] = (('valid_time', 'latitude', 'longitude'), class_bins)
+ ds["solar_date"] = (("valid_time", "latitude", "longitude"), class_dts)
+
+ # mask the dataset to the requested time
+ mask = ds["solar_class"] == time
+ ds_masked = ds_masked.where(mask)
+
+ # set the local timezone
+ ds_masked = ds_masked.assign_coords(valid_time=pd.to_datetime(ds["valid_time"].values).tz_localize("UTC").tz_convert(local_tz))
+
+ # resample by local date
+ logger.info("Resampling by local date...")
+ ds_rs = ds_masked.resample(valid_time="1D").reduce(aggregation_func)
+
+ # convert to tiff
+ logger.info("Rasterizing resampled data...")
+ n_bands = ds_rs.dims['valid_time']
+
+ # polygon to raster cells for the first band
+ logger.info("Converting polygons to raster cells...")
+ raster = netcdf_to_tiff(ds_rs, band=1, variable=variable)
+ res_poly2cell=polygon_to_raster_cells(
+ vectors = healthsheds.geometry.values, # the geometries of the shapefile of the regions
+ raster=raster.data, # the raster data above
+ nodata=np.nan, # any intersections with no data, may have to be np.nan
+ affine=raster.transform, # some math thing need to revise
+ all_touched=True,
+ verbose=True
+ )
+
+ result_df = healthsheds[[hshd_unique_id, "geometry"]].copy()
+
+ # loop over bands and aggregate to healthsheds
+ for band in tqdm(range(1, n_bands + 1)):
+ logger.info(f"Processing band {band} of {n_bands}...")
+
+ day = band # band is 1-indexed
+
+ day_col = f"day_{day:02d}"
+
+ # calculate raster for this band
+ raster = netcdf_to_tiff(ds_rs, band=band, variable=variable)
+
+ # aggregate to healthsheds
+ result = aggregate_to_healthsheds(
+ res_poly2cell=res_poly2cell,
+ raster=raster,
+ shapes=healthsheds,
+ names_column=hshd_unique_id,
+ aggregation_func=aggregation_func,
+ aggregation_name=variable
+ )
+
+ # add band to result dataframe
+ result_df[day_col] = result[variable]
+
+ # save to parquet
+ result_df.to_parquet(f"{BLD}/{output_file}")
+
+ logger.info("Aggregation complete.")
+
+ return Path(f"{BLD}/{output_file}")
+
+```
+
+That should wrap it up! To test, we can run a single job:
+
+```{python}
+#| eval: false
+# runs the last defined job only
+task_aggregate_data_diurnal()
+```
+
+Or we can run the task in `pytask`:
+
+```bash
+pytask build -k "nepal and 2009" --dry-run
+```
\ No newline at end of file
diff --git a/notes_qmd/IMG_740012467778-1.jpeg b/notes_qmd/IMG_740012467778-1.jpeg
new file mode 100644
index 0000000..52886eb
Binary files /dev/null and b/notes_qmd/IMG_740012467778-1.jpeg differ
diff --git a/notes_qmd/index.qmd b/notes_qmd/index.qmd
new file mode 100644
index 0000000..bc971cc
--- /dev/null
+++ b/notes_qmd/index.qmd
@@ -0,0 +1,157 @@
+---
+title: "The ERA5 Spatial Aggregation Pipeline"
+exec_all: true
+---
+
+```{python}
+#| hide: null
+from era5_sandbox.core import *
+```
+
+## era5_sandbox
+
+> Sandbox environment for era5 development
+
+This package documents the development and implementation of functions and code for the Madagascar ERA5 dataset project. The goal is for exposure data to be made available at the daily resolution when possible. Finer resolutions shouldn’t ever be needed for our purposes, and it should then be relatively easy to aggregate at coarser resolutions, such as weekly or monthly. Additionally, we've extended this work to Nepal as well.
+
+Variables should generally be made available from 2010 onward, as that’s where our clinic data starts.
+
+All data are ideally made available at the “healthshed” geographical level. Healthsheds are defined as geographical areas where people who live all go to the same clinic. There are a total of ~2700 public clinics in Madagascar, hence ~2700 healthsheds, with each healthshed containing ~10000 people on average.
+
+Preliminary list of environmental variables
+
+- [x] 2-m air temperature from ERA5: daily min, max, mean
+
+- [x] 2-m air dew point temperature from ERA5: daily min, max, mean
+
+- [x] Precipitation: daily total (ERA5)
+
+- [x] Soil moisture: daily average (ERA5)
+
+Variables from other sources:
+
+- [ ] Sea surface temperature: daily average and maximum in the nearest neighbor for each healthshed.
+
+- [ ] Precipitation: daily total (CHIRPS)
+
+- [ ] Chlorophyll-A (Giacomo)
+
+- [ ] Wealth index: Available from Giacomo
+
+- [ ] NDVI
+
+- [ ] Tropical storm
+
+- [ ] Flooding
+
+- [ ] Deforestation
+
+- [ ] Linking/segmenting healthsheds into climate zones and other
+
+- [ ] Relative humidity: daily average (lower priority)
+
+Those from the ERA5 dataset will be housed here, but we may likely develop a separate repository for the other datasets.
+
+## Developer Guide
+
+This package is built and maintained with `nbdev`. If you are new to using `nbdev` here are some useful pointers to get you started.
+
+### Install era5_sandbox in Development mode
+
+```sh
+# make sure era5_sandbox package is installed in development mode
+$ pip install -e .
+```
+
+To make changes, go to the "notes" directory and edit the notebooks as necessary.
+Each notebook refers to a module in the era5_sandbox package. Cells are exported to the module
+when the notebook is saved and you run the following command:
+
+```sh
+$ nbdev_export
+```
+
+For e.g., to change functionality of the `testAPI()` function in the testAPI Hydra rule, you would edit the `testAPI` notebook in the `notes` directory `notes/testAPI.ipynb`, and then save that notebook and run `nbdev_export` to update the `core` module in the package.
+
+### How to Run the Pipeline
+
+The pipeline downloads ERA5 variables for a given date range and geographical bounding box. You can learn how each of these steps was by following the notebooks in `notes` in numerical order.
+
+::: {.callout-important}
+The pipeline has two implementations: one using `snakemake` and `hydra`, and another using `pytask`. The `pytask` implementation is the more recent one, and is recommended for future use. The `snakemake` implementation is left here for reference to legacy code.
+:::
+
+#### Using `pytask`
+
+To run the pipeline, the `pytask` config at `note/20_pytask_config.qmd` should be reviewed
+and updated if necessary. The pipeline can then be run with the following command:
+
+```sh
+$ sbatch pytask.sbatch
+```
+
+#### Using `snakemake` and `hydra`
+
+To run the pipeline, the config at `config/config.yaml` should be updated with the desired date range and geographical bounding box. The pipeline can then be run with the following command:
+
+```sh
+sbatch snakemake.sbatch
+```
+
+### What Does the Pipeline Produce?
+
+Using `pytask`'s data catalog, you can investigate the downloaded raw data with python, eg.:
+
+```{python}
+#| exec_doc:
+#
+import xarray as xr
+from era5_sandbox.config import data_catalog
+from era5_sandbox.core import ClimateDataFileHandler
+
+ex_nc = list(data_catalog['download']['outputs']._entries).pop()
+ex_nc_path = data_catalog['download']['outputs'][ex_nc].load()
+
+with ClimateDataFileHandler(ex_nc_path) as handler:
+ ds = xr.open_dataset(handler.get_dataset("instant"))
+
+ds
+```
+
+And plot it with cartopy, eg.:
+
+```{python}
+#| exec_doc:
+#
+import matplotlib.pyplot as plt
+import cartopy.crs as ccrs
+import cartopy.feature as cfeature
+
+temperature = ds["t2m"]
+
+# Select a specific time step
+temperature_at_time = temperature.isel(valid_time=0)
+
+# Plot the data on a map
+plt.figure(figsize=(12, 8))
+ax = plt.axes(projection=ccrs.PlateCarree())
+temperature_at_time.plot(ax=ax, cmap="coolwarm", transform=ccrs.PlateCarree(), cbar_kwargs={"label": "Temperature (K)"})
+ax.coastlines()
+ax.add_feature(cfeature.BORDERS, linestyle=":")
+ax.set_title("Temperature at Time Step 0")
+plt.show()
+```
+
+You can also load the aggregated data:
+
+```{python}
+#| exec_doc:
+#
+import pandas as pd
+import geopandas as gpd
+from era5_sandbox.config import data_catalog
+
+ex_agg_path = data_catalog['aggregate']['outputs']['2019_08_madagascar_night_d2m_max.parquet'].load()
+
+gpd.read_parquet(ex_agg_path).describe()
+```
\ No newline at end of file
diff --git a/notes_qmd/nbdev.yml b/notes_qmd/nbdev.yml
new file mode 100644
index 0000000..d8c5049
--- /dev/null
+++ b/notes_qmd/nbdev.yml
@@ -0,0 +1,9 @@
+project:
+ output-dir: _docs
+
+website:
+ title: "era5_sandbox"
+ site-url: "https://TinasheMTapera.github.io/era5_sandbox"
+ description: "Sandbox environment for era5 development"
+ repo-branch: main
+ repo-url: "https://github.com/TinasheMTapera/era5_sandbox"
diff --git a/notes_qmd/sidebar.yml b/notes_qmd/sidebar.yml
new file mode 100644
index 0000000..caf3166
--- /dev/null
+++ b/notes_qmd/sidebar.yml
@@ -0,0 +1,16 @@
+website:
+ sidebar:
+ contents:
+ - index.ipynb
+ - section: "Snakemake Modules"
+ - 00_core.ipynb
+ - 01_download_raw_data.ipynb
+ - 02_aggregate.ipynb
+ - 03_publish.ipynb
+ - section: "PyTask Modules"
+ - 20_pytask_config.ipynb
+ - 20_pytask_logger.ipynb
+ - 21_pytask_download.ipynb
+ - 22_pytask_aggregate.ipynb
+ - section: "PyTask Demo"
+ - 10_pytask_demo.ipynb
diff --git a/notes_qmd/styles.css b/notes_qmd/styles.css
new file mode 100644
index 0000000..66ccc49
--- /dev/null
+++ b/notes_qmd/styles.css
@@ -0,0 +1,37 @@
+.cell {
+ margin-bottom: 1rem;
+}
+
+.cell > .sourceCode {
+ margin-bottom: 0;
+}
+
+.cell-output > pre {
+ margin-bottom: 0;
+}
+
+.cell-output > pre, .cell-output > .sourceCode > pre, .cell-output-stdout > pre {
+ margin-left: 0.8rem;
+ margin-top: 0;
+ background: none;
+ border-left: 2px solid lightsalmon;
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.cell-output > .sourceCode {
+ border: none;
+}
+
+.cell-output > .sourceCode {
+ background: none;
+ margin-top: 0;
+}
+
+div.description {
+ padding-left: 2px;
+ padding-top: 5px;
+ font-style: italic;
+ font-size: 135%;
+ opacity: 70%;
+}
diff --git a/pyproject.toml b/pyproject.toml
index f2c07bf..c9d6b9e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,7 @@
[build-system]
requires = ["setuptools>=64.0"]
build-backend = "setuptools.build_meta"
+
+[tool.pytask.ini_options]
+paths = ["src/era5_sandbox"]
+editor_url_scheme = "vscode"
\ No newline at end of file
diff --git a/pytask.sbatch b/pytask.sbatch
new file mode 100644
index 0000000..3063b72
--- /dev/null
+++ b/pytask.sbatch
@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+#SBATCH -p intermediate # partition (queue)
+#SBATCH -c 6 # number of cores
+#SBATCH --cpus-per-task=36 # request >= number of workers you want
+#SBATCH --mem 100GB # memory
+#SBATCH -t 1-12:00 # time (D-HH:MM)
+
+#SBATCH --mail-type=BEGIN,END,TIME_LIMIT_80,
+#SBATCH --mail-user=ttapera@hsph.harvard.edu
+
+# This is a test to see if we can use pytask to download ERA5 data in parallel
+
+#pytask --dry-run
+pytask --parallel-backend loky -n 36
\ No newline at end of file
diff --git a/pytask_collect.txt b/pytask_collect.txt
new file mode 100644
index 0000000..efaaea3
--- /dev/null
+++ b/pytask_collect.txt
@@ -0,0 +1,135193 @@
+─────────────────────────────────────────────────────────────────────────────────────────────────────── Start pytask session ────────────────────────────────────────────────────────────────────────────────────────────────────────
+Platform: linux -- Python 3.11.11, pytask 0.5.5, pluggy 1.5.0
+Root: /net/rcstorenfs02/ifs/rc_labs/dominici_lab/lab/data_processing/csph-era5_sandbox
+Configuration: /net/rcstorenfs02/ifs/rc_labs/dominici_lab/lab/data_processing/csph-era5_sandbox/pyproject.toml
+Plugins: pytask_parallel-0.5.1, vscode-0.0.2
+Collected 8068 tasks.
+
+Collected tasks:
+├── 🐍
+│ ├── 📝
+│ │ ├── 📄
+│ │ ├── 📄
+│ │ ├── 📄
+│ │ ├── 📄
+│ │ ├── 📄
+│ │ ├── 📄
+│ │ ├── 📄