Browse Source

Completed data preprocessing script commenting

FGeo 1 year ago
parent
commit
671cea448d
  1. 333
      0_prepare_data.ipynb

333
0_prepare_data.ipynb

@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": null,
"id": "7b2a7f44-b0cb-4471-a0c6-e56da23caf86",
"metadata": {},
"outputs": [],
@ -29,9 +29,17 @@ @@ -29,9 +29,17 @@
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"id": "6b2b903f-fa30-4e35-97e1-74bc0ee6b944",
"metadata": {},
"source": [
"### Helper variables"
]
},
{
"cell_type": "code",
"execution_count": 3,
"execution_count": null,
"id": "36b9f49e-32e6-4544-a9d3-f6a8ba49d867",
"metadata": {},
"outputs": [],
@ -41,29 +49,29 @@ @@ -41,29 +49,29 @@
"src_path = \"../shared_files/eee_public_files/seasonal-variation-2024/\""
]
},
{
"cell_type": "markdown",
"id": "5e16ee8e-f3b0-4251-9691-19d7dfd4aff7",
"metadata": {},
"source": [
"### Preprocessing WRF T2m data"
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": null,
"id": "78a4350c-59fb-479a-b7cd-e2bf9b996d36",
"metadata": {},
"outputs": [],
"source": [
"# available numbers of simulated days for analysis\n",
"# used numbers of simulated days for analysis\n",
"wrf_N_days = 4992\n",
"inmcm_N_days = 3650"
]
},
{
"cell_type": "markdown",
"id": "5e16ee8e-f3b0-4251-9691-19d7dfd4aff7",
"metadata": {},
"source": [
"### Preprocessing WRF T2m data"
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": null,
"id": "53cb9cc3-0e56-4da4-920b-2f071a0846fb",
"metadata": {},
"outputs": [],
@ -81,51 +89,48 @@ @@ -81,51 +89,48 @@
},
{
"cell_type": "code",
"execution_count": 147,
"execution_count": null,
"id": "0e4d0268-208f-45c7-bb0a-b5e8d3c7c1f7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(4992, 180, 360)"
]
},
"execution_count": 147,
"metadata": {},
"output_type": "execute_result"
}
],
"outputs": [],
"source": [
"wrf_T2_data = np.load(f\"{src_path}/T2-MAP-FULL.npy\")[:wrf_N_days]\n",
"wrf_T2_data.shape"
"# air temperature at the height of 2 m with the shape\n",
"# (number of days, number of latitudes, number of longitudes)\n",
"\n",
"# contains temperature values depending on (d, lat, lon)\n",
"\n",
"# d (axis 0) is the number of a day starting with 0 and ending with 5113\n",
"# every third day is taken\n",
"# d = 0 corresponds to 1 Jan 1980, d = 5113 corresponds to 30 Dec 2021\n",
"# d = 4991 corresponds to 29 Dec 2020\n",
"# (we will restrict our attention to 1980–2020)\n",
"\n",
"# lat (axis 2) describes the latitude (an integer in [0, 179])\n",
"\n",
"# lon (axis 3) describes the longitude (an integer in [0, 359])\n",
"\n",
"wrf_T2_data = np.load(f\"{src_path}/T2-MAP-FULL.npy\")[:wrf_N_days]"
]
},
{
"cell_type": "code",
"execution_count": 149,
"execution_count": null,
"id": "ec569ffd-93c2-4490-8ba1-69af4fab8f23",
"metadata": {},
"outputs": [],
"source": [
"# mean surface air temperature values for different latitudes and months\n",
"# air temperature averaged over latitudes and months\n",
"wrf_mon_T2 = np.zeros((180, 12))\n",
"\n",
"for month_idx in range(12):\n",
" # filter indicies by month number\n",
" monthly_indicies = [\n",
" i for i, date in enumerate(wrf_dt_indicies) if date.month == month_idx + 1\n",
" ] # indicies of days available for `month_idx+1` month\n",
" ]\n",
"\n",
" # putting values at specific month into averaged array\n",
" wrf_mon_T2[:, month_idx] = wrf_mean_T2[monthly_indicies].mean(axis=0)\n",
"\n",
" wrf_mon_T2[:, month_idx] = wrf_mean_T2[monthly_indicies].mean(axis=0)"
]
},
{
"cell_type": "code",
"execution_count": 164,
"id": "08302aa4-cb14-47f9-8216-a9db06ae53ef",
"metadata": {},
"outputs": [],
"source": [
"np.save(f\"./data/WRF/WRF_T2_LATxMON.npy\",wrf_mon_T2)"
]
},
@ -139,102 +144,123 @@ @@ -139,102 +144,123 @@
},
{
"cell_type": "code",
"execution_count": 72,
"execution_count": null,
"id": "94a603c3-982d-4c78-be1c-bb6c74b86b5b",
"metadata": {},
"outputs": [],
"source": [
"# dictionaries where processed data is saved\n",
"# the dictionary keys represent the threshold value of CAPE\n",
"\n",
"# for storing arrays with averaged by hours and summarized by longitude,\n",
"# i.e. with dimensions (4992, 180) for WRF and (3650, 120) for INMCM\n",
"wrf_daily_latitudal_ip = {}\n",
"inmcm_daily_latitudal_ip = {}\n",
"\n",
"# for storing arrays summarized by longitude and latitude,\n",
"# i.e. with dimensions (4992, 24) for WRF and (3650, 24) for INMCM\n",
"wrf_hourly_total_ip = {}\n",
"inmcm_hourly_total_ip = {}"
]
},
{
"cell_type": "code",
"execution_count": 73,
"execution_count": null,
"id": "d8e43c4f-59af-483c-8979-535c696abb4e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"800\n",
"1000\n",
"1200\n"
]
}
],
"outputs": [],
"source": [
"for cape_thres in [800, 1000, 1200]: # J/kg\n",
" print(cape_thres)\n",
"# iterating over the CAPE threshold (J/kg) values used in modeling \n",
"# for each threshold, there are corresponding model datasets\n",
"for cape_thres in [800, 1000, 1200]:\n",
"\n",
" # grid cell contributions to the IP (not normalised) with the shape\n",
" # (number of days, number of hours, number of latitudes, number of longitudes)\n",
" wrf_raw_ip_data = np.load(f\"{src_path}/WRF-IP-MAP-{cape_thres}.npy\")[:wrf_N_days]\n",
" # modelled using WRF model with CAPE threshold = `cape_thres` J/kg\n",
" # contains values of contributions to the IP depending on (d, h, lat, lon)\n",
" # d (axis 0) is the number of a day starting with 0 and ending with 5113\n",
" # every third day is taken\n",
" # d = 0 corresponds to 1 Jan 1980, \n",
" # d = 5113 corresponds to 30 Dec 2021\n",
" # d = 4991 corresponds to 29 Dec 2020\n",
" # (we will restrict our attention to 1980–2020)\n",
" # h (axis 1) is the hour of the day (an integer in [0, 24])\n",
" # the values corresponding to h = 0 and h = 24 are the same\n",
" # lat (axis 2) describes the latitude (an integer in [0, 179]) \n",
" # lon (axis 3) describes the longitude (an integer in [0, 359])\n",
"\n",
" # discarding the last hour, which duplicates the first one\n",
" wrf_raw_ip_data = wrf_raw_ip_data[:, :24, :, :]\n",
" \n",
" # normalisation of contributions to the IP to the global mean of 240 kV\n",
" wrf_raw_ip_data /= (1/240e3) * wrf_raw_ip_data.sum(axis=(-2,-1)).mean()\n",
"\n",
" # filling dictionaries with averaged arrays\n",
" wrf_daily_latitudal_ip[cape_thres] = wrf_raw_ip_data.mean(axis=1).sum(axis=-1)\n",
" wrf_hourly_total_ip[cape_thres] = wrf_raw_ip_data.sum(axis=(-2, -1))\n",
"\n",
" inmcm_raw_ip_data = np.load(f\"{src_path}/INMCM-IP-MAP-{cape_thres}.npy\").reshape((inmcm_N_days, 24, 120, 180))\n",
" np.save(f\"./data/WRF/WRF_HOURLY_TOTAL_IP_{cape_thres}.npy\",\n",
" wrf_hourly_total_ip[cape_thres])\n",
"\n",
" # grid cell contributions to the IP (not normalised) reshaped to\n",
" # (number of days, number of hours, number of latitudes, number of longitudes)\n",
" inmcm_raw_ip_data = np.load(f\"{src_path}/INMCM-IP-MAP-{cape_thres}.npy\")\\\n",
" .reshape((inmcm_N_days, 24, 120, 180))\n",
" # modelled using INMCM model with CAPE threshold = `cape_thres` J/kg\n",
" # contains values of contributions to the IP depending on (d, h, lat, lon)\n",
" # d (axis 0) is the number of a day (not correspond to real days,\n",
" # 10 consecutive 365-day years have been simulated)\n",
" # h (axis 1) is the hour of the day (an integer in [0, 23])\n",
" # lat (axis 2) describes the latitude (an integer in [0, 179]) \n",
" # lon (axis 3) describes the longitude (an integer in [0, 359])\n",
"\n",
" # normalisation of contributions to the IP to the global mean of 240 kV\n",
" inmcm_raw_ip_data /= (1/240e3) * inmcm_raw_ip_data.sum(axis=(-2,-1)).mean()\n",
" \n",
"\n",
" # filling dictionaries with averaged arrays\n",
" inmcm_daily_latitudal_ip[cape_thres] = inmcm_raw_ip_data.mean(axis=1).sum(axis=-1)\n",
" inmcm_hourly_total_ip[cape_thres] = inmcm_raw_ip_data.sum(axis=(-2, -1))\n",
"\n",
" del wrf_raw_ip_data\n",
" del inmcm_raw_ip_data"
" np.save(f\"./data/INMCM/INMCM_HOURLY_TOTAL_IP_{cape_thres}.npy\",\n",
" inmcm_hourly_total_ip[cape_thres])"
]
},
{
"cell_type": "code",
"execution_count": 89,
"execution_count": null,
"id": "eb28cbc7-eb0a-49be-8cc1-734bba1d06f5",
"metadata": {},
"outputs": [],
"source": [
"for cape_thres in [800, 1000, 1200]: # J/kg\n",
" np.save(\n",
" f\"./data/INMCM/INMCM_HOURLY_TOTAL_IP_{cape_thres}.npy\",\n",
" inmcm_hourly_total_ip[cape_thres],\n",
" )\n",
" np.save(\n",
" f\"./data/WRF/WRF_HOURLY_TOTAL_IP_{cape_thres}.npy\",\n",
" wrf_hourly_total_ip[cape_thres],\n",
" )\n",
"# iterating over the CAPE threshold (J/kg) values used in modeling \n",
"# for each threshold, there are corresponding model datasets\n",
"for cape_thres in [800, 1000, 1200]:\n",
"\n",
" # initialization of an arrays to store time-averaged data over months\n",
" wrf_data_LATxMON = np.zeros((180, 12))\n",
" inmcm_data_LATxMON = np.zeros((120, 12))\n",
"\n",
" # iteration over month number (starting with 0)\n",
" for month_idx in range(12):\n",
" monthly_indicies = [\n",
" i for i, date in enumerate(wrf_dt_indicies) if date.month == month_idx + 1\n",
" ] # indicies of days available for `month_idx+1` month\n",
"\n",
" wrf_data_MONxLAT[:, month_idx] = wrf_daily_latitudal_ip[cape_thres][monthly_indicies].mean(\n",
" axis=0\n",
" )\n",
" np.save(\n",
" f\"./data/WRF/WRF_IP_{cape_thres}_LATxMON.npy\",\n",
" wrf_data_MONxLAT,\n",
" )\n",
"\n",
" for month_idx in range(12):\n",
" monthly_indicies = [\n",
" i for i, date in enumerate(inmcm_dt_indicies) if date.month == month_idx + 1\n",
" ] # indicies of days available for `month_idx+1` month\n",
"\n",
" inmcm_data_LATxMON[:, month_idx] = inmcm_daily_latitudal_ip[cape_thres][\n",
" monthly_indicies\n",
" ].mean(axis=0)\n",
" np.save(\n",
" f\"./data/INMCM/INMCM_IP_{cape_thres}_LATxMON.npy\",\n",
" inmcm_data_LATxMON,\n",
" )"
" # filtering day indices belonging to a specific month\n",
" wrf_monthly_indicies = [i for i, date in enumerate(wrf_dt_indicies) \n",
" if date.month == month_idx + 1]\n",
" inm_monthly_indicies = [i for i, date in enumerate(inmcm_dt_indicies) \n",
" if date.month == month_idx + 1]\n",
"\n",
" # filling with modeling values with a CAPE threshold \n",
" # averaged over months of the year\n",
" wrf_data_MONxLAT[:, month_idx] = \\\n",
" wrf_daily_latitudal_ip[cape_thres][monthly_indicies].mean(axis=0)\n",
" inmcm_data_LATxMON[:, month_idx] = \\\n",
" inmcm_daily_latitudal_ip[cape_thres][monthly_indicies].mean(axis=0)\n",
"\n",
" np.save(f\"./data/WRF/WRF_IP_{cape_thres}_LATxMON.npy\",\n",
" wrf_data_MONxLAT)\n",
" np.save(f\"./data/INMCM/INMCM_IP_{cape_thres}_LATxMON.npy\",\n",
" inmcm_data_LATxMON)"
]
},
{
@ -252,10 +278,30 @@ @@ -252,10 +278,30 @@
"metadata": {},
"outputs": [],
"source": [
"# grid cell contributions to the IP (not normalised) reshaped to\n",
"# (number of days, number of hours, number of latitudes, number of longitudes)\n",
"wrf_raw_ip_data = np.load(f\"{src_path}/WRF-IP-MAP-500-T2-25.npy\")[:wrf_N_days]\n",
"# modelled using WRF model using new parametrization based on\n",
"# CAPE and T2 with corresponding thresholds 500 J/kg and 25°C.\n",
"# contains values of contributions to the IP depending on (d, h, lat, lon)\n",
"# d (axis 0) is the number of a day starting with 0 and ending with 5113\n",
"# every third day is taken\n",
"# d = 0 corresponds to 1 Jan 1980, \n",
"# d = 5113 corresponds to 30 Dec 2021\n",
"# d = 4991 corresponds to 29 Dec 2020\n",
"# (we will restrict our attention to 1980–2020)\n",
"# h (axis 1) is the hour of the day (an integer in [0, 24])\n",
"# the values corresponding to h = 0 and h = 24 are the same\n",
"# lat (axis 2) describes the latitude (an integer in [0, 179]) \n",
"# lon (axis 3) describes the longitude (an integer in [0, 359])\n",
"\n",
"# discarding the last hour, which duplicates the first one\n",
"wrf_raw_ip_data = wrf_raw_ip_data[:, :24, :, :]\n",
"\n",
"# normalisation of contributions to the IP to the global mean of 240 kV\n",
"wrf_raw_ip_data /= (1/240e3) * wrf_raw_ip_data.sum(axis=(-2,-1)).mean()\n",
"\n",
"# filling dictionaries with averaged arrays\n",
"wrf_daily_latitudal_ip = wrf_raw_ip_data.mean(axis=1).sum(axis=-1)\n",
"wrf_hourly_total_ip = wrf_raw_ip_data.sum(axis=(-2, -1))\n",
"\n",
@ -267,27 +313,53 @@ @@ -267,27 +313,53 @@
},
{
"cell_type": "code",
"execution_count": 45,
"execution_count": null,
"id": "5797fffa-a795-4241-a574-6c95f0195a5d",
"metadata": {},
"outputs": [],
"source": [
"# iterating over the CAPE threshold (J/kg) values used in modeling \n",
"# for each threshold, there are corresponding model datasets\n",
"for cape_thres in [800, 1000, 1200]:\n",
"\n",
" # initialization of an arrays to store time-averaged data over months\n",
" wrf_data_LATxMON = np.zeros((180, 12))\n",
" inmcm_data_LATxMON = np.zeros((120, 12))\n",
"\n",
" # iteration over month number (starting with 0)\n",
" for month_idx in range(12):\n",
"\n",
" # filtering day indices belonging to a specific month\n",
" wrf_monthly_indicies = [i for i, date in enumerate(wrf_dt_indicies) \n",
" if date.month == month_idx + 1]\n",
" inm_monthly_indicies = [i for i, date in enumerate(inmcm_dt_indicies) \n",
" if date.month == month_idx + 1]\n",
"\n",
" # filling with modeling values with a CAPE threshold \n",
" # averaged over months of the year\n",
" wrf_data_MONxLAT[:, month_idx] = \\\n",
" wrf_daily_latitudal_ip[cape_thres][monthly_indicies].mean(axis=0)\n",
" inmcm_data_LATxMON[:, month_idx] = \\\n",
" inmcm_daily_latitudal_ip[cape_thres][monthly_indicies].mean(axis=0)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "17036c19-95f8-40df-a6c9-f8a23cf426f6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4992\n"
]
}
],
"outputs": [],
"source": [
"# initialization of a array to store time-averaged data over months\n",
"wrf_data_LATxMON = np.zeros((180, 12))\n",
"\n",
"# iteration over month number (starting with 0)\n",
"for month_idx in range(12):\n",
" monthly_indicies = [\n",
" i for i, date in enumerate(wrf_dt_indicies) \n",
" if date.month == month_idx + 1\n",
" ]\n",
" # filtering day indices belonging to a specific month\n",
" monthly_indicies = [i for i, date in enumerate(wrf_dt_indicies)\n",
" if date.month == month_idx + 1]\n",
"\n",
" # filling with modeling values averaged over months of the year\n",
" wrf_data_LATxMON[:, month_idx] = \\\n",
" wrf_daily_latitudal_ip[monthly_indicies].mean(axis=0)\n",
"\n",
@ -304,47 +376,32 @@ @@ -304,47 +376,32 @@
},
{
"cell_type": "code",
"execution_count": 48,
"id": "6dfdae16-cb07-4580-97ba-414b5b2c1f2b",
"execution_count": null,
"id": "894ad630-17a5-4744-907e-a07768ff7848",
"metadata": {},
"outputs": [],
"source": [
"wrf_days = np.array([len([\n",
" i for i, date in enumerate(wrf_dt_indicies) \n",
" if date.month == m + 1\n",
" ]) for m in range(12)])\n",
"# saving the number of days for each month\n",
"# necessary for correct averaging due to \n",
"# different numbers of days in different months\n",
"\n",
"np.save(f\"./data/WRF/WRF_NUMDAYS_MON.npy\", wrf_days)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "762dd08f-7d1e-4b68-b272-e7aa9b26d9f1",
"metadata": {},
"outputs": [],
"source": [
"inm_days = np.array([len([\n",
" i for i, date in enumerate(inmcm_dt_indicies) \n",
" if date.month == m + 1\n",
" ]) for m in range(12)])\n",
"wrf_days = np.array([len([i for i, date in enumerate(wrf_dt_indicies) \n",
" if date.month == m + 1]) \n",
" for m in range(12)])\n",
"\n",
"inm_days = np.array([len([i for i, date in enumerate(inmcm_dt_indicies) \n",
" if date.month == m + 1]) \n",
" for m in range(12)])\n",
"\n",
"np.save(f\"./data/WRF/WRF_NUMDAYS_MON.npy\", wrf_days)\n",
"np.save(f\"./data/INMCM/INMCM_NUMDAYS_MON.npy\", inm_days)\n",
"\n",
"np.save(f\"./data/INMCM/INMCM_NUMDAYS_MON.npy\", inm_days)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"id": "78afb8e1-3975-4e19-993f-1b0c74c3e9bd",
"metadata": {},
"outputs": [],
"source": [
"# for average over months use\n",
"# `(wrf_data_LATxMON[:, :].sum(axis=0)*days).sum()/days.sum()`\n",
"# unstead\n",
"# `wrf_data_LATxMON[:, :].sum(axis=0).mean()`\n",
"# because\n",
"# ((a1+a2+a3)/3 + (b1+b2)/2)/2 != (a1+a2+a3+b1+b2)/5"
"# `((a1+a2+a3)/3 + (b1+b2)/2)/2 != (a1+a2+a3+b1+b2)/5`"
]
}
],

Loading…
Cancel
Save