Robzy commited on
Commit
1237c34
·
1 Parent(s): 5bd4c3a

testing yml

Browse files
.github/rebuild.yml ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ name: rebuild-hf
2
+
3
+ on:
4
+ schedule:
5
+ - cron: "*/5 * * * *" # Run every 5 minutes (minimum allowed)
6
+ workflow_dispatch: # Enable manual triggers for debugging
7
+
8
+ jobs:
9
+ rebuild:
10
+ runs-on: ubuntu-latest
11
+
12
+ steps:
13
+ - name: Checkout repository
14
+ uses: actions/checkout@v3
15
+
16
+ - name: Debug rebuild - Update a dummy file
17
+ run: echo "$(date)" >> dummy.txt
18
+
19
+ - name: Commit and push changes
20
+ run: |
21
+ git config --global user.name "GitHub Actions"
22
+ git config --global user.email "[email protected]"
23
+ git add dummy.txt
24
+ git commit -m "Debug Rebuild Trigger: $(date)"
25
+ git push github
app_streamlit.py CHANGED
@@ -7,6 +7,21 @@ from functions import figure, util
7
  import os
8
  import pickle
9
  import plotly.express as px
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
 
12
  st.set_page_config(
 
7
  import os
8
  import pickle
9
  import plotly.express as px
10
+ import json
11
+
12
+ # Set up
13
+ api_key = os.getenv('HOPSWORKS_API_KEY')
14
+ project_name = os.getenv('HOPSWORKS_PROJECT')
15
+ project = hopsworks.login(project=project_name, api_key_value=api_key)
16
+ fs = project.get_feature_store()
17
+ secrets = util.secrets_api(project.name)
18
+
19
+ feature_view = fs.get_feature_view(
20
+ name='air_quality_fv',
21
+ version=1,
22
+ )
23
+ df = feature_view.get_batch_data(start_time=None, end_time=None, read_options=None).sort_values(by='date')
24
+ today = datetime.datetime.now() - datetime.timedelta(0)
25
 
26
 
27
  st.set_page_config(
debug.ipynb CHANGED
@@ -12,8 +12,8 @@
12
  "['/home/robert/anaconda3/lib/python312.zip', '/home/robert/anaconda3/lib/python3.12', '/home/robert/anaconda3/lib/python3.12/lib-dynload', '', '/home/robert/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages']\n",
13
  "Connected. Call `.close()` to terminate connection gracefully.\n",
14
  "\n",
15
- "Logged in to project, explore it here https://c.app.hopsworks.ai:443/p/1160340\n",
16
- "2024-11-20 14:06:19,944 WARNING: using legacy validation callback\n",
17
  "Connected. Call `.close()` to terminate connection gracefully.\n",
18
  "Connected. Call `.close()` to terminate connection gracefully.\n"
19
  ]
@@ -53,13 +53,228 @@
53
  "cell_type": "code",
54
  "execution_count": null,
55
  "metadata": {},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
56
  "outputs": [
57
  {
58
  "name": "stdout",
59
  "output_type": "stream",
60
  "text": [
61
  "Connected. Call `.close()` to terminate connection gracefully.\n",
62
- "Finished: Reading data from Hopsworks, using Hopsworks Feature Query Service (1.13s) \n"
63
  ]
64
  }
65
  ],
@@ -95,9 +310,17 @@
95
  },
96
  {
97
  "cell_type": "code",
98
- "execution_count": 18,
99
  "metadata": {},
100
  "outputs": [
 
 
 
 
 
 
 
 
101
  {
102
  "data": {
103
  "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACzS0lEQVR4nOzdd3xTVRvA8V+6dzooHdAWKFAoUAoFStl77y3KEGTJEARFVDaKiuLLRhBZgiiKyN5Tluwyy55ldhe6c98/0oaGTqALeL6fT2hy7rnnnpukoU/Ouc9RKYqiIIQQQgghhBBCiBxnkN8dEEIIIYQQQggh3lQSdAshhBBCCCGEELlEgm4hhBBCCCGEECKXSNAthBBCCCGEEELkEgm6hRBCCCGEEEKIXCJBtxBCCCGEEEIIkUsk6BZCCCGEEEIIIXKJBN1CCCGEEEIIIUQukaBbCCGEEEIIIYTIJRJ0CyFEBurVq0e9evV0j2/cuIFKpWLJkiX51qfnPd/HzERHR1O4cGFWrFiRu53KI8WKFaN3797ZrtuqVavc7VAylUrFhAkT8uRYuWHPnj2oVCr27NnzwvvOnz8fd3d34uLisr3P8uXLKVOmDMbGxtja2r7wMQuKF/ldTLFkyRJUKhU3btzIlT6lyMv3v8ievHrthRAFgwTdQrymUv7DTrmZmZlRunRphgwZwoMHD3T1Uv6AVqlU/Prrr+m2VbNmTVQqFeXLl9eVPX36lDlz5tCkSRNcXFywtramUqVKzJs3j6SkpGz1sVixYnp9TLkNHDgwy31T91ulUmFsbEyJEiXo2bMn165dy9bxC4qDBw8yYcIEwsPD87UfM2bMwNramm7duunKJkyYgEql4vHjx/nYs5xx/vx5JkyY8Eb9ERsdHc348eMpX748lpaWODg44Ovry0cffURwcHB+dy+N3r17Ex8fz08//ZSt+hcvXqR37954enqycOFCFixYkKv9y+r9LsFpwZTe/3eurq40bdqUmTNnEhUVlSvH/frrr1m7dm2a8oLymZ4fgoODmTBhAqdOncrvrgjxWjHK7w4IIV7NpEmTKF68OLGxsfz777/MmzePTZs2cfbsWSwsLHT1zMzMWLlyJe+9957e/jdu3ODgwYOYmZnplV+7do2hQ4fSsGFDPv74Y2xsbNi6dSsffvghhw8fZunSpdnqn6+vLyNHjtQrK126dLbPb9iwYVStWpWEhAROnDjBggUL2LhxI2fOnMHV1TXb7eQEDw8PYmJiMDY2fqH9Dh48yMSJE+ndu3e+jeQlJCQwY8YMRowYgaGhYb70IacFBQVhYPDsu+Pz588zceJE6tWrR7FixfKtXzExMRgZvfp/rwkJCdSpU4eLFy/Sq1cvhg4dSnR0NOfOnWPlypW0b98+z38HsmJmZkavXr2YPn06Q4cORaVSZVp/z549aDQaZsyYQcmSJfOolwVHjx496NatG6ampvndlddCyv93CQkJ3L9/nz179jB8+HCmT5/OunXr8PHxydHjff3113Tq1Il27drplefEZ/rr+toHBwczceJEihUrhq+vb353R4jXhgTdQrzmmjdvTpUqVQD44IMPcHBwYPr06fzzzz+88847unotWrRg3bp1PH78mEKFCunKV65ciZOTE6VKlSIsLExX7uzszJkzZyhXrpyubMCAAfTp04fFixczduzYbP2RXKRIkTSB/ouoXbs2nTp1AuD999+ndOnSDBs2jKVLlzJmzJh093ny5AmWlpYvfcyMpIywvI42bNjAo0eP6NKlS3535ZUoikJsbCzm5uYF9o/VnHqPrF27lpMnT7JixQq6d++uty02Npb4+PgcOU5O69KlC9999x27d++mQYMGmdZ9+PAhQI5+GfX06VO9LxwLMkNDwzfmS7DY2FhMTEz0vgjLaan/vwMYM2YMu3btolWrVrRp04YLFy5gbm6e4f659X/Dy3iTXnshRNZkerkQb5iUP3KvX7+uV962bVtMTU1ZvXq1XvnKlSvp0qVLmv/8CxUqpBdwp2jfvj0AFy5cyHaf4uPjefLkSbbrZ+b580uZLnr+/Hm6d++OnZ0dtWrV0tX/9ddf8fPzw9zcHHt7e7p168bt27fTtLtgwQI8PT0xNzenWrVq7N+/P02djK7pvnjxIl26dMHR0RFzc3O8vLz44osvdP375JNPAChevLhuemTqKdA52ceMrF27lmLFiuHp6ZntfVLbtWsXtWvXxtLSEltbW9q2bZvue2DPnj1UqVIFMzMzPD09+emnn3SvUWqLFy+mQYMGFC5cGFNTU7y9vZk3b16a9lKm+27dupUqVapgbm6um7qc+pruJUuW0LlzZwDq16+ve56fvy7533//pVq1apiZmVGiRAmWLVumtz1lGuu///7LsGHDcHR0xNbW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N26clixZovXr12v48OH6/vvvlZOT4/R48BH5+fmaOHGibrnlFq1cuVJbt27Vww8/rE2bNunqq69WaWmpAgICuHwF2rlzp/70pz9pzJgxWrp0qdLT09W6dWt99tlnTo8GH8KaAqtYU2CFL68plO5azOVyKS8vT7169ZIkRUVFqXfv3vr0008VFxenESNGqKSkRC6Xi+LtxzwejxYuXKgOHTrooYcekiTFxcVp5MiRSk1N1c6dOx2eEL6iqKhI+fn5GjJkiIKCgtSwYUONHj1a//rXv3TixAn1799fkhQQEMCa4sdKSkq0YMECXXnllZo2bZpCQ0OVkJCgv/71r1q1apUyMzOdHhE+gjUFVrCmwCpfXlMo3bVYaGiojDH6/PPPvcc8Ho8aN26s9957T263WxMmTJBUVtDhv5o0aaJhw4YpNjZWLpfLm5OoqCgVFxc7PR58RFRUlEpLS7Vy5UrvseDgYF111VV6/fXXdejQIT366KOSWFP8XUxMjAYPHqy6det6P8bXuHFjBQQEsKbAizUFVrGmwApfXlMo3bXcpEmTlJ6erjfeeEOSvB+paNmypf72t78pPT1dx44dc3hKOMUYo4CAAA0ZMkQTJ06UdPZal3r16ik2NlalpaXe5y9evNipUeEDXC6XRo0ape+//17Lly8vd/wPf/iDbrjhBqWlpZXLDPyLMUbBwcEaO3as903dMx/ja9y4sRo0aKCgoCDv8899YQT/w5qCi2FNQVX48ppC6a5F9u3bp6VLl+qjjz7S7t27JUlDhgxRp06dtGDBAr377ruS5H2HsE2bNjp27JiKioocmxnOKCwslFT2x8wYozp16ngfO5OPwsJC5eXlye12S5Iee+wxjRw50pst1H6HDh3SmjVrvDvFBgYG6vbbb5fb7dZLL72k1atXe58bFBSkbt26adeuXTp58qSDU8MJZ840nVlTYmNjvV+fWVMKCgqUk5Pj/ZszY8YM3X777Tp48KAzQ6PasabAKtYUWFGT1hRKdy1xZoOABx54QPfee686deqkl156SbGxsXrqqacUFRWl1157TbNmzZIknTx5UmvWrFHDhg0VGRnp8PSoTlu2bNHll1+uL774otLdGz0ejwoKClRQUKDIyEjNmTNHc+bM0bp169SiRYtqnhhO2LRpk3r16qU77rhDo0aNUo8ePfTxxx+rbdu2euONN5SZ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",
@@ -130,9 +353,58 @@
130
  },
131
  {
132
  "cell_type": "code",
133
- "execution_count": null,
134
  "metadata": {},
135
- "outputs": [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  "source": [
137
  "monitor_fg = fs.get_or_create_feature_group(\n",
138
  " name='aq_predictions',\n",
@@ -161,7 +433,7 @@
161
  },
162
  {
163
  "cell_type": "code",
164
- "execution_count": 19,
165
  "metadata": {},
166
  "outputs": [
167
  {
@@ -171,7 +443,7 @@
171
  "traceback": [
172
  "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
173
  "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
174
- "Cell \u001b[0;32mIn[19], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m hindcast_df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmerge\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpreds_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdate\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m hindcast_df \u001b[38;5;241m=\u001b[39m hindcast_df\u001b[38;5;241m.\u001b[39msort_values(by\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdate\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(hindcast_df) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n",
175
  "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:169\u001b[0m, in \u001b[0;36mmerge\u001b[0;34m(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _cross_merge(\n\u001b[1;32m 155\u001b[0m left_df,\n\u001b[1;32m 156\u001b[0m right_df,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 166\u001b[0m copy\u001b[38;5;241m=\u001b[39mcopy,\n\u001b[1;32m 167\u001b[0m )\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 169\u001b[0m op \u001b[38;5;241m=\u001b[39m \u001b[43m_MergeOperation\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_df\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 171\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_df\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 173\u001b[0m \u001b[43m \u001b[49m\u001b[43mon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mon\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_on\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mleft_on\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 175\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_on\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright_on\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 176\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mleft_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 177\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 178\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 179\u001b[0m \u001b[43m \u001b[49m\u001b[43msuffixes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msuffixes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 180\u001b[0m \u001b[43m \u001b[49m\u001b[43mindicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindicator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 181\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 182\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 183\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mget_result(copy\u001b[38;5;241m=\u001b[39mcopy)\n",
176
  "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:804\u001b[0m, in \u001b[0;36m_MergeOperation.__init__\u001b[0;34m(self, left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, indicator, validate)\u001b[0m\n\u001b[1;32m 800\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_tolerance(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mleft_join_keys)\n\u001b[1;32m 802\u001b[0m \u001b[38;5;66;03m# validate the merge keys dtypes. We may need to coerce\u001b[39;00m\n\u001b[1;32m 803\u001b[0m \u001b[38;5;66;03m# to avoid incompatible dtypes\u001b[39;00m\n\u001b[0;32m--> 804\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_maybe_coerce_merge_keys\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 806\u001b[0m \u001b[38;5;66;03m# If argument passed to validate,\u001b[39;00m\n\u001b[1;32m 807\u001b[0m \u001b[38;5;66;03m# check if columns specified as unique\u001b[39;00m\n\u001b[1;32m 808\u001b[0m \u001b[38;5;66;03m# are in fact unique.\u001b[39;00m\n\u001b[1;32m 809\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m validate \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
177
  "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:1483\u001b[0m, in \u001b[0;36m_MergeOperation._maybe_coerce_merge_keys\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1481\u001b[0m \u001b[38;5;66;03m# datetimelikes must match exactly\u001b[39;00m\n\u001b[1;32m 1482\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m needs_i8_conversion(lk\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m needs_i8_conversion(rk\u001b[38;5;241m.\u001b[39mdtype):\n\u001b[0;32m-> 1483\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[1;32m 1484\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m needs_i8_conversion(lk\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m needs_i8_conversion(rk\u001b[38;5;241m.\u001b[39mdtype):\n\u001b[1;32m 1485\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n",
@@ -191,7 +463,7 @@
191
  },
192
  {
193
  "cell_type": "code",
194
- "execution_count": 23,
195
  "metadata": {},
196
  "outputs": [
197
  {
 
12
  "['/home/robert/anaconda3/lib/python312.zip', '/home/robert/anaconda3/lib/python3.12', '/home/robert/anaconda3/lib/python3.12/lib-dynload', '', '/home/robert/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages']\n",
13
  "Connected. Call `.close()` to terminate connection gracefully.\n",
14
  "\n",
15
+ "Logged in to project, explore it here https://c.app.hopsworks.ai:443/p/1160344\n",
16
+ "2024-11-20 18:13:36,962 WARNING: using legacy validation callback\n",
17
  "Connected. Call `.close()` to terminate connection gracefully.\n",
18
  "Connected. Call `.close()` to terminate connection gracefully.\n"
19
  ]
 
53
  "cell_type": "code",
54
  "execution_count": null,
55
  "metadata": {},
56
+ "outputs": [
57
+ {
58
+ "name": "stdout",
59
+ "output_type": "stream",
60
+ "text": [
61
+ "Finished: Reading data from Hopsworks, using Hopsworks Feature Query Service (1.80s) \n"
62
+ ]
63
+ },
64
+ {
65
+ "data": {
66
+ "text/html": [
67
+ "<div>\n",
68
+ "<style scoped>\n",
69
+ " .dataframe tbody tr th:only-of-type {\n",
70
+ " vertical-align: middle;\n",
71
+ " }\n",
72
+ "\n",
73
+ " .dataframe tbody tr th {\n",
74
+ " vertical-align: top;\n",
75
+ " }\n",
76
+ "\n",
77
+ " .dataframe thead th {\n",
78
+ " text-align: right;\n",
79
+ " }\n",
80
+ "</style>\n",
81
+ "<table border=\"1\" class=\"dataframe\">\n",
82
+ " <thead>\n",
83
+ " <tr style=\"text-align: right;\">\n",
84
+ " <th></th>\n",
85
+ " <th>past_air_quality</th>\n",
86
+ " <th>date</th>\n",
87
+ " <th>temperature_2m_mean</th>\n",
88
+ " <th>precipitation_sum</th>\n",
89
+ " <th>wind_speed_10m_max</th>\n",
90
+ " <th>wind_direction_10m_dominant</th>\n",
91
+ " <th>city</th>\n",
92
+ " </tr>\n",
93
+ " </thead>\n",
94
+ " <tbody>\n",
95
+ " <tr>\n",
96
+ " <th>0</th>\n",
97
+ " <td>42.354327</td>\n",
98
+ " <td>2019-12-09 00:00:00+00:00</td>\n",
99
+ " <td>14.900082</td>\n",
100
+ " <td>0.2</td>\n",
101
+ " <td>9.422101</td>\n",
102
+ " <td>11.842063</td>\n",
103
+ " <td>lahore</td>\n",
104
+ " </tr>\n",
105
+ " <tr>\n",
106
+ " <th>1</th>\n",
107
+ " <td>42.354327</td>\n",
108
+ " <td>2019-12-10 00:00:00+00:00</td>\n",
109
+ " <td>14.052165</td>\n",
110
+ " <td>0.0</td>\n",
111
+ " <td>8.534353</td>\n",
112
+ " <td>69.443985</td>\n",
113
+ " <td>lahore</td>\n",
114
+ " </tr>\n",
115
+ " <tr>\n",
116
+ " <th>2</th>\n",
117
+ " <td>264.953334</td>\n",
118
+ " <td>2019-12-11 00:00:00+00:00</td>\n",
119
+ " <td>14.975082</td>\n",
120
+ " <td>2.3</td>\n",
121
+ " <td>8.089993</td>\n",
122
+ " <td>99.649574</td>\n",
123
+ " <td>lahore</td>\n",
124
+ " </tr>\n",
125
+ " <tr>\n",
126
+ " <th>3</th>\n",
127
+ " <td>199.996670</td>\n",
128
+ " <td>2019-12-12 00:00:00+00:00</td>\n",
129
+ " <td>13.347999</td>\n",
130
+ " <td>15.8</td>\n",
131
+ " <td>16.904673</td>\n",
132
+ " <td>72.617531</td>\n",
133
+ " <td>lahore</td>\n",
134
+ " </tr>\n",
135
+ " <tr>\n",
136
+ " <th>4</th>\n",
137
+ " <td>125.423336</td>\n",
138
+ " <td>2019-12-13 00:00:00+00:00</td>\n",
139
+ " <td>12.170915</td>\n",
140
+ " <td>0.0</td>\n",
141
+ " <td>11.525623</td>\n",
142
+ " <td>243.006943</td>\n",
143
+ " <td>lahore</td>\n",
144
+ " </tr>\n",
145
+ " <tr>\n",
146
+ " <th>...</th>\n",
147
+ " <td>...</td>\n",
148
+ " <td>...</td>\n",
149
+ " <td>...</td>\n",
150
+ " <td>...</td>\n",
151
+ " <td>...</td>\n",
152
+ " <td>...</td>\n",
153
+ " <td>...</td>\n",
154
+ " </tr>\n",
155
+ " <tr>\n",
156
+ " <th>1796</th>\n",
157
+ " <td>164.996668</td>\n",
158
+ " <td>2024-11-15 00:00:00+00:00</td>\n",
159
+ " <td>20.023001</td>\n",
160
+ " <td>1.6</td>\n",
161
+ " <td>12.982480</td>\n",
162
+ " <td>17.241518</td>\n",
163
+ " <td>lahore</td>\n",
164
+ " </tr>\n",
165
+ " <tr>\n",
166
+ " <th>1797</th>\n",
167
+ " <td>188.106669</td>\n",
168
+ " <td>2024-11-16 00:00:00+00:00</td>\n",
169
+ " <td>18.385500</td>\n",
170
+ " <td>0.0</td>\n",
171
+ " <td>6.330782</td>\n",
172
+ " <td>24.163300</td>\n",
173
+ " <td>lahore</td>\n",
174
+ " </tr>\n",
175
+ " <tr>\n",
176
+ " <th>1798</th>\n",
177
+ " <td>128.040002</td>\n",
178
+ " <td>2024-11-17 00:00:00+00:00</td>\n",
179
+ " <td>17.897999</td>\n",
180
+ " <td>0.0</td>\n",
181
+ " <td>7.040739</td>\n",
182
+ " <td>297.781921</td>\n",
183
+ " <td>lahore</td>\n",
184
+ " </tr>\n",
185
+ " <tr>\n",
186
+ " <th>1799</th>\n",
187
+ " <td>84.966668</td>\n",
188
+ " <td>2024-11-17 00:00:00+00:00</td>\n",
189
+ " <td>17.897999</td>\n",
190
+ " <td>0.0</td>\n",
191
+ " <td>7.040739</td>\n",
192
+ " <td>297.781921</td>\n",
193
+ " <td>lahore</td>\n",
194
+ " </tr>\n",
195
+ " <tr>\n",
196
+ " <th>1800</th>\n",
197
+ " <td>84.966667</td>\n",
198
+ " <td>2024-11-19 00:00:00+00:00</td>\n",
199
+ " <td>21.299999</td>\n",
200
+ " <td>0.0</td>\n",
201
+ " <td>6.618519</td>\n",
202
+ " <td>292.380188</td>\n",
203
+ " <td>lahore</td>\n",
204
+ " </tr>\n",
205
+ " </tbody>\n",
206
+ "</table>\n",
207
+ "<p>1801 rows × 7 columns</p>\n",
208
+ "</div>"
209
+ ],
210
+ "text/plain": [
211
+ " past_air_quality date temperature_2m_mean \\\n",
212
+ "0 42.354327 2019-12-09 00:00:00+00:00 14.900082 \n",
213
+ "1 42.354327 2019-12-10 00:00:00+00:00 14.052165 \n",
214
+ "2 264.953334 2019-12-11 00:00:00+00:00 14.975082 \n",
215
+ "3 199.996670 2019-12-12 00:00:00+00:00 13.347999 \n",
216
+ "4 125.423336 2019-12-13 00:00:00+00:00 12.170915 \n",
217
+ "... ... ... ... \n",
218
+ "1796 164.996668 2024-11-15 00:00:00+00:00 20.023001 \n",
219
+ "1797 188.106669 2024-11-16 00:00:00+00:00 18.385500 \n",
220
+ "1798 128.040002 2024-11-17 00:00:00+00:00 17.897999 \n",
221
+ "1799 84.966668 2024-11-17 00:00:00+00:00 17.897999 \n",
222
+ "1800 84.966667 2024-11-19 00:00:00+00:00 21.299999 \n",
223
+ "\n",
224
+ " precipitation_sum wind_speed_10m_max wind_direction_10m_dominant \\\n",
225
+ "0 0.2 9.422101 11.842063 \n",
226
+ "1 0.0 8.534353 69.443985 \n",
227
+ "2 2.3 8.089993 99.649574 \n",
228
+ "3 15.8 16.904673 72.617531 \n",
229
+ "4 0.0 11.525623 243.006943 \n",
230
+ "... ... ... ... \n",
231
+ "1796 1.6 12.982480 17.241518 \n",
232
+ "1797 0.0 6.330782 24.163300 \n",
233
+ "1798 0.0 7.040739 297.781921 \n",
234
+ "1799 0.0 7.040739 297.781921 \n",
235
+ "1800 0.0 6.618519 292.380188 \n",
236
+ "\n",
237
+ " city \n",
238
+ "0 lahore \n",
239
+ "1 lahore \n",
240
+ "2 lahore \n",
241
+ "3 lahore \n",
242
+ "4 lahore \n",
243
+ "... ... \n",
244
+ "1796 lahore \n",
245
+ "1797 lahore \n",
246
+ "1798 lahore \n",
247
+ "1799 lahore \n",
248
+ "1800 lahore \n",
249
+ "\n",
250
+ "[1801 rows x 7 columns]"
251
+ ]
252
+ },
253
+ "execution_count": 5,
254
+ "metadata": {},
255
+ "output_type": "execute_result"
256
+ }
257
+ ],
258
+ "source": [
259
+ "feature_view = fs.get_feature_view(\n",
260
+ " name='air_quality_fv',\n",
261
+ " version=1,\n",
262
+ ")\n",
263
+ "df = feature_view.get_batch_data(start_time=None, end_time=None, read_options=None).sort_values(by='date')\n",
264
+ "df"
265
+ ]
266
+ },
267
+ {
268
+ "cell_type": "code",
269
+ "execution_count": 2,
270
+ "metadata": {},
271
  "outputs": [
272
  {
273
  "name": "stdout",
274
  "output_type": "stream",
275
  "text": [
276
  "Connected. Call `.close()` to terminate connection gracefully.\n",
277
+ "Finished: Reading data from Hopsworks, using Hopsworks Feature Query Service (0.97s) \n"
278
  ]
279
  }
280
  ],
 
310
  },
311
  {
312
  "cell_type": "code",
313
+ "execution_count": 3,
314
  "metadata": {},
315
  "outputs": [
316
+ {
317
+ "name": "stdout",
318
+ "output_type": "stream",
319
+ "text": [
320
+ "2024-11-20 17:29:20,170 WARNING: DeprecationWarning: backend2gui is deprecated since IPython 8.24, backends are managed in matplotlib and can be externally registered.\n",
321
+ "\n"
322
+ ]
323
+ },
324
  {
325
  "data": {
326
  "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACzS0lEQVR4nOzdd3xTVRvA8V+6dzooHdAWKFAoUAoFStl77y3KEGTJEARFVDaKiuLLRhBZgiiKyN5Tluwyy55ldhe6c98/0oaGTqALeL6fT2hy7rnnnpukoU/Ouc9RKYqiIIQQQgghhBBCiBxnkN8dEEIIIYQQQggh3lQSdAshhBBCCCGEELlEgm4hhBBCCCGEECKXSNAthBBCCCGEEELkEgm6hRBCCCGEEEKIXCJBtxBCCCGEEEIIkUsk6BZCCCGEEEIIIXKJBN1CCCGEEEIIIUQukaBbCCGEEEIIIYTIJRJ0CyFEBurVq0e9evV0j2/cuIFKpWLJkiX51qfnPd/HzERHR1O4cGFWrFiRu53KI8WKFaN3797ZrtuqVavc7VAylUrFhAkT8uRYuWHPnj2oVCr27NnzwvvOnz8fd3d34uLisr3P8uXLKVOmDMbGxtja2r7wMQuKF/ldTLFkyRJUKhU3btzIlT6lyMv3v8ievHrthRAFgwTdQrymUv7DTrmZmZlRunRphgwZwoMHD3T1Uv6AVqlU/Prrr+m2VbNmTVQqFeXLl9eVPX36lDlz5tCkSRNcXFywtramUqVKzJs3j6SkpGz1sVixYnp9TLkNHDgwy31T91ulUmFsbEyJEiXo2bMn165dy9bxC4qDBw8yYcIEwsPD87UfM2bMwNramm7duunKJkyYgEql4vHjx/nYs5xx/vx5JkyY8Eb9ERsdHc348eMpX748lpaWODg44Ovry0cffURwcHB+dy+N3r17Ex8fz08//ZSt+hcvXqR37954enqycOFCFixYkKv9y+r9LsFpwZTe/3eurq40bdqUmTNnEhUVlSvH/frrr1m7dm2a8oLymZ4fgoODmTBhAqdOncrvrgjxWjHK7w4IIV7NpEmTKF68OLGxsfz777/MmzePTZs2cfbsWSwsLHT1zMzMWLlyJe+9957e/jdu3ODgwYOYmZnplV+7do2hQ4fSsGFDPv74Y2xsbNi6dSsffvghhw8fZunSpdnqn6+vLyNHjtQrK126dLbPb9iwYVStWpWEhAROnDjBggUL2LhxI2fOnMHV1TXb7eQEDw8PYmJiMDY2fqH9Dh48yMSJE+ndu3e+jeQlJCQwY8YMRowYgaGhYb70IacFBQVhYPDsu+Pz588zceJE6tWrR7FixfKtXzExMRgZvfp/rwkJCdSpU4eLFy/Sq1cvhg4dSnR0NOfOnWPlypW0b98+z38HsmJmZkavXr2YPn06Q4cORaVSZVp/z549aDQaZsyYQcmSJfOolwVHjx496NatG6ampvndlddCyv93CQkJ3L9/nz179jB8+HCmT5/OunXr8PHxydHjff3113Tq1Il27drplefEZ/rr+toHBwczceJEihUrhq+vb353R4jXhgTdQrzmmjdvTpUqVQD44IMPcHBwYPr06fzzzz+88847unotWrRg3bp1PH78mEKFCunKV65ciZOTE6VKlSIsLExX7uzszJkzZyhXrpyubMCAAfTp04fFixczduzYbP2RXKRIkTSB/ouoXbs2nTp1AuD999+ndOnSDBs2jKVLlzJmzJh093ny5AmWlpYvfcyMpIywvI42bNjAo0eP6NKlS3535ZUoikJsbCzm5uYF9o/VnHqPrF27lpMnT7JixQq6d++uty02Npb4+PgcOU5O69KlC9999x27d++mQYMGmdZ9+PAhQI5+GfX06VO9LxwLMkNDwzfmS7DY2FhMTEz0vgjLaan/vwMYM2YMu3btolWrVrRp04YLFy5gbm6e4f659X/Dy3iTXnshRNZkerkQb5iUP3KvX7+uV962bVtMTU1ZvXq1XvnKlSvp0qVLmv/8CxUqpBdwp2jfvj0AFy5cyHaf4uPjefLkSbbrZ+b580uZLnr+/Hm6d++OnZ0dtWrV0tX/9ddf8fPzw9zcHHt7e7p168bt27fTtLtgwQI8PT0xNzenWrVq7N+/P02djK7pvnjxIl26dMHR0RFzc3O8vLz44osvdP375JNPAChevLhuemTqKdA52ceMrF27lmLFiuHp6ZntfVLbtWsXtWvXxtLSEltbW9q2bZvue2DPnj1UqVIFMzMzPD09+emnn3SvUWqLFy+mQYMGFC5cGFNTU7y9vZk3b16a9lKm+27dupUqVapgbm6um7qc+pruJUuW0LlzZwDq16+ve56fvy7533//pVq1apiZmVGiRAmWLVumtz1lGuu///7LsGHDcHR0xNbW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N26clixZovXr12v48OH6/vvvlZOT4/R48BH5+fmaOHGibrnlFq1cuVJbt27Vww8/rE2bNunqq69WaWmpAgICuHwF2rlzp/70pz9pzJgxWrp0qdLT09W6dWt99tlnTo8GH8KaAqtYU2CFL68plO5azOVyKS8vT7169ZIkRUVFqXfv3vr0008VFxenESNGqKSkRC6Xi+LtxzwejxYuXKgOHTrooYcekiTFxcVp5MiRSk1N1c6dOx2eEL6iqKhI+fn5GjJkiIKCgtSwYUONHj1a//rXv3TixAn1799fkhQQEMCa4sdKSkq0YMECXXnllZo2bZpCQ0OVkJCgv/71r1q1apUyMzOdHhE+gjUFVrCmwCpfXlMo3bVYaGiojDH6/PPPvcc8Ho8aN26s9957T263WxMmTJBUVtDhv5o0aaJhw4YpNjZWLpfLm5OoqCgVFxc7PR58RFRUlEpLS7Vy5UrvseDgYF111VV6/fXXdejQIT366KOSWFP8XUxMjAYPHqy6det6P8bXuHFjBQQEsKbAizUFVrGmwApfXlMo3bXcpEmTlJ6erjfeeEOSvB+paNmypf72t78pPT1dx44dc3hKOMUYo4CAAA0ZMkQTJ06UdPZal3r16ik2NlalpaXe5y9evNipUeEDXC6XRo0ape+//17Lly8vd/wPf/iDbrjhBqWlpZXLDPyLMUbBwcEaO3as903dMx/ja9y4sRo0aKCgoCDv8899YQT/w5qCi2FNQVX48ppC6a5F9u3bp6VLl+qjjz7S7t27JUlDhgxRp06dtGDBAr377ruS5H2HsE2bNjp27JiKioocmxnOKCwslFT2x8wYozp16ngfO5OPwsJC5eXlye12S5Iee+wxjRw50pst1H6HDh3SmjVrvDvFBgYG6vbbb5fb7dZLL72k1atXe58bFBSkbt26adeuXTp58qSDU8MJZ840nVlTYmNjvV+fWVMKCgqUk5Pj/ZszY8YM3X777Tp48KAzQ6PasabAKtYUWFGT1hRKdy1xZoOABx54QPfee686deqkl156SbGxsXrqqacUFRWl1157TbNmzZIknTx5UmvWrFHDhg0VGRnp8PSoTlu2bNHll1+uL774otLdGz0ejwoKClRQUKDIyEjNmTNHc+bM0bp169SiRYtqnhhO2LRpk3r16qU77rhDo0aNUo8ePfTxxx+rbdu2euONN5SZ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",
 
353
  },
354
  {
355
  "cell_type": "code",
356
+ "execution_count": 4,
357
  "metadata": {},
358
+ "outputs": [
359
+ {
360
+ "name": "stdout",
361
+ "output_type": "stream",
362
+ "text": [
363
+ "Batch data: date temperature_2m_mean precipitation_sum \\\n",
364
+ "0 2024-11-21 00:00:00+00:00 3.40 0.2 \n",
365
+ "3 2024-11-22 00:00:00+00:00 4.05 0.7 \n",
366
+ "2 2024-11-23 00:00:00+00:00 5.45 0.0 \n",
367
+ "1 2024-11-24 00:00:00+00:00 5.60 0.0 \n",
368
+ "\n",
369
+ " wind_speed_10m_max wind_direction_10m_dominant city \\\n",
370
+ "0 19.995398 246.665939 Helsingborg \n",
371
+ "3 23.540806 246.571289 Helsingborg \n",
372
+ "2 30.631746 240.422256 Helsingborg \n",
373
+ "1 13.755580 276.008911 Helsingborg \n",
374
+ "\n",
375
+ " predicted_pm25 street country days_before_forecast_day \n",
376
+ "0 39.168438 Drottninggatan Sweden 1 \n",
377
+ "3 20.740093 Drottninggatan Sweden 2 \n",
378
+ "2 46.448105 Drottninggatan Sweden 3 \n",
379
+ "1 61.713448 Drottninggatan Sweden 4 \n"
380
+ ]
381
+ },
382
+ {
383
+ "data": {
384
+ "application/vnd.jupyter.widget-view+json": {
385
+ "model_id": "0c3e8fd8c8f545a597e504acf5f077e8",
386
+ "version_major": 2,
387
+ "version_minor": 0
388
+ },
389
+ "text/plain": [
390
+ "Uploading Dataframe: 0.00% | | Rows 0/4 | Elapsed Time: 00:00 | Remaining Time: ?"
391
+ ]
392
+ },
393
+ "metadata": {},
394
+ "output_type": "display_data"
395
+ },
396
+ {
397
+ "name": "stdout",
398
+ "output_type": "stream",
399
+ "text": [
400
+ "Launching job: aq_predictions_1_offline_fg_materialization\n",
401
+ "Job started successfully, you can follow the progress at \n",
402
+ "https://c.app.hopsworks.ai/p/1160340/jobs/named/aq_predictions_1_offline_fg_materialization/executions\n",
403
+ "Finished: Reading data from Hopsworks, using Hopsworks Feature Query Service (0.95s) \n",
404
+ "Finished: Reading data from Hopsworks, using Hopsworks Feature Query Service (1.85s) \n"
405
+ ]
406
+ }
407
+ ],
408
  "source": [
409
  "monitor_fg = fs.get_or_create_feature_group(\n",
410
  " name='aq_predictions',\n",
 
433
  },
434
  {
435
  "cell_type": "code",
436
+ "execution_count": 5,
437
  "metadata": {},
438
  "outputs": [
439
  {
 
443
  "traceback": [
444
  "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
445
  "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
446
+ "Cell \u001b[0;32mIn[5], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m hindcast_df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmerge\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpreds_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdate\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m hindcast_df \u001b[38;5;241m=\u001b[39m hindcast_df\u001b[38;5;241m.\u001b[39msort_values(by\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdate\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(hindcast_df) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n",
447
  "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:169\u001b[0m, in \u001b[0;36mmerge\u001b[0;34m(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _cross_merge(\n\u001b[1;32m 155\u001b[0m left_df,\n\u001b[1;32m 156\u001b[0m right_df,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 166\u001b[0m copy\u001b[38;5;241m=\u001b[39mcopy,\n\u001b[1;32m 167\u001b[0m )\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 169\u001b[0m op \u001b[38;5;241m=\u001b[39m \u001b[43m_MergeOperation\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_df\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 171\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_df\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 173\u001b[0m \u001b[43m \u001b[49m\u001b[43mon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mon\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_on\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mleft_on\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 175\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_on\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright_on\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 176\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mleft_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 177\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 178\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 179\u001b[0m \u001b[43m \u001b[49m\u001b[43msuffixes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msuffixes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 180\u001b[0m \u001b[43m \u001b[49m\u001b[43mindicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindicator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 181\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 182\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 183\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mget_result(copy\u001b[38;5;241m=\u001b[39mcopy)\n",
448
  "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:804\u001b[0m, in \u001b[0;36m_MergeOperation.__init__\u001b[0;34m(self, left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, indicator, validate)\u001b[0m\n\u001b[1;32m 800\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_tolerance(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mleft_join_keys)\n\u001b[1;32m 802\u001b[0m \u001b[38;5;66;03m# validate the merge keys dtypes. We may need to coerce\u001b[39;00m\n\u001b[1;32m 803\u001b[0m \u001b[38;5;66;03m# to avoid incompatible dtypes\u001b[39;00m\n\u001b[0;32m--> 804\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_maybe_coerce_merge_keys\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 806\u001b[0m \u001b[38;5;66;03m# If argument passed to validate,\u001b[39;00m\n\u001b[1;32m 807\u001b[0m \u001b[38;5;66;03m# check if columns specified as unique\u001b[39;00m\n\u001b[1;32m 808\u001b[0m \u001b[38;5;66;03m# are in fact unique.\u001b[39;00m\n\u001b[1;32m 809\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m validate \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n",
449
  "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:1483\u001b[0m, in \u001b[0;36m_MergeOperation._maybe_coerce_merge_keys\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1481\u001b[0m \u001b[38;5;66;03m# datetimelikes must match exactly\u001b[39;00m\n\u001b[1;32m 1482\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m needs_i8_conversion(lk\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m needs_i8_conversion(rk\u001b[38;5;241m.\u001b[39mdtype):\n\u001b[0;32m-> 1483\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[1;32m 1484\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m needs_i8_conversion(lk\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m needs_i8_conversion(rk\u001b[38;5;241m.\u001b[39mdtype):\n\u001b[1;32m 1485\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n",
 
463
  },
464
  {
465
  "cell_type": "code",
466
+ "execution_count": null,
467
  "metadata": {},
468
  "outputs": [
469
  {
feature_pipeline.py ADDED
@@ -0,0 +1,196 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ # coding: utf-8
3
+
4
+ # <span style="font-width:bold; font-size: 3rem; color:#333;">- Part 02: Daily Feature Pipeline for Air Quality (aqicn.org) and weather (openmeteo)</span>
5
+ #
6
+ # ## 🗒️ This notebook is divided into the following sections:
7
+ # 1. Download and Parse Data
8
+ # 2. Feature Group Insertion
9
+ #
10
+ #
11
+ # __This notebook should be scheduled to run daily__
12
+ #
13
+ # In the book, we use a GitHub Action stored here:
14
+ # [.github/workflows/air-quality-daily.yml](https://github.com/featurestorebook/mlfs-book/blob/main/.github/workflows/air-quality-daily.yml)
15
+ #
16
+ # However, you are free to use any Python Orchestration tool to schedule this program to run daily.
17
+
18
+ # ### <span style='color:#ff5f27'> 📝 Imports
19
+
20
+ # In[1]:
21
+
22
+
23
+ import datetime
24
+ import time
25
+ import requests
26
+ import pandas as pd
27
+ import hopsworks
28
+ from functions import util
29
+ import json
30
+ import os
31
+ import warnings
32
+ warnings.filterwarnings("ignore")
33
+
34
+
35
+ # ## <span style='color:#ff5f27'> 🌍 Get the Sensor URL, Country, City, Street names from Hopsworks </span>
36
+ #
37
+ # __Update the values in the cell below.__
38
+ #
39
+ # __These should be the same values as in notebook 1 - the feature backfill notebook__
40
+ #
41
+
42
+ # In[2]:
43
+
44
+
45
+ # If you haven't set the env variable 'HOPSWORKS_API_KEY', then uncomment the next line and enter your API key
46
+ # os.environ["HOPSWORKS_API_KEY"] = ""
47
+
48
+ project = hopsworks.login()
49
+ fs = project.get_feature_store()
50
+ secrets = util.secrets_api(project.name)
51
+
52
+ # This line will fail if you have not registered the AQI_API_KEY as a secret in Hopsworks
53
+ AQI_API_KEY = secrets.get_secret("AQI_API_KEY").value
54
+ location_str = secrets.get_secret("SENSOR_LOCATION_JSON").value
55
+ location = json.loads(location_str)
56
+
57
+ country=location['country']
58
+ city=location['city']
59
+ street=location['street']
60
+ aqicn_url=location['aqicn_url']
61
+ latitude=location['latitude']
62
+ longitude=location['longitude']
63
+
64
+ today = datetime.date.today()
65
+
66
+ location_str
67
+
68
+
69
+ # ### <span style="color:#ff5f27;"> 🔮 Get references to the Feature Groups </span>
70
+
71
+ # In[3]:
72
+
73
+
74
+ # Retrieve feature groups
75
+ air_quality_fg = fs.get_feature_group(
76
+ name='air_quality',
77
+ version=1,
78
+ )
79
+ weather_fg = fs.get_feature_group(
80
+ name='weather',
81
+ version=1,
82
+ )
83
+
84
+
85
+ # ---
86
+
87
+ # ## <span style='color:#ff5f27'> 🌫 Retrieve Today's Air Quality data (PM2.5) from the AQI API</span>
88
+ #
89
+
90
+ # In[4]:
91
+
92
+
93
+ import requests
94
+ import pandas as pd
95
+
96
+ aq_today_df = util.get_pm25(aqicn_url, country, city, street, today, AQI_API_KEY)
97
+ # aq_today_df = util.get_pm25(aqicn_url, country, city, street, "2024-11-05", AQI_API_KEY)
98
+ aq_today_df['date'] = pd.to_datetime(aq_today_df['date']).dt.date
99
+ aq_today_df
100
+
101
+
102
+ # In[5]:
103
+
104
+
105
+ aq_today_df.info()
106
+
107
+
108
+ # In[24]:
109
+
110
+
111
+ from datetime import timedelta
112
+ # Generate a list of dates for the past three days (including today)
113
+ dates_list = [pd.to_datetime(today - timedelta(days=i)).tz_localize('UTC') for i in range(1,4)] # [0, 1, 2, 3]
114
+
115
+ print("Dates to filter:", dates_list)
116
+
117
+
118
+ # In[9]:
119
+
120
+
121
+ selected_features = air_quality_fg.select(['pm25']).join(weather_fg.select_all(), on=['city'])
122
+ selected_features = selected_features.read()
123
+ # filtered_df = selected_features[selected_features['date'].isin(dates_list)]
124
+
125
+ selected_features[selected_features['date'] <= dates_list[0]][selected_features['date'] >= dates_list[2]]
126
+
127
+ # In[17]:
128
+
129
+
130
+ past_3_day_mean = selected_features[selected_features['date'] <= dates_list[0]][selected_features['date'] >= dates_list[2]]['pm25'].mean()
131
+
132
+
133
+ # In[18]:
134
+
135
+
136
+ import numpy as np
137
+ past_3_day_mean = np.float64(past_3_day_mean)
138
+
139
+
140
+ # In[19]:
141
+
142
+
143
+ aq_today_df['past_air_quality'] = past_3_day_mean
144
+
145
+
146
+ # ## <span style='color:#ff5f27'> 🌦 Get Weather Forecast data</span>
147
+
148
+ # In[20]:
149
+
150
+
151
+ hourly_df = util.get_hourly_weather_forecast(city, latitude, longitude)
152
+ hourly_df = hourly_df.set_index('date')
153
+
154
+ # We will only make 1 daily prediction, so we will replace the hourly forecasts with a single daily forecast
155
+ # We only want the daily weather data, so only get weather at 12:00
156
+ daily_df = hourly_df.between_time('11:59', '12:01')
157
+ daily_df = daily_df.reset_index()
158
+ daily_df['date'] = pd.to_datetime(daily_df['date']).dt.date
159
+ daily_df['date'] = pd.to_datetime(daily_df['date'])
160
+ # daily_df['date'] = daily_df['date'].astype(str)
161
+ daily_df['city'] = city
162
+ daily_df
163
+
164
+
165
+ # In[21]:
166
+
167
+
168
+ daily_df.info()
169
+
170
+
171
+ # ## <span style="color:#ff5f27;">⬆️ Uploading new data to the Feature Store</span>
172
+
173
+ # In[22]:
174
+
175
+
176
+ # Insert new data
177
+ air_quality_fg.insert(aq_today_df)
178
+
179
+
180
+ # In[23]:
181
+
182
+
183
+ # Insert new data
184
+ weather_fg.insert(daily_df)
185
+
186
+
187
+ # ## <span style="color:#ff5f27;">⏭️ **Next:** Part 03: Training Pipeline
188
+ # </span>
189
+ #
190
+ # In the following notebook you will read from a feature group and create training dataset within the feature store
191
+ #
192
+
193
+ # In[ ]:
194
+
195
+
196
+
img/pm25_forecast.png CHANGED
inference_pipeline.py ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python
2
+ # coding: utf-8
3
+
4
+ # # <span style="font-width:bold; font-size: 3rem; color:#1EB182;"> **Air Quality** </span><span style="font-width:bold; font-size: 3rem; color:#333;">- Part 04: Batch Inference</span>
5
+ #
6
+ # ## 🗒️ This notebook is divided into the following sections:
7
+ #
8
+ # 1. Download model and batch inference data
9
+ # 2. Make predictions, generate PNG for forecast
10
+ # 3. Store predictions in a monitoring feature group adn generate PNG for hindcast
11
+
12
+ # ## <span style='color:#ff5f27'> 📝 Imports
13
+
14
+ # In[1]:
15
+
16
+
17
+ import datetime
18
+ import pandas as pd
19
+ from xgboost import XGBRegressor
20
+ import hopsworks
21
+ import json
22
+ from functions import util
23
+ import os
24
+
25
+
26
+ # In[2]:
27
+
28
+
29
+ today = datetime.datetime.now() - datetime.timedelta(0)
30
+ tomorrow = today + datetime.timedelta(days = 1)
31
+ today
32
+
33
+
34
+ # ## <span style="color:#ff5f27;"> 📡 Connect to Hopsworks Feature Store </span>
35
+
36
+ # In[3]:
37
+
38
+
39
+ # os.environ["HOPSWORKS_API_KEY"] = ""
40
+
41
+ project = hopsworks.login()
42
+ fs = project.get_feature_store()
43
+
44
+ secrets = util.secrets_api(project.name)
45
+ location_str = secrets.get_secret("SENSOR_LOCATION_JSON").value
46
+ location = json.loads(location_str)
47
+ country=location['country']
48
+ city=location['city']
49
+ street=location['street']
50
+
51
+
52
+ # ## <span style="color:#ff5f27;"> ⚙️ Feature View Retrieval</span>
53
+ #
54
+
55
+ # In[4]:
56
+
57
+
58
+ feature_view = fs.get_feature_view(
59
+ name='air_quality_fv',
60
+ version=1,
61
+ )
62
+
63
+
64
+ # ## <span style="color:#ff5f27;">🪝 Download the model from Model Registry</span>
65
+
66
+ # In[5]:
67
+
68
+
69
+ mr = project.get_model_registry()
70
+
71
+ retrieved_model = mr.get_model(
72
+ name="air_quality_xgboost_model",
73
+ version=1,
74
+ )
75
+
76
+ # Download the saved model artifacts to a local directory
77
+ saved_model_dir = retrieved_model.download()
78
+
79
+
80
+ # In[6]:
81
+
82
+
83
+ # Loading the XGBoost regressor model and label encoder from the saved model directory
84
+ # retrieved_xgboost_model = joblib.load(saved_model_dir + "/xgboost_regressor.pkl")
85
+ retrieved_xgboost_model = XGBRegressor()
86
+
87
+ retrieved_xgboost_model.load_model(saved_model_dir + "/model.json")
88
+
89
+ # Displaying the retrieved XGBoost regressor model
90
+ retrieved_xgboost_model
91
+
92
+
93
+ # In[7]:
94
+
95
+
96
+ # Access the feature names of the trained XGBoost model
97
+ feature_names = retrieved_xgboost_model.get_booster().feature_names
98
+
99
+ # Print the feature names
100
+ print("Feature names:", feature_names)
101
+
102
+
103
+ # ## <span style="color:#ff5f27;">✨ Get Weather Forecast Features with Feature View </span>
104
+ #
105
+ #
106
+
107
+ # In[8]:
108
+
109
+
110
+ weather_fg = fs.get_feature_group(
111
+ name='weather',
112
+ version=1,
113
+ )
114
+ today_timestamp = pd.to_datetime(today)
115
+ batch_data = weather_fg.filter(weather_fg.date >= today_timestamp ).read()
116
+ batch_data
117
+
118
+
119
+ # ### Get Mean air quality for past days
120
+
121
+ # In[9]:
122
+
123
+
124
+ air_quality_fg = fs.get_feature_group(
125
+ name='air_quality',
126
+ version=1,
127
+ )
128
+ selected_features = air_quality_fg.select_all() #(['pm25']).join(weather_fg.select_all(), on=['city'])
129
+ selected_features = selected_features.read()
130
+
131
+
132
+ # In[10]:
133
+
134
+
135
+ selected_features = selected_features.sort_values(by='date').reset_index(drop=True)
136
+
137
+
138
+ # In[11]:
139
+
140
+
141
+ past_air_q_list = selected_features[['date', 'pm25']][-3:]['pm25'].tolist()
142
+
143
+
144
+ # In[12]:
145
+
146
+
147
+ batch_data = batch_data.sort_values(by='date').reset_index(drop=True)
148
+
149
+
150
+ # In[13]:
151
+
152
+
153
+ batch_data['past_air_quality'] = None
154
+
155
+
156
+ # In[14]:
157
+
158
+
159
+ batch_data
160
+
161
+
162
+ # ### <span style="color:#ff5f27;">🤖 Making the predictions</span>
163
+
164
+ # In[15]:
165
+
166
+
167
+ # Initialize an empty list to store predictions
168
+ predictions = []
169
+
170
+ # Iterate through each row of the DataFrame
171
+ for index, row in batch_data.iterrows():
172
+ past_air_quality_mean = sum(past_air_q_list)/3
173
+ # Extract the feature values for prediction as a 1D array
174
+ features = row[['past_air_quality', 'temperature_2m_mean', 'precipitation_sum',
175
+ 'wind_speed_10m_max', 'wind_direction_10m_dominant']].values
176
+
177
+ # Reshape features to a 2D array (required by XGBoost's predict method)
178
+ features = features.reshape(1, -1)
179
+
180
+ # Make a prediction for the row
181
+ prediction = retrieved_xgboost_model.predict(features)
182
+
183
+ # Append the prediction to the list
184
+ predictions.append(prediction[0])
185
+ past_air_q_list.append(prediction[0])
186
+ past_air_q_list = past_air_q_list[1:]
187
+
188
+ # print(past_air_q_list)
189
+ batch_data.loc[index,'past_air_quality'] = past_air_quality_mean
190
+
191
+ # Add the predictions as a new column in the DataFrame
192
+ batch_data['predicted_pm25'] = predictions
193
+
194
+ # Display the updated DataFrame
195
+ batch_data
196
+
197
+
198
+ # In[16]:
199
+
200
+
201
+ # batch_data['predicted_pm25'] = retrieved_xgboost_model.predict(
202
+ # batch_data[['temperature_2m_mean', 'precipitation_sum', 'wind_speed_10m_max', 'wind_direction_10m_dominant']])
203
+ # batch_data
204
+
205
+
206
+ # In[17]:
207
+
208
+
209
+ batch_data.info()
210
+
211
+
212
+ # ### <span style="color:#ff5f27;">🤖 Saving the predictions (for monitoring) to a Feature Group</span>
213
+
214
+ # In[18]:
215
+
216
+
217
+ batch_data['street'] = street
218
+ batch_data['city'] = city
219
+ batch_data['country'] = country
220
+ # Fill in the number of days before the date on which you made the forecast (base_date)
221
+ batch_data['days_before_forecast_day'] = range(1, len(batch_data)+1)
222
+ batch_data = batch_data.sort_values(by=['date'])
223
+ batch_data['date'] = batch_data['date'].dt.tz_convert(None).astype('datetime64[ns]')
224
+ batch_data
225
+
226
+
227
+ # In[19]:
228
+
229
+
230
+ batch_data.info()
231
+
232
+
233
+ # ### Create Forecast Graph
234
+ # Draw a graph of the predictions with dates as a PNG and save it to the github repo
235
+ # Show it on github pages
236
+
237
+ # In[20]:
238
+
239
+
240
+ file_path = "img/pm25_forecast.png"
241
+ plt = util.plot_air_quality_forecast(city, street, batch_data, file_path)
242
+ plt.show()
243
+
244
+
245
+ # In[21]:
246
+
247
+
248
+ # Get or create feature group
249
+ monitor_fg = fs.get_or_create_feature_group(
250
+ name='aq_predictions',
251
+ description='Air Quality prediction monitoring',
252
+ version=1,
253
+ primary_key=['city','street','date','days_before_forecast_day'],
254
+ event_time="date"
255
+ )
256
+
257
+
258
+ # In[22]:
259
+
260
+
261
+ monitor_fg.insert(batch_data, write_options={"wait_for_job": True})
262
+
263
+
264
+ # In[23]:
265
+
266
+
267
+ # We will create a hindcast chart for only the forecasts made 1 day beforehand
268
+ monitoring_df = monitor_fg.filter(monitor_fg.days_before_forecast_day == 1).read()
269
+ monitoring_df
270
+
271
+
272
+ # In[24]:
273
+
274
+
275
+ air_quality_fg = fs.get_feature_group(
276
+ name='air_quality',
277
+ version=1,
278
+ )
279
+ air_quality_df = air_quality_fg.read()
280
+ air_quality_df
281
+
282
+
283
+ # In[25]:
284
+
285
+
286
+ air_quality_df['date']
287
+
288
+
289
+ # In[26]:
290
+
291
+
292
+ monitoring_df['date']
293
+
294
+
295
+ # In[27]:
296
+
297
+
298
+ air_quality_df['date'] = pd.to_datetime(air_quality_df['date'])
299
+ monitoring_df['date'] = monitoring_df['date'].dt.tz_convert(None).astype('datetime64[ns]')
300
+
301
+
302
+ # In[28]:
303
+
304
+
305
+ weather_fg.read()
306
+
307
+
308
+ # In[29]:
309
+
310
+
311
+ air_quality_df
312
+
313
+
314
+ # In[30]:
315
+
316
+
317
+ monitor_fg.read()
318
+
319
+
320
+ # In[31]:
321
+
322
+
323
+ outcome_df = air_quality_df[['date', 'pm25']]
324
+ preds_df = monitoring_df[['date', 'predicted_pm25']]
325
+
326
+ hindcast_df = pd.merge(preds_df, outcome_df, on="date")
327
+ hindcast_df = hindcast_df.sort_values(by=['date'])
328
+
329
+ # If there are no outcomes for predictions yet, generate some predictions/outcomes from existing data
330
+ if len(hindcast_df) == 0:
331
+ hindcast_df = util.backfill_predictions_for_monitoring(weather_fg, air_quality_df, monitor_fg, retrieved_xgboost_model)
332
+ hindcast_df
333
+
334
+
335
+ # ### Plot the Hindcast comparing predicted with forecasted values (1-day prior forecast)
336
+ #
337
+ # __This graph will be empty to begin with - this is normal.__
338
+ #
339
+ # After a few days of predictions and observations, you will get data points in this graph.
340
+
341
+ # In[32]:
342
+
343
+
344
+ file_path = "img/pm25_hindcast_1day.png"
345
+ plt = util.plot_air_quality_forecast(city, street, hindcast_df, file_path, hindcast=True)
346
+ plt.show()
347
+ # %%
schedule.py ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import modal
2
+ import requests
3
+ import os
4
+ import sys
5
+
6
+ image = (
7
+ modal.Image.debian_slim(python_version="3.10")
8
+ .pip_install("requests","python-dotenv")
9
+ )
10
+
11
+ app = modal.App("build-scheduler",image=image)
12
+ SPACE_ID = "Robzy/hbg-weather" # Replace with your Space ID
13
+
14
+ # Define a Modal function
15
+ @app.function(schedule=modal.Period(hours=0, minutes=2),
16
+ secrets=[modal.Secret.from_dotenv()]) # Run every 2 minutes
17
+ def trigger_rebuild():
18
+ import os
19
+ import requests
20
+
21
+ token = os.environ['HF_TOKEN'] # Your Hugging Face token
22
+ repo_id = "Robzy/hbg-weather" # Replace with your Space's repo ID
23
+
24
+ headers = {
25
+ "Authorization": f"Bearer {token}",
26
+ "Content-Type": "application/json"
27
+ }
28
+
29
+ url = f"https://api.huggingface.co/spaces/{repo_id}/rebuild"
30
+
31
+ response = requests.post(url, headers=headers)
32
+
33
+ if response.status_code == 200:
34
+ print("Space rebuild triggered successfully!")
35
+ else:
36
+ print(f"Failed to trigger rebuild: {response.status_code}, {response.text}")
37
+
38
+ if __name__ == "__main__":
39
+ trigger_rebuild()