diff --git a/README.md b/README.md new file mode 100644 index 0000000..b29e6df --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Predictive analytics + +This seminar is devided into following sessions + +- [Session 1 & 3](./session_1/README.md): Predictive analytics: preparing data and application of linear regression models. +- [Session 4](./lab/README.md): Project diff --git a/data/README.md b/data/README.md new file mode 100644 index 0000000..c2e4b2f --- /dev/null +++ b/data/README.md @@ -0,0 +1 @@ +Data files (csv, xls, images, ...) \ No newline at end of file diff --git a/data/car_co2_data.csv b/data/car_co2_data.csv new file mode 100644 index 0000000..889a1c7 --- /dev/null +++ b/data/car_co2_data.csv @@ -0,0 +1,37 @@ +Car,Model,Volume,Weight,CO2 +Toyoty,Aygo,1000,790,99 +Mitsubishi,Space Star,1200,1160,95 +Skoda,Citigo,1000,929,95 +Fiat,500,900,865,90 +Mini,Cooper,1500,1140,105 +VW,Up!,1000,929,105 +Skoda,Fabia,1400,1109,90 +Mercedes,A-Class,1500,1365,92 +Ford,Fiesta,1500,1112,98 +Audi,A1,1600,1150,99 +Hyundai,I20,1100,980,99 +Suzuki,Swift,1300,990,101 +Ford,Fiesta,1000,1112,99 +Honda,Civic,1600,1252,94 +Hundai,I30,1600,1326,97 +Opel,Astra,1600,1330,97 +BMW,1,1600,1365,99 +Mazda,3,2200,1280,104 +Skoda,Rapid,1600,1119,104 +Ford,Focus,2000,1328,105 +Ford,Mondeo,1600,1584,94 +Opel,Insignia,2000,1428,99 +Mercedes,C-Class,2100,1365,99 +Skoda,Octavia,1600,1415,99 +Volvo,S60,2000,1415,99 +Mercedes,CLA,1500,1465,102 +Audi,A4,2000,1490,104 +Audi,A6,2000,1725,114 +Volvo,V70,1600,1523,109 +BMW,5,2000,1705,114 +Mercedes,E-Class,2100,1605,115 +Volvo,XC70,2000,1746,117 +Ford,B-Max,1600,1235,104 +BMW,216,1600,1390,108 +Opel,Zafira,1600,1405,109 +Mercedes,SLK,2500,1395,120 diff --git a/data/car_co2_data_calc.xlsx b/data/car_co2_data_calc.xlsx new file mode 100644 index 0000000..5f2c8d2 Binary files /dev/null and b/data/car_co2_data_calc.xlsx differ diff --git a/data/insurance.csv b/data/insurance.csv new file mode 100644 index 0000000..2b8b1af --- /dev/null +++ b/data/insurance.csv @@ -0,0 +1,1339 @@ +age,sex,bmi,children,smoker,region,charges +19,female,27.9,0,yes,southwest,16884.924 +18,male,,1,no,southeast,1725.5523 +28,male,33,3,no,southeast,4449.462 +33,male,,0,no,northwest,21984.47061 +32,male,28.88,0,no,northwest,3866.8552 +31,female,25.74,0,no,southeast,3756.6216 +46,female,33.44,1,no,southeast,8240.5896 +37,female,27.74,3,no,northwest,7281.5056 +37,male,29.83,2,no,northeast,6406.4107 +60,female,25.84,0,no,northwest,28923.13692 +25,male,26.22,0,no,northeast,2721.3208 +62,female,26.29,0,yes,southeast,27808.7251 +23,male,34.4,0,no,southwest,1826.843 +56,female,39.82,0,no,southeast,11090.7178 +27,male,,0,yes,southeast,39611.7577 +19,male,24.6,1,no,southwest,1837.237 +52,female,30.78,1,no,northeast,10797.3362 +23,male,23.845,0,no,northeast,2395.17155 +56,male,40.3,0,no,southwest,10602.385 +30,male,35.3,0,yes,southwest,36837.467 +60,female,36.005,0,no,northeast,13228.84695 +30,female,32.4,1,no,southwest,4149.736 +18,male,34.1,0,no,southeast,1137.011 +34,female,31.92,1,yes,northeast,37701.8768 +37,male,28.025,2,no,northwest,6203.90175 +59,female,27.72,3,no,southeast,14001.1338 +63,female,23.085,0,no,northeast,14451.83515 +55,female,32.775,2,no,northwest,12268.63225 +23,male,17.385,1,no,northwest,2775.19215 +31,male,36.3,2,yes,southwest,38711 +22,male,35.6,0,yes,southwest,35585.576 +18,female,26.315,0,no,northeast,2198.18985 +19,female,28.6,5,no,southwest,4687.797 +63,male,28.31,0,no,northwest,13770.0979 +28,male,36.4,1,yes,southwest,51194.55914 +19,male,20.425,0,no,northwest,1625.43375 +62,female,32.965,3,no,northwest,15612.19335 +26,male,20.8,0,no,southwest,2302.3 +35,male,36.67,1,yes,northeast,39774.2763 +60,male,39.9,0,yes,southwest,48173.361 +24,female,26.6,0,no,northeast,3046.062 +31,female,36.63,2,no,southeast,4949.7587 +41,male,21.78,1,no,southeast,6272.4772 +37,female,30.8,2,no,southeast,6313.759 +38,male,37.05,1,no,northeast,6079.6715 +55,male,37.3,0,no,southwest,20630.28351 +18,female,38.665,2,no,northeast,3393.35635 +28,female,34.77,0,no,northwest,3556.9223 +60,female,24.53,0,no,southeast,12629.8967 +36,male,35.2,1,yes,southeast,38709.176 +18,female,35.625,0,no,northeast,2211.13075 +21,female,33.63,2,no,northwest,3579.8287 +48,male,28,1,yes,southwest,23568.272 +36,male,34.43,0,yes,southeast,37742.5757 +40,female,28.69,3,no,northwest,8059.6791 +58,male,36.955,2,yes,northwest,47496.49445 +58,female,31.825,2,no,northeast,13607.36875 +18,male,31.68,2,yes,southeast,34303.1672 +53,female,22.88,1,yes,southeast,23244.7902 +34,female,37.335,2,no,northwest,5989.52365 +43,male,27.36,3,no,northeast,8606.2174 +25,male,33.66,4,no,southeast,4504.6624 +64,male,24.7,1,no,northwest,30166.61817 +28,female,25.935,1,no,northwest,4133.64165 +20,female,22.42,0,yes,northwest,14711.7438 +19,female,28.9,0,no,southwest,1743.214 +61,female,39.1,2,no,southwest,14235.072 +40,male,26.315,1,no,northwest,6389.37785 +40,female,36.19,0,no,southeast,5920.1041 +28,male,23.98,3,yes,southeast,17663.1442 +27,female,24.75,0,yes,southeast,16577.7795 +31,male,28.5,5,no,northeast,6799.458 +53,female,28.1,3,no,southwest,11741.726 +58,male,32.01,1,no,southeast,11946.6259 +44,male,27.4,2,no,southwest,7726.854 +57,male,34.01,0,no,northwest,11356.6609 +29,female,29.59,1,no,southeast,3947.4131 +21,male,35.53,0,no,southeast,1532.4697 +22,female,39.805,0,no,northeast,2755.02095 +41,female,32.965,0,no,northwest,6571.02435 +31,male,26.885,1,no,northeast,4441.21315 +45,female,38.285,0,no,northeast,7935.29115 +22,male,37.62,1,yes,southeast,37165.1638 +48,female,41.23,4,no,northwest,11033.6617 +37,female,34.8,2,yes,southwest,39836.519 +45,male,22.895,2,yes,northwest,21098.55405 +57,female,31.16,0,yes,northwest,43578.9394 +56,female,27.2,0,no,southwest,11073.176 +46,female,27.74,0,no,northwest,8026.6666 +55,female,26.98,0,no,northwest,11082.5772 +21,female,39.49,0,no,southeast,2026.9741 +53,female,24.795,1,no,northwest,10942.13205 +59,male,29.83,3,yes,northeast,30184.9367 +35,male,34.77,2,no,northwest,5729.0053 +64,female,31.3,2,yes,southwest,47291.055 +28,female,37.62,1,no,southeast,3766.8838 +54,female,30.8,3,no,southwest,12105.32 +55,male,38.28,0,no,southeast,10226.2842 +56,male,19.95,0,yes,northeast,22412.6485 +38,male,19.3,0,yes,southwest,15820.699 +41,female,31.6,0,no,southwest,6186.127 +30,male,25.46,0,no,northeast,3645.0894 +18,female,30.115,0,no,northeast,21344.8467 +61,female,29.92,3,yes,southeast,30942.1918 +34,female,27.5,1,no,southwest,5003.853 +20,male,28.025,1,yes,northwest,17560.37975 +19,female,28.4,1,no,southwest,2331.519 +26,male,30.875,2,no,northwest,3877.30425 +29,male,27.94,0,no,southeast,2867.1196 +63,male,35.09,0,yes,southeast,47055.5321 +54,male,33.63,1,no,northwest,10825.2537 +55,female,29.7,2,no,southwest,11881.358 +37,male,30.8,0,no,southwest,4646.759 +21,female,35.72,0,no,northwest,2404.7338 +52,male,32.205,3,no,northeast,11488.31695 +60,male,28.595,0,no,northeast,30259.99556 +58,male,49.06,0,no,southeast,11381.3254 +29,female,27.94,1,yes,southeast,19107.7796 +49,female,27.17,0,no,southeast,8601.3293 +37,female,23.37,2,no,northwest,6686.4313 +44,male,37.1,2,no,southwest,7740.337 +18,male,23.75,0,no,northeast,1705.6245 +20,female,28.975,0,no,northwest,2257.47525 +44,male,31.35,1,yes,northeast,39556.4945 +47,female,33.915,3,no,northwest,10115.00885 +26,female,28.785,0,no,northeast,3385.39915 +19,female,28.3,0,yes,southwest,17081.08 +52,female,37.4,0,no,southwest,9634.538 +32,female,17.765,2,yes,northwest,32734.1863 +38,male,34.7,2,no,southwest,6082.405 +59,female,26.505,0,no,northeast,12815.44495 +61,female,22.04,0,no,northeast,13616.3586 +53,female,35.9,2,no,southwest,11163.568 +19,male,25.555,0,no,northwest,1632.56445 +20,female,28.785,0,no,northeast,2457.21115 +22,female,28.05,0,no,southeast,2155.6815 +19,male,34.1,0,no,southwest,1261.442 +22,male,25.175,0,no,northwest,2045.68525 +54,female,31.9,3,no,southeast,27322.73386 +22,female,36,0,no,southwest,2166.732 +34,male,22.42,2,no,northeast,27375.90478 +26,male,32.49,1,no,northeast,3490.5491 +34,male,25.3,2,yes,southeast,18972.495 +29,male,29.735,2,no,northwest,18157.876 +30,male,28.69,3,yes,northwest,20745.9891 +29,female,38.83,3,no,southeast,5138.2567 +46,male,30.495,3,yes,northwest,40720.55105 +51,female,37.73,1,no,southeast,9877.6077 +53,female,37.43,1,no,northwest,10959.6947 +19,male,28.4,1,no,southwest,1842.519 +35,male,24.13,1,no,northwest,5125.2157 +48,male,29.7,0,no,southeast,7789.635 +32,female,37.145,3,no,northeast,6334.34355 +42,female,23.37,0,yes,northeast,19964.7463 +40,female,25.46,1,no,northeast,7077.1894 +44,male,39.52,0,no,northwest,6948.7008 +48,male,24.42,0,yes,southeast,21223.6758 +18,male,25.175,0,yes,northeast,15518.18025 +30,male,35.53,0,yes,southeast,36950.2567 +50,female,27.83,3,no,southeast,19749.38338 +42,female,26.6,0,yes,northwest,21348.706 +18,female,36.85,0,yes,southeast,36149.4835 +54,male,39.6,1,no,southwest,10450.552 +32,female,29.8,2,no,southwest,5152.134 +37,male,29.64,0,no,northwest,5028.1466 +47,male,28.215,4,no,northeast,10407.08585 +20,female,37,5,no,southwest,4830.63 +32,female,33.155,3,no,northwest,6128.79745 +19,female,31.825,1,no,northwest,2719.27975 +27,male,18.905,3,no,northeast,4827.90495 +63,male,41.47,0,no,southeast,13405.3903 +49,male,30.3,0,no,southwest,8116.68 +18,male,15.96,0,no,northeast,1694.7964 +35,female,34.8,1,no,southwest,5246.047 +24,female,33.345,0,no,northwest,2855.43755 +63,female,37.7,0,yes,southwest,48824.45 +38,male,27.835,2,no,northwest,6455.86265 +54,male,29.2,1,no,southwest,10436.096 +46,female,28.9,2,no,southwest,8823.279 +41,female,33.155,3,no,northeast,8538.28845 +58,male,28.595,0,no,northwest,11735.87905 +18,female,38.28,0,no,southeast,1631.8212 +22,male,19.95,3,no,northeast,4005.4225 +44,female,26.41,0,no,northwest,7419.4779 +44,male,30.69,2,no,southeast,7731.4271 +36,male,41.895,3,yes,northeast,43753.33705 +26,female,29.92,2,no,southeast,3981.9768 +30,female,30.9,3,no,southwest,5325.651 +41,female,32.2,1,no,southwest,6775.961 +29,female,32.11,2,no,northwest,4922.9159 +61,male,31.57,0,no,southeast,12557.6053 +36,female,26.2,0,no,southwest,4883.866 +25,male,25.74,0,no,southeast,2137.6536 +56,female,26.6,1,no,northwest,12044.342 +18,male,34.43,0,no,southeast,1137.4697 +19,male,30.59,0,no,northwest,1639.5631 +39,female,32.8,0,no,southwest,5649.715 +45,female,28.6,2,no,southeast,8516.829 +51,female,18.05,0,no,northwest,9644.2525 +64,female,39.33,0,no,northeast,14901.5167 +19,female,32.11,0,no,northwest,2130.6759 +48,female,32.23,1,no,southeast,8871.1517 +60,female,24.035,0,no,northwest,13012.20865 +27,female,36.08,0,yes,southeast,37133.8982 +46,male,22.3,0,no,southwest,7147.105 +28,female,28.88,1,no,northeast,4337.7352 +59,male,26.4,0,no,southeast,11743.299 +35,male,27.74,2,yes,northeast,20984.0936 +63,female,31.8,0,no,southwest,13880.949 +40,male,41.23,1,no,northeast,6610.1097 +20,male,33,1,no,southwest,1980.07 +40,male,30.875,4,no,northwest,8162.71625 +24,male,28.5,2,no,northwest,3537.703 +34,female,26.73,1,no,southeast,5002.7827 +45,female,30.9,2,no,southwest,8520.026 +41,female,37.1,2,no,southwest,7371.772 +53,female,26.6,0,no,northwest,10355.641 +27,male,23.1,0,no,southeast,2483.736 +26,female,29.92,1,no,southeast,3392.9768 +24,female,23.21,0,no,southeast,25081.76784 +34,female,33.7,1,no,southwest,5012.471 +53,female,33.25,0,no,northeast,10564.8845 +32,male,30.8,3,no,southwest,5253.524 +19,male,34.8,0,yes,southwest,34779.615 +42,male,24.64,0,yes,southeast,19515.5416 +55,male,33.88,3,no,southeast,11987.1682 +28,male,38.06,0,no,southeast,2689.4954 +58,female,41.91,0,no,southeast,24227.33724 +41,female,31.635,1,no,northeast,7358.17565 +47,male,25.46,2,no,northeast,9225.2564 +42,female,36.195,1,no,northwest,7443.64305 +59,female,27.83,3,no,southeast,14001.2867 +19,female,17.8,0,no,southwest,1727.785 +59,male,27.5,1,no,southwest,12333.828 +39,male,24.51,2,no,northwest,6710.1919 +40,female,22.22,2,yes,southeast,19444.2658 +18,female,26.73,0,no,southeast,1615.7667 +31,male,38.39,2,no,southeast,4463.2051 +19,male,29.07,0,yes,northwest,17352.6803 +44,male,38.06,1,no,southeast,7152.6714 +23,female,36.67,2,yes,northeast,38511.6283 +33,female,22.135,1,no,northeast,5354.07465 +55,female,26.8,1,no,southwest,35160.13457 +40,male,35.3,3,no,southwest,7196.867 +63,female,27.74,0,yes,northeast,29523.1656 +54,male,30.02,0,no,northwest,24476.47851 +60,female,38.06,0,no,southeast,12648.7034 +24,male,35.86,0,no,southeast,1986.9334 +19,male,20.9,1,no,southwest,1832.094 +29,male,28.975,1,no,northeast,4040.55825 +18,male,17.29,2,yes,northeast,12829.4551 +63,female,32.2,2,yes,southwest,47305.305 +54,male,34.21,2,yes,southeast,44260.7499 +27,male,30.3,3,no,southwest,4260.744 +50,male,31.825,0,yes,northeast,41097.16175 +55,female,25.365,3,no,northeast,13047.33235 +56,male,33.63,0,yes,northwest,43921.1837 +38,female,40.15,0,no,southeast,5400.9805 +51,male,24.415,4,no,northwest,11520.09985 +19,male,31.92,0,yes,northwest,33750.2918 +58,female,25.2,0,no,southwest,11837.16 +20,female,26.84,1,yes,southeast,17085.2676 +52,male,24.32,3,yes,northeast,24869.8368 +19,male,36.955,0,yes,northwest,36219.40545 +53,female,38.06,3,no,southeast,20462.99766 +46,male,42.35,3,yes,southeast,46151.1245 +40,male,19.8,1,yes,southeast,17179.522 +59,female,32.395,3,no,northeast,14590.63205 +45,male,30.2,1,no,southwest,7441.053 +49,male,25.84,1,no,northeast,9282.4806 +18,male,29.37,1,no,southeast,1719.4363 +50,male,,2,yes,southwest,42856.838 +41,male,37.05,2,no,northwest,7265.7025 +50,male,27.455,1,no,northeast,9617.66245 +25,male,27.55,0,no,northwest,2523.1695 +47,female,26.6,2,no,northeast,9715.841 +19,male,20.615,2,no,northwest,2803.69785 +22,female,24.3,0,no,southwest,2150.469 +59,male,31.79,2,no,southeast,12928.7911 +51,female,21.56,1,no,southeast,9855.1314 +40,female,28.12,1,yes,northeast,22331.5668 +54,male,40.565,3,yes,northeast,48549.17835 +30,male,27.645,1,no,northeast,4237.12655 +55,female,32.395,1,no,northeast,11879.10405 +52,female,31.2,0,no,southwest,9625.92 +46,male,26.62,1,no,southeast,7742.1098 +46,female,48.07,2,no,northeast,9432.9253 +63,female,26.22,0,no,northwest,14256.1928 +59,female,36.765,1,yes,northeast,47896.79135 +52,male,26.4,3,no,southeast,25992.82104 +28,female,33.4,0,no,southwest,3172.018 +29,male,29.64,1,no,northeast,20277.80751 +25,male,45.54,2,yes,southeast,42112.2356 +22,female,28.82,0,no,southeast,2156.7518 +25,male,26.8,3,no,southwest,3906.127 +18,male,22.99,0,no,northeast,1704.5681 +19,male,27.7,0,yes,southwest,16297.846 +47,male,25.41,1,yes,southeast,21978.6769 +31,male,34.39,3,yes,northwest,38746.3551 +48,female,28.88,1,no,northwest,9249.4952 +36,male,27.55,3,no,northeast,6746.7425 +53,female,22.61,3,yes,northeast,24873.3849 +56,female,37.51,2,no,southeast,12265.5069 +28,female,33,2,no,southeast,4349.462 +57,female,38,2,no,southwest,12646.207 +29,male,33.345,2,no,northwest,19442.3535 +28,female,27.5,2,no,southwest,20177.67113 +30,female,33.33,1,no,southeast,4151.0287 +58,male,34.865,0,no,northeast,11944.59435 +41,female,33.06,2,no,northwest,7749.1564 +50,male,26.6,0,no,southwest,8444.474 +19,female,24.7,0,no,southwest,1737.376 +43,male,35.97,3,yes,southeast,42124.5153 +49,male,35.86,0,no,southeast,8124.4084 +27,female,31.4,0,yes,southwest,34838.873 +52,male,33.25,0,no,northeast,9722.7695 +50,male,32.205,0,no,northwest,8835.26495 +54,male,32.775,0,no,northeast,10435.06525 +44,female,27.645,0,no,northwest,7421.19455 +32,male,37.335,1,no,northeast,4667.60765 +34,male,25.27,1,no,northwest,4894.7533 +26,female,29.64,4,no,northeast,24671.66334 +34,male,30.8,0,yes,southwest,35491.64 +57,male,40.945,0,no,northeast,11566.30055 +29,male,27.2,0,no,southwest,2866.091 +40,male,34.105,1,no,northeast,6600.20595 +27,female,23.21,1,no,southeast,3561.8889 +45,male,36.48,2,yes,northwest,42760.5022 +64,female,33.8,1,yes,southwest,47928.03 +52,male,36.7,0,no,southwest,9144.565 +61,female,36.385,1,yes,northeast,48517.56315 +52,male,27.36,0,yes,northwest,24393.6224 +61,female,31.16,0,no,northwest,13429.0354 +56,female,28.785,0,no,northeast,11658.37915 +43,female,35.72,2,no,northeast,19144.57652 +64,male,34.5,0,no,southwest,13822.803 +60,male,25.74,0,no,southeast,12142.5786 +62,male,27.55,1,no,northwest,13937.6665 +50,male,32.3,1,yes,northeast,41919.097 +46,female,27.72,1,no,southeast,8232.6388 +24,female,27.6,0,no,southwest,18955.22017 +62,male,30.02,0,no,northwest,13352.0998 +60,female,27.55,0,no,northeast,13217.0945 +63,male,36.765,0,no,northeast,13981.85035 +49,female,41.47,4,no,southeast,10977.2063 +34,female,29.26,3,no,southeast,6184.2994 +33,male,35.75,2,no,southeast,4889.9995 +46,male,33.345,1,no,northeast,8334.45755 +36,female,29.92,1,no,southeast,5478.0368 +19,male,27.835,0,no,northwest,1635.73365 +57,female,23.18,0,no,northwest,11830.6072 +50,female,25.6,0,no,southwest,8932.084 +30,female,27.7,0,no,southwest,3554.203 +33,male,35.245,0,no,northeast,12404.8791 +18,female,38.28,0,no,southeast,14133.03775 +46,male,27.6,0,no,southwest,24603.04837 +46,male,43.89,3,no,southeast,8944.1151 +47,male,29.83,3,no,northwest,9620.3307 +23,male,41.91,0,no,southeast,1837.2819 +18,female,20.79,0,no,southeast,1607.5101 +48,female,32.3,2,no,northeast,10043.249 +35,male,30.5,1,no,southwest,4751.07 +19,female,21.7,0,yes,southwest,13844.506 +21,female,26.4,1,no,southwest,2597.779 +21,female,21.89,2,no,southeast,3180.5101 +49,female,30.78,1,no,northeast,9778.3472 +56,female,32.3,3,no,northeast,13430.265 +42,female,24.985,2,no,northwest,8017.06115 +44,male,32.015,2,no,northwest,8116.26885 +18,male,30.4,3,no,northeast,3481.868 +61,female,21.09,0,no,northwest,13415.0381 +57,female,22.23,0,no,northeast,12029.2867 +42,female,33.155,1,no,northeast,7639.41745 +26,male,32.9,2,yes,southwest,36085.219 +20,male,33.33,0,no,southeast,1391.5287 +23,female,28.31,0,yes,northwest,18033.9679 +39,female,24.89,3,yes,northeast,21659.9301 +24,male,40.15,0,yes,southeast,38126.2465 +64,female,30.115,3,no,northwest,16455.70785 +62,male,31.46,1,no,southeast,27000.98473 +27,female,17.955,2,yes,northeast,15006.57945 +55,male,30.685,0,yes,northeast,42303.69215 +55,male,33,0,no,southeast,20781.48892 +35,female,43.34,2,no,southeast,5846.9176 +44,male,22.135,2,no,northeast,8302.53565 +19,male,34.4,0,no,southwest,1261.859 +58,female,39.05,0,no,southeast,11856.4115 +50,male,25.365,2,no,northwest,30284.64294 +26,female,22.61,0,no,northwest,3176.8159 +24,female,30.21,3,no,northwest,4618.0799 +48,male,35.625,4,no,northeast,10736.87075 +19,female,37.43,0,no,northwest,2138.0707 +48,male,31.445,1,no,northeast,8964.06055 +49,male,31.35,1,no,northeast,9290.1395 +46,female,32.3,2,no,northeast,9411.005 +46,male,19.855,0,no,northwest,7526.70645 +43,female,34.4,3,no,southwest,8522.003 +21,male,31.02,0,no,southeast,16586.49771 +64,male,25.6,2,no,southwest,14988.432 +18,female,38.17,0,no,southeast,1631.6683 +51,female,20.6,0,no,southwest,9264.797 +47,male,47.52,1,no,southeast,8083.9198 +64,female,32.965,0,no,northwest,14692.66935 +49,male,32.3,3,no,northwest,10269.46 +31,male,20.4,0,no,southwest,3260.199 +52,female,38.38,2,no,northeast,11396.9002 +33,female,24.31,0,no,southeast,4185.0979 +47,female,23.6,1,no,southwest,8539.671 +38,male,21.12,3,no,southeast,6652.5288 +32,male,30.03,1,no,southeast,4074.4537 +19,male,17.48,0,no,northwest,1621.3402 +44,female,20.235,1,yes,northeast,19594.80965 +26,female,17.195,2,yes,northeast,14455.64405 +25,male,23.9,5,no,southwest,5080.096 +19,female,35.15,0,no,northwest,2134.9015 +43,female,35.64,1,no,southeast,7345.7266 +52,male,34.1,0,no,southeast,9140.951 +36,female,22.6,2,yes,southwest,18608.262 +64,male,39.16,1,no,southeast,14418.2804 +63,female,26.98,0,yes,northwest,28950.4692 +64,male,33.88,0,yes,southeast,46889.2612 +61,male,,0,yes,southeast,46599.1084 +40,male,32.775,1,yes,northeast,39125.33225 +25,male,30.59,0,no,northeast,2727.3951 +48,male,30.2,2,no,southwest,8968.33 +45,male,24.31,5,no,southeast,9788.8659 +38,female,27.265,1,no,northeast,6555.07035 +18,female,29.165,0,no,northeast,7323.734819 +21,female,16.815,1,no,northeast,3167.45585 +27,female,30.4,3,no,northwest,18804.7524 +19,male,33.1,0,no,southwest,23082.95533 +29,female,20.235,2,no,northwest,4906.40965 +42,male,26.9,0,no,southwest,5969.723 +60,female,30.5,0,no,southwest,12638.195 +31,male,28.595,1,no,northwest,4243.59005 +60,male,33.11,3,no,southeast,13919.8229 +22,male,31.73,0,no,northeast,2254.7967 +35,male,28.9,3,no,southwest,5926.846 +52,female,46.75,5,no,southeast,12592.5345 +26,male,29.45,0,no,northeast,2897.3235 +31,female,32.68,1,no,northwest,4738.2682 +33,female,33.5,0,yes,southwest,37079.372 +18,male,43.01,0,no,southeast,1149.3959 +59,female,36.52,1,no,southeast,28287.89766 +56,male,26.695,1,yes,northwest,26109.32905 +45,female,33.1,0,no,southwest,7345.084 +60,male,29.64,0,no,northeast,12730.9996 +56,female,25.65,0,no,northwest,11454.0215 +40,female,29.6,0,no,southwest,5910.944 +35,male,38.6,1,no,southwest,4762.329 +39,male,29.6,4,no,southwest,7512.267 +30,male,24.13,1,no,northwest,4032.2407 +24,male,23.4,0,no,southwest,1969.614 +20,male,29.735,0,no,northwest,1769.53165 +32,male,46.53,2,no,southeast,4686.3887 +59,male,37.4,0,no,southwest,21797.0004 +55,female,30.14,2,no,southeast,11881.9696 +57,female,30.495,0,no,northwest,11840.77505 +56,male,39.6,0,no,southwest,10601.412 +40,female,33,3,no,southeast,7682.67 +49,female,36.63,3,no,southeast,10381.4787 +42,male,30,0,yes,southwest,22144.032 +62,female,38.095,2,no,northeast,15230.32405 +56,male,25.935,0,no,northeast,11165.41765 +19,male,25.175,0,no,northwest,1632.03625 +30,female,28.38,1,yes,southeast,19521.9682 +60,female,28.7,1,no,southwest,13224.693 +56,female,33.82,2,no,northwest,12643.3778 +28,female,24.32,1,no,northeast,23288.9284 +18,female,24.09,1,no,southeast,2201.0971 +27,male,32.67,0,no,southeast,2497.0383 +18,female,30.115,0,no,northeast,2203.47185 +19,female,29.8,0,no,southwest,1744.465 +47,female,33.345,0,no,northeast,20878.78443 +54,male,25.1,3,yes,southwest,25382.297 +61,male,28.31,1,yes,northwest,28868.6639 +24,male,28.5,0,yes,northeast,35147.52848 +25,male,35.625,0,no,northwest,2534.39375 +21,male,36.85,0,no,southeast,1534.3045 +23,male,32.56,0,no,southeast,1824.2854 +63,male,41.325,3,no,northwest,15555.18875 +49,male,37.51,2,no,southeast,9304.7019 +18,female,31.35,0,no,southeast,1622.1885 +51,female,39.5,1,no,southwest,9880.068 +48,male,34.3,3,no,southwest,9563.029 +31,female,31.065,0,no,northeast,4347.02335 +54,female,21.47,3,no,northwest,12475.3513 +19,male,28.7,0,no,southwest,1253.936 +44,female,38.06,0,yes,southeast,48885.13561 +53,male,31.16,1,no,northwest,10461.9794 +19,female,32.9,0,no,southwest,1748.774 +61,female,25.08,0,no,southeast,24513.09126 +18,female,25.08,0,no,northeast,2196.4732 +61,male,43.4,0,no,southwest,12574.049 +21,male,25.7,4,yes,southwest,17942.106 +20,male,27.93,0,no,northeast,1967.0227 +31,female,23.6,2,no,southwest,4931.647 +45,male,28.7,2,no,southwest,8027.968 +44,female,23.98,2,no,southeast,8211.1002 +62,female,39.2,0,no,southwest,13470.86 +29,male,34.4,0,yes,southwest,36197.699 +43,male,26.03,0,no,northeast,6837.3687 +51,male,23.21,1,yes,southeast,22218.1149 +19,male,30.25,0,yes,southeast,32548.3405 +38,female,28.93,1,no,southeast,5974.3847 +37,male,30.875,3,no,northwest,6796.86325 +22,male,31.35,1,no,northwest,2643.2685 +21,male,23.75,2,no,northwest,3077.0955 +24,female,25.27,0,no,northeast,3044.2133 +57,female,28.7,0,no,southwest,11455.28 +56,male,32.11,1,no,northeast,11763.0009 +27,male,33.66,0,no,southeast,2498.4144 +51,male,22.42,0,no,northeast,9361.3268 +19,male,30.4,0,no,southwest,1256.299 +39,male,28.3,1,yes,southwest,21082.16 +58,male,35.7,0,no,southwest,11362.755 +20,male,35.31,1,no,southeast,27724.28875 +45,male,30.495,2,no,northwest,8413.46305 +35,female,31,1,no,southwest,5240.765 +31,male,30.875,0,no,northeast,3857.75925 +50,female,27.36,0,no,northeast,25656.57526 +32,female,44.22,0,no,southeast,3994.1778 +51,female,33.915,0,no,northeast,9866.30485 +38,female,37.73,0,no,southeast,5397.6167 +42,male,26.07,1,yes,southeast,38245.59327 +18,female,33.88,0,no,southeast,11482.63485 +19,female,30.59,2,no,northwest,24059.68019 +51,female,25.8,1,no,southwest,9861.025 +46,male,39.425,1,no,northeast,8342.90875 +18,male,25.46,0,no,northeast,1708.0014 +57,male,42.13,1,yes,southeast,48675.5177 +62,female,31.73,0,no,northeast,14043.4767 +59,male,29.7,2,no,southeast,12925.886 +37,male,36.19,0,no,southeast,19214.70553 +64,male,40.48,0,no,southeast,13831.1152 +38,male,28.025,1,no,northeast,6067.12675 +33,female,38.9,3,no,southwest,5972.378 +46,female,30.2,2,no,southwest,8825.086 +46,female,28.05,1,no,southeast,8233.0975 +53,male,31.35,0,no,southeast,27346.04207 +34,female,38,3,no,southwest,6196.448 +20,female,31.79,2,no,southeast,3056.3881 +63,female,36.3,0,no,southeast,13887.204 +54,female,47.41,0,yes,southeast,63770.42801 +54,male,30.21,0,no,northwest,10231.4999 +49,male,,2,yes,northwest,23807.2406 +28,male,35.435,0,no,northeast,3268.84665 +54,female,46.7,2,no,southwest,11538.421 +25,female,28.595,0,no,northeast,3213.62205 +43,female,46.2,0,yes,southeast,45863.205 +63,male,30.8,0,no,southwest,13390.559 +32,female,28.93,0,no,southeast,3972.9247 +62,male,21.4,0,no,southwest,12957.118 +52,female,31.73,2,no,northwest,11187.6567 +25,female,41.325,0,no,northeast,17878.90068 +28,male,23.8,2,no,southwest,3847.674 +46,male,33.44,1,no,northeast,8334.5896 +34,male,34.21,0,no,southeast,3935.1799 +35,female,34.105,3,yes,northwest,39983.42595 +19,male,35.53,0,no,northwest,1646.4297 +46,female,19.95,2,no,northwest,9193.8385 +54,female,32.68,0,no,northeast,10923.9332 +27,male,30.5,0,no,southwest,2494.022 +50,male,44.77,1,no,southeast,9058.7303 +18,female,32.12,2,no,southeast,2801.2588 +19,female,30.495,0,no,northwest,2128.43105 +38,female,40.565,1,no,northwest,6373.55735 +41,male,30.59,2,no,northwest,7256.7231 +49,female,31.9,5,no,southwest,11552.904 +48,male,40.565,2,yes,northwest,45702.02235 +31,female,29.1,0,no,southwest,3761.292 +18,female,37.29,1,no,southeast,2219.4451 +30,female,43.12,2,no,southeast,4753.6368 +62,female,36.86,1,no,northeast,31620.00106 +57,female,34.295,2,no,northeast,13224.05705 +58,female,27.17,0,no,northwest,12222.8983 +22,male,26.84,0,no,southeast,1664.9996 +31,female,38.095,1,yes,northeast,58571.07448 +52,male,30.2,1,no,southwest,9724.53 +25,female,23.465,0,no,northeast,3206.49135 +59,male,25.46,1,no,northeast,12913.9924 +19,male,30.59,0,no,northwest,1639.5631 +39,male,45.43,2,no,southeast,6356.2707 +32,female,23.65,1,no,southeast,17626.23951 +19,male,20.7,0,no,southwest,1242.816 +33,female,28.27,1,no,southeast,4779.6023 +21,male,20.235,3,no,northeast,3861.20965 +34,female,30.21,1,yes,northwest,43943.8761 +61,female,35.91,0,no,northeast,13635.6379 +38,female,30.69,1,no,southeast,5976.8311 +58,female,29,0,no,southwest,11842.442 +47,male,19.57,1,no,northwest,8428.0693 +20,male,31.13,2,no,southeast,2566.4707 +21,female,21.85,1,yes,northeast,15359.1045 +41,male,40.26,0,no,southeast,5709.1644 +46,female,33.725,1,no,northeast,8823.98575 +42,female,29.48,2,no,southeast,7640.3092 +34,female,33.25,1,no,northeast,5594.8455 +43,male,32.6,2,no,southwest,7441.501 +52,female,37.525,2,no,northwest,33471.97189 +18,female,39.16,0,no,southeast,1633.0444 +51,male,31.635,0,no,northwest,9174.13565 +56,female,25.3,0,no,southwest,11070.535 +64,female,39.05,3,no,southeast,16085.1275 +19,female,28.31,0,yes,northwest,17468.9839 +51,female,34.1,0,no,southeast,9283.562 +27,female,25.175,0,no,northeast,3558.62025 +59,female,23.655,0,yes,northwest,25678.77845 +28,male,26.98,2,no,northeast,4435.0942 +30,male,37.8,2,yes,southwest,39241.442 +47,female,29.37,1,no,southeast,8547.6913 +38,female,34.8,2,no,southwest,6571.544 +18,female,33.155,0,no,northeast,2207.69745 +34,female,19,3,no,northeast,6753.038 +20,female,33,0,no,southeast,1880.07 +47,female,36.63,1,yes,southeast,42969.8527 +56,female,28.595,0,no,northeast,11658.11505 +49,male,25.6,2,yes,southwest,23306.547 +19,female,33.11,0,yes,southeast,34439.8559 +55,female,37.1,0,no,southwest,10713.644 +30,male,31.4,1,no,southwest,3659.346 +37,male,34.1,4,yes,southwest,40182.246 +49,female,21.3,1,no,southwest,9182.17 +18,male,33.535,0,yes,northeast,34617.84065 +59,male,28.785,0,no,northwest,12129.61415 +29,female,26.03,0,no,northwest,3736.4647 +36,male,28.88,3,no,northeast,6748.5912 +33,male,42.46,1,no,southeast,11326.71487 +58,male,38,0,no,southwest,11365.952 +44,female,38.95,0,yes,northwest,42983.4585 +53,male,36.1,1,no,southwest,10085.846 +24,male,29.3,0,no,southwest,1977.815 +29,female,35.53,0,no,southeast,3366.6697 +40,male,22.705,2,no,northeast,7173.35995 +51,male,39.7,1,no,southwest,9391.346 +64,male,38.19,0,no,northeast,14410.9321 +19,female,24.51,1,no,northwest,2709.1119 +35,female,38.095,2,no,northeast,24915.04626 +39,male,26.41,0,yes,northeast,20149.3229 +56,male,33.66,4,no,southeast,12949.1554 +33,male,42.4,5,no,southwest,6666.243 +42,male,28.31,3,yes,northwest,32787.45859 +61,male,33.915,0,no,northeast,13143.86485 +23,female,34.96,3,no,northwest,4466.6214 +43,male,35.31,2,no,southeast,18806.14547 +48,male,30.78,3,no,northeast,10141.1362 +39,male,26.22,1,no,northwest,6123.5688 +40,female,23.37,3,no,northeast,8252.2843 +18,male,28.5,0,no,northeast,1712.227 +58,female,32.965,0,no,northeast,12430.95335 +49,female,42.68,2,no,southeast,9800.8882 +53,female,39.6,1,no,southeast,10579.711 +48,female,31.13,0,no,southeast,8280.6227 +45,female,36.3,2,no,southeast,8527.532 +59,female,35.2,0,no,southeast,12244.531 +52,female,25.3,2,yes,southeast,24667.419 +26,female,42.4,1,no,southwest,3410.324 +27,male,33.155,2,no,northwest,4058.71245 +48,female,35.91,1,no,northeast,26392.26029 +57,female,28.785,4,no,northeast,14394.39815 +37,male,46.53,3,no,southeast,6435.6237 +57,female,23.98,1,no,southeast,22192.43711 +32,female,31.54,1,no,northeast,5148.5526 +18,male,33.66,0,no,southeast,1136.3994 +64,female,22.99,0,yes,southeast,27037.9141 +43,male,38.06,2,yes,southeast,42560.4304 +49,male,28.7,1,no,southwest,8703.456 +40,female,32.775,2,yes,northwest,40003.33225 +62,male,32.015,0,yes,northeast,45710.20785 +40,female,29.81,1,no,southeast,6500.2359 +30,male,31.57,3,no,southeast,4837.5823 +29,female,31.16,0,no,northeast,3943.5954 +36,male,29.7,0,no,southeast,4399.731 +41,female,31.02,0,no,southeast,6185.3208 +44,female,43.89,2,yes,southeast,46200.9851 +45,male,21.375,0,no,northwest,7222.78625 +55,female,40.81,3,no,southeast,12485.8009 +60,male,31.35,3,yes,northwest,46130.5265 +56,male,36.1,3,no,southwest,12363.547 +49,female,23.18,2,no,northwest,10156.7832 +21,female,17.4,1,no,southwest,2585.269 +19,male,20.3,0,no,southwest,1242.26 +39,male,35.3,2,yes,southwest,40103.89 +53,male,24.32,0,no,northwest,9863.4718 +33,female,18.5,1,no,southwest,4766.022 +53,male,26.41,2,no,northeast,11244.3769 +42,male,26.125,2,no,northeast,7729.64575 +40,male,41.69,0,no,southeast,5438.7491 +47,female,24.1,1,no,southwest,26236.57997 +27,male,31.13,1,yes,southeast,34806.4677 +21,male,27.36,0,no,northeast,2104.1134 +47,male,36.2,1,no,southwest,8068.185 +20,male,32.395,1,no,northwest,2362.22905 +24,male,23.655,0,no,northwest,2352.96845 +27,female,34.8,1,no,southwest,3577.999 +26,female,40.185,0,no,northwest,3201.24515 +53,female,32.3,2,no,northeast,29186.48236 +41,male,35.75,1,yes,southeast,40273.6455 +56,male,33.725,0,no,northwest,10976.24575 +23,female,39.27,2,no,southeast,3500.6123 +21,female,34.87,0,no,southeast,2020.5523 +50,female,44.745,0,no,northeast,9541.69555 +53,male,41.47,0,no,southeast,9504.3103 +34,female,26.41,1,no,northwest,5385.3379 +47,female,29.545,1,no,northwest,8930.93455 +33,female,32.9,2,no,southwest,5375.038 +51,female,38.06,0,yes,southeast,44400.4064 +49,male,28.69,3,no,northwest,10264.4421 +31,female,30.495,3,no,northeast,6113.23105 +36,female,27.74,0,no,northeast,5469.0066 +18,male,35.2,1,no,southeast,1727.54 +50,female,23.54,2,no,southeast,10107.2206 +43,female,30.685,2,no,northwest,8310.83915 +20,male,40.47,0,no,northeast,1984.4533 +24,female,22.6,0,no,southwest,2457.502 +60,male,28.9,0,no,southwest,12146.971 +49,female,22.61,1,no,northwest,9566.9909 +60,male,24.32,1,no,northwest,13112.6048 +51,female,36.67,2,no,northwest,10848.1343 +58,female,33.44,0,no,northwest,12231.6136 +51,female,40.66,0,no,northeast,9875.6804 +53,male,36.6,3,no,southwest,11264.541 +62,male,37.4,0,no,southwest,12979.358 +19,male,35.4,0,no,southwest,1263.249 +50,female,27.075,1,no,northeast,10106.13425 +30,female,39.05,3,yes,southeast,40932.4295 +41,male,28.405,1,no,northwest,6664.68595 +29,female,,1,yes,northeast,16657.71745 +18,female,40.28,0,no,northeast,2217.6012 +41,female,36.08,1,no,southeast,6781.3542 +35,male,24.42,3,yes,southeast,19361.9988 +53,male,21.4,1,no,southwest,10065.413 +24,female,30.1,3,no,southwest,4234.927 +48,female,27.265,1,no,northeast,9447.25035 +59,female,32.1,3,no,southwest,14007.222 +49,female,34.77,1,no,northwest,9583.8933 +37,female,38.39,0,yes,southeast,40419.0191 +26,male,23.7,2,no,southwest,3484.331 +23,male,31.73,3,yes,northeast,36189.1017 +29,male,35.5,2,yes,southwest,44585.45587 +45,male,24.035,2,no,northeast,8604.48365 +27,male,29.15,0,yes,southeast,18246.4955 +53,male,34.105,0,yes,northeast,43254.41795 +31,female,26.62,0,no,southeast,3757.8448 +50,male,26.41,0,no,northwest,8827.2099 +50,female,30.115,1,no,northwest,9910.35985 +34,male,27,2,no,southwest,11737.84884 +19,male,21.755,0,no,northwest,1627.28245 +47,female,36,1,no,southwest,8556.907 +28,male,30.875,0,no,northwest,3062.50825 +37,female,26.4,0,yes,southeast,19539.243 +21,male,28.975,0,no,northwest,1906.35825 +64,male,37.905,0,no,northwest,14210.53595 +58,female,22.77,0,no,southeast,11833.7823 +24,male,33.63,4,no,northeast,17128.42608 +31,male,27.645,2,no,northeast,5031.26955 +39,female,22.8,3,no,northeast,7985.815 +47,female,27.83,0,yes,southeast,23065.4207 +30,male,37.43,3,no,northeast,5428.7277 +18,male,38.17,0,yes,southeast,36307.7983 +22,female,34.58,2,no,northeast,3925.7582 +23,male,35.2,1,no,southwest,2416.955 +33,male,27.1,1,yes,southwest,19040.876 +27,male,26.03,0,no,northeast,3070.8087 +45,female,25.175,2,no,northeast,9095.06825 +57,female,31.825,0,no,northwest,11842.62375 +47,male,32.3,1,no,southwest,8062.764 +42,female,29,1,no,southwest,7050.642 +64,female,39.7,0,no,southwest,14319.031 +38,female,19.475,2,no,northwest,6933.24225 +61,male,36.1,3,no,southwest,27941.28758 +53,female,26.7,2,no,southwest,11150.78 +44,female,36.48,0,no,northeast,12797.20962 +19,female,28.88,0,yes,northwest,17748.5062 +41,male,34.2,2,no,northwest,7261.741 +51,male,33.33,3,no,southeast,10560.4917 +40,male,32.3,2,no,northwest,6986.697 +45,male,39.805,0,no,northeast,7448.40395 +35,male,34.32,3,no,southeast,5934.3798 +53,male,28.88,0,no,northwest,9869.8102 +30,male,24.4,3,yes,southwest,18259.216 +18,male,41.14,0,no,southeast,1146.7966 +51,male,35.97,1,no,southeast,9386.1613 +50,female,27.6,1,yes,southwest,24520.264 +31,female,29.26,1,no,southeast,4350.5144 +35,female,27.7,3,no,southwest,6414.178 +60,male,36.955,0,no,northeast,12741.16745 +21,male,36.86,0,no,northwest,1917.3184 +29,male,22.515,3,no,northeast,5209.57885 +62,female,29.92,0,no,southeast,13457.9608 +39,female,41.8,0,no,southeast,5662.225 +19,male,27.6,0,no,southwest,1252.407 +22,female,23.18,0,no,northeast,2731.9122 +53,male,20.9,0,yes,southeast,21195.818 +39,female,31.92,2,no,northwest,7209.4918 +27,male,28.5,0,yes,northwest,18310.742 +30,male,44.22,2,no,southeast,4266.1658 +30,female,22.895,1,no,northeast,4719.52405 +58,female,33.1,0,no,southwest,11848.141 +33,male,24.795,0,yes,northeast,17904.52705 +42,female,26.18,1,no,southeast,7046.7222 +64,female,35.97,0,no,southeast,14313.8463 +21,male,22.3,1,no,southwest,2103.08 +18,female,42.24,0,yes,southeast,38792.6856 +23,male,26.51,0,no,southeast,1815.8759 +45,female,35.815,0,no,northwest,7731.85785 +40,female,41.42,1,no,northwest,28476.73499 +19,female,36.575,0,no,northwest,2136.88225 +18,male,30.14,0,no,southeast,1131.5066 +25,male,25.84,1,no,northeast,3309.7926 +46,female,30.8,3,no,southwest,9414.92 +33,female,42.94,3,no,northwest,6360.9936 +54,male,21.01,2,no,southeast,11013.7119 +28,male,22.515,2,no,northeast,4428.88785 +36,male,34.43,2,no,southeast,5584.3057 +20,female,31.46,0,no,southeast,1877.9294 +24,female,24.225,0,no,northwest,2842.76075 +23,male,37.1,3,no,southwest,3597.596 +47,female,26.125,1,yes,northeast,23401.30575 +33,female,35.53,0,yes,northwest,55135.40209 +45,male,33.7,1,no,southwest,7445.918 +26,male,17.67,0,no,northwest,2680.9493 +18,female,31.13,0,no,southeast,1621.8827 +44,female,29.81,2,no,southeast,8219.2039 +60,male,24.32,0,no,northwest,12523.6048 +64,female,31.825,2,no,northeast,16069.08475 +56,male,31.79,2,yes,southeast,43813.8661 +36,male,28.025,1,yes,northeast,20773.62775 +41,male,30.78,3,yes,northeast,39597.4072 +39,male,21.85,1,no,northwest,6117.4945 +63,male,33.1,0,no,southwest,13393.756 +36,female,25.84,0,no,northwest,5266.3656 +28,female,23.845,2,no,northwest,4719.73655 +58,male,34.39,0,no,northwest,11743.9341 +36,male,33.82,1,no,northwest,5377.4578 +42,male,35.97,2,no,southeast,7160.3303 +36,male,31.5,0,no,southwest,4402.233 +56,female,28.31,0,no,northeast,11657.7189 +35,female,23.465,2,no,northeast,6402.29135 +59,female,31.35,0,no,northwest,12622.1795 +21,male,31.1,0,no,southwest,1526.312 +59,male,24.7,0,no,northeast,12323.936 +23,female,32.78,2,yes,southeast,36021.0112 +57,female,29.81,0,yes,southeast,27533.9129 +53,male,30.495,0,no,northeast,10072.05505 +60,female,32.45,0,yes,southeast,45008.9555 +51,female,34.2,1,no,southwest,9872.701 +23,male,50.38,1,no,southeast,2438.0552 +27,female,24.1,0,no,southwest,2974.126 +55,male,32.775,0,no,northwest,10601.63225 +37,female,30.78,0,yes,northeast,37270.1512 +61,male,32.3,2,no,northwest,14119.62 +46,female,35.53,0,yes,northeast,42111.6647 +53,female,23.75,2,no,northeast,11729.6795 +49,female,23.845,3,yes,northeast,24106.91255 +20,female,29.6,0,no,southwest,1875.344 +48,female,33.11,0,yes,southeast,40974.1649 +25,male,24.13,0,yes,northwest,15817.9857 +25,female,32.23,1,no,southeast,18218.16139 +57,male,28.1,0,no,southwest,10965.446 +37,female,47.6,2,yes,southwest,46113.511 +38,female,28,3,no,southwest,7151.092 +55,female,33.535,2,no,northwest,12269.68865 +36,female,19.855,0,no,northeast,5458.04645 +51,male,25.4,0,no,southwest,8782.469 +40,male,29.9,2,no,southwest,6600.361 +18,male,37.29,0,no,southeast,1141.4451 +57,male,43.7,1,no,southwest,11576.13 +61,male,23.655,0,no,northeast,13129.60345 +25,female,24.3,3,no,southwest,4391.652 +50,male,36.2,0,no,southwest,8457.818 +26,female,29.48,1,no,southeast,3392.3652 +42,male,24.86,0,no,southeast,5966.8874 +43,male,30.1,1,no,southwest,6849.026 +44,male,21.85,3,no,northeast,8891.1395 +23,female,28.12,0,no,northwest,2690.1138 +49,female,27.1,1,no,southwest,26140.3603 +33,male,33.44,5,no,southeast,6653.7886 +41,male,28.8,1,no,southwest,6282.235 +37,female,29.5,2,no,southwest,6311.952 +22,male,34.8,3,no,southwest,3443.064 +23,male,27.36,1,no,northwest,2789.0574 +21,female,22.135,0,no,northeast,2585.85065 +51,female,37.05,3,yes,northeast,46255.1125 +25,male,26.695,4,no,northwest,4877.98105 +32,male,28.93,1,yes,southeast,19719.6947 +57,male,28.975,0,yes,northeast,27218.43725 +36,female,30.02,0,no,northwest,5272.1758 +22,male,39.5,0,no,southwest,1682.597 +57,male,33.63,1,no,northwest,11945.1327 +64,female,26.885,0,yes,northwest,29330.98315 +36,female,29.04,4,no,southeast,7243.8136 +54,male,24.035,0,no,northeast,10422.91665 +47,male,38.94,2,yes,southeast,44202.6536 +62,male,32.11,0,no,northeast,13555.0049 +61,female,44,0,no,southwest,13063.883 +43,female,20.045,2,yes,northeast,19798.05455 +19,male,25.555,1,no,northwest,2221.56445 +18,female,40.26,0,no,southeast,1634.5734 +19,female,22.515,0,no,northwest,2117.33885 +49,male,22.515,0,no,northeast,8688.85885 +60,male,40.92,0,yes,southeast,48673.5588 +26,male,27.265,3,no,northeast,4661.28635 +49,male,36.85,0,no,southeast,8125.7845 +60,female,35.1,0,no,southwest,12644.589 +26,female,29.355,2,no,northeast,4564.19145 +27,male,32.585,3,no,northeast,4846.92015 +44,female,32.34,1,no,southeast,7633.7206 +63,male,39.8,3,no,southwest,15170.069 +32,female,24.6,0,yes,southwest,17496.306 +22,male,28.31,1,no,northwest,2639.0429 +18,male,31.73,0,yes,northeast,33732.6867 +59,female,26.695,3,no,northwest,14382.70905 +44,female,27.5,1,no,southwest,7626.993 +33,male,24.605,2,no,northwest,5257.50795 +24,female,33.99,0,no,southeast,2473.3341 +43,female,26.885,0,yes,northwest,21774.32215 +45,male,22.895,0,yes,northeast,35069.37452 +61,female,28.2,0,no,southwest,13041.921 +35,female,34.21,1,no,southeast,5245.2269 +62,female,25,0,no,southwest,13451.122 +62,female,33.2,0,no,southwest,13462.52 +38,male,31,1,no,southwest,5488.262 +34,male,35.815,0,no,northwest,4320.41085 +43,male,23.2,0,no,southwest,6250.435 +50,male,32.11,2,no,northeast,25333.33284 +19,female,23.4,2,no,southwest,2913.569 +57,female,20.1,1,no,southwest,12032.326 +62,female,39.16,0,no,southeast,13470.8044 +41,male,34.21,1,no,southeast,6289.7549 +26,male,46.53,1,no,southeast,2927.0647 +39,female,32.5,1,no,southwest,6238.298 +46,male,25.8,5,no,southwest,10096.97 +45,female,35.3,0,no,southwest,7348.142 +32,male,37.18,2,no,southeast,4673.3922 +59,female,27.5,0,no,southwest,12233.828 +44,male,29.735,2,no,northeast,32108.66282 +39,female,24.225,5,no,northwest,8965.79575 +18,male,26.18,2,no,southeast,2304.0022 +53,male,29.48,0,no,southeast,9487.6442 +18,male,23.21,0,no,southeast,1121.8739 +50,female,46.09,1,no,southeast,9549.5651 +18,female,40.185,0,no,northeast,2217.46915 +19,male,22.61,0,no,northwest,1628.4709 +62,male,39.93,0,no,southeast,12982.8747 +56,female,35.8,1,no,southwest,11674.13 +42,male,35.8,2,no,southwest,7160.094 +37,male,34.2,1,yes,northeast,39047.285 +42,male,31.255,0,no,northwest,6358.77645 +25,male,29.7,3,yes,southwest,19933.458 +57,male,18.335,0,no,northeast,11534.87265 +51,male,42.9,2,yes,southeast,47462.894 +30,female,28.405,1,no,northwest,4527.18295 +44,male,30.2,2,yes,southwest,38998.546 +34,male,27.835,1,yes,northwest,20009.63365 +31,male,39.49,1,no,southeast,3875.7341 +54,male,30.8,1,yes,southeast,41999.52 +24,male,26.79,1,no,northwest,12609.88702 +43,male,34.96,1,yes,northeast,41034.2214 +48,male,36.67,1,no,northwest,28468.91901 +19,female,39.615,1,no,northwest,2730.10785 +29,female,25.9,0,no,southwest,3353.284 +63,female,35.2,1,no,southeast,14474.675 +46,male,24.795,3,no,northeast,9500.57305 +52,male,36.765,2,no,northwest,26467.09737 +35,male,27.1,1,no,southwest,4746.344 +51,male,24.795,2,yes,northwest,23967.38305 +44,male,25.365,1,no,northwest,7518.02535 +21,male,25.745,2,no,northeast,3279.86855 +39,female,34.32,5,no,southeast,8596.8278 +50,female,28.16,3,no,southeast,10702.6424 +34,female,23.56,0,no,northeast,4992.3764 +22,female,20.235,0,no,northwest,2527.81865 +19,female,40.5,0,no,southwest,1759.338 +26,male,35.42,0,no,southeast,2322.6218 +29,male,22.895,0,yes,northeast,16138.76205 +48,male,40.15,0,no,southeast,7804.1605 +26,male,29.15,1,no,southeast,2902.9065 +45,female,39.995,3,no,northeast,9704.66805 +36,female,29.92,0,no,southeast,4889.0368 +54,male,25.46,1,no,northeast,25517.11363 +34,male,21.375,0,no,northeast,4500.33925 +31,male,25.9,3,yes,southwest,19199.944 +27,female,30.59,1,no,northeast,16796.41194 +20,male,30.115,5,no,northeast,4915.05985 +44,female,25.8,1,no,southwest,7624.63 +43,male,30.115,3,no,northwest,8410.04685 +45,female,27.645,1,no,northwest,28340.18885 +34,male,34.675,0,no,northeast,4518.82625 +24,female,20.52,0,yes,northeast,14571.8908 +26,female,19.8,1,no,southwest,3378.91 +38,female,27.835,2,no,northeast,7144.86265 +50,female,31.6,2,no,southwest,10118.424 +38,male,28.27,1,no,southeast,5484.4673 +27,female,20.045,3,yes,northwest,16420.49455 +39,female,23.275,3,no,northeast,7986.47525 +39,female,34.1,3,no,southwest,7418.522 +63,female,36.85,0,no,southeast,13887.9685 +33,female,36.29,3,no,northeast,6551.7501 +36,female,26.885,0,no,northwest,5267.81815 +30,male,22.99,2,yes,northwest,17361.7661 +24,male,32.7,0,yes,southwest,34472.841 +24,male,25.8,0,no,southwest,1972.95 +48,male,29.6,0,no,southwest,21232.18226 +47,male,19.19,1,no,northeast,8627.5411 +29,male,31.73,2,no,northwest,4433.3877 +28,male,29.26,2,no,northeast,4438.2634 +47,male,28.215,3,yes,northwest,24915.22085 +25,male,24.985,2,no,northeast,23241.47453 +51,male,27.74,1,no,northeast,9957.7216 +48,female,22.8,0,no,southwest,8269.044 +43,male,20.13,2,yes,southeast,18767.7377 +61,female,33.33,4,no,southeast,36580.28216 +48,male,32.3,1,no,northwest,8765.249 +38,female,27.6,0,no,southwest,5383.536 +59,male,25.46,0,no,northwest,12124.9924 +19,female,24.605,1,no,northwest,2709.24395 +26,female,34.2,2,no,southwest,3987.926 +54,female,35.815,3,no,northwest,12495.29085 +21,female,32.68,2,no,northwest,26018.95052 +51,male,37,0,no,southwest,8798.593 +22,female,31.02,3,yes,southeast,35595.5898 +47,male,36.08,1,yes,southeast,42211.1382 +18,male,23.32,1,no,southeast,1711.0268 +47,female,45.32,1,no,southeast,8569.8618 +21,female,34.6,0,no,southwest,2020.177 +19,male,26.03,1,yes,northwest,16450.8947 +23,male,18.715,0,no,northwest,21595.38229 +54,male,31.6,0,no,southwest,9850.432 +37,female,17.29,2,no,northeast,6877.9801 +46,female,23.655,1,yes,northwest,21677.28345 +55,female,35.2,0,yes,southeast,44423.803 +30,female,27.93,0,no,northeast,4137.5227 +18,male,21.565,0,yes,northeast,13747.87235 +61,male,38.38,0,no,northwest,12950.0712 +54,female,23,3,no,southwest,12094.478 +22,male,37.07,2,yes,southeast,37484.4493 +45,female,30.495,1,yes,northwest,39725.51805 +22,male,28.88,0,no,northeast,2250.8352 +19,male,27.265,2,no,northwest,22493.65964 +35,female,28.025,0,yes,northwest,20234.85475 +18,male,23.085,0,no,northeast,1704.70015 +20,male,30.685,0,yes,northeast,33475.81715 +28,female,25.8,0,no,southwest,3161.454 +55,male,35.245,1,no,northeast,11394.06555 +43,female,24.7,2,yes,northwest,21880.82 +43,female,25.08,0,no,northeast,7325.0482 +22,male,52.58,1,yes,southeast,44501.3982 +25,female,22.515,1,no,northwest,3594.17085 +49,male,30.9,0,yes,southwest,39727.614 +44,female,36.955,1,no,northwest,8023.13545 +64,male,26.41,0,no,northeast,14394.5579 +49,male,29.83,1,no,northeast,9288.0267 +47,male,29.8,3,yes,southwest,25309.489 +27,female,21.47,0,no,northwest,3353.4703 +55,male,27.645,0,no,northwest,10594.50155 +48,female,28.9,0,no,southwest,8277.523 +45,female,31.79,0,no,southeast,17929.30337 +24,female,39.49,0,no,southeast,2480.9791 +32,male,33.82,1,no,northwest,4462.7218 +24,male,32.01,0,no,southeast,1981.5819 +57,male,27.94,1,no,southeast,11554.2236 +59,male,41.14,1,yes,southeast,48970.2476 +36,male,28.595,3,no,northwest,6548.19505 +29,female,25.6,4,no,southwest,5708.867 +42,female,25.3,1,no,southwest,7045.499 +48,male,37.29,2,no,southeast,8978.1851 +39,male,42.655,0,no,northeast,5757.41345 +63,male,21.66,1,no,northwest,14349.8544 +54,female,31.9,1,no,southeast,10928.849 +37,male,37.07,1,yes,southeast,39871.7043 +63,male,31.445,0,no,northeast,13974.45555 +21,male,31.255,0,no,northwest,1909.52745 +54,female,28.88,2,no,northeast,12096.6512 +60,female,18.335,0,no,northeast,13204.28565 +32,female,29.59,1,no,southeast,4562.8421 +47,female,32,1,no,southwest,8551.347 +21,male,26.03,0,no,northeast,2102.2647 +28,male,31.68,0,yes,southeast,34672.1472 +63,male,33.66,3,no,southeast,15161.5344 +18,male,21.78,2,no,southeast,11884.04858 +32,male,27.835,1,no,northwest,4454.40265 +38,male,19.95,1,no,northwest,5855.9025 +32,male,31.5,1,no,southwest,4076.497 +62,female,30.495,2,no,northwest,15019.76005 +39,female,18.3,5,yes,southwest,19023.26 +55,male,28.975,0,no,northeast,10796.35025 +57,male,31.54,0,no,northwest,11353.2276 +52,male,47.74,1,no,southeast,9748.9106 +56,male,22.1,0,no,southwest,10577.087 +47,male,36.19,0,yes,southeast,41676.0811 +55,female,29.83,0,no,northeast,11286.5387 +23,male,32.7,3,no,southwest,3591.48 +22,female,30.4,0,yes,northwest,33907.548 +50,female,33.7,4,no,southwest,11299.343 +18,female,31.35,4,no,northeast,4561.1885 +51,female,34.96,2,yes,northeast,44641.1974 +22,male,33.77,0,no,southeast,1674.6323 +52,female,30.875,0,no,northeast,23045.56616 +25,female,33.99,1,no,southeast,3227.1211 +33,female,19.095,2,yes,northeast,16776.30405 +53,male,28.6,3,no,southwest,11253.421 +29,male,38.94,1,no,southeast,3471.4096 +58,male,36.08,0,no,southeast,11363.2832 +37,male,29.8,0,no,southwest,20420.60465 +54,female,31.24,0,no,southeast,10338.9316 +49,female,29.925,0,no,northwest,8988.15875 +50,female,26.22,2,no,northwest,10493.9458 +26,male,30,1,no,southwest,2904.088 +45,male,20.35,3,no,southeast,8605.3615 +54,female,32.3,1,no,northeast,11512.405 +38,male,38.39,3,yes,southeast,41949.2441 +48,female,25.85,3,yes,southeast,24180.9335 +28,female,26.315,3,no,northwest,5312.16985 +23,male,24.51,0,no,northeast,2396.0959 +55,male,32.67,1,no,southeast,10807.4863 +41,male,29.64,5,no,northeast,9222.4026 +25,male,33.33,2,yes,southeast,36124.5737 +33,male,35.75,1,yes,southeast,38282.7495 +30,female,19.95,3,no,northwest,5693.4305 +23,female,31.4,0,yes,southwest,34166.273 +46,male,38.17,2,no,southeast,8347.1643 +53,female,36.86,3,yes,northwest,46661.4424 +27,female,32.395,1,no,northeast,18903.49141 +23,female,42.75,1,yes,northeast,40904.1995 +63,female,25.08,0,no,northwest,14254.6082 +55,male,29.9,0,no,southwest,10214.636 +35,female,35.86,2,no,southeast,5836.5204 +34,male,32.8,1,no,southwest,14358.36437 +19,female,18.6,0,no,southwest,1728.897 +39,female,23.87,5,no,southeast,8582.3023 +27,male,45.9,2,no,southwest,3693.428 +57,male,40.28,0,no,northeast,20709.02034 +52,female,18.335,0,no,northwest,9991.03765 +28,male,33.82,0,no,northwest,19673.33573 +50,female,28.12,3,no,northwest,11085.5868 +44,female,25,1,no,southwest,7623.518 +26,female,22.23,0,no,northwest,3176.2877 +33,male,30.25,0,no,southeast,3704.3545 +19,female,32.49,0,yes,northwest,36898.73308 +50,male,37.07,1,no,southeast,9048.0273 +41,female,32.6,3,no,southwest,7954.517 +52,female,24.86,0,no,southeast,27117.99378 +39,male,32.34,2,no,southeast,6338.0756 +50,male,32.3,2,no,southwest,9630.397 +52,male,32.775,3,no,northwest,11289.10925 +60,male,32.8,0,yes,southwest,52590.82939 +20,female,31.92,0,no,northwest,2261.5688 +55,male,21.5,1,no,southwest,10791.96 +42,male,34.1,0,no,southwest,5979.731 +18,female,30.305,0,no,northeast,2203.73595 +58,female,36.48,0,no,northwest,12235.8392 +43,female,32.56,3,yes,southeast,40941.2854 +35,female,35.815,1,no,northwest,5630.45785 +48,female,27.93,4,no,northwest,11015.1747 +36,female,22.135,3,no,northeast,7228.21565 +19,male,44.88,0,yes,southeast,39722.7462 +23,female,23.18,2,no,northwest,14426.07385 +20,female,30.59,0,no,northeast,2459.7201 +32,female,41.1,0,no,southwest,3989.841 +43,female,34.58,1,no,northwest,7727.2532 +34,male,42.13,2,no,southeast,5124.1887 +30,male,38.83,1,no,southeast,18963.17192 +18,female,28.215,0,no,northeast,2200.83085 +41,female,28.31,1,no,northwest,7153.5539 +35,female,26.125,0,no,northeast,5227.98875 +57,male,40.37,0,no,southeast,10982.5013 +29,female,24.6,2,no,southwest,4529.477 +32,male,35.2,2,no,southwest,4670.64 +37,female,34.105,1,no,northwest,6112.35295 +18,male,27.36,1,yes,northeast,17178.6824 +43,female,26.7,2,yes,southwest,22478.6 +56,female,41.91,0,no,southeast,11093.6229 +38,male,29.26,2,no,northwest,6457.8434 +29,male,32.11,2,no,northwest,4433.9159 +22,female,27.1,0,no,southwest,2154.361 +52,female,24.13,1,yes,northwest,23887.6627 +40,female,27.4,1,no,southwest,6496.886 +23,female,34.865,0,no,northeast,2899.48935 +31,male,29.81,0,yes,southeast,19350.3689 +42,female,41.325,1,no,northeast,7650.77375 +24,female,29.925,0,no,northwest,2850.68375 +25,female,30.3,0,no,southwest,2632.992 +48,female,27.36,1,no,northeast,9447.3824 +23,female,28.49,1,yes,southeast,18328.2381 +45,male,23.56,2,no,northeast,8603.8234 +20,male,35.625,3,yes,northwest,37465.34375 +62,female,32.68,0,no,northwest,13844.7972 +43,female,25.27,1,yes,northeast,21771.3423 +23,female,28,0,no,southwest,13126.67745 +31,female,32.775,2,no,northwest,5327.40025 +41,female,21.755,1,no,northeast,13725.47184 +58,female,32.395,1,no,northeast,13019.16105 +48,female,36.575,0,no,northwest,8671.19125 +31,female,21.755,0,no,northwest,4134.08245 +19,female,27.93,3,no,northwest,18838.70366 +19,female,30.02,0,yes,northwest,33307.5508 +41,male,33.55,0,no,southeast,5699.8375 +40,male,29.355,1,no,northwest,6393.60345 +31,female,25.8,2,no,southwest,4934.705 +37,male,24.32,2,no,northwest,6198.7518 +46,male,40.375,2,no,northwest,8733.22925 +22,male,32.11,0,no,northwest,2055.3249 +51,male,32.3,1,no,northeast,9964.06 +18,female,27.28,3,yes,southeast,18223.4512 +35,male,17.86,1,no,northwest,5116.5004 +59,female,34.8,2,no,southwest,36910.60803 +36,male,33.4,2,yes,southwest,38415.474 +37,female,25.555,1,yes,northeast,20296.86345 +59,male,37.1,1,no,southwest,12347.172 +36,male,30.875,1,no,northwest,5373.36425 +39,male,34.1,2,no,southeast,23563.01618 +18,male,21.47,0,no,northeast,1702.4553 +52,female,33.3,2,no,southwest,10806.839 +27,female,31.255,1,no,northwest,3956.07145 +18,male,39.14,0,no,northeast,12890.05765 +40,male,25.08,0,no,southeast,5415.6612 +29,male,37.29,2,no,southeast,4058.1161 +46,female,34.6,1,yes,southwest,41661.602 +38,female,30.21,3,no,northwest,7537.1639 +30,female,21.945,1,no,northeast,4718.20355 +40,male,24.97,2,no,southeast,6593.5083 +50,male,25.3,0,no,southeast,8442.667 +20,female,24.42,0,yes,southeast,26125.67477 +41,male,23.94,1,no,northeast,6858.4796 +33,female,39.82,1,no,southeast,4795.6568 +38,male,16.815,2,no,northeast,6640.54485 +42,male,37.18,2,no,southeast,7162.0122 +56,male,34.43,0,no,southeast,10594.2257 +58,male,30.305,0,no,northeast,11938.25595 +52,male,34.485,3,yes,northwest,60021.39897 +20,female,21.8,0,yes,southwest,20167.33603 +54,female,24.605,3,no,northwest,12479.70895 +58,male,23.3,0,no,southwest,11345.519 +45,female,27.83,2,no,southeast,8515.7587 +26,male,31.065,0,no,northwest,2699.56835 +63,female,21.66,0,no,northeast,14449.8544 +58,female,28.215,0,no,northwest,12224.35085 +37,male,22.705,3,no,northeast,6985.50695 +25,female,42.13,1,no,southeast,3238.4357 +52,male,41.8,2,yes,southeast,47269.854 +64,male,36.96,2,yes,southeast,49577.6624 +22,female,21.28,3,,northwest,4296.2712 +28,female,33.11,0,,southeast,3171.6149 +18,male,33.33,0,,southeast,1135.9407 +28,male,24.3,5,,southwest,5615.369 +45,female,25.7,3,,southwest,9101.798 +33,male,29.4,4,,southwest,6059.173 +18,female,39.82,0,no,southeast,1633.9618 +32,male,33.63,1,yes,northeast,37607.5277 +24,male,29.83,0,yes,northeast,18648.4217 +19,male,19.8,0,no,southwest,1241.565 +20,male,27.3,0,yes,southwest,16232.847 +40,female,29.3,4,no,southwest,15828.82173 +34,female,27.72,0,no,southeast,4415.1588 +42,female,37.9,0,no,southwest,6474.013 +51,female,36.385,3,no,northwest,11436.73815 +54,female,27.645,1,no,northwest,11305.93455 +55,male,37.715,3,no,northwest,30063.58055 +52,,23.18,0,no,northeast,10197.7722 +32,,20.52,0,no,northeast,4544.2348 +28,male,37.1,1,no,southwest,3277.161 +41,female,28.05,1,no,southeast,6770.1925 +43,female,29.9,1,no,southwest,7337.748 +49,female,33.345,2,no,northeast,10370.91255 +64,male,23.76,0,yes,southeast,26926.5144 +55,female,30.5,0,no,southwest,10704.47 +24,male,31.065,0,yes,northeast,34254.05335 +20,female,33.3,0,no,southwest,1880.487 +45,male,27.5,3,no,southwest,8615.3 +26,male,33.915,1,no,northwest,3292.52985 +25,female,34.485,0,no,northwest,3021.80915 +43,male,25.52,5,no,southeast,14478.33015 +35,male,27.61,1,no,southeast,4747.0529 +26,male,27.06,0,yes,southeast,17043.3414 +57,male,23.7,0,no,southwest,10959.33 +22,female,30.4,0,no,northeast,2741.948 +32,female,29.735,0,no,northwest,4357.04365 +39,male,29.925,1,yes,northeast,22462.04375 +25,female,26.79,2,no,northwest,4189.1131 +48,female,33.33,0,no,southeast,8283.6807 +47,female,27.645,2,yes,northwest,24535.69855 +18,female,21.66,0,yes,northeast,14283.4594 +18,male,30.03,1,no,southeast,1720.3537 +61,male,36.3,1,yes,southwest,47403.88 +47,female,24.32,0,no,northeast,8534.6718 +28,female,17.29,0,no,northeast,3732.6251 +36,female,25.9,1,no,southwest,5472.449 +20,male,39.4,2,yes,southwest,38344.566 +44,male,34.32,1,no,southeast,7147.4728 +38,female,19.95,2,no,northeast,7133.9025 +19,male,34.9,0,yes,southwest,34828.654 +21,male,23.21,0,no,southeast,1515.3449 +46,male,25.745,3,no,northwest,9301.89355 +58,male,25.175,0,no,northeast,11931.12525 +20,male,22,1,no,southwest,1964.78 +18,male,26.125,0,no,northeast,1708.92575 +28,female,26.51,2,no,southeast,4340.4409 +33,male,27.455,2,no,northwest,5261.46945 +19,female,25.745,1,no,northwest,2710.82855 +45,male,30.36,0,yes,southeast,62592.87309 +62,male,30.875,3,yes,northwest,46718.16325 +25,female,20.8,1,no,southwest,3208.787 +43,male,27.8,0,yes,southwest,37829.7242 +42,male,24.605,2,yes,northeast,21259.37795 +24,female,27.72,0,no,southeast,2464.6188 +29,female,21.85,0,yes,northeast,16115.3045 +32,male,28.12,4,yes,northwest,21472.4788 +25,female,30.2,0,yes,southwest,33900.653 +41,male,32.2,2,no,southwest,6875.961 +42,male,26.315,1,no,northwest,6940.90985 +33,female,26.695,0,no,northwest,4571.41305 +34,male,42.9,1,no,southwest,4536.259 +19,female,34.7,2,yes,southwest,36397.576 +30,female,23.655,3,yes,northwest,18765.87545 +18,male,28.31,1,no,northeast,11272.33139 +19,female,20.6,0,no,southwest,1731.677 +18,male,53.13,0,no,southeast,1163.4627 +35,male,39.71,4,no,northeast,19496.71917 +39,female,26.315,2,no,northwest,7201.70085 +31,male,31.065,3,no,northwest,5425.02335 +62,male,26.695,0,yes,northeast,28101.33305 +62,male,38.83,0,no,southeast,12981.3457 +42,female,40.37,2,yes,southeast,43896.3763 +31,male,25.935,1,no,northwest,4239.89265 +61,male,33.535,0,no,northeast,13143.33665 +42,female,32.87,0,no,northeast,7050.0213 +51,male,30.03,1,no,southeast,9377.9047 +23,female,24.225,2,no,northeast,22395.74424 +52,male,38.6,2,no,southwest,10325.206 +57,female,25.74,2,no,southeast,12629.1656 +23,female,33.4,0,no,southwest,10795.93733 +52,female,44.7,3,no,southwest,11411.685 +50,male,30.97,3,no,northwest,10600.5483 +18,female,31.92,0,no,northeast,2205.9808 +18,female,36.85,0,no,southeast,1629.8335 +21,female,25.8,0,no,southwest,2007.945 +61,female,29.07,0,yes,northwest,29141.3603 \ No newline at end of file diff --git a/data/slm_research.xlsm b/data/slm_research.xlsm new file mode 100644 index 0000000..b79cf87 Binary files /dev/null and b/data/slm_research.xlsm differ diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..71d89b3 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +Projects documents (design, userguide, api, ...) \ No newline at end of file diff --git a/docs/crisp.pptx b/docs/crisp.pptx new file mode 100644 index 0000000..bc67993 Binary files /dev/null and b/docs/crisp.pptx differ diff --git a/lab/README.md b/lab/README.md new file mode 100644 index 0000000..b48c376 --- /dev/null +++ b/lab/README.md @@ -0,0 +1 @@ +Work with lectures notes and your project \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8776041 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ + Lists the project's dependencies + + diff --git a/sandbox/list_demo.py b/sandbox/list_demo.py new file mode 100644 index 0000000..ff9b07b --- /dev/null +++ b/sandbox/list_demo.py @@ -0,0 +1,8 @@ +import pandas as pd + +my_dic = {'a': [1, 2, 3, 4, 5, 6], 'b': [4, 5, 6, 7, 8, 9], 'c': [7, 8, 9, 10, 11, 12]} + +my_df = pd.DataFrame(my_dic) + + +print(my_df[my_df['a'] > 2]) \ No newline at end of file diff --git a/sandbox/unsupervised_learning_example.py b/sandbox/unsupervised_learning_example.py new file mode 100644 index 0000000..d1386b2 --- /dev/null +++ b/sandbox/unsupervised_learning_example.py @@ -0,0 +1,28 @@ +import numpy as np +import matplotlib.pyplot as plt +from sklearn.datasets import make_blobs +from sklearn.cluster import KMeans + +# Generate synthetic data +X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) + +# Plot the synthetic data +plt.scatter(X[:, 0], X[:, 1], s=50) +plt.title("Synthetic Data") +plt.xlabel("Feature 1") +plt.ylabel("Feature 2") +plt.show() + +# Apply K-Means clustering +kmeans = KMeans(n_clusters=4) +kmeans.fit(X) +y_kmeans = kmeans.predict(X) + +# Plot the clustered data +plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis') +centers = kmeans.cluster_centers_ +plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X') +plt.title("K-Means Clustering") +plt.xlabel("Feature 1") +plt.ylabel("Feature 2") +plt.show() \ No newline at end of file diff --git a/session_1/README.md b/session_1/README.md new file mode 100644 index 0000000..c49554f --- /dev/null +++ b/session_1/README.md @@ -0,0 +1,83 @@ +# Predictive analytics + +## Prerequisits + +- You should already have basic knowledge about: + - [NumPy](https://numpy.org/) + - [pandas](https://pandas.pydata.org/) + - [Matplotlib](https://matplotlib.org/) + - [seaborn](https://seaborn.pydata.org/) + - [scikit-learn (sklearn)](https://scikit-learn.org/stable/) + +- Before starting to work on the example codes, make sure the above packages are installed on your Python. + +## Usefull resources + +- [What is CRISP DM?](https://www.datascience-pm.com/crisp-dm-2/) + +- [How to Build a Predictive Model in Python?](https://365datascience.com/tutorials/python-tutorials/predictive-model-python/) + +- [Predictive Analysis with different approaches](https://www.kaggle.com/code/zoupet/predictive-analysis-with-different-approaches) + +- [Predictive Modeling Techniques- A Comprehensive Guide [2022]](https://www.projectpro.io/article/predictive-modelling-techniques/598) + +- [Supervised/unsupervised Learning](https://scikit-learn.org/stable/user_guide.html) + +- Textbook: Python for realfag, ch. 10, 17. + +## Objectives + +- Get to know your data (data understanding) +- Using pandas to handle missing data in a dataset (data preparation) +- Applying simple regression models to a dataset (modelling) + +## Introduction + +Predictive analytics is the practice of forecasting future results and performance using statistics and modelling approaches. + +With [predictive programming](https://365datascience.com/tutorials/python-tutorials/predictive-model-python/) you collect and analyze historical data to recognize patterns. A model is trained using this data, allowing it to forecast future results when presented with new information + +Cross-industry standard process for data mining ([CRISP DM](https://www.datascience-pm.com/crisp-dm-2/)): + +CRISP-DM Process +Figure 1: CRISP-DM Process + + +- Business Understanding - What does the business need? + - The Business Understanding phase centers on comprehending the project's objectives and needs. +- **Data Understanding** - What data do we have / need? Is it clean? + - The data understanding phase emphasizes identifying, gathering, and analyzing datasets that will aid in achieving the project's objectives. + +- **Data Preparation** - How do we organize the data for modeling? + - In this stage, it's essential to ensure the prediction models can process the data. You might prepare data by handling missing values and applying normalization or standardization techniques. Additionally, as most models only accept numerical data, categorical data must be converted into numerical data. + +- **Modelling** - What modeling techniques should we apply? + - We make predictions by dividing the data into test and training. Use training data to train the model and test data to evaluate the model's success score. There are several predictive models and modeling techniques in machine learning. We look at some simple linear regression model examples. + +- Evaluation - Which model best meets the business objectives? + - The Evaluation phase takes a broader perspective on identifying which model best aligns with the business and determining the next steps. +- Deployment - How do stakeholders access the results? + - “Depending on the requirements, the deployment phase can be as simple as generating a report or as complex as implementing a repeatable data mining process across the enterprise.” + +[Lean more](https://www.datascience-pm.com/crisp-dm-2/) + +## Predictive analytics + +CRISP-DM Process +Figure 2: CRISP-DM Process - focus areas in this lecture + +### Overview of the lecture + +- Understanding data + - Understanding and working with datasets. This section includes references to various libraries and sources for finding datasets, along with specific examples and tasks to help users analyze and visualize data effectively. + +- Data preparation + - Preparing data for modeling. This section covers essential steps such as data cleaning, managing categorical data, splitting data into training and test sets, and feature scaling. Each section includes references to further reading and lectures for a deeper understanding of the topics + +- Modelling + - This section provides an introduction to various linear regression models used in predictive analysis. It includes descriptions and links to Jupyter Notebooks for simple linear regression, polynomial regression, multiple regression, and robust linear regression models. The content serves as a guide for understanding and implementing these models in predictive analytics tasks. + +- CRISP DM: Complete example + - This section provides a detailed breakdown of a machine learning workflow (putting pices together) using the CRISP-DM methodology. It covers all phases from business understanding to deployment, using a dataset on CO2 emissions of cars to illustrate each step. The example includes data loading, exploratory data analysis, data preparation, model training, evaluation, and deployment. + +[Top](../README.md) | [Next -> Understanding Data](./understanding_data/README.md) diff --git a/session_1/crisp_dm/README.md b/session_1/crisp_dm/README.md new file mode 100644 index 0000000..170036e --- /dev/null +++ b/session_1/crisp_dm/README.md @@ -0,0 +1,45 @@ +## CRISP DM - Example + +[CO2 emission of cars dataset](https://www.kaggle.com/code/midhundasl/co2-prediction) +By [Midhun Das L](https://www.kaggle.com/midhundasl) + +We use this dataset as the basis for demonstration of the comprehensive example of a machine learning workflow that follows the CRISP-DM methodology. +The goal of this workflow is to predict CO2 emissions based on car weight and volume. + + + +Here's a detailed breakdown of what each section: + +1. Business Understanding + + - The goal is to predict CO2 emissions based on car weight and volume to help reduce environmental impact. + +2. Data Understanding + - Loading Data: The data is loaded from a CSV file. + - Exploratory Data Analysis (EDA): + - info(): Provides a concise summary of the DataFrame, including the data types and non-null values. + - describe(): Generates descriptive statistics that summarize the central tendency, dispersion, and shape of the dataset’s distribution. + - pairplot(): Creates a pairwise plot of the dataset to visualize relationships between variables. + +3. Data Preparation + - Handling Missing Values: Any missing values in the dataset are dropped. + - Feature Selection: The features (Weight and Volume) and the target variable (CO2) are selected. + - Feature Scaling: The features are scaled using StandardScaler to ensure they are on a similar scale. + +4. Modeling + - Data Splitting: The data is split into training and test sets using train_test_split. + - Model Training: A linear regression model is trained on the training data. + +5. Evaluation + - Model Evaluation: The model's performance is evaluated on the test set using Mean Squared Error (MSE) and R-squared metrics. + Prediction: The model is used to predict CO2 emissions for a new data point (weight = 2300kg, volume = 1300cm3). + - Coefficients: The coefficients of the linear regression model are printed. + +6. Deployment + - Saving the Model: The trained model and scaler are saved to disk using joblib. + - Loading the Model: Demonstrates how to load the saved model and scaler for future predictions. + +[Lecture: Predict CO2 emissions](data_analytics_example.ipynb) + +[Predictive Analytics <- Previous](../modelling/README.md) | +[TOP](../../README.md) diff --git a/session_1/crisp_dm/data_analytics_example.ipynb b/session_1/crisp_dm/data_analytics_example.ipynb new file mode 100644 index 0000000..1424722 --- /dev/null +++ b/session_1/crisp_dm/data_analytics_example.ipynb @@ -0,0 +1,391 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Business Understanding\n", + "\n", + "Objective: Predict CO2 emissions based on car weight and volume to help reduce environmental impact." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import mean_squared_error, r2_score\n", + "import joblib\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [], + "source": [ + "# Load data\n", + "file_name = \"../../data/car_co2_data.csv\"\n", + "data = pd.read_csv(file_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Understanding the data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Exploratory Data Analysis (EDA)\n", + "# Provides a concise summary of the DataFrame.\n", + "print(data.info()) \n", + "\n", + "# Generates descriptive statistics that summarize the central tendency, dispersion, \n", + "# and shape of the dataset’s distribution. \n", + "print(data.describe()) \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example of plotting CO2 vs Volume\n", + "sns.scatterplot(data=data, x=\"Volume\", y=\"Weight\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example of plotting Volume distribution\n", + "sns.histplot(data=data, x=\"Volume\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a pairwise plot of the dataset using Seaborn, a statistical data visualization library.\n", + "sns.pairplot(data)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[A pairwise plot](https://seaborn.pydata.org/generated/seaborn.pairplot.html) (also known as a pair plot or scatterplot matrix) is a grid of scatterplots that shows the relationships between pairs of variables in a dataset. Here is what you can expect from the output graph:\n", + "\n", + "- Diagonal Plots:\n", + "\n", + "The diagonal of the grid typically contains histograms or kernel density plots of each individual variable. These plots show the distribution of each variable.\n", + "\n", + "- Off-Diagonal Plots:\n", + "\n", + "The off-diagonal elements are scatterplots of one variable against another. Each scatterplot shows the relationship between two variables.\n", + "For example, the plot at the intersection of the first row and second column shows the scatterplot of the first variable (x-axis) against the second variable (y-axis).\n", + "\n", + "- Axes Labels:\n", + "\n", + "Each row and column are labeled with the variable names. The x-axis of each column corresponds to the variable in that column, and the y-axis of each row corresponds to the variable in that row.\n", + "\n", + "- Color Coding:\n", + "\n", + "If the dataset includes categorical variables, the points in the scatterplots can be color-coded based on the categories. This helps in visualizing how different categories are distributed across the variables." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Adding a hue variable introduces a semantic mapping and alters the default marginal plot to display a layered kernel density estimate (KDE)\n", + "sns.pairplot(data, hue=\"CO2\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The hue parameter is used to introduce a semantic mapping, which means that the data points will be color-coded based on the values of the specified variable (\"CO2\" in this case).\n", + "This helps in visualizing how different categories or levels of the hue variable are distributed across the other variables.\n", + "\n", + "When a hue variable is specified, the default marginal plots (histograms) on the diagonal are replaced with layered KDE (Kernel Density Estimate) plots.\n", + "\n", + "KDE plots provide a smoothed estimate of the distribution of the data, which can be more informative than histograms, especially when comparing multiple distributions." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Preparation" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [], + "source": [ + "# Handle missing values (if any)\n", + "data = data.dropna()" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "# Features and target variable\n", + "X = data[['Weight', 'Volume']].copy()\n", + "\n", + "y = data[['CO2']].copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "# Split data into training and test sets\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "# Feature Scaling\n", + "scaler = StandardScaler()\n", + "\n", + "# Fits the StandardScaler to the data and then transforms the data.\n", + "X_train_scaled = scaler.fit_transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Modeling" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "# Train a linear regression model and make predictions on the test set.\n", + "X_train_scaled_df = pd.DataFrame(X_train_scaled, columns=X_train.columns)\n", + "X_test_scaled_df = pd.DataFrame(X_test_scaled, columns=X_test.columns)\n", + "\n", + "regr = LinearRegression()\n", + "regr.fit(X_train_scaled_df, y_train)\n", + "\n", + "# Predict on test set\n", + "y_pred = regr.predict(X_test_scaled_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Scatter plot of training data\n", + "plt.figure(figsize=(14, 6))\n", + "\n", + "# Predictions vs Actual values on test data\n", + "plt.subplot(1, 2, 2)\n", + "plt.scatter(X_test['Weight'], y_test, color='blue', label='Actual')\n", + "plt.scatter(X_test['Weight'], y_pred, color='red', label='Predicted')\n", + "\n", + "plt.xlabel('Weight')\n", + "plt.ylabel('CO2 Emissions')\n", + "plt.title('Actual vs Predicted CO2 Emissions')\n", + "plt.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Mean Squared Error:\", mean_squared_error(y_test, y_pred))\n", + "print(\"R-squared:\", r2_score(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The provided output includes two key metrics for evaluating the performance of a regression model: \n", + "- Mean Squared Error (MSE)\n", + "- R-squared (R²). \n", + "\n", + "1. Mean Squared Error (MSE)\n", + "Value: 41.48536307266049\n", + "\n", + "Explanation: MSE measures the average squared difference between the actual and predicted values. It is calculated as: $ \\text{MSE} = \\frac{1}{n} \\sum_{i=1}^{n} (y_i - \\hat{y}_i)^2 $ where ( $y_i$ ) is the actual value, ($ \\hat{y}_i $) is the predicted value, and ( n ) is the number of observations.\n", + "\n", + "Interpretation: A lower MSE indicates a better fit of the model to the data. In this case, an MSE of 41.48536307266049 suggests that, on average, the squared difference between the actual and predicted CO2 emissions is about 41.49. This value is context-dependent, so without a baseline or comparison, it's hard to judge if this is good or bad.\n", + "\n", + "2. R-squared (R²)\n", + "Value: 0.40615897189660666\n", + "\n", + "Explanation: R² measures the proportion of the variance in the dependent variable that is predictable from the independent variables. It is calculated as: $ R^2 = 1 - \\frac{\\sum_{i=1}^{n} (y_i - \\hat{y}i)^2}{\\sum{i=1}^{n} (y_i - \\bar{y})^2} $ where $ \\bar{y} $ is the mean of the actual values.\n", + "\n", + "Interpretation: R² ranges from 0 to 1, where:\n", + "\n", + "0: The model explains none of the variance in the dependent variable.\\\n", + "1: The model explains all the variance in the dependent variable.\\\n", + "Negative values: The model performs worse than a horizontal line (mean of the actual values).\\\n", + "An R² value of 0.40615897189660666 means that approximately 40.62% of the variance in CO2 emissions is explained by the model. This indicates a moderate fit, suggesting that there is room for improvement.\n", + "\n", + "Improving a linear regression model to achieve a lower Mean Squared Error (MSE) and a higher R-squared value involves several steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Predict the CO2 emission of a car where the weight is 2300kg, and the volume is 1300cm3:\n", + "X_new = pd.DataFrame({\n", + " 'Weight': [2300],\n", + " 'Volume': [1300]\n", + "})\n", + "\n", + "# Scale the new data using the fitted scaler\n", + "scaler.transform(X_new)\n", + "\n", + "# Predict using the scaled new data\n", + "predictedCO2 = regr.predict(X_new)\n", + "\n", + "# Print the prediction\n", + "print(\"Predicted CO2 for weight 2300kg and volume 1300cm3:\", predictedCO2)\n", + "\n", + "# Print the coefficients\n", + "print(\"Coefficients:\", regr.coef_)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Deployment (Saving the model and scaler)\n", + "joblib.dump(regr, 'linear_regression_model.pkl')\n", + "joblib.dump(scaler, 'scaler.pkl')" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the model and scaler for future predictions (example)\n", + "loaded_model = joblib.load('linear_regression_model.pkl')\n", + "loaded_scaler = joblib.load('scaler.pkl')" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Predicted CO2 using loaded model: [[7071.54172594]]\n" + ] + } + ], + "source": [ + "# Predict using the loaded model and scaler\n", + "X_new_loaded = pd.DataFrame({\n", + " 'Weight': [2050],\n", + " 'Volume': [1250]\n", + "})\n", + "\n", + "loaded_scaler.transform(X_new_loaded)\n", + "\n", + "predictedCO2_loaded = loaded_model.predict(X_new_loaded)\n", + "print(\"Predicted CO2 using loaded model:\", predictedCO2_loaded)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[CRISP DM <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/crisp_dm/linear_regression_model.pkl b/session_1/crisp_dm/linear_regression_model.pkl new file mode 100644 index 0000000..61bd4de Binary files /dev/null and b/session_1/crisp_dm/linear_regression_model.pkl differ diff --git a/session_1/crisp_dm/scaler.pkl b/session_1/crisp_dm/scaler.pkl new file mode 100644 index 0000000..aa915da Binary files /dev/null and b/session_1/crisp_dm/scaler.pkl differ diff --git a/session_1/data_preparation/README.md b/session_1/data_preparation/README.md new file mode 100644 index 0000000..5bb9586 --- /dev/null +++ b/session_1/data_preparation/README.md @@ -0,0 +1,68 @@ +## 2. Data preparation + +- How do we organize the data for modeling? + +We rarely have complete datasets to work with. +In Python, missing values are represented as NaN, which is "not a number". + +### Data cleaning + +Most prediction methods cannot work with missing data, so we need to fix the problem of missing values. + +There are several ways to handle this. +We are looking at three options: 1) Delete the entire column where the NaN values are found. 2) Delete the rows with NaN values. 3) fill in the NaN values. + +[Read more](https://www.geeksforgeeks.org/working-with-missing-data-in-pandas/) + +[Lecture: Data cleaning](./preprocessing_calibration/README.md) + + + +### Managing categorical data + +Categorical variables represent different sorts of data that can be categorized. Sex, age, educational attainment, and other category factors are examples. + +Because prediction models only accept numerical data, we must translate categorical data into numerical data. + +There are two ways we may approach this. Label encoding is one method, and hot encoding is another. + +- [Label encoding](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html): works well if we have two distinct values. We can use e.g. sklearn.LabelEncoder or pandas.factorize() + +- [One hot encoding](https://scikit-learn.org/0.18/modules/generated/sklearn.preprocessing.OneHotEncoder.html): works well if we have three or more distinct values. We can use e.g. sklearn OneHotEncoder or [pandas get_dummies()](https://pandas.pydata.org/docs/reference/api/pandas.get_dummies.html) + +[Read more](https://www.datacamp.com/tutorial/categorical-data) + + +[Lecture: categorical data](./data_transformation/categorical_data.ipynb) + +### Deviding data into training and test + +Data partitioning is when data is divided into two or more subsets. +We divide data into what's known as train and test. One portion is used to assess or test the data, while the other is used to train the model. + +- The training set contains a known output and the model learns on this data (2/3). +- The test data is for testing our model's prediction (1/3). + +[Read more](https://www.techtarget.com/searchenterpriseai/definition/data-splitting) + +[Lecture: deviding data into trining and test](./data_transformation/deviding_data.ipynb) + +### Feature scaling + +To keep items with bigger magnitudes from dominating the prediction model, we must scale our data according to its features. + +Here, we'll demonstrate two techniques called normalization and standardization. + +- Normalization (min max scaling): Divide the result by maximum minus minimum after deducting the minimum value from the number. Values will be rescaled to be between zero and one (unless we define a different range using the feature range hyper parameter). + +- Standardization: Divide the result by the standard deviation after deducting the mean value from the number. In contrast to normalization, we are not confined to a certain range in this situation. + +[Read more](https://www.geeksforgeeks.org/normalization-vs-standardization/) + +[Lecture: Feature scalling](./data_transformation/feature_scaling.ipynb) + +### Task 2: Data preparation +[Analyzing and Visualizing Existing Datasets](task_2.md) + +[Data understanding <- Previous](../understanding_data/README.md) | +[Next -> Modelling](../modelling/README.md) \ No newline at end of file diff --git a/session_1/data_preparation/__pycache__/load_data.cpython-310.pyc b/session_1/data_preparation/__pycache__/load_data.cpython-310.pyc new file mode 100644 index 0000000..9488aa1 Binary files /dev/null and b/session_1/data_preparation/__pycache__/load_data.cpython-310.pyc differ diff --git a/session_1/data_preparation/data_transformation/categorical_data.ipynb b/session_1/data_preparation/data_transformation/categorical_data.ipynb new file mode 100644 index 0000000..52f50af --- /dev/null +++ b/session_1/data_preparation/data_transformation/categorical_data.ipynb @@ -0,0 +1,309 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Managing Categorical Data\n", + "\n", + "Categorical data refers to data that can be divided into specific categories or groups. \n", + "These categories are typically qualitative and represent different types or classes of items.\n", + "\n", + "The pandas library provides a Categorical data type that is specifically designed to handle categorical data. \n", + "This data type is useful for representing data that can take on a limited, fixed number of possible values (categories).\n", + "\n", + "[Learn more](https://www.datacamp.com/tutorial/categorical-data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# Creating a DataFrame with categorical data\n", + "data = {\n", + " 'color': ['Red', 'Blue', 'Green', 'Blue', 'Red'],\n", + " 'animal': ['Dog', 'Cat', 'Bird', 'Dog', 'Rooster'],\n", + " 'education': ['High School', 'Bachelor', 'Master', 'PhD', 'Bachelor'],\n", + " 'animal_age': [5, 7, 3, 8, 6]\n", + "}\n", + "\n", + "# Specifying the data types for each column\n", + "dtype = {\n", + " 'color': 'category',\n", + " 'animal': 'category',\n", + " 'education': 'category',\n", + " 'animal_age': 'int'\n", + "}\n", + "\n", + "df = pd.DataFrame(data).astype(dtype)\n", + "\n", + "print(df)\n", + "print(df.dtypes)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Label Encoding" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import LabelEncoder\n", + "\n", + "# Initialize the LabelEncoder\n", + "le = LabelEncoder()\n", + "\n", + "# Apply LabelEncoder to each categorical column\n", + "df_encoded = df.apply(le.fit_transform)\n", + "\n", + "print(df_encoded)\n", + "print(df_encoded.dtypes)\n", + "\n", + "print(df)\n", + "print(df.dtypes)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_encoded = df.copy()\n", + "\n", + "encoded_data = le.fit_transform(df[\"color\"])\n", + "\n", + "encoded_df = pd.DataFrame(encoded_data)\n", + "\n", + "encoded_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One Hot Encoding" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import OneHotEncoder\n", + "\n", + "ohe = OneHotEncoder()\n", + "\n", + "# Select the categorical columns\n", + "categorical_columns = ['color', 'animal', 'education']\n", + "\n", + "df_encoded = pd.DataFrame(ohe.fit_transform(df[categorical_columns]).toarray(), dtype='int', columns=[name.lower() for name in ohe.get_feature_names_out(categorical_columns)])\n", + "\n", + "df_encoded.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# pandas get_dummies: maps each category to 0 (cold) or 1 (hot) = one hot encoder\n", + "\n", + "encoded_data = pd.get_dummies(df, columns=[\"color\", \"animal\", \"education\"])\n", + "\n", + "# Convert column names to lowercase\n", + "encoded_data.columns = encoded_data.columns.str.lower()\n", + "\n", + "encoded_data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Example 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load data\n", + "file_name = \"../../../data/insurance.csv\"\n", + "data = pd.read_csv(file_name)\n", + "\n", + "data.head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Smoker has two possible values: Yes, No > We use label encoding.\n", + "\n", + "\"sklearn.LabelEncoder\" label encoding: maps each category to a different integer\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Label Encoding" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Use LabelEncoder to encode \"Smoker\"\n", + "le = LabelEncoder()\n", + "\n", + "datacopy = data.copy()\n", + "\n", + "datacopy[\"smoker\"] = le.fit_transform(datacopy[\"smoker\"])\n", + "datacopy.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Alternatively, use \"pandas.factorize()\" to encode \"Smoker\"\n", + "\n", + "datacopy = data.copy()\n", + "\n", + "datacopy['smoker'] = pd.factorize(datacopy['smoker'])[0]\n", + "datacopy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## One Hot Encoding\n", + "\n", + "pandas get_dummies: maps each category to 0 (cold) or 1 (hot) = one hot encoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "datacopy = data.copy()\n", + "\n", + "encoded_data = pd.get_dummies(datacopy, columns=[\"region\"])\n", + "# a True encodes the presence of a category\n", + "# a False encodes the absence of a category\n", + "encoded_data\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Alternatively, use OneHotEncoder for region\n", + "datacopy = data.copy()\n", + "\n", + "ohe = OneHotEncoder()\n", + "region_df = pd.DataFrame(ohe.fit_transform(datacopy[['region']]).toarray(), dtype='int')\n", + "region_df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_final = datacopy.join(region_df)\n", + "data_final.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Region is now twice and we need to remove the original column\n", + "data_final.drop('region', axis=1, inplace=True)\n", + "data_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Mapping dictionary\n", + "region_mapping = {\n", + " 0: 'region_southwest',\n", + " 1: 'region_north',\n", + " 2: 'region_east',\n", + " 3: 'region_west'\n", + "}\n", + "\n", + "data_final.rename(columns=region_mapping, inplace=True)\n", + "data_final.head()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data preparation <- Previous](../README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/data_transformation/deviding_data.ipynb b/session_1/data_preparation/data_transformation/deviding_data.ipynb new file mode 100644 index 0000000..43b8362 --- /dev/null +++ b/session_1/data_preparation/data_transformation/deviding_data.ipynb @@ -0,0 +1,168 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deviding data into training and test" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.preprocessing import LabelEncoder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load data\n", + "file_name = r\"C:\\git\\gitlab\\it6209\\lectures\\seminar_4\\session_1\\datasets\\insurance.csv\"\n", + "data = pd.read_csv(file_name)\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# *** numerical data\n", + "data_num = data[['age', 'bmi', 'children']].copy()\n", + "\n", + "# Fix missing data\n", + "data_num.interpolate(method='linear', inplace=True)\n", + "data_num.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# *** none numerical data\n", + "data_none_num = data[['region','sex','smoker']].copy()\n", + "\n", + "# Use LabelEncoder to encode 'sex' and 'smoker'\n", + "cols = [\"sex\", \"smoker\"]\n", + "data_none_num[cols] = data_none_num[cols].apply(LabelEncoder().fit_transform)\n", + "data_none_num.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# OneHotEncoder to encode 'region'\n", + "data_none_num = pd.get_dummies(data_none_num, columns=[\"region\"], prefix=\"region\")\n", + "data_none_num.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Convert boolean columns to integers for the region columns\n", + "region_columns = [col for col in data_none_num.columns if col.startswith(\"region\")]\n", + "data_none_num[region_columns] = data_none_num[region_columns].astype(int)\n", + "data_none_num.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# take the encoded data and add to numerical data\n", + "X_final = pd.concat([data_num, data_none_num], axis = 1)\n", + "X_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#define y as being the \"charges column\" from the original dataset\n", + "y_final = data[['charges']].copy()\n", + "y_final.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "#Test train split\n", + "X_train, X_test, y_train, y_test = train_test_split(X_final, y_final, test_size = 1/3, random_state = 0 )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the trained data\n", + "fig, axs = plt.subplots(2, 3, figsize=(15, 6))\n", + "features = X_train.columns\n", + "\n", + "for i, ax in enumerate(axs.flatten()):\n", + " ax.scatter(X_train[features[i]], y_train, color=\"blue\")\n", + " ax.scatter(X_test[features[i]], y_test, color=\"red\")\n", + " ax.set_xlabel(features[i])\n", + " ax.set_ylabel(y_train.columns[0])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data preparation <- Previous](../README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/data_transformation/feature_scaling.ipynb b/session_1/data_preparation/data_transformation/feature_scaling.ipynb new file mode 100644 index 0000000..d762bcb --- /dev/null +++ b/session_1/data_preparation/data_transformation/feature_scaling.ipynb @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Feature Scaling" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "# 1. Data collection\n", + "# Load data\n", + "file_name = \"../../../data/insurance.csv\"\n", + "data = pd.read_csv(file_name)\n", + "print(data.head(10))\n", + "\n", + "# 2. Data cleaning\n", + "# Fill in missing data using the interpolate()\n", + "data.interpolate(method='linear', inplace=True)\n", + "print(data.head(10))\n", + "\n", + "# 3. Data transformation\n", + "# encode none-numerical data\n", + "data[\"smoker\"] = pd.factorize(data[\"smoker\"])[0]\n", + "data[\"sex\"] = pd.factorize(data[\"sex\"])[0]\n", + "data = pd.get_dummies(data, columns=[\"region\"])\n", + "print(data.head(10))\n", + "\n", + "# define x as being all columns exept charges column\n", + "X_final = data[['age', 'bmi', 'children', 'region_northeast', 'region_northwest',\n", + " 'region_southeast', 'region_southwest', 'sex', 'smoker']].copy()\n", + "print(X_final.head(10))\n", + "\n", + "# define y as being the \"charges column\" from the original dataset\n", + "y_final = data[['charges']].copy()\n", + "print(y_final.head(10))" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Test train split\n", + "X_train, X_test, y_train, y_test = train_test_split(X_final, y_final, test_size=0.33, random_state=0)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Normalized scaler\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# normalized scaler\n", + "n_scaler = MinMaxScaler()\n", + "X_train_ns = n_scaler.fit_transform(X_train.astype(float))\n", + "X_test_ns = n_scaler.transform(X_test.astype(float))\n", + "y_train_ns = n_scaler.fit_transform(y_train.astype(float))\n", + "y_test_ns = n_scaler.transform(y_test.astype(float))\n", + "\n", + "# Convert numpy arrays to pandas DataFrames\n", + "df_y_train_ns = pd.DataFrame(y_train_ns, columns=['charges'])\n", + "df_y_test_ns = pd.DataFrame(y_test_ns, columns=['charges'])\n", + "\n", + "print(df_y_train_ns.head(10))\n", + "print(df_y_test_ns.head(10))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Standard scaler" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# standard scaler (fit transform on train, fit only on test)\n", + "s_scaler = StandardScaler()\n", + "X_train_ss = s_scaler.fit_transform(X_train.astype(float))\n", + "X_test_ss = s_scaler.transform(X_test.astype(float))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data preparation <- Previous](../README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/datapreparation.ipynb b/session_1/data_preparation/datapreparation.ipynb new file mode 100644 index 0000000..2845b68 --- /dev/null +++ b/session_1/data_preparation/datapreparation.ipynb @@ -0,0 +1,143 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data preparation\n", + "\n", + "We rarely have complete datasets to work with.\n", + "In Python, missing values are represented as NaN, which is \"not a number\".\n", + "\n", + "Most prediction methods cannot work with missing data, so we need to fix the problem of missing values.\n", + "\n", + "There are several ways to handle this.\n", + "We are looking at three options: 1) Delete the entire column where the NaN values are found. 2) Delete the rows with NaN values. 3) fill in the NaN values.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Fill in missing values\n", + "\n", + "We will demonsrate three different ways of filling missing values in addition to droping the hole columns or rows that contains missing values.\n", + "\n", + "- Method 1: Use the fillna()\n", + "- Method 2: Use the replace()\n", + "- Method 3: Use the interpolate()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%load filling_missing_data.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Managing categorical data\n", + "\n", + "Categorical variables represent different sorts of data that can be categorized. Sex, age, educational attainment, and other category factors are examples.\n", + "\n", + "Because prediction models only accept numerical data, we must translate categorical data into numerical data.\n", + "\n", + "There are two ways we may approach this. Label encoding is one method, and hot encoding is another.\n", + "\n", + "- Label encoding: works well if we have two distinct values. We can use e.g. sklearn.LabelEncoder or pandas.factorize()\n", + "\n", + "- One hot encoding: works well if we have three or more distinct values. We can use e.g. sklearn OneHotEncoder or pandas get_dummies()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%load categorical_data.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Deviding data into training and test\n", + "\n", + "We devide data into what's known as train and test.\n", + "\n", + "- The training set contains a known output and the model learns on this data (2/3).\n", + "- The test data is for testing our model's prediction (1/3).\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%load deviding_data.py" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Feature scaling\n", + "\n", + "To keep items with bigger magnitudes from dominating the prediction model, we must scale our data according to its features.\n", + "\n", + "Here, we'll demonstrate two techniques called normalization and standardization.\n", + "\n", + "- Normalization (min max scaling): Divide the result by maximum minus minimum after deducting the minimum value from the number. Values will be rescaled to be between zero and one (unless we define a different range using the feature range hyper parameter).\n", + "\n", + "- Standardization: Divide the result by the standard deviation after deducting the mean value from the number. In contrast to normalization, we are not confined to a certain range in this situation.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%load feature_scaling.py" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10.2 64-bit", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.2" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "3bd012613331a160b6ab7096b9a4a052284afc8931bfa34ed3cbb01db99d1af1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/fourier_transform.ipynb b/session_1/data_preparation/fourier_transform.ipynb new file mode 100644 index 0000000..e0e9c02 --- /dev/null +++ b/session_1/data_preparation/fourier_transform.ipynb @@ -0,0 +1,118 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "\n", + "SAMPLE_RATE = 44100 # Hertz\n", + "DURATION = 5 # Seconds\n", + "def generate_sine_wave(freq, sample_rate, duration):\n", + " x = np.linspace(0, duration, sample_rate * duration, endpoint=False)\n", + " frequencies = x * freq\n", + " # 2pi because np.sin takes radians\n", + " y = np.sin((2 * np.pi) * frequencies)\n", + " return x, y\n", + "\n", + "# Generate a 2 hertz sine wave that lasts for 5 seconds\n", + "x, y = generate_sine_wave(2, SAMPLE_RATE, DURATION)\n", + "plt.plot(x, y)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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ePnll83XDcPAvHnzMHLkSNTV1WHatGnYuHEj9xk7duzAueeei6amJgwcOBCzZs1CZ2dn0FORGrqu4wc/+AHGjx+Puro6HHjggbjhhhu487HUva4czz77LL7whS9g1KhRiMVieOSRR7jXvbqnr732Gk444QRkMhmMGTMGN954ozcTMBRCwwMPPGCkUinj7rvvNtavX29ceOGFxsCBA42tW7eGPbTIYPr06cY999xjrFu3zlizZo3x+c9/3hg7dqzR2dlpXnPxxRcbY8aMMZYsWWK8/PLLxnHHHWdMnTrVfL1QKBiHH364MW3aNGP16tXG448/bgwdOtS4+uqrw5iS9Fi5cqWx//77G0ceeaRx6aWXmn9X97l27Nixwxg3bpxx/vnnGytWrDDeeecd44knnjDefvtt85of//jHRnNzs/HII48Yr776qvHFL37RGD9+vNHT02Nec9pppxlHHXWUsXz5cuO5554zDjroIOOcc84JY0rS4kc/+pExZMgQ49FHHzU2bdpkPPzww0ZjY6Nx++23m9eoe105Hn/8ceP73/++8ac//ckAYPz5z3/mXvfinra3txstLS3Gueeea6xbt874/e9/b9TV1Rn/93//V/P4lVEUIo499lhj9uzZ5u+6rhujRo0y5s+fH+Kooo1t27YZAIxnnnnGMAzD2LVrl5FMJo2HH37YvOaNN94wABjLli0zDKMkxJqmGW1tbeY1P//5z42mpiYjm80GOwHJsXv3buPggw82Fi9ebHzmM58xjSJ1n73Bd7/7XePTn/606+vFYtEYMWKEcdNNN5l/27Vrl5FOp43f//73hmEYxuuvv24AMF566SXzmr///e9GLBYz3n//ff8GHzHMmDHD+MY3vsH97ctf/rJx7rnnGoah7rUXEI0ir+7pz372M2PQoEGc3vjud79rHHLIITWPWaXPQkIul8OqVaswbdo082+apmHatGlYtmxZiCOLNtrb2wEAgwcPBgCsWrUK+Xyeu88TJkzA2LFjzfu8bNkyHHHEEWhpaTGvmT59Ojo6OrB+/foARy8/Zs+ejRkzZnD3E1D32Sv89a9/xeTJk3HWWWdh+PDh+OQnP4lf/OIX5uubNm1CW1sbd5+bm5sxZcoU7j4PHDgQkydPNq+ZNm0aNE3DihUrgpuM5Jg6dSqWLFmCt956CwDw6quv4vnnn8fpp58OQN1rP+DVPV22bBlOPPFEpFIp85rp06djw4YN2LlzZ01jVAfChoTt27dD13VugwCAlpYWvPnmmyGNKtooFou47LLLcPzxx+Pwww8HALS1tSGVSmHgwIHctS0tLWhrazOvcXoO7DWFEh544AG88soreOmll2yvqfvsDd555x38/Oc/x9y5c/G9730PL730Ev7rv/4LqVQKM2fONO+T032k93n48OHc64lEAoMHD1b3meCqq65CR0cHJkyYgHg8Dl3X8aMf/QjnnnsuAKh77QO8uqdtbW0YP3687TPYa4MGDap6jMooUthrMHv2bKxbtw7PP/982EPZ67BlyxZceumlWLx4MTKZTNjD2WtRLBYxefJk/O///i8A4JOf/CTWrVuHhQsXYubMmSGPbu/CQw89hPvuuw/3338/DjvsMKxZswaXXXYZRo0ape71PgyVPgsJQ4cORTwet1XnbN26FSNGjAhpVNHFnDlz8Oijj+Kpp57C6NGjzb+PGDECuVwOu3bt4q6n93nEiBGOz4G9plBKj23btg3HHHMMEokEEokEnnnmGdxxxx1IJBJoaWlR99kDjBw5EhMnTuT+duihh2Lz5s0ArPtUTm+MGDEC27Zt414vFArYsWOHus8EV1xxBa666iqcffbZOOKII3Deeefh8ssvx/z58wGoe+0HvLqnfuoSZRSFhFQqhUmTJmHJkiXm34rFIpYsWYLW1tYQRxYtGIaBOXPm4M9//jOWLl1qC6lOmjQJyWSSu88bNmzA5s2bzfvc2tqKtWvXcoK4ePFiNDU12TaofRWnnHIK1q5dizVr1pj/Jk+ejHPPPdf8Wd3n2nH88cfbWkq89dZbGDduHABg/PjxGDFiBHefOzo6sGLFCu4+79q1C6tWrTKvWbp0KYrFIqZMmRLALKKB7u5uaBq/BcbjcRSLRQDqXvsBr+5pa2srnn32WeTzefOaxYsX45BDDqkpdQZAleSHiQceeMBIp9PGvffea7z++uvGRRddZAwcOJCrzlEoj0suucRobm42nn76aePDDz80/3V3d5vXXHzxxcbYsWONpUuXGi+//LLR2tpqtLa2mq+zUvFTTz3VWLNmjbFo0SJj2LBhqlR8D6DVZ4ah7rMXWLlypZFIJIwf/ehHxsaNG4377rvPqK+vN373u9+Z1/z4xz82Bg4caPzlL38xXnvtNeNLX/qSY0nzJz/5SWPFihXG888/bxx88MH7dJm4E2bOnGnst99+Zkn+n/70J2Po0KHGlVdeaV6j7nXl2L17t7F69Wpj9erVBgDjlltuMVavXm289957hmF4c0937dpltLS0GOedd56xbt0644EHHjDq6+tVSf7egJ/+9KfG2LFjjVQqZRx77LHG8uXLwx5SpADA8d8999xjXtPT02N861vfMgYNGmTU19cb//7v/258+OGH3Oe8++67xumnn27U1dUZQ4cONb7zne8Y+Xw+4NlEC6JRpO6zN/jb3/5mHH744UY6nTYmTJhg3HXXXdzrxWLR+MEPfmC0tLQY6XTaOOWUU4wNGzZw13z88cfGOeecYzQ2NhpNTU3GBRdcYOzevTvIaUiPjo4O49JLLzXGjh1rZDIZ44ADDjC+//3vc2Xe6l5XjqeeespRJ8+cOdMwDO/u6auvvmp8+tOfNtLptLHffvsZP/7xjz0Zf8wwSPtOBQUFBQUFBYV9FIpTpKCgoKCgoKAAZRQpKCgoKCgoKABQRpGCgoKCgoKCAgBlFCkoKCgoKCgoAFBGkYKCgoKCgoICAGUUKSgoKCgoKCgAUEaRgoKCgoKCggIAZRQpKCgoKCgoKABQRpGCgoKCgoKCAgBlFCkoKCgoKCgoAFBGkYKCgoKCgoICAGUUKSgoKCgoKCgAAP5/mwRC97ZfCAQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "_, nice_tone = generate_sine_wave(400, SAMPLE_RATE, DURATION)\n", + "_, noise_tone = generate_sine_wave(4000, SAMPLE_RATE, DURATION)\n", + "noise_tone = noise_tone * 0.3\n", + "mixed_tone = nice_tone + noise_tone\n", + "\n", + "\n", + "normalized_tone = np.int16((mixed_tone / mixed_tone.max()) * 32767)\n", + "plt.plot(normalized_tone[:1000])\n", + "plt.show()\n", + "\n", + "from scipy.io.wavfile import write\n", + "# Remember SAMPLE_RATE = 44100 Hz is our playback rate\n", + "write(\"../wav/mysinewave.wav\", SAMPLE_RATE, normalized_tone)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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rYSEhGa3SUhI8Gu8JDmdTjmdTn+m1i7pNyTo88endvjjAACAlvl1ZCQiIkJjx45VcXGx576mpiYVFxfL5XI1u43L5fIaL0lFRUUtjgcAAN2LX0dGJCknJ0ezZs3SzTffrHHjxunJJ5/U+fPnNXv2bElSZmamBg8erLy8PEnSgw8+qDvvvFPLly/X1KlTVVBQoL1792rt2rWBfSYAACAo+R0j9957r7744gstXrxYbrdbKSkp2r59u+ck1aqqKoWFfXfAZeLEidqwYYMefvhh/eEPf9C1116rwsJCjRo1KnDPAgAABC2HMcbYnoQvtbW1io2NVU1NjWJiYmxPBwAAtEFb/353yU/TAACA7oMYAQAAVhEjAADAKmIEAABYRYwAAACriBEAAGAVMQIAAKwiRgAAgFXECAAAsMrvr4O34dsvia2trbU8EwAA0Fbf/t329WXvQREj586dkyQlJiZangkAAPDXuXPnFBsb2+L6oLg2TVNTk06cOKHevXvL4XDYnk6ramtrlZiYqKNHj3IdnS6E16Xr4rXpmnhduqZge12MMTp37pwGDRrkdRHd/xUUR0bCwsI0ZMgQ29PwS0xMTFD8H6W74XXpunhtuiZel64pmF6X1o6IfIsTWAEAgFXECAAAsIoYCTCn06klS5bI6XTangq+h9el6+K16Zp4XbqmUH1dguIEVgAAELo4MgIAAKwiRgAAgFXECAAAsIoYAQAAVhEjzfj88881Z84cJSUlKSoqStdcc42WLFmiixcveo378MMPdfvttysyMlKJiYlaunTpJT9r06ZNGjFihCIjIzV69Ght27bNa70xRosXL9bAgQMVFRWltLQ0ffLJJ15jvvzyS82cOVMxMTHq06eP5syZo7q6usA/8SDw5z//WRMnTlR0dLT69OnT7JiqqipNnTpV0dHRiouL08KFC/X11197jdm5c6duuukmOZ1ODRs2TPn5+Zf8nNWrV+uqq65SZGSkxo8fr/fee89r/VdffaWsrCxdccUV6tWrl37605+quro6UE+1W/D1O4Z/SkpKNG3aNA0aNEgOh0OFhYVe6wO1vwnEvq+7yMvL0y233KLevXsrLi5OGRkZOnjwoNeYtuxLOmu/Zo3BJd544w1z3333mTfffNN8+umnZuvWrSYuLs4sWLDAM6ampsbEx8ebmTNnmsrKSrNx40YTFRVlnnvuOc+Yd955x4SHh5ulS5eaAwcOmIcfftj07NnT7Nu3zzPm8ccfN7GxsaawsNB88MEH5sc//rFJSkoyFy5c8IyZPHmySU5ONnv27DH//Oc/zbBhw8yMGTM655fRxSxevNisWLHC5OTkmNjY2EvWf/3112bUqFEmLS3NlJeXm23btpn+/fub3Nxcz5jPPvvMREdHm5ycHHPgwAGzatUqEx4ebrZv3+4ZU1BQYCIiIsy6devM/v37zdy5c02fPn1MdXW1Z8y8efNMYmKiKS4uNnv37jUTJkwwEydO7NDnH0ra8juGf7Zt22Yeeughs3nzZiPJbNmyxWt9IPY3gdr3dRfp6elm/fr1prKy0lRUVJgf/vCHZujQoaaurs4zxte+pDP3a7YQI220dOlSk5SU5Ln9zDPPmL59+5r6+nrPfb/73e/M8OHDPbd/9rOfmalTp3r9nPHjx5sHHnjAGGNMU1OTSUhIMMuWLfOsP3v2rHE6nWbjxo3GGGMOHDhgJJl//etfnjFvvPGGcTgc5vjx44F9kkFk/fr1zcbItm3bTFhYmHG73Z77nn32WRMTE+N5rRYtWmRuuOEGr+3uvfdek56e7rk9btw4k5WV5bnd2NhoBg0aZPLy8owx37xOPXv2NJs2bfKM+eijj4wkU1paGpDnGOp8/Y5xef43RgK1vwnEvq87O3XqlJFkdu3aZYxp276ks/ZrNvE2TRvV1NSoX79+ntulpaW64447FBER4bkvPT1dBw8e1JkzZzxj0tLSvH5Oenq6SktLJUmHDx+W2+32GhMbG6vx48d7xpSWlqpPnz66+eabPWPS0tIUFhamd999N/BPNMiVlpZq9OjRio+P99yXnp6u2tpa7d+/3zOmtdfl4sWLKisr8xoTFhamtLQ0z5iysjI1NDR4jRkxYoSGDh3qGYOWteV3jMAK1P4mEPu+7qympkaSPH9P2rIv6az9mk3ESBscOnRIq1at0gMPPOC5z+12e/0fQ5LnttvtbnXM99d/f7uWxsTFxXmt79Gjh/r16+cZg+9czutSW1urCxcu6PTp02psbPT5ukRERFxy3sr3x6BlbfkdI7ACtb8JxL6vu2pqatL8+fN16623atSoUZLati/prP2aTd0qRn7/+9/L4XC0unz88cde2xw/flyTJ0/W9OnTNXfuXEszD23teV0AINhkZWWpsrJSBQUFtqfS5fSwPYHOtGDBAt13332tjrn66qs9//vEiROaNGmSJk6cqLVr13qNS0hIuORs529vJyQktDrm++u/vW/gwIFeY1JSUjxjTp065fUzvv76a3355Zee7YOdv69LaxISEi45O7ytr0tMTIyioqIUHh6u8PBwn6/dxYsXdfbsWa9/0Xx/DFrWv39/n79jBFag9jeB2Pd1R9nZ2XrttddUUlKiIUOGeO5vy76ks/ZrNnWrIyMDBgzQiBEjWl2+fR/0+PHjSk1N1dixY7V+/XqFhXn/qlwul0pKStTQ0OC5r6ioSMOHD1ffvn09Y4qLi722KyoqksvlkiQlJSUpISHBa0xtba3effddzxiXy6WzZ8+qrKzMM2bHjh1qamrS+PHjA/jbscef18UXl8ulffv2ee1Qi4qKFBMTo5EjR3rGtPa6REREaOzYsV5jmpqaVFxc7BkzduxY9ezZ02vMwYMHVVVV5RmDlrXld4zACtT+JhD7vu7EGKPs7Gxt2bJFO3bsUFJSktf6tuxLOmu/ZpXtM2i7omPHjplhw4aZu+66yxw7dsycPHnSs3zr7NmzJj4+3vziF78wlZWVpqCgwERHR1/y8bYePXqYv/71r+ajjz4yS5YsafajvX369DFbt241H374obnnnnua/ajdmDFjzLvvvmvefvttc+2113bbj/YeOXLElJeXm0ceecT06tXLlJeXm/LycnPu3DljzHcfgbv77rtNRUWF2b59uxkwYECzH4FbuHCh+eijj8zq1aub/Qic0+k0+fn55sCBA+aXv/yl6dOnj9fZ7PPmzTNDhw41O3bsMHv37jUul8u4XK7O+2UEubb8juGfc+fOef6bkGRWrFhhysvLzZEjR4wxgdnfBGrf11386le/MrGxsWbnzp1ef0v++9//esb42pd05n7NFmKkGevXrzeSml2+74MPPjC33XabcTqdZvDgwebxxx+/5Ge9/PLL5rrrrjMRERHmhhtuMK+//rrX+qamJvPHP/7RxMfHG6fTae666y5z8OBBrzH/+c9/zIwZM0yvXr1MTEyMmT17tuePb3cza9asZl+Xt956yzPm888/N1OmTDFRUVGmf//+ZsGCBaahocHr57z11lsmJSXFREREmKuvvtqsX7/+ksdatWqVGTp0qImIiDDjxo0ze/bs8Vp/4cIF8+tf/9r07dvXREdHm5/85CdewQrffP2O4Z+33nqr2f8+Zs2aZYwJ3P4mEPu+7qKlvyXf3+e0ZV/SWfs1WxzGGNOJB2IAAAC8dKtzRgAAQNdDjAAAAKuIEQAAYBUxAgAArCJGAACAVcQIAACwihgBAABWESMAAMAqYgQAAFhFjAAAAKuIEQAAYBUxAgAArPr/f5aO7tmaW0IAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from scipy.fft import fft, fftfreq\n", + "# Number of samples in normalized_tone\n", + "N = SAMPLE_RATE * DURATION\n", + "yf = fft(normalized_tone)\n", + "xf = fftfreq(N, 1 / SAMPLE_RATE)\n", + "plt.plot(xf, np.abs(yf))\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/integration/data_integration.ipynb b/session_1/data_preparation/integration/data_integration.ipynb new file mode 100644 index 0000000..655005e --- /dev/null +++ b/session_1/data_preparation/integration/data_integration.ipynb @@ -0,0 +1,39 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\"Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/mysinewave.wav b/session_1/data_preparation/mysinewave.wav new file mode 100644 index 0000000..8cbf373 Binary files /dev/null and b/session_1/data_preparation/mysinewave.wav differ diff --git a/session_1/data_preparation/preprocessing_calibration/README.md b/session_1/data_preparation/preprocessing_calibration/README.md new file mode 100644 index 0000000..d8d6db0 --- /dev/null +++ b/session_1/data_preparation/preprocessing_calibration/README.md @@ -0,0 +1,26 @@ +## Data Cleaning + +This step involves identifying and correcting inaccuracies or inconsistencies in the data. It addresses issues such as missing values, outliers, duplicate records, and errors. The goal is to enhance the quality of the data, ensuring it is reliable for analysis. + +### [Removing Duplicates](./removing_duplicates.ipynb) + +Identifying and removing duplicate records in a customer database. + +For instance, when merging customer data from different sources, you might find that the same customer is listed multiple times with slightly different variations. + +### [Handling Missing Values](./filling_missing_data.ipynb) + +Dealing with missing data in a dataset. For instance, in a survey dataset, some respondents might have skipped certain questions, leading to missing values that need to be imputed or handled + +Two primary ways: (1) Ignore if the dataset is large, (2) fill in the missing values + +### [Outlier removal](./outlier_removal.ipynb) + +Outlier removal is a crucial process in data cleaning that involves identifying and eliminating data points that significantly deviate from the rest of the dataset. Outliers can arise due to various reasons, such as measurement errors, data entry mistakes, or genuine variability in the data. + +### [Time series preprocessing](time_series_data_preprocessing.ipynb) +Time series data refers to data that associates a timestamp with each recorded entry. These records may be incomplete, or the events may occur irregularly. + +### [Signal preprocessing](signal_preprocessing.ipynb) + +[Data preparation <- Previous](../README.md) \ No newline at end of file diff --git a/session_1/data_preparation/preprocessing_calibration/filling_missing_data.ipynb b/session_1/data_preparation/preprocessing_calibration/filling_missing_data.ipynb new file mode 100644 index 0000000..55bc373 --- /dev/null +++ b/session_1/data_preparation/preprocessing_calibration/filling_missing_data.ipynb @@ -0,0 +1,388 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fill in missing values\n", + "\n", + "- Method 1: Use the fillna() > Value to use to fill holes\n", + "- Method 2: Use the replace()\n", + "- Method 3: Use the interpolate()\n", + "\n", + "## Dropping rows or columns\n", + "\n", + "- Dropping the entire column\n", + "- Dropping the rows based on column\n", + "- Dropping NaN values\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import pandas as pd\n", + "import numpy as np\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Missing values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "import missingno as msno\n", + "\n", + "# Load the data\n", + "file_name = \"../../../data/insurance.csv\"\n", + "data = pd.read_csv(file_name)\n", + "\n", + "# Display the first 15 lines of data\n", + "print(data.head(15))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Visualize missing values using missingno\n", + "msno.matrix(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "msno.bar(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "msno.heatmap(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# how many values are missing for each column?\n", + "# isnull() or isna() can be used.\n", + "count_nan = data.isnull().sum()\n", + "print(\"Before filling\", count_nan)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# find rows with nan for 'bmi'\n", + "data_bmi_missing = data[data['bmi'].isna()]\n", + "print(data_bmi_missing)\n", + "data[\"bmi\"].plot()\n", + "\n", + "# Set x-axis limits\n", + "plt.xlim(1, 20)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# fill in with ffil method: with the value of the nearest one above it\n", + "data_forward_filled = data['bmi'].fillna(method='ffill', inplace=False)\n", + "print(data_forward_filled.head(15))\n", + "\n", + "data_forward_filled.plot()\n", + "\n", + "# Set x-axis limits\n", + "plt.xlim(1, 20)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# fill in with bfil method: with the value of the nearest one below it\n", + "data = pd.read_csv(file_name)\n", + "data['bmi'].fillna(method='bfill', inplace=True)\n", + "print(data.head(15))\n", + "\n", + "data[\"bmi\"].plot()\n", + "\n", + "# Set x-axis limits\n", + "plt.xlim(1, 20)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# fill in with mean-value for column 'bmi'\n", + "data = pd.read_csv(file_name)\n", + "data['bmi'].fillna(data['bmi'].mean(), inplace=True)\n", + "print(data.head(15))\n", + "\n", + "data[\"bmi\"].plot()\n", + "\n", + "# Set x-axis limits\n", + "plt.xlim(1, 20)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# fill in with median-value for column 'bmi'\n", + "data = pd.read_csv(file_name)\n", + "data['bmi'].fillna(data['bmi'].median(), inplace=True)\n", + "print(data.head(15))\n", + "\n", + "data[\"bmi\"].plot()\n", + "\n", + "# Set x-axis limits\n", + "plt.xlim(1, 20)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Method 2: Use the replace()\n", + "data = pd.read_csv(file_name)\n", + "data['bmi'].replace(np.nan, data['bmi'].median(), inplace=True)\n", + "print(data.head(15))\n", + "\n", + "data[\"bmi\"].plot()\n", + "\n", + "# Set x-axis limits\n", + "plt.xlim(1, 20)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Method 3: Use the interpolate()\n", + "data = pd.read_csv(file_name)\n", + "data.interpolate(method='linear', inplace=True)\n", + "print(data.head(15))\n", + "\n", + "data[\"bmi\"].plot()\n", + "\n", + "# Set x-axis limits\n", + "plt.xlim(1, 20)\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dropping rows or columns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping the entire column\n", + "data = pd.read_csv(file_name)\n", + "data.drop('bmi', axis=1, inplace=True)\n", + "count_nan = data.isnull().sum()\n", + "print(count_nan[count_nan > 0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping the rows based on column\n", + "data = pd.read_csv(file_name)\n", + "data.drop(data[data['bmi'].isna()].index, inplace=True)\n", + "count_nan = data.isnull().sum()\n", + "print(count_nan[count_nan > 0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping NaN values\n", + "data = pd.read_csv(file_name)\n", + "data.dropna(inplace=True)\n", + "data.reset_index(drop=True, inplace=True)\n", + "count_nan = data.isnull().sum()\n", + "print(count_nan[count_nan > 0])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# fill in with median-value for column 'bmi'\n", + "data = pd.read_csv(file_name)\n", + "data['bmi'].fillna(data['bmi'].median(), inplace=True)\n", + "print(data.head(15))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Method 2: Use the replace()\n", + "data = pd.read_csv(file_name)\n", + "data['bmi'].replace(np.nan, data['bmi'].median(), inplace=True)\n", + "print(data.head(15))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Method 3: Use the interpolate()\n", + "data = pd.read_csv(file_name)\n", + "data.interpolate(method='linear', inplace=True)\n", + "print(data.head(15))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# *** Dropping rows or columns ***\n", + "\n", + "# Dropping the entire column\n", + "data = pd.read_csv(file_name)\n", + "data.drop('bmi', axis=1, inplace=True)\n", + "count_nan = data.isnull().sum()\n", + "print(count_nan[count_nan > 0])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping the rows based on column\n", + "data = pd.read_csv(file_name)\n", + "data.drop(data[data['bmi'].isna()].index, inplace=True)\n", + "count_nan = data.isnull().sum()\n", + "print(count_nan[count_nan > 0])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Dropping NaN rows\n", + "data = pd.read_csv(file_name)\n", + "\n", + "data.dropna(inplace=True)\n", + "data.reset_index(drop=True, inplace=True)\n", + "count_nan = data.isnull().sum()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data cleaning <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/preprocessing_calibration/image_preprocessing.ipynb b/session_1/data_preparation/preprocessing_calibration/image_preprocessing.ipynb new file mode 100644 index 0000000..709d82c --- /dev/null +++ b/session_1/data_preparation/preprocessing_calibration/image_preprocessing.ipynb @@ -0,0 +1,18 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/preprocessing_calibration/outlier_removal.ipynb b/session_1/data_preparation/preprocessing_calibration/outlier_removal.ipynb new file mode 100644 index 0000000..5ec25ad --- /dev/null +++ b/session_1/data_preparation/preprocessing_calibration/outlier_removal.ipynb @@ -0,0 +1,296 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Determining Outlier\n", + "\n", + "\n", + "## [Standard deviation outlier](https://study.com/skill/learn/determining-outliers-using-standard-deviation-explanation.html)\n", + "\n", + "Standard deviation is a measure of the amount of variation or dispersion in a set of values. When it comes to identifying outliers, the standard deviation can be used to determine how far a data point is from the mean of the dataset. Outliers are typically defined as data points that are significantly different from the rest of the data.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "# Example 1: numpy array with outliers\n", + "import numpy as np\n", + "\n", + "# Create sample data\n", + "sample_data = np.array([5.7, 6.8, 9.4, 8.6, 7.1, 5.9, 8.3])\n", + "\n", + "# Add outlier points\n", + "outliers = np.array([200.5, 220.3, 0.05, 10.2])\n", + "sample_data_with_outliers = np.concatenate((sample_data, outliers))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Calculate mean and standard deviation\n", + "mean = sample_data_with_outliers.mean()\n", + "std_dev = sample_data_with_outliers.std()\n", + "\n", + "print(mean, std_dev)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Calculate upper and lower bounds\n", + "threshold = 2\n", + "\n", + "lower_limit = mean - threshold * std_dev\n", + "upper_limit = mean + threshold * std_dev\n", + "\n", + "# Calculate outliers\n", + "outliers = [x for x in sample_data_with_outliers if x > upper_limit or x < lower_limit]\n", + "outliers" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "filtered_data = [item for item in sample_data_with_outliers if item not in outliers]\n", + "filtered_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example 2: pandas dataframe with outliers\n", + "import pandas as pd\n", + "import seaborn as sns\n", + "\n", + "def generate_scores(mean=60,std_dev=12,num_samples=200):\n", + " np.random.seed(27)\n", + " scores = np.random.normal(loc=mean,scale=std_dev,size=num_samples)\n", + " scores = np.round(scores, decimals=0)\n", + " return scores\n", + "\n", + "scores_data = generate_scores()\n", + "\n", + "df_scores = pd.DataFrame(scores_data,columns=['score'])\n", + "\n", + "\n", + "# Calculate lower and upper limits\n", + "threshold = 3\n", + "lower_limit = df_scores['score'].mean() - threshold * df_scores['score'].std()\n", + "upper_limit = df_scores['score'].mean() + threshold * df_scores['score'].std()\n", + "\n", + "# Outliers\n", + "df_scores_filtered = df_scores[df_scores['score'].between(lower_limit, upper_limit) == False]\n", + "print(df_scores_filtered)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "# Plot distribution of scores\n", + "sns.set_theme()\n", + "plot = sns.displot(data=scores_data).set(title=\"Distribution of Scores\", xlabel=\"Scores\")\n", + "\n", + "# Add vertical lines for lower and upper limits\n", + "for ax in plot.axes.flat:\n", + " ax.axvline(lower_limit, color='r', linestyle='--', label='Lower Limit')\n", + " ax.axvline(upper_limit, color='r', linestyle='--', label='Upper Limit')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## [IQR outlier](https://www.geeksforgeeks.org/interquartile-range-to-detect-outliers-in-data/)\n", + "\n", + "The Interquartile Range (IQR) method is a statistical technique used to identify outliers in a dataset. \n", + "The IQR method is based on the spread of the middle 50% of the data.\n", + "\n", + "Steps to Identify Outliers Using IQR\n", + "\n", + "- Calculate the First Quartile (Q1):\n", + "\n", + "Q1 is the 25th percentile of the data. It represents the value below which 25% of the data falls.\n", + "\n", + "- Calculate the Third Quartile (Q3):\n", + "\n", + "Q3 is the 75th percentile of the data. It represents the value below which 75% of the data falls.\n", + "\n", + "- Calculate the Interquartile Range (IQR):\n", + "\n", + "IQR is the difference between Q3 and Q1.\n", + "( $\\text{IQR} = Q3 - Q1 $)\n", + "\n", + "- Define the Bounds for Outliers:\n", + "\n", + "Lower Bound: ($\\text{Lower Bound} = Q1 - 1.5 \\times \\text{IQR}$) \\\n", + "Upper Bound: ($\\text{Upper Bound} = Q3 + 1.5 \\times \\text{IQR}$)\n", + "\n", + "- Identify Outliers:\n", + "\n", + "Any data point below the lower bound or above the upper bound is considered an outlier." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# IQR\n", + "def find_outliers_iqr(data, threshold=3):\n", + " # Calculate Q1 (25th percentile) and Q3 (75th percentile)\n", + " data_series = pd.Series(data)\n", + " q1 = data_series.quantile(0.25)\n", + " q3 = data_series.quantile(0.75)\n", + "\n", + " # Calculate IQR\n", + " IQR = q3 - q1\n", + "\n", + " # Define bounds for outliers\n", + " lower_bound = q1 - threshold * IQR\n", + " upper_bound = q3 + threshold * IQR\n", + "\n", + " # Identify outliers\n", + " outliers = data_series[(data_series < lower_bound) | (data_series > upper_bound)]\n", + " return outliers\n", + "\n", + "\n", + "print(find_outliers_iqr(generate_scores(),2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## [Binning outlier](https://www.geeksforgeeks.org/binning-data-in-python-with-scipy-numpy/)\n", + "\n", + "\n", + "Binning is a data preprocessing technique used to group a range of values into a smaller number of \"bins.\" \n", + "This can be useful for various purposes, such as smoothing noisy data, reducing the impact of minor observation errors, or transforming continuous data into categorical data.\n", + "\n", + "width = (max - min) / number_of_bins\n", + "bins_values = [min, min + width, min + 2 * width, ..., min + number_of_bins * width]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\" Example 1: This example demonstrates how to:\n", + " - Generate random data using np.random.rand.\n", + " - Define bin edges using np.linspace.\n", + " - Bin the data using np.digitize.\n", + " - Calculate histogram counts using np.bincount\n", + "\"\"\"\n", + " \n", + "# Generate some example data\n", + "data = np.random.rand(100)\n", + "print(\"Data:\", data, len(data))\n", + "\n", + "# Define bin edges using linspace\n", + "bin_edges = np.linspace(0, 1, 6) # Create 5 bins from 0 to 1\n", + "print(\"Bin Edges:\", bin_edges,len(bin_edges))\n", + " \n", + "# Bin the data using digitize\n", + "bin_indices = np.digitize(data, bin_edges)\n", + "print(\"Bin Indices:\", bin_indices,len(bin_indices))\n", + " \n", + "# Calculate histogram counts using bin count\n", + "hist = np.bincount(bin_indices)\n", + "print(\"Histogram Counts:\", hist)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\" Example 2: This example demonstrates how to:\n", + "- Create bins using np.linspace.\n", + "- Assign data points to bins using np.digitize.\n", + "- Count the occurrences of data points in each bin using np.bincount\n", + "\"\"\"\n", + "\n", + "def find_outliers_binning(data, number_of_bins):\n", + " \n", + " # Creates an array of number_of_bins equally spaced values between the minimum and maximum values in data. \n", + " # These values represent the edges of the bins.\n", + " bins = np.linspace(min(data), max(data), number_of_bins) \n", + " \n", + " # Assigns each value in data to a bin. \n", + " # It returns an array where each element is the index of the bin to which the corresponding element in data belongs.\n", + " digitized = np.digitize(data, bins)\n", + "\n", + " # Counts the number of occurrences of each bin index in digitized. \n", + " # It returns an array where the value at each index is the count of data points in the corresponding bin.\n", + " return np.bincount(digitized)\n", + "\n", + "number_of_bins = 4\n", + "find_outliers_binning(sample_data, number_of_bins)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## [Dealing with Outliers Using Three Robust Linear Regression Models](https://developer.nvidia.com/blog/dealing-with-outliers-using-three-robust-linear-regression-models/)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data cleaning <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/preprocessing_calibration/removing_duplicates.ipynb b/session_1/data_preparation/preprocessing_calibration/removing_duplicates.ipynb new file mode 100644 index 0000000..fd0be32 --- /dev/null +++ b/session_1/data_preparation/preprocessing_calibration/removing_duplicates.ipynb @@ -0,0 +1,137 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Simple Example\n", + "To remove all duplicated/identical rows, use the function drop_duplicates() in pandas.DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "\n", + "# Sample DataFrame\n", + "data = {\n", + " 'Name': ['John', 'Anna', 'John', 'Mike'],\n", + " 'Age': [28, 24, 28, 30]\n", + "}\n", + "df_data = pd.DataFrame(data)\n", + "\n", + "# Remove duplicates\n", + "df_data.drop_duplicates(inplace=True)\n", + "df_no_duplicates = df_data.drop_duplicates()\n", + "print(df_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## More advance example\n", + "Cleaning data based on duplictes of a specific column" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# Read data\n", + "slm = pd.read_excel(\"../../../data/slm_research.xlsm\", sheet_name=\"all_db_initial_search\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Display the initial columns\n", + "print(\"Initial columns:\", slm.columns.tolist())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Delete specific columns\n", + "columns_to_delete = [\"Related\", \"Comments\", \"Item Type\", \"Kolonne1\", \"Kolonne2\"]\n", + "try:\n", + " slm.drop(columns=columns_to_delete, inplace=True)\n", + "except Exception as e:\n", + " print(\"Error:\", e)\n", + " \n", + "slm.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Total number of rows\n", + "print(\"Total number of rows:\", slm.shape[0])\n", + "\n", + "# Find the number of duplicates\n", + "print(\"Number of duplicates:\", slm.duplicated().sum())\n", + "\n", + "# Find the number of duplicates on the basis of title\n", + "slm_duplicated_title = slm[slm.duplicated(subset=[\"Title\"])]\n", + "print(\"Number of duplicates on the basis of title:\", slm_duplicated_title[\"Title\"].sum())\n", + "\n", + "# Find the duplicates on the basis of title\n", + "for index, row in slm_duplicated_title.iterrows():\n", + " print(\"Title:\", row[\"Title\"], \", Publication Year:\", row[\"Publication Year\"], \", Database:\", row[\"Database\"])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Find the number of each duplicated title\n", + "print(\"Number of each duplicated title:\")\n", + "print(slm_duplicated_title[\"Title\"].value_counts())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data cleaning <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/preprocessing_calibration/signal_preprocessing.ipynb b/session_1/data_preparation/preprocessing_calibration/signal_preprocessing.ipynb new file mode 100644 index 0000000..22c1eab --- /dev/null +++ b/session_1/data_preparation/preprocessing_calibration/signal_preprocessing.ipynb @@ -0,0 +1,385 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Signal filtering\n", + "\n", + "Simple Moving Average (SMA): a commonly used statistical measure in time series analysis and financial analysis to smooth out short-term fluctuations and highlight longer-term trends or cycles.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Example: mean value filtering (simple moving averafe, low-pass filtering)\n", + "\n", + "This example implements a Simple Moving Average (SMA) filter to smooth a noisy sine wave signal.\n", + "\n", + "\\\n", + "" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "\n", + "def fun_ma_filter(ym_k, ma_array):\n", + " \n", + " # Updating meas array with new measurement:\n", + " ma_array = np.roll(ma_array,1)\n", + " ma_array[0] = ym_k\n", + " yf_k = np.mean(ma_array)\n", + " \n", + " return (yf_k, ma_array)\n", + "\n", + "# Simulation time settings:\n", + "dt = 0.01 # delta time in seconds\n", + "ts = 0 # start time\n", + "te = 20 # end time\n", + "ns = int((te - ts)/dt) + 1 # Num time-steps\n", + "\n", + "# Preallocation of arrays for plotting:\n", + "t = np.zeros(ns)\n", + "yp = np.zeros(ns)\n", + "yn = np.zeros(ns)\n", + "ym = np.zeros(ns)\n", + "yf = np.zeros(ns)\n", + "\n", + "P = 10 # [s] Period of sine\n", + "a_yn = 0.2 # Ampl of uniformly distributed random noise\n", + "samples_yn = 1 # Filter param\n", + "\n", + "Nf = 25 # Filter length\n", + "ma = np.zeros(Nf) # Array of measurements used for filtering\n", + "\n", + "\n", + "\n", + "for k in range(0, ns):\n", + "\n", + " t_k = k*dt # Time\n", + "\n", + " # Signals:\n", + " yp_k = np.sin(2*np.pi*(1/P)*t_k) # Periodic sine\n", + " yn_k = np.random.uniform(-a_yn, a_yn, samples_yn)[0] # Uniformly distributed random noise\n", + " ym_k = yp_k + yn_k # Measurement\n", + "\n", + " # MA filter:\n", + " (yf_k, ma) = fun_ma_filter(ym_k, ma)\n", + " \n", + " # Arrays for plotting:\n", + " t[k] = t_k\n", + " yp[k] = yp_k\n", + " yn[k] = yn_k\n", + " ym[k] = ym_k\n", + " yf[k] = yf_k\n", + " \n", + "# Plotting:\n", + "plt.figure(1, figsize=(12, 9))\n", + "\n", + "plt.plot(t, ym, color='#CCCCCC', label='ym')\n", + "plt.plot(t, yp, 'b', label='yp')\n", + "plt.plot(t, yf, 'r', label='yf')\n", + "plt.legend()\n", + "plt.xlabel('t_k [s]')\n", + "plt.grid()\n", + "\n", + "# plt.savefig('../../images/mean_value_filtering.pdf')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Show portion of the graph with MA filter:\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "\n", + "def fun_ma_filter(ym_k, ma_array):\n", + " \n", + " # Updating meas array with new measurement:\n", + " ma_array = np.roll(ma_array,1)\n", + " ma_array[0] = ym_k\n", + " yf_k = np.mean(ma_array)\n", + " \n", + " return (yf_k, ma_array)\n", + "\n", + "# Simulation time settings:\n", + "dt = 0.01 # delta time in seconds\n", + "ts = 0 # start time\n", + "te = 20 # end time\n", + "ns = int((te - ts)/dt) + 1 # Num time-steps\n", + "\n", + "# Preallocation of arrays for plotting:\n", + "t = np.zeros(ns)\n", + "yp = np.zeros(ns)\n", + "yn = np.zeros(ns)\n", + "ym = np.zeros(ns)\n", + "yf = np.zeros(ns)\n", + "\n", + "P = 10 # [s] Period of sine\n", + "a_yn = 0.2 # Ampl of uniformly distributed random noise\n", + "samples_yn = 1 # Filter param\n", + "\n", + "Nf = 50 # Filter length\n", + "ma = np.zeros(Nf) # Array of measurements used for filtering\n", + "ma_values = np.zeros((ns, Nf)) # Store the MA filter values for each time step\n", + "\n", + "for k in range(0, ns):\n", + "\n", + " t_k = k*dt # Time\n", + "\n", + " # Signals:\n", + " yp_k = np.sin(2*np.pi*(1/P)*t_k) # Periodic sine\n", + " yn_k = np.random.uniform(-a_yn, a_yn, samples_yn)[0] # Uniformly distributed random noise\n", + " ym_k = yp_k + yn_k # Measurement\n", + "\n", + " # MA filter:\n", + " (yf_k, ma) = fun_ma_filter(ym_k, ma)\n", + " # Store the MA filter values\n", + " ma_values[k, :] = ma\n", + " \n", + " # Arrays for plotting:\n", + " t[k] = t_k\n", + " yp[k] = yp_k\n", + " yn[k] = yn_k\n", + " ym[k] = ym_k\n", + " yf[k] = yf_k\n", + " \n", + "# Plotting:\n", + "plt.figure(1, figsize=(12, 9))\n", + "\n", + "plt.plot(t, ym, color='#CCCCCC', label='ym')\n", + "plt.plot(t, yp, 'b', label='yp')\n", + "plt.plot(t, yf, 'r', label='yf')\n", + "\n", + "# Plot the MA filter values as squares\n", + "for k in range(0, ns, Nf):\n", + " if k + Nf < ns:\n", + " plt.fill_between(t[k:k+Nf], ma_values[k, 0], ma_values[k, -1], color='g', alpha=0.3, label='ma' if k == 0 else '')\n", + "\n", + "\n", + "plt.legend()\n", + "plt.xlabel('t_k [s]')\n", + "plt.grid()\n", + "#plt.savefig('../../images/plot_ma_filt.png')\n", + "\n", + "# Zoom in on a specific portion of the graph\n", + "plt.xlim(0, 2) # Adjust the x-axis limits as needed\n", + "plt.ylim(-1.5, 1.5) # Adjust the y-axis limits as needed\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Simpler version (no loops):\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Define the global variable\n", + "Nf = 25 # Filter length\n", + "g_ma = np.zeros(Nf) # Array of measurements used for filtering\n", + "\n", + "def fun_ma_filter(ym_k):\n", + " global g_ma # Declare g_ma as global\n", + " g_ma = np.roll(g_ma, 1) # Updating meas array with new measurement\n", + " g_ma[0] = ym_k\n", + " yf_k = np.mean(g_ma) \n", + " return yf_k\n", + "\n", + "# Simulation time settings:\n", + "dt = 0.01 # delta time in seconds\n", + "ts = 0 # start time\n", + "te = 20 # end time\n", + "ns = int((te - ts)/dt) + 1 # Num time-steps\n", + "\n", + "t = np.linspace(ts, te, ns)\n", + "\n", + "P = 10 # [s] Period of sine\n", + "a_yn = 0.2 # Ampl of uniformly distributed random noise\n", + "samples_yn = 1 # Filter param\n", + "\n", + "yp = np.sin(2*np.pi*(1/P)*t) # Periodic sine\n", + "ym = [p + np.random.uniform(-a_yn, a_yn, samples_yn)[0] for p in yp] # Measurement (sine + noise)\n", + "yf = [fun_ma_filter(ym_k) for ym_k in ym] # MA filter\n", + "\n", + "# Plotting:\n", + "plt.figure(1, figsize=(12, 9))\n", + "\n", + "plt.plot(t, ym, color='#CCCCCC', label='ym')\n", + "plt.plot(t, yp, 'b', label='yp')\n", + "plt.plot(t, yf, 'r', label='yf')\n", + "plt.legend()\n", + "plt.xlabel('t_k [s]')\n", + "plt.grid()\n", + "\n", + "# plt.savefig('plot_ma_filt.pdf')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## ECG signal (from [MIT-BIH Arrhythmia Database](https://physionet.org/content/mitdb/1.0.0/))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import wfdb\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Download a sample ECG record from the MIT-BIH Arrhythmia Database\n", + "record = wfdb.rdrecord('100', sampfrom=0, sampto=1000, pn_dir='mitdb')\n", + "\n", + "# Extract the signal and time\n", + "ecg_signal = record.p_signal[:, 0]\n", + "times = np.arange(len(ecg_signal)) / record.fs\n", + "\n", + "# Plot the ECG signal\n", + "plt.plot(times, ecg_signal)\n", + "plt.xlabel('Time [s]')\n", + "plt.ylabel('Amplitude')\n", + "plt.title('ECG Signal')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Low-pass filter" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import scipy.signal as signal\n", + "\n", + "def lowpass(data: np.ndarray, cutoff: float, sample_rate: float, poles: int = 5):\n", + " sos = signal.butter(poles, cutoff, 'lowpass', fs=sample_rate, output='sos')\n", + " filtered_data = signal.sosfiltfilt(sos, data)\n", + " return filtered_data\n", + "\n", + "filtered = lowpass(ecg_signal, 50, record.fs)\n", + "\n", + "# Plot the ECG signal\n", + "plt.plot(times, filtered)\n", + "plt.xlabel('Time [s]')\n", + "plt.ylabel('Amplitude')\n", + "plt.title('ECG Signal')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## High-pass filter" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def highpass(data: np.ndarray, cutoff: float, sample_rate: float, poles: int = 5):\n", + " sos = signal.butter(poles, cutoff, 'highpass', fs=sample_rate, output='sos')\n", + " filtered_data = signal.sosfiltfilt(sos, data)\n", + " return filtered_data\n", + "\n", + "filtered = highpass(ecg_signal, 50, record.fs)\n", + "\n", + "# Plot the ECG signal\n", + "plt.plot(times, filtered)\n", + "plt.xlabel('Time [s]')\n", + "plt.ylabel('Amplitude')\n", + "plt.title('ECG Signal')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Band-pass filter" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def bandpass(data: np.ndarray, edges: list[float], sample_rate: float, poles: int = 5):\n", + " sos = signal.butter(poles, edges, 'bandpass', fs=sample_rate, output='sos')\n", + " filtered_data = signal.sosfiltfilt(sos, data)\n", + " return filtered_data\n", + "\n", + "filtered = bandpass(ecg_signal, [10, 50], record.fs)\n", + "\n", + "# Plot the ECG signal\n", + "plt.plot(times, filtered)\n", + "plt.xlabel('Time [s]')\n", + "plt.ylabel('Amplitude')\n", + "plt.title('ECG Signal')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data preparation <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/preprocessing_calibration/time_series_data_preprocessing.ipynb b/session_1/data_preparation/preprocessing_calibration/time_series_data_preprocessing.ipynb new file mode 100644 index 0000000..6044081 --- /dev/null +++ b/session_1/data_preparation/preprocessing_calibration/time_series_data_preprocessing.ipynb @@ -0,0 +1,236 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time series data preprocessing\n", + "\n", + "pandas -> fillna(method = ???)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sample data sets from pydataset\n", + "\n", + "https://pydataset.readthedocs.io/en/latest/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pydataset import data\n", + "\n", + "# Get metadata about all datasets\n", + "datasets_info = data()\n", + "\n", + "# Print the first few rows to see the descriptions\n", + "print(datasets_info.head())\n", + "\n", + "# Time series datasets\n", + "time_series_datasets = datasets_info[datasets_info['title'].str.contains('time series', case=False)]\n", + "print(time_series_datasets.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Load the economics dataset\n", + "\n", + "The \"economics\" dataset is a dataset that contains US economic time series data. \n", + "It typically includes various economic indicators over time, such as unemployment rates, personal savings rates, and other relevant economic metrics. \n", + "The dataset is often used for time series analysis and forecasting in the context of economic studies." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "economics_data = data('economics')\n", + "\n", + "# Print the first few rows of the dataset\n", + "print(economics_data.head())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "economics_data.plot(x='date', y='unemploy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduce a large discrepancy in the unemploy column at a specific data range" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The bitwise '&' operator is used in series instead of boolean 'and' operator\n", + "# define a variable of type binary\n", + "a = 0b1010 # 1010 in binary is 10 in decimal\n", + "b = 0b1011 # 1011 in binary is 11 in decimal\n", + "\n", + "# bitwise AND operation\n", + "print(a & b) # 1010 & 1011 = 1010" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "\n", + "# Introduce a large discrepancy in the unemploy column at a specific data range\n", + "# Define the start and end dates\n", + "start_date = '1992-01-01'\n", + "end_date = '1997-01-01'\n", + "\n", + "# Set unemploy values to None between the start and end dates\n", + "economics_data.loc[(economics_data['date'] >= start_date) & (economics_data['date'] <= end_date), 'unemploy'] = None\n", + "economics_data.plot(x='date', y='unemploy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## pandas -> fillna (method = ffill)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Fill missing data using forward fill method\n", + "economics_data_ffill = economics_data.copy()\n", + "economics_data_ffill['unemploy'] = economics_data_ffill['unemploy'].fillna(method='ffill')\n", + "\n", + "# Print the modified dataset to verify the changes\n", + "print(economics_data_ffill[(economics_data_ffill['date'] >= start_date) & (economics_data_ffill['date'] <= end_date)])\n", + "\n", + "economics_data_ffill.plot(x='date', y='unemploy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## pandas -> fillna (method = df[...].mean())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Fill missing data using forward fill method\n", + "economics_data_mean = economics_data.copy()\n", + "mean_unemploy = economics_data['unemploy'].mean()\n", + "economics_data_mean['unemploy'] = economics_data_mean['unemploy'].fillna(mean_unemploy)\n", + "\n", + "# Print the modified dataset to verify the changes\n", + "print(economics_data_mean[(economics_data_mean['date'] >= start_date) & (economics_data_mean['date'] <= end_date)])\n", + "\n", + "economics_data_mean.plot(x='date', y='unemploy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## pandas -> fillna(method = 'linear')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Fill missing data using linear interpolation and save to a new DataFrame\n", + "economics_data_linear = economics_data.copy()\n", + "economics_data_linear['unemploy'] = economics_data_linear['unemploy'].interpolate(method='linear')\n", + "\n", + "# Print the modified dataset to verify the changes\n", + "print(economics_data_linear[(economics_data_linear['date'] >= start_date) & (economics_data_linear['date'] <= end_date)])\n", + "\n", + "# Plot the modified dataset\n", + "economics_data_linear.plot(x='date', y='unemploy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## pandas -> fillna(method = 'polynominal', order = 2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Fill missing data using polynomial interpolation (order=3) and save to a new DataFrame\n", + "economics_data_poly3 = economics_data.copy()\n", + "economics_data_poly3['unemploy'] = economics_data_poly3['unemploy'].interpolate(method='polynomial', order=2)\n", + "\n", + "# Print the modified dataset to verify the changes\n", + "print(economics_data_poly3[(economics_data_poly3['date'] >= start_date) & (economics_data_poly3['date'] <= end_date)])\n", + "\n", + "# Plot the modified dataset\n", + "economics_data_poly3.plot(x='date', y='unemploy')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Data preparation <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/data_preparation/task_2.md b/session_1/data_preparation/task_2.md new file mode 100644 index 0000000..1a72f8e --- /dev/null +++ b/session_1/data_preparation/task_2.md @@ -0,0 +1,18 @@ +## Task: Analyzing and Visualizing Existing Datasets + +Continue with [task 1](../understanding_data/task_1.md). + +3. **Data Cleaning**: + - Check for missing values and handle them appropriately. + - Remove any duplicate records if present. + - Perform any necessary data type conversions. + +4. **Exploratory Data Analysis (EDA)**: + - Generate summary statistics for the dataset. + - Create visualizations to explore the relationships between different variables. Use seaborn for creating plots such as pairplots, histograms, boxplots, and scatter plots. + +5. **Feature Engineering**: + - Create new features if necessary to enhance the dataset. + - Normalize or standardize the data if required. + +[Understanding Data <- Previous](./README.md) \ No newline at end of file diff --git a/session_1/images/README.md b/session_1/images/README.md new file mode 100644 index 0000000..d36c752 --- /dev/null +++ b/session_1/images/README.md @@ -0,0 +1 @@ +Images used in session 1 \ No newline at end of file diff --git a/session_1/images/crisp_1.png b/session_1/images/crisp_1.png new file mode 100644 index 0000000..c304d8c Binary files /dev/null and b/session_1/images/crisp_1.png differ diff --git a/session_1/images/crisp_2.png b/session_1/images/crisp_2.png new file mode 100644 index 0000000..6e8ffc3 Binary files /dev/null and b/session_1/images/crisp_2.png differ diff --git a/session_1/images/data_integration.png b/session_1/images/data_integration.png new file mode 100644 index 0000000..f244ed6 Binary files /dev/null and b/session_1/images/data_integration.png differ diff --git a/session_1/images/fuel_consumption.png b/session_1/images/fuel_consumption.png new file mode 100644 index 0000000..bddc268 Binary files /dev/null and b/session_1/images/fuel_consumption.png differ diff --git a/session_1/images/least_square_method.png b/session_1/images/least_square_method.png new file mode 100644 index 0000000..e27bb2b Binary files /dev/null and b/session_1/images/least_square_method.png differ diff --git a/session_1/images/linear_regression_line.png b/session_1/images/linear_regression_line.png new file mode 100644 index 0000000..4bbb981 Binary files /dev/null and b/session_1/images/linear_regression_line.png differ diff --git a/session_1/images/mean_value_filtering.png b/session_1/images/mean_value_filtering.png new file mode 100644 index 0000000..56bc340 Binary files /dev/null and b/session_1/images/mean_value_filtering.png differ diff --git a/session_1/images/plot_ma_filt.png b/session_1/images/plot_ma_filt.png new file mode 100644 index 0000000..2d588ca Binary files /dev/null and b/session_1/images/plot_ma_filt.png differ diff --git a/session_1/images/signal_window.png b/session_1/images/signal_window.png new file mode 100644 index 0000000..4c3b914 Binary files /dev/null and b/session_1/images/signal_window.png differ diff --git a/session_1/modelling/README.md b/session_1/modelling/README.md new file mode 100644 index 0000000..4b8565d --- /dev/null +++ b/session_1/modelling/README.md @@ -0,0 +1,19 @@ + +# 3. Linear models + +A fundamental and often used form of predictive analysis is [linear regression](https://www.statisticssolutions.com/free-resources/directory-of-statistical-analyses/what-is-linear-regression/) + +We use models to make predictions. +In this lesson, we demonstrate two commonly used regression models + +- [Linear regression](regression/linear/linear_regression.ipynb): Simple linear regression is about explaining the dependent variable Y with independent variable X. + +- [Polynomial regression](regression/polynomial/linear_regression_poly.ipynb): Our data may not have a linear relationship, but still, we may use a linear model to fit nonlinear data. One method is to add capabilities to each variable as if they were new variables, or new features. Then, a model will be trained using these variables. This linear model is referred to as polynomial regression. + +- [Multiple regression](multiple/multiple_feature_regression.ipynb): Is similar to linear regression, but with more than one independent value, in which we attempt to predict a value using two or more independent variables. + +- [Robust Linear Regression Models](linear_regression_models.ipynb): Dealing with Outliers Using Three Robust Linear Regression Models. + + +[Predictive Analytics <- Previous](../README.md) | +[Next -> CRISP DM: Complete example](../crisp_dm/README.md) diff --git a/session_1/modelling/linear_regression_models.ipynb b/session_1/modelling/linear_regression_models.ipynb new file mode 100644 index 0000000..883eaa0 --- /dev/null +++ b/session_1/modelling/linear_regression_models.ipynb @@ -0,0 +1,242 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# https://developer.nvidia.com/blog/dealing-with-outliers-using-three-robust-linear-regression-models/\n", + "\n", + "# Setup\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from sklearn import datasets\n", + "from sklearn.linear_model import (LinearRegression, HuberRegressor,\n", + " \tRANSACRegressor, TheilSenRegressor)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sample Data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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G4ahZcuWqbCwUAMHDlRZWZnef/99cwabBAgzNrdr1y75fD49+OCD2rlzp375y19q7dq1uvnmm80eWsw9/vjjWrRokZYvX66amhqdeeaZmjlzpg4cOGD20OLqpZdeUkVFhV599VVt3rxZHR0duvDCC9XS0mL20BLmtdde04MPPqgzzjjD7KEkxKeffqpp06YpIyNDf/rTn1RXV6ef//znOvHEE80eWlzdddddWrNmjVavXq133nlHd911l1atWqX777/f7KHFXEtLi84880w98MADIe9ftWqV7rvvPq1du1bbt2/XoEGDNHPmTLW2tiZ4pEnCQMpZtWqVUVRUZPYwYm7y5MlGRUVF4Huv12uMGDHCWLlypYmjSrwDBw4YkoyXXnrJ7KEkxJEjR4yxY8camzdvNv7lX/7FuO6668weUtwtXrzYOOecc8weRsLNmjXL+OEPfxh02yWXXGJcccUVJo0oMSQZTz75ZOB7n89nuFwu4+677w7cdvjwYSMrK8v43e9+Z8IIzcfMTApyu93Kz883exgx1d7erjfeeENlZWWB29LS0lRWVqaqqioTR5Z4brdbkmz33ziciooKzZo1K+i/vd0988wzOuuss3TppZdq+PDhmjBhgh5++GGzhxV3U6dO1ZYtW/Tee+9Jkt566y29/PLL+sY3vmHyyBKrvr5ejY2NQf/mnU6npkyZknK/7/xSotEkvrB7927df//9uueee8weSkx98skn8nq9KigoCLq9oKBAu3btMmlUiefz+bRw4UJNmzZNJSUlZg8n7h577DHV1NTotddeM3soCfXBBx9ozZo1WrRokW6++Wa99tpr+s///E9lZmZq7ty5Zg8vbpYsWSKPx6PTTjtN6enp8nq9uuOOO3TFFVeYPbSEamxslKSQv+/896UaZmYsasmSJXI4HD1+Hf9HfN++fSovL9ell16qq6++2qSRI54qKipUW1urxx57zOyhxN3HH3+s6667To8++qiys7PNHk5C+Xw+TZw4UT/72c80YcIEXXPNNbr66qu1du1as4cWV7///e/16KOPauPGjaqpqdEjjzyie+65R4888ojZQ4PJmJmxqBtuuEFXXnllj9eccsopgf+9f/9+TZ8+XVOnTtVDDz0U59El3tChQ5Wenq6mpqag25uamuRyuUwaVWItWLBAzz77rLZt26aRI0eaPZy4e+ONN3TgwAFNnDgxcJvX69W2bdu0evVqtbW1KT093cQRxk9hYaGKi4uDbjv99NP1xz/+0aQRJcZPfvITLVmyRJdddpkkady4cfroo4+0cuVKW89IHc//O62pqUmFhYWB25uamjR+/HiTRmUuwoxFDRs2TMOGDYvq2n379mn69OmaNGmS1q1bp7Q0+03IZWZmatKkSdqyZYsuvvhiSZ2fXrds2aIFCxaYO7g4MwxDP/7xj/Xkk0/qxRdfVFFRkdlDSogLLrhAb7/9dtBtV111lU477TQtXrzYtkFGkqZNm9bt+P17772nk046yaQRJcbRo0e7/f5KT0+Xz+czaUTmKCoqksvl0pYtWwLhxePxaPv27Zo/f765gzMJYcbm9u3bp/POO08nnXSS7rnnHh08eDBwn91mLBYtWqS5c+fqrLPO0uTJk3XvvfeqpaVFV111ldlDi6uKigpt3LhRTz/9tHJzcwNr5k6nUwMHDjR5dPGTm5vbbV/QoEGDNGTIENvvF7r++us1depU/exnP9N3v/tdVVdX66GHHrLlrGtXs2fP1h133KHRo0frq1/9qt5880394he/0A9/+EOzhxZzn332mXbv3h34vr6+Xjt27FB+fr5Gjx6thQsX6qc//anGjh2roqIiLV26VCNGjAh8mEs5Zh+nQnytW7fOkBTyy47uv/9+Y/To0UZmZqYxefJk49VXXzV7SHEX7r/vunXrzB5awqXK0WzDMIxNmzYZJSUlRlZWlnHaaacZDz30kNlDijuPx2Ncd911xujRo43s7GzjlFNOMW655Rajra3N7KHF3AsvvBDy53ru3LmGYXQez166dKlRUFBgZGVlGRdccIHx7rvvmjtoEzkMw4alEwEAQMqw3+YJAACQUggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0v4/kYGxR3tp/CAAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Source: https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_regression.html#sklearn.datasets.make_regression\n", + "\n", + "N_SAMPLES = 500\n", + "N_OUTLIERS = 25\n", + "\n", + "# Create sample regression dataset\n", + "X, y, coef = datasets.make_regression(\n", + "\tn_samples=N_SAMPLES,\n", + "\tn_features=1,\n", + "\tn_informative=1,\n", + "\tnoise=20,\n", + "\tcoef=True,\n", + "\trandom_state=42\n", + ")\n", + "\n", + "coef_list = [[\"original_coef\", float(coef)]]\n", + "\n", + "# add outliers \t \n", + "np.random.seed(42)\n", + "X[:N_OUTLIERS] = 10 + 0.75 * np.random.normal(size=(N_OUTLIERS, 1))\n", + "y[:N_OUTLIERS] = -15 + 20 * np.random.normal(size=N_OUTLIERS)\n", + "\n", + "plt.scatter(X, y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Linear regression" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Linear regression on data with outliers')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# The fit function is used to train the linear regression model on the provided data\n", + "lr = LinearRegression().fit(X, y)\n", + "\n", + "coef_list.append([\"linear_regression\", lr.coef_[0]])\n", + "\n", + "# Create a 2D array of values ranging from the minimum to the maximum value of X, with each value in its own row. \n", + "# This is useful for plotting a line to visualize the fit of a regression model over the range of the data.\n", + "plotline_X = np.arange(X.min(), X.max()).reshape(-1, 1)\n", + "\n", + "fit_df = pd.DataFrame(\n", + "\tindex = plotline_X.flatten(),\n", + "\tdata={\"linear_regression\": lr.predict(plotline_X)}\n", + ")\n", + "\n", + "fix, ax = plt.subplots()\n", + "fit_df.plot(ax=ax)\n", + "plt.scatter(X, y, c=\"k\")\n", + "plt.title(\"Linear regression on data with outliers\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Huber regression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "huber = HuberRegressor().fit(X, y)\n", + "fit_df[\"huber_regression\"] = huber.predict(plotline_X)\n", + "coef_list.append([\"huber_regression\", huber.coef_[0]])\n", + "\n", + "fix, ax = plt.subplots()\n", + "fit_df.plot(ax=ax)\n", + "plt.scatter(X, y, c=\"k\")\n", + "plt.title(\"Linear regression on data with outliers\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RANSAC regression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ransac = RANSACRegressor(random_state=42).fit(X, y)\n", + "fit_df[\"ransac_regression\"] = ransac.predict(plotline_X)\n", + "ransac_coef = ransac.estimator_.coef_\n", + "coef_list.append([\"ransac_regression\", ransac.estimator_.coef_[0]])\n", + "\n", + "fix, ax = plt.subplots()\n", + "fit_df.plot(ax=ax)\n", + "plt.scatter(X, y, c=\"k\")\n", + "plt.title(\"Linear regression on data with outliers\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Theil-Sen regression" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "theilsen = TheilSenRegressor(random_state=42).fit(X, y)\n", + "fit_df[\"theilsen_regression\"] = theilsen.predict(plotline_X)\n", + "coef_list.append([\"theilsen_regression\", theilsen.coef_[0]])\n", + "\n", + "fix, ax = plt.subplots()\n", + "fit_df.plot(ax=ax)\n", + "plt.scatter(X, y, c=\"k\")\n", + "plt.title(\"Linear regression on data with outliers\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fit_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Linear Models <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/modelling/multiple/multiple_feature_regression.ipynb b/session_1/modelling/multiple/multiple_feature_regression.ipynb new file mode 100644 index 0000000..7de4c14 --- /dev/null +++ b/session_1/modelling/multiple/multiple_feature_regression.ipynb @@ -0,0 +1,217 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Multiple dataset\n", + "\n", + "This notebook demonstrates how to build a multiple linear regression model to predict CO2 emissions based on weight and volume, verify the predictions, and visualize the results using scatter plots and regression lines." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# https://www.w3schools.com/python/python_ml_multiple_regression.asp\n", + "import pandas as pd\n", + "from sklearn.linear_model import LinearRegression\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# import data\n", + "file_name = \"../../../data/car_co2_data.csv\"\n", + "data = pd.read_csv(file_name)\n", + "print(data.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In a multiple linear regression model, there is a single regression line (or hyperplane in higher dimensions) that represents the relationship between the dependent variable and all the independent variables combined. The model calculates one set of coefficients that apply to all features, resulting in a single equation that predicts the dependent variable based on all the independent variables.\n", + "\n", + "The equation for a multiple linear regression model with two features (Weight and Volume) looks like this:\n", + "\n", + "$ \\text{CO2} = \\beta_0 + \\beta_1 \\cdot \\text{Weight} + \\beta_2 \\cdot \\text{Volume} $\n", + "\n", + "Where:\n", + "\n", + "$\\beta_0$ is the intercept.\\\n", + "$\\beta_1$ is the coefficient for Weight.\\\n", + "$\\beta_2$ is the coefficient for Volume.\n", + "\n", + "The LinearRegression model calculates CO2 predictions based on the number on input features." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Features: Weight and Volume\n", + "X_multiple = data[['Weight', 'Volume']]\n", + "X_single_weight = data[['Weight']]\n", + "X_single_volume = data[['Volume']]\n", + "\n", + "# Target: CO2\n", + "y = data['CO2']\n", + "\n", + "# Create linear regression object\n", + "regr_multiple = LinearRegression()\n", + "reg_single_weight = LinearRegression()\n", + "reg_single_volume = LinearRegression()\n", + "\n", + "# Train the model using the training sets\n", + "regr_multiple.fit(X_multiple, y)\n", + "reg_single_volume.fit(X_single_volume, y)\n", + "reg_single_weight.fit(X_single_weight, y)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Coefficient:\n", + "# The relationship with the unknown variables\n", + "# What would happen if we increase, or decrease, one of the independent values?\n", + "print(regr_multiple.coef_, regr_multiple.intercept_)\n", + "print(reg_single_volume.coef_, reg_single_volume.intercept_)\n", + "print(reg_single_weight.coef_, reg_single_weight.intercept_)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plotting the results\n", + "# Predict CO2 emissions for weight\n", + "y_weight_pred = reg_single_weight.predict(X_single_weight)\n", + "\n", + "# Scatter plot of Weight vs CO2 Emission\n", + "plt.scatter(data['Weight'], y, color='blue', label='Actual',alpha=0.25)\n", + "plt.scatter(data['Weight'], y_weight_pred, color='red', label='Predicted', alpha=0.25)\n", + "plt.xlabel('Weight')\n", + "plt.ylabel('CO2')\n", + "plt.title('Actual vs Predicted CO2 emission')\n", + "plt.legend()\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plotting the results\n", + "# Predict CO2 emissions for volume\n", + "y_volume_pred = reg_single_volume.predict(X_single_volume)\n", + "\n", + "# Scatter plot of Weight vs CO2 Emission\n", + "plt.scatter(data['Volume'], y, color='blue', label='Actual',alpha=0.25)\n", + "plt.scatter(data['Volume'], y_volume_pred, color='red', label='Predicted', alpha=0.25)\n", + "plt.xlabel('Volume')\n", + "plt.ylabel('CO2')\n", + "plt.title('Actual vs Predicted CO2 emission')\n", + "plt.legend()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Now, regr_multiple is trained for both weight and volume.\n", + "\n", + "# Predict CO2 emissions for weight\n", + "predicted_y = regr_multiple.predict(X_multiple)\n", + "\n", + "# Alt: Predict CO2 emissions for weight (use the coefficients from regr_multiple)\n", + "predicted_y2 = regr_multiple.coef_[0] * X_multiple['Weight'] + regr_multiple.coef_[1] * X_multiple['Volume'] + regr_multiple.intercept_\n", + "# Plotting the results\n", + "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))\n", + "\n", + "# Scatter plot of Weight vs CO2 Emission\n", + "ax1.scatter(data['Weight'], y, color='blue', label='Actual CO2', alpha=0.5)\n", + "ax1.scatter(data['Weight'], predicted_y, color='red', label='Predicted CO2', alpha=0.5)\n", + "ax1.scatter(data['Weight'], predicted_y2, color='green', label='Predicted CO2', alpha=0.5)\n", + "\n", + "ax1.set_xlabel('Weight')\n", + "ax1.set_ylabel('CO2 Emission')\n", + "ax1.set_title('Weight vs CO2 Emission')\n", + "ax1.legend()\n", + "\n", + "# Scatter plot of Volume vs CO2 Emission\n", + "ax2.scatter(data['Volume'], y, color='blue', label='Actual CO2', alpha=0.5)\n", + "ax2.scatter(data['Volume'], predicted_y, color='red', label='Predicted CO2', alpha=0.5)\n", + "ax2.set_xlabel('Volume')\n", + "ax2.set_ylabel('CO2 Emission')\n", + "ax2.set_title('Volume vs CO2 Emission')\n", + "ax2.legend()\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Predict CO2 emissions for new data\n", + "new_data = pd.DataFrame([[950, 750], [1100, 1050], [1000, 790]], columns=['Weight', 'Volume'])\n", + "predictedCO2_new = regr_multiple.predict(new_data)\n", + "print(predictedCO2_new)\n", + "\n", + "# Plotting the results\n", + "# Scatter plot of Weight vs CO2 Emission\n", + "plt.scatter(data['Weight'], y, color='blue', label='Actual CO2', alpha=0.5)\n", + "plt.scatter(new_data['Weight'], predictedCO2_new, color='red', label='Predicted CO2', alpha=0.5)\n", + "plt.xlabel('Weight')\n", + "plt.ylabel('CO2 Emission')\n", + "plt.title('Actual vs Predicted CO2 Emission')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Linear Models <- Previous](../README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/modelling/regression/linear/linear_regression.ipynb b/session_1/modelling/regression/linear/linear_regression.ipynb new file mode 100644 index 0000000..7e21a3b --- /dev/null +++ b/session_1/modelling/regression/linear/linear_regression.ipynb @@ -0,0 +1,647 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## [Linear regression](https://scikit-learn.org/stable/modules/linear_model.html#linear-regression)\n", + "\n", + "Linear regression is a fundamental statistical and machine learning technique used to model the relationship between a dependent variable (target) and one or more independent variables (features). The goal is to find the best-fitting linear equation that describes the relationship between the variables.\n", + "\n", + "**Example 1: Fuel consumption in cars**\n", + "\n", + "\n", + "The purpose of the regression analysis is to find the best possible\n", + "estimate to the unknown line: \n", + "\n", + "${y = \\alpha + \\beta\\cdot x}$\n", + "\n", + "${\\alpha} = intercept$\n", + "\n", + "${\\beta} = slope$\n", + "\n", + "\"Linear\n", + "\n", + "\n", + "Given the followinng observations:\n", + "\n", + "\"Fuel\n", + "\n", + "\n", + "We want to estimate the regression line coefficients:\n", + "\n", + "${\\hat{y} = \\hat{\\alpha} + \\hat{\\beta}\\cdot x}$\n", + "\n", + "\n", + "Least square method:\n", + "\n", + "\"Least\n", + "\n", + "$\\hat{\\beta} = \\frac{\\sum_{i=1}^{n} (x_{i}-\\overline{x})(y_{i}-\\overline{y}))}{\\sum_{i=1}^{n} (x_{i}-\\overline{x})^2)}$\n", + "\n", + "$\\hat{\\alpha} = \\overline{y}-\\hat{\\beta}\\cdot \\overline{x}$\n", + "\n", + "\n", + "**Pseudocode**\n", + "\n", + "1. Calculate $\\overline{x}$\n", + "2. Calculate $\\overline{y}$\n", + "3. Calculate $\\hat{\\beta}$\n", + " 1. Calculate $num = \\sum_{i=1}^{n} (x_{i}-\\overline{x})(y_{i}-\\overline{y})$\n", + " 2. Calculate $denum = \\sum_{i=1}^{n} (x_{i}-\\overline{x})^2$\n", + " 3. Calculate $\\hat{\\beta} = \\frac{num}{denum}$ \n", + "4. Calculate $\\hat{\\alpha}$\n", + "5. Plot regression line\n", + "\n", + "**Code**" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Create sample data\n", + "X_car_engine_hp = np.array([75, 145, 55, 88, 122])\n", + "y_car_fuel_consumption_lmil = np.array([0.48, 1.09, 0.53, 0.97, 0.78])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# calculate x and y mean\n", + "x_mean = np.mean(X_car_engine_hp)\n", + "y_mean = np.mean(y_car_fuel_consumption_lmil)\n", + "\n", + "print(f\"x_mean = {x_mean}, y_mean = {y_mean}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Calculate the slope numerator using vectorized operations\n", + "slope_numerator = np.sum((X_car_engine_hp - x_mean) * (y_car_fuel_consumption_lmil - y_mean)) \n", + "\n", + "# Calculate the slope numerator using vectorized operations\n", + "slope_denominator = np.sum((X_car_engine_hp - x_mean)**2)\n", + "\n", + "# calculate slope\n", + "slope = slope_numerator / slope_denominator\n", + "\n", + "print(f\"slope = {slope}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# calculate intercept\n", + "intercept = y_mean - slope * x_mean\n", + "print(f\"intercept = {intercept}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Prediction\n", + "y = slope * X_car_engine_hp + intercept\n", + "\n", + "plt.scatter(X_car_engine_hp, y_car_fuel_consumption_lmil, color = \"blue\", label = \"Actual Data\")\n", + "plt.scatter(X_car_engine_hp, y, color = \"red\", label = \"Predicted Data\")\n", + "plt.title(\"Actual Data vs Predicted Data\")\n", + "plt.xlabel(\"Engine size\")\n", + "plt.ylabel(\"Fuel consumption\")\n", + "\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Predict with new values\n", + "np.append(X_car_engine_hp,[190, 250, 500])\n", + "y = slope * X_car_engine_hp + intercept\n", + "\n", + "plt.scatter(X_car_engine_hp, y, color = \"red\", label = \"Predicted Data\")\n", + "\n", + "plt.title(\"Actual Data vs Predicted Data\")\n", + "plt.xlabel(\"Engine size\")\n", + "plt.ylabel(\"Fuel consumption\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use of [scipy.stats](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "from scipy import stats\n", + "import numpy as np\n", + "\n", + "# Create sample data\n", + "X_car_engine_hp = np.array([75, 145, 55, 88, 122])\n", + "y_car_fuel_consumption_lmil = np.array([0.48, 1.09, 0.53, 0.97, 0.78])\n", + "\n", + "# calculate slope and intercept using linregress\n", + "slope, intercept, r, p, std_err = stats.linregress(X_car_engine_hp, y_car_fuel_consumption_lmil)\n", + "\n", + "# model\n", + "y = slope * X_car_engine_hp + intercept\n", + "\n", + "#plot the model\n", + "plt.scatter(X_car_engine_hp, y_car_fuel_consumption_lmil, color = \"blue\", label = \"Actual Data\")\n", + "plt.scatter(X_car_engine_hp, y, color = \"red\", label = \"Predicted Data\")\n", + "plt.title(\"Actual Data vs Predicted Data\")\n", + "plt.xlabel(\"Engine size\")\n", + "plt.ylabel(\"Fuel consumption\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# predict\n", + "np.append(X_car_engine_hp,[190,250,500])\n", + "y = slope * X_car_engine_hp + intercept\n", + "\n", + "#plot predicted\n", + "plt.scatter(X_car_engine_hp, y_car_fuel_consumption_lmil, color = \"blue\", label = \"Actual Data\")\n", + "plt.scatter(X_car_engine_hp, y, color = \"red\", label = \"Predicted Data\")\n", + "plt.title(\"Actual Data vs Predicted Data\")\n", + "plt.xlabel(\"Engine size\")\n", + "plt.ylabel(\"Fuel consumption\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use of [sklearn.linear_model.LinearRegression](https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.LinearRegression.html)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import LinearRegression\n", + "\n", + "X_car_engine_hp_reshaped = X_car_engine_hp.reshape(-1, 1)\n", + "X_car_engine_hp_reshaped" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "lr_model = LinearRegression().fit(X_car_engine_hp.reshape(-1, 1), y_car_fuel_consumption_lmil)\n", + "print(\"Slope: \", lr_model.coef_, \"Intercept: \", lr_model.intercept_)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Predict values for the regression line\n", + "y_pred = lr_model.predict(X_car_engine_hp_reshaped)\n", + "y_pred" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plotting the data points\n", + "plt.scatter(X_car_engine_hp, y_car_fuel_consumption_lmil, color='blue', label='Actual Data')\n", + "\n", + "# Plotting the predicted values\n", + "plt.scatter(X_car_engine_hp, y_pred, color='green', label='Predicted Data')\n", + "\n", + "# Plotting the regression line\n", + "plt.plot(X_car_engine_hp, y_pred, color='red', label='Regression Line')\n", + "\n", + "# Adding labels and title\n", + "plt.xlabel('Engine Horsepower')\n", + "plt.ylabel('Fuel Consumption (L/100km)')\n", + "plt.title('Fuel Consumption vs Engine Horsepower')\n", + "plt.legend()\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Example 2: [Diabetes](https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py)\n", + "\n", + "[sklearn.datasets.load_diabetes()](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_diabetes.html#sklearn.datasets.load_diabetes) returns a Bunch object. The bunch object have 'data' (none dependent variables, diabetes_X), 'target' (dependent variables, diabetes_y), feature_names, etc." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Code source: Jaques Grobler\n", + "# License: BSD 3 clause\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from sklearn import datasets, linear_model\n", + "from sklearn.metrics import mean_squared_error, r2_score\n", + "\n", + "# Load the diabetes dataset: feature matrix X and target vector y\n", + "diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)\n", + "diabetes_X, diabetes_y" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Use only one feature\n", + "diabetes_X = diabetes_X[:, np.newaxis, 0]\n", + "diabetes_X" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [], + "source": [ + "# Split the data into training/testing sets\n", + "diabetes_X_train = diabetes_X[:-20]\n", + "diabetes_X_test = diabetes_X[-20:]\n", + "\n", + "# Split the targets into training/testing sets\n", + "diabetes_y_train = diabetes_y[:-20]\n", + "diabetes_y_test = diabetes_y[-20:]\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create linear regression object\n", + "regr = linear_model.LinearRegression()\n", + "\n", + "# Train the model using the training sets\n", + "regr.fit(diabetes_X_train, diabetes_y_train)\n", + "\n", + "# Make predictions using the testing set\n", + "diabetes_y_pred = regr.predict(diabetes_X_test)\n", + "\n", + "print(\"Coefficients: \\n\", regr.coef_)\n", + "# The mean squared error\n", + "print(\"Mean squared error: {:.2f}\".format(mean_squared_error(diabetes_y_test, diabetes_y_pred)))\n", + "# The coefficient of determination: 1 is perfect prediction\n", + "print(\"Coefficient of determination: {:.2f}\".format(r2_score(diabetes_y_test, diabetes_y_pred)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot outputs\n", + "plt.scatter(diabetes_X_test, diabetes_y_test, color=\"black\")\n", + "plt.plot(diabetes_X_test, diabetes_y_pred, color=\"blue\", linewidth=3)\n", + "\n", + "plt.xticks(())\n", + "plt.yticks(())\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Example 3: [US Health Insurance Dataset](https://www.kaggle.com/datasets/teertha/ushealthinsurancedataset)\n", + "\n", + "[Regression Modellng using Insurance Dataset](https://www.kaggle.com/code/maverickss26/regression-modellng-using-insurance-dataset)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.preprocessing import MinMaxScaler\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LinearRegression\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "file_name = \"../../../../data/insurance.csv\"\n", + "data = pd.read_csv(file_name)\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Fill in missing data using the interpolate()\n", + "data.interpolate(method='linear', inplace=True)\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# encode none-numerical data\n", + "data[\"smoker\"] = pd.factorize(data[\"smoker\"])[0]\n", + "data[\"sex\"] = pd.factorize(data[\"sex\"])[0]\n", + "data = pd.get_dummies(data, columns=[\"region\"])\n", + "data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# define X (independent variables/features) as being all columns exept charges column\n", + "X_final = data[['age', 'bmi', 'children', 'region_northeast', 'region_northwest',\n", + " 'region_southeast', 'region_southwest', 'sex', 'smoker']].copy()\n", + "X_final" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# define y as being the \"charges column\" from the original dataset\n", + "y_final = data[['charges']].copy()\n", + "y_final" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Test train split\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " X_final, y_final, test_size=0.33, random_state=0)\n", + "\n", + "# Initialize the LinearRegression model\n", + "lr_model = LinearRegression()\n", + "\n", + "# Train the model\n", + "lr_model.fit(X_train, y_train)\n", + "\n", + "# Make predictions using the testing set\n", + "y_pred = lr_model.predict(X_test)\n", + "\n", + "# Plot outputs\n", + "plt.scatter(X_test[\"age\"], y_test, color=\"black\", label=\"Actual\")\n", + "plt.scatter(X_test[\"age\"], y_pred, color=\"blue\", linewidth=3, label=\"Predicted\")\n", + "\n", + "# Add labels to the axes\n", + "plt.xlabel('Feature (Age)')\n", + "plt.ylabel('Target (Standardized)')\n", + "\n", + "# Add a title\n", + "plt.title('Actual vs Predicted Values')\n", + "\n", + "# Add a legend\n", + "plt.legend()\n", + "\n", + "# Show the plot\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Standardize features\n", + "\n", + "The [StandardScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html) standardizes the features by subtracting the mean and dividing by the standard deviation. This results in a distribution with a mean of 0 and a standard deviation of 1.\n", + "\n", + "The [primary objective of standardization](https://towardsdatascience.com/what-and-why-behind-fit-transform-vs-transform-in-scikit-learn-78f915cf96fe) is to adjust all features to a uniform scale while preserving the differences in their value ranges.\n", + "\n", + "fit_transform is used on the training data to compute the mean and standard deviation and then apply the transformation.\n", + "\n", + "\"transform\" is used on the test data to apply the same transformation using the mean and standard deviation computed from the training data." + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [], + "source": [ + "# Standard scaler\n", + "\n", + "scaler = StandardScaler()\n", + "X_train_scaled = scaler.fit_transform(X_train)\n", + "X_test_scaled = scaler.transform(X_test)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You do not need to run fit_transform on the dependent variables (target variables) when using StandardScaler. The StandardScaler is typically used to standardize the features (independent variables) to have a mean of 0 and a standard deviation of 1. Standardizing the target variable is not necessary for linear regression and can sometimes lead to incorrect interpretations of the model's predictions." + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "# Selecting a Single Feature from the Training Data: age\n", + "X_train_scaled_age = X_train_scaled[:, np.newaxis,0]\n", + "X_test_scaled_age = X_test_scaled[:, np.newaxis,0]\n", + "\n", + "X_train_scaled_age_df = pd.DataFrame(X_train_scaled_age)\n", + "y_train_df = pd.DataFrame(y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The LinearRegression class is used to perform linear regression, which is a method to model the relationship between a dependent variable and one or more independent variables.\n", + "lr_model = LinearRegression()\n", + "\n", + "# Train the model\n", + "lr_model.fit(X_train_scaled_age_df, y_train_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Make predictions using the testing set\n", + "y_pred = lr_model.predict(X_test_scaled_age)\n", + "\n", + "# Plot outputs\n", + "plt.scatter(X_test_scaled_age, y_test, color=\"black\")\n", + "plt.scatter(X_test_scaled_age, y_pred, color=\"blue\", linewidth=3)\n", + "\n", + "# Add labels to the axes\n", + "plt.xlabel('Feature (Age)')\n", + "plt.ylabel('Target (Charges)')\n", + "\n", + "# Add a title\n", + "plt.title('Actual vs Predicted Values')\n", + "\n", + "# Add a legend\n", + "plt.legend()\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# All features from the training data\n", + "import math \n", + "\n", + "# Train the model for all features\n", + "lr_model.fit(X_train_scaled, y_train)\n", + "\n", + "# Make predictions using the testing set\n", + "y_pred = lr_model.predict(X_test_scaled)\n", + "\n", + "# Determine the number of features\n", + "num_features = X_test_scaled.shape[1]\n", + "\n", + "# Get the column names\n", + "feature_names = X_final.columns\n", + "target_name = y_final.columns[0]\n", + "\n", + "# Calculate the number of rows and columns for the grid (for subplots)\n", + "num_cols = math.ceil(math.sqrt(num_features))\n", + "num_rows = math.ceil(num_features / num_cols)\n", + "\n", + "# Create a grid of subplots\n", + "fig, axes = plt.subplots(nrows=num_rows, ncols=num_cols, figsize=(15, 10))\n", + "\n", + "# Flatten the axes array for easy iteration\n", + "axes = axes.flatten()\n", + "\n", + "# Plot actual vs predicted values for each feature in separate subplots\n", + "for i in range(num_features):\n", + " ax = axes[i]\n", + " ax.scatter(X_test_scaled[:, i], y_test, label='Actual', alpha=0.6)\n", + " ax.scatter(X_test_scaled[:, i], y_pred, label='Predicted', alpha=0.6)\n", + " ax.set_xlabel(f'{feature_names[i]}')\n", + " ax.set_ylabel(f'{target_name}')\n", + " ax.set_title(f'Actual vs Predicted for {feature_names[i]}')\n", + " ax.legend()\n", + "\n", + "# Remove any unused subplots\n", + "for i in range(num_features, len(axes)):\n", + " fig.delaxes(axes[i])\n", + "\n", + "# Adjust layout\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Linear Models <- Previous](../../README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/modelling/regression/polynomial/linear_regression_poly.ipynb b/session_1/modelling/regression/polynomial/linear_regression_poly.ipynb new file mode 100644 index 0000000..b76d604 --- /dev/null +++ b/session_1/modelling/regression/polynomial/linear_regression_poly.ipynb @@ -0,0 +1,230 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# [Polynomial regression: extending linear models with basis functions](https://scikit-learn.org/stable/modules/linear_model.html#polynomial-regression-extending-linear-models-with-basis-functions)\n", + "\n", + "\n", + "Example 1: [3rd degree polynomial](https://www.w3schools.com/python/python_ml_polynomial_regression.asp)\n", + "\n", + "In this example we use [numpy.polyfit](https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html)\n", + "\n", + "numpy.polyfit is a function in the NumPy library used for polynomial fitting. \n", + "It fits a polynomial of a specified degree to a set of data using a least-squares approach.\n", + "When we say that numpy.polyfit \"fits a polynomial\" to a set of data, it means that the function finds the **coefficients** of a polynomial equation that best approximates the relationship between the input data points (x-values) and the output data points (y-values). \n", + "This is done using a least-squares approach, which minimizes the sum of the squares of the differences between the observed values and the values predicted by the polynomial.\n", + "\n", + "Learn more about [numpy.polyfit](https://www.pythonpool.com/numpy-polyfit/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Example: https://www.w3schools.com/python/python_ml_polynomial_regression.asp\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Create data\n", + "X = np.array([1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22])\n", + "y = np.array([100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create model\n", + "polynom_3deg = np.polyfit(X, y, deg=3)\n", + "my_model = np.poly1d(polynom_3deg)\n", + "\n", + "print(polynom_3deg)\n", + "print(my_model)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Predict\n", + "test_X = np.linspace(0, 25, 100)\n", + "y_predict = my_model(test_X)\n", + "\n", + "# Plot\n", + "plt.scatter(X, y, label='Actual')\n", + "plt.plot(test_X, y_predict, color='red', label='Predicted')\n", + "plt.xlabel('X')\n", + "plt.ylabel('y')\n", + "plt.title('Polynomial Fitting')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Example 2: [Polynomial Regression in Python using scikit-learn](https://data36.com/polynomial-regression-python-scikit-learn/)\n", + "\n", + "This example demonstrates how to perform polynomial regression using Python's scikit-learn library. \n", + "It begins by importing necessary libraries such as numpy, pandas, matplotlib.pyplot, PolynomialFeatures, and LinearRegression. \n", + "A dataset is created with X values ranging from 0 to 29 and corresponding y values. \n", + "The goal is to fit a 2nd-degree polynomial to this data. The PolynomialFeatures class is used to transform the original features into polynomial features. \n", + "These transformed features are then used to train a LinearRegression model. The model predicts the responses based on the polynomial features, and the results are plotted using Matplotlib, with the original data points shown as a scatter plot and the polynomial regression line shown in red." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Example: https://data36.com/polynomial-regression-python-scikit-learn/\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from sklearn.preprocessing import PolynomialFeatures\n", + "from sklearn.linear_model import LinearRegression\n", + "\n", + "# dataset\n", + "X = np.arange(0, 30)\n", + "y = np.array([3, 4, 5, 7, 10, 8, 9, 10, 10, 23, 27, 44, 50, 63, 67, 60, 62, 70, 75, 88, 81, 87, 95, 100, 108, 135, 151, 160, 169, 179])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**PolynomialFeatures** is a class in the sklearn.preprocessing module of the scikit-learn library. \n", + "It is used to generate a new feature matrix consisting of all polynomial combinations of the features with a specified degree. \n", + "This is particularly useful for polynomial regression, where you want to fit a polynomial model to your data." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# we want to work with a 2nd degree polynomial\n", + "poly = PolynomialFeatures(degree=2, include_bias=False)\n", + "\n", + "# creating the new features\n", + "# reshape(-1,1) transforms our numpy array x from a 1D array to a 2D array\n", + "poly_features = poly.fit_transform(X.reshape(-1, 1))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# creating the polynomial regression model\n", + "# train the model\n", + "poly_reg_model = LinearRegression()\n", + "poly_reg_model.fit(poly_features, y)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# predict the responses based on poly_features, and the coefficients it had estimated\n", + "y_predicted = poly_reg_model.predict(poly_features)\n", + "\n", + "# plot\n", + "plt.figure(figsize=(10,6))\n", + "plt.scatter(X, y)\n", + "plt.plot(X, y_predicted, c=\"red\")\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The choice between numpy.polyfit and sklearn.preprocessing.PolynomialFeatures depends on your specific use case and requirements. \n", + "Here are some key differences and considerations to help you decide which one to use:\n", + "\n", + "### numpy.polyfit\n", + "\n", + "**Pros:**\n", + "- Simplicity: numpy.polyfit is straightforward and easy to use for fitting polynomial models.\n", + "- Direct Polynomial Fitting: It directly fits a polynomial to the data and returns the coefficients.\n", + "- Quick and Efficient: Suitable for quick polynomial fitting tasks without the need for additional preprocessing.\n", + "\n", + "**Cons:**\n", + "- Limited Functionality: It is primarily designed for polynomial fitting and does not provide additional features like scaling.\n", + "- Less Control: Limited control over the fitting process compared to more advanced machine learning libraries.\n", + "\n", + "### sklearn.preprocessing.PolynomialFeatures\n", + "\n", + "**Pros:**\n", + "Integration with Scikit-Learn: Seamlessly integrates with the Scikit-Learn ecosystem, allowing you to use polynomial features in conjunction with other preprocessing steps, pipelines, and models.\n", + "\n", + "- Flexibility: Provides more flexibility in terms of transforming features and fitting models, enabling you to use polynomial features with any regression model.\n", + "- Advanced Features: Supports advanced features like cross-validation, scaling, and hyperparameter tuning when used with Scikit-Learn's tools.\n", + "\n", + "**Cons:**\n", + "- Complexity: Slightly more complex to set up compared to numpy.polyfit, especially for simple tasks.\n", + "- Additional Steps: Requires additional steps to transform features and fit the model.\n", + "\n", + "### When to Use Each\n", + "\n", + "**Use numpy.polyfit:**\n", + "\n", + "- When you need a quick and simple polynomial fit.\n", + "- For small datasets and straightforward polynomial regression tasks.\n", + "- When you do not need advanced machine learning features or integration with other preprocessing steps.\n", + "\n", + "**Use sklearn.preprocessing.PolynomialFeatures:**\n", + "\n", + "- When you need to integrate polynomial features into a larger machine learning workflow.\n", + "- For more complex tasks that require cross-validation, scaling, or hyperparameter tuning.\n", + "- When you want to use polynomial features with different regression models or in combination with other preprocessing steps." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Linear Models <- Previous](../../README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/understanding_data/README.md b/session_1/understanding_data/README.md new file mode 100644 index 0000000..cb89f35 --- /dev/null +++ b/session_1/understanding_data/README.md @@ -0,0 +1,58 @@ +## 1. Understanding data + +- What data do we have? +- What do we need? +- Is it clean? + +### Sample Datasets + +- Learn about few datasets provided by libraries such as + - [pydataset](https://pydataset.readthedocs.io/en/latest/) + - [seaborn](https://seaborn.pydata.org/generated/seaborn.load_dataset.html) + - [sklearn (Scikit-Learn)](https://scikit-learn.org/stable/api/sklearn.datasets.html#module-sklearn.datasets) + +- Learn about other sources + - [kaggle](https://www.kaggle.com/datasets): Kaggle offers a vast collection of datasets across various domains, along with tools for data analysis and machine learning. Users can easily download datasets, participate in competitions, and collaborate with others in the data science community + - [Google dataset search](https://datasetsearch.research.google.com/): A search engine for datasets across the web. + - [AWS Public datasets](https://registry.opendata.aws/): A collection of public datasets hosted on Amazon Web Services. + - [ssb](https://www.ssb.no/): It is the national statistical institute responsible for collecting, analyzing, and disseminating statistical information about the country. SSB provides a wide range of datasets covering various topics, including: + + - Population and demographics + - Economy and labor market + - Education and research + - Health and social conditions + - Environment and energy + +[Examples: How to work with datasets?](./pydataset/README.md) + +### Dataset: Healthcare Insurance + +Source: [kaggle](https://www.kaggle.com/datasets/willianoliveiragibin/healthcare-insurance) +Author: [willian oliveira gibin and 1 collaborator](https://www.kaggle.com/willianoliveiragibin) + +This dataset provides insights into the connection between personal attributes (such as age, gender, BMI, family size, and smoking habits), geographic factors, and their effects on medical insurance charges. It can be utilized to examine how these characteristics affect insurance costs and to create predictive models for estimating healthcare expenses. + +[Example: Healthcare Insurance](./understanding_data.ipynb) + +### Dataset: penguins > Exploring data with pandas sql + +Source: [seaborn](https://seaborn.pydata.org/tutorial/introduction.html) + +Perform queries to identify trends using sql notation against pandas dataframe. + +[Example: Exploring data with pandas sql (penguins)](./pandas_sql.ipynb) + +### Dataset: penguins > Working with database + +Source: create a database with dummy data. + +Perform queries to identify trends using sql notation against a database. + +[Example: Working with database (penguins)](./pandas_sql_db.ipynb) + +### Task 1: Understanding Data + +[Analyzing and Visualizing Existing Datasets](task_1.md) + +[Predictive Analytics <- Previous](../README.md) | +[Next -> Data preparation](../data_preparation/README.md) \ No newline at end of file diff --git a/session_1/understanding_data/db/create_db.py b/session_1/understanding_data/db/create_db.py new file mode 100644 index 0000000..37da0b6 --- /dev/null +++ b/session_1/understanding_data/db/create_db.py @@ -0,0 +1,173 @@ +import sqlite3 +import pandas as pd +import os + +current_dir = os.path.dirname(os.path.abspath(__file__)) +db_path = os.path.join(current_dir, 'penguins.db') + +# Step 1: Create an SQLite database connection +conn = sqlite3.connect(db_path) +cursor = conn.cursor() + +# Step 2: Create tables in the SQLite database +cursor.execute(''' +CREATE TABLE IF NOT EXISTS penguins ( + species TEXT, + island TEXT, + bill_length_mm REAL, + bill_depth_mm REAL, + flipper_length_mm REAL, + body_mass_g REAL, + sex TEXT +) +''') + +cursor.execute(''' +CREATE TABLE IF NOT EXISTS islands ( + island TEXT, + region TEXT +) +''') + +# Step 3: Insert data into the tables +# Insert data into the penguins table +cursor.execute(''' +INSERT INTO penguins (species, island, bill_length_mm, bill_depth_mm, flipper_length_mm, body_mass_g, sex) +VALUES +('Adelie', 'Torgersen', 39.1, 18.7, 181.0, 3750.0, 'Male'), +('Adelie', 'Torgersen', 39.5, 17.4, 186.0, 3800.0, 'Female'), +('Adelie', 'Torgersen', 40.3, 18.0, 195.0, 3250.0, 'Female'), +('Chinstrap', 'Dream', 50.2, 19.5, 200.0, 3800.0, 'Male'), +('Chinstrap', 'Dream', 49.5, 18.4, 193.0, 3700.0, 'Female'), +('Gentoo', 'Biscoe', 45.2, 14.8, 210.0, 5000.0, 'Male'), +('Gentoo', 'Biscoe', 46.1, 15.2, 215.0, 5100.0, 'Female'), +('Gentoo', 'Biscoe', 47.3, 15.8, 220.0, 5200.0, 'Female'), +('Adelie', 'Torgersen', 38.9, 17.8, 180.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 39.2, 18.1, 185.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 39.4, 18.6, 182.0, 3750.0, 'Male'), +('Adelie', 'Torgersen', 39.7, 18.3, 183.0, 3800.0, 'Female'), +('Adelie', 'Torgersen', 40.0, 18.5, 184.0, 3850.0, 'Female'), +('Chinstrap', 'Dream', 50.5, 19.7, 201.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 49.8, 18.6, 194.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 45.5, 15.0, 211.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 46.4, 15.4, 216.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 47.6, 16.0, 221.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 39.1, 17.9, 181.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 39.3, 18.2, 186.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 39.6, 18.4, 187.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 50.1, 19.6, 202.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 49.4, 18.5, 195.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 45.3, 14.9, 212.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 46.2, 15.3, 217.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 47.5, 15.9, 222.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 39.0, 17.8, 182.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 39.2, 18.0, 187.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 39.5, 18.3, 188.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 50.0, 19.4, 203.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 49.3, 18.3, 196.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 45.1, 14.7, 213.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 46.0, 15.1, 218.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 47.4, 15.7, 223.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 38.8, 17.6, 183.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 39.0, 17.9, 188.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 39.3, 18.1, 189.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.9, 19.2, 204.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 49.2, 18.1, 197.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 44.9, 14.5, 214.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 45.8, 14.9, 219.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 47.2, 15.5, 224.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 38.6, 17.4, 184.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 38.8, 17.7, 189.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 39.1, 17.9, 190.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.8, 19.0, 205.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 49.1, 17.9, 198.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 44.7, 14.3, 215.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 45.6, 14.7, 220.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 47.0, 15.3, 225.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 38.4, 17.2, 185.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 38.6, 17.5, 190.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 38.9, 17.7, 191.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.7, 18.8, 206.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 49.0, 17.7, 199.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 44.5, 14.1, 216.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 45.4, 14.5, 221.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 46.8, 15.1, 226.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 38.2, 17.0, 186.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 38.4, 17.3, 191.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 38.7, 17.5, 192.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.6, 18.6, 207.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 48.9, 17.5, 200.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 44.3, 13.9, 217.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 45.2, 14.3, 222.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 46.6, 14.9, 227.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 38.0, 16.8, 187.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 38.2, 17.1, 192.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 38.5, 17.3, 193.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.5, 18.4, 208.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 48.8, 17.3, 201.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 44.1, 13.7, 218.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 45.0, 14.1, 223.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 46.4, 14.7, 228.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 37.8, 16.6, 188.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 38.0, 16.9, 193.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 38.3, 17.1, 194.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.4, 18.2, 209.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 48.7, 17.1, 202.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 43.9, 13.5, 219.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 44.8, 13.9, 224.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 46.2, 14.5, 229.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 37.6, 16.4, 189.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 37.8, 16.7, 194.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 38.1, 16.9, 195.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.3, 18.0, 210.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 48.6, 16.9, 203.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 43.7, 13.3, 220.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 44.6, 13.7, 225.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 46.0, 14.3, 230.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 37.4, 16.2, 190.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 37.6, 16.5, 195.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 37.9, 16.7, 196.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.2, 17.8, 211.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 48.5, 16.7, 204.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 43.5, 13.1, 221.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 44.4, 13.5, 226.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 45.8, 14.1, 231.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 37.2, 16.0, 191.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 37.4, 16.3, 196.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 37.7, 16.5, 197.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.1, 17.6, 212.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 48.4, 16.5, 205.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 43.3, 12.9, 222.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 44.2, 13.3, 227.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 45.6, 13.9, 232.0, 5250.0, 'Female'), +('Adelie', 'Torgersen', 37.0, 15.8, 192.0, 3700.0, 'Male'), +('Adelie', 'Torgersen', 37.2, 16.1, 197.0, 3750.0, 'Female'), +('Adelie', 'Torgersen', 37.5, 16.3, 198.0, 3800.0, 'Female'), +('Chinstrap', 'Dream', 49.0, 17.4, 213.0, 3850.0, 'Male'), +('Chinstrap', 'Dream', 48.3, 16.3, 206.0, 3750.0, 'Female'), +('Gentoo', 'Biscoe', 43.1, 12.7, 223.0, 5050.0, 'Male'), +('Gentoo', 'Biscoe', 44.0, 13.1, 228.0, 5150.0, 'Female'), +('Gentoo', 'Biscoe', 45.4, 13.7, 233.0, 5250.0, 'Female') +''') + +# Insert data into the islands table +cursor.execute(''' +INSERT INTO islands (island, region) +VALUES +('Torgersen', 'Antarctica'), +('Biscoe', 'Antarctica'), +('Dream', 'Antarctica'), +('Cuverville', 'Antarctica'), +('Danco', 'Antarctica'), +('Neko', 'Antarctica'), +('Petermann', 'Antarctica'), +('Pleneau', 'Antarctica'), +('Ronge', 'Antarctica'), +('Wiencke', 'Antarctica') +''') + +# Commit the changes +conn.commit() + +# Close the connection +conn.close() \ No newline at end of file diff --git a/session_1/understanding_data/db/penguins.db b/session_1/understanding_data/db/penguins.db new file mode 100644 index 0000000..d3f4fc4 Binary files /dev/null and b/session_1/understanding_data/db/penguins.db differ diff --git a/session_1/understanding_data/pandas_sql.ipynb b/session_1/understanding_data/pandas_sql.ipynb new file mode 100644 index 0000000..f4026d5 --- /dev/null +++ b/session_1/understanding_data/pandas_sql.ipynb @@ -0,0 +1,109 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## References: \n", + "\n", + "- [Pandas SQL](https://www.datacamp.com/tutorial/how-to-use-sql-in-pandas-using-pandasql-queries)\n", + "- [SQL](https://www.w3schools.com/sql/default.asp)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# If pandasql is not installed, install it using the following command\n", + "# !pip install pandasql" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Import libraries\n", + "import pandas as pd\n", + "from pandasql import sqldf\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load dataset from seaborn library\n", + "penguins = sns.load_dataset('penguins')\n", + "penguins.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a joint plot (a combination of a scatter plot and the marginal distributions of the data) \n", + "# using Seaborn to visualize the relationship between flipper length and bill length in penguins, \n", + "# with different colors representing different species. This helps in understanding how these measurements vary across species.\n", + "sns.jointplot(data=penguins, x=\"flipper_length_mm\", y=\"bill_length_mm\", hue=\"species\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sns.pairplot(data=penguins, hue=\"species\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get the sum of body_mass_g for female penguins using SQL notation\n", + "\n", + "for sex in [\"male\", \"female\"]:\n", + " sum_body_mass = sqldf(f'SELECT sum(body_mass_g) as total FROM penguins WHERE sex like \"{sex}\"')\n", + " print(f'Sum of {sex} body mass: {sum_body_mass[\"total\"][0]:0.1f} grams')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Understanding Data <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/understanding_data/pandas_sql_db.ipynb b/session_1/understanding_data/pandas_sql_db.ipynb new file mode 100644 index 0000000..9062888 --- /dev/null +++ b/session_1/understanding_data/pandas_sql_db.ipynb @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import sqlite3\n", + "import pandas as pd\n", + "from pandasql import sqldf\n", + "import os" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Get the current working directory\n", + "current_dir = os.getcwd()\n", + "\n", + "# Get the path to the SQLite database\n", + "db_path = os.path.join(current_dir, 'db', 'penguins.db')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Create an SQLite database connection\n", + "conn = sqlite3.connect(db_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Use pandas to read data from the SQLite database\n", + "penguins = pd.read_sql_query('SELECT * FROM penguins', conn)\n", + "islands = pd.read_sql_query('SELECT * FROM islands', conn)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(penguins.head())\n", + "print(islands.head())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example operation (pandas): Merge the two dataframes on the 'island' column\n", + "df_merged = pd.merge(penguins, islands, on='island')\n", + "print(df_merged.head())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example operation (pandas): Calculate the average body mass for each region\n", + "avg_body_mass_by_region = df_merged.groupby('region')['body_mass_g'].mean()\n", + "print(avg_body_mass_by_region)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Example operation (sqldf):Use sql to select penguins that are female and from the 'Antarctica' region\n", + "antarctica_female = sqldf('''\n", + " SELECT p.* \n", + " FROM penguins p JOIN islands i ON p.island = i.island \n", + " WHERE i.region = \"Antarctica\" AND p.sex = \"Female\"\n", + " ''')\n", + "\n", + "print(antarctica_female.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Close the connection\n", + "conn.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Understanding Data <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/understanding_data/pydataset/README.md b/session_1/understanding_data/pydataset/README.md new file mode 100644 index 0000000..ff68ca8 --- /dev/null +++ b/session_1/understanding_data/pydataset/README.md @@ -0,0 +1,9 @@ +# Sample datasets + +- [pydataset](./pydataset.ipynb): demonstrate how to use the pydataset library to access and analyze datasets. It includes code to load datasets and display their initial rows, helping to understand the structure and content of the data. + +- [seaborn](./seaborn.ipynb): demonstrate how to use the seaborn library to access and analyze datasets. + +- [sklearn](./sklearn.ipynb): demonstrate how to use the sklearn library to access and analyze datasets. + +[Understanding data <- Previous](../README.md) \ No newline at end of file diff --git a/session_1/understanding_data/pydataset/data/diabetes_X.xlsx b/session_1/understanding_data/pydataset/data/diabetes_X.xlsx new file mode 100644 index 0000000..8ea6f8f Binary files /dev/null and b/session_1/understanding_data/pydataset/data/diabetes_X.xlsx differ diff --git a/session_1/understanding_data/pydataset/data/diabetes_y.xlsx b/session_1/understanding_data/pydataset/data/diabetes_y.xlsx new file mode 100644 index 0000000..0b1cd5b Binary files /dev/null and b/session_1/understanding_data/pydataset/data/diabetes_y.xlsx differ diff --git a/session_1/understanding_data/pydataset/pydataset.ipynb b/session_1/understanding_data/pydataset/pydataset.ipynb new file mode 100644 index 0000000..16b364a --- /dev/null +++ b/session_1/understanding_data/pydataset/pydataset.ipynb @@ -0,0 +1,166 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## [pyDataset](https://pydataset.readthedocs.io/en/latest/)\n", + "\n", + "The dataset is primarily intended for educational use. It aims to assist beginners in Data Science with Python, particularly in handling common and time-consuming data preparation tasks." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "# If pydataset is not installed, install it (uncomment the line below and run the cell)\n", + "#!pip install pydataset" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "# import pydataset\n", + "from pydataset import data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Print head of data\n", + "data().head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Describe data\n", + "data().describe()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "data_df = data()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Print dataset_id and description\n", + "# How do we iterate through the data (rows)?\n", + "# - Need to know the datatype: type(data) > DataFrame\n", + "# - Need to know how to iterate rows in DataFrame\n", + "for index, row in data_df.iterrows():\n", + " print(f\"{index}, ID: {row['dataset_id']}, Description: {row['title']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Sort dataset_id and print only dataset_id\n", + "sorted_data = data_df.sort_values(by=[\"dataset_id\"])\n", + "\n", + "for index, row in sorted_data.iterrows():\n", + " print(f\"ID: {row['dataset_id']}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Search for a specific string in the 'description' column\n", + "search_string = 'cars'\n", + "filtered_data = data_fr[data_fr['title'].str.contains(search_string, case=False, na=False)]\n", + "\n", + "print(filtered_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get iris dataset and look closer at the description\n", + "iris_data = data(\"iris\")\n", + "\n", + "print(iris_data.describe())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "describe() provides the following statistics:\n", + "\n", + "- count: The number of non-null entries.\n", + "- unique (for categorical data): The number of unique values.\n", + "- top (for categorical data): The most frequent value (mode).\n", + "- freq (for categorical data): The frequency of the most frequent value.\n", + "- 25% (First Quartile, Q1):\n", + " - This value represents the 25th percentile of the data.\n", + " - It means that 25% of the data points are below this value.\n", + " - It is also known as the lower quartile.\n", + "- 50% (Second Quartile, Q2, Median):\n", + " - This value represents the 50th percentile of the data.\n", + " - It means that 50% of the data points are below this value.\n", + " - It is also known as the median, which is the middle value of the data when it is sorted.\n", + "- 75% (Third Quartile, Q3):\n", + " - This value represents the 75th percentile of the data.\n", + " - It means that 75% of the data points are below this value.\n", + " - It is also known as the upper quartile." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Sample datasets <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/understanding_data/pydataset/seaborn.ipynb b/session_1/understanding_data/pydataset/seaborn.ipynb new file mode 100644 index 0000000..2394668 --- /dev/null +++ b/session_1/understanding_data/pydataset/seaborn.ipynb @@ -0,0 +1,86 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## [seeborn](https://seaborn.pydata.org/generated/seaborn.load_dataset.html)\n", + "\n", + "This library offers easy access to a limited selection of example datasets." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Load dataset from seaborn library\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get list of datasets in seaborn library\n", + "dataset_names = sns.get_dataset_names()\n", + "\n", + "for dataset_name in dataset_names:\n", + " print(dataset_name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get diamonds dataset\n", + "diamonds_dataset = sns.load_dataset(\"diamonds\") \n", + "\n", + "print(diamonds_dataset.describe())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Pairplot to visualize relationships between variables\n", + "sns.pairplot(diamonds_dataset)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Sample datasets <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/understanding_data/pydataset/sklearn.ipynb b/session_1/understanding_data/pydataset/sklearn.ipynb new file mode 100644 index 0000000..fe5d479 --- /dev/null +++ b/session_1/understanding_data/pydataset/sklearn.ipynb @@ -0,0 +1,134 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## [sklearn](https://scikit-learn.org/stable/datasets.html#datasets)\n", + "\n", + "The sklearn.datasets package includes several small toy datasets and offers utilities to retrieve larger datasets frequently used by the machine learning community for benchmarking algorithms with data sourced from the 'real world'.\n", + "\n", + "- Loaders\n", + "- Sample generators" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the datasets from sklearn\n", + "from sklearn import datasets\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the diabetes dataset\n", + "diabetes = datasets.load_diabetes()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Convert the data to a pandas DataFrame\n", + "diabetes_X = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)\n", + "diabetes_y = pd.DataFrame(diabetes.target, columns=['disease progression'])\n", + "\n", + "# Print the column names\n", + "print(\"Feature columns in the diabetes dataset:\")\n", + "print(diabetes_X.columns)\n", + "\n", + "# Print the first few rows of the dataset\n", + "print(\"\\nFirst few rows of the feature data:\")\n", + "print(diabetes_X.head())\n", + "\n", + "print(\"\\nFirst few rows of the target data:\")\n", + "print(diabetes_y.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Save dataframes to excel files\n", + "diabetes_X.to_excel('./data/diabetes_X.xlsx')\n", + "diabetes_y.to_excel('./data/diabetes_y.xlsx')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "# Plot the first feature vs target\n", + "plt.scatter(diabetes_X['bmi'], diabetes_y)\n", + "plt.xlabel('bmi')\n", + "plt.ylabel(diabetes_y.columns[0])\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot each of the features vs target in the same graph\n", + "import matplotlib.pyplot as plt\n", + "\n", + "fig, axs = plt.subplots(2, 5, figsize=(15, 6))\n", + "features = diabetes_X.columns\n", + "\n", + "for i, ax in enumerate(axs.flatten()):\n", + " ax.scatter(diabetes_X[features[i]], diabetes_y)\n", + " ax.set_xlabel(features[i])\n", + " ax.set_ylabel(diabetes_y.columns[0])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Sample datasets <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.12.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/understanding_data/task_1.md b/session_1/understanding_data/task_1.md new file mode 100644 index 0000000..4461221 --- /dev/null +++ b/session_1/understanding_data/task_1.md @@ -0,0 +1,21 @@ +## Task: Analyzing and Visualizing Existing Datasets + +### Objective +The objective of this task is to familiarize yourself with the process of loading, analyzing, and visualizing datasets using popular Python libraries such as pandas, seaborn, and scikit-learn. You will also learn how to source datasets from various platforms. + +### Instructions +1. **Dataset Selection**: + - Choose a dataset from one of the following sources: + - [pydataset](https://pydataset.readthedocs.io/en/latest/) + - [seaborn](https://seaborn.pydata.org/generated/seaborn.load_dataset.html) + - [sklearn](https://scikit-learn.org/stable/datasets.html) + - [kaggle](https://www.kaggle.com/datasets) + - [Google dataset search](https://datasetsearch.research.google.com/) + - [AWS Public datasets](https://registry.opendata.aws/) + - [ssb](https://www.ssb.no/) + +2. **Data Loading**: + - Load the selected dataset into a pandas DataFrame. + - Display the first few rows of the dataset to understand its structure. + +[Understanding Data <- Previous](./README.md) \ No newline at end of file diff --git a/session_1/understanding_data/understanding_data.ipynb b/session_1/understanding_data/understanding_data.ipynb new file mode 100644 index 0000000..45cf0df --- /dev/null +++ b/session_1/understanding_data/understanding_data.ipynb @@ -0,0 +1,200 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Understanding data\n", + "\n", + "The notebook is primarily focused on loading a dataset and performing initial exploratory data analysis (EDA) to understand its structure, content, and basic statistics. \n", + "This is a common first step in data analysis projects to get a sense of the data before performing more detailed analysis or modeling.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Load libraries\n", + "import pandas as pd # used for data analysis\n", + "import matplotlib.pyplot as plt # used for data visualization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Loading the Dataset\n", + "\n", + "**Row-strings and regular expressions**\n", + "\n", + "In Python, the r prefix before a string literal indicates a [raw string](https://realpython.com/python-raw-strings/). \n", + "Raw strings treat backslashes (\\) as literal characters and do not interpret them as escape characters. \n", + "This is particularly useful for regular expressions, file paths, and other scenarios where backslashes are common.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Load dataset using pandas\n", + "file_name = \"../../data/insurance.csv\" \n", + "data = pd.read_csv(file_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Understanding the Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Understand the data\n", + "print('type:', type(data))\n", + "print('shape:', data.shape)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.info()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.describe()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.head()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.sample()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Get data for age between 18 and 21.\n", + "youth = data[data['age'].between(18,21)]\n", + "youth" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "# Get adults\n", + "adult = data[data['age'] > 21]\n", + "\n", + "# Get all female\n", + "female = data[data['sex'] == 'female']" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# Define features and target\n", + "insurance_X = pd.DataFrame(data, columns=[\"age\",\"sex\",\"bmi\",\"children\",\"smoker\",\"region\"])\n", + "insurance_y = pd.DataFrame(data, columns=['charges'])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the data\n", + "fig, axs = plt.subplots(2, 3, figsize=(15, 6))\n", + "features = insurance_X.columns\n", + "\n", + "for i, ax in enumerate(axs.flatten()):\n", + " ax.scatter(data[features[i]], insurance_y)\n", + " ax.set_xlabel(features[i])\n", + " ax.set_ylabel(insurance_y.columns[0])\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[Understanding Data <- Previous](./README.md)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10.2 64-bit", + "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.12.2" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "3bd012613331a160b6ab7096b9a4a052284afc8931bfa34ed3cbb01db99d1af1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/session_1/wav/mysinewave.wav b/session_1/wav/mysinewave.wav new file mode 100644 index 0000000..8cbf373 Binary files /dev/null and b/session_1/wav/mysinewave.wav differ diff --git a/session_2/README.md b/session_2/README.md new file mode 100644 index 0000000..cb2f3ac --- /dev/null +++ b/session_2/README.md @@ -0,0 +1 @@ +In this session we will go further with the examples in [session 1](../session_1/README.md) \ No newline at end of file diff --git a/session_3/README.md b/session_3/README.md new file mode 100644 index 0000000..c429844 --- /dev/null +++ b/session_3/README.md @@ -0,0 +1,4 @@ +In this session, we look at combining the power of libraries for scientific computing. +We use SymPy to define a function and calculate its derivative. +We use NumPy and matplotlib to plot the function and the derivative. +We use SymPy to expand a function using Taylor series with a predefined number of terms. \ No newline at end of file diff --git a/session_3/comb_lib.ipynb b/session_3/comb_lib.ipynb new file mode 100644 index 0000000..a7eb21d --- /dev/null +++ b/session_3/comb_lib.ipynb @@ -0,0 +1,264 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Combining the power of libraries for scientific computing." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import *\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1 + x + x**2/2 - x**4/8 - x**5/15 + O(x**6)\n" + ] + } + ], + "source": [ + "x = symbols('x')\n", + "s1 = series(exp(sin(x)))\n", + "print(s1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## plot_func_der plots a function and its derivative.\n", + "We use sympy to calculate the derivative, numpy to calculate the values of the function and derivate in a range and matplotlib to visualize the results." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_func_der(func_name, start_value, end_value):\n", + " # func_name is a string.\n", + " # start and end values are used as x_range for plotting\n", + " expr = sympify(func_name)\n", + " x = symbols('x')\n", + " func_diff = diff(expr, x)\n", + " print(func_diff)\n", + " func = lambdify(x, expr, \"numpy\")\n", + " func_diff = lambdify(x, func_diff, \"numpy\") \n", + " x_values = np.linspace(start_value, end_value, 100)\n", + " plt.plot(func(x_values))\n", + " plt.plot(func_diff(x_values))\n", + " plt.legend([\"derivative\", \"function\"], loc =\"lower right\")\n", + " plt.show" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "cos(x)\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjgAAAGdCAYAAAAfTAk2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC38klEQVR4nOydeZhcVZn/P7eWrt73Pd3pzr6QPUAMIGskAUVQRNFoBgbhJxocxZUZRYUZGRV3GZ1hERxB3EARnACGTSEkkBDIvne60/u+d+2/P06dW9VJ71237qmq+3meeqrSfevW6c7pc97zvt/3fbVgMBjEwsLCwsLCwiKBsJk9AAsLCwsLCwuLaGMZOBYWFhYWFhYJh2XgWFhYWFhYWCQcloFjYWFhYWFhkXBYBo6FhYWFhYVFwmEZOBYWFhYWFhYJh2XgWFhYWFhYWCQcloFjYWFhYWFhkXA4zB6AGQQCARoaGsjKykLTNLOHY2FhYWFhYTEBgsEgvb29lJeXY7ON7aNJSgOnoaGByspKs4dhYWFhYWFhMQXq6uqoqKgY85qkNHCysrIA8QvKzs42eTQWFhYWFhYWE6Gnp4fKykp9Hx+LpDRwZFgqOzvbMnAsLCwsLCzijInISyyRsYWFhYWFhUXCYRk4FhYWFhYWFgmHZeBYWFhYWFhYJByWgWNhYWFhYWGRcFgGjoWFhYWFhUXCYRk4FhYWFhYWFgmHZeBYWFhYWFhYJByWgWNhYWFhYWGRcFgGjoWFhYWFhUXCYaiB88orr3DVVVdRXl6Opmn86U9/Gvc9L730EqtWrcLlcjF37lwefvjhM6657777qK6uJjU1lTVr1rBjx47oD97CwsLCwsIibjHUwOnv72f58uXcd999E7r+xIkTvPe97+WSSy5h9+7dfO5zn+OTn/wkzz77rH7Nb3/7W26//Xa+8Y1vsGvXLpYvX8769etpaWkx6sewsLCwsLCwiDO0YDAYjMkHaRpPPvkk11xzzajXfOUrX+GZZ55h7969+teuv/56urq62LJlCwBr1qzhnHPO4Wc/+xkAgUCAyspKbrvtNr761a9OaCw9PT3k5OTQ3d1t9aKysLCwsLCIEyazfyulwdm2bRvr1q0b9rX169ezbds2ADweDzt37hx2jc1mY926dfo1I+F2u+np6Rn2sFCcgQ7wecwehc6WvY08/OoJeoe8Zg/FIk6o7xrkmXca6RpQZx5bjEPAD/1tEJtz/xkEg0Fq2wdw+/ymfH6ioVQ38aamJkpKSoZ9raSkhJ6eHgYHB+ns7MTv9494zcGDB0e97z333MO3vvUtQ8ZsYQDv/B6euBk0G+RVQ+E8KJgLsy+BeevGfXu0+eWrJ/jWX/YD8MO/HeGfz5/FDedXk5PmjPlYLEZhqBue+H/QfWr4111Z8P6fiDkUQxq6BvnAfa/S0uvGYdO4YF4h71tWznsWl1jzRiUa34b9T0H7EWg7Au3HwO+G8z8H74n9nvHNp/bxyLaTOGwac4oyWVyezaKyLC5fXEp1YUbMxxPvKGXgGMUdd9zB7bffrv+7p6eHyspKE0dkMSqth+EvnwWCEPRDxzHxANj2M7juETjrmpgN51fbanTjpijLRWuvmx/+7TAP/P04N5xfzacumkOGKyn+jNRmy7/C4f8b+XtP3Aw3/Q3ssfl/6h3y8s8Pv0FLr5s0p51Br5+XDrXy0qFWnHaNz146j9sui63BZTECrYfg/ssgMIJX9tUfQeUaWHhlzIbz5931PLLtJAC+QJBDzb0cau7lybfgh88f4dnPXcjMgvSYjScRUGplLi0tpbm5edjXmpubyc7OJi0tDbvdjt1uH/Ga0tLSUe/rcrlwuVyGjNkiingH4fc3gHcAZl0I1/xcnKjaj8DRrXDor7DlDph7mTiZG8z/bqvhzj/vA+DTF8/hC5cv4Jk9jfzshSMcbu7jpy8c5XhrP/dtXGX4WCzG4PCzsPvXgAZX/wyyysTX/R548v9Bw1tiw7rwi4YPxecPsPmxtzjY1Ethpos/feY8hrwB/rqnkWfeaeRQcy8/+NthLllYzJIZOYaPx2IUgkF45gvCuJmxGpZcCwXzoHAubP8f2P5z+NOt8Kl/QK7xh+GjLb3c8cQeADZfMpePrpnJgYYeDjT28HRo3tz19D4e+KdzDB9LIqGUBmft2rVs3bp12Neef/551q5dC0BKSgqrV68edk0gEGDr1q36NRZxzJavQss+yCiCDz4AORUw+yI455PwoYdEuKq3AV76T8OH8uj2k3w9ZNz8v4tm86X1C7DbNN6/vJwt/3IhP/noSjQNntnTyN76bsPHYzEKg53wl38Rr9d+BlZ+XBjAcy+DBVfAFd8T33vpP6F5v6FDCQaDfOOpfbx8uJVUp40H/+lsKvLSmVucyWcvm8ezn7+Qq5aXEwzCf/7fQWKU32ExEnt+DzV/B0eaWFvWfgbmXw75s+E9d0H5Khjqgj/eBH5jdXcDHh+3/noXAx4/580p4PPvmc+M3DTWLS7htsvmcd/GlThsGn870MILB5vHv6GFjqEGTl9fH7t372b37t2ASAPfvXs3tbW1gAgdbdq0Sb/+U5/6FMePH+fLX/4yBw8e5L/+67/43e9+x+c//3n9mttvv53777+fRx55hAMHDnDrrbfS39/PjTfeaOSPYmE0e/4AOx8GNPjg/ZA1XGeFMw2uvFe8fv3n0LzPsKE8u6+Jf3tSZPLdcuFsvrphIZqm6d+3hQyd9y8vB+BHfzti2FgsxmHLv0Jvo9BoXfq1M7+/7MOw4EpxUv/TrYZuVg/8/QSPbq9F0+DH169keWXuGdd8ef0CUuw2/nG0jVeOtBk2FosxGOyCZ/9NvL7wi+LgFIkjBa77JbhyoG47vPDvhg0lGAzyb0/u5UhLH8VZLn58/UrsNm3YNXOLs7jpglkAfPOp/Qx5LQHyRDHUwHnzzTdZuXIlK1euBIRxsnLlSu68804AGhsbdWMHYNasWTzzzDM8//zzLF++nO9///s88MADrF+/Xr/mIx/5CPfeey933nknK1asYPfu3WzZsuUM4bFFHNF+LHwKv/CLMOeSka+b9x5YdJXQ5jzzBcMyHf7rxaMAfPxdM7njiuHGTSSfvWweNg3+dqCZd051GTIWizE49H/w9mOI0NR/CSP4dDQN3vdDSM2Fxt3wjx8ZMpSdJzv59v8dAODfrlzE+rNGDplX5qezaW0VAPf89QD+gOXFiTkvfhv6W0RI6rzbRr4mrxqu/ql4/eqP4MjzhgzlNzvqePKteuw2jZ9+dCVFWSNLKW67bB4l2S5qOwb4n1eOGzKWRCRmdXBUwqqDoxDBINx/KTTsgqrzYdNTY4tBu0/Bz84Fb7/Q6Kz4WFSHs+dUN1f97B+k2G1su+NSCjLH1m7d/rvdPLGrnksWFPHLG8+N6lgsxmCgA/5rLfQ1iU3q8nFO2e/8Hp74JNiccMtLULokqsP5/G938+Rb9bx/eTk/vn7FqEYxQNeAhwu/+yI9Qz6+96FlXHe2lfAQMxp2w/2XQDAAm/4Msy8e+/pnvghv3A/pBXDbLkjLjdpQmnuGePd3X8TjC/CVDQu59eI5Y17/1NsNfPY3b+Fy2Pjb7RdRmZ+cguO4rYNjkYQ07BIPRxpc+8D4mS45FXDRl8Xr574uNroo8tgOkcWwYUnpuMYNwGcvnYfdpvHioVZ21XZGdSwWY/C3bwrjpmAeXPJv41+/9EOw8H0iVPXU5qh6/3qGvPx1TyMA/3zBrDGNG4Dc9BQ2XzoXgO8/d5hBjxVyiAmBADxzuzBulnxofOMGhOFcMA8G2mH/n6I6nD+9VY/HF2B5ZS7/78LZ415/1bIy1s4uwO0LcPfTxurJEgXLwLEwl3d+J54Xvheyyyf2nnd9GooWwkAbvHRP1IbSO+Tlz7sbANi4ZuaE3lNdmMG1q2YA8MPnD0dtLBZj4OkXIlGAq340cmjqdGSoypEqsqqa9kRtOH95uwG3L8D8kkyWV0wsM2rT2mpm5KbR1DPEQ6+eiNpYLMZg96NQvxNSsmD9f0zsPc5UWPUJ8VquVVHiybfqAfjw2RXYbGMbxSC6AXzr6rNw2DSe29/My4dbozqeRMQycCzMw++DvX8Ur5d9ZOLvc6TA+m+L12//FnzuqAznT7sbGPD4mVucybmz8if8vtsunYfDpvH3I228URNdj5LFCBzeIkoJ5FWLsOZEySyGeZeL13LeRYHfvSmKC3747MpxvTeSVKedL61fAMDPXzpGe1905rDFGLz1v+L5wi9A1uhlRc5gyYcADU6+Cl21414+EfY39HCwqZcUu433LZ3gwQ6YX5LFprXVgChAajE2loFjYR7HX4L+VhHfHk1YPBqzL4HMUnB3w/GXpz2UYDDIo6+L8NTHzp054Y0KhHBU6igsL04M2PuEeF5yrfDMTIYlHxTP+56ISpjqUFMvb9d14bBpXLNyxqTe+/7l5ZxVnk2f28dv36yb9lgsxqCnQWREASy7fnLvzZkB1ReI13v+EJXhPPmWMIovXVhMTvrkKlt/LORdfvVoG92DVuuYsbAMHAvzeOe34nnJtWCfZPl6mw0WvU+8PvDnaQ/lrbouDjb14nLYuHZVxaTfv/nSuTjtGq8da7fq4hjJUE84o+WsD07+/fPWgzNDnMTrd057OL8PGSaXLSqmcAKarUhsNo3rzxWb1fP7rfomhnLgafFcuQayyyb/fulhfue30zaM/YGgHgr/wKrJGcUAc4szmVucidcf5MWDLdMaS6JjGTgW5uDug4OhRWcy4alIFl8tng8+M+36Jo++LlzP71tWPukTFcCM3DQuWyhKFViblYEc+qvoFVS4AErOmvz7U9JFAUAIe4KmiNcfiNBRTC0T6j2LxJzZXddFS+/QtMZjMQb7Q4cguWZMlsXvB7sLWg9OW7/12rE2Wnrd5KY7uWRB8ZTuccUSEWL7v72N0xpLomMZOBbmcPAZoaPIny1KpU+FmedBeqGoZlvzjykPpXvAy9PvhMTF75qYuHgkLl0kFqsXrFOVcUjtzJIPTj48JVlyrXje96TIrJkiLxxsob3fQ1GWi4vmF03pHqU5qSyvyCEYhK0HrHljCH0tUPuaeL3oqqndIzUnbBhLz/MUeXKXMIrft6yMFMfUtuANIQPn5cOtDHh80xpPImMZOBbmIBeJZR+Z+kZld4jsKwif0KbAH3edwu0LsKgsm5UjVJ+dKPI0tqe+m+Ye6zQedQY64NgL4vVUwlOSuZeJKrW9DVD3+pRvI8NT166qwGGf+lL6nsWW589QDj4tUsPLV0Hu1A8wuqd5zx8gMLXU/gGPjy37mgD4wMrJh8Ili8uyqcxPY8gb4KVDVjbVaFgGjkXs6W2G4y+K10uvm9699DDV01NadILBII9uD4mL10xOXHw6RVkuvTy/FRs3gAN/gYAPSpZC0fyp38fhCuu3pphN1dIzxIuhjeW6s6e+UQG8Z7E4jf/jaBv9bus0HnX08NT7p3efuesgLU/UXzrxypRu8ey+JgY8fqoL0lk1M3fKQ9E0jSuWCC3Rlr1NU75PomMZOBaxZ+8fxYmq4hwoGLt657jMulCU4e9vhdptk377oeZejrX2k+q0cc2KiadrjsZlC4UXZ6tl4ESffTJ7ahreG4n0AO3/syhXMEmeeKsefyDI2VV5zCnKnNZQ5pdkMjM/HY8vwCtWbZPoMtABJ/4uXi+apoHjSAnPmynWxHkiFJ66ZuWMaR2mIBymeuFgC26fVSxyJCwDxyL2RIanpovdOa0w1atH2wE4pzqfrNTJi4tP59KQgfOPI21WU7xo0tcSPjWf9YHp32/2RZCWLwzjmr9P+u1/3BmufTNdNE3jcitMZQwHnxG960qWTv8wBeE168BT4BmY1FtbeoZ49ahosPqBSZYUGIkVFbmUZqfS5/bxD6tx64hYBo5FbGk9JJoe2hzR2aggfDI78JdJi0ZfCy04588tjMpQzirPpiTbxaDXz+vH26NyTwuE8RoMCEF6/qzp38/uDIcs9k0um6qpe4gjLX3YNFi/ZBIF48ZA6nBeONSCzz914bPFaRx4SjxPNXvqdCrPhdwq8PSJjL5J8OfdDQSCsLoqj6qCjGkPxWbTWH+WmDdWmGpkLAPHIrbse1I8z10HGdExKphziSi/3tsIp96Y8Nt8/gDbT4jKw+fPic5YNE3j0lC6uJVNFUUii/tFC3mv/U+BzzPht0nD9azyHHLSpu/1A7Hp5aU76Rrw8kaN1dMsKgx2wbGQ1m+6+huJpoW9OJMsM/DcfmGERCMULtkQ0uE8f6AZr2UYn4Fl4FjEFhkPn78hevd0uGBB6H7yxDYB3qnvps/tIyfNyeLy6HWV13U4B1oIRrGpY9LSXR/WVy2+Jnr3rTofMktgqEtU1Z4g244JA2ftnIKoDcVht+mGsRWmihKHnxXNVYsWQtGC6N1XpovX/GPCiQ1DXj+767oAePe8qZUUGIlzZ+VTkJFC14CX7cetNjGnYxk4FrHD5w57WGTp82ghXdD7n5pwpVEZnlo7uwD7BJrdTZTz5xbictio7xrkcHNf1O6btBx5DgiKKrQ509cu6Njs4fDm4S0TftvrJ0IGzuzoGTgQkS5+oMkyjKOB1ORNV1x8OqXLICVTtIlpmVhX7121nXj9QUqyXVQVpEdtKHabxuWhMJVV9O9MLAPHInbU7xJVaDOKoGBudO895zJwpkN3regWPQGkwPj8udHdqNJS7JwXOt1vPWidxqdNbahWzayLon/vWRcO/4xxaOga5GT7AHabxtnVeVEdyoXzhWFc1zHIwabeqN476XD3wbGt4nW0wlMSu0MY2wAnX5vQW3aEQuHnziqYdvbU6aw/S+jAnt3XjD9gGcaRWAaORew4+ap4rjpv6sX9RiMlXTTghAllxQx5/eysFVqH86IkMI7k0lAJ/hes6rTTR1ahnfmu6N9b3rNlv6iIPQ4yPLVkRk5Usu4iSU9x8O55Yi5aYappcuoN8A1BTiWULIn+/avOE89yTRsHGT5aMys/6kM5b04hWS4HbX1u9jf0RP3+8Yxl4FjEDt3AiXJ4SiI3q9rt4176Zk0nHl+A0uxUZhdOP6PhdGS6+K7aTjr6Jy5gtTiN7nrRGFOziQyWaJNZHPImBqFux7iXbztuTHhKYlU1jhKyc/jMd0X/MAXhEPvJ18YNibt9fnaFDlPvmh19AyfFYWN1yJu486Slw4nEMnAsYoPfFzY85Okn2kgDp277uIvOq8eE/ua8OdF3GYNovrmwNItAEF4+bHlxpoxspVC6FFxZxnyGnDcTCDfIDCojNiqASxaG2310D06vgWxSI0OOMpQUbcpXgiNV1FFqOzLmpXtOdeP2BSjISJl2UcjROLtKGDhvnrQy8CKxDByL2ND0Nnj7RdO64sXGfEbZctHxd6ANOo6PeakUGBsRnpJctiicTWUxRU6GsqdmrjXuM2aGDO5xdDh1HQOc6hzEYdM4p9oYA6c4K1UXocqsG4tJEvDDqTfFayPCmiAyNyvOEa/HCVNt1/U3+YYcpgBWhQycXZaBMwzLwLGIDfJ0PPM8sBk07RwucbKCMTer7kEve+q7gegLjCO5MJQO+kaN5TaeMvL/0VADJ7QJNuwC7+hNUmV4allFDhkuh2HDWTXT2qymRct+8PSK2lhGHaYgQocztudPev2M0N9IVlTmYrdpNHQP0dA1aNjnxBuWgWMRG+QiUH2+sZ8zM+SSHqNL9Pbj7QSCMLswg7KcNMOGsqxCLDrNPW4au61FZ9IMdUPzXvHaqJM4QP5syCgGv0cYOaMQDk8ZZxQDehPGtywPztSQRnHF2aIUgFFUhdayk6+OGhL3+QPsDBmq584ybt6kpzhYXCZqee20DGMdy8CxMJ5AIGzgGKW/kVSOLzR+LZQJc56B3hsQ6eILSoRu5K3aLkM/KyGp2wEEIW8WZEWnJcKIaBpUhTxEozRsDQaDvG5Agb+RWBny4LxV20nASvudPJECYyOpOEe0nOmph66TI16yt6GHAY+fnDQnC0sN0pCFWF0lhcaWgSOxDBwL42nZL6rFOjOgdLmxnyUzbdoOiU7CIyAb3kWrPcNYrAidxi09xRSQxobRRjGEQ2AnRzZwajsGaOgewmnXOLvKuFADwMLSLNKcdnqHfBxrtQpFThpp4BiRdRdJSjqUrxKvRwlT7TgRbuZri2Ix0ZHQdTi1loEjsQwcC+PR9TdrRJEsI8koDBcRHKEvVUuPaJSoacafxAFWVuYCsNvy4EweXX9j8EkcwgZO3Y4Ry+/L8NSKylzSUgwMeyDaNiyryAGszWrS9DSGywpIEbCRjFMPx8j6N6cjM6n2NfQw4PEZ/nnxgGXgWBiPXv/GYP2NRA9TnanDkeGps8qzyU1PMXwoK0MenD313VaX6Mngc0dkwsTAg1OyJKL8/oEzvi0L/Bmtv5GEw1RdMfm8hEFq70rOMq6sQCSR9XBOwx8IsiOUYLDGoLICkZTnplGWk4o/EOTtum7DPy8esAwcC2MJBk0wcEKu6REKt8mNKhbhKYDZhZlkpToY9Po51GyV358wDbtFW4/0QiiYY/zn2R3heXOaDicYDBpe4O90pNDY8uBMEvk3b1T9m9OpPFd4izqOC+9RBAebeugd8pHpCguAjWZVlVXwLxLLwLEwlvajohiW3QUzVsXmM2VIo34n+IcXS3v7VBcQXgiMxmbTWF6RC1in8UkR2Z7BoNohZzBzZKHxibZ+mnvcpNhtMZs38nOOtPTRM2QV/JsweoG/GIQ1QdT1Kl0qXp8WppLhqdVVeTjssdlqz7aExsOwDBwLY5F/9BXniDo1saBgHqTlgW8QGt/Rvzzk9XOkRYg2l87Iic1YCIepLKHxJJAbVSwExhK9ovG2YWm/slDbipm5pDqN1d9ICjNdzMxPJxiEt615MzE8A9AU+nufGSMPDkSkiw8PU8kGm7EIT0lW60LjLisDD8vAsTCaWNW/icRmgwoZpgrrcA409uAPBCnISKEsJzVmw1khhcbWRjUxAoHYCowlM84Wab+9DUKoGuKdkNdvdYy8NxJpGO862RXTz41b6ndCwAdZZaLJZqwYwcAJBiP0NwbWvzmdRWXZpDntdA96rQw8LAPHwmhiVf/mdPSCf+F6OHtD1YuXzMgxrGT6SEgD52hLn9VfaCK0HgyVFUiH0mWx+9yUdChbIV5HhKn2hTo0x9LrBxEVjS0dzsTQ08PXxC6sCeHQZusB6BdaraMtfXT0e0h12mI6b5x2G8srxedZYaoYGTj33Xcf1dXVpKamsmbNGnbsGL1r78UXX4ymaWc83vve9+rX3HDDDWd8f8OGDbH4USwmQ3c9dNeBZo9NymYkkQX/QuEG2Z4h1htVQaaLynxRMVl6AyzGQBoXFeeA3Rnbzz6t4J/XH+BgoxCHn1UeG6GoZJVV8G9yxKrA3+lkFEDRQvH6lNjb3j4l1pplFbmkOGLrR7AK/oUx/Df/29/+lttvv51vfOMb7Nq1i+XLl7N+/XpaWkZuQPjEE0/Q2NioP/bu3Yvdbue6664bdt2GDRuGXfeb3/zG6B/FYrLIeHjRQkjJiO1nl68U4Ya+Jr3K6N56cRJfEmMDB2BFpVh0rHo4EyAW/adGQxcaizEcae7D4w+QlepgZn56TIeysCyLVKeNniEfx9v6Y/rZcUcgELsCfyMhe+CFNH/7GkLe4vLYrzWWgRPGcAPnBz/4ATfffDM33ngjixcv5he/+AXp6ek89NBDI16fn59PaWmp/nj++edJT08/w8BxuVzDrsvLi2183GICNO0RzzLLIJakpIvu4gB1Oxjy+jkcStNeWhH7RWelpcOZOHUm6G8k0vPXehAGOtgb2qjOKs+OaVgTRLhh2YxcwApTjUvbYdG7LNZhTYlc45qkgSMOU7H2+kHY83e8rZ+Ofk/MP18lDDVwPB4PO3fuZN26deEPtNlYt24d27aNXBL9dB588EGuv/56MjKGewBeeukliouLWbBgAbfeeivt7e2j3sPtdtPT0zPsYREDGt8Wz2UmLDgwrODfoaZefIEg+RkplMdQYCyJbNkQHKUxnwUw2BkW+MpTcSzJKIDcKvG6eS/76s07iQOsrMoFRJjKYgykUTxjdezDmhA2qpreIRAIciBk4Cw2wcDJTU9hbnEmYHlxDDVw2tra8Pv9lJSUDPt6SUkJTU1N475/x44d7N27l09+8pPDvr5hwwZ+9atfsXXrVr7zne/w8ssvc8UVV+D3n1liHeCee+4hJydHf1RWxlBhn8yY6cGBiIJ/23X9jRkncYDFZdk47Rrt/R7qOqzO4qPSvE8858yEtFxzxqCfxvfqJ3EzwpoQqcPpMuXz4wa9wJ8J4SmA0iXiuauW+qYmet0+Uhw23dCINatnWmEqUDyL6sEHH2Tp0qWce+7wSXv99dfz/ve/n6VLl3LNNdfw9NNP88Ybb/DSSy+NeJ877riD7u5u/VFXVxeD0Sc5g13hDrtmGTgVZ4vn1oMcqGsFYi8wlqQ67Xo107fqknvRGROzjeKIzw40vcP+RvNCDRBOFT/U3EuvVfBvdKS3eMZqcz4/LQ9yZwLQcFBogRaUZOGMUYG/05E6nN1JvtYY+tsvLCzEbrfT3Nw87OvNzc2UlpaO+d7+/n4ef/xxbrrppnE/Z/bs2RQWFnL06NERv+9yucjOzh72sDCY5r3iOXem+OM3g+wZotJowEdPnRiPWQYOhPsLWTqcMVDIwPGeepsBj59Up43ZReacxIuzUqnISwsV/LP6C42IzwOth8TrkiXmjSMUpuqv3Q2YZxRDODR2sKk3qUPihho4KSkprF69mq1bt+pfCwQCbN26lbVrx86Q+P3vf4/b7ebjH//4uJ9z6tQp2tvbKSsrm/aYLaKErCBshuBPomlQIjartA7RQNGsUANYBf8mhG7gmLhRhTZJZ8dhnPhYXJaN3Rb7sKYkMl3cYgTaDkPAC64c3YtiCqG1ztUqDlNm6G8kc4szsds0uga8NPUMmTYOszHcf3b77bdz//3388gjj3DgwAFuvfVW+vv7ufHGGwHYtGkTd9xxxxnve/DBB7nmmmsoKBheBbKvr48vfelLvP7669TU1LB161auvvpq5s6dy/r1643+cSwmSpMCBg7oG+V8TpKb7qQiL820oUgDZ199D27fyHqxpMbvFdlLYK4HJ3cmuHKwBX3M1epNNYoBlswQG+WBJis5YkSkt7jkrNgW+DudUDJF8YDwJpnpwUl12pldKBJzZB2nZMRh9Ad85CMfobW1lTvvvJOmpiZWrFjBli1bdOFxbW0tNttwO+vQoUP84x//4Lnnnjvjfna7nXfeeYdHHnmErq4uysvLufzyy7n77rtxuWLU68hifFQINYBY9IBFWi1LY1zB+HSqCtLJS3fSOeDlQGOvbvBYhGg7DH4PuLLDmUxmoGnCMD75Kou0k6ZlUEkWlobDDRYjoILXD/S1rjpQj0vz6P9vZrGoLJsjLX3sb+zhkoXFpo7FLAw3cAA2b97M5s2bR/zeSMLgBQsWjBo3TEtL49lnn43m8Cyijc8dPomblSIuCYUbFtlOssTEExWApmksrcjllcOt7Gvotgyc05EbVckSc0/iQLBkCdrJV1lsO2lqqAFEwT+AmrZ+Bj1+0lJi0/AzbpCZd6HDjGlkz8DrysPp7uTivHYyXDHZXkdlYVkWT72d3Iax0llUFnFKywHR9C4tTwh9zaR4EX5s5Gt9nF3gNncswMJSsVkdSuJFZ1RUOYkDnVkLAFhsq2V+SZapYynKdFGQkUIgCEdarHlzBnqIymRvsabRlDYPgAuzGs0dC8KDA6LJcLJiGTgW0SdSf2PySdyjuagJioy9pXbzywMsCG2WyXyqGhVVwprAgaAIkS2x15JiN3cOa5rGglJr3oxIbzP0twIaFC8yezQc0mYBsMxeO86VxrMoFCI73trHkDc5NX+WgWMRfRTaqA4397I/IDIrigZGLiMQSxZEeHCSOX3zDIJBpebNjv5ivEE72cFe6Kk3ezhhHU4SC0ZHRHpvCuaI9iwms32gHICZ3mMmjwRKsl3kpTsJBEV382TEMnAsoo9MEZe9oExkT303BwLiNK7JxdBEZPpm96CX5h7zQ2bK0NsIgx2i83yR+Sfxt5uGOBYUmxVN5s8bqcM5aGVSDUcPT5kf1ux3+3ipV5Qqyeo6KBqAmoimabphvD9Jw1SWgWMRXQKB8KKjwEl8T303B4Kh2hgKGDipTjvVBeKkaW1WEUjvTeF8cMa+V1gkwWCQvfXd7A+FqfSxmcjCiBCV5fmLQBqfCui2DjT2cDxQxhAp2Lz90HnC7CHpOpxk9fxZBo5FdOk8AZ4+cKRCwTyzR8Pe+m4OhEJUtB0Br/lFr+SpSnY3t0ApgXFLr5u2Pg8HdcPYfANnXnEWNg06+j209lmePx09g8r8w9T+xh782GlImS2+INtHmIj0/CWr0NgycCyii/yjLjkL7OamSXp8AQ429tJEPv7UPAj6w+nrJmIJRkdAIf3N3lBj1u6cheILCnhw0lLsVFuF24bjc0ObbNFgcoo4ooAnQG9eKMQqky1MRPa/O9jUk5SeP8vAsYguCm1UR1v68PgDZKU6sZWGFkAFwlQLrFTxM1Fo3sgO4inlIQ1Zx3Fwm/9/ZZUYOI3WQ6IcRWoO5FSYPRr2NQrD2CHnjQKGsdT8dQ4kp+bPMnAsoosqLRoIh4AWlmahSRe2dGmbiEwVP9LSh89vrhBRCdx9wogAJUIN0oNTXVUFWaH+ds37TRyRQIY2rZYNISLDUyaXo/D6AxxuEplKBXPPEV9sNN+DE9myIRnnjWXgWEQX/SRuvoEji6LNK8kKazsUOFXNzE8nzWnH4wtQ0z5g9nDMp2U/EITMUsgsMns0ugdnSXl22KOkQLhBFxpbISpBZA8qkwl7ix2UzFsJmg36W0SdHpNZmMQF/ywDxyJ69DZDX7P441Zg0TnSLE5U84ozw+Np3itqrpiIzaYxvyQTsMINgFIC4+5BL/VdgwAsKs8Opx8rENqUHpyjludPoNC8kUbx4rJstJSMcIKFZRibimXgWEQPueAUzFWi6NaRUHGr+SVZoraKZofBTlFzxWR0HY6VSaWU/kYWRCvLSSU71RnhwTHf81eRl0ZGih2PP8CJtn6zh2MuwaBSNXD2NYiw5lmyMatCnr/FlgfHwiIKNIUyqBQITw15/ZxsF5vAvOJMUVulUJ6qzD+NLwidxg8lYVz8DCKbbJrM0VBYc26x8LDpG1XzfgiYW+7eZgu3bDiQ7J6/vmYYaBfeYgVaNOyXHhzZmFU2GVZAhyNTxY+39SddywbLwLGIHlL0p4DL+HhrP4Eg5KQ5KcpyiS+WqJNJZWXEhAj4QxoclDCMZVhTN3DyZ4MzHXyD0G5++X3LMA6ht2iYC840c8fC8IQGIMIwNn+tKc1OJTfdiT8QTLqWDZaBYxE9WkM1KRQota8LjIsz0WSGhUJ6CnkSP9kxwIDHZ/JoTKTjOHgHwJEm+gmZjAxrzisObVQ2e9gwViDcsKgsefUUw2hSJzzV3uemc8CLpsGcopBhXBSqodRxAnwe8waHbNmQnAX/LAPHIjoE/KJSMEDRAnPHQoTAOCTmBSLi4uYbOIWZLgozUwgGw2NNSvTw1GJhTJiMPOEOmzcl6mTg6U03k93z16xOiwY5Zyry0khLCc3hrDJwZYvioh3me/4W6Tqc5Jo3loFjER26ToLfLVo05M40ezQRHpys8BflSbxdjZYN80usMJUenlIg667f7dMzqOYWRRo4obG1HDBhVMORNZTquwbpGfKaPBoT0WvgKGDgtIbCmpFzRtNEXzUIe7ZNZFFpuKJxMmEZOBbRQf4RF8xT4iQ+ogcnqwzS8iEYgFYFNiurZQO0HRbPheZ7/Y6FNqrCTBd5GSnhb0iPpByrieSkOynPEc1Ik9Yw9rnD/xcKGDhn6LYkct6oYOBEZFIlU8sGy8CxiA66/ma+ueMA3D4/NaEMKuklAcSpSi/4Z36YSsbFk7rpZmtoo1IprHn6RiWNr66TSnj+FuodopPrNK4jWzSk5UF2udmj0Q3jMwwc6cFpM9/AmVeSiU2DzgEvLb3J07LBMnAsooNCJ3GZQZWV6qBYZlBJiheLZwUWnQXJrqfw+8L6hELzO88fGUl/A5BZDK4c4flTQE+R9J6/yGQGk1s0QFiDMzcyHA4RHhzzPX+pTjuzZLPWJJo3loFjER0U8uBEFvjTTl8A5UYqBdEmMr8kE02Dtj437X3Jc6rS6ToJfo/IoMoxX7d1Rg0ciaaF57UC4YaFyW7gyMOUAmtN75CXxm7h1RvVg9N+xPQaShDWIx5LolRxy8CxmD7BYMSis9DcsQBHmsMp4megu43NP1WlpziYmS8qPielnkIaC4VzwWb+UnSkZZRQA4Q9kwrMG6mnONTUm1R6Ch3dW2y+gXOsVYTCi7Jc5KQ5h38zrxrsLvANQVdt7Ad3GnOKhQdHhtSSAfNXFYv4p7cJ3D2iFUK+ArVMdIFx1pnflItiZ40QK5qMzIpJytO4QhvVkNdPbYdofDrv9FADRHj+zDdwZhVm4LRr9EVkfSUV0vuqwLzRywqMZBTb7ErNG1mjxzJwLCwmQ+tB8Zw/CxwpY18bAw63jOHBySwJ1acIKFGZNqkrGium2woGITfdSWHmCHNYIT2F027TPX/HW5OsJ1XAD+1HxWsFdFtHx/L6QUSq+MEYjWh0wgZO8swZy8CxmD4KbVRun5+T7eIkPn8kD05kfQoFTlXzpZ4iGTOplNJtjVD5OpJhegrzO3nLzep4Ep3GgeH1tlTWbUkUMoxnF4kQVWuvm+7B5KihZBk4FtNHoY2qpm0AfyBIlstBSbZr5It0A8d8obEMUR1r6UsuPUUwqGSo4YxMGEluFdhThJ6iWwU9RfKdxoHwnCmYp4RuS583ReN4cBTI2sxKdeprYrIYxubPkARj0OOno9/c3iMxRyEPjqwpM69klJM4KBUXn1mQjk2DPreP1iSqT0FfM7i7RTdolXRbo53E7Q7R2BGUMIxnh1J+j7clx0alo6815oenInVbc08vLSCJ9OAocIBJtjCVZeBEkQf+fpxFd27hnr+aXyU3pugeHPMNnDOaJY6EQiEql8NOZUhPkSyLDhD+3edWgTPV3LEQDlGNGmqA8KaqQKq47sFpSaI5A0oJ00+0iXpb2akOijJH8RYXzBVGvLtbGPUmk2xCY8vAiSIl2WKhPt6WRIvOQAf0t4jXCiw6RyI8OKMSGaJS4FSVlKdxhYxijy9ATUi3Nfa8kaniChg4hWKcTT1D9LmTqBu9HtY034MTKTAe1VvscEHeLPFaBcM4pMNJllo4loETRaSI60QyGTjyRJVdAa4xNocYEa5GO4YHJ38W2Bzg7YeehhiNbHRmFyXhaVyhk3hNez/+QJBMl4PS7DG8SXpPKvNDVDkR2V4nktHzp8C8GTeDSqJQT6qwdssycCwmiSyF3dHvoWsgSXQ4CgmMPb4ANW2yB9UYi47dGT5VKRCm0jNiksmDo+hGNepJHJQKUQHMLkyyedPfDgPt4rXUQ5mI7CI+ZjgclBIaS2PsZPsAXr/52YBGExMD57777qO6uprU1FTWrFnDjh07Rr324YcfRtO0YY/U1OGnqmAwyJ133klZWRlpaWmsW7eOI0fMP1WlpzgoC3X6TRo9hUIC45r2fnyhDKoxT+KglA5Hev6SqqZJPDTZPJ2CkIEz2CE2W5PRK9MmSbhB/1vNmQkp6eaOBTg6Whfx01HIg1OanUp6ih1fIKgLpBMZww2c3/72t9x+++184xvfYNeuXSxfvpz169fT0tIy6nuys7NpbGzUHydPnhz2/e9+97v85Cc/4Re/+AXbt28nIyOD9evXMzRkfqffpAtTKeTBkRlUc8fKoJIolEkl58ypzgHcPvN71hjOUA/0hkKDCmgp9Bo4Y3n9QGyqsvaKAqdx6cE5lixrjUIZVD5/QF/jxzVwFGrzoWlaWGicBIax4QbOD37wA26++WZuvPFGFi9ezC9+8QvS09N56KGHRn2PpmmUlpbqj5KSEv17wWCQH/3oR3zta1/j6quvZtmyZfzqV7+ioaGBP/3pT0b/OOOiu42TJMapL/QKeHAmfBIHpTw4RZkuslwOAkH0IoUJTXvI25pRDGl55o6FSWgpQKmmm0nrwVEgrFnXOYjHHyDVaWNGbtrYF0uDrK8ZBrsMH9t46ELjJPAYG2rgeDwedu7cybp168IfaLOxbt06tm3bNur7+vr6qKqqorKykquvvpp9+/bp3ztx4gRNTU3D7pmTk8OaNWtGvafb7aanp2fYwyikDicpwg2eAeiqE69VaLIZOomPWMH4dBQSjGqaFhGmSoLNSqHwlM8f0P9Wx9VSQMRp3Px5Iw9TJ9r6CQTMzwY0HPk7V8BbLLM15xRlYrON4y1OzYbsGeK1AgeqZEoVN9TAaWtrw+/3D/PAAJSUlNDU1DTiexYsWMBDDz3En//8Z379618TCAQ477zzOHXqFID+vsnc85577iEnJ0d/VFZWTvdHG5WkClG1HwGCkF4AGQVmj0bfqOaMVlU0EilS7G0UIROTmZ1MBbgUCjXUdgxM/CQOEaFN8z04FXlppNhtuH2B5Gi6qZAHRwqMJ+T1g4ieVObPm2TKpFIui2rt2rVs2rSJFStWcNFFF/HEE09QVFTEf//3f0/5nnfccQfd3d36o66uLoojHo7cXE+EUk8TmlZ1wlOBQFA3KqWROSZpuaLxJoRDJiYyO5k8fwoJ049EhKfGPYlDhOfP/JO4w26jqkAWiUzwzco7JPpQgRoGzngtGk5HFxor1HQzCdrDGGrgFBYWYrfbaW4eXsGxubmZ0tLSCd3D6XSycuVKjh4VHWTl+yZzT5fLRXZ29rCHUZTnppHisOHxBWhI9FOVQgLjxp4h3L4ATrs2sZM4KNWTanYypYorNG+OTqTydSTSKOuqEyFakwk33Uxww7jjOAQDkJoDGUVmj0bXPY0rTJcopPmrCrWH6Rny0daX2OVMDDVwUlJSWL16NVu3btW/FggE2Lp1K2vXrp3QPfx+P3v27KGsrAyAWbNmUVpaOuyePT09bN++fcL3NBK7TaM6dKpK+IrGCgmMZbGzyvx0HPYJTmsFM6kS/lTl90LnCfFagZO49HzMmYjXD0QoNi0fCKrh+dMFowluGEeGp8bLkDSYYDA4OWE6KJUqnuqMbA+T2PPG8BDV7bffzv33388jjzzCgQMHuPXWW+nv7+fGG28EYNOmTdxxxx369XfddRfPPfccx48fZ9euXXz84x/n5MmTfPKTnwSEIPNzn/sc//7v/85TTz3Fnj172LRpE+Xl5VxzzTVG/zgTImkyqXSxqPkb1Yn2UHiqcIIbFSh1qppVmIEWOlW1J3Kz1o7jEPCBMyMsvDQRGdacVTiJKtwKCdSTxoOjUOf5xu4h+j1+HDaNqoIJrje6568WvOZ79pNFaOww+gM+8pGP0Nrayp133klTUxMrVqxgy5Ytuki4trYWW0Tb+87OTm6++WaamprIy8tj9erVvPbaayxevFi/5stf/jL9/f3ccsstdHV1ccEFF7Bly5YzCgKaxaxkKNzm90LHMfFagQwq6cGZNSkDR1amNd/ASXXaKc9Jo75rkOOt/RSO1rwv3tF1W/NMP4kDeuXr6sJJFI4rnAe125Q4jSePBydi3piM9N5UFaTjnKi3OKNQeP4GO4SxVrbMwBGOz5yiDF44mPjtYQw3cAA2b97M5s2bR/zeSy+9NOzfP/zhD/nhD3845v00TeOuu+7irrvuitYQo4r0IiR0JlXHCcVO4mLRmdRJXJ4GO44Lg83uNGBkE2d2UUbIwOnj3Fn5po7FMNrUSRHvGvDQOeAFoHqiJ3FQqnCb1G619LrpHfKSlWruHDYMhTKojuthzUmsNZom5nztNvGzmG7gJIcHR7ksqkRAF4wm8uRpF6JvCucqcRI/MZWTeHYFONMh4IXOk+NfbzDhnlQJbBgrtFHJOVOS7SLDNYmznkKZVDlpToqyhLcvYT3GgYBSISo9rDlR3ZZElqaQa6eJJEuquGXgGID04DR0DzHg8Zk8GoOQ4an8OeaOA/D6A9R1irj27Ml4cGy28KKjwGY1JxmK/Slk4NS0TyGsCeEwSftRCJjfWkMvMZCoGXi9DeAdAJsT8qrNHg0nQtXGZ03G6wdQEFor249FeUSTRx6m6rsGGfSYP4eNwjJwDCAvI4W8dOEqrmkzP5XUEOQfaYH5Bk5dxwD+QJA0p52S7ElqVxQSGs9OdMFoMBhRjdb8ENWUdFsg+lE50sDvgc6a6A9skuin8UTVU8i/zfzZpoeRIVK3Ncl5Iw+DHeYbOPmhPSoYTGDDGMvAMYyEr2uikAcnnAmTMX6TzdNRqhaOWDBrOwbw+gMmj8YAepvA0weaDfJmmT0a/SQ+Kf0NhDx/6pzGpQcnYcMNenjKfIGxxxfgVGfIgzNZA0ehOQOROpwENYyxDBzDSPieVO3HxbMCHpwpx8RBqVo4pdmppKfY8QWC1HYkoOevIzRncirBkWLuWAifxCe9UQHkhww0BU7j0oOTsGuNQmHNus4BAkFIT7FTnDVJb7E06oe6YKAj6mObLMnQVdwycAwioZsnegehR/QGU8GDI0W5k46JQ4QH55AIoZiIpmmJbRh3qBPWDAaDwzx/k0YPNxyP4qimxhzZdDNR28MoZOBIo7iqYAre4pT0cMapAl4cvRt9Iu5RISwDxyAiO/0mHB2hSrSpOZBufjrztE7icrMd6lbiVDU7kdM329UJa7b1eehz+9A0mFkwicw7iULhhhl54fYw9Z3mF5GLOrreb6654yAyHD6FOQNCRwRqeP6sEJXFVJkdUewv4UrvR+pvFEoRn1KIypkWPlUpsOiEm24moIGjkAdHzpkZuWm4HPbJ30Ahwajdpuney4QzjD0D0FMvXiswb2Tm3aR1WxKFDGMpkj7ZnoB7VAjLwDEI2dCs1+2jtc9t9nCii6zjoMCCM+Dx0dg9BEyyTUMk+qnK/HDD7ESugi09f/L3bSLT8vpB+GfoqgWf+a01EjbcILPUUnMgLc/UoQDTC2uCUoZxZZ7YowY8/sTbo0JYBo5BuBx2KvKEG/NEom1WCoUaZBp+brqT3PQpClflZqXAqSphi/0Fg2EDUoF5c2KqNXAkWaWiincwIIwck5Eh8YQLNyjmLZbrzZTnjUIenBSHjRl5aUDiljOxDBwD0QWjibZZdaiTQTXlYm2RKOTBkT9HR7+HrgHzPQNRo7dRFGvT7JBXZfZo9EPHlEMNmqaUnmJWRLghodCNYvO9fkNePw3dQuM06Ro4kkhxugJhITn/axJt3oSwDBwDSdhMKoU8ONN2GUPYUFPAwMlwOSjNFk1jE+o0LudM7kw1irW1T0O3JSlQx/MnW5ScbE+wk7hCBUVrOwYIBiHL5aAgY4re4rxqQAN3D/S3RXN4U0I3cBLtEB7CMnAMRGbEJFQmlbsP+prE6wLzT1VSqzJl/Q0MP4krcKpKSMNYoZN4IBCRIj5VDw4o5cGpKpDtYQYZ8iZQ6X2F5s2JiArGk04RlzhTRR0oUGTeJKhhHMIycAxkTiLWNJELTlq+IqI/YQRM2WUMEQW4umGwMwqjmh7SwEkot7FCGVRNPUO4fQEcNo2KkAZhSihUC6cgI4Usl4NgULQuSRgU0m1NuUXD6Sjk+ZOe74RaayKwDBwDmZWIpfcV2qggSiGqlHTIKhevFVh0wnHxBNqoFApryo1qZn46Dvs0lkCFBKOaplEVClMlzLzxDoZTxBXw4OhhzanUTYpEoUyqqogQVSKmilsGjoFElt5PmFOVQhtV14CHzgEvMA2xqEQhHY5cdGoTZaOCcIq4Aobx8WidxOXfQHedEqnict4kjNBYsYKiJ6LmwVHHMK7MT8OmQb/HT1uf+XM42lgGjoFomqZvvAmjw1Eog0r+TkuzU8lwOaZ3M4V6C8m4eE2iFOAKBJTSUky7Bo4ksxhSMkWquAJdxasj5k1CEDlnFEoRj5phrMBa43LYKc8NpYonyryJwDJwDCbhsht0D475G1VUwlMShfQUM/PFnOkd8ukeqrimtxF8gyJFPHem2aOJ3klc0yIMY/PnTdiDkyBrTYc6a82Ax0dTjygoOi1hOkR4cBRLFU+UQ3gEloFjMInnNlZHgxO1jQqUKvaX6rRTliNSxRPiVCXnTF6VEiniepG/6W5UoNRpPOFqmiglMBZGY06ak7yppohLcqtAs4G3H/qaozC66ZFwh/AILAPHYKpCp/GTiaDBGeqB/lbxWoFFRxo400oRlyikwYHI9M0E2KwU2qh8/oCuh5tWDRyJQnoKuVHVdw7i8SVAUoNC3mK9B1U01hpHStiTqcK8kTKKRFhrTsMycAwmodzG8pSaUQyp2eaOhSiHqPRU8S4luoqH3cYJMG8U2qjquwbx+oO4HDbKQgUVp4VCtXCKMl2kp9gJBKGuMwHmjULC9KgepiBs7Mu+fiZSnWhRhggsA8dg5KmqrmMAX7yniitUVTQYDE6vi/jpRKaKK+DFSajQpoLC9OqCDGy2KAhXFdJuaZqWOPPGOwg9p8RrBQzjmoh5ExUKFAptyvICbQOJkdQQgWXgGExJViopDhu+QJCGriGzhzM9FAo1tPS6GfD4sWmiK25UUEiHE86ISYCTuEKlBcK6rSjNGblRdZ8Cn/kdmfV5E++eP5mV5sqB9AJThwKRIaporTXqhDYr8tLRNOhz+2jvT6xUccvAMRibTYvQ4cT5qUr34Jh/opIbVWV+OimOKE1j+XMpcBpPmJN4IACdMtRg/ryJWjVaSUYRpGQpkyqeMPNGN4pnKZEifmK6XcRPRyHNX6rTTnmOSBWP+3lzGpaBEwOqEqUybYc6J3G5UVVFy2UMSnUVlyLjzgEv3fGcKt7bAL4hsDkgR4EU8dDfYNS0FJGp4gqcxhPG86dQWLN3yEtbn/DORc0wjlxrAuZLF6Rn6kS8e/5OwzJwYoCeERPvdQYU0uDIrLTq6ZZNj0ShlN8Ml4OiLBcQ554/vYt4FdinWYwxCui9y6JpGCt0GpcbcNyfxBWqgSPDfQUZKWSnRqnMQW6VMPp9Q+IQYDKJKjS2DJwYkBCnqoEOGAxlFymw6Mg2BrIoXlRQyIMDCTJvFDqJu31+6jsHgSgJ0yUKGcZyo6rrHIzv/ncK6f1ORDNFXGJ3CCMHFPH8JVjF/RCWgRMD9N5C8XwSlwtOVhmkRPEPfYroor+ohqhCoYbBTiVSxXU9RTwvOgqFNes6BgkEISPFTlGmK3o3VqgWTnGWi1SnDX8gqBtzcYlMEVfgMBX1DCqJQplU4bpbcXyYGgHLwIkB1RG1cAKBOE3DUygTJhgM6h6cqmiGqFIyhAEH4QXWRKQHJ66LRLar04NKHjBmFmSgRVO4qpDnTyQ1xHlFY++QyEoDJeZNuHdZFNcaUCqTSoqnE6b/XQjLwIkB5bmpOGwabl+A5t44TRXvUCeDqnPAS6/bB4gsqqiiULghITJiFJo38nRaZdSc6T4lNmeTifvTeGcNEARXNmQUmj0aY0JUoJR2qzJfpIr3DvnoSKBUccvAiQEOu42KvFDH1nhVqSvkwZEbfml2KqlOe3RvrlDzxOp4z74LBCJCDSrMGwO8fiA2YVc2EFQiVby6MM49OB1qpYgbFqJSqO5WqtOuV/aO2/VmBGJi4Nx3331UV1eTmprKmjVr2LFjx6jX3n///bz73e8mLy+PvLw81q1bd8b1N9xwA5qmDXts2LDB6B9jWsS9DqdDnVCDYRsVKKWnmBn6+Vp73fSHPFZxRU89+N1gc0JOpdmjoTYU6psZ7XmjaUq1bKiO9/YwCgmMe4a8dIbKNBjmwemsUSRVPPG6ihtu4Pz2t7/l9ttv5xvf+Aa7du1i+fLlrF+/npaWlhGvf+mll/joRz/Kiy++yLZt26isrOTyyy+nvr5+2HUbNmygsbFRf/zmN78x+keZFlXxnhHTqY7oz1ADRyE9RU6ak/xQ5+K43KyGdRE3P0Vcev6kRiWqKHQaD1czjtONSqHeZVLrV5CRQqYrynM4u0KkivvdSqSKJ0RI/DQMN3B+8IMfcPPNN3PjjTeyePFifvGLX5Cens5DDz004vWPPvoon/70p1mxYgULFy7kgQceIBAIsHXr1mHXuVwuSktL9UdeXp7RP8q0iOvJM9glMosA8qrNHAkQrgsT1SJ/EoU0OBBOg4/LeaNQWNMfCFLXIbKKDPX8KTBvqgplqnic9r9TqLSAPFhE3esHoVTxUPFLBZIapIg6bg/hI2CogePxeNi5cyfr1q0Lf6DNxrp169i2bduE7jEwMIDX6yU/P3/Y11966SWKi4tZsGABt956K+3t7aPew+1209PTM+wRa+K6R4z03mQUgyvT3LEQsehEWywKyqWKx3UtHIU2qqaeITz+AE67RllOFLqIn45CTTfLskX/O68/SGO3+aLnSaNSOFwepoxYawDyQutNp/kGTrjifhwepkbBUAOnra0Nv99PSUnJsK+XlJTQ1NQ0oXt85Stfoby8fJiRtGHDBn71q1+xdetWvvOd7/Dyyy9zxRVX4Pf7R7zHPffcQ05Ojv6orIy9HkCeGms74rBjqy4UnWXuOEJIAyfqoj8QqeKZpeK1QotOXHpwpOA2z/x5I39/FXnpOOwGLHu6OL0m+veeJDabphv/cbdZDUsRN98w1guKGrHWQMS8MX+tiSz2F3d71CgonUX1n//5nzz++OM8+eSTpKaGT13XX38973//+1m6dCnXXHMNTz/9NG+88QYvvfTSiPe544476O7u1h91dXUx+gnCxHXHVrnRK7BR9bt9el8YQ9zGECE0Nv80Xl0YpxsVKGUYG1L5OhL5t9FzCnzm/33HbQaeTBFPyVIiRdyw0gISpTw44mfsHfLpwup4x1ADp7CwELvdTnNz87CvNzc3U1paOuZ77733Xv7zP/+T5557jmXLlo157ezZsyksLOTo0aMjft/lcpGdnT3sEWviumOr3KgU0N/ITJjcdCc5aVHqC3M6+qlKAT1FvGbEBINqeXA6DBSmA2QWgzNDdBXvqjXmMyZBdbz2v9PDU2qkiNcaPW8U8uCkOu16+DYuD1QjYKiBk5KSwurVq4cJhKVgeO3ataO+77vf/S533303W7Zs4eyzzx73c06dOkV7eztlZWVRGbdR6G7jeNPhyI1KgZN4OBPGoAUHIjKpzF905Em8sXuIIe/IIVgl6WsBbz9otrCQ0kQM9+BoWvgAoMJpvDBOPTgK6W/cPj8N3UKYbpi3WCEPDkR4/uLNMB4Fw0NUt99+O/fffz+PPPIIBw4c4NZbb6W/v58bb7wRgE2bNnHHHXfo13/nO9/h61//Og899BDV1dU0NTXR1NREX5/oAtzX18eXvvQlXn/9dWpqati6dStXX301c+fOZf369Ub/ONNChhvirvS+SidxPUXcwH5Y+qJTY9xnTJC8dCdZqSI9tTae5o383WVXgCPF1KGAwZl3knx15k1YnB5nG5VCh6lTnYMEg5Ae7d5lkUijeKhbiaSGSK1oImC4gfORj3yEe++9lzvvvJMVK1awe/dutmzZoguPa2traWxs1K//+c9/jsfj4UMf+hBlZWX649577wXAbrfzzjvv8P73v5/58+dz0003sXr1av7+97/jchk0CaNEXApGfe4I0Z/5i47hoQaI2KjMP1Vpmhafhdt03VaVueNA9C4ztHaSRG5WCnn+atsH8MdT/zuF9H6RXr+o9i6LJCUdMkNJOAqsN7L1TW08rTVjEJPqW5s3b2bz5s0jfu90YXBNTc2Y90pLS+PZZ5+N0shiS1ym/HbVAkGhL8goMns0xocaILxR9TWDp9/07ulVBensqe+OL8NYIYFx14CX3iFRCTom80aBjaosJxWnXcPjD9DYPUhFnoE/dzRRSO8n/94MnTMgjLm+ZvGzz1ht7GeNQ1UiNPiNQOksqkRjZr48VcXpRqWA6E+63A0NNaTlQWqueK1EuCEO61ModBKXi3VJtiv6vcsiUUgw6rDbqMyLs3BDwB8WaCtgGMfEWwxKeYxlle+48haPgWXgxBD5h9I54KU7XtLwOtU5UXl8ARq6hOivOmaLTo2xnzMB4rI7tEIenJOxMIphuHZLgToicRdu6KmHgFf0LsueYfZojK+BI5HzRoEaSlJM3dbnZsATh/3vTsMycGJIhstBUZbQCZ2Ml6abCm1U9V2DBIKQ5rTrv0fDUElPEY/doVUUphsdasidCZodfIMi5GAycRdukH9ruTPBZqCnbYLoHhyj541CHpyctHD5jbjx/I2BZeDEmKr8ONPhqBRqiIiJGyb6kyiUvinnTH3nIB5fHPQWcvdBf6iZrgKGcUwExgB2J+RUiNcKGMZSOxI3G1WnOoepQCBofA0cSZ46oU2IU4/xKFgGToypKogzHY5CHhxDG9+djkIhqqIsF2lOO4Gg8GIpj/ydpeVBao6pQwGoDXlLDQ81gFJC45nxFqJSyOvX3DuExxfAbtMoz00z9sPkWtPbAF7z/77lvKmLF8N4DCwDJ8bEVSZVIKDUohPuQRUDA0ehU5WmafF1GlfI6wcxDFGBUkJj/TAVD3MGlDxMleem4jSid1kk6QWiNQVA50ljP2sCyLXG8uBYTJqZuvsvDjw4vY3gd4PNATmxb1B6OqacxLtqRXaHyYQFo3EwbxTaqAY9flp6Re8yw0MNoFRoszJfeB66B+MkqUGhhAY9PJUfg7VG0yC/WrxWYN7EnXZrDCwDJ8bEVW8h+ceWUwn2mJRMGpOaWJ7Es8vBniKyOmShQxOJqwqjCnlw5O8rO9VBbnoMKior5MFJT4mjpIZgMJxFpMK8iWU4HJTyGMdlOZNRsAycGCM355ZeN4Me8z0DY6JQ0a2Yiv5AZHHkhqrwKqDDiSu3sULl9mOWIi5RqM0HhNcb5Q3jwU5wd4vXCqw3Mcugkiik+ZNG3anOwfiqgj0CloETY3LTnWS5hDekrlPxRUehrAYp+nPYNGYYLfqTKJS+OTOePDgd6nlwYmIUQ3hzHmgDd29sPnMM4sYwln9jmaWifYHJ1OqGcYw9OAqsNaXZqaTYbfgCQb3uWLxiGTgxRtO08Gal+qKj0EYlF+gZeWk4jBb9SRSqhRMpMg4qUERuVPw+6K4TrxU4idfEeqNKzRaiUVBj3hTESUaMQt5iCHtwZsZCgwNKhTbtNo2KkH4rLg5UY2AZOCagn6pUnzwKeXBi1hcmEoVOVRV5aWgaDHj8tPd7zB7O6HTXQcAHdhdklZk9mogMqhj2E1No3sSdB0eBtaZ70EtXSJQdcw1O10klkhqq4mXejINl4JhA/J2qzF90YlasLRKF4uIuh53yHHGqUnrRicyEsZm/vMgTaMw2KlDqNB434nSFylFIz3phZgqZrhglV+RUiBYVfg/0NMTmM8cgrspSjIH5K1ASEj5VKaxSH+yEoS7xWgG3sfR2VcdKLAoRIaoaRXoLCQNHacNYoRRxnz9AfafQEMTUMFbKgyP+Xhq6Fa+CrWdQVZs5CiCccRZTb7HNLlpUgBrzRq+hpPAeNQEsA8cEpLtcaetYblQZxeDKNHcsRKRtxjREVS2e3d3C4DOZuOj0q9BJvKFrCF8gSIrDRklWauw+WCHPX2FmCukpdoJBOKVyUoNCIaqwtziGhylQy/NnhagspopeCrtzkICqaXgKpfpChAYnlidxZ1pYR6LEqSoO3MYqbVQRJ3GbzeDeZZEoVNMksgq2spo/71A4LKOAYWzKYQrU8vxFJMIondQwDpaBYwLluanYbRoeX4Dm3iGzhzMyChVr6x7w0jPkA0xcdBTYrMJxcYXdxiqFGmJZGDIS+bN3nwK/+RWEK1XvLdRVCwQhJRMyCs0ejW4YxzSsCUp5cORa0+v26YLreMQycEzAYbfptVyUdQEqpKWQC05Rlov0lBhXVFaweaKycyYYVMowDtfAiXGoIasUHGkQ9Ic2b3NRPtwQKUzXYuhpG4VaMxIaQCkPTqrTTkm2rIKt6LyZAJaBYxLKZzcopKXQM2FifRKHiFNVTew/+zTknFG2CnZ/G3j6AA3yqsweTURpgRgVhpRomlqGseprjUI1cNw+P409wqsesxo4ksi1RoGwUFjzp7DHeBwsA8ckws0TFV90VPDgmBVqAKVK7+ekOclKVbgKtvwdZc8Ah8vUoQDUdsgMqhhvVKCU0Him6muNQnq/uo5BgkFIT7FTmBmD3mWRyNYwiiQ1KB/anACWgWMSSveI8bmhp168VsCDI//AKs304ChwEtc0Lez5U3GzUkhgHAwG9XL7MRWmSxTSblUVhLM2lRSMKhXWDAvTtViHy1LSRasKUGTeKB7anACWgWMSShdS6jwJBMGZoYToz9QQlXSb9zSIbA+TUTojRqFQQ0e/h36PH00TVaBjjkIenBm5adg0GPT6ae1zmz2cM1Fo3phSUDQShQ5UuoGj4lozQSwDxySUjotHnsQVEP2ZuuikF0BKFhBUQjAqdQFKuo07FdqoQr+fsuxUXA577AegUB+zFIeNslAVbOU8f4GAaE8ASnj+TBOmSxTy/Ckvo5gAloFjEvIk3tHvoXdIsTQ8XWBcbeYoAPD4AjR2Cy2FKR4cTYP8avFapVOVisI/hXRbpoY1Ybh2S4GwkLIe474m8A2BZoecSrNHY14NHIlCnj8po2jqGWLIq2BSwwSwDByTyEp1kp8hRGzKLToKbVT1XYMEgpDqtFGUZZJwVaHTuLIbFailpTB7o8qdCZoNvP3Q12LOGCJQVk8h/6ZyKsDuNHcsmBwOB6VSxfMzwr24lK6CPQaWgWMiyqrUFfLgRC44MRf9SRRadJStgu0ZgL5m8VoBw/hkh8laCkcKZFeI1yrMG1VD4goJ0wOBoAIGTrV4VsCDM6wKtmqG8QSxDBwTUbYAl6IGjmko5DYuy0nFoWIVbPm7Sc2BtDxThwLheWNaiAoiQps15o0hhLKeP4XqbbX2uXH7Atg0mGGGMB3UTWpQbY+aIJaBYyJKLjrBoFKLjp7qG+uiW5EoJPxz2G16VpBSi45CcwYiq9GaOW+qxbMCBo6yjVoVCofLdbg8Nw2n3aStMaNQtKxQJKlB+YK042AZOCaipNu4rxl8g0I/oILoT/fgmHSiguEbVSBg3jhCKJndoFCoYcjrp0mvRmuiB0chw1j+Htr63PS7fSaPJgKVMu/MThGH06pg15g3jhBK7lGTwDJwTERJD06k6M8R40qeI3BShZN4TiXYHOB3Q2+jeeMIoeSpSqGw5qlOkXWX6XKQl26icFWhjSon3UlOmvhdKFUFWyHPnxLhcFCrzUe+wlmbE8AycExEblT1nYP4/OZ7BgClNqpgMGh+ui+A3RH2ZimwWSlZ7K9DoQwqM6vRRqJQ0TZQMJNqqAcG2sVrBdYbJcLhoJRhLEObyiU1TJCYGDj33Xcf1dXVpKamsmbNGnbs2DHm9b///e9ZuHAhqampLF26lL/+9a/Dvh8MBrnzzjspKysjLS2NdevWceTIESN/BEMoyUolxWHDFwjS2G2+oAxQymXcbnY12kgUWnTkAmx5cEbG9BRxifxd9DWLLDOTUS5rU86Z9AJIzTZ1KKCgB0eB0GZ5bip2FZMaJojhBs5vf/tbbr/9dr7xjW+wa9culi9fzvr162lpGbk2xGuvvcZHP/pRbrrpJt566y2uueYarrnmGvbu3atf893vfpef/OQn/OIXv2D79u1kZGSwfv16hobi6z/AZtOoVE0wqqDLuDQ7lVSnCdVoI1HoNB7uR6WI2ziyGq0CBo7pKeKStDyRVQbh34+JKJe1qVDdJAg3ZzXdwFEoa9NhtzEjV9Eq2BPAcAPnBz/4ATfffDM33ngjixcv5he/+AXp6ek89NBDI17/4x//mA0bNvClL32JRYsWcffdd7Nq1Sp+9rOfAcJ786Mf/Yivfe1rXH311Sxbtoxf/epXNDQ08Kc//cnoHyfqKKfDUegkrkR4SqKQB0f+PjoHvPSoUAW7twH8HqFTyqkwezSKzRv1hMbKhDYVWmv63T7aQn26TGnOGoliVbDjuSeVoQaOx+Nh586drFu3LvyBNhvr1q1j27ZtI75n27Ztw64HWL9+vX79iRMnaGpqGnZNTk4Oa9asGfWebrebnp6eYQ9VkOLZkx2KnMYVStvUBcbWRjWMTJeDwsxQFWwVTlVyo8qdCTaTPW0oFGoApQxjuXErE6JSaK2RwuuctLAY2zRyKkUWq28wXDzTRJQLbU4CQw2ctrY2/H4/JSUlw75eUlJCU1PTiO9pamoa83r5PJl73nPPPeTk5OiPykrz058lSk0eTz/0h0KHCpyqrI1qdJSaNwoJjIPBYETDRAXmjUKhTfl3dKpzAL8KglGFPDhKpIhLhlXBrjF1KBA+YCoTZZgESZFFdccdd9Dd3a0/6urqzB6SjlJxcb0aba4a1WilWFSFRUcuwgNt4O41dSgQMW9UWHQU2qhae90MeQPYbRrluSYL00Epw7gsJw2nXcPrD+oNbE1FIQ2OUmFNCFfBVsBjHM/VjA01cAoLC7Hb7TQ3D3ezNTc3U1paOuJ7SktLx7xePk/mni6Xi+zs7GEPVdALKbUPEDQ73qrQRgWKeXBSs0W2ByixWSm16ChU5O+kXo021bxqtJEoFNq02zQq8xQpEun3QVfooKnAeqPUWgNKGcbKhTYngaErQEpKCqtXr2br1q361wKBAFu3bmXt2rUjvmft2rXDrgd4/vnn9etnzZpFaWnpsGt6enrYvn37qPdUGbng9Lp9dA2YLBhVyMBRphptJAqlb84MabeUWHQUmjfKpIhL5O+k66RaVbDNnjfddRD0g90FWWXmjgXF9H6gloET+p2093voU6kK9gQw/Ihz++23c//99/PII49w4MABbr31Vvr7+7nxxhsB2LRpE3fccYd+/b/8y7+wZcsWvv/973Pw4EG++c1v8uabb7J582ZAdDj93Oc+x7//+7/z1FNPsWfPHjZt2kR5eTnXXHON0T9O1ElLsVOc5QIUWHQUEv2dCon+Ml0O8jPMr6gMDM9uMJlwRowC4nSFNDjKncRzKkJVsD0i28xklMmI0Y3iKrCZ72mrU23e5Kmj3cpKdeprsOmev0niMPoDPvKRj9Da2sqdd95JU1MTK1asYMuWLbpIuLa2FlvEBD/vvPN47LHH+NrXvsa//uu/Mm/ePP70pz+xZMkS/Zovf/nL9Pf3c8stt9DV1cUFF1zAli1bSE1NNfrHMYSqgnRaet2c7BhgeWWueQNR6SQeERM3tRptJAqVUJcbVUPXEF5/wLxwzFA3DHaI13lV5owhgrCBY3I1WonNLrLLOo6Lvy+T0+iVKUuhUEFRfyCoZ1EpofcDpTw4INbhjn4PtR39LC5XR+IxHoYbOACbN2/WPTCn89JLL53xteuuu47rrrtu1PtpmsZdd93FXXfdFa0hmkplfjpv1HSaX7hNIdGfci5jUKoAV3GWC5fDhtsXoKFr0LxeXZ2hAnbpheDKMmcMESjnwQGxWUkDp/oCU4eiGzhmn8QVKija1DOE1x/EYdMoy1FAmA7htaavWWS3pphrsM/MT+ftui7zDeNJYr5v0ELv92Hq5An4oatWvFbgVKVvVKqcqEApDY6maWoIjRUSGINi6b4ShYTGM/V+VCYfpjrU8eBIY68iLw27TRFvcWQV7E6rCvZUsQwcBVCiCV5PRDXa7BnmjSOEcmmbEN6ouutEFojJKNFVXKGw5oAnXI1WrXlTLZ4V8PxJo7hnyEe3mUkN8nehgGGsN2c1yws6GgqFxJUJbU4Sy8BRACUyGyKr0dpjErkcEyVDVFllIusj4IOeU2aPRo2mmwoJjOtCvYRy0xWoRhuJQsX+0lMcFGaKpAbTBOrBoFKGcTisqUh4SqJSUoMKh6kpYBk4CiBP4k09Qwx5/eYMQqEFJ7IarVJaCpstLKRVYdHJV6AJnkLzRoZdlJozoJQHBxTw/A12gjvULifXfGF6+DClqgenxsxRAOG/qfrOQXx+88sdTBTLwFGAgowUMlLsBINwqtOkCqMKCYxbet24fQFsGszIU+1UVS2eFVh0wn3MLA0ODM+8Uwq9CnY7DJnfB8907ZacM5mlkGL+/5WS4XAI/00poN0qzU4lxW7DFwjS2D1k9nAmjGXgKICmaRFhKpPcxgqdxGv1arRpalSjjUQhwag+Z9r7zamCrWg1WqXCmiCyy9ILxWsFDGNp4JhWJFKhelsQPiAoJUwHpQ5TNptGhfQYx1GYSrHdI3mpKjA5fVOhrAYlM2EkCi06lflpaBr0e/x09HtiP4DIarSZI7dJiSVKhjUlCglGTU9qUOgw1T3o1SvIK+fBGVYF2yTpQgTx2HTTMnAUwfRwg0pZDapqKUApwajLYacsWxS3NGXeRG5UClSjVao56+koVEPJ9IwYhcLh0otVkJFCpsv85IphZEdWwW40ezTmhzangPmrkgUQGW4wYfIMq0ZbHfvPP42TqlWjjUQhDw6YPG8UOon7A0Fdv6akYazQvJEGYGP3IB6fCYJRWddFgXmjZL0tid0BOZXitRLzRqH+dxPEMnAUQS+kZOZJXJFqtEqHqGTWx1A3DHSYOxZMzohRSGDc3DOExx/AaVeoGm0kCmm3ijJdpDntBIJQ32VCUoNCGhylw5qglNBYqf53E8QycBShKqIlfSAQY8GoQidxUHzRSUkP601UOFWZ6TZWaN7In39GrkLVaCNRyIMzvAp2jDcrnxt66sVrheaNcsJ0iULzxnSd6BSwDBxFKA8tzG5fgJZed2w/XKETVe+QVxfMKunBAaV0OKa6jRUq8iezD03ryTUe+WpVwa40K5OqqxYIgjMDMopi+9kjoGyKuEShruKVeeEq2F0DJiQ1TAHLwFEEp91GeW5IMBrrU5VCJ3HpvcnPSCErVaFqtJGodKoyy22sWDVapcOaILx+ClXBNi2TKnLOaOZ72pT2FoNSa01aip3iLFEFO14yqSwDRyFMa7qp0EalZ8KouuCAUnoK+Xtq7nHHtgp2ZDXaPHWq0So7byKrYCs0b2Ku+VPIW+zzB3QNkpIiY1DKwIH4y6SyDByFMK3fR6dCNXBULboViUKLTm66k6xUkd4a03CDnDNZZeA0X9R7UvUQFSjZWyjmISqFDlP1XYP4A0FcDhslWalmD2dkpCE40C4SG0wm3npSWQaOQphiHfu94Wq0+bNj97mjoLzoD5SqaTJcMBpLA6dGPCuwUQWDQfVDVKCUYRxZCyemVbBVOkxFeP1sKgrTQdkq2PEiNLYMHIUwJVW8q1ZUo3WkKlKNNlTkT+mTeLV47j4FPvPFdqakiiskMO4a8NI7JIS7yoaoQClxekWeqII94PHT1hfDOawbxubPG6l1VNoohohU8ePmjgMFGrVOEsvAUQhT3MaRJyoFqtHGxUk8o0hkgRAMZYWYy0wztFsKeXDkgaAk20Wq027yaMZA/q4U0OC4HHbKc2RvoRgJ1BUVpitZUDQSBTV/loFjMWnk5Ono99A75I3Nh+qiP/PDUx5fgIaQ6E/pEJWmKRluiGn2nUJiUf0kHi8bVWeN2OxNpjLWzRP7WsA7AGiQOzM2nzkG0jCuLlR4rYHw2qyA508ag6ZVwZ4kloGjEFmpTvIzUoAY6ikUCjXUdw0SCEKa005RKB1RWRRsnhhbD446hrHSPagiyasGNJF9pkIV7NBmFbO1Rs6ZnApwpMTmM8cgLjI2QalqxoWZKaSnmFgFe5JYBo5izIx1AS6Fyu2fjGiyqSlQI2NMFBIa63OmczA2VbC9gxHVaBWYN/IkrrqB40yF7HLxWgE9RcwzYhQKTwWDwfjIvAOlQlSmVsGeApaBoxh6Aa5YLToKhRqUbnx3OrqewvyNqiwnFYdNw+ML0NQzZPwHymaJrmxIzzf+88ZBN4xV36hAqcq0Mc+I6VAng6ql182QN4BNE+09lEZ6SXvqRasLk6mMIx2OZeAoRkxTfgOBCJGx+QZOXKSISxRyGzvsNiryYqinkEZd/iwlqtHG57wx3zCOuWBUobCm3rssL40Uh+LbYEYhpGQCwfDhwkSq4ihVXPH/2eQjvOjEwP3X1wS+IdDsaoj+4iGDSqIL/2qEoWgylbFcdBQyigc9fr13W3zMG3UMY/n7aul1M+iJQRVs3TBWwcCJE2E6hJIa1DGMqwrF76zGMnAsJouMB8fmJB5aZHMrwW5+36e4qIEjyakUhqFvUBiKJhNTobFCG5X8ebNTHeSmmy9cHRf5O1Ngo8pJC1fBjrnnz2ROxoswXZJfLZ4VCG1WF1gaHIspIj04DV1DeP0GewbkgqPASTwYDOqLbFyEGuzOsNdLgc1Kz4iJpWGsxEYVJ0JRiUIaHE3TIppuGrxZDXWLdgOgxHpzMp7WGogwjM2fN5FrTUySGqaBZeAoRnGWC5fDhj8QpL7T4DQ8hTKopOjPbtOYkae46E+i0KITDlHF4FSlkJYiroTpEP5b628Fd6+5YyGGHmP5N5JRBKnZxn7WBKiNV8NYgcNUeW44qaG5NwZJDdPAMnAUw2bTYif+U6jIn3QZl+em4rTHybRUSDAasxCV3xeu3qzCSTyeBMYAqTmQXiBeK2AYy3BDjdGGsULeYoiTpr6RKNTmw2G36Qeqmja1dThxspMkFzNj1ZNKIbFoXIn+JArpKeSc6Rzw0mNkFezuOgj4RO+yrDLjPmeCxN1GBUpVppUeDMOzNhXy+nUPeOkaEH8jyhf5k+hz5iQEYiAIH4d4qYVjGTgKohfgitWpSoEQVdyFGkCpjSrD5aAwU1R/PmnkqUo/iVcr0rsszkINoFS4obpAZsTEaq0x38CRBf4KM11kuBwmj2aCZM8AmxMC3nCRTRMJe/4sD47FJKmKRYhqoEMI/0CJwltxF2qA4RVGFegtFJNwg0IncZ8/oOvU4tKDo1CIqr7T4N5CSgnT46TydSQ2O+RVidcKGMZh7VYSe3A6OjrYuHEj2dnZ5ObmctNNN9HX1zfm9bfddhsLFiwgLS2NmTNn8tnPfpbu7u5h12madsbj8ccfN/JHiSkz9cwGAw0cuVFllkKK+affuAw1DOst1G72aCLCDQYuOgr1LmvoGsIXCJLisFGSlWr2cCaOQtqtoiwXaU7RW+hUp5GeP3UM47j0FoNShrFcp5Nag7Nx40b27dvH888/z9NPP80rr7zCLbfcMur1DQ0NNDQ0cO+997J3714efvhhtmzZwk033XTGtb/85S9pbGzUH9dcc42BP0lsicxsCBrlGVDoRAXhcNzMeNLgOFOF6xiUWHRmFcbAbazQvJGhhpn56dhs5ldUnjCRRSJNZniquEHzxjMAvQ3itQIGTk1bHOr9QKkSA5GHKcP2qChgWADywIEDbNmyhTfeeIOzzz4bgJ/+9KdceeWV3HvvvZSXl5/xniVLlvDHP/5R//ecOXP4j//4Dz7+8Y/j8/lwOMLDzc3NpbS01Kjhm0pFXho2DQY8flp73RRnG3A6VehE1TPkpVOK/uLuVDULek6J03jlOaYOJTYeHHV0W3EZ1oTwRtV9SvQWcrhMHU51QQYHm3qNC21KQ86VA2l5xnzGJNCbsxbG2bxRqAp2ZX4amgb9Hj/t/R5d/6cahnlwtm3bRm5urm7cAKxbtw6bzcb27dsnfJ/u7m6ys7OHGTcAn/nMZygsLOTcc8/loYceGtOKdLvd9PT0DHuojMthpzzUAM6w07hCGVSyvUBhZgqZ8SL6kygUbggLRg2aM4FAeLNSwDCO21BDRiGkZKFMb6FCgz04kfW2FOhdJtebuMmgkijUVdzlsFOeI/YolTOpDDNwmpqaKC4uHvY1h8NBfn4+TU0TK23f1tbG3XfffUZY66677uJ3v/sdzz//PNdeey2f/vSn+elPfzrqfe655x5ycnL0R2Vl5eR/oBgzS/b7aDNo8ih4Eo+7BQeUyqSSG31rr5s+ty/6H9DXJFpTaHbRqsJkwqUF4mzeaFq49L4ChrEM1RjmwVEog2rI66epRxSni6vMOxi+1igQFooHHc6kDZyvfvWrI4p8Ix8HDx6c9sB6enp473vfy+LFi/nmN7857Htf//rXOf/881m5ciVf+cpX+PKXv8z3vve9Ue91xx130N3drT/q6uqmPT6jqTI6I0ZBLUXcLTigVMpvTpqT/AzRj8mQU5Xeu2ymEr3Lws1Z43DeKGQYV+tlKQzaqBQ6TEmvX5bLQV66+XN4UuRVARp4+qC/zezRxCYkPk0mHQ/4whe+wA033DDmNbNnz6a0tJSWlpZhX/f5fHR0dIyrnent7WXDhg1kZWXx5JNP4nSOPRHXrFnD3XffjdvtxuU6MxbocrlG/LrKVBtZgMvTH24QqVCIKq49OAoYOCAM445+DyfbBzirPCe6N1doo4rsXRZ3ISpQyjCW3aHrOgfw+QM4ol1JXCG9n24UF6ajKRAumxQOl0hqkJq/zCJTh6M33YxF/7spMmkDp6ioiKKi8X+xa9eupauri507d7J69WoAXnjhBQKBAGvWrBn1fT09Paxfvx6Xy8VTTz1Faur4Atvdu3eTl5cXd0bMWEgD54QRISqpo0jNgfT86N9/koRP4nG4UcnNfqBd1BVKjbJRMUmqCzJ4q7bLGM+fQrqt1j43Ax4/Nk2I8uMOhVJ+y7JTSXHY8PgCNHYP6WX4o4ZCIaq4rJgeiUxq6DwBM0ffR2NBVRwU+zNMg7No0SI2bNjAzTffzI4dO3j11VfZvHkz119/vZ5BVV9fz8KFC9mxYwcgjJvLL7+c/v5+HnzwQXp6emhqaqKpqQm/X5Sn/stf/sIDDzzA3r17OXr0KD//+c/59re/zW233WbUj2IK1YUGpuEpdKKCsNs4Lg0cV5ZoIAhKbFa658+IuLhCG5X0+pXlpOFy2E0ezRRQSJwe2f8u6oaxzyPae4AShnFce/1AqUyqhAxRTYZHH32UzZs3c9lll2Gz2bj22mv5yU9+on/f6/Vy6NAhBgbEpNu1a5eeYTV37txh9zpx4gTV1dU4nU7uu+8+Pv/5zxMMBpk7dy4/+MEPuPnmm438UWJOZBpea5+b4mgWMlPoJD7k9dPQLarRxlUNnEjyZ4vu0B3HoXyFqUOpLjRQu6WSbiuevX4Q/tvrqhUNTO3mZg9WF6RztKWPmvYB3j0vijfuroNgABxpkGV+WY+aeC0tIFGqFo74HXYNeOke8JKjoKbJ0L+q/Px8HnvssVG/X11dPcw7cfHFF4/rrdiwYQMbNmyI2hhVRabh1XcNcrJ9ILoGjkJairqOAYJByHQ5KMxMMXs4UyN/NtRtV+I0XmVUb6FgUCnPX1xWvo4kewbYXeB3i5CDye1S9NN4tEPikV4/BTQvtfHYuywShTR/6SkOirNctPS6OdnRz7L0XLOHdAZWLyqFMSxVXKGNSmqMquNR9CdR6FQlhX/NPW4GPFFMFR/sBLc6vcvisvJ1JDZbRG8hdeZN1PUUCh2mfP4Ap+Kxd1kkCoWoQH0djmXgKIxhqeIKhajkz1YdrycqUEowmpueQk6acBVHtVmr3KiyysFpvqg37j04oNRp3DA9hUJhzcbucO+yUiOqw8cCuWYPtMGQ+QVrDfP8RQnLwFEY3YMTTevY74WukOhPgUXnREgMK3/WuEShjQoiTuPRFBortFFBhOcvng1jpTx/oY2qY4BAIIpJDQoJ0+VhqjIvLb56l0WSmg3pBeK1EvNG7VRxy8BRGF1PEU3ruKsWgn4h+stUQPSXCBuV3PR7G0VjQZMx5DSuUKihs99DV6h3Wdz1E4pEIc9feW4qDpuGxxfQK/1GBTlvFPAWS2F6XK81oNS8mal4JpVl4CjMrIgeMVFLFdfDU9VCB2Ay8lQ1qyiOF520vHD9GwU6RFcb4flTKKx5IjRnSrNTSU+Js95lkSikp3DYbXr9m6iFxAN+6Ar12lLAgxP3KeISpTx/lgbHYopU5KWjadDn9tHe74nOTRUKNQx6/DR2i9PirHg+VWmaUmGqcIjKCA+O+RtVTYQwPa5RtLdQ1Kqn99SD3wM2J+RUROee0yAhwpqg1FojCya29rrpN6L/3TSxDByFSXWGO7ZGbbNqPyaeC+ZE537TQPagyklzkpcRpyniEoVOVcaEqNQxjOXfwqzCTJNHMk1yKkGzgXcA+prNHk1EN/oozRs5Z/KqwGZ+McYT+ryJcwNHrt3t5hs4OelOvadXVJMaooRl4ChOuHBblCZP+1HxXDB37OtiQPgkHucLDih1qpIenIbuIYa8/unf0N0L/aG+cgqEqI7rG1Wce3AcKeGu7ArMG92DEy1xukJeP38gqFe/ThwD56i54wihsg7HMnAUJ+pCY4UMHH2jiveYOChl4ORnpJDlEtqUumicqqSuKC0f0nKnf79pouu24t2DA0q1bIi+B0cdA6ehaxCPP0CKw0Z5rvllDqZFfsjA6WsShw+TUVmHYxk4ijMrmouOzxMh+jM/RJVYHhx1BKOaplEVTc+fbhSbP2eCwSAnWhPEgwPhv0MZOjaRSA1OVJIaFBKmH9f1N+nY4zVFXJKWG+5/p8S8sTw4FlMkqsK/zhrRF8aZoUZfmESogSORp9TuOmFImkx1ND1/Cnn9Wvvc9Ie6iEe967UZyN+pAuGGirx0bBoMev209rqnf0OVKqa39gEJstZAhGFs/ryRfb2iJk6PIpaBoziR7RqmfarqiBAYK9AW4UQiVDGWZJaAM10YkF21Zo8muuEGXZhuvoEjvTcz8uK0i/jpFIY6WypwEk9x2JiRJ8I30y7cpljvshOJ5C2GCMPY/HlTXWgZOBZTpDJfpIr3un10TDdVXKGTeJ/bp58SE2LRGZYqbv6iE1XPn0LzJiFae0Qiw34dxyAQMHcsRNHz19sE3n7Q7JA7Mwojmx4yRDU7EdYaGD5vTEaGqBq6B6OT1BBFLANHcYalik/3NK7SRhVacPIzwr2T4h75e207Yu44iCz2N805EwyGfx4F5o1s7ZEwG1XOTFEnxjckuoqbzMxohRvaQ3Mmr0pki5lMQgnTQanQZkEoqSEYVC9V3DJw4oCqaPUWUqgGTvgkngA6ColCi46cMw1dg7h90zhVDXTAUJd4rUSoQWgpEsLrB2B3hAXqCsybqIU2FTKK3T6/3kU8YTQ4kWuNyUUiNU1jdqgS/fGQ1kkVLAMnDoiaSl1BD07CbFQQoacwf6MqynSRnmInEERf3KeE/FlyKiHFfGM0oYTpEoX0FPphatprjTxMzZvmiKZPbfsAwSBkuhwUZprvTYoK+bMADYa6YaDd7NEwu0h4xo61qpVJZRk4cYBMhz0xHbexu080gwRFTuIJFmqA8GKuQIhK07To1FBSKEU8EAhGhBoSad6o4/mTv9cTrdNMapAhqkLzD1PHIyoYawokV0QFZ1q4/YVK8yaa7WGigGXgxAFR8eDIolvpBZCeH4VRTQ89RJVQG5VaBbhmRaMWjkJev8aeIdy+AE67xox4L9YWiUIGzswCkSre7/HTMp1UcYXmTU2itGg4HYUqGlshKospE2kdT/lUpdCCAxEhqkTJhoHTCnCZv+hE14Nj/ryRKeKV+ek47Am0dClk4Lgcdr2+0LGpblY+D3SGCooqEKJKmB5Up6NQaHN2SLx93PLgWEwWmdnQO+Sjc8A7tZvIPwIFKhj3DHn17ugJ5cEBpRadqFTBVsnAaU+wVF+J/N121YIvCgX2pon8/R6fqp6i8wQE/ZCSqURB0eMJb+CYbxjLWjhdA97plzOJIpaBEweIVPFUYBqblUJaCulRKMpykRnqmZQwKJQqLt3Gx1qmeBIPBJQq8peQXj+AzGJIyRJFIhVo9TEnJBidsoETudYooHmxPDjGk57i0PcomemoApaBEydMO9zQoc5GpS84ibZRgVKZVHKjaugeYsDjm/wNek6B3y3qtChQrC3hqtFKNE0xPYUMN0xxo9JTxM0PTyVcQdFIFCsSqWImlWXgxAnV01WpqxRq0Dcq89OOo45+qjLfg5OXkUJeuiiiOKXTuJwz+bPBZn5bhJpEq0YbiUKGcVgwGv9rjZwzhZkJVFBUkjMTbI5Qkch6s0eje8imPG8MwDJw4oQ501l0BjpgsFO8ViBFPCFr4EjkqbX9mOkFuCAi3DAVw1ih8JTPH9CrpCbmvFFHTyENnLrOgamV3pc/Q6H5HpyE1d+AKBKZp06RSDlvrBCVxaSZUyzdf1OYPHLyZ1coUaxN1vNJyBBVXrXov+PpE/14TGZaOhw91GC+butU5yC+QJBUp43S7FSzhxN9FDJwijJdeun9KbVsUGjeyMy7hNNtSRSaN7Onq90yAMvAiRPmRpzE/YFJegZ0l7H53htIcA+OI0X03wElwlTT8+CocxI/ESEwttnMF65GHYU0ONMqvT/YCQNt4rUCnj/pTZhVlIBrDUTocI6bOw7CoeOT7QOT36MMwjJw4oTy3DRcDhseX4D6yZbeVygm3tnvoXtQpLon7qlKJT1FyPM3FQ+OQvMmYTNhJLJ8Q38rDHaZOhSIFBpP0jCWYc2sMnBlRXlUk0d6ixNStwVKeXDKc9NIcdjw+KewRxmEZeDECXabpi/ukw5TKaSlkLVMSrNTSUsxX7hqCHqquPmLzpyisDg9MJlTlc8t6rKAEvMmIStfR5KaDZkl4nWH+Wm/s6e81qhjFAeDQU6Exp8wXcRPRyEDx27TdNnBMUV0OJaBE0dMWYejkIFTk8gZVJJCdTKpKvPTcdo1Br1+GnuGJv7GjhNAEFzZ4erMJpLQpQUkkQJ1k5mynkKhLuId/R56hkR5BNlENOGQv+fOk6KCtMmolkllGThxxJyiKRg4gYBSNXASti9MJAqdqpx2m14Je1J6ClWLtSWqlgKU0uFEanAm1R6mXR0DR86ZGblppDoT1FucVQrODFE5uuuk2aNRLpPKMnDiiDl6RswkrOPeRvAOiMweBYq1HQ1tstJYS0jkSVyRU9Wcqehw9I3KfIHxkNdPfZeI6SesbguUqoItOm9Dz5BPb6syIaT3SSFhekIfpjQtnDyihGGsViaVoQZOR0cHGzduJDs7m9zcXG666Sb6+sZeZC+++GI0TRv2+NSnPjXsmtraWt773veSnp5OcXExX/rSl/D5plCpNc6YkgdHTvq8arCbX+jqaGiTnVucwAZOVqnowxP0Q2eN2aOZmmBUIS1FXccAwSBkuRwUZqaYPRzjUMjzJ9rDiI7tE96sFGvtkRQGDijVsiGpQlQbN25k3759PP/88zz99NO88sor3HLLLeO+7+abb6axsVF/fPe739W/5/f7ee9734vH4+G1117jkUce4eGHH+bOO+808kdRAun+a+/30DnRU5VC4SmfP6AvOglt4AwrvW/+aVz3/E3KMJbzxvxaJscjygpoCoTLDCNyo1KgSOSkU8V7ToFvMNTao8rAkU2MhG3tcToKGcZyrWnqGaLfbb7TwTAD58CBA2zZsoUHHniANWvWcMEFF/DTn/6Uxx9/nIaGhjHfm56eTmlpqf7Izs7Wv/fcc8+xf/9+fv3rX7NixQquuOIK7r77bu677z48HvPDAUaSnuJgRm7oVDXRGKdCJ6qTHQN4/UHSIk6HCYuSqeLx6cGRXr85iay/gXCRSG+/EkUiJ11DSW/tMUtU2TWZE4nc2iMShQyc3PQU8jOEl3XKbYWiiGEGzrZt28jNzeXss8/Wv7Zu3TpsNhvbt28f872PPvoohYWFLFmyhDvuuIOBgXA1zW3btrF06VJKSkr0r61fv56enh727ds34v3cbjc9PT3DHvHK7MnqcBTqIh4ZnkrIYm2RKKSniDxV9U3kVDXYJeqxgFIGzrwS8+uqGMqwIpHmb1aT9uC0qWMUBwJBvbSAFaKKLXqYKpENnKamJoqLi4d9zeFwkJ+fT1PT6KeTj33sY/z617/mxRdf5I477uB///d/+fjHPz7svpHGDaD/e7T73nPPPeTk5OiPysrKqf5YpjNpHY6iBk7Co1DzxNz0FArkqWoisfFhxdrM/7860tILJMm8UahZ65zJdodWyOvX2DPEkDeAw6ZRkZfg3mLZX7C3AdzmZy9Jj9mE1hqDmbSB89WvfvUMEfDpj4MHD055QLfccgvr169n6dKlbNy4kV/96lc8+eSTHDs2dev0jjvuoLu7W3/U1dVN+V5mM6laOD5PWOSqwKKTVAaOQm5jiAw3TGDeKLRRBQJB3Vs5L6nmjfmncenBqe0YwOMLjP8GaZQpkEEl15rqwgwc9gRPFk7Ph7R88VqB9Wb2ZNYag5l0oPQLX/gCN9xww5jXzJ49m9LSUlpaWoZ93efz0dHRQWlp6YQ/b82aNQAcPXqUOXPmUFpayo4dO4Zd09zcDDDqfV0uFy6Xa8KfqTJhwegErOOOYxDwQUoWZM8weGTjE9ZSJMNGdVrp/bRcM0fDnOIMdtR0TCxVXCGvX33XIINePykR9XwSGoVq4ZRmp5KeYmfA46e2Y2D8g4lCIaojzcLrN78kCdYagKKFUPsatB6C8hWmDkWlTKpJGzhFRUUUFY1f2XTt2rV0dXWxc+dOVq9eDcALL7xAIBDQjZaJsHv3bgDKysr0+/7Hf/wHLS0tegjs+eefJzs7m8WLF0/yp4k/ZNPN2o4B3D4/LscYBaxaQ560ogWmF2sLBIK612leMiw6riwR4ultFKfxitWmDmd2qFT9sYnExRXy4EijeHZREpzEQSnPn6aJ9jD7Gno43to3toHjHYTukGdcgdpJR5qltzjBdVuSYmngTD16Ei3mnFYk0szMR8NWjEWLFrFhwwZuvvlmduzYwauvvsrmzZu5/vrrKS8vB6C+vp6FCxfqHpljx45x9913s3PnTmpqanjqqafYtGkTF154IcuWLQPg8ssvZ/HixXziE5/g7bff5tlnn+VrX/san/nMZxLGSzMWRVkuslwO/IEgte0DY1/cEprsxQuNH9g4NHQPMuDx47RrVCXDSRzU0lMUS3H6BDw4beoU+Usq/Q2Ef+cdJ5QoEjnhGkodxxGtPXIgo9D4gY3D4ZZk8+AsEs8KGDgzC9KxadDv8dPa6zZ1LIYeiR599FEWLlzIZZddxpVXXskFF1zA//zP/+jf93q9HDp0SM+SSklJ4W9/+xuXX345Cxcu5Atf+ALXXnstf/nLX/T32O12nn76aex2O2vXruXjH/84mzZt4q677jLyR1EGTdOYPVEdTusB8VxkvoGjx8QLkuQkDkqdxqUHZ9ymm34ftB0WrxUwjMMn8STZqLLLRf+voF+ReTPBTCo51sK5pnuLg8EgR0PzZl6yeHCKFojnlgPmjgNwOexU5IlD7IQF6gZhaLGC/Px8HnvssVG/X11dPazPSWVlJS+//PK4962qquKvf/1rVMYYj8wpyuDtuq7xJ0/rIfEsrXsTCaf6JslGBWGxpQKp4hV5aaTYbbh9Aeq7BqkczYvWeQL8bnCmQ475rT2OtCTZRqVp4kByage07IcSc8Pu4VTxcdYahbx+TT1D9Lp9ort1oqeIS4pDa3xnjQgXOs3NHJtdlEFtxwDH2/pYO6fAtHEkyVE6sZhQbyGfJ3yqkta9iegZVMkgMJbIxV4amibisNv0jspjhhvkCbBoAdjMXR6CwWByGsbSc6ZAuGHCxf6k16/QfN2W9PpVF6ST4kiSLS6jCNLygGD4/8JEdI+xyR6cJPnfTywmVAsnMoMqpyJGIxsdPYMqWUINED5VtR8Fv9fcsTBBw1gXppvv9WvucdMXOokndJPN0ykOeW0UCDdID0hHv4eugTE0QXKsxeYnehwOZVAljdcPQp6/0N9si/mG8ayiDPIzUrCbXNDV/HraFpNmbnE4VXxUlbpCGVTBYFDvIp40WgoQhmVKFnh6RSaVyZoWPdwwVn2Klv3iudh8A0cKjJPqJA5hzZwCBk6Gy0FpdipNPUMca+1nddUIzU4D/rCXUoF5Iw9TSSMwliiUSbXx3Jl84l3m9yNLolUjcZiZn4HdptHn9tHcM4pKXVrxCgiM2/s9dA140bQkqYEj0bTwgi8NBxOZM5GeVHrmnfkb1ZFkE4pKdD3FCfAOmTsWItrDjOYx7gjpthxpkFsdu4GNgvTgzE301h6nU6ROaFOVVjyWgROHpDhseqr1qItOqzop4nKjqsxLJ9U5Rt2eREQ3cMw/jY/rwfF7I3RbCsybZNTfAGSWQGouBANK6CnmhwyFw029I1+ge/0WKqHbOpKsHhyFDBxVsAycOGX2eDqcVnU8OEkZnpLoegrzPThyzjT3uOkdGkET1H4MAl6FdFtJVgNHomnheaPAZrWgVBg4h5pHM3DU0d+IuZ1kGVQSudZ3nBCZVBaWgROvjFm4bVgGlfkGzrFk6kF1Ogp5cHLSnBRliWKYI5YYiDyJK6DbOpxsNXAikZ5XBQxj6cE5NK4HR4GwZsgoripIH7vKeyKSWaxUJpUKWAZOnDJmp9+O46EMqkwlTuJJV402Enmq7TiuxKlqgb5Z9Zz5TYW8fm19HroHk1C3JVEoI0Z6cFp63XT2j5BJpXtwzDdwDuu6rSScM5GZVAqUplABy8CJU8ZMFW+NqGVi8kkckqyL+OlkFkF6ARBUYtGRm9XBkU7jCm1Ucs7MzE9C3RaE/w9azff8ZbocVOSJwnFnzBufO8JbrMK8kS0akkxgLFGoorEKWAZOnCIL5jV2D9Fzup5CoQrGPUNePdMrKQ0cUKquyUJp4DSOYOAo5MGRG1VSnsQhIpPqJHjM78os580Znr+2I6KthCtHtJkwmaRr7XE6xZYHJxLLwIlTctKdlOWkAiNkN0RWozUZqb8pyXaRneo0eTQmoVCq+KKybAAONvUMa5MiTuLHxGsFxKJHdK9fkp7EMwohvRDVPH9nCI0jvX5K6LYsDw6ghOdPBSwDJ46Rp6oDjaedqloVqmWSzOEpiUJC47nFmdg06BzwDu/0K0/iqTmQVWreAEMcSWYthUQ/jaugw5GG8ekGjjoC49ZeNz1DPmwayZdBJZFeeyuTCrAMnLhGnsYPRC46itUyOZaMPahOR6EQVarTri/+w+ZNZIsGBXRblmGMUoaxPEwdbuod7vlTKEX8sN6DKiM5dVtwWiaV+U1+zcYycOKYhdLAifTgtB9TKoMqqQXGEmlo9pyCoW5zx0J43hyMnDeRKeIm09nvoa1PeJeSqnfZ6SjUsmFWYQZOu0a/x8+pzgjPgEIenKTO1pTIbvSghOfPbCwDJ45ZXBauTxEIhE5VCvWggsgif0kaEwdIy4XsGeK1Amm/C0eqa6K3aDD/JC7nzIzcNDJdSdwuT6EQldNu0zM39Xnj7oOuk+K1AgaO9OAkrf5GYhk4OpaBE8dUF2SQ4rAx4PFT2zEgvqhQJsyQNzyupD5VgVJC44UjhTb10gLmzxvL6xdC/l9014F7lCJ7MeQMobEUP2cUC1G0yeiZd8nWouF0dM+fZeBYBk4c47Db9MJtB2X6Zos6G9Xh5l6CQcjPSKEwc4QuxMmEgnqKoy29eP0BIUbsOCG+qcBJ3BIYh0jPh8yQ4FuhTCpdaNyqTt2kyMrXSdec9XRkmNnKpLIMnHhHblb7G087VSmw6OxrEEbXWeXZaAqEy0xFoZ5UMvTj9Qc50dYfmjNBSMuHjCKzh6drKZL+JA5KtWw4oxaOQgLj1j433YNebFq4qWzSIjOpOmuSPpPKMnDinEWRgtFhGVTm18DZ1yAEtYvLs00eiQIo5MGx2TT9NH6gsSeirMBiJXRbSV+sLRLdMDY/3CBTxY+39uPxBdQSGDcneeXrSDKLI7rRJ3cmlWXgxDkLQ0LjA009oR5U3lAGVaXJIwt7cBaXWQYOhQsADQbaoK/V7NEMDzfoJ3Hzw5ptfW6aeobQtPCGmtQUqRNuKM9JJSvVgS8Q5Hhbn1IenCPN0uuX5OEpCHWjtyoag2XgxD2LQptAXccgg/V7xRcL55t+EvcHgno7gLPKc0wdixKkpEP+LPFagXDDotKITCqFhOnSKJ5VmJHcGVQS3fNnvgdH0zRd83e8tg56G8U3FPAWH26xdFvDsCoaA5aBE/fkZaRQmi1aNnTUvCO+qIDL+ERbP4NeP2kRheWSHoUK/g2rhaOHGsw/ie+tF2HNJZZRLJAbVW8DDHaZOhQIe/465VqTMxNSzfe0yZpOcnxJT5E6IXEzsQycBGBRKEwVqN8tvlCyxLzBhJD6m0VlWdht5us6lEChVHFZK6Sruwu6asUXFTCM5bw5y9JtCVJzIDtUsFOBuiZSaOxvUkd/4/MH2B8ycJbMsAxjAEpDe0DjO+aOw2QsAycBkKfx7M5QiKp8pYmjEeyX+htrowqjkNA4J83JjNw05mr14gsZxSIt2WT21lsb1RkUq1PRWBrGGd2HxRcUMHCOtfYz5A2QkWJnVoHlLQagdBmgierpCmj+zMIycBKARWXZFNFFjq8N0KB0qdlDikgRtzYqncgQVWQ/H5NYUJrFIps63pvuQa9eGNLy4EQg503THnPHASwMaf4qvDXiCwqENffUS69fDjbLWyxIzYaCueJ1425Th2ImloGTACwqzWKJTRRqCxbOB5e5QrtgMKi7jK2NKoL8OWBzgqcXuk+ZPRoWlmaxTDsu/qGQ168iL43c9CQvDBlJ+QrxrMBGlZPupDTLxXwtNH8VMIx13Zbl9RuOnDcNu80chalYBk4CMKswgxX2GgD6C8zX3zT1DNHR78Fu06y+MJE4UqBwnnitgA5nYVk2y2zHxD8UMHAs/c0oyP+bpj3g85g7FmBNkYc8rY8ANpGxaTLSg7O0wpo3wyhbIZ4VMIzNwjJwEgCH3caaVBFqqEs1f8HZF9JRzC3KtIpunY4MHza8Ze44gEWFThZodQAEysw3cKwMqlHImyUKt/k9ShjGF2SIOdOaWgXOVFPH4g8Edc/fUsuDMxzLg2MZOInCwqAINbzjn2XySIa3aLA4jRmrxXP9LnPHAcwKnCRF89MezOJUwPxmiXLeWKGG09C0sBdHAcN4qSa8fvu1eSaPBI619jHo9ZOeYmdWoVUDZxily8RzzynobzN3LCZhGTiJQF8Lub5WAkGNf/SVmz0a9jdaLRpGRTdwdpouNHY07QZgT2A2B5rN7VY94PFxrFUUaztrhjVvzkAhA6diQGRz/WNwJkGT5/De+nBY0ypHcRqRQuMk9eJYBk4iEJq8x4Ll7G7xmjsWrAyqMSlZAjaHaNnQXWfuWOrFZvl2cLaoaGwiBxp7CQShOMtFcZa5YQ8lmbFKPDeY7PkLBsloE7VVtrurqWkfMHU4eyyB8djoOhzzDWMzMNTA6ejoYOPGjWRnZ5Obm8tNN91EX1/fqNfX1NSgadqIj9///vf6dSN9//HHHzfyR1GbkIhsT3AWdR2D9A6ZZ+R0D3g51Sk62Fo9qEbAmRouxFi/09yxhLwBewKzRdNNE7EExuMgPTgtB8ztEN1xHG2oCw9ODgVnsruu07yxYOm2xkX3/O02dRhmYaiBs3HjRvbt28fzzz/P008/zSuvvMItt9wy6vWVlZU0NjYOe3zrW98iMzOTK664Yti1v/zlL4ddd8011xj5o6hNaKM6mSJi4maexveFwlMVeWnkpDtNG4fSyNO4mQaOZ0DvU/NOYLZ+EjaLfVaBv7HJngEZRRDwQfM+88YR0o61ZMzHi4PdtV2mDcUfCOre4qUV1rwZkSQXGhtm4Bw4cIAtW7bwwAMPsGbNGi644AJ++tOf8vjjj9PQ0DDie+x2O6WlpcMeTz75JB/+8IfJzBwuIMvNzR12XWpqEru1Q5N3sFBk6Bww0cDZbwmMx0fX4ZjoNm56B4IBApkltGp5nOocpKV3yLTh7G0IF2uzGIFIobGZAvVQiMxTIsayu67LtKGcaOtjwCP63c0psgTGI5LkQmPDDJxt27aRm5vL2WefrX9t3bp12Gw2tm/fPqF77Ny5k927d3PTTTed8b3PfOYzFBYWcu655/LQQw+NKXZzu9309PQMeyQMfS2iER8aqTPForP3lHmn8f2W/mZ8pIHT8BYE/OaMIeT1s81YzfxiUato18kuU4bi9vk5HBI5L7EExqNTLnU4JhrGIa9jztw1AOxv7GHIa84cll7HxZbAeHSSXGhsmIHT1NREcXHxsK85HA7y8/Npamqa0D0efPBBFi1axHnnnTfs63fddRe/+93veP7557n22mv59Kc/zU9/+tNR73PPPfeQk5OjPyorKyf/A6mKnLSF81lSLTKodtWaFxeXLmNLfzMGhfPBmQHefmg7bM4Y5CZZvpJVVbkAvGWSnuJIcx9ef5DcdNEfy2IUzM6k8nv15o35895FYWYKXn84TBRr9pyy6t9MiCQWGk/awPnqV786qhBYPg4enH7X28HBQR577LERvTdf//rXOf/881m5ciVf+cpX+PKXv8z3vve9Ue91xx130N3drT/q6kzOXokmskpl+QpWV+UBcKSlj+6B2AuNh7x+jlqpvuNjs0eEG0zS4cgwR/lKVlaKefOWSR6cSIGxplkn8VGRc6btELhHT9YwjJYD4BsEVw5awVxWVOYC5oWprBYNEySJdTiTNnC+8IUvcODAgTEfs2fPprS0lJaWlmHv9fl8dHR0UFpaOu7n/OEPf2BgYIBNmzaNe+2aNWs4deoUbrd7xO+7XC6ys7OHPRIGOWnLVlCQ6WJWoeima4YX53BzL/5AkPyMFEqzk1gTNRFmmGjgDPVA+xHxOsKD8059F15/IObD0TuIW2HNsckqEWLjYEBoqGKNnKvlK8BmM9XACQSCumFseXDGQffgvG3qMMzAMdk3FBUVUVRUNO51a9eupauri507d7J6tdAcvPDCCwQCAdasWTPu+x988EHe//73T+izdu/eTV5eHi6Xa/wfINGI8OAArJqZx4m2fnae7OSShcWjvs0IIisYWyfxcTCzorFc6HJmQkYhs9OCZKc66BnycaCxh2UVuTEdji4wtjaq8SlfCT31IkxVdd7410cTWYMnNHdXzgx5/kw4TJ1o76ff4yfVaWNOUUbMPz+uKAsJjbvroL8dMgrMHU8MMUyDs2jRIjZs2MDNN9/Mjh07ePXVV9m8eTPXX3895eVCK1JfX8/ChQvZsWPHsPcePXqUV155hU9+8pNn3Pcvf/kLDzzwAHv37uXo0aP8/Oc/59vf/ja33XabUT+KuvS1isUOTVfLn10tFp2dJ2O/6EiXsaW/mQDSwGneC94YZy/JjSpkFNtsWsRm1RXTofgDQb0GzxIr8258ZLjBDMO4friBs6wiB02DU52DtPWN7D03CrnWLCrLxmG36tWOSWoO5M8Rr5NMhzNpD85kePTRR9m8eTOXXXYZNpuNa6+9lp/85Cf6971eL4cOHWJgYHg1zIceeoiKigouv/zyM+7pdDq57777+PznP08wGGTu3Ln84Ac/4OabbzbyR1ET6b0pnAcukSYpdTi760S4wRnDP35pVEnXtcUY5FRCeqGoaNy8FyrOHv890UKKVGU9HmDlzFxePtzKrtpO/um86pgN5XhrH0PeABkpdqoLrJP4uJiVSeXpFxoc0OdNVqqTuUWZHGnpY3dtF+sWl8RsOHtOhcNTfr8fr9f8Cu5KU3UJeDzQeBgqLjB7NGPidDqx26PTpNlQAyc/P5/HHnts1O9XV1ePmN797W9/m29/+9sjvmfDhg1s2LAhamOMayIyYSRzizLJSnXQO+TjYGNvzApgdfZ7OBiqv3PurPyYfGZco2niJHzkWaFtMMPAiZg3q0IenFhrtyJTfW1Wqu/4yP+zjmMw2AVpubH53MZ3IOiHrDLIDve7W1GZy5GWPt6q64ytgVPfjQZcMMPB4cMmZSLGE1UfhuLLwZkOJ06YPZpxkXXupit1MNTAsTCYCIGxxGbTWDUzj5cPt7LzZEfMDJwdNR0AzC3OpCAzCbVQUyHSwIkVAx3QWSNeR8ybFTNz0TSo6xiktddNUVZs/g/fqBEGVax1P3FLej7kVkHXSeHBnX1xbD5XzlEZWg2xcmYev995KqZC40CogvEHF2VQluqnuLiU9PR0S/c3Fp5+MWdsTiicZfZoRiUYDDIwMKAnKJWVlU3rfpaBE8+cJjCWnF0lDJw3T3Zyw/mxmcw7TggDZ43lvZk4esuGGOoppPcmf86w0392qpN5xZkcbu7jrdpOLj9r/EzHaPD68XYA1s5OHuHjtJmxSmxWDW/FzsBpCJcViESGo9+p6yYQCMbEC1fT3o/f72fd7EzKSksoKLDmzrikOKBPA3zgdIBd3a0/LU3UwmppaaG4uHha4SpLnRWv9DRGCIyXDvuW1OHsiqHQePsJsVGtsTaqiSP1FO1HRLghFowQnpLIeji7YiQ0buoe4kRbPzYNzp1tGcYTxoyCf6N4cOaXZJLmtNPr9nGsNTa1ed6o6SA31Ua6y0FGhqXbmhA2B9hDXllvv7ljmQDp6ekA09ZWWQZOvHLiFfFcvgJcWcO+tbwyF7tNo6F7iIYu4zsP9wx59RYNlgdnEmQUiHADhL1xRjOGgSPr4cRKhyO9N0tm5JCdajVmnTB6kcgYGTiRYc3T5o3DbtPD4LHKwHvtWDs2DVIdNissNRlCiSimFImcJNH6f7UMnHjl+EvieQQXdYbLwaKyUH+hGGxWO2s6CQShuiCdEqvA3+TQ6+HEQIcTDMKpN8TrkQyckND4nVNd+GJQ8G/bMWHgvMvy+k2OsuWABt210DuxtjfTQoZQC+aOKGpeOVN87a0Y6HCCwSCvheaNy2FtX5NCHoTd5jVjjjXWDIlHgkE48bJ4PeuiES9ZHdqs3qwx3sB5XYanZlkb1aSJZcG/lgPQ1wyOtDNCDQBzQhl4Q96AnhFnJNss/c3USM0JGTmEDzpGMkp4SrIyhhWNj7T00drrJsVhIyWBDJyLL76Yz33uc9O6xw033MA111wz+gUpIQ+Ob1D0FZsiDz/8MLm5uVN+fyxJnBmSTLQfFfobuwtmvmvES1ZJHU4MPDjbjwuBsZUePgXkplG3HQIGe02OvSCeq88H55meNptN00WjRs+b+q5BajsGsNs0zrHmzeSZc6l4lv+nRlK3XTyXrxrx2ytC2q1DTT0MeHyGDuXVo22AqH9jhaeG8+Mf/5iHH3549AvsTnG4gQl7caqrq/nRj3407Gsf+chH4iY13zJwokntdnjqNtj1K2M/R57aZq4B58jdl8+uFpvGvgZjF51+t0+vKrrGEopOnhmrRGfx/lZo3mPsZx1/UTzLzXEEVsWoovHroTDD0hk5ZLrUzehQljmXiOdjLwqPrlF4B+Hkq+L17JG9xaU5qZRmpxIIwjuhAnxG8epRMW9k5W0L8Pv9BAIBcnJyxvesyDCVZ+o6nLS0NIqLx2kD5O6DjhOxS54YBcvAiSYNbwnj5p3fGfs544SnAMpDi44/EOTtOuMWnV21nfgCQWbkplGRl27Y5yQsDld44zj6N+M+xzsENaGNaiwDJ0aePxmesvQ3U6RyjSja1t8CzfuM+5yaV8E3BNkVULRw1MukDsfIeePzB9gemjerQp8Xj/T397Np0yYyMzMpKyvj+9///rDvu91uvvjFLzJjxgwyMjJYs2YNL730kv59GSJ66qmnWLx4MS6Xi9ra2mEhqv/5n/+hvLycwGle4as/fjP/fPs3wd3LsWPHuPrqqykpKSEzM5NzzjmHv/0tvAZdfPHFnDx5ks9//vNomqZ7zCJDVIcPH0bTNA4ePDjsc374/e8xZ9WFMCT2nr1793LFFVeQmZlJSUkJn/jEJ2hra5v+L3McLAMnmswPtZao3ab/x0adgD+cQTVGDQxN08Lp4gYuOjI8ZWVPTYO5l4nnIwYaOHWvi9h7VtmYG5UMUZ1sHzC0v5Be/2aOZeBMCYcLqkMl940MUx19XjzPvUxU3x4Faai+fKjVsKHsqe+m1+0jO9XB3OKsM74fDAYZ8Phi/hipGv9YfOlLX+Lll1/mz3/+M8899xwvvfQSu3aFNXibN29m27ZtPP7447zzzjtcd911bNiwgSNHjujXDAwM8J3vfIcHHniAffv2neFRue6662hvb+fFF1/Uv9bR0cGW57ay8QNXgt9DX1cHV155JVu3buWtt95iw4YNXHXVVdTW1gLwxBNPUFFRwV133UVjYyONjY1n/Czz58/n7LPP5tFHHx329Ud/+0c+ds0GSM2hq6uLSy+9lJUrV/Lmm2+yZcsWmpub+fCHPzyp39tUsHzD0SR/NhTME3VNjr0AZ30g+p/R+LYwnlw5wyrRjsSqqjye2dNoaONNvcCfFZ6aOnPXiee67eL/NtWA6tNyE5x9yZgbVU6aKPh3pKWPN2s62LBkepVER6KuY4BTnYM4bBpnV1mhhikz51I48pz4vz3/s8Z8hvQqznvPmJddurCYbzy1jzdPdtI94CUnPfpp/69FZN3ZRygoOOj1s/jOZ6P+ueOx/671pKdMbCvt6+vjwQcf5Ne//jWXXSYONo888ggVFRUA1NbW8stf/pLa2lq9KfUXv/hFtmzZwi9/+Uu9hZHX6+W//uu/WL58+Yifk5eXxxVXXMFjjz2mf84f/vAHCgsLueSSi8A3yPKFs1i++hz9PXfffTdPPvkkTz31FJs3byY/Px+73U5WVhalpaMX/ty4cSM/+9nPuPvuuwE4vH8PO9/Zx69/eje4svjZ9+9h5cqVw9ovPfTQQ1RWVnL48GHmz58/od/dVLA8ONFm/nrxfNigPzSpv6m+YNxqlHLz2Hmyk0Ag+nH6Ia9fz5ywMqimQV61MIyDfuOyYqSBM0Z4SnLBvEIA/nagxZChyPDUsoocMiz9zdSR/5cnXxNamWjTcUIkNNgcY4bDASrz05lfkok/EOTlI8Z4caTA+Py5hYbcPxYcO3YMj8fDmjVr9K/l5+ezYMECAPbs2YPf72f+/PlkZmbqj5dffpljx47p70lJSWHZsmVjftbGjRv54x//iNstPLGPPvoo119/PbbQAaqvvYkvfvGLLFq0iNzcXDIzMzlw4IDuwZko119/PTU1Nbz++uvic/73EVYtXcjCxUvAZuftt9/mxRdfHPbzLFy4UP99GIm1ukSb+eth28/gyPMinGSLTldUHam/mUCJ9sXl2aQ57XQPetnf2MOSGdH1DLxV24XHH6A4y0VVgaW/mRbz3iM8f0f/Bouvju69+1qhKSRgnsC8ec/iEn75ag1bDzTj8wdwRLkjvRQYW+GpaVI4H7LKobdBhMUnYLxOCum9qXwXpGaPe/mlC0s43NzHCweaef/y8nGvnwxDXj9vhjzR588ded6kOe3sv2t9VD93IqQ5o7fG9/X1Ybfb2blz5xktCjIzM8OfmZY2bhbZVVddRTAY5JlnnuGcc87h73//Oz/84Q+F0LiviS9+7S6ef3Un9957L3PnziUtLY0PfehDeDyeSY25tLSUSy+9lMcee4x3vetdPPbbP3DrJ67VPdF9fX1cddVVfOc73znjvdPtNTUeloETbWauBVc2DLSJ2iaV54z/noniHYJaYSWPltEQidNu46L5RWzZ18SWvU1RN3DC4akCK2Vzusy9DF7/L6HDCQbHDCNNGukVKl0GmUXjXn5udT45aU46B7zsPNkZ1fYbwWAwov9U/J7ElUDThFGz+9fCQ2eUgSM1YuNw2aJifvHyMV463Bp1w3jnyU48PnGYmlOUqXslItE0bcKhIrOYM2cOTqeT7du3M3PmTAA6Ozs5fPgwF110EStXrsTv99PS0sK73/3uaX1WamoqH/zgB3n00Uc5evQoCxYsYNWqVRAMgGbj1Tfe4oZPbOQDHxBSir6+PmpqaobdIyUlBb/fP+5nbdy4kS9/+ct89CMf5vjJOq6/er3YB4FVq1bxxz/+kerqahyO2P7/WCGqaGN3hheaI1EOU9VtFxkNmaXi9DYBrlgqYqf/t/dMgdh00ftPWQLj6VN1gahR0dsgCvJFk0mEp0CU3790oRAtPr+/OapDqe0YoKF7CKc9LIK3mAaR6eLRxOcOJzOMo7+RrKzMJTfdSdeAN+pVjV87Fg5PxfNhKjMzk5tuuokvfelLvPDCC+zdu5cbbrgBm01sxfPnz2fjxo1s2rSJJ554ghMnTrBjxw7uuecennnmmUl/3saNG3nmmWd46KGH2Lhxo/iiZoOUTObNquSJJ59k9+7dvP3223zsYx87I+uqurqaV155hfr6+jGznj74wQ/S29vLrbfeyiXnnU35jAq91tZnPvMZOjo6+OhHP8obb7zBsWPHePbZZ7nxxhsnZDxNB8vAMQKjdDiR4akJ/pFfurCYFLuNY639HGmOXnVajy+gZ2e9yxIYTx9najgrRmauRINgMMLAuWTCb7t8cQkAzx9onnSWyFjI9gwrKnNJS4ly+DYZmX0JoEHz3ui2bTj5GngHxGGqZMmE3uKw27h4vvAQbo2yfkvWvzkvAcKa3/ve93j3u9/NVVddxbp167jgggtYvTpcJfqXv/wlmzZt4gtf+AILFizgmmuu4Y033tA9PpPh0ksvJT8/n0OHDvGxj30s/A1XFj/4xhfIy87kvPPO46qrrmL9+vXCwxPBXXfdRU1NDXPmzKGoaHTvb1ZWFldddRVv79nLxg9eMSykWV5ezquvvorf7+fyyy9n6dKlfO5znyM3N1c37IxCC0Zz9YoTenp6yMnJobu7m+zs8WPLk6avFe6dBwTh9gOQHaV49P2XirLp1/wcVnxs/OtD3PjLHbx4qJUvvGc+t102LypD+ceRNj7+4HYKMlJ482vr4vpUpQzb/xv+78sw60L4p79E557N++Hna4V36Cs1I1YwHol+t4+Vdz+Pxxfguc9fyPySM9Nyp8LnHn+LP+1u4LOXzuX2yxdE5Z5Jz39fKLIrP/DfsPz66Nzz2X8TWsIVH4dr7pvw2556u4HP/uYt5pdk8tznxw+jT4SeIS8rvvUcgSC89tVLKc9NY2hoiBMnTjBr1ixSU63+d5PGOwCth4Q3p3SpeJ4uwaAwtAM+yJ8zId3WaIz1/zuZ/dvy4BhBZlG4BP+R56Jzz8GucCfocTIaTueKUKrv/+2N3gnvibdOAbBhSall3EQLmS5+clv0GuKN055hNDJcDs4PnZajFaYKBILhAn8JcBJXBiPaNkxSfyO5aF4RdpvG4eY+6joGojKU7cc7CARhVmEG5bkjV263mCSONJEdFwyAJzr/T3gHhHGj2cKdy03GMnCMYv4G8Xw4SgZOzT/EZCyYBzkzJvXW9ywuwW7T2N/YQ2379CfzgMfHlpCx9MFVkxuLxRgUzIG8WRDwwom/R+eeE2jPMBrvWSz0W8/ti45hvKOmg+YeN5kuh94SwiIK6AZOlNo2dNVB60GxUU0irAmQk+7Uy1O8cDA6YSqZHp4I4Sll0LRw881oHabcPeLZlRUdj1AUUGMUiYisanz8RZH9NF2ObRXPE8ieOp28jBRdJxMNsfFz+5oZ8PipKki3NqpoI7040dDhTLA9w2isWySExm+f6qa5Z/pz+Hdv1gFw1fIyUqOYWpv0RLttg/TeVJwDaZP/+74sNG+2RsHACQSCbD0oPIjxXP9GSWRfKmmYTJchaeAYUKh0ilgGjlGULhNl8b0DcPIf07uXuw/2/EG8XvjeKd1iw1niNL4lCqfxJ96qB+CaFTOs8FS0kRkrR/82/dP4BNszjEZxdqreumG6YareIS9/3SOM6+vOrpzWvSxOY1jbhq3Tv58enppY9tTpXLpQCNRfP9ZOv3t6jX7/cbSNuo5BslIdXLxg/BIHFpNAVkz3Dky/UKTfK+4D09LeRBvLwDEKTYN5IS/OdMNUe/8grOy8WTDr4indYv1ZpWiaKM7X2D31ydzSM8Q/QpVKP7DSCk9FneoLwJ4CXbXQdmT868fi7cfF8zh9hMbi8rNC2VTTNHCefqeRIW+AucWZrAwZTRZRRBojb/92eoaxzwPHQ9mak9TfSOYUZVBVkI7HH+AfR6fXUPHR7ScBuHZVhfI1buIOuzNs5PRPs/Gl9AI508V9FcEycIxETxffMvVFJxiENx4Ur8/+Z5hiWl1xdiqrQ+GkZ6chNn7q7QYCQdHNt7owY8r3sRiFlAyoOl+83v+nqd+ntzns9Vv9z1O+jUwX33asnd4h75TvI8NTHz67wvL6GcGy68Tm0rIvXL9mKhx7ATy9kF44bq+70dA0Ta+j9MI00sWbe4b0diEfWzP5FGmLCZAR8ooNdojK+1NFNpd2qeO9AcvAMZZZF4HdBV0nRfrcVKjfCU3viPus/Pi0hrNhiSz6N3UD54ldIjz1gVUV0xqLxRjIEgDb/3vqruM3HxRi5YpzoWL1+NePwpyiTGYVZuDxB3j58NR6DB1p7uWt2i7sNo0PrLTmjSGk5YXnzes/n/p9Xv2xeF7x0SkfpgAuC4WpXjjUgn+KffB++0Yd/kCQc6rzolamwOI0UjLF3hIMCCNnKgT8YaGyQuEpsAwcY3FlwoJQNtU/fji1e7z5kHg+6wOQPr2CeutDOpw3ajpo6zuz1Pl4HGrqZX9jD067xvuWGttDJKk564OQM1O0+3jr15N/v3coPG/edeu0hqJpGu9ZPL0w1e93ipICly4spijLNa3xWIzBmk+J58NboH0KTQzrdkDta2Bzwrs+Pa2hnDsrn9x0J629bp5+p2HS7/f5A/xmh2j6uHFN1bTGYjEGmgYZIfF2f/vUIg39bcJAsruEF1EhLAPHaN79RfG89wloOTi59w50wN4/itfn3DTtoVTmp7N0Rg6B4NQ2qydD4uJLFhSTl5Ey7fFYjILdAedtFq9f+yn4JynU3PtH6G+F7Bmw6KppD2d9SIezZW8TDV2T8yh5/QGe2CUMnA9b4mJjKZwX0uIEYcf/TP79//iReF7+kWkXJ01x2Lj53bMB+PHfjuDzB8Z5x3BeOtRKY/cQeelO3fNsYRBp+YAmEhK8kywjEvCL7D2ArJLo9tCLApaBYzRly2Dh+4AgvPLdyb337d+I3lMlS0XKZhSQi8Ujr9VMatEJBIL8eXcoPGWJi41n5cfFwtN1cnJanGAQtodCFOfeHBXB36qZeZw7Kx+3L8D3nzs8qfe+eLCFtj4PhZkuKwsmFkiP3VuPhtN2J0LrITj0DKDBef8SlaH803nV5KU7Od7Wz593T86LI8XFH1pdkXAlBYLBILfccgv5+flomsbu3btNGUdNTY34/D17w+UAJis27m8Txf3sKSFDSS0sAycWXPQV8TwZL04wGA4znPPPUbOMP3ruTHLSnBxs6uXXr5+c8PteP95OY/cQ2akOLg3VubAwkJSMcMjhHz+auOv45KvQtEdUKl31T1EZiqZp/OuViwBRwXp/w8Q3zt+9Kbw3166agTOK3aUtRmHOpVC4QAiFJxPelNqbhe+Fook18h2PTJeD/3fRHAB+8sIRvBM8UJ3qHOClkN7ro+cmnrh4y5YtPPzwwzz99NM0NjayZMnEen1NhxtuuIFrrrlm2NcqKyvDny/DVIOdE/cYD/PelCrnvQHLwIkNw7w435vYe068DO1HISULln44akPJz0jhi+tFD6DvP3+Y1t6JaXF+HTpRvXdZOS5HYp2olOXcm0VMu3nPxOubSIHp8uunrdmKZEVlLu9bVkYwCPf838S6nbf0DvHiIbEAXne2JS6OCZoG7woZxtt/MbHMmO56eOd34vUFn4/qcDatraIgI4WT7QM8GUpQGI/Hd9QRDML5cwuYXaRGyf9ocuzYMcrKyjjvvPMoLS3F4TAn/d1ut4c/35kOzjQgCIPtE7uB4t4bsAyc2KF7cf4o3MHjIVPDl38k6n09PnbuTJbMyKZ3yMd3t4zvUfr9m3X8dU8TNk281yJGpOeHvTBSHzEWHSfg4DPitfT+RJEvr1+I067x9yNtvDKBjKoH/n4CfyDIqpm5zC22smBixrLrITVXhDcPbxn/+tf/S2TcVV0AFWdHdSjpKQ5uvTjsxfH4xvbieP0BHn9DlBRIRHHxDTfcwG233UZtbS2aplFdXU11dTU/+tGPhl23YsUKvvnNb+r/1jSNBx54gA984AOkp6czb948nnrqqWHv2bdvH+973/vIzs4mKyuLd7/73Rw7doxvfvObPPLII/z5z39G0zQ0TeOll14Kh6h27xaGcXohL2/bybnvXofL5aKsrIyvfvWr+Hxhj87FF1/MZz/7Wb78pS+SP3M+pSvewzd/8oiS3huwDJzYEenFeXkcLU7t9vBGdfb0xcWnY7dpfOv9wi36+52n2Hmyc9RrDzT28PU/ixT3298zn6UV6pThTgrWfkY0xav5O5zaOfa1O+4HgiJMUTz5ysXjMbMgnU+8qxqAe/7v4Jjpv3/YeYr/eeU4gC42tYgRKemw+gbxeryU8YEO2PmweH3B5wwZzsY1VRRluTjVOcgfQhl1o/Hjvx2hrc9NYaZLz96bMMEgePpj/5hE5tGPf/xj7rrrLioqKmhsbOSNN96Y8Hu/9a1v8eEPf5h33nmHK6+8ko0bN9LRIVK76+vrufDCC3G5XLzwwgvs3LmTf/7nf8bn8/HFL36RD3/4w2zYsIHGxkYaGxs577zzzrh/fccAV37iNs5Zvoi3t73Ez3/+cx588EH+/d//fdh1jzzyCBlOje1/+RXf/frt3HXPvTz/fBRayxiAYb6x//iP/+CZZ55h9+7dpKSk0NXVNe57gsEg3/jGN7j//vvp6uri/PPP5+c//znz5s3Tr+no6OC2227jL3/5CzabjWuvvZYf//jHZGbGgSvzoq/AwaeFF+eiL0PRgjOvqXkVHr0Ogn5YcCWULDZkKKur8rhudQW/33mKbzy1lz9/5gLstuFWeO+Ql08/uoshb4CLFxTx6YvnGjIWizHIrYQlH4J3HoeX/xOu/43Isjqdd34HbzwgXk8zxXcsbrt0Lr/fWceBxh6efKueD60+M/T02rE27njiHQA+c8kcrrBKCsSec28WGXg1f4etd8Ml/3ZmXZtgEF77CXj6oGRJuA9alElLsfPpi+fwrb/s52cvHOHa1TNGDHP/6G+H+dmLRwFxmJq0Zss7AN+eXvbXlPjXBqGZmwA5OTlkZWXp4aHJcMMNN/DRj34UgG9/+9v85Cc/YceOHWzYsIH77ruPnJwcHn/8cZxOkVgwf35YS5WWlobb7R7zM//rF/9NZcUMfvYfX0XTNBYuuICGb32Lr3zlK9x5553YQvNn2bKlfOOzmyDgY96qC/jZ//6JrVu38p73TK21h5EY5sHxeDxcd9113HrrxOtwfPe73+UnP/kJv/jFL9i+fTsZGRmsX7+eoaFwo7+NGzeyb98+nn/+eZ5++mleeeUVbrnlFiN+hOgT6cX54yfh5GvDv3/8Jfj1teDth9kXw7UPGjqcr1yxkOxUB3vre3gsVHNCEgwG+eof93CirZ/ynFR++OEV2GxquiETnvP/BdDgyHPw4HuGhzgDAfjbN+GJm8HvhkXvhzlTK7E/EfIyUvjMJcLQ/f5zh+ga8Az7/tGWXj71vzvx+oO8b1kZX3jPCEa8hfHkVMDFd4jXf78XfvcJ0dNO0tcqvibrc53/OUPDDB89dyYl2S4auof41yf2ntG89adbj/Cjv4nWJP965UKrcvEILFu2TH+dkZFBdnY2LS1C47Z7927e/e5368bNVDhw4ABrz383WmYoiaS7jvNXLaKvr49Tp0Ket2CAZfOrh2lvysrK9HGohmEenG9961sAPPzwwxO6PhgM8qMf/Yivfe1rXH311QD86le/oqSkhD/96U9cf/31HDhwgC1btvDGG29w9tkiVvzTn/6UK6+8knvvvZfychOs98ly6deEIdP0DvzyClG34tKviaJuj28UaeFz18FHHgVnqqFDKcx08YXLF/CNp/bxn389wOvH2llcns2isiwONvXyzJ5GnHaNn21cZdW9MZOSxXDtA/DM7dCwC37xbjFnVm2CJz8Fh/9PXHfB7XDp16dVgXYi3HBeNb96rYaG7iHO+Y+/ceG8It63vIyVlXnc+PAb9Az5WF2Vx73XLbeMYjO56EvC0PnLZ4Xn+KH18NHfQMNb8PTnYaBdhD8v+gos/ZChQ0l12vnC5Qv48h/e4Y+7TvGXdxq4/pxKPnXRHJ58q57vPy/KD3z1ioXccuGcqX2IM114U2LNNIvb2Ww2gqeFubzeM9uinG68aJpGICA0TWlpadMawzCyZwCayJDqDRkuPrfQdHkHcGqB8HUhTY8ch2oo073sxIkTNDU1sW5d2E2ak5PDmjVr2LZtG9dffz3btm0jNzdXN24A1q1bh81mY/v27XzgAx8Y8d5utxu3O5wt1NMTpfbwU6F4EXxmh6iJ89av4ejz4mFzCKt4/hXw4UdEh+AYsHHNTJ56u4GdJzt5Zk8jz4Q6Pkv+9cpFrAr1sLIwkaUfgqrz4KnPivny/NfhpXuEW97ugqvvE/2IYkCq085PPrqSf31yD4eb+9h6sIWtB8MnuKqCdO7fdHbC1S+JS1Z8FArmiMNT8164b024mFvJErjm58KzHAM+fHYlZTmp/PhvR3jzZCe/2naSx7bX4gtpub60fgGfumiKxg0ID9QEQ0UqUVRURGNjeN3t6enhxIkTk7rHsmXLeOSRR/B6vSN6cf5/e/cfFFW99wH8vT/YBR5gNxB2RVlZTQdLE5Ik0HvpBs+TZWXldEeHCrMHx4QS7WKYV/vDDJpmmtGmqakZtcc0JyYxc6yuA2jSIL8CxbSVHplwlMUfhLukZrCf+wfX093yKuiyyx7frxlm5Jzv6Mc3uvvZc873+zUYDOjru/aMuokTJ+LTTz+FANBExQMa4Jv6TxAZ8V8YbXADF/71YUVv7H+8YpitWnw1w+YhY6ezf38ki8X7wTKLxaKcczqdiIvzXoNFr9cjOjpaGXM1JSUlMJlMyldCQoBXVDWNAh5Z19/oTP4rAE1/c5P0MPDX//NbcwMAep0WW/PS8OGCaSh+MAmzk+MxwRIBvVaDOXePxvyMRL/VQtcRFQ/klAGPvt2/fMCvF4AIK/DsF35rbq5ITYzGP5Zm4h9L/4wXs8ZjbGz/G4s5PAQb59+DaF7xGz4SpgELqwDrXf3/ZjS6/hXW86r81txc8afxsShblI6teWm4d2y00tz87X8mKLc+bzX3338/Nm/ejP3796OlpQW5ubnQ6Qb34aCgoAAulwtz585FQ0MDWltbsXnzZjgc/bezExMTcejQITgcDpw9e/aqV4gWL16MEydO4IUXXsD3Dgc+q6zHq2+9j2ULc/qvxBoi+qeSh5qCorkBBnkFp7i4GG+88cY1xxw9ehRJSb6fwXEzVqxYgWXLlinfu1yuwDc5QP8nqzkfAH9aBnR+B9wxOyBbzRv1OmROiEXmhN9WmvV4hLcXhiONpv/W1Ni/AEc/79+jLCpwD/FOsERi2X9HYmn2ePz/mZ9hCgvhflPDkWk0sODL/hWObWnAyCkBK0Wj0SBj3AhkjBuBb9t/gvtSr9drz61mxYoVaGtrw8MPPwyTyYQ1a9YM+gpOTEwMKisrUVRUhMzMTOh0OiQnJ2P69OkAgLy8POzduxepqano6elBVVUVEhMTvX6PUaNGYffu3SgqKsKUKVMQHR2N5/43D3//exEQYuxfrkQTXFdlNfL7m3/XcObMGZw7d+1FgMaOHQuD4bdPb5s2bUJhYeF1Z1EdP34c48aNQ1NTE5KTk5XjmZmZSE5Oxrp167Bhwwa89NJL+Omn36Y19/b2IjQ0FGVlZf/xFtXvuVwumEwmnD9/HlFRw2v3UyIiurZLly6hra0NdrsdoaFD+6wi+d+1fr6Def8e1BWc2NhYxMYOTadtt9thtVpRUVGhNDgulwu1tbXKTKz09HR0d3ejsbERU6dOBQBUVlbC4/EgLS1tSOoiIiKi4DNkz+C0t7ejubkZ7e3t6OvrQ3NzM5qbm9HT89tUxaSkJJSXlwPov2xZWFiI1157DTt37kRLSwueeeYZxMfHK3toTJw4ETNnzkReXh7q6urwzTffoKCgAHPnzg2OGVRERETkF0M2i2r16tX48MMPle9TUlIAAFVVVbjvvvsAAA6HA+fPn1fGLF++HD///DMWLlyI7u5uzJgxA19++aXXJaotW7agoKAAWVlZykJ/69evH6q/BhEREQWhQT2DoxZ8BoeIKHjxGRx189UzOMNmmjgRERGRr7DBISKioDRcV9Clm+Orn+uwWcmYiIhoIAwGA7RaLU6dOoXY2FgYDAZohnAvLfIPEcHly5dx5swZaLVaryVnbgQbHCIiCiparRZ2ux0dHR04dSoA+0/RkAoPD4fNZlN2ML9RbHCIiCjoGAwG2Gw29Pb2XnefJQoeOp0Oer3eJ1fk2OAQEVFQ0mg0CAkJueoGk0R8yJiIiIhUhw0OERERqQ4bHCIiIlKdW/IZnCuLN7tcrgBXQkRERAN15X17IJsw3JINjtvtBgAkJCQEuBIiIiIaLLfbDZPJdM0xt+ReVB6PB6dOnUJkZKTPF4dyuVxISEjAiRMnuM/VEGPW/sOs/YdZ+w+z9h9fZS0icLvdiI+Pv+46ObfkFRytVovRo0cP6Z8RFRXF/zB+wqz9h1n7D7P2H2btP77I+npXbq7gQ8ZERESkOmxwiIiISHXY4PiY0WjEq6++CqPRGOhSVI9Z+w+z9h9m7T/M2n8CkfUt+ZAxERERqRuv4BAREZHqsMEhIiIi1WGDQ0RERKrDBoeIiIhUhw2OD73zzjtITExEaGgo0tLSUFdXF+iSgl5JSQnuueceREZGIi4uDo899hgcDofXmEuXLiE/Px8xMTGIiIjAnDlz0NnZGaCK1aO0tBQajQaFhYXKMWbtOydPnsRTTz2FmJgYhIWFYfLkyWhoaFDOiwhWr16NkSNHIiwsDNnZ2WhtbQ1gxcGpr68Pq1atgt1uR1hYGMaNG4c1a9Z47WXErG/M119/jUceeQTx8fHQaDTYsWOH1/mB5NrV1YWcnBxERUXBbDbjueeeQ09Pj28KFPKJbdu2icFgkA0bNsh3330neXl5YjabpbOzM9ClBbUHHnhANm7cKIcPH5bm5mZ56KGHxGazSU9PjzJm0aJFkpCQIBUVFdLQ0CD33nuvZGRkBLDq4FdXVyeJiYly1113yZIlS5TjzNo3urq6ZMyYMTJ//nypra2V48ePy1dffSU//PCDMqa0tFRMJpPs2LFDDh48KI8++qjY7Xa5ePFiACsPPmvXrpWYmBjZtWuXtLW1SVlZmURERMi6deuUMcz6xuzevVtWrlwp27dvFwBSXl7udX4guc6cOVOmTJkiBw4ckP3798vtt98u8+bN80l9bHB8ZNq0aZKfn69839fXJ/Hx8VJSUhLAqtTn9OnTAkD27dsnIiLd3d0SEhIiZWVlypijR48KAKmpqQlUmUHN7XbL+PHjZc+ePZKZmak0OMzad15++WWZMWPGfzzv8XjEarXKm2++qRzr7u4Wo9EoH3/8sT9KVI1Zs2bJggULvI498cQTkpOTIyLM2ld+3+AMJNcjR44IAKmvr1fGfPHFF6LRaOTkyZM3XRNvUfnA5cuX0djYiOzsbOWYVqtFdnY2ampqAliZ+pw/fx4AEB0dDQBobGzEr7/+6pV9UlISbDYbs79B+fn5mDVrllemALP2pZ07dyI1NRVPPvkk4uLikJKSgg8++EA539bWBqfT6ZW1yWRCWloasx6kjIwMVFRU4NixYwCAgwcPorq6Gg8++CAAZj1UBpJrTU0NzGYzUlNTlTHZ2dnQarWora296Rpuyc02fe3s2bPo6+uDxWLxOm6xWPD9998HqCr18Xg8KCwsxPTp0zFp0iQAgNPphMFggNls9hprsVjgdDoDUGVw27ZtG7799lvU19f/4Ryz9p3jx4/j3XffxbJly/DKK6+gvr4eL774IgwGA3Jzc5U8r/aawqwHp7i4GC6XC0lJSdDpdOjr68PatWuRk5MDAMx6iAwkV6fTibi4OK/zer0e0dHRPsmeDQ4Fjfz8fBw+fBjV1dWBLkWVTpw4gSVLlmDPnj0IDQ0NdDmq5vF4kJqaitdffx0AkJKSgsOHD+O9995Dbm5ugKtTl08++QRbtmzB1q1bceedd6K5uRmFhYWIj49n1irHW1Q+MGLECOh0uj/MJuns7ITVag1QVepSUFCAXbt2oaqqCqNHj1aOW61WXL58Gd3d3V7jmf3gNTY24vTp07j77ruh1+uh1+uxb98+rF+/Hnq9HhaLhVn7yMiRI3HHHXd4HZs4cSLa29sBQMmTryk3r6ioCMXFxZg7dy4mT56Mp59+GkuXLkVJSQkAZj1UBpKr1WrF6dOnvc739vaiq6vLJ9mzwfEBg8GAqVOnoqKiQjnm8XhQUVGB9PT0AFYW/EQEBQUFKC8vR2VlJex2u9f5qVOnIiQkxCt7h8OB9vZ2Zj9IWVlZaGlpQXNzs/KVmpqKnJwc5dfM2jemT5/+h+UOjh07hjFjxgAA7HY7rFarV9Yulwu1tbXMepAuXLgArdb7rU6n08Hj8QBg1kNlILmmp6eju7sbjY2NypjKykp4PB6kpaXdfBE3/ZgyiUj/NHGj0SibNm2SI0eOyMKFC8VsNovT6Qx0aUHt+eefF5PJJHv37pWOjg7l68KFC8qYRYsWic1mk8rKSmloaJD09HRJT08PYNXq8e+zqESYta/U1dWJXq+XtWvXSmtrq2zZskXCw8Plo48+UsaUlpaK2WyWzz77TA4dOiSzZ8/m1OUbkJubK6NGjVKmiW/fvl1GjBghy5cvV8Yw6xvjdrulqalJmpqaBIC89dZb0tTUJD/++KOIDCzXmTNnSkpKitTW1kp1dbWMHz+e08SHo7fffltsNpsYDAaZNm2aHDhwINAlBT0AV/3auHGjMubixYuyePFiue222yQ8PFwef/xx6ejoCFzRKvL7BodZ+87nn38ukyZNEqPRKElJSfL+++97nfd4PLJq1SqxWCxiNBolKytLHA5HgKoNXi6XS5YsWSI2m01CQ0Nl7NixsnLlSvnll1+UMcz6xlRVVV319Tk3N1dEBpbruXPnZN68eRIRESFRUVHy7LPPitvt9kl9GpF/W86RiIiISAX4DA4RERGpDhscIiIiUh02OERERKQ6bHCIiIhIddjgEBERkeqwwSEiIiLVYYNDREREqsMGh4iIiFSHDQ4RERGpDhscIiIiUh02OERERKQ6bHCIiIhIdf4JH+mfIg+mbicAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_func_der('sin(x)',-10,10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## plot_taylor plots a function and its Taylor approximation given a number of terms.\n", + "We use sympy to calculate the Taylor approximation, numpy calculate the values of the function and the approximation in a range and matplotlib to visualize the results." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_taylor(func_name, nu_terms, star_value, end_value):\n", + " expr = sympify(func_name)\n", + " x = symbols('x')\n", + " #tay_func = taylor(expr,0,nu_terms)\n", + " tay_func = series(expr,x,0,nu_terms).removeO()\n", + " print(tay_func)\n", + " tay_func = lambdify(x, tay_func, \"numpy\")\n", + " func = lambdify(x, expr, \"numpy\")\n", + " x_values = np.linspace(star_value, end_value, 100)\n", + " plt.plot(x_values, tay_func(x_values),'r*', markersize=10)\n", + " plt.plot(x_values, func(x_values),color='blue')\n", + " plt.legend([\"Taylor\", \"original\"], loc =\"lower right\")\n", + " plt.ylim([-1,1])\n", + " plt.title('Taylor series approximation')\n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-x**6/720 + x**4/24 - x**2/2 + 1\n" + ] + }, + { + "data": { + "image/png": "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HTvqxARjjH355ZcMAHvnnXd025KSkhgA9t///le3rbq6miUkJLCgoCBWU1NjdMzG96GmpoYFBQWxnj17ssrKSt32LVu2MADspZde0m07evQoc3FxYZMnT2ZXr15lHTt2ZP369WO1tbVG12NK4ABgr732mm7b1atXmbu7O1OpVGzDhg267ZmZmQwAmz9/vsX5dvDgwSbnNrTBUOBs3ryZAWCvvvqqUboHHniAqVQqdubMGd02AMzFxcVo299//80AsGXLljU5F0FYAnVREYSFuLu76z6XlpaiqKgISUlJOHfuHEpLSwEAarUa48ePx3fffYdr167p0n/22WcYOHAgoqKimj3+jz/+iP79+2PQoEG6bV5eXpg6dSqys7Nx4sQJo/QTJkwwsqk5fH19UVFR0WJ3z6ZNm3DbbbfBz88PRUVFutewYcNQX1+PXbt2GaW///77ERgY2OJ5i4uL8dtvv2HMmDG4du2a7phXrlxBcnIyTp8+reuy8fX1xfHjx3H69OkbXo8hrq6uuniX+vp6XLlyBV5eXujatSvS09ObpE9JSUG7du103x944AF06NABP/74o1E6JycnPPbYY7rvLi4ueOyxx3Dp0iWkpaUZpW18H/766y9cunQJjz/+uFHszMiRI9GtWzejLseePXvilVdewUcffYTk5GQUFRVh3bp1cHIyL0xy8uTJus++vr7o2rUrPD09MWbMGN32rl27wtfXF+fOndNtszTfzOHHH3+ERqPBU089ZbR91qxZYIzhp59+Mto+bNgwxMTE6L736tUL3t7eRnYSRGsggUMQFrJ7924MGzYMnp6e8PX1RWBgIF544QUA0AkcgFeilZWV+OabbwAAJ0+eRFpaGh555JEWj5+Tk2MyRkcYuZWTk2O0vSWxZMjjjz+OLl26YMSIEejUqRMeffTRJrEOp0+fxtatWxEYGGj0GjZsGADg0qVLFp/7zJkzYIxh3rx5TY47f/58o+MuWLAAJSUl6NKlC+Lj4zF79mwcOXLkhufQarVYunQpYmNj4erqioCAAAQGBuLIkSNG90QgNjbW6LtKpULnzp2RnZ1ttD00NBSenp5G27p06QIATdI2zgvhPpm6l926dWtyH2fPno3evXvjwIEDmD9/PuLi4pq/YAPc3NyaiEwfHx906tQJKpWqyfarV6/qvluab+aQk5OD0NBQIwEJNP/8hoeHNzmGn5+fkZ0E0RpoFBVBWMDZs2cxdOhQdOvWDUuWLEFYWBhcXFzw448/YunSpUaBuHFxcejbty8+/fRTpKSk4NNPP4WLi4tRq9oamOO9AYCgoCAcPnwYP//8M3766Sf89NNPWLNmDVJSUrBu3ToAvML7v//7Pzz33HMmjyFU7pacW8iTZ599FsnJySbTdO7cGQAwePBgnD17Ft9++y1++eUXfPTRR1i6dClWrlxp5KVozGuvvYZ58+bh0UcfxcKFC+Hv7w+1Wo0ZM2bYbAizufehOc6dO6fzXB09etTs/TQajUXbmUGgrxzyzRw7CaI1kMAhCAv4/vvvUV1dje+++86o5fn777+bTJ+SkoKZM2fi4sWL+PzzzzFy5Ej4+fm1eI6IiAicPHmyyfbMzEzd763FxcUF99xzD+655x5otVo8/vjj+OCDDzBv3jx07twZMTExKC8v13lsrEF0dDQAPpzYnOP6+/sjNTUVqampKC8vx+DBg/Hyyy+3KHC++uor3H777fj444+NtpeUlCAgIKBJ+sZdYIwxnDlzBr169TLanp+fj4qKCiMvzqlTpwDghrP3Cvfp5MmTuOOOO4x+O3nypNF91Gq1mDhxIry9vTFjxgy89tpreOCBB/DPf/6zxXO0FXPzrbEnqCUiIiLw66+/4tq1a0ZeHGs8vwRhCdRFRRAWILQ2DVuXpaWlWLNmjcn048aNg0qlwtNPP41z586ZNZ/OXXfdhQMHDmDv3r26bRUVFfjwww8RGRlpdtdFY65cuWL0Xa1W6yr06upqAMCYMWOwd+9e/Pzzz032LykpQV1dncXnDQoKwpAhQ/DBBx/g4sWLTX6/fPlyszZ6eXmhc+fOOvuaQ6PRNGnxb9q0yWg4tiHr1683io366quvcPHiRYwYMcIoXV1dHT744APd95qaGnzwwQcIDAxE3759W7SpX79+CAoKwsqVK43s/+mnn5CRkYGRI0fqti1ZsgR79uzBhx9+iIULF2LgwIGYNm0aioqKWjxHWzE33wSBV1JScsNj3nXXXaivr8fy5cuNti9duhQqlapJHhOEWJAHhyAs4M4779R5QR577DGUl5dj1apVCAoKMll5BwYGYvjw4di0aRN8fX2NKrXmmDNnDr744guMGDECTz31FPz9/bFu3TpkZWXhf//7X6snj5s8eTKKi4txxx13oFOnTsjJycGyZcuQkJCgi4+YPXs2vvvuO9x9992YOHEi+vbti4qKChw9ehRfffUVsrOzTXpEbsSKFSswaNAgxMfHY8qUKYiOjkZhYSH27t2LCxcu6OZdiYuLw5AhQ9C3b1/4+/vjr7/+wldffYXp06e3ePy7774bCxYsQGpqKgYOHIijR4/is88+03mPGuPv749BgwYhNTUVhYWFePvtt9G5c2dMmTLFKF1oaCjefPNNZGdno0uXLti4cSMOHz6MDz/88IYT3Dk7O+PNN99EamoqkpKSMG7cOBQWFuKdd95BZGQknnnmGQBARkYG5s2bh4kTJ+Kee+4BAKxduxYJCQl4/PHH8eWXX5qVx63B3HyLiYmBr68vVq5ciXbt2sHT0xOJiYkmY7Duuece3H777fj3v/+N7Oxs9O7dG7/88gu+/fZbzJgxwyigmCBERboBXAQhf0wNE//uu+9Yr169mJubG4uMjGRvvvkmW716NQPAsrKymhxDGII8depUk+doPEycMcbOnj3LHnjgAebr68vc3NxY//792ZYtW4zSCMOTN23aZNa1fPXVV+zOO+9kQUFBzMXFhYWHh7PHHnuMXbx40SjdtWvX2Ny5c1nnzp2Zi4sLCwgIYAMHDmSLFy/WDY0Whiy/9dZbTc5jajizcE0pKSksJCSEOTs7s44dO7K7776bffXVV7o0r776Kuvfvz/z9fVl7u7urFu3buw///mP7rzNUVVVxWbNmsU6dOjA3N3d2a233sr27t3LkpKSWFJSUpM8++KLL9jcuXNZUFAQc3d3ZyNHjmQ5OTlGx0xKSmI9evRgf/31FxswYABzc3NjERERRvMdGR6zufuwceNG1qdPH+bq6sr8/f3Z+PHj2YULFxhjjNXV1bGbb76ZderUiZWUlBjt98477zAAbOPGjc3m64QJE5inp2eTcwq2NyYiIsJoGL65+cYYY99++y2Li4tjTk5ORnY0HibOGH+GnnnmGRYaGsqcnZ1ZbGwse+utt5hWqzVKB4A98cQTJu1s/J8gCEtRMUaRXAQhJt9++y1GjRqFXbt24bbbbpPaHIdmx44duP3227Fp0yY88MADLaYdMmQIioqKcOzYMRtZRxCENaEYHIIQmVWrViE6OtpoXhuCIAhCXCgGhyBEYsOGDThy5Ah++OEHvPPOOxaNRCEIgiDaBgkcghCJcePGwcvLC5MmTcLjjz8utTkEQRAOhahdVLt27cI999yD0NBQqFQqbN68+Yb77NixAzfddJNuFePGKxIDfERGZGQk3NzckJiYiAMHDljfeIJoI4wxXLt2DR999JHZU+4T4jJkyBAwxm4YfwPwsojibwjCfhFV4FRUVKB3795YsWKFWemzsrIwcuRI3H777Th8+DBmzJiByZMnG83JsXHjRsycORPz589Heno6evfujeTk5CZTyBMEQRAE4bjYbBSVSqXCN998g1GjRjWb5vnnn8cPP/xg1GoaO3YsSkpKdGvmJCYm4uabb9ZNIqXVahEWFoYnn3wSc+bMEfUaCIIgCIKwD2TlN9+7d2+TqdyTk5MxY8YMAHwW0bS0NMydO1f3u1qtxrBhw4xmfW1MdXW10UyiWq0WxcXFaN++PQV+EgRBEISdIHT9h4aG3nDSU1kJnIKCAgQHBxttCw4ORllZGSorK3H16lXU19ebTCOsc2KK119/Ha+88oooNhMEQRAEYVvOnz+PTp06tZhGVgJHLObOnYuZM2fqvpeWliI8PBznz5+Ht7e3hJYRjVm6FHj5ZaBdO2D6dOD0aSAjAzh1CqitBcaNA1aulNpKQnI2bgSefBKoqcE15oGbcRAX0RGJ2ItQ5AMArsMDP2MEnFCDvRiALjjD93V1BZYtAx58UMILIKTm/feBOXMAlQqIjga6d+evzZt5ufPPfwLNLDFHSEhZWRnCwsKMFnJtDlkJnJCQEBQWFhptKywshLe3N9zd3aHRaKDRaEymCQkJafa4rq6ucHV1bbLd29ubBI6MOHYMeO01/vmdd4DUVP1vBw4AiYnAhg3Ac88BCQmSmEjIhd9+A6qrgfBwLMh9EhfRHdE4i98xCu6oAgAwAPfge/yAu/E8VuJXDIMqPBzIzQV+/x1otO4U4TiUlACLFvHPK1cCU6fqfxszBrjlFuDrr4GxY4HRoyUxkbgB5oSXyGom4wEDBmD79u1G27Zt24YBAwYAAFxcXNC3b1+jNFqtFtu3b9elIeyT2lpgwgSgpga4+25g4kTj3/v354UNY8Czz/J3wkEpKgK++goAcPS8L97GDADAckzXiRsAUAF4F0/BDZX4DUOxAWOBCxf4j5s28eMQDslrrwHFxUBcHPDoo8a/9esHvPAC/zxtGtCoPU3YE2IudHXt2jV26NAhdujQIQaALVmyhB06dEi3qN2cOXPYI488okt/7tw55uHhwWbPns0yMjLYihUrmEajYVu3btWl2bBhA3N1dWVr165lJ06cYFOnTmW+vr6soKDAbLtKS0sZAFZaWmq9iyXaxMsvMwYw5ufHWH6+6TTnzjHm4sLT/fijbe0jZMTixYyp1aweKnYr/mAAY//EV/zBMPFaiH8zgLEQ5LMSePPtajVj//2v1FdCSEBWlr4c+eEH02mqqxlLSOBp7ruPsUZrhBISYkn9LarAEVbZbfwSVomdMGFCkxVrf//9d5aQkMBcXFxYdHR0kxWJGWNs2bJlLDw8nLm4uLD+/fuzffv2WWQXCRx5kZbGmJMTL0y++KLltM8+y9PFxTFWW2sb+wgJuXCBPyCGr+hoxlQqtgYTGMCYJ66xXHUEr7V8fIwFjo8Pq3L2YrE4yQDGnsLbfLtKxY/T+NgNq3wTymXcOP4IDB3asnD5+2/GnJ152vXrbWcf0TKW1N8OuZp4WVkZfHx8UFpaSjE4EsMY0LcvcOgQ8MADwJdf8qC/5rh6FYiJ4e8ffkhhFIpn8GDgjz+Mt6lUKGa+6IqTKEIgFmE2ZmNxi4fZhmG4E9ugRj3+Qj/0weHmz7dzp3VsJ2THwYO8u1ulAtLSgD59Wk7/2mvAv/8N+PgAWVmAn59t7CSax5L6W1YxOITj8fffXNy4uwPvvdeyuAF4AfPSS/zzSy8B5eXi20hIyOTJgJub8YPBGObjFRQhEHE4jhl423gftRp4+GFAo9Ft+j/8igexAVpoMB3Lm55HpeLnmTRJnOsgJEeI3wOARx65sbgB+ICG7t2B0lI+uoqwL0jgEJLSECuKESOAwEDz9nn8ce7FKSgAFrfccCfsnZQU3tSOjeXCBUAtnPAJHgEALMUzcEYdT6tWA126AEePAp98Ahw5wr837PdfzIITarEHt+IUYvXnEPZLS+PnIxTJ998Du3ZxHfvqq+bt4+QEPPQQ/yyUVYT9QAKHkAzG9IXG/febv5+Li76A+ugjGlGleOLigPR03XjdnUhCKXwRiEsYCoNRl2PGcHdgXJzJ/ToiH0OwAwDwLe4z3i89Xb8foUhWreLvTz4JhIWZv59QNm3bxoeXE/YDCRxCMk6cAE6e5ILl7rst23fUKMDDA8jL491chMLx9ASSkgCVSidO7sV30EDLf1ep+O8eHs3uBwCjsBmAgcBpbj9CUVRWAsLsIg8/bNm+3btz7VtbC2zZYn3bCPEggUNIhuC9SU4GLI31dnMDhGXLfvjBunYRMiUtDUytwWaMAqAXKwB4vE1aWrP7CfE49+I7AMAeDEQhglrej1AMv//ORU5YGBAfb/n+DzzA36mbyr4ggUNIxv/+x98t6Z4yRPD6UKvKQdi3D+n1vXABYfBABYY+2YMrXY0GqKsDmltwd98+/ruTE8LcitA36DwY1PhedV/L+xGKQSgj7r77xgMZTCGUUVu3AteuWc8uQlxI4BCScPIkjwV1cgLuvbd1x7jrLv6+fz9w6ZL1bCNkSFUVkJmp61oaPqwe7u++yb0vMTE8TWYmT2diPwA8XVoaRj3JAzC+9Rjb/H6EYmDMWOC0hvh4HudeXQ38+KP1bCPEhQQOIQmC92bo0NbPLdGxI3DTTbwA++kn69lGyJDKSqBnT2z24wuU3fdIQ5+mEEg8cSKvhRoLlYb9kJqqCyS+ryH8Zlvd7Sgf/5jp/QjFcPQocP48n4ri9ttbdwyVSu/FoW4q+4EEDiEJgsAR+rZbC3VTOQh+fjj3VTqOXg2DRgOMHGnwm6cnX/Y5LQ3w9W2yH9LTgdWrdYHEPXvy1aOrq1X45Z8rTe9HKAahbBg2jIuc1iKUVT/+CFy/3na7CPEhgUPYnHPneJ2j0fDRUG1BqOh+/pkv1EkolD178O3QdwHwyYbbtzeRRt1McdZou0qlf+42r7oEDBwI7NljPVsJWdHW7imBm24CIiO5uNm6tc1mETaABA5hcwTvTVISEBDQtmP16wcEBfHAv8Yz+hMKYtkyfJubAAC6Lqa2IBxjy28eqNv/F7DcxOzGhN1z+TKPMQcaef1aAXVT2R8kcAibY63uKYA3zoWCi7qpFEpREYo2/Y4/cBsA4L7bitt8yIEDgYD2Wlyt8eLH3bQJKCpq83EJefHTTzxGr08fHrPXVoQya8sWCtuyB0jgEDYlN5ePelKpgH/8wzrHFFzP339PsxorknXrsEV7F7TQoDcOI3LH2jYf0skJuDvqBADweXW0WmD9+jYfl5AX1uqeEujfnwula9f4zMaEvHGS2gDCsRAWrBs0CAgJsc4x/+//AGdn4OxZ4NQpoGtX6xyXkIC8PKCw0Hjbe+/hW8YXHRuFb4EV64EhQ4zTBAe33EQ3cdxR5z/AWnyAb3Ef3tY+A9WKFZYfl5AtNTU8Ng+wnsBRq3k31bvvck/0PfdY57iEOJDAIWzKzp38va394Ya0a8frpW3beIuNBI4dM25ck2Cq6/DAz0gGAIzCNzxKvW9f4/0GD9Y/XGYe9//gAXcsRQ4i8Td6IeHc35Yfl5Atf/4JlJXxGL1+/ax33JEjucDZtct6xyTEgbqoCJvBmH7S2IEDrXtsGi6uECZP5rMTG0w3+zuGoBIeiEA2eqPRwmMqFU8/aZLFx/XAddyJXwAAW9CoiW/ucQnZIpQFI0c2P8CuNSQm8scjK6ups5GQFyRwCJtx/jxw8SKPf2jcUG4rgkfojz9oxV+7JiWFz0sTG6urlfaAq+Gh2A6jWfbVaqBLF54+JcXi4wLAMPxqdA6Lj0vIFmvH3wj4+OgXnhdGaBHyhAQOYTME703v3tZfvDkmBujWDaiv168aTNgpwuzEo0cDAPYjEQCQiP3G6caM0c1O3JrjGh7zAPpDF59u6XEJ2ZGVBZw+zWPz/u//rH/8AQP4Oy1jJm9I4BA2Q2jt3HKLOMcfPJi/HzggzvEJG+LpCSQlQQs1DuJmAEB/GNxYlYpPpGSpUm44rtBV1QtH4IJqXEEAziKm9cclZMX+Bi3cpw+P0bM2QhlGHhx5QwKHsBlCa0do/Vib/v35OwkchZCWhkxND5TBBx6oQE8c0/+m0fAupFYeFxoNAMAVNeiDQwAaPEVtOS4hG4QyQCgTrI1Qhh08yBekJ+QJCRzCJlRXA4d4PSKawLmZN/SRlsanNSHsnH37sL+eB2v1VR2C0zNP8cBfjYbXKq3tH9i3j+/v5AS4uSExga/xsV91S9uOS8iGgwf5u1AmWJtu3XgszvXrfDFPQp6QwCFsQno6n5ciMBCIihLnHHFxfDG9a9eAkyfFOQdhI6qqgMxMffzNxG7AkiVcvcbE8DSZmZZPJ9twXAD8OGlpSJzN+zb3uw5u/XEJ2VBXx8sbQDyBo1bz0VQA6WE5QwKHsAmG3VMqVctpW4vh6CzqprJzKiuBnj2x338EACDxroZFy4RA4YkTgfh4y4VIw3GRmqoLJBYqqsPaXqh+ZHLrjkvIhhMnuGelXTtx58SiQGP5QxP9ETZBCMYTq3tK4Oab+QRfBw8CEyaIey5CRPz8cP3PdBz15W0wQYQA4IHCa9bwfkhLJzjx8+PCxmC/6Gi+6GtRkQp/T1+F/v1acVxCNgjdU/36iXsbhbKMAo3lC/2LCZsgtHLEGkElIAQVCoUcYb+kH1ajvh7o0AHo1MlEgtbWXo32U6n0z83+/W04LiELBO+tWN1TAsIzc+YMX7WckB/0TyZE58IF/lKrxS90hOMfPsxjfgj7RRjqK8wcKyaCh2j//pbTEfJHaNyINYJKwM8P6N6df6bnRp6QwCFER3Dh9urFexfEJDoa8Pfn4ubIEXHPRYiLocARGxI4yqCyUj+qSezGFKD3SFMcjjwhgUOIjtjz3xiiUukLNuqmsm9sKXAMuxuuXBH/fIQ4HD7MR1EFBQFhYeKfjwKN5Q0JHEJ0bBVgLCAIHBpJZb8UFAC5uVywWnMl6Obw8+PLTwH03Ngzht1TYndrAvoy7cABvkwMIS9I4BCiUlOjnxhW7ABjAfLg2D+C96ZHD3Gm2jcFdVPZP2JP8NeY7t3581lRARw7duP0hG0hgUOIyuHDfBbjgACgc2fbnFMo3E6c4JP+EXbGnj3Y//haAOIHihqiG0n181Wuxvfssd3JCatgqxFUAhqNXhjTcHH5QQKHEBXD4eG2cBkD+mHFjOlnNCXsiGXLsD+fB1DYIv5GQDjXgXQnsP37geXLbXdyos2UlACnTvHPthI4AMXhyBkSOISo2Gr+m8bQfDh2SlER6jd9rVtBPLHLVZudundvwNWVobimHc6gM7BpE1BUZLPzE23jr7/4e1QU9xjbChpJJV9I4BCiYusAYwGKw7FT1q1DprYLrsEbHqhAj4NrbXZqFxegT8hFAA0ri2u1wPr1Njs/0TZsHX8jIHj+Tp2iEXhyg5ZqIETj0iUgJ8d46LatoJFUdkBeHlBYaLztvfdwgCUBAPrhLzitXA4MTTJOExwMdOwoyvkTr/6NfUjFAfTHw+xzYMUKYMgQcc5PWBVbTfDXmPbt+Qi8U6e4DcOH2/b8RPPYxIOzYsUKREZGws3NDYmJiTjQQq0zZMgQqFSqJq+RI0fq0kycOLHJ78PpqZIdwoRbnTvbbiSMgDC0ODubplGXLePG8dVRDV9ZWdgPXkMlYj9w7lzTNA89JNr5E8u2AWjw4DAm7vkJq2LrAGNDEhL4O42kkheiC5yNGzdi5syZmD9/PtLT09G7d28kJyfj0qVLJtN//fXXuHjxou517NgxaDQajB492ijd8OHDjdJ98cUXYl8KYSHCn71nT9uf28dHv5Kw0DdPyIzJkwE3N+Poc8a4uECDwDFEpeLpJ00S7fyJ4H2qh9AH1XAR9/yE1cjP5w45tRq46Sbbn18o40jgyAvRBc6SJUswZcoUpKamIi4uDitXroSHhwdWr15tMr2/vz9CQkJ0r23btsHDw6OJwHF1dTVK5+fnJ/alEBYipcABqJtK9qSk8EmSYmN1C1zWwgnH0QMA0Bdp+rRqNe8HSEvj+4l0/ihkwRdXUQsXZKKbuOcnrIbQPRUXB3h52f78JHDkiagCp6amBmlpaRg2bJj+hGo1hg0bhr1mhpx//PHHGDt2LDwbLWK0Y8cOBAUFoWvXrpg2bRqutBDdVV1djbKyMqMXIT5SCxwaSWUHxMXxsfwNDZgz6IxauMAT5QhHrj7dmDE8XVycqOdXAeiB4wCgE1qinp+wClIFGAsIZdyJEzSjsZwQVeAUFRWhvr4ewcHBRtuDg4NRUFBww/0PHDiAY8eOYfLkyUbbhw8fjvXr12P79u148803sXPnTowYMQL1zTxZr7/+Onx8fHSvMFssUuLgMCa9wBEKu7S0ltMREuPpCSQlASqVTlT0wHGowfjvKhX/3cND9PMDQE/wB1cncMQ+P9FmhPmubLGshymiowF3d77YZ1aWNDYQTZH1MPGPP/4Y8fHx6N8oLH7s2LG49957ER8fj1GjRmHLli04ePAgduzYYfI4c+fORWlpqe51/vx5G1jv2OTkAOXlfOhtbKw0NvRoqJ8KCoDiYmlsIMwkLQ3QaHAMXA0LXhQAfLpYsVVqw/kNzy3YYpPzE23ieMPj0quXNOfXaPTOPWFwBSE9ogqcgIAAaDQaFDYaillYWIiQkJAW962oqMCGDRswyYyAvujoaAQEBODMmTMmf3d1dYW3t7fRixAXwXvTrRvg7CyNDe3aAeHh/POJE9LYQJjJvn1AXR2OqxoEzuD2PKBXo+HLQ4s9i1rD+eHkhB7OpwGA22Kr8xOt5to1vjArIG0PIsXhyA9RBY6Liwv69u2L7du367ZptVps374dA24w89umTZtQXV2Nhx9++IbnuXDhAq5cuYIOHTq02WbCOkjdPSUgeHFI4MiYqiogMxMAcNw5AQDQ84X7uNckJoanyczk6UQ+P2Ji0OPXdwAA5xCN61E9xD8/0SYyMvh7SAjg7y+dHSRw5IfoXVQzZ87EqlWrsG7dOmRkZGDatGmoqKhAamoqACAlJQVz585tst/HH3+MUaNGoX379kbby8vLMXv2bOzbtw/Z2dnYvn077rvvPnTu3BnJycliXw5hJnIROEKL7vjxltMRElJZCfTsieqUKThVzwVNjx7QBwBPnAjEx4snMBrOj9RUID0dQbd1RUAAwJgKmWv3iX9+ok0I/22p479J4MgP0WcyfvDBB3H58mW89NJLKCgoQEJCArZu3aoLPM7NzYVabayzTp48iT///BO//PJLk+NpNBocOXIE69atQ0lJCUJDQ3HnnXdi4cKFcHV1FftyCDORm8AhD46M8fMD0tNx6rga9esBb2+DiYI9PYE1a/iyCWqR2mMN5xeOrwIXWDt3AsfOuuMmsc9PtAnhvy0XgXPqFFBdDVB1JD02Waph+vTpmD59usnfTAUGd+3aFYwxk+nd3d3x888/W9M8wsrU1endxlILHKGLijw4Mket1t2jnj1NrDwvtrhodHxB4OieGxI3skUQOD16tJxObDp25BOMlpZykRMfL609hMxHURH2yenTQE0Nb3xHREhrS/fu/P3iReCq7RamJlqBICakrqgMbSBhLH/k0kWlUukbdDSSSh6QwCGsjtA91aOH9A1fb29AmPaIuqnkjeFzIzVCRUUCR96Ul/MpKQB5PTcUhyMPSOAQVkf4c8vFRUtxOPaBHD042dm8EiXkidAVHhTEV/WWGqHMI4EjD0jgEFZHLgHGAtTdIH8qK4GzZ/lnOTw37dsDwgTsJIzli1zibwTIgyMvSOAQVkduAoc8OPInM5MPVPL31wsLqSFhLH/kEn8jIDwzWVnk+ZMDJHAIq1JZCQgTSstF4NBkf/LHsHuqyQgqiaA4HPkjNw9OQACfcBCg8kYOkMAhrEpGBm+JG7r4pUYYSZWXB5SUSGoK0QyGQ8TlglBpUneDfJHLHDiG0Egq+UACh7Aqht1TcmmJ+/gAnTrxz0JQIiEv5BRgLEBdVPKmokK/crecnhuKw5EPJHAIqyK3+BsBWrJB3shpiLiAYMuFC3zyNkJeCMuHBQbyriG5QAJHPpDAIayK3IaIC1AcjnyRa0vc11e/ZAQ9N/JDjl4/gIaKywkSOIRVIQ8OYSmGc5kEBkprS2MoDke+yDH+BtDbU1AAFBVJa4ujQwKHsBqlpcD58/yz3FpVNFRcvhz75jQAoEcn+fUD6eJwtuUDt9wC7NkjrUGEDrkNERfw8gKiovhnalBJCwkcwmoIf+ZOnbh7X04IhSDFU8iP41/zYIoe1/ZJbElTdEPFd10B9u8Hli+X1iBCh9yGiBtCcTjygAQOYTWEYZFy654CuOAKDeWfaSSVjCgqwvGTTgCAnme/lZ1PX+fBKWxYB2DTJtnZ6Ihcv66P25KbBwegoeJygQQOYTXkGn8jQMN+Zci6dTjOeA3Vgx0D1q+X2CBjhMrzIkJRDD8+yZPMbHREMjMBxvjoqaAgqa1pCnlw5IGT1AYQyuHkSf4uTKwnN+LigG3bKA5HMvLygMJCo01ly9cjF7MANAicFXnAkCHG+wUH64cz2djGdgDCnYKRW9cRx9EDt7HdwIoV0tpIyDbAWECwSygTCWkggUNYjVOn+HuXLtLa0RzkwZGYceOAP/4w2nQCtwAAOiAffrgKnLsK9O1rvN/gwcDOnZLZ2BNbkAtB4PwJnDsnrY2EbIeIC3TuzN+LioCrVwE/P2ntcVSoi4qwClVVQG4u/xwbK60tzUEjqSRm8mTAzc1oiuvj4DelJ0z48lUqnn7SJFtZaNLGHuC16XGYqE2lsJGQvQfHywvo0IF/Pn1aWlscGRI4hFU4e5b3iXt7y7NPHNAXhufPA2Vl0trikKSkAGlpXAGredFzEl0BAN2QaZxWreauwLQ0vp+ENgq2CbZKbiMhew8OoPdkC55twvaQwCGsgtBKiY2VzxpUjfHz07eqaCSVRMTFAenpwOjRAIDT4O6+WDRq5o4Zw9NJ0URvZKNgm2CrDiltdGAqK3kvISDvrBc82eTBkQ4SOIRVkHv8jQDF4cgAT08gKQlQqUwLHJWK/+7hIZGBMLJRsC0X4aiGi3xsdFBOnuTe4vbt5estBsiDIwdI4BBWwdCDI2e6dePvVOhITFoatGonnEUMgEYCR6Ph3T5Sk5YGaDQIRiG8cA1aaHAO0fw3udjogAgjk7p2la+3GCAPjhwggUNYBeFPLHcPjjC64cwZae1wePbtw4X6EFTBHU6oRcTT/+DBuhoNUFcH7N0rtYXAvn1AXR1UTk6IVfEH5rRzD3nZ6IAI/125N6aEsvD0ae5xImwPCRzCKggeEbkXOtSqkgFVVUBmpq57KjpSC6e3F3OPSAz36CAzk6eT2EYAQEwMYpO55+b0jOXysdFBsRdvcXQ09zCVlQGXLkltjWNCAodoM+XlwMWL/LPcCx1DDw61qiSishLo2ROnB0wAAMT2cOXbheDeiROB+HhpxUODjUhNBdLTEdvXBwBwuixEPjY6KIIHR/gvyxU3NyA8nH+mBpU00ER/RJsR/rwBAfKf0CoykvcwXL8OFBToR1URNsTPD0hPx+nZamBvI1Hs6QmsWcOXRFBL2P5qsFGwwcjzJxcbHRR78eAAvJsqJ4d7uAcNktoax4P+nUSbsZf4GwBwcQEiIvhnalVJiFrdciyFHISDgQ0muzblYKODYdjdI/QUyhnqEpcW+ocSbcZe4m8EKNBYHthTS1yw8fx53ntFSIPwnw0MBHx8pLXFHGiouLSQwCHajD15cABqVcmB+no++zVgHwInIEBfoQp2E7bHXkZQCVBZIy0kcIg2Qx4cwlLOnwdqaniXYViY1NbcGJWKKis5IOS93AOMBQyfGa1WWlscERI4RJuxp64GgCoqOSDkfUwMD/q2B+i5kR578+BERgJOTnywXV6e1NY4HiRwiDZRXAxcucI/20urioaKS4+9tcQBfaVKnj/psLfnxtkZiIrin0kY2x4SOESbEP60oaGAl5e0tphLVBQfAFNRwYeKE7bH3rx+AHlw5IC9eXAACjSWEhI4RJuwtwBjwHioOLXGpYEEDmEpZWVAYSH/bC8eHICeGykhgUO0CXsLMBagQkda7Fng5OXxiSIJ2yKMXrOXIeIC5MGRDpsInBUrViAyMhJubm5ITEzEgQMHmk27du1aqFQqo5ebm5tRGsYYXnrpJXTo0AHu7u4YNmwYTlNNJQn26MEBaCSVlNTVAefO8c/2JHD8/fkLoOdGCuwt/kaAGlPSIbrA2bhxI2bOnIn58+cjPT0dvXv3RnJyMi61sPqYt7c3Ll68qHvl5OQY/b5o0SK8++67WLlyJfbv3w9PT08kJyejitaFsTnkwSEsJSeHixw3N6BTJ6mtsQx6bqTDHuNvAL29Z8/y556wHaILnCVLlmDKlClITU1FXFwcVq5cCQ8PD6xevbrZfVQqFUJCQnSv4OBg3W+MMbz99tt48cUXcd9996FXr15Yv3498vPzsXnzZrEvhzCAMfLgEJZjOETc3lY7IIEjHfbqwQkLA1xdubhp1FYnREbU4qWmpgZpaWkYNmyY/oRqNYYNG4a9e/c2u195eTkiIiIQFhaG++67D8ePH9f9lpWVhYKCAqNj+vj4IDExsdljVldXo6yszOhFtJ3CQuDaNV5JRUdLbY1lGA75paHitsVeW+IACRwpsdfnRq3WizKKw7EtogqcoqIi1NfXG3lgACA4OBgFzYzP7dq1K1avXo1vv/0Wn376KbRaLQYOHIgLFy4AgG4/S475+uuvw8fHR/cKs4epU+0AoZCPiOAtFHtCGCpeXq4fmUHYBnsMMBYggSMd9urBAfQebnpubIvsHMQDBgxASkoKEhISkJSUhK+//hqBgYH44IMPWn3MuXPnorS0VPc6f/68FS12XOy5oqKh4tJhz88NCRxpuHbNPoeIC9BzIw2iCpyAgABoNBoUNmoiFxYWIiQkxKxjODs7o0+fPjjTUAsJ+1lyTFdXV3h7exu9iLZjrwHGAkJBSYWObbFngSM8MwUFvNIlbIPQCAkIAHx9JTWlVdBQcWkQVeC4uLigb9++2L59u26bVqvF9u3bMWDAALOOUV9fj6NHj6JDhw4AgKioKISEhBgds6ysDPv37zf7mIR1sNcAYwEKNLY9tbv2IusMH0pijwLH15dXsgBwZmAKsGePpPY4CsJ/1B69NwB5cKRC9C6qmTNnYtWqVVi3bh0yMjIwbdo0VFRUIDU1FQCQkpKCuXPn6tIvWLAAv/zyC86dO4f09HQ8/PDDyMnJweTJkwHwEVYzZszAq6++iu+++w5Hjx5FSkoKQkNDMWrUKLEvhzDA3j04VOjYnuxFX6IeTvDQVCE0VGprWofuuTlWBSxfLq0xDoK9BhgLCHbn5ADV1dLa4kg4iX2CBx98EJcvX8ZLL72EgoICJCQkYOvWrbog4dzcXKgNxopevXoVU6ZMQUFBAfz8/NC3b1/s2bMHcXFxujTPPfccKioqMHXqVJSUlGDQoEHYunVrkwkBCfHQavWFDnlwCLMoKsLpn3hmd64/BdWVUL07xI6IDavC3r1uOI1YYNMi4N137fI67Al7DjAGgJAQvlZfeTmf5LJ7d6ktcgxsEmQ8ffp05OTkoLq6Gvv370diYqLutx07dmDt2rW670uXLtWlLSgowA8//IA+ffoYHU+lUmHBggUoKChAVVUVfv31V3Sx11rWTrlwAaiqApyc9MG69oahB4eGituAdetwmsUAAGJxGli/XmKDWkds2V8AwAWOVmu312FP2LsHR6XS205xOLZDdA8OoUyEdWGiorjIsUcMh4pfugQ0mnmAaAt5eU3H37/3Hk6zmQCAzjgDrPgQGDLEOE1wMNCxo21sNAcT1xGb/iWAQVzgMAasWCH/67Bz7N2DA3CBc+iQvuwkxMdOqyZCaoS1hGJipLWjLbi6AuHhQHY2L0BJ4FiRceOAP/4w3qZS4TR4DRWLU/wh6tvXOM3gwcDOnTYy0gxMXEcsbgIAvcCxh+uwY8rL+ag1wL4FjjAZqlB2EuIju3lwCPsgK4u/R0VJa0dboTgckZg8mS82pVLptzHGRQEauqgMUal4+kmTbGikGZi4jljwPobLCEIpGk05IdfrsGOE/2b79oCfn7S2tAWhrBTKTkJ8SOAQrUJohdjbEg2NoZFUIpGSAqSl8QxuGERQCyfkgAdsGQkctZpHqqel8f3khInraIdyBIO7FM7AwKUg5+uwY+w9/kaAPDi2hwQO0SqUInDIgyMicXFAejowejQAIBfh0EIDd1xHCAyWVRkzhqczGCkpKxpdBwBEg/8BsmDgwpT7ddgpSoi/AfRlZVYWj00nxIcEDtEqlNJFZbjoJiECnp5AUhKgUuEceAkfhSzoOnxUKv67h4dkJpqFwXUAeoEjXJPdXIcdohQPTlgYd/JVV+tjighxIYFDWIww6ghQjgeHhoqLSFoaoNHovB1RMAhC0Gj47/ZAw3UA+mvQeXDs6TrsDKV4cJyd+aAGgLqpbAUJHMJiBO+Nvz/g4yOtLW1F8EBduwZcuSKtLYpl3z6grg7nVLyGikrw4YG4Gg1QVwfs3SuxgWbScB1wckKU0wUAwDl1Z/u7DjtDCSM2BSgOx7aQwCEsRindUwCvZ4UlA2h0gwhUVQGZmQCALK+eAIDolNu4t0OosTIzeTo5Y3AdiIlB9Cq+vExW2GD7ug47o7oayM/nn5VQ3tBIKttCAoewGKUEGAsIhQ61qkSgshLo2RNITUVWl2QADfktBO5OnAjEx8tfGBhcB9LTEXV7JAAg56Ir6g/a0XXYGTk5vOvYwwMIDJTamrZDHhzbQhP9ERYj/DmV0KICeKGzeze1qkTBz48LGbUa5xqWa9IJY09PYM0aPqRELfO2lsF1AECnTnwG75oaIL/UE2H2ch12hmFjynBKJXuFBI5toX8jYTGCEFCaB4cEjkio1Sgr08c4NRHG9iIKDOzUaPRrsOmeG3u5DjtCSd3hAJU1tob+kYTFKLWLigod8RDytn17oF07aW2xFtS1KT5KEzhCmZmXR72ZtoAEDmERjCmv0CGBIz5K8/oBxhO3EeKgtLImIADw8uKfs7MlNcUhIIFDWERhIY+3VKv1czrYO0LhmZMD1NdLa4tSUVrcFkDC2BYoTeCoVCSMbQkJHMIihIoqLAxwcZHWFmvRsSOfhKu2lruOCeujZA8OdVGJh9IEDkBdm7aEBA5hEUpsiZsMGCWsipIrKnpmxKG0FCgu5p+V9NyQMLYdJHAIi1BiSxygykpslCiMhWvJz+fdtoR1Ef6LAQHKCUwHqIvKlpDAISxCaSOoBEjgiIdhYLqSnhvDEWE5OdLaokSU6PUDqIvKlpDAISxCiS1xgASOmBQU8CGxSgpMB3jAKD034qFUgWPYRUUL/IoLCRzCIpTYEgeoVSUmwjMTFsaDuZUExVOIh1IFTmQkf792TR9jRIgDCRzCbKqrgQt8EWXFChxqiVsfpXr9AHpuxESpAsfdHejQgX8mYSwuJHAIs1HawneGCIItP59mGLU2Sq2oAPL8iYlSvcUAef5sBQkcwmwMCxwlLHxnSPv2+hlGKWDUuig1MB2gETFiocQZ0w2h58Y2kMAhzEbJFRUFjIqHkisqQw8OBYxaD2HGdJVKWYHpAuT5sw0kcAizUXIsBUACRyyULHCEgNGyMuDqVUlNURTCM9Opk3JmTDeEuqhsAwkcwmyU3CcOUKtKDGpqgPPn+WclPjceHkBICP9Mwth6KFkUA9RFZStI4BBmo+QuKoA8OGKQm8u7btzdgeBgqa0RBxLG1sdRBE5ODlBXJ60tSoYEDmE2Su+iolaV9TF8ZpQWmC5Az431Ubq3uEMHwNUVqK/XezgJ60MChzCLq1f54neAcgUOeXCsj9Jb4gA9N2Kg9MaUWq2P36LnRjxI4BBmIRQ4ISE87kCJCAXO1atASYmUligHpVdUAHVRiYEjCGMKNBYfEjiEWThCReXlpZ/AkFpVVmDPHmR99CsA5XY1AAZdVBmVwC23AHv2SGuQnVNXp++2UXJ5Q8JYfEjgEGah9D5xAepusCLLliGr2AeAY1RU2XnOqN9/EFi+XFqD7Jzz53lsiqurfkkDJUKxW+JDAocwC6WPoBKgQsdKFBUBX32Fc+AZGu2n3EliOnUCnJwYarVOyEcosGkTv36iVQj/vchIHquiVKiLSnwU/PgQ1sQRuqgA8uBYjXXrUFrvhWK0BwBE7f5UYoPEQ6MBInxKAABZiAK0WmD9emmNsmMcIf4GoC4qW2ATgbNixQpERkbCzc0NiYmJOHDgQLNpV61ahdtuuw1+fn7w8/PDsGHDmqSfOHEiVCqV0Wv48OFiX4ZDk53N3x2l0CGBYwF5eUB6uvHrvfeQxSIBAO1RhHYfv900TV6epGa3GhPXG3X9OABwjxVjwIoVyrleG+MoAkcY1FBUBFRUSGqKYnES+wQbN27EzJkzsXLlSiQmJuLtt99GcnIyTp48iaCgoCbpd+zYgXHjxmHgwIFwc3PDm2++iTvvvBPHjx9Hx44ddemGDx+ONWvW6L67urqKfSkOi1bLJ2wD9H9KpUICpxWMGwf88YfxNpUKWbgPABCNc7yZ2revcZrBg4GdO21kpBUxcb3R+ADAIO7BYUxZ12tjHMVb7OvLXyUlfMK/uDiJDVIgontwlixZgilTpiA1NRVxcXFYuXIlPDw8sHr1apPpP/vsMzz++ONISEhAt27d8NFHH0Gr1WL79u1G6VxdXRESEqJ7+fn5iX0pDkthIVBdzfvDDTSmIjEUOLR4oplMngy4uRnP5MeYLv4mCo3UokrF00+aZEMjrYiJ640Cr5WFazbC3q/XxjiKBwcAIiL4u+AhJ6yLqAKnpqYGaWlpGDZsmP6EajWGDRuGvXv3mnWM69evo7a2Fv7+/kbbd+zYgaCgIHTt2hXTpk3DlStXmj1GdXU1ysrKjF6E+Qh/vk6dAGdnSU0RnfBwLuSqqoCCAqmtsRNSUoC0NCA21igqNBuRABoJHLUa6NKFp09JsbGhVsLE9QrXmIVGtbISrtfGOJLAETziJHDEQVSBU1RUhPr6egQ3WoQmODgYBWbWHs8//zxCQ0ONRNLw4cOxfv16bN++HW+++SZ27tyJESNGoL6+3uQxXn/9dfj4+OheYWFhrb8oB0T48ym9ewrgAk54PKibygLi4nicyejRuk2CwIlEtj7dmDE8nb374xtdr3CNOYgwTqeU67UR169zjzGg/BGbAAkcsZH1KKo33ngDGzZswDfffAM3Nzfd9rFjx+Lee+9FfHw8Ro0ahS1btuDgwYPYsWOHyePMnTsXpaWlutd5WvzDInJy+LsjCByA4nBajacnkJSk67ppInBUKv67UqbCNrhe4Rrz0BE1aHBzKu16bYBQ0fv4AI4QdSCUqUIZS1gXUQVOQEAANBoNCgVJ3kBhYSFCQkJa3Hfx4sV444038Msvv6BXr14tpo2OjkZAQADOnDlj8ndXV1d4e3sbvQjzcSQPDkDDN9tEWhqg0YBB783QCRyNhv+uJBquNwiX4IZKMKhxAZ34b0q8XpFxpO4pgDw4YiOqwHFxcUHfvn2NAoSFgOEBAwY0u9+iRYuwcOFCbN26Ff369bvheS5cuIArV66gg5KnvZQQ4c8XEdFiMsUgFK7UqmoF+/YBdXW4qgnENfCGRLjrJV7Z19UBZsbe2Q0N16tyckKEig81zHbuotzrFRlHa0xRkLG4iN5FNXPmTKxatQrr1q1DRkYGpk2bhoqKCqSmpgIAUlJSMHfuXF36N998E/PmzcPq1asRGRmJgoICFBQUoLy8HABQXl6O2bNnY9++fcjOzsb27dtx3333oXPnzkhOThb7chwSKnQIs6iqAjIzAQDZnQYBAIKCAI/0P4GYGJ4mM5OnUwIG14uYGEQO5EMMs19arczrtQGOVtYI13npEo8/IqyL6ALnwQcfxOLFi/HSSy8hISEBhw8fxtatW3WBx7m5ubh48aIu/fvvv4+amho88MAD6NChg+61ePFiAIBGo8GRI0dw7733okuXLpg0aRL69u2LP/74g+bCEQHGHC8Gh9zGraSyEujZE0hNRc4bXwBoyEshIHfiRCA+XjkVvsH1Ij0dkT29AAA5taHKvF4b4GgCx9cXECImyGNsfUSf6A8Apk+fjunTp5v8rXFgcPYNahV3d3f8/PPPVrKMuBGXLvHyWa3mw8QdAaFwzc3lkxwqeT0cq+Lnxyt2tRrZS/kmXbempyewZo2yMtTgeoFGnj8lXq8NcLTGlErFr/XIEX7t3btLbZGyoH8e0SKC3uzYEXBxkdQUmxEaykMoamsBA+ciYQ4NlXmzLXGlVfYG12PS86e06xUZR4v3A8hjLCb07yNaxBELHCcn/Vw45DZuHY7WEgdoyG9buX4duHyZf3ak54Zi/sSDBA7RIo7WJy5AhU7bcERhLFzrhQt8ABVhGYIw9PbmsSmOAnlwxIMEDtEijtgSB6g13lYcURiHhPBu3Pp6LnIIy6CyRlIzFAkJHKJFHLGiAsiD0xZKSoDSUv7ZkTw4arX+eqmyshxH9PoB5MERExI4RIs4qsChQqf1CJV7QADg5SWtLbaGnpvW4+hlTUEBn3mAsB4kcIhmYYxaVdQStxxHfWYA8vy1BUftovLz0zcEcnOltUVpkMAhmuXyZd6iUKn0o4ocBcOuBsaktcXecNSKCiBh3BYcVRgLc+EAJIytDQkcolmEQjo0FHC0SaI7deIxFVVVfLJDwnwctasBoIqqLZAwJmFsbUjgEM3iyBWViwsXdgBVVpbiqC1xgLqoWktVlX5STUd8bkgYiwMJHKJZHLmiAqjQaS3UEgfOn+fDxQnzEGJPPD2B9u2ltUUKSBiLAwkcolkc2YMD0JDf1uLIz02HDoCzM5/oLz9famvsB+E/FhHBY1IcDWpMiQMJHKJZHLklDlCh0xquXQOKi/lnR/T8aTT6gHx6bszHkUUxQDE4YkECh2gWKnT4OxU65iPklZ8fn3LfEaHnxnKoMcXf8/OB6mpJTVEUJHAIkxjOgeOohQ71i1uOoz8zAHn+WoOjx/u1b8/jjwCaC8eakMAhTHLlClBRwT872hw4AoYtcZoLxzwcvaICSBi3Bkf34KhU9NyIAQkcwiTCn6xDB8DNTVJTJEMQdhUVXPARN8bRKyqAuqhaAwlj8vyJAQkcwiRUUXFh16ED/0yFjnlQFxVVVJZSUwPk5fHP9NyQMLYmJHAIk1BFxaFCxzKoJa6/9txcQKuV1hZ74MIF3gXs5gYEBUltjXSQMLY+JHAIk5DA4VC/uGWQ5w/o2JEPF6+p4StEEy1jKIodcQ4cARI41ocEDmESaolzyINjPhUVfIFWwLEFjpMTzYVjCSSKOdSYsj4kcAiTUKHDoULHfIRnxtsb8PWV1BTJoefGfKgxxTGcC6emRlJTFAMJHKIJNAeOHvLgmE/OTycAAJFBFRJbIj265+b594A9eyS1Re5QY4oTGAi4u/Py9/x5qa1RBiRwiCZcvcqn3AeA8HBpbZEaw5Y4zYXTMtlf7AUARFZmSGyJ9OjiKS5ogOXLJbVF7pAHh6NSURyOtSGBQzRB+HMFB/MWhSMjFLplZUBJiaSmyJuiImSn80WoIvL3AUVFEhskLRH+vIWQjUhg0yaHz4+WIG+xHuratC4kcIgmUItKj4eHfugqdVO1wLp1yGHc3ReJLGD9eokNkpbIjJ8AADmI4GPFHTw/mqOujg8TB0jgAOTBsTZOUhtAyA/qEzcmIgK4dIkXOgkJUlsjA/LygMJC423vvYdsfAYAiGTZwIrNwJAhxmmCg/kYaqVhIj8if1gBYAxyEAGmZVCtWOE4+WEBeXlAfT3g4gKEhEhtjfQIjUpqTFkHEjhEE0jgGBMZCRw8SIWOjnHjgD/+MN6mUvHuGAARyAbOnQP69jVOM3gwsHOnTUy0KSbyoxOcoUY9quCOQgQhxJHywwKE/1R4OKCm/gQa1GBl6JEimkBdVMZQv3gjJk/m084azMpWyVxRCN4Ej0S2cXqViqefNMmGRtoQE/nhjFp0BF9/IAeN/khKzw8LoLLGGCprrAsJHKIJQuuBCh0OtaoakZICpKUBsbG6ZncuePyNJ8rhj2J9WrUa6NKFp09JkcJa8TGRH4Be6AmeLQCOkR8WQN5iY4QyNy+PxycRbYMEDtEEKnSMocA/E8TFAenpwOjRAPReikhkw2i2/TFjeLq4ONvbaEsa5QcARID/kYw8OI6SH2ZCI6iMCQnh8Uj19foFSInWQwKHMKKsjM+DA5AHR4Dcxs3g6QkkJTWKvzFwc6lU/HcPD2nsszUG+QHo80LnwXG0/DAD6qIyRq3Wzz1GHuO2QwKHMEL4U/n7A15e0toiF4TC9+pVLgAJA9LSAI1G56UwEjgaDf/dkWjID8CEB8cR8+MGkLe4KdSgsh4kcAgjKP6mKe3accEHUKuqCfv2AXV1yFFFAQAiB4XxAFqNhgcR7N0rsYE2piE/4OSESOd8AECOKtJx86MFtFogN5d/pvJGDw0Vtx4kcAgjqEVlGip0TFBVBWRmAgCy3boCACKm38O9FDExPE1mJk/nCBjkB2JiELH5HQBAtlt3sGgHzI8bcPEiUFvLtV9oqNTWyAca1GA9SOAQRlCfuGmo0DFBZSXQsyeQmooc/z4AGp4bIeB24kQgPt5xKnSD/EB6OsLv6AwAqKhUo/hXB8yPGyD8l8LCACeakU0HdVFZD5sInBUrViAyMhJubm5ITEzEgQMHWky/adMmdOvWDW5uboiPj8ePP/5o9DtjDC+99BI6dOgAd3d3DBs2DKdPnxbzEhwG6qIyDRU6JvDzA9LTUbNyNfIv8qJE5/nz9ATWrOHeHF9fqSy0LQ35gdWrAQ8PuLnpZ+fNKXLA/LgB1JgyDXmLrYfoAmfjxo2YOXMm5s+fj/T0dPTu3RvJycm4dOmSyfR79uzBuHHjMGnSJBw6dAijRo3CqFGjcOzYMV2aRYsW4d1338XKlSuxf/9+eHp6Ijk5GVXUMmoz1EVlGip0mkGtxoULPJ7C1VW/bpfh7w5Fo+ttIowdLT9agBpTphHK3txc/r8iWo/o/7YlS5ZgypQpSE1NRVxcHFauXAkPDw+sXr3aZPp33nkHw4cPx+zZs9G9e3csXLgQN910E5YvXw6Ae2/efvttvPjii7jvvvvQq1cvrF+/Hvn5+di8ebPJY1ZXV6OsrMzoRZiGWlWmoS6q5qHp9puHhHHzUGPKNB078rikmhqgoEBqa+wbUYujmpoapKWlYdiwYfoTqtUYNmwY9jYzmmDv3r1G6QEgOTlZlz4rKwsFBQVGaXx8fJCYmNjsMV9//XX4+PjoXmFhYW29NEVSWckXlQRI4DSGuqiahyqq5iFh3DzUmDKNk5N+DVZ6btqGqAKnqKgI9fX1CA4ONtoeHByMgmakaUFBQYvphXdLjjl37lyUlpbqXufPn2/V9SgdYcimlxcPJyD0CBXVpUtcCBJ6qKJqHhLGzUPCuHnI82cdHMKh7OrqCm9vb6MX0RTDAsdg3UACPC60XTv+mQodYyiWonmoojINY/TctAR5/qyDqAInICAAGo0GhYWFRtsLCwsRIgwvaERISEiL6YV3S45JmAe1xJtHpaLKqjmoJd48VFGZ5vJl7glVqfgwccIY8vxZB1EFjouLC/r27Yvt27frtmm1Wmzfvh0DBgwwuc+AAQOM0gPAtm3bdOmjoqIQEhJilKasrAz79+9v9piEeVCLqmWosjINCePmoWU+TCP8h0JD+eKShDHUmLIOok+vNHPmTEyYMAH9+vVD//798fbbb6OiogKpqakAgJSUFHTs2BGvv/46AODpp59GUlIS/vvf/2LkyJHYsGED/vrrL3z44YcAAJVKhRkzZuDVV19FbGwsoqKiMG/ePISGhmLUqFFiX46ioZZ4y1Crqin19YAQ0kYCpyleXnyZj+Ji/v+Kj5faInlAorhlqDFlHUQXOA8++CAuX76Ml156CQUFBUhISMDWrVt1QcK5ublQG4wtHThwID7//HO8+OKLeOGFFxAbG4vNmzejZ8+eujTPPfccKioqMHXqVJSUlGDQoEHYunUr3NzcxL4cRUOFTstQq6opFy/qll6i6fabITKSBE5jyFvcMoaNKcYoJrK12GSC7OnTp2P69Okmf9uxY0eTbaNHj8bo0aObPZ5KpcKCBQuwYMECa5lIgAqdG0GtqqYIorhTJ5puvzkiIvgEx+T500Pe4pYR4pKuXweuXAECAqS1x15xiFFUxI2prQXy+eLHJHCagbqomkKi+MaQ568p5C1uGaNlPui5aTUkcAgA0E237+YGNJpiiGhAKIzz8/ksowS1xM2BPH9NIWF8Y+i5aTskcAgA+hZVeDj19zZHUBAXgIxxQUhQS9wcyPNnjOEcOCSMm4eem7ZDAocAQC0qczCcC4cKHQ49NzeGuqiMKSnRD5kPD5fUFFlDz03bIYFDAKAWlblQoWMMPTc3hpb5MEZ4ZgIDAQ8PaW2RM9RF1XZI4BAAqKvBXKjQ0UPT7ZuH4TIfwnpvjgyJYvMgb3HbIYFDAKCKylyo0NFz6RJQVUXT7d8I6to0hhpT5kHe4rZDAocAQK0qc6FCRw9Nt28+5PnTQ40p8xDyp6QEKC2V1BS7hQQOgfp6veucCp2WoYpKD1VU5kPCWA81pszDywto355/puemdZDAIWi6fQsQKqrz57kwdGSoq8F8qItKDz035kPCuG2QwCF0f55OnQCNRlpb5E6HDlwI1tXpZ352VMiDYz5UUemh58Z86LlpGyRwCHIZW4BGo5+7w9Fb4/TcmA91bXLKy/naSgAJHHOg56ZtkMAhyGVsIdSq4tBzYz5CHuXlOfYyH8J/xtcX8PGR1BS7gLo22wYJHIJcxhZCrSqA7d6DnBMVAOi5MQejZT76/xPYs0dqkySBvH6WQY2ptkECh6BCx0KoVQWULFmNa1pPACRwzMFwLpycv68Cy5dLa5BEkNfPMqgx1TZI4BBU6FiIw7eqioqQ/e3fAIBAXILH9SKJDbIPIjrwvqlsRAKbNgFFjpdv5C22DCGfLl0Crl+X1hZ7hASOg0Mr+1qOw7eq1q1DjpZPXRyBHGD9eokNsg8iKjMBADmIALRah8w3Kmssw9cX8Pbmn2mZD8txktoAQloKC/l0+2o1HyZO3BhDD45Wy/NOseTl8YfEkPfeQw67BwAQiWxgxQpgyBDjNMHBQMeONjFRlpjIt8hTvwHoxQUOYw6Zb+QttgyViovBI0eArCygWzepLbIvSOA4OEKB07EjTbdvLp06cVFTXc1dxyEhUlskIuPGAX/8YbxNpUI2eA0VgRzg3Dmgb1/jNIMHAzt32shIGWIi3yIwHkBDFxVjDplv1EVlOYLAceSYv9ai5LYnYQbCn4Zcxubj7KxvZCu+m2ryZD78R6XSb2OMeyHQIHAMUal4+kmTbGikDDGRb5HIAtAgcBrjAPlWVQUUFPDPVN6Yj5BXJHAshwSOg0MCp3U4zEiqlBQgLQ2IjTXqixMq6aiGShsA/71LF54+JcXGhsoME/kWiWwAwAV0Qh0Mpgx3kHwTYkg8PQF/f2ltsSdI4LQeEjgOjvCniYqS1Ay7w6FGUsXFAenpwOjRuk2CwBEqbQDAmDE8XVycbe2TK43yrQMuwhk1qIMz8mGw6JuD5Jth95ShQ5BoGaFsJoFjOSRwHBzy4LQOhxtJ5ekJJCUBKhVK4Y2r4E1wncBRqfjvHh7S2ShHDPJNDabr0stCQ63lQPlGI6haB3lwWg8JHAeHBE7rEPIrK6vFZMoiLQ3QaHTemwBchhf4bMbQaPjvRFMa8g3Qd+np4nAcKN9oBFXrEMoamgvHckjgODA0B07rcchW1b59QF0dstUxAIDI4EoeGKvR8OXV9+6V2ECZ0pBvcHJCpOY8ACDbqbPD5ZvQGKDucMswXLfLYTzGVoIEjgNDc+C0HkOBw5iUltiIqiogk09Ulx3AhzZH3hbOvQ8xXPAgM5OnI/QY5BtiYhA5nc8flDXySYfLN/IWtx6HbFBZARI4DozQourUiQ99JswnPJyHT1RWctex4qmsBHr2BFJTkfXAcwAaCl0hkHbiRCA+3iEqaoswyDekpyOyfxAAILvE1+HyjTw4rcchu8StAE3058BQi6r1uLjwuXAuXOD5GBwstUUi4+fHK2S1Gtmj+CZdReXpCaxZ4wDTOrcCg3wDGo2IcaB8q6oCLl7kn6m8sRzy4LQOZf+riBYhgdM2HG74ZkMl3Oxzo/BKutUY5IuQZxcu8PCbxr8rFWEOHC8voH17aW2xR0jgtA7l/7OIZiGB0zYc1W1Mz03rCQ4GXF2B+nrg/HmprbEdwn8kMpLmwGkNJHBaBwkcB4YqqrbhiIXO1atAaSn/TM+N5ajVDjQLtgFU1rQNRyxrrAEJHAeGZjFuG0K+OZIHR3hmgoIcYm46UXC4rk1QgHFbEQTO5ctARYWkptgVJHAcFK2W5sBpK47YqqKWeNtxxK5Nem7ahq8vfwE0F44lkMBxUAoLgepqPtcYzYHTOgxb4lqtpKbYDKqo2o4jCmPy4LQdR3xu2goJHAdF+JN06gQ40WQBraJTJy4Qa2qAggKprbENVFG1HUesqEgYtx1HfG7aiqgCp7i4GOPHj4e3tzd8fX0xadIklJeXt5j+ySefRNeuXeHu7o7w8HA89dRTKBWiGhtQqVRNXhs2bBDzUhSH4agGonU4OQFhYfyzo3Q3UEXVdhwtBqeiQj8ZJgnj1uOIXZttRVSBM378eBw/fhzbtm3Dli1bsGvXLkydOrXZ9Pn5+cjPz8fixYtx7NgxrF27Flu3bsWkSZOapF2zZg0uXryoe40aNUrEK1EeVFFZB0drVdFz03YM58KpqZHUFJsgxIz4+OjjSAjLcbSyxhqI1jmRkZGBrVu34uDBg+jXrx8AYNmyZbjrrruwePFihIaGNtmnZ8+e+N///qf7HhMTg//85z94+OGHUVdXByeDvhRfX1+EhISIZb7ioYrKOjhSocMYjbyzBkFBfI3Sqio+F46wJJVSobLGOjhSWWMtRPPg7N27F76+vjpxAwDDhg2DWq3G/v37zT5OaWkpvL29jcQNADzxxBMICAhA//79sXr1arAWVjysrq5GWVmZ0cvRoULHOjjSUPHiYuDaNf45PFxaW+wZlcqxKiuK27IOjvTMWAvRBE5BQQGCgoKMtjk5OcHf3x8FZkZkFhUVYeHChU26tRYsWIAvv/wS27Ztw/3334/HH38cy5Yta/Y4r7/+Onx8fHSvMCFwwoEhgWMdHKnQEa4xJARwd5fUFLvHkeJwqKyxDsIEkUVFQAuhrIQBFgucOXPmmAzyNXxlZma22bCysjKMHDkScXFxePnll41+mzdvHm699Vb06dMHzz//PJ577jm89dZbzR5r7ty5KC0t1b3OO9Ic6SagOXCshyN5cKiish6OFDBKHhzrQHPhWI7FMTizZs3CxIkTW0wTHR2NkJAQXBJC5xuoq6tDcXHxDWNnrl27huHDh6Ndu3b45ptv4Ozs3GL6xMRELFy4ENXV1XB1dW3yu6urq8ntjkpBAQ9upDlw2o5QUeXm8vWFNBpJzREVir+xHo7o+SNh3HaiooBDh3ie9ughtTXyx2KBExgYiMDAwBumGzBgAEpKSpCWloa+ffsCAH777TdotVokJiY2u19ZWRmSk5Ph6uqK7777Dm5ubjc81+HDh+Hn50cixkyEAicsjObAaSuhoYCzM1BbC+TlKTs2haYWsB6OJHDIg2M9IiP1Aoe4MaLF4HTv3h3Dhw/HlClTcODAAezevRvTp0/H2LFjdSOo8vLy0K1bNxw4cAAAFzd33nknKioq8PHHH6OsrAwFBQUoKChAfX09AOD777/HRx99hGPHjuHMmTN4//338dprr+HJJ58U61IUB7WorIdGoxc1Si906LmxHo7StVlWxoPTAX0MCdF6HEkYWwNR2++fffYZpk+fjqFDh0KtVuP+++/Hu+++q/u9trYWJ0+exPXr1wEA6enpuhFWnTt3NjpWVlYWIiMj4ezsjBUrVuCZZ54BYwydO3fGkiVLMGXKFDEvRVFQS9y6REYCZ8/yfB08WGprxIO6qKyH8N/Lz+dLpijV+Sw8M/7+gLe3pKYoAkeK3bIGogocf39/fP75583+HhkZaTS8e8iQIS0O9waA4cOHY/jw4Vaz0RGhlrh1cYQRMYZz4NBz03YCAvhq7Nev8/it2FipLRIHEsXWhTw4lkFrUTkgVFFZF0codIqK+JT7KpWy44xshaPMhUNljXVxhGfGmpDAcUCo0LEujhBPITwzoaHK7U6xNY7w3FCAsXUR4piuXNFPukk0DwkcB4PmwLE+jtCqIlFsfei5ISzFxwfw8+OfaS6cG0MCx8G4eJEPadZogI4dpbZGGQit0/Pned4qkewd2QCASM/L0hqiIHQC58OfgT17JLVFLMiDY30cQRhbCxI4DobwpwgPpzlwrEVwMO+20Wr5CtFKJOuX0wCAyLw/JbZEOei6qK54A8uXS2uMSJAHx/o4wqAGa0ECx8GgIeLWR61W+PDNoiJkn60DAERl/MQjjok2E+l7FQCQjUhg0ybF5evVq0BpKf9M5Y31UHRZY2VI4DgYJHDEQdFu43XrkM14dGMkywLWr5fYIGUQuZtPoVGADqisd1Fcvgr/haAgPiSesA6OEJxuLaiTwsE4e5a/x8RIa4fSUEyrKi8PKCw02sRWvIdsTAPQIHBWrACGDDHeLziYgrpawkS++q9dAi+koBztkMvC0FVh+UqNKXGIjubvQllONA8JHAfj3Dn+LvxJCOugmH7xceOAP/4w2nQJwaiEB9SoRxhygXO1QMP6cjoGDwZ27rShoXaGiXxVqVSIQhaOoheyEImu535WVL7SJH/iIJTd587xCThVKmntkTPUReVgCAKHPDjWRTEenMmTATc3o1IzG7x7KhT5cEGjYWIqFU8/aZItrbQ/TOQrGEMksgEAWWikAhSQr+TBEYfISP54lJcrLmzL6pDAcSAqK7mnHCAPjrVRjAcnJQVIS+NrB6h58XAWXA3HoJFPXK0GunTh6VNSbG2pfWEiXwEgGrzFcQ4Gf0iF5Ct5cMTBzU3fa0ndVC1DAseBEAocb2+gfXtJTVEcjRdPtGvi4oD0dGD0aAAtCJwxY3i6uDhbW2ifNMpXQJ+nQh4DUEy+0hBx8TDspiKahwSOAyGo/eho6re1NoGBfKQIY3zxRLvH0xNISgJUKl3lK3gbAPAHKCmJhsdYikG+Avo81QkcheQrYzTJn5gIIQYkcFqGBI4DQQHG4qFS6QtyxRQ6aWmARqPrPjHy4Gg0/HfCchryFdDn6TlEgwGKydfLl2lxVjGhkVTmQQLHgaAAY3FRXKGzbx9QV6fvohqXyAMANBqgrg7Yu1diA+2UhnyFkxOiXC9CBS3K0Q6X1SGKyVfhP9CpE39kCOtCHhzzIIHjQBh2URHWp3Nn/q4IgVNVBWRmohJuyAePaIxe9gz3Lgila2YmT0eYT0O+AgBiYuCavhedwhqCuTsO5tsVkK8035a4KK4xJRIkcBwI8uCIi5Cviih0KiuBnj1xbtQsAHwVY39/6ANlJ04E4uPtviK2OQ35itRUXSCxrrKav04x+UoCR1yEZyYvz+4fFVGhif4cBK2WYnDERlECx88PSE/HuR/UwGZ+bbrAdE9PYM0a/lCpqY1kEQ35aphvMTF8Lr9zeW6KyVcSOOISEAC0awdcu8ZHq3XrJrVF8sS+/0WE2RQUcKWv0VDQn1gY9oszJq0tVkGtbrmisvNKWDIa5VsTYayAfCWBIy4qFXVTmYP9/5MIsxD+BOHhgLOztLYolYgIXjddv84FpRKguC3xUZTnrwESOOJDgcY3hgSOg0DdU+Lj4qL3jimlsqKKSnyU1hIvL9evK0rPjXjQZH83hgSOg0ABxrZByN8zZ6S1w1rQcyM+Qt4WFHDvn70jCDV/f8DXV1JTFI3ShLEYkMBxEKirwTYoqbuhvl4/Gy09N+JhKASU0Bonr59toC6qG0MCx0GglrhtUJLAycsDamp4zFZYmNTWKBslPTckcGyDYReVIgY1iAAJHAeBPDi2QUkVlSCKIyN1KwsQIqGkeArh2RcmviTEITycD2qorFTOoAZrQwLHASgvBy5d4p9J4IiLkgQOtcRtBz03hKUYDmpQgjAWAxI4DoAQR0FBf+IjFOpXrgClpdLa0lbI62c7SOAQrYECjVuGBI4DQBWV7WjXDggM5J/tvdChisp2KEXg1NYCubn8Mz034kOBxi1DAscBoABj26KURTfpubEdQuMjO5uPXrNXcnK4/e7uQIcOUlujfMiD0zIkcBwA8uDYFqW0xsmDYzs6deKj1WprgQsXpLam9RiWNbq1ywjRUFJwuhiQwHEAqCVuW5QgcK5e5S8AiIqS1hZHQKPR57M9Pzckim0LdVG1DAkcB4CWabAtShA4gu0hIXzxcEJ8lPTckMCxDUKZXlAAVFRIa4scIYGjcGg2WtujhIqKvH62RwndDSRwbIufH38B+nKe0EMCR+Hk5fF+fWdn3s9PiI9QuJ8/D1RXS2tLa6G4LdujBGFMk/zZHiUIY7EggaNwhAKHZqO1HUFBvFuHMT4qxh6hlrjtsXeBwxg9N1JAI6maR1SBU1xcjPHjx8Pb2xu+vr6YNGkSysvLW9xnyJAhUKlURq9//etfRmlyc3MxcuRIeHh4ICgoCLNnz0ZdXZ2Yl2K3UFeD7VGp7H9VcaqobI+hwLHHtYUuXuTLBmg0QESE1NY4DhRo3DxOYh58/PjxuHjxIrZt24ba2lqkpqZi6tSp+Pzzz1vcb8qUKViwYIHuu4eHh+5zfX09Ro4ciZCQEOzZswcXL15ESkoKnJ2d8dprr4l2LfYKdTVIQ0wMcOSI/baqSBjbHmEUVWkpH8Hm7y+tPZYiPOvh4bxLnLAN5MFpHtE8OBkZGdi6dSs++ugjJCYmYtCgQVi2bBk2bNiA/Pz8Fvf18PBASEiI7uXt7a377ZdffsGJEyfw6aefIiEhASNGjMDChQuxYsUK1NTUiHU5dguNoJIGe+5uqK7m8UMAPTe2xMNDPzmePT435PWTBvLgNI9oAmfv3r3w9fVFv379dNuGDRsGtVqN/fv3t7jvZ599hoCAAPTs2RNz587F9evXjY4bHx+P4OBg3bbk5GSUlZXh+PHjJo9XXV2NsrIyo5ejQC1xabBngZP9dToYAzzd6xEUJLU1joXuuXnoRWDPHmmNsRASONIgNEKysgCtVlpb5IZoAqegoABBjUpHJycn+Pv7o6CFtd0feughfPrpp/j9998xd+5cfPLJJ3j44YeNjmsobgDovjd33Ndffx0+Pj66V1hYWGsvy+6gLippsGeBc3blNgBAjOsFmo3WxuiemzMMWL5cWmMshASONHTqBDg5ATU1fNQsocdigTNnzpwmQcCNX5mZma02aOrUqUhOTkZ8fDzGjx+P9evX45tvvsHZNtQUc+fORWlpqe51XvC/K5wrV4DiYv6ZCh3bIuS33bWqiopw7k/ehRxdeggoKpLYIMciOoTP1nYO0cCmTXaV/yRwpMHJSd+APXVKWlvkhsUCZ9asWcjIyGjxFR0djZCQEFy6dMlo37q6OhQXFyMkJMTs8yUmJgIAzjQMRwkJCUFhYaFRGuF7c8d1dXWFt7e30csREB72Tp1oNlpbEx7OC57qajtrVa1bh7NaHu0aw84C69dLbJBjEXN+BwDgLGK4Mraj/CeBIx1duvB3EjjGWDyKKjAwEIGBgTdMN2DAAJSUlCAtLQ19+/YFAPz222/QarU60WIOhw8fBgB0aIi+GzBgAP7zn//g0qVLui6wbdu2wdvbG3FxcRZejbI5eZK/d+0qrR2OiJMTn3vozBle8MuyVzQvD2jUWMB77+EslgIAYnAWWPEzMGSIcZrgYKBjR9vYqGRM5H/MjtUARnKBwxiwYoVd5H9pKfcYA9QdLgVduwJbtujLfIIj2jDx7t27Y/jw4ZgyZQpWrlyJ2tpaTJ8+HWPHjkVoaCgAIC8vD0OHDsX69evRv39/nD17Fp9//jnuuusutG/fHkeOHMEzzzyDwYMHo1evXgCAO++8E3FxcXjkkUewaNEiFBQU4MUXX8QTTzwBV1dXsS7HLiGBIy0xMXqB07iOkgXjxgF//GG8TaXCacQCADrjNI9Sb2ig6Bg8GNi500ZGKhgT+d8ZAQCACwjDdeYGDzvJf8F7ExwMtGsnrS2OiFDGk8AxRtSJ/j777DN069YNQ4cOxV133YVBgwbhww8/1P1eW1uLkydP6kZJubi44Ndff8Wdd96Jbt26YdasWbj//vvx/fff6/bRaDTYsmULNBoNBgwYgIcffhgpKSlG8+YQHOFhF9yXhG2RfaDx5MmAmxsMI4lrmYZ7DwB0RaPSUqXi6SdNsqWVysVE/gegCP7grhBBaOqQcf5T95S0kMAxjagT/fn7+7c4qV9kZCSYwZSdYWFh2GlGyyQiIgI//vijVWxUMkJ/LHlwpEH2AiclBejXD/jHP7irSatFFqJQCxe44zo64YI+rVoNxMYCX38NUFewdTCR/wAXlnsxEJnoht44wtPKPP9J4EiL0IjNzuZxf9SZwaG1qBRKfb1+mQASONIgLDh4+rS0drRIXByQng6MHg0AOAn+sHTFSahhsF7AmDE8nQwrV7umUf4DQDfwUajCvQAg+/wXnnESONIQHAx4e/OwLXtdHkYMSOAolJwcvZIPD5faGsfE0G0s66Hinp5AUhKgUhkJHB0qFf/dYMkUwooY5D+gz3udwLGD/Be6Rrp1k9YOR0Wlom4qU5DAUSjCQ965M60iLhXR0Xw01fXrdjBUPC0N0GiQCV5DGQkcjYb/TohHQ/4D+rwX7oU95L8w9RkJHOkggdMUEjgKheJvpMfZWd9N1Ya5L23Dvn1AXR1ONlSq3UZE84BWjQaoqwP27pXYQIXTkP9wckI3lywAwCl0AVPLP/+LivgQcZWKhwkR0kBz4TSFBI5CoSHi8kBo0cpa4FRV6Qw8qekOAOj66iPcayAEVWRm8nSE9THIf8TEIHr/F9BogHK0Q37EAL5dxvkvmB4RIeteNMVDHpymkMBRKDREXB7YhcCprAR69kTxQ9Nxub49gIbnRgiAnTgRiI+XbQVr9zTkP1JTgfR0uCTE6SbLy3z3F9nnP3VPyQMSOE0RdZg4IR3kwZEHdiFw/PyA9HSc3K8GPudLe3h5Nfzm6QmsWcOjpNXUHhKFhvw3zN9u3fjIpJO57hgq8/wngSMPhO7B4mLebRgQIK09ckCe/xiiTZSX64NaSeBIi10IHABQq1sWxTKtXBVDo/xt0hqXcf6TwJEHHh76JWEoDocj338N0WqEOSkCAgB/f2ltcXSEiio/Hygrk9aWGyFUVCSKpUe4B7IXxiCBIyeom8oYEjgKhOJv5IOvLyAsci/3QofmMpEPwj2Q+zNTVQVk8UFf9NzIABI4xpDAUSAUfyMv7KWbip4b+SDcg9xcPo+SXBFWmPD1BYKCpLaGEBq1JHA4JHAUCM2BIy/sQeDU1dHSHnIiIIDHHjMm76U+DLunDNYMJSRC+O9SDA6HBI4CoS4qeWEPAicrC6itBdzd9YGKhHSoVPbRTUXxN/JCEDhnzvD1CB0dEjgKgzHqapAb9iBwDEWxjAfsOBT2EE9BAkdehIfz9QdravjK4o4OFWUK4+JFPkxcraaVfeWCUPifPs27guQIjaCSH/YwkooEjrxQq/Xz4chZGNsKEjgKQ+h7jYriSp6QnrAw3vVTW6sfcSI3aASV/JB7FxVjJHDkCMXh6CGBozAo/kZ+qNXyb42TB0d+GHZRMSatLabIywMqKgAnJ+iWliCkxx66Nm0FCRyFQfE38kTucTj03MiPmBi+mHt5OZ8oUm4Iz3LnzoCzs7S2EHpI4OghgaMwqKKSJ3IWOMXFwOXL/DM9N/LBxUXvGZFjZUXdU/KE5sLRQwJHYQj9rtRFJS/kLHCEgrBjR4NFNglZIOeuTRI48sRweZjycmltkRoSOAqipkYfxEotcXkhVAIZGfKLpyCvn3yRc3cDCRx54ucHBAbyz44eaEwCR0GcPcsnd/L0BEJDpbaGMCQ2lk/edvUqUFQktTXG0Agq+SLnkVQkcOSLnIWxLSGBoyAMu6do2nR54eEBRETwz3LrbqARVPJFrl1U167xUVQAPTdyRAhRIA8OoRioq0HeyDUO5+Rhvppj1/oTEltCNEa36GaOFpW/75PWGAOEsiYkhC+0ScgLuQpjW0MCR0EcO8bfu3eX1g7CNHIUOHV1wJlcFwBAtx0rJbaGaExgIODnUg4GNU4v+kZqc3RQ95S8iYvj78ePS2uH1JDAURB//83fe/eW1g7CNHIUOFlpxajVOsEd1xH2w0r5BQg5OKorRehaw1sumb/kyub+kMCRN7168feMDKC6WlpbpIQEjkKoqeEPM0ACR67IUeBkfrATABCL01CzemD9eoktIoxYtw7dwB+YTNZFNveHBI68CQvjXYd1dfIqb2yNk9QGENYhM5OvdeTtrQ9mJeSFUBlkZQFVVYCbm40NyMsDCguNNh3ZfA4A0BPH+Pj1FSuAIUOM9wsO5pPkEOJi4v7gvffQA/8EABxh8cCK52Vxf0jgyBuVintxdu3inn1HbfSSwFEIR47w9169aASVXAkK4q2qkhK+snh8vI0NGDcO+OMPo01/YyMAIAGHucA5dw7o29d4v8GDgZ07bWSkA2Pi/kClQgIOAQD+Rm9Z3J+6Ov78AiRw5Ezv3lzgCHWDI0JdVApBiL8R+l4J+aFS6SuEE1IMWJo8mbuNDBTwYSQAaBA4jVGpePpJk2xjn6Nj4v6AMfQG/3OfQSyuwWCqaYnuz7lzvEvc3Z13hRDyRKgLhLrBESGBoxAEle6orkh7QSh0Dh+W4OQpKUBaGp91UK1GOTxxBp0BQFeJ6lCr+WQaaWl8P0J8Gt0fgUAUIRR80pmjaHD7SXh/hGc3Pt7ITEJmCHWBI3twqItKIZAHxz7o04e/HzokkQFxcUB6OjBpEo5uzAGDGh2QjyBcNk43Zgzw8cd8hkLCdhjcH2zcqNucgMPIR0ccRgIGYq+k90d4doVnWSnU19ejtrZWajOsRufOQFQUoNUC58/rl2+QO87OztBoNFY5FgkcBVBYyF8qFdCzp9TWEC1hKHAYkyheytMTSErC4Y1HAZjw3qhUQFISiRupaLg/+PJL3cJlvfE3fsRIHocj8f1RmsBhjKGgoAAlJSVSm2J1Vq3ig08uX7avhTd9fX0REhICVRsLSBI4CkBwQcbE0GrQckdw61+6BBQUAB06SGRIWhr+VvUHmIn4G42Gd30Q0pGWxu9DXR0A/T06jARJ7w9jeoGTkCCJCVZHEDdBQUHw8PBoc6UqJzQaoKyMe2/swYPDGMP169dx6dIlAECHNhaQJHAUAMXf2A8eHnwa9YwMXlFIJnD27cNhNhkAkOB8Apj+DPD++7y5V1cH7N0rkWEEAGDfPn4fnJwAJyckjO0DrOUxOPV1Wmgkuj8FBVycq9USjAIUgfr6ep24ad++vdTmWJ127bjAqa2VYFqKVuLu7g4AuHTpEoKCgtrUXSVqiFhxcTHGjx8Pb29v+Pr6YtKkSShvwU+WnZ0NlUpl8rVp0yZdOlO/b9iwQcxLkTUUf2NfSB6HU1WF+oxTuoDV3l/PB5Ys4V6BmBieJjOTT9ZD2J6qKv1EMzExQFoaYj6aCw93LSrhgdOIlez+CM9st27K6MEUYm48lHAxJmjQCqislNYOSxHuR1tjokQVOOPHj8fx48exbds2bNmyBbt27cLUqVObTR8WFoaLFy8avV555RV4eXlhxIgRRmnXrFljlG7UqFFiXoqsIQ+OfSG5wKmsxJnYEbgOT7i7M8SO4COpdAGuEyfy5jkJHGmorOTBdKmp/H7ExUGjAXr15sX14cFPS3Z/lBZ/I6CkbilDBIFTVcWDje0Fa90P0QRORkYGtm7dio8++giJiYkYNGgQli1bhg0bNiA/P9/kPhqNBiEhIUavb775BmPGjIFXo+ASIQhJeLnZi//NytTU6OdUIQ+OfSBUDpIMFQcAPz8cns8XboyPV8HIA+zpCaxZw705tEy0NPj5cWGzerWRm0RowPw9cJpk90dp8TdWZc8e4JZb+LtMcHHhcTiMOWZ7RTSBs3fvXvj6+qJfv366bcOGDYNarcb+/fvNOkZaWhoOHz6MSSYmsnriiScQEBCA/v37Y/Xq1WANow1MUV1djbKyMqOXUjh5kvevtmsHREZKbQ1hDkLlcPYsUFoqjQ1/H1Ub2dIEmuBEWkzkv3CvDh82/bstEES50jw4VmHZMmD/fmD5cqkt0aFSWd5NNXHiRMX0iIj2LykoKEBQUJDRNicnJ/j7+6OgoMCsY3z88cfo3r07Bg4caLR9wYIF+PLLL7Ft2zbcf//9ePzxx7Fs2bJmj/P666/Dx8dH9wpT0PSbhvE3CvWyKo727fUzwEo1y6hQUVG3pv2g8+BI9MyUlnJRDpAHpwlFRcBXX/HPmzaJuup7c3Gqwuvll182Si84Aa9fF80k2WKxwJkzZ84NMzjTCsuXVlZW4vPPPzfpvZk3bx5uvfVW9OnTB88//zyee+45vPXWW80ea+7cuSgtLdW9zp8/32b75ALF39gnUndTCZUkVVT2Q3w8b8RcvMhHMtka4ZkJC+MinTBg3Tp9kItWK+qq74axp2+//Ta8vb2Ntj377LNG6W0daMwYQ13D9AZSY7HAmTVrFjIyMlp8RUdHIyQkRDeWXaCurg7FxcUICQm54Xm++uorXL9+HSlmTEOemJiICxcuoLq62uTvrq6u8Pb2NnopBRpBZZ9IGWh86RKQn88rSyUM9XUUvLz4Kg6ANF4cpQYYW0xeHo+RMny9955uUkYwBqxY0TRNXp5VTm8Ye+rj4wOVSqX7XlFRgfHjxyM4OBheXl64+eabsX//rwC4B2fBggXoaWI22ISEBMybN8/k+aqrq/HUU08hKCgIbm5uGDRoEA4ePKj7fceOHVCpVPjpp5/Qt29fuLq64s8//7TKtbYVi+fBCQwMRKAZMwYNGDAAJSUlSEtLQ9+G1W9/++03aLVaJCYm3nD/jz/+GPfee69Z5zp8+DD8/Pzg6up64wtQGOTBsU8Ez4kUAkeoHGNieOwWYT/07g2cOsU9f//3f7Y9NwmcBppZ9d1I4Ei06nt5eTnuuusu/Oc//4GrqyvWr1+P0aPvwaZNJxESEo5HHnkUr7zyCg4ePIibb74ZAHDo0CEcOXIEX3/9tcljPvfcc/jf//6HdevWISIiAosWLUJycjLOnDkDf39/Xbo5c+Zg8eLFiI6Ohp+fn6jXaS6ixeB0794dw4cPx5QpU3DgwAHs3r0b06dPx9ixYxEaGgoAyMvLQ7du3XDgwAGjfc+cOYNdu3Zh8uTJTY77/fff46OPPsKxY8dw5swZvP/++3jttdfw5JNPinUpskWYDZeWaLA/hEri+HGgGcejaFD3lP0i3DMpPDgUYNxAM6u+N4sNV33v3bs3HnvsMfTs2ROxsbFYuHAhYmJisGfPdwAAf/9OSE5Oxpo1a3T7rFmzBklJSYiOjm5yvIqKCrz//vt46623MGLECMTFxWHVqlVwd3fHxx9/bJR2wYIF+L//+z/ExMQYCR8pETUU/7PPPkO3bt0wdOhQ3HXXXRg0aBA+/PBD3e+1tbU4efIkrjeKflq9ejU6deqEO++8s8kxnZ2dsWLFCgwYMAAJCQn44IMPsGTJEsyfP1/MS5EltESD/RIezkcD19Xph/nbCgowtl+Ee2br2K3qai7GARLGza36bhIbr/peXl6OZ599Ft27d4evry+8vLyQkZGBoqJcADwOZ8qUKfjiiy9QVVWFmpoafP7553j00UdNHu/s2bOora3Frbfeqtvm7OyM/v37IyMjwyit4YhpuSDqUg3+/v74/PPPm/09MjLS5PDu1157Da+99prJfYYPH47hw4dbzUZ7huJv7BeVireEf/uNu/5t2SomD479ItwzYSJjW03/dfw4F+N+flycOzzNrPreBBuv+v7ss89i27ZtWLx4MTp37gx3d3c88MAD0GprAPA4nHvuuQeurq745ptv4OLigtraWjzwwANtPrenp2ebj2FtaLILO4bib+wbKQKNq6r4OlgACRx7JDQUCAgA6uv1HhVbYBh/Q9NRNCCs+t5chkiw6vvu3bsxceJE/OMf/0B8fDxCQkKQnZ0NZ2f+e2Uln65lwoQJWLNmDdasWYOxY8fq1n9qTExMDFxcXLB7927dttraWhw8eBBxcXG2uKQ2QYtt2jHkwbFvpAg0Pn6cV47+/kDHjrY7L2EdVCreoNm+nXdTNY5jFQuKv2mGRqu+GyHBqu+xsbH4+uuvcc8990ClUmHevHnQarVwaqjphSUbJk+ejO7duwOAkXhpjKenJ6ZNm4bZs2fD398f4eHhWLRoEa5fv25yChe5QR4cO6W2Vh+7QR4c+0SoLP7+23brxBh2T1FL3D6RItCYlmhoBsNV393cgGee4e+C6LHxqu9LliyBn58fBg4ciHvuuQfJycm46aaboFYbL9kQGxuLgQMHolu3bjcc1fzGG2/g/vvvxyOPPIKbbroJZ86cwc8//yybkVItoWItrXGgUMrKyuDj44PS0lK7nRNn/36+7ImfH580k2bWtz/q6vgw7aoqPvRXmONETJ56is8o/8wzfAFxwv745BMer3rbbcCuXeKfT6sFfHyA8nLg2DGgRw/xz2krqqqqkJWVhaioKMvXM6yq4qM76uuBrl2Br7/msTknTgD/+Af/U2s0PONksFbiyZPAtWtARAQQEMAQGxuLxx9/HDNnzpTatCa0dF8sqb+pWrRThGkYBg0icWOvODnpuxdt1U1FAcb2j6EHxxbN0zNn9HV0167in89uMLHqOwB9APLEiZKt+m4KYaRtdvZlLF++HAUFBUhNTZXWKJGhGBw7RRA4t90mrR1E20hIAA4c4DEOY8aIe67aWiDtYD0ADfqoDgNIEPeEhCh06wa4udSjrEyDzC8OoftD4gbGCPE38fHQxXIQ0K/6bqqF6ekJrFnD3V8yaYG2a8eX+ejfPwgBAQH48MMP7aKbqS3II+cJi9Bq9QJn8GBpbSHahi1HUqWnAxWVGvihGD1+bH7tNkLeODsDA3z5en87l6aLfj6awbgFzJkHRyZ4evK4u4MHGS5cuIyHHnpIapNERz65T5jNiRPA1at89OFNN0ltDdEWhPt38KD4gcY7fqgAAAzGLqi/+lLUFY8JESkqQlIRX7l6Z5qn6PdRmGieBI59o9HoR6yXl0tri60ggWNFjh4FXnoJ+PJLcc8jeG9uuQW6+Q0I+6RPH96yunKFB3CKyc5NhQCAIdgh+orHhIisW4chbAcAYAdLAlsn3n2sqgL27OGfk5JEOw1hI4Q4HLEFTkUFcP48UFYm7nluBPWoWpFffgEWLgRGjBA3noLib5SDszPvZvzpJz6rsdXmNMrLAwoLdV/r6oA/TnYBACRhp37F4yFDjPcLDqYJcuREo/sIAHjvPSSyfLiiCgXogNNv/4Autw8xTmOl+7hvHxc5ISE89oewb9q144/TtWvinqekhJ+nthaQcqAyCRwrIqzuu3MnUFMDuLhY/xyM6YeGUvyNMrjjDr3AmTHDSgdttOLxIfRDOQ7CF1fRC0ckXfGYsIBmVq52A8Mt2IedGIKdF6LRRaT7+Ntv/P2OO2jeJCUgeHCqqrj4EKsHQPDcSD0LC3VRWZGePYGgIL7eh1jzO2Vn80adkxPvoiLsnzvu4O87d5qeELVVNFrxeAeGAABuwx/QwESwjw1XPCYsoIWVq5PABYxwbwFY/T4aChzC/nFyAoRVGcTqpqqr411UAAkcRaFWA8OG8c+//irOOYTGXN++Nl3ihBCR3r35iNOyMj7SySo0WvF4J3gAxRDsaJrWxiseExbQwsrVwr3ciSQwwOr3sbycTygKkMBREmLH4QjdX25u4vRiWAIJHCsjCJxt28Q5Pg0PVx4ajT4URmgxW4WGCcfq7x+DP8ADtoRWvxFjxhhPVEbIC2HiuNGjjTbfgn1wQTXy0AlnEWP1+/jnn7w1HhkJREVZ5ZCExLz88su4++4EAObH4QwZMgQzLOg7N6d76uWXX0aCDWYbJYFjZQSBc/AgD7SyNhRgrEyEFrJVBQ4AeHricMw/UQYfeKMUCThs/LsEKx4TrcDEytXuqEIiuItlJ4ZY/T5S95TyePbZZ/HLL9sB8FCK+vob7/P1119j4cKFZp9DLvE3AAkcqxMWxqcz12qB33+37rELC/l6IgBw663WPTYhLbffzt///BOorrbusXf+xmNuTMbfSLDiMdFKhJWrDdDF4ahut/p9FASO8GwS9gtjDHV1dfDy8kKHDu11XUfmdFP5+/ujXbt2Zp2nulpffpm5i6iQwBEBYTSVteNw/vyTv/fsCfj7W/fYhLTExfEA9cpKfdyDtdiREQQAGKLeJYsVj4lWYmLl6iHOfJKanew2sD3Wu49Xr+rjwUjgyJPq6mo89dRTCAoKgpubGwYNGoSDBw8CAHbs2AGVSoWffvoJffv2haurK/78809d15AgPkpK6vDUU0/B19cX7du3x/PPP48JEyZg1KhRuvM07qKKjIzEa6+9hkcffRTt2rVDeHg4PvzwQwB6783Klc+je/cu8PDwQHR0NObNm4fa2lpbZIsRJHBEQKw4HIq/US4qlTjdVPUVVfjjWgIAIKnTOd7KX7KEv8fE8ESZmbJZEJBohqoqfp8Aft8a7uOAvUvgjBqcRziyMqutdh93NkyV1LWr402LxBgfBWTrl6ULpz733HP43//+h3Xr1iE9PR2dO3dGcnIyiouLdWnmzJmDN954AxkZGehlMMmWEGi8dOmb+Oyzz7BmzRrs3r0bZWVl2Lx58w3P/d///hf9+vXDoUOH8Pjjj2PatGk4efKkTuD4+7fD2rVrceLECbzzzjtYtWoVli5datkFWgPmgJSWljIArLS0VJTjl5QwptEwBjCWnW294950Ez/mF19Y75iEfPjwQ35/Bw+23jHTd5QygLF2ztdZbWmF8Y/l5YxNnMhYQgJjV69a76SE9SkuZqx3b8ZSUxmrML6Ptw6oYwBjq8Nestp9fOop/ixOm2aVw8mWyspKduLECVZZWanbVl7Or93Wr/Jy8+0uLy9nzs7O7LPPPtNtq6mpYaGhoWzRokXs999/ZwDY5s2bjfabP38+6927N6usZOzgQcbatw9mixa9pfu9rq6OhYeHs/vuu0+3LSkpiT399NO67xEREezhhx/WfddqtSwoKIi999777NAhftxr14ztfeutt1jfvn2b2NEcpu6LgCX1N3lwRMDHB+jfn3+2VjdVWZl+VV8KMFYmggdn714eAGgNdh7ikX6DhrnDybtRAKqw4nFaGuDra50TEuIgrFy9enWTQOKk23lczo4hL1vtPlKAsbw5e/YsamtrcatBMKazszP69++PjIwM3bZ+/fqZ3N/VFaisLMWVK4WIj++v267RaNC38aSRJjD0BqlUKoSEhCAv7xLq6vhsBd9/vxG33norQkJC4OXlhRdffBG5ubmtudQ2QQJHJKwdh7NnDw9cjo52PJexoxAdDYSH8xlGd++2zjF37ODvjVdkMEJGKx4TLdDMfRLu7c5d1plquLBQvy5ai8+NQvHw4MG3tn6JMZDR09PT5HaVSh8EXFlp+XGdG02BrFKpUFnJBzCcObMXjzwyHnfddRe2bNmCQ4cO4d///jdqamosP1EboZJNJAwn/LPGKtHC8gzkvVEu1o7D0Wr1cVu0UKJyGTiQxx3n5PCZztuKIIp79wYCAtp+PHtDpeLOTVu/LFkKIyYmBi4uLtht0BKqra3FwYMHEWfmPEgdOvjA3z8Y+/cf1G2rr69HeitnGxX0y4kTexAREYF///vf6NevH2JjY5GTk9OqY7YVEjgiccstPJCrqAg4cqRtx2IM2LSJfxaEE6FMrClwjh0Diov5c3jTTW0/HiFPPD2Bm2/mn62xjBh1T8kfT09PTJs2DbNnz8bWrVtx4sQJTJkyBdevX8ckM5fp8PYGHnzwSaxc+Tq+/vpbnDx5Ek8//TSuXr0KVSsWHhOGh/foEYvc3Fxs2LABZ8+exbvvvotvvvnG4uNZAxI4IuHsrG81t3U01Z49wJkzvCAzGL1HKBBhSO5ffwGlpW071k8/8fdbbxVvUT1CHghljXDP2wIJHPvgjTfewP33349HHnkEN910E86cOYOff/4Zfn5+Zu3v7g7861/PIzl5HCZOTMGAAQPg5eWF5ORkuLm5WWSL0Evh7Aw88MC9eOaZZzB9+nQkJCRgz549mDdvnqWXZxVUjFk6OM3+KSsrg4+PD0pLS+Et4nSL77zDV4e+807g559bf5ypU4FVq4CJE3lMKKFsunYFTp0Cvv0WuPfe1h1DGOJ7+jR/diZPtq6NhLxISwP69eNr/+TnA+3bt+44ublARASfIqm4WB6z0YpJVVUVsrKyEBUVZXGlrgQKC4Hz53n8T1wcoNVq0b17d4wZM8ai2YsvXAAKCvhzZ41lPVq6L5bU3+TBERGhO2nXrtZPT1FZCWzcyD9PmGAduwh5k5zM39eta/0xdu7k4sbLCxg71jp2EfKlb1/eDVlTA6xf3/rjCM/cgAHKFzcEcO1aDjZvXoWMjFM4ePAopk2bhqysLDz00EMWHUdOyzMYQgJHROLigNBQLm5+/LF1x9i8mT88kZE0wZ+j8Nhj/H3zZt6ibg2rVvH3hx7ST+pFKJspU/j7qlWWTxoH8NF7K1fyz//6l/XsIuSLq6saP/20FhMm3Iw77rgVR48exa+//oru3bubfYyqKv20FnJYnsEQEjgiolLxbiUA+O9/W3eMtWv5e0oKjeZ1FHr04LE4Wi3wwQeW73/lCvDVV/zz1KnWtY2QLw89xLsaMjJaN83A5s28eysoCHjgAaubR8iQsLAw/PrrbuzYUYo//yzD7t17MNjClnRhIX/38YFujSu5QFWmyEyfzm/6nj38ZQl5efp5dFJSrG8bIV+efJK/f/ih5d2bn3zCuyr69OFdF4Rj4O2t744UPHiWsGwZf3/sMT4RHOEY+PjwaQZqa/VdTeZSW8sbVAAQHGx929oKCRyR6dABeOQR/nnxYsv2/eQT3oq/7Tb9skGEY3DPPXxl+qIi4Msvzd+PMS6KAPLeOCLCPf/yS75gprn8/TefM8nJSd9FSjgGarV+8eaiIsv2vXyZ11EeHvLrngJI4NiEmTP5++bNPPDTHBjTB/wJ3VyE4+DkBDz+OP+8bJn5MRV79vAuCg8P3mWBPXv4pEyWug8J+2PPHvR/6hbEx1Sgqgr47DPzd12+nL//85+OOVO61hqzsdoxwqi7khK+YL05aLXApUv8c3CwZRMV3vjY1rkfTlY5CtEicXHAyJHADz8AS5cC7713430OHOCLB7u7U3+4ozJ5MvDyy3xOnAMHgMTEG+8jeG/Gjm0Y0bBsGbB/P6/BBg4U01xCapYtg+rAfkztuwlPYiI+/BB44okbVzzFxXoxNH26+GbKCRcXF6jVauTn5yMwMBAuLi6tmuTO3lGrebdkdTWPqTFnmoHiYi6GnJ15PWWNhewZY6ipqcHly5ehVqvh0sagHpoHx0bj2nbu5Ou6uLnxkTGBgS2nf/xx4P33gYcf5l1VhGOSmsoDzcePBz79tOW0V6/qR+3t3Qvc0rmI95HW1XGX0MWLjjn3viNQpL/XVzUBCHW+hKoqFX8Obml518WLgdmz+dIMhw5ZtyVuD9TU1ODixYu4bq0Vbu2UsjJehri6AiEhLadljAek19XxdWCtXY16eHigQ4cOJgWOJfU3eXBsxODBfCKuv/7iHpz585tPe+0a8MUX/DPNfePYTJ/OBc6XX/KReC0F8n32GRc38fEN3p4l6/RTjGq1fIIUob+UUBbr9PfajxVjTM8TWP9XD6xa1bLAqa/Xe5SnT3c8cQNwL054eDjq6upQX18vtTmScfky79aurwe++w7o0qX5tL/9xhvh7drxtcuaWdOzVWg0Gjg5OVnFk0YeHBvOTLRxI+86CAjgC+OZWj22qop3Z/32G5/75swZPqso4bgMGADs2wcsXAi8+KLpNKUZ+Ugc4Y+TOW5Y9tx5TH/wMjB6NJCVxZtbKhWfYlRY1EwgONgxgy7smbw8/dhcgUb3eneHBzAo/0t4uNXjyIYMxITVmLzXW7bwgHY/Pz4brRgrWhP2w6hRfAb1mBjgzz+b9+Tcdhv//fnngTfesKmJltXfTCReffVVNmDAAObu7s58fHzM2ker1bJ58+axkJAQ5ubmxoYOHcpOnTpllObKlSvsoYceYu3atWM+Pj7s0UcfZdeuXbPIttLSUgaAlZaWWrRfW6mtZSwykjGAsXffNf37P/7Bf/f0ZGz/fpuaR8iUzz7jz4SfH2PbtjX9PT+fsd6epxjAmD+KWDF8+Q4qFX9v6TV4sO0viGgbt93W9D42utdagPXFQQYwFoQClo6EJvf6xAnGunbluzz7rETXQsiKvDzGoqL4M9GrF2PFxU3T/PEH/93Zmae3NZbU36KNoqqpqcHo0aMxbdo0s/dZtGgR3n33XaxcuRL79++Hp6cnkpOTUWUQvTR+/HgcP34c27Ztw5YtW7Br1y5MtZPxsE5OwDPP8M9PPcVHR+Xn8++M8SGe33zD58359lugf3/JTCVkxAMP8Plsrl7l65rNm6cf6XDmDF9M8++KWASjANsxDH4o4T+25JxVqXhAmJkrDxMyYvJkfu8MXfiN7rUKwBbcjd44jEsIRhJ24veBL+h+X7eOd5mfPMlb6U8/bSPbCVkTGsoXhw4JAY4cAe6+G6io4L+Vl3MPsrAE0fjxPL2sEVttrVmzxiwPjlarZSEhIeytt97SbSspKWGurq7siy++YIwxduLECQaAHTx4UJfmp59+YiqViuVZICWl8uAwxlh1NWMTJ+obW56ejP3nP4zNmMG/q9WMff21zc0iZM7164xNnap/bm67jbHvv2csMJB/j4lh7OzWU4x16cIfopa8Nmo1b7ofPy71ZRGt5fhxs+51icqXDXHfxwDGXFwYW7+esZQUfZKhQxm7eFHqiyHkxpEjjPk2OIKTkxlbu5ax0FD9czNkCGMFBdLYZkn9LXoMztq1azFjxgyUlJS0mO7cuXOIiYnBoUOHkJCQoNuelJSEhIQEvPPOO1i9ejVmzZqFqwYzWNXV1cHNzQ2bNm3CP/7xD5PHrq6uRnV1te57aWkpwsPDcf78eZvG4Bjy11+8//Kvv4y3r1jBR04RhCm++oq3tsvL9dt69QL+9z8+xT4qKni06NdfN3+Q++/nw8Yp4MK+MfNeVy1ejilPe+C77/SbVSrg3//mMecU40eY4sAB4N57+YLPApGRwKuvcs+OVAHpZWVlCAsLQ0lJCXx8fFpOLLbaMteDs3v3bgaA5efnG20fPXo0GzNmDGOMsf/85z+sS5cuTfYNDAxk7733XrPHnj9/PgNAL3rRi170ohe9FPA6f/78DXWFRcPE58yZgzfffLPFNBkZGejWrZslhxWduXPnYqbB8FitVovi4mK0b9/e6pM6CepSSu+QmND12T9Kv0a6PvtH6deo9OsDxLtGxhiuXbuGUDMCgCwSOLNmzcLEG6wbEB0dbckhdYQ0jEcrLCxEhw4ddNsLCwt1XVYhISG4JMwN3UBdXR2Ki4t1+5vC1dUVro1Wj/P19W2Vnebi7e2t2AcXoOtTAkq/Rro++0fp16j06wPEucYbdk01YJHACQwMROCNpuBtJVFRUQgJCcH27dt1gqasrAz79+/XjcQaMGAASkpKkJaWhr4NyyT/9ttv0Gq1SDRnHnuCIAiCIBwC0YaJ5+bm4vDhw8jNzUV9fT0OHz6Mw4cPo9wgOrJbt2745ptvAAAqlQozZszAq6++iu+++w5Hjx5FSkoKQkNDMWrUKABA9+7dMXz4cEyZMgUHDhzA7t27MX36dIwdO9YsdxVBEARBEI6BaEs1vPTSS1gnLIcNoE+fPgCA33//HUOGDAEAnDx5EqWlpbo0zz33HCoqKjB16lSUlJRg0KBB2Lp1K9zc3HRpPvvsM0yfPh1Dhw6FWq3G/fffj3fffVesy7AYV1dXzJ8/v0mXmFKg67N/lH6NdH32j9KvUenXB8jjGh1yqQaCIAiCIJSNaF1UBEEQBEEQUkEChyAIgiAIxUEChyAIgiAIxUEChyAIgiAIxUEChyAIgiAIxUECx0L+85//YODAgfDw8Gh2NuTc3FyMHDkSHh4eCAoKwuzZs1FXV9ficYuLizF+/Hh4e3vD19cXkyZNMpozSCp27NgBlUpl8nXw4MFm9xsyZEiT9P/6179saLn5REZGNrH1jTfeaHGfqqoqPPHEE2jfvj28vLxw//33o7Cw0EYWm092djYmTZqEqKgouLu7IyYmBvPnz0dNTU2L+8n9/q1YsQKRkZFwc3NDYmIiDhw40GL6TZs2oVu3bnBzc0N8fDx+/PFHG1lqOa+//jpuvvlmtGvXDkFBQRg1ahROnjzZ4j5r165tcr8Mp9eQEy+//HITW2+0vI893T9T5YlKpcITTzxhMr093Ltdu3bhnnvuQWhoKFQqFTZv3mz0O2MML730Ejp06AB3d3cMGzYMp0+fvuFxLf0fWwoJHAupqanB6NGjdbMrN6a+vh4jR45ETU0N9uzZg3Xr1mHt2rV46aWXWjzu+PHjcfz4cWzbtg1btmzBrl27MHXqVDEuwSIGDhyIixcvGr0mT56MqKgo9OvXr8V9p0yZYrTfokWLbGS15SxYsMDI1ieffLLF9M888wy+//57bNq0CTt37kR+fj7++c9/2sha88nMzIRWq8UHH3yA48ePY+nSpVi5ciVeeOGFG+4r1/u3ceNGzJw5E/Pnz0d6ejp69+6N5OTkJsu4COzZswfjxo3DpEmTcOjQIYwaNQqjRo3CsWPHbGy5eezcuRNPPPEE9u3bh23btqG2thZ33nknKioqWtzP29vb6H7l5OTYyGLL6dGjh5Gtf/75Z7Np7e3+HTx40Ojatm3bBgAYPXp0s/vI/d5VVFSgd+/eWLFihcnfFy1ahHfffRcrV67E/v374enpieTkZFRVVTV7TEv/x63ihstxEiZpbpX0H3/8kanValZQUKDb9v777zNvb29WXV1t8lgnTpxgANjBgwd123766SemUqlYXl6e1W1vCzU1NSwwMJAtWLCgxXRJSUns6aefto1RbSQiIoItXbrU7PQlJSXM2dmZbdq0SbctIyODAWB79+4VwULrsmjRIhYVFdViGjnfv/79+7MnnnhC972+vp6Fhoay119/3WT6MWPGsJEjRxptS0xMZI899piodlqLS5cuMQBs586dzaZprjySI/Pnz2e9e/c2O72937+nn36axcTEMK1Wa/J3e7p3jDEGgH3zzTe671qtloWEhLC33npLt62kpIS5urqyL774otnjWPo/bg3kwbEye/fuRXx8PIKDg3XbkpOTUVZWhuPHjze7j6+vr5FHZNiwYVCr1di/f7/oNlvCd999hytXriA1NfWGaT/77DMEBASgZ8+emDt3Lq5fv24DC1vHG2+8gfbt26NPnz546623WuxSTEtLQ21tLYYNG6bb1q1bN4SHh2Pv3r22MLdNlJaWwt/f/4bp5Hj/ampqkJaWZpT3arUaw4YNazbv9+7da5Qe4P9Je7hXAHSzvd/onpWXlyMiIgJhYWG47777mi1v5MDp06cRGhqK6OhojB8/Hrm5uc2mtef7V1NTg08//RSPPvooVCpVs+ns6d41JisrCwUFBUb3yMfHB4mJic3eo9b8j1uDaEs1OCoFBQVG4gaA7ntBQUGz+wQFBRltc3Jygr+/f7P7SMXHH3+M5ORkdOrUqcV0Dz30ECIiIhAaGoojR47g+eefx8mTJ/H111/byFLzeeqpp3DTTTfB398fe/bswdy5c3Hx4kUsWbLEZPqCggK4uLg0icEKDg6W3f1qzJkzZ7Bs2TIsXry4xXRyvX9FRUWor683+R/LzMw0uU9z/0m53ysA0Gq1mDFjBm699Vb07Nmz2XRdu3bF6tWr0atXL5SWlmLx4sUYOHAgjh8/fsP/qq1JTEzE2rVr0bVrV1y8eBGvvPIKbrvtNhw7dgzt2rVrkt6e79/mzZtRUlKCiRMnNpvGnu6dKYT7YMk9as3/uDWQwAEwZ84cvPnmmy2mycjIuGEgnD3Rmmu+cOECfv75Z3z55Zc3PL5h/FB8fDw6dOiAoUOH4uzZs4iJiWm94WZiyfXNnDlTt61Xr15wcXHBY489htdff122a8W05v7l5eVh+PDhGD16NKZMmdLivlLfP4LzxBNP4NixYy3GqADAgAEDMGDAAN33gQMHonv37vjggw+wcOFCsc20iBEjRug+9+rVC4mJiYiIiMCXX36JSZMmSWiZ9fn4448xYsSIFheDtqd7Z2+QwAEwa9asFhU2AERHR5t1rJCQkCaR4MLompCQkGb3aRxYVVdXh+Li4mb3aSutueY1a9agffv2uPfeey0+X2JiIgDuQbBFBdmWe5qYmIi6ujpkZ2eja9euTX4PCQlBTU0NSkpKjLw4hYWFot2vxlh6ffn5+bj99tsxcOBAfPjhhxafz9b3rzkCAgKg0WiajFhrKe9DQkIsSi8Xpk+frhtwYGlL3tnZGX369MGZM2dEss56+Pr6okuXLs3aaq/3LycnB7/++qvFXk97uneAvl4rLCxEhw4ddNsLCwuRkJBgcp/W/I9bhdWieRyMGwUZFxYW6rZ98MEHzNvbm1VVVZk8lhBk/Ndff+m2/fzzz7IKMtZqtSwqKorNmjWrVfv/+eefDAD7+++/rWyZ9fn000+ZWq1mxcXFJn8Xgoy/+uor3bbMzEzZBhlfuHCBxcbGsrFjx7K6urpWHUNO969///5s+vTpuu/19fWsY8eOLQYZ33333UbbBgwYINsgVa1Wy5544gkWGhrKTp061apj1NXVsa5du7JnnnnGytZZn2vXrjE/Pz/2zjvvmPzd3u6fwPz581lISAirra21aD+53zs0E2S8ePFi3bbS0lKzgowt+R+3ylarHclByMnJYYcOHWKvvPIK8/LyYocOHWKHDh1i165dY4zxh7Nnz57szjvvZIcPH2Zbt25lgYGBbO7cubpj7N+/n3Xt2pVduHBBt2348OGsT58+bP/+/ezPP/9ksbGxbNy4cTa/vub49ddfGQCWkZHR5LcLFy6wrl27sv379zPGGDtz5gxbsGAB++uvv1hWVhb79ttvWXR0NBs8eLCtzb4he/bsYUuXLmWHDx9mZ8+eZZ9++ikLDAxkKSkpujSNr48xxv71r3+x8PBw9ttvv7G//vqLDRgwgA0YMECKS2iRCxcusM6dO7OhQ4eyCxcusIsXL+pehmns6f5t2LCBubq6srVr17ITJ06wqVOnMl9fX93IxUceeYTNmTNHl3737t3MycmJLV68mGVkZLD58+czZ2dndvToUakuoUWmTZvGfHx82I4dO4zu1/Xr13VpGl/jK6+8wn7++Wd29uxZlpaWxsaOHcvc3NzY8ePHpbiEFpk1axbbsWMHy8rKYrt372bDhg1jAQEB7NKlS4wx+79/jPHKOjw8nD3//PNNfrPHe3ft2jVdXQeALVmyhB06dIjl5OQwxhh74403mK+vL/v222/ZkSNH2H333ceioqJYZWWl7hh33HEHW7Zsme77jf7H1oAEjoVMmDCBAWjy+v3333VpsrOz2YgRI5i7uzsLCAhgs2bNMlLxv//+OwPAsrKydNuuXLnCxo0bx7y8vJi3tzdLTU3ViSY5MG7cODZw4ECTv2VlZRnlQW5uLhs8eDDz9/dnrq6urHPnzmz27NmstLTUhhabR1paGktMTGQ+Pj7Mzc2Nde/enb322mtG3rbG18cYY5WVlezxxx9nfn5+zMPDg/3jH/8wEg1yYc2aNSafV0PnrT3ev2XLlrHw8HDm4uLC+vfvz/bt26f7LSkpiU2YMMEo/Zdffsm6dOnCXFxcWI8ePdgPP/xgY4vNp7n7tWbNGl2axtc4Y8YMXX4EBwezu+66i6Wnp9veeDN48MEHWYcOHZiLiwvr2LEje/DBB9mZM2d0v9v7/WOMe+ABsJMnTzb5zR7vnVBnNX4J16HVatm8efNYcHAwc3V1ZUOHDm1y7REREWz+/PlG21r6H1sDFWOMWa/DiyAIgiAIQnpoHhyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBQHCRyCIAiCIBTH/wPt6JQLh19e1wAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_taylor('cos(x)',8,-10,10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### We can calculate Taylor approximation polynomials of a function with various degrees using scipy:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlsAAAHQCAYAAACWWq/3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACTI0lEQVR4nOzdd3gU5drH8e9sze6mVxJIAgFC7yAiggoooKBgQ0URFLDhq0fRY1fsIKCCBQRFFD125RwVLCAdAUGQDqG3kEB62/7+MSGCtASymezu/bmuXBp2duYXmOze+8wz96N4vV4vQgghhBDCJ3RaBxBCCCGECGRSbAkhhBBC+JAUW0IIIYQQPiTFlhBCCCGED0mxJYQQQgjhQ1JsCSGEEEL4kBRbQgghhBA+ZNA6wJl4PB4OHjxIWFgYiqJoHUcIIUSA83q9FBYWkpSUhE5XveMRHo+HsrKyat2n0I7JZMJgqFwZVauLrYMHD5KcnKx1DCGEEEFm37591KtXr9r2Z7fb2bRpEx6Pp9r2KbQXGxtLSkrKWQeEanWxFRYWBqgnfXh4uMZphBa2vPsli7bGE6oUc8vrV2odR4jzN+s62LcCZ/vbucWxjX2F+xjRagR3trpT62QCKCgoIDk5ueL9pzp4vV52796NwWCgQYMG1T5iJmqex+OhqKiIAwcOAJCamnrG7Wt1sXWsUgwPD5diK0gl1I3HssuGzmuQc0D4v91LIGslWM18nd6Gg2sXEBcVx8gLRmIz2rROJ45TnVNXnE4nRUVFNGjQgNDQ0Grbr9DWsX/LAwcOEBkZSURExGm3lfJa1Gq2hEgAnIoZt1uG34WfW/AqAPa2t/Duts8AGN5quBRaAc7lcgFgNps1TiKq27GCa+7cuRw9evS020mxJWo1a2I0eNUiq6zQqXEaIc7DnmWwezHojHyR1IjDJYdJsCZwY5MbtU4maojc6BV4jl0Szs7O5ocffqCkpOTU29VkKCGqyhgXh8lZBEBJvtzFI/zYwnEAFLcdxPSMrwC4p809mPUy2iGEv4uNjSUrK4u8vLxTPi7FlqjVDNFRGB2FABRl5mkbRohztW8l7PwNdAZmJaSQU5ZDangq1zS6RutkQohqYDAYcLlc2O32Uz4uxZao1RSjEbO3FIDizFyN0whxjhaOBSC/1fV8uOM7AEa1HYVBV6vvURLitIYOHcqAAQO0juE35Ddd1HpmnTpXqzi7SOMkQpyD/ash41dQ9HwQn0hRxjKaRDXhivpXaJ1MiHP25ptv4vV6tY7hN6TYErVeiEmdIF+SW6xxEiHOQfmoVnara/l01w8A3N/ufnSKXFgQ/utMbQ604vV6cbvdle7qXpPkt13UeiEW9TQtLXBonESIKjr4J2z/CRQd70XHUOYuo01cG7rX6651MqEhr9dLicOlyVdVRqO++uorWrVqhcViISYmhl69elFcrH7o/edlxEsvvZT/+7//49FHHyU6Opo6derw3HPPnfUYH3zwAS1atMBsNpOYmMioUaMA2L17N4qisHbt2opt8/LyUBSFBQsWALBgwQIURWHOnDl06NABs9nMBx98gKIobNmy5YTjvP766zRs2LDi+w0bNtC3b19CQ0NJSEjgtttu48iRI5X+u6mq2lf+CfEPllAj5EFpiVvrKEJUTfkdiAdaXM1X+34G4IH2D0gLgCBX6nTT/JmfNDn2pud7YzWd/a3/0KFD3HzzzYwbN46BAwdSWFjI4sWLz1iszZw5k4ceeogVK1awfPlyhg4dSteuXbn88stPuf27777LQw89xKuvvkrfvn3Jz89n6dKlVf6ZHnvsMcaPH09aWhpRUVFMmzaNTz75hBdeeKFim08++YRbbrkFUIu2Hj16MHz4cF5//XVKS0v597//zY033sj8+fOrfPzKkGJL1HrWSDPkQdmpb/IQonY6tA62/giKjnejInAVu+iS2IVOdTppnUyIszp06BAul4trr722YimaVq1anfE5rVu35tlnnwWgcePGvPXWW8ybN++0xdaLL77Iww8/zAMPPFDxZ506Vf334/nnnz/hGIMHD+att96qKLa2bdvG6tWrmTVrFgBvvfUW7dq14+WXX654zgcffEBycjLbtm0jPT29yhnORootUetZY8JgN9hdcroKP7LoNQB2Nr+S/x1YCKhztYSwGPVser63ZseujDZt2tCzZ09atWpF7969ueKKK7j++uuJioo67XNat259wveJiYlkZWWdctusrCwOHjxIz549Kx/+NDp27HjC9zfddBOjR4/m999/58ILL+STTz6hffv2NG3aFIB169bx22+/nXLppB07dkixJYJTaLy6JqLda8Lr9colGFH7ZW6Azf8DFN4Kt+Ip8dAjuQet4s48MiCCg6IolbqUpyW9Xs8vv/zC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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from scipy.interpolate import approximate_taylor_polynomial\n", + "x = np.linspace(-10.0, 10.0, num=100)\n", + "plt.plot(x, np.sin(x), label=\"sin curve\")\n", + "plt.ylim([-1,1])\n", + "for degree in np.arange(1, 5, step=1):\n", + " sin_taylor = approximate_taylor_polynomial(np.sin, 0, degree, 1,\n", + " order=degree + 2)\n", + " plt.plot(x, sin_taylor(x), label=f\"degree={degree}\")\n", + "plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left',\n", + " borderaxespad=0.0, shadow=True)\n", + "plt.tight_layout()\n", + "\n", + "plt.axis([-10, 10, -5, 5])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Solving a linear system of equations:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 2. -2. 9.]\n" + ] + }, + { + "data": { + "text/plain": [ + "array([ True, True, True])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# solve the system Ax = b\n", + "A = np.array([[3, 2, 0], [1, -1, 0], [0, 5, 1]])\n", + "b = np.array([2, 4, -1])\n", + "from scipy import linalg\n", + "x = linalg.solve(A, b)\n", + "print(x)\n", + "np.dot(A, x) == b" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.7 ('base')", + "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.12.2" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "73b970f0c73a889c69baa3b2273e70726e0df92f975ad7f5ffd269914acfd6bb" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}