{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd \n", "from datetime import datetime \n", "from datetime import date\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "from keras.models import Sequential\n", "from keras.layers import LSTM, Dense\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import MinMaxScaler,StandardScaler\n", "from keras.callbacks import ModelCheckpoint\n", "import tensorflow as tf\n", "import joblib\n", "from datetime import datetime" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "merged = pd.read_csv(r'../data/long_merge.csv')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "zones = [72, 71, 63, 62, 60, 59, 58,57, 50, 49, 44, 43, 35, 34, 33, 32, 31, 30, 29, 28, ]\n", "rtus = [2]\n", "cols = []\n", "\n", "for zone in zones:\n", " for column in merged.columns:\n", " if f\"zone_0{zone}\" in column and 'co2' not in column and \"hw_valve\" not in column and \"cooling_sp\" not in column and \"heating_sp\" not in column:\n", " cols.append(column)\n", "\n", "for zone in zones:\n", " for column in merged.columns:\n", " if f\"zone_0{zone}\" in column: \n", " if \"cooling_sp\" in column or \"heating_sp\" in column:\n", " cols.append(column)\n", "# for rtu in rtus:\n", "# for column in merged.columns:\n", "# if f\"rtu_00{rtu}_fltrd_sa\" in column:\n", "# cols.append(column)\n", "cols =['date'] + cols + ['air_temp_set_1',\n", " 'air_temp_set_2',\n", " 'dew_point_temperature_set_1d',\n", " 'relative_humidity_set_1',\n", " 'solar_radiation_set_1']\n", "input_dataset = merged[cols]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\arbal\\AppData\\Local\\Temp\\ipykernel_15420\\1855433847.py:1: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " input_dataset['date'] = pd.to_datetime(input_dataset['date'], format = \"%Y-%m-%d %H:%M:%S\")\n" ] } ], "source": [ "input_dataset['date'] = pd.to_datetime(input_dataset['date'], format = \"%Y-%m-%d %H:%M:%S\")\n", "df_filtered = input_dataset[ (input_dataset.date.dt.date >date(2019, 3, 1)) & (input_dataset.date.dt.date< date(2021, 1, 1))]\n", "\n", "if df_filtered.isna().any().any():\n", " print(\"There are NA values in the DataFrame columns.\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "testdataset_df = df_filtered[(df_filtered.date.dt.date >date(2020, 3, 1)) & (df_filtered.date.dt.date date(2019, 3, 1)) & (df_filtered.date.dt.date date(2020, 7, 1)) & (df_filtered.date.dt.date " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "var = 0\n", "\n", "df = pd.DataFrame([testdataset_df.index[31:],test_predict1_unscaled[:,var], y_test_unscaled[:,var]] ).T\n", "fig, ax = plt.subplots(figsize=(10,8))\n", "df.plot(x = 0, y=1, ax = ax, label = 'Predicted')\n", "df.plot(x = 0, y=2, ax = ax, label = 'Actual')\n", "\n", "anomalies = df.where(df[1]-df[2]>0.38)[0]\n", "df['anomalies'] = anomalies\n", "\n", "df_new = df.dropna()\n", "\n", "df_new.plot.scatter(x='anomalies', y=1, c='r', ax = ax, label = 'Anomalies')\n", "\n", "# ax.scatter(anomalies,test_predict1[anomalies,var], color='black',marker =\"o\",s=100 )\n", "\n", "\n", "ax.set_title('Testing Data - Predicted vs Actual [Zone 72 Temperature]', fontsize=20)\n", "ax.set_xlabel('Time', fontsize=15)\n", "ax.set_ylabel('Value', fontsize = 15)\n", "ax.legend(fontsize = 15)\n", "fig.tight_layout()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "d:\\anaconda3\\envs\\smartbuilding\\Lib\\site-packages\\pandas\\core\\indexes\\base.py:7588: FutureWarning: Dtype inference on a pandas object (Series, Index, ExtensionArray) is deprecated. The Index constructor will keep the original dtype in the future. Call `infer_objects` on the result to get the old behavior.\n", " return Index(sequences[0], name=names)\n" ] }, { "data": { "text/plain": [ "Text(0, 0.5, 'MSE')" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1QAAAKgCAYAAACcFTzmAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACK80lEQVR4nO3dd3wUZeLH8e8mhEAg9C4giIgUQUVUUATkxANFVOwVy3liRVRO9GxnwfPUH1YQBVHBdgfYQASlS5Hee0uAhE4CCenP7w/Ikk12k+0zu/m8X6+8ILOzs88+OzuZ7zxlHMYYIwAAAACAz2KsLgAAAAAARCoCFQAAAAD4iUAFAAAAAH4iUAEAAACAnwhUAAAAAOAnAhUAAAAA+IlABQAAAAB+IlABAAAAgJ8IVAAAAADgJwIVAESRsWPHyuFwyOFwaNasWSUeN8bozDPPlMPhUPfu3cNePl/k5ubq448/VqdOnVSrVi0lJCTo9NNPV79+/TRp0iSrixdys2bN8vg5FlX0M3f3U9bzAQCBqWB1AQAAwZeYmKjRo0eXCE2zZ8/W1q1blZiYaE3BfHDnnXdq4sSJGjRokF5++WXFx8dr27Ztmjp1qn799Vddd911VhfRVj777DOdffbZJZa3adPGgtIAQPlBoAKAKHTzzTdr/Pjx+vDDD1WtWjXn8tGjR6tz585KT0+3sHRl2759u7799lu98MILevnll53Le/bsqb/97W8qKCiwsHSlM8YoKytLlStXDuvrtmvXThdccIFPzymtrMePH1elSpXkcDj8LlNmZqYSEhL8fj4ARAK6/AFAFLr11lslSV9//bVzWVpamiZMmKB7773X7XNycnL06quv6uyzz1Z8fLzq1q2re+65R/v373dZ79tvv1WvXr3UsGFDVa5cWa1bt9YzzzyjjIwMl/UGDBigqlWrasuWLerTp4+qVq2qJk2a6Mknn1R2dnap5T948KAkqWHDhm4fj4lx/fO1YcMG/fWvf1VCQoLq1KmjBx98UD/99FOJLm/NmjXTgAEDSmyve/fuLq15WVlZevLJJ3XuueeqevXqqlWrljp37qwffvihxHMdDoceeeQRjRw5Uq1bt1Z8fLw+//xzSdLmzZt12223qV69eoqPj1fr1q314YcfltiGu/IfPXq01Dryh6eyFnYbnDZtmu69917VrVtXCQkJys7OVkFBgd58803nflGvXj3ddddd2rVrl8u2u3fvrnbt2mnOnDnq0qWLEhISPO5rABBNaKECgChUrVo13XDDDRozZoz+/ve/SzoRrmJiYnTzzTdr+PDhLusXFBSoX79+mjt3roYMGaIuXbpo586devHFF9W9e3ctWbLE2YqxefNm9enTR4MGDVKVKlW0YcMG/fvf/9aff/6pGTNmuGw3NzdX11xzje677z49+eSTmjNnjl555RVVr15dL7zwgsfyt27dWjVq1NDLL7+smJgY9erVS82aNXO77t69e9WtWzfFxcXpo48+Uv369TV+/Hg98sgjftdfdna2Dh06pKeeekqnnXaacnJy9Ntvv+n666/XZ599prvuustl/e+//15z587VCy+8oAYNGqhevXpat26dunTpoqZNm+rtt99WgwYN9Ouvv+qxxx7TgQMH9OKLLwa1/Pn5+crLy3NZ5nA4FBsbW2ZZFy9eLEm69957ddVVV+nLL79URkaG4uLiNHDgQI0aNUqPPPKIrr76au3YsUPPP/+8Zs2apWXLlqlOnTrObaekpOiOO+7QkCFD9Prrr5cIvgAQlQwAIGp89tlnRpJZvHixmTlzppFk1qxZY4wxplOnTmbAgAHGGGPatm1runXr5nze119/bSSZCRMmuGxv8eLFRpL56KOP3L5eQUGByc3NNbNnzzaSzMqVK52P3X333UaS+e6771ye06dPH9OqVasy38vkyZNNnTp1jCQjydSuXdvceOON5scff3RZ7x//+IdxOBxmxYoVLsuvuOIKI8nMnDnTuez00083d999d4nX6tatm0t9FJeXl2dyc3PNfffdZ8477zyXxySZ6tWrm0OHDrksv/LKK03jxo1NWlqay/JHHnnEVKpUybm+L+V3p/Azd/cTGxvrVVkLt3HXXXe5LF+/fr2RZB566CGX5YsWLTKSzLPPPutc1q1bNyPJ/P7776WWFwCiDZeOACBKdevWTS1atNCYMWO0evVqLV682GMXrJ9//lk1atRQ3759lZeX5/w599xz1aBBA5duc9u2bdNtt92mBg0aKDY2VnFxcerWrZskaf369S7bdTgc6tu3r8uy9u3ba+fOnWWWv0+fPkpKStKkSZP01FNPqW3btvr+++91zTXXuLTezJw5U23btlWHDh1cnn/bbbeV+Rql+e9//6tLLrlEVatWVYUKFRQXF6fRo0eXeI+SdPnll6tmzZrO37OysvT777/ruuuuU0JCgkud9unTR1lZWVq4cGFQy//FF19o8eLFLj+LFi0qs6xF9e/f3+X3mTNnSlKJbpIXXnihWrdurd9//91lec2aNXX55Zf7VG4AiHR0+QOAKOVwOHTPPffovffeU1ZWls466yx17drV7bp79+7VkSNHVLFiRbePHzhwQJJ07Ngxde3aVZUqVdKrr76qs846SwkJCUpOTtb111+v48ePuzwvISFBlSpVclkWHx+vrKwsr95D5cqVde211+raa6+VJCUlJal379768MMPNXDgQLVt21YHDx5U8+bNSzy3QYMGXr2GOxMnTtRNN92kG2+8UU8//bQaNGigChUqaMSIERozZkyJ9YuP9Tp48KDy8vL0/vvv6/3333f7GoV1Gqzyt27d2qtJKTyNS3P3WGlj2Ro1alQiGJe2bQCIVgQqAIhiAwYM0AsvvKCRI0fqtdde87henTp1VLt2bU2dOtXt44XTrM+YMUN79uzRrFmznK1SknTkyJGgltuTpk2b6oEHHtCgQYO0du1atW3bVrVr11ZqamqJdd0tq1SpktsJMQ4cOOAyFmjcuHFq3ry5vv32W5dZ7jxNplF8JryaNWsqNjZWd955px5++GG3zykMUb6UPxhKm7Wv+GO1a9eWdGJsVOPGjV0e27Nnj0udlbVtAIhWBCoAiGKnnXaann76aW3YsEF33323x/WuvvpqffPNN8rPz9dFF13kcb3CE+b4+HiX5R9//HFwCnzS0aNH5XA4VLVq1RKPFXa5a9SokSSpR48eevPNN7Vy5UqXbnNfffVViec2a9ZMq1atclm2adMmbdy40SUcOBwOVaxY0SUgpKamup3lz52EhAT16NFDy5cvV/v27T22/Pla/nAr7L43btw4derUybl88eLFWr9+vZ577jmrigYAtkGgAoAo98Ybb5S5zi233KLx48erT58+evzxx3XhhRcqLi5Ou3bt0syZM9WvXz9dd9116tKli2rWrKkHH3xQL774ouLi4jR+/HitXLkyqGXeuHGjrrzySt1yyy3q1q2bGjZsqMOHD2vy5MkaNWqUunfvri5dukiSBg0apDFjxuiqq67Sq6++6pwlb8OGDSW2e+edd+qOO+7QQw89pP79+2vnzp168803VbduXZf1rr76ak2cOFEPPfSQbrjhBiUnJ+uVV15Rw4YNtXnzZq/ew7vvvqtLL71UXbt21cCBA9WsWTMdPXpUW7Zs0U8//eScEdGX8pdmzZo1JWb5k6QWLVqUeH/eatWqlR544AG9//77iomJUe/evZ2z/DVp0kRPPPGEX9sFgGhCoAIAKDY2Vj/++KPeffddffnllxo2bJgqVKigxo0bq1u3bjrnnHMknegCNnnyZD355JO64447VKVKFfXr10/ffvutzj///KCV58wzz9TgwYM1Y8YM/fDDD9q/f7/i4uLUsmVLvfrqqxo8eLBzSu4GDRpo9uzZevzxxzVw4EAlJCTouuuu0wcffKB+/fq5bPe2227Tnj17NHLkSH322Wdq166dRowY4XLzYEm65557tG/fPo0cOVJjxozRGWecoWeeeUa7du0qsa4nbdq00bJly/TKK6/on//8p/bt26caNWqoZcuW6tOnj3M9X8pfmnvuucft8k8++UT333+/19spbsSIEWrRooVGjx6tDz/8UNWrV9df//pXDRs2zNklEADKM4cxxlhdCAAAgm3WrFnq0aOHZs6c6XLTXgAAgolp0wEAAADATwQqAAAAAPATXf4AAAAAwE+0UAEAAACAnwhUAAAAAOAnAhUAAAAA+In7UJ1UUFCgPXv2KDExUQ6Hw+riAAAAALCIMUZHjx5Vo0aNnPc99IRAddKePXvUpEkTq4sBAAAAwCaSk5PVuHHjUtchUJ2UmJgo6USlVatWzeLSAAAAALBKenq6mjRp4swIpSFQnVTYza9atWoEKgAAAABeDQViUgoAAAAA8BOBCgAAAAD8RKACAAAAAD8xhgoAAACIAvn5+crNzbW6GBGjYsWKZU6J7g0CFQAAABDBjDFKTU3VkSNHrC5KRImJiVHz5s1VsWLFgLZDoAIAAAAiWGGYqlevnhISEryama68Kygo0J49e5SSkqKmTZsGVGcEKgAAACBC5efnO8NU7dq1rS5ORKlbt6727NmjvLw8xcXF+b0dJqUAAAAAIlThmKmEhASLSxJ5Crv65efnB7QdAhUAAAAQ4ejm57tg1RmBCgAAAAD8RKACAAAAAD8RqAAAAADATwQqAAAAAPATgQoAAABA2HXv3l2PPvqoBg0apJo1a6p+/foaNWqUMjIydM899ygxMVEtWrTQL7/8Ikk6fPiwbr/9dtWtW1eVK1dWy5Yt9dlnnzm3t3v3bt18882qWbOmateurX79+mnHjh0hfx8EKgAAACCKGGOUmZNnyY8xxqeyfv7556pTp47+/PNPPfrooxo4cKBuvPFGdenSRcuWLdOVV16pO++8U5mZmXr++ee1bt06/fLLL1q/fr1GjBihOnXqSJIyMzPVo0cPVa1aVXPmzNG8efNUtWpV/fWvf1VOTk4oqtnJYXx911EqPT1d1atXV1pamqpVq2Z1cQAAAIAyZWVlafv27WrevLkqVaokScrMyVObF361pDzr/nWlEipW8Grd7t27Kz8/X3PnzpV04n5Q1atX1/XXX68vvvhCkpSamqqGDRtqwYIFev3111WnTh2NGTOmxLbGjBmjN998U+vXr3dOh56Tk6MaNWro+++/V69evUo8x13dFfIlG3j3bgEAAAAgyNq3b+/8f2xsrGrXrq1zzjnHuax+/fqSpH379mngwIHq37+/li1bpl69eunaa69Vly5dJElLly7Vli1blJiY6LL9rKwsbd26NaTvgUAFAAAARJHKcbFa968rLXttX8TFxbn87nA4XJYVtjYVFBSod+/e2rlzpyZPnqzffvtNPXv21MMPP6y33npLBQUF6tixo8aPH1/iNerWrevHO/EegQoAAACIIg6Hw+tud5Gmbt26GjBggAYMGKCuXbvq6aef1ltvvaXzzz9f3377rerVqxf24TtMSgEAAADA9l544QX98MMP2rJli9auXauff/5ZrVu3liTdfvvtqlOnjvr166e5c+dq+/btmj17th5//HHt2rUrpOWyZaAaMWKE2rdvr2rVqqlatWrq3Lmzc7pEd2bNmiWHw1HiZ8OGDWEsNQC7M8YoJ6/A6mIAAAA/VKxYUUOHDlX79u112WWXKTY2Vt98840kKSEhQXPmzFHTpk11/fXXq3Xr1rr33nt1/PjxkLdY2XKWv59++kmxsbE688wzJZ2YTvE///mPli9frrZt25ZYf9asWerRo4c2btzoUmF169ZVbKx3/TiZ5Q+Ifg+PX6Zp61I1/5meqpsYb3VxAAAIWGkz1aF0UT3LX9++fV1+f+211zRixAgtXLjQbaAqVK9ePdWoUSPEpQMQqSavTpEk/W/pLg3s3sLi0gAAgGhgyy5/ReXn5+ubb75RRkaGOnfuXOq65513nho2bKiePXtq5syZYSohAAAAgPLKli1UkrR69Wp17txZWVlZqlq1qiZNmqQ2bdq4Xbdhw4YaNWqUOnbsqOzsbH355Zfq2bOnZs2apcsuu8ztc7Kzs5Wdne38PT09PSTvA4D9nJyBFQAAIGC2DVStWrXSihUrdOTIEU2YMEF33323Zs+e7TZUtWrVSq1atXL+3rlzZyUnJ+utt97yGKiGDRuml19+OWTlBwAAABD9bNvlr2LFijrzzDN1wQUXaNiwYerQoYPeffddr59/8cUXa/PmzR4fHzp0qNLS0pw/ycnJwSg2gAhAAxUAAAgW27ZQFWeMcemiV5bly5erYcOGHh+Pj49XfDyzfAEAACDyFRRwWxBfBWuyc1sGqmeffVa9e/dWkyZNdPToUX3zzTeaNWuWpk6dKulE69Lu3bv1xRdfSJKGDx+uZs2aqW3btsrJydG4ceM0YcIETZgwwcq3AcCmGEMFAIgWFStWVExMjPbs2aO6deuqYsWKcvCHrkzGGO3fv18Oh0NxcXEBbcuWgWrv3r268847lZKSourVq6t9+/aaOnWqrrjiCklSSkqKkpKSnOvn5OToqaee0u7du1W5cmW1bdtWkydPVp8+fax6CwAAAEDIxcTEqHnz5kpJSdGePXusLk5EcTgcaty4sdf3rfW4HTve2NcK3NgXiH7NnpksSXquT2v97bIzLC4NAADBY4xRXl6e8vPzrS5KxIiLi/MYpiL+xr4AAAAAvFfYdS3Q7mvwnW1n+QOAUKFrOQAACBYCFQAAAAD4iUAFAAAAAH4iUAEAAACAnwhUAMod7s8BAACChUAFAAAAAH4iUAEod2ifAgAAwUKgAgAAAAA/EagAlDsMoQIAAMFCoAIAAAAAPxGoAJQ7NFABAIBgIVABAAAAgJ8IVADKHe5DBQAAgoVABQAAAAB+IlABKHdooAIAAMFCoAIAAAAAPxGoAJQ7NFABAIBgIVABAAAAgJ8IVADKHwZRAQCAICFQAQAAAICfCFQAyp3UtONWFwEAAEQJAhWAcuf75XusLgIAAIgSBCoAAAAA8BOBCgAAAAD8RKACUO5cdEYtq4sAAACiBIEKQLnT8fSaVhcBAABECQIVgHLHGKtLAAAAogWBCgAAAAD8RKACUO44HFaXAAAARAsCFQAAAAD4iUAFAAAAAH4iUAEodxyizx8AAAgOAhWAcseIaf4AAEBwEKgAAAAAwE8EKgAAAADwE4EKQLnDGCoAABAsBCoAAAAA8BOBCgAAAAD8RKACAAAAAD8RqAAAAADATwQqAAAAAPATgQoAAAAA/ESgAlDuOJg1HQAABAmBCgAAAAD8RKACUO4YY3UJAABAtCBQAQAAAICfCFQAyh3GUAEAgGAhUAEAAACAnwhUAAAAAOAnAhUA21mZfESj521XQUFoZo+gxx8AAAiWClYXAACK6/fhH5Kkmglxuv78xkHfPpP8AQCAYKGFCoBtbd53zOoiAAAAlIpABQAAAAB+IlABKHcYQwUAAIKFQAUAAAAAfiJQAQAAAICfCFQAAAAA4CcCFQAAAAD4yZaBasSIEWrfvr2qVaumatWqqXPnzvrll19Kfc7s2bPVsWNHVapUSWeccYZGjhwZptICCJW96VlWFwEAAKBUtgxUjRs31htvvKElS5ZoyZIluvzyy9WvXz+tXbvW7frbt29Xnz591LVrVy1fvlzPPvusHnvsMU2YMCHMJQcQTBOX7ba6CAAAAKWqYHUB3Onbt6/L76+99ppGjBihhQsXqm3btiXWHzlypJo2barhw4dLklq3bq0lS5borbfeUv/+/cNRZAARxMG86QAAIEhs2UJVVH5+vr755htlZGSoc+fObtdZsGCBevXq5bLsyiuv1JIlS5SbmxuOYgIAAAAoh2zZQiVJq1evVufOnZWVlaWqVatq0qRJatOmjdt1U1NTVb9+fZdl9evXV15eng4cOKCGDRuWeE52drays7Odv6enpwf3DQAAAACIerZtoWrVqpVWrFihhQsXauDAgbr77ru1bt06j+s7ivXhMca4XV5o2LBhql69uvOnSZMmwSs8AAAAgHLBtoGqYsWKOvPMM3XBBRdo2LBh6tChg95991236zZo0ECpqakuy/bt26cKFSqodu3abp8zdOhQpaWlOX+Sk5OD/h4AAAAARDfbdvkrzhjj0kWvqM6dO+unn35yWTZt2jRdcMEFiouLc/uc+Ph4xcfHB72cAAAAAMoPW7ZQPfvss5o7d6527Nih1atX67nnntOsWbN0++23SzrRunTXXXc513/wwQe1c+dODR48WOvXr9eYMWM0evRoPfXUU1a9BQBemL/1gJ7+70qlHWfyGAAAEJls2UK1d+9e3XnnnUpJSVH16tXVvn17TZ06VVdccYUkKSUlRUlJSc71mzdvrilTpuiJJ57Qhx9+qEaNGum9995jynTA5m77ZJEkqWKFGL12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S5borbfeUv/+/UNdZMAWsvPynf8/kplrYUmsZ2igAwAAYWDLFqri0tLSJEm1atXyuM6CBQvUq1cvl2VXXnmllixZotzckieW2dnZSk9Pd/kBIp0jKHdxiky+vHPCFgAACBbbBypjjAYPHqxLL71U7dq187heamqq6tev77Ksfv36ysvL04EDB0qsP2zYMFWvXt3506RJk6CXHQg313s42Ts1pJXzFjQAABAdbB+oHnnkEa1atUpff/11mes6it0R1Jy8DF18uSQNHTpUaWlpzp/k5OTgFBiwCbu3wuSHuIA2f/sAACBK2HIMVaFHH31UP/74o+bMmaPGjRuXum6DBg2Umprqsmzfvn2qUKGCateuXWL9+Ph4xcfHB7W8gNWKXjrYdzTbsnIEIicvOFGowO6JEgAARAVbtlAZY/TII49o4sSJmjFjhpo3b17mczp37qzp06e7LJs2bZouuOACxcXFhaqogG1NWZ1idRH88um8bUHZTvKhzLJXAgAACJAtA9XDDz+scePG6auvvlJiYqJSU1OVmpqq48ePO9cZOnSo7rrrLufvDz74oHbu3KnBgwdr/fr1GjNmjEaPHq2nnnrKircAWKJom4ybnq4RYdE2pnsHAACRw5aBasSIEUpLS1P37t3VsGFD58+3337rXCclJUVJSUnO35s3b64pU6Zo1qxZOvfcc/XKK6/ovffeY8p0lCtFe7nZvcebCXEBY2MiNFECAICIYssxVN6caI0dO7bEsm7dumnZsmUhKBEQGUyRNiqb5yll5xW4XR6slrWKsSeuF83csE8v/LhGj/ZoGZwNAwAAFGHLQAXAP3ZvlSoqv8B9YYMVqGJObuiesYslSUMmrHI+ZmwfNwEAQKSwZZc/AP6pXDHW+f9qlcr3ZCyROoYMAABEFgIVEEXiiowbiq8QmV9vh4KThAhUAAAgHCLzjAtA1ApWEApWMAMAACgNgQqIIowMAgAACC8CFQBb8bddqXjLFhNPAACAcCBQAVEkkmb588TB4CcAABBBCFQAgqZryzperxvs8OfL9qIheAIAAHsgUAGwFdqnAABAJPEpUN17770aM2aM28d+/PFHrVixwu1jL774ojp27Ohz4QD4pqxxQwUebqZrKyQqAAAQQXwKVGPHjtW8efPcPnbttdfqvffec/tYUlKSx7AFIHjGLUzy+NjSnYd17r+m6dvFntcJJyaNAAAA0YAuf0C0KtbS89D4pUrPytM/JqwOy8vXS4z363k0UAEAgEhCoAIQEq0aJPr1PH9n+SsxbToNYAAAIAwIVAAsQeABAADRgEAFwFb87fL3/fLdQS0HAACANwhUAGzF3/v6Lt5x2OX30lrAaBwDAADBQqACyom96dlWF8EFoQYAAEQDnwPV559/rtjY2BI/DofD42NffPFFKMoO4KTlSYdLLIvU2fIcEVtyAABQHvkcqIwxfv0ACJ3Jq1JKLPvZzbJI4G+XPwAAACtU8GXlgoKCUJUDAIKKyzgAACAcGEMFRIFIDA+0XAMAgGhAoAJsLL8gckNHi7pV/Xqevzf2LbGdoGwFAACgdEENVNnZ2Ro2bJguvfRSnX322br88sv14YcfKj8/P5gvA5QLMzfsU5sXpuqHFWXfXyn9eG4YSlS2velZzv+3rF96oAp1VIzcKAoAACKJT4Hqq6++UkJCgp599tkSj2VnZ6tHjx765z//qfnz52vTpk2aNWuWHnvsMV177bXBKi9QbtwzdrGy8wr0+Dcrylz3v0t3hb5AXti091jA2whLyxLdDQEAQJD4FKhmzJih7Oxs3XfffSUee+edd7Rw4ULFxMToySef1E8//aT/+7//U61atTRlyhR9/fXXQSs0gOjFLH8AACCS+DTL3+LFi9WqVSu1aNGixGOjRo2Sw+HQP/7xD7366qvO5V26dNFFF12kcePG6dZbbw28xAAAAABgEz61UKWmpqpt27Yllm/btk07d+6UJD300EMuj3Xq1EnnnXeeVqxY4X8pAZSqXmK81UUImmC1UDGLIAAACAefAtXhw4cVGxtbYvn8+fMlSWeffbYaNWpU4vEWLVro4MGDfhYRQFk6NKlhdRF85invOJifDwAARBCfAlX16tW1ffv2EsvnzZsn6URrlCeVK1f2sWgAvLX9QIbVRfADLUgAACDy+RSozj//fC1ZskTLly93LsvMzNSkSZPkcDjUs2dPt8/bvHmzTjvttMBKCsBjN7aYKGrUCVaXv+O53K4BAACEnk+B6v7775cxRldccYVeeuklffDBB+rRo4f279+vmjVr6vrrry/xnL1792r16tVq06ZN0AoNlFdzNx9wuzwmiqbGC9Y7+ceEVUHaEgAAgGc+zfJ34403avLkyfriiy/0yiuvSDpxxdzhcOi9995TlSpVSjxn9OjRKigoUK9evYJTYqAcKvyeHczIdvt4bBlNVJE0QUNBkIqalVvg8bHIqQ0AAGB3PgUqSRo7dqz69u2rSZMmaf/+/WrcuLHuvfdeXXLJJW7X37Ztm/r166c+ffoEXFigvMrIyVfVeM9f17JaqNKO5wa7SCGzenea1UUAAADwms+BSpL69++v/v37e7Xup59+6s9LACiiYmzpvXNjInAQVQQ1mgEAAHjk0xgqANaoUEZgisA85bHbXcPqlcJaDgAAgEAQqIAIUNhlz9M9mmLL6PIXSa1B7U6rbnURAAAAvOZTl78zzjjD7xdyOBzaunWr388HyrM9acdVs0pFj49H0yx/AAAAkcSnQLVjxw45HA6/ZgxzcMIH+G1Z0hG1beS55SaGtmYAAABL+DUpRceOHXXHHXeoX79+qly5crDLBKCY579fozsvPt3j42VNmx5JouedAACA8sCnQPXNN99o/Pjxmjp1qgYPHqwXXnhB/fv31+23367LL7+cVijAIqW1Xkn2vO+SleO6ImlMGQAAsDefOgrddNNN+uGHH5SSkqL3339fbdu21dixY9WrVy81btxYTz/9tFasWBGiogLwdM3izLpVw1uQELrojNpWFwEAAMBrfo28qFWrlh566CHNnz9f27Zt00svvaRq1arp7bffVseOHdWuXTv9+9//VnJycrDLC5RrGdn5bpdHYuOw8dBuVqtKXJhLAgAA4L+Ah7I3a9ZMzz//vNavX69Fixbp0Ucf1cGDB/Xss8+qU6dOwSgjgJMOHst2u5zutgAAANYI6txgp59+us444ww1atRIxhgVFBQEc/NAuRfjYfKJsuak8GdmTgAAAJTNr1n+isrMzNTEiRM1fvx4/f7778rPz1f16tV1//3366677gpGGQGUgQYqAAAAa/gVqAoKCvTrr79q3Lhx+vHHH5WZmam4uDhdffXVuuOOO3T11VerYkXPNyEF4B9PN/B1ROBk454azWhMAwAAkcSnQLVo0SKNHz9e3377rfbv3y+Hw6FLLrlEd9xxh2666SbVqFEjRMUEIHluiaKFyr2sXPeTeAAAAASLT4Gqc+fOcjgcatOmjZ544gndfvvtatKkSajKBqAYT2OlypqUorw2+szauN/t8r3pWWEuCQAAiFZ+TUqxdetW/etf/1KrVq2UkJDg1U+VKlWCXXag3PHUta+sSSnsKDxd+9y/yH+X7grHiwMAgHLA5zFUxhhlZXF1F7CCxy5/ETiGCgAAIBr4FKiYBh2wlqeufYyhAgAAsEZQ70MFILQ85aay70MV9KIEzJTbkV0AACCaEKiACOI5ONmviepIZq7VRQAAAAg5AhUQQSKpy99/ft1odREAAABCjkAFRBC7BCdjjNanpCsnj3GVAACgfCNQARHE3zwV7PFKX/2ZpN7vztXfvlji9zbsOK4LAADAVwQqAD777I8dkqTZm9zfOBcAAKC8IFABkcQuff5s4rlJqzXkfyutLgYAACjHCFRAeRCF3esysvM0flGSvluyS6lp7m82TrdCAAAQarYMVHPmzFHfvn3VqFEjORwOff/996WuP2vWLDkcjhI/GzZsCE+BAZsLZa4wFqWWgiKvm09yAgAAFrFloMrIyFCHDh30wQcf+PS8jRs3KiUlxfnTsmXLEJUQQKFZG0M7jupwRk6Z6xzNcn/Pq6NZecEuDgAAgIsKVhfAnd69e6t3794+P69evXqqUaNG8AsEwKNNe4+qx9n1Qrb93Pyyp2afvnav2+VHjpcdxgAAAAJhyxYqf5133nlq2LChevbsqZkzZ1pdHCDo7Dglhb+d7bztpRdIZ74CegICAIAQs2ULla8aNmyoUaNGqWPHjsrOztaXX36pnj17atasWbrsssvcPic7O1vZ2dnO39PT08NVXCDs7DjEKNj3xgIAALBCVASqVq1aqVWrVs7fO3furOTkZL311lseA9WwYcP08ssvh6uIQNQKdVjztH1HkSnkiWYAAMAqUdXlr6iLL75Ymzdv9vj40KFDlZaW5vxJTk4OY+mA6HE4077jlOzYRRIAAESXqA1Uy5cvV8OGDT0+Hh8fr2rVqrn8AHZnl/v6Fi3GDyt2W1YOAAAAq9myy9+xY8e0ZcsW5+/bt2/XihUrVKtWLTVt2lRDhw7V7t279cUXX0iShg8frmbNmqlt27bKycnRuHHjNGHCBE2YMMGqtwDYSijHK8WEOOUFUna7BFAAABC9bBmolixZoh49ejh/Hzx4sCTp7rvv1tixY5WSkqKkpCTn4zk5OXrqqae0e/duVa5cWW3bttXkyZPVp0+fsJcdKG9CHagC4aDTHwAACDFbBqru3bvLlDLSfezYsS6/DxkyREOGDAlxqQAUyszJd/5/95Hjfm3D28kssnPLvg8VAACAVaJ2DBUQjezS4uJviCrK2458BR6SV9Ga8BTO8rgRFQAACDECFRChbr2widfr2vE+VN7yFKi8USmOQxwAAAgtzjYARC17tOcBAIBoRqACAAAAAD8RqIAIVb9aJa/XtWOPv9ImnvF5W7Z8hwAAoDwgUAER6oHLzij18bMbJIapJMHhOWD533GPmAUAAEKNQAVEqMpxsep4ek2Pj8fG2HsEUfGws2Z3updrnlD09leRPOkGAACIbAQqALaQk59f9koAAAA2Q6ACyoFgjleKJOX0bQMAgDAiUAERxGHvXnwBIfwAAIBIRKACYAlvA1QgQYuMBgAAQo1ABcAWjuf6P4bqf0t3uV1eXrs6AgCA8CFQAeVAJOSKjalH3S73PJn6qf6Pu48cD0GJAAAAykagAsohe7TcuJYhJpoHiAEAgKhFoAIiSLAiR4Ed8lQxobhvli1yIwAAiGoEKiBKrd3j6Ua5wQtmpangY0DytDqhCAAA2BmBCohi+45mSbImlAzo0qzUx4uXKSYELVQAAAChRqACIlhefoEkqcBDH77kQ9ZN1uBrF75YD2OoDJOfAwAAGyNQARGkeOZYuStNkvT29E0enmFdGPl4zjaf1ve1hcqbOSwIYwAAINQIVEAU2LLvmNVFCJjHFioyEQAAsDECFRDF9h/NlmTPlhr7lQgAAMB3BCogSqRn5ZZYVtglsLyidQsAAIQagQqIEt/+mVximZ0nzisedjxlH0IRAACwMwIVEEEcpdxByl23vrjY8v0VJ4sBAIBQK99nW0CUKwxUkdDKY04WsmTLlf+Fj4T3DQAAIhuBCohiFezc568Ysg8AAIhEBCogilWIgi5/RzJLTrbhLTvObggAAKJL5J9tAeWJjw1Odm6hMl7OSvHdkpKTbXj/Gn4/FQAAwCsEKiCKxZwMVHO3HLC4JCV5m3UIRQAAwM4IVECUOJ5TUGJZYQPV89+vCXNpfOepe56nPOWwb+MbAAAoRwhUgJ+MMSW7rVnI3Y19YyIoddioKgEAALxGoAL8UFBgdMPIBbr7s8VhDVWlxaPc/JItVLF+BKrNe4/qofFLtTH1qM/P9UXxasv3UI92Cq0AAADFEagAPyQfztTSnYc1Z9N+5bgJMlZwF6g85am8As8h5dZPFmnK6lTdMHJ+sIrmlS/m73S7nDgFAADsjEAF+KFoo4nD16n3QiQ7r2Sg8hRGpqxO8bidA8eyJUlHs/KCUSyvbdzroUWMRAUAAGyMQAVEibz8kslj3EL3rT5Hs8MbltwpCENXProLAgCAUCNQARGktBByzE1IWrUrLZTFCUh+Kd0Oiwrk5rzkKQAAEGoEKiBC5OYX6B8TVnt8vLRxUZGMUAQAAOyMQAVEiPUp6aU+nl/gw+QYNkgp4bix79vTN/n/ZAAAAC8QqIAI5Sg2hZ+7MVR2kZdfoCOZOS7LvB3fFEiXPwAAgFAjUAFRokW9qlYXwaOr35+nc/81XcmHMp3LbNBIBgAAEDACFeCH47n5VhehhBh7zN7u1oaTNwn+vyJd8LxtebJzyxsAAACBCvDDFwt2hHT7+49ml1hWVouOLy0+3q5aEOSJLiYu3+1spfK2vL9v2BfUMgAAAAQTgQrww5HM3BBvP6fslcIgFC1xhZNrVIjl8AMAACIfZzSAH6wY/5OTX/osflZ3jPP1Jrp27qIIAADgLQIVECHcdQP0l5VZpjB2MSkFAACIBgQqIEJs2Xes1MdDMYYqlOxQBgAAgEARqAA/FJ2hzhGC5h5328wvc4KIyIoo3nYRrBwXG+KSAAAA+I9ABUSIApv3kfO2eIXr7Tp83Kv1z26Y6GeJAAAAQo9ABUSIslqobJ63SvhuSbJX60Xa+wIAAOULgQoI0NGsvLC8Tn4Qk4WVIWVZ0uFSyzBp+e4wlgYAACAwBCogQH9uPxSCrZYcRFXWTXYjpSVn8qoUSa7j0Iqat+VAOIsDAAAQEAIVEKD9x4I3nXlpyrgNleW8zXMVK5w47Hg95sq/4gAAAIQFgQoI0L70rLC8jt0npfBWxVjfAhUAAICdEaiAAIUrGJQ9bbr3dh/xboa9UIirYOVthQEAAIKLQAUEKFz3ofpy4c5Sn+NpTJI7K5KP+Fii4IkrbKHy9gk0ZQEAABsjUAF+KHqO37B6ZesK4qfYEKRAb2/UW/jK3q4PAABgZwQqIECn106wugiSfGvIibHwm9+hSQ2f1id2AQAAOyNQAQEKxYigUI8ycoT8FTyrUzVeEj35AABAdCBQAVHCUz7JyC554+HCHn/7jwZvyndv81FhVz9fxnwBAADYFYEKCJRNJq3zNK3661PWl1gW43Do49lb1em13/TRrC2hLlpAaMkCAAB2ZstANWfOHPXt21eNGjWSw+HQ999/X+ZzZs+erY4dO6pSpUo644wzNHLkyNAXFJC13eeKmrhst9vlS3YcLrEsxiEN+2WDJOnNqRtDWq7iCgMSQQkAAEQDWwaqjIwMdejQQR988IFX62/fvl19+vRR165dtXz5cj377LN67LHHNGHChBCXFOVVqLOAI4iz8LnbVDC3DwAAUJ5VsLoA7vTu3Vu9e/f2ev2RI0eqadOmGj58uCSpdevWWrJkid566y31798/RKVEeVa0dcXu2cRdeIoJQZl9bXHyeswVY60AAICN2bKFylcLFixQr169XJZdeeWVWrJkiXJzc90+Jzs7W+np6S4/QDRyl51iLEyBhfHI05iv4hIq2vK6DwAAgKQoCVSpqamqX7++y7L69esrLy9PBw4ccPucYcOGqXr16s6fJk2ahKOoiBqR02ri7p5TVgYqJy+rsGJsVBymAABAlIqaM5Xi3ZoKp2b2NFZk6NChSktLc/4kJyeHvIyITna/D5W7STNiQ9Hnz0d0+QMAANEgKvrSNGjQQKmpqS7L9u3bpwoVKqh27dpunxMfH6/4+PhwFA9RyHUMlfXhpDRus1MoxlB5GXyCNbsfswQCAAA7iIoWqs6dO2v69Okuy6ZNm6YLLrhAcXFxFpUK0azoubzN85TbAhbv8peSdlySlHwoMyxFkk61Ipe9nvvlD41fFsTSAAAA+MeWgerYsWNasWKFVqxYIenEtOgrVqxQUlKSpBPd9e666y7n+g8++KB27typwYMHa/369RozZoxGjx6tp556yoriA7biroWq+LLOw2ZIkgZ89mcYShQcMzbss7oIAAAA9uzyt2TJEvXo0cP5++DBgyVJd999t8aOHauUlBRnuJKk5s2ba8qUKXriiSf04YcfqlGjRnrvvfeYMh0h423rir+C2erlyyx/W/dnBO+FPSjsGlhAlz0AABAFbBmounfvXuoJ69ixY0ss69atm5YtowsQws/uPf7chSdvy+xL5vH9PlThHXMFAAAQCrbs8gfYXSSd47trjLJyIo3CgERQAgAA0YBABfhhfcqpG0HbfVIKd9Om22DWdO06fNzqIgAAAASMQAX4YW96dki37y4E+b0tty1UQds8AABAuUagAgJm73Syce9Rq4vgoqyefrdd1DQs5QAAAAgGAhUQILu39hzJzLW6CG7Vqer+xtoNqlVy+d3bySsAAACsQKACyiFPXQrDObbKDuO4AAAAAkWgAgIUilywZk9aCLZ6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2aNevXqpR48eWrFihdXFKdfYpwPH/mwN9t3Ase/aB/tzcLBPh1+077sEqiD74IMP1KhRI/Xt21dr1661ujgRa8iQITr99NOVkJCg9evXq2vXrlYXqdxinw4c+7M12HcDx75rH+zPwcE+HX7lYt81CIqCggIzefJk07NnT/PWW2+Z888/39xwww0mPz/f6qJFlJycHPPII48Yh8NhvvnmG+fyvXv3Wliq8ol9OnDsz9Zg3w0c+659sD8HB/t0+JWnfbeC1YEuWjgcDtWvX1933nmn+vfvr06dOql79+769ddf1bt3b6uLFxGMMYqLi1PXrl21evVqHThwQBs2bNDQoUN14MABxcTE6Pbbb9eAAQNUsWJFq4sb9dinA8P+bB323cCw79oL+3Pg2KetUZ72XYcxUdqZMcTS09O1bt06NWnSRKeddprbdW6++WZt3rxZs2fPVmJiYphLGBlycnKUn5+vypUrKz8/X7GxscrLy9MTTzyh//3vf8rNzdUdd9yhM844Q2vXrtXnn3+u119/XQMHDlTlypWtLn5UYZ8OHPuzNdh3A8e+ax/sz8HBPh1+5XrftbJ5LFK9/vrrplq1aqZdu3amWrVqZvjw4WbXrl3GGGPy8vKcTZlbt241lStXNu+9956VxbWtN954w5x11llm6tSpzmV5eXnGGGMWLFhg7r77bvPjjz+6POexxx4zHTp0MKtXrw5rWaMd+3Tg2J+twb4bOPZd+2B/Dg726fAr7/sugcpHU6ZMMa1btzaTJk0y27ZtM6+99ppp27atuffee53rFBQUOP//z3/+09SvX98kJycbY4zJyMgwx44dC3u57eTgwYPmwQcfNO3btzfVqlUz119/vdm/f78xxrXuVq1aZbKysowxxvlFTE1NNQ6HwyxatCj8BY9S7NOBYX+2DvtuYNh37YX9OXDs09Zg3yVQ+eyxxx4z5513nsuy999/37Rq1cqMGjXKGHPqKogxxhw7dsycfvrp5rHHHjNffPGFufTSS813330X1jLbzbZt28yQIUPM5MmTzdy5c43D4TBff/2186BW9EtXqHDZ119/berVq2dWrlwZ1jJHM/bpwLA/W4d9NzDsu/bC/hw49mlrsO8SqHySn59vBg4caG655RbnlQ1jjNmzZ4/5+9//bjp06GCOHj3qXLfQiy++aBwOh6lYsaIZOnRo2MttN3l5eWbnzp3O32+66SbTvn17s337drfrFx7s1q9fb3r16mX+9re/haOY5QL7dODYn63Bvhs49l37YH8ODvbp8GPfPYFA5aXCL92wYcNMkyZNSnw5f/zxR3PBBRc4k7gxJxL4ww8/bBwOh7nvvvvM4cOHw1hi+yus04MHD5q4uDgzbNgwly+jMSeagV9++WUzYMAAk5CQYG6//XaTnp5uRXGjDvt0cLE/hw/7bnCx71qL/Tn42KfDg333FG7s66WCggJJ0qBBg5SWlqbx48e7PN69e3fFxMTo4MGDzmUHDhxQYmKi5s6dq08//VQ1atQIZ5FtyRSZVNLhcCgvL0+1atXSc889p3feeUfr1693WTchIUE1a9bUsWPHNHv2bI0bNy66ZoWxEPt04NifQysrK8vtcvZd73mqQ/bd8Nu3b59LvRdif/aNp3pknw6dJUuWOI8lReuZfbcIi4Kc7SQnJ5vx48eb+fPnO9NyYfLOzc11Wfett94yiYmJZvHixS7Lzz33XPPQQw+Fpbx25W09FvalLdqn9rTTTjMPPPCAOXTokPn111/N2LFjjTEmKm8AFw579uwxN9xwg/n222+NMa51zT7tHW/rkP05uLZt22bat29vnn/++RKPse96x9s6ZN8NvW3btpm+ffuaAQMGmDVr1rg8xv7sPW/rkX06eLZu3WquueYa43A4zOeff+7yGPuuq3IfqAoKCsxjjz1mEhMTTbdu3UyVKlXMPffcY/bs2VNivSFDhpgvv/zSGGNMx44dTc+ePc3kyZONMcYsXbrUdOjQwUybNi3s78EOfK3HcePGOQ9khQe9iRMnmtjYWHPOOecYh8NhPvzww7C/j2jyyiuvGIfDYS6++GKTkZFhjHH948E+XTZv65D9OTgKCgrM3//+d1OhQgVzww03OGfncrce+657vtYh+25oFF5I/Pzzz03NmjXNTTfdZBYvXmxSU1NdHi/8P/uze/7UI/t04AoKCszAgQNNTEyMueaaa0yNGjXMhAkTjDGcR3hSrgPV9u3bTffu3c0ll1xiFixYYLKyssyoUaNMu3btzG+//eZcb+zYsaZWrVrm3HPPNcuWLTPGGLNu3Tpz3XXXmYoVK5pevXqZhIQEc8sttzhPusoTf+px1apVLtvYtWuXGTJkiHE4HOaWW25xTqUJ//Xu3dvccsst5rLLLjMvvPCCMebUgZB92jve1iH7c+A2b95satasadq2bevcJ91h3/XMnzpk3w2d/Px889e//tW88847zmXF98nPPvuM/bkMvtYj+3RgJk2aZCpXrmwuvPBCs3DhQmOMMZ07dzb333+/MeZUiOVY7KrcBaqiVzM2b95shg8fbjZs2OBctm/fPtOhQwfnLDHHjx83L7/8shkxYoTzSkfhNtLS0sy0adPMBx98YObNmxfGd2G9YNRjoezsbDNo0CBTq1YtM3PmzLCUP5oUnwa2sBn+3nvvNZMmTTJDhw41rVu3NuvWrTPGGJOenm5effVV89FHH7FPnxSMOizE/uy9ovW+Y8cO07ZtW/P3v//dGGPMH3/8YQYPHmxee+0188svvzhniXrxxRc5HhcRjDosxL4bmOLHkd9//920bNnS5Obmmj/++MNcc8015sorrzQPP/ywWbBggTHGmJdeeoljcTHBqMdC7NPeKVrno0aNcrZGGWNMZmamueOOO8z111/vDEbHjh0zr7zyCsfiIhzGuBnZF6WOHz+umJgYxcfHSzoxWDcrK8s5IG7v3r264447tGfPHl188cXq16+frrnmGgtLbE+hqMe9e/eqfv36oS561Cn+WRhj5HA4JEnt27fXN998o8zMTA0ZMkTnnHOO/vOf/2jz5s06++yzFRsba2XRbSMUdcj+XLbi9V5QUKDvv/9eN9xwg3r16qUNGzboggsu0JYtW7R//35dccUVGjt2rLWFtplQ1CH7rn+KfxaStGjRIl111VX69NNP9dprr+kvf/mLKlWqpBkzZmj16tVat26dGjRoYGGp7ScU9cg+XTp3x5GYmBNz1uXn5ys2NlZPPPGEZsyYoZUrVzr/RhZdDyo/k1I888wz5vzzzzd/+ctfzLvvvmvS0tJcHt+0aZOpVKmS6d27txk7dqy5/vrrzVlnnWVee+01YwwDFwtRj/bh6bPIz883u3btchn3884775g6deoYh8Nh3n33XZOdnW1l0W2DOrSGp3o/dOiQueuuu8wll1xiVq5c6ZzmeNSoUaZVq1bmo48+MsZwHDGGOrQTT5/FggULTM+ePU2nTp3M/fff76zz9PR0065dO3PPPfcYY0yJVpXyinoMv+J1XjhtfGEdF/47efJkU61aNZd7fMFV1Aeq7Oxsc8MNN5g2bdqYb775xtx1112mTZs25qqrriqx7ooVK5z/z8vLM08+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WrFihWnQoIE5dOiQc1l6eroZMmSISUxMNN26dTM33nijqVy5svnwww+NMeVvoB31aB98FoGjDq1BvQeOOrQPPovgoB7DjzqPPBWsCnITJkzQoEGDFB8fr9zcXN199916+OGHVb9+fUkn7uxcOKhuxowZatGihWrWrKmcnBxVrFhRiYmJ+ve//61OnTppzZo12rt3r5YtW6azzz5bUvkZaEc92gefReCoQ2tQ74GjDu2DzyI4qMfwo84jmBUpbvHixebss882w4cPNytXrjQfffSRqVu3rhk4cKA5ePCgMcaY/Px8k5uba4wx5rrrrjMPP/ywFUW1NerRPvgsAkcdWoN6Dxx1aB98FsFBPYYfdR7ZwhqoCpsaR4wYYRo3buwcSGfMibnyL774YvPKK684l+Xn55uCggLTokUL8/PPPxtjjNm4caO55ZZbTFJSUjiLbivUo33wWQSOOrQG9R446tA++CyCg3oMP+o8OoR1UorCpsbt27frrLPOUoUKp3ocDhgwQB07dtQvv/yitWvXSjoxj/7ixYuVkJCg888/X4MGDVL79u118OBB1atXL5xFtxXq0T74LAJHHVqDeg8cdWgffBbBQT2GH3UeHUIaqKZPn67HHntM7777rv7880/n8ksuuUTz589XamqqJCk/P19VqlRRv3795HA4NG3aNOe6U6ZM0Zo1a9SqVStNnz5df/zxh6ZNm6b4+PhQFt1WqEf74LMIHHVoDeo9cNShffBZBAf1GH7UeXQKSaBKSUlR3759dccdd+jQoUMaPXq0evXq5dxxevXqpWbNmunf//63pFPp/IorrlBMTIy2bNni3FZcXJzq1KmjsWPHau3aterYsWMoimxL1KN98FkEjjq0BvUeOOrQPvgsgoN6DD/qPMoFuw9hRkaGufvuu83NN99stm3b5lzeqVMnM2DAAGOMMXl5eeaLL74wMTEx5o8//nB5/u233266d+/u/H3fvn3BLmJEoB7tg88icNShNaj3wFGH9sFnERzUY/hR59Ev6C1UCQkJio+P14ABA9S8eXPl5eVJkq6++mqtX79ekhQbG6ubbrpJ/fr10/3336/Zs2fLGKPU1FRt3rxZd9xxh3N7devWDXYRIwL1aB98FoGjDq1BvQeOOrQPPovgoB7DjzqPfg5jTt6GOYhyc3MVFxcn6cRdnh0Oh+68805VrlxZo0aNci7LyspS7969tW7dOp177rlas2aNmjZtqu+++05NmjQJdrEiDvVoH3wWgaMOrUG9B446tA8+i+CgHsOPOo9uIQlU7lx22WW69957NWDAABljVFBQoNjYWO3du1erVq3S4sWL1axZM912223hKE7Eoh7tg88icNShNaj3wFGH9sFnERzUY/hR59EjLIFq27Zt6tKliyZPnuwcOFd4V2d4j3q0Dz6LwFGH1qDeA0cd2gefRXBQj+FHnUeXkE6bXpjV5s2bp6pVqzp3mJdfflmPP/649u3bF8qXjxrUo33wWQSOOrQG9R446tA++CyCg3oMP+o8OlUoexX/FU75+Oeff6p///6aPn26HnjgAWVmZurLL7/kBmReoh7tg88icNShNaj3wFGH9sFnERzUY/hR51EqyLMGlnD8+HFz5plnGofDYeLj480bb7wR6peMStSjffBZBI46tAb1Hjjq0D74LIKDegw/6jz6hGUM1RVXXKGWLVvqnXfeUaVKlUL9clGLerQPPovAUYfWoN4DRx3aB59FcFCP4UedR5ewBKr8/HzFxsaG+mWiHvVoH3wWgaMOrUG9B446tA8+i+CgHsOPOo8uYZs2HQAAAACiTUhn+QMAAACAaEagAgAAAAA/EagAAAAAwE8EKgAAAADwE4EKAAAAAPxEoAIAAAAAPxGoAAARw+Fw+PTTrFkzSVL37t3lcDi0Y8cOS8sPAIg+FawuAAAA3rr77rtLLJs3b562bt2qDh066Nxzz3V5rE6dOmEqGQCgvOLGvgCAiDZgwAB9/vnnevHFF/XSSy+5XScpKUmZmZlq0aKF4uLiwltAAEBUo4UKABD1mjZtanURAABRijFUAICo52kMVeE4q7y8PL3yyis688wzVblyZbVu3VqfffaZc70ZM2aoR48eqlatmmrWrKm77rpLBw8edPtaOTk5evfdd9WpUyclJiaqSpUquvDCCzV69GjRKQQAog8tVACAcu+mm27Sb7/9ps6dO6tFixaaPXu27r33XklSYmKibr31VnXo0EFXXHGFFi1apC+//FLbt2/XnDlz5HA4nNvJyMhQ7969NXfuXNWpU0eXXnqpYmJitGDBAt1///1avHixRo4cadXbBACEAIEKAFCu7dy5U4mJiVq3bp0aN24sSZo5c6Yuv/xyPffcc8rJydE333yj/v37S5LS09PVpUsXzZs3T7NmzVKPHj2c23r66ac1d+5c3Xnnnfroo49UtWpVSdL+/fvVt29fffzxx+rbt6+uuuqq8L9RAEBI0OUPAFDuvffee84wJUk9evTQ+eefr5SUFF111VXOMCVJ1apV0wMPPCBJmj17tnP5vn379Omnn6p58+b65JNPnGFKkurWrauPP/5Ykpz/AgCiA4EKAFCuVaxYUd26dSux/IwzzpAkXXHFFSUea9GihSQpJSXFuWz27NnKzc3VX//6V8XHx5d4TocOHZSYmKjFixcHq+gAABsgUAEAyrUGDRooJqbkn8MqVapIkk477TSPj2VnZzuXFU54MWLECI83Gj569KgOHDgQgncBALAKY6gAAOVa0Ukl/Hm8UH5+viTpvPPOU/v27QMuFwAgMhCoAAAIgsIxWN27d9c777xjcWkAAOFClz8AAIKgR48eio2N1c8//+xsrQIARD8CFQAAQXDaaadpwIAB2rx5s+688063Y6Xmz5+vKVOmWFA6AECo0OUPAIAgee+997Rt2zZ9/fXX+vnnn3XuueeqUaNGSk1N1ZYtW7R79249/vjj6tOnj9VFBQAECYEKAIAgSUhI0LRp0/T555/ryy+/1KpVq7Ro0SLVq1dPLVq00OOPP65bb73V6mICAILIYYwxVhcCAAAAACIRY6gAAAAAwE8EKgAAAADwE4EKAAAAAPxEoAIAAAAAPxGoAAAAAMBPBCoAAAAA8BOBCgAAAAD8RKACAAAAAD8RqAAAAADATwQqAAAAAPATgQoAAAAA/ESgAgAAAAA/EagAAAAAwE//D8C27E75IrtnAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(10,8))\n", "df['residual'] = df[1] - df[2]\n", "df['mse'] = (df[1] - df[2])**2\n", "df.plot(x = 0, y='mse', figsize=(10,8), title = 'Mean Squared Error', ax = ax)\n", "ax.set_xlabel('Time', fontsize=15)\n", "ax.set_ylabel('MSE', fontsize = 15)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.mixture import GaussianMixture\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.decomposition import PCA\n", "\n", "\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = test_predict1 - y_test\n", "\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "# Creating the GMM instance with desired number of clusters\n", "gmm = GaussianMixture(n_components=2)\n", "\n", "# Fitting the model to the data\n", "gmm.fit(X)\n", "\n", "# Getting the cluster labels\n", "labels = gmm.predict(X)\n", "\n", "# Plotting the data points with colors representing different clusters\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.title('GMM Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['pca_vav_2.pkl']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.cluster import KMeans\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.decomposition import PCA\n", "\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = (test_predict1 - y_test)\n", "\n", "k = 2\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "kmeans = KMeans(n_clusters=k)\n", "\n", "kmeans.fit(X)\n", "\n", "\n", "\n", "# Getting the cluster centers and labels\n", "centroids = kmeans.cluster_centers_\n", "# centroids = pca.transform(centroids)\n", "labels = kmeans.labels_\n", "\n", "# Plotting the data points and cluster centers\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n", "plt.text(centroids[0,0]+0.2, centroids[0,1]+0.5, 'Normal', fontsize=12, color='red')\n", "plt.text(centroids[1,0]+0.5, centroids[1,1]+0.2, 'Anomaly', fontsize=12, color='red')\n", "plt.title('KMeans Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.tight_layout()\n", "\n", "joblib.dump(kmeans, 'kmeans_vav_2.pkl')\n", "joblib.dump(pca, 'pca_vav_2.pkl')" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(391787, 31)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(test_predict1 - y_test).shape" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "k = 60\n", "X= test_predict1 - y_test\n", "processed_data = []\n", "feat_df = pd.DataFrame(columns=[\"mean\",\"std\",])\n", "for i in range(0,len(X), 60):\n", " mean = X[i:i+k].mean(axis = 0)\n", " std = X[i:i+k].std(axis = 0)\n", " max = X[i:i+k].max(axis = 0)\n", " min = X[i:i+k].min(axis = 0)\n", " iqr = np.percentile(X[i:i+k], 75, axis=0) - np.percentile(X[i:i+k], 25,axis=0)\n", " data = np.concatenate([mean, std, max, min, iqr])\n", " processed_data.append([data])\n", "processed_data = np.concatenate(processed_data,axis=0) " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X = processed_data\n", "\n", "kmeans = KMeans(n_clusters=2, algorithm='elkan', max_iter=1000, n_init = 5)\n", "\n", "kmeans.fit(X)\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "# Getting the cluster centers and labels\n", "centroids = kmeans.cluster_centers_\n", "centroids = pca.transform(centroids)\n", "labels = kmeans.labels_\n", "\n", "# Plotting the data points and cluster centers\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n", "plt.title('KMeans Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.mixture import GaussianMixture\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.decomposition import PCA\n", "\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = processed_data\n", "\n", "# Creating the GMM instance with desired number of clusters\n", "gmm = GaussianMixture(n_components=2, init_params='k-means++')\n", "\n", "# Fitting the model to the data\n", "gmm.fit(X)\n", "labels = gmm.predict(X)\n", "\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "# Getting the cluster labels\n", "\n", "# Plotting the data points with colors representing different clusters\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.title('GMM Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.cluster import KMeans\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "# Generating random data for demonstration\n", "np.random.seed(0)\n", "X = test_predict1 - y_test \n", "\n", "kmeans = KMeans(n_clusters=2)\n", "\n", "kmeans.fit(X)\n", "\n", "\n", "pca = PCA(n_components=2)\n", "X = pca.fit_transform(X)\n", "\n", "\n", "\n", "# Getting the cluster centers and labels\n", "centroids = kmeans.cluster_centers_\n", "centroids = pca.transform(centroids)\n", "labels = kmeans.labels_\n", "\n", "# Plotting the data points and cluster centers\n", "plt.figure()\n", "plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.5)\n", "plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', c='red', s=200, linewidths=2)\n", "plt.text(centroids[0,0], centroids[0,1], 'Normal', fontsize=12, color='red')\n", "plt.text(centroids[1,0], centroids[1,1], 'Anomaly', fontsize=12, color='red')\n", "plt.title('KMeans Clustering')\n", "plt.xlabel('Feature 1')\n", "plt.ylabel('Feature 2')\n", "plt.show()\n" ] } ], "metadata": { "kernelspec": { "display_name": "tensorflow", "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.11.8" } }, "nbformat": 4, "nbformat_minor": 2 }