{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# time-series 🤝 tsflex 🚀","metadata":{}},{"cell_type":"markdown","source":"<div style=\"background-color:#f2f2f2; padding:20px; border-radius: 10px;\">\n    <h2 style=\"color:#595959;\">Check out <a href=\"https://github.com/predict-idlab/tsflex\" target=\"_blank\" style=\"color:#0099cc;\">tsflex</a>!</h2>\n    <h4 style=\"color:#737373;\">tsflex is a Python package for flexible and efficient time series feature extraction. It's great for data preprocessing and feature engineering for time series data. Check it out on <a href=\"https://github.com/predict-idlab/tsflex\" target=\"_blank\" style=\"color:#0099cc;\">GitHub</a> today!</h4>\n    \n<p style=\"color:#737373;\">This notebook is a fork of the <a href=\"https://www.kaggle.com/code/sx66998756/time-series-tsflex\" target=\"_blank\" style=\"color:#0099cc;\"> time-series 🤝 tsflex 🚀 notebook</a>\n\n![image.png](attachment:749699c2-047d-46a5-b3e5-bca07637c04d.png)\n</div>","metadata":{},"attachments":{"749699c2-047d-46a5-b3e5-bca07637c04d.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAABDoAAABYCAYAAAAUXpf7AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAEKiSURBVHhe7d0LXFRl/j/wjyKD6IiKYeAFvEC63goxTVdTMy3LFtMk+8nPVlwLdTXzntYmZaalad7yUrL615+urq6Um+YVwkBNoBQoBS94gyRQYBQZwPN/vs85AwPOwACDGX3fvWadc2bOmeec8wyvPd/5Pt+nliKAMcYYY4wxxhhjrAawGOhIOpeiPWOMMcYYY4wxxhj7/eCMDsYYY4wxxhhjjNUYtbV/GWOMMcYYY4wxxn73ONDBGGOMMcYYY4yxGoMDHYwxxhhjjDHGGKsxONDBGGOMMcYYY4yxGoMDHYwxxhhjjDHGGKsxONDBGGOMMcYYY4yxGoMDHYwxxhhjjDHGGKsxONDBGGOMMcYYY4yxGoMDHYwxxhhjjDHGGKsxONDBGGOMMcYYY4yxGoMDHYwxxhhjjDHGGKsxONDBGGOMMcYYY4yx+6rw7l3tmf3VUgTtOWOMMcYYY4wxxmqQ3Nw7+CX9V9y4mQXDrVzk5+drr1Reo4YuuJmVrS1VnqOjI+rXd0bjhg3R9CFX8bye9krV/C4CHQWFhSgsvIu7d8VDuQvlrgL5n2h5x7PvobljI/kgLXSN5WNEEz/UcXCQzxljjDHGGGOMsT+SgoICnLtwCWnXf0Uz96Zo4toI+vr1odM5au+ovMPfRuOpJ3tqS5VXKO71s3Nu4deMTFxLu46Hmz6E1p4t4OSk095ROQ9koIOalF9QKC8MBTnKQoGOsvSo1wrDXf3Qu6E3Wjq5amsZY4wxxhhjjLGaibItEn9ORlO3Jmjt1QIODg7aK/Zhr0BHaecupOCX6xlo/0gbuDZWkxkq44Gq0UFjdHLz8pBz6zbuiH8tBTlq1aqF2rVrywtFGRsUyDDP6Cjt+O2LmHllJ3olLMIb57ch5U6G9gpj7ObNm4iIiJD/MsYYY4wxxn7/KMgR+2MC2rbxhHcbL7sHOapT29Ze8GnbCj/G/4zMG5W/R3kgMjpoSEqeMR/5BQXammIOtWujTh0H8a8DajvURu1atbRXLLuUl4lLuRn4940YHDNcwNX8e0/OsEa+mNZsIDzrNtHWMPbHQAGNjRs34p///Cd++OEHbS1w5MgR9OvXT1tijDHGGGOM/R7RqIgTMadkkONht4e0tfZXXRkdJukZmUhKvgi/xzpVahjLbx7oyDMaZZDDXO3ateBYx1E8HGT2hjkKitA4HvrXhLI8KEplKVIVlZ2M7RkU9Dh/T9BjUfNheLLxI1zHo4YIDw+X2Qn+/v547LHHtLXFdu/ejR9//BGvvvoqWrVqpa3945g3bx4+/fRTPA0d/qfQEb0cneX6YdlX8cGBrznQwRhjjDHG2O/cmaTz8r6YMjmqU3UHOggNY6GSFu192mhrbPebBTpomAoNT6EioyYU1HBydISjYx1tDWRF2DzxPqPRKJ+bBzgsoaqt9HBycpIPCoKYbL1+Ap/+cqhEwKN7vVb4pFUAvH7D7I680zuw8iDw7Osj0NE+RWYfCPfzuCg7YegLT+Ovz9bHP/fdwu6vDsp1KSkp6Nu3Ly5evIgl88agV3tg/5lWiIuLQ6NGlR/zVZb0uB3YHX4F2fCG/4QXxP9mI/s24OTiAqffIGuMsjj69+8vgztLly5Fw2u/4NZLQXDMM8rX3TOTcePGjWo7H4wxxhhjjLHqR7OrnIg9hd5P+FX7cBWbAx03ziHqUDiiLwMtHu+HwT3bwqUCTfv2uxMyq6Ois7H8JoEOGqKSeydPW1LVddJB56hWf6Vgxu3bt8WFypWpN5VFQQ5nZ2f50OmK012mXPhXiQwPqu+xte3f0Lqem1yuTnlX4hBzEWj5uC9aOqnrYpd2wvAVwN93xmOar7quJrhfx0UBDbqRD1/RGo/66PHDWQP6TzyNFq4FGNwVWPeNON/i0u5+C2hYH9j6LbDh+8fkcI2ybu6zz0Yj/npTdOotvozauvLknVyIgQFf4HLjtujYdSyWrR+Bhv8eh+4zgYVR6/Gyu/bG+8QU5KAMl9DQUG0tUHA6Eb88G4AzhmwENa4tA0GMMcYYY4yx36+Ll64gP79A1riobrYEOvJOLsXwMauRcEtbITh1exM7/znB5h/Ck85dRJ06dWRB1Yq478VIaZiKeZCDCorq6znLIAfFXHJycnD9+nX5b1WCHIT2RwGTjIwMZGZmyqwQsqz1y/jEa0RRAVMKeDz582L83y/H5XJ1yj62GqNGr0bUDW2F0HVyDH6MialRQQ5yP47LFORYNqmpDHKQxx7R4+iqttjzNjBzGPCl+NcU5CCvPAn8qYG6XVlFOJN3jRbXageStWVbJH//DS6jA0K278Oe9SPgra3/LZQOcpw/fx7x8fEyM6pO5w54eN92fFk7H0OHDtW2YIwxxhhjjP1e3biZJaeQfSAUJmL9VApytMW4TTG4kBSDLa+1lcGPKRsTtTeV76EmrriZlaUt2e6+BjrUehxqsIE46RxRz7muHLJC2Rvp6ekwGAwyQGFvNPyFAh5Z4iTR/nu5eONY57cwvHHxXfisq7vw8ZV92pL9Xf5mKVZ+Q7fNyfhm7VIs+eaKXJ8dtwPr/7kDsdlyUb5vydL9SM5ORNjCiRgyPgT/ihMvFmYj4SvRMUZPxLtbopFeelIaev+6EIz3H40pS8X+0rT1NshO/Arr50/FKH+x73UWti1z31ewbykdzzmkR38h2ueP9XH3HpdUXhsL0xG1ZSneHe+PUdMWYtOhc8guY4Zhqjsxb4wrXn3+YW0NUJBngLvDOdSvCzg41Udn7/pFQQ6T5a8BzRx+kEU575WNWNGGTd/T81hsEse26aR2EGW0j67b+oN0TbMRvlmcjy1x4pkVVs+D2P9G7fqbjvt2Iv4l2rDyq3MomQdVEgU2fH19ZSYTPRo3blwU5KDg4eXLl+X3LCYmRr7/lmdzbMQdTJkyRS4zxhhjjDHGfr8Mt3Khr1/qxscW4l7Z7k59g5V0azRqNqb1dhE3Zi7o9fpEPCtWJW8NR4J8U/lcGtSXx1VR9y3QQZkc5kVHaaiKkzachIIPdJNGRUarG2V4/Prrr2bZHSMxuelT8jlZfv0IPr7yjbZkX+kp4YhJSKdniP8+HEdS6Lk4NxcjsHJFBJJuy0Wkx60Wy59j1vi/YX30OXEDvRmzh0/D7DkB+J/l4UhOjsCmd0ajz/zo4hvfKzsQ9Gd/TFmbAKcuD+HyjhAMH+iP9TYEy/LCQ9B9yFSsjAM69muK5LVzxLZTsc+UdVLuvtMRu0K0ed1bCB61GglZecgTl7L0cZW7n8Jz2BTQC6MW7sDlh/qhY2E0Fox7FsPXWT8IupH/539/QZahOPvHeCsDyt0CODo3RKPmXeSDAh7m4i8B3/2kbn+vPFxPEF8+OZrjHBLCw5F4XZzpctpH11fdRru+4lpb/JNR5nlwg1/HPIStmIgF/1H7R8LGqZi9IhouHdpCG+10D1P2xg8PdwQOZsvHM4cuFA1Xobo1lMlB37F69dQ8MQoSUeHWP2JhVsYYY4wxxmoa+v/7Op1aDsJm2eKeZkgnDN9wTlthH+nnEuW9UK+O3sX3MI1boCX9eyUZl63+IlwS1Rqh46qo+xLooJoc5pkczk5OcqgK3XRR0IGCD/cTDYmh7A7T585o8QzeaPpU0VCW5dcPI/JmknxuT11fC0PoVBrH1BPTPg/DntfKGtORjl7To7AnbB9OrB8hlsMR1eBdnDggtosMw5zO4nZ8Y4QWCcvGvsVzcKTxWGyJ3I5l73+CnZH/D39vnIgF6/ZbzyrQJBzbLDphP8xZ9QnmvPkutoStx8IFI9BSRvYqsO/0rpj2QwwOiDb/vZu2rogN+0mPRXic+HfUKmx4/03MWbYdOz9dgDmPOVk9BrpZV5y9MffTWNz89bpcV8/VCw/59EHDFl1Qy6GOfJgHOyjIMfQDYNmqUCszjbjh2QVhWESnHSOwKCwMC59zK7d9dH3VbbTru2CQ2FNp5Z8HGrcWMsoJR0JW48jZHVjy8Tl4z5iH0W3VPVhCWRk/pN0QnfkzufyqhyP2PVUcwKDsji5duqBp06byX5pilmqULFu2THsHY4wxxhhj7A+FghzDR2P9OSB2/rN2D3YQpzqWfqrNQVY1hwCqPdBBs6uY1+SgTA6aVcUUbKhMdMZeKJPk1i21Msr0Fs9geOOu8jn5n/OfI+VOhrb0W3gG/bU4iFNDtRSmd3stGubgApcSk8ScQ+yX4h+X64imITE0jGR5OC7TXfaXsWqNibQdCGrjg9ZmjwUn6QWgZbt+Yr/heHfYODls5cgNbwx9ric6utOn2bBvk0F90ctq1U4b9tPYGx3pZn7d3zCchoV8lQinJ/6C/lSZl163ggqK9mibh5y0s8jPtVxzwxTs+DmtflGQ469//av2qo0q2b6SbDmfTug/8V30v7UZ44eH4EiLsQh5tYN8xRoKWDz6cCPg4/H4S10D/tmhrlx/swD4a+Id+ZyCHG3atJFBjjfeeEMO2+GZVhhjjDHGGPsDMgtymNgz2OFUr4H8NzldzVIvqa2cLKI6VXugg6aQNaGaHKZMDioOWpWhKrSt+aOysrOzi4IdlNkxuWl/+Zy8nLQOV4xmVUMfdKWCZS17T8DfJ3VVswrqeaPfJFoufnTVOpfbi+sRueldvPzodUStnYMg//5o330iwtQSIqqy9m1SR725LlNZ+3HyxbSdYVg2qS/qnvkSC94IwMAefhiyNM7yEBANZWXQMBRnJ8VqsONuwR05pKXTY11k9LDCQQ5SyfZZVN75dOuIri2AvFtiz95t4VNOVWIKWFDgwjlyN9p8uUKuoyDHlLN3sOyR4utiCnKEh4dbGbbDGGOMMcYYq9nykJ7WFOO2q5NHmD9CnwOS0yp8d3MPl45dQWkElw/GFtcePB0NWRGzn7i/qd7Zb6s30EHDVQoL78rnNLuKqSbHjRs3KhWcoGlnf/zxR3lDt3v3bpw6dUqm33/55ZfYsmULoqKi5HsqioIdd+6ov3rPaPFsidlYtl6v/plYqs4JLnK2na4IePNNTNMefx87FuMmDFLHQbn4YrTZa/R41oteEG5nw6nLCIR8FoYDMUn4cdNYtLyxH7N20DgNG/ZtExv2U5iH7MIWeHbyJ9iyJwo/Jx1BSL88JKxYjX2WAoEaGrZxLO1R7IquhbsF92Z2UHHS2loQZsanP6Fv377yeYVVsn0l2XY+kzfPw5IrbTFuUiCcwkOwMrz8Pzb0vXi4eQucPX8RS1etwbzzeTLI0aiO9npqPv669Av5Pg5yMMYYY4wxVrNQXT6jWV1M65zg9khbuDV2gUvph3tbeMvM/iry+gvG/UXsJy4E4//+BcK++gLjpy7FZfHZo0f/xcIQf8sobkAjQiqq2gIdFHAoXXyU0HCRygxXSUlJQXR0NPR6PSZNmoQXX3wRvXr1wqBBgzBw4EAMHz5c7peKL9L7TIELW5kXQ93u85pZvY4juGTPISwychWO7f/8ClFnrVWeqKgOePnNfnCKW4gpS8ORnJaO5ENL8T9/9kP3WeXV6MjGvpBeePQxf7x76Aqyb1xBctw50QGB/t40TqMq+zZnw37ObcZwPz88GrwZCWnZSL8Yh3M0lqOFL7xd6Q2WUTYDZSis/q5LUbDjdsYlmcVhcuNaEoI/zcL3l71kkMwmTvQF/wabNoYj9kpepdtXkg3nIW0HFoTEwYkqFL85QQZTNv1jKaLKGMd28eJFma0xpb06Y9HB8G/hdSC0RJBjjDaEhYerMMYYY4wxVvPo6zvDoI1W+O254NkF2zFngBsufyPufd5YiH1p4l7oozDM6Wd7ICU75xbqa5MpVES1BTpKBzlMU8hWpvAoBTlo27/85S/405/+JJebN28uX6MpMy9duiSzRDp16oQXXngB165dw5o1a+TrtqIpZykIQzzrNilRr2Nbupxn1C7cnpmAab4uiF03FaNWH6tAoKBsbi+uxM7ZPXF5wzgM7NULA8d9gctPzMbOBYPKqR8hOuC71AGz8a9x/fGoX38MX5eA/m9uwnvPqVtWft8llbufR8Ziw8pAdIwNwZBe4sZ/4FTsdgvEws/HomM5qU3mwY7Zm2ojNdcNdwsLcCEpCbfy6+Lvn+Uh7oq7fI+tN/pdR3wIf/d0hIWMw5SvzlWpfebKPg/Z2LcwBEfqv4BlU6l2ihtenvsuul75Au8utz5Ehmp0/L31bUx89i7efDZTrqNgx6x35pUIcjDGGGOMMcZqpsaNGiIj03LNwt9EvQ4Ytz4KP8erw2J+/iEMC1+yPpOkJb9mZMrjqqha4gZf/QnYjqgA6a3b6ly3FODQ13OWgYT09PQKD1m5fv06cnJy0LVrV9Stqw4/oEKmFJSg4Aa9TjNKUCCEsj1o+hkKfFy9elVmlTzzzDNyG1s1bNiwaPrNJ05/KIevkKMdZsKrbokKoFVDtUtkxoCd0fCK7Dw4ubjAqaLjnvKykX1bNMvatlXZtzkb9pN3Ixt5Ti5wqWDwjjJzaGjG0sXvY1ifutgdkYGLqXlyuAplclQqm8HCtaps+0qw1/kUaCjKx83P4uk3O+NuqgGhe+7ikzP1cDXlArJ7PKfOxrL//9Bw7Sz88MMPPKUsY4wxxhhjNUxu7h2ciD2F3k/4yfvi6nT422g89STNKFq9Ir47gW6+nSqc1VEtGR1Gs6EpTo7qPL4Gg6HCQQ4afrJ3717UqVNHPvLEDSdlhFAg4/jx4zhx4gSSk5NlYIJuYOn9FEyh5RYtWsgbW1OhUVtRO01eMsvq+Jcdszqk6ghyEAcnObaqUjfOdONe1rZV2bc5G/bjROPDKhFEoH5ANTsijsagYbtxCP2/fTLIVpFMjntYuFaVbV8J9jqfAtWu6ePhgKTP4xH6+TnM2P0zuj/WGRtDN+DRtHhg2vMyyEHngYMcjDHGGGOM1TzOznXh3vQhXEgxn1Xi9+vchRQ8LI6nMkNX7J7RQbvLuaUOT6lduxb0olGUWUGZFxX9qK1bt6J+/foyK6R169ZyHWVcUDCDsjwosEGZHbT/bt26oVatWkUBEfplPzY2Vv6S3759e7mtrVxcXOTnEvOsjqiOs9DSyeZiDIzdN9T3CX0/aBaaefPmFRUcpe/C0KFD5fAWLkLKGGOMMcZYzUWjH07EnELbNp542O0hba39VXdGR/qvmUg6dxF+j3WCk1bvsyLsntGRX1CcteFYR83moCyMigQ5qMZGWFgYRo4ciREjRsi0m4iICBncIBTMoHocP/30k3xQIIMqzFImBwVFaNhKWlqa3O7s2bNym4owryPyhL6N9gw4mkWVJxl78ND3ix4U1KBMJvOABmWyUCYHBzkYY4wxxhir2eheuUN7byT8lIRf0n/V1v6+UJAj4aezaP9Im0oFOYjdAx0UQTJxrKPm5FP9DFvQjdq5c+fkTdnLL78MNzc3uLq64n//939l1gYFMWh2CQp40C/Yr776Kt588015I9euXTv5eOSRR+SwFSpWSoEOGuJCGR4VQcdg2iagiR+GujyKD9z90a2up1zHGGOMMcYYY4w9iBo1dEHXRzvi3PlLSD6fUuESEr8lGq5CmRxdOrWHa+PKzxbpMI9y3O0oVwsQONSuDSedTk75al73whr6JXrLli1wdnZGz5495b80fISGp2zbtg1XrlyRxUibNm0Kb29vWYC0SZMmcv9Us6NZs2ZFw1YosEKPhx56SL7+66+/wsfHR/sk21AghT6Phqr0reuNdrqHoa/lJI+JMcYYY4wxxhh7UNWt6wQPdzc5C0vimXPyvphGu1MygD0KlVIdkNZeLbWlyqMgTFa2AVeupsosDooDdGjnjQZ6tZREZdm1RkeBaOTtXHUaSyedowwKUJDDNOTEEgpwJCYmIiMjA48//jgaNGiAX375RU4hS/U1aPvvvvtOBjxoOIq/v78MQnh4eMh/KRhCJ8OUNULLFPg4efKkDITQ0BXaH2V/6CoQpKCLT0EVkmc0Fk2XW8+5LurYoWMwxhhjjDHGGGPVjWZjoWEsN25mwXArVwY9qoqyRm5mZWtLlUNVBqkERf36zmJ/DdH0IVfxvKozPqjsGuigYAAFBUi9unVRp44DMjMzrQ4dOX/+PPbs2YPZs2fLAqA0PGX//v1yiAplbdA6CmBQIIOmxNyxYwcmTJggMzVoWAtdIJpSlqaZpQAJBSdoH5cvX5YzslBggz771KlTcHd3x0svvaR9sm3oMyhLpKCgELfvmAI4OhnEYYwxxhhjjDHG2IPHrjU6KMhgUttB3bW1aBFleZw+fRoLFiyQM0VQdgYFJfz8/DBgwABZd4P2R8EOysygYSSU1kKzt1DwhIIZFCihwqMU0KDhKbTP1NRUWeejS5cuMkBC23fs2FEGVIxaEMZWpnojpmMh5sfIGGOMMcYYY4yxB4tdMzpu5eaisPCuDFo0qK9OK0vDRiyhwMPgwYNl4VDK2qCsjIMHD8rsCwpIUPCCsinoQUENCjpQsVEKgLRs2RJt2qizoZhmSKF1FAShmVeongftgzI8aDsKhlCdj48++kgWKbUVZYlQxgihKXPpVDk41EZ9Z2e5jtmf0SCuvf4+1UHJNcCo00N3P0ciVfUzCw1IOZUAo0cP+Lhr66pBviEXjnru5797uUbAmesKMcYYY4yxPxa7ZnQod9WYCQU6SFnVXak2BwU7Fi1ahDFjxiA4OBhbt26VtTooOEHZGfQeCnJQAONPf/qTzOygqWQpiBEXFyenoSUUkMjKypLP6TNbt24NT09PZGdny/WUAeLl5VX0HluZt990TKZjrJw4rOofgE2J2qImftnTWHVSW7AmMxmxyZnaQhnSwjBzWZy2UFVp2DNxMvakaYvVLhm7goKwrYKz+MYvq0wbDYj4MABLI9VCucarcYi/asr4sfdxi+s+MQyZZX6mLcT2IUFYdSINOXQDW23isXPGPHx1Xlt8QKXvCcH/i9UWSvlpTQgO2Xz96Hu5Qhy1ucr1gcxdk8v9Llf8uqus7rswDdEfBWKA+TGkH8WqV4YicFwQxg4XfSbc2t8OU99kjDHGGGOs5rBvoEP8R0xBgbKGedD0sU888QSGDh0qMy0+++wzfP7555g/fz5ee+01OYSFhqPQcBYatkLDVI4dO4Z9+/bJeh0UELl165acbjY+Pl5mgNAQmJ9++kkGOEwZIFSYlAIkNHzFWq0Qa8zbXxTo0I6x8gzY+L64IbFtxt1i5/fijT0p2kJN5Y2R2zdjpLe2WK306Pve15jVT83YMRwPxabj1X27V9XPTMLZ430w+nV/dG1dnb/Sd8LIzxbhBTVpitmZfftaIjYFLEGqfxCGaWvob0zEiuXAlM3YvHkzvtg+B022LEEERzMYY4wxxtgfhH0DHVoMQA0JlI2qqz788MOyhgY9pwKkpgetf+GFF7Bw4UJZRJQCDqbpYpOSkpCcnIwzZ87IAAdt36pVK5nlERERgU6dOsk6HV9//bUMhtBQFaoTQkERek9FmI/qMR1T1Qf6DMbsMWlYujYOFltDv8QGBWJsYCAChwdj22mDWLcXiz7cC+z/UKwPVX+1NSRj12z1ffSL7aL9Zj89G5NxYK62j1dDEHFVW1/GNpnhSzD+FXotAIHBoUi6Z0ZgA+KXBWLmjkvashlLbS5r/ckVmBkahk3B2ue9uhbx8iXzX9ENSNk2F2OpTa8EYHzIYaSaEmyuHsaiVwPU45gbhosWTmTS6oDiX7/F5w0YuhZJcsGI6PmB2HXBLJPmdChmbEpGzKbpGBuyV/t124iUHeLzqe1DA7HIYnqA9Tam7g/B+OHqsb8XVpyiYv0zxfldHaTua3gA3hbnueRhZSIi5EPsMu7FQrHPbafVTJZVq9XPp2Wr15fO9+otWEXne/hQjN9yFBEfTcZ4ce4HB4j+cc+hpeHQO6aMiFyk/PtjzJg2SzymYs4nEUin+F/aXsz/dAO2zRbrxTrKlcr6bh3m0PtmTMUb72xDsjqqDLh9HvsW0HrxmDILK0znMnYd5m/di23v0L4nY8L8vXLfyaFTsSa6uLZP8qapWPFtrthPPHa+I/ZN+3lnM06ZT+Z0NQIrxOfKz1i0Fyn2LKVDWVIf7Sj+Tg2fiwNF36lEbAsWfZjOefBaRJkljRnFNZ4irqW8Hq9o21jqa9a+J2Xsu5gnRm78GMPaNdaWSRLiI/ugbw81oAYHb/QdkIrYU2qPstY3SyhMk9lDgbJvB2L8atPfKwOSQoNFO2n7YGzaFVqcQVbW3yTGGGOMMcbuJ6rRYS9ZOQb5uHU7Vy7fuXNHuXbtWpUely9fVsLDw5XVq1cr06ZNU9544w1l1KhRyqJFi5SXXnpJGTt2rDJr1ixl8uTJ8vV33nlHmTlzpjJjxgxlz549ys6dO5UPP/xQWbVqlfLFF19Y/Axrj4yMDHkchI7JdHyVF6us7LdcOa3kKFHvj1JWfp8j155eOkA8p2cZyv7pY5Sd5+VqRck5pqwc8YESc1s8/3650ntprLpeOLtqjLLymLq9UpCi7BwzRwm/KZ6n7lZmDPpAidJeUq5sV2ZM/1p8Im0zQvnkiGmbVOWrCeKzUsTzjK+VuWM2KxcL1Jfyji1WRi2IVPIUes8k5avUHOX08jHK3J2p6htKUNu89WdtMSdSWTlrtyLOXtnHMmKNctbq54mVp9YowYuOiXWqixvHKCHfUNtpv+I9V9T19HmfDNK2MSc+Y9SaBPn07JpJygyxX9mWAnEN6LPF0+LzLva6U7yn6PioHf7F5zfnkLLQX92mBGttpPM5YbtyzXR8Rz5QnpqwW7S8jM+k6/Y+nQOSoZw9GKtkmHZcxNR/VLSvGduLD9zq9aXzrfUBpSBJ2Sq+P6brlfP1dLPjNklVDr49TzlIq0/9P+WtVSeUW+oLytVtbyufHMwSb/laeX/SWuVH0wuZB5RFs/6tXC1UF28dX6tMXn5CMYrnSRveVr44ThdeKDynfDnrIyWa+mrMWuXVt8OU69o2SRveFO8TT879W5m+7KjcVlF+Vra+sVI5ecfSfoKVTTG0kKVEvD9P2WvqE7eOKp+9prW/lIyklKLrVazkeVWZ9UX5nZqj7L+uviK/U2PE9RVP7/0emq5vjnJ299fKWe0l6iujlqvf35J9zUJ/1vqn9X1bYn4Mpb57si+IvkKfWUbfNJeXGql8daRkG+XxW+jzpr9LVvsfY4wxxhhj95ldMzq00R1VHtxhjgqKPvLII3KIy7Rp0+Swlu7du8uMDqq7YSouSlkhVNPjxx9/lAVKKfNDHB8SEhLk67SuojU6TMNViOmYzFZVgR49p0wCVqxFrHnmRG4i4m8ORs/W2rK+B/r2OoqYn7XlIpdwOqoJmhQmIDbqOGKPp8LY5Dji1ZQFoM+T8NN+zEXzPnjyZhxO59I2Yn99TL/yuqPXAD2OxWXCeCoOhsED4KUVyNT1eAo9w+NwVi5l4tslwVjqPAfzh1mofqm1uW87bVnfGxMX+sOjvGPp1R0+Fj9PlRIXiSbi4+Lp+MQjA01wIFEcoNxvH/iZasrqu+OJPtpzcx194Xc8Dil0rk51xLgxPuJY04AzJxDfrw98tLdZ5yn6l3au9I2hzzKi9MAna22U51N8hkfR8T2JIepT6xp6widhDRauDkN0ohFe/XzhasPoFK/Wpmti/fpKzd1FrxMc9NA3dBUPuRZ6N0/1iRXXEk+jUWMg+cT3OCUev951wY9J59QXG7aEhzbNdX7iGdx64s9opv1Fqdf9cXSLP41knMdPiS5wQ7zc/tTJDMDlPEy7QPOWcNO2aejWENeui2vUpjsGpP6AU3TCT3+P6Pa94OdE+2mJbt20Aqm128DP10V9nncaibfF9Tb1iXrd8XgH7bm59DAsHLcYEenackV4d4efm/acvlPOkYhPp3PeET27mc65J/z6ma6HHj5DBkB/6Tiid4Vi/a644owkc9SfU73glKL2odhTOdDpEnAmrax9l8cVA6f4I/bNQLy3ZAneG7cCKR5iWwedzX1T594bg7oYRN/ei10rQhGRIk6zaD/1+U59e8DUNb36DMAj8lk5/Y8xxhhjjLH7yL6BDm2ABwUYiHmgwF4aN26MESNGoH///khLS5PBDScnJxn8GDJkCJo1ayYLkdIUtRTcoOEqNAtLenp6haeGLRHoMB2TTQNzbCBu/MdN0mHVsqMwz8CvrEde/ABDqqWmggEefUeh66Hl2GNK1/8teL+ET4d4aQs2cO6OJ9ocx+mTcTjm0x0+HX3hcULcVJ48jk7dLd0F20FF22jO2RfjNm/AuH4NkEHDiAJDkWTpxvi31rYfpg5qqy1UjtfTQXjSFACzqCX8ev+Kb49mI/nkGfT8s6+2vorc/PHRkeUYaApYVKtkbAsMwqZTt9Cgy2C8MnoA/LRXyuaKnhPGwE8LRFVac3/M37kBU//2OmavF38bPHXw8XTVXiyfITwEI2btRSq80HP0JAzrpb1QWq7BLn+/GGOMMcYYsyf7Bjpqlwx0UDZGdfH19ZVBD6rJ0atXL1m/g4IeFOygKWkfffRRWZiU1lOA45lnnsGdO3e0rW1j3v6iQId2jPag6zYGb+rX4O292grnDujUKBIxReP/jyMiqjf82ovn9XTwKKox4onOvTKQ4dARXXv1EI+OaJCVBqOpuZHfIsaUKXI1Et8W+qCVM22TgOiT2guFaYg6ZMATvq7QdfGFPjyy6Bdn4/HDiO7nq/1S6wmfboMxcfEAfDt9hVZLw8w9bT6KVRN3IKWsYyHhJ4pu5Et+nsrLtw8y0oBO8vh6oFODTGQYdeLzPOFVaL7fEzgWqT0vQYfO3RvgvyvC4PFYR7HdY+iKzVgV6Y2eYrE0nb4BjBUMLFhro66ND/JKnM9vsUd9WoL5ZxovHMauqEx4dHgKQyZMw4v6OJypUOaB9etbFc06dMbNG5TQ8Di6iIe3cxbSLdREcezQDvVjTqj1O4TbJ77HyU6d4Y02+FOHbKSjk9y+S/dOqJf1K/LL+cvj9uc/Iz96A/aeaYdunWlNSzTz/BknT2pVfO+eR0xctvrcyROt7sYV94nbJ/B9qZmNyuaFTj0iRf8069yXxPcm3RedTUkUiUcRY0pOoO9Ubh90cnNHq47Hzc75JcSEa3Upsi7hrN4fo0c+hU7e7tCdT0S0+krJvkbfE48U5HmpfahrDy/kpd2Ck0MZ+y6XARGzA7DpjA76hnroco9jT2QP9OsiPtvGvpl6Jg6D/jYJA3t1gIdeHItW78arWx/Ebtmhbl9oQOyhSGTIV6qn/zHGGGOMMVYZdg101K6l7o6CAnfFozoDHY0aNZIZG3q9XhYfpalg6Xm3bt1kcdLExES89NJLMtDx9NNP47vvvpMFSSvC1H46FlOgw3SM9qFHp9enYWTRr7eUcj4UCXO0Aobj1qLBzMnoStn67QZg5PklCAzeApp7xWf0dDQJDVILFQ4PwicXPOFl2s8AH2TMV4sC+k88gYHvj4CHWF1im8DpiB20AMNo5ILrYEz0T8R7Aeo249fqMXtS76L0dIl+IZ5ixMI5YaVS8Eu3eTuaBA8Wt45lHAvpYkT0RPXzglYDU18v9XmdR2GqWyiCZNHDAAQtvgQPT0qL98Sw9wfg2MSh6n7nZ8BngLpJafoeA+BxyQNdfWnPenTurke815PoZGqDGX23wfDZMxljPzoqbhNtZK2NniPwj0EnEKwVfFyY6WM2I0Yx8880urvDuGUyAqfOxXtB0/Ff3zEYZOtIBY3V61sVnYcjyOVrvDWFiolOxVub0tDMUxsyYq7x0xjT7zyWTqX3zcK7u+oheOzjcBQveb/8Mhp+NVctIjplLjZccUez8jIWGnfHk45nkNqtL9RJeBzhN/Z/4fivWep+5oSj3qOmE9QSz07qjlMLJqvFSJdlo9Wj2ks2cUXft+ehySbxfaHim+Ja+s9KxPNLx4h+rPF2x8Ul6vUMnHwCT77jL75TOnSd9BZ0y8Q6OufjwqDro2ULNeyOYV32YkaQuJ5TRR9I1BdldJTsa6W+JwGTccDBG666MvZdLj36TgpG6iJ1n4Gv/hse00epQ8Vs7Js+Q8Yg9aMAvD13LqZMPIQMU7ZYh9cxf0gSFolzFDhuOXK6+xcdV7X0P8YYY4wxxiqhlriBV+/g7SDPmC8e6s+99erWRZ06DnKKWJr1pDr897//xdWrV2UQ4vnnn8fBgwfh4eEhp5GlGVkGDx4MGn5CmR579+6V09SGhIRoW5ePpqWlaWsLCgpxW8sGcRLLTjq6fateRoMROn2JW3/LjAYYHfTQWYgpWd1HrthGZ2GbQiMMRh30FgIBtrD2efesP7kCfY72RuQU3/KPs4w22XyOqpu1NtL6QrG+Ik0s43razNr1tRnNurIBmDQHA5pqq+7mi++A+F7XK6fvl/W+vFzk13aGYxW/PvmGXDha7KT54jWI16rwAeL8Gwr1Ja8lzbryPjB7lT/0tvZxE9ofxP5s6QNWrluV+jn9PRZ/s+5hY980ZonPbljyTQaxTm9ad3otAg51x3bxXS5S5f7HGGOMMcZY1dg1o8PBoXh3hXfVn/2pSGh1efzxx5GdnS3rcFAw5fr16zLoERcXJ6elpYyM2NhY/PLLL3IaWpq6tiIoyEFMx0LMj7E62XxjU8YNhdV9OFvZxqHyQQ5i7fPKOpZyj7OMNtl8jqqbtTbS+oo20R43iNaur02y8dPWDdhXxxddTEEOUtux/CAHKet9TlUPchDLQQ7iWLUgBxHnv6zvQIX7OO3P1j5g5bpVqZ9bCnIQG/tm6SAH0g5jVfBkrNp1GLF7Q/He4uMY0rfUWLAq9T/GGGOMMcaqzq4ZHSTboA4PcahdG/XrOcu6GDdu3JDrqsOGDRtkjQ4KqJw9e1YWJqXMDQpwUEbHl19+iZSUFDlzC2V2zJkzR9uybLQfV1d1fPmt27ko1AqZuujry39ZFVQxc4RVL8qYgPjuOt6fmN6Dj/qrOCX6qgQcahJxPqiGR2peE7TqSMNstPWMMcYYY4w9IOx+K1NHq2tBgQEqAkoBg+qYfcVc/fr1ZVYH1ejIyMiQw1moZscPP/yAFi1ayCBHbm4uGja0fSoDCpYQOgZTkMN0bKyKqpg5wqoXZUxwkMMM9VcOchQT58OjQw909eUgB2OMMcYYezDZP9BRp472DMgvKJRBDmfn6rurpeElNPvKtWvXZOZIu3btZF2Q1q1byyKlNGyFppulIAgNZ7GVKdBBx2BifmyMMcYYY4wxxhh78Ng90OFYpzjrIb9ALUJanYEOyty4cOGCDHZQ0MPLy0sGV2j9ww8/jPbt26Nly5bIysqSmR22qFevXlE9D9MxEPNjY4wxxhhjjDHG2IPH7oEOCjI4OqqZD3fvKsjPL5ABCBrCUh0oy8LHxweXLl2SmRxbt25FgwYNZH0NGrZCxUop26Njx464fPmytlXZaCgMobbTMRA6puoegsMYY4wxxhhjjLGqqZaR+DqzqRXytKllaehIdTl//rysy0GfceXKFaSnp8usjDZt2iAzMxO3b9+WhUrp3/LQdqYhKqa2E/NjYowxxhhjjDHG2IOpWgIdNOOKoxYsoGKexvx8mdVBQQR7osBFs2bN0KFDBzzxxBNyXb9+/dCqVSvk5OTI2VZoWEuTJk3kMBYazlIWGq5C2SCE2kxtJ3QsdEyMMcYYY4wxxhh7sFXb3buTrjgD4k6eUQYNXFxc7FrQk7I0qNBoQUGBnFWFghRubm7w9fWVQ1kSExNlcIVmZKFAiylwYQ21j4Id9D5qs4n5sdiNaNMDo9AIY9kxIMlqk23cvlIepPP0B2E08DmXtGll74fMxOOIv2DQliyg75itl+U+trssFe5H1G7ueowxxhhjv3vZ5+IQdTQR6do9YunlvJSSy9Wh2gIdFDAoHeygGhcVmeK1PDR9LBUaPXfunNw3ZW1QgIOCKRTY6NWrF9q2bSsDGJTZkZeXp215L6rLYSqaWjrIYSpMag/G06GYMjwAY4OCMHZ4EBbtT9Ne+S0YEL8iEP4BQRgfEIApoYmwdJ9hPLkW418JxPigQNHutYg33Y8VpiFivjiOQLF9YADGhxxG6j2dNQ0HJj+HPsvitGUbiX0fmDEU/q8+COfJXoxIjYtDqh1uQjN3TcaAoeJ6BIrHcHGeJociqYz7ZEvilz2NVSe1hSLJ2CX65rZkbbGaxS+bjD02XtoSx6w9tp3WXqwOyVsQHLQFKdpidUkJDcDcXWlINVi4gIWXcEB8x/zFd2D8q/R9WIA9Z8q50ObtzkxGbHKmXF2aPfpQabRPtU/Z0o8ykRKVLP4KqQzhH2LEh0eLlquN+NsS/VEgBvRfgXhtFWOMMcYYs5OUzRgzMACjRvuj+8fiHjBtB6aYlmfuR3b2frw7RFsO/grp2mb2Vq3jMZx0Ojg4qB9RUFiIPC2zwh7BDhqGYhA3BjSFLA1NoYKjFOygDI7vv/8e3t7eOHjwoAx63Lx5U9brsJZNQoVSKRhCqI3UVkJtp2Owm9yjWPW+AX/bvh1fbN6ML7YvQMewOdh1SXv9PjNGLsfC3EnYsZPasgbPn1mAbYnaiybU5o+AqdRe8fjsdQMWhqpBC8OhFdjUfA6+2Cpe27odU93WYFepeEZm2AIcKPTWlmyXumMODnRfgzDa9/bp8AhdgQjL92u/I5mI+TwUMVnaYhX5jV6s9qOdu7FlZCZCVhy1GKiqGG+M3L4ZIyt+ye6LomPWHiM7ay9Uh3ZjsHnrKHhpi9UjE2fj3PH83/wxsHPp6a8NiP4wGAfazUPYbvqO7UbY+z749s3liC4rGmDe7vN78cYe66Ga6ulDxJZ+lII9c/fiorakH/Au9r7bG/ar5mRA/LbDSNWWVInYFLAEqf5BGKatYYwxxhhjduTSFC3VuT3QtaET8uo1RFNt2dvNTdx7N4CLdovt3eIhVM+UJdUc6CB1zWZbyTPmy9oXFIwwBRYqi4IcnTt3lgVIadhKly5dZFYGBTsoy+Pnn3+W9TroNarl0ahRIzkDS2kUeKGpaQm1jdpoYt52uzAakaPTQ60CIji4Y8iqDRjmqS5mhi+RmRNjAwMQGFz866q19fRr+KrVczFWvCZ/2U4/ilWUdREYiMDhwWKd+sbMPXPxtoVoSnx0IoaN6AHZzxxcMfBFX+yJLBXp0HXHuA1j4KPNrKtr6g4nLWtDP+gDfDGm+E5G56wrma6eeRgr9/TAxNE+2gpbpSHmkDdeHKLd+Dl0wMBhGYg4ee/dnbVzY+1c0DnbtGUJptD6ocHYFX4YSydS1shzCPzHYXHbKaSFYeZHW7Brqtj+laEYO/8worfMwHixjf9zYl+J2jFa+QycXIGZoWHYFKxu7z8jTGa6xH8+HeuTk7H+zUAs2is+ibJWZqvbU9bKqsjKR3L0PXrD70qG/DW8KGuI9vvKXBy4qr7nnv5iJnXXZIxddhwG0aY9E7UsCyvHQUxZPvK8z9iBFJmlYkDKNnX/Y18xz/ChfS7BnjDxmjzvgVhvupb6Jmgg+5a4KV0trgNtK9r+9o5Ltt9w0/WavwKb6FqE7BXX0Fo7rPWXTESE0Dr1Efjc0xiwgqLPYr8Tw9Q+Uca5SN0fgvHD1W3fC9uBVaZtzBmSscvsWpsylOI/n4yVZ8z6hLn0Q/hP6uuYPUL7A0E8R2D2Wx4wXKWzY0BSaLDoe9p+Z2ttMrU7fS8WfbgX2P+heD203OwF8z5k698WGBKxLVicS/r84LWIKgrimfUji9eDzvmH2IO9WCi2lZ8hznFR5lcFv1uWGXAxMgEZ2pLKEyM3foxh7dS/+YwxxhhjzM4aD8KykzH4MSYG//daBzi5DMJCbXnPDF84OfXEnCht+e2eqFpUoAzKfWDMz1eycgxFD6MxX643GAzKtWvXKvU4fvy4EhUVpZw5c0YJDw9XDh06JP9duHCh8p///Ef57LPPlHXr1ilffvml8sknnygzZ85U3nnnnRL7yMjIUO7evSvbQm0q0UbR5upwbfd05S/+k5RPNn+tnE3J09YKGV8rc8dsUC4WqIt53y5WQnanaus3F68/tlgZtSBSoS1PLx2gzNgu3iNlKPunT1K+uqIt5kQqn4xYo5wVT/NO7VZ2fp+hri+Sqnw1QbzftDm5sl15Y2mstmBBgfiMWaOUdbFm7VZylNNblyvr3p+kBM87pFzT2knro95/Xdl5Xjz9frnS29p+U5OUazna8yKxysp+y5XT2pIkjnvGTvPGCtbOmTwXY9TPJjnHlJUjPlBibqvnbO7X2rn4eYMSNMq0vXb+aPPU3coMf3Hu5HpxHO8MUBYe1Bp5ao0yQh6L9fMtj3fC9qJzcXaVv7LyGD0rdc7F+4I2pqjPC5KUmG9SxKeVcjNFuXhde24mY+ekEuejuF/kKGd3i75l2pFo76jl6rkv2V/U5ZXfq30yWByTelXN2ljmcXygRInzSXJOHVJOp4qt6bPeV/smubZd9ImtdHz0ftpWaxRdt7+J/apLKjrnRdtmKGcPxioZ5t1MoGMOWvy1EvPdMfURm6q+X16vxUqM2TEHLzpW1I6LG8coId+IF+lzzY4n78gHyqg1CeqCSY7oe6+Lvkf7ov1O2C1aI1g7Fxb2+ZRpGzNnV41QPjmiNbCAzofon/LSl+oT5sr63pCbCcr+rxOKjpM+Yx29vXS7rezDeh+y/W/L2VVjiq9rQYqyc4zap0ocl+wXh5Qc7Rxd3D5dWXeMPqXU97yorda/v9b7pLkM5aLsI18rK0dNV7bK57HKNa2/qiz8jWGMMcYYYzVGtWd0EJq1xHwISG5ensyeoAwMyqagLIyKio2NlbOtUDHSixcvwsvLS+6Hpplt0aIF+vTpg6NHj8LDw0MOlaFZWMzRZ7u6usptqC3UJhNqq2nWGHvz8P8YYdvnYVgHIGZtMAK1XySNp+JgGDwYXqbMiT7T8A9/d239gOL1PZ5Cz/A4nFUX4dVay3rITUR8qhecUo4jNko8TuVAp0vAmTSxTWd/DOvmqr6v0qiex2Qc6L4Y43zNh/Po0KRdd/j17INWKbsRcUb9Hd54fC02uU3GsNZy0YpMHFgQjKWHKpfJYO2cyXNxczB6mj5b3wN9ex1FzM/qooebdi4auqKJeKgZBa7waC7Xqpq7o4lcr0cD8XZ9Qy2h3s0drejfMs635OMND61dTdw9kXLV9IKZFp5osmsBlm7Zi/gLrug6yPOetP34TcEI2lZqPJAmZtN09Zf8wAAErQYm/q23uBp6+AwZAP2l44jeFYr1u+JK/OJd1F80Kf+agaATg/HxFF81s6c0i8fhilbtE/F5yFrsOZSInHZPoZO7Dilxkeg5kNqg8ugzAA2i4rTsBk/xHdWOztUdHslpJX9pb+gJn4Q1WLg6DNGJRnj184WrxQZZ0dwbrbTdUzuaiMOMp+siHhloggOJSbK/pLbRI/W4uj7e4ASnU0nF2ReUzTJnCRpMnoROlsZPWDgXsg/261O0XtfjSQxRn5q5hNNRog/20Xbq4I5eA/Q4Flexfp+5N0S93kOfw8xd4jo07ICB/fRIiTqMPZ+vwK44Q4WLAlvuQ6ry/7bQcXVEz26m4/KEX7+S/Yuo/eIp6LVz5DXiY4zrUcbFLef7a9N3izHGGGOM/aHdl0AHoaKepYuTUj2MunXryplSqE6GrW7duoX8/Hw4OjrK7WnWFQpu0HoKfGRkZMggx8svv4yTJ0/K91Ah0oceekgWFqVhLOY1OUoXHzVvZ7XQucLLdzBGfrAB77YOvaeuhX24oueEMfCzWg7FHc28MmE0L4x55RKuOVu+Dqm75mAppmH+sNI3Mjp4+PZA1wEjMGt6R+zanyDWJWPXkkg0yDqE9StWYP1/xAHG/RvrxQ27loCuccXA5QfxkX/pIIwHvLxzkGPWttRLSXKY0oOrvPNtgbs/Ptq5QAa9zm6ZA/9/HC51foBOk77GoUm+2lJJxfUqtmPzxmno6UZrk7EtMAibTt1Cgy6D8croAfCT77aiw2CMy9mAjRaGBVmnE+3ajM8m9UGTrEisejXw3touFeXsi3GbN2BcvwbIoOElgaFIsnDT3qS1L7r2Ev2NHr7uloMzpXm/hE+HWKi04dpb3Nj30IJLRsSvno5v+y3GaHE9Ko2Gp2lPq8zLEz1PJRfVmHAd/K683v8Y5qp+F85swdigUJzObYzOQ8Zg5KCKF1ax3IfKU4m+fl+Jv6+yj/jCq6EnOmnPPdRa04wxxhhj7A/gvgU6CGVKmGd2UD2M27l3ZFYFZVdQ5oWDg/ZTXRkSEhJkEINqfRAfHx9xf2GU2SFPP/203Mf169dlHQ8KflBwgwIh9BoFVWh2FZpClj7bvCZH6fbZXeJaBEzcUfwLe6EBv2bq0EAchq6LL/ThkUWvGSOXYOa25HvXHz+M6H6+eERdLObcAZ08UpDnpd0E9vBCXtotONHpzLqEFAvlbDv17IBdO46rtRAKM3HgP3EY0ke9y8tMLq6RkBo2A+9dGoPPSv3qn7R2KGbuKP411ZCaAZ0MlIgboSlvYWTv7vDzE492TYCmHcS/HrbdmMIdfgOS8R/TdByFiTiwqwn6mn451lg7Z/JcNIpEjFabAobjiIjqDb/22rI9lHW+rdKjQQNxVrX2GuJ24MAZvQx6DXt7DAZFJhQVZqw0ca3P6v0xeuRT6OTtDt35RERrL1ni1fkpDFswDVgyB3tM56s8xkuI2HIUhuYd0HPY65g4TI/Yn9PEcfRBfITWn4TUyEPIETeYtuQSGS8cxq6oTHh0eApDJkzDi/o4nKlkCWZqR4boOuoNbg90apCJDKNO9heP8wZ49NCumVc+rmnxHao5sip3koVAXtl0XZ6A664diNVqU6Qe2mvhfHuic68ERJuCSYVpiDpkwBO+5ZwZtwF4sU0olu4wq6+TLs7THi/5XTCkJKKBOP/DBogbetHsa6ctRJvq6eAh/jZWidW+7o5WHY+bHdclxITfm11Rul+k7JiBVZG0jRMaNDTem4Vit++vHq36dIT468MYY4wxxv5g7mugg1C2hHPd4qwBmuHEcDu3qEhp06ZNZbaFtRlSCBUVpfdRoVHK5mjVqpXMCKEipK1bt5aZG+3atZPLWVlZ8tfP8ePHy6EuFPSgz6LPNM2uQqhN1Z7J0WEUPu7zA2YEqEX2xgYE4T/N52EkxRZcB2OifyLe014bv8MV44Z437t+rR6zJxWnlxdzxcApQ5EwRytCGTAZBxy8Zfq/teEPuj6TMdt5BUZQMcOAYPy33Ry1LelhWDhuMSLoRlM8X7osAdeO06/sahvUgo+Az6gF6Bo5GYFakcHgMA+8O0oejPaLqvbo4AmIm2Kbf4EXPEYswMATwfCnfQcsRuqYSehb+r7Q2jkrfS7GrUWDmZPR1a6/6Fo/39bp4fe8D/47ORBLww3QezRB7CLR7rlz8XbgCmRMGYFO2jsrrWF3DOuyFzOC5uK9qYFYmCg+U3vJKr0vJi7ug2/fXFE8dXBZdO5oVrgZk4fPwHtzg/D2Xl+MHiTutDuPwlS3UARpxTHfjhmAf5gX0iyDzt0dxi2iL00V7Q6ajv/6jgHtslJKtCMAQYsvwcNTf09/CZy8F05tqE/GYePcMFw8vqK4j39uY4qK61OYPUePXRMDECjOR4TPYAtDV8R3ZfR0NAkNUot2Bk5H7KAFRUWIrdOj51trMPDMPPjLaWAD4D/uELzef0t+F/S9XkLHPZO1/vMh4vUWMjraDcDI80sQGFyVaXKt9XUduk56C7pl4lzS+nFh4m+KhXSYUv1iYeJgDOtFQcsO6DsyCZ+Ivz27zqhvVdnr+6tHp5FPwUNbYowxxhhjfxy1qFCH9vy+Krx7F3fy8lBYeFdbAxmEcHJ0hKOjGuSg4SZ37tyR/9J0suSXX36RQ1P69u2L5ORkmaFB08dSkMRd3CwdPnwY7du3l++hYAgNU6GhKyQ/vwB5+fkym8OEppCl2VUcxGffN4VGGAxG6PR66EpnANBrRh30pf9PvbX1luQaYNRZ2Lc1Yt+iNba/v7Sqbl8W+jW6vCybMs4NzQKj09saXqmkip7v0qq6vSVGAwziRq9aD72svloo1lfms0W7jQ52Ohf3qV8YssSZNtVwydyLt98xYuoqf3G7bkEVrrW1r4LRYACc7dx/rLHSfpvOZyX6xX35/jLGGGOMsRrnNwt0mFCNDPPhI6R27VpwrOMoHg4y+EEoc4PqcsTHx8vCo5S1Qesoq4NqdVDwgqaKpcMxr/dB6/MLCsWDAhwlD1Wtx8H/J5oxVkm5idg2eQHie43CME8jondsQeqQ5ZhvmhqZMcYYY4wxdt/95oEOQsEICnbkFxRoa4pRpkWdOg7iXwfUdqiN2uXM0HJXHM7dwrsovFuIgoJCmTlSmjoLjGNREIUxxiqt0IjMCwm4eN0JHr4duOglY4wxxhhjv7EHItBhQkEJY36+HGJiDRUuLXpo6+gA6DBMD2toSIzO0fH+DlNhjDHGGGOMMcbYffNABTpMqEk03ISGppgXDK2MOg4OsrApDYOh4AhjjDHGGGOMMcZqrgcy0FEaBTuoaCkNcbmr3IVyV4H8T2s5xS8ov6NW7VqoXau2HJJCRUYpyMEYY4wxxhhjjLE/jt9FoIMxxhhjjDHGGGPMFlysgjHGGGOMMcYYYzUGBzoYY4wxxhhjjDFWY3CggzHGGGOMMcYYYzUGBzoYY4wxxhhjjDFWY3CggzHGGGOMMcYYYzUGBzoYY4wxxhhjjDFWY3CggzHGGGOMMcYYYzUGBzoYY4wxxhhjjDFWY3CggzHGGGOMMcYYYzUGBzoYY4wxxhhjjDFWY3CggzHGGGOMMcYYYzUGBzoYY4wxxhhjjDFWY3CggzHGGGOMMcYYYzUE8P8BW/mlZFyr1BwAAAAASUVORK5CYII="}}},{"cell_type":"code","source":"# Install tsflex and seglearn\n!pip install tsflex --no-index --find-links=file:///kaggle/input/time-series-tools\n!pip install seglearn --no-index --find-links=file:///kaggle/input/time-series-tools","metadata":{"execution":{"iopub.status.busy":"2023-05-23T09:30:47.515243Z","iopub.execute_input":"2023-05-23T09:30:47.515812Z","iopub.status.idle":"2023-05-23T09:31:12.433526Z","shell.execute_reply.started":"2023-05-23T09:30:47.515727Z","shell.execute_reply":"2023-05-23T09:31:12.432146Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nfrom tqdm.auto import tqdm\nfrom sklearn import *\nfrom sklearn.utils import all_estimators\nimport glob\n\np = '/kaggle/input/tlvmc-parkinsons-freezing-gait-prediction/'\n\ntrain = glob.glob(p+'train/**/**')\ntest = glob.glob(p+'test/**/**')\nsubjects = pd.read_csv(p+'subjects.csv')\ntasks = pd.read_csv(p+'tasks.csv')\nsub = pd.read_csv(p+'sample_submission.csv')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-05-23T14:02:50.558365Z","iopub.execute_input":"2023-05-23T14:02:50.559070Z","iopub.status.idle":"2023-05-23T14:02:53.431681Z","shell.execute_reply.started":"2023-05-23T14:02:50.559009Z","shell.execute_reply":"2023-05-23T14:02:53.430149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://www.kaggle.com/code/jazivxt/familiar-solvs\ntasks['Duration'] = tasks['End'] - tasks['Begin']\ntasks = pd.pivot_table(tasks, values=['Duration'], index=['Id'], columns=['Task'], aggfunc='sum', fill_value=0)\ntasks.columns = [c[-1] for c in tasks.columns]\ntasks = tasks.reset_index()\ntasks['t_kmeans'] = cluster.KMeans(n_clusters=10, random_state=3).fit_predict(tasks[tasks.columns[1:]])\n\nsubjects = subjects.fillna(0).groupby('Subject').median()\nsubjects = subjects.reset_index()\nsubjects.rename(columns={'Subject':'Id'}, inplace=True)\nsubjects['s_kmeans'] = cluster.KMeans(n_clusters=10, random_state=3).fit_predict(subjects[subjects.columns[1:]])","metadata":{"execution":{"iopub.status.busy":"2023-05-23T09:31:18.128133Z","iopub.execute_input":"2023-05-23T09:31:18.128616Z","iopub.status.idle":"2023-05-23T09:31:18.275319Z","shell.execute_reply.started":"2023-05-23T09:31:18.128571Z","shell.execute_reply":"2023-05-23T09:31:18.274214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create a tsflex feature collection","metadata":{}},{"cell_type":"code","source":"from seglearn.feature_functions import base_features, emg_features\n\nfrom tsflex.features import FeatureCollection, MultipleFeatureDescriptors\nfrom tsflex.features.integrations import seglearn_feature_dict_wrapper\n\n\nbasic_feats = MultipleFeatureDescriptors(\n    functions=seglearn_feature_dict_wrapper(base_features()),\n    series_names=['AccV', 'AccML', 'AccAP'],\n    windows=[5_000],\n    strides=[5_000],\n)\n\nemg_feats = emg_features()\ndel emg_feats['simple square integral'] # is same as abs_energy (which is in base_features)\n\nemg_feats = MultipleFeatureDescriptors(\n    functions=seglearn_feature_dict_wrapper(emg_feats),\n    series_names=['AccV', 'AccML', 'AccAP'],\n    windows=[5_000],\n    strides=[5_000],\n)\n\nfc = FeatureCollection([basic_feats, emg_feats])","metadata":{"execution":{"iopub.status.busy":"2023-05-23T09:31:20.244157Z","iopub.execute_input":"2023-05-23T09:31:20.244866Z","iopub.status.idle":"2023-05-23T09:31:20.313669Z","shell.execute_reply.started":"2023-05-23T09:31:20.244738Z","shell.execute_reply":"2023-05-23T09:31:20.310895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Extract the features","metadata":{}},{"cell_type":"code","source":"def reader(f):\n    try:\n        df = pd.read_csv(f, index_col=\"Time\", usecols=['Time', 'AccV', 'AccML', 'AccAP', 'StartHesitation', 'Turn' , 'Walking'])\n        df['Id'] = f.split('/')[-1].split('.')[0]\n        df = pd.merge(df, tasks[['Id','t_kmeans']], how='left', on='Id').fillna(-1)\n        df = pd.merge(df, subjects[['Id','s_kmeans']], how='left', on='Id').fillna(-1)\n        df_feats = fc.calculate(df, return_df=True, include_final_window=True, approve_sparsity=True, window_idx=\"begin\").astype(np.float32)\n        df = df.merge(df_feats, how=\"left\", left_index=True, right_index=True)\n        df.fillna(method=\"ffill\", inplace=True)\n        return df\n    except: pass\ntrain = pd.concat([reader(f) for f in tqdm(train)]).fillna(0); print(train.shape)\ncols = [c for c in train.columns if c not in ['Id', 'Time', 'StartHesitation', 'Turn' , 'Walking', 'Valid', 'Task','Event']]\npcols = ['StartHesitation', 'Turn' , 'Walking']\nscols = ['Id', 'StartHesitation', 'Turn' , 'Walking']","metadata":{"execution":{"iopub.status.busy":"2023-05-23T09:31:22.752173Z","iopub.execute_input":"2023-05-23T09:31:22.753241Z","iopub.status.idle":"2023-05-23T09:37:55.034911Z","shell.execute_reply.started":"2023-05-23T09:31:22.753175Z","shell.execute_reply":"2023-05-23T09:37:55.033677Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train the model\n### Choose your model","metadata":{}},{"cell_type":"code","source":"x1, x2, y1, y2 = model_selection.train_test_split(train[cols], train[pcols], test_size=.10, random_state=3, stratify=train[pcols])\n\n#ensemble.RandomForestRegressor\nreg = ensemble.RandomForestRegressor(n_estimators=1, max_depth=7, n_jobs=-1, random_state=3)\n\n#ensemble.ExtraTreesRegressor\n#reg = ensemble.ExtraTreesRegressor(n_estimators=1, max_depth=7, n_jobs=-1, random_state=3) \n\n#SVM  記憶體會不夠，如果想用可以去把input feature中你認為不重要的feature刪除，以減少記憶體使用\n#reg = SVR()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#cross validation\nscores = model_selection.cross_val_score(reg, x2, y2, cv=5, scoring='average_precision')\nprint(\"Cross Validation Scores:\", scores)\nprint(\"Average Score:\", scores.mean())\n\n#train with all data\nreg.fit(x2,y2)\nprint(metrics.average_precision_score(y1[:1_000_000], reg.predict(x1[:1_000_000]).clip(0.0,1.0)))","metadata":{"execution":{"iopub.status.busy":"2023-05-23T09:37:55.036986Z","iopub.execute_input":"2023-05-23T09:37:55.038683Z","iopub.status.idle":"2023-05-23T09:49:23.974841Z","shell.execute_reply.started":"2023-05-23T09:37:55.038641Z","shell.execute_reply":"2023-05-23T09:49:23.971113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Predict for test","metadata":{}},{"cell_type":"code","source":"sub['t'] = 0\nsubmission = []\nfor f in test:\n    df = pd.read_csv(f)\n    df.set_index('Time', drop=True, inplace=True)\n    df['Id'] = f.split('/')[-1].split('.')[0]\n#     df = df.fillna(0).reset_index(drop=True)\n    df = pd.merge(df, tasks[['Id','t_kmeans']], how='left', on='Id').fillna(-1)\n    df = pd.merge(df, subjects[['Id','s_kmeans']], how='left', on='Id').fillna(-1)\n    df_feats = fc.calculate(df, return_df=True, include_final_window=True, approve_sparsity=True, window_idx=\"begin\")\n    df = df.merge(df_feats, how=\"left\", left_index=True, right_index=True)\n    df.fillna(method=\"ffill\", inplace=True)\n    res = pd.DataFrame(np.round(reg.predict(df[cols]).clip(0.0,1.0),3), columns=pcols)\n    df = pd.concat([df,res], axis=1)\n    df['Id'] = df['Id'].astype(str) + '_' + df.index.astype(str)\n    submission.append(df[scols])\nsubmission = pd.concat(submission)\nsubmission = pd.merge(sub[['Id','t']], submission, how='left', on='Id').fillna(0.0)\nsubmission[scols].to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2023-05-23T09:49:32.610747Z","iopub.execute_input":"2023-05-23T09:49:32.611834Z","iopub.status.idle":"2023-05-23T09:49:36.519433Z","shell.execute_reply.started":"2023-05-23T09:49:32.611715Z","shell.execute_reply":"2023-05-23T09:49:36.516665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(submission.shape)\nsubmission.head()","metadata":{"execution":{"iopub.status.busy":"2023-05-23T09:49:40.428778Z","iopub.execute_input":"2023-05-23T09:49:40.429309Z","iopub.status.idle":"2023-05-23T09:49:40.466682Z","shell.execute_reply.started":"2023-05-23T09:49:40.429256Z","shell.execute_reply":"2023-05-23T09:49:40.465511Z"},"trusted":true},"execution_count":null,"outputs":[]}]}