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",
+ " year \n",
+ " DOY_firstbloom \n",
+ " geometry \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 129 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 136 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 153 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 135 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 153 \n",
+ " POINT (1.04712 0.28730) \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 167 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 168 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 179 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 128 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 175 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " \n",
+ " \n",
+ "
\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",
+ " 1 \n",
+ " 2 \n",
+ " 3 \n",
+ " 4 \n",
+ " 5 \n",
+ " 6 \n",
+ " 7 \n",
+ " 8 \n",
+ " 9 \n",
+ " 10 \n",
+ " ... \n",
+ " 356 \n",
+ " 357 \n",
+ " 358 \n",
+ " 359 \n",
+ " 360 \n",
+ " 361 \n",
+ " 362 \n",
+ " 363 \n",
+ " 364 \n",
+ " 365 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 0.307213 \n",
+ " -1.730910 \n",
+ " 1.142865 \n",
+ " -1.329763 \n",
+ " 0.176960 \n",
+ " -0.065294 \n",
+ " 0.480736 \n",
+ " -0.871330 \n",
+ " 0.000798 \n",
+ " 0.656874 \n",
+ " ... \n",
+ " -1.513503 \n",
+ " -0.264486 \n",
+ " 1.128968 \n",
+ " 1.585038 \n",
+ " 0.769073 \n",
+ " 0.223731 \n",
+ " -0.271954 \n",
+ " 0.934556 \n",
+ " -0.371321 \n",
+ " 0.527513 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 0.981330 \n",
+ " -0.629055 \n",
+ " 0.147775 \n",
+ " 0.177528 \n",
+ " -0.658201 \n",
+ " -0.508874 \n",
+ " 0.010616 \n",
+ " 0.054272 \n",
+ " 0.078030 \n",
+ " 1.134169 \n",
+ " ... \n",
+ " 1.293825 \n",
+ " -1.521819 \n",
+ " 0.562700 \n",
+ " -0.441175 \n",
+ " -0.623304 \n",
+ " 0.559502 \n",
+ " 0.194984 \n",
+ " -1.984875 \n",
+ " -1.686339 \n",
+ " 0.896396 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " -0.064179 \n",
+ " 1.031772 \n",
+ " 0.426700 \n",
+ " 0.785975 \n",
+ " 0.846932 \n",
+ " -1.573482 \n",
+ " 0.928517 \n",
+ " 0.015023 \n",
+ " -0.640847 \n",
+ " 2.018753 \n",
+ " ... \n",
+ " -0.733125 \n",
+ " -0.889653 \n",
+ " -2.083637 \n",
+ " 2.219374 \n",
+ " 0.512767 \n",
+ " 1.210230 \n",
+ " -0.257335 \n",
+ " -1.888650 \n",
+ " -0.897753 \n",
+ " -0.627711 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " -0.287284 \n",
+ " -1.271925 \n",
+ " 0.878782 \n",
+ " 0.853996 \n",
+ " 0.727292 \n",
+ " -2.365385 \n",
+ " -1.079522 \n",
+ " 1.152702 \n",
+ " 2.159849 \n",
+ " 0.015764 \n",
+ " ... \n",
+ " -1.521924 \n",
+ " -1.431645 \n",
+ " -0.872895 \n",
+ " -0.025135 \n",
+ " -0.834000 \n",
+ " 0.496014 \n",
+ " -0.605926 \n",
+ " -0.553788 \n",
+ " 0.050255 \n",
+ " 0.720794 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " -0.835895 \n",
+ " -0.371376 \n",
+ " 0.480107 \n",
+ " 0.292897 \n",
+ " 1.442436 \n",
+ " 0.949195 \n",
+ " 0.480992 \n",
+ " -1.092184 \n",
+ " -1.895761 \n",
+ " 0.180935 \n",
+ " ... \n",
+ " -0.232243 \n",
+ " -0.401761 \n",
+ " -0.222144 \n",
+ " 0.480351 \n",
+ " 1.092475 \n",
+ " 1.234285 \n",
+ " -0.249237 \n",
+ " -0.484025 \n",
+ " -0.531681 \n",
+ " -1.456187 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 0.208490 \n",
+ " 0.354984 \n",
+ " -0.152511 \n",
+ " 0.098195 \n",
+ " 1.386408 \n",
+ " 1.055924 \n",
+ " -1.034276 \n",
+ " -1.005105 \n",
+ " -0.900521 \n",
+ " 0.395284 \n",
+ " ... \n",
+ " -2.157407 \n",
+ " 0.280113 \n",
+ " -0.883831 \n",
+ " -1.388701 \n",
+ " 0.528675 \n",
+ " 0.267038 \n",
+ " -1.368319 \n",
+ " -1.096792 \n",
+ " 1.099992 \n",
+ " 0.396587 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " -0.624989 \n",
+ " -2.104158 \n",
+ " -1.639389 \n",
+ " -0.117674 \n",
+ " -1.728902 \n",
+ " 0.895439 \n",
+ " -1.073810 \n",
+ " 0.188181 \n",
+ " -0.330365 \n",
+ " 0.207237 \n",
+ " ... \n",
+ " -0.641100 \n",
+ " -1.031611 \n",
+ " -0.560739 \n",
+ " 0.426600 \n",
+ " -0.040521 \n",
+ " 0.255512 \n",
+ " 0.110917 \n",
+ " -0.603269 \n",
+ " -0.485403 \n",
+ " 0.088915 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 0.658223 \n",
+ " 0.719648 \n",
+ " 0.669712 \n",
+ " -0.267893 \n",
+ " 0.282330 \n",
+ " 0.091997 \n",
+ " 0.575704 \n",
+ " 0.075245 \n",
+ " -0.616297 \n",
+ " 0.765266 \n",
+ " ... \n",
+ " 0.766638 \n",
+ " -1.262343 \n",
+ " -0.449191 \n",
+ " -0.380143 \n",
+ " 0.122539 \n",
+ " 0.858159 \n",
+ " 0.265301 \n",
+ " -1.452599 \n",
+ " -1.632551 \n",
+ " -0.077418 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 1.216177 \n",
+ " 0.608043 \n",
+ " 1.819014 \n",
+ " -0.205315 \n",
+ " -0.924444 \n",
+ " 0.214525 \n",
+ " 0.713723 \n",
+ " 1.169773 \n",
+ " 0.143641 \n",
+ " 1.259080 \n",
+ " ... \n",
+ " -1.660429 \n",
+ " 1.097643 \n",
+ " 0.751109 \n",
+ " -0.353375 \n",
+ " 0.765719 \n",
+ " 0.048287 \n",
+ " -0.363845 \n",
+ " 0.698244 \n",
+ " 1.445932 \n",
+ " -0.277977 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " -0.815981 \n",
+ " -0.317910 \n",
+ " 0.518929 \n",
+ " 1.616109 \n",
+ " 0.355642 \n",
+ " 0.211716 \n",
+ " -1.197219 \n",
+ " -0.135824 \n",
+ " 0.597120 \n",
+ " 0.388386 \n",
+ " ... \n",
+ " 1.039741 \n",
+ " -0.685464 \n",
+ " 1.042412 \n",
+ " 1.016426 \n",
+ " 1.344937 \n",
+ " -1.247285 \n",
+ " 1.420088 \n",
+ " -0.006036 \n",
+ " -1.963635 \n",
+ " -0.336042 \n",
+ " \n",
+ " \n",
+ "
\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",
+ " year \n",
+ " DOY_firstbloom \n",
+ " geometry \n",
+ " 1 \n",
+ " 2 \n",
+ " 3 \n",
+ " 4 \n",
+ " 5 \n",
+ " 6 \n",
+ " 7 \n",
+ " ... \n",
+ " 356 \n",
+ " 357 \n",
+ " 358 \n",
+ " 359 \n",
+ " 360 \n",
+ " 361 \n",
+ " 362 \n",
+ " 363 \n",
+ " 364 \n",
+ " 365 \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 129 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " 0.307213 \n",
+ " -1.730910 \n",
+ " 1.142865 \n",
+ " -1.329763 \n",
+ " 0.176960 \n",
+ " -0.065294 \n",
+ " 0.480736 \n",
+ " ... \n",
+ " -1.513503 \n",
+ " -0.264486 \n",
+ " 1.128968 \n",
+ " 1.585038 \n",
+ " 0.769073 \n",
+ " 0.223731 \n",
+ " -0.271954 \n",
+ " 0.934556 \n",
+ " -0.371321 \n",
+ " 0.527513 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 136 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " 0.981330 \n",
+ " -0.629055 \n",
+ " 0.147775 \n",
+ " 0.177528 \n",
+ " -0.658201 \n",
+ " -0.508874 \n",
+ " 0.010616 \n",
+ " ... \n",
+ " 1.293825 \n",
+ " -1.521819 \n",
+ " 0.562700 \n",
+ " -0.441175 \n",
+ " -0.623304 \n",
+ " 0.559502 \n",
+ " 0.194984 \n",
+ " -1.984875 \n",
+ " -1.686339 \n",
+ " 0.896396 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 153 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " -0.064179 \n",
+ " 1.031772 \n",
+ " 0.426700 \n",
+ " 0.785975 \n",
+ " 0.846932 \n",
+ " -1.573482 \n",
+ " 0.928517 \n",
+ " ... \n",
+ " -0.733125 \n",
+ " -0.889653 \n",
+ " -2.083637 \n",
+ " 2.219374 \n",
+ " 0.512767 \n",
+ " 1.210230 \n",
+ " -0.257335 \n",
+ " -1.888650 \n",
+ " -0.897753 \n",
+ " -0.627711 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 135 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " -0.287284 \n",
+ " -1.271925 \n",
+ " 0.878782 \n",
+ " 0.853996 \n",
+ " 0.727292 \n",
+ " -2.365385 \n",
+ " -1.079522 \n",
+ " ... \n",
+ " -1.521924 \n",
+ " -1.431645 \n",
+ " -0.872895 \n",
+ " -0.025135 \n",
+ " -0.834000 \n",
+ " 0.496014 \n",
+ " -0.605926 \n",
+ " -0.553788 \n",
+ " 0.050255 \n",
+ " 0.720794 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 153 \n",
+ " POINT (1.04712 0.28730) \n",
+ " -0.835895 \n",
+ " -0.371376 \n",
+ " 0.480107 \n",
+ " 0.292897 \n",
+ " 1.442436 \n",
+ " 0.949195 \n",
+ " 0.480992 \n",
+ " ... \n",
+ " -0.232243 \n",
+ " -0.401761 \n",
+ " -0.222144 \n",
+ " 0.480351 \n",
+ " 1.092475 \n",
+ " 1.234285 \n",
+ " -0.249237 \n",
+ " -0.484025 \n",
+ " -0.531681 \n",
+ " -1.456187 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 167 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " 0.208490 \n",
+ " 0.354984 \n",
+ " -0.152511 \n",
+ " 0.098195 \n",
+ " 1.386408 \n",
+ " 1.055924 \n",
+ " -1.034276 \n",
+ " ... \n",
+ " -2.157407 \n",
+ " 0.280113 \n",
+ " -0.883831 \n",
+ " -1.388701 \n",
+ " 0.528675 \n",
+ " 0.267038 \n",
+ " -1.368319 \n",
+ " -1.096792 \n",
+ " 1.099992 \n",
+ " 0.396587 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 168 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " -0.624989 \n",
+ " -2.104158 \n",
+ " -1.639389 \n",
+ " -0.117674 \n",
+ " -1.728902 \n",
+ " 0.895439 \n",
+ " -1.073810 \n",
+ " ... \n",
+ " -0.641100 \n",
+ " -1.031611 \n",
+ " -0.560739 \n",
+ " 0.426600 \n",
+ " -0.040521 \n",
+ " 0.255512 \n",
+ " 0.110917 \n",
+ " -0.603269 \n",
+ " -0.485403 \n",
+ " 0.088915 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 179 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " 0.658223 \n",
+ " 0.719648 \n",
+ " 0.669712 \n",
+ " -0.267893 \n",
+ " 0.282330 \n",
+ " 0.091997 \n",
+ " 0.575704 \n",
+ " ... \n",
+ " 0.766638 \n",
+ " -1.262343 \n",
+ " -0.449191 \n",
+ " -0.380143 \n",
+ " 0.122539 \n",
+ " 0.858159 \n",
+ " 0.265301 \n",
+ " -1.452599 \n",
+ " -1.632551 \n",
+ " -0.077418 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 128 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " 1.216177 \n",
+ " 0.608043 \n",
+ " 1.819014 \n",
+ " -0.205315 \n",
+ " -0.924444 \n",
+ " 0.214525 \n",
+ " 0.713723 \n",
+ " ... \n",
+ " -1.660429 \n",
+ " 1.097643 \n",
+ " 0.751109 \n",
+ " -0.353375 \n",
+ " 0.765719 \n",
+ " 0.048287 \n",
+ " -0.363845 \n",
+ " 0.698244 \n",
+ " 1.445932 \n",
+ " -0.277977 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 175 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " -0.815981 \n",
+ " -0.317910 \n",
+ " 0.518929 \n",
+ " 1.616109 \n",
+ " 0.355642 \n",
+ " 0.211716 \n",
+ " -1.197219 \n",
+ " ... \n",
+ " 1.039741 \n",
+ " -0.685464 \n",
+ " 1.042412 \n",
+ " 1.016426 \n",
+ " 1.344937 \n",
+ " -1.247285 \n",
+ " 1.420088 \n",
+ " -0.006036 \n",
+ " -1.963635 \n",
+ " -0.336042 \n",
+ " \n",
+ " \n",
+ "
\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",
+ " year \n",
+ " DOY_firstbloom \n",
+ " geometry \n",
+ " temperature \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 129 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " 0 0.307213\n",
+ "1 -1.730910\n",
+ "2 1.14286... \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 136 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " 0 0.981330\n",
+ "1 -0.629055\n",
+ "2 0.14777... \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 153 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " 0 -0.064179\n",
+ "1 1.031772\n",
+ "2 0.42670... \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 135 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " 0 -0.287284\n",
+ "1 -1.271925\n",
+ "2 0.87878... \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 153 \n",
+ " POINT (1.04712 0.28730) \n",
+ " 0 -0.835895\n",
+ "1 -0.371376\n",
+ "2 0.48010... \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 167 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " 0 0.208490\n",
+ "1 0.354984\n",
+ "2 -0.15251... \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 168 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " 0 -0.624989\n",
+ "1 -2.104158\n",
+ "2 -1.63938... \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 179 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " 0 0.658223\n",
+ "1 0.719648\n",
+ "2 0.66971... \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 128 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " 0 1.216177\n",
+ "1 0.608043\n",
+ "2 1.81901... \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 175 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " 0 -0.815981\n",
+ "1 -0.317910\n",
+ "2 0.51892... \n",
+ " \n",
+ " \n",
+ "
\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",
+ " year \n",
+ " DOY_firstbloom \n",
+ " geometry \n",
+ " min \n",
+ " mean \n",
+ " max \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 129 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " -2.679822 \n",
+ " -0.001827 \n",
+ " 2.738706 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 136 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " -2.418653 \n",
+ " 0.018380 \n",
+ " 3.495607 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 153 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " -3.731281 \n",
+ " -0.006298 \n",
+ " 2.662745 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 135 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " -2.365385 \n",
+ " 0.059820 \n",
+ " 3.454617 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 153 \n",
+ " POINT (1.04712 0.28730) \n",
+ " -3.077907 \n",
+ " -0.008102 \n",
+ " 2.633713 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 167 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " -3.060988 \n",
+ " -0.050673 \n",
+ " 2.959994 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 168 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " -2.418248 \n",
+ " -0.013136 \n",
+ " 2.767561 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 179 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " -3.296214 \n",
+ " 0.006644 \n",
+ " 2.638542 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 128 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " -2.470182 \n",
+ " 0.020328 \n",
+ " 2.689228 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 175 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " -2.493179 \n",
+ " -0.025411 \n",
+ " 2.570942 \n",
+ " \n",
+ " \n",
+ "
\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",
+ " year \n",
+ " Days_until_firstbloom \n",
+ " geometry \n",
+ " min \n",
+ " mean \n",
+ " max \n",
+ " growing_degree_day \n",
+ " offset \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 99 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " -1.730910 \n",
+ " -0.162147 \n",
+ " 1.651318 \n",
+ " 21.555756 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 106 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " -2.350626 \n",
+ " 0.058488 \n",
+ " 1.225816 \n",
+ " 22.582670 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 123 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " -1.573482 \n",
+ " 0.323914 \n",
+ " 2.342201 \n",
+ " 28.081309 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 105 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " -2.365385 \n",
+ " 0.349394 \n",
+ " 2.942407 \n",
+ " 31.086575 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 123 \n",
+ " POINT (1.04712 0.28730) \n",
+ " -2.634010 \n",
+ " 0.100050 \n",
+ " 1.730784 \n",
+ " 28.519667 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 137 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " -1.236073 \n",
+ " 0.520351 \n",
+ " 2.663564 \n",
+ " 29.219836 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 138 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " -2.104158 \n",
+ " -0.145457 \n",
+ " 2.123773 \n",
+ " 23.504370 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 149 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " -1.411370 \n",
+ " 0.138744 \n",
+ " 1.540947 \n",
+ " 17.021493 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 98 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " -1.985387 \n",
+ " 0.358649 \n",
+ " 2.126795 \n",
+ " 24.811240 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 145 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " -2.289814 \n",
+ " 0.177645 \n",
+ " 1.981664 \n",
+ " 23.086738 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 69 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " -2.679822 \n",
+ " -0.268477 \n",
+ " 1.651318 \n",
+ " 47.154256 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 76 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " -1.905146 \n",
+ " -0.271571 \n",
+ " 1.438610 \n",
+ " 47.434034 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 93 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " -2.556728 \n",
+ " -0.118921 \n",
+ " 1.763059 \n",
+ " 51.212831 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 75 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " -2.344805 \n",
+ " -0.589733 \n",
+ " 0.971137 \n",
+ " 56.817790 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 93 \n",
+ " POINT (1.04712 0.28730) \n",
+ " -1.667008 \n",
+ " 0.095689 \n",
+ " 1.675573 \n",
+ " 51.395087 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 107 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " -2.749049 \n",
+ " -0.138087 \n",
+ " 1.746457 \n",
+ " 51.807783 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 108 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " -2.418248 \n",
+ " -0.169521 \n",
+ " 2.239476 \n",
+ " 45.974837 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 119 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " -1.877488 \n",
+ " 0.032869 \n",
+ " 2.339075 \n",
+ " 48.909758 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 68 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " -1.794195 \n",
+ " 0.102334 \n",
+ " 1.665198 \n",
+ " 48.141322 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 115 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " -1.576640 \n",
+ " -0.397232 \n",
+ " 0.890273 \n",
+ " 40.782806 \n",
+ " 60 \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 39 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " -2.510686 \n",
+ " -0.024325 \n",
+ " 2.738706 \n",
+ " 72.572063 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 46 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " -2.083939 \n",
+ " 0.110830 \n",
+ " 2.237018 \n",
+ " 74.145259 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 63 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " -2.687842 \n",
+ " 0.256801 \n",
+ " 2.318554 \n",
+ " 77.993194 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 45 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " -1.923695 \n",
+ " 0.315876 \n",
+ " 2.853286 \n",
+ " 86.059123 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 63 \n",
+ " POINT (1.04712 0.28730) \n",
+ " -1.619006 \n",
+ " -0.322039 \n",
+ " 2.633713 \n",
+ " 76.107665 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 77 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " -1.453476 \n",
+ " 0.087559 \n",
+ " 2.959994 \n",
+ " 75.045232 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 78 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " -1.770168 \n",
+ " 0.251152 \n",
+ " 2.327559 \n",
+ " 71.546147 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 89 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " -2.003270 \n",
+ " 0.273057 \n",
+ " 2.339075 \n",
+ " 74.034425 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 38 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " -2.178999 \n",
+ " 0.009964 \n",
+ " 2.333445 \n",
+ " 76.151754 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 85 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " -2.448074 \n",
+ " -0.123826 \n",
+ " 1.726888 \n",
+ " 62.903792 \n",
+ " 90 \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " 9 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " -1.759288 \n",
+ " 0.255768 \n",
+ " 2.280133 \n",
+ " 96.333066 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " 16 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " -1.687264 \n",
+ " -0.048790 \n",
+ " 1.425064 \n",
+ " 95.158674 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 33 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " -2.558622 \n",
+ " -0.553904 \n",
+ " 1.672368 \n",
+ " 112.108506 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " 15 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " -1.367312 \n",
+ " 0.266562 \n",
+ " 2.853286 \n",
+ " 109.082099 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 33 \n",
+ " POINT (1.04712 0.28730) \n",
+ " -3.077907 \n",
+ " -0.131941 \n",
+ " 1.701810 \n",
+ " 100.203567 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 47 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " -1.707630 \n",
+ " 0.083315 \n",
+ " 2.419678 \n",
+ " 98.394958 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 48 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " -1.522845 \n",
+ " 0.009362 \n",
+ " 2.054160 \n",
+ " 91.635259 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 59 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " -2.154758 \n",
+ " 0.097271 \n",
+ " 2.405996 \n",
+ " 99.643757 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " 8 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " -2.249100 \n",
+ " -0.105677 \n",
+ " 2.292550 \n",
+ " 101.847952 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 55 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " -1.785297 \n",
+ " 0.129849 \n",
+ " 1.762686 \n",
+ " 82.931286 \n",
+ " 120 \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " 2000 \n",
+ " -21 \n",
+ " POINT (-0.47519 0.04296) \n",
+ " -2.484236 \n",
+ " -0.165396 \n",
+ " 1.972587 \n",
+ " 123.360710 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2001 \n",
+ " -14 \n",
+ " POINT (-1.48409 -0.50742) \n",
+ " -1.515987 \n",
+ " 0.308416 \n",
+ " 2.317104 \n",
+ " 122.714397 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2002 \n",
+ " 3 \n",
+ " POINT (0.94426 -0.21199) \n",
+ " -1.372304 \n",
+ " -0.094755 \n",
+ " 2.080179 \n",
+ " 135.090858 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2003 \n",
+ " -15 \n",
+ " POINT (0.29152 -1.54929) \n",
+ " -2.341702 \n",
+ " 0.068816 \n",
+ " 2.686143 \n",
+ " 136.355286 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 2004 \n",
+ " 3 \n",
+ " POINT (1.04712 0.28730) \n",
+ " -1.977684 \n",
+ " 0.037744 \n",
+ " 2.232353 \n",
+ " 125.372210 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 2005 \n",
+ " 17 \n",
+ " POINT (-0.84866 -0.80568) \n",
+ " -2.741930 \n",
+ " -0.375609 \n",
+ " 1.989916 \n",
+ " 125.594786 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 2006 \n",
+ " 18 \n",
+ " POINT (-1.10011 0.54719) \n",
+ " -1.330190 \n",
+ " -0.000005 \n",
+ " 1.929659 \n",
+ " 111.302583 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 2007 \n",
+ " 29 \n",
+ " POINT (-0.52378 0.05342) \n",
+ " -2.265239 \n",
+ " -0.140482 \n",
+ " 1.872427 \n",
+ " 122.516384 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2008 \n",
+ " -22 \n",
+ " POINT (-0.78217 0.39899) \n",
+ " -1.579945 \n",
+ " 0.066553 \n",
+ " 1.361647 \n",
+ " 123.346219 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 2009 \n",
+ " 25 \n",
+ " POINT (-1.15685 -0.01451) \n",
+ " -2.278652 \n",
+ " -0.072205 \n",
+ " 1.526836 \n",
+ " 104.627512 \n",
+ " 150 \n",
+ " \n",
+ " \n",
+ "
\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
+}