├── CAISO Load.xlsx
├── Data_Workbook.xlsx
├── ElectricityByCounty.xlsx
├── CAISO Load Forecasting.pdf
├── City_Electricity_Data_1.xlsx
├── README.md
└── COMP152_FinalProject_TwoStagePerformance.ipynb
/CAISO Load.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mhgao/load-forecasting-CAISO/HEAD/CAISO Load.xlsx
--------------------------------------------------------------------------------
/Data_Workbook.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mhgao/load-forecasting-CAISO/HEAD/Data_Workbook.xlsx
--------------------------------------------------------------------------------
/ElectricityByCounty.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mhgao/load-forecasting-CAISO/HEAD/ElectricityByCounty.xlsx
--------------------------------------------------------------------------------
/CAISO Load Forecasting.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mhgao/load-forecasting-CAISO/HEAD/CAISO Load Forecasting.pdf
--------------------------------------------------------------------------------
/City_Electricity_Data_1.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mhgao/load-forecasting-CAISO/HEAD/City_Electricity_Data_1.xlsx
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # load-forecasting-CAISO
2 | This novel model and associated paper proposes the use of a two-stage K- means clustering for variable selection and then using decision trees and support vector regressors for day-ahead load forecasting in the CAISO electricity market.
3 |
4 | Find an account of the results and methodology in the report: [CAISO Load Forecasting.pdf]
5 |
6 | The team for the project includes: Martin Gao, Daniel Lee, Paul Maina, and Zohaib Siddique \
7 | martin.gao@tufts.edu; daniel.c_lee@tufts.edu; paul.maina@tufts.edu; zohaib.siddique@tufts.edu \
8 | Department of Computer Science, Tufts University, 161 College Ave, 02155 Medford, MA, USA
9 |
--------------------------------------------------------------------------------
/COMP152_FinalProject_TwoStagePerformance.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "#Call required libraries\n",
10 | "import time \n",
11 | "import warnings \n",
12 | "import numpy as np \n",
13 | "import pandas as pd \n",
14 | "import matplotlib.pyplot as plt \n",
15 | "import seaborn as sns\n",
16 | "from sklearn.preprocessing import StandardScaler \n",
17 | "from sklearn.cluster import KMeans, AgglomerativeClustering, AffinityPropagation\n",
18 | "from sklearn.mixture import GaussianMixture \n",
19 | "\n",
20 | "#inputs\n",
21 | "holiday_pd = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/Data_Workbook.xlsx', sheet_name = 'Holiday Dates')\n",
22 | "lat_long_data = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/Data_Workbook.xlsx', sheet_name = 'City-Lat-Long')\n",
23 | "county_load = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/Data_Workbook.xlsx', sheet_name = 'Load By County 2018')\n",
24 | "county_gdp = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/Data_Workbook.xlsx', sheet_name = 'GDP By County 2018')\n",
25 | "city_pop = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/Data_Workbook.xlsx', sheet_name = 'City Population')\n",
26 | "caiso_2016 = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/CAISO Load.xlsx',sheet_name = '2016')\n",
27 | "caiso_2017 = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/CAISO Load.xlsx',sheet_name = '2017')\n",
28 | "caiso_2018 = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/CAISO Load.xlsx',sheet_name = '2018')\n",
29 | "city_wx_data = pd.read_csv('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/all_wx_data.csv')\n",
30 | "\n",
31 | "#select specific columns not all\n",
32 | "city_wx_data = city_wx_data[['City', 'Year', 'Month', 'Day', 'Hour', 'Temperature',\n",
33 | " 'Relative Humidity',\n",
34 | " 'Cloud Type', 'Dew Point', 'Wind Speed']]\n",
35 | "city_wx_data = city_wx_data.drop_duplicates()\n",
36 | "caiso_total = caiso_2016.append([caiso_2017,caiso_2018])\n",
37 | "caiso_total['Date'] = pd.to_datetime(caiso_total['Date'])\n",
38 | "caiso_total['Month'] = caiso_total['Date'].dt.month\n",
39 | "caiso_total['Day'] = caiso_total['Date'].dt.day\n",
40 | "caiso_total['Year'] = caiso_total['Date'].dt.year\n",
41 | "caiso_total['Day_of_week'] = caiso_total['Date'].dt.dayofweek\n",
42 | "caiso_total['Week'] = caiso_total['Date'].dt.week\n",
43 | "caiso_total = caiso_total.rename(columns={\"HE\": \"Hour\"})\n",
44 | "\n",
45 | "#read-in\n",
46 | "city_elec = pd.read_excel('C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/City_Electricity_Data_1.xlsx')\n",
47 | "city_elec_complete = city_elec.dropna()\n",
48 | "city_elec_complete = city_elec_complete.drop_duplicates()\n",
49 | "city_elec_complete['total_elec_mwh'] = city_elec_complete['res_elec_mwh']+city_elec_complete['com_elec_mwh']+city_elec_complete['ind_elec_mwh']\n",
50 | "city_elec_complete.sort_values(ascending = False,by = 'total_elec_mwh').head(10)\n",
51 | "city_elec_complete= city_elec_complete[['City','housing_units', 'total_pop', 'res_elec_mwh', 'com_units',\n",
52 | " 'com_elec_mwh', 'ind_units', 'ind_elec_mwh','total_elec_mwh']]\n",
53 | "#city_elec_complete.sort_values(ascending = False,by = 'com_elec_mwh').head(10)\n",
54 | "#gather top10 commercial,industrial,residential\n",
55 | "top10_commercial = city_elec_complete.sort_values(ascending = False,by = 'com_elec_mwh').head(10)[['City', 'total_pop', 'com_elec_mwh']]\n",
56 | "top10_commercial.columns = ['City', 'Total Population' ,'Commercial MWh Usage']\n",
57 | "top10_industrial = city_elec_complete.sort_values(ascending = False,by = 'ind_elec_mwh').head(10)[['City', 'total_pop', 'ind_elec_mwh']]\n",
58 | "top10_industrial.columns = ['City', 'Total Population' ,'Industrial MWh Usage']\n",
59 | "top10_residential = city_elec_complete.sort_values(ascending = False,by = 'res_elec_mwh').head(10)[['City', 'total_pop', 'res_elec_mwh']]\n",
60 | "top10_residential.columns = ['City', 'Total Population' ,'Residential MWh Usage']\n",
61 | "top10_consumption = city_elec_complete.sort_values(ascending = False,by = 'total_elec_mwh').head(10)[['City', 'total_pop', 'total_elec_mwh']]\n",
62 | "top10_consumption.columns = ['City', 'Total Population' ,'Total MWh Usage'] \n",
63 | "#create percentages\n",
64 | "city_elec_complete['ind_pct'] = city_elec_complete['ind_elec_mwh']/city_elec_complete['total_elec_mwh']\n",
65 | "city_elec_complete['res_pct'] = city_elec_complete['res_elec_mwh']/city_elec_complete['total_elec_mwh']\n",
66 | "city_elec_complete['com_pct'] = city_elec_complete['com_elec_mwh']/city_elec_complete['total_elec_mwh']\n",
67 | "#correlation charts\n",
68 | "correlations_2 = city_elec_complete[['total_pop','res_pct', 'com_pct', 'ind_pct']].corr()\n",
69 | "correlations_1 = city_elec_complete[['total_pop','res_elec_mwh','com_elec_mwh','ind_elec_mwh']].corr()"
70 | ]
71 | },
72 | {
73 | "cell_type": "code",
74 | "execution_count": 2,
75 | "metadata": {},
76 | "outputs": [
77 | {
78 | "name": "stderr",
79 | "output_type": "stream",
80 | "text": [
81 | "C:\\Users\\zohai\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:144: FutureWarning: The sklearn.cluster.k_means_ module is deprecated in version 0.22 and will be removed in version 0.24. The corresponding classes / functions should instead be imported from sklearn.cluster. Anything that cannot be imported from sklearn.cluster is now part of the private API.\n",
82 | " warnings.warn(message, FutureWarning)\n"
83 | ]
84 | }
85 | ],
86 | "source": [
87 | "#Time series clustering\n",
88 | "from tslearn.clustering import TimeSeriesKMeans\n",
89 | "import warnings\n",
90 | "warnings.filterwarnings('ignore')\n",
91 | "\n",
92 | "#Scale the data as the data is in different units\n",
93 | "city_wx_cluster = city_wx_data[['City', 'Temperature',\n",
94 | " 'Relative Humidity',\n",
95 | " 'Cloud Type', 'Dew Point', 'Wind Speed']]\n",
96 | "from sklearn.preprocessing import StandardScaler\n",
97 | "scaler = StandardScaler()\n",
98 | "\n",
99 | "req_cols = ['Temperature',\n",
100 | " 'Relative Humidity',\n",
101 | " 'Cloud Type', 'Dew Point', 'Wind Speed']\n",
102 | "\n",
103 | "#scale for clustering\n",
104 | "city_wx_cluster_scaled = scaler.fit_transform(city_wx_cluster[req_cols])\n",
105 | "city_wx_cluster_scaled_df = pd.DataFrame(city_wx_cluster_scaled)\n",
106 | "\n",
107 | "#Add back the city column\n",
108 | "city_wx_cluster_scaled_df['City'] = city_wx_cluster['City']\n",
109 | "\n",
110 | "list_of_cities = list(set(city_wx_cluster.City.values))\n",
111 | "#np.array(city_wx_cluster_scaled_df[city_wx_cluster_scaled_df.City == list_of_cities[0]].iloc[:,0:5])\n",
112 | "wx_cluster = []\n",
113 | "\n",
114 | "for i in range(0,len(list_of_cities)):\n",
115 | " wx_cluster.append(np.array(city_wx_cluster_scaled_df[city_wx_cluster_scaled_df.City == list_of_cities[i]].iloc[:,0:5]))\n",
116 | "\n",
117 | "\n",
118 | "#Assign Labels\n",
119 | "city_wx_cluster = pd.DataFrame(list_of_cities)\n",
120 | "ts_kmeans_optimal = TimeSeriesKMeans(n_clusters = 5, metric=\"euclidean\", max_iter = 3, max_iter_barycenter=3, random_state = 5).fit(wx_cluster)\n",
121 | "wx_cluster_label = list(ts_kmeans_optimal.labels_)\n",
122 | "city_wx_cluster['Weather Cluster'] = wx_cluster_label\n",
123 | "city_wx_cluster.columns = ['City', 'Weather Cluster']\n",
124 | "\n",
125 | "#get all stats\n",
126 | "wx_cluster_0 = city_wx_cluster[city_wx_cluster['Weather Cluster'] == 0].merge(city_elec_complete,on='City')\n",
127 | "wx_cluster_1 = city_wx_cluster[city_wx_cluster['Weather Cluster'] == 1].merge(city_elec_complete,on='City')\n",
128 | "wx_cluster_2 = city_wx_cluster[city_wx_cluster['Weather Cluster'] == 2].merge(city_elec_complete,on='City')\n",
129 | "wx_cluster_3 = city_wx_cluster[city_wx_cluster['Weather Cluster'] == 3].merge(city_elec_complete,on='City')\n",
130 | "wx_cluster_4 = city_wx_cluster[city_wx_cluster['Weather Cluster'] == 4].merge(city_elec_complete,on='City')"
131 | ]
132 | },
133 | {
134 | "cell_type": "code",
135 | "execution_count": 3,
136 | "metadata": {},
137 | "outputs": [],
138 | "source": [
139 | "#create elbow function plot\n",
140 | "def plot_elbow_method(cluster_df):\n",
141 | " wcss = []\n",
142 | " for i in range(1,5):\n",
143 | " kmeans = KMeans(n_clusters = i, init = 'k-means++',max_iter = 300, n_init = 10, random_state = 5)\n",
144 | " kmeans.fit(cluster_df)\n",
145 | " wcss.append(kmeans.inertia_)\n",
146 | " \n",
147 | " plt.plot(range(1,5),wcss)\n",
148 | " plt.title('Optimal K/Elbow method visualization')\n",
149 | " plt.ylabel('Within Cluster Sum-of-Squares')\n",
150 | " plt.xlabel('Number of Clusters/K')\n",
151 | " plt.show()\n",
152 | " \n",
153 | "req_columns = ['res_pct', 'com_pct', 'ind_pct']\n",
154 | "\n",
155 | "#create kmeans labels\n",
156 | "def get_kmeans_labels(cluster_df):\n",
157 | " kmeans = KMeans(n_clusters = 2, init = 'k-means++',max_iter = 300, n_init = 10, random_state = 5).fit(cluster_df)\n",
158 | " labels = list(kmeans.labels_)\n",
159 | " return labels\n",
160 | "\n",
161 | "#create centroid \n",
162 | "def get_closest_to_centroid(cluster_df):\n",
163 | " from sklearn.metrics import pairwise_distances_argmin_min\n",
164 | " kmeans = KMeans(n_clusters = 2, init = 'k-means++',max_iter = 300, n_init = 10, random_state = 5).fit(cluster_df)\n",
165 | " closest, _ = pairwise_distances_argmin_min(kmeans.cluster_centers_, cluster_df)\n",
166 | " return closest\n",
167 | "\n",
168 | "cluster_0_sub = wx_cluster_0[req_columns]\n",
169 | "cluster_1_sub = wx_cluster_1[req_columns]\n",
170 | "cluster_2_sub = wx_cluster_2[req_columns]\n",
171 | "cluster_3_sub = wx_cluster_3[req_columns]\n",
172 | "cluster_4_sub = wx_cluster_4[req_columns]\n",
173 | "\n",
174 | "#scaling for clustering\n",
175 | "from sklearn.preprocessing import StandardScaler\n",
176 | "scaler = StandardScaler()\n",
177 | "\n",
178 | "cluster_0_sub_scaled = scaler.fit_transform(cluster_0_sub)\n",
179 | "cluster_1_sub_scaled = scaler.fit_transform(cluster_1_sub)\n",
180 | "cluster_2_sub_scaled = scaler.fit_transform(cluster_2_sub)\n",
181 | "cluster_3_sub_scaled = scaler.fit_transform(cluster_3_sub)\n",
182 | "cluster_4_sub_scaled = scaler.fit_transform(cluster_4_sub)"
183 | ]
184 | },
185 | {
186 | "cell_type": "code",
187 | "execution_count": 5,
188 | "metadata": {},
189 | "outputs": [],
190 | "source": [
191 | "wx_cluster_0['Electric Sub-Cluster'] = get_kmeans_labels(wx_cluster_0[req_columns])\n",
192 | "wx_cluster_1['Electric Sub-Cluster'] = get_kmeans_labels(wx_cluster_1[req_columns])\n",
193 | "wx_cluster_2['Electric Sub-Cluster'] = get_kmeans_labels(wx_cluster_2[req_columns])\n",
194 | "wx_cluster_3['Electric Sub-Cluster'] = get_kmeans_labels(wx_cluster_3[req_columns])\n",
195 | "wx_cluster_4['Electric Sub-Cluster'] = get_kmeans_labels(wx_cluster_4[req_columns])\n",
196 | "\n",
197 | "ex_wx_cluster_0 = wx_cluster_0[['City', 'Weather Cluster', 'Electric Sub-Cluster','ind_pct', 'res_pct', 'com_pct', 'total_pop' , 'total_elec_mwh']]\n",
198 | "ex_wx_cluster_1 = wx_cluster_1[['City', 'Weather Cluster', 'Electric Sub-Cluster','ind_pct', 'res_pct', 'com_pct', 'total_pop' , 'total_elec_mwh']]\n",
199 | "ex_wx_cluster_2 = wx_cluster_2[['City', 'Weather Cluster', 'Electric Sub-Cluster','ind_pct', 'res_pct', 'com_pct', 'total_pop' , 'total_elec_mwh']]\n",
200 | "ex_wx_cluster_3 = wx_cluster_3[['City', 'Weather Cluster', 'Electric Sub-Cluster','ind_pct', 'res_pct', 'com_pct', 'total_pop' , 'total_elec_mwh']]\n",
201 | "ex_wx_cluster_4 = wx_cluster_4[['City', 'Weather Cluster', 'Electric Sub-Cluster','ind_pct', 'res_pct', 'com_pct', 'total_pop' , 'total_elec_mwh']]\n",
202 | "\n",
203 | "all_ex_wx_cluster = ex_wx_cluster_0.append([ex_wx_cluster_1, ex_wx_cluster_2, ex_wx_cluster_3,ex_wx_cluster_4])\n",
204 | "#arcgis data\n",
205 | "arcgis_data_all = all_ex_wx_cluster[['City', 'Weather Cluster', 'Electric Sub-Cluster', 'total_pop' , 'total_elec_mwh']]"
206 | ]
207 | },
208 | {
209 | "cell_type": "code",
210 | "execution_count": 38,
211 | "metadata": {},
212 | "outputs": [],
213 | "source": [
214 | "wx00_max_load = wx_cluster_0[wx_cluster_0['Electric Sub-Cluster'] == 0]['total_elec_mwh'].max()\n",
215 | "wx01_max_load = wx_cluster_0[wx_cluster_0['Electric Sub-Cluster'] == 1]['total_elec_mwh'].max()\n",
216 | "wx10_max_load = wx_cluster_1[wx_cluster_1['Electric Sub-Cluster'] == 0]['total_elec_mwh'].max()\n",
217 | "wx11_max_load = wx_cluster_1[wx_cluster_1['Electric Sub-Cluster'] == 1]['total_elec_mwh'].max()\n",
218 | "wx20_max_load = wx_cluster_2[wx_cluster_2['Electric Sub-Cluster'] == 0]['total_elec_mwh'].max()\n",
219 | "wx21_max_load = wx_cluster_2[wx_cluster_2['Electric Sub-Cluster'] == 1]['total_elec_mwh'].max()\n",
220 | "wx30_max_load = wx_cluster_3[wx_cluster_3['Electric Sub-Cluster'] == 0]['total_elec_mwh'].max()\n",
221 | "wx31_max_load = wx_cluster_3[wx_cluster_3['Electric Sub-Cluster'] == 1]['total_elec_mwh'].max()\n",
222 | "wx40_max_load = wx_cluster_4[wx_cluster_4['Electric Sub-Cluster'] == 0]['total_elec_mwh'].max()\n",
223 | "wx41_max_load = wx_cluster_4[wx_cluster_4['Electric Sub-Cluster'] == 1]['total_elec_mwh'].max()\n",
224 | "\n",
225 | "#Cities List based on max load in each subcluster\n",
226 | "city_1=wx_cluster_0[wx_cluster_0['total_elec_mwh'] == wx00_max_load]['City'].item()\n",
227 | "city_2=wx_cluster_0[wx_cluster_0['total_elec_mwh'] == wx01_max_load]['City'].item()\n",
228 | "city_3=wx_cluster_1[wx_cluster_1['total_elec_mwh'] == wx10_max_load]['City'].item()\n",
229 | "city_4=wx_cluster_1[wx_cluster_1['total_elec_mwh'] == wx11_max_load]['City'].item()\n",
230 | "city_5=wx_cluster_2[wx_cluster_2['total_elec_mwh'] == wx20_max_load]['City'].item()\n",
231 | "city_6=wx_cluster_2[wx_cluster_2['total_elec_mwh'] == wx21_max_load]['City'].item()\n",
232 | "city_7=wx_cluster_3[wx_cluster_3['total_elec_mwh'] == wx30_max_load]['City'].item()\n",
233 | "city_8=wx_cluster_3[wx_cluster_3['total_elec_mwh'] == wx31_max_load]['City'].item()\n",
234 | "city_9=wx_cluster_4[wx_cluster_4['total_elec_mwh'] == wx40_max_load]['City'].item()\n",
235 | "city_10=wx_cluster_4[wx_cluster_4['total_elec_mwh'] == wx41_max_load]['City'].item()\n",
236 | "\n",
237 | "cities_list = ['Petaluma' , 'San Francisco', 'Sacramento', 'San Jose', 'Los Angeles', 'San Diego', 'Roseville', 'Chico', 'Fresno', 'Lemoore']\n",
238 | "cities_list_df = pd.DataFrame(cities_list)\n",
239 | "cities_list_df.columns = ['City']\n"
240 | ]
241 | },
242 | {
243 | "cell_type": "code",
244 | "execution_count": 40,
245 | "metadata": {},
246 | "outputs": [
247 | {
248 | "name": "stdout",
249 | "output_type": "stream",
250 | "text": [
251 | "{'max_depth': 7, 'max_features': 50, 'max_leaf_nodes': 192}\n",
252 | "0.9542729942738374\n",
253 | "0.7294860967589885\n"
254 | ]
255 | }
256 | ],
257 | "source": [
258 | "# tuned tree\n",
259 | "from sklearn.model_selection import RandomizedSearchCV\n",
260 | "from scipy.stats import randint\n",
261 | "\n",
262 | "parameters = {'max_leaf_nodes': randint(3, 200),\n",
263 | " 'max_features': randint(2, 76),\n",
264 | " 'max_depth': randint(1, 10)}\n",
265 | "rnd_params = RandomizedSearchCV(tree, param_distributions = parameters, cv = 10, n_iter = 200)\n",
266 | "rnd_params.fit(final_data_X_train, final_data_Y_train)\n",
267 | "\n",
268 | "best_parameters = rnd_params.best_params_\n",
269 | "print(best_parameters)\n",
270 | "\n",
271 | "tree.set_params(max_features=best_parameters['max_features'], max_leaf_nodes=best_parameters['max_leaf_nodes'])\n",
272 | "tree.fit(final_data_X_train, final_data_Y_train)\n",
273 | "\n",
274 | "tuned_train_score = tree.score(final_data_X_train, final_data_Y_train)\n",
275 | "tuned_test_score = tree.score(final_data_X_test, final_data_Y_test)\n",
276 | "y_pred_tuned_tree = tree.predict(final_data_X_test)\n",
277 | "\n",
278 | "from sklearn.model_selection import RandomizedSearchCV\n",
279 | "from scipy.stats import randint\n",
280 | "from sklearn.ensemble import RandomForestRegressor\n",
281 | "\n",
282 | "rf_tree = RandomForestRegressor()\n",
283 | "rf_tree.fit(final_data_X_train, final_data_Y_train)\n",
284 | "\n",
285 | "param_dist = {'n_estimators': randint(10, 100),\n",
286 | " 'max_leaf_nodes': randint(3, 100),\n",
287 | " 'max_features': [\"auto\"],\n",
288 | " 'max_depth': randint(1, 10),\n",
289 | " 'min_samples_leaf': randint(1, 30),\n",
290 | " 'min_samples_split': randint(2, 20)}\n",
291 | "\n",
292 | "rnd_search_rf = RandomizedSearchCV(rf_tree, param_distributions=param_dist, \n",
293 | " cv=10, n_iter=50)\n",
294 | "rnd_search_rf.fit(final_data_X_train, final_data_Y_train)\n",
295 | "\n",
296 | "rf_tree.set_params(n_estimators=rnd_search_rf.best_params_['n_estimators'], \n",
297 | " max_leaf_nodes=rnd_search_rf.best_params_['max_leaf_nodes'], \n",
298 | " max_features = rnd_search_rf.best_params_['max_features'],\n",
299 | " max_depth = rnd_search_rf.best_params_['max_depth'],\n",
300 | " min_samples_leaf = rnd_search_rf.best_params_['min_samples_leaf'],\n",
301 | " min_samples_split = rnd_search_rf.best_params_['min_samples_split'])\n",
302 | "\n",
303 | "\n",
304 | "#Tuned SVR\n",
305 | "from sklearn.model_selection import GridSearchCV \n",
306 | "from sklearn.svm import SVR\n",
307 | "svr_regressor = SVR()\n",
308 | "svr_regressor.fit(StandardScaler().fit_transform(final_data_X_train), final_data_Y_train) \n",
309 | "param_grid = {'C': [0.1, 1, 10, 100, 1000], \n",
310 | " 'gamma': [1, 0.1, 0.01, 0.001, 0.0001], \n",
311 | " 'kernel': ['linear','rbf']} \n",
312 | " \n",
313 | "svr_regressor_1 = RandomizedSearchCV(SVR(), param_distributions = param_grid) \n",
314 | " \n",
315 | "# fitting the model for grid search \n",
316 | "svr_regressor_1.fit(StandardScaler().fit_transform(final_data_X_train), final_data_Y_train) \n",
317 | "y_pred_svr = svr_regressor_1.predict(StandardScaler().fit_transform(final_data_X_test))"
318 | ]
319 | },
320 | {
321 | "cell_type": "code",
322 | "execution_count": 43,
323 | "metadata": {},
324 | "outputs": [
325 | {
326 | "name": "stdout",
327 | "output_type": "stream",
328 | "text": [
329 | "[744, 672, 744, 720, 744, 720, 744, 744, 720, 744, 720, 720]\n"
330 | ]
331 | }
332 | ],
333 | "source": [
334 | "results_df = final_data[final_data.Year == 2018]\n",
335 | "results_df = results_df[['Day', 'Month','Hour', 'Year', 'CAISO Total']]\n",
336 | "results_df['RF_Tuned_Prediction'] = rf_tree.predict(final_data_X_test)\n",
337 | "results_df['SVR_Prediction'] = y_pred_svr\n",
338 | "results_df['DTree_Tuned_Prediction'] = y_pred_tuned_tree\n",
339 | "\n",
340 | "results_df['Hourly_MAPE_RF_Tuned'] = abs((results_df['CAISO Total'] - results_df['RF_Tuned_Prediction'])/results_df['CAISO Total'])*100\n",
341 | "results_df['Hourly_MAPE_SVR'] = abs((results_df['CAISO Total'] - results_df['SVR_Prediction'])/results_df['CAISO Total'])*100\n",
342 | "results_df['Hourly_MAPE_DTree_Tuned'] = abs((results_df['CAISO Total'] - results_df['DTree_Tuned_Prediction'])/results_df['CAISO Total'])*100\n",
343 | "results_df\n",
344 | "\n",
345 | "#mape functions\n",
346 | "\n",
347 | "def get_month_count(df):\n",
348 | " month = [0]*12 \n",
349 | " for i in range(0, len(df)):\n",
350 | " if df['Month'].iloc[i] == 1:\n",
351 | " month[0] += 1\n",
352 | " elif df['Month'].iloc[i] == 2:\n",
353 | " month[1] += 1\n",
354 | " elif df['Month'].iloc[i] == 3:\n",
355 | " month[2] += 1\n",
356 | " elif df['Month'].iloc[i] == 4:\n",
357 | " month[3] += 1\n",
358 | " elif df['Month'].iloc[i] == 5:\n",
359 | " month[4] += 1\n",
360 | " elif df['Month'].iloc[i] == 6:\n",
361 | " month[5] += 1\n",
362 | " elif df['Month'].iloc[i] == 7:\n",
363 | " month[6] += 1\n",
364 | " elif df['Month'].iloc[i] == 8:\n",
365 | " month[7] += 1\n",
366 | " elif df['Month'].iloc[i] == 9:\n",
367 | " month[8] += 1\n",
368 | " elif df['Month'].iloc[i] == 10:\n",
369 | " month[9] += 1\n",
370 | " elif df['Month'].iloc[i] == 11:\n",
371 | " month[10] += 1\n",
372 | " elif df['Month'].iloc[i] == 12:\n",
373 | " month[11] += 1\n",
374 | " return month\n",
375 | "\n",
376 | "d = get_month_count(results_df)\n",
377 | "print(d)\n",
378 | "\n",
379 | "def get_mape_by_month(df, column_name):\n",
380 | "\n",
381 | " final = df.pivot_table(column_name, index = 'Month', aggfunc='sum')\n",
382 | " return final \n",
383 | "\n",
384 | "import pandas as pd \n",
385 | "\n",
386 | "def get_mape_by_month(df, column_name):\n",
387 | " final = df.pivot_table(column_name, index = 'Month', aggfunc='sum')\n",
388 | " return final \n",
389 | "\n",
390 | "def mean(dataframe, d):\n",
391 | " for i in range(0, len(dataframe)):\n",
392 | " dataframe.iloc[i] = dataframe.iloc[i] / d[i]\n",
393 | " \n",
394 | " return dataframe\n",
395 | "\n",
396 | "\n",
397 | "def create_mape_table(df, d):\n",
398 | " final_frame = pd.DataFrame()\n",
399 | " columns = list(df.columns[8:len(df.columns)])\n",
400 | " for i, val in enumerate(columns): \n",
401 | " temp = get_mape_by_month(df,val)\n",
402 | " temp_frame = mean(temp, d)\n",
403 | " final_frame = pd.concat([final_frame, temp_frame], axis = 1)\n",
404 | " return final_frame \n",
405 | "\n",
406 | "final_frame = create_mape_table(results_df, d)\n",
407 | "final_frame = final_frame.reset_index(drop = True)"
408 | ]
409 | },
410 | {
411 | "cell_type": "code",
412 | "execution_count": 46,
413 | "metadata": {},
414 | "outputs": [
415 | {
416 | "data": {
417 | "text/html": [
418 | "
\n",
419 | "\n",
432 | "
\n",
433 | " \n",
434 | " \n",
435 | " | \n",
436 | " Feature | \n",
437 | " Importance | \n",
438 | "
\n",
439 | " \n",
440 | " \n",
441 | " \n",
442 | " | 0 | \n",
443 | " fresno_relative_humidity | \n",
444 | " 0.373411 | \n",
445 | "
\n",
446 | " \n",
447 | " | 1 | \n",
448 | " Hour | \n",
449 | " 0.255585 | \n",
450 | "
\n",
451 | " \n",
452 | " | 2 | \n",
453 | " lemoore_temperature | \n",
454 | " 0.111071 | \n",
455 | "
\n",
456 | " \n",
457 | " | 3 | \n",
458 | " fresno_temperature | \n",
459 | " 0.063811 | \n",
460 | "
\n",
461 | " \n",
462 | " | 4 | \n",
463 | " Day_of_week | \n",
464 | " 0.059408 | \n",
465 | "
\n",
466 | " \n",
467 | " | 5 | \n",
468 | " lemoore_relative_humidity | \n",
469 | " 0.021034 | \n",
470 | "
\n",
471 | " \n",
472 | " | 6 | \n",
473 | " chico_relative_humidity | \n",
474 | " 0.015598 | \n",
475 | "
\n",
476 | " \n",
477 | " | 7 | \n",
478 | " Week | \n",
479 | " 0.012467 | \n",
480 | "
\n",
481 | " \n",
482 | " | 8 | \n",
483 | " Day | \n",
484 | " 0.011358 | \n",
485 | "
\n",
486 | " \n",
487 | " | 9 | \n",
488 | " chico_temperature | \n",
489 | " 0.006728 | \n",
490 | "
\n",
491 | " \n",
492 | " | 10 | \n",
493 | " san_diego_dew_point | \n",
494 | " 0.005414 | \n",
495 | "
\n",
496 | " \n",
497 | " | 11 | \n",
498 | " san_diego_temperature | \n",
499 | " 0.005129 | \n",
500 | "
\n",
501 | " \n",
502 | " | 12 | \n",
503 | " los_angeles_temperature | \n",
504 | " 0.003860 | \n",
505 | "
\n",
506 | " \n",
507 | " | 13 | \n",
508 | " roseville_relative_humidity | \n",
509 | " 0.003626 | \n",
510 | "
\n",
511 | " \n",
512 | " | 14 | \n",
513 | " Month | \n",
514 | " 0.003414 | \n",
515 | "
\n",
516 | " \n",
517 | " | 15 | \n",
518 | " los_angeles_wind_speed | \n",
519 | " 0.003391 | \n",
520 | "
\n",
521 | " \n",
522 | " | 16 | \n",
523 | " sacramento_relative_humidity | \n",
524 | " 0.003040 | \n",
525 | "
\n",
526 | " \n",
527 | " | 17 | \n",
528 | " chico_wind_speed | \n",
529 | " 0.002434 | \n",
530 | "
\n",
531 | " \n",
532 | " | 18 | \n",
533 | " san_diego_wind_speed | \n",
534 | " 0.002428 | \n",
535 | "
\n",
536 | " \n",
537 | " | 19 | \n",
538 | " fresno_wind_speed | \n",
539 | " 0.002338 | \n",
540 | "
\n",
541 | " \n",
542 | " | 20 | \n",
543 | " los_angeles_dew_point | \n",
544 | " 0.002248 | \n",
545 | "
\n",
546 | " \n",
547 | " | 21 | \n",
548 | " roseville_temperature | \n",
549 | " 0.002050 | \n",
550 | "
\n",
551 | " \n",
552 | " | 22 | \n",
553 | " san_diego_relative_humidity | \n",
554 | " 0.001976 | \n",
555 | "
\n",
556 | " \n",
557 | " | 23 | \n",
558 | " san_jose_wind_speed | \n",
559 | " 0.001913 | \n",
560 | "
\n",
561 | " \n",
562 | " | 24 | \n",
563 | " los_angeles_relative_humidity | \n",
564 | " 0.001855 | \n",
565 | "
\n",
566 | " \n",
567 | " | 25 | \n",
568 | " lemoore_wind_speed | \n",
569 | " 0.001718 | \n",
570 | "
\n",
571 | " \n",
572 | " | 26 | \n",
573 | " sacramento_temperature | \n",
574 | " 0.001360 | \n",
575 | "
\n",
576 | " \n",
577 | " | 27 | \n",
578 | " petaluma_relative_humidity | \n",
579 | " 0.001332 | \n",
580 | "
\n",
581 | " \n",
582 | " | 28 | \n",
583 | " san_jose_relative_humidity | \n",
584 | " 0.001241 | \n",
585 | "
\n",
586 | " \n",
587 | " | 29 | \n",
588 | " petaluma_dew_point | \n",
589 | " 0.001182 | \n",
590 | "
\n",
591 | " \n",
592 | " | 30 | \n",
593 | " san_francisco_relative_humidity | \n",
594 | " 0.001125 | \n",
595 | "
\n",
596 | " \n",
597 | " | 31 | \n",
598 | " san_francisco_wind_speed | \n",
599 | " 0.001094 | \n",
600 | "
\n",
601 | " \n",
602 | " | 32 | \n",
603 | " lemoore_dew_point | \n",
604 | " 0.001045 | \n",
605 | "
\n",
606 | " \n",
607 | " | 33 | \n",
608 | " chico_dew_point | \n",
609 | " 0.001042 | \n",
610 | "
\n",
611 | " \n",
612 | " | 34 | \n",
613 | " petaluma_wind_speed | \n",
614 | " 0.001038 | \n",
615 | "
\n",
616 | " \n",
617 | " | 35 | \n",
618 | " roseville_dew_point | \n",
619 | " 0.001030 | \n",
620 | "
\n",
621 | " \n",
622 | " | 36 | \n",
623 | " sacramento_wind_speed | \n",
624 | " 0.000986 | \n",
625 | "
\n",
626 | " \n",
627 | " | 37 | \n",
628 | " san_jose_dew_point | \n",
629 | " 0.000977 | \n",
630 | "
\n",
631 | " \n",
632 | " | 38 | \n",
633 | " fresno_dew_point | \n",
634 | " 0.000958 | \n",
635 | "
\n",
636 | " \n",
637 | " | 39 | \n",
638 | " sacramento_dew_point | \n",
639 | " 0.000957 | \n",
640 | "
\n",
641 | " \n",
642 | " | 40 | \n",
643 | " roseville_wind_speed | \n",
644 | " 0.000861 | \n",
645 | "
\n",
646 | " \n",
647 | " | 41 | \n",
648 | " san_jose_temperature | \n",
649 | " 0.000822 | \n",
650 | "
\n",
651 | " \n",
652 | " | 42 | \n",
653 | " san_francisco_dew_point | \n",
654 | " 0.000719 | \n",
655 | "
\n",
656 | " \n",
657 | " | 43 | \n",
658 | " san_francisco_temperature | \n",
659 | " 0.000588 | \n",
660 | "
\n",
661 | " \n",
662 | " | 44 | \n",
663 | " petaluma_temperature | \n",
664 | " 0.000514 | \n",
665 | "
\n",
666 | " \n",
667 | " | 45 | \n",
668 | " los_angeles_cloud_type | \n",
669 | " 0.000450 | \n",
670 | "
\n",
671 | " \n",
672 | " | 46 | \n",
673 | " san_francisco_cloud_type | \n",
674 | " 0.000431 | \n",
675 | "
\n",
676 | " \n",
677 | " | 47 | \n",
678 | " chico_cloud_type | \n",
679 | " 0.000417 | \n",
680 | "
\n",
681 | " \n",
682 | " | 48 | \n",
683 | " sacramento_cloud_type | \n",
684 | " 0.000407 | \n",
685 | "
\n",
686 | " \n",
687 | " | 49 | \n",
688 | " san_diego_cloud_type | \n",
689 | " 0.000395 | \n",
690 | "
\n",
691 | " \n",
692 | " | 50 | \n",
693 | " roseville_cloud_type | \n",
694 | " 0.000379 | \n",
695 | "
\n",
696 | " \n",
697 | " | 51 | \n",
698 | " petaluma_cloud_type | \n",
699 | " 0.000360 | \n",
700 | "
\n",
701 | " \n",
702 | " | 52 | \n",
703 | " san_jose_cloud_type | \n",
704 | " 0.000345 | \n",
705 | "
\n",
706 | " \n",
707 | " | 53 | \n",
708 | " lemoore_cloud_type | \n",
709 | " 0.000324 | \n",
710 | "
\n",
711 | " \n",
712 | " | 54 | \n",
713 | " fresno_cloud_type | \n",
714 | " 0.000314 | \n",
715 | "
\n",
716 | " \n",
717 | " | 55 | \n",
718 | " Year | \n",
719 | " 0.000005 | \n",
720 | "
\n",
721 | " \n",
722 | "
\n",
723 | "
"
724 | ],
725 | "text/plain": [
726 | " Feature Importance\n",
727 | "0 fresno_relative_humidity 0.373411\n",
728 | "1 Hour 0.255585\n",
729 | "2 lemoore_temperature 0.111071\n",
730 | "3 fresno_temperature 0.063811\n",
731 | "4 Day_of_week 0.059408\n",
732 | "5 lemoore_relative_humidity 0.021034\n",
733 | "6 chico_relative_humidity 0.015598\n",
734 | "7 Week 0.012467\n",
735 | "8 Day 0.011358\n",
736 | "9 chico_temperature 0.006728\n",
737 | "10 san_diego_dew_point 0.005414\n",
738 | "11 san_diego_temperature 0.005129\n",
739 | "12 los_angeles_temperature 0.003860\n",
740 | "13 roseville_relative_humidity 0.003626\n",
741 | "14 Month 0.003414\n",
742 | "15 los_angeles_wind_speed 0.003391\n",
743 | "16 sacramento_relative_humidity 0.003040\n",
744 | "17 chico_wind_speed 0.002434\n",
745 | "18 san_diego_wind_speed 0.002428\n",
746 | "19 fresno_wind_speed 0.002338\n",
747 | "20 los_angeles_dew_point 0.002248\n",
748 | "21 roseville_temperature 0.002050\n",
749 | "22 san_diego_relative_humidity 0.001976\n",
750 | "23 san_jose_wind_speed 0.001913\n",
751 | "24 los_angeles_relative_humidity 0.001855\n",
752 | "25 lemoore_wind_speed 0.001718\n",
753 | "26 sacramento_temperature 0.001360\n",
754 | "27 petaluma_relative_humidity 0.001332\n",
755 | "28 san_jose_relative_humidity 0.001241\n",
756 | "29 petaluma_dew_point 0.001182\n",
757 | "30 san_francisco_relative_humidity 0.001125\n",
758 | "31 san_francisco_wind_speed 0.001094\n",
759 | "32 lemoore_dew_point 0.001045\n",
760 | "33 chico_dew_point 0.001042\n",
761 | "34 petaluma_wind_speed 0.001038\n",
762 | "35 roseville_dew_point 0.001030\n",
763 | "36 sacramento_wind_speed 0.000986\n",
764 | "37 san_jose_dew_point 0.000977\n",
765 | "38 fresno_dew_point 0.000958\n",
766 | "39 sacramento_dew_point 0.000957\n",
767 | "40 roseville_wind_speed 0.000861\n",
768 | "41 san_jose_temperature 0.000822\n",
769 | "42 san_francisco_dew_point 0.000719\n",
770 | "43 san_francisco_temperature 0.000588\n",
771 | "44 petaluma_temperature 0.000514\n",
772 | "45 los_angeles_cloud_type 0.000450\n",
773 | "46 san_francisco_cloud_type 0.000431\n",
774 | "47 chico_cloud_type 0.000417\n",
775 | "48 sacramento_cloud_type 0.000407\n",
776 | "49 san_diego_cloud_type 0.000395\n",
777 | "50 roseville_cloud_type 0.000379\n",
778 | "51 petaluma_cloud_type 0.000360\n",
779 | "52 san_jose_cloud_type 0.000345\n",
780 | "53 lemoore_cloud_type 0.000324\n",
781 | "54 fresno_cloud_type 0.000314\n",
782 | "55 Year 0.000005"
783 | ]
784 | },
785 | "execution_count": 46,
786 | "metadata": {},
787 | "output_type": "execute_result"
788 | }
789 | ],
790 | "source": [
791 | "# Random Forest tree importances\n",
792 | "pd.DataFrame({'Feature':final_data_X_train.columns, 'Importance': rf_tree.feature_importances_}).sort_values(by = 'Importance', ascending = False).reset_index(drop=True)"
793 | ]
794 | },
795 | {
796 | "cell_type": "code",
797 | "execution_count": 47,
798 | "metadata": {},
799 | "outputs": [
800 | {
801 | "data": {
802 | "text/html": [
803 | "\n",
804 | "\n",
817 | "
\n",
818 | " \n",
819 | " \n",
820 | " | \n",
821 | " Feature | \n",
822 | " Importance | \n",
823 | "
\n",
824 | " \n",
825 | " \n",
826 | " \n",
827 | " | 0 | \n",
828 | " fresno_relative_humidity | \n",
829 | " 0.481964 | \n",
830 | "
\n",
831 | " \n",
832 | " | 1 | \n",
833 | " Hour | \n",
834 | " 0.267807 | \n",
835 | "
\n",
836 | " \n",
837 | " | 2 | \n",
838 | " Day_of_week | \n",
839 | " 0.062052 | \n",
840 | "
\n",
841 | " \n",
842 | " | 3 | \n",
843 | " fresno_temperature | \n",
844 | " 0.055203 | \n",
845 | "
\n",
846 | " \n",
847 | " | 4 | \n",
848 | " lemoore_temperature | \n",
849 | " 0.050826 | \n",
850 | "
\n",
851 | " \n",
852 | " | 5 | \n",
853 | " lemoore_relative_humidity | \n",
854 | " 0.017357 | \n",
855 | "
\n",
856 | " \n",
857 | " | 6 | \n",
858 | " Day | \n",
859 | " 0.011032 | \n",
860 | "
\n",
861 | " \n",
862 | " | 7 | \n",
863 | " Week | \n",
864 | " 0.007940 | \n",
865 | "
\n",
866 | " \n",
867 | " | 8 | \n",
868 | " san_diego_dew_point | \n",
869 | " 0.007538 | \n",
870 | "
\n",
871 | " \n",
872 | " | 9 | \n",
873 | " los_angeles_temperature | \n",
874 | " 0.004585 | \n",
875 | "
\n",
876 | " \n",
877 | " | 10 | \n",
878 | " chico_relative_humidity | \n",
879 | " 0.003697 | \n",
880 | "
\n",
881 | " \n",
882 | " | 11 | \n",
883 | " san_diego_temperature | \n",
884 | " 0.003477 | \n",
885 | "
\n",
886 | " \n",
887 | " | 12 | \n",
888 | " san_jose_wind_speed | \n",
889 | " 0.003111 | \n",
890 | "
\n",
891 | " \n",
892 | " | 13 | \n",
893 | " chico_temperature | \n",
894 | " 0.002460 | \n",
895 | "
\n",
896 | " \n",
897 | " | 14 | \n",
898 | " Month | \n",
899 | " 0.002422 | \n",
900 | "
\n",
901 | " \n",
902 | " | 15 | \n",
903 | " sacramento_relative_humidity | \n",
904 | " 0.002137 | \n",
905 | "
\n",
906 | " \n",
907 | " | 16 | \n",
908 | " san_diego_wind_speed | \n",
909 | " 0.002021 | \n",
910 | "
\n",
911 | " \n",
912 | " | 17 | \n",
913 | " los_angeles_dew_point | \n",
914 | " 0.001585 | \n",
915 | "
\n",
916 | " \n",
917 | " | 18 | \n",
918 | " chico_wind_speed | \n",
919 | " 0.001463 | \n",
920 | "
\n",
921 | " \n",
922 | " | 19 | \n",
923 | " roseville_relative_humidity | \n",
924 | " 0.001314 | \n",
925 | "
\n",
926 | " \n",
927 | " | 20 | \n",
928 | " roseville_temperature | \n",
929 | " 0.001256 | \n",
930 | "
\n",
931 | " \n",
932 | " | 21 | \n",
933 | " los_angeles_wind_speed | \n",
934 | " 0.000866 | \n",
935 | "
\n",
936 | " \n",
937 | " | 22 | \n",
938 | " roseville_dew_point | \n",
939 | " 0.000857 | \n",
940 | "
\n",
941 | " \n",
942 | " | 23 | \n",
943 | " lemoore_wind_speed | \n",
944 | " 0.000835 | \n",
945 | "
\n",
946 | " \n",
947 | " | 24 | \n",
948 | " los_angeles_relative_humidity | \n",
949 | " 0.000792 | \n",
950 | "
\n",
951 | " \n",
952 | " | 25 | \n",
953 | " san_francisco_dew_point | \n",
954 | " 0.000719 | \n",
955 | "
\n",
956 | " \n",
957 | " | 26 | \n",
958 | " san_jose_dew_point | \n",
959 | " 0.000712 | \n",
960 | "
\n",
961 | " \n",
962 | " | 27 | \n",
963 | " petaluma_wind_speed | \n",
964 | " 0.000608 | \n",
965 | "
\n",
966 | " \n",
967 | " | 28 | \n",
968 | " petaluma_temperature | \n",
969 | " 0.000580 | \n",
970 | "
\n",
971 | " \n",
972 | " | 29 | \n",
973 | " san_diego_relative_humidity | \n",
974 | " 0.000421 | \n",
975 | "
\n",
976 | " \n",
977 | " | 30 | \n",
978 | " lemoore_dew_point | \n",
979 | " 0.000414 | \n",
980 | "
\n",
981 | " \n",
982 | " | 31 | \n",
983 | " san_jose_cloud_type | \n",
984 | " 0.000412 | \n",
985 | "
\n",
986 | " \n",
987 | " | 32 | \n",
988 | " san_jose_temperature | \n",
989 | " 0.000279 | \n",
990 | "
\n",
991 | " \n",
992 | " | 33 | \n",
993 | " san_francisco_relative_humidity | \n",
994 | " 0.000256 | \n",
995 | "
\n",
996 | " \n",
997 | " | 34 | \n",
998 | " chico_dew_point | \n",
999 | " 0.000240 | \n",
1000 | "
\n",
1001 | " \n",
1002 | " | 35 | \n",
1003 | " sacramento_dew_point | \n",
1004 | " 0.000231 | \n",
1005 | "
\n",
1006 | " \n",
1007 | " | 36 | \n",
1008 | " petaluma_relative_humidity | \n",
1009 | " 0.000183 | \n",
1010 | "
\n",
1011 | " \n",
1012 | " | 37 | \n",
1013 | " san_jose_relative_humidity | \n",
1014 | " 0.000178 | \n",
1015 | "
\n",
1016 | " \n",
1017 | " | 38 | \n",
1018 | " roseville_cloud_type | \n",
1019 | " 0.000172 | \n",
1020 | "
\n",
1021 | " \n",
1022 | " | 39 | \n",
1023 | " fresno_wind_speed | \n",
1024 | " 0.000000 | \n",
1025 | "
\n",
1026 | " \n",
1027 | " | 40 | \n",
1028 | " petaluma_cloud_type | \n",
1029 | " 0.000000 | \n",
1030 | "
\n",
1031 | " \n",
1032 | " | 41 | \n",
1033 | " petaluma_dew_point | \n",
1034 | " 0.000000 | \n",
1035 | "
\n",
1036 | " \n",
1037 | " | 42 | \n",
1038 | " fresno_dew_point | \n",
1039 | " 0.000000 | \n",
1040 | "
\n",
1041 | " \n",
1042 | " | 43 | \n",
1043 | " lemoore_cloud_type | \n",
1044 | " 0.000000 | \n",
1045 | "
\n",
1046 | " \n",
1047 | " | 44 | \n",
1048 | " fresno_cloud_type | \n",
1049 | " 0.000000 | \n",
1050 | "
\n",
1051 | " \n",
1052 | " | 45 | \n",
1053 | " san_francisco_cloud_type | \n",
1054 | " 0.000000 | \n",
1055 | "
\n",
1056 | " \n",
1057 | " | 46 | \n",
1058 | " san_francisco_temperature | \n",
1059 | " 0.000000 | \n",
1060 | "
\n",
1061 | " \n",
1062 | " | 47 | \n",
1063 | " chico_cloud_type | \n",
1064 | " 0.000000 | \n",
1065 | "
\n",
1066 | " \n",
1067 | " | 48 | \n",
1068 | " roseville_wind_speed | \n",
1069 | " 0.000000 | \n",
1070 | "
\n",
1071 | " \n",
1072 | " | 49 | \n",
1073 | " san_francisco_wind_speed | \n",
1074 | " 0.000000 | \n",
1075 | "
\n",
1076 | " \n",
1077 | " | 50 | \n",
1078 | " sacramento_temperature | \n",
1079 | " 0.000000 | \n",
1080 | "
\n",
1081 | " \n",
1082 | " | 51 | \n",
1083 | " sacramento_cloud_type | \n",
1084 | " 0.000000 | \n",
1085 | "
\n",
1086 | " \n",
1087 | " | 52 | \n",
1088 | " san_diego_cloud_type | \n",
1089 | " 0.000000 | \n",
1090 | "
\n",
1091 | " \n",
1092 | " | 53 | \n",
1093 | " sacramento_wind_speed | \n",
1094 | " 0.000000 | \n",
1095 | "
\n",
1096 | " \n",
1097 | " | 54 | \n",
1098 | " los_angeles_cloud_type | \n",
1099 | " 0.000000 | \n",
1100 | "
\n",
1101 | " \n",
1102 | " | 55 | \n",
1103 | " Year | \n",
1104 | " 0.000000 | \n",
1105 | "
\n",
1106 | " \n",
1107 | "
\n",
1108 | "
"
1109 | ],
1110 | "text/plain": [
1111 | " Feature Importance\n",
1112 | "0 fresno_relative_humidity 0.481964\n",
1113 | "1 Hour 0.267807\n",
1114 | "2 Day_of_week 0.062052\n",
1115 | "3 fresno_temperature 0.055203\n",
1116 | "4 lemoore_temperature 0.050826\n",
1117 | "5 lemoore_relative_humidity 0.017357\n",
1118 | "6 Day 0.011032\n",
1119 | "7 Week 0.007940\n",
1120 | "8 san_diego_dew_point 0.007538\n",
1121 | "9 los_angeles_temperature 0.004585\n",
1122 | "10 chico_relative_humidity 0.003697\n",
1123 | "11 san_diego_temperature 0.003477\n",
1124 | "12 san_jose_wind_speed 0.003111\n",
1125 | "13 chico_temperature 0.002460\n",
1126 | "14 Month 0.002422\n",
1127 | "15 sacramento_relative_humidity 0.002137\n",
1128 | "16 san_diego_wind_speed 0.002021\n",
1129 | "17 los_angeles_dew_point 0.001585\n",
1130 | "18 chico_wind_speed 0.001463\n",
1131 | "19 roseville_relative_humidity 0.001314\n",
1132 | "20 roseville_temperature 0.001256\n",
1133 | "21 los_angeles_wind_speed 0.000866\n",
1134 | "22 roseville_dew_point 0.000857\n",
1135 | "23 lemoore_wind_speed 0.000835\n",
1136 | "24 los_angeles_relative_humidity 0.000792\n",
1137 | "25 san_francisco_dew_point 0.000719\n",
1138 | "26 san_jose_dew_point 0.000712\n",
1139 | "27 petaluma_wind_speed 0.000608\n",
1140 | "28 petaluma_temperature 0.000580\n",
1141 | "29 san_diego_relative_humidity 0.000421\n",
1142 | "30 lemoore_dew_point 0.000414\n",
1143 | "31 san_jose_cloud_type 0.000412\n",
1144 | "32 san_jose_temperature 0.000279\n",
1145 | "33 san_francisco_relative_humidity 0.000256\n",
1146 | "34 chico_dew_point 0.000240\n",
1147 | "35 sacramento_dew_point 0.000231\n",
1148 | "36 petaluma_relative_humidity 0.000183\n",
1149 | "37 san_jose_relative_humidity 0.000178\n",
1150 | "38 roseville_cloud_type 0.000172\n",
1151 | "39 fresno_wind_speed 0.000000\n",
1152 | "40 petaluma_cloud_type 0.000000\n",
1153 | "41 petaluma_dew_point 0.000000\n",
1154 | "42 fresno_dew_point 0.000000\n",
1155 | "43 lemoore_cloud_type 0.000000\n",
1156 | "44 fresno_cloud_type 0.000000\n",
1157 | "45 san_francisco_cloud_type 0.000000\n",
1158 | "46 san_francisco_temperature 0.000000\n",
1159 | "47 chico_cloud_type 0.000000\n",
1160 | "48 roseville_wind_speed 0.000000\n",
1161 | "49 san_francisco_wind_speed 0.000000\n",
1162 | "50 sacramento_temperature 0.000000\n",
1163 | "51 sacramento_cloud_type 0.000000\n",
1164 | "52 san_diego_cloud_type 0.000000\n",
1165 | "53 sacramento_wind_speed 0.000000\n",
1166 | "54 los_angeles_cloud_type 0.000000\n",
1167 | "55 Year 0.000000"
1168 | ]
1169 | },
1170 | "execution_count": 47,
1171 | "metadata": {},
1172 | "output_type": "execute_result"
1173 | }
1174 | ],
1175 | "source": [
1176 | "#Decision tree importances\n",
1177 | "pd.DataFrame({'Feature':final_data_X_train.columns, 'Importance': tree.feature_importances_}).sort_values(by = 'Importance', ascending = False).reset_index(drop=True)"
1178 | ]
1179 | },
1180 | {
1181 | "cell_type": "code",
1182 | "execution_count": 64,
1183 | "metadata": {},
1184 | "outputs": [
1185 | {
1186 | "data": {
1187 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmoAAAG3CAYAAAAEmnkTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeZRdZZn2/+9FwIQwhA6gv4BDKQYRSAiQRIEEwtC0DIrY0YjYghMt2tjgCy5skMGhBeFVRJqGSEMAFRFEBGJDUMjAmDmpgBBeIUoD3ZAWAhiJJLl+f+ynyElxTg1kqJPU9Vkr6+x69jPcexdrca/72ae2bBMRERERzWeTng4gIiIiIupLohYRERHRpJKoRURERDSpJGoRERERTSqJWkRERESTSqIWERER0aQ27ekAIgC22247t7S09HQYERER68WsWbMW296+s35J1KIptLS0MHPmzJ4OIyIiYr2Q9Ieu9MvWZ0RERESTSqIWERER0aSSqEVEREQ0qSRqEREREU0qiVpEREREk0qiFhEREdGkkqhFRERENKkkahERERFNKolaRERERJNKohYRERHRpJKoRURERDSpJGoRERERTSqJWkRERESTSqIWERER0aSSqEVEREQ0qSRqEREREU0qiVpEREREk0qiFk2h9aklPR1CRERE00miFhEREdGkkqhFRERENKmNLlGT9A1Jh5TjyZKGl+NFkrZbB+udI+nUTvp8WNKu9WJcw7Vfu761SdJwSRc3OPfafZR0X/lskfSJtR1HREREb7fp+lxMkgDZXrmu1rB91tqeU1If2yvWYIoPA7cBD8O6iXFtsj0TmNmFfvuWwxbgE8BP12FYERERvc46r6iVasvvJF0KzAbeJukYSa2SFkg6v/TrI2lCaWuVdEpp30nS7ZJmSZomaRdJA0plZ5PSp7+kJyVtVuYY20lMn5Q0XdJcSZdL6lOnzyJJZ0m6B/hovTjqjPm8pBmS5kn6RYlrX+BDwAVlvZ3aYpR0mKSf14wfI+nWcnyopPslzZZ0g6QtG1zOR8u1LJQ0uow9XtIlNfPeJmlMOX5Z0vnlOn4jaWSpzD0u6UM1cdxWjreVNEnSHEmXA6qZ9+VyeB4wulzfKeX+DKvpd6+koR39TiIiIuL11tfW53uAa2zvCbwKnA8cBAwDRkj6cDne0fbutocAV5Wx44GTbO8NnApcansJMA84oPT5IHCH7Vc7C0TSe4FxwH62hwErgGMbdH/F9ijbP6sXR53+N9keYXsP4HfAZ23fB9wCnGZ7mO3f1/S/E3i/pC3Kz+OA68vW4pnAIbb3oqpufaVBjJvaHgmcDJzd2fUDWwCTy3W8BHwL+FvgaOAbdfqfDdxTfne3AG+v0+d0YFq5vu8DVwDHA0jaGehre34XYouIiIga62vr8w+2HyjHI6gShecAJP0E2B/4JvAuST8EJgKTShVpX+CGatcUgL7l83qqxOZu4OPUT5zqORjYG5hR5twceLZB3+tLjB3FUWt3Sd8CtgG2BO7oKBDbyyXdDnxQ0o3AEcBXqRLQXYF7y3pvAu5vMM1N5XMW1RZkZ/4K3F6OW4Fltl+V1Npg/P7AR0q8EyU934U1bgC+Luk04DPAhHqdJJ0AnADQZ+vtuzBtRERE77K+ErU/1xyrXgfbz0vaA/g74EvAx6iqRC+Uyld7twDfkTSQKvG6q4uxCLja9te6EfcmHcRRawLwYdvzJB0PjOnCGtdTXe+fgBm2XyrP8t1p+5gujF9WPlew6ve5nNWrpf1qjl+17XK8sm287ZWSGv334Abt9TvbSyXdCRxF9Xus+4UH2+OpKpX0HTS4W2tERET0Bj3xrc8HgQMkbVeeDTsGmFK2+zax/Qvg68Betl8EnpD0Uai+jFCSOWy/DEwHfgDc1o2H/X8LjJX05jLnQEnv6GhAR3G0sxXwjKTNWH079aVyrp7JwF7A5ykVPOABYD9J7y7r9S9biF21CBgmaRNJbwNGdmNse1Mp1yLpMOBv6vSpd31XABdTJZ9/WoP1IyIieq31nqjZfgb4GtWW5Txgtu1fATsCkyXNpapMtVW8jgU+K2ke8BBVlabN9cAnWZXgdGX9h6me/5okaT7Vc2KDujC0ozjafJ0qEb0TeKSm/WfAaeWB/J3axbOC6huhh5VPyrbw8cB1JcYHgNd9eaED9wJPUG1tXkj1JY436lxgf0mzgUOBP9bpMx9YXr5EcQqA7VnAi6x61jAiIiK6Sat2wSLWHkk7UFULd+nKn2PpO2iwlz3z2DqPKyIiohlImmW707+FutH9wdvoeZI+RVVZPGNd/s28iIiIjd16/YO30TvYvga4pqfjiIiI2NClohYRERHRpJKoRVMYsuOAng4hIiKi6SRRi4iIiGhSSdQiIiIimlQStWgKrU8t6ekQIiIimk4StYiIiIgmlUQtIiIiokklUYuIiIhoUknUukjSBElj67TvIOnG9bD+F8pf/O/OmMmSOn09xbok6RxJp/ZkDBERERuqvJlgDdl+GnhdArcO1rlsXa8RERERzSUVtTokfUrSfEnzJF1bc2p/SfdJerytuiapRdKCctxH0oWSWsv4k0r7wZLmlPYrJfVtt96bJc0qx3tIsqS3l59/L6l/bWWqVMrOlzRd0kJJo0v75pJ+Vta+Hti8wfWdJ+nh0u/C0jZB0mWSppU5j6y5pgskzSj9/7FmntNq2s+taT9D0qOSfgO8Z41+GREREb1YKmrtSNoNOAPYz/ZiSQNrTg8CRgG7ALcA7bc8TwDeCexpe7mkgZL6AROAg20vlHQNcCJwUdsg289K6idpa2A0MBMYLeke4FnbSyW1D3VT2yMlHQ6cDRxS5l1qe6ikocDsOtc3EDga2MW2JW1Tc7oFOADYCbhb0ruBTwFLbI8oCea9kiYBg8u/kYCAWyTtD/wZ+DiwJ9V/X7OBWQ1ud0RERHQgidrrHQTcaHsxgO0/1Zy72fZK4GFJb6kz9hDgMtvL28ZK2gN4wvbC0udq4EvUJGrFfcB+wP7AvwIfoEqApjWI86byOYsqwaKMvbisPV/S/DrjXgReAa6QNBG4rebcz8v1PSbpcaqE9FBgaM3zeQOoErRDy785pX3L0r4V8EvbSwEk3dIgfiSdQJXc0mfr7Rt1i4iI6LWy9fl6Atzg3LJ2/boytl6/eqZRVdPeAfwK2IOqeje1k1hWsHrC3Sj26mSVRI4EfgF8GLi9g7Gmiv8k28PKv3fanlTav1PT/m7b/9GVGGpiGW97uO3hffrnXZ8RERHtJVF7vd8CH5O0Lby2VdhVk4AvSNq0ZuwjQEvZRgT4B2BKnbFTgU8Cj5Wq1p+Aw4F7u7H+VODYsvbuwND2HSRtCQyw/WvgZGBYzemPStpE0k7Au4BHgTuAEyVtVsbvLGmL0v6ZMh+SdpT05hLD0eV5ua2AD3Yj/oiIiKiRrc92bD8k6dvAFEkrqLb2ju/i8CuAnYH5kl4FfmT7EkmfBm4oCdwM4HXf4LS9qDyH1lZBuwd4q+3nuxH+vwNXlS3PucD0On22An5Vnp0TcErNuUepksi3AF+w/YqkK6i2VmerCvA54MO2J0l6L3B/iftl4JO2Z5cvMswF/kDjrduIiIjohOwu7VLFRk7SBOA22+v8b8LV03fQYC975rGeWDoiImK9kzTLdqd/6zRbnxERERFNKlufAYDt43s6hoiIiFhdKmrRFIbsmG99RkREtJdELSIiIqJJJVGLiIiIaFJJ1CIiIiKaVBK1aAqtTy3p6RAiIiKaThK1iIiIiCaVRC0iIiKiSSVRi4iIiGhSG3SiJunlno6hKyRNltTpayK6OeciSdutzTm7uf6HJJ3eSZ8WSZ9YXzFFRERsbDboRC16ju1bbJ/XSbcWIIlaRETEG7RRJGqqXCBpgaRWSeNK+yBJUyXNLedG1xl7lqQZ5fx4SSrtkyWdL2m6pIVtYyX1l/RzSfMlXS/pwbZqmaRDJd0vabakGyRtWWe9un0knSfp4TLvhXXGbStpkqQ5ki4HVHPukyXOuZIul9RH0sckfa+c/2dJj5fjnSTdU2f+yZIuknRfuRcjS/tASTeXuB6QNLS0Hy/pknI8QdLFZezjksaWac8DRpe4TunyLzQiIiKAjSRRAz4CDAP2AA4BLpA0iKqac4fttnNz64y9xPYI27sDmwNH1pzb1PZI4GTg7NL2ReB520OBbwJ7A5RtyDOBQ2zvBcwEvlK7UKM+kgYCRwO7lXm/VSfOs4F7bO8J3AK8vcz5XmAcsF+5zhXAscBUoC0xHQ38r6QdgVHAtAb3cQvb+5ZrvLK0nQvMKXH9C3BNg7GDytxHUiVoAKcD02wPs/39BuMiIiKigY3lpeyjgOtsrwD+R9IUYAQwA7hS0mbAzbbrJWoHSvoq0B8YCDwE3FrO3VQ+Z1Ft47Wt9QMA2wskzS/t7wd2Be4tRbk3Afe3W6tRnxeBV4ArJE0EbqsT5/5UCSm2J0p6vrQfTJUszihzbg48a/u/JW0paSvgbcBPyxyja66rvevK/FMlbS1pm3K9f1/a7yqVvXov5rzZ9krgYUlvaTD/aiSdAJwA0Gfr7bsyJCIiolfZWBI11WssCcf+wBHAtZIusP1aRUhSP+BSYLjtJyWdA/SrmWJZ+VzBqntVd63SfqftYzqJs26fstV4MPBx4J+Ag+pdUoM5r7b9tTrn7gc+DTxKVUX7DLAP8H8axNd+flP/euvFsazmuNE9Wn0SezwwHqDvoMH15oyIiOjVNpatz6nAuPJs1vZUlaPpkt5BVV36EfAfwF7txrUlZYvLs2Jj6dw9wMcAJO0KDCntDwD7SXp3Oddf0s7txtbtU9YeYPvXVNuswxpc47Fl3GHA35T23wJjJb25nBtYrrttzKnlcw5wILDMdqPXALQ92zcKWFL61a47Blhs+8WOb9FrXgK26mLfiIiIaGdjqaj9kqpSNI+q2vPVsvV3HHCapFeBl4FP1Q6y/YKkHwGtwCKqrdLOXApcXbY85wDzqZKa5yQdD1wnqW/peyawsGa9Rn1eAn5VKnwC6j14f24ZNxuYAvyxzPmwpDOBSZI2AV4FvgT8gaqK9jZgqu0Vkp4EHung2p6XdB+wNVX1DeAc4KpyvUuB47pwj9rMB5ZLmgdMyHNqERER3SM7O07dIakPsJntVyTtRFXR2tn2X3s4tDUiaTJwqu2ZPbF+30GDveyZx3pi6YiIiPVO0izbnf6N1Y2lorY+9QfuLl9QEHDihp6kRURERHNKotZNtl8C1upbBpqB7TE9HUNERESsbmP5MkFs4IbsWO8vfkRERPRuSdQiIiIimlQStYiIiIgmlUQtIiIiokklUYum0PrUElpOn9jTYURERDSVJGoRERERTSqJWkRERESTSqLWAUkTJI0tx1eUd3v2VCw7SLqxm2OOl3TJuoqpizG0SFrQkzFERERsqPIHb7vI9ud6eP2n6dpL4yMiImIjscFW1CRtIWmipHmSFkgaV9rPkjSjtI2XpNI+WdL5kqZLWihpdJ05JekSSQ9Lmgi8uebcZEnDy/Ghku6XNFvSDZK2LO2HS3pE0j2SLpZ0W2kfKOlmSfMlPSBpaJ21f93WLmmOpLPK8Tclfa62MlUqZTdJul3SY5K+WzPPp8v1TQH2a3DvDpA0t/ybI2krSWMkTZX0y3L9l5WXvHd0vXtLmiJplqQ7JA2qaZ8n6X6qF8RHRETEG7DBJmrAB4Cnbe9he3fg9tJ+ie0RpW1z4MiaMZvaHgmcDJxdZ86jgfcAQ4DPA/u27yBpO+BM4BDbewEzga9I6gdcDhxmexSwfc2wc4E5tocC/wJcU2ftqcBoSVsDy1mVZI0CptXpPwwYV2IdJ+ltJVE6t4z9W6DRVu2pwJdsDwNGA38p7SOB/1Pm3An4SAfXuxnwQ2Cs7b2BK4Fvl3muAr5se58G60dEREQXbMiJWitwSKmSjba9pLQfKOlBSa3AQcBuNWNuKp+zgJY6c+4PXGd7RdlqvKtOn/dTJUD3SpoLHAe8A9gFeNz2E6XfdTVjRgHXAti+C9hWUvt3Jk0r648CJgJbSuoPtNh+tE4cv7W9xPYrwMMlhvcBk20/V14Uf32dcQD3At+T9GVgG9vLS/t024/bXlHiH9XB9b4H2B24s7SfCby1XNc2tqeUOa9tEAOSTpA0U9LMFUuXNOoWERHRa22wz6jZXihpb+Bw4DuSJgHfBS4Fhtt+UtI5QL+aYcvK5woaX7s7WVrAnbaPWa1R2rOTMZ2tM4PqZe+PA3cC21FV9WY1mHNZzXHt9XQWP7bPK1u7hwMPSDqkwVjT+HqHAA+1r5pJ2qYrMZQ4xgPjAfoOGtylMREREb3JBltRk7QDsNT2j4ELgb1YlZQtLs9Rdffh+6nAxyX1KduIB9bp8wCwn6R3lzj6S9oZeAR4l6SW0m9cu3mPLf3HAIttv1g7aamAPQl8rKwxjWqLst62ZyMPAmMkbVu2Jj9ar5OknWy32j6faitzl3JqpKR3lmfTxgH3dHC9jwLbS9qntG8maTfbLwBLJI0qcx7bjfgjIiKixgZbUaN6juoCSSuBV4ETbb8g6UdU26KLqKpU3fFLqu3SVmAhMKV9B9vPSToeuE5S39J8ZqnwfRG4XdJiYHrNsHOAqyTNB5ZSbR/WMw042PZSSdOAt9KNRM32M6WKeD/wDDAb6FOn68mSDqSqxD0M/CewTxl3HtW9nQr80vbKDq53LHBx2e7cFLgIeAj4NHClpKXAHV2NPyIiIlYnOztOa4ukLW2/LEnAvwGP2f5+T8fVFaXSd6rtIzvruy70HTTYg467iEXnHdETy0dERKxXkmbZHt5Zvw1267NJfb48WP8QMIDqW6ARERERb8iGvPXZdEr1bIOooLVnezIwuYfDiIiIiBqpqEVEREQ0qSRq0RSG7Dggz6dFRES0k0QtIiIiokklUYuIiIhoUknUIiIiIppUErVoCq1PLaHl9Ik9HUZERERTSaIWERER0aSSqEVEREQ0qV6RqEk6WVL/dTT3OZJO7aTPhyXtWvPzNyQdshbWniyp09dPvIF5h0u6uMG5RZK2K8f3lc8WSZ9Y23FERET0dus1UZNU7wXh68PJwBtO1NZC3B8GXkvUbJ9l+zdrOOc6Y3um7S93od++5bAFSKIWERGxlnWYqEnaQtJESfMkLZA0rrSfJWlGaRtfXkKOpHdL+k3pP1vSTpLGSLpb0k+B1tLvZkmzJD0k6YSa9V6WdH459xtJI0vV6HFJHyp9+ki6oKw/X9I/lvYxpe+Nkh6R9BNVvgzsANwt6e7S9xhJrSX+8xtc+6JynfcAHy3XcnuJbZqkXeqM+XyJa56kX0jqL2lf4EPABZLmlnkmSBor6TBJP68ZP0bSreX4UEn3l/t4g6QtG/yaPippuqSFkkaXscdLuqRm3tvKS9e7eo/HSLqtHG8raZKkOZIuB1T7+yqH5wGjy/WdUu7PsJp+90oa2iD+iIiIaKCzitoHgKdt72F7d+D20n6J7RGlbXPgyNL+E+DfbO8B7As8U9pHAmfYbqsqfcb23sBw4MuSti3tWwCTy7mXgG8BfwscDXyj9PkssMT2CGAE1YvQ31nO7UlVPdsVeBewn+2LgaeBA20fKGkH4HzgIGAYMELShxtc/yu2R9n+GTAeOKnEdipwaZ3+N5X7sgfwO+Cztu8DbgFOsz3M9u9r+t8JvF/SFuXnccD1ZWvxTOAQ23sBM4GvNIhxU9sjy3Wf3aBPra7c41pnA/fY3rNcx9vr9DkdmFau7/vAFcDxAJJ2Bvrant+F2CIiIqJGZ4laK3BIqcCMtr2ktB8o6UFJrVQJz26StgJ2tP1LANuv2F5a+k+3/UTNvF+WNA94AHgbMLi0/5VVyWArMMX2q+W4pbQfCnxK0lzgQWDbmvHTbf+X7ZXA3JoxtUZQJSrP2V5OlVzu3+D6rwco1ax9gRvKupcDg+r0371Uk1qBY4HdGswLQFn/duCDkjYFjgB+BbyfKtm8t6x3HPCOBtPcVD5nUf962+vKPa61P/DjEu9E4PkurHEDcKSkzYDPABPqdZJ0gqSZkmauWLqkXpeIiIhebdOOTtpeKGlv4HDgO5ImAd+lqiYNt/2kpHOAftRsidXx57aDsgV3CLCP7aWSJpfxAK/adjleCSwrcawsiQxlnZNs31G7QJl3WU3TigbX11GcjeLeBHjB9rCOOlMlJB+2PU/S8cCYLqxxPfAl4E/ADNsvSRJwp+1jujC+7Zprr3c5qyfh/WqOu3KP23OD9vqdq9/rncBRwMeoKqf1+o2nqlTSd9Dgbq0RERHRG3T2jNoOwFLbPwYuBPZi1f/0F5dK01gA2y8C/9W2jSipr+p/03IA8Hz5n/kuVNWj7rgDOLFUa5C0c83WYSMvAVuV4weBAyRtp+pLAscAUzoaXK7tCUkfLWtK0h51um4FPFNiO7bB+u1Nprqvn6dU8KgqjftJendZr3/ZQuyqRcAwSZtIehvV1vMbNZVyLZIOA/6mTp9613cFcDFV8vmnNVg/IiKi1+ps63MIML1sv50BfMv2C8CPqLbKbgZm1PT/B6ptzfnAfcD/V2fO24FNS59vUiUl3XEF8DAwW9ICqm3IDiuDVFWb/5R0t+1ngK8BdwPzgNm2f9WFdY8FPlu2bB+iqha193WqRPBO4JGa9p8Bp5UH8neqHWB7BXAbcFj5xPZzVM94XVfu0wPA67680IF7gSeofkcXArO7Mba9c4H9Jc2m2nb+Y50+84Hl5UsUpwDYngW8CFy1BmtHRET0alq1Cxax9pRq7GRgl/LMYIf6DhrsQcddxKLzjljnsUVERPQ0SbNsd/q3UHvFH7yN9UvSp6gqi2d0JUmLiIiI+jrbMozoNtvXANf0dBwREREbulTUoikM2XFAtj0jIiLaSaIWERER0aSSqEVEREQ0qSRqEREREU0qiVo0hdanltBy+sSeDiMiIqKpJFGLiIiIaFJJ1CIiIiKaVBK1iIiIiCaVRK0XkmRJ19b8vKmk5yTd9gbn20bSF2t+HvNG54qIiIhVkqj1Tn8Gdpe0efn5b4Gn1mC+bYAvdtorIiIiuiWJWu/1n0DbqwCOAa5rOyFpoKSbJc2X9ICkoaX9HElXSpos6XFJXy5DzgN2kjRX0gWlbUtJN0p6RNJPJGl9XVhERMTGIola7/Uz4OOS+gFDqV6i3uZcYI7tocC/sPp7O3cB/g4YCZwtaTPgdOD3tofZPq302xM4GdgVeBew37q8mIiIiI1RErVeyvZ8oIWqmvbrdqdHAdeWfncB20oaUM5NtL3M9mLgWeAtDZaYbvu/bK8E5pa1ViPpBEkzJc1csXTJml5SRETERieJWu92C3AhNdueRb1tSpfPZTVtK4BNG8zdaT/b420Ptz28T/8B7U9HRET0eknUercrgW/Ybm3XPhU4FqpvcAKLbb/YwTwvAVutkwgjIiJ6sUbVkOgFbP8X8IM6p84BrpI0H1gKHNfJPP8r6V5JC6i+pJB3QUVERKwFst15r4h1rO+gwR503EUsOu+IzjtHRERs4CTNsj28s37Z+oyIiIhoUknUIiIiIppUErVoCkN2HJBtz4iIiHaSqEVEREQ0qSRqEREREU0qiVpEREREk0qiFk2h9akltJyeP78WERFRK4laRERERJNKohYRERHRpJKoRURERDSpJGp1SJogaWyd9h0k3bgW5j9e0g5rOs+6JmmMpH17Oo6IiIjeKolaN9h+2vbrErg34HigKRI1SZt2cHoM0K1ETVKfNQooIiIiXtPrEzVJn5I0X9I8SdfWnNpf0n2SHm+rrklqkbSgHPeRdKGk1jL+pNJ+sKQ5pf1KSX3brTcWGA78RNJcSZtL2lvSFEmzJN0haVDpO1nS9yVNlfQ7SSMk3STpMUnfqonpEUlXlzhulNS/nOto3n+VNAX4Z0kflPRgifs3kt4iqQX4AnBKiXN0+0qjpJfL5xhJd0v6KdBa2j4paXoZe3kSuIiIiO7r1YmapN2AM4CDbO8B/HPN6UHAKOBI4Lw6w08A3gnsaXsoVeLVD5gAjLM9BNgUOLF2kO0bgZnAsbaHAcuBHwJjbe8NXAl8u2bIX23vD1wG/Ar4ErA7cLykbUuf9wDjSxwvAl+UtFkn825j+wDb/xe4B3i/7T2BnwFftb2orPl928NsT+vkdo4EzrC9q6T3AuOA/co1rgCObT9A0gmSZkqauWLpkk6mj4iI6H062vbqDQ4CbrS9GMD2n2rO3Wx7JfCwpLfUGXsIcJnt5W1jJe0BPGF7YelzNVVidVEHMbyHKvG6UxJAH+CZmvO3lM9W4CHbzwBIehx4G/AC8KTte0u/HwNfBm7vZN7ra47fClxfKm5vAp7oIN5GpttuG3cwsDcwo6y9OfBs+wG2xwPjAfoOGuw3sGZERMRGrbcnagIaJQjL2vXryth6/boSw0O29+kkjpXtYlrJqt9f+zjchXn/XHP8Q+B7tm+RNAY4p8GY5ZQqrKoM7E0N5hNwte2vNZgnIiIiuqBXb30CvwU+1raFKGlgN8ZOAr7Q9jB+GfsI0CLp3aXPPwBT6ox9CdiqHD8KbC9pnzLPZmVLtjve3jYeOIZqK7M78w4AnirHxzWIE2ARVaUM4Chgswbz/RYYK+nNZe2Bkt7R9cuJiIgI6OWJmu2HqJ7bmiJpHvC9bgy/AvgjML+M/YTtV4BPAzdIaqWqel1WZ+wE4DJJc6m2JMcC55d55tLNb1oCvwOOkzQfGAj8u+2/dmPec0rM04DFNe23Ake3fZkA+BFwgKTpwPtYvYr2GtsPA2cCk0pMd1I98xcRERHdIDuPBm3Iyrczb7O9ew+Hskb6DhrsQcddxKLzjujpUCIiItY5SbNsD++sX6+uqEVEREQ0s97+ZYINXvkzGht0NS0iIiLqS0UtmsKQHQdk2zMiIqKdJGoRERERTSqJWkRERESTSqIWERER0aSSqEVTaH1qCS2nT6Tl9Ik9HUpERETTSKIWERER0aSSqEVEREQ0qSRq3SBpB0k39uD635B0SDfHLJK03bqKqYsxTJA0tidjiIiI2BDlD952g+2nqd6f2VPrn9VTa0dERMT6t9FW1CRtIWmipHmSFkgaV9rPkjSjtI2XpNI+WdL5kqZLWlheQio26/gAACAASURBVN5+zhZJC8pxP0lXSWqVNEfSgaV9tzLHXEnzJQ0u7Z+sab9cUp92c4+UdFM5PkrSXyS9qazzeGl/rTJVKmXnSppdYtiltG8raVKJ6XJAda6jT5lrQRl7Ss09uEjSfeXcyJp7eWW5b3MkHVUzzwWlfb6kfyztknSJpIclTQTevKa/z4iIiN5oo03UgA8AT9veo7yw/PbSfontEaVtc+DImjGb2h4JnAyc3cn8XwKwPQQ4BrhaUj/gC8APbA8DhgP/Jem9wDhgv9K+Aji23XyzgT3L8WhgATACeB/wYIMYFtveC/h34NTSdjZwj+09gVuAt9cZNwzY0fbuJf6ras5tYXtf4IvAlaXtDOAu2yOAA4ELJG0BfBZYUtpHAJ+X9E7gaOA9wBDg88C+DeKPiIiIDmzMW5+twIWSzgdusz2ttB8o6atAf2Ag8BBwazl3U/mcBbR0Mv8o4IcAth+R9AdgZ+B+4AxJbwVusv2YpIOBvYEZpYC3OfBs7WS2l0v6fyWpGwl8D9gf6ANMo77aeD9SjvdvO7Y9UdLzdcY9DrxL0g+BicCkmnPXlbFTJW0taRvgUOBDktqSwX5UCeChwNCa588GAINLDNfZXgE8LemuesFLOgE4AaDP1ts3uMSIiIjea6NN1GwvlLQ3cDjwHUmTgO8ClwLDbT8p6RyqpKPNsvK5gs7vzeu2FMu6P5X0IHAEcIekz5W+V9v+WidzTgMOA14FfgNMoErUTm3Qv1G87mgR289L2gP4O6rK4MeAzzQY6xL/39t+tPZE2TY+yfYd7doP7yyGEsd4YDxA30GDO+0fERHR22y0W5+SdgCW2v4xcCGwF6uSssWStmTNvhgwlbJ9KWlnqgrTo5LeBTxu+2KqrcehwG+BsZLeXPoPlPSOBnOeDNxv+zlgW2AXqqrfG4nrMOBv2nco3wLdxPYvgK9T3Zs2bc/yjaLa1lwC3AGcVPM8X9sW7R3AiZI2a7sPZUt0KvDx8gzbIKrt0oiIiOimjbaiRvV81AWSVlJVqE60/YKkH1Ftiy4CZryBedsqP5cCl0lqBZYDx9teVr608ElJrwL/DXzD9p8knQlMkrRJiedLwB/azf0g8BaqRAdgPvCs7e5Um84FrpM0G5gC/LFOnx2Bq0osALWVvucl3Qdszaoq2zeBi4D5JVlbRPVs3xVUW8SzS/tzwIeBXwIHUd3nhSWOiIiI6CZ1Lwfo3cpW6vdsH9DTsawLkiYDp9qeub7X7jtosAcddxEAi847Yn0vHxERsV5JmmV7eGf9Ntqtz7VN0nCqB+1/0NOxRERERO+wMW99rlWlyrRzT8exLtke09MxRERExCqpqEVEREQ0qVTUoikM2XEAM/NsWkRExGpSUYuIiIhoUknUIiIiIppUErVoCq1PLaHl9Im0nD6xp0OJiIhoGknUIiIiIppUErWIiIiIJpVELSIiIqJJJVEDJE2QNLYcXyFp13W41jBJh6+r+dcWSdtI+mJPxxEREdGbJVFrx/bnbD+8DpcYBjRFoiapo7+jtw3Q7URNUp83HlFERETUavpETdIWkiZKmidpgaRxpf0sSTNK23hJKu2TJZ0vabqkhZJG15lTki6R9LCkicCba85NLu/1RNKhku6XNFvSDZK2LO2HS3pE0j2SLpZ0W2kfKOlmSfMlPSBpaLt13wR8Axgnaa6kceX6rizXMkfSUaXv8WWuWyU9IemfJH2l9HlA0sCaeC+SdF+5FyNr7lujeW+QdCswSdKWkn5brrG1rR9wHrBTifMCSWParrPMc4mk48vxovL7uAf4qKSdJN0uaZakaZJ2WbP/CiIiInqnpk/UgA8AT9vew/buwO2l/RLbI0rb5sCRNWM2tT0SOBk4u86cRwPvAYYAnwf2bd9B0nbAmcAhtvcCZgJfkdQPuBw4zPYoYPuaYecCc2wPBf4FuKZ2Ttt/Bc4Crrc9zPb1wBnAXbZHAAcCF0jaogzZHfgEMBL4NrDU9p7A/cCnaqbewva+VBWwK0tbR/PuAxxn+yDgFeDoco0HAv+3JL2nA78vcZ5W5x6294rtUbZ/BowHTrK9N3AqcGkXxkdEREQ7G8IrpFqBCyWdD9xme1ppP1DSV4H+wEDgIeDWcu6m8jkLaKkz5/7AdbZXAE9LuqtOn/cDuwL3lmLdm6gSpF2Ax20/UfpdB5xQjkcBfw9g+y5J20oaYHtJB9d3KPAhSaeWn/sBby/Hd9t+CXhJ0pKa62sFaqt115U1p0raWtI2ncx7p+0/lWMB/yppf2AlsCPwlg7ibeR6gFJ13Be4odw3gL71Bkg6gXLv+my9fb0uERERvVrTJ2q2F0ram+q5ru9ImgR8l6pKM9z2k5LOoUpE2iwrnytofI3uZGlRJTTHrNYo7dnJmDeyzt/bfrTdOu9j1XVAlUQtqzmuva72a7iTef9c03QsVVVwb9uvSlrE6veyzXJWr8C279M25ybAC7aH1Zlj9SDt8VTVN/oOGtzZfYqIiOh1mn7rU9IOVFt+PwYuBPZiVZKwuFRwxnZz2qnAxyX1kTSIasuvvQeA/SS9u8TRX9LOwCPAuyS1lH7j2s17bOk/Blhs+8V2874EbFXz8x3ASTXP2HWUCDbS9tzeKGBJqeB1dd4BwLMlSTsQeEeDOP8A7Cqpr6QBwMH1JivX+4Skj5Z1JWmPN3BNERERvV7TV9SoniO7QNJK4FXgRNsvSPoR1RbgImBGN+f8JXBQGb8QmNK+g+3nysPy10lq27o7s1T4vgjcLmkxML1m2DnAVZLmA0uB4+qsfTdwuqS5wHeAbwIXAfNLUrWI1Z+364rnJd0HbA18prR1dd6fALdKmgnMpUpEsf2/ku6VtAD4T9unSfo5MB94DJjTQTzHAv8u6UxgM+BnwLxuXlNERESvJzs7Tt0laUvbL5cE6N+Ax2x/v4dimQycantmT6y/tvQdNNiDjrsIgEXnHdHD0URERKxbkmbZHt5Zv6bf+mxSny8VsYeotg4v7+F4IiIiYiO0IWx9Np1SPeuRClp7tsf0dAwRERGxbiRRi6YwZMcBzMyWZ0RExGqy9RkRERHRpJKoRURERDSpJGoRERERTSqJWjSF1qeW0HL6RFpOn9jToURERDSNJGoRERERTSqJWkRERESTSqIWERER0aQ22ERN0gRJr3sZu6QdJN24HuM4XtIlnfQZI2nfmp+/IOlTa2HtuvdgLczb8B5KmixpeDn+taRtyr8vru04IiIiersNNlFrxPbTttdq8iJpTf8w8BjgtUTN9mW2r1nDOdeZrt5D24fbfgHYBkiiFhERsZZtEImapE9Jmi9pnqRra07tL+k+SY+3VZYktUhaUI77SLpQUmsZf1JpP1jSnNJ+paS+ddacLOlfJU0B/lnS9pJ+IWlG+bdfnTEflPRgmfs3kt4iqQX4AnCKpLmSRks6R9Kpkt4raXrN+BZJ88vx3pKmSJol6Q5Jgxrcnnr3YIyk22rmvUTS8eV4Ubmu+yXNlLRXmf/3kr5Q5x5uLuln5f5dD2xeM+8iSdsB5wE7leu7QNK1ko6q6fcTSR9qEH9EREQ00PSvkJK0G3AGsJ/txZIG1pweBIwCdgFuAdpv150AvBPY0/ZySQMl9QMmAAfbXijpGuBE4KI6y29j+4ASx0+B79u+R9LbgTuA97brfw/wftuW9Dngq7b/j6TLgJdtX1jmOhjA9u8kvUnSu2w/DowDfi5pM+CHwFG2n5M0Dvg28Jk6MXZ2D+p50vY+kr5f7sV+QD+ql8xf1q7vicBS20MlDQVm15nvdGB328PK9R0AnAL8StIAqmricV2IKyIiImo0faIGHATcaHsxgO0/1Zy72fZK4GFJb6kz9hDgMtvL28ZK2gN4wvbC0udq4EvUT9SubzfXrpLaft5a0lbt+r8VuL5Uv94EPNGF6/s58DGqqtS48u89wO7AnWW9PsAzDcZ3dg/quaV8tgJb2n4JeEnSK5K2add3f+BiANvz2yp+HbE9RdK/SXoz8BHgF22/g1qSTqBKpumz9fZdDD0iIqL32BASNQFucG5Zu35dGVuvXyN/rjneBNjH9l9Wm0yrTfdD4Hu2b5E0BjinC2tcD9wg6SbAth+TNAR4yPY+XRhf7x4sZ/Vt7X4NxqxsN34l9f+baHT/O3ItcCzwcepXArE9HhgP0HfQ4DeyRkRExEZtQ3hG7bfAxyRtC9Bu67Mzk4AvtH0ZoIx9BGiR9O7S5x+AKV2c65/afpA0rE6fAcBT5bh2q+8loH31DQDbvwdWAF9nVQXvUWB7SfuUtTYrW8Bd9Qeq6l/fsvV4cDfGtjeVKuFC0u7A0Dp96l3fBOBkANsPrcH6ERERvVbTJ2rlf/LfBqZImgd8rxvDrwD+CMwvYz9h+xXg01RVrFaqKlL757Lq+TIwvDxU/zDVFwTaO6fMOw1YXNN+K3B025cJ6oy7Hvgk1TYotv8KjAXOL3HPpeZbo52x/WSZaz7wE2BOV8fW8e/AlmXL86vA9PYdbP8vcK+kBZIuKG3/A/wOuGoN1o6IiOjVZGfHKdY+Sf2pnoHby/aSzvr3HTTYg46rHhNcdN4R6zi6iIiIniVplu3hnfVr+opabHgkHUK1xfzDriRpERERUd+G8GWC2MDY/g3w9p6OIyIiYkOXRC2awpAdBzAzW54RERGrydZnRERERJNKohYRERHRpJKoRURERDSpPKMWTaH1qSW0nD7xtZ/zJzoiIiJSUYuIiIhoWknUIiIiIppUUyRqkl7u6Ri6QtJkSZ3+FeFO5hgjqcuvg+opklokfaKn44iIiOjNmiJR62XG0I33dq5LbS+rb6AF6HaiJqnPGw4oIiIiVtNUiZoqF5SXe7dKGlfaB0maWl5qvqDei80lnSVpRjk/XpJK+2RJ50uaLmlh21hJ/SX9vLxk/XpJD7ZVyyQdKul+SbMl3SBpyzrr1e0j6TxJD5d5L2w3poXqZe6ntL2gXdL2kn5RYp8hab/S9xxJV0uaJGmRpI9I+m65L7dL2qz0W1RzfdMlvbu0dzTveEmTgGtK5WxauY7ZNdW+84DRJc5TJB0v6ZKaa7lN0phy/LKkb0h6ENhH0t6SpkiaJekOSYPe0H8QERERvVxTJWrAR4BhwB7AIcAF5X/ynwDusN12bm6dsZfYHmF7d2Bz4Miac5vaHgmcDJxd2r4IPG97KPBNYG8ASdsBZwKH2N4LmAl8pXahRn0kDQSOBnYr836rdpztRcBlwPdtD7M9DfhB+XkE8PfAFTVDdgKOAI4CfgzcbXsI8JfS3ubFcn2XABeVto7m3Rs4yvYngGeBvy3XMQ64uPQ5HZhW4vw+HdsCWGD7fcCDwA+Bsbb3Bq4Evt3J+IiIiKij2f48xyjgOtsrgP+RNAUYAcwArixVpJtt10vUDpT0VaA/MBB4CLi1nLupfM6i2tJrW+sHALYXSJpf2t8P7ArcW4pybwLub7dWoz4vAq8AV0iaCNzWhWs+BNi1zAOwtaStyvF/2n5VUivQB7i9tLfWXAfAdTWfbUlVR/PeYvsv5Xgz4BJJw4AVwM5diLm9FcAvyvF7gN2BO8vafYBn6g2SdAJwAkCfrbd/A8tGRERs3JotUVO9RttTJe1PVUW6VtIFtq95bZDUD7gUGG77SUnnAP1qplhWPlew6prrrlXa77R9TCdx1u0jaSRwMPBx4J+AgzqYB6qq5j41iVPbPK/FbXulpFdtu5xeyeq/O9c57mjeP9c0nQL8D1WlchOqRLOe5axega29v6+U5Bqqe/OQ7X0azLMqUHs8MB6g76DB7qR7REREr9NsW59TgXGS+kjaHtgfmC7pHcCztn8E/AewV7txbUnD4vKs2NgurHUP8DEASbsCQ0r7A8B+Nc969ZfUvspUt09Ze4DtX1Ntsw6rs+5LwFY1P0+iSugoc9Ub05lxNZ9t1b+uzjsAeMb2SuAfqCpg9eJcBAyTtImktwEjG8z3KLC9pH3KuptJ2q17lxMRERHQfBW1XwL7APOoKkNftf3fko4DTpP0KvAy8KnaQbZfkPQjqi3BRVRbpZ25FLi6bHnOAeYDS2w/J+l44DpJfUvfM4GFNes16vMS8KtS4RNVtaq9W4EbJR0FnAR8Gfi3EsemVMnqF7oQf62+5UH+TYC2Kl9X570U+IWkjwJ3s6raNh9YLmkeMIHq2bcnqO7xAmB2vUBs/1XSWOBiSQPK2hdRbUVHREREN2jVblrvourPSGxm+xVJOwG/BXa2/dceDq1bJC2i2vJd3NOxrIm+gwZ70HEXvfZzXiEVEREbM0mzbHf6t1mbraK2PvUH7i5fUBBw4oaWpEVERMTGrdcmarZfAtboLQPNwHZLT8cQERER60azfZkgIiIiIopeW1GL5jJkxwHMzHNpERERq0lFLSIiIqJJJVGLiIiIaFJJ1CIiIiKaVJ5Ri6bQ+tQSWk6f+Lr2/D21iIjozVJRi4iIiGhSSdQiIiIimlQStTUgaUJ5ryWSrigvd19fa0+W1GN/sFfScEkXd9JnG0lfXF8xRUREbGySqK0ltj9n++GejmN9sT3T9pc76bYNkEQtIiLiDdpoEzVJW0iaKGmepAWSxpX2syTNKG3jJam0T5Z0vqTpkhZKGl1nTkm6RNLDkiYCb64591qFS9Khku6XNFvSDZK2LO2HS3pE0j2SLpZ0W2kfKOlmSfMlPSBpaJ21N5f0s9LnemDzmnOvW0/SSEk3lfNHSfqLpDdJ6ifp8TrzT5B0maRp5fqPLO39JF0lqVXSHEkHlvYxNfGfI+nKcg8el9SWwJ0H7CRprqQLuv9bjIiI6N022kQN+ADwtO09bO8O3F7aL7E9orRtDhxZM2ZT2yOBk4Gz68x5NPAeYAjweWDf9h0kbQecCRxiey9gJvAVSf2Ay4HDbI8Ctq8Zdi4wx/ZQ4F+Aa+qsfSKwtPT5NrB3R+sBs4E9y9jRwAJgBPA+4ME68wO0AAcARwCXlZi/BGB7CHAMcHVpb28X4O+AkcDZ5WX3pwO/tz3M9mkN1oyIiIgGNuZErRU4pFTJRtteUtoPlPSgpFbgIGC3mjE3lc9ZVElLe/sD19leYftp4K46fd4P7ArcK2kucBzwDqpE5nHbT5R+19WMGQVcC2D7LmBbSQPqrP3j0mc+ML+j9WwvB/6fpPdSJU/fK3OMBqbViRvg57ZX2n4MeLzEXBvbI8AfgJ3rjJ1oe5ntxcCzwFsarPEaSSdImilp5oqlSzrrHhER0etstH9HzfZCSXsDhwPfkTQJ+C5wKTDc9pOSzgFqq0PLyucKGt8bd7K0gDttH7Nao7Rng/5tY7qyTr22uusV04DDgFeB3wATgD7AqQ3iaD+/G8RWz7Ka447u36rJ7fHAeIC+gwZ3dl8jIiJ6nY22oiZpB6qtwh8DFwL/f3t3H2dlWe97/PNlIkzQsRQ9xFZHE0wTJBkoH8N91HN62GKKaaKCesSHlK1tPYdTvdpYu5PFOWqmZkhKkE87faWoGRSSEIHyKAOp2VbS1C1ahuIz8Dt/3NfEzWrNrDUDM+ueme/79Vqvue9rXQ+/+2Je8OO67nutQ9iSlL2S7hsb08Zu5wOnSqqTNAA4ukydxcDhkvZLcewoaTDwBLCvpIZU75SSfsem+qOAVyLitTJjN9c5CGi+j62l8ZrbXAIsioiXgV3JVsnWtHB9J0vqJekjwL7AkyXjDgb2SuXVeB3Yqcq6ZmZmVqLbrqiR3Uc2RdJmshWlCyLir5JuItsWXQssaWOfPyPbLm0Cfg88XFohIl6WNB64XVKfVPy1tMJ3IfALSa8Aj+aaTQZukbQKeJNs+7LUD3J1Vja3b2m8FN8jZFuQ81P5KmBdRLS0evVkuqY9gPMj4m1JN5Ddr9YEbATGR8Q76RmMVkXEnyUtlLQaeND3qZmZmbWNWv4327Y3Sf0iYkN60vR64KmIuLrWcUH21Cdwf0TcVYvx+wwYFAPGXfN35f4KKTMz644kLYuIip+H2m23Pgvq3HTD/xqgnuwpUDMzM7OyuvPWZ+Gk1bNCrKCViojxtY7BzMzMtuYVNTMzM7OC8oqaFcKQgfUs9f1oZmZmW/GKmpmZmVlBOVEzMzMzKyhvfVohND2/noZJD5R9zx/RYWZmPZVX1MzMzMwKyomamZmZWUE5UTMzMzMrKCdqPZikqyVdkjufLWla7vz/SfpyO/rdsL1iNDMz68mcqPVsvwUOA5DUC9gN+Fju/cOAhTWIy8zMzHCi1tMtJCVqZAnaauB1SR+U1Ac4AFgh6XJJSyStknRFc2NJp0t6VNJKST+UVJfvXNJukhZJ8mObZmZm7eBErQeLiBeAjZL2IkvYFgGPAIcCjcAqYBQwCBgJDAOGSzpK0gHAKcDhETEM2ASMbe5b0h7AA8DXI6L8526YmZlZq/w5ata8qnYYcBUwMB2vJ9saPS69VqT6/cgSt6HAcGCJJIAPAOtSnd7AXOBLEfFwSwNLmgBMAKjbuf/2vCYzM7NuwStq1nyf2hCyrc/FZCtqzfenCfh2RAxLr/0i4kep/Me58v0jYnLqcyOwDPhvrQ0cEVMjojEiGut2rO+QizMzM+vKnKjZQuBzwF8iYlNE/AXYhSxZWwTMBs6W1A9A0kBJu5OtmI1Jx0j6kKS9U58BnA18VNKkzr0cMzOz7sNbn9ZE9rTnbSVl/SLiFWBOuh9tUdri3ACcHhG/k/S19H4v4D3gS8AfASJik6RTgfskvRYRN3TeJZmZmXUPTtR6uIjYBOxcUja+5Px7wPfKtL0TuLNMeb/0810qbH+amZlZy7z1aWZmZlZQTtTMzMzMCspbn1YIQwbWs/RKfy6umZlZnlfUzMzMzArKiZqZmZlZQTlRMzMzMyso36NmhdD0/HoaJlX+StC1vo/NzMx6EK+omZmZmRWUEzUzMzOzgnKiZmZmZlZQvkfNWiVpE9l3f/YGNgI/Bq6JiM01DczMzKwHcKJmlbwVEcMAJO1O9uXt9cC/1jQqMzOzHsBbn1a1iFgHTAAuUqZB0gJJy9PrMABJMyWNbm4n6VZJx9cqbjMzs67KiZq1SUQ8TfZ7szuwDjg2Ig4BTgGuTdWmAWcBSKoHDgN+XtqXpAmSlkpauunN9Z0RvpmZWZfiRM3aQ+lnb+AmSU3AT4EDASLiYWC/tFX6ReDuiNhY2klETI2IxohorNuxvpNCNzMz6zp8j5q1iaR9gU1kq2n/CrwEHEyW9L+dqzoTGAucCpzdyWGamZl1C07UrGqS+gM3AtdFRKRtzT9FxGZJ44C6XPXpwKPAf0bEms6P1szMrOtzomaVfEDSSrZ8PMdM4Kr03g3A3ZJOBuYBbzQ3ioiXJD0O3NPJ8ZqZmXUbTtSsVRFR18p7TwFDc0X/u/lA0o7AIOD2jovOzMyse/PDBLbdSToGeAL4fkT4cU4zM7N28oqabXcR8Stgr1rHYWZm1tU5UbNCGDKwnqVXfrbWYZiZmRWKtz7NzMzMCsqJmpmZmVlBOVEzMzMzKyjfo2aF0PT8ehomPdCutmt9b5uZmXVTXlEzMzMzKygnamZmZmYF1WmJmqQNnTVWZ5L0a0mNFepckj6pv/n855J22Q5jd8icSjpf0pllyhskrU7HjZKuTcejJB3WEbGYmZn1ZD3qHjVJ74uIjW1sI0ARsXkbhr4E+AnwJkBEfGYb+upwEXFjFXWWAkvT6ShgA/DbDgzLzMysx6nJ1qekyyUtkbRK0hWprEHSE5KmSVot6VZJx0haKOkpSSNTvQ9Juie1XSxpaIXyyZKmSpoDzJBUJ2lKbvzzysTXIOlxSTcAy4E9JR0naZGk5ZJ+KqlfmXY/kLRU0prcdU0EPgzMkzQvla2VtJuk70i6MNd+sqR/aWmOWpjLb0l6LF3zHqlsuqQxuTob0s9Rkh6W9O+Sfi/pSkljJT0qqUnSR3JxXJaOh6f+FwFfyvU5StL9khqA84FLJa2UdKSkZyT1TvV2Ttfbu7XfCTMzM/t7nZ6oSTqO7Mu6RwLDgOGSjkpv7wd8j+yLvj8KnAYcAVwGfCXVuQJYERFDU9mMCuUAw4HREXEacA6wPiJGACOAcyXtUybU/YEZEfFx4A3ga8AxEXEI2UrSl8u0+WpENKb4PyVpaERcC7wAHB0RR5fUvwM4JXf+BeCnFeYory+wOCIOBuYD55apU+pg4J+BIcAZwOCIGAlMAy4uU/8WYGJEHFqus4hYC9wIXB0RwyJiAfBroPlRzFOBuyPivSpiMzMzs5xarKgdl14ryFarPkqWlAA8ExFNaZtxDTA3IgJoAhpSnSOAmQAR8RCwq6T6VsoBZkXEW7nxz5S0EngE2DU3ft4fI2JxOv4kcCCwMLUbB+xdps0XJC1P1/ax1KZFEbEC2F3ShyUdDLwaEc9WmKO8d4H70/EytsxRa5ZExIsR8Q7wH8CcVJ6fYwDS/O0SEQ+noplV9A9Z0ndWOj6LLNn7O5ImpBXIpZve9He3m5mZlarFPWoCvh0RP9yqMNtCeydXtDl3vpktsapMn9FKOWQrYvnxL46I2RXiLG3zy4j4YkuV06rcZcCIiHhV0nRghwpjANwFjAH+C9kKW/N4fzdHZbyXElmATWyZo42kJDzdY/f+XJtq5vhvl8WWOaxaRCxM28efAuoiYnUL9aYCUwH6DBjU5nHMzMy6u1qsqM0Gzm6+x0vSQEm7t6H9fGBsajsKeCUiXmulvNz4F+TuoRosqW+FMRcDh0vaL7XZUdLgkjo7kyV369O9Yp/Ovfc6sFMLfd9Btj04hixpa45xW+ZoLdl2L8BooF33h0XEX8mu54hUNLaFquWubwZwOy2sppmZmVllnb6iFhFzJB0ALMoWe9gAnE62IlSNycAtklaRPUU5rkJ5qWlkW3zL02rTy8AJFWJ+WdJ44HZJfVLx14Df5+o8JmkF2Zbt08DCXBdTgQclvVh6n1pErJG0E/B8RLyYylqao3WtxZlzE3CvpEeBuWy9OthWZwE3S3qTLIEsIqNJGQAAFm1JREFU5z7gLkmjyVYrFwC3Av9GlqyZmZlZO2jLzpnZ9pOeOh0dEWdUU7/PgEExYNw17RrLXyFlZmZdjaRl6QHEVvWoz1GzziHp+2Rbv4X+vDgzM7Oic6Jm211ElPuYDzMzM2sjf9enmZmZWUF5Rc0KYcjAepb6XjMzM7OteEXNzMzMrKCcqJmZmZkVlLc+rRCanl9Pw6QHah1Gm/hjQczMrKN5Rc3MzMysoJyomZmZmRWUEzUzMzOzguoWiZqkDbWOoVqSdpF0Ya3jqIakSyTtWOs4zMzMeqpukagVgaRqH8zYBShEoqZMa78DlwBtStTaMA9mZmZWQbdL1CRdLmmJpFWSrkhlDZKekDRN0mpJt0o6RtJCSU9JGpnqfUjSPantYklDK5RPljRV0hxghqQ6SVNy459XJsQrgY9IWilpynaIebKkmZIeSuXnVjEXj0u6AVgO7CnpB5KWSlqTqzcR+DAwT9K8VLYh1/cYSdPT8XRJV6V635HUV9LNaewVkkZvpz9eMzOzHqVbrX5IOg4YBIwEBMySdBTwLLAfcDIwAVgCnAYcARwPfAU4AbgCWBERJ0j6R2AGMKyVcoDhwBER8ZakCcD6iBghqQ+wUNKciHgmF+Yk4KCIGLadYgYYCnwS6AuskPQAcFAr/e4PnBURF6YYvhoRf5FUB8yVNDQirpX0ZeDoiHiliukfDBwTEZsk/R/goYg4W9IuwKOSfhURb1TRj5mZmSXdKlEDjkuvFem8H1my8izwTEQ0AUhaA8yNiJDUBDSk+kcAJwFExEOSdpVU30o5wKyIeCs3/lBJY9J5fRo/n6ht75gB7k0xvJVWtUammFvq948RsTjX/gspyXwfMAA4EFjVSszl/DQiNuWu6XhJl6XzHYC9gMfzDdKYEwDqdu7fxuHMzMy6v+6WqAn4dkT8cKtCqQF4J1e0OXe+mS3zoDJ9RivlAPlVIgEXR8TsTow5H0tpzC31+0bufB/gMmBERLyatjN3aCHW/DildUrn4aSIeLKFfrLOIqYCUwH6DBhUeg1mZmY9Xne7R202cLakfgCSBkravQ3t5wNjU9tRwCsR8Vor5eXGv0BS71R3sKS+JXVeB3bajjEDjJa0g6RdgVFk26TV9rszWZK1XtIewKdbifUlSQcoewDh863EMxu4WJLS2B9v4/WYmZkZ3WxFLSLmSDoAWJRyhA3A6cCmVhtuMRm4RdIq4E1gXIXyUtPItiSXpyTlZbbcR9Yc45/TAwGrgQcj4vJtjBngUeABsu3Fb0bEC8AL1fQbEY9JWgGsAZ4GFubengo8KOnFiDia7P66+4HngNVk26nlfBO4BliV5mEt8Lk2XI+ZmZkBivCOU1cmaTKwISL+b61j2RZ9BgyKAeOuqXUYbeLv+jQzs/aStCwiGivV625bn2ZmZmbdRrfa+uyJImJyrWMwMzOzjuFEzQphyMB6lnor0czMbCve+jQzMzMrKCdqZmZmZgXlRM3MzMysoHyPmhVC0/PraZj0QK3D2Cb+uA4zM9vevKJmZmZmVlBO1MzMzMwKyomamZmZWUH1mERN0kRJj0u6tcZxjJJ0WC1jqIakBkmn1ToOMzOznqzHJGrAhcBnImJsvlBSZz9QMQooRKJW4dobgDYnapLq2h2QmZmZbaVHJGqSbgT2BWZJulTSZElTJc0BZkiqkzRF0hJJqySdl9oNkDRf0kpJqyUdmco3SPqWpMckLZa0RyrfW9Lc1MdcSXuVxNEAnA9cmvo8UlJ/SXensZdIOjzVnSzpx5LmSFor6URJ35XUJOkXknqnemslfUfSo+m1Xypvrd/8tTdIWiBpeXo1J5FXAkemOC+VNF7SdblruV/SqNx8fEPSI8ChkoZLeljSMkmzJQ3Y/n+qZmZm3V+PSNQi4nzgBeDoiLg6FQ8HRkfEacA5wPqIGAGMAM6VtA/ZitLsiBgGHAysTG37Aosj4mBgPnBuKr8OmBERQ4FbgWtL4lgL3AhcHRHDImIB8L10PgI4CZiWa/IR4LPAaOAnwLyIGAK8lcqbvRYRI9P416Sy1vrNX/s64NiIOAQ4JRfzJGBBivNqWtcXWB0RnwAeAb4PjImI4cDNwLcqtDczM7MyevLnqM2KiLfS8XHAUElj0nk9MAhYAtycVq/uiYjmRO1d4P50vAw4Nh0fCpyYjmcC360ijmOAAyU1n+8saad0/GBEvCepCagDfpHKm8i2JpvdnvvZnFS11m/+2nsD10kaBmwCBlcRc6lNwN3peH/gIOCXaew64MVyjSRNACYA1O3cvx3DmpmZdW89OVF7I3cs4OKImF1aSdJRZKtXMyVNiYgZwHsREanKJlqex2ihPK8XcGgucWoeF+AdgIjYLCk/5uaSMaPMcWv95q/9UuAlshXDXsDbLcS5ka1XYHfIHb8dEZuahwDWRMShLfSzJdCIqcBUgD4DBlUzV2ZmZj1Kj9j6rMJs4ILcfV+DJfWVtDewLiJuAn4EHFKhn98Cp6bjscBvytR5Hdgpdz4HuKj5JK1stdUpuZ+L2thvPfBiRGwGziBbASsX51pgmKRekvYERrbQ35NAf0mHpnF7S/pY2y7HzMzMoGevqOVNI9tKXK5syell4ASyJzQvl/QesAE4s0I/E8m2Si9PfZxVps59wF2SRgMXpzbXS1pF9ucxn+yBg7bok27k7wV8MRdLNf3eANwt6WRgHltW21YBGyU9Bkwnu/ftGbJt19XA8nKBRMS7aQv5Wkn1aexrgDVtvCYzM7MeT1t206wrkrQWaIyIV2ody7boM2BQDBh3TeWKBebv+jQzs2pJWhYRjZXqeevTzMzMrKC89dnFRURDrWMwMzOzjuFEzQphyMB6lnrr0MzMbCve+jQzMzMrKCdqZmZmZgXlRM3MzMysoHyPmhVC0/PraZj0QK3D6BD+2A4zM2svr6iZmZmZFZQTNTMzM7OCcqJWI5I2SVopaY2kxyR9WVKH/nlImpLGm9LB4zRIWt2RY5iZmfUEvketdt6KiGEAknYHbiP7gvR/7cAxzwP6R8Q7HTiGmZmZbSdeUSuAiFgHTAAuUqZB0gJJy9PrMABJM9OXuZPOb5V0fL6v1H6KpNWSmiSdkspnAX2BR5rLcm2aJO2S2v5Z0pm58Y6RVJf6XCJplaTzcm0vz5VfUXptkvaVtELSiO03Y2ZmZj2DV9QKIiKeTlufuwPrgGMj4m1Jg4DbgUZgGnApcK+keuAwYFxJVycCw4CDgd2AJZLmR8TxkjY0r+KVWAgcDvwReBo4EpgBfBK4ADgHWB8RIyT1ARZKmgMMSq+RgIBZko4CngWQtD9wB3BWRKzc9lkyMzPrWZyoFYvSz97AdZKGAZuAwQAR8bCk69NW6YnA3RGxsaSPI4DbI2IT8JKkh4ERwKxWxl0AHEWWqP0AmCBpIPCXiNgg6ThgqKQxqX49WYJ2XHqtSOX9UvmzQH/gXuCkiFhT9mKlCWQridTt3L/1mTEzM+uBvPVZEJL2JUvK1pGtmr1EtirWCLw/V3UmMBY4C7ilXFftGH4+2SrakcCvgZeBMWQJXHOfF0fEsPTaJyLmpPJv58r3i4gfpTbrgefIVurKioipEdEYEY11O9a3I2wzM7PuzYlaAUjqD9wIXBcRQbZi9WJEbAbOAOpy1acDlwC0sFI1Hzgl3VfWn2yl7NHWxo+I58i2SQdFxNPAb4DL2JKozQYukNQ7xTtYUt9Ufrakfql8YFrtA3gXOAE4U9JpVU+GmZmZ/Y23PmvnA5JWkm1zbiRbKbsqvXcDcLekk4F5wBvNjSLiJUmPA/e00O/PgEOBx4AA/mdE/GcV8TzCloRwAfBtsoQNsnvjGoDlkkS24nZCRMyRdACwKCtmA3A62cogEfGGpM8Bv5T0RkTcW0UcZmZmlihbwLGuQtKOQBNwSESsr3U820ufAYNiwLhrah1Gh/BXSJmZWSlJyyKisVI9b312IZKOAZ4Avt+dkjQzMzMrz1ufXUhE/ArYq9ZxmJmZWefwipqZmZlZQXlFzQphyMB6lvpeLjMzs614Rc3MzMysoJyomZmZmRWUEzUzMzOzgvI9alYITc+vp2HSA7UOw8yq4M8GNOs8XlEzMzMzKygnamZmZmYF5UTNtiJpQ8n5eEnX1SoeMzOznsyJmnUKSXWVa5mZmVmeEzWrmqS9Jc2VtCr93CuVT5c0JldvQ/o5StI8SbeRfZG8mZmZtYGf+rRSH5C0Mnf+IWBWOr4OmBERP5Z0NnAtcEKF/kYCB0XEM9s/VDMzs+7NiZqVeisihjWfSBoPNKbTQ4ET0/FM4LtV9PdoS0mapAnABIC6nfu3N14zM7Nuy1ufti0i/dxI+l2SJOD9uTpvtNg4YmpENEZEY92O9R0XpZmZWRflRM3a4rfAqel4LPCbdLwWGJ6ORwO9OzcsMzOz7smJmrXFROAsSauAM4B/TuU3AZ+S9CjwCVpZRTMzM7PqKSIq1zLrYH0GDIoB466pdRhmVgV/hZTZtpO0LCIaK9XzipqZmZlZQTlRMzMzMysoJ2pmZmZmBeXPUbNCGDKwnqW+78XMzGwrXlEzMzMzKygnamZmZmYF5a1PK4Sm59fTMOmBWodhZmb2d2r5kTReUTMzMzMrKCdqZmZmZgXlRM3MzMysoAqXqEmaKOlxSbfWOpZqSGqQtLqKOqflzhslXbsdxh4v6bpt7aeFvn8uaZcy5ZMlXZaOvyHpmHR8iaQdOyIWMzOznqqIDxNcCHw6Ip7JF0p6X0RsrEVA22HsBuA04DaAiFgKLN0OoXWYiPhMFXW+nju9BPgJ8GaHBWVmZtbDFGpFTdKNwL7ALEmXptWbqZLmADMk1UmaImmJpFWSzkvtBkiaL2mlpNWSjkzlGyR9S9JjkhZL2iOV7y1pbupjrqS9ysRS1dglbRokLZC0PL0OS29dCRyZ4rtU0ihJ90vqJWltfuVK0h8k7SGpv6S703hLJB3ewrR9WNIvJD0l6bu5fjbkjsdImp6Op0v6gaR5kp6W9ClJN6dVzOm5Nmsl7ZaOvyrpSUm/AvbP1Zme+p4IfBiYl/o9R9LVuXrnSrqqhfjNzMysBYVK1CLifOAF4OiIaP6HfjgwOiJOA84B1kfECGAEcK6kfchWq2ZHxDDgYGBlatsXWBwRBwPzgXNT+XXAjIgYCtwKtLQNWc3YeeuAYyPiEOCUXL+TgAURMSx3XUTEZuBe4PMAkj4BrI2Il4DvAVen8U4CprUQ47A01hDgFEl7tlAv74PAPwKXAvcBVwMfA4ZIGpavKGk4cCrwceDEdO1biYhr2fLndjRwB3C8pN6pylnALVXEZWZmZjlF3PosNSsi3krHxwFDJY1J5/XAIGAJcHNKDO6JiOZE7V3g/nS8DDg2HR9KlnQAzAT+thLVjrF/n6vfG7guJTubgMFVXN+dwNfJEplT0znAMcCBkprr7Sxpp4h4vaT93IhYDyDpd8DewHMVxrwvIkJSE/BSRDSl9mvItmlX5uoeCfwsIt5MdWZVuqCIeEPSQ8DnJD0O9G4eI0/SBGACQN3O/St1a2Zm1uN0hUTtjdyxgIsjYnZpJUlHAZ8FZkqaEhEzgPciIlKVTbR8vdFCecWxJTXkTi8FXiJb1esFvN1Cv3mLgP0k9QdOAP4tlfcCDs0lii15J3ecv8b8Ne3QQpvNJe03U36OWpqf1kwDvgI8QQuraRExFZgK0GfAoPaMYWZm1q0VauuzCrOBC5q31CQNltRX0t7Auoi4CfgRcEiFfn5LtnoFMBb4TXvHLqlTD7yYtjTPAOpS+evATuU6TYnkz4CrgMcj4s/prTnARc31Srckq/CSpAMk9SJtrbbTfODzkj4gaSfgn1qot9U1RsQjwJ5k29K3b8P4ZmZmPVZXWFHLm0a2Nbdc2Z7gy2SrUKOAyyW9B2wAzqzQz0SyrdLLUx9nbcPYeTcAd0s6GZjHlhW5VcBGSY8B04EVJe3uJNu+HV8S4/WSVpH9Oc0Hzq8izmaTyLZ9nwNWA/3a0PZvImK5pDvJtkP/CCxooepU4EFJL6b71AD+HRgWEa+2Z2wzM7OeTlt2Bs22L0n3kz0QMbdS3T4DBsWAcdd0QlRmZmZt0xHf9SlpWUQ0VqrX1bY+rQuQtIuk3wNvVZOkmZmZWXldbevTuoCI+CvVPfFqZmZmrXCiZoUwZGA9SztgadnMzKwr89anmZmZWUE5UTMzMzMrKCdqZmZmZgXlRM3MzMysoJyomZmZmRWUEzUzMzOzgnKiZmZmZlZQTtTMzMzMCsqJmpmZmVlBOVEzMzMzKygnamZmZmYF5UTNzMzMrKCcqJmZmZkVlBM1MzMzs4JyomZmZmZWUE7UzMzMzArKiZqZmZlZQTlRMzMzMysoRUStYzBD0uvAk7WOoxvbDXil1kF0Y57fjuX57Xie445Vbn73joj+lRq+r2PiMWuzJyOisdZBdFeSlnp+O47nt2N5fjue57hjbcv8euvTzMzMrKCcqJmZmZkVlBM1K4qptQ6gm/P8dizPb8fy/HY8z3HHavf8+mECMzMzs4LyipqZmZlZQTlRs04l6b9LelLSHyRNKvN+H0l3pvcfkdTQ+VF2XVXM71GSlkvaKGlMLWLsyqqY3y9L+p2kVZLmStq7FnF2VVXM7/mSmiStlPQbSQfWIs6uqtL85uqNkRSS/BRoG1XxOzxe0svpd3ilpP9RqU8natZpJNUB1wOfBg4EvljmL9pzgFcjYj/gauA7nRtl11Xl/D4LjAdu69zour4q53cF0BgRQ4G7gO92bpRdV5Xze1tEDImIYWRze1Unh9llVTm/SNoJmAg80rkRdn3VzjFwZ0QMS69plfp1omadaSTwh4h4OiLeBe4ARpfUGQ38OB3fBfxXSerEGLuyivMbEWsjYhWwuRYBdnHVzO+8iHgznS4G/qGTY+zKqpnf13KnfQHfZF29av7+BfgmWRL8dmcG101UO8dt4kTNOtNA4Lnc+Z9SWdk6EbERWA/s2inRdX3VzK+1X1vn9xzgwQ6NqHupan4lfUnSf5AlExM7KbbuoOL8Svo4sGdE3N+ZgXUj1f4dcVK6PeIuSXtW6tSJmnWmcitjpf8jrqaOlee561hVz6+k04FGYEqHRtS9VDW/EXF9RHwE+F/A1zo8qu6j1fmV1IvsdpN/6bSIup9qfofvAxrS7RG/YssOUoucqFln+hOQ/9/DPwAvtFRH0vuAeuAvnRJd11fN/Fr7VTW/ko4BvgocHxHvdFJs3UFbf3/vAE7o0Ii6l0rzuxNwEPBrSWuBTwKz/EBBm1T8HY6IP+f+XrgJGF6pUydq1pmWAIMk7SPp/cCpwKySOrOAcel4DPBQ+MP+qlXN/Fr7VZzftHX0Q7IkbV0NYuzKqpnfQbnTzwJPdWJ8XV2r8xsR6yNit4hoiIgGsnssj4+IpbUJt0uq5nd4QO70eODxSp36S9mt00TERkkXAbOBOuDmiFgj6RvA0oiYBfwImCnpD2QraafWLuKupZr5lTQC+BnwQeCfJF0RER+rYdhdRpW/v1OAfsBP0zMwz0bE8TULugupcn4vSiuW7wGvsuU/dVZBlfNr26DKOZ4o6XhgI9m/ceMr9etvJjAzMzMrKG99mpmZmRWUEzUzMzOzgnKiZmZmZlZQTtTMzMzMCsqJmpmZmVlBOVEzMzMzKygnamZmZmYF5UTNzMzMrKD+PyBcgzzONjK+AAAAAElFTkSuQmCC\n",
1188 | "text/plain": [
1189 | ""
1190 | ]
1191 | },
1192 | "metadata": {
1193 | "needs_background": "light"
1194 | },
1195 | "output_type": "display_data"
1196 | }
1197 | ],
1198 | "source": [
1199 | "#Decision tree importances\n",
1200 | "feature_importance = tree.feature_importances_\n",
1201 | "mod_cols_x = [sub.replace('_', ' ') for sub in final_data_X_train.columns]\n",
1202 | "\n",
1203 | "gb_feat = pd.DataFrame({'feature':mod_cols_x, 'importance':feature_importance})\n",
1204 | "gb_feat = gb_feat.sort_values(by='importance', ascending=False).head(20)\n",
1205 | "\n",
1206 | "plt.figure(figsize=(8, 7.5))\n",
1207 | "plt.barh(width=gb_feat.importance, y=gb_feat.feature);"
1208 | ]
1209 | },
1210 | {
1211 | "cell_type": "code",
1212 | "execution_count": 21,
1213 | "metadata": {},
1214 | "outputs": [
1215 | {
1216 | "data": {
1217 | "text/plain": [
1218 | "array([ 5, 3, 4, 54, 10, 9, 55, 2, 45, 24, 29, 19, 43, 1, 8, 32, 13,\n",
1219 | " 38, 44, 40, 14, 22, 30, 17, 25, 42, 50, 18, 35, 33, 48, 23, 28, 39,\n",
1220 | " 12, 7, 47, 52, 20, 15, 27, 37, 49, 34, 46, 11, 53, 36, 21, 16, 6,\n",
1221 | " 51, 41, 31, 26, 0], dtype=int64)"
1222 | ]
1223 | },
1224 | "execution_count": 21,
1225 | "metadata": {},
1226 | "output_type": "execute_result"
1227 | }
1228 | ],
1229 | "source": [
1230 | "#Random forest importances\n",
1231 | "\n",
1232 | "importances = rf_tree.feature_importances_\n",
1233 | "std = np.std([tree.feature_importances_ for tree in rf_tree.estimators_],\n",
1234 | " axis=0)\n",
1235 | "indices = np.argsort(importances)[::-1]\n",
1236 | "\n",
1237 | "indices\n",
1238 | "\n",
1239 | "#Print the feature ranking\n",
1240 | "print(\"Feature ranking:\")\n",
1241 | "\n",
1242 | "for f in range(0,11):\n",
1243 | " print(\"%d. %s (%f)\" % (f, final_data_X_train.columns[indices[f]], importances[indices[f]]))\n",
1244 | "\n",
1245 | "# Plot the feature importances of the forest\n",
1246 | "plt.figure()\n",
1247 | "plt.title(\"Feature importances\")\n",
1248 | "plt.bar(range(0,11), importances[indices],\n",
1249 | " color=\"r\", yerr=std[indices], align=\"center\")\n",
1250 | "plt.show()"
1251 | ]
1252 | },
1253 | {
1254 | "cell_type": "code",
1255 | "execution_count": 52,
1256 | "metadata": {},
1257 | "outputs": [],
1258 | "source": [
1259 | "gb_feat = gb_feat.sort_values(by='importance', ascending= False).head(20)"
1260 | ]
1261 | },
1262 | {
1263 | "cell_type": "code",
1264 | "execution_count": 53,
1265 | "metadata": {},
1266 | "outputs": [
1267 | {
1268 | "data": {
1269 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmsAAAG3CAYAAADrWBItAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOzdeZRdVZ33//eHgCEMBpHhF/GRIEbGhEAqUaYwigO0gEaDBgT0AUEbxH6gxR8OoCLQ0C0iCgTEMInIEERimyCSgSlJJYRUQMUWYttgN/CIkRBBSD7PH2eXXCr33qoCkrpJfV5rZd1z99nD95xiLb5r733ukW0iIiIiojWt09cBRERERERjSdYiIiIiWliStYiIiIgWlmQtIiIiooUlWYuIiIhoYUnWIiIiIlrYun0dQEQ9m222mYcOHdrXYURERKwW8+bNe9r25vXOJVmLljR06FDa29v7OoyIiIjVQtLvG53LMmhEREREC0uyFhEREdHCkqxFREREtLAkaxEREREtLMlaRERERAtLshYRERHRwpKsRURERLSwJGsRERERLSzJWkREREQLS7IWERER0cKSrEVERES0sCRrERERES0syVpEREREC0uyFhEREdHCkqxFREREtLAkaxEREREtLMlaRERERAtLshYtqePxJQw9fUpfhxEREdHnkqxFREREtLAkaxEREREtLMlaRERERAvr98mapJMl/UrSdX0dS3ckfVDS6b1sM0nSuFUVU29IOlPSqX0dR0RExJpk3b4OoAV8Bni/7cc6CySta/ulPoypLtu3Abf1dRwRERGx+vTrmTVJlwJvB26TtETSREnTgKslDZB0vqS5khZK+nRpM0TSTEkLJC2StHcpXyrpbEkPSrpf0palfGtJd5Y+7pT0tgaxDJD0qCqbSFohaWw5N0vSOyQdI+niUjZJ0kWS7i3txpVySbpY0sOSpgBbdHMPzi11F0q6oKbvS8u4j0g6pCbGle5JOXdaTflZNeVnSPqNpF8A272qP1REREQ/1q+TNdsnAE8A+wHfAkYBh9r+OPApYInt0cBo4DhJ2wAfB6baHgnsAiwo3W0I3G97F2AmcFwpvxi42vYI4DrgogaxLAceAXYE9gLmAXtLGgi81fZ/1Gk2pNQ9BDi3lB1OlRQNLzHs0ej6JW1a6u9U4vtGzemh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\n",
1270 | "text/plain": [
1271 | ""
1272 | ]
1273 | },
1274 | "metadata": {
1275 | "needs_background": "light"
1276 | },
1277 | "output_type": "display_data"
1278 | }
1279 | ],
1280 | "source": [
1281 | "plt.figure(figsize=(8, 7.5))\n",
1282 | "plt.barh(width=gb_feat.importance, y=gb_feat.feature);"
1283 | ]
1284 | },
1285 | {
1286 | "cell_type": "code",
1287 | "execution_count": 34,
1288 | "metadata": {},
1289 | "outputs": [
1290 | {
1291 | "data": {
1292 | "text/html": [
1293 | "\n",
1294 | "\n",
1307 | "
\n",
1308 | " \n",
1309 | " \n",
1310 | " | \n",
1311 | " feature | \n",
1312 | " importance | \n",
1313 | "
\n",
1314 | " \n",
1315 | " \n",
1316 | " \n",
1317 | " | 5 | \n",
1318 | " fresno_relative_humidity | \n",
1319 | " 0.449245 | \n",
1320 | "
\n",
1321 | " \n",
1322 | " | 3 | \n",
1323 | " Hour | \n",
1324 | " 0.260940 | \n",
1325 | "
\n",
1326 | " \n",
1327 | " | 4 | \n",
1328 | " fresno_temperature | \n",
1329 | " 0.097121 | \n",
1330 | "
\n",
1331 | " \n",
1332 | " | 54 | \n",
1333 | " Day_of_week | \n",
1334 | " 0.059365 | \n",
1335 | "
\n",
1336 | " \n",
1337 | " | 10 | \n",
1338 | " chico_relative_humidity | \n",
1339 | " 0.017765 | \n",
1340 | "
\n",
1341 | " \n",
1342 | " | 9 | \n",
1343 | " chico_temperature | \n",
1344 | " 0.017347 | \n",
1345 | "
\n",
1346 | " \n",
1347 | " | 55 | \n",
1348 | " Week | \n",
1349 | " 0.012169 | \n",
1350 | "
\n",
1351 | " \n",
1352 | " | 2 | \n",
1353 | " Day | \n",
1354 | " 0.011900 | \n",
1355 | "
\n",
1356 | " \n",
1357 | " | 45 | \n",
1358 | " redding_relative_humidity | \n",
1359 | " 0.006338 | \n",
1360 | "
\n",
1361 | " \n",
1362 | " | 24 | \n",
1363 | " ontario_temperature | \n",
1364 | " 0.004155 | \n",
1365 | "
\n",
1366 | " \n",
1367 | " | 29 | \n",
1368 | " moreno_valley_temperature | \n",
1369 | " 0.003867 | \n",
1370 | "
\n",
1371 | " \n",
1372 | " | 19 | \n",
1373 | " anaheim_temperature | \n",
1374 | " 0.003583 | \n",
1375 | "
\n",
1376 | " \n",
1377 | " | 43 | \n",
1378 | " concord_wind_speed | \n",
1379 | " 0.003421 | \n",
1380 | "
\n",
1381 | " \n",
1382 | " | 1 | \n",
1383 | " Month | \n",
1384 | " 0.003416 | \n",
1385 | "
\n",
1386 | " \n",
1387 | " | 8 | \n",
1388 | " fresno_wind_speed | \n",
1389 | " 0.002980 | \n",
1390 | "
\n",
1391 | " \n",
1392 | " | 32 | \n",
1393 | " moreno_valley_dew_point | \n",
1394 | " 0.002770 | \n",
1395 | "
\n",
1396 | " \n",
1397 | " | 13 | \n",
1398 | " chico_wind_speed | \n",
1399 | " 0.002438 | \n",
1400 | "
\n",
1401 | " \n",
1402 | " | 38 | \n",
1403 | " san_francisco_wind_speed | \n",
1404 | " 0.002303 | \n",
1405 | "
\n",
1406 | " \n",
1407 | " | 44 | \n",
1408 | " redding_temperature | \n",
1409 | " 0.002288 | \n",
1410 | "
\n",
1411 | " \n",
1412 | " | 40 | \n",
1413 | " concord_relative_humidity | \n",
1414 | " 0.002004 | \n",
1415 | "
\n",
1416 | " \n",
1417 | "
\n",
1418 | "
"
1419 | ],
1420 | "text/plain": [
1421 | " feature importance\n",
1422 | "5 fresno_relative_humidity 0.449245\n",
1423 | "3 Hour 0.260940\n",
1424 | "4 fresno_temperature 0.097121\n",
1425 | "54 Day_of_week 0.059365\n",
1426 | "10 chico_relative_humidity 0.017765\n",
1427 | "9 chico_temperature 0.017347\n",
1428 | "55 Week 0.012169\n",
1429 | "2 Day 0.011900\n",
1430 | "45 redding_relative_humidity 0.006338\n",
1431 | "24 ontario_temperature 0.004155\n",
1432 | "29 moreno_valley_temperature 0.003867\n",
1433 | "19 anaheim_temperature 0.003583\n",
1434 | "43 concord_wind_speed 0.003421\n",
1435 | "1 Month 0.003416\n",
1436 | "8 fresno_wind_speed 0.002980\n",
1437 | "32 moreno_valley_dew_point 0.002770\n",
1438 | "13 chico_wind_speed 0.002438\n",
1439 | "38 san_francisco_wind_speed 0.002303\n",
1440 | "44 redding_temperature 0.002288\n",
1441 | "40 concord_relative_humidity 0.002004"
1442 | ]
1443 | },
1444 | "execution_count": 34,
1445 | "metadata": {},
1446 | "output_type": "execute_result"
1447 | }
1448 | ],
1449 | "source": [
1450 | "gb_feat['feature'] = df['B'].str.slice_replace(1, 3, 'AAA')"
1451 | ]
1452 | },
1453 | {
1454 | "cell_type": "code",
1455 | "execution_count": 82,
1456 | "metadata": {},
1457 | "outputs": [
1458 | {
1459 | "name": "stdout",
1460 | "output_type": "stream",
1461 | "text": [
1462 | "Feature ranking:\n",
1463 | "0. fresno_relative_humidity (0.373411)\n",
1464 | "1. Hour (0.255585)\n",
1465 | "2. lemoore_temperature (0.111071)\n",
1466 | "3. fresno_temperature (0.063811)\n",
1467 | "4. Day_of_week (0.059408)\n",
1468 | "5. lemoore_relative_humidity (0.021034)\n",
1469 | "6. chico_relative_humidity (0.015598)\n",
1470 | "7. Week (0.012467)\n",
1471 | "8. Day (0.011358)\n",
1472 | "9. chico_temperature (0.006728)\n",
1473 | "10. san_diego_dew_point (0.005414)\n",
1474 | "11. san_diego_temperature (0.005129)\n",
1475 | "12. los_angeles_temperature (0.003860)\n",
1476 | "13. roseville_relative_humidity (0.003626)\n",
1477 | "14. Month (0.003414)\n",
1478 | "15. los_angeles_wind_speed (0.003391)\n",
1479 | "16. sacramento_relative_humidity (0.003040)\n",
1480 | "17. chico_wind_speed (0.002434)\n",
1481 | "18. san_diego_wind_speed (0.002428)\n",
1482 | "19. fresno_wind_speed (0.002338)\n",
1483 | "20. los_angeles_dew_point (0.002248)\n",
1484 | "21. roseville_temperature (0.002050)\n",
1485 | "22. san_diego_relative_humidity (0.001976)\n",
1486 | "23. san_jose_wind_speed (0.001913)\n",
1487 | "24. los_angeles_relative_humidity (0.001855)\n",
1488 | "25. lemoore_wind_speed (0.001718)\n",
1489 | "26. sacramento_temperature (0.001360)\n",
1490 | "27. petaluma_relative_humidity (0.001332)\n",
1491 | "28. san_jose_relative_humidity (0.001241)\n",
1492 | "29. petaluma_dew_point (0.001182)\n",
1493 | "30. san_francisco_relative_humidity (0.001125)\n",
1494 | "31. san_francisco_wind_speed (0.001094)\n",
1495 | "32. lemoore_dew_point (0.001045)\n",
1496 | "33. chico_dew_point (0.001042)\n",
1497 | "34. petaluma_wind_speed (0.001038)\n",
1498 | "35. roseville_dew_point (0.001030)\n",
1499 | "36. sacramento_wind_speed (0.000986)\n",
1500 | "37. san_jose_dew_point (0.000977)\n",
1501 | "38. fresno_dew_point (0.000958)\n",
1502 | "39. sacramento_dew_point (0.000957)\n",
1503 | "40. roseville_wind_speed (0.000861)\n",
1504 | "41. san_jose_temperature (0.000822)\n",
1505 | "42. san_francisco_dew_point (0.000719)\n",
1506 | "43. san_francisco_temperature (0.000588)\n",
1507 | "44. petaluma_temperature (0.000514)\n",
1508 | "45. los_angeles_cloud_type (0.000450)\n",
1509 | "46. san_francisco_cloud_type (0.000431)\n",
1510 | "47. chico_cloud_type (0.000417)\n",
1511 | "48. sacramento_cloud_type (0.000407)\n",
1512 | "49. san_diego_cloud_type (0.000395)\n",
1513 | "50. roseville_cloud_type (0.000379)\n",
1514 | "51. petaluma_cloud_type (0.000360)\n",
1515 | "52. san_jose_cloud_type (0.000345)\n",
1516 | "53. lemoore_cloud_type (0.000324)\n",
1517 | "54. fresno_cloud_type (0.000314)\n",
1518 | "55. Year (0.000005)\n"
1519 | ]
1520 | },
1521 | {
1522 | "data": {
1523 | "image/png": "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\n",
1524 | "text/plain": [
1525 | ""
1526 | ]
1527 | },
1528 | "metadata": {
1529 | "needs_background": "light"
1530 | },
1531 | "output_type": "display_data"
1532 | }
1533 | ],
1534 | "source": [
1535 | "#Random Forest Importances\n",
1536 | "importances = rf_tree.feature_importances_\n",
1537 | "std = np.std([tree.feature_importances_ for tree in rf_tree.estimators_],\n",
1538 | " axis=0)\n",
1539 | "indices = np.argsort(importances)[::-1]\n",
1540 | "\n",
1541 | "# Print the feature ranking\n",
1542 | "print(\"Feature ranking:\")\n",
1543 | "\n",
1544 | "for f in range(final_data_X_train.shape[1]):\n",
1545 | " print(\"%d. %s (%f)\" % (f, final_data_X_train.columns[indices[f]], importances[indices[f]]))\n",
1546 | "\n",
1547 | "# Plot the feature importances of the forest\n",
1548 | "plt.figure()\n",
1549 | "plt.title(\"Feature Importances Random Forest (Two-Stage Clustering) with Error Bars\")\n",
1550 | "plt.bar(range(final_data_X_train.shape[1]), importances[indices],\n",
1551 | " color=\"r\", yerr=std[indices], align=\"center\")\n",
1552 | "plt.rcParams['figure.figsize'] = [20, 10]\n",
1553 | "plt.savefig(\"C:/Users/zohai/OneDrive/桌面/Comp 152/Final Project Material/Code/Data Folder/features_importances.png\")"
1554 | ]
1555 | },
1556 | {
1557 | "cell_type": "code",
1558 | "execution_count": null,
1559 | "metadata": {},
1560 | "outputs": [],
1561 | "source": []
1562 | },
1563 | {
1564 | "cell_type": "code",
1565 | "execution_count": null,
1566 | "metadata": {},
1567 | "outputs": [],
1568 | "source": []
1569 | }
1570 | ],
1571 | "metadata": {
1572 | "kernelspec": {
1573 | "display_name": "Python 3",
1574 | "language": "python",
1575 | "name": "python3"
1576 | },
1577 | "language_info": {
1578 | "codemirror_mode": {
1579 | "name": "ipython",
1580 | "version": 3
1581 | },
1582 | "file_extension": ".py",
1583 | "mimetype": "text/x-python",
1584 | "name": "python",
1585 | "nbconvert_exporter": "python",
1586 | "pygments_lexer": "ipython3",
1587 | "version": "3.7.4"
1588 | }
1589 | },
1590 | "nbformat": 4,
1591 | "nbformat_minor": 2
1592 | }
1593 |
--------------------------------------------------------------------------------