From 5ce1b04f697c0ca126c1942093d0ce49b18d1f19 Mon Sep 17 00:00:00 2001 From: weiqi-tori Date: Thu, 8 Aug 2024 14:41:24 +0800 Subject: [PATCH] add tests for era 5 layer and metric --- city_metrix/metrics/__init__.py | 3 +- notebooks/layers/era_5_hottest_day.ipynb | 332 +++++++++++++++++++++++ tests/test_layers.py | 5 + tests/test_metrics.py | 3 + 4 files changed, 342 insertions(+), 1 deletion(-) create mode 100644 notebooks/layers/era_5_hottest_day.ipynb diff --git a/city_metrix/metrics/__init__.py b/city_metrix/metrics/__init__.py index 10b559cb..d95cfa5c 100644 --- a/city_metrix/metrics/__init__.py +++ b/city_metrix/metrics/__init__.py @@ -3,4 +3,5 @@ from .built_land_with_high_land_surface_temperature import built_land_with_high_land_surface_temperature from .mean_tree_cover import mean_tree_cover from .urban_open_space import urban_open_space -from .natural_areas import natural_areas \ No newline at end of file +from .natural_areas import natural_areas +from .era_5_met_preprocessing import era_5_met_preprocessing diff --git a/notebooks/layers/era_5_hottest_day.ipynb b/notebooks/layers/era_5_hottest_day.ipynb new file mode 100644 index 00000000..71e7596a --- /dev/null +++ b/notebooks/layers/era_5_hottest_day.ipynb @@ -0,0 +1,332 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Setup" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import geopandas as gpd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'/home/weiqi_tori/GitHub/wri/cities-cif'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# # update the wd path to be able to laod the module\n", + "os.chdir('../..')\n", + "os.getcwd()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Get Area of Interest" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/weiqi_tori/anaconda3/envs/fenv/lib/python3.10/site-packages/pyogrio/raw.py:196: RuntimeWarning: driver GeoJSON does not support open option DRIVER\n", + " return ogr_read(\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
geo_idgeo_levelgeo_namegeo_parent_namecreation_dategeometry
0BRA-Salvador_ADM4-union_1ADM4-unionBRA-SalvadorBRA-Salvador2022-08-03MULTIPOLYGON (((-38.50135 -13.01134, -38.5014 ...
\n", + "
" + ], + "text/plain": [ + " geo_id geo_level geo_name geo_parent_name \\\n", + "0 BRA-Salvador_ADM4-union_1 ADM4-union BRA-Salvador BRA-Salvador \n", + "\n", + " creation_date geometry \n", + "0 2022-08-03 MULTIPOLYGON (((-38.50135 -13.01134, -38.5014 ... " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# load boundary from s3\n", + "boundary_path = 'https://cities-indicators.s3.eu-west-3.amazonaws.com/data/boundaries/boundary-BRA-Salvador-ADM4union.geojson'\n", + "city_gdf = gpd.read_file(boundary_path, driver='GeoJSON')\n", + "city_gdf.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Get Layer" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get Layer\n", + "from city_metrix.layers import Era5HottestDay\n", + "era_5_hottest_day = Era5HottestDay().get_data(city_gdf.total_bounds)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Find the time step with the maximum temperature\n", + "max_temp_index = era_5_hottest_day['t2m'].argmax(dim='time')\n", + "max_time = era_5_hottest_day['t2m']['time'].isel(time=max_temp_index)\n", + "\n", + "# Select the data corresponding to the maximum time and plot\n", + "era_5_hottest_day['t2m'].sel(time=max_time).plot(cmap='Reds')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Save to file" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a data folder if it does not exist\n", + "if not os.path.exists('data'):\n", + " os.makedirs('data')" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Save the era_5_hottest_day temperature to a tif file\n", + "era_5_hottest_day['t2m'].rio.to_raster(raster_path='data/era_5_hottest_day_t2m.tif', driver=\"COG\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cities-cif", + "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.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/test_layers.py b/tests/test_layers.py index 989c1479..5f7ce78d 100644 --- a/tests/test_layers.py +++ b/tests/test_layers.py @@ -18,6 +18,7 @@ TreeCanopyHeight, TreeCover, UrbanLandUse, + Era5HottestDay, ) from city_metrix.layers.layer import get_image_collection @@ -170,3 +171,7 @@ def test_overture_buildings(): def test_nasa_dem(): mean = NasaDEM().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() assert mean + +def test_era_5_hottest_day(): + mean = Era5HottestDay().get_data(BBOX_BRAZIL_LAURO_DE_FREITAS_1).mean() + assert mean diff --git a/tests/test_metrics.py b/tests/test_metrics.py index eb2c4407..16016332 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -16,3 +16,6 @@ def test_high_lst(): indicator = built_land_with_high_land_surface_temperature(ZONES) assert indicator.size == 100 +def test_era_5_met_preprocess(): + indicator = era_5_met_preprocessing(ZONES) + assert len(indicator) == 24