From 2a3568799a44236d64e82da0bbefcc82061eb7cc Mon Sep 17 00:00:00 2001 From: Peter Kalverla Date: Fri, 22 Sep 2023 14:01:55 +0200 Subject: [PATCH] Create example notebook --- relative_training_data.ipynb | 2082 ++++++++++++++++++++++++++++++++++ 1 file changed, 2082 insertions(+) create mode 100644 relative_training_data.ipynb diff --git a/relative_training_data.ipynb b/relative_training_data.ipynb new file mode 100644 index 00000000..2666f348 --- /dev/null +++ b/relative_training_data.ipynb @@ -0,0 +1,2082 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fake data feature requests / MWE\n", + "\n", + "In this notebook we outline two main features we'd like to use in springtime.\n", + "To this end, we first make some fake sample data." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import geopandas as gpd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearDOY_firstbloomgeometry
02000129POINT (-0.47519 0.04296)
12001136POINT (-1.48409 -0.50742)
22002153POINT (0.94426 -0.21199)
32003135POINT (0.29152 -1.54929)
42004153POINT (1.04712 0.28730)
52005167POINT (-0.84866 -0.80568)
62006168POINT (-1.10011 0.54719)
72007179POINT (-0.52378 0.05342)
82008128POINT (-0.78217 0.39899)
92009175POINT (-1.15685 -0.01451)
\n", + "
" + ], + "text/plain": [ + " year DOY_firstbloom geometry\n", + "0 2000 129 POINT (-0.47519 0.04296)\n", + "1 2001 136 POINT (-1.48409 -0.50742)\n", + "2 2002 153 POINT (0.94426 -0.21199)\n", + "3 2003 135 POINT (0.29152 -1.54929)\n", + "4 2004 153 POINT (1.04712 0.28730)\n", + "5 2005 167 POINT (-0.84866 -0.80568)\n", + "6 2006 168 POINT (-1.10011 0.54719)\n", + "7 2007 179 POINT (-0.52378 0.05342)\n", + "8 2008 128 POINT (-0.78217 0.39899)\n", + "9 2009 175 POINT (-1.15685 -0.01451)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# We have random observations for 10 points:\n", + "obs = gpd.GeoDataFrame(\n", + " data = {\n", + " 'year': np.arange(2000, 2010), \n", + " 'DOY_firstbloom': np.random.randint(120, 180, size=10),\n", + " 'geometry': gpd.GeoSeries.from_xy(*np.random.randn(2, 10))\n", + " },\n", + ")\n", + "obs" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1 -0.258835\n", + "2 -0.542725\n", + "3 0.544299\n", + "4 0.934947\n", + "5 -0.515771\n", + " ... \n", + "361 -0.008609\n", + "362 0.358386\n", + "363 -0.700696\n", + "364 -0.749247\n", + "365 -0.039406\n", + "Name: temperature, Length: 365, dtype: float64" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# For each of these years/locations, we can retrieve temperature records for each DOY\n", + "get_temperature = lambda year, geometry: pd.Series(np.random.randn(365), index=np.arange(1, 366), name='temperature')\n", + "get_temperature(obs.geometry[0], 2000)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Combining observations and weather data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
12345678910...356357358359360361362363364365
00.307213-1.7309101.142865-1.3297630.176960-0.0652940.480736-0.8713300.0007980.656874...-1.513503-0.2644861.1289681.5850380.7690730.223731-0.2719540.934556-0.3713210.527513
10.981330-0.6290550.1477750.177528-0.658201-0.5088740.0106160.0542720.0780301.134169...1.293825-1.5218190.562700-0.441175-0.6233040.5595020.194984-1.984875-1.6863390.896396
2-0.0641791.0317720.4267000.7859750.846932-1.5734820.9285170.015023-0.6408472.018753...-0.733125-0.889653-2.0836372.2193740.5127671.210230-0.257335-1.888650-0.897753-0.627711
3-0.287284-1.2719250.8787820.8539960.727292-2.365385-1.0795221.1527022.1598490.015764...-1.521924-1.431645-0.872895-0.025135-0.8340000.496014-0.605926-0.5537880.0502550.720794
4-0.835895-0.3713760.4801070.2928971.4424360.9491950.480992-1.092184-1.8957610.180935...-0.232243-0.401761-0.2221440.4803511.0924751.234285-0.249237-0.484025-0.531681-1.456187
50.2084900.354984-0.1525110.0981951.3864081.055924-1.034276-1.005105-0.9005210.395284...-2.1574070.280113-0.883831-1.3887010.5286750.267038-1.368319-1.0967921.0999920.396587
6-0.624989-2.104158-1.639389-0.117674-1.7289020.895439-1.0738100.188181-0.3303650.207237...-0.641100-1.031611-0.5607390.426600-0.0405210.2555120.110917-0.603269-0.4854030.088915
70.6582230.7196480.669712-0.2678930.2823300.0919970.5757040.075245-0.6162970.765266...0.766638-1.262343-0.449191-0.3801430.1225390.8581590.265301-1.452599-1.632551-0.077418
81.2161770.6080431.819014-0.205315-0.9244440.2145250.7137231.1697730.1436411.259080...-1.6604291.0976430.751109-0.3533750.7657190.048287-0.3638450.6982441.445932-0.277977
9-0.815981-0.3179100.5189291.6161090.3556420.211716-1.197219-0.1358240.5971200.388386...1.039741-0.6854641.0424121.0164261.344937-1.2472851.420088-0.006036-1.963635-0.336042
\n", + "

10 rows × 365 columns

\n", + "
" + ], + "text/plain": [ + " 1 2 3 4 5 6 7 \\\n", + "0 0.307213 -1.730910 1.142865 -1.329763 0.176960 -0.065294 0.480736 \n", + "1 0.981330 -0.629055 0.147775 0.177528 -0.658201 -0.508874 0.010616 \n", + "2 -0.064179 1.031772 0.426700 0.785975 0.846932 -1.573482 0.928517 \n", + "3 -0.287284 -1.271925 0.878782 0.853996 0.727292 -2.365385 -1.079522 \n", + "4 -0.835895 -0.371376 0.480107 0.292897 1.442436 0.949195 0.480992 \n", + "5 0.208490 0.354984 -0.152511 0.098195 1.386408 1.055924 -1.034276 \n", + "6 -0.624989 -2.104158 -1.639389 -0.117674 -1.728902 0.895439 -1.073810 \n", + "7 0.658223 0.719648 0.669712 -0.267893 0.282330 0.091997 0.575704 \n", + "8 1.216177 0.608043 1.819014 -0.205315 -0.924444 0.214525 0.713723 \n", + "9 -0.815981 -0.317910 0.518929 1.616109 0.355642 0.211716 -1.197219 \n", + "\n", + " 8 9 10 ... 356 357 358 359 \\\n", + "0 -0.871330 0.000798 0.656874 ... -1.513503 -0.264486 1.128968 1.585038 \n", + "1 0.054272 0.078030 1.134169 ... 1.293825 -1.521819 0.562700 -0.441175 \n", + "2 0.015023 -0.640847 2.018753 ... -0.733125 -0.889653 -2.083637 2.219374 \n", + "3 1.152702 2.159849 0.015764 ... -1.521924 -1.431645 -0.872895 -0.025135 \n", + "4 -1.092184 -1.895761 0.180935 ... -0.232243 -0.401761 -0.222144 0.480351 \n", + "5 -1.005105 -0.900521 0.395284 ... -2.157407 0.280113 -0.883831 -1.388701 \n", + "6 0.188181 -0.330365 0.207237 ... -0.641100 -1.031611 -0.560739 0.426600 \n", + "7 0.075245 -0.616297 0.765266 ... 0.766638 -1.262343 -0.449191 -0.380143 \n", + "8 1.169773 0.143641 1.259080 ... -1.660429 1.097643 0.751109 -0.353375 \n", + "9 -0.135824 0.597120 0.388386 ... 1.039741 -0.685464 1.042412 1.016426 \n", + "\n", + " 360 361 362 363 364 365 \n", + "0 0.769073 0.223731 -0.271954 0.934556 -0.371321 0.527513 \n", + "1 -0.623304 0.559502 0.194984 -1.984875 -1.686339 0.896396 \n", + "2 0.512767 1.210230 -0.257335 -1.888650 -0.897753 -0.627711 \n", + "3 -0.834000 0.496014 -0.605926 -0.553788 0.050255 0.720794 \n", + "4 1.092475 1.234285 -0.249237 -0.484025 -0.531681 -1.456187 \n", + "5 0.528675 0.267038 -1.368319 -1.096792 1.099992 0.396587 \n", + "6 -0.040521 0.255512 0.110917 -0.603269 -0.485403 0.088915 \n", + "7 0.122539 0.858159 0.265301 -1.452599 -1.632551 -0.077418 \n", + "8 0.765719 0.048287 -0.363845 0.698244 1.445932 -0.277977 \n", + "9 1.344937 -1.247285 1.420088 -0.006036 -1.963635 -0.336042 \n", + "\n", + "[10 rows x 365 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# We can transpose the data and combine it with the \"observations\"\n", + "weather = obs.apply(lambda row: get_temperature(row.year, row.geometry), axis=1)\n", + "weather" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearDOY_firstbloomgeometry1234567...356357358359360361362363364365
02000129POINT (-0.47519 0.04296)0.307213-1.7309101.142865-1.3297630.176960-0.0652940.480736...-1.513503-0.2644861.1289681.5850380.7690730.223731-0.2719540.934556-0.3713210.527513
12001136POINT (-1.48409 -0.50742)0.981330-0.6290550.1477750.177528-0.658201-0.5088740.010616...1.293825-1.5218190.562700-0.441175-0.6233040.5595020.194984-1.984875-1.6863390.896396
22002153POINT (0.94426 -0.21199)-0.0641791.0317720.4267000.7859750.846932-1.5734820.928517...-0.733125-0.889653-2.0836372.2193740.5127671.210230-0.257335-1.888650-0.897753-0.627711
32003135POINT (0.29152 -1.54929)-0.287284-1.2719250.8787820.8539960.727292-2.365385-1.079522...-1.521924-1.431645-0.872895-0.025135-0.8340000.496014-0.605926-0.5537880.0502550.720794
42004153POINT (1.04712 0.28730)-0.835895-0.3713760.4801070.2928971.4424360.9491950.480992...-0.232243-0.401761-0.2221440.4803511.0924751.234285-0.249237-0.484025-0.531681-1.456187
52005167POINT (-0.84866 -0.80568)0.2084900.354984-0.1525110.0981951.3864081.055924-1.034276...-2.1574070.280113-0.883831-1.3887010.5286750.267038-1.368319-1.0967921.0999920.396587
62006168POINT (-1.10011 0.54719)-0.624989-2.104158-1.639389-0.117674-1.7289020.895439-1.073810...-0.641100-1.031611-0.5607390.426600-0.0405210.2555120.110917-0.603269-0.4854030.088915
72007179POINT (-0.52378 0.05342)0.6582230.7196480.669712-0.2678930.2823300.0919970.575704...0.766638-1.262343-0.449191-0.3801430.1225390.8581590.265301-1.452599-1.632551-0.077418
82008128POINT (-0.78217 0.39899)1.2161770.6080431.819014-0.205315-0.9244440.2145250.713723...-1.6604291.0976430.751109-0.3533750.7657190.048287-0.3638450.6982441.445932-0.277977
92009175POINT (-1.15685 -0.01451)-0.815981-0.3179100.5189291.6161090.3556420.211716-1.197219...1.039741-0.6854641.0424121.0164261.344937-1.2472851.420088-0.006036-1.963635-0.336042
\n", + "

10 rows × 368 columns

\n", + "
" + ], + "text/plain": [ + " year DOY_firstbloom geometry 1 2 \\\n", + "0 2000 129 POINT (-0.47519 0.04296) 0.307213 -1.730910 \n", + "1 2001 136 POINT (-1.48409 -0.50742) 0.981330 -0.629055 \n", + "2 2002 153 POINT (0.94426 -0.21199) -0.064179 1.031772 \n", + "3 2003 135 POINT (0.29152 -1.54929) -0.287284 -1.271925 \n", + "4 2004 153 POINT (1.04712 0.28730) -0.835895 -0.371376 \n", + "5 2005 167 POINT (-0.84866 -0.80568) 0.208490 0.354984 \n", + "6 2006 168 POINT (-1.10011 0.54719) -0.624989 -2.104158 \n", + "7 2007 179 POINT (-0.52378 0.05342) 0.658223 0.719648 \n", + "8 2008 128 POINT (-0.78217 0.39899) 1.216177 0.608043 \n", + "9 2009 175 POINT (-1.15685 -0.01451) -0.815981 -0.317910 \n", + "\n", + " 3 4 5 6 7 ... 356 357 \\\n", + "0 1.142865 -1.329763 0.176960 -0.065294 0.480736 ... -1.513503 -0.264486 \n", + "1 0.147775 0.177528 -0.658201 -0.508874 0.010616 ... 1.293825 -1.521819 \n", + "2 0.426700 0.785975 0.846932 -1.573482 0.928517 ... -0.733125 -0.889653 \n", + "3 0.878782 0.853996 0.727292 -2.365385 -1.079522 ... -1.521924 -1.431645 \n", + "4 0.480107 0.292897 1.442436 0.949195 0.480992 ... -0.232243 -0.401761 \n", + "5 -0.152511 0.098195 1.386408 1.055924 -1.034276 ... -2.157407 0.280113 \n", + "6 -1.639389 -0.117674 -1.728902 0.895439 -1.073810 ... -0.641100 -1.031611 \n", + "7 0.669712 -0.267893 0.282330 0.091997 0.575704 ... 0.766638 -1.262343 \n", + "8 1.819014 -0.205315 -0.924444 0.214525 0.713723 ... -1.660429 1.097643 \n", + "9 0.518929 1.616109 0.355642 0.211716 -1.197219 ... 1.039741 -0.685464 \n", + "\n", + " 358 359 360 361 362 363 364 \\\n", + "0 1.128968 1.585038 0.769073 0.223731 -0.271954 0.934556 -0.371321 \n", + "1 0.562700 -0.441175 -0.623304 0.559502 0.194984 -1.984875 -1.686339 \n", + "2 -2.083637 2.219374 0.512767 1.210230 -0.257335 -1.888650 -0.897753 \n", + "3 -0.872895 -0.025135 -0.834000 0.496014 -0.605926 -0.553788 0.050255 \n", + "4 -0.222144 0.480351 1.092475 1.234285 -0.249237 -0.484025 -0.531681 \n", + "5 -0.883831 -1.388701 0.528675 0.267038 -1.368319 -1.096792 1.099992 \n", + "6 -0.560739 0.426600 -0.040521 0.255512 0.110917 -0.603269 -0.485403 \n", + "7 -0.449191 -0.380143 0.122539 0.858159 0.265301 -1.452599 -1.632551 \n", + "8 0.751109 -0.353375 0.765719 0.048287 -0.363845 0.698244 1.445932 \n", + "9 1.042412 1.016426 1.344937 -1.247285 1.420088 -0.006036 -1.963635 \n", + "\n", + " 365 \n", + "0 0.527513 \n", + "1 0.896396 \n", + "2 -0.627711 \n", + "3 0.720794 \n", + "4 -1.456187 \n", + "5 0.396587 \n", + "6 0.088915 \n", + "7 -0.077418 \n", + "8 -0.277977 \n", + "9 -0.336042 \n", + "\n", + "[10 rows x 368 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "combined = pd.concat([obs, weather], axis=1)\n", + "combined" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearDOY_firstbloomgeometrytemperature
02000129POINT (-0.47519 0.04296)0 0.307213\n", + "1 -1.730910\n", + "2 1.14286...
12001136POINT (-1.48409 -0.50742)0 0.981330\n", + "1 -0.629055\n", + "2 0.14777...
22002153POINT (0.94426 -0.21199)0 -0.064179\n", + "1 1.031772\n", + "2 0.42670...
32003135POINT (0.29152 -1.54929)0 -0.287284\n", + "1 -1.271925\n", + "2 0.87878...
42004153POINT (1.04712 0.28730)0 -0.835895\n", + "1 -0.371376\n", + "2 0.48010...
52005167POINT (-0.84866 -0.80568)0 0.208490\n", + "1 0.354984\n", + "2 -0.15251...
62006168POINT (-1.10011 0.54719)0 -0.624989\n", + "1 -2.104158\n", + "2 -1.63938...
72007179POINT (-0.52378 0.05342)0 0.658223\n", + "1 0.719648\n", + "2 0.66971...
82008128POINT (-0.78217 0.39899)0 1.216177\n", + "1 0.608043\n", + "2 1.81901...
92009175POINT (-1.15685 -0.01451)0 -0.815981\n", + "1 -0.317910\n", + "2 0.51892...
\n", + "
" + ], + "text/plain": [ + " year DOY_firstbloom geometry \\\n", + "0 2000 129 POINT (-0.47519 0.04296) \n", + "1 2001 136 POINT (-1.48409 -0.50742) \n", + "2 2002 153 POINT (0.94426 -0.21199) \n", + "3 2003 135 POINT (0.29152 -1.54929) \n", + "4 2004 153 POINT (1.04712 0.28730) \n", + "5 2005 167 POINT (-0.84866 -0.80568) \n", + "6 2006 168 POINT (-1.10011 0.54719) \n", + "7 2007 179 POINT (-0.52378 0.05342) \n", + "8 2008 128 POINT (-0.78217 0.39899) \n", + "9 2009 175 POINT (-1.15685 -0.01451) \n", + "\n", + " temperature \n", + "0 0 0.307213\n", + "1 -1.730910\n", + "2 1.14286... \n", + "1 0 0.981330\n", + "1 -0.629055\n", + "2 0.14777... \n", + "2 0 -0.064179\n", + "1 1.031772\n", + "2 0.42670... \n", + "3 0 -0.287284\n", + "1 -1.271925\n", + "2 0.87878... \n", + "4 0 -0.835895\n", + "1 -0.371376\n", + "2 0.48010... \n", + "5 0 0.208490\n", + "1 0.354984\n", + "2 -0.15251... \n", + "6 0 -0.624989\n", + "1 -2.104158\n", + "2 -1.63938... \n", + "7 0 0.658223\n", + "1 0.719648\n", + "2 0.66971... \n", + "8 0 1.216177\n", + "1 0.608043\n", + "2 1.81901... \n", + "9 0 -0.815981\n", + "1 -0.317910\n", + "2 0.51892... " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# However, having so many columns is not good: we want to do feature extraction to reduce the number of columns\n", + "# Also, what if we have multiple variables? We need to make compound column names that are difficult to work with.\n", + "# How can we do this differently?\n", + "\n", + "# One option is to do the feature extraction before combining the dataframes.\n", + "# Or, we could just put more complex data types in the columns. The advantage of\n", + "# the latter is that we can use DOY_firstbloom in our feature extraction (see\n", + "# later on).\n", + "\n", + "# For example, we could insert weather as a pandas series:\n", + "combined = obs.assign(temperature=[pd.Series(v) for v in weather.values])\n", + "\n", + "# This is much more succinct:\n", + "combined" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearDOY_firstbloomgeometryminmeanmax
02000129POINT (-0.47519 0.04296)-2.679822-0.0018272.738706
12001136POINT (-1.48409 -0.50742)-2.4186530.0183803.495607
22002153POINT (0.94426 -0.21199)-3.731281-0.0062982.662745
32003135POINT (0.29152 -1.54929)-2.3653850.0598203.454617
42004153POINT (1.04712 0.28730)-3.077907-0.0081022.633713
52005167POINT (-0.84866 -0.80568)-3.060988-0.0506732.959994
62006168POINT (-1.10011 0.54719)-2.418248-0.0131362.767561
72007179POINT (-0.52378 0.05342)-3.2962140.0066442.638542
82008128POINT (-0.78217 0.39899)-2.4701820.0203282.689228
92009175POINT (-1.15685 -0.01451)-2.493179-0.0254112.570942
\n", + "
" + ], + "text/plain": [ + " year DOY_firstbloom geometry min mean \\\n", + "0 2000 129 POINT (-0.47519 0.04296) -2.679822 -0.001827 \n", + "1 2001 136 POINT (-1.48409 -0.50742) -2.418653 0.018380 \n", + "2 2002 153 POINT (0.94426 -0.21199) -3.731281 -0.006298 \n", + "3 2003 135 POINT (0.29152 -1.54929) -2.365385 0.059820 \n", + "4 2004 153 POINT (1.04712 0.28730) -3.077907 -0.008102 \n", + "5 2005 167 POINT (-0.84866 -0.80568) -3.060988 -0.050673 \n", + "6 2006 168 POINT (-1.10011 0.54719) -2.418248 -0.013136 \n", + "7 2007 179 POINT (-0.52378 0.05342) -3.296214 0.006644 \n", + "8 2008 128 POINT (-0.78217 0.39899) -2.470182 0.020328 \n", + "9 2009 175 POINT (-1.15685 -0.01451) -2.493179 -0.025411 \n", + "\n", + " max \n", + "0 2.738706 \n", + "1 3.495607 \n", + "2 2.662745 \n", + "3 3.454617 \n", + "4 2.633713 \n", + "5 2.959994 \n", + "6 2.767561 \n", + "7 2.638542 \n", + "8 2.689228 \n", + "9 2.570942 " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Eventually, we don't want a complex object like a pd.Series in our data\n", + "# so here we can do some feature extractions:\n", + "features = combined.temperature.apply(lambda s: s.agg(['min', 'mean', 'max']))\n", + "pd.concat([combined, features], axis=1).drop('temperature', axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# These feature extractions can now make use of the structure in the pandas\n", + "# series. It could also work on dataframes, or even on custom types\n", + "# e.g. \"ModisDataFrame\" which could have its own methods." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sliding window feature extraction\n", + "\n", + "The second feature request relates to the fact that we'd like to be able to predict **during** the growing season, i.e. we don't always have access to the full weather timeseries.\n", + "To that end, we propose to evaluate our feature extractions in a \"sliding window manner\".\n", + "\n", + "Notice that if we had done the feature extraction in an earlier stage, this procedure would be more difficult." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Current DOY: 30\n", + "Current DOY: 60\n", + "Current DOY: 90\n", + "Current DOY: 120\n", + "Current DOY: 150\n", + "Current DOY: 180\n", + "Current DOY: 210\n", + "Current DOY: 240\n", + "Current DOY: 270\n", + "Current DOY: 300\n", + "Current DOY: 330\n", + "Current DOY: 360\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearDays_until_firstbloomgeometryminmeanmaxgrowing_degree_dayoffset
0200099POINT (-0.47519 0.04296)-1.730910-0.1621471.65131821.55575630
12001106POINT (-1.48409 -0.50742)-2.3506260.0584881.22581622.58267030
22002123POINT (0.94426 -0.21199)-1.5734820.3239142.34220128.08130930
32003105POINT (0.29152 -1.54929)-2.3653850.3493942.94240731.08657530
42004123POINT (1.04712 0.28730)-2.6340100.1000501.73078428.51966730
52005137POINT (-0.84866 -0.80568)-1.2360730.5203512.66356429.21983630
62006138POINT (-1.10011 0.54719)-2.104158-0.1454572.12377323.50437030
72007149POINT (-0.52378 0.05342)-1.4113700.1387441.54094717.02149330
8200898POINT (-0.78217 0.39899)-1.9853870.3586492.12679524.81124030
92009145POINT (-1.15685 -0.01451)-2.2898140.1776451.98166423.08673830
0200069POINT (-0.47519 0.04296)-2.679822-0.2684771.65131847.15425660
1200176POINT (-1.48409 -0.50742)-1.905146-0.2715711.43861047.43403460
2200293POINT (0.94426 -0.21199)-2.556728-0.1189211.76305951.21283160
3200375POINT (0.29152 -1.54929)-2.344805-0.5897330.97113756.81779060
4200493POINT (1.04712 0.28730)-1.6670080.0956891.67557351.39508760
52005107POINT (-0.84866 -0.80568)-2.749049-0.1380871.74645751.80778360
62006108POINT (-1.10011 0.54719)-2.418248-0.1695212.23947645.97483760
72007119POINT (-0.52378 0.05342)-1.8774880.0328692.33907548.90975860
8200868POINT (-0.78217 0.39899)-1.7941950.1023341.66519848.14132260
92009115POINT (-1.15685 -0.01451)-1.576640-0.3972320.89027340.78280660
0200039POINT (-0.47519 0.04296)-2.510686-0.0243252.73870672.57206390
1200146POINT (-1.48409 -0.50742)-2.0839390.1108302.23701874.14525990
2200263POINT (0.94426 -0.21199)-2.6878420.2568012.31855477.99319490
3200345POINT (0.29152 -1.54929)-1.9236950.3158762.85328686.05912390
4200463POINT (1.04712 0.28730)-1.619006-0.3220392.63371376.10766590
5200577POINT (-0.84866 -0.80568)-1.4534760.0875592.95999475.04523290
6200678POINT (-1.10011 0.54719)-1.7701680.2511522.32755971.54614790
7200789POINT (-0.52378 0.05342)-2.0032700.2730572.33907574.03442590
8200838POINT (-0.78217 0.39899)-2.1789990.0099642.33344576.15175490
9200985POINT (-1.15685 -0.01451)-2.448074-0.1238261.72688862.90379290
020009POINT (-0.47519 0.04296)-1.7592880.2557682.28013396.333066120
1200116POINT (-1.48409 -0.50742)-1.687264-0.0487901.42506495.158674120
2200233POINT (0.94426 -0.21199)-2.558622-0.5539041.672368112.108506120
3200315POINT (0.29152 -1.54929)-1.3673120.2665622.853286109.082099120
4200433POINT (1.04712 0.28730)-3.077907-0.1319411.701810100.203567120
5200547POINT (-0.84866 -0.80568)-1.7076300.0833152.41967898.394958120
6200648POINT (-1.10011 0.54719)-1.5228450.0093622.05416091.635259120
7200759POINT (-0.52378 0.05342)-2.1547580.0972712.40599699.643757120
820088POINT (-0.78217 0.39899)-2.249100-0.1056772.292550101.847952120
9200955POINT (-1.15685 -0.01451)-1.7852970.1298491.76268682.931286120
02000-21POINT (-0.47519 0.04296)-2.484236-0.1653961.972587123.360710150
12001-14POINT (-1.48409 -0.50742)-1.5159870.3084162.317104122.714397150
220023POINT (0.94426 -0.21199)-1.372304-0.0947552.080179135.090858150
32003-15POINT (0.29152 -1.54929)-2.3417020.0688162.686143136.355286150
420043POINT (1.04712 0.28730)-1.9776840.0377442.232353125.372210150
5200517POINT (-0.84866 -0.80568)-2.741930-0.3756091.989916125.594786150
6200618POINT (-1.10011 0.54719)-1.330190-0.0000051.929659111.302583150
7200729POINT (-0.52378 0.05342)-2.265239-0.1404821.872427122.516384150
82008-22POINT (-0.78217 0.39899)-1.5799450.0665531.361647123.346219150
9200925POINT (-1.15685 -0.01451)-2.278652-0.0722051.526836104.627512150
\n", + "
" + ], + "text/plain": [ + " year Days_until_firstbloom geometry min mean \\\n", + "0 2000 99 POINT (-0.47519 0.04296) -1.730910 -0.162147 \n", + "1 2001 106 POINT (-1.48409 -0.50742) -2.350626 0.058488 \n", + "2 2002 123 POINT (0.94426 -0.21199) -1.573482 0.323914 \n", + "3 2003 105 POINT (0.29152 -1.54929) -2.365385 0.349394 \n", + "4 2004 123 POINT (1.04712 0.28730) -2.634010 0.100050 \n", + "5 2005 137 POINT (-0.84866 -0.80568) -1.236073 0.520351 \n", + "6 2006 138 POINT (-1.10011 0.54719) -2.104158 -0.145457 \n", + "7 2007 149 POINT (-0.52378 0.05342) -1.411370 0.138744 \n", + "8 2008 98 POINT (-0.78217 0.39899) -1.985387 0.358649 \n", + "9 2009 145 POINT (-1.15685 -0.01451) -2.289814 0.177645 \n", + "0 2000 69 POINT (-0.47519 0.04296) -2.679822 -0.268477 \n", + "1 2001 76 POINT (-1.48409 -0.50742) -1.905146 -0.271571 \n", + "2 2002 93 POINT (0.94426 -0.21199) -2.556728 -0.118921 \n", + "3 2003 75 POINT (0.29152 -1.54929) -2.344805 -0.589733 \n", + "4 2004 93 POINT (1.04712 0.28730) -1.667008 0.095689 \n", + "5 2005 107 POINT (-0.84866 -0.80568) -2.749049 -0.138087 \n", + "6 2006 108 POINT (-1.10011 0.54719) -2.418248 -0.169521 \n", + "7 2007 119 POINT (-0.52378 0.05342) -1.877488 0.032869 \n", + "8 2008 68 POINT (-0.78217 0.39899) -1.794195 0.102334 \n", + "9 2009 115 POINT (-1.15685 -0.01451) -1.576640 -0.397232 \n", + "0 2000 39 POINT (-0.47519 0.04296) -2.510686 -0.024325 \n", + "1 2001 46 POINT (-1.48409 -0.50742) -2.083939 0.110830 \n", + "2 2002 63 POINT (0.94426 -0.21199) -2.687842 0.256801 \n", + "3 2003 45 POINT (0.29152 -1.54929) -1.923695 0.315876 \n", + "4 2004 63 POINT (1.04712 0.28730) -1.619006 -0.322039 \n", + "5 2005 77 POINT (-0.84866 -0.80568) -1.453476 0.087559 \n", + "6 2006 78 POINT (-1.10011 0.54719) -1.770168 0.251152 \n", + "7 2007 89 POINT (-0.52378 0.05342) -2.003270 0.273057 \n", + "8 2008 38 POINT (-0.78217 0.39899) -2.178999 0.009964 \n", + "9 2009 85 POINT (-1.15685 -0.01451) -2.448074 -0.123826 \n", + "0 2000 9 POINT (-0.47519 0.04296) -1.759288 0.255768 \n", + "1 2001 16 POINT (-1.48409 -0.50742) -1.687264 -0.048790 \n", + "2 2002 33 POINT (0.94426 -0.21199) -2.558622 -0.553904 \n", + "3 2003 15 POINT (0.29152 -1.54929) -1.367312 0.266562 \n", + "4 2004 33 POINT (1.04712 0.28730) -3.077907 -0.131941 \n", + "5 2005 47 POINT (-0.84866 -0.80568) -1.707630 0.083315 \n", + "6 2006 48 POINT (-1.10011 0.54719) -1.522845 0.009362 \n", + "7 2007 59 POINT (-0.52378 0.05342) -2.154758 0.097271 \n", + "8 2008 8 POINT (-0.78217 0.39899) -2.249100 -0.105677 \n", + "9 2009 55 POINT (-1.15685 -0.01451) -1.785297 0.129849 \n", + "0 2000 -21 POINT (-0.47519 0.04296) -2.484236 -0.165396 \n", + "1 2001 -14 POINT (-1.48409 -0.50742) -1.515987 0.308416 \n", + "2 2002 3 POINT (0.94426 -0.21199) -1.372304 -0.094755 \n", + "3 2003 -15 POINT (0.29152 -1.54929) -2.341702 0.068816 \n", + "4 2004 3 POINT (1.04712 0.28730) -1.977684 0.037744 \n", + "5 2005 17 POINT (-0.84866 -0.80568) -2.741930 -0.375609 \n", + "6 2006 18 POINT (-1.10011 0.54719) -1.330190 -0.000005 \n", + "7 2007 29 POINT (-0.52378 0.05342) -2.265239 -0.140482 \n", + "8 2008 -22 POINT (-0.78217 0.39899) -1.579945 0.066553 \n", + "9 2009 25 POINT (-1.15685 -0.01451) -2.278652 -0.072205 \n", + "\n", + " max growing_degree_day offset \n", + "0 1.651318 21.555756 30 \n", + "1 1.225816 22.582670 30 \n", + "2 2.342201 28.081309 30 \n", + "3 2.942407 31.086575 30 \n", + "4 1.730784 28.519667 30 \n", + "5 2.663564 29.219836 30 \n", + "6 2.123773 23.504370 30 \n", + "7 1.540947 17.021493 30 \n", + "8 2.126795 24.811240 30 \n", + "9 1.981664 23.086738 30 \n", + "0 1.651318 47.154256 60 \n", + "1 1.438610 47.434034 60 \n", + "2 1.763059 51.212831 60 \n", + "3 0.971137 56.817790 60 \n", + "4 1.675573 51.395087 60 \n", + "5 1.746457 51.807783 60 \n", + "6 2.239476 45.974837 60 \n", + "7 2.339075 48.909758 60 \n", + "8 1.665198 48.141322 60 \n", + "9 0.890273 40.782806 60 \n", + "0 2.738706 72.572063 90 \n", + "1 2.237018 74.145259 90 \n", + "2 2.318554 77.993194 90 \n", + "3 2.853286 86.059123 90 \n", + "4 2.633713 76.107665 90 \n", + "5 2.959994 75.045232 90 \n", + "6 2.327559 71.546147 90 \n", + "7 2.339075 74.034425 90 \n", + "8 2.333445 76.151754 90 \n", + "9 1.726888 62.903792 90 \n", + "0 2.280133 96.333066 120 \n", + "1 1.425064 95.158674 120 \n", + "2 1.672368 112.108506 120 \n", + "3 2.853286 109.082099 120 \n", + "4 1.701810 100.203567 120 \n", + "5 2.419678 98.394958 120 \n", + "6 2.054160 91.635259 120 \n", + "7 2.405996 99.643757 120 \n", + "8 2.292550 101.847952 120 \n", + "9 1.762686 82.931286 120 \n", + "0 1.972587 123.360710 150 \n", + "1 2.317104 122.714397 150 \n", + "2 2.080179 135.090858 150 \n", + "3 2.686143 136.355286 150 \n", + "4 2.232353 125.372210 150 \n", + "5 1.989916 125.594786 150 \n", + "6 1.929659 111.302583 150 \n", + "7 1.872427 122.516384 150 \n", + "8 1.361647 123.346219 150 \n", + "9 1.526836 104.627512 150 " + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "window_size = 30\n", + "copies = []\n", + "for doy in range(window_size, 365, window_size):\n", + " print(f\"Current DOY: {doy}\")\n", + "\n", + " # Make doy relative to \"current\" day\n", + " data_copy = combined.copy().rename({'DOY_firstbloom': 'Days_until_firstbloom'}, axis=1)\n", + " data_copy.Days_until_firstbloom -= doy\n", + "\n", + " # Extract features relevant at \"current\" day in the growing season\n", + " features = data_copy.temperature.apply(lambda s: s.loc[(doy-window_size):doy].agg(['min', 'mean', 'max']))\n", + " gdd_feature = data_copy.temperature.apply(lambda s: s.abs().cumsum().loc[doy]).rename('growing_degree_day')\n", + "\n", + " # Combine time-specific features with time-specific target variable\n", + " combined_copy = pd.concat([data_copy, features, gdd_feature], axis=1).drop('temperature', axis=1) \n", + " combined_copy['offset'] = doy\n", + " copies.append(combined_copy)\n", + "\n", + "final_df = pd.concat(copies)\n", + "final_df.head(50)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "final_df.plot.scatter(x='growing_degree_day', y='Days_until_firstbloom')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "springtime", + "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.0" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +}