From effc917b5f3d9515e52511345651cc90ed8037ae Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 18 Oct 2018 18:44:25 -0700 Subject: [PATCH 01/77] Uploaded OOP files --- Object Oriented Programming/Python OOP.pptx | Bin 0 -> 443933 bytes Object Oriented Programming/classes.py | 70 ++++++++++++++++++++ Object Oriented Programming/shape_class.py | 9 +++ 3 files changed, 79 insertions(+) create mode 100644 Object Oriented Programming/Python OOP.pptx create mode 100644 Object Oriented Programming/classes.py create mode 100644 Object Oriented Programming/shape_class.py diff --git a/Object Oriented Programming/Python OOP.pptx b/Object Oriented Programming/Python OOP.pptx new file mode 100644 index 0000000000000000000000000000000000000000..5fcc108d13f29ee95d69e1005524bca3aa1e9f4f GIT binary patch literal 443933 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�w)14j=n-_XhG41mW%5?AzR-OPI>@@Z(;? z*1jG?l0#w4^S+!~|5N{q{!_vfQGN+n$KFLuQ9gNxwxi$V+%?q0gtE-0MlMQO3iD z)krJqav|Y6f6Evzu=I2=1`5=0y>v+BJS{CDQsIZF_?<13i!Q5RF9;}wU#{wfHH*+E4SF6F|>Ehwf*O;3(gv$IDE@SmA*R99mZvHMyiZ?c8P>$azP)LL} zX9nLZo@bGUx6SC;2m3`%^_efLbT7s{)_B=)(EGSo%1^cs&E>>pw2 zHP22$^}3zga|?Q8+0NfB4OK*xzw2VBEdEw&+(<-m*LD7tc&+bga!KRJ)!mF{G~nd! zP}wDWlncc$u_tT^uqYrZehH>}JA&W|VRNfJ$V733Q1En*Rv$hn1SfH*2F2yk;I=9F z2y&p>hL}sUgqtY9iF*(#Cp7k_Xj?{Q04G8mPQaOI@Nc#gv=x9#fV#$^P8VyieXsg6 zDNU&fdQU_f%OtHZf*^)4qY%E}e7pbhhhq+|1v;9if*+j${mr@}34DmJg>M zkq*m=``OGBu9o^>Mus)LQ`YTuG=l*FmMq!vI-c3z&0qO=<$ec6*r24;Li-#0u#Dm% z?8I}E>4@Q0@5q^c3su=ydU!1p8T%6I(YS~6noMeSv`d^w$WIWr;*Z@)+(9K3nljsw zy~*4v_HpGU*+D!(<69HeN`M#if@YF$BO}M=Bs@(59z^#+Sjw7sF;0Uw>TBjQn4tiK zBZpE@gk@ilH3z+RTjh`%3V`G2^?7f##uX&;E;`)t8f(w&@ zQ!_KZYsW`RE$6OdDiFZ!J)8AabO`j3M}#Bw!LV)a{A4EfvTbv=TTqEj(G&5_4F=I& zL_YASef`Yi;^!onWUJ4ozEhVSw{QyyPj|LoutS7Ti1=;Hwt)BqN5yajvNB%Lewr3l zL(F2mzXtsiX{wA>->M&9Dn~P-IdknYlnY{Rku~?R#Y={V5`L}phb1=Z578j?Pl-q| z#o*S1tj+RG!`|QNvMC5yq36r$<1&EpxZ#QRJt0dpr$67n(g1Uqyv~kfp~07p-Eh(4 zn-JdQ;90acx*qoZDmcu~CI0vZ@1<3tkoczceJ1W9W8YaOi&DzeDQY-*HbkEDm4*y| zpv1?Bk-g3@2}t;3;ftEZXc2n-W=Xftl4<W+YM7u{Ezqf^XGN zjAsoWW_-{v;;X0=7XbyES}Ohh0K4D5P>8ru4J7cnsrSb2y!a%=;$;oh)w?GVZ~h&* z>@F0Pkz?n3?m^F~rSoHx!Lh$7r?kO(Q5?q`KT;FW%yfAN+!u)=1UY4ofl!6KDfyS5_Vhs{SKVpUAdB_G1VpM!DQtpxOik0sTP@=m(! z3oJ_G#>R;7BQ%vuJ`1NnTE6RPi~X|C2W0krPjP%?Wcytfg;MJESOyF3mUXy{GYy+` zv+5({G6sUmv6_vscmzOsvsK)9+>%$5t~ru_1EqU=(pr?GqLR8^XYJrCa9t86t?Qc~ znRn~cZ^O$rs;J(LgScS$K-beG@$NwNi}wQF5meqrp-pK%-vLj2ucd>)VQ^;_4uLI`s#u8-E#3M20C- zK5XjIhRX5rtuQ2ciRQQ3L zBP)d4X??eLO*R%s_v5(pthF2R7rH}vIWeBj$5z$?7f#Ypz zF3mx62nQK_G8tz`469fu{4Bxtz27u*eqYJBDRe%-dip@#>$35BJL*Te@16Psw(Sq) z-yDInafVcITf~it`=Xe;Pi#PcuL3$NLnar%qz? z#Z616)GJs8opEH#OIPq)Fo{~c5J%Bb67%L!g}1d%>fb&2%&{X{X-8#J#vO$3Ko7KP z&389o%#%{e{>lbqXC@xusg*U+1n!8p`hO*k4t0+ZOE5jPQ0XgK;f_R&}R+ry;^MYs5Xu1r=?w_SoHY_uK@9 zD^ew8H#i27+u}VBaEzO<)tJq|CtJ|-@taJ1^2^w52imtoh+Vhge!W|=2~b5}BWK(0UeV)t-`-G< zx7zX#P>%uRcwgmsQ87!D zx{1!@d(m*Yy~?s?0L24s_8O4Yu|t9W{&hiv(>A0^*C31Uu3nz;Hdod$B53=BC#KfQ zzf^DJ`-Yya+^DHc&bqgkLCD&fyUP>`VSgjoBvFVxsUL$yOTTUBb_;@;~LbE4sr1wUazR#Ef0f(?qvtS#fdU zZ{HnDDLwUDPkleY)-nR(3pJSliZC|`xUN|0flRa!h)K(UErP1+!4mp{IiR0qnUfIP zqEHNNf8Vk;ml~NAFr4>94UBiYWj@fLjVv3Ot;y&|zaVdkvmg0L&C7!q5b>}^c@Qkz zg263F>tMv~SC@AgYL@Q4L(!YL9}hlZL582z(Y|B<2aR8P8eiD~=x zX)??v!9I&q<^H2x-+K{^2+}-z)sePG;ZKMRk8M#D-?)df8l(o0b_l}1ZtSL}cx43j zgm+%>Ce9rEl+dyeL_I6}TvZniV$kB-idX#m5NY4@g$nosT`b|CeAV37cupeJNrWn= zq{P)tSEA!~)&+fenicZLZ;Csei`LCB-Ks^apa*PFkS@dDPTN=VCSnS&zgmQMJg?q? zSrKY{`}4m&^nhSfFyN>8vcV3?Ub%UBqAbK>}Dhkrk#!nr`F)PbiE>_roayARYFOS=_ z>YEjlfj)k)<~5U)T33^?tC0L`#(8!|s;Q?FeK$#S!Kas&n&SEB$sqCR+3n?tF5A(CW3X~Ea#DUf=*#vnn#q-CiMo1)54+n0x7-KAN@vPa+T?Ha zK*W=Is}%*xo)Sx_17d&?R!?rA5?5k4TmMBa@DAcp7vFHQ?TBLH0$uE94yWXwt7_5yTV$RLqsaw96P&PD8E?GQ(8`C z=a1Q|1sjnpck&}5bOnB~Ojmm%M+gaH0P9M(13sHL+e(6 zNzGyhwiqs7BmEN-axV>@rP~N%4MCE>s zO(+uF5k0hQH!yx6>PA2r9AR!XD%^Ki*J~nhnKvy-BMfVG2ue9o@R>PDbZN})^QO#W)#uTBUhUHD zrud)+3ySyXdA~S9`~VMk3^88%rxN<7KF?!XMO#sJd_N3U@2N*lSzY{uE5t!lcksqy zS151fh$cKcTj!Y!)jvCSs-#1JAM4jSsm7As2onK83 ze%&spj=v}(HlOzZZ7uab^s%M_8vN7zwLqG9A8aZEJQnz>QzYrM(@N>QTqe-GmStaT zP>W*o{S6*<=D{{cJn8VXHF9_kb;se0OqQVH1-cKJZV)yeW>$o*JF{+@d9eY01A&HL zdkW*~1&Mb{qCzAzcY%RszhEuRSBj-Grs@Wwlm-RTpYh>sk_ZG8z5F3ZNmp zAv1Jpc#�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

H%-nr4#kjKjuDtGcH5~ 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

4+NL*&E-%qK!Mx;J+(|~{q+whc-~V0 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 IT#gC;AFS5ZqyPW_ literal 0 HcmV?d00001 diff --git a/Object Oriented Programming/classes.py b/Object Oriented Programming/classes.py new file mode 100644 index 00000000..b5585312 --- /dev/null +++ b/Object Oriented Programming/classes.py @@ -0,0 +1,70 @@ +# from shape_class import * + +class Shape: + def __init__(self, color=None): + self.color = color + + def get_color(self): + return self.color + + def __str__(self): + return self.get_color() + ' Shape' + +class Rectangle(Shape): + def __init__(self, color, length, width): + super().__init__(color) + self.length = length + self.width = width + + def get_area(self): + return self.length * self.width + + def get_perimeter(self): + return 2 * (self.length + self.width) + + def __str__(self): + return self.get_color() + ' ' + str(self.length) + 'x' + str(self.width) + ' ' + type(self).__name__ + +from math import pi +class Circle(Shape): + def __init__(self, color, radius): + super().__init__(color) + self.radius = radius + + def get_area(self): + return pi * self.radius ** 2 + + def get_perimeter(self): + return 2 * pi * self.radius + +def print_shape_data(self): + print('Shape: ', type(self).__name__) + print('Color: ', self.get_color()) + print('Area: ', self.get_area()) + print('Perimeter:', self.get_perimeter()) + +shape = Shape('red') +print('shape is', shape.get_color()) + +rect = Rectangle('blue', 6, 4) +print('rect is', rect.get_color(), ' with area:', rect.get_area(), ' and perimeter:', rect.get_perimeter()) + +circ = Circle('green', 5) +print('circ is', circ.get_color(), ' with area:', circ.get_area(), ' and perimeter:', circ.get_perimeter()) + +print('rect is a', type(rect).__name__) +print('circ is a', type(circ).__name__, '\n') + + +my_new_shape = Rectangle('yellow', 17, 9) +print_shape_data(my_new_shape) + +print(type(my_new_shape)) +print(my_new_shape) + + + + + + + diff --git a/Object Oriented Programming/shape_class.py b/Object Oriented Programming/shape_class.py new file mode 100644 index 00000000..1708e4dd --- /dev/null +++ b/Object Oriented Programming/shape_class.py @@ -0,0 +1,9 @@ +class Shape: + def __init__(self, color=None): + self.color = color + + def get_color(self): + return self.color + + def __str__(self): + return self.get_color() + ' Shape' From 5cdfb6def0f87ddc957178fbb1be2b16492b7d6d Mon Sep 17 00:00:00 2001 From: Joe James Date: Sun, 21 Oct 2018 15:24:21 -0700 Subject: [PATCH 02/77] Added Turtle graphics code --- turtle_graphics.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 turtle_graphics.py diff --git a/turtle_graphics.py b/turtle_graphics.py new file mode 100644 index 00000000..da671ef3 --- /dev/null +++ b/turtle_graphics.py @@ -0,0 +1,35 @@ +import turtle as tt +from random import randint, sample + +def draw(): + size = randint(40, 300) + angles = (144, 150, 157.5, 160, 165) + angle = sample(angles, 1)[0] + + colors = [ + ('#922B21', '#E6B0AA'), ('#76448A', '#D2B4DE'), ('#1F618D', '#AED6F1'), ('#515A5A', '#EAEDED'), + ('#148F77', '#D1F2EB'), ('#B7950B', '#F7DC6F'), ('#F39C12', '#FDEBD0'), ('#BA4A00', '#F6DDCC')] + color = sample(colors, 1)[0] + tt.color(color[0], color[1]) + + x_pos = randint(-200,200) + y_pos = randint(-200,200) + tt.pu() + tt.setpos(x_pos, y_pos) + start_position = tt.pos() + tt.pd() + + tt.begin_fill() + while True: + tt.forward(size) + tt.left(angle) + if abs(tt.pos() - start_position) < 1: + break + tt.end_fill() + +tt.circle(100) +for i in range(3): + tt.pensize(i%3) + draw() + +tt.done() \ No newline at end of file From 69824292d3ec71e8edb97eb95b38e4c95046dbde Mon Sep 17 00:00:00 2001 From: Joe James Date: Sun, 3 Feb 2019 19:46:28 -0800 Subject: [PATCH 03/77] uploaded date time Jupyter notebook --- Date Time Timestamp/Date_Time.ipynb | 424 ++++++++++++++++++++++++++++ 1 file changed, 424 insertions(+) create mode 100644 Date Time Timestamp/Date_Time.ipynb diff --git a/Date Time Timestamp/Date_Time.ipynb b/Date Time Timestamp/Date_Time.ipynb new file mode 100644 index 00000000..795b0b61 --- /dev/null +++ b/Date Time Timestamp/Date_Time.ipynb @@ -0,0 +1,424 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using Times, Dates & Timestamps in Python" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Summary of Time and Date classes:\n", + "**datetime** # superclass for most of the date and time libraries \n", + "    **date** # general purpose date library \n", + "    **time** # general purpose time library \n", + "    **datetime** # for date and time in one object \n", + "    **timedelta** # for a duration or elapsed time \n", + "**time** # for Unix timestamp and process_time \n", + "**calendar** # for calendars \n", + "**dateutil** # extended datetime functionality, esp string parsing and delta calculation" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Today's Date\n", + "- Use datetime.date.today()\n", + "- datetime.date class has the following integer attributes, date(year, month, day)\n", + "- get day of the week using date.weekday() # Monday is 0" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2019-02-03\n", + "2 3 2019\n", + "6\n" + ] + } + ], + "source": [ + "from datetime import date\n", + "d1 = date.today()\n", + "print(d1)\n", + "print(d1.month, d1.day, d1.year)\n", + "print(d1.weekday())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ISO format is a string format, yyyy-mm-dd\n", + "- date_object.isoformat() does the same thing as str(date_object)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2011-11-23\n", + "2011-11-23\n", + "2011-11-23\n" + ] + }, + { + "data": { + "text/plain": [ + "datetime.date(2011, 11, 23)" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d1 = date.fromisoformat('2011-11-23')\n", + "print(d1)\n", + "print(str(d1))\n", + "print(d1.isoformat())\n", + "d1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Comparison, addition and sutraction of dates\n", + "- Comparison gives boolean result. Later date is greater than earlier date.\n", + "- Date addition & subtraction give result as a datetime.timedelta object (explained more below).\n", + "- The same comparison and add/subtract operations can be used with time objects." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "1359 days, 0:00:00\n" + ] + } + ], + "source": [ + "d1 = date.today()\n", + "d2 = date(2015, 5, 14)\n", + "print(d1 > d2)\n", + "print(d1 - d2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Time\n", + "- time objects have the following attributes, time(hour, minute, second, microsecond, tzinfo)\n", + "- use datetime.time to compare time objects: t1 < t2 if t1 occurs before t2\n", + " - attributes are all optional, so you can just work with hours and minutes if you want\n", + "- daylight savings is handled by the time.dst() function (if tzinfo is set)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "14:25:36.018625\n", + "02:19:00\n", + "False\n" + ] + } + ], + "source": [ + "from datetime import time\n", + "t1 = time(14, 25, 36, 18625)\n", + "print(t1)\n", + "\n", + "t2 = time(2, 19)\n", + "print(t2)\n", + "print(t1 < t2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### datetime.datetime combines date and time attributes into a datetime object\n", + "- datetime.datetime(year, month, day, hour, minute, second, microsecond, tzinfo)\n", + "- datetime.datetime objects can be used as dictionary keys\n", + "- includes functions: date(), time()" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1941-12-07 07:53:00\n", + "1941-12-07\n", + "07:53:00\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "dt1 = datetime(1941, 12, 7, 7, 53)\n", + "print(dt1)\n", + "print(dt1.date())\n", + "print(dt1.time())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use datetime.datetime.now() to get the current date and time" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "10:02:21.354040\n", + "2019-02-03\n", + "10 2\n", + "2-3-2019\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "t3 = datetime.now()\n", + "\n", + "print(t3.time())\n", + "print(t3.date())\n", + "print(t3.hour, t3.minute)\n", + "print(str(t3.month) + '-' + str(t3.day) + '-' + str(t3.year))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use datetime.strftime() to get names of months and weekdays." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sunday\n", + "Sun, Sunday, Feb, February, 02/03/19\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "t3 = datetime.now()\n", + "print(t3.strftime('%A'))\n", + "print(t3.strftime('%a, %A, %b, %B, %x'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A timedelta is used for a duration, or the time difference between two dates or times\n", + "- datetime.timedelta(days, seconds, microseconds)\n", + "- A timedelta can also be multiplied or divided by an integer or float" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "461 days, 0:00:00 \n", + "39830400.0\n", + "1383 days, 0:00:00\n" + ] + } + ], + "source": [ + "from datetime import timedelta, date, time\n", + "d1 = date(2011, 6, 15)\n", + "d2 = date(2012, 9, 18)\n", + "td = d2 - d1\n", + "print(td, type(td))\n", + "print(td.total_seconds())\n", + "print(td * 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1008 days to event.\n", + "1008 days, 0:00:00 days to event.\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "today = datetime.today().date()\n", + "my_event = date(2021, 11, 6)\n", + "days_to_event = abs(my_event - today)\n", + "print(days_to_event.days, 'days to event.')\n", + "print(days_to_event, 'days to event.')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get a UNIX timestamp (time since the epoch)\n", + "- A timestamp is the time since Jan 1, 1970 in seconds\n", + "- Use time.time() to get timestamp\n", + "- Use datetime.fromtimestamp(ts) and datetime.timestamp(datetime_obj) to convert between timestamp and datetime\n", + "- Use time.process_time() to get runtime of an operation on your computer" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1549156155.9644115\n", + "Sat Feb 2 17:09:15 2019\n" + ] + } + ], + "source": [ + "import time\n", + "ts = time.time()\n", + "print(ts)\n", + "print(time.ctime(ts))" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2019-02-02 17:09:15.964411\n", + "1549156155.964411\n" + ] + } + ], + "source": [ + "from datetime import datetime\n", + "now = datetime.fromtimestamp(ts)\n", + "print(now)\n", + "print(datetime.timestamp(now))" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "operation executed in 0.0\n" + ] + } + ], + "source": [ + "start_time = time.process_time()\n", + "# do some stuff\n", + "end_time = time.process_time()\n", + "print('operation executed in ', end_time - start_time)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 5e60679ce8100a5ce558506b1d882e9fb364a1bd Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 4 Feb 2019 10:32:02 -0800 Subject: [PATCH 04/77] Uploaded python/text file for date and time --- Date Time Timestamp/Date_Time_Timestamp.py | 133 +++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 Date Time Timestamp/Date_Time_Timestamp.py diff --git a/Date Time Timestamp/Date_Time_Timestamp.py b/Date Time Timestamp/Date_Time_Timestamp.py new file mode 100644 index 00000000..7897332c --- /dev/null +++ b/Date Time Timestamp/Date_Time_Timestamp.py @@ -0,0 +1,133 @@ +"""############################################################################## +Using Times, Dates & Timestamps in Python + +Summary of Time and Date classes: +datetime # superclass for most of the date and time libraries + date # general purpose date library + time # general purpose time library + datetime # for date and time in one object + timedelta # for a duration or elapsed time +time # for Unix timestamp and process_time +calendar # for calendars +dateutil # extended datetime functionality, esp string parsing and delta calculation +##############################################################################""" + +# Today's Date +# --------------------------- +# Use datetime.date.today() +# datetime.date class has the following integer attributes, date(year, month, day) +# get day of the week using date.weekday() # Monday is 0 + +from datetime import date +d1 = date.today() +print(d1) +print(d1.month, d1.day, d1.year) +print(d1.weekday()) + +# ISO format is a string format, yyyy-mm-dd +# --------------------------- +# date_object.isoformat() does the same thing as str(date_object) + +from datetime import date +d1 = date.fromisoformat('2011-11-23') +print(d1) +print(str(d1)) +print(d1.isoformat()) +d1 + +# Comparison, addition and sutraction of dates +# --------------------------- +# Comparison gives boolean result. Later date is greater than earlier date. +# Date addition & subtraction give result as a datetime.timedelta object (explained more below). +# The same comparison and add/subtract operations can be used with time objects. + +from datetime import date +d1 = date.today() +d2 = date(2015, 5, 14) +print(d1 > d2) +print(d1 - d2) + +# Time +# --------------------------- +# time objects have the following attributes, time(hour, minute, second, microsecond, tzinfo) +# use datetime.time to compare time objects: t1 < t2 if t1 occurs before t2 +# attributes are all optional, so you can just work with hours and minutes if you want +# daylight savings is handled by the time.dst() function (if tzinfo is set) + +from datetime import time +t1 = time(14, 25, 36, 18625) +print(t1) + +t2 = time(2, 19) +print(t2) +print(t1 < t2) + +# datetime.datetime combines date and time attributes into a datetime object +# --------------------------- +# datetime.datetime(year, month, day, hour, minute, second, microsecond, tzinfo) +# datetime.datetime objects can be used as dictionary keys +# includes functions: date(), time() + +from datetime import datetime +dt1 = datetime(1941, 12, 7, 7, 53) +print(dt1) +print(dt1.date()) +print(dt1.time()) + +# Use datetime.datetime.now() to get the current date and time + +t3 = datetime.now() + +print(t3.time()) +print(t3.date()) +print(t3.hour, t3.minute) +print(str(t3.month) + '-' + str(t3.day) + '-' + str(t3.year)) + +# Use datetime.strftime() to get names of months and weekdays. + +t3 = datetime.now() +print(t3.strftime('%A')) +print(t3.strftime('%a, %A, %b, %B, %x')) + +# A timedelta is used for a duration, or the time difference between two dates or times +# --------------------------- +# datetime.timedelta(days, seconds, microseconds) +# A timedelta can also be multiplied or divided by an integer or float + +from datetime import timedelta, date, time +d1 = date(2011, 6, 15) +d2 = date(2012, 9, 18) +td = d2 - d1 +print(td, type(td)) +print(td.total_seconds()) +print(td * 3) + +from datetime import datetime +today = datetime.today().date() +my_event = date(2021, 11, 6) +days_to_event = abs(my_event - today) +print(days_to_event.days, 'days to event.') +print(days_to_event, 'days to event.') + +# Get a UNIX timestamp (time since the epoch) +# --------------------------- +# A timestamp is the time since Jan 1, 1970 in seconds +# Use time.time() to get timestamp +# Use datetime.fromtimestamp(ts) and datetime.timestamp(datetime_obj) to convert between timestamp and datetime +# Use time.process_time() to get runtime of an operation on your computer + +import time +ts = time.time() +print(ts) +print(time.ctime(ts)) + + +from datetime import datetime +now = datetime.fromtimestamp(ts) +print(now) +print(datetime.timestamp(now)) + +start_time = time.process_time() +# do some stuff +end_time = time.process_time() +print('operation executed in ', end_time - start_time) \ No newline at end of file From 88de190aa42410f0e1733b3d83ad51587c8243f8 Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 6 Feb 2019 19:05:03 -0800 Subject: [PATCH 05/77] Uploaded Graduate Admissions notebook and data --- Pandas/Admission_Predict_Ver1.1.csv | 501 ++++++++++++++ ...tlib Tackle Graduate Admissions Data.ipynb | 620 ++++++++++++++++++ 2 files changed, 1121 insertions(+) create mode 100644 Pandas/Admission_Predict_Ver1.1.csv create mode 100644 Pandas/Pandas and Matplotlib Tackle Graduate Admissions Data.ipynb diff --git a/Pandas/Admission_Predict_Ver1.1.csv b/Pandas/Admission_Predict_Ver1.1.csv new file mode 100644 index 00000000..ff4d3f2a --- /dev/null +++ b/Pandas/Admission_Predict_Ver1.1.csv @@ -0,0 +1,501 @@ +Serial No.,GRE Score,TOEFL Score,University Rating,SOP,LOR,CGPA,Research,Chance of Admit +1,337,118,4,4.5,4.5,9.65,1,0.92 +2,324,107,4,4,4.5,8.87,1,0.76 +3,316,104,3,3,3.5,8,1,0.72 +4,322,110,3,3.5,2.5,8.67,1,0.8 +5,314,103,2,2,3,8.21,0,0.65 +6,330,115,5,4.5,3,9.34,1,0.9 +7,321,109,3,3,4,8.2,1,0.75 +8,308,101,2,3,4,7.9,0,0.68 +9,302,102,1,2,1.5,8,0,0.5 +10,323,108,3,3.5,3,8.6,0,0.45 +11,325,106,3,3.5,4,8.4,1,0.52 +12,327,111,4,4,4.5,9,1,0.84 +13,328,112,4,4,4.5,9.1,1,0.78 +14,307,109,3,4,3,8,1,0.62 +15,311,104,3,3.5,2,8.2,1,0.61 +16,314,105,3,3.5,2.5,8.3,0,0.54 +17,317,107,3,4,3,8.7,0,0.66 +18,319,106,3,4,3,8,1,0.65 +19,318,110,3,4,3,8.8,0,0.63 +20,303,102,3,3.5,3,8.5,0,0.62 +21,312,107,3,3,2,7.9,1,0.64 +22,325,114,4,3,2,8.4,0,0.7 +23,328,116,5,5,5,9.5,1,0.94 +24,334,119,5,5,4.5,9.7,1,0.95 +25,336,119,5,4,3.5,9.8,1,0.97 +26,340,120,5,4.5,4.5,9.6,1,0.94 +27,322,109,5,4.5,3.5,8.8,0,0.76 +28,298,98,2,1.5,2.5,7.5,1,0.44 +29,295,93,1,2,2,7.2,0,0.46 +30,310,99,2,1.5,2,7.3,0,0.54 +31,300,97,2,3,3,8.1,1,0.65 +32,327,103,3,4,4,8.3,1,0.74 +33,338,118,4,3,4.5,9.4,1,0.91 +34,340,114,5,4,4,9.6,1,0.9 +35,331,112,5,4,5,9.8,1,0.94 +36,320,110,5,5,5,9.2,1,0.88 +37,299,106,2,4,4,8.4,0,0.64 +38,300,105,1,1,2,7.8,0,0.58 +39,304,105,1,3,1.5,7.5,0,0.52 +40,307,108,2,4,3.5,7.7,0,0.48 +41,308,110,3,3.5,3,8,1,0.46 +42,316,105,2,2.5,2.5,8.2,1,0.49 +43,313,107,2,2.5,2,8.5,1,0.53 +44,332,117,4,4.5,4,9.1,0,0.87 +45,326,113,5,4.5,4,9.4,1,0.91 +46,322,110,5,5,4,9.1,1,0.88 +47,329,114,5,4,5,9.3,1,0.86 +48,339,119,5,4.5,4,9.7,0,0.89 +49,321,110,3,3.5,5,8.85,1,0.82 +50,327,111,4,3,4,8.4,1,0.78 +51,313,98,3,2.5,4.5,8.3,1,0.76 +52,312,100,2,1.5,3.5,7.9,1,0.56 +53,334,116,4,4,3,8,1,0.78 +54,324,112,4,4,2.5,8.1,1,0.72 +55,322,110,3,3,3.5,8,0,0.7 +56,320,103,3,3,3,7.7,0,0.64 +57,316,102,3,2,3,7.4,0,0.64 +58,298,99,2,4,2,7.6,0,0.46 +59,300,99,1,3,2,6.8,1,0.36 +60,311,104,2,2,2,8.3,0,0.42 +61,309,100,2,3,3,8.1,0,0.48 +62,307,101,3,4,3,8.2,0,0.47 +63,304,105,2,3,3,8.2,1,0.54 +64,315,107,2,4,3,8.5,1,0.56 +65,325,111,3,3,3.5,8.7,0,0.52 +66,325,112,4,3.5,3.5,8.92,0,0.55 +67,327,114,3,3,3,9.02,0,0.61 +68,316,107,2,3.5,3.5,8.64,1,0.57 +69,318,109,3,3.5,4,9.22,1,0.68 +70,328,115,4,4.5,4,9.16,1,0.78 +71,332,118,5,5,5,9.64,1,0.94 +72,336,112,5,5,5,9.76,1,0.96 +73,321,111,5,5,5,9.45,1,0.93 +74,314,108,4,4.5,4,9.04,1,0.84 +75,314,106,3,3,5,8.9,0,0.74 +76,329,114,2,2,4,8.56,1,0.72 +77,327,112,3,3,3,8.72,1,0.74 +78,301,99,2,3,2,8.22,0,0.64 +79,296,95,2,3,2,7.54,1,0.44 +80,294,93,1,1.5,2,7.36,0,0.46 +81,312,105,3,2,3,8.02,1,0.5 +82,340,120,4,5,5,9.5,1,0.96 +83,320,110,5,5,4.5,9.22,1,0.92 +84,322,115,5,4,4.5,9.36,1,0.92 +85,340,115,5,4.5,4.5,9.45,1,0.94 +86,319,103,4,4.5,3.5,8.66,0,0.76 +87,315,106,3,4.5,3.5,8.42,0,0.72 +88,317,107,2,3.5,3,8.28,0,0.66 +89,314,108,3,4.5,3.5,8.14,0,0.64 +90,316,109,4,4.5,3.5,8.76,1,0.74 +91,318,106,2,4,4,7.92,1,0.64 +92,299,97,3,5,3.5,7.66,0,0.38 +93,298,98,2,4,3,8.03,0,0.34 +94,301,97,2,3,3,7.88,1,0.44 +95,303,99,3,2,2.5,7.66,0,0.36 +96,304,100,4,1.5,2.5,7.84,0,0.42 +97,306,100,2,3,3,8,0,0.48 +98,331,120,3,4,4,8.96,1,0.86 +99,332,119,4,5,4.5,9.24,1,0.9 +100,323,113,3,4,4,8.88,1,0.79 +101,322,107,3,3.5,3.5,8.46,1,0.71 +102,312,105,2,2.5,3,8.12,0,0.64 +103,314,106,2,4,3.5,8.25,0,0.62 +104,317,104,2,4.5,4,8.47,0,0.57 +105,326,112,3,3.5,3,9.05,1,0.74 +106,316,110,3,4,4.5,8.78,1,0.69 +107,329,111,4,4.5,4.5,9.18,1,0.87 +108,338,117,4,3.5,4.5,9.46,1,0.91 +109,331,116,5,5,5,9.38,1,0.93 +110,304,103,5,5,4,8.64,0,0.68 +111,305,108,5,3,3,8.48,0,0.61 +112,321,109,4,4,4,8.68,1,0.69 +113,301,107,3,3.5,3.5,8.34,1,0.62 +114,320,110,2,4,3.5,8.56,0,0.72 +115,311,105,3,3.5,3,8.45,1,0.59 +116,310,106,4,4.5,4.5,9.04,1,0.66 +117,299,102,3,4,3.5,8.62,0,0.56 +118,290,104,4,2,2.5,7.46,0,0.45 +119,296,99,2,3,3.5,7.28,0,0.47 +120,327,104,5,3,3.5,8.84,1,0.71 +121,335,117,5,5,5,9.56,1,0.94 +122,334,119,5,4.5,4.5,9.48,1,0.94 +123,310,106,4,1.5,2.5,8.36,0,0.57 +124,308,108,3,3.5,3.5,8.22,0,0.61 +125,301,106,4,2.5,3,8.47,0,0.57 +126,300,100,3,2,3,8.66,1,0.64 +127,323,113,3,4,3,9.32,1,0.85 +128,319,112,3,2.5,2,8.71,1,0.78 +129,326,112,3,3.5,3,9.1,1,0.84 +130,333,118,5,5,5,9.35,1,0.92 +131,339,114,5,4,4.5,9.76,1,0.96 +132,303,105,5,5,4.5,8.65,0,0.77 +133,309,105,5,3.5,3.5,8.56,0,0.71 +134,323,112,5,4,4.5,8.78,0,0.79 +135,333,113,5,4,4,9.28,1,0.89 +136,314,109,4,3.5,4,8.77,1,0.82 +137,312,103,3,5,4,8.45,0,0.76 +138,316,100,2,1.5,3,8.16,1,0.71 +139,326,116,2,4.5,3,9.08,1,0.8 +140,318,109,1,3.5,3.5,9.12,0,0.78 +141,329,110,2,4,3,9.15,1,0.84 +142,332,118,2,4.5,3.5,9.36,1,0.9 +143,331,115,5,4,3.5,9.44,1,0.92 +144,340,120,4,4.5,4,9.92,1,0.97 +145,325,112,2,3,3.5,8.96,1,0.8 +146,320,113,2,2,2.5,8.64,1,0.81 +147,315,105,3,2,2.5,8.48,0,0.75 +148,326,114,3,3,3,9.11,1,0.83 +149,339,116,4,4,3.5,9.8,1,0.96 +150,311,106,2,3.5,3,8.26,1,0.79 +151,334,114,4,4,4,9.43,1,0.93 +152,332,116,5,5,5,9.28,1,0.94 +153,321,112,5,5,5,9.06,1,0.86 +154,324,105,3,3,4,8.75,0,0.79 +155,326,108,3,3,3.5,8.89,0,0.8 +156,312,109,3,3,3,8.69,0,0.77 +157,315,105,3,2,2.5,8.34,0,0.7 +158,309,104,2,2,2.5,8.26,0,0.65 +159,306,106,2,2,2.5,8.14,0,0.61 +160,297,100,1,1.5,2,7.9,0,0.52 +161,315,103,1,1.5,2,7.86,0,0.57 +162,298,99,1,1.5,3,7.46,0,0.53 +163,318,109,3,3,3,8.5,0,0.67 +164,317,105,3,3.5,3,8.56,0,0.68 +165,329,111,4,4.5,4,9.01,1,0.81 +166,322,110,5,4.5,4,8.97,0,0.78 +167,302,102,3,3.5,5,8.33,0,0.65 +168,313,102,3,2,3,8.27,0,0.64 +169,293,97,2,2,4,7.8,1,0.64 +170,311,99,2,2.5,3,7.98,0,0.65 +171,312,101,2,2.5,3.5,8.04,1,0.68 +172,334,117,5,4,4.5,9.07,1,0.89 +173,322,110,4,4,5,9.13,1,0.86 +174,323,113,4,4,4.5,9.23,1,0.89 +175,321,111,4,4,4,8.97,1,0.87 +176,320,111,4,4.5,3.5,8.87,1,0.85 +177,329,119,4,4.5,4.5,9.16,1,0.9 +178,319,110,3,3.5,3.5,9.04,0,0.82 +179,309,108,3,2.5,3,8.12,0,0.72 +180,307,102,3,3,3,8.27,0,0.73 +181,300,104,3,3.5,3,8.16,0,0.71 +182,305,107,2,2.5,2.5,8.42,0,0.71 +183,299,100,2,3,3.5,7.88,0,0.68 +184,314,110,3,4,4,8.8,0,0.75 +185,316,106,2,2.5,4,8.32,0,0.72 +186,327,113,4,4.5,4.5,9.11,1,0.89 +187,317,107,3,3.5,3,8.68,1,0.84 +188,335,118,5,4.5,3.5,9.44,1,0.93 +189,331,115,5,4.5,3.5,9.36,1,0.93 +190,324,112,5,5,5,9.08,1,0.88 +191,324,111,5,4.5,4,9.16,1,0.9 +192,323,110,5,4,5,8.98,1,0.87 +193,322,114,5,4.5,4,8.94,1,0.86 +194,336,118,5,4.5,5,9.53,1,0.94 +195,316,109,3,3.5,3,8.76,0,0.77 +196,307,107,2,3,3.5,8.52,1,0.78 +197,306,105,2,3,2.5,8.26,0,0.73 +198,310,106,2,3.5,2.5,8.33,0,0.73 +199,311,104,3,4.5,4.5,8.43,0,0.7 +200,313,107,3,4,4.5,8.69,0,0.72 +201,317,103,3,2.5,3,8.54,1,0.73 +202,315,110,2,3.5,3,8.46,1,0.72 +203,340,120,5,4.5,4.5,9.91,1,0.97 +204,334,120,5,4,5,9.87,1,0.97 +205,298,105,3,3.5,4,8.54,0,0.69 +206,295,99,2,2.5,3,7.65,0,0.57 +207,315,99,2,3.5,3,7.89,0,0.63 +208,310,102,3,3.5,4,8.02,1,0.66 +209,305,106,2,3,3,8.16,0,0.64 +210,301,104,3,3.5,4,8.12,1,0.68 +211,325,108,4,4.5,4,9.06,1,0.79 +212,328,110,4,5,4,9.14,1,0.82 +213,338,120,4,5,5,9.66,1,0.95 +214,333,119,5,5,4.5,9.78,1,0.96 +215,331,117,4,4.5,5,9.42,1,0.94 +216,330,116,5,5,4.5,9.36,1,0.93 +217,322,112,4,4.5,4.5,9.26,1,0.91 +218,321,109,4,4,4,9.13,1,0.85 +219,324,110,4,3,3.5,8.97,1,0.84 +220,312,104,3,3.5,3.5,8.42,0,0.74 +221,313,103,3,4,4,8.75,0,0.76 +222,316,110,3,3.5,4,8.56,0,0.75 +223,324,113,4,4.5,4,8.79,0,0.76 +224,308,109,2,3,4,8.45,0,0.71 +225,305,105,2,3,2,8.23,0,0.67 +226,296,99,2,2.5,2.5,8.03,0,0.61 +227,306,110,2,3.5,4,8.45,0,0.63 +228,312,110,2,3.5,3,8.53,0,0.64 +229,318,112,3,4,3.5,8.67,0,0.71 +230,324,111,4,3,3,9.01,1,0.82 +231,313,104,3,4,4.5,8.65,0,0.73 +232,319,106,3,3.5,2.5,8.33,1,0.74 +233,312,107,2,2.5,3.5,8.27,0,0.69 +234,304,100,2,2.5,3.5,8.07,0,0.64 +235,330,113,5,5,4,9.31,1,0.91 +236,326,111,5,4.5,4,9.23,1,0.88 +237,325,112,4,4,4.5,9.17,1,0.85 +238,329,114,5,4.5,5,9.19,1,0.86 +239,310,104,3,2,3.5,8.37,0,0.7 +240,299,100,1,1.5,2,7.89,0,0.59 +241,296,101,1,2.5,3,7.68,0,0.6 +242,317,103,2,2.5,2,8.15,0,0.65 +243,324,115,3,3.5,3,8.76,1,0.7 +244,325,114,3,3.5,3,9.04,1,0.76 +245,314,107,2,2.5,4,8.56,0,0.63 +246,328,110,4,4,2.5,9.02,1,0.81 +247,316,105,3,3,3.5,8.73,0,0.72 +248,311,104,2,2.5,3.5,8.48,0,0.71 +249,324,110,3,3.5,4,8.87,1,0.8 +250,321,111,3,3.5,4,8.83,1,0.77 +251,320,104,3,3,2.5,8.57,1,0.74 +252,316,99,2,2.5,3,9,0,0.7 +253,318,100,2,2.5,3.5,8.54,1,0.71 +254,335,115,4,4.5,4.5,9.68,1,0.93 +255,321,114,4,4,5,9.12,0,0.85 +256,307,110,4,4,4.5,8.37,0,0.79 +257,309,99,3,4,4,8.56,0,0.76 +258,324,100,3,4,5,8.64,1,0.78 +259,326,102,4,5,5,8.76,1,0.77 +260,331,119,4,5,4.5,9.34,1,0.9 +261,327,108,5,5,3.5,9.13,1,0.87 +262,312,104,3,3.5,4,8.09,0,0.71 +263,308,103,2,2.5,4,8.36,1,0.7 +264,324,111,3,2.5,1.5,8.79,1,0.7 +265,325,110,2,3,2.5,8.76,1,0.75 +266,313,102,3,2.5,2.5,8.68,0,0.71 +267,312,105,2,2,2.5,8.45,0,0.72 +268,314,107,3,3,3.5,8.17,1,0.73 +269,327,113,4,4.5,5,9.14,0,0.83 +270,308,108,4,4.5,5,8.34,0,0.77 +271,306,105,2,2.5,3,8.22,1,0.72 +272,299,96,2,1.5,2,7.86,0,0.54 +273,294,95,1,1.5,1.5,7.64,0,0.49 +274,312,99,1,1,1.5,8.01,1,0.52 +275,315,100,1,2,2.5,7.95,0,0.58 +276,322,110,3,3.5,3,8.96,1,0.78 +277,329,113,5,5,4.5,9.45,1,0.89 +278,320,101,2,2.5,3,8.62,0,0.7 +279,308,103,2,3,3.5,8.49,0,0.66 +280,304,102,2,3,4,8.73,0,0.67 +281,311,102,3,4.5,4,8.64,1,0.68 +282,317,110,3,4,4.5,9.11,1,0.8 +283,312,106,3,4,3.5,8.79,1,0.81 +284,321,111,3,2.5,3,8.9,1,0.8 +285,340,112,4,5,4.5,9.66,1,0.94 +286,331,116,5,4,4,9.26,1,0.93 +287,336,118,5,4.5,4,9.19,1,0.92 +288,324,114,5,5,4.5,9.08,1,0.89 +289,314,104,4,5,5,9.02,0,0.82 +290,313,109,3,4,3.5,9,0,0.79 +291,307,105,2,2.5,3,7.65,0,0.58 +292,300,102,2,1.5,2,7.87,0,0.56 +293,302,99,2,1,2,7.97,0,0.56 +294,312,98,1,3.5,3,8.18,1,0.64 +295,316,101,2,2.5,2,8.32,1,0.61 +296,317,100,2,3,2.5,8.57,0,0.68 +297,310,107,3,3.5,3.5,8.67,0,0.76 +298,320,120,3,4,4.5,9.11,0,0.86 +299,330,114,3,4.5,4.5,9.24,1,0.9 +300,305,112,3,3,3.5,8.65,0,0.71 +301,309,106,2,2.5,2.5,8,0,0.62 +302,319,108,2,2.5,3,8.76,0,0.66 +303,322,105,2,3,3,8.45,1,0.65 +304,323,107,3,3.5,3.5,8.55,1,0.73 +305,313,106,2,2.5,2,8.43,0,0.62 +306,321,109,3,3.5,3.5,8.8,1,0.74 +307,323,110,3,4,3.5,9.1,1,0.79 +308,325,112,4,4,4,9,1,0.8 +309,312,108,3,3.5,3,8.53,0,0.69 +310,308,110,4,3.5,3,8.6,0,0.7 +311,320,104,3,3,3.5,8.74,1,0.76 +312,328,108,4,4.5,4,9.18,1,0.84 +313,311,107,4,4.5,4.5,9,1,0.78 +314,301,100,3,3.5,3,8.04,0,0.67 +315,305,105,2,3,4,8.13,0,0.66 +316,308,104,2,2.5,3,8.07,0,0.65 +317,298,101,2,1.5,2,7.86,0,0.54 +318,300,99,1,1,2.5,8.01,0,0.58 +319,324,111,3,2.5,2,8.8,1,0.79 +320,327,113,4,3.5,3,8.69,1,0.8 +321,317,106,3,4,3.5,8.5,1,0.75 +322,323,104,3,4,4,8.44,1,0.73 +323,314,107,2,2.5,4,8.27,0,0.72 +324,305,102,2,2,2.5,8.18,0,0.62 +325,315,104,3,3,2.5,8.33,0,0.67 +326,326,116,3,3.5,4,9.14,1,0.81 +327,299,100,3,2,2,8.02,0,0.63 +328,295,101,2,2.5,2,7.86,0,0.69 +329,324,112,4,4,3.5,8.77,1,0.8 +330,297,96,2,2.5,1.5,7.89,0,0.43 +331,327,113,3,3.5,3,8.66,1,0.8 +332,311,105,2,3,2,8.12,1,0.73 +333,308,106,3,3.5,2.5,8.21,1,0.75 +334,319,108,3,3,3.5,8.54,1,0.71 +335,312,107,4,4.5,4,8.65,1,0.73 +336,325,111,4,4,4.5,9.11,1,0.83 +337,319,110,3,3,2.5,8.79,0,0.72 +338,332,118,5,5,5,9.47,1,0.94 +339,323,108,5,4,4,8.74,1,0.81 +340,324,107,5,3.5,4,8.66,1,0.81 +341,312,107,3,3,3,8.46,1,0.75 +342,326,110,3,3.5,3.5,8.76,1,0.79 +343,308,106,3,3,3,8.24,0,0.58 +344,305,103,2,2.5,3.5,8.13,0,0.59 +345,295,96,2,1.5,2,7.34,0,0.47 +346,316,98,1,1.5,2,7.43,0,0.49 +347,304,97,2,1.5,2,7.64,0,0.47 +348,299,94,1,1,1,7.34,0,0.42 +349,302,99,1,2,2,7.25,0,0.57 +350,313,101,3,2.5,3,8.04,0,0.62 +351,318,107,3,3,3.5,8.27,1,0.74 +352,325,110,4,3.5,4,8.67,1,0.73 +353,303,100,2,3,3.5,8.06,1,0.64 +354,300,102,3,3.5,2.5,8.17,0,0.63 +355,297,98,2,2.5,3,7.67,0,0.59 +356,317,106,2,2,3.5,8.12,0,0.73 +357,327,109,3,3.5,4,8.77,1,0.79 +358,301,104,2,3.5,3.5,7.89,1,0.68 +359,314,105,2,2.5,2,7.64,0,0.7 +360,321,107,2,2,1.5,8.44,0,0.81 +361,322,110,3,4,5,8.64,1,0.85 +362,334,116,4,4,3.5,9.54,1,0.93 +363,338,115,5,4.5,5,9.23,1,0.91 +364,306,103,2,2.5,3,8.36,0,0.69 +365,313,102,3,3.5,4,8.9,1,0.77 +366,330,114,4,4.5,3,9.17,1,0.86 +367,320,104,3,3.5,4.5,8.34,1,0.74 +368,311,98,1,1,2.5,7.46,0,0.57 +369,298,92,1,2,2,7.88,0,0.51 +370,301,98,1,2,3,8.03,1,0.67 +371,310,103,2,2.5,2.5,8.24,0,0.72 +372,324,110,3,3.5,3,9.22,1,0.89 +373,336,119,4,4.5,4,9.62,1,0.95 +374,321,109,3,3,3,8.54,1,0.79 +375,315,105,2,2,2.5,7.65,0,0.39 +376,304,101,2,2,2.5,7.66,0,0.38 +377,297,96,2,2.5,2,7.43,0,0.34 +378,290,100,1,1.5,2,7.56,0,0.47 +379,303,98,1,2,2.5,7.65,0,0.56 +380,311,99,1,2.5,3,8.43,1,0.71 +381,322,104,3,3.5,4,8.84,1,0.78 +382,319,105,3,3,3.5,8.67,1,0.73 +383,324,110,4,4.5,4,9.15,1,0.82 +384,300,100,3,3,3.5,8.26,0,0.62 +385,340,113,4,5,5,9.74,1,0.96 +386,335,117,5,5,5,9.82,1,0.96 +387,302,101,2,2.5,3.5,7.96,0,0.46 +388,307,105,2,2,3.5,8.1,0,0.53 +389,296,97,2,1.5,2,7.8,0,0.49 +390,320,108,3,3.5,4,8.44,1,0.76 +391,314,102,2,2,2.5,8.24,0,0.64 +392,318,106,3,2,3,8.65,0,0.71 +393,326,112,4,4,3.5,9.12,1,0.84 +394,317,104,2,3,3,8.76,0,0.77 +395,329,111,4,4.5,4,9.23,1,0.89 +396,324,110,3,3.5,3.5,9.04,1,0.82 +397,325,107,3,3,3.5,9.11,1,0.84 +398,330,116,4,5,4.5,9.45,1,0.91 +399,312,103,3,3.5,4,8.78,0,0.67 +400,333,117,4,5,4,9.66,1,0.95 +401,304,100,2,3.5,3,8.22,0,0.63 +402,315,105,2,3,3,8.34,0,0.66 +403,324,109,3,3.5,3,8.94,1,0.78 +404,330,116,4,4,3.5,9.23,1,0.91 +405,311,101,3,2,2.5,7.64,1,0.62 +406,302,99,3,2.5,3,7.45,0,0.52 +407,322,103,4,3,2.5,8.02,1,0.61 +408,298,100,3,2.5,4,7.95,1,0.58 +409,297,101,3,2,4,7.67,1,0.57 +410,300,98,1,2,2.5,8.02,0,0.61 +411,301,96,1,3,4,7.56,0,0.54 +412,313,94,2,2.5,1.5,8.13,0,0.56 +413,314,102,4,2.5,2,7.88,1,0.59 +414,317,101,3,3,2,7.94,1,0.49 +415,321,110,4,3.5,4,8.35,1,0.72 +416,327,106,4,4,4.5,8.75,1,0.76 +417,315,104,3,4,2.5,8.1,0,0.65 +418,316,103,3,3.5,2,7.68,0,0.52 +419,309,111,2,2.5,4,8.03,0,0.6 +420,308,102,2,2,3.5,7.98,1,0.58 +421,299,100,3,2,3,7.42,0,0.42 +422,321,112,3,3,4.5,8.95,1,0.77 +423,322,112,4,3.5,2.5,9.02,1,0.73 +424,334,119,5,4.5,5,9.54,1,0.94 +425,325,114,5,4,5,9.46,1,0.91 +426,323,111,5,4,5,9.86,1,0.92 +427,312,106,3,3,5,8.57,0,0.71 +428,310,101,3,3.5,5,8.65,1,0.71 +429,316,103,2,2,4.5,8.74,0,0.69 +430,340,115,5,5,4.5,9.06,1,0.95 +431,311,104,3,4,3.5,8.13,1,0.74 +432,320,112,2,3.5,3.5,8.78,1,0.73 +433,324,112,4,4.5,4,9.22,1,0.86 +434,316,111,4,4,5,8.54,0,0.71 +435,306,103,3,3.5,3,8.21,0,0.64 +436,309,105,2,2.5,4,7.68,0,0.55 +437,310,110,1,1.5,4,7.23,1,0.58 +438,317,106,1,1.5,3.5,7.65,1,0.61 +439,318,110,1,2.5,3.5,8.54,1,0.67 +440,312,105,2,1.5,3,8.46,0,0.66 +441,305,104,2,2.5,1.5,7.79,0,0.53 +442,332,112,1,1.5,3,8.66,1,0.79 +443,331,116,4,4.5,4.5,9.44,1,0.92 +444,321,114,5,4.5,4.5,9.16,1,0.87 +445,324,113,5,4,5,9.25,1,0.92 +446,328,116,5,4.5,5,9.08,1,0.91 +447,327,118,4,5,5,9.67,1,0.93 +448,320,108,3,3.5,5,8.97,1,0.84 +449,312,109,2,2.5,4,9.02,0,0.8 +450,315,101,3,3.5,4.5,9.13,0,0.79 +451,320,112,4,3,4.5,8.86,1,0.82 +452,324,113,4,4.5,4.5,9.25,1,0.89 +453,328,116,4,5,3.5,9.6,1,0.93 +454,319,103,3,2.5,4,8.76,1,0.73 +455,310,105,2,3,3.5,8.01,0,0.71 +456,305,102,2,1.5,2.5,7.64,0,0.59 +457,299,100,2,2,2,7.88,0,0.51 +458,295,99,1,2,1.5,7.57,0,0.37 +459,312,100,1,3,3,8.53,1,0.69 +460,329,113,4,4,3.5,9.36,1,0.89 +461,319,105,4,4,4.5,8.66,1,0.77 +462,301,102,3,2.5,2,8.13,1,0.68 +463,307,105,4,3,3,7.94,0,0.62 +464,304,107,3,3.5,3,7.86,0,0.57 +465,298,97,2,2,3,7.21,0,0.45 +466,305,96,4,3,4.5,8.26,0,0.54 +467,314,99,4,3.5,4.5,8.73,1,0.71 +468,318,101,5,3.5,5,8.78,1,0.78 +469,323,110,4,4,5,8.88,1,0.81 +470,326,114,4,4,3.5,9.16,1,0.86 +471,320,110,5,4,4,9.27,1,0.87 +472,311,103,3,2,4,8.09,0,0.64 +473,327,116,4,4,4.5,9.48,1,0.9 +474,316,102,2,4,3.5,8.15,0,0.67 +475,308,105,4,3,2.5,7.95,1,0.67 +476,300,101,3,3.5,2.5,7.88,0,0.59 +477,304,104,3,2.5,2,8.12,0,0.62 +478,309,105,4,3.5,2,8.18,0,0.65 +479,318,103,3,4,4.5,8.49,1,0.71 +480,325,110,4,4.5,4,8.96,1,0.79 +481,321,102,3,3.5,4,9.01,1,0.8 +482,323,107,4,3,2.5,8.48,1,0.78 +483,328,113,4,4,2.5,8.77,1,0.83 +484,304,103,5,5,3,7.92,0,0.71 +485,317,106,3,3.5,3,7.89,1,0.73 +486,311,101,2,2.5,3.5,8.34,1,0.7 +487,319,102,3,2.5,2.5,8.37,0,0.68 +488,327,115,4,3.5,4,9.14,0,0.79 +489,322,112,3,3,4,8.62,1,0.76 +490,302,110,3,4,4.5,8.5,0,0.65 +491,307,105,2,2.5,4.5,8.12,1,0.67 +492,297,99,4,3,3.5,7.81,0,0.54 +493,298,101,4,2.5,4.5,7.69,1,0.53 +494,300,95,2,3,1.5,8.22,1,0.62 +495,301,99,3,2.5,2,8.45,1,0.68 +496,332,108,5,4.5,4,9.02,1,0.87 +497,337,117,5,5,5,9.87,1,0.96 +498,330,120,5,4.5,5,9.56,1,0.93 +499,312,103,4,4,5,8.43,0,0.73 +500,327,113,4,4.5,4.5,9.04,0,0.84 \ No newline at end of file diff --git a/Pandas/Pandas and Matplotlib Tackle Graduate Admissions Data.ipynb b/Pandas/Pandas and Matplotlib Tackle Graduate Admissions Data.ipynb new file mode 100644 index 00000000..414ccaf5 --- /dev/null +++ b/Pandas/Pandas and Matplotlib Tackle Graduate Admissions Data.ipynb @@ -0,0 +1,620 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pandas and Matplotlib Tackle Graduate Admissions Data\n", + "Source: Kaggle, https://www.kaggle.com/mohansacharya/graduate-admissions/ \n", + " Mohan S Acharya, Asfia Armaan, Aneeta S Antony : A Comparison of Regression Models for Prediction of Graduate Admissions, IEEE International Conference on Computational Intelligence in Data Science 2019 \n", + " \n", + "### 1. Load in Data\n", + "Import numpy, pandas and matplotlib libraries, and load data into a Pandas dataframe. \n", + "Print data shape and summary info of data." + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(500, 9)\n", + "\n", + "RangeIndex: 500 entries, 0 to 499\n", + "Data columns (total 9 columns):\n", + "Serial No. 500 non-null int64\n", + "GRE Score 500 non-null int64\n", + "TOEFL Score 500 non-null int64\n", + "University Rating 500 non-null int64\n", + "SOP 500 non-null float64\n", + "LOR 500 non-null float64\n", + "CGPA 500 non-null float64\n", + "Research 500 non-null int64\n", + "Chance of Admit 500 non-null float64\n", + "dtypes: float64(4), int64(5)\n", + "memory usage: 35.2 KB\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "df = pd.read_csv('Admission_Predict_Ver1.1.csv')\n", + "print(df.shape)\n", + "df.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Clean up Columns\n", + "Delete the first column (serial num) since Pandas already assigns an id to each row. \n", + "Rename the columns to simpler names. Print first 5 rows." + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
gretoeflratingsoplorgparesearchchance
033711844.54.59.6510.92
132410744.04.58.8710.76
231610433.03.58.0010.72
332211033.52.58.6710.80
431410322.03.08.2100.65
\n", + "
" + ], + "text/plain": [ + " gre toefl rating sop lor gpa research chance\n", + "0 337 118 4 4.5 4.5 9.65 1 0.92\n", + "1 324 107 4 4.0 4.5 8.87 1 0.76\n", + "2 316 104 3 3.0 3.5 8.00 1 0.72\n", + "3 322 110 3 3.5 2.5 8.67 1 0.80\n", + "4 314 103 2 2.0 3.0 8.21 0 0.65" + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df.drop(['Serial No.'], axis=1)\n", + "new_names = {'GRE Score':'gre', 'TOEFL Score':'toefl', 'University Rating':'rating', 'SOP':'sop', 'LOR':'lor', 'CGPA':'gpa', 'Research':'research', 'Chance of Admit ':'chance'}\n", + "df.rename(columns=new_names, inplace=True)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Scope out Data\n", + "Show boxplots to see high-level distribution of main columns. \n", + "Use pandas.describe() to see high-level distribution of data." + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
gretoeflratingsoplorgparesearchchance
count500.000000500.000000500.000000500.000000500.00000500.000000500.000000500.00000
mean316.472000107.1920003.1140003.3740003.484008.5764400.5600000.72174
std11.2951486.0818681.1435120.9910040.925450.6048130.4968840.14114
min290.00000092.0000001.0000001.0000001.000006.8000000.0000000.34000
25%308.000000103.0000002.0000002.5000003.000008.1275000.0000000.63000
50%317.000000107.0000003.0000003.5000003.500008.5600001.0000000.72000
75%325.000000112.0000004.0000004.0000004.000009.0400001.0000000.82000
max340.000000120.0000005.0000005.0000005.000009.9200001.0000000.97000
\n", + "
" + ], + "text/plain": [ + " gre toefl rating sop lor gpa \\\n", + "count 500.000000 500.000000 500.000000 500.000000 500.00000 500.000000 \n", + "mean 316.472000 107.192000 3.114000 3.374000 3.48400 8.576440 \n", + "std 11.295148 6.081868 1.143512 0.991004 0.92545 0.604813 \n", + "min 290.000000 92.000000 1.000000 1.000000 1.00000 6.800000 \n", + "25% 308.000000 103.000000 2.000000 2.500000 3.00000 8.127500 \n", + "50% 317.000000 107.000000 3.000000 3.500000 3.50000 8.560000 \n", + "75% 325.000000 112.000000 4.000000 4.000000 4.00000 9.040000 \n", + "max 340.000000 120.000000 5.000000 5.000000 5.00000 9.920000 \n", + "\n", + " research chance \n", + "count 500.000000 500.00000 \n", + "mean 0.560000 0.72174 \n", + "std 0.496884 0.14114 \n", + "min 0.000000 0.34000 \n", + "25% 0.000000 0.63000 \n", + "50% 1.000000 0.72000 \n", + "75% 1.000000 0.82000 \n", + "max 1.000000 0.97000 " + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "plt.figure(1, figsize=(14,4))\n", + "for i in range(1,6):\n", + " plt.subplot(1,5,i)\n", + " plt.boxplot(df[df.columns[i]])\n", + " plt.title(df.columns[i])\n", + "plt.show()\n", + "df.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Detailed Data Distribution\n", + "Plot histograms for main columns to show detailed distribution of data" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df[['gre','toefl','rating','gpa','research','chance']].hist(figsize=(14, 9),bins=16,linewidth='1',edgecolor='k',grid=False)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5. Show Correlation with Chance of Acceptance\n", + "Calculate correlation between each data column and Chance of Acceptance. \n", + "Here we can see GPA, GRE score and TOEFL score are the most important features because they have the best correlation with acceptance. \n", + "Research appears to be the least important feature." + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "gre 0.810351\n", + "toefl 0.792228\n", + "rating 0.690132\n", + "sop 0.684137\n", + "lor 0.645365\n", + "gpa 0.882413\n", + "research 0.545871\n", + "chance 1.000000\n", + "Name: chance, dtype: float64\n" + ] + } + ], + "source": [ + "correlation = df.corr()['chance']\n", + "plt.bar(df.columns, correlation, color='gray')\n", + "plt.show()\n", + "print(correlation)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6. Plot Relations between GRE & TOEFL, and GPA & GRE\n", + "We can see a strong correlation between TOEFL and GRE scores -- people scoring high on one probably scored high on the other. \n", + "And we see a strong correlation between GPA and GRE -- people with a high GPA probably scored high on the GRE." + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "df.plot(kind='scatter', x='gre', y='toefl', color='green')\n", + "plt.xlabel(\"GRE\")\n", + "plt.ylabel(\"TOEFL\")\n", + "plt.show()\n", + "\n", + "df.plot(kind='scatter', x='gpa', y='gre', color='red')\n", + "plt.xlabel(\"GPA\")\n", + "plt.ylabel(\"GRE\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7. Plot relations between Chance and other Features" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(1,7):\n", + " df.plot(kind='scatter', x='chance', y=df.columns[i]) \n", + " plt.xlabel(\"Chance\")\n", + " plt.ylabel(df.columns[i])\n", + " plt.show()" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From c957de2edc1c0e91fee785e3bf8b3c246ba63090 Mon Sep 17 00:00:00 2001 From: Joe James Date: Sat, 9 Feb 2019 14:03:15 -0800 Subject: [PATCH 06/77] Intro to Python Data Structures initial upload --- .../Intro Python Data Structures.pptx | Bin 0 -> 188344 bytes .../Python Data Structures.ipynb | 1096 +++++++++++++++++ 2 files changed, 1096 insertions(+) create mode 100644 Intro to Python Data Structures/Intro Python Data Structures.pptx create mode 100644 Intro to Python Data Structures/Python Data Structures.ipynb diff --git a/Intro to Python Data Structures/Intro Python Data Structures.pptx b/Intro to Python Data Structures/Intro Python Data Structures.pptx new file mode 100644 index 0000000000000000000000000000000000000000..0619f3243cffb03446679efb8945b9595853cd42 GIT binary patch literal 188344 zcmeFZWmFZ6wlz#6t#o&HmvlEscXxL;(%mH`-7QE;mqcXxjqJ?Ea%`#k6Vc*l3{ z`!X1Aw(J2i$69mEHRnP(Nl-9kAPAsWKtMnQK&Ggl35h^~fasWkfRKP*foKTYSUVb7 zJL)L9*%~=$(Yjh$;(r7KA5KI~>37>OCH1+;x^0zbkDIAUJ?OHZ zag(nxiih8JKcC*X+3tJH^%KUbseS3z3Aj2gpwo%Kn})74aY1umqlrvuvgdPr4*VY$6!;6Guf+0en3H;WGE`9p-puMsvedmz_qZTbx=R$kmh~vA-RE*c2NA?GAC&nD{yZ+0Ph;k{(yIv z1F((|JU<;2P;WKZ8z+Vpv|e8w3{Y<~*qeI5lRjS^96@g<*xN~l4VAu_Uq4w>=?l@p zA@X*LxS3@5+Y{IC)#PwHivt=K{7?6mvqzjxC9+7zrSfKb?TsE?T41HfPwWIUSVx5P zR|l9v=V8y3m`oYCnf0ctT1{C%J_S5e;*J^^!(c!RQy9=tL!nzTF`6tm za4VWmSI1t8?_1GrqO!w2vIJetwM)=Ou&w|l95GPEKO+tTCmhiQd~gv6_&^KrLHElC z>Z8VxUa}XnAJ-K4JUUgarS~+$1-9^gGv)7s=86};P91T~tkmP-_TR%+j>YRJ)oqu+<&0}nig6xg9&bCQNdRitjhW7Cx?ng>ccg-?BX?OQyvhZTN=TK?5sl z(~bg`IL^2X{69E*GWGN`k`5XjnBEuTHSv(WK1^*PaF}C`IE@#Rp{>3BW!IebSz*lr zJ~IO790I_jt*s-SgQc0Fkptb&2Kw=Yf#F4({OF~!*beh9dca%?Xbl+iQjQbE$d#cp zkeew!#QicOp`SFH^lk_DXrABi=s|9sY5>>q)5gn^7nkni_JL3AnSgi!dpfR0d+@OhDh}K z+wVkr)68$BSU~UK6tK(v9qVvHhA@XV+h_IAKjcj7R>0hPZiC&$gpSnKDi(1@CZLF^ z)qgIT7eRIVa<6^p<9-@F-mKllV$)s1V}R16!?e(n(+>E_|CLQV;V_o}1TKuf!NvJs zaOwXIE-*;O#a z#nFeBKO@tKoEm9SaiRRMuXh)+XdwZP7UWt@ul=o!GdhIL zDa*{hf5PzxIb_B&w<~y<$-FnU5EP}XDo*o*ga~_WD)(9154jiCQ?|oc)g>b((2JF+ zbHBr-Qt?u3=8x-z>EFeLw#%=Rws|*sv=E_=*ORXHrn8$TCPByLZS^a3K276d|#KMsgJ3|d^HhK z)KoBAtjLtTOy4tRCMG)V*H~7q`IL?m)S=-Cch!Wy`IZbhFv2slwM&4-thsSxd%yfvLg^IW8CuePM~zkx+;RkP(!lncx6U_tCf|ItP}X8S+dC{4B3 ze(3D#{O{Yy`nmq=T39GII9$0UpKjHLCpwE~<`V8pxpbtaf|#qu>MbuXA1>Lkex^R% zAPN_ND$^U}Xd~}&?(C_`3(1j!kO&_jDR?JrFk&n;$ub--@w1IS1UcH`giQQsBWBp8 zHLBSme}ZN991x?8=-Ic_it!>}G4smiG$#*psn4>lJ?fu#dw3;8YsX1m+NhM$vEA7G zJm?AQS8dd@8eQ;$%eViYUg&>~ORIC5;H*f7wnR?V#1yx0bz(Pjb;M@W=HWID1U$0y ztaST(9_f&}bjNY0SXzjMCbg8D4 z^T?u5O6Rx?`04+ZUV5p>UH?SAu>KksFK5J=|DE-MV&8rICvai=9WH;R-T&$%0PX&B zA3dD_`Y0&W3;(5$@Ml-JA~AVJY-C69*|F@6;ooB_8?s+SBiy_EG3|z9ymOMSRVX&* zYu5|QorsC50JYOL`24{37B-;a2J^s)f6zsS92(=+;2&tWIbIm|yI18EZ|jZduHiq? z?lZ)%>V+WFFXB(&!u(rYI{tUo3mP6v-(UF!AJA#PmM`qThUJA`*#5`#67YYDUdaA^ zdP#4rqM8H1@dv8zH@J8?$91s+aOuq+{X5!C`X}05e6mRGK|%6>eo-%9bO&zf&2P9` zxw(Ge!UUjQ!mhUV_W9OzO91T-{G{E4AGG^E{0HsACZGanH#e*|b2y~LB26^W9O442 zfSny~cZKtHAxqMbPpuhxOOHxTGPq!yodEb?KVGeiY7uE<3d>JbN2a#Hzj$T-JQ41b z5M`V%xfG)0rL45$J^XzO?vd@6ylbFIRM!Fc3>#n`;R7CjT`zxAyYHi4)b4AcxF0%&0W-Nk-Chyzl7Q9nxH0uM?bQ_E`V3HXTox(zQOgq5siyo%1aWlVUXS~K z?q@Cu+43VQR#5UPsWakhHV7-7jH&npF;-d4{5%5RwE~+F;6}S~o(|npTkF`x!sXDR zk4a$>WACwDUS#Bkr#N4?|=ONY*9-U{t9;e#t~L+vIj^xi2Y^NqMh#q3>i}pJK|`kTGPNMFHmSQ9 z;|xhDP!TKd3%(iFVN``-U+W%Z$WnY9OPIB~?iZ=Q<6*MHopLV4!^`f+W4N}yL5)%( z18M~RL!&68x_s$VPk;WtmOfUf-N{i2K*a#%$hh%N;2P#vrBcoTru)at`kR3RVAjr; zfs-#c^LK(4uowP=pnW=FkzGT2VUSNXzT_7;w&PdefNM@Ken~zsE#1 zWOq(4?81^EO(wzhGJHqgjoJHQJzU;W^aI?`>)63O1T)sp-ONR%2g9&Ma|N@dfMr>O zp{K`83~k!Kk@m;3e7B^*1@4g*dlrBcCLrRS)$+0|fBCsAw;Ew-9RDiX0$(gA=d>>J{C_|Nuq*#FwfqH@f20;}-ebO( zUHK=q%y3)5+pwo`L(Qjd2OH||7u~Jj$lgDR{TLP>Vxv`ma47qyg^N#>) z1;Dpxg#=ofFl$XOe9L;-+Tcp)k;Sk9Nv4<`@xbF29B4l7s}_);lwRsi2AD#9>hl1; z#miNx9sLuih>Ji={IOZ_pv0pS6? z0)EkKKfOs?dm{%xdaCDWW@G(d)dDd4fdK(3K;it~{nnDwVLksMUBT}VAdXpDo5SLf zV;v}lLX)7q%u zXjF_>n@cLwtyR+SuCsVGQ-wn+O10))+L%T0z8-EpHmBRPIWas^9HbLak5g)q5A*b{ z=GN!T-3P!7d7o(A8P7*UqD|N?%yua8E`HO{E}wG#P^rgCH>J5SnU8V2SNHsAC-(N) z=g_;^it@R*(i_JUZF#0M=u@$m`e@`^JV_?Fu8D(9MhccIt2e|Flp#5=G)%9WIxI-o zZa_X0Omi4HdR?rB!;D3bfHS7UIoe}1X6^*18$beKML0-$B9HcniGPm4R!@P))}tbLY@IdD@W7& z#t^%Zs{qkw2NQ+dM3`m=(=*TzSuN*k=4M%^&->NDngTwTECGs|u#|R76i)4c0;ks< zc$sRsf8eFW?XVk9#z0a$0hj@#MGt&XwP2ktRTZNU%qI{%4Z}mDuAQ#Zd5=ti29@xe z*Ef0j{@JiogE+7bkQSTpL7xTdIEz+L(=OA1rUcgFQBR=|b?RIRW60Fm{g}r%-?-xE z8G-ZDsfL%q4h*Ur8i^^7nPb3u1ev~*#-9u;Qw%@Kxm;eamZobP8G))D@KNh(b0uiI z{iWU`x8Hz&nc)BZ%E}js;AZ;2LVjK*_wV|FaH<>49DMecW3$s{nhbi_SBR~ z2Lu7qw#FZQU$l)Qz^P;VAO#3W?f~mFhy}Vs6x}bTc9YfKK&ygnf~e2O;S4!QT+%=UbM|`%H^KwRq7v4ai-twO#pGzN&XK(03c73 z7d`*W-gNPoJk2(P>@+gf6Bd*8Wp5IBF}%+ouIfPf0fx5%Y>^(nzu@&vl~3P*t=h*i zGQ>bcv9A6P+6jbj*DS?)-{(l(rI>V)Z1IyAw10guyiF1*ypXezis@SC$x>Bqk`9gPTIwxqCJy z0t%1>FpLCAehrZ5^-cp;nrB9!oQB;|ma?F5NiQdj3*RE9##}+^_}C~G(rMn}I!pT^_rg5Mbv03Sl1wS^YFes%X;cfKN&a=C z#LmpI`V+wXYIphxOwIpNU`G0+@BRcZzuKODMAK>f6#v{x_P=Z;=}@f`Xh19dh^Dhw zeza1Dnn!8jig>DB zO#>{5AJH^T$T=W8dY;WW&HzNyv`n|2>o3tXFR4kfoD(KF6`*1qlz43b71MH9{~3@q zQf6Er(z=l-Ut*MwKBcbyww1goM3w#oFu&Op0Mz@R5UO3Np}NUkw|@E&HdY$vXuNQY zvXZIK@C(QM+TA@_XNvvfSXyH&@A9Dq zv;(8Hhr)Fn;N(?%%waE?b^mT!jPAmyzlT8jR% zZ<~vu&HruR#^3~Z$Qsy&BuhX@z45Y7f<~F(`?*;*Ee-%e`|7{UB$Q;^k)Jc^urgJ> zHRt}924~syBl8~@4C8O&fR}>#4~R*w#Q*(*=_$eo`x6E88_^4x*8gn%0t}iL>lXq1 zZ`Uu@J{e?o9WU1mkw4=`ILtO#Ji5vsapMnzX2xYiwwdm~L`(=v1V01$f4vI&|Ks(`PjUBeUB9HfZB+SV z(aZQ7(ff;f0a#bRj0)(h3$yizuwJ86bKpV1Ef+>7tNcy${!_jD5WP0P5WT;xmlx~m zM&^pkpdUe|h!5kI{qL=-CM&>1x}32%&(ii(xMPONIG6Zw{qoP_ySz~xt(7ocGNL(+o(0WPOPMkap(mtRTVpSb)d#0CEYTnKSO zPyPfhzf!#ak{A53emOAwn|^8Wg7`cAGS7wcPx?hCL7!O!^cn(p{;YC!nzPqBUD-*5a;xE40nGZmJA zhBG-uBw|kULTrX*n5iHQ_%VngN|~Q?4!+wha`SBYfFAbSs0ICWpl6!{h*y6%-aj6x zW>BB`UboKu@TTJb=}7h0S3xTi!oFmHUnkOj0|bN&*t%bw@qhNj4`$xk%+bFFTDca# zM|h`QNIN5=AK)u7uUITkrj+{#Y^^V$xSl;jzf-w9`+oC_*ABu;Vynr02 zJO*b%lik73!^A_D_3{>G?G0E)_@6AB>m6-pTaBH_o(1mezwMYR8e7b!)Zs0A8GANs zvL@b5D$lb>`ACgZ;OteE8XL&YvStkgsn}`9CBChnX;a-iQeUUu$#YQsGa$M~d z*PHVX(S6p$K~$&X;?yeo9EcN%GeO>4^>`>JU}AKAC^tMU5U zn6K7dy)p0Y4kQhDqrA)x`l{(3zaZR?&&cZP-1*^MSd^&aY=OP|-zOZ9-QmxuZa%K#7cKC&7C#=CDF0Z%^sI&W@doMGU6>=kJld~F>* z2h~I1Tg&YAnG%J;82e?U;M__)l`w$^JQoQ>nMQS*P32~?dKVa%QFER|q{i!;naivv zF6Ypswjm0K^Olo7!63Y`x6-U9U)7xvYLQD~?@&1NWRS$piFHtq3u{&__8eV>1|ZLK zJ%opio-&ZN>;`dd8;hX&Ffxqw?)1ujZG!@Y!F~5%Fa_;Zod`@1Vwnh z1n3#QX`)xoF)F)$>>z6#&6#64c5aEdVz7MLklK6|!51hDj6j)h4E8l09Fd#>_g}3$yBQ zGji;x4M<=b9Z!(pMSig6IL2|h#|ab8$G?4`tbHpPPmu0u4(CElVb zNb}%VoxN*qq)8L=>4<`?QG0xU{qW~h3CL}-tU-)Qx z@Giu7Ilvgl)gNlfCy<%I*#2GO@ceu}sHw91{p4(5tKI6IxyO16r8wQUx*~DZOh>c~ zwHb59T;a2?j|7CFo(=YwhSc_Jz0Tldr`N;rAB5oF8rEa^%*bR)=t zMdMki)<cVY9ELC6}(NGYLf!BSj zYek3?LX)k5XtiZy*=$?&mOZv5KO0;Jxkdq#Cby48;^8I-O*9Qdc09K3P%FlUNKL7< zQ})ZYKT7Bx$Uoa@uiETY<~s&wZf4jGNXQJiK~S|-EJ!#}Ss6(bdWMB}bR+uE=*9F+ zgfkY22$6`f&?r5l!GSr1L*4R-A+PxPjoDfHJ*%|hw4x(J?K7EHZXRzo#E1x9ky#Au zC#K7({KAF#Q6sEE=qC$KZjOVIsKQn=)(_V~+hn4xwYRH9Y=ueCx@vQg9py#POLzsMxy-{d0<-ch z$VNp`=rlMz1H@Fqg!RdX+ai9{&9n6o)EnAQa zq|)k?Fbn*GF)W4*4^!di{YKHX;Jwj~d6`XQM@1nhBKR~vTj`NQU0!?l#;*-o+*f7+ zN`PNWJpueKD(Ww4oau+mIMC3rUhhYFJOY{p?YK=95lIq@b zvYdP*HzCq$JKI1b0o)9|`gZ1N^Q@7js$BCmY8<v@62&v z<0mu$!(8XL2&l{ixBO}Ef?R47$b?psM&=2~vc}928x~~>r)9*tEfunO^Sn9Jg@L`Y zAco#E=3uQdlY+!;hm#M5Pt^q1CE2CrVkk9}juSA$(5}fnZOxJtDr#3x%5pXLe`|F2 zYT{g1M())9)FTE`J7aa;iLB57+haRst(b*I6FW8>K^A=6|Efui%>b*nJ@NTnXv9ur z704rfQ6@yVtV;qMD&7(KA}tRP)L^tkd7Vi5o+FG?0R>W3loM*aFYP#c-h#a(j+3x| z5KlpelXW$+x}<@rQNV=KSY4g(gX$;W&)Jgigm_hgD8jY|8w0!Z#hXA2C&rvl@1vrJ z((E8A-X08Gj|+JvTq^lF4LfzsiY-WupD3$eLAT4(GU}g<`5m+0P z@IZ#g#+G#Wc}f}D%1zyEf^?kj&m2*{sYu{`{{{`3mP)ppxd2RWvfAj8D>Cy!BFFH3V=^>Hy!SqUuNdc@?xT{WMDsVU0j2ra4;d=Zi(?YpsCu1kl| zMf^cQd-CGP*{cYb2C?4k?G)2i6d)(fRT}j$7W5?9b-{x*$1JJlV;3U zmEo%CyJzYiOl6;_kgnl?EDRReT(iyIY>>b+JX8vv&X4 z4`VCWt)si6_u1;2-vRkON;fa8${@|*X}*jh+B>ReMR%?xBD~nQs)(kEaO9DWs02iM z!vR@RWlvxD)3S+b#d077`;xs2Yu?kA%{g|4fy3yR+m(dMceP54`je;gP&t^rWLrvo$;Y`4k~MP^Z-!F~Jloir!{oKaJbJ=1Kc`gFq3YGjM@nl}Lo5}WX} zTsVtS6wB#zT$M6)L{@AsjKoDazD>(3`&$s991_K32%dmE4T4$7INMEVahH{$yp9VR zI;;U78~kE5&ym=K6Aa>Jl(?vMCzRx5ezgt%N+xoxo?Z|5{O%FH-E#g=WbJo@rSH$8 ziWI$Dx8)=rU=zH-^XE_R2jA!rBs|}G#p`5&#v$?q7}~&zFQ0xNy+a{%QyC{xsA`pU zC-#OIe8NoVYRe6>@Zl>yn>GP{`LY~E+228<)j=$bzi69HonwELUo*+ZuHffDztFas zs^uv0M14nbIzc2=n?zuzB#D7iWieJ9+^aIAKz)&lfp7>th;KepM}-s_Ep#hcH07Ut52~frb&~mql5_Jp#hzZ*E2OQXP~#UAGgSf$^E>5!R=-t z#;pnD{#CzAl6GwF`1~0rv#ltODdooC=g-OLR&g`7CXE!N&AvG{PAj{^@!-d?_+M5+0#TkgEKc{~qMjnMiC z%$b}gPKR*S$j!fV-;hhTO?{8fyaP3L_rQAxoX0WZ5aAp3Buqj}Y5`2p=CzggRMYzk zKf)v`_^eE1>s~SODt4T$_67&SMoIrO3(nIgZbyo1Ccq1b20c<_0mBag+dWj*QId&UL_=lWr)dik+>w}E36b_8Q3nuS`| z3fJnWM=p@h4|`5L6mg^cR!UOc-?cE~W#amdO`KSP2aYp^Ir#ueTJb4;_!IR~Y#jH(n))L5@WA+Sw{Aq>b>Aetst|wK2!;=Y`HJ8?bq=F$gi#(2!uQg69i%DJo7?IwtMZl*oB5 zg`wKVAuWWTtcECYcvBzs=_8-uam|Y0Y7wk@JVRMc$AHo#vzjkY5}h9Hjyy{B$Sl3m zn17^(xMq6Z+cQoai{z)#{dM~xcA{lGgdOfw(~uf3+N$EuR_s|Rm((zo12r%Yahm!c zSF(bs;)SaTX4!N|0y)^GLpMe`^z}Pgm}6wYz=IXb@kZWY^GYw$hF9tOyfUytr!5p4 z=86T;o3tzTjwP{kMJ9tSPj7LGHW(LC zI3w&&S|Tb<+>^0;(C>Ab(3mx}*bNLsDrgkai8n7FUO9WFfsQ+4D@7zd332dsL6crf?3->`+|1g@%5T2E>w9K6O>Tbj31G}T% zq!yW_Y8BxWjSNk0-G(-59pRu>R{jNMH*C<&fK!}-lGI}L^#1C6kd6CePBd2Qt#S2b zfpOZ~&%7uS6^PN~WGHtyXYrZ5q*?|STF@WsN+6SB5!n+WXuH?2;d?*EviI7jBOia4 z@>%)r8)v1o^syh28^0!YA`yDjbYRepK0X$lfgLVF+NR&4)Vs7ul3H0*S3S6hR3MYX z3BidPUy4>ydF9i(i*W{U%;|nR?ouzQDsCvV%&3|3DZVPSmYA5FK#S_|>3clcMc$|T zQgB>M`KFFtOs9|iIn0r+J831kfRnhtDZwt$f z!n_VljG>dfksyAA7$AswPsJv7m&-!}XS94)7yGaY5tr0+jV)?iy zphSDa6)p9~w%gI`6`ZTqHnsF>x_N9k zFT!C$=-8pRUXNl)WHe76Vn`ha>NDZ`NYIjQ`$iXvw?}Xm=?23XP8IMU4q$Eq-RC4m zpv^~Y$A`-9_{OX837V0r>zjo0$D*WgHF`sfWq!E}jQ78WE9F_|!Mnnypyh zSvW$7Dcm5?-saYX(trI$8x`6P$hdlNAUrSq2}6L*G(jbZH;-xc%9GGP++hJ?akRz2 z?^Nfz4*L6fN7^?G2;xr(QthZ0BojmaOPh|sG58vaEOyM719H9_#n!j+N+=!AB0U~l z#>gya%v!kblS$jQHW)+*AU(*LFqmSn=-1E4jj(EocRX+;Nn*x5Ngtvv4dfh}WE@7R zE+Lef756_s#%UbREVyZ$Wl1zoMSY}97eS^{rBsoeS|3h1iD77<$PWQEN)umGt zoCO21hrDu+A_Ah@&YeV;(_EGvm*Dat{^D`$3(5KltKrykU$dF90 zrS+w7^T^fqZ^8@4)!#qvV26K~>^FZu3;G2ww(~{^hHQnS3mVc)^^O$;`(dd%0)bmc zEF+#A-Z1MOYygtmW{+>L&`oS7NjWvxE9-p>vz1+};31;e3j84u{e z3AS#9j<{_)JWbme=R<|feS7McaC7VmvAlOWuFBI%T~Y(NIQ^u}!PMqzELZ~T1wdlD ze8MWbGF`uKeK?VGc4}Hr-9XK2yy)6saa8&iFp@B@CZ_8SN=A(>%=vjOWC1bs;whU! zf{Yt%T|XK(gIx8UmyzXN!QzVA)2Fw7kA_z58;7n_CTrdmW9D2~UL$FOazyubpv%Th zFnlzYADf`2fU?DHyT2S>RX3m$Nr+hy6YCIic7V0H++nktQjWrTeUjUdWW-tfV&WTG zk9wf1K&@ZWnk!6jnkm>(Hsw(goq0KXhPi2I@b8 z`qXmlI+1hT$dJ_`=l)eY>a_u%7rAQ7iW?hrDIb+sI5rfk$fez4GE9?2Rn~^etS=)a z#R4It*VnKy4|bDs%U}wNY_uf2Qw2Fpe&!=!6 zdv;3wxsTjAi&53}TS0~7!Er>3xD5*ys1!{ibMGG3($ieLZZzxW?2yR2fEwfG#%wf% zxJO$uD#2)tL8kRdGs>grO}#-K|E!QEzzn_xIm#$66W~@s0c19NE>mZ&9MPTXk9Jy4+O&Y0JDKn~u#bhC| z`A4q%-82b$yU55=PmSP#hQ#U- zMIq1i+A`stl&p71IS)E!;Kvk^K z5Fg(@pzE_EAVN|sQYkGdvpVyTRAdJtWyfD_+FL8o#p5L=xllU^^njoRx?`kaBp!>> zd^IM#gRXgbT-mndcw9j%sv)8ctg^j~?3C{N-7XaoS^;sEaK3!ng5^USj3rw$EA=Eq zxpDDZ%kPq1?)A$1*9+F|?x{74A=#Wr2oi3!SeId84EJaW4GCD{DL4MPm9p+sz=MT( zAXlKS$iN-~!sHtYOW-vV2rGdSk{BSu{49j90Xg$tDRC677;@Uk^#*Ifw$+ee@X#9y zz*7D(AmS)BsHP&KJ=e5!;S{@8H2~;#P!`#6s@`cRJp)56P_9Z#JlDdsJ7*2gAy()~jCnfF7g&DOlyQOn&Hsbq#l&LDAe&OVN#rl?q^ zXy}LFqwD0p@|^vIw1JTP&&W9*R1(+eU6s$5CFsd!8(&P-qSSV1>u7rqod?he4L13; zUqM;fRWKH;Di6=c>L2S(QCr<-$h2ov3pF{nG>zPFMIq5@Z+oUf6%P|jK`280ux5siy+At>J;lgQ?L2<&W`bIIx&M{NL{dQtK<_ojABOWC2ST> zPkuKA_Ef6|a`2;7LOcHetKdX4(3sd=FWw|rIlzs!cz%`rSFql0d+rx)?z+_dM-h_9E88jtbT)2CI5Werv0rZR0siwOA1ks$2L+A3Um>W z|K3&F?iDp_=%UkvUO7@ZS{0O0q4>0iE zT(W@^8Zgo)s)iqeJf29qJ$=NUV6^uyA6CD-mlNdc;(1VFn1bU3K4A-VM=A@XylfyG z!ESk_6^QuJb;IG{&I*e5Ywvk~4N17SeFnRv-lDIZEyUwezl`a<|AdM{TxtnAEd!xl ziDG7W;~KL4fmVlb0=UCFn*$U<@+nX+q&Ik&ruXY|Z~C(3xM%L~J1$?jGtrxKvrGEA zI!nLSQu2JA{v_g&>$FaTBFiCBIDy>=_9{lat)IZXQ8|dP0SXptO49g#_t4J^E6G z<&VgqY57IdrGmCnwji18SSI?L?2_g}JdWMxfE!4F2awCnQ#a}rRut(Ihl_CC51Gdd z4$i-U;?Iztx>7O0|i%k7H^Uuj(My zt1Hvq2z5gUdH2?b!e7jpFH-K~)^0M;mj@^!307b=iBjs}OLZ7(cUtuwOL2Pf^;SN+ zkEWTnu^X$!b$*-;g!JrCq~HUAIkn^nB)edDe114=hj1NzJpm_yVfV(V;(ezUns$66 zo*3GtbUkxf4`!-?@Pm&@O``d}iDfQ7{lu4{NC<6x(AR;nF|;(EsN(JX_CR9(FCIV_ zP&`EQr-$0u2QL`$t~HM+;!cy;16DD2?Mg{aZAha;7@pzmi_pkxY>Dm>fmsbdM0wYb z31m>4QANb<0At_{FO1PB->!>4Fvl9w`?Kh0tMmPB-ydJ35+B2rdrqB~pV);ohc?Y`V&W!nxRFW-to-Orx=fOoOX z#6#s)O$hKh=aj1uaJzh@B#4>B9cGR7*)!yCc!y{R>(CnrZ$}JZ6{hiuKJk=US*I1= z%9Gf3J5es#92~B8T}&-`TU|fI}ZlHr2aTc zGl6|=19Djkx^hKA;P|mgQxhU@P4366_l@OAugXN5a%2SmloGN zYHiu3ZSlOkV~mP$=sl;GzAL!=sE0|NQ;bJy;&uM`wbV(92#xquJb|>#M!R~!lN;bE zsHo9JdxGZ1w}{?t351lXRBk(V=*P8-F(s{N#GIwP;ySBs8W{jLj?8UZG_BiXfI_N8 zAGyZJg5VdMCC(p8ArX-6R1*RtA3@VgO0G4!|C(f%WPr)y9*_sjo;%T>{OrcM9xdYcwUcn}H6z5wStlk;pc(Hs zS*TLs+VcZL!pXl7v?iu#OzIr{I=+5xZ%zUH8F1Rr_(gJ7xLw7cqIpZAk)($zmK~>b zY}DTDQ#olGR_E@Fa|21cKc(T|b*_?}RjuJYAvIs{R454%3tsC9~qKnx@J0vnJ; zsN)-XL<|ljh}R=5s10Jqp*{la9E+sxlA10e=JlC~SfAkCm92Tw)E{ji{3fa2(ZdLL z!`2H{LFFqi%OCeBLEPhSD1!4`sXRqZIxYy@TPQck9St%&Hb*9&vEfWAl~#YE3R8po z68G!`Cp-RD&a0VdSA*iQ+}Y0Cm?A$S>2&`4bP-S|OK;BgV5-=cqDalIaZZ5($lBdZ zOtKv4MYNuBK6$H#cnuRR3{E3BjN!&Ru})lI?~b z(uXuAb0-Vy()GzvzK5w(_4t6PDl3mGG;rk4@*GmFF;vA++hbU`glDm^flus_u+)|f z>W3il4PJC!DlCO7y&r9w4rLn3?dXcsordVBf}8if-r%AWa|V#*`VVE?qzNtw+y*Jh z3-;(jXKm6TQFiqmH{i`JNZ^4gt3TiA2KemTo+ zUAk&fM5UD9HL{z{S()M@A<}JoQ z=A%T$nH5OMXO1CJI--+$EmOj495d+qVH4knX!-e9s&smkm{g5}ND3P`^7n-QpMLiyTJ)dI_{^y^LLW zvfA$&JsW6dn3D|?-L3bY@5>?Kgy!onVu#U$fm_QQ$ayMmxJXH-kfF87jHxwjipn*O z?E!9iQ`=r=c@GE86OlARnr?!qp3*Y%rk76|PdLhjjMNgrK3)f&OL5l?>}l~IgmbvY zG-V;#Kzc;=F`eN$%jyo;Ty-c`b8>JT)S>crQ@4&J=R(BMJ-o|yPL zfH&)Kj=K-chr8>UAp?_3codIR9G>_3S>3WJ5 z@KU9>#xWIIGkTtFu%@Xi2rdy&w2ARy1GJhl6}aGhO;Q-nyCfLVY+bc%S^p^*csXMnKJ| zEQi9h_fg%PP5mNm$)j^=*=HSvLpr+Mv5*=7e6rj;Xt63rsY6{R4F;D|t5m%=^& zQa-&1gfrs+u`nulj1FDLbdt?-9-q*`a_Vj{Jw#|@%tl)BSAE4kowgc?4fJvfA9hQ* zPtDT8)~tQgpr}w4hLo$Z(;DeHZhjfg!;(}ZjRA(|A=z(+=a1h3J5aZ>nP+|d#H0Jn zKUxSEU@%l!^UmZ%QWJTn2LGEkkn~u!vN$sNoRj)R`|;|#8lyg|HB!|D!rRvho*YX! z$B``_=i8i79}?x%$m84gGbS}fi8Ueg?B`vcKc^~sP7g3k{(p46QYN+qP}3vR2vFt-b%NcFsO8GqXj`j5Z&#MMjVQjXr?T#)TiYxZ>M=bH3ju zGn-OH`~#OIR*bw|^PM*;RhfGb7$;|psgRdHmjSb>+*Y+^U6&- zX|t3~-m2s3jj+7cAZs9hwRq%Oa5bk1mg?V%dxpgA&d4(k(o+O}7<~#>$kiZsOEvUt zK4!>RRi75FpDo?yPY^d|BjQFI3!jW4!LfU%T8gxhIMgjU;2poL!A`Fzl$5^F1vuq* zM{o}splu04PAifl++(w4`b;P=Zd!H*>R%`3zwr;474ePpF`D!zXqBxkGwtP-vQzM) zIC>g?L|B>)L&O}(rJxly9+9HpbXSFT*ZRwZO!tHKeG()w!p&)UJ~2TBN??e9ESq;> zi0l>sR;`k-vKLozMeOC)}qC2(xB1psCUEc0X*z&;wR zAnZlpG6f5$j3uiLsuVh5E`@sc0G*BJ(=@SHC~GW&$y#E}9!k|YY1HWz5!idvCE?^g z2~x|Fcs<8mU}cm}v(|vB;1R5y5o;>dMQ85l^jqFGCOq|^{a__a=vUePFECw`g`PGH znX_rr!Ygn4`Vq?~L(DGfEXXpfje%a?QTQSSF(~xgDu>>yYY?-`ceLsuG8Tnz}4gBx>n8*C$ zH!m8dnt`PumK|F%0B9C0Sg>MjP8M)klV{`7qr)DOd1B14?|98YRBC})r-yiz5pvuQ z0*Ea6$hG-}@gSF#Z(^aoSff}z(=(o7E^}=qVrihEMK-Vk1~LyT1m@Imyg8&0c}T>y zK>?X0X(d6-+exw#!eRO@dv{UFule=WeSChbDT5*z^T}GcsYx+2skWC)*3)wUL984`?c-XPoMW1ewWh6-B)w=8sUlj*ej8_SdIm3$qpIo}9neaHBa^U3U z+vhsu?-iTJg5B+P>#c$gwL2Ydc$Y&Hh-z0|V$l73?Db)0V<5YA*W~wCYD~^3x)%sNi?>~1 zcS)sgfaJZrQYLRo?XPO|-w!88CpULSh>*0q;zSF#Q|>BvsY(tpU4i2FbjB$9Hf^@Jw-rT~RMo92 z7~u}3Be9~0lrre#+XPi`{OU7dv&jE zCRjPg2G$+m>V`}S>Qh0xrm4^$(aGYZ z)&=h{f-Iw(qC$$Sa{NgB>K>B ze2&(vKL7Q5>-d+$vxq-N?2;bMr>Dp&<5IUpejKi#S_BhLrG7DG+y}#mpMq{S0j)6> z<)9(Oy^NxA5~x&>hcu@(9$DD1!Yi@7zZq2$lD{PBk}`pwN1!5>^5)R0q9P{ji)7qQ zW*}R&7uTSZa?|I}U;Y1H4n7mmZZ`ju8nrL+-qcv)hxR^KpowG6%*luCqCj6gEN> zMZDg6ZEX7O_AtuVB@WkUXO-`qgd5SrqeR8Q%|7;#o)vlFo;3z>O=i!D4i$U)pq~|i z{lEzi|3|dYn*m+GIP>Y0?ebupfGi$celhCK%{wokqN&tJOGjJ3-m>Z-|zf zIOo9BhXH#@uZBaqq(pDQ`Kkqz^o){^w~Kdxjs++;!(`UQ%?6uaQ)ISC|2g1HaHI~SF)+FN1TvM;%6r=+bC0Q9G8#larV?LHOQNsR%xA| z!>VL$*tGHFZeXX8Rx5{Y-E_jbtWiBHMy+%K>b7NF|KN9P8vnCW;LZV0w=cqyVstL} zraoPg-;@E$7v^d?HHKMHEyinOkSghD&S~9RemSu4Tg`0l!lOi#5x7hsqkNSqN9&=` z7P!b<`mi1nVbzuyv_M=(nnzcHg(D8IfxT$fz=@E&-T5=Gdv`{EU&@*!mG`GK0quaofb<-<)Eo1@K(iUe~hNEC#O5-Q4!mL%c__PXNZ9W!2|KN z5km_~uUNBY1(pS%RhT`vpO$Le+>1`pzTVIa288=91Ik8MVzd2^w;O45nU*d#CQokKHnH+i|{A?^z z@eiW}_F(L=D)ZUw2RUYO%ekx($=#3BJD+uCfuuXDdw=8Qr}*1CWJIa-`al{T&xZONW< zU_(2mS?e2U4P27OzVEp=;FIH7>hA=hJ_lx1bzjosxn&5U^ZjQDPU+$=03@ugQ^Y&A zR70V1fD*nng%*af?w5%re##0mrATl?R|cVyY*JfC!J%KK9U=Yoj!|91oUhXnW{I_Je(^w0rU+`n3Kuh!0%dJnM zk*B)Rv#;TeWD>w_W<7y{cRze>ukX{vdhTwihyqy1rG_&jEc=DSH@eU7on2FS!u^U3 zE?>x54jez#P`13_S=&?8!-a-SpRoinVsi|&fUwJun6Q2U<=dJQxHnUqjxmAjN9|c7 zxffu!?=!E3kzS`<%l2*ZttJU!j+`#am*#cyZjl4I8;MYnHEXWi2iO5=Z!XVXgmUBD zf?N6fAtWfS9I%nm-m5W?3sK;6+9_`XE}P1j5GWw7>N2*jzDFM$%VIt!fqd|fUb1Bh zN<+EfSQ)@OBEgzKdALqWjR|}zsO1L_-Rt`TdEMH}X5T>yW$M+(M~Wo1`M22RM@5v1 zqZZDG?7p>=4&7)$ce?jbRt!req$&B(aU2frDoh##ufYav)#*`V<_jt$YIjmuuLinm!UCI z)-j!&A`Hh&^5VezgO|Z}=W~C=idYr#)OJ*tP%~Mx6^0EO;mLkG#jy`S=P9a;z>pi-5b~2&d!3B4WYhcs(_FDx?%}*5yCRK zkpLHx%%WhFxW6`VoA5V?Y?|xPCdt>{yDY(AWKQLg3g)jHNaDEzEz6a=PJls++t6oW zc}COd;7qpX=W7;Bx+93xrWqO(VaTS0-m8P?Cn+)-z~bjp|CBNEp}}vZaPHU}5-APu zBIJYtW3_hK6kjhFHNZvT(7|~j;5lYc&mUNuQf>qoBuMbO%Vz_OTllQP#z?_VTy(MgZd!im>i+>{ z^W5*?^)uMF^K&J8(syNi27#bfZCKO5eXz`Kg?XM2Uj2LU_6WjljWdSW%Yv|xvO?NT z{coLdYtP+fYX`}r`RUD#NF0A#FdZKQ^GW+6jnA%H8QbRvCQvfXDJ1O*LspZQbyNjB zlJ^OeQ_84|m>!4o8!2~2-BluuKpUGZFdjoLETZCu$G2$)Ab}8v3kz6r9n^O%L7#mP z#ZV%n;Z6nEd8I!`NZU-t68pxNWKD~mNb!G5;e%TjbuG|N#nCCgtA=XB382fv9KB~S zs#1(v@F#Fc8o`We^C;C37%|JqGmAnQP~`n79=9M*d@-*?o7f2Tc~&HV%q4 zBQclK@EG z6GX^^^!PHFaOYktL;i=nk~k*BYI0*1;dhn$W{e`Relnq@QlIOY5z=oQ?{_4{>O^NL zrd+ABUlhyOPCy9>6Xy-qBtnF>^>ah>96uFlzcwv57?ae4v7`0zsZ{+#_${kLmvt?+ z))~eyb-niql64t5(YU++Y};Z_HAI5FDoR`1N6&x%XHH>Utk(GHj|dQz`9Fw&fAi)p zw9joe$56krfxN*5KlgN+VumAaL=Q!()&%^jR-3cFDBl7LME}(Q@${V(bFP1}A6VaN zV;9IzU1z4`i)`X?ZGW`{1Jtu;O{P0$?!6vQW#ZeE#yitCa7*voO#A56Y7oIC7+}P9 zHp~4;fXj?zDL%Y61*AxuOWDI_{1~6_&R?enc(AlhG512fTAAYMcz8I6{le0pAI=F8 z7}uf_Y>%XPjko;__qKEAESz>{kH`H>@CO+-xz>xkn9&3LT~Yz-%0r6I3E^X@dEB`{ z7B(JIt*5lp!Z9{&&cQ{*Q#60Ygx)esQ_~S1sC#^Ji$5Q@4_3`qPtsB0`fD>#-<9f$ zUGnt){{Fxy#PY$RVZqPL`54?(VB_&P!2d@Cw1OS)%zv97;zwv%fL1W1rGh2qsxHBj zkyHQ1PXpu^V5FFqoHlpotVx%p4<~Ii$`Ad_H0Nk2kyREG6-dSHaCaiErEurv(G zu(ETp?jVDk(?12d7|@nRRhfxmRB<$|$#2sS-)uQ|9!?dVwAnQa=CB?;WjW=kFFWAK zRt+p?_|%73w)dd0jZNIcwRiFB6;AcV5aQdJF=m1)W*x|S_s18=zzqd!C}_(CLpNlH z79Zv3q1e0aUvtM-pnJcgLy|^UKgV}i#Z)G_8;=m~`Ywm3erwlqOkV+{o?)0GnM}?& zlt6)#8>H9=XCj)9WIEr7?O^4DAb=k3kd%q@S11eSj@a3i5L}22Lr>0pZ%QbRpDNml%t#lgdu0UCqw_q*i<0>Pn+LM zh_Q)I*e}@@2Xd13MW9Q|FvOtDfz|ZSKxp#u?uN{$imdU~UL~{LW=@U56oA9D!>cZd zQlyWQC4wS1$=#aj=Xq@V(%tH#+p@x8A8>*vQDMwJG+>}|PFl5BV(H$`<{zY2nZ+r| zb8Sg}wY0>L1t?j>=zTIe5{;Y5%VFLPYe1*=OyA8Ui}=-UNv%<>F-I%VenXY4P!~uk zbm85eL89&x!now&_j;z#ZVG<%9%iJZC5>|-WX)=4$$Te$Z3mhLTWui?PxIH$mcLP1 zO-BU-o%$B7;*vMbjcnnGo$lFn zmvTc8yDB3C^!Lr$0YE*FS<@cn2Zpyce7|q$O#ssfX$87;06AFCC5@Y2^LM1LLaHOW zSX0#3=NPyo55MiPuEi8#$v=Y82h`{Ty!J%mET@%F8jyb9T1ap@O0*D+i)tjucFq?B zq!Nt#(n&1zW8F_nB@C64p3ab3Y&PMk3WsL{p>}~N&|w#E`1%}(O580LJV+J;6x_xHROCmfcFtW$+IEH=33?}Y#C`{e|aNcdV) zZGE=w%Ajh6LM&n5@G6N$guV1@s;G4c!aC5YVp^sk0)JAv0ES5W#P={b#s>$0BVL(F z#aQ8wT?_BP#n-E+_iMdwk4NyKdBTQ24r&5|VI>*6Bt8{=mv1+;01lwp+CVG(PAk9X zR|OE`vO}%fo1*d`)@d<<93a`uS5TY6|LTCgG5ig;TtSVP_P`yz$0%_Nn!BLt;|Kp{ z8~#)S2D6F&0LO<>54ETPhxyrV0rU}2%`II51ZGZw_hkF#yr%E^)rP>k8Bzj{mF9!# zrxZ>hbUwvbZhfQk^Eh;SLt5j~ukB$W3~2t9qvuzjOliU*g^98bMnDt8MG-W2gh_Ay zs3#CyZQQJ`4TR{HU9|j)Krk3wdt(y*t5WsV)1n&yfh}7of^T2-YhLw6(Ga=r5zF+?*vv^m4hTklAOw2!-FQLw&%Ntm z4&aEq*a}w!f)NTS{X_u}-yNwT2i<%co&pX+zIHiW=$^inAhoV}gaL0{b9GLlW--A% zFmnh5-l!~xO(mnCu+;itfJiQRgq>CB09ZaSjvBWe=gctpV3;+bLzh70oiL;eC+w6( z@;1R4+r-Xkce)*{5<0gLg-nQ;^B;x*O3;w5IBOuHJ+b$k;(+A0-N%<=3C7DJaM-FzQX7pzeH&vo=kQ%wQI@uO5Y6<9LA(qL4O5F6T1 z!~_3P2A4m|VD<8AJeMy!>rwU%`i)6FTK)U@M;XXqjqeJ8SNy9CZm;d#Cepe^RLyl} z7XIq4_blHFSTUH?6(O9hE^_gS^g#tQYEPbk=(o3u2dh!`@w}D86eRI!A2RHh1>nb! zF90cG0-s1RL2m=B^dHw^-y6M>NS7~a=O#1Pwe(=+9}(@uz$pw!Z@D0s+o*80C>Xce zqlI3iS$8oQWc8Gp&Wak)yvR>X3~5LvHrwbY!(v@ab^RKDRj#!PL?K$J0ULHQ13tMM z?6xw=P?!pkpK?2d*`}4ftKy4m6gdE|s=n{)M+JAti_`pG!_1`Ss4EoMV5UU7w6?=( z(0V_5Xcke!U+RX91a~)%8?j9sS_Ie)$cZ`ID zO0|JY4-rT?92f6_OE?8|LR5>xDH@L+TL1wcvx5%TSyfA~^RmX)V04*u&h#h-vZj#` zqLmTdp+gd0kM((5WaZM(&L9#A;lh_s+OLEE(FUBgKiXjEHiS_|eZ=FqJa(ka1vB$p zJcJpCwCLcwkYQvRn!TFD&KsI^WdsPaWzB_5$i5tH=~N^^9*l!CEolB`;UVH3vWg%) zP$R`2jRyA<@Y5DJ%O7c9vUyI3Q#@P;$AK3_=WYQ#S1qcZpF?&&VMgK2mgVrQJqR50 z%sn83P|=nce?%uE%TTe|)PxMWkO16eQy~eOaFRN)zTEM`{Y4S;bq^Q+SQ);1Y&L!z zhBx53qKpr_3>UUbBRng?IDi7CMwZ>#hnc=54+*lDX72!!azk5fw_d{z;r~?!)S|?= z-9fbhvN1=HHuU+6QK?22N98?gg5zaw=Thm}dlNXc>i2F#VsLtTq3-Muh4S0+Pw4cM z@PFb$SdkOLi8$XQV>6@v4xn5WuTd{}E}8MlcP7A`#+Qxitt8cYR&(v~uH)GMHq%=1 z305?k-gHSq1*&2)wt#w(^_G;3Rto=yuU3_~BF+Al@dnfE5iP^7#AL7Y6n#iB#EO8c9z5T+K7UA$N=Dh5=Jwl&i`P}gO? zk7jrYO)dEIKQRFe!JRBZ7ytll`Tq{g`Zt>I|ECQ?0ijVkt#KmJb+FwLxm*wk&YfvX zeIvdwl!(J2M3_j9*8W#*U`L^duI17YeE|Vz7@sxSJ{z~gaeo(jZb4C_oB?XT)Ovvq zD^)fY8!EtZrFBg&`^1?t=70%nf+1F6yHz&zwzu2b>z@A5U`H{>HQ~`gJm^A&23Nb;T7eYUxWAI7anWn)whbR@kRjYvjwOqEG`a zp+ey(pCc1M!dyt28I@8*HOTO%Q*;54{T_TT?#pysqyptLqGr2joPa~>_4agGgDQaV z&?H=3mJrRd*G-<~U=m{b#>hASeJzT_bG6XP<3{nRFSG4R3*ig)Ggh{tw8nAoJoD?L zhVRuvM9bHqtKhLG9RMXM5lJnh(8NW1a7F>=C@zK_y116io?W@zP7=>qEZl#4_$yRe zn6Zt_z})n6k(!xB!jDXf3<2GZQRcxLEy^OJ-VS!SSo}}SmbrO5%ccu5pXIZ;$GJhP$v?NlAl<>_UntmH7qr%P_Q_ZeM9>OU$x9w?+Y}_hwaf<<5zS^lBxY(&q z4cEimt@K~O9;S!coL-AKLIe=4^B8F^I%^~!=339%V+WtfxSg|LZ49ml^0aQ=xS6g~ z3+b3ZlpbtEtBQg9yDwG3FEn#mrw*bP zHNfycGdDV>Jx~t@U$qf{iS(}`3o$L#3F=4yZd1rOvQ_3r{W<&>keH7fJ0Kvc-8SI} zBl<+YbUT_q>;t1PRp5pwbYx|kf0+pztS(=MxGlf<`?t+mtBh(xNsSfDf1;t$+x4UY zd^W1N?1CE>pFW|^Ovok|)TFG!vanIdZrb0WGt$s$%V(}3g z&k1&%%j)f}{xH@#Cv3-@SH@=~BZpB&re<-xd^y^Mu)&7>=xhqaj;O}Y*+x!iyJOEy zhBY|4#pAfir9`>veqKjMq6Ul?reWi8y(4Y)^IA$u6m9J@3tkFcrnCXoqO1CrhB}&R zCgIB8o@O%}b1BGruk!ieE*yOhBf79V?ai!&>w>`t;ArL6iujdQ-{TVxM|o0qYAx*<*}jS~TO`(jt7_YBNnl7rB+OwFOl z+gmTJ?<@}*nsE^#3kARMOXqdd(8(y#@hHmiU)BeJ`KYCpl^~uemetG`(k+qB717^E z+R3tIk=X*~`gp&aSYKyJWjHS`wQ3|3_3|ZLYa}+G>Y7%RPo3P*zi7)G)+ry^JSJ5n z-l&yNRg@u{?Zqh%D(_*-9fH*wbZpzHBz%LZG96VoqfImQfO-T}zD{-~Zyy=W6PDD> z8&u|v7oXU(d;&AHn@{s;*H&yj#DDJJL{)LwWTSuJQn~wjR47Y$P%CR-Rx9?oUAy#{ zsvIknCq1o|H)$=HkS%?@yz)@B(#IF_BmF%6H3fu2(4B(c^|<<@4A?XQ)FWnhjyg+x zDs%7O1ZHBdxen>u*Dm<9Lj3lL+A1Jq=nuNOJ%|@A?x~}NCJpI&uka0 zf*xQC?x4I;W)}eRX3O82Zma?H%u;(`m$rMZ7g37>wT~ZnH6MocHfKdn+U>qo-)UrF zY&wNog~JLnc5Q%p|6I0)Vf2CA;Iu`wT`gm5Y6u@$ZZ(LhZdJsL@Hj+@F977S^%_;a z1lsldcnhvChf$vCb=@ZeHazIn8TnNQu9d_FIwl({x6V6WG^28`BvqlvaZUO8UC@12 z{LsRgx`I-E`f!9dTT~^#c8h~d=j_+L_UM^VH2K#~qrvgRE#?;Ov;iBJ&;aLMFM_IR0f&bN&p%v&HqvjhTqQ9$ zzZ&UW$)tM~-u}+?hibW{2UYLHi#yx|JTKXDvH`B@wwbit0#rwaIp9U8v%!+n1FP!J znB7@jr1o=Ov}mzt?Nc@4#{EUr=Di8X;EGPw23$p*&J&AMXM^4O-r?umxO@jSmzVw|OZ4syOM|$J-y^Zg5nP=QQM(RT-y5abDG!vn z6}bAr`BFAyYOG-L&)|5O1GqXLri#rk{qE)6DdK?gR?Qd+*khcq^ApmsN}{Bvf&>L` z*U!(CgKjO_4Kpw@5d%rWZ7RhLgt3M?%Gm)#8`uGNh@~*6IL@W9VRt>W-&Ot;V18=? z(OC`;wEWS=qx;Ve86OfKXLSc2@>_KEEs+Fb0u*ZW$sslNtDY!BO8%-l6BZPLD*)a$ zx~My%kd!Ca046&^hUs)3xx@q}13djV)v}HJ*OC}HN)Qmcxn`(oNZk9x5s?{gu*=){ ze8*5WWOm+pRjA&y{I{t_I?re`C43`7I+tJ&MZy@9#}`1!@qGsA@@(v1_wNUbg$Dw( zBmT3?Y0qkug51bYl+oj8X%h%e9VFW)j?7Q?y6^xkkYE z(jaVc$?ae_e=M_J@*+24|CYLhNs4%BBy)`^VMdX+18iXCx1oBX3j>EN&3FBsN?q2@ zn8>qSu-Kr35`x?a%5}e0=~|DIO^JWZh$~3YpJ0DB^$i6kKEvr!Lp;% z@M~07zOw>8;S<#zpiPE6{)Q6u<{?^}If{M8!oX`U;{n#ef2H)nYVH;A{GzMRSws?E z(9XaYCu&-Nd2P$?$#&qRmjJTW_S3;_&6-0jd$3z*lWYB6*LBmgR#tPmJF(>4T`V+P zP3-D+Cx3D1$-}1t0AzSx%aIMvDnsW=D>1LVM7FeWOv4Fq4zhen1&Gn)y#|CbtXLRr#Vo+pYDC&iX-mILq4!2*js zzS`7}qF`znKP=1P!Ev~!5d*+P^ZHQ~l0!m}J2ecY!OFH82gU|yOTTS7BVz~--Bg%t zuyM5Tcqu7;-!m+iABPnvn2U;qV&b}cSkrXQU||C^g0mt_KNxQKaPBn_S|<&GsT9&? zuz0iL@~5pq0W(p-k5t3*(414K6Z9Cd)9*nAQL7xY@DJ4SBtyF}PKcx;0u`HLCQ6xR z7nQPrRVY@p@$6>yBP$7@=>i$XY|RtZc&l{n#4=VGl14NBKF}kLI?hY*b4#|X6rGsQ zI^_AF;x3RX#P(WI=03M!1dSTI3h&RB6nw%IjwH06(omzQqmLm$yP0@Pi$)KPe21!> z4`NWU+0r~hYCdA+`V|+QRbXLL%9l~ou-H3=h&dI3k6LapC<_M{-XP%rR`4(3x4jH~ zRIvDoaT%w?zd{LH)_nm8tgA?O}80Cx`f+!fuXh2419>O@)f*hdKHz&kFxANtnQx9g$!| zhDu#OBp4fl70ng_kM`*HWM%%-J=u0I~#-=P#ESGRW!8~$b)Y_5B)ma&Z=vVl9TZE9o z%^RGcTnuPi!h2?;>SccHhT=ATiN^Dl^9=gxn9YG%D94Uy(OQ|=a1ox``SYeUC@#2? zIpEUJvnO`QtFT7m57Ley1DIDY9<_0Hgph)49> zi3AFmnE}czs6`TYIMa!y@Mp%2H$dU5x&>qg1L>o@*x!9Ufz_<^tmwSWxfnIK8iL3a z&JxG;p<3CsNGME#kk{gGV#AtxLETJJ$81M>Jw9{Wt0GFLvm$@ z^shaRtAo&V$|!t}<8CJ|i6>O^DCDD{TO;tERQbKby8|4qU~SEws6goW@X6^u zo<3z-lsT=++NuF#;k6)(MNm(pORy@~V?!gD^0}24>y#;_QZ)>kMVz>JN}nPH8`ex3 zyE&ECa~CaV;=C1J*K=p>CD|58ZQQ*|)QPYW|z82bxY88)5sODT5s zGAe5SP)H*6Kop)Sm90$a91n$hz~c7&hxPNwtJjX81rWZAF|D#Pa8vB->J6F-UX-IQ zT<&v%4wk=JLwIO8*_yJuXPYvfmQ-R!^BVqM@cwE4+s|xdM9DcTc)@WF22oR`P#O(! z`FQqNfxe;dibt+AF9GBTnU7x2C)40Ft(Klrxl9Y`$3>K(A4!R2J*Nx|INMVYka<*N zeRO58+MjQ*j;a69ge;pz)v=tXm8o6!8SIHeD6?Z;ey~ zn~Kat9JeT1a47cysbLksvitad-_XtMNw@t75mY_5YFS`(jo0zAyCT12)w+JZ)4xYF z@8llISbZwrK_i1;=Lr;3!cTbH5Fez5QV>FjfoI;HLQ;}JGO975hAe$0la&M$$tfI^ z+oPlFsGdxRfuqMrG9?VZ?0D&p>th9?TZ+CI!&x|@zk+LCby?OGZx>D@O&~soKrr)`^qD$0~dM+yH;lj|c1$2~&g`5p`WLXzf-tTVf&OfCrH! z{$BFf?S>Ux&_WxJ2ws9Pq^~EL07&N~ZaOH{!`-{+VgCaP0kAW`kd*(6W}(SCG83 z@*#dJw91Y#(COaCfwpl1aTuB1G_(}uw+C9r-1qM_q&n-=YP?*va5=vfC7>gYAubQ>8=kCg0Q^iAg&#?Kcaz_~?!ekMms z5Q`THN^a;?SqE#Rr9HXTci|(luH)q<#a<2WBRUReo&FA~S#LIZe@IIyKxz_|eAlH0 z$G7pbdHCA%`Pj{~CcAr84L3WTP#wWdEVQ2lB`S%`oXHBhG#d)qAKS7}7h;#QP*)wj z*0WSd(QFUaI}ntcpW&1klS9>g^JnqDPy@Z{@#U|^S)C;Iw=T4$3y6nsVcCT)ze1@nGNR$ z_n+qSX658&!KECUH1Qg|RW8D8z*+?LPXHp8#1=C4lF4zHT*RSq4!UEhJV#A;w1v2- zrg>I~^NN9?Nm!vFWGQO2#=o{w7_T(Pl0PU>3zyq9P;3j9Xa^;hJH$~$DgXyND60dT zgID&RPNg0NViXHFIzEk>s>m34mWIC(a-#f8BvEXYpVdcd*`SLFh{smnY%-?&ZY*F( z@gg&{9wt}@=lsQfH(&6Ix8Ge|QsQEQTXgR_vb4*l^2hO(^&cE5$`DMD`2aeV&c;5@ z_})E^meY4&yQ3^n(-98@$l@?Iy8bf{h#PCkGeJMzHZV~4b7Lna*7I^i;vXF8aptM} z*AI?#-uQzfRsG;di3eBbiN~iq{uXB*p+01YZnFEXPuM7J?RQ(D8h_0sa-x={_|kFt z(QX0516kVRH8OS~kb4OCR;EKKFm`lPhnf}_!2Q!$z!s3CEE#h{ZVE5Re+zCxX3%Bmze6g#a^yc&tkH0z{*5vfS}FzC7Du0o|14abI$#hT=UmV) zGeTFE$B;rn8#tE+;#hh=yq{6vg z&ZC6Ae|e-by&oQ_l*Alb!@vK3c%3Qd=^vG>!#kb8^cnq6DP?szn%-qDM>e$)YW&bG~UE3E0J2zV!|lAhPe>3^#O0m~H*5>NmD2+aRh z2mjV3{?XV{JYYlVxt87$IHxA*|Mt@>ds3%oR0A80hd&BbX z=9S(BO;^+>t8<=s77Zn zYL9X&Ab|~lOyAvlisiF1@lF(mSy*^@CBV?gd^~qXj-fa*l`$c?)vI!vp!GS6^eB2o zZ7PxIUN(0+qeN$-IC?ZXRKbaids0a&C9%#IRvMt?{zV+0E~)i|VVzC}%&O}#Qfw`Z z2A4SIoq3^*+#ZjEe`b}2Yx(_ra$9doG~fX$eTOoMv^2>#VewTu!~%2HIz&$;)8&hM z?&KNyjELQd2crHF{vL#Iz1VDGaLdr;juq20m5v>=J)5pm3)2@^u7IwBIKO4Lp~6m1 zm5L~G5hQr{MMT)b8$B1k1zEdb@`0q{QtIEV*)3ZbRX;; zIO6ro2n*oaY-3GGk1(vRW37`9oRo^}%k7<^<)6Vu#-sF%f}ZUN>`QVd>58GbL#+>seqy*kOba@}K{ zKF3bDA`Wq0`3-TEENPbsscn!FVRDWcPlr_sH8%QviS_rnnh``(v)1W9?OV1VNr>j-~uVL2|_FLK^tks+M-iEcX%9)6_pupm(nx?%s>c4t z`AphxBQz#jsho2tZ`|D*`@aQ~vT31#QspQ4l`ot2*Yz#E$2%YR7+ZH<1~H%9zfg{C zT(xZYAnQwY)0tl;u{X0csRqaetVq5*3Y=TyY;6FuJD?d<(tm(6yuZp{8)Y2(WH$UF zO!fVKO*P?;INO6TgZykFdf{M3Ie`?)oG`T45xk7B!nHG!V2<=l<2s&-xZp-o#Fzbi zpztC(cD@?zioPD`@^wzEwsFM$G@OrD#=W1kCjacvm!pk#Pu@*rs73PePWx3<+%f)* zb{nFapP4ARLd4$)(N0Q6Q(OrYQd>k$0|v$D>dI)^60g11GyB9J#Zm*<_C8~=JKDHS zU+5guk_>c&*h(A%WkAJzAw$7iFT=H}YTfkg?9T3f zeD(z)K+d@IDI0g(#HWtIgTKDnFNbJmqH3|smpljU*PUHL_1_*4fQac{rwI3$b!W@m z5;gK}Y}|fyb-d0r6Qr_56dcYD4Hq@=!hFZsPX>rlu`6{;+9UPjvSD~Mg&IQvoVgod zBveg_H^Ui7bD^Sc;F*|rgOFdWk26mO0z=zzfE83n(ly*=QAErRkOY!S&!IRfmsG#Y zxY4O_DO|t_af_}0$H)DTQZJ$6+q|@&P*$X$kN>Ol(Z5+KU20lNKg+653G*jB7N0<8 zzdb~|o4AWO8Yh>KhUCB^9K4`v7?_44DJjX;sqb~XF*yl_WcveYJ#F@;EAMHRzMa?@%GMznfR#% zfy@A=P|%@8SbwSXvAKn{4%te{uZl73h&6mkmh4bH zC7enOU$wCS;8jI+lnDyQ4q7DbMg0()q?Kg@sxSp+34bt2NQO=a;P>M1-OHzjFP17P z8>B$T)JrSY(9wACj(iRnX>oN3=eezbr7Cv+vS4kcXgTCL>2Kzbo*PsNluBM25;PVM z-hq8(>#?KujUA*XBb#Pl!>6{@6L%gi6~bfeElHV=v5sD`%PVwZ_1nKxqO+dQ1V>q% zD+Nm1gk~AC3yM5h`8wT=E|0(77zeqCsRG~gmW?FJZn9d*sAT+{*_p??mtcVVdvnr=5I%e1kX%$$W_E?FS=U(bW!KslH6Nb-ax7+ zf*L;$ia;X5#l;nQU45RN4SU&#A~)*0cbJktpwO6q#vyAvuEsHesqvm(G=2VT*EE4J zqYWAnjsgO#v6lgN^U;AgeePG@kUHCD5YzvDDh^hxh}bOxmmvMNG8fSoV`+15`8zvM+FAx7%CMDH=WO*PJ5o)m41ZjQEWO zt5l(8*{AIzx|)J-s^@p%nV_v;;#6OCVba;B^h#E_4UazxFHl-8{c{O9nC6;Ewz6g! zj|KRF0o{)cYUoVRw3phNC@=vFwT4U%Vj z2s+=Xe`9-gC7zSLoJ^FwX+`hvj0l_Hf8IYC02GAuk0`7PyVYeokf*su$V_Lmv9b;ZU_3bHw> zHCWaPsV13{!S~k&14Jgf*#1Rv^a&i-!C2SdcV7t8O52@!oR5*C<_nlmlylo0S*13y zv)psxc*&%5`x zcRlaVtXft1k*X_a_jPnP-b7N`5Px$;D!@PHGMz|+1KB6Ig?x$WI#9VK<5HU{m5fMa zOWSA}=?5}NIG1tF>0qtucs}jy)UwNrY$4QNT_dpd*^4l9YIPq&UGLsf1 zK^jgt=eRUmdcHh<`sJO1YrZood_~EF`Z26pv46cycvt2`-k9b{Ou~yZaw1EqTbdNC zL~YM>O3UkzIrZ2l3#LSJm1jRMfFB2H&=c|TA}cP9kT|YL3BXc<|6(cY04#<1FP0)a zhopXpFo5(il{ld){ff5HC6{F6lzY3^ly$cNExxTW5IG2IYlXWHs1WhND)`qxP6rss z8=N`+8py88-veHr{xy)xX#Zm%Be2`0i@ zpL(6E3qDq^=jeXw>GQ7H`dPUsQC_+8fBj>Yzy2{r_~|7l{sxLg-F4bAayZid-GlDX zo}iXVwdZjZqU9rQ<|uTL(XPSh>>mm&(1-kxBS;erlaLJT$~Q%3J;NH#{Q{LAl9ZBB zrp;eQP;{^DTMijZH0aq%@zleMt+ z(T64_WS0HO3nF;nvyz)a%lbQ|K|t7v=|9an{2Z zS5SbIjX)WJg%A};QfVuSX{sx*+SaTgMXUPRaD zo%HmXMCUF6X)~ImcqWkza}^t6tIUhmoZ1nVsDXaclrV>m+6`OxmPYz&71#LMjRrk- zn(Z+5(7zsWR?I`{I1BI3A4l64qaE@5T??eisXEue9&P=w1B!O&lU#H1(bA>B1=JG(fdhrJLg(=Cg5rpoC&1#Br`Vf4XLp?Z2-zU|KpE){G{{ABWF| z;^I_|b<~d`I{fvB0Z}dPwQSqd^tQ5ECtipYF^jjIX)%OctjDHfUKm5|GYCvQoOQ8B z^#8GlVXIRr9S}tfi0+AR%a~fBd!$=*Yqa$NIUENN8EsbW^q@$tX`*tCz6YmecBiNM z@Mg)T)gvaaHI2FE6$4ei;vOtCeP@{2`?Vb1Yd})^p}7rt%C2M%vjPPD9Fqv} z__z2u=B@;hXXTAAsO+=T!VOP9cbil-o&=(9JdMrq$H>2PH>|;z*2R7iZr-E*nmwXl zw)kqtrGbu6M_!y0Wby4VEHxQXT|bs#Xc198PeUk~hR#{JD=v24#%-l}G5S`9HKYGe zZ%^I~2|@7TTH^Bv>0C3%?Tl}UuUm%UpBWw9DTM;y)DDGxK%tP|o+~yKV$u)FX@^yp z%#kU#`2mAF1a*dQ$pU<6O@tv>ZjJ+ak*rDigj-m8Q;GCk&^>rUT1)Kmg6u9F{Akt;4r`IyQEFrhQzO-8E6o93I7$h3? zgd5GgZRG)r6RuhKYe9To8dA>(if+=1kKF7$uXxE_{=UeH$bMYO8{o;WLw{lQI${Mt zY?UFrQ6s2v-A-WZpMWaW-+<~bqeCX|{+1swXO@9>PnmY4!nc%;NNm5a#x(9&iu-Q2 z6H;N&;X^iQc1qX+O;SmqNs>2%Aa8i#;tjZx03P!bRDEsNriOmLKnab0gAgfFe(Ys+ zPYZ|q-k83e?5ma&sTAm-@u$aA(c65UewW7$gG1YQ<=Sc^zqg}{2`5^TYLObTO-Z9p z+~H<0a~1@+z&2#1x^2rg0`cj>uw89LOa~8Z`fmk;sQN+Pc^T=}Sb7F>vYu!)U#fZx zWTo2jRU+TPqPu4wtc}N=ISY#m*vepK`>oQ_D;qczc$pTNoSxRnOSNlSMI6H;E#0;~ zpW#wfMm+c3n=I|m!u@UrRsFa{RXVLZq~hIHOZ8e$vL&_Y?^PW2K4~nGpqSymeq4W!mdDE+daWfM{|%QhkMy5w*{NrX*Y7Ai#+?T}>KI^eh>GSXq0&~>x*3_` z8U<9qqv)7fkJ%WwN|G|81gr4*y0dTVz^t2?RwW_LVmTv40;@hxGP#e|l=t^2uxnWcbbC=raTicGt< zzJ0Fs>*i^1Pk$ZDCGIKC?#gA$d;aYF7r$NGqk>ND5nOC%9pvShK!BC8ceo$*4LOp; z)#NgPgY!WYOjEDI9xZ-VnjbIE?>u`>$z7ccawd57oijK$mM<`{y|dP?TpRbbR(dv* zHB11fPDlPl9ZXQV6}2CZbDYRII6|H*tArn?^DVYF9zl3s4COfwXt5kcyFT(Zg#sjJ z_MCan`Ui3^7q!eu$OGpO#mN{JUgW&)eBu$w!WE?TX%A9{7LgpiK_<03;{YqfSo*1Q z%J6T5~DOaKt7bcx0Df+T!(JFhX!(=GXEP!%EU z0-u!sO}$Sao|SeJA(~C${I735z+pXfeMP9=VqUS2laQwx{qgh>Uhig7FO4HFguLWc zB-4$63@Zbo^>de8yGQWDZPEx@}g90u{r^7IGBz?J__5dI9u^m;P3|RK}yc zJhT7sk^UpMlxMWXyyzrfMBeTrDdHxdc#Z^xdecevWH%%G?Wb|x=a>uj>pSlahBLkl z-;eDC3L#H+nE7fi@~?F)-u(;oLUd0LJ9h!9LLQXO5{UM4*orPj4q#pu3H?j)ApJ)96KvM0p1 ziO$Z+Vta#Tm7wMQ0E-u{AmVO)RD(Mz7s$TM%CbgH{%EkyyTYEG7yilq$s_feigniL z!p5S9gIG`Rl93Zs)zqA)^b`!fg-NNdQ(lBU(S<2|A8N_m)5lEjDc7~62_a;k(jD?= zggrE7Y;r>kkSAmR)Lu|us%Ggz+1QGrM&T7`(Kvj4mna}5_FYGZgKt;Z3dER_TicF% z1DqH*+V!1OGQm77nwAg6!FQ4)_8R0whC|@eWyI_~% zk)%^~Erj9owVBhueXbjbAAmZfkVw^yiDLo$_T` zmV!JjyV@v9P=)dQQxJU9Gw942VTlRj!#x;8u`V_2aM(k83%?Hg`pb@&I7Z!7H3I}J z;pQ+A&`L0o&~oa}6`ZKB-3x`)5uq!Hp(hTVFdY$CSXRB-ZvLVmaXy&CDrY9yP4MlQsK!D`U3NG_3fN)T|)ImdyB{3qvBq)Ka-Jp76#@ z#Pw#GZk>8#Pr7BD;~~|x2dq3plS7hi+6t!pF9+=ud~{X8D2`IEA?Jt<6x5e{1TOq= z3FdkfPt?q^^}wTbY9gnFP9g4nCkDal^SCawO^)WV;&AIO8^fzZq3aGg&J)d(wVq4o zpEb5l-B}$%EC(#V(1@JujVWQ{GZ`~i?6l=N#f-OperHRNZM}ee($Sk>&Z^|A#^XYN}Li*yV@({1N!r2ouB>37V}HNTbgV3SKn{1VLgMM`EstFk|2?fufdLPqd= z^WkFBAiUMp` zy{~6$S4$aA+2?TUq88UEf5(zD^+#J8ea+dwi_VZGuU4DgnIV6)h+gxOD0B|AQ9CP$ ziQbHvr~9I*f#*DI&(h zWN_Y2ix*bkwY->1D89waL|E(Pm9X?1(yr5d!_11qYVi|j$xv$Z%Gxpt9PU~XZd#l@fy)d&xZ7mj)yJfyXDf^+N2Q{_I<{pe9;^bC5}`wjQ~t$PC@GjfiZ!CcL~$ z1gED6F($yfg8uJBw<{(uLS^|?EeAS1_r6}E_7(Yhd(%w*H6W;+Y^z!uG z0V)A@N}KXXxtB&NYDZ_1Bp$<7)RScwygxSjhr z__5uuwZ8R-t)G4#jb1$0Lv#vid#pEvTFl^4)CIKB`ZF};$jHFHqM6J=eA_fQfL-p3 z*22NEjK7KAbo|gu( zn3QFKKFa-J=6N0${&u^S8zg2_ouJ*~;11G;VmodJO+dG%hfHZ3 zVi`C#7+BDM03Il|6b^R769cm&VctF(%A6n9Wjd@T3S|2jrq)4hCd%m?=;(N*w$<}D z40Q@QjCDlDdlRM~so&k))|G1f&@#Vb>5!4lA8AJ*-S0q4nLwV{yPe=|``paKR5l%w zd;t8M!|?_$#t;~hIY%Kcj7k5&(76}wXUq3N+%1Z}4%n4HG5U%}%TmO5XlgNFySD`= z)Oqk}&!S`h%i)?XcILedaIt#;-HZS2h1|d6$hv@~q*1gU`M@5~0{x$2r<%p(0wlM@ z>gR-lOJ~~h-_gB=lt>~N#hCX;1$0o4dG6s}vAh3)pmSJQP^pv}cZ;=n&_M=?xdbex zudaQZpI^h*wJi0b{+ietO$LiLsXzWPvGp(Z048>sx!GKlxIU&tp++Z))v?_oS3Fr9z1rvx#=%GRg@?n3sCQCr~tiaODp`xYCRo z3=po|DglHm6<%&uA3UwWNv^BR#WrDWEAWmXJFpDIEyD;PWi}|xNw2QmvZrJ9y#W}s z>w49{7_?{juDW(l#|gvb>wF$H0E147T!J(QQH)oRu2QDa){`HgEhCUX{#(5`gE7yE z8?oSY%T^hS5Alllrjda*^cRDsTN3DG{|AFM{fj}DMs&4=j~>ljg^*NJ1)pojE4JAt+)3TH}OY`cy`Yb{UhkF7=!$JGA2B5C2gYF z5PTRySUch6Ohac0Zx{wGFOy;ey%hWJf*Yck`eotw^(fQn>z8-{Hg>t>aROR|<<}mN z`n^rv5@4jZnzM*7g;s+mYs`<5cT%xV>5CRVc-9Ir%tr{F?A6Fx&)cZ(@P!|&=vmYH z9}YTRV)MuOGIu>dq4G&0TjR^=7e$0{V}oQYm{EUSHFr}c02`;9oeB^iVn^*CU@@mr zk@9oXkCkNx(?WVK#90gwBBz>|?at%!%bBY4w(hHHV#zKgx<}L>V%=1T&VJ0>8zL<;NB&;zsL&A+p?wy zDhhO(xM#XfIqW%cKXf#5H&U;kG;7n(oZ}r{mNACRTdh2(OJE)LqohCvUa;ew3-`hu zJobX?|8hb)>rS-sa6p7u(qYyh0hF}2TwG(-D3TO}kp`(xCE=do766j?Ok-IXU6A`;hw+zH1t6i~W2 zJS?(lbN?q(J7$OYHa6A?FRLrmUO{ij1D5)3`tc*@4xg9B$86IRy*EZ3j$qOzs+>r zgYJ?O^LV}kJrV?_`#OtI3I5O|98TMG2w3R_6fG)OBwq82j+~&4=&sR;zXIUqYhoy% zqr1_O{52@#uXNUwR*uhh2DO!;R5lC7%QN(W7b?^&kugl168#G~Y!5>6n?lY3v%j?~ zI<6T1)UJ@mf8H--ffIGvfO5Q7q?v=D9#2gwddY*hWtS1O|ipd}jLv4iX{RMRBP zm4*QFl{jv2w@aGFR^R*1DdWGK05-O=97R_NWWNf+yX{F}p4Ijo2@n=!@n4`^iQSB~Q-M z-Nu8eEr4zgCVQ#ikj-(UXg^#vNujI1u>1vs$*bg<)Xamo4q{4Q}q)}@XFhD5P zDqdxZXA|I>*P3yrPy(V*iMHqt&mpVBAS$$_RN79VcZFNaldU;cU&C%pl55;MW6zwl z-)V|Ls*o4BSDUG3baV3U7bFd^2=yT?Y7`W|&%OYEJ7t8NYn4&lDh9-q&gcKgfKy<) zc4T6tBF1}QABTKdtD_h%vuj@1w+5s@AbWL2@6||o>B#I^g^zHZkky1au^={~5vPc3 zLMJqGS&V6awh&f?0X)4dq6+be6WgHTKlT%L8<0}2=dB-tl9g7rzG#U~GU{LLt@;7Q znet6?3~+yIRVLz-&m88Y0JSP)jEeK{iIvwJ3b={ZINfh{L>1;ROcqVnr~B9Di$1LJ z$^4*&<$A6g#gaUN){v6E?!S%2PP6V*<9HvsL5sKJFU2C<15lNL6p*g#>c`9CGgpC? zC)C?Pi+he#I2DNhekm2utzsO-BY4`0bO0a!YA^Z{15D)_yFCl4EO15EXL>cWluNL6 z{sE$UY5}M8aT`-mLD5?W!kR*&LiQOL1HDycym=I;3PdzPh?ZvOqZeP9?86aph9@~x z{=foM!4H-}i^WwbS9!*a52aKSZg_#4)(%TL9{l{%s$y;=y7&X$_A}O30B`jd5 zuw#fFI+8O5LKc8JBRLG>iO^a{-8yH2t+jH?<;c$n=|E(E+chx!T}l`n7P0HCyu`c8 zxA-Hn_o1O!m8Kr-4?IPsE^+pZU$jJ}B#0U{G-@yP?P2v}XhNg}1_Xuwi-*&a02b}Z zL_Idq!8o9V{ktfO<#KTXEWV3jac=}j66#kEyaEnL>1geP(&*=B8%m^pn}hSOnV zpKUqy3$ho6X?>8ON)T79gFJE&)|nKHB{A0+^{D+QGir1DvgncDd9EaX?2{q+&+g~Wm@;J?-zWVSPUdO zReC`bH8Ubi0oLZ=+?y?ax!min04;SB!znHfabx=_*Rre24qLT4&N}b|ydeE1g$A{a zldJI)XcRq%08t0SRS6AJ@INIh3cvvKx=~*FuX+7bqwcY7Z_j?>#61>ZUO%~P`L5et z{o=A?ds4`PTfQK0-@M16@DG2kQ8t zK!8hn6C;^~DUo*l0NPnAP|$npie#Ma*0yoD2bqu2+&~J~(v10`_P2xaJ~6L$b!^uJ zPPv$pVWb8uT*i=i!DSZghC(p(C+*#FT?&i=D5j;_T1j>g! z2pWU3E*9;`ME5B-T%6AJQV*yvnZl) zlE44mb9@N(-Z3KZS(Rx7`GAv5l3U^+X6Hwi1v0*A@$$(Yg*1!^!myqupk$@p%<8Xu zJq!Sb|0!8XY_M_wl&qMb-+t)SI;vuP{GL#(_y#ChIbAa3SLMO>XaeB^AA2_1Hpp?X zx;EFh6(WPi*6JToQEm>c?KNrICj0|}v{2Z!4{}6f{-2T+`TcMF$%17^^b~XB$a)-g zrpW>i#j-PsPj%on^l{HW)~n74VZwwkM|tKx-;Hj9c;=eTg_zYv%lsd%!O>pXLE{py z&`!A4SP04ugu+~;7WNoy#?$zgg0ItUV>!th>1=)pRv_KA=9CBrn1xl-0$)`qNL4sO zU+P%4Q18+mcg-$bDON47fU%OHEsJeQ#tQ3_{B2;wSEAy412izAYKGRK^$8?*fyf1J zj>AtBDgOZkBC-AkBIf|eGq6JF`c#ilxSk7RLHg@1ir9bWSpr1a4YvVGfa-tALvql2 z*x8={f0V$vTW73T!Yd0ggYghN2&w+Elb6alxL6ErKk8UK$%~kpyJ23HjECxcVqf(xapInZHut6wtC_IVJYDWu& zZz+HTkOBh$DWK*Q|F0D2JzFGKCWm}`%Md_PVerQKR|?4UMNHf~`6qkjF`csh`Mz*g z^HG5z%C;e}QR>f&582~^^43)GqZpeMt>CYx{Vj1aI@Oj%J24V=z~Ks6DtvpAAcW*K ziwvUzP{5e^OD;*sDfM=5{zVHQ1xEi$0aW9Pi?jcc0&g-K3{#SueGi;D_&vAqy;-gs zRYK1k_YB;gkh|Ldkpf8sG;6O(dyz|T|4IQ}s#x_^M_8T@&cygwS9GtQ^uZm;Vs(-u zCD(h#-)}3w#;YkImPuiUs{Oe+M3TTP8%;qR12N`BH!S+nOR-><6|4r0Y36uA) z5@7Fy`wO%P?dC1RC1zi0h3El^co#Fp-mP--t67b-{}c~ z!>&y4F`M&q4$@B^1!AJ5ctAj6fwY)RA_9aVk@W}2N>rm_LKzSQEQjf4#s|x=h%@TV zu?7uOpnm$M$|27>`)Xh--+(!@m=C8)w9e#~@xt31PvXgg;B$oqP@#!#mfp}dbhPK4 z9Hz$+kK&m~%{yx9Gcx^i^3xfhr~^*^TiRRP&RMG#-P~24Q4v|AAL1hoXEm`-Jz~vN z2q0g!+_>a~aA<3U;D-jGfe#5IZ2uIkNJdvX@0cvM!-gL0-x99YKn*~twzp?+#1Vkw z<904OB!e;(+GK#1?VX}?LDny_CVdyKG_9Pu;ohKe{oqH% z9zE$l){T}!?OJSTXKTSGf!)W$q2{%XgzDgPMcZR4pX6C@bD#FUp8OH+d1Mu!sKwTM zJU&PqnP*w|Q$v@bs}D@}pNqe3;23c64{E;pW>9x(#}q66JP1wu5&h4_-?hMF5Q(S_ z4!HPXYTG(f8#>oDc%#A&*rHp?miRN#-$HLA%k0HpsDFl9ao3nTud=Sw*(Ou&H-z^` z?9`E#!2b)qfS{k-O)@%>s#QmpH_}qO zudPj8fHm48hg0aj=UWo5-W;?8`ic{r%xy1#B@{iz*n|1b*{l4|>7S8!y(uAaf>u}6 zOcH%hmMM!URu7atMNANEO(FSC(x|%D|7_8tDpQr%N{spB8ntr{7G^h=B^up;b-Jiu z76@sK%n-?QoBf=?A&s#DzDHvmCU8S{doV98_8Fv1?FQCr4+KYX+%_em^pXq|0*=(ncAXEA8 z@vm0PU9uL$?@&hiVWrjqt|n}Ut9<*s<{@5LeJ$O323adTm#1##Tre))y?WUF!J>NL z|JjXgKoCqW<*S`k6GWcXID*x z>}ahiPLT_4Np%Kr9YH_Ph|xyaidtaO>XMs#<3W$UM74pRfb=Oe-DDgtW%KVtA7-7G z3AN0#OD_x-lj@l47Y`SAtV5#b;nq|o8b;Tt&dav zcW~MUP?(#rPg2BpJk1~XlP0QWp&I;Q&8zUVgX{$^wdRoM{0At?aUiKHfuR%fFP4s5 zc$&|qs_mdKdC}DFhD2tRQ9ww6q5c;>-`V`vj6x54U6uING>In8yrYUsKR+r$Y72O- zk2-ghdV?lBP&H z>1z2#V|0L>+{@uhZX@;O<`i+KRr_!{|J1m$+AX*`F2P=(;m3yN&jBGhD($8aq>=fw zE?QYDQjAz&>69j+!~9%b82ZhqbHUe!!OU@?S*|SgkesZllUmB|Xpop$e}=sWK&V z5D?_ucOa?_)JH5R>1a)a-3znw;cC%Ci{D5In|VT_1;Mnqcx4Cq;>%qH$>GXPr>dIr zu`*288Ek^TKXSg;4rAg;k6{%iL~2dCF#alAIo!;@$0?C?*eUl|x}Uj*<{N*Dzztwp zQVyI$*?E0wmSIWYze{5pv@5zqi4dR7c-hXr;M<%P^49EDLkico3cwE^R>7>y=69sR z{w-v8U9S4LI4)nezUPtfmT2{EJnA`VebUcs&h(~`8*zP;$XWJ1dcOK?W!wqrM;-4U zTjYKyf(A%HI{vWQE^|bWJCG5`y&OQlNs0I%{iK~E9p+;8vFxust5d7@vunHfsW)=s z)XsVgZdVNeT9}Fi2zSCyAQ@g9r-jhBhT@6E$OP=kI3++Z3QD8MHT^+Q*YuGGnCG%7 z@VSdt#Y}rRnKE~5v2&OSAe9JD2%~#3xXb-mkjwW5TUqcUU|RC!XZF&eQ5p(HTO zRaHlH{BU2ISPzV4xYa;j4c<8QNd{9+3(9QsZ=L>81bA`(qX?>{*d^3T|4{@;ro}IR zc@~c_{Or!&Y-E5Uh)62YQnYTrprsCpKSCQ@VdZ?}ecwQQxrEDu|5p((!f**c0u%u| zKoN-kRRmLi6#<@e=%cw7KoOiuYYj-CFgJ(R5E?h_=KrGzCY^+C(V7xs^a<7b$Qcfp zdZdIP59sMjQpjHKz@;T#R20VVQ4PdqBiYizeKIc&ct?Yb5Fu{Ess;QtyZ)vijU%16ws%pD0$vQG6($my%AWK0i4x#o()0)4t6>Qysl`P>&U); zQ|m(Js?*0PiGOaTRh?$jUo;a?dS~&PYU;V_81S1`Ia#<^{BC7Hn`TAZL$~WnU)-8Q zncxUFR;8w`F8BT5`$>&zp)g13L#m|2Z(9BtiBbywcKyotW4Js)4mUnm!*`t5IB_51TDB-VqdzIb zRRjnNF&bC!3zrZBgSf`5sH)FU7O*!xVfoz70{Bv zo5@Wy&Gw!&DV^Q3G+{E`J zMer`iiMI}yp0*x271mjZIf<0&ZKr|lp?nMK(K|EFuudJjW9CO0<0h9@a%W{eXE03l(PmnSj38sN%4OsimFETohCo?0x8gQ=Br=1I;e?to`)fTop+ zTc%~MKN>j5t8yM`p%OmA7uwkO;UorM*UYiCqwIC zfaI|BBf&Rk@a|}F_l#)-sKo(smeOU3rWW(|QH*W#hG(t84r8ugMlgNw83W_M<7}+G zMGqnCA4Hb#JJp&KqNL}rML_$q^?j)vg2Ya@(;HVNEjXgZ1PSa;BSrPC5_@+_h~hsI zQ_+;s%|nPN9Fa*Ze?k4I7&fK&fEc`(RjlPrP?xxop#4M{RF!n^Yyg~azjqv zLf3{jKVsI=%}v1?S{-xy7ZF_JeXP4|tj=^UYL@VHG7)=|rw_p~VI6)(Yk(itYSQ4O zJeq(8VehSy`E=KinmUc639R49;8<*vAru|g7aV^OWg*?kA+jH@Zp#fA_pigRwkoz7 zy|=FXX;^WGoF)7NHx0_c%38L49xk%=G?0nk*5DD<+ad+u(CD~}j!tW|4IZ$E5pK3M zVSO6iO$a2p)&;gRIuf<^-njBQ*DpQ1nvPzLxDh>TD7%O_&MVA$bP6`he?79_L?s*= z!q{Efi%clOi82Ax!#Of(7(x=*T#~p=;Z(|>kr9;2+UO^if(8P=Bv)pGRW!f$ZQO%A z6@B=bb;+$!aIp7TeY>)zL6abOMRqIMIAYc3v`dXDoRKU|EL3CJ-Qw~$-1Yi9(Pc_S zti}kh0*fJspitLtC31W|gl9u;(IBcqj{nEQ)e>kv5z@M>A9;W;a%8Ep7yIre)AGsL zFiM-bs7Wl`%~$q>e(8ln(3KD3AHN?}IS7twIK$FVOKsPSlCOA)B!u6X-6da@I17W0 z0`|8aIk@!Lk!@|R)kJEcSftP@`#eZ-beg=e4!yEUZ*j$*9DN|av)H6Wv%6p(mbRS?Zhc`>{PldJ&!_ZK;J0h^)1k{?aXcKrLn9xg2icoDOwyBI|IG8x#ynR|)nN2!gZ>uv`n%6$z_W z>yoa|)eDS~@TlyM19!$X%GsGc7xt;U<;T^oCU@WKGku}q z`1n4(TsyNW5I3eR3wRRz^1Im`(vYQ8D;Mx>Q1&&RPk=%Pi7Q->4nf%)u&4^}+W$Jk z%*iL0x3!S`6hSzC{WBxVw~06__3@^)dlEjL*QN0(5t)LD@UCAeHhteQIT&JQRg&N( zxuPEMlO@gkaMIpS(1!_fsxxAABWWod%$xs3?=V936t9Kb&&Pjp1}RB@sG2#J%mZ2Rngza|xM>MF4r9*nA4@X%%$aK`~$^ ziRJ1?fO*^&c<=^ceTw(0)D1no-7A&OkpOCh9QTg2c$JvWM#ybUE_+%K27$c7X3qD% z&+Q2BqO)$^dw&vB4BN~x%e*Lv;zNBz>**jOTda!G!5Eg>83zoxeDNR$<5+kPo5fo~G2OQ7`oj#^*KB)EXA*_K2_6y%j$i zpJ`RK2n~0slaH33Dke*ia7UHaOi&lW!s5ez#nk`KZ{I<+IEB>z^e}r4iqg@h{KF@t z6p>6a3#-;ioo^N?`dUI%UX8}kPGsvtltrU7hJ6Qv2Su+EkpZJ6A4p@GoRgi?ngIY9+1&85JZZ2q-d5mm6bp#ZT1~o_z@Kn2$Dz zF{#HhEM6$(Mo}55Hm|ouB8wO7tF&U3lbsAEWwIQ^Hv^koO6S+g8rxrrV(-cc_ z7!)}LL(oI>0V7(}mJ33Z!(rY%EroDgk+G(H?x8G={=2WsaB;So*TBa0c|5EVj@>dtU2L`=y#T{MnfxznlVgqt*;F=Ha4vQ z{Zs}+`eS8RrkNI_%GywNdooA6#LwTC57ByEffqZCX4wUM(eM>HvaEsz3htWAe`K@c z7Ed{0YR4K`-pSjaIYa&N>D180BTWsyN5Z())|wO;Kt|m(;1dPr)9ODqHkL|^ADsVvTh#{68ya^c zBqh!J96r=f3c)w9x3c{kF9jvlcSmP2c}-TW9CiPhRV_O=q8?iBLZI!XUSqn_Tcr*W z-vGfSde7I^a5XP1k}*X1!SL;~?*Zz=98rUhGXim|O%734-3TM|Q{21Ab&n1WkFjFc zDl8s+=6b=vRI|>9Ov)zRGKxabG|#xVff)SP!nomLrH8wO zx%x7fI-{716=95qO;Ryi(w5MS$a+*?aXE<}LRTD1>1{uHuOsHK@p zqg^H+Fc%LLZPa3O7s~A9;V|%?*{v@+=H@WADrBj=`;R%J8Xm6q_o<;5P^koTl#q{( zF4OQhI+8e~21gmXuglnC}0J1k?8e{t?eq0USHfcy-SF+~^c6$FQE z$li_c<8AQ!criGnVlAc>p)hTBYm^~6$qK7&`AHx(yilo)q}@7GtOp`1#{>7g7%a+J$#d{`!^jVtp z4KA_u;*l+FS?Gi_EFsrIk(>Kt!x<1=LzZ@jlcpujRL&(!ZWAqeJmU*byrwC*$EM85 z<@g=@3|sI%^Q-OU0g$QMrb*z{6`5<&%h~1=A^k4nMG3zCRvZraHg2^L7xoHw#+N`c zxBmxiKIywOWjI{&;XqMJFaK5bk@FA0nGxdD3~}J#@$A!-dr>z&Lkwt0y9?E_mqo69 zeJ=!dqvM_`yRm(NFY`W#4R-{;KxoT#!(>^&v0nRbxo&t-<(^4r7Q#~GzWXtJ#M_$R z#($(kFxd$^MB(bI+-QvQSn$>F9hjFD9L%r+c?Ev<{k)S;v!X_?e<~+HZ*YH)V)nYU z1omPBFmHKTga&1C4(|K12pmY8sH=D7aOyGwaYhh+`G{^CYSZ2JR6N^J7vJjhW@1tE zHpai7;HXOZrt+{Np^Ip2pjy^Jo6PA>il!wqv=tooXd238N!1e^cS+Kk$>*3H*MWsj zd&ha(jyx0=1_yX*(k=5VJ(9v$f-P3el+i~|vAUml8!YylpuZko#3}Fg;2yQ97EBLM z4?!sWA)v=`Qu-}0oY_J-Pb<{0EL^O*%Wm)a40xxNg#YC_q?kCO&Z%dNY~j5t)A@uJ z)z4nG6{m*x_$Fyr^=oo*t2?Vz{ukuJn`w*cILa>F;SN(+srl!VkheXj z=S*wv;&hMT=z3x@&oi5#nX_!_=3FIW{Y$9sE|abitn8WOOW}Kavjr@8`0lZGPsMwF zEZ8ow^6=f$-^Se75@0=dgc_t@HzisAVOk-a}O_<*ng8_eenZL=er!xToYC|3N5iq6?JH$#!n4kW+aXF!{aI z`)3{yB6@9v|4InsMETMc&wq*tjTl`q2_-H1Q7)W^=E>L)$yo#^6o5#pB&wBq_}iDh zh?r@dBiJxXTa@nNTihPj6T?+@7Pc_{an0nza#lv>4(nB^) zn_pD=U;owq=nEpJ0EYkqIzayKw-56_6|s{5pk$pL^+Uk$O7QsV^i@XQwn!SOQ%;G{ zE@sUaD6`On4YeX68K(^sutt4$A>}41{aKl0ZXf;-Cl|55*q+CmHj}$`5LEq>JtI+S z!EY@RDowT|qf4p~p{Yt-fOuFrL%D!dp^%MZ_Abi6-%}knM)I4R3`?<8b8{;udsY~o zr~H(PnnOf;=p0vz#{$Qc>bydHW|Vo^BDc*UYm!onfq?lhZCd7G14{Kn-8Di{XCb=y zEHm|VZS5OOtI$ITf`0>)n7dgo2YH_jh`SuSTRv+mrorp7^UEf{=Ot0vb3s{^*0{ql zwd29aCkUrJoe!N4?7to?`1ZddcpB-JqEw!|NsPi?2Y^0Svh^`~T=@~W*$~90H2-j5 zMoPXZL8e+RzVpSOQXVw9xF6wZ+Ti9n)7U&m@Y>jJunWm+Tcg8d{mE+IX41x4PJldE zg|}PTI#|0`?A0t$Wyu1La}(;!B#vS;8W~CIWQ4}w$>HA~07{^FaKnk@TrMJCO{;Z1bVbM`wl4{^`?_>1Af2Yoea+1rvpxrl0sac@=7y2MQmr;QSW+8eA zast+y2%KqZC2Ga{+srTdG##!aI;E@^6lLsB5h7*d36SvZ3P+{BrpN&6YF#3JwYdhU z3ECMrEz6WV+Ex%rtO?~_l(QrD3p??V^mN6Ae?2ItKSow5Y6~?xKXX z5xq>z5`VZ(5$+tCJ++TyVQxDW4*O-=i9DVVTkrh-JT=4ml+WTf!_PdsS^QqlzUj7K zjtQo*f!DP(F>nNH#vx4*SBu5v?C4-e)2K@G$bM?zU7j-hQa+hMLaHl~Diq?06=JCN zzg}P__HsAx;V>D}41_m?Oo4Su{GoNx;FDy<*=tO;whh8L@VysuLtXU4So}x@Q33%x zu?6n`(DjbNm4#c>ZrHJH+fH}Kwr$&X$41AtZQHh!j%{0acb{`_-Ky_=zfyZu>izq! zvF04lqq}{t5q)22OQyv@QZ7ns9|R}PN<|jHV~wEqWoF8bn7o#-zUuyhet``u74qDa zpPtp|f$+!SLW6s_y7Mk^WUgEa@@xB*g9rTwWRt7kh2O_{)h!=)x2~@y`K;~BaB$63 zHlZ_R2I1#AluSPu3k1r95)vZfYe$t8#t<5Tt3o&b@Xsur%eZS>bM|hiZ)nD!B8B|x z_+lSJ35`Tt33wN=;m42}&nT2UR`A0%nA^Xg95fX=zlpvq&(bJTjMP0EDcp`qmE~ANq@lUM?mY1@owm%aViN%jVK2Q-)L79hH zC>J()(mR>l=DfS0(6;y;&+6oEq$s+0R$Fn@=9JP<);#AHT)0p?%~a@^CG|u3kd_nD zP~w7LO&WQ}@79_kFA~OYbCks5a>!OCNg`4z$(Jhdz$8Pzcour~0^>4__Cn`vl)T~w zw-mHJ1HO*`pJw7vmHaHr zB+PNpUY*(?_8z|Jb~H`1C)_)IeGKhs69%%H$E$b)U#(@O+M1kynCNt9CC1UVIt!HR z$Kf}i^r6kS$|d*j@7-6d%7)%49Vl50hK#bgj*iCzE)IQW3P+Ik#PMUsR8QMFmGRo| z45dG3f@xA{8t6(xL_Jr>=sv&{Bv(%x)A$3%&eBu{%C zI5375=OzRTu*UI1dp9_wegGR;5#L>3O)NOzi&(s@rG>TDaDLdh>xYf>>O#pkfHjj= zTI6X2$3Q3b<}}uS)FlbkE9;NPW3Yl+8L>(Aye#ivu+K(TbLroZt#=sTJ$WwGy_9p8 zYc_(^=vA`jgooPnpDfrF^-0Riv6ZzX^es6~R^iHH+kJaR!uM>h2m+tr??^@YW!=NV z6I!-3D1I;6xtS|#DY%?<{1{Cn`PiDjbpjjRr(`EVkn}L4yRMcm75}m*cC_4^%<_!j zGAqR|l11M^ABfOoD=U6P@u}f(&+{B=($X(bK?XPMSAIAQg&Q*6U$72OzTf8o3uj+Q z0N~Ix`nxOGRin7*?( z`Fl3_pQ=CH6e9FmE+jt*6&X)1M>`-&Ozem}+VynSuZl>H;{GsxNfsLqn{erU3PB&u z^ZwkTHr`5oE1xypu3lp?oFHnvY8xez za1N=ARKL7m%m=$w?YpAR64l8xlsu8605{1EQSl#FR7Ih~Syb5l9ZP$>rLK^GqTQOBxo8z{lJj!` zR83hAtf~dBkaOlYrGjK^HWZb-MM?FG+8X6bH8EZY>Z(pqu)&8ip9w8TE1+AwxZV;rh2% zW~`j2k#G5jlowfS?Z057(~C_-I}g>bYS!^$UW@noRloR=QybEm#%odC6*;W84=P2( zsZthYFg|@x>d=1D)8+HpTQ>9*Nv>7>;7D1?bm?A~f%w=2QUtdK<$8`;3VtiIC}K3< zQn>R8tM$W=Jwm_5)WPBuxO%$?03=setf*J%>Ytp_bH>^=QpkH4fjr3z zu9sI>KwN##Z?ptiN-cP~=THcIcc9HE;7|}zJ2KrR6H#)Rgfm7%!s1^Q1q4uU!T+c% z&caU*L92>fr%P}5Hins9U?n<;tS)BO^$YPk(&{!Zii)RS@LyJG%9l_QL2@c6Ct*SR z`5#N?RsccHoCvIgF4G2r2!OkiLL{MFI-r?>dQCY^71y39`pjT6;EDkyfPL|V!{RO3rhV zk?_Kw)Eh`7&#DrYOwK9I3iGc7`<(638X&=5-H45|qA-tdT+b+kL_9+f-`Kcv9VT&? z?fyAU_7kOT44UoXoq{_C3JpWN2wm}Nan#3jzjn+n(N3L`>49G8z`ObBK~;8KoDAh# zr!w1)qOG~q_Y;?LH!24mZYqh~ZEcO?44jt52%EeY983VZEN2n|DEfL1}oKQo|hVRxQHBp&c!##dhf{q$9*uyro0U~X1n7MbWjB8e4JMqUGfAa7_ zZqYKsG(6ila!v9u>U1xy&T^;S_Dr2tv6<~?B0Q_YC}}=bhX(=B`**%D}iujg-G(^$@1w0jB(G8bGchJT9{PGNq-U1 z_1Jzs2;uiOgEFAXSxlAH=L2xBKXoiRz7b-_dmBABO_3nICXbb^ptWnCY`1FF zV6KT8^)je#f>V{L29qWP$U?O4@~umo&jIh<*4?5mpy$43Y_E3aFTXl5gc>n$(P$Dw z1M$KziMIuy(QTfArf2RhIqFqvibpN5dSE5uEwHN7a&%NzXG{w^Ra66Qpo9(}S8uaIi#0 zT)wPzFQ9e$QSHspr2+CnDh z4o*VMk+R^ABxUur#O_11VA%6_%6#;(91OUy&?m$(-mey1-7And$ZSD}nqZ^-kcRh` z5HX#^dp+o;J8^{Fqa55S{_ps&2@}8k;%=9J0+aoH)F`(WG%Nz**!^oxIEcz;K+rG7A+J(72jQrg;mpH z0Ot?8n&!h)MB>!;_Hm(GePc$5_OaynOBDE>bz2odaz;JX`kHZjEp)OAc=Pf{Gg7!L zPXrGF0k_*VTt>AsGs!ItysF*XXLhg)#)ZRYv-~Dfp3JJ?m;H6imsvpN*SCzH20-^p zUraFgU)H3qvB};}%W;+~KHA~b<(OJ^c>~Dc^c*?CpmCPb!quyvUsrkZG?da*Uv53C zM8Tia$6@CcdNjJ>XXFVC4OZnpniMj$BRR6;uFgZ#*u~j_my(|psr&$}(I67t*rFuD@z zg&1dhGOiA#nH1An`Z8iR*)WDSp3C!LOX|*=8S!?gGoJ9k~J_s=B?5S7NZx!5yu~^L5y#G;ZE^ zHx{@knphKl+z071>wZ?D{XrkZsJFwTySW#&zAz$?hmj&h^dq#KavqgC`4#Zc@XZKBqeQ%jPYn9M~6~r8q(+n>-r@ z-dxz=S#AWLfBO}ufPMwdzkY?(QhLre#mc38JSo{ZI?d+XIVvxG!OaasN%^f%y%dX1wz#yIC6ol}60EKD5tm6+|^ zAi69!BARD#)7V6a$wYcWF8)EL%4vB37@IcLS34!5DsL>6sm)?&Vi6UC*4(91MDV6? zu~y?*U0-Io$RH0B<lXD4tKmiT3;85gl;=vn0wBk$#OQjO5RaU8CrEs7p zBs~dcivCQ8ux62oRM*UO{17AEauj7)uwZvzGm^&}wqbW*HxF5`W=)W;n_S&+S>K7> z_~`qd*jCdnT|RqBU7z_@YC%zRt`d(23s#u1Tf{Ry%f%UCs@H9s0flh3$cZXazYTF? z6NZ(RJH~r#4>PTpCOB^q02fhJ+!t)JJZg!`;ycC<$`k5lF%#1TMI_7F_`&~9CR&HhXJMNAjE{28?B8BfvIKilU~NcDthP*9E-o@)1xXY(JUfeu zK<8psiOIWR^^K`K>*-$Lu_-t$UoBUkuH=8yAxYdJ44xG@*%(P5SYdVh+oC>CAhPR+ z8@96(CPR8DwmHqBa~stH<9dyQs?woZ*SPBHQo&xJtM;MgZnT)ISus~ymQcn-J3IPT zwrbU!q%tUjqe*+KWtFS4?B9u;zf^Kqq*3}^DHPmOw1j=&Cc-?BAiu))k#@LuC5|9N zWq3$X!^ctHT`@EV?3p-*He>pr!?KCkNIqcJB_Y&3v%H66r>P{h^qxN zvmHZ_c2o)%i8PTK>PgWlMdub-+H;ihmrx>92PAt%as7y3aVrw(W-cZblSgrul4R3v z6EP=^h1NuL?n-cn^Z?{~N!JTKoEBnyi+sjTtv&}l&P8xQ_bWk$IavjjbZ`5>GJi=jCdSMAqOhBokYSn%O$2u(08>&8E z=&!KWhH}xaPuq=1>!Gh-LQN_~!%e-)JzPMgPs^*7^rDrt_RqbBvH04CN(i)$Kj~L1 zsW?vgett4(7(=p=Bfa=|-a`$s#5rooHd&~{D&?ZgZ7dGiC<8{JA~M;)5Pjiw^&DYz*WH!z*DETi`0hB_D!q7}@%M8X-5k<0cJ2mn z&wI(g=NK20j_C~V2KmrPYtdx^7@LY z?83u>y+*dTH|~7_!vr7DeMe`~MWd^!(8-4@Ac+COkOzIp^kVu6JXOeZ;Ml2mz_;)H zy{memorh}zTNpTK?&+E^s}MLR0mZ)aIyVOLbS}i_K=GAc8tD+YRmhjCh3Rz&ex{am zvo!2Sx7{JBxi8S<8MNV2AFvguqk9A@znI?72(vMR{eAjALDWuMfmX@+@IPB~HoJ$L zik^Xr9-Z;$9qxChi{-q8S@6Ba!P*eFgk@y`3D2b_!zRhTX4)AWE@*4Sqx=_M; zF8FN+bIeK1Mo)Ysl$x474(o8>QpDk^etfLqa|>rMgJzjo7o4!FTzsKT@SGz7zGu5% z4?X1R&P$0wx0A$%M${V0+UUp;a6`6e71 zuneX%jXs!b;D`5{ZuKa0EBC-9wSYx1VLoyJ^IDY}W55RjU_^9Yl}trScxuXmnO!wz z%NIfZARxGlrDpyhnd*y%ZW5)Hxuz~yv>#~Y-Q|_ZIekeRr!&L2<2vgeXy;B=@ZYFs zEvj>gdgzqY_H45_l~!gwp1y*hHGxh~B21zz*l7n6T82O?1U=9`Kjm`yVR~mA1#>Jo zfrNCeBSPHG%Bv`v&JV53qEzfgtM4HG-eteFNW zT;5G0sCbS7l&Cx2Mxq=ds0^+?7g_9O1rju+ZdOA94|s6oKZ8?tan(HnuVIM7er<^R z-%Mpk;xTj;@p3+9LVdh9ON43$Rd!?aJePcT#!$28i8TcwpQ5;jbbe-|u|X4R=)w~M zbJGP!`o3|Z&p!aondcWo7drC10t1A^3!Yl>tZHPwc*L@SBA^8qs|jx7f-hFEXkRCm z`v+RMQ;?XkFyvlZTpI}$7}N32Y8xK;hSLXX!VBZb?KidpKTG)CBv@HMc_3tiMFSoGJYmlHE5HvRGVAW0!s!x5mLed#xk6jPV zhp_<&SV2dO15tZ9*|y>Iz^y*r4Si^{BdMI*cI~8!p$dZZex#V!uZuuyEk@I!s%vLV z68&7N*?=zLf+f~RRa7307`0>!`lbIoee0tb;>8Cc>D9gUu*Ic&dvv4@P?X zJ{Soxb-uA}G<^#C1BbP1chT-f}e)oz296|#X`sj^E%<8#UCei5fD7B zJ!iQ8a5rS^X&-r4*S}r1Y^-tHu;H27t$1^o;eX&UOVgTeNrM0O<$Nu#SsQ_{TKFjI*5~tO!%Yb0G*kkxP^r|quX|Y z4#tmBX`e0wiU=CH0x|nS&~Rkj&)f$vqPq2|l{P{rRglR7OSrN3c>yA7v&%Nh{Ht4g&K%;Py|eY7Wti#;Sg!s)nlytb@Pm6K=sAjmWc+0Bu09+eF`XNJ4yXtvcrD?qpJYh0GjtDz&7CTZpVS#JSYsX z4dhfd;lSOy;f`k}6C$vx$3ZHRrqjBo^83CEeiC-aHhW2QksfUt$QPhDpS#E!X)@~B zmmVx>M>wA@A@FWW5${PDxu*Ar#SXe{c6H zPTPyO$9n6m0k;Aj#_ zpT^?IHb^F!5xrx_J|KD*ZmA*sZW-Wz8$Uz($;U_FrNf0RhWa^a&m#460A;k4v-Sxr|mv*p-Wgke~PpGZuqnAixX^p~sjP%huM zQr>R2rAExrkAipkm{~hk2-#^*@W+bKfRe|)txzT~@dY%J3;b$y&;Mn-MNnsyhP^Qd z7QRau5c!s6vgw42k6miD-k2%U3vGRqDI!S4P1Cpms9j&Kt}|42&joJSSBRA7pBo%P zo<{XJrNL`52Ih85waN4@a&ZQvffF-M1;+R?h6nB>01!)bjDjpmSUH!?tQTXLxaHvN z6YDNfa5BSm5(y-}8pf^fgmGc~7~CiV;h@AZ7h~Y5trWJpq0am=X&`m0) z1;m3g$^M*@1!O!O&DvPPRo!MDmoi#EQ3)-Lrf#*?(stHP*7#UFqKuU~Xm8;oj-awm zlund~3EWyMR%+xc6fBCw)!-*5ztW>|(Y?j&8UJ=LM%4D;m;f=nOy|VUbVrUL$d)H? z6fL|+4L~r!kA$^I>W7h(4I(>5&+WjETPe ziBb%4s&vp`TV9ly%vGRG$>47!iq@4PdBr^9uD5KZe@*h*V_#>tsXI-NSW8!^7|4+5 zQM{ir$W3BG3kYcv>qB993*;Q)VvIt3BnU{+{@|nH17n~IKH3}vVu}eP@h?yy+wl%Z zsF#fPV^xoc&_u=RkI)lw`w`{Ms)5OWN)Volod4@o673sWGg_~^`mTWo>>&HTHFa=G z@%@CW`mtZiLPR`nGhDmR+2|0=Qma!3ypYf3&$)cqBQL)8zgp(%?Z<(||^Wsf*Ic*B7ulc|&!BK4DwZy1zg zU+ZGGneg7is@=jmGZm(zV2@OsYH``GeY8ov;#CK2 zRT_X~V3Q9{nX7g{*Uh%*dOLUz#uxXRz;N%M2wJ`x0dp+TnaluOFEZ;daNyaJEme=G zHW=2D^)@pMecBh|bD{XkqkIzt=MVX0OjI-J;QD%R_!{M$ziM0>G1$Tt07?5 zs?PxGP*YZhL1kZxZl}ty2g0j@IQD%Tu3`?``c;Aw!^Bjw`Mn{$5O#%I4quuWRKO0|Y#7{5#~{VYy!S zVoxu2A^{Mt5ZQJMzMWmByYH_%21N#xj%&>xNUoZM?Zv$sAOm#ObfU*Tae4$$SN%jS zReV^|24_}Nz^f^wVHGzka1#6J!J>$-1BI^uG@Xv53EeN+62zR`jd%8v znTw`BORj;?>1#_ExdP254^NE`&`K)}>DI3)hO3sE)d87RlM#Lr4ds#EFlZ`GSX}lc zHI)ySUqEOoeRB017W5@1II$rZ1eCC7+bbJst?pvE{Pud=o=ALbRyDaXO)rzotcuHs z$9eG-1l>WX&A)f+K|_*#F|5vU;B~BsggFbUci%O|kbFL=Y*y6_5^)>Y|4;+|t3%m_ zXz-{b=2YAl0Q0urq|B!M(Gi529Yy)~2&4mBNUAB{LO3B^NU`@b8SH46PowkaQMM1g zWmo$9k1Y$DKNgFxo;wjZlcjGt;q`u8D75zMIdBU*%M~p#(L^Ba)rO%N7xyig25>mD zEq&;MMsDZedZF2UUijm`w7~4y1Z)zo2i+-Sm4{o23ms?>AMnGP65!`q$k>DlvE(Km z>aEvD`u83r_0ZZ^h5{yjV^68r*pf5mFV32YhLzs=012F#YJxf8qePL&gllPn`_k@$ z{lT)O(18D@_!vcO*N9V5xH7SGib0ZSj4DmROXfF5XQA>tqK>oNyO1oh=Fbfa=j+{3 ze*EWb4tfmJ6dWKLVEjclHB6WFg#~p&$Mh=(|0f!xi5NuxCmJk2N(AWzw31+*X&z_B z_CnV=tpm|MeM{Y^W@(X49wVeSA3VsyJlDGJn^nUGqBq?35jW|<>49E(j~MgP+`v>c zcN*MGX#)Kh4NB+Di9oAthSBlW@qY8WROq*(iMgW=^^q3QPZk%RtM6f}tQLHB4S8lx z$sClitL25fr^s+_pS!l?AuDx^v*xFKWEc#QP&`)E)|x(iX0TE75;jfEK_#D0`@zuP z$7I&>^nkEn8wti6%>Mb-PU?AB9TKvUv~h)diLY^aQ}x!hzUl4y$Kn#70}sG!a@l;y z%2Sm2m|h6}F6m3&Re&m<#`EZ62WHkqUs%M0vkF~9d-VA5=Rl6qf>bWb$*m-_(LgX^6E9Ca+j z1Tqh9eBPuJ_~#3rGg_XiPU4zC!m#UMF zeFuoM-`W`bStS75 zG&>5V!(9`vQGWan+Y}B+2aa92knL{yf=r8py&C@;-P8mWx$y=_2YCOtbnySV$ks=& z{!(1~`8u!ZHHL|W@vMY&2BPu6Mm)5~PbLi*C>=asiUuq&iyhFP9b@N@l6L`eC zzp}By7kXpktx(nld;#dD>ul5KUw3zd2pscjTB9AIa|K&=SsXY5W}0#BWiW>a0GT?|TF~Mi9cd(DyRopxs+3l!=@`SpDy;jsHg%G30=QMIUQh60M`Nrvy zNe6X302P_Y91$nXH+!*P5$DXwaXw_K)pu6EGmqY%&ri890n`gYOL~juQ^qc$ZpkF|n1Jd2VJ6m&K$NK~$IAkE+EGb)X&{g7?X{+1kWAM_* zIiqz@1K>JVDBjuNhUw_ET9WouaVpd1?2TG$(aRQhkd8a|TCUxK)8azWN6wxtgv{rB zDS|N>cqQritQ};t@HfejcL>Os$K$CIqOr*K%p?9VSW_U(RInjo7kYR2_PO6q*^??r z#O8Rn{T$SU&g17tjGi`tWbQ1xXAS0p2bv-CwQ8}2nUsfX@0kSa`9C69qxI`H;uOzC;JK z{AltA9{e4-=T0nQYquA7f|TmHr~(;~-RX8qleGCLr z-Mk5t-AsfOKF@UHoHfNoz^JV$--nzAa!gfA(W?kZ;E7l&{yX=fe31 z{`5IP0#f}Cp=tp3o|`xddu2OpTOO<6tYMul+G8d>df_+7U3LE2E8nR)mR3PMX+mzx zZ(#IUds^Z01c*@^aZHt*A7-oW<92F0xd%>vlHlbM-PHDS7Vo4Y;y|AbbxM|*GofE+ zZTZB-#rExKZ>u-ap@m}c(p)-x%^eUWsqSNEcJ~GPHk{;&aXN0RVYL2oToDh)qUmMb zO-1Lk+Qw!f0pf_v7*~1#)Jbh_Y-%3T@7E&Gjwg<#Xj|u@jwAQexAwqLt-)a`V(iFG zS%2~HOsO0PYt?ZYa8&wtx5yD)_Be63%cIXhfed!)?bT#0yUq>giVbfsU<_7ThS3V{ z&V>1fmCpqXJ8u>$j0ZR=!28VHTu7GV{JBfbResGB{+iQFPgRu*j*;|K+F_B3Ihj%! zIF3dN`@)T-;DBvh-qywt9q{~EOXF0 z;820a&V8M4Pan={1hvTL6FnVldZXB$7%Uu2>1qvUO~Ifdz`^MR0b)gt5kshTj-BG8 zc~t&0ivzO(MP`C5O)g=$Xxl3Z40FLv5*>FmcFENapR#kf1X(MAF1TK?hI+x8TyzEO z5r^S!1cE6wy8xU%-R2Hb;_-UTv|s=POn0r^XCu%@@o4I zfV|GJgTRl1x=n*QVDENLm_vwkr~dibBz8K~W@Sw>xLfl3>&UzghX%07(+7HT2Eku@ zO-OkRoR?el`xo{DmUNq=v`g-&i*me8^+q9%EPwo$)?9(4=Z&p)d;w4X=#o}Eybc?u zN}|k(fh7Mq7q~M0&%#a8Uwbm*uPkNv)MbHdoCRFs%2j_sPqtc#1-$uVk6MW~^&1Dt zz7!>YW5@R{9x&;+*GTf8Xwt;V{X6$i77mL=Ax(N)?+SkpIag6?-Ewxz-71TFszwm_ zcf_Vv;_D!2aEtOmzdYH=bcsWE-k45|PIGe^t8F4eAC360SGajS*n(wd$Etep==!a5 zpkgNX`#I$Y&s#f}ZwWHpwb<=?dujp{Do2H@(Uehg?l3$urtV;V%#YMfz>nMoyELWu5mxqTx0@2$ zFIm}?M5*2_J~u!z>2T^P`HwH!vxZx5e=01eA3~@aS4tb4(6?ASFSRWaa=Z*wJbcUK zC9=dzhTJhxKRf#ap`+=Q^3u9*lsBr+Vu-bqTO7*|oWznM*KXgpm}?A5X`Q3j9^rP7 zCe@;bISs}kqr{-b7MVVq8l_i;+_ub^*#9ElbjuK=*!V-IxiL`jyEUAVb)cgA8(wui zNO2k5Ef%Np`s*vR%)w&EXIGa_Z|R!Ndfu%gV@`B~J3U28gT=BRux3V?1O2w&o|3ku zt1d>d1t?jOHggDTJM4qSRO4W26Xzm&v4>FTUU=j)dU4-uqbM-Gtv$8TH~c(mRks5{ zu`s}|4w$8ACoB81VK2@j{sQ@C&c!@M9<>qs2t{seWgGi4(flzw8DT0rXEDyj>7VKY zE0Vu;P{0CMhJ*gR7)NNCBhitlvW-^IOi=BJV;kR)UU};YE4eDg+;0|JqQ(BH$S5iB zC>=P{)Z>Sg2Zpmegl;FJ(J^j(>WBA(T&@+QuYIXo(T78+6v#=Glo2|a?)68ji$5b2;{V8LOzp5%yCUVg`s=Jk$ftL-7es0`?-STutp4*aPT&wl_;)kvlKiAI*yddsuLr_QN6+XLAi$wwSKRNrF$@%#6vKNSn z8cTIq@D%9pW?b?hzQ+EB6z24ZaNBt2pG7RXDhLBg-{>anX(MdX!@q1`$h4hg5Ny^? zo#mvJp9~?IGw`GLe-kWgV}>xECT7?ti1DP?)rH1Oun)3z)JflYOFcGSW~?cD|3>B` z2k@M{!+pmWkaXA`COP$m&Gfx?Eau?g?<=awH*)SMDk|^h8qkg$^nMS0a$>GCNdL8y zX)*t^lWBL~tk2H+40B)NUEqJ;JgIuJ=x%?zZJ6KW9#luZdM8`rw4Hq4!2K#0GcQC?I*@5-aws5%y9yWRR>j&MM?o4vw+pl)ejsU#bp3D>&;z zY%RjR_h(-!C`?LWBAA5SeHZ0@I|&b3~|whFokhG*BZ8 zzMBvQ0A8ieRoVNns4Y*_ZYd??_7J!fcFReX_EW`BJq^}VgKrfWO6DV23oT4w8N+t3 z=b|-65QxR%^^%UX%)}{t`M$=1L~{$gsy$Pvw3W2!Wxi(vI5f<^2~;L(`M$$j#7)Xm zS>QU{2@v@Q2FuE!wXU zTH3`K{Q;uf_?yJ2+7`}4urr^Zwfwi@tQ4YX?;8sJUY901j$Bxp!qW9@Agr|wP3TGm zCnX>*G?vtB#lDBHj)*WImFvYDI{PCy&g2e_*CGoKWqa3Zj}><*ykK>K8KPP;AiV7F z+?AJv2Fv4?YSw+;>OcHNye1JPTIAhz@4UgD2XaZYsumoXO*`cHpyADt$;WhCQDr}^ z!1fu|{oK8tD$4tS&Hp=0pjE+fhEoNr8vxl*+Z#G z(9%&hBmswZ4+S!!K%sf@TH~mHDU`6bbJa>RJq%*heE!dR%FYkRe0;zn(zC?>Wti~K!v6n5z4j}C zufbsh;(|m1jyn>K3nJl}GhH!9L}yM(tWY2^mc#yvChCgov2^v@U+u$r{QXZ;PSjEY z&6ibaD;Qt{drpA%VGDMe!!*m=lPzMPaN?FR%oFa+yq?Gimo%R->mJ*dUgohQcqEY^ z=AAOkxZ0lXZm2n=`)i~Ao-jrPq;l`Q=ZdXJq7cA(b!SXu;r*3Xz&zA$A2;b0G;CGJ zJNEu`?2LY~K563l>oCMV-z?jDo(C(YpRY^I|3zv@!ZmJmL^X#iJJ{UDL$djVZqg{) zro}m`KyZQgQNAGG)f4in9lx{~(#h5{#H5M;VcyJ4CnT#zgB-^sZ|SKmm4;E~O< zb3ztD;{7c?>XQ&A$$QH7PUvgIN@B^zj}lyfe#)3V9V#-IU}2F`WgO?@EP%f_0wg{` z@Iip&7>0GDWn++b@tbj}J|eXWUbfGTbU_JvLW|T8iTeAvFeZ%d{_O@Xz4WI@0w1UT zw;$p1gH~BIObNun>tlU|o0UP*+J3Qws9QDt9t?3b%7s4~%b5(kR4z^`9P!QA2k}ZJMIW>5 zBLJ)Uo-6TtLq*fZTvGS-_ybl0S8<8_6wp}K!D*qCiNDW1HlhL-@$JgU$M|w9h`bT1 zFt-j3>vucNeZ>)r{AVqJ{Kl`2MG`yfGPd9^N}RQ|>OcDu;jary(Ze})R#qFEEmplG z{jo_=rbJ%nZSW$tQ79zC5w9MP9!oHmj9Ds1)Tb177;+xG@I_GUaDHPAI+cK8v)1!0 z7=2>}>E3K=_REo^ObsG%OqYRw`a_lV{pDk$f?RXQYwi7gnRtIvTdP%ZbBRfNDF(Ni z*?2APu%WbWiOI0DhTOD)vXzFK(?p%I3$DmPq=ij+Vz6MLT8(Rwbtk4a>Xa?ZG#9}@fmgkH zv(|~Izcl**85Q-dZ>J*$nf{W^=jDZW4TMop!D`dcHzU}MhGlJL-j@6+m@cS|IZ18Z zjqxY-{+BWOm9PW?#YZ8=+%ki|*NO1&c^J;`(tzcU0l+*$N30H1yiHkrEo(j3KZJ1f zSEbmT3CZW!ziGs(hS*%48Fxk4+@ssw8=_FFMS=&yTVh1qzG~=PX(+ORVY0%j>KkyF z!{0@vUk8AlBD6dwjJ$?)n~S;$mYv8;17N)>@uN5I6IYOX-vriE}!26Cu zLBioL1jc)|h*?Jp7u7xg zm+Al;WTQ5=|8ra4rvT~UssRbZ3>w+De1o}cF@J=#tOgMHSNIy7Z7EIp;PmUH+Yi6Mbf(UR_GL3E)LzAbnO=&t#a@36({W? zlgAUdUTK-d51D2Ai?$#aF3}KQEKVC|UrDTO{dfzTcJfrT7uA5ma6#g=-zpoN?l*Xp zji7~>cpWX|@13B9*JN%CzjyH{gBW|XQ4g@oJ79KF0l%yTF5ZXW6WXRJ>@S6$Js~9M za1JsDFP|l;$Px(I`paU* z31WZo7I-lE+pSJWYuW1KQSc>u|AI=Gs&*iBsUmJNL!u^0D#7n_adDf@;Jm7pC(FQy z*g-Px>H|@@MpbTkI@N5pXkndk0BM z0`HB`5ryy|a=W|U7!CYE zvEEo!qOskalR2G)Q7v!sA?DN>YTp^J-QCLUo$3VanPl@l(hf~DjSd~2E0rMGQ*fAV zc!D;;)25;8(5piZbckHl1;@Q#OW_RsWHpUHv7-^5cZ|xw5c>fR$T%oBP&MH6U$ZF$ z<;9BBnKpHM=sk!(5+vQFba2dN7EXx8Ck0{;cD!I$Yvq0RV3OwM^B9x7aq<3>>zhp)MzIJSj3^Po2(e}eZ>@s@5~{2&{KgvrRbsC+mm zr<_e$TZz9SD^Z;;1*<+928*mWt4L$SiWVVL8cBR&v`4?!J!V3SEnI;Y8L2g7gTj znEq7VE{%J^a^dtmB+Nl8Hai@tjxnw>ek;A%t z0}Ro4d7QoC(aPO58{z39%+%Kc!pF#T>>xBi8PR6ONO1ahJ1Hn5+{m92b`#%m?S8Uj z#b1Kdvo0{EsK5+H+i%#Um%jy#xJ1Nz3~j0!E6V8}qzn4TclqHKeSaAyZK;G2#je=_ zR;sO63FG3H{Q|@acdq^Fkm6*0eE5D!rR9Q;gYi>PjspG3K&8B}sn5&3ORTm9e^08X z@O%7+RD^{pVnGkm)0YXLziLb{|@Bg%t2ssVhJl z@#DIA#=?85B=1f{@hVrvwg$>ff}EkeD;77XV?ZE&z|>9H{Pw)sd{|B&?b6-<*GyLX zH8d-jhUL$SCyBGEV1AjKQxb^Mhw$0j?UREh18AXzI9tjj?G7eMrpCbonXmtuC>{W- zhYNrK#5BMnhYlz|*x5NTI9iz-89V;x4-@l$l?>L{M30UD%1DY@noZ){12!}(hkfZc|4BpKN;v)$Y zz8zh>bu+vPainF@uO{g)BQAK*7iy?O7AzWW zF>;bzK6f6t`9IM~HY^%xqqqQd1hlxQnmS{s$UTQF0}IuOs@KC0Nr)5op_u8aDHaM` zKV3Eobe5Vz7d`wG6ECcMEFWB2=j@f(ft^Xtbi7VPfJM%69$=AczUTcBCg`4@!M6pA z?iz41ZMpVsKAx=-;T$X{CnZ6pP_>~gBUoF8Hw>+1FGH00_dF@~=)_Gp+i5fiXs5LQ zQ!5I^UyB?AJ7;^HAPR(8ozq{7TvJ%rbY!ixqe)d^i=KG?-qKkbz#@0%+OB-)#8thX zcQin}Z0Xvml0I4kst?cY;89`|9Y0G~>ke2ezbIRy#GE2L&uAlB6R5Kk;P;@Dn8(){Ot# zPb5#P3M74FS+HIZ`0FRI#gX*?@e^Dc#Al15h=RUup6Wy(q)hP-{-P6T>VxOMq8)P;zG+P}oBihIhTBgpDxG7hau+5um&fGk z8$Ar?+Q|G6PKlt*fu1&W&Y~LnlhXtjzc+|=)>`Khm)Gos;a8)G7+-r zUb8c_S+X#&T0#lrSwribO7cAWnbVV;qcsdho=ET}8NUF)$laRg=G1Q2;s|LSFH|fy z`&zx9H+}D_pXpOd4ZGonYu!4tK+$`tJ|nbkUA6hy7+7fm0Y!iF*37bc(d{!H9BqOh ze=zbZ0oZ7nG)X>~{C}(kR;6!fPV0?u2^;H1+VYH^!ER9%fFkEJU#JP3!au%foiTy? z4@K@4K#>c^(6Dy~D;(jJ<%z?|#BF1|V=(Dd@*x^tO5ZxiYXdMP`qNSI_%4mFoM=k< zTvGu|30m%sXLow9n+bu=S?}|i5vZb0y-vNyKJ4mcS7x+Flr}iZ&WK>k zAUM%{<{FKvE6i{1qO5`5bl9UFF7(Wf^#`!AkRDHHC>z!8bXD%p!*bzahms?6^GGSB zbS}=T@&dwaI5p&hbg-?8lWsB+ba+IYaWLK`=G{w( z2$(Y9<&ArTZg9|r-K$Wtdw(#ssCKT6)1nfRqd6w+H(V{opVzd z;+WFN5(woJ2%)YA!jae`OK2^q*q0d6&QQ|z1d~Qusk(Wa`Pj05&4ftI z>lwgIu>3{IowlPQ&=fv!|3>nIF4SQIYzTdh#U>q?i=L*7LeQAhlu_f0_-+* z|Gj#Mq0E9&@_IDOdVW#>n2FEnN`GHifSJIOYLQN|Y3J{lr}*DyqTugyR_P-f*4?;f zu0==Rmn8t3OnFGA=0wt;d-dy&D;kOa^GYk}n0)wFp^Sa1g5`3f8OS>(F72p7w_)Z7 zz)*~EpW6hUyPebJ!o z%!v$ASv)%*3gcnV#-jZW)!vNTi6=n-n@z4R`w!WjyFLxAB;P`B^}D+=gxDn*cFsT!&&*Y zlU%2C-2TGy+|+_Cmrirb89K6|cT|Q~TKj^~3P$1S`^)Q4yeqTD|CYzk5=q zY}>xpY$JwReb?3(EAa8Uq^-{NPbd22ZPOVd%+_fJ$aXZJmX@k0Q?4CzrJ|ScS%03) z!H0g|x5wv#UTpDtelJuMvTPZQY@D^(_hv+G#(kg0AT(0)ZlF{6wB>jPbP~-+^-eOO^bY*0`}lT-^@gR zi4=5U0e*sVOo_fo(SKd0e{>6BN-sfYo&XnX>TqkDX4Lwj0zHaXY~%`FCyMh0Xau!q zh?;ru5KAoXO(>y4dT7(E%6$ZNeGo;kbSvyv<&P(kedR1ijaDFIdXZ3OLjDas%GR(W z{=$gFvo;x>gb0h+rni)XW&BJw`2b=a_+J=w*xoHW08OEB_OMwSV{AJxvT(y% zzb1}3q8uw$nb>C(Ct{Z$ko1uVIs-9|ihNU916AjcW9wl@_O+N?t* zasDvJ!nmKkMV|R$?%~3r+CIlOlSWAO9ao_*&99S#JqTxWrd5jT4=8q09mI@n^Q_$w z6gSJsHw%I8lk91ciJq6OY^km`u|!X~v*n3?A~f+ZWxm43)yDtR9_n=;C4==SCVd_(0mE`;yScND`&ZpW=GWA0ZIDW|r^_+7PU=gVsaHo*;&z-`ww+;9%(<-hbvx)YS zUzjq<0pMRq6<6yc`%90jtB3~}fxAl?i{{!zy3^l_3-*dt9DnI?$r`5H0D7Dr(G2M= zfF3u<0iee*rf7yvWAqAGOxym$k6VMU0`TKj83Ft_-#yY)B_^J4x$v!IDujh;KEY5O z9!4U7$pT08pZ|EKpabhu#|CJN9%1+|KHz`KOE#U>+0nbUrY?94JnE&|)dvKmQrMj+ zl+WeOHWrM3X=Ld2kdiur1mPk&*|>Ah0}4zY*u0h{PLnUVfFz@mP_!%N9~H=1n8d#A z^uBi8?;>(Cba78}av3+sIy1TbKCTt{5phq77F~beKPp7wBw0}|NjVLM!-G-n(zW(= z3<&g;W~QoB*1Z;vd#Hdu&p_g%hpXUT*f zeo6-{Ax$4!PIOJ}s||%P2TKlBd>bD({hqRDF(@ZaLrP&&(T>Y{1O^`jb@S=Msp73It`VZgSCB(jHW zGVVj9_LiMl@u*;3ehk~o5Ig-~+-W$>9(fM;^@*d$7F^G@`^oRj;=rVQoXq=6a5}e7zbQHn^ydCh`tV-0 z;PO1)qr&Vgh~<;}1{3cTA35O|H8?nO3V{VOZoD4F0!5yUAW0R_7wtynoJ$Ttb^Hb~ z1fJz2HAP9l!y4B+I7CvDW&r*h%)9&(Ggf(x_1?>NB-WPDw6ru^3DS1?7g{jkQi{$X zbvoJWeY(CBE!IGSCZaT`w}i*{O1R_<$++_3;Vg0cw(})f+pV%q@EPD~>YLrUnXgZw znW~^2PW{LbvV$LkgaI&9k}J@_2H@guDErHbzc4@xN*XZUW_uKyp&mwD;g%D}g{Ch9 z<QG)7W0F-yRZhaHr$c|G?;`1 z`lR}%Q;7dEM5`oGq2Q%F+o^r7eA%s99lZ!^h&YD=<@ab}$HcoWNIj@qSwU1$FmR{7 zN?<`0)iek85-0Z-WUf|nrx1$`f@DKZCa>GZ2{6k{s8%i$LKSy)Lljgo+2el4eyu`n zCM#vO zy%I;fnbRSDQsLwjwyoSeFpZ|jKL$T4(x=K9Pqr)c6G|@ar?fD&LlZI+tW|191ci;= zOqeHpwse04M=;i332cKtO@%_`_>M z>c1&GNBM~-fxO!&2@aQ(ivj-q={*0zmqag~h0-^NZNrfgNdU&Q4V$@^OS&D{e z$rdp9oYi=*tAN6(RY^O_og4d?ERbb?%-E#3l!r-HeMJr4+lV1%)R2=bLXp z(-L`=YP}iH^_4g7ukBn|7I<2xG0r4}*N6o;RgVpBA|;<4K3zrV}hKF56sV$7B=OrPJ$%EK$KeCSK8pqU)3svN?#vs-jEx1_yi z&Z|0h%ypFu^k^N~X3{#Ss6~3#(YC0Su>;{`bNJjPWCV*|W4CoTrBf$fUAz7v=$T1zF_5xvI_y~+Ezv{ChwQZh8>{i;>Hy{X^8TMUp7Fykv7n)V zfRO$RmV)VDTCMiKWU4IyaSHr?Cp<=iSWGH~@y@8a83V?nGw#q6`fi3;8=1u-j=VSzv>-da z8bPBhJa^D((6pyWG%C@R#_4>$2*9e<<(?=CC}^Ds_c5VMkq)m>zhV%bxNnuBCf%A$ zqCJ9cUHy$_@&R5nq%>~X>Rt0Ae2)6f9N{!?!mNOyOXkCrwwO8Cgm@1+={TBka(s3! zJO*$LIn3Dp90ovBP2`CJe;%Exk%Q`vo?kb*BHPiBWh(iEyDPjR!inKps6#S_Fa4G8Y-lFr|njSGIc)queK@keE zQCXU@uBn%)RI=iAh|U9 zzgPc|1YL{>~jEP^w9to(RRvG9a&0`iEsJPCD) zamGb>q>zj`k9uD9eMyG_we`Y3p2(rSmY8C1VZ>rFMKQYf7AB6{;k`1e%io2`Wu^EQ zW|d1fz9I;TrBc(DM~X|Vp`Qi^U(G~dBZ_NG{ty|~7Njqo(9d(x_qMKEtUa8a1gmFN zgc>A;N)K?!n8h^eeAq^skZDq?1!*kv!o0E~zrz38fgt;{Mm9q83=yOa-e=m75(v3c za+3&poM?~}%NP)Xy6Kv|eLQ8mOtZ22v=;2wigb~?{+NItE8y;8y!ma2&RHz;@XR}L zAckICT^u>dV{P!|Q44-}r{7c2gdG24(WsGAI4-QHK5%^z+n}eAZdV<)!dVTAo{LKW z4sBG1iDo|?|Ae%A+SS$CiY>TE0}l@c$o3ZBM20ZCsUAerFaaT*g1qVD?VUY;M-AR*>D8HOpp?)Utlg_Q>j9QT^3hU%9q(#nS!vR2qi+n(pOM zN@|YXv}1Oy9`2L(Z5Rj!`RZY+DWb;DopmrJAWpv)&4=I#iKQMl-GJhU*!4@Ew$Y_+ zS&l8$pGl5OOCac@QfK;62B-5B;L2F&h0K`eXvHD9UL^agpgt3gEVR(IEcuG?i9)0% zytD+E-4O|o0~b*W6qn1XTM3tekHRwvmRbF^hS}T4Sx)NwzC$bUAj+rLyw_G;GuXnaYZ{PVB_p_@0 z*-IHV1eN6R*kSNUgOOA;`FZLTL-BSy@&?EOZNGtFCv~5*DIYh-6O*XSHKRYrktx-T z0qJVP8=5c=XTJEy92yo+xCC+NLE7oPcB22BPB8X#3BIzKqOo&NUpW47vyUO&)q%@ub;z8-#WW*G?gdMSu2#p{~TDBD{ap2-r%0g zH%|c0JrH@|RWcgMEKsvGoIG9obI#@W!#hJMgR5dh7SI zIVOVPzLRv?m@36U++u|4Wlc1|#9%h#V?>!Xg+GUVfml);14UPq^3;Ycxo`*m=`xoq zeem^z$O=kMUfgv^I6Ee{>=mmt*C0adNB>X0mI{UgJ7&*snb}AV-2^t-_Z*ty^S=tX zMaN%;Nf|-I>Bqj2krY|g2I}Bgc7ii;z0QXx-`|cFBYDsBJlVH{|4B6oy9l)i=@p6M z)3)@UMAn|DDXXs-6O=GCm$baF$`CI!T<0FRl7lTiNKa}-->;Q?)*$@El;8eAU*S=* zkLAiv{1F6a3)zj5dh5`o2>U<-b*G$E&p%jgr{l8NdVbK;Oe9xrE8z$sOUUg)loq=T z0yUfspJrl!6K{i{teRrbHiB+`JDRa~ar@d#Nw zCnyBeXIw~b%}!%;--MGc@6&A|6JC2wQJeB-@b2r{n_SxhhUJob~Q5{ zLjLPZG3oKvA)1gN+z&7;m+gE^ZVN>NlYLju+=!r+6RZVW-Lk`o@r|w9f9&XNS+4gU z|F1nD&{o@iVxhL{r8-R?ZIqi``Y@47_Xt@bmr2sj0luax(Dtw<( z#FD8S_$QhW^qgNa$WO|AqERsj33e~LN1qB2MG>0u8&ZiBVeNzywmx~}QMe&FAF^L` z!D;0W`1F_Hu%iF`>FG~B$9p7Tkb6S%pJN*4f1zFguIIWqqOV)vpZ*|UOQrEWwZf2* z(2@ZmpkXH3!Nr@$$F{hPF_1WyhCT>dUp%{8+hlW|?MAA@mQn_j>P`C6#WfXnHs{lzm`X!>661KJ{_EDWs) zP)8iRM?q+m9Msv4sGDz1;>H%HMf0Y7Y~O(}XpRl&XG*RL*HaD8YE%EIm_=rAvC&>9 zJK+J=sl}pj*%U&^D~iNjhkI`yt~~QPa-yso67z{I&FN);77xdT^lC~FOOj5ywZzJ4 z^gtpiap2a$a{Z2%sOCgn$5J`~Br{i#DG5Zv93|iHaeRrIebhg4mtw)PkTp<|04=V3 z=#<0+O|ya?R~JPa8$VC0!f_&KlLXaJygE{-1j=dASn~*)VIYM|gkTA^g~ zED03V3Y^Csa1dCYO60&6e2==}y$pKWu~vk$EhX?WC0Cc+M(Y1hr3ftf7L-{J2yKVr)W4auJQW9`#WpseSrD!177k%{2!T2y?q)}!MBH@o2UsOVQ+djyjSEsA`I}zr8_&xKH!>BNq4ZcZw4LoT{yN`!`1TvZ zo?gb7g`ey_E64?}MZ}S+Dl91@;WRpmh0-L+`Lw>@JU$RMas6Ug*|!xQa)PPg^9PfTakXql*vA7-sT3kft=yK1ISj73!875gT|@pPOq8EOE}eYAfDtlbCPoyl5s7v2 zR+DS-S`M*VOkYUf*!xYfW&~=(OWDQeP;{5Tir=ihcWT$PqDMctqY{v(hnV=myFs4E zJLv{RCxKhB*_R9q6R;(Zcr>CbbV(aql z%m)ph)lO%~MN_71Y8t6N3|M8>B|Fl)DLS);Z6K;IvM^(lfYN8q*u6a~bYpCNj$Bf)D`8 zZ;LckL@fV$*yH8yxB*S4EH!4FiIxplZLO{~jnMsdrL|hu@I%mA@A0%JQ(Eh3{gOJf zAzNJ`I?3@R4VAbIS#Qvk2mOKMA=BJ;xrOI4yL6*+J$l+wpHvFF9z%?E94oyYrI(pn z=*}uLE%mhKBYR7_m-&KwgGQpYES*i$|hlM?BH!I)lA7Z4}U6wV7%@HGmz}vc80oFp_mITtd(Afso%&tu( zj?AtNr4CzgAgD|sC7PPq7Vcanb5#eZB_eaI*p;RcBl3v#lX4v8lau0zTIxQS8SL1C z)L8lBQtKulcy)O|J^bHejZ{O~MQN;M$&DWaFnH@rZcy#=K=IZ?P`a(lz1J4R!*2bx zwe^+lSHCXC2Y*J?%{HODi1k|J1qb6#nj{t{nfU04AJgWFohYy1#l>*fw2V-5r7dHr z7zL17>bsKm0JK}E-{X7}Gw5i(2cX?3|F3qZFhP^7ptt-l?PkCfv`K+tE?e#SAMIWQ zXt$&d5rT0V)2O0sMabees#*4ux3dP^>PTQ>DwI=y$_d;Q<+BYlj%5i+cWv2KUHmRZ zZWQT;rlexT5T_*Rv}93KPu<@ls198F;5X$YyGI^3a=h6XEclH-vKt|tc1?#OTG8PM zQNdrCH?Hrj))AD%T-Ii;T!Yt0$&W+?Acm{fED!8I9MnPqVD%H5CT6l@2)tUR)nFUYqZ-;*L zYfSWB?qlR9fW<$W2ba4cL&H98h1K>14$F_yjo%MO%TK}#E3#9$c$6H&2N&RY%dWxP zd0PjA00>o8LTL9&+RDjsP(tAt5hQO>eG(1y{j1@W5v6}Myj&=ELR_&h3Svp1`>TQkh*fl0 zJvmR>Ktpy%HELRVL;HyP7h_@@I|;ROb;OtRly=5KKU4c{pwcH%B|E>Unk_)XJ$ym* zV~aaP8(<`ZSQrvr`tzf~-UAK@v?bfABM3N?AOT-(6`gbRK?pViljcyZYVZwk;-P#T zI|~Gqv@a^Y(I|eip)O&4UECz0bQdkTJBNTL+tU!iqWvr4RcSBYkcZp;w#UoE0i=Bz zB&%9~MLbph8F5rM8ebmU%~@3*h&1~x2*cAm6W%vI|XfTctLh~8}>%J#fnLa*id zq5xpG_g@h=_t)U#LH`*~)JyE=6|O~qPEtFGRnAZ6ke$032=e?U+O(Q~;(KS}2JIr_ z3sm?i%oV=E$)?O>n^WONkWL-n2NIh4c~kx)5>@^|VRbk*wrhKR>!i-M}ZH15? znh*iQL~sj2A>uhCL_zYnKdxw%uN4t@@2kz@+UMnTXJ-eZ!7NWZeoT#*bwvQN4e5+Q z%`lo^l^3Wz9%1g!*Iw6dI`zHa&5IS0d%ximh=Pnvg<6_kS@{zaAD}LmC7v9GX0nRT zZPpV|N1Yue+964XXnq#s9_rXe5gRkS0wQCiaVDrSZx=PtmRxu8v=QcJ-TTlns=?`S zRuxB~h=?2WH!7 zi5WzL)}PV{HVU8^&mu7uUC&Qxg({ZE(ev9u50Xu~ebcP{Elr>NC>lQd`j9WNp%P4T zn^s*VLlZk&pqxsN8D-tl0I}(wH&@OJ*9|338#uhLw!`idS8a*moP1YYk1hf1FbR_D zLwod_Uvb;vn4^bVFQVgF$$lUDY|Nbt&E|1Ov#WI zk=3y=P_c$tVf4fgN9jkI_h{{T$|X7FPXvY-IrKxEvP=btg9z6H1Uv4pV52U7BdN&U zX}!YEJKNnsq6fkI16YCnzq=dTY7i1l0D^5o^j`$~-`@A{x_{lapIhLTVQ*KHg-IeR zm6Gs5pYk4Iz&>W$J?ev@SS{_+L6T-IDvwy;RsqKe+uKsn18GhM8I@AfWt*4^4m_;p zf|I}5QI>sJ_Ut`D?OX_5DD|E!Je~P=%Z~&@^uaqLi%uQ^D=>5#)^sEVW~#8i{A>dF zu0Lm<{FF%%y;fSVFEg3eIS6Z)#M#j)81Gv2q#IeL)Q8wzmCJR2KQLic)lw4e7l# z(wv@pTVssw;}?fjM){rgPx>th6s{JWhlv>1#mT8xLH*c<6Kpx2PzBT&1X9kEU19S^ z%|=oAyBk^2XhdD;*8XIrvPXa+qLa-nK!%uV|jZLU=MeBL9bU<9%hOtU%#MqvNZ=M`&&=VTVr6SR%#CHNy64qyCAB zzatKfEoCsqQWwC@NFWe=`Yvzq1df%d(V3e`aKeO#6L4Z>Zj;lPcpHn--4^{?jn2bW zNdL?|RVbnt`QuJ~LTwh*FzgsN)Mkp7y57ZFPX4}qXLq`il-Xg(3r?}2lPmh^SF8vTj=nibGk&UAf&w+8j|gS z+koAHfCGDgw2SUR000#l#H(6Fr<{5aQuW{^I5RAVDgjPeDMwnDf2BQD(aRbj?WoFU zFK7HjlfqL%2C2S0S4BI2Mn9N!1D zaRr0|Ann4d+QALm!S1sR6%Ahh`g5|BUTEq2y<4y`39x^@LqC`qvR&c1!h9Iy!Wi;r zM4o3qt;}YGwQdjF;mOb`=}1viF7r!%u1c;{v-xx>KaMHCKU<0` zetz!ue_gtJdwXyHeAW#j$nM!b1b(KO;&FBT!@H!IShhF&o$5Y!lkGwQmM&IXsbpl~ zzJlA!oTzEp{oKnBFrU_fbj{Bez2?z`eB{CV&A!3zs%RxfsMc~mIRcZB3fGclmB^^4 ze3C{eH0{O#5h*@tTLi$nGMWyXBzBDwtJs8y8`X&MBwjm zi+f#u*m?5&JzPS!+x5Vm*Pa&|emEz+TQi`3A5NI8-2PAd*;oIL`ZQmxNGjT@>~*-- z8vEqCTdpr6^|aC1HjmpY3DB7fch~&+TIbxmpk6}KM{5##SY?;bk8%!P{|-|Bz&sp_ zf_!6W5w4WX*-3*lE9f>;Shy4zCq*r*TxX}18y)r74+~%=G<{I>`k3Z`vz7n?egj=S zqbekBG%eC8xaqk@+9G25Y*C)xGIs5KHBVffK6_I5KL8fz|E?& zGb6*^FOB8>Wz;mczC=;&`$**B#Tq&aGxeTou0l0O*?Z@VQR)%%krvV5Ks$2kqsjGo z9e(;gbu`vQ+Tss|>R(HTZQFH)zeYTpwNr%qI*Jv!mT$_Z-s|`54HtROJ6iZoj(Jnn z`Sd%dKZvE~Bzb8H#psLKqbU;|;Zij2o2oMx$DXxnR11SlE!@J3`F3czM~yye##G2a zTMq6*sTIaZ#Oe^zC8A20M#hbjjtSAL^t;Q$XNy7%XHM*81?<)L_QypJz2jdoJ&e;) zU_$&uzYLKHqGcwD=do(MieAs@jEi3H>5ASb!3BjnsGLkW+o$4|f3naNgP;B^ijgqV zGpSdcu=Qj`;i7d>6vaSG26Kq*W1J8VA2+j10kTt{64L3BVHtQxHpnbMgK8~kLyN@V zZm~T;hRp%W#M=$2<-y+ZMol#C*qw>dG~cY&iF-V3il|d;GQWuqxvd8U^KG9IOR`EE zO=jjsza9ENP+oNEWN+u z*n$;jrD`@7b=583iG)MMG1iI<6-Cxws%H>{Z|;U@`LH)MmG|$Yfv!R+ox)-xOA>@h z<7I;w5U6KN`T66mA;$OfXwwd`La-TO+3!I1fI?K`#nh_ONtxKx^$Y5eW9~FbV{!W6 zqtvoWm#Q;&EpSr<3|mlijeoA&G-YVU4_6RN1r)e7I6oh_fnUPPx8-D)?NqkVA?mYk z5i#wpiyHgOp8pxWRW-;x#Fc#r3oJ-36<; z%#@#O5``BWsUQ+P$lmnY5*fIQ#GR(tVzyJYR5z_Och11D2S=Mj6dz&gY#8jc+bIqQ zXEn7I^)ySiSehCS(9t@8g3thQZfVhaQ&mN>Ir$I>&OPivh+yC^yk#{`WudF1PJP#8 z5v?ZH3ub}`vA-bfUr92eFf=Wz8%MRv3Wae9E9a%b5*GB_WRt_1agRA3JT)j`Uz8T zLm6N@*RE~U++{;sk21^AKm7db!gS4s;ssm(McCoK5QXhVOm#7c2{mY`^=47BorW|# zfRyqcT8aZUY~>a);o}lJi5}~g53oyEmH418$sKoHpadA~hq+YxKq~5SNIR={90L+= zwv<2EDL^>CQkJ^g5g^Ct)TO+9rwjhty8Y1qdGszooOc1@JPj>9P#5OZ1a686 zkAGERJ`Vik>;Mqw*S_jxfH-IMv#ov`###lT#9YAId;%Htp~$0yFVIn?5RB1Fa4N5X z(o7nCa$&Gs@J|Z>b4mp2bRQ+Z2;V`v$FILZ!V%mbmJh>fjL%b-6c##yKZDL%44HK4 zFB?~{3u%4_MuQsb+4cu}S$elKH$TQ%68c=i7EdqpE*viJCm8SZRc*d8&iF;)@zFig zHp<|qxj1Gyu3lCVri^B)w(Rslpy@Hxw>dD^hFYR1R}ei0?ye3QM$$^>@<_O2s}6}f z(x^-fL<1UlY`6}}r$U&IjW?8V9*U_dsI}01oR#!2qYsg$T}a{kuz}0RGkOx6xxD&o zbl5!lLk%g5mUm%An|^KA1zS@aYESq43PCS7JJ)7q7fy^=x;hIXInBVt(e}{V^_Rc! zeiW>cfwgNCqt%tCAaF8uJeh8H0QdF4ndovK;Gft&!*r! z4KFlGeIvb+k-@;Y!#}gj2oY=>OdZ27$TR7*r;GwS`?n10>g~N#_(s)T8>J$XjCr0+ zhHm=;#Ms}<+Pms1{VTV8JL#RA22E0-_#J4}I672Z?1?IEb~-Vrb?gO}NwuJ)0-S#-7x-%375hpxb9_T1B}-GRW?E z2LYJW^q5_g?l<|g`#aUMX#hek$%N`;oG2STAH7W9zr5;H1AcL*VB6Bq(z|f~Q5Ze^ z`ULYxdbnoZClZ#hOUNNczI5Z}+^7d|HE-ZB&X8DOSvUX6_|AQo%fxCio$5fvH|@zYNa6v|V8o;>qGUkHkvF z#%!gZG|RnDsUwXKl;h5yL1}$vzeqJ$^Eg?h1b5Y+VlxR*U?b@k49SXxiBi!QBZ|Pz z#~wz>Je$b?Q)@JnKLv~$jAVQn`tz9t#7^&zCC#<)$Bf2>X)y;{C6Yr@kue)AoI5tR ziwPv>b`)L~k$&XryrxuK#!#HU#H=?Xs0GGu>dH?^eT$0>+UXxiq$G+eqY|x)qY=!DW0+sNpLwW**FxobF(5?73Qf!f zcF|lGb2y`KW@tE4B>Gifm7P}~+N?l3BmY}QZoR5Dwi#XUptQgqvMYYR#ZZ?Zt6}gP z`2y?HmEA_u3`wxN6*dOe%1syiT>MfddTCciXNK!Iy7irCr4M;P3lRL_sB%wX3Z>=7 zWGw@by_kg`RLiES5ieg!Qm$*v>f(Cv}h)JOT%zmov+?oKF8K;9iKa)xHp}vkb#o6RHU?t!4&HtA8jQN^~;s=!GuVDVjpTL$HgM(c}u2H6x{rrqIF0j9L~> z>;d6}3~_v~%EZQ~A|Yf~;vmxwP|4=JHWe58k>sS*TXo){;=U7hWBt{0othz?CebwF z)I%Q-WFlocC>XS+rdw^MSQt$)<^OfdU<}MCLfWEt(FF27LTZP3s}=oDW1aO~TV_LZ zS#Y#G4(|3#`9`mH!Xd_upV5k+RP9(qc`=F!`P(_pixuf7`X~`0l!;y9!#^V}N}a`pG1{9sfvwVTxU{D&xERuQr0G0A;yRF(8lesaJS@ zhW?X*i_@ia;lMqX{s9wy&GWy0TmB!-T@hry6TXz!Cro;0=W7FV9>K8t8*CpsfQ-!| zP8Di*-vEQ|Y{v6( z!-3{skF2d=xg1Uq4#|4kf$ZjT&hlNFIfA$)T|i8~XAS~*wl=Lzi;_PviZhjRP#$Ef zO~5rCDK6TbXAmShAUu>MVjkEOpdCbzN)BDW$09^qA0q+S=0QsWBsCr|rEGnJ0 zMyttRld>5W*qQCf0tm?=v`!QaI6|3={oiWF4VQ!7h7BDB@lw?kmZ|@&* zlxtBzNeTILsMJ+O1+gK-E3D@})Svh(=53nDNlP7ni?33nDu>T)$=2 zm6sV?tRLs>U0b}~+ahaM)R5z&(>`T}gx$*uAqU5`+KT!U{HO{h8jLLZNrR`uLWM|( z%|G#oHB!3RgtW~aZpnFM@4u{k>9Fu1s7%YigII7z7PRx9<0p*Z(Lzi=nJrGyODl6SbxW9khhqW&{ z&WVW~9`PWcwu-T_!ab-s%}!A^ukHnQ+54~se60A;;=PpXyeY@waT?qv~qYp&U|) z$ioj~h=fxm3~H{G@~#TY<8^h7DK#O~$vSbg$Dy`NL`A&v2Rg!It-dXq<+-_w~r=csZXOv3yd)w2Mi`Wih|0DfKgAN+dWGRf`kqpT?f z!~etHSBGW2t=l3g(%m85-67qAbV>^XBHi6BElM{C(y4TJcSuM}cZ2u$;aXeQI(qi@ z{BiC*`<}me{NPa>&pXE)?|8?Y^8(q*w-5z73k2ZgD0Y5ZSpXPwovMQ}_reanonOp)iu#u_S>JWyWn8 zW@V>rCMrkj>1jR6O2;^t>|qY`+rH-VXSy_f=1jJYq3P2eJOW8a%gQeW6^LUFclE|O zp)FS`VFV!{_H9;3p%YJ;6Z$=tjz~OuA&R%Ct{X9;al)qPN--tk#HcT|@*@~}%Mq9b z$ylN;0$U0MsTJ25YCk?&DqS#m=IDNyU}yZaOf)pix__-(x+yuV{Uiq&DPD?7k5cdj z9w`}N_p$6lV`Ng&7txF=;QEK+ZYAnb8z$C034;0}EM{p{ed!i}Kb=VqrM*h9? z%>uun)mG=HM%aX3TMf$T{GY<{H9>m_;(7@vzho}Ue@MMPR-s11iBfYY+-FAE0TWwL z9iL6e-aav92F*8SXNMrLlbKaxI1aq{J`Im<#>0E&XyG!{C)g#sPIs?po>TC;fkK4L z3Kf^X)nv{^rhn@37rSVPbug}{;-UC0ydynXueE6c3)-A`V9YFVVR2Gz+Zn6gj%7hD zRtA1FDRvmXvSkn%%%zjwh~Ew!Z3!`AT~7!s>u#+kpPUHQo`tK|mM*gK}+qa%FpKYyAmWOF)quY*o85>lV%1Y#MCnv9sac12AoO%W9lYNX>e zq(F?}Ns1!Wu!%jKET$k=$v(es&wc1ZpR}M3in<;Wo`{O>ohEFiMilH6HTt5s+{LLE z7fY|Dx$Y}j#lMMkHvdQR&dHJ#%6VUp7fPF+GBS1pIE}E^=)sNxhMQqHs_B1!yI%go zVe^Z_8s0dH%bM`ES5SQpz)=kf-aL*`*oGXe2INn5Q<9PABs8?G*Z|WiHLE@R7Pzxo z!vsu&%kxEQ;)`CyXa=YQP~c8Q(uF=ceAyKn{e^tZL;8$V@Yq@*(>SZUnY_@KVj;bzr=hxfA&+=jf^`#3vvsod95{riCWKQZpYW;^i%NhN5Hk-z#}xIaTx;H^ z@WV|Fdh4MGl(!Z%>;SWR$`?nKP1ev3NOF(!k*4~g+qYwi<182J3NFD6u6>e3Ub?eq zBvHmzF8kkxq0<+ z(PN#vCr1@#sbixhLgh1Zgx4iUd|fK1h2K zer|}t)n;dH*B4%v=~&WarZzeIA~sIZQ6{8{11S|VQ*}rn{A!kYPvzEY|7CU&{Xt0$ zSZ<#7$H#1A?}vsrXN0~&^zN0&n?5te4;fI9t%M5-z*3soHQ;^)TY72LNF%e2^eJa1 z8=`i8hvgm&qShBSuwF>;!PXb$N9+*I_{J-9X7I*cacY0I^llVM&l7XWc^RHFNZ&+_fqCLcV2W*l;_sIEZ(vTtM;1jB3o9NM~ z7!wQ;-p0LNg9;oN+D4_hZ%DHh^hTb>uam4?R5GNcDxu6X|Rop;@)eHu(aN8m90LPvaijYV?~bQ#*+Yb;*% zQbSZE)QZ4hA#|!%2XfySq1RRA*x+$E9mh%}b~wH(7Stu8yKh6s{7&Yv)MYYGG%ERY z>8NZ*fiD;{ds3?HfTKqM>q4(((NUN-tV*_j63;x`q`q*6SaeTs-qGlVHKUDs_Q%Ig zs*=q17NV^>mafaZF)x<9<(){U=tl7K)eryPQulsQlY%ozrcK4wSS{(b^aE zC-}Cmig>qy;es5$&fIf1=G5HM^QxdXA0ubvGDJJr$%-*eHQ38vpTz^ig%&nrJBcg^ z6U@OfKOkcN5!EMUW&A8Z>2+>TorkS`zIsBF4q^;nphl9%O~$UVhqPU*h^OJX5i45i z(?J!F{pcrYc(o}!Ot%O(5khVxMeLz34eQKaVF~PR;4wDL4%aTwfx*s*NzuLsVtT&f z$(h1t>Ve6|e3+pmGJXag?=uOyn1`iM8VldjrLp6*(%?0IG|QoY8!}i0U-My*#hSH% zAGIqCv&IY7ih(B?v@g_diNabcH3V)z=oE2zLUH(10C$>jD}Oe=H@M*uT{Irc4%BV5 zo*T*MwBop$x48*MHmV)ZNi;fE6xj$0AM+GObkXpSa>g?mG)21^P$=#Pg((f)pT05; zNV{;}gby>p%Hot!%ti<+=s8iK;8L|Bz}3ajNWjn4F!qoK3(kC8N}D1}K-k&ToKQH5 z#-cBUn~v0zL55QqH70GiGK2ml6YemJ6k3$!wDfBfliE<%hRvJdYp?xJFBuH&+^sZY zF$%Oz11eck{+rtlOHQ~_tfon`ISU>Q>$H@k8=4}iM(lW;@z zJszgy#J6VAx_LA=^;9eq<@Ih#vNe&7~JBEO|=wPi{Y#IH#m<5Q|Q6-G2qm zq&WBHx+rDjZC>!#kd}!is=>B8DakRt{0ZYB_HyH~M3;V)j2*#+fZZaKm(UY8rtjVk zrpxnAxqe-A@YBHg@_`^JS5mW$an@gpS?0LBcVpfLl>fTnl3aDkbwFSEUf+3EeyN$=6d3Y&n6Ke^2CR%pxZv)6C< zFP@6!nhk}1$VV_F_nQQb87^tbBm_|h>V!ukT2R>epvk`0`)67DI1NUT0d@!sEns(G z%gX~}1_@)&3+%K{h|;xcv$j;QfGweiAl+oFD4nQ#BLTS@{*KL~ejPY_$Q}#K2o?|| z)?8OngfC``XD?1<1fv(*;2_rRGAC- z9S(sXc-}=g&LW{-CA*cn`G#g*g0)@xTO(E;flW+3JDV;(csJ+(24^h==5E!Wvu*j= zmcwZvW8M7xY~X-}fZszC4%Xk0_bH>f4vl#VyIW1>=Id;oPiF=#N%eaI$4^rEoe!}l z?p+Urh82msE;X*y66Lo%a+zKfc|DEBcdKq9n#xVI3;S*^bO?ql*gcF%+GXoazTG&_ zw&>iR%BjUid6vNaQ_`F{TsNIGHJ^n3ValQlSM@EK*U~o?%jif4m&LVjBL;{~s*Qku zOGFT_i3Zc2_^N*Cd>-$55U;&Z>elMZWkR-SugmjB+ zH*?JS!^Bo9*)ooleR-Z)e4OOMLdt?fjWXLbN$7cMs5_D`;M<+5p;fg)HZLhw_Bo1^>r#>jd2l?Er5uV& zv=f~}DNnuvj)WQ;Haq-NxELO*m}S+O&PUl|?9y(?>i zhRHG=RWfOHP*kKmyW%@*vGWcJIUXAm;UKI8TAZ?nU0FOc^M)g)yAzS*? zq2Zy59`MrVb>HK2ttYZiPHdbYORpAxt|VGud@0j`gu)2=CKhyvZDWDl2M-C2P}G}4gNU*^Y8A0yWMVJ!K6 zoDyvG%#X+&Df6)Lf11AR6B*;J?yRNB;$PQ z@moyq8C%z^`R3*5a4Y);?rI*{&Y}_M42YI~^+OcmwBfdCI#)X|!;3$j1$-RlVxrR1i3R_c$CTanAakV9vU8m-OJZVWW!P^Pea(IRt~ z^_SJro+=s!=Tc_}gGkV9>jeA5+$uLzs+^hOA&F*BHNGUBSH zqinNg-HeK{)5yg?hu>EhJq(c>`B?8^uLgzGK(2~S%ZQjyY|F0IvoX_;VmiHfbv^N@ z5Oh+3`K0&4x~PGROp`g4tP;*hDdjVg)91;6>w%e~Ya(Nk6tJ7^OWd{BG+f@UesmFn zF^G8@36~IopFrm2%P}i08wnfGhG|3ew#6yLK$^S&Q!==UVce6UHxmOeAdEkyyN5O?LNz2G$S2XCWgTR!__ggbhy|!+MD?F?e z8Jv0)ZCX%+yw|x&n?ta?m^MBYCN6XsbA~CflfBqRyo_S@KRMwFGYAS#81T+F$1xER zBR9K9dJWYa7)2^CjQ&I+SO}p>dS&hCrC60;9oc+MUyBtJb2*!N~)@KgvS~Jj!wG?NdKK7cI)oDtiabXK}Ke| zz-BfeF&bR-PWQZlR%II)u}kwedHx`jS=E zyQj8eQ)KnUCJ);8^IS_uzvg7Q6|^;`5e!g{Iv7wx2Dm+nVHr z>>dh4$0Ycq?5pzjhscRt??d|aFp0QfNHU2Zi#cnw0^<+E>UGfggLqdZ{_$GipW_cX zv3@~th{I_EaPoYom1`glI0GRFOg|EimBCzlA?4D~3)<@S!(-k|ps5)P8-1-lkW@W)|2AKuY!BBi|0k8fIH+xRP!@1rKS9Kxt&;m{45S0BT&;#I zGQe!UMu&Bs4HLqiO4doZ2$*vx+z`=MkcxlQENyuO^Eu>%_Z1WP z_JwO3+#}`>ez06I{*QZIJdAFLzc4(_Y4z+xAY6DT;Tvdj)>PTpaJe>|DWMw`L4Fj@ zWr&yjNHt2E?5SnMaWiH0IeC^^6(vcPEH%g;kY~>;GDa1!;dpuV>G9-l(P*V2Ftei9 zT4BfOAAKy0sYLLBG23(ZZEt5%OIOs?YaZ=MZh2$`q8u|6KPlDv`z6#www>t$`-%7_ zFo3h%O^Ou0IF5rt5s^XM^t_&MgrFI_X1yPupzQSFyRxHGvFi_oDZ7jOs`OR($_Gl}6Tm(TT3 z`L5c%S8A{j(VEBTld(>#P|z(t?NgVD#@choM8uSBY`zzs%XjM(RWaVIid;{imDtqr zUjPoN-v3CjfQ+4`d|f%>^WYRyK05SGg^PRoIry7IGBhgzh!7gd!H4~6W?E1t@j@dP z_?FO;7Hq{-zqdWtlh+vW_A>WH6#b*Q3_igLtp&QzzS!=qAd zm&KfuAAb>Ts*OU;7wA+o8cwsF>D=$VXm zG&7mP>lOn&I`Vpw5IobW3`3Hlm`7{Vakxib-8C@;_c>*c{G7YJEZUV_Es6JTpvMlP zH&+{{OZR*;t2Y{qfy>Mwd(in*()uAVAT)J(ZRjHgYi7XbF-^ZJ`58XsR;P|t;|Xn8 zB&ldL{&4Af_S103_;B<=0{{yr01w?C@Z4P`|5)GI(%#ON@f$urd~|20+~MOF(fpu= z30ZW{=PUB5#fS@XRF015{-W41MBKAk=vlI7nHvj<9JMb4(5p!i$b3s4Boo_3#d=t7ROuB};)GUVSzogL`Y5R$~-8c{CBofmb+B{9SnclPNPL|GUXUEhgumjUBUEegEb8BdI`2> z2j!t*(H*9xu2Cl(6{CmA&4LEd?>$39dJOa7vrZRv6WZ?S0D*HF-=pWx!u=1lABu%<0Ajd$a8 zQBHdE=qlA;bMhkkR$t@p7=4!CO%jZ+Uw)9qXTzL!Qb<}ovSU{XRmV7Tn=2XQzxpc6 zYJQ{O(&zoqZNlfZy&K>{=AUdMT3i8SzXi|t-Sn^UIG|2p{~aEgzr!&{^I~2b=4ob~ARAB$^0KP%9P0 zJbVq6-NBL&wu>ggqCLtNUuG=WsGpx%Eg#+hVPCW2a$)I!8?d;+{_#jy!6J!?59SF* zkP%sF+DT>WWkGX344LfUMIgckZZukals)b@cA0*Vv~w%dNXH#Ov87B*>vhZIb7Ig zgKr+zvRU`f_{8lEq8^i8Ndv(xtw77{7xsTL^JC#_eT{eK06HBi=j^Th3s*!xC1%U9 zR*Bz1hxzX6{C|oLuy6gpS3B&#T|3J>UtoWSc$m3B4~+c;9fuK->2FQ4w)7RKNiGMP zWR3}-Nk;$PB-h>y^5t35;iG8)+t!2bTx8P{t4H+${JsX(=$~Tm(?5;WU*LbV9nQs_ zC&Sm#m#-K^A4YO9j(tix5N_WiX+M(7!kbqLPr>{33p86|&U8ZAGr?+ue324)M16=& zyKYeJjGYZHYaQycMt|bgcM7>jJM{WqyU)ZVqOQzU#(Vm=S0p>0A@ZmzNS!`L+2tGM z8h)q7#;Trs9zSgkq2Cia{ti4W-!<^xdASwjA&933Y6BiZ3jj|WM;s3bo*z7f+M6?$ z_lz|7iWNhf(CA`s+=4RwBSt@e#zBV@kFX7S_E{MI>h{*+OpaArdx`p)>TA^L7P4sF zFn!Kpp8};EbxIK$IO$hLY&dh2;m>MvoY}rDEeXqXe0P{X-~lbI7k5jGOWz4Gg$5Z| zT0&bd0*kXK|9h%u;_N^Z}3Si$#8H0lB6vfn>^AbL!7R9A=BUnh)5iI3;U?J^?S=3ds zM@Zz5`cJvX(*`0zcGO%}gC$LidHkU|Rba_I`?@udWZt~mIH12c3L|rr!%i`1dSGWH z2uS9_*6PE$aR457(Bh(kJq$E#E*sG}o~8pWE)e(pbmOX85@z@> zVZY~JKKX6`l8cIC^S9vnRY##Z^6K9Z9tE|nncsrvmmS4O%ikn3K+Qjq%qe63Wqw_t z#YN&U3`6+G;*t_N(1ry|9r!BIQ8YX+jaOh+u+|3 z&8)v_DIC66PqsVQw~bu}57cl`{n%1G2WBUj;lXr3!{xuC6vU>^l{){Oni;-PvqVzT z7&)P#u?lq?rg+q~8T=K>^G+V4ES@h)@yTQA&@sth?LgGbm-sufu(#@`)ZEhFS8zLj z1O79w#|IHc_IHYh<(DnRU(or(3cEw+!QavO(F$vBx;Xx$9aRFXuom#E-2;8cm0)S@ z=wV8Q*Qjkx>e4P^=)8xIGYpsHDc$>6Ujvh+;B88Tu*4kaj=DS1?8_R7WC4g~DUfKM zI-5V#s?cQ(v{{GjSs_p(UiA*WS6EE&G45sNd-}z@jZ2u0j)=_vNc#CO)>A+<2fS}| zZ2alQ^>RPC|99Z|_J+t$dJ5GM5$Zqo^=#Kail-NEXLjMF6DJqN6s7Cn(|mE3MzC2MP&3lEQ!Vk)Yf!YkC{{xVW1-o06J0p>Ro{9xvJ3dkN1*D7dh2%%q4BQ34%3|@6!4kje_1{I!J;W3W^M%fRT|(c=mqfa zGweU7w%$hwHap?Z6aho6_<-vNku z{ujjTA;P5jJK+3E5;`dM{QH4}#kXVjJK+2ag7Dv`a^g?pi+%^3U&%qh$oR8zfZ^7U z7V2MH(fD!y|63O7s0!wOgTz%TAuzlNG)gZk)i}XX1MOJ-v%j!Ve~d@~XLj#6=Z9R# zpQQ7{N6g>x`FEWK|BFC;7smgtK>Tarq3;s-|8E?=TYUdcIFJs#gZ&-){E24sZvdip zAkCKj4=3+W%?4^0e^4dMUqJ2RkHhcgmd@3aFLyS%5@3@{!{=JmayN|nDZX)nk5|bS ztzrsU@%@QrYxC|aGClo6vu)GImM?hMJpG4ei~cnEH_Zk(d1aF-n0-*|o^h1TXpZb3Xod3Cczqh=oOmEk<;_DY7sYn5QxVYE-8H2_sGl}sU_4QXj zeP!W*0oCMp!1>7p0aQ7F+Ha-$dFA}D@s3^q9`Ijc6U{AGCq|B7f2w_y){nCma+YlA zfYBfV7!6UN`I8BJZItn|WR`Z2(V$>P=i9yU$cnh!GJ#Sl4t_)RvHbyNPy3#bw&h2i z+r;F{M_ev)yS6!0NPq_nvZ+`i)rT(UKf7{o(7>&g{;~1WmdR^O(_NZlf>IMe<@`J~ zVXoH8`&+%x|6H{%Q~OgJM%a~=^_ND&QgY+h--73VuHOHzz!SP;F!)>W{LfYV{}p(k zs4(F`%=52?N`BC^f46}DuK9mHeu^Le%lL`@`}j%j+xUqHG=Aa*jE45R(f8xK(Ki~y z-RPSotBfnJG>n4R(}pym$TUS(<1Ww!8b1vIp_02z3qj=gJnq_AD4LfNevnxYs)i*4 zpq`1(TBf|(FPlGsLM49D#GYK3ba=@ssr@uSJlyzKp^^#f%cS2z=eyATD>|wpf1o46 z_|1j^#U}1-m>)tVJG&qg@5jiE-s0Br#UV5(as%=>d%$aVFHBwk=5b2=M~^cex}L5di0p$>rh(>BqhJ3_c(h@BkDG5CmcYu7P{mFMsr?yy%owc|sp0iUE0~zRkTk zgr9-qxnf-KJ6rm9N&I(k{$G!j^oIVn-ubbY{?|IE?^^lasblE6X0SvAF7H@p0t0*a zqo*LNZ);~{W6OBwCVczDotdz$^#XLw=q-`no}iT{0~hK-7LyIJv?_}iE3?5m7(H;s z=$u>Dw9Pi;y*0#-&GQD1UstJYqm}JBse9rmSj-_D%;AX@=GqPH-A{7XZzd<9Sc|AE z5A*R8Pixanhgb^B>guo)1yTkJyV!7rdcsQbvkZ>{IMya5zMgNo^P8!k5|~1+Lhn;0 zqTnRbKHMDE8_J^9j9k-J8AUyf!(a^ZO1(CSv_53rXP9cjLG%?8Ivg20I}+I~j_c*i zE~nAPsz48c%?-OB*{HE9eZs3>cpCS)8PVRl{+Z(Ruv``BZ_S?5O9HY1yBL zI3ng_qWCD2SuCESaByH@RdI8<2sCMVsq233mvtYYZhwEciKmk~o{R69MN}-uy$>0e zqYw>#916b@KoKJ#L#z~5ZP94L9W{IsjYWm>t`iLQUOV2kUt(8~4jidU=oe#lZTCiB z4sC+HG{OobuS|QScBMSDIsWib!gW5ZFx=d*EIXA_cyqCQ$rSlHXw8Br`Nw6=T! zysN8njWw!A)MISkQMKNj>3{tYiXCBoLBo9KK1X5G(juZ_PSbPq93L4CX{)MkP37LF zGFgPdNY7t!p>c*uzX#jyx?k~th!~l4W3QsZgAc-!u`N~s{6J7Ek}IK%ubxfRXowCg zz`->bTogtxSOQD&UNkvDM3OmXFbk*(kQR~NA8fXH#>pD%_QXX}uy@u_hRk>Zg zp@_{9ovjg8lBy$L7NZl<(74 zNfR!r^FRg5{}y>yskxCft~;X>W-KR#jI)AxQ!}@4;OGrqjM!+g0#|%sx4A)oM*MT< z+h=C&I&2luWHwI)g54QYZlI-9Cg5?@6T0Ad1{o)kJQ`K=t|C{~k?^r-WM>yd;gIjO zJ3r0c*UEjXh7mV@^O#b0E8U{h4_65MVl=_Z$;Sb~baI3g(H>#ap{^=+W(QAU`)i?l zCVh2Esv}>KEOeo4ig%~d@^X#(r?SUH{8#C5u=Qjm^F~QDIrEejFb#Vi(_CM7y|wJY z2M5_|n+O69+ER#!w5*ZI;@&uk&^}5LSB>O~(cpuNh%wBC`-GsW13Tf3au(@yb1~}q z_2OdmE8#=U-nFcka}W1K5(BHkF`5$A4UZ4r?bbyG_ap(4<=F! zKieey3hgsl#VO7G+BX0xp3tdjDfyvTRBoMFezwya)pkKyUTFIh)>V5bSd7sj`6sd~ zea#0Dj6s2NWQiJ)SkGcsWohZ@Dt*IZ5B4NqHoXP6sr8D2$l5H8*KQeKYH4QQm~Cf& zYV^iRYy{nyR4|=!24hN%mf+QFkzj64)uP^IhW5cMMwg8lt%(|OM}fMIjt|RzFIybO zl`4IO8cl~_EZ0NMaZR@_Hq?3y4OFfwESD%eC+3Pl(xifY;P>U;&h+Q-6nW3vQ(uwx zKD?MgqgGV#D5%{{sqe-A}HX?lRX&Bm(tvnlssA6t7z*7j0%dTQrcPM~g)6~U= za4Msm9wH2xx1ov-vQe-O>M1YWW}YwvW6>&ArjTQ-?fnZh(l!T#Q0EyhNhdkX=km=x z%y3KeW5<5cF)W|;oV{ofQDkn=BvqMEy`@&a)I8Q#&4lr=PgvAL3RL}Kn!hz$RJG%P zwH3ic|9aJ)@jjF!DiE4@Jgv{L;rY)kzIq#uf0R_SRa}7&@M56LqHV!@&^c0G((dwr z*2dY~0uA@FK%E1_`bK77%t4dHGcH^%+T}BYd*ra%S6?VSFuw~Q_XlHvr z*U?zI(%50BAE>_>&FS3R)k*MhIBVVcv?nXzn(&yjBGrU%e+1sdam!djj_iFKC)~^^ zN_TpjR!~4}W$xg8es)}s@-+T&-Z57jp2M6pes=4{KuaObhKdcEeh+Kd;u_9ksDp9$ zD%-#;CZ1uaPpyz`Qe58-?pk=t#oebK44HFq*7pv_@Q8-iCA^Fmfo zVlHR9N7HmJD|~c~R;Tn-n4>PhQ6`Tj=d%Jox4%KEpd&fHCEJ7Kkk^&t#cG`eZ+ea5 zkMjB^F^cVTMXj6J7A@6`MiFNc3@g|}s?$0OJYc2va7$F*Xj+A0Ggo@UPS!y89{E#A z_S3v|5`-;7HfrvFU*#;Hlqp|-p~4=zrW21*o#-mo1I~U-OP}jG92(z=+orczr+Ld} zV(`TwFMmrW&WE(?v;v{3vbvasJ>cuA> zJ$DCjY?y<0M?rXG3fmNnH>hG!5(;4T%Qd8o8)S%uyULt-^TuUU>1sru7fMF& z1}xqCLWjIK)HP>nub3_KNc{n?FE6wo)Asp=W8AfOcKc=N>?kjk!p>zW=>rnH7K_DG zrubs;Or8!WN79d2(%ef0rMu8#`dppi996QZTU9u2Q08GD1fjJX3HmhCJ(zaPC(wE&1@@e1P^3%+%e_f~ zROVB>LlDOBm-RfU4)Et%kGG+M-X9D zu1(GN7N2o!^b+mqnU(IXF6Scxi)-r9q)%{hN3YSL#_(^cEpCNHqK*u}4evOjN(|pI<;&(k=s@F5 zKj<1Ln>zBPgEe8fF*va|yqB|Cwsdr8T6jLEsns>h+^(_c^ynDXqNKP547}*kO9D*z zg1+pw%e_b}mj^m=@=e$Vx9Y4=yzrl{)7X4jR!uDAwxX=|gG|%Ac4}PQR^Ke5dwA<$ zC^vq=Rf0|2U9!{16YHKz9yE494TzUz{QOTaMrukEwccM5jjJZyHdbzl5Ozr0Bbsm_2mxFu0?YFP&2R@#KKXJs6(8`ge7W47VBou!v zAOFT6d2u!|p0lM(oy4XkTMu@g)%OXdZey4VU6v8FcOw(Cl$CyAi2K5jk4hW9R6Ar{ zVOCL)|C9PtTiM-*7VS44#hk~qiVr?rZbh8;j^}4>KOT{7_j~DM(h=-GBdb6&DyBpf zoWsV7+~NFHVFa>dn0#={Gt+|2@I=bI(X>(-ZYO1Z)?eHRF-)IK5~@wF(cPr~Q!W@Q z*Lm@$No_LJJ=L0oFe&({A%IoO#bMR&c@*DlgNUyqwqB=6ODP=xE?1{MT z?`qAa(vDufsm*y;B#zOwi-BzF1A)sHfe_Z{3(L!7JDJC*e~i@1 z_4G?}-x+od7@1AQb-514to8%M%96@V2q6QD?U7w>Uvn~O4MF=T#vqExAwB#LGE8Xm zJ0l05>4;^pV8a8sf_M;dh1L@{5tZGf#LjV)y-bjCRojapzkWh~8Nd71y8oJctiWkE zU{^muyp^e6v6!=mgpmhP(K7Z##FFX0YqJzCqz0Qy+Y zl}gVkGnxBd`B#xLKf4x?O=6qd^%81eLze#-HNU~qjAZJk=e!*U zzEimnwwMM_g7N1I(%1qYs+@$6?DkRBTc`{R1t0RWG;u$cNhqs&l+(JC@5QT@*=@0G zRPs8?IQd-ZBm4X6aq&6SubSCrPN={k*RV@|ypDpb5 z_q$iN-jquFRrC?>V^KV$W++q%-ow)@OLz;B_tvZW^%#5Ue%_=sSviWYx{cj1!J!GKSmeAYkYgVrP6 z4VR;E9#n2mfxIm|LIe#9+odJE^15PnAl*%O)>$=F%OR(uA(2TF!ajzJpkEFwzgNw!(FQ7*9$NQ(hY#E~6WR4I5@xvCq%3+|G>)u4_cXXW13MjUT2k?MT)g zj^kI(u(7~kTXsn%JEI12PHwNmx6GGecmViEbrbN0YQ zapH>$IVJh)6Gjm38;S_g!o4ffS8Gheh@V+YLQ(ga8=LMP#$M|Xo{fTJxlN^zOYm@P zBG$#e|L&8drQPeLD>~js_$!%xy)8~_?YW&2^L7qg$HuKx;Ya3d{h8%3R2u%)!tAy$ zHtRMf$e%W7THA|Nve_6Ry(_qJP`i|#XD)oUI$?xu2P*xLOk!Nb3@+@N37hPXQd^-= zkT;lFPdzC&ZQwE`QPp?TEOv{~3yv)0QXbyYxghxeWI<>XE=BzXTy`Z0@%TOYrZ{v#&e zCpo%}kClH(`q_7+e*lm^@!v`Rq$X=ydF17- zjPw~lae_#HvL-=J5+MCY0O_aSk$ydh^q&Bv@75ZJ`P}jw=`-JvJ}!v#mjKdt7UO`Y z=l+BABfgP7**{2M>W=gg5^=tfeyH}Jq)&(rB7L2gn?E6axXHXh{o{qe1CQ)#76H8t z@W`&=!$B7n^D}C$v6hK&M9AQerL?Y#@MTfh&+d(jHIOAd74o%SWN3cu#7Wy3Snfrq zO~%#GDKut1biZawwK{FdmZoJe4P4ZBsD#FY{Cqvmq}Q%9?8Vw(x^cfPr`=gO8*YGU zoJ+j|rt`3Mq)TQ2k&Ca;6kLZX^0VQMdjcHj6=hzVW)3HCno)V?9XQ^rlXA()h?Gp6 zm^0yRkq2MdtVir>A)qf>1O->cUEcRXF64f3ni>?(djmcEDO9erbKd+BzSGe+(l`1% z4e<}sPXUp>Zs9l5ulfh+zx@a4OE~#tDxe44SaCTNu1ed+Oklv>uc5!={8dD8fb%~I z%>kURzP^*h7eA&s3Bh^uQ_i=TXGr_kWCD$N6dCN2xK z{!;!~`W@u2?woSq@KYfaI+~pgy6Z`-3ngUD%7bHm}DeuG`I2P+Tawa&kUZ2%#HI3GUPsWbI~lM~KFRnB6z5|4L;F zKGhYC(cc)y88WigR=p7Ww8y_}@MuSvTjgHZ!@yvAYUElt;*u_?3~#`6NGvqg{MrPQElZzI1sG@ zWzS$%mowm_FD%piARqrL?DMU#hf~?a0u`-L#FnrqlPz|+b!~34xtfXw#hM&lZnNta zRA%{6*@ma6L1P6U-c8El%4i*#A=UdrBg}MSb}Tge@xT4JGxmnbrSYvtdK*DvEw|t*vlV|3>-`5i?SJRfjHe z8Xz!q6;V8(F@U>%15^%Z#RNFjaq?Y^%~?GW*=bd$(p}#g4>R>0_7Q{~cD)L}=_6Pb z+UT(6+JC~bFqk<^>S9J^VuU!(zMZdD!BfM*orxW%%V}?n8li6iUqK*8y!_SFAp46W z4E$ksfY(U)vA7DgOIKNpeq;m-=TT-nUUD*i?dUX6G`KfpFqBF|2Mu-5;55=k2W(orAZNJhTdaXo)$_7oZp<eoNVn+HD|+^#8fizZ;YNwe(jqO{Fsb z6Qz&9b}+(odc(8+$(54wDuJ6f-;UfV#D|oKI~Gkr*)1jmAbmVi3A{eIKFC~Z9{E>t zAku%<;-5Zq&$9?EDPsgX-YJEGys-2UYP5}$7MzM9M5@^`#)Ac+PYKTHdl7ZGYWViI zo20h}^+osjF`j8DSA1`X+~^wgzl^mxxow`@7l*~hy^m|n6DeM0 z7dlr4&I|cM?-;@@@99DFzxCf4TW4xH)34M0Qb>h(ACUTGAgLe!)*Tx0RmrPNC~vf! z{vLd6e{-&TfYjHaD{WC5(u4mXgR;8Y-*c!>Pb@G{t)IF8ok%Z>dBYOXXeUqNf6eDp|?u&~2_W|0&K;mC!5-pmE( z!xus{1kyXUAiYzcHa=Y0jniIoU6aQ;dH}iBAvpW_PVcCG(>o^jsdgkSRbFRY(cwk3 z@C|&T3tF?V<9X!p{AhS683{%q_W1!FQ4+skH%ky|#yf4Lb+KxO&xhk7?`bpqFkje; zitbd_j>Ig5(@@jYGC(xWe&p>-GwMtyy2#|(hVr4=d3Q1n?&pDkn$uwD{LxpV4c6Q- zlCxS3_0*Y@>IucGss1+EpT8~`5vmW>2volAKNb3S)APSpKAGuA^uI25*lit@zew++ zLrFZcp`y%qcTOS3Icdu&9?tO=>n*IDl3f~Z^5aI2_%1&oA3-+=9GX3~9=muSaUOb7LvpMf`BL_ysV`MeiT8}X zhSZ!y3{fxz#yE0^3((`DmqcOECV0{pV`TRS?=?_=jFvG<1>}xRJ~*}rVkbMYZ{2P> zYk4Yu-{NAu)xvROS8jzoYGuxLc(w~6gu(A7GgY7{% zpY07-#HS6eu1{Pln^Kz=u{U^=1be=swVRDHBE4OKL%5fn{G~8o(Js|! zd6+nYl@l)GBVKZN#N4zSo85XVQ^+A*$||6D#^`)Otj}++V|NAUot+PNtj}@B`g8#6 zzXMqRieLr6#V)7m9@7=LJqa#xom-h+cC5ZKf_b67ovlMD^ zK7RQ*>lbCsQ~W7-i2qZ6hxsm7^Vi}Bv_A5`Zt$?%R^1izfz6L z4axe&8Ul=O*L&-Bh4tb`ON^@TLxxy|IM`Qn5HhG*q0J_Z$nA+_J;)N2l|`_(ZX~48 zn#AJ@Ol~Xd6k<6j8*Xw|6d7XOQ!KH1@*e2HbK_46!XMTEZLWt6(B_`?0Bvpy(B^J- zV^ezdPiNoXSm112^h2v*MKopXKBA{Co-ZX|z2KeDNd=>ElAcL3L#g*?-Tq9cp(4MY z(eYxF4x6F^y&$dUAl0gB0NY3V!J!E6Q?SE0WNZ4zjy*DclXm&!1#iv8OCPQiN=K9wJkB5BYXXV^s4V|z%K1=V3mP-6k{4C## zKhAjYAI0yD(Gc)w@xS@A`1#s|rfi2E@GOiurY*_P`20icXK$=S(~77JhP?!d{q_gE zc1WXiVLo(&pM;VEEu6NWTO=VtII=x}zLi?La>f?O$PMsOU6a>tEpicipZOw&HAMfy zUg}-g#&SS002mwM%SiQB1adWFem-i(8r){EIf% zG(-0xA#i%F6S#2wFA11GlOI1^Jo-ca)H5<1=qv@OflF1wg_{z+Le{U(Y1f=Caa;~xbvQ_~bVZ}z?~x9cAhrcn!OwmRi#QOM0M~8)s1vvUsEzs zLV%f$`vJ6RN)8nJD6af~S#-Ic-ayM)W7v%2ZDUpbR#A(ZiZ)E_t{j}%mE0mP(fIg9 z*(bIQY_e{0*a?J6fjV_|u){Ail5Dz&-EEnij)MF1e3VTG# z%)7k^Uqi9d8uWzd8C#3MNLLcsTti$NVd0X8D5U1>Dbu zVxR5TOh6n1+F$<($K2&&f8dyJCi4IK35);hC;Z_jKo3JgcM2~=VJqIIQpqJ+I5&~q zS!s_g?c*1(*a(oWrm0Rwh!b3gzno7c_6I^(KDwVtB_mNz$LH#mpn}}4%vzm0aO9xd zvihFj|FHL#QB|+o`#0SsAxL*4APv&eAzex-4bt7664H%;L3fEXl9JLO-Q6JleAhy^ zJKX2&@jGYy$MfR6!Xd*kd@P$jwC#1{ge2NKtc;c9?uJ9ggPH*)xt78rfl=8JBzaIVi zKJ(G~M)5zaeeluq?`j{UDEuoeEyU+fS{ldU?Qj_&!M~&k`hJxQwJch_MsS(b)6t{m zmK*djvwv`PZb*)GA7zC2n_b!*c3gWWB?3FJp*VgO727(cm4i?4O(o^E!Z);qQO31X z*VfnVI1*`%=fRB{#S9{kVJAjoQ#gaOPzZ9g6XJ&NCtpgk=jH^mj9x@Wzw-_+&=|Zl zcPXTOA@6=F*A@4a{-SQ2DNY@bkq@|weDJXC(bJNymh|9)<^nF-#ag;N3pdtbfbZ9- z_Xul(?BMTLE@I&Ob%=?MdA5XVd4gcnM+O4tA@vJ|%3z(=bv|y;aLES@m#*K3%Y&Am z!zJ;rhs(6j(+a~X6f*sUlo+|1Hab?x?D17ABgCn{DGHC!dRiPe?C`GsPtU6B+hm8HW2T-3L9p;RoZ9k*z%>%U7KwC|Nq( zeJw1J66kBCnXlt`RK`m3bp|%pCzoD61Ifrqrg(CC)+k4Sq_BJw@~qP4Gc@&?h^UaM zv1@)F_O$T?Af`zqWd!VhjeOkEaSe!R-wuVbI{-;xc@Q*QwsQY^xD@`#2>oNY+;Wg{ z3c7b>A&At`I%u<$jGI?czLE!vV2S?yU8VmCvA}5n^sc(=%0&mft0sFp|K?qV-Nh&K z<6ZS{`abxu@=vvYW+pR?&EX?2S)hXL>233sI{CR<)ssoG>kG?N7`zgnpK98Yfi9b| z#2?hO**9w|t~(L0eyC|gIpQ=!#k$mgucifn)wF#;O(XrYn&zr~$CbXb>hIMwr18#B zkeW6IQq!COHLdGyS%28H(l6Dt8mn_aO)FOAPn!eOv`G>Y{g%P&rDQ9*$n&mBM(^rgPf%@^rJ9>bm zz<$8ylnS3o&@ta6*yk=7+5X4cU;C~0b4g@>U;FC`@UjO1fSlHMq^3$&+h4W_$Z2eV zoCZ9sh$FvFxZ{01S+}xpSedRMCPoYf9|e^&W;|Q4b&#lQSWw~ zf541fcZ^iFBb)8eEbwgl>tQ|no4%e`WQ1-lC^%0V^hW^%=;X6aq9H%q~m&lA$E^b;p2UV+zXQf ziorKo_$?Z{g3`%QoMq3%4vUv7vnqJ@r@5%qZF9GdpH-{Kt3o{QoUeg<7B!}A-@io@ zWDH2j|DyN{Up>^6aye@U>1q3aD1JEpRGfUIjnpw`(KM=7|9D><6`p2_zR`Q4CCI{_ zCPBzTGnnK>{_FBCA!mVo6>mNz15)y@i{H*1kdgz5D-xJMt8+INWIkYvf-(c%qGWNC zCPJC~PF294;?~08)}Jis@losy#4>np;{zg@(R7q_3XIk@4~n zW%xdM&4$N7Kywa!lGz+T-AuLHO-tP}U)jp}5;sSO6ybiWDS&659R!|V%{*v7W}Z)n zf1Y^=ior8a53+~X+DOep&Y?QVKJKQ2*jg^>RI=?5oMNm#bmeAQbZsQHAf_CB9@)#| z>+CmldK3(5>^E9E4ALoBvmVN}R0-Vz%#Je4DzGepgc0VXa4yrL#zulXiOtP!^9}11 z^9GG-$M(KhO)Fci%za{>Rn%$^Wa>d1N*%O5o!DKxI5bubh@TBk5YzkEgB} zW~(i{1L&!nR&577b<=1KN&G5&T7$Wr&iVI_nLM9QkO^ zUS*mitjN^7*ub6ha!;Ys61J^jHE@w~)+&W+%WS!o^@gN3RT^pH~ig=dl>73aRUqIMs*(u`inD~ z+7I`!)*{X!OZ2X?qjt+qOlFB>KCsD&iF4R(tD;ivtx<&us%tejJzn?R)^V>?G5BIE zrQ26YeH5M7Jfi#TA$Egr;vPqP1D-3$*eaIwb=|8JdZ{du;%3XB$g4%*GqU${IW)(@RY(*=#BLipV#ZvF1?O z3R2L0KH5U`1kzfRT>e-r&%!jt{f_1mn#GpUpN>Kb5<0pOIVK&Zy!>R}R|dmaGD8mi zAf1;{T|rfR%Z1 z9IbFi@!qK9o&I|{ZQ61ZeL67~Of;96o8(NGwALHN+vyPwMsM5te&7s;(77~jQgvz&M(*Cyjo*@;R5WB`q1_(Q6mB<~B!hte#km=kS zLrf~z;ps98e>s9lp_`9K?K0?@(dqw?;(0o%^a?-4bG5aJh@jx-_9%uqX*u;=BjRZr zT#t|;5~O7(rKx31!c`%f=tE5O6{SWsU?B?fE;!YSx;fM!A@W1dNI^g7kH9~=cfdc) z);0ABNur$y{o6mZ_L~1dDxX#IHJKaT|jDCV&PCodc_RRzqY^_YB!#>pc`orap z^5>|H-X1M?pY}v@&g3#2mC>=~1oaoZjvmcs4GWvvd09x@M>EP1Dr} zQo_kT@kN%&ae9(MoAgCTrrimh-Xo8_)q3@zSvQWggju)B2Fn`~Hx3L$j=k~S5$hnQ z+JbGFdmBsZN{+8}rz9ub8mXT*OyAUXzqsp*S9EvEpNP4$H*_EpzF8adEFFYuVszw~0jd z(uAEwyt$K=(20dzgk}w25nH2*AfN~l{C?V~}{O|$R0MBltThH#xhq}=z)!~vk$ah!&|1x)MS1#iw?hH@Q_oaKMaM&wpN^*7%mW3(@&B6 zpkr`ci+M`gRma<*qiEDh_vUPQYRqd^uW;e1R@zPz-+Y212P2k3! zd?*R8kM=0M`IB9Eh&f*$3lf~D+a)Xtv)p@JyHJV8ja0pN@VK4p@u@cFZ{t05(CX5iIht{Od&Nt zcZnYq!9pQs#2RThX04Cp*vPBdHm_ekh0joO7u^9LEHH;B(Df*J)e9OWs=<2vg&cd0`de)n}?1`rl%nr+tzj88s?#^F{g^U=If~hx)e5@=ZJ!5h03<>@LxF`>Y7Py&7N|o z31*Ny$mm^F6$Tt{qiod7*yG#8v8;F%35~)xcFQEaa2?MixZlC7rA+0${QZYg8ou6!lU z&kGgb-vxXQV&f}EP%DKjkVYM zwRd5=-1Pmh=IcugcLQDwA=KkmLE~2qU{|rmFG*Fuli9y1Hq*v>D!ryyeO^@r=~~*< zd{*|p{tHc%K>O+*Y_@>Jwe-R~dtZmBTk1<_K7=3&KGbNRwAGN+AQybN^=~O7PAgP3 z^!drM`BPLh2{OmMb{bYhyy@r}=9b^A(fkn2PNs;tUWIhWvW_$e?qs!&ISgt)U5R$` zIkOAlDbRD>;FmjQEp>S!_AI;er5cqm?&otOnS?bad!J2+*E4jz>2_y$rkth(9qR*W z^3;y_VjqZ>nw#WlvOh)GT5-#F>{Dhqr&Qo{AHo&zu|M&0zqv>tnZ0rGdpZ*E=_#U6 zx!e6Y(7Vm2jWtetClR4em3}1t)|$MLj&l(is>j4*GmL=Gqu8M)>*ss zo(va!Sa|M^{fg?a#=gDFLB1pMPWlTKTM>Kls^@*5h>mcX8Bjdxa69&!!j*Nc&`WR& zhNojn?*lp`Vz~MS$#lf9;L{c^hUxpCqRZMINMi1D0X)xdTmShm#u5${r;y_ zpmja{2Yx=Vj@R?Ebzuw}i#cujawC6Es1o8t90j+oyYWElI+^^fb+N@7@J(!u%1x6p zhsdG^8Ta)>1@U^7=O&iE6N#@QPTom+j$hH|qBwdgdU&{CawPKiBj)+xJG zAMICVoFC5?63^UAY3+FD&+@V=&C(FMgP|^MH95;pM+p}T@2L0^@L!NoR=yzBk~-9- zrIQsU2<1TeumbxjyHd*Pp^#)G-~dEm7yI2t=LD`t8$Z--td8#qEW6ET4eh# za-7>cV#e>hM)ly(PqNof>uI7b?`G9<)6kXZTLe;5z6kTu$CO$Zzvsf2xGQnEe2i6f zW_#{mIn4}#;20*-kiwZ&+`4~mZ7I{1GryB%CWk0nzjOv~I!w6mX>V%pAm3pZ<+=E2 z?-!F?^|icmb6qn5SGQcAZJ(XQ;D`NA9&$mue3=BO#L>fn{mb zAtq0*J&Z}o75;|I?oD3;VV+8*K$41GrD2qDbQy;og?v+{y_(^V}@ zqcf-!JleK!y?V}gl=dr;*eu_&UMH3%#0ZynWBGNaJGTYK$pbqFWlJl&+~fPa-jI7j3^xVgmzGqLk2vfup? zy4%5y^_V`tF7({10xEC!*O2LUeehR2f@Glr+^bj0sfPhjrqIt!rN*-acc-4C29&%* zCRs`5QK8bJ+KrPg9y-dMl%cy4HP3~mbsV1Y`ZQ>A*D&T4M+l7%j(>J(98BqRL(Q!- z{dj-j2WJM34=TJBR5b@RT^ccuT;IwTls*4)XEGiA6pQQYAsUADiRp;?xUpe7PhNxQ z6;3KSGcwiWr^_mGD77`aL-c1TiGsXb?+pzG*dD;+h=u2?I-CaMGC|$s-w(K8uJMe< zFLXQhShhC=Jc6BRa_`k1;2Eez!A8W%c9e2-)(ui7JsPsu*zQ()w#4z8uS%=Y{rd1d zbH)v?aN!2BsMk%v^r})zTlV1CmpIzYn=;0G&WqgT54aLFn<+yI1}!kO%7H#MLn4>`20)ZrBb5B#Ng)X>s>c>n_|4#?`oKPqGq%>sO(Hev<9f_O;BYTEg&_ z80}J90j^U}b>2#|F0K_U{F4+qCM+8=B31SnSkcB*OK!=2Sx$lV|J;@ct)aYeJ_MB47ndpg3XNrYJpxM*r z7VTU-u_m-omqLgxyv`MQg*>^<6XrpSlc>%9&rRcbU4>`U8*H&vhTxhpi}6m`_gmbI4#lIp~vi_EE+#4 z_Hb(R)9(Bj<3f~FrJ|cSDj5bR8YCgHkYHFJuhCR{;kaQ6y zYV=2NGGed~nwwZ5I%V`Egl$|UwT!DZ=BoRn96Y)G)5zAyM7~Waesd##5B|5=LNW~j{hH^43W$;VGBNGQp|zR*t@jKo z-fkf{w;mzS?S?85Mhc8LxI?;jSBv0C!0$F-H}s%q`9-HzR!?VEV->8$v~&7<7oeH# zH6D>GTc-;8tUQl@LRwZk(VNLxmf5yUdDSU=P-*LRvYKyCOvS*rk2U64uWA8bBv_W+ znIT(GyZ4p!?AbASyl`G#fr*xY1#JDq#wH~FjVvQtSJbNPJL?bO^(5O!WG1_ZYHb90 z(Y8f#JI2kdY4&E?wp6t(m*s6xj(BEv;#9oM6y-jzP#M@li>gPi*mUZK{A)hW>N!KL z`3>Wp@z_oEtu~vb7L7Twq=;1!e4yad=xE>%qt2(4T-h|?cd>Yq%T`QQ`~2ha#h8_s z=gs-im_tKO}OU#~aRo=s`;gniS!n1tm z+G{8uuIF5ozR6uXy9F66`uhpFCG;V4(W@K2d)@2pGVkX}a!s5~seATwNR*$Tj7{6G ze4Ih?MX)Cjs>4{`GtUa3;wRfELBz7Mwj1(2pTmHAwstel$iV{TG$WX__BH60>lw)} zrz0GV4qp-Ab6*GGlm6Z3{?;R@c4Ilof^qHjWv03NT3%EHiV})mL@#+*7k?VMCW20p zXsR65PcH66Yie;z%F!{}(VQ>$%Qtw;i=9J{+3B+f0@GtC+n|LH7W2b(mtb4+?$BBJ zy2oQOUQ1-a6)7uLs(c;v$jtiDc1mdvJ464Tumvgsb(hMmgm4Gyq_fC&b4=>qpiF%b1rF<0C$QL;NKa7haN z^6;9E(k`lLR3&gwrVowS_MI7gSSAo{Xm*0 zC~P`TMAZ~hOM=;iON;HayBUSpmu9D$2($0RT=j7WH#F0L=YnuI+6myP5kG}{W%TM{ zQFQMza+N{3b2IN68t{Qft1Q45?_YmJlqMdu=cD>OwE0*ziZ8qdB0b(yH1g>dFU#kN zmd~i?qTfb~ChT49Pw?3to+WwQ@Ajkegub!7V=S8z$HTG#<5OY-H@63Uz-F2v6f7sUHmmHKcnKzXa73o5srP}p33AUUF*do1)LJl~=?kc9nMIBx zzrr1>?0E~Gp0Fg{m!ad4F%w@OFDmx;A1V$%K41?ST9`4%(uPu19J9WMia(|!I-scQzfLVI+e7@6=kMLc&^#_e_>v~ZaHpHiw_N*jleh-szOj(~U zg{@^;R2ue?)sCrc7ViqqT%BJZB2;eNkG5=Sa`1XLFA}}8Fq?;T&fGsF%ucfGN!%_Y zc>hbL;1e`VucV_z=k!RU!|MfNs097gJ7Uv&7YbFPcy}{U`)*ISX&wy=v-v>NH7HPt zEeBeUo70@3m4}Q)4w*nK@~?k^QLO#^Hta6#_`Yc?wQL&5w=e~7yw?kHEa)VI*?>98 zvv2b3gOe`N-y9i0PG{xb0X~3czy<5S`vBhh^HpywQ*J+ikfn`uK0@CzDOC}=*mKRZ z0fhcoA{-8|YArKRe%mm5!tD{AhFbAtN-8ei3zK`N@6==V%+kHq%FJBCzW^_7e5R|Z z3ZbnaXRY^BL+w-E(ic(zCO&53U7rLnOf%$X8wn0oM%(W3mK2te!pG4ij}yFg-l)a2 zlJr|bT=Z|Ljt+sNbH?GaBpcxBoE|O`#C!P_PIY)^q3y|nrlwlr5{eaph-%8CD15pc zT}%4=7Z#UH6E&omUlP|EWt8C2Op47PS-tpN6GDXd&<&|`zxF<3C_alpyC?xwBewq< zP3;Bkx8!2~eg4@(e^ngbs<6`O9nn=I9lDxkzYE68cm4ifJm`|w@!ksgRA!979u~e4 z!I19K(X8QEpkbJKTDK6!6{cP{eGQQ_x33VMCw7DxG27bpihMLrJkdf!8$;hE5@L!L zMzasEA?~grgeKb{dE4qof#Sg8#|s4cZyOW_oM(j}sU&dj!OuN}9%Xrx)+|@!Q zJ!xFPZ6aSZKZ~cRB~z&ul#EvdaYtH4K_TpbBEsl1?Pp_o;#D6k|MCwpF#AniW#c4) znwW4>p2nwQkSeMi2Ab0ruph?hP2gjZFz_ZJ?xSS(jo@!s4%bm5+*hHAOb#p(^tU{2 zVZ|tX?X2wkD&j5!{_Dc-5_Q9_L@1`~;Woj*`)@G|S#+x< zn-J?c>)#bd-MmHRp{Ee;@2o9CdX{FDvT0n064{I_D=K+K&k^X<+POc;85*5b{gg4) zfW14F6d6vwEU}}H_R!cRS|ZG1Ua+cgxRXxhbkx$L=H_gE{(9_=>qv!#AfCQ-nv{vB z<;sYfiZy7QJv-#Kd%�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

uUF*02#(o-Q(Hw@>pgN*m|u>J7Cw6K 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 E1GZZRG5`Po literal 0 HcmV?d00001 diff --git a/Intro to Python Data Structures/Python Data Structures.ipynb b/Intro to Python Data Structures/Python Data Structures.ipynb new file mode 100644 index 00000000..3b42851f --- /dev/null +++ b/Intro to Python Data Structures/Python Data Structures.ipynb @@ -0,0 +1,1096 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Intro to Python Data Structures\n", + "Lists, Tuples, Sets, Dicts \n", + "(c) 2019 Joe James \n", + "## Sequences: String, List, Tuple\n", + "****\n", + "**indexing** - access any item in the sequence using its index. \n", + "Indexing starts with 0 for the first element." + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "g\n", + "cow\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'frog'\n", + "print (x[3])\n", + "\n", + "# list\n", + "x = ['pig', 'cow', 'horse']\n", + "print (x[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**slicing** - slice out substrings, sublists, subtuples using indexes. \n", + "[start : end+1 : step]" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "omp\n", + "opt\n", + "puter\n", + "compu\n", + "r\n", + "ter\n", + "comput\n" + ] + } + ], + "source": [ + "x = 'computer'\n", + "print(x[1:4])\n", + "print(x[1:6:2])\n", + "print(x[3:])\n", + "print(x[:5])\n", + "print(x[-1])\n", + "print(x[-3:])\n", + "print(x[:-2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**adding / concatenating** - combine 2 sequences of the same type by using +" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "horseshoe\n", + "['pig', 'cow', 'horse']\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'horse' + 'shoe'\n", + "print(x)\n", + "\n", + "# list\n", + "y = ['pig', 'cow'] + ['horse']\n", + "print(y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**multiplying** - multiply a sequence using *" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "bugbugbug\n", + "[8, 5, 8, 5, 8, 5]\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'bug' * 3\n", + "print(x)\n", + "\n", + "# list\n", + "y = [8, 5] * 3\n", + "print(y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**checking membership** - test whether an item is or is not in a sequence." + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'bug'\n", + "print('u' in x)\n", + "\n", + "# list\n", + "y = ['pig', 'cow', 'horse']\n", + "print('cow' not in y)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**iterating** - iterating through the items in a sequence" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7\n", + "8\n", + "3\n", + "0 7\n", + "1 8\n", + "2 3\n" + ] + } + ], + "source": [ + "# item\n", + "x = [7, 8, 3]\n", + "for item in x:\n", + " print(item)\n", + " \n", + "# index & item\n", + "y = [7, 8, 3]\n", + "for index, item in enumerate(y):\n", + " print(index, item)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**number of items** - count the number of items in a sequence" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3\n", + "3\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'bug'\n", + "print(len(x))\n", + "\n", + "# list\n", + "y = ['pig', 'cow', 'horse']\n", + "print(len(y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**minimum** - find the minimum item in a sequence lexicographically. \n", + "Alpha or numeric types, but cannot mix types." + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "b\n", + "cow\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'bug'\n", + "print(min(x))\n", + "\n", + "# list\n", + "y = ['pig', 'cow', 'horse']\n", + "print(min(y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**maximum** - find the maximum item in a sequence lexicographically. \n", + "Alpha or numeric types, but cannot mix types." + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "u\n", + "pig\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'bug'\n", + "print(max(x))\n", + "\n", + "# list\n", + "y = ['pig', 'cow', 'horse']\n", + "print(max(y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**sum** - find the sum of items in a sequence. \n", + "Entire sequence must be numeric." + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "27\n", + "20\n" + ] + } + ], + "source": [ + "# string -> error\n", + "# x = [5, 7, 'bug']\n", + "# print(sum(x)) # generates an error\n", + "\n", + "# list\n", + "y = [2, 5, 8, 12]\n", + "print(sum(y))\n", + "print(sum(y[-2:]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**sorting** - returns a new list of items in sorted order. \n", + "Does not change the original list." + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['b', 'g', 'u']\n", + "['cow', 'horse', 'pig']\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'bug'\n", + "print(sorted(x))\n", + "\n", + "# list\n", + "y = ['pig', 'cow', 'horse']\n", + "print(sorted(y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**count(item)** - returns count of an item" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "2\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'hippo'\n", + "print(x.count('p'))\n", + "\n", + "# list\n", + "y = ['pig', 'cow', 'horse', 'cow']\n", + "print(y.count('cow'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**index(item)** - returns the index of the first occurence of an item." + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "1\n" + ] + } + ], + "source": [ + "# string\n", + "x = 'hippo'\n", + "print(x.index('p'))\n", + "\n", + "# list\n", + "y = ['pig', 'cow', 'horse', 'cow']\n", + "print(y.index('cow'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**unpacking** - unpack the n items of a sequence into n variables" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pig cow horse\n" + ] + } + ], + "source": [ + "x = ['pig', 'cow', 'horse']\n", + "a, b, c = x\n", + "print(a, b, c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Lists \n", + "****\n", + "- General purpose\n", + "- Most widely used data structure \n", + "- Grow and shrink size as needed\n", + "- Sequence type\n", + "- Sortable \n", + "\n", + "**constructors** - creating a new list" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 2, 3, 4, 5, 6, 7]\n", + "[25, 36, 49, 64, 81]\n" + ] + } + ], + "source": [ + "x = list()\n", + "y = ['a', 25, 'dog', 8.43]\n", + "tuple1 = (10, 20)\n", + "z = list(tuple1)\n", + "\n", + "# list comprehension\n", + "a = [m for m in range(8)]\n", + "print(a)\n", + "b = [i**2 for i in range(10) if i>4]\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**delete** - delete a list or an item in a list" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 8, 6]\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6]\n", + "del(x[1])\n", + "print(x)\n", + "del(x) # list x no longer exists" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**append** - append an item to a list" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 3, 8, 6, 7]\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6]\n", + "x.append(7)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**extend** - append a sequence to a list" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 3, 8, 6, 12, 13]\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6]\n", + "y = [12, 13]\n", + "x.extend(y)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**insert** - insert an item at a given index" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 7, 3, 8, 6]\n", + "[5, ['a', 'm'], 7, 3, 8, 6]\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6]\n", + "x.insert(1, 7)\n", + "print(x)\n", + "x.insert(1, ['a', 'm'])\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**pop** - pops last item off list and returns item" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 3, 8]\n", + "8\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6]\n", + "x.pop() # pop off the 6\n", + "print(x)\n", + "print(x.pop())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**remove** - remove first instance of an item" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 8, 6, 3]\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6, 3]\n", + "x.remove(3)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**reverse** - reverse the order of the list. It is an in-place sort, meaning it changes the original list." + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[6, 8, 3, 5]\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6]\n", + "x.reverse()\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**sort** - sort the list in place. \n", + "Note: \n", + "sorted(x) returns a new sorted list without changing the original list x. \n", + "x.sort() puts the items of x in sorted order (sorts in place)." + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[3, 5, 6, 8]\n" + ] + } + ], + "source": [ + "x = [5, 3, 8, 6]\n", + "x.sort()\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tuples\n", + "****\n", + "- Immutable (can’t add/change)\n", + "- Useful for fixed data\n", + "- Faster than Lists\n", + "- Sequence type \n", + " \n", + "**constructors** - creating new tuples." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(2,) \n", + "(2, 4, 6) \n" + ] + } + ], + "source": [ + "x = ()\n", + "x = (1, 2, 3)\n", + "x = 1, 2, 3\n", + "x = 2, # the comma tells Python it's a tuple\n", + "print(x, type(x))\n", + "\n", + "list1 = [2, 4, 6]\n", + "x = tuple(list1)\n", + "print(x, type(x))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**tuples are immutable**, but member objects may be mutable." + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(1, 2, 3)\n", + "([1], 3)\n" + ] + } + ], + "source": [ + "x = (1, 2, 3)\n", + "# del(x[1]) # fails\n", + "# x[1] = 8 # fails\n", + "print(x)\n", + "\n", + "y = ([1, 2], 3) # a tuple where the first item is a list\n", + "del(y[0][1]) # delete the 2\n", + "print(y) # the list within the tuple is mutable" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Sets\n", + "****\n", + "- Store non-duplicate items \n", + "- Very fast access vs Lists \n", + "- Math Set ops (union, intersect) \n", + "- Sets are Unordered \n", + " \n", + "**constructors** - creating new sets" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{3, 5}\n", + "set()\n", + "{2, 3, 4}\n" + ] + } + ], + "source": [ + "x = {3, 5, 3, 5}\n", + "print(x)\n", + "\n", + "y = set()\n", + "print(y)\n", + "\n", + "list1 = [2, 3, 4]\n", + "z = set(list1)\n", + "print(z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**set operations**" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{8, 3, 5}\n", + "{8, 3, 5, 7}\n", + "{8, 5, 7}\n", + "3\n", + "True\n", + "8 {5, 7}\n", + "set()\n" + ] + } + ], + "source": [ + "x = {3, 8, 5}\n", + "print(x)\n", + "x.add(7)\n", + "print(x)\n", + "\n", + "x.remove(3)\n", + "print(x)\n", + "\n", + "# get length of set x\n", + "print(len(x))\n", + "\n", + "# check membership in x\n", + "print(5 in x)\n", + "\n", + "# pop random item from set x\n", + "print(x.pop(), x)\n", + "\n", + "# delete all items from set x\n", + "x.clear()\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Mathematical set operations** \n", + "intersection (AND): set1 & set2 \n", + "union (OR): set1 | set1 \n", + "symmetric difference (XOR): set1 ^ set2\n", + "difference (in set1 but not set2): set1 - set2 \n", + "subset (set2 contains set1): set1 <= set2 \n", + "superset (set1 contains set2): set1 >= set2" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{3}\n", + "{1, 2, 3, 4, 5}\n", + "{1, 2, 4, 5}\n", + "{1, 2}\n", + "False\n", + "False\n" + ] + } + ], + "source": [ + "s1 = {1, 2, 3}\n", + "s2 = {3, 4, 5}\n", + "print(s1 & s2)\n", + "print(s1 | s2)\n", + "print(s1 ^ s2)\n", + "print(s1 - s2)\n", + "print(s1 <= s2)\n", + "print(s1 >= s2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dictionaries (dict)\n", + "****\n", + "- Key/Value pairs\n", + "- Associative array, like Java HashMap\n", + "- Dicts are Unordered" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'pork': 25.3, 'beef': 33.8, 'chicken': 22.7}\n", + "{'pork': 25.3, 'beef': 33.8, 'chicken': 22.7}\n", + "{'pork': 25.3, 'beef': 33.8, 'chicken': 22.7}\n" + ] + } + ], + "source": [ + "x = {'pork':25.3, 'beef':33.8, 'chicken':22.7}\n", + "print(x)\n", + "x = dict([('pork', 25.3),('beef', 33.8),('chicken', 22.7)])\n", + "print(x)\n", + "x = dict(pork=25.3, beef=33.8, chicken=22.7)\n", + "print(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**dict operations**" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'pork': 25.3, 'beef': 33.8, 'chicken': 22.7, 'shrimp': 38.2}\n", + "{'pork': 25.3, 'beef': 33.8, 'chicken': 22.7}\n", + "3\n", + "{}\n" + ] + } + ], + "source": [ + "x['shrimp'] = 38.2 # add or update\n", + "print(x)\n", + "\n", + "# delete an item\n", + "del(x['shrimp'])\n", + "print(x)\n", + "\n", + "# get length of dict x\n", + "print(len(x))\n", + "\n", + "# delete all items from dict x\n", + "x.clear()\n", + "print(x)\n", + "\n", + "# delete dict x\n", + "del(x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**accessing keys and values in a dict**" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dict_keys(['pork', 'beef', 'chicken'])\n", + "dict_values([25.3, 33.8, 22.7])\n", + "dict_items([('pork', 25.3), ('beef', 33.8), ('chicken', 22.7)])\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "y = {'pork':25.3, 'beef':33.8, 'chicken':22.7}\n", + "print(y.keys())\n", + "print(y.values())\n", + "print(y.items()) # key-value pairs\n", + "\n", + "# check membership in y_keys (only looks in keys, not values)\n", + "print('beef' in y)\n", + "\n", + "# check membership in y_values\n", + "print('clams' in y.values())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**iterating a dict - note, items are in random order**" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "pork 25.3\n", + "beef 33.8\n", + "chicken 22.7\n", + "pork 25.3\n", + "beef 33.8\n", + "chicken 22.7\n" + ] + } + ], + "source": [ + "for key in y:\n", + " print(key, y[key])\n", + " \n", + "for k, v in y.items():\n", + " print(k, v)" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From e93dd56cef50bf58ea8195ef92f5c88a851b4af8 Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 13 Feb 2019 14:21:41 -0800 Subject: [PATCH 07/77] Tensorflow Keras initial upload --- ...nsorFlow Tutorial with MNIST Dataset.ipynb | 337 ++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 Tensorflow_Keras/TensorFlow Tutorial with MNIST Dataset.ipynb diff --git a/Tensorflow_Keras/TensorFlow Tutorial with MNIST Dataset.ipynb b/Tensorflow_Keras/TensorFlow Tutorial with MNIST Dataset.ipynb new file mode 100644 index 00000000..49cb48ed --- /dev/null +++ b/Tensorflow_Keras/TensorFlow Tutorial with MNIST Dataset.ipynb @@ -0,0 +1,337 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# TensorFlow Tutorial with MNIST Dataset\n", + "**About the MNIST dataset**. \n", + "MNIST is the equivalent *Hello World* of image analysis.\n", + "It consists of hand written numbers, 0-9, in 28x28 pixel squares. \n", + "Each gray-scale pixel contains an integer 0-255 to indicate darkness, with 0 white and 255 black. \n", + "There are about 60,000 training records, and about 10,000 test records. \n", + "In other words, the images of numbers have already been transformed into arrays of ints to make them easier to use for ML projects. You can find more info on the dataset [here](http://yann.lecun.com/exdb/mnist/). You can also download it from [here](https://s3.amazonaws.com/img-datasets/mnist.pkl.gz).\n", + "## 1. Load Data into a Numpy Array \n", + "I downloaded the data file onto my desktop and loaded it locally. \n", + "You can also load it directly from the cloud as follows: \n", + "```mnist = tf.keras.datasets.mnist \n", + "(x_train, y_train), (x_test, y_test) = mnist.load_data() \n", + "``` \n", + "**After the load:** \n", + "x_train contains 60k arrays of 28x28. \n", + "The y_train vector contains the corresponding labels for these. \n", + "x_test contains 10k arrays of 28x28. \n", + "The y_test vector contains the corresponding labels for these." + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " 47040000 (60000, 28, 28)\n", + " 60000 (60000,)\n", + " 7840000 (10000, 28, 28)\n", + " 10000 (10000,)\n", + "8 2\n" + ] + } + ], + "source": [ + "import pickle\n", + "import numpy as np\n", + "\n", + "with open('/Users/joejames/desktop/mnist.pkl', 'rb') as f:\n", + " (x_train, y_train), (x_test, y_test) = pickle.load(f, encoding='latin1')\n", + " \n", + "print(type(x_train), x_train.size, x_train.shape)\n", + "print(type(y_train), y_train.size, y_train.shape)\n", + "print(type(x_test), x_test.size, x_test.shape)\n", + "print(type(y_test), y_test.size, y_test.shape)\n", + "print(y_train[55], y_test[583])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Use Matplotlib to visualize one record. \n", + "I set the colormap to Greys. There are a bunch of other colormap choices if you like bright visualizations. Try magma or any of the other colormap choice in the [docs](https://matplotlib.org/tutorials/colors/colormaps.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 217, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "

" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.cm as cm\n", + "import matplotlib.pyplot as plt\n", + "\n", + "plt.imshow(x_train[55].reshape(28, 28), cmap=cm.Greys)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Plot a bunch of records to see sample data \n", + "Basically, use the same Matplotlib commands above in a for loop to show 18 records from the train set in a subplot figure. We also make the figsize a bit bigger and remove the tick marks for readability." + ] + }, + { + "cell_type": "code", + "execution_count": 213, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 213, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgsAAAEdCAYAAACCOCTVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3Xu81VP+x/H3mS6SJLoQ4bhEJSSJqYxIaRQJFVNyp1zLNX4mUkY0aZLcScgkRoZhcilSIYoowkzkNrocl8g9zu8Pj8/a69veZ5199jn7/nr+0+exzt77rL5nn33W97PW+qyS8vJyAQAAVOR32e4AAADIbQwWAABAEIMFAAAQxGABAAAEMVgAAABBDBYAAEAQgwUAABDEYAEAAAQxWAAAAEEMFgAAQFDtqjy4SZMm5aWlpWnqSn5buXKlysrKSlJ5Ltc1bPHixWXl5eVNq/o8rmsY1zU9uK7pwXVNj2Sva5UGC6WlpVq0aFHqvSpgHTp0SPm5XNewkpKSD1N5Htc1jOuaHlzX9OC6pkey15VpCAAAEMRgAQAABDFYAAAAQQwWAABAEIMFAAAQxGABAAAEMVgAAABBVaqzgOLz8ccfS5ImTpzo2iZMmCBJGj58uGs7//zzJUnbb799BnsHAMgEMgsAACCIwQIAAAjKm2mIX3/9VZL0448/Bh83depUF3/77beSpLffftu1/e1vf5MkXX755a7tpptucvGmm24qSRo/frxrGzp0aKrdzkuffvqpi/fZZx9J0ldffeXaSkp+OwLDrqUUu+5r167NRBeLzvLly1186KGHunjJkiWSpKZNq1wyv+jccccdLh4yZIik2OeKJL377rsu3m233TLXMRQt+3v2888/u7b58+dLin4On3jiiZKk2rWz9yebzAIAAAjKemZh3bp1kqRffvnFtb3xxhuSpKefftq12Z3t7bffXuXv4Z84duGFF0qS7rrrLte2xRZbuPjAAw+UJB1yyCFV/j757MMPY2eJdO3a1cVffvmlpFg2QYpdr0022cS1rVmzRpL0/vvvu7Ydd9zRxbVq1arZDteg//znPy62/2/Hjh2z1Z2EFi5c6OJu3bplsSf5Z/bs2ZKkCy64wLX97nfx90n+exyoSX5m1s9az5kzR1L09zsRyzKMHDkyDb1LDpkFAAAQxGABAAAEZWUa4pNPPnFxu3btJMXSvzXJUo3+lIMtYDz11FNdW7NmzVzcoEEDSYW9YMxfTGPTDz179nRtVluhIvYzu+aaa1xbly5dJEktW7Z0bf6UkX+9c42lqSXpnXfekZQ70xDl5eWSolMl7733Xra6k5fsev3www9Z7knuWrlypSTpnnvucW2zZs1y8auvvhr3nGnTpkmK1lZ55plnJEknnXSSa/OngYuBv8jb6tP4dWq+//57F9vv90477eTaGjduLElavHixa7vtttskRRfbZ/pvFJkFAAAQxGABAAAEZWUawtIskrT11ltLSm0aokePHnGv+cgjj7g2W63vr+6HdPHFF7vYrzGRrLlz50qK1bGQpL59+0qKXv/XX3891S5m1I033uhi/z2VC9avXy9Juvbaa12bldaWCnu6rDr82ipXXXVV3Nfbt28vKbrjarPNNkt7v3LJggULXNy/f39J0urVq12bpcgl6eijj5YUnaIcNGhQ3Gvac/xU/OTJk2uox7nHn9oaM2aMJOmWW25xbbbbryJ77rmnpNhnqiRt2LBBUuxvoxT7ufivxzQEAADIKVnJLNgiQym2oObhhx92bb///e8lScccc0zcc20hnST985//dHHdunUlSatWrXJt/qISxO4K7r//ftfm3z0YyxJIsZ+BfxdhC5pat27t2i699FJJ0Z9jotfORX6Nj1xjlQZ9/nVH1H//+19J0uGHH+7avvjii7jHjR07VlK0xkoh8ytV2mLGXr16uTbLYB111FGuze6UpdjCZf935ZRTTpEkTZ8+Pe77derUqQZ6nfv87Iy9pyrTpk0bF7/wwguSpIYNG7q2zz//vIZ6V7PILAAAgCAGCwAAICjr5Z73228/SdJee+3l2mxK4ZJLLnFt119/vSRp9OjRcY/zbbPNNi72F4UVq2QPhRo4cKBr8w/csYVifttxxx0nSapfv75r23bbbSVFy+jed999Lh4xYoSk6J7sbPvf//4nKXqNck2iFHr37t2z0JP8cOedd0pKXCvEFulJ0sEHH5yxPuWC5557zsWHHXZY3NcHDBggSbr77rtdm1/O3dghR1Li6QerqeBPZRYyvy5FInYgmX98gF+fxp9+MH7p/VxCZgEAAARlPbNgEo1it9xyy7g2f5ubHfokcQjMxsrKyiRJ1113nWuz7an+lhyrHOZXBvMzNlat0f6tiu+++87F48aNkxT9+WWbbZvz+5kL/C2pS5cujfu6v/UYid9nfobLrpeflSwW9vs2fPhw12aflf6hRLZAOdHnsG/YsGHBrz/44IOSolnHQnbzzTe72Bbm+9Vw7bO2Ktty7VC+XENmAQAABDFYAAAAQTkzDZGIn/J65ZVXJEkzZ850bW+99ZaL27Ztm7mO5Sir/CVJF110kaRoTQXbU/7UU0+5tl133VVS9HCpdPjggw/S+vqpWLZsWVxbKtMtNe3//u//XGyLMBMtAC5m/iLdPn36BB9rFRxbtWqVzi7ljFtvvdXFNv3gTy/YAuXLLrvMtdWpUyfudfzPkzfeeENS9EAzq6PiTy126NChWn3PN5tvvrmLzzrrrBp5zTlz5tTI69Q0MgsAACAopzML/h2UHXfsHyfs31FY5bHOnTu7Ntu+UyyLHz/66CMX+xkF8/LLL0uKbefx+VU1i9n++++fke/z448/SooeQ2vvcVsk5vPv3urVq5fm3uW+efPmufjFF1+M+3q/fv1c7B+XXKj8Mwr8hZz22WfZBCm6PXJj/lZd204pRbdemjPPPFOSdPrpp6fQ4+LiV7b9+uuvXWzZGf9vlP+ZYKza5s4775yuLlaKzAIAAAhisAAAAIJyehrCt9VWW0mKLs7z97P+7W9/i/wrxdJt/oFUDRo0SGs/s+nss892saW3/EpqiaYfapp/YI2/1z1fDpXyF86F2MJDKfZ/9o+ZtQWdP/30k2ubNGmSi+1AHn//tR2P7U8z2MJTDo/6zauvvipJOvHEExN+/YgjjpAUrThaDNM2/gFP/jHTZsKECS62Oh5+atymvl566SXX5qfLLU3up8tPO+00SSy4Nfa76n82WC2LRNPCUuyzw/+sNH612ylTplT4uEwhswAAAIIYLAAAgKC8mYYwHTt2dLFfZ8H2Ez/00EOuzc5bX7FihWu7+OKLJUX3x+az119/3cV2NroUSxf6q8IzwU+T+SnLXNx/bSVp/X4eeeSRkqTdd989+Fw/XWtTLLVrx36dbLrL311htS+kWKlyv66DTUn46UdLGTdt2rTS/0+h8qeGDjjggOBjrW5IVcrrFoJatWq52D9Mb9WqVZJi07hSeHfYDjvs4OJGjRq52A7m8kvFt2/fvho9zm827fPJJ5+4tq5du0qKHmJmnzH+7/Qf//hHF//973+XJK1fvz7ue/h1Lp544glJ0p/+9CfX5v/MM4HMAgAACMq7zIKvefPmLrajQocMGeLaDj30UEnRI0HfffddSYn3sucjf3+17d2XYkdG2/7cdPBHvokOiDr22GNdfPnll6etH6m6+uqrJUm77LKLa3v++eeTem7Lli1dbKN9u6uVYgd0VcWTTz4pKXY3KBVP1cGQ8ePHu7iyBV52IFKx8Rdx+sdIWyZm7dq1rq1NmzaSpBNOOMG1DR48WFI0I+N/3e6W/QPnio2/iHTJkiWSEtdl8Q+X6tatm6ToZ8z333/v4jfffFOStHDhwrjX8T8HTj75ZEnROgv+9/azmulCZgEAAAQxWAAAAEF5PQ3hszScLTKRYgtA/HT5o48+Kik2HSFVvpgtH9n1SEddCbuet9xyi2u75JJLJEmlpaWuzT8QKZf3Yvt79ivav58J//rXv+LabJFuMfr0008lResBJGIpWqm4F4Ia/3fQT2Unwz8oyj4rpdj0T7FNi/lTDxMnTnSxfd75bDrSpnSk2Ofwd99959p69+7tYivB7x/0NW7cOEmxqQ4pVmfhoIMOcm39+/d3sdVzSPR536JFiwT/s6ojswAAAILyOrPgV8p65JFHJEW3tPkZBbPffvtJykw1w2zyFyfVBLvLk6TrrrtOUnQhj93d+ZXzUH1HH310truQNbbdtqysLO5rhx12mItvuummjPWp0PkLphNtg/a3/RUyq6zoVwT2F8/a1ntbWC/F3pP+YtMPP/xQUvSwLX+L+5577ilJmj59umuz7I2/YP3cc8+VFD0EbOrUqS6eMWNG3P/BFkO+9957if6LVUZmAQAABDFYAAAAQXkzDWH7hCdPnuzabNGHFK2ktTG/0pUt/glVMcsn/gFNfmzpsT//+c/Ven2rMGZpMEn68ssvJUnnnXeea/MPqgFqwpo1ayQlrq3gp4RzefFsvrG0eLGzxcb++8xfPPj4449Lkvbdd1/XZovmb731VtdmB0j5tRX8aTNbFNmwYcO4PviLHvfaay9J0WkR/4DERNO/Nf2ZTGYBAAAE5WRmwepk2+hNilXbq8pijUMOOUSSNHbsWNfmjwQLgZ8h8WPLtNh1k6RTTz1VUvRcDDtf47bbbnNt8+bNc/HKlSslRSuQHXfccZKimQXUHD9DZAuk/Mpthcw/P8M/7nxjdqeFmrV06dJsdyEnnHXWWXFt/oJ52xa+bt0617Zs2bIKX8/fZm6fw1L1jpy282U2jtOFzAIAAAhisAAAAIKyPg1hR/D6x3oOGjRIUvT45cr06NFDkjRq1CjXZjUVCmUxY1VY5TF/GuKuu+6SFD2utrK0o+2r7tmzp2s755xzaqyfiOe/X0Op+EKSqFqjpWj9hV5XXnmlpOI7gjpT3n///Wx3ISfYQni/AqZfg2LBggVxz7G/W927d3dt9vnpH/ddnamHbMrPXgMAgIxhsAAAAIIyNg3h7zMdNmyYi+3s9XfeeSep1zn88MNdbIdnSFK7du0kSXXq1KlWP/PNHnvs4eJDDz3Uxc8++2zcY22HhF+62TRr1szF/pn11a3TgOqZM2eOJKlbt25Z7kl62Q6oRO9N/2Akf987al7Hjh1d7E+B5WvqPFWzZ8+WFD0+wJ96aN68uSRpwIABrs3KPPt1fQpJcb0DAABAlaUls2B78yXpL3/5i6Tona7tHa9M/fr1XTx69GhJ0f2vVG6LVv7yF4fde++9kiqvhTBmzBhJ0YNOGjduXJNdRBX5dRaATLI7Zklq27ati5cvXy5JWr16tWvbaaedMtexDLNFtV27dnVtflyMyCwAAIAgBgsAACAoLdMQ//jHP1xse/sr0r59e0nS8ccfH+tU7d+6dcYZZ7g2/4xwJOYfdGLTNYnKliI32cEw/kE0xWK77baTJPXq1cu1+eXekXn+oUWHHXaYJOmSSy5xbXYg0tZbb53ZjiEryCwAAICgtGQWLrzwwoQxgIrZ9shiqdros6zYo48+muWewHTp0sXF/fv3lyTNmDHDtTVp0kSSNHHiRNfGovPCRWYBAAAEMVgAAABBWT9ICgCQe/wDvKZMmSJJ2n333V2b1b656qqrXBuLHQsXmQUAABBEZgEAEGRZBjsifOMYhY/MAgAACGKwAAAAgkqqcmhNSUnJWknJnQJVfHYsLy9vmsoTua6VSunacl0rxXVND65renBd0yOp61qlwQIAACg+TEMAAIAgBgsAACCIwQIAAAhisAAAAIIYLAAAgCAGCwAAIIjBAgAACGKwAAAAghgsAACAIAYLAAAgiMECAAAIYrAAAACCGCwAAIAgBgsAACCIwQIAAAhisAAAAIIYLAAAgCAGCwAAIIjBAgAACGKwAAAAghgsAACAIAYLAAAgiMECAAAIql2VBzdp0qS8tLQ0TV3JbytXrlRZWVlJKs/luoYtXry4rLy8vGlVn8d1DeO6pgfXNT24rumR7HWt0mChtLRUixYtSr1XBaxDhw4pP5frGlZSUvJhKs/juoZxXdOD65oeXNf0SPa6Mg0BAACCGCwAAIAgBgsAACCIwQIAAAhisAAAAIIYLAAAgCAGCwAAIKhKdRayafTo0ZKkkSNHuraOHTu6+Omnn5YkbbHFFpntGICC069fP0lSeXm5a3v44Yez1Z20WL16tYufeuopSdLYsWNd2yGHHOJi/7PWDBw4UJJUq1atdHUROYTMAgAACGKwAAAAgnJ6GuKrr75y8Y033ihJ+t3vYuObxYsXu/ijjz6SJO25554Z6l3+Kisrc/GGDRskSa+88opr69Onj4v9652Mk08+2cW33Xabi4stVfnLL79IklasWOHahg0b5uInn3wy431C2DXXXOPiJ554QpI0fPjwbHUnbf71r39Jkv70pz+5tm+++SbuccuXL3fx5MmT475uUxOtWrWq6S4iB5FZAAAAQTmdWahfv76LjzzySEnSPffck6Xe5KdVq1a5+N5775Uk3X777a7t119/lRTLzEjRbEJJSdUO0vR/PltuuaWLx4wZI0naZJNNqvR6+erHH3+UFL3ratGihYvXr18vSWrQoEFmO4aI8ePHu9jPLNStW1eS1KtXr4z3Kd26desmKfreS5RZqEznzp0lSXPnznVtbdu2rWbvkKvILAAAgCAGCwAAICinpyEsFShJO+20UxZ7kr9GjBjh4vvvvz+j33vChAkuHjJkiCRpl112yWgfcsknn3zi4nXr1kliGiLb5s+f7+KffvrJxUcccYQkqVOnThnvU7ptuummkqILkI8//nhJ0rfffuvadt55Zxe///77ca/zxRdfSJIef/xx18Y0RHrZ54YUfb/OmDFDUmy612f1MCTpr3/9a8rfm8wCAAAIYrAAAACCcnoa4ocffnDx66+/nsWe5C9Lp0qJpyG23XZbSdJFF13k2myHhJS4zsK8efMkSTNnzqyxfhYDv3QwUvOf//xHUrTs+9133+1iS7FXxt7DL774omtr06aNi/0ptELlfzbsvffekqLXo0mTJi5ONA1hbIoRNevtt9928fTp0yVF6118+eWXLg7tWps9e3aN9IfMAgAACMrpzMLPP//sYn+UlcjLL78sSdphhx1cG4dKSX379nWxLUjyWeagKgvtzjzzTElS69atXZtf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hg2ubcWKFRnvEwAgM8gsAACAIAYLAAAgiGkIBI0aNUqSdOutt7q2tWvXSpIGDx6clT4BADKLzAIAAAgiswBJ0rfffuvifv36ufipp56SJJWUxOpN7b///pKkyZMnZ6h3AIBsIrMAAACCGCwAAICgGp2G+OmnnyRJzz33nGvbdNNNJUkLFixwbevWrXPxpEmTJEl9+/Z1bS1atEjq+2233XYu7tOnjyRphx12qGq3i5rVT7joootc29NPPx33uClTprh4v/32kxT72eI35eXlLj7nnHMkSdOmTXNtH330kYsbNmyYuY4BCTz//PMunjkxxI5yAAAOVklEQVRzpiTp5Zdfdm2vv/563HP++Mc/uvjBBx+UJNWrVy9NPYSxv609e/Z0bX5tmzfeeEOS1KhRo7T1gcwCAAAIqtHMwsSJEyVJl156aZWf+8ADD1Trew8fPlxS9ECn008/XZJ0zDHHuLZ0jrzy0ddffy1Juv/++4OP809ta9WqVTq7lLf8ipZPPPGEpNj1laQXX3zRxf4dApBu3333nYst6zV16lTXttVWW0mKZg523313Fz/66KOSpMcff9y1derUSZL02muvpaHHxeGbb76J/OvbbLPNXLx48WJJ0WzQ3nvv7eJMZHnJLAAAgCAGCwAAIKhGpyH8RXAhzZo1c/GBBx6Y1HNat24tSVq+fLlrW7NmjYvnzZsnSXrllVdcm8X77ruva2vXrl1S36+Q+YdCWdrRX5znW7hwoaTo9A4Sq1OnjovtevmLGj/99NOM96nY2HTmDz/84NqWLl0qSbrxxhvjHr/PPvu4eNGiRWnuXfb06tXLxW+//bYkady4ca5t6NChkipOZ1vV1pYtW7q2N998U1K0uuuQIUNqqMf567PPPnOxvedWrlyZ8LE2vZDoIL7x48e72N7D/ue0/7P49ddfU+9wksgsAACAIAYLAAAgqEanIebPny8pmnpNVPegbt26Lm7QoEHK3+/HH3908R577CFJev/99+Me99BDD7mYaQjp73//u4st/TVo0CDXdtNNN7l48803z1zHCsjFF18sSXrkkUdc27Jly7LVnYLx3nvvSYql0qVYSXJJuvPOOyUlnlbzS5YbS6VLUvv27V1cKCv833rrLUnSCy+84NpsyuGCCy5I+nWaNm0qSRozZoxrO++88yRJN9xwg2tjGiJaU+j6668PPtZq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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "images = x_train[0:18]\n", + "fig, axes = plt.subplots(3, 6, figsize=[9,5])\n", + "\n", + "for i, ax in enumerate(axes.flat):\n", + " ax.imshow(x_train[i].reshape(28, 28), cmap=cm.Greys)\n", + " ax.set_xticks([])\n", + " ax.set_yticks([])\n", + "plt.show" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Show distribution of training data labels \n", + "The training data is about evenly distributed across all nine digits. " + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5923 6742 5958 6131 5842 5421 5918 6265 5851 5949]\n" + ] + } + ], + "source": [ + "counts = np.bincount(y_train)\n", + "nums = np.arange(len(counts))\n", + "plt.bar(nums, counts)\n", + "plt.show()\n", + "print(counts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Apply Keras/TensorFlow neural network \n", + "Use tensorflow to train the model with 60k training records, compile the model, and classify 10k test records with 98% accuracy. \n", + "**Create the model** \n", + "Build the keras model by stacking layers into the network. Our model here has four layers:\n", + "- Flatten reshapes the data into a 1-dimensional array\n", + "- [Dense](https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense) tells the model to use output arrays of shape (*, 512) and sets rectified linear [activation function](https://keras.io/activations/). \n", + "- [Dropout](https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dropout) applies dropout to the input to help avoid overfitting.\n", + "- The next Dense line condenses the ouput into probabilities for each of the 10 digits.\n", + "\n", + "**Compile the model** \n", + "- [Adam](https://keras.io/optimizers/) is an optimization algorithm that uses stochastic gradient descent to update network weights.\n", + "- Sparse categorical crossentropy is a [loss function](https://keras.io/losses/) that is required to compile the model. The loss function measures how accurate the model is during training. We want to minimize this function to steer the model in the right direction.\n", + "- A metric is a function that is used to judge the performance of your model. We're using accuracy of our predictions as compared to y_test as our metric. \n", + "Lastly, we fit our training data into the model, with several training repetitions (epochs), then evaluate our test data. \n", + "\n", + "Our final result is about 98% accuracy in classifying 10k digits in the test set. You can try tweaking this model with different settings to get a better score. An easy tweak is increasing the epochs, which improves accuracy at the expense of time. Follow the links to the Keras layer docs above and try different options for Dense output, activation functions, optimization algorithms and loss functions." + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/4\n", + "60000/60000 [==============================] - 5s 89us/sample - loss: 0.2581 - acc: 0.9244\n", + "Epoch 2/4\n", + "60000/60000 [==============================] - 5s 83us/sample - loss: 0.1180 - acc: 0.9644\n", + "Epoch 3/4\n", + "60000/60000 [==============================] - 5s 81us/sample - loss: 0.0867 - acc: 0.9736\n", + "Epoch 4/4\n", + "60000/60000 [==============================] - 5s 82us/sample - loss: 0.0697 - acc: 0.9785\n", + "10000/10000 [==============================] - 1s 59us/sample - loss: 0.0662 - acc: 0.9791\n" + ] + }, + { + "data": { + "text/plain": [ + "[0.0662360069771763, 0.9791]" + ] + }, + "execution_count": 215, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import tensorflow as tf\n", + "# Disable some deprecated error messages\n", + "tf.logging.set_verbosity(tf.logging.ERROR)\n", + "\n", + "# Normalize the data to a 0.0 to 1.0 scale for faster processing\n", + "x_train, x_test = x_train / 255.0, x_test / 255.0\n", + "\n", + "model = tf.keras.models.Sequential([\n", + " tf.keras.layers.Flatten(input_shape=(28, 28)),\n", + " tf.keras.layers.Dense(256, activation=tf.nn.relu),\n", + " tf.keras.layers.Dropout(0.25),\n", + " tf.keras.layers.Dense(10, activation=tf.nn.softmax)\n", + "])\n", + " \n", + "model.compile(optimizer='adam',\n", + " loss='sparse_categorical_crossentropy',\n", + " metrics=['accuracy'])\n", + "\n", + "model.fit(x_train, y_train, epochs=4)\n", + "model.evaluate(x_test, y_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Generate predictions for test set \n", + "Our predictions are in the form of a list of 10 floats, with probabilities for each value. We can get the prediction by picking the index of the list item with the highest probability. And we can visualize that item to verify our prediction." + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5.5930052e-09 1.6970777e-15 2.4897268e-10 2.3935108e-14 7.2053798e-09\n", + " 4.4642620e-10 1.0000000e+00 8.1785776e-12 2.4993282e-10 2.6947859e-13]\n", + "6\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 216, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "predictions = model.predict(x_test)\n", + "print(predictions[88])\n", + "print(np.argmax(predictions[88]))\n", + "plt.imshow(x_test[88].reshape(28, 28), cmap=cm.Greys)" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 574e76d113fa58d67ac9acac98f0d97a8ecbda0c Mon Sep 17 00:00:00 2001 From: Joe James Date: Sun, 24 Feb 2019 20:52:49 -0800 Subject: [PATCH 08/77] Initial upload - nltk notebook --- NLTK/NLTK.ipynb | 665 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 665 insertions(+) create mode 100644 NLTK/NLTK.ipynb diff --git a/NLTK/NLTK.ipynb b/NLTK/NLTK.ipynb new file mode 100644 index 00000000..7c65f6a8 --- /dev/null +++ b/NLTK/NLTK.ipynb @@ -0,0 +1,665 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python NLTK Natural Language Tool Kit\n", + "## Topics covered in this video\n", + "- Exploring the NLTK corpus \n", + "- Dictionary definitions \n", + "- Punctuation and stop words \n", + "- Stemming and lemmatization \n", + "- Sentence and word tokenizers \n", + "- Parts of speech tagging \n", + "- word2vec \n", + "- Clustering and classifying\n", + "\n", + "### NLTK Setup\n", + "First you need to install the nltk library with 'pip install nltk' or some equivalent shell command. \n", + "Then you need to download the nltk corpus by running \n", + "```python \n", + "import nltk \n", + "nltk.download()```\n", + "This will open the NLTK downloader dialog window where you should just click Download All. The corpus is a large and varied body of sample documents that you'll need for this video, including dictionaries and word lists like stop words. You can uninstall it later if you have a shortage of disk space with *pip uninstall nltk*.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "260819\n", + "19317\n", + "['[', 'Moby', 'Dick', 'by', 'Herman', 'Melville', '1851', ']', 'ETYMOLOGY', '.']\n", + "['[', 'Sense', 'and', 'Sensibility', 'by', 'Jane', 'Austen', '1811', ']', 'CHAPTER']\n" + ] + } + ], + "source": [ + "import nltk\n", + "from nltk.book import *\n", + "\n", + "print(type(text1))\n", + "print(len(text1))\n", + "print(len(set(text1)))\n", + "print(text1[:10])\n", + "print(text2[:10])" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['austen-emma.txt', 'austen-persuasion.txt', 'austen-sense.txt', 'bible-kjv.txt', 'blake-poems.txt', 'bryant-stories.txt', 'burgess-busterbrown.txt', 'carroll-alice.txt', 'chesterton-ball.txt', 'chesterton-brown.txt', 'chesterton-thursday.txt', 'edgeworth-parents.txt', 'melville-moby_dick.txt', 'milton-paradise.txt', 'shakespeare-caesar.txt', 'shakespeare-hamlet.txt', 'shakespeare-macbeth.txt', 'whitman-leaves.txt']\n", + "37360\n", + "3106\n", + "['What', 'say', 'you', '?']\n", + "950\n" + ] + } + ], + "source": [ + "from nltk.corpus import gutenberg\n", + "print(gutenberg.fileids())\n", + "hamlet = gutenberg.words('shakespeare-hamlet.txt')\n", + "print(len(hamlet))\n", + "hamlet_sentences = gutenberg.sents('shakespeare-hamlet.txt')\n", + "print(len(hamlet_sentences))\n", + "print(hamlet_sentences[1024])\n", + "print(len(gutenberg.paras('shakespeare-hamlet.txt')))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get the count of a word in a document, or the context of every occurence of a word in a document." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "26\n", + "Displaying 7 of 7 matches:\n", + "r him ,\" said I , now flying into a passion again at this unaccountable farrago\n", + " employed in the celebration of the Passion of our Lord ; though in the Vision \n", + "ce all mortal interests to that one passion ; nevertheless it may have been tha\n", + "ing with the wildness of his ruling passion , yet were by no means incapable of\n", + "it , however promissory of life and passion in the end , it is above all things\n", + "o ' s lordly chest . So have I seen Passion and Vanity stamping the living magn\n", + " Guernseyman , flying into a sudden passion . \" Oh ! keep cool -- cool ? yes , \n", + "None\n", + "Displaying 5 of 5 matches:\n", + "one ,\" said Elinor , \" who has your passion for dead leaves .\" \" No ; my feelin\n", + "r daughters , without extending the passion to her ; and Elinor had the satisfa\n", + "r , if he was to be in the greatest passion !-- and Mr . Donavan thinks just th\n", + "edness I could have borne , but her passion -- her malice -- At all events it m\n", + "ling a sacrifice to an irresistible passion , as once she had fondly flattered \n", + "None\n" + ] + } + ], + "source": [ + "print(text1.count('horse'))\n", + "print(text1.concordance('passion'))\n", + "print(text2.concordance('passion'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**FreqDist and most_common** \n", + "We can use FreqDist to find the number of occurrences of each word in the text. \n", + "By getting len(vocab) we get the number of unique words in the text (including punctuation). \n", + "And we can get the most common words easily too." + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "19317\n", + "[(',', 18713), ('the', 13721), ('.', 6862), ('of', 6536), ('and', 6024), ('a', 4569), ('to', 4542), (';', 4072), ('in', 3916), ('that', 2982), (\"'\", 2684), ('-', 2552), ('his', 2459), ('it', 2209), ('I', 2124), ('s', 1739), ('is', 1695), ('he', 1661), ('with', 1659), ('was', 1632)]\n" + ] + } + ], + "source": [ + "vocab = nltk.FreqDist(text1)\n", + "print(len(vocab))\n", + "print(vocab.most_common(20))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we got the 80 most common words, filtered only the ones with at least 3 characters, then sorted them descending by number of occurences. \n", + "A better way is to first remove all the *stop words* (see below), then get the FreqDist." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('that', 2982), ('with', 1659), ('this', 1280), ('from', 1052), ('whale', 906), ('have', 760), ('there', 715), ('were', 680), ('which', 640), ('like', 624), ('their', 612), ('they', 586), ('some', 578), ('then', 571), ('when', 553), ('upon', 538), ('into', 520), ('ship', 507), ('more', 501), ('Ahab', 501), ('them', 471), ('what', 442), ('would', 421), ('been', 415), ('other', 412), ('over', 403)]\n" + ] + } + ], + "source": [ + "mc = sorted([w for w in vocab.most_common(80) if len(w[0]) > 3], key=lambda x: x[1], reverse=True)\n", + "print(mc)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A dispersion plot shows you where in the document a word is used. You can pass in a list of words." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "text1.dispersion_plot(['capture', 'whale', 'life', 'death', 'kill'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dictionary definitions\n", + "Use wordnet synsets to get word definitions and examples of usage. \n", + "The [0] is required because synsets returns a list, with an entry for each POS." + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "unmitigated.a.01 - not diminished or moderated in intensity or severity; sometimes used as an intensifier\n", + "['unmitigated suffering', 'an unmitigated horror', 'an unmitigated lie']\n" + ] + } + ], + "source": [ + "from nltk.corpus import wordnet as wn\n", + "w = wn.synsets(\"unmitigated\")[0]\n", + "print(w.name(), '-', w.definition())\n", + "print(w.examples())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Punctuation and Stop Words\n", + "Text analysis is often faster and easier if you can remove useless words. \n", + "NLTK provides a list of these stop words so it's easy to filter them out of your text prior to processing. \n", + "Here, 15% of our text is punctuation, and 40% is stop words. So we shrink the text by more than half by stripping out punctuation and stop words." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n", + "['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', \"you're\", \"you've\", \"you'll\", \"you'd\", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', \"she's\", 'her', 'hers', 'herself', 'it', \"it's\", 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', \"that'll\", 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', \"don't\", 'should', \"should've\", 'now', 'd', 'll', 'm', 'o', 're', 've', 'y', 'ain', 'aren', \"aren't\", 'couldn', \"couldn't\", 'didn', \"didn't\", 'doesn', \"doesn't\", 'hadn', \"hadn't\", 'hasn', \"hasn't\", 'haven', \"haven't\", 'isn', \"isn't\", 'ma', 'mightn', \"mightn't\", 'mustn', \"mustn't\", 'needn', \"needn't\", 'shan', \"shan't\", 'shouldn', \"shouldn't\", 'wasn', \"wasn't\", 'weren', \"weren't\", 'won', \"won't\", 'wouldn', \"wouldn't\"]\n", + "260819\n", + "221767\n", + "122226\n" + ] + } + ], + "source": [ + "from string import punctuation\n", + "print(punctuation)\n", + "without_punct = [w for w in text1 if w not in punctuation] # this is called a list comprehension\n", + "\n", + "from nltk.corpus import stopwords\n", + "sw = stopwords.words('english')\n", + "print(sw)\n", + "without_sw = [w for w in without_punct if w not in sw] \n", + "\n", + "print(len(text1))\n", + "print(len(without_punct))\n", + "print(len(without_sw))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Stemming and Lemmatization\n", + "These term normalization algorithms strip the word endings off to reduce the number of root words for easier matching. \n", + "This is useful for search term matching. [NLTK stemming docs](https://www.nltk.org/api/nltk.stem.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "is is\n", + "are are\n", + "bought bought\n", + "buys buy\n", + "giving give\n", + "jumps jump\n", + "jumped jump\n", + "birds bird\n", + "do do\n", + "does doe\n", + "did did\n", + "doing do\n" + ] + } + ], + "source": [ + "from nltk.stem.porter import PorterStemmer\n", + "st = PorterStemmer()\n", + "words = ['is', 'are', 'bought', 'buys', 'giving', 'jumps', 'jumped', 'birds', 'do', 'does', 'did', 'doing']\n", + "for word in words:\n", + " print(word, st.stem(word))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**WordNet Lemmatizer** \n", + "The difference is that the result of stemming may not be an actual word, but lemmatization returns the root word. NLTK supports both. \n", + "You can also try the Lancaster or Snowball stemmers. The Snowball stemmer supports numerous languages: Arabic, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Norwegian, Portuguese, Romanian, Russian, Spanish and Swedish." + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "is is\n", + "are are\n", + "bought bought\n", + "buys buy\n", + "giving giving\n", + "jumps jump\n", + "jumped jumped\n", + "birds bird\n", + "do do\n", + "does doe\n", + "did did\n", + "doing doing\n" + ] + } + ], + "source": [ + "from nltk.stem import WordNetLemmatizer\n", + "wnl = WordNetLemmatizer()\n", + "words = ['is', 'are', 'bought', 'buys', 'giving', 'jumps', 'jumped', 'birds', 'do', 'does', 'did', 'doing']\n", + "for word in words:\n", + " print(word, wnl.lemmatize(word))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sentence and Word Tokenizers\n", + "Sentence tokenizer breaks text down into a list of sentences. It's pretty good at handling punctuation and decimal numbers. \n", + "[Word tokenizer](https://www.nltk.org/api/nltk.tokenize.html) breaks a string down into a list of words and punctuation. \n", + "It is also easy to get parts of speech using nltk.pos_tag. There are different tagsets, depending on how much detail you want. I like universal." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Hello.', 'I am Joe!', 'I like Python.', '263.5 is a big number.']\n", + "['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog', '.']\n" + ] + } + ], + "source": [ + "from nltk.tokenize import sent_tokenize, word_tokenize\n", + "s = 'Hello. I am Joe! I like Python. 263.5 is a big number.' # 4 sentences\n", + "print(sent_tokenize(s))\n", + "\n", + "w = word_tokenize('The quick brown fox jumps over the lazy dog.')\n", + "print(w)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Parts of Speech Tagging\n", + "To break a block of text down into its parts of speech use pos_tag. \n", + "The default tagset uses 2 or 3 letter tokens that are hard for me to understand. [StackOverflow](https://stackoverflow.com/questions/15388831/what-are-all-possible-pos-tags-of-nltk) has a great decoder for the default POS tags. \n", + "The Universal tagset gives a more familiar looking tag (noun, verb, adj). \n", + "NLTK includes several other tagsets you can try." + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog', '.']\n", + "[('The', 'DT'), ('quick', 'JJ'), ('brown', 'NN'), ('fox', 'NN'), ('jumps', 'VBZ'), ('over', 'IN'), ('the', 'DT'), ('lazy', 'JJ'), ('dog', 'NN'), ('.', '.')]\n", + "[('The', 'DET'), ('quick', 'ADJ'), ('brown', 'NOUN'), ('fox', 'NOUN'), ('jumps', 'VERB'), ('over', 'ADP'), ('the', 'DET'), ('lazy', 'ADJ'), ('dog', 'NOUN'), ('.', '.')]\n" + ] + } + ], + "source": [ + "w = word_tokenize('The quick brown fox jumps over the lazy dog.')\n", + "print(w)\n", + "print(nltk.pos_tag(w))\n", + "print(nltk.pos_tag(w, tagset='universal'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Word2Vec\n", + "[Word2Vec](https://radimrehurek.com/gensim/models/word2vec.html) uses neural networks to analyze words in a corpus by using the contexts of words. \n", + "It takes as its input a large corpus of text, and maps unique words to a vector space, such that \n", + "words that share common contexts in the corpus are located in close proximity to one another in the space. \n", + "Word2Vec does NOT look at word meanings, it only finds words that are used in combination with other words. So *frying* and *pan* may have a high similarity. \n", + "You can see here the context of one word (pain) for two different corpora. \n", + "This uses the popular gensim library, which is not part of NLTK." + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('person', 0.9992861747741699), ('favourable', 0.998925507068634), ('meaning', 0.9987690448760986), ('effect', 0.9987439513206482), ('comfortable', 0.998741626739502), ('delay', 0.9987210035324097)]\n", + "[('even', 0.9980006217956543), ('moment', 0.9979783296585083), ('hence', 0.9979231357574463), ('without', 0.9979217052459717), ('separate', 0.9979064464569092), ('Now', 0.9979038238525391)]\n" + ] + } + ], + "source": [ + "from gensim.models import Word2Vec\n", + "emma_vec = Word2Vec(gutenberg.sents('austen-emma.txt'))\n", + "leaves_vec = Word2Vec(gutenberg.sents('whitman-leaves.txt'))\n", + "print(emma_vec.wv.most_similar('pain', topn=6))\n", + "print(leaves_vec.wv.most_similar('pain', topn=6))" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "30103\n", + "[('mercy', 0.9284727573394775),\n", + " ('liveth', 0.9062315821647644),\n", + " ('truth', 0.8941866159439087),\n", + " ('grace', 0.8938426375389099),\n", + " ('glory', 0.8936725854873657),\n", + " ('salvation', 0.8859732747077942),\n", + " ('hosts', 0.8839103579521179),\n", + " ('confession', 0.8837960958480835)]\n", + "[('making', 0.9873884916305542),\n", + " ('abundant', 0.9802387952804565),\n", + " ('realm', 0.98007732629776),\n", + " ('powers', 0.9798883199691772),\n", + " ('twice', 0.9775580763816833)]\n" + ] + } + ], + "source": [ + "from gensim.models import Word2Vec\n", + "from nltk.corpus import stopwords\n", + "from string import punctuation\n", + "import pprint as pp\n", + "\n", + "bible_sents = gutenberg.sents('bible-kjv.txt')\n", + "sw = stopwords.words('english')\n", + "bible = [[w.lower() for w in s if w not in punctuation and w not in sw] for s in bible_sents]\n", + "print(len(bible))\n", + "\n", + "bible_vec = Word2Vec(bible)\n", + "pp.pprint(bible_vec.wv.most_similar('god', topn=8))\n", + "pp.pprint(bible_vec.wv.most_similar('creation', topn=5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### k-Means Clustering\n", + "[Clustering](http://www.nltk.org/api/nltk.cluster.html) groups similar items together. \n", + "The K-means clusterer starts with k arbitrarily chosen means (or centroids) then assigns each vector to the cluster with the closest mean. It then recalculates the means of each cluster as the centroid of its vector members. This process repeats until the cluster memberships stabilize. [NLTK docs on this example](https://www.nltk.org/_modules/nltk/cluster/kmeans.html) \n", + "This example clusters int vectors, which you can think of as points on a plane. But you could also use clustering to cluster similar documents by vocabulary/topic." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "k-means trial 0\n", + "iteration\n", + "iteration\n", + "Clustered: [array([2, 1]), array([1, 3]), array([4, 7]), array([6, 7])]\n", + "As: [0, 0, 1, 1]\n", + "Means: [array([1.5, 2. ]), array([5., 7.])]\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from nltk.cluster import KMeansClusterer, euclidean_distance\n", + "\n", + "vectors = [np.array(f) for f in [[2, 1], [1, 3], [4, 7], [6, 7]]]\n", + "means = [[4, 3], [5, 5]]\n", + "\n", + "clusterer = KMeansClusterer(2, euclidean_distance, initial_means=means)\n", + "clusters = clusterer.cluster(vectors, True, trace=True)\n", + "\n", + "print('Clustered:', vectors)\n", + "print('As:', clusters)\n", + "print('Means:', clusterer.means())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**k-Means Clustering, Example-2** \n", + "In this example we cluster an array of 6 points into 2 clusters. \n", + "The initial centroids are randomly chosen by the clusterer, and it does 10 iterations to regroup the clusters and recalculate centroids. " + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Clustered: [array([3, 3]), array([1, 2]), array([4, 2]), array([4, 0]), array([2, 3]), array([3, 1])]\n", + "As: [0, 0, 1, 1, 0, 1]\n", + "Means: [array([2. , 2.66666667]), array([3.66666667, 1. ])]\n", + "classify([2 2]): 0\n" + ] + } + ], + "source": [ + "vectors = [np.array(f) for f in [[3, 3], [1, 2], [4, 2], [4, 0], [2, 3], [3, 1]]]\n", + "\n", + "# test k-means using 2 means, euclidean distance, and 10 trial clustering repetitions with random seeds\n", + "clusterer = KMeansClusterer(2, euclidean_distance, repeats=10)\n", + "clusters = clusterer.cluster(vectors, True)\n", + "centroids = clusterer.means()\n", + "print('Clustered:', vectors)\n", + "print('As:', clusters)\n", + "print('Means:', centroids)\n", + "\n", + "# classify a new vector\n", + "vector = np.array([2,2])\n", + "print('classify(%s):' % vector, end=' ')\n", + "print(clusterer.classify(vector))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Plot a Chart of the Clusters in Example-2** \n", + "Make a Scatter Plot of the two clusters using matplotlib.pyplot. \n", + "We plot all the points in cluster-0 blue, and all the points in cluster-1 red. Then we plot the two centroids in orange. \n", + "I used list comprehensions to create new lists for all the x0, y0, x1 and y1 values." + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "x0 = np.array([x[0] for idx, x in enumerate(vectors) if clusters[idx]==0])\n", + "y0 = np.array([x[1] for idx, x in enumerate(vectors) if clusters[idx]==0])\n", + "plt.scatter(x0,y0, color='blue')\n", + "x1 = np.array([x[0] for idx, x in enumerate(vectors) if clusters[idx]==1])\n", + "y1 = np.array([x[1] for idx, x in enumerate(vectors) if clusters[idx]==1])\n", + "plt.scatter(x1,y1, color='red')\n", + "\n", + "xc = np.array([x[0] for x in centroids])\n", + "yc = np.array([x[1] for x in centroids])\n", + "plt.scatter(xc,yc, color='orange')\n", + "plt.show()" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a17b63d45b660910faa9aef082be2de359608b73 Mon Sep 17 00:00:00 2001 From: Joe James Date: Tue, 26 Feb 2019 13:40:54 -0800 Subject: [PATCH 09/77] Initial upload - Requests notebook --- Web Data Mining/Python Requests.ipynb | 418 ++++++++++++++++++++++++++ 1 file changed, 418 insertions(+) create mode 100644 Web Data Mining/Python Requests.ipynb diff --git a/Web Data Mining/Python Requests.ipynb b/Web Data Mining/Python Requests.ipynb new file mode 100644 index 00000000..6b9274ec --- /dev/null +++ b/Web Data Mining/Python Requests.ipynb @@ -0,0 +1,418 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Requests\n", + "(c) 2019, Joe James.\n", + "MIT License.\n", + "\n", + "Tutorial on using the [Requests](http://docs.python-requests.org/en/master/user/quickstart/) library to access HTTP requests, GET, POST, PUT, DELETE, HEAD, OPTIONS. \n", + "This notebook also covers how to use the Python [JSON](https://docs.python.org/3/library/json.html) library to parse values out of a GET response. \n", + "If you don't have the requests library installed you can run 'pip install requests' or some equivalent command for your system in the console window. " + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "import requests" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [], + "source": [ + "r = requests.get('https://api.github.com/events')\n", + "r = requests.post('https://httpbin.org/post', data = {'name':'Joe'})\n", + "r = requests.put('https://httpbin.org/put', data = {'name':'Joe'})\n", + "r = requests.delete('https://httpbin.org/delete')\n", + "r = requests.head('https://httpbin.org/get')\n", + "r = requests.options('https://httpbin.org/get')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### GET Requests - Passing Parameters in URLs\n", + "A URL that returns an HTTP response in JSON format is called an API endpoint. \n", + "Here's an example, https://httpbin.org/get \n", + "\n", + "With GET requests we can add parameters onto the URL to retrieve specific data. \n", + "We define the params as a dictionary, and add params=payload to the Request. \n", + "The Requests library builds the whole URL for us." + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://httpbin.org/get?key1=value1&key2=value2\n" + ] + } + ], + "source": [ + "payload = {'key1': 'value1', 'key2': 'value2'}\n", + "r = requests.get('https://httpbin.org/get', params=payload)\n", + "print(r.url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Passing a List as a parameter** \n", + "Still use key:value pairs, with the list as the value. \n", + "You can see here all the different attributes included in an HTTP Request response." + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "URL: https://httpbin.org/get?key1=value1&key2=value2&key2=value3\n", + "ENCODING: None\n", + "STATUS_CODE: 200\n", + "HEADERS: {'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date': 'Tue, 26 Feb 2019 18:13:35 GMT', 'Server': 'nginx', 'Content-Length': '229', 'Connection': 'keep-alive'}\n", + "TEXT: {\n", + " \"args\": {\n", + " \"key1\": \"value1\", \n", + " \"key2\": [\n", + " \"value2\", \n", + " \"value3\"\n", + " ]\n", + " }, \n", + " \"headers\": {\n", + " \"Accept\": \"*/*\", \n", + " \"Accept-Encoding\": \"gzip, deflate\", \n", + " \"Host\": \"httpbin.org\", \n", + " \"User-Agent\": \"python-requests/2.21.0\"\n", + " }, \n", + " \"origin\": \"99.99.39.153, 99.99.39.153\", \n", + " \"url\": \"https://httpbin.org/get?key1=value1&key2=value2&key2=value3\"\n", + "}\n", + "\n", + "CONTENT: b'{\\n \"args\": {\\n \"key1\": \"value1\", \\n \"key2\": [\\n \"value2\", \\n \"value3\"\\n ]\\n }, \\n \"headers\": {\\n \"Accept\": \"*/*\", \\n \"Accept-Encoding\": \"gzip, deflate\", \\n \"Host\": \"httpbin.org\", \\n \"User-Agent\": \"python-requests/2.21.0\"\\n }, \\n \"origin\": \"99.99.39.153, 99.99.39.153\", \\n \"url\": \"https://httpbin.org/get?key1=value1&key2=value2&key2=value3\"\\n}\\n'\n", + "JSON: >\n" + ] + } + ], + "source": [ + "payload = {'key1': 'value1', 'key2': ['value2', 'value3']}\n", + "r = requests.get('https://httpbin.org/get', params=payload)\n", + "print('URL: ', r.url)\n", + "print('ENCODING: ', r.encoding)\n", + "print('STATUS_CODE: ', r.status_code)\n", + "print('HEADERS: ', r.headers)\n", + "print('TEXT: ', r.text)\n", + "print('CONTENT: ', r.content)\n", + "print('JSON: ', r.json)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### POST Requests\n", + "We can add parameters to a POST request in Dictionary format, but we use data=payload. \n", + "POST requests are used to upload new records to the server. \n", + "POST would typically be used to get data from a web form and submit it to the server. " + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"args\": {}, \n", + " \"data\": \"\", \n", + " \"files\": {}, \n", + " \"form\": {\n", + " \"key1\": \"value1\", \n", + " \"key2\": \"value2\"\n", + " }, \n", + " \"headers\": {\n", + " \"Accept\": \"*/*\", \n", + " \"Accept-Encoding\": \"gzip, deflate\", \n", + " \"Content-Length\": \"23\", \n", + " \"Content-Type\": \"application/x-www-form-urlencoded\", \n", + " \"Host\": \"httpbin.org\", \n", + " \"User-Agent\": \"python-requests/2.21.0\"\n", + " }, \n", + " \"json\": null, \n", + " \"origin\": \"99.99.39.153, 99.99.39.153\", \n", + " \"url\": \"https://httpbin.org/post/"\n", + "}\n", + "\n" + ] + } + ], + "source": [ + "r = requests.post('https://httpbin.org/post', data = {'name':'Joe'})\n", + "\n", + "payload = {'key1': 'value1', 'key2': 'value2'}\n", + "r = requests.post(\"https://httpbin.org/post/", data=payload)\n", + "print(r.text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using Requests to GET Currency Exchange Data\n", + "Here's a handy endpoint where we can GET foreign currency exchange rates in JSON format, https://api.exchangeratesapi.io/latest" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"rates\":{\"MXN\":21.7145,\"AUD\":1.5897,\"HKD\":8.9178,\"RON\":4.7626,\"HRK\":7.4275,\"CHF\":1.1371,\"IDR\":15917.9,\"CAD\":1.5024,\"USD\":1.1361,\"ZAR\":15.752,\"JPY\":125.93,\"BRL\":4.2574,\"HUF\":317.06,\"CZK\":25.663,\"NOK\":9.7725,\"INR\":80.853,\"PLN\":4.3282,\"ISK\":136.1,\"PHP\":59.144,\"SEK\":10.5858,\"ILS\":4.1148,\"GBP\":0.86055,\"SGD\":1.5332,\"CNY\":7.6077,\"TRY\":6.0254,\"MYR\":4.6157,\"RUB\":74.6158,\"NZD\":1.652,\"KRW\":1270.0,\"THB\":35.583,\"BGN\":1.9558,\"DKK\":7.4616},\"base\":\"EUR\",\"date\":\"2019-02-26\"}\n" + ] + } + ], + "source": [ + "url = 'https://api.exchangeratesapi.io/latest'\n", + "r = requests.get(url)\n", + "print(r.text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**It looks like the default is base:EUR, but we want exchange rates for USD, so we can pass in a parameter for base. \n", + "We can also put in any date we want.**" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"rates\":{\"MXN\":18.8315549401,\"AUD\":1.2571475116,\"HKD\":7.823572534,\"RON\":3.7694876599,\"HRK\":6.0552252179,\"CHF\":0.9610654069,\"IDR\":13307.03754989,\"CAD\":1.2432190274,\"USD\":1.0,\"JPY\":110.621487334,\"BRL\":3.1959762157,\"PHP\":50.2997474953,\"CZK\":20.7957970188,\"NOK\":7.8771686894,\"INR\":63.5175531482,\"PLN\":3.3954549157,\"MYR\":3.9560153132,\"ZAR\":12.302191089,\"ILS\":3.399609025,\"GBP\":0.7252830496,\"SGD\":1.3214140262,\"HUF\":251.6086991936,\"EUR\":0.8145312373,\"CNY\":6.4380548994,\"TRY\":3.7828459721,\"SEK\":8.0096929217,\"RUB\":56.4333306182,\"NZD\":1.3706931661,\"KRW\":1063.5660177568,\"THB\":31.9247373137,\"BGN\":1.5930601939,\"DKK\":6.0679319052},\"base\":\"USD\",\"date\":\"2018-01-15\"}\n" + ] + } + ], + "source": [ + "url = 'https://api.exchangeratesapi.io/2018-01-15'\n", + "r = requests.get(url, params={'base':'USD'})\n", + "print(r.text)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Decoding JSON data\n", + "Now we have the rates in JSON format. We need to convert that to usable data. \n", + "The JSON library basically has two functions: \n", + "- json.loads( ) converts a text string into Python dict/list objects. \n", + "- json.dumps( ) converts dict/list objects into a string. \n", + "\n", + "We need to decode the JSON data into a dictionary, then get the rate for GBP, convert it to a float, and do a conversion." + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'MXN': 18.8315549401, 'AUD': 1.2571475116, 'HKD': 7.823572534, 'RON': 3.7694876599, 'HRK': 6.0552252179, 'CHF': 0.9610654069, 'IDR': 13307.03754989, 'CAD': 1.2432190274, 'USD': 1.0, 'JPY': 110.621487334, 'BRL': 3.1959762157, 'PHP': 50.2997474953, 'CZK': 20.7957970188, 'NOK': 7.8771686894, 'INR': 63.5175531482, 'PLN': 3.3954549157, 'MYR': 3.9560153132, 'ZAR': 12.302191089, 'ILS': 3.399609025, 'GBP': 0.7252830496, 'SGD': 1.3214140262, 'HUF': 251.6086991936, 'EUR': 0.8145312373, 'CNY': 6.4380548994, 'TRY': 3.7828459721, 'SEK': 8.0096929217, 'RUB': 56.4333306182, 'NZD': 1.3706931661, 'KRW': 1063.5660177568, 'THB': 31.9247373137, 'BGN': 1.5930601939, 'DKK': 6.0679319052}\n", + "0.7252830496\n", + "200USD = 145.05660992 GBP\n" + ] + } + ], + "source": [ + "rates_json = json.loads(r.text)['rates']\n", + "print(rates_json)\n", + "print(rates_json['GBP'])\n", + "gbp = float(rates_json['GBP'])\n", + "print('200USD = ', str(gbp * 200), 'GBP')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using Requests to GET Song Data\n", + "Every API has documentation on how to use it. \n", + "You can find the docs for this Song Data API [here.](https://documenter.getpostman.com/view/3719697/RzfarXB4)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{\"id\":12,\"name\":\"Beatles\",\"year_started\":1960,\"year_quit\":1970,\"text\":\"Beatles\"},{\"id\":14,\"name\":\"Dario G\",\"year_started\":1997,\"year_quit\":null,\"text\":\"Dario G\"},{\"id\":16,\"name\":\"Fleetwood Mac\",\"year_started\":1967,\"year_quit\":null,\"text\":\"Fleetwood Mac\"},{\"id\":17,\"name\":\"Blink 182\",\"year_started\":1992,\"year_quit\":null,\"text\":\"Blink 182\"},{\"id\":18,\"name\":\"Bloc Party\",\"year_started\":2002,\"year_quit\":null,\"text\":\"Bloc Party\"},{\"id\":19,\"name\":\"The Temper Trap\",\"year_started\":2005,\"year_quit\":null,\"text\":\"The Temper Trap\"},{\"id\":20,\"name\":\"MGMT\",\"year_started\":2002,\"year_quit\":null,\"text\":\"MGMT\"},{\"id\":21,\"name\":\"Coldplay\",\"year_started\":1996,\"year_quit\":null,\"text\":\"Coldplay\"},{\"id\":22,\"name\":\"\n" + ] + } + ], + "source": [ + "url = 'https://musicdemons.com/api/v1/artist'\n", + "r = requests.get(url)\n", + "print(r.text[:700])" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"id\":21,\"name\":\"Coldplay\",\"year_started\":1996,\"year_quit\":null,\"text\":\"Coldplay\"}\n" + ] + } + ], + "source": [ + "url = 'https://musicdemons.com/api/v1/artist/21'\n", + "r = requests.get(url)\n", + "print(r.text)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"id\":21,\"name\":\"Coldplay\",\"year_started\":1996,\"year_quit\":null,\"text\":\"Coldplay\",\"songs\":[{\"id\":1,\"title\":\"Something Just Like This\",\"released\":\"02\\/22\\/2017\",\"text\":\"Something Just Like This\",\"youtube_id\":\"FM7MFYoylVs\",\"pivot\":{\"artist_id\":21,\"song_id\":1},\"subject\":{\"id\":226,\"subjectable_id\":1,\"subjectable_type\":\"App\\\\Entities\\\\MusicDemons\\\\Song\"}},{\"id\":11,\"title\":\"Hymn For The Weekend\",\"released\":\"01\\/25\\/2016\",\"text\":\"Hymn For The Weekend\",\"youtube_id\":\"YykjpeuMNEk\",\"pivot\":{\"artist_id\":21,\"song_id\":11},\"subject\":{\"id\":233,\"subjectable_id\":11,\"subjectable_type\":\"App\\\\Entities\\\\MusicDemons\\\\Song\"}},{\"id\":78,\"title\":\"Sky Full Of Stars\",\"released\":\"05\\/02\\/2014\",\"text\":\"Sky Full Of Stars\",\n" + ] + } + ], + "source": [ + "url = 'https://musicdemons.com/api/v1/artist/21'\n", + "headers = {'with': 'songs,members'}\n", + "r = requests.get(url, headers=headers)\n", + "print(r.text[:700])" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Coldplay\n", + "Something Just Like This\n", + "Hymn For The Weekend\n", + "Sky Full Of Stars\n", + "Fix You\n", + "Brothers & Sisters\n", + "Shiver\n", + "The Scientist\n", + "Yellow\n", + "Trouble\n", + "Every Teardrop Is a Waterfall\n", + "Life in Technicolor ii\n", + "Adventure Of A Lifetime\n", + "Magic\n", + "The Hardest Part\n", + "Viva la Vida\n", + "1.36\n", + "42\n", + "A Head Full of Dreams\n", + "A Hopeful Transmission\n", + "A Message\n", + "A Rush of Blood to the Head\n", + "Princess of China\n" + ] + } + ], + "source": [ + "import json\n", + "text_json = json.loads(r.text)\n", + "print(text_json['name'])\n", + "for song in text_json['songs']:\n", + " print(song['title'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Tips on breaking down JSON \n", + "To get data out of a JSON object, which is a combination of lists and dictionaries, \n", + "just remember for lists you need a numerical index, and for key-value pairs you need a text index. \n", + "So if the object looks like this, {\"cars\":[\"id\":1,\"model\":\"Camry\"... you can access the model of the first car with text['cars'][0]['model']" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From b6cb971723d164512f0d8fb2b53bc60f94075ebc Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 4 Mar 2019 16:52:26 -0800 Subject: [PATCH 10/77] Initial upload_Numpy Jupyter Notebook and data.txt --- Numpy/Python Numpy Intro.ipynb | 558 +++++++++++++++++++++++++++++++++ Numpy/data.txt | 14 +- 2 files changed, 565 insertions(+), 7 deletions(-) create mode 100644 Numpy/Python Numpy Intro.ipynb diff --git a/Numpy/Python Numpy Intro.ipynb b/Numpy/Python Numpy Intro.ipynb new file mode 100644 index 00000000..637478b8 --- /dev/null +++ b/Numpy/Python Numpy Intro.ipynb @@ -0,0 +1,558 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Numpy Intro\n", + "An introduction to the [Python Numpy](http://www.numpy.org/) numerical python library. \n", + "The core data structure behind Numpy is the n-dimensional [Numpy Array](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html). It is 3x to 10x faster and more memory efficient than Python's lists because, similar to Java arrays, it uses contiguous blocks of memory, and all elements are the same data type so there is no type checking at runtime. The Numpy library also includes many built-in code-saving mathematical functions that can be performed on an entire array or any slice of an array with a single line of code (ie. no for loops). \n", + "Numpy n-dimensional arrays are also sometimes referred to as nd-arrays.\n", + "\n", + "**Install Numpy** using pip: pip install numpy\n", + "The convention for importing numpy is *import numpy as np*.\n", + "\n", + "import numpy as np\n", + "\n", + "### Creating a Numpy Array\n", + "There are MANY ways to instantiate a numpy array. I covered the most common ones below. [Docs here cover more constructors](https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.array-creation.html).\n", + "- Pass in a list to the array() constructor\n", + "- Use the arange function, similar to the range function but used for Numpy arrays. Uses arguments, (start, stop+1, step).\n", + "- Use linspace to create an array of n equally spaced values. Uses arguments (start, stop, number of items).\n", + "- Create an array empty, full of ones or zeros, or full of any fill value. Uses argument (shape) in the form of a tuple. \n", + "\n", + "You can pass in dtype as an optional argument for any of these. This is especially useful if you want to limit memory usage for a very large array of small integers because int8 and int16 use much less space than the default int32." + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 1 3 5 7 9 11]\n", + "[ 1 3 5 7 9 11]\n", + "[5. 5.25 5.5 5.75 6. 6.25 6.5 6.75 7. 7.25 7.5 7.75 8. ]\n", + "[[0. 0.]\n", + " [0. 0.]\n", + " [0. 0.]\n", + " [0. 0.]]\n", + "[[1 1 1]\n", + " [1 1 1]]\n", + "[88 88 88 88 88 88]\n", + "[25 30 35 40]\n", + "[[ 1 3 5]\n", + " [ 7 9 11]]\n", + "[[0 0 0]\n", + " [0 0 0]]\n" + ] + } + ], + "source": [ + "a = np.array([1,3,5,7,9,11])\n", + "print(a)\n", + "\n", + "a = np.arange(1, 12, 2) # (start, stop, step)\n", + "print(a)\n", + "\n", + "a = np.linspace(5, 8, 13) # (start, stop, number of items)\n", + "print(a)\n", + "\n", + "a = np.zeros((4, 2))\n", + "print(a)\n", + "\n", + "a = np.ones((2, 3), dtype=np.int16)\n", + "print(a)\n", + "\n", + "a = np.full((6,), 88)\n", + "print(a)\n", + "\n", + "a = np.fromstring('25 30 35 40', dtype=np.int, sep=' ')\n", + "print(a)\n", + "\n", + "a = np.array([[1,3,5],[7,9,11]])\n", + "print(a)\n", + "\n", + "b = np.zeros_like(a) # _like gives you a new array in the same shape as the argument.\n", + "print(b)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numpy Array Attributes\n", + "Get size (number of items), shape (dimensions), itemsize(bytes of memory for each item), and dtype (numpy data type). \n", + "See how many bytes of memory space the whole array uses from the product of size and itemsize. See [complete list of attributes and methods](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "6\n", + "(2, 3)\n", + "2\n", + "4\n", + "int32\n", + "24\n" + ] + } + ], + "source": [ + "print(a.size)\n", + "print(a.shape)\n", + "print(a.ndim)\n", + "print(a.itemsize)\n", + "print(a.dtype)\n", + "print(a.nbytes) # same as a.size * a.itemsize" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Indexing and Slicing\n", + "Use square brackets to get any item of an array by index. Multi-dimensional arrays can use multiple square brackets.\n", + "\n", + "There are three arguments for slicing arrays, all are optional: [start:stop:step]. \n", + " If start is left blank it defaults to 0. If stop is left blank it defaults to the end of the array. Step defaults to 1." + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 1 3 5]\n", + " [ 7 9 11]]\n", + "[ 7 9 11]\n", + "5\n", + "[]\n", + "[[1 3 5]]\n", + "[[ 7 9 11]]\n", + "[[3]\n", + " [9]]\n" + ] + } + ], + "source": [ + "print(a)\n", + "print(a[1])\n", + "print(a[0][2])\n", + "print(b[2:4])\n", + "\n", + "print(a[:1])\n", + "print(a[1:3:2])\n", + "print(a[:, 1:2]) # all elements on dimension 0, only element 1 on dimension 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reshape, Swap Axes, Flatten\n", + "See full list of [array manipulation routines](https://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-9 -8 -7]\n", + " [-6 -5 -4]]\n", + "[[-9 -6]\n", + " [-8 -5]\n", + " [-7 -4]]\n", + "[-9 -6 -8 -5 -7 -4]\n" + ] + } + ], + "source": [ + "c = np.arange(-9, -3,).reshape(2,3)\n", + "print(c)\n", + "\n", + "c = c.swapaxes(0,1)\n", + "print(c)\n", + "\n", + "c = c.flatten()\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Use dtype to Save Space\n", + "Default data types (int32 and float64) are memory hogs. If you don't need the higher precision you can save a lot of memory space and improve speed of operations by using smaller data types. For large data sets this makes a big difference." + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "int32 \n", + "400\n", + "int8 \n", + "100\n" + ] + } + ], + "source": [ + "d = np.arange(0,100)\n", + "print(d.dtype, type(d[1]))\n", + "print(d.nbytes)\n", + "\n", + "d = np.arange(0,100, dtype='int8')\n", + "print(d.dtype, type(d[1]))\n", + "print(d.nbytes)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### UpCasting, Rounding, Print Formatting\n", + "Data type of all Items is upcast to the most precise element. " + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "float64\n", + "[[1.57 2. 3. ]\n", + " [4. 5. 6. ]]\n", + "[[1.57 2. 3. ]\n", + " [4. 5. 6. ]]\n" + ] + } + ], + "source": [ + "e = np.array([(1.566666,2,3), (4,5,6)])\n", + "print(e.dtype)\n", + "\n", + "e = e.round(4)\n", + "print(e)\n", + "\n", + "np.set_printoptions(precision=2, suppress=True) # show 2 decimal places, suppress scientific notation\n", + "print(e)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numpy Data Types Available\n", + "uint is unsigned int, for positive numbers." + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'complex': [, ],\n", + " 'float': [,\n", + " ,\n", + " ],\n", + " 'int': [,\n", + " ,\n", + " ,\n", + " ,\n", + " ],\n", + " 'others': [,\n", + " ,\n", + " ,\n", + " ,\n", + " ],\n", + " 'uint': [,\n", + " ,\n", + " ,\n", + " ,\n", + " ]}\n" + ] + } + ], + "source": [ + "import pprint as pp\n", + "pp.pprint(np.sctypes)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading and Writing to Files\n", + "Can use [loadtxt](https://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html#numpy.loadtxt), or [genfromtxt](https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html#numpy.genfromtxt) to load data to load an entire file into an array at once. Genfromtxt is more fault tolerant. \n", + "Use [savetxt](https://docs.scipy.org/doc/numpy/reference/generated/numpy.savetxt.html#numpy.savetxt) to write an array to file." + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[9 3 8 7 6 1 0 4 2 5]\n", + " [1 7 4 9 2 6 8 3 5 0]\n", + " [4 8 3 9 5 7 2 6 0 1]\n", + " [1 7 4 2 5 9 6 8 0 3]\n", + " [0 7 5 2 8 6 3 4 1 9]\n", + " [5 9 1 4 7 0 3 6 8 2]]\n", + "int32\n" + ] + } + ], + "source": [ + "f = np.loadtxt('data.txt', skiprows=1, delimiter=',', dtype=np.int32)\n", + "print(f)\n", + "print(f.dtype)\n", + "\n", + "np.savetxt('data2.txt', f, delimiter=';', fmt='%d', header='a;b;c;d;e;f;g;h;i;j', comments='')" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[9 3 8 7 6 1 0 4 2 5]\n", + " [1 7 4 9 2 6 8 3 5 0]\n", + " [4 8 3 9 5 7 2 6 0 1]\n", + " [1 7 4 2 5 9 6 8 0 3]\n", + " [0 7 5 2 8 6 3 4 1 9]\n", + " [5 9 1 4 7 0 3 6 8 2]]\n" + ] + } + ], + "source": [ + "g = np.genfromtxt('data.txt', skip_header=1, delimiter=',', dtype=np.int32)\n", + "print(g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Mathematical Functions\n", + "Numpy has an extensive list of [math and scientific functions](https://docs.scipy.org/doc/numpy/reference/routines.html). \n", + "The best part is that you don't have to iterate. You can apply an operation to the entire array or a slice of an array at once." + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ True False True True True False False False False True]\n", + " [False True False True False True True False True False]\n", + " [False True False True True True False True False False]\n", + " [False True False False True True True True False False]\n", + " [False True True False True True False False False True]\n", + " [ True True False False True False False True True False]]\n", + "[[80 8 63 48 35 0 -1 15 3 24]\n", + " [ 0 48 15 80 3 35 63 8 24 -1]\n", + " [15 63 8 80 24 48 3 35 -1 0]\n", + " [ 0 48 15 3 24 80 35 63 -1 8]\n", + " [-1 48 24 3 63 35 8 15 0 80]\n", + " [24 80 0 15 48 -1 8 35 63 3]]\n" + ] + } + ], + "source": [ + "print(g > 4)\n", + "print(g ** 2 - 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "9\n", + "270\n", + "4.5\n", + "8.25\n", + "2.8722813232690143\n", + "[45 45 45 45 45 45]\n", + "[0 3 1 2 2 0 0 3 0 0]\n", + "6\n", + "0\n", + "[[6 5 8 1 7 9 4 3 2 0]\n", + " [9 0 4 7 2 8 5 1 6 3]\n", + " [8 9 6 2 0 4 7 5 1 3]\n", + " [8 0 3 9 2 4 6 1 7 5]\n", + " [0 8 3 6 7 2 5 1 4 9]\n", + " [5 2 9 6 3 0 7 4 8 1]]\n" + ] + } + ], + "source": [ + "print(g.min())\n", + "print(g.max())\n", + "print(g.sum())\n", + "print(g.mean())\n", + "print(g.var()) # variance\n", + "print(g.std()) # standard deviation\n", + "\n", + "print(g.sum(axis=1))\n", + "print(g.min(axis=0))\n", + "\n", + "print(g.argmin()) # index of min element\n", + "print(g.argmax()) # index of max element\n", + "print(g.argsort()) # returns array of indices that would put the array in sorted order" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Column Operations\n", + "Apply functions only to specific columns by slicing, or create a new array from the columns you want, then work on them. \n", + "But Beware that creating a new pointer to the same data can screw up your data if you're not careful." + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[8]\n", + " [4]\n", + " [3]\n", + " [4]\n", + " [5]\n", + " [1]]\n", + "8\n", + "298.607881119482\n", + "[[ 9 3 8 70000 6 1 0 4 2 5]\n", + " [ 1 7 4 90000 2 6 8 3 5 0]\n", + " [ 4 8 3 90000 5 7 2 6 0 1]\n", + " [ 1 7 4 20000 5 9 6 8 0 3]\n", + " [ 0 7 5 20000 8 6 3 4 1 9]\n", + " [ 5 9 1 40000 7 0 3 6 8 2]]\n" + ] + } + ], + "source": [ + "print(g[:, 2:3])\n", + "print(g[:, 2:3].max())\n", + "\n", + "col3 = g[:, 3:4] # not a copy, just a pointer to a slice of g\n", + "print(col3.std())\n", + "\n", + "col3 *= 100 # Beware: this is applied to g data\n", + "print(g)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Numpy Random Functions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "np.set_printoptions(precision=5, suppress=True) # show 5 decimal places, suppress scientific notation\n", + "h = np.random.random(6)\n", + "print(h)\n", + "\n", + "h = np.random.randint(10, 99, 8) # (low, high inclusive, size)\n", + "print(h)\n", + "\n", + "np.random.shuffle(h) # in-place shuffle\n", + "print(h)\n", + "\n", + "print(np.random.choice(h))\n", + "\n", + "h.sort() # in-place sort\n", + "print(h)" + ] + }, + { + "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.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Numpy/data.txt b/Numpy/data.txt index 9156b512..d3e350d6 100644 --- a/Numpy/data.txt +++ b/Numpy/data.txt @@ -1,7 +1,7 @@ -a, b, c, d, e, f, g, h, i, j -9, 3, 8, 7, 6, 1, 0, 4, 2, 5 -1, 7, 4, 9, 2, 6, 8, 3, 5, 0 -4, 8, 3, 9, 5, 7, 2, 6, 0, 1 -1, 7, 4, 2, 5, 9, 6, 8, 0, 3 -0, 7, 5, 2, 8, 6, 3, 4, 1, 9 -5, 9, 1, 4, 7, 0, 3, 6, 8, 2 \ No newline at end of file +a,b,c,d,e,f,g,h,i,j +9,3,8,7,6,1,0,4,2,5 +1,7,4,9,2,6,8,3,5,0 +4,8,3,9,5,7,2,6,0,1 +1,7,4,2,5,9,6,8,0,3 +0,7,5,2,8,6,3,4,1,9 +5,9,1,4,7,0,3,6,8,2 From 16fc60d5f278a8daf6c81b610cd66df738b698bb Mon Sep 17 00:00:00 2001 From: Joe James Date: Sat, 9 Mar 2019 19:18:08 -0800 Subject: [PATCH 11/77] Python Lambda Functions Jupyter initial upload --- .../Python Lambda Functions.ipynb | 364 ++++++++++++++++++ 1 file changed, 364 insertions(+) create mode 100644 Numpy/Lambda Functions/Python Lambda Functions.ipynb diff --git a/Numpy/Lambda Functions/Python Lambda Functions.ipynb b/Numpy/Lambda Functions/Python Lambda Functions.ipynb new file mode 100644 index 00000000..61c11f0c --- /dev/null +++ b/Numpy/Lambda Functions/Python Lambda Functions.ipynb @@ -0,0 +1,364 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Lambda Functions\n", + "Anonymous, single-use, or throw-away functions. \n", + "**lambda arguments : expression** \n", + "Here are some single-argument lambdas:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" + ] + } + ], + "source": [ + "add5 = lambda x: x + 5\n", + "print(add5(7))" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "64\n" + ] + } + ], + "source": [ + "square = lambda x: x * x\n", + "print(square(8))" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "3\n" + ] + } + ], + "source": [ + "get_tens = lambda p: int(p/10)%10\n", + "print(get_tens(749))\n", + "print(get_tens(836.21))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lambdas as an argument in other functions** \n", + "One of the most popular uses for lambda functions is as an argument inside sort, or filter functions. \n", + "### Sorting a List of Tuples using Lambda" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('carrots', 1.1), ('peaches', 2.45), ('eggs', 5.25), ('honey', 9.7)]\n" + ] + } + ], + "source": [ + "list1 = [('eggs', 5.25), ('honey', 9.70), ('carrots', 1.10), ('peaches', 2.45)]\n", + "list1.sort(key = lambda x: x[1])\n", + "print(list1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sorting a List of Dictionaries using Lambda" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'make': 'Tesla', 'model': 'X', 'year': 1999},\n", + " {'make': 'Mercedes', 'model': 'C350E', 'year': 2008},\n", + " {'make': 'Ford', 'model': 'Focus', 'year': 2013}]\n" + ] + } + ], + "source": [ + "import pprint as pp\n", + "list1 = [{'make':'Ford', 'model':'Focus', 'year':2013}, {'make':'Tesla', 'model':'X', 'year':1999}, {'make':'Mercedes', 'model':'C350E', 'year':2008}]\n", + "list2 = sorted(list1, key = lambda x: x['year'])\n", + "pp.pprint(list2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Filtering a List of Integers using Lambda" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6]\n" + ] + } + ], + "source": [ + "list1 = [1, 2, 3, 4, 5, 6]\n", + "list2 = list(filter(lambda x: x%2 == 0, list1))\n", + "print(list2)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 3, 5]\n" + ] + } + ], + "source": [ + "odds = lambda x: x%2 == 1\n", + "list1 = [1, 2, 3, 4, 5, 6]\n", + "list2 = list(filter(odds, list1))\n", + "print(list2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lambda Function on a List using Map\n", + "Python's map function applies the lambda to every element in the list." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25, 36]\n" + ] + } + ], + "source": [ + "list1 = [1, 2, 3, 4, 5, 6]\n", + "list2 = list(map(lambda x: x ** 2, list1))\n", + "print(list2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lambda Conditionals\n", + "**lambda args: a if boolean_expression else b** " + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "starts_with_J = lambda x: True if x.startswith('J') else False\n", + "print(starts_with_J('Joey'))" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "and\n" + ] + } + ], + "source": [ + "wordb4 = lambda s, w: s.split()[s.split().index(w)-1] if w in s else None\n", + "sentence = 'Four score and seven years ago'\n", + "print(wordb4(sentence, 'seven'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lambdas on DataTime Objects\n", + "You sometimes want to get just the year, month, date or time for comparision. \n", + "This would typically be most useful as a parameter in sort or filter functions." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2019-03-07 19:36:58.442863\n", + "2019\n" + ] + } + ], + "source": [ + "import datetime\n", + "\n", + "now = datetime.datetime.now()\n", + "print(now)\n", + "year = lambda x: x.year\n", + "print(year(now))" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4096\n", + "125\n" + ] + } + ], + "source": [ + "def do_something(f, val):\n", + " return f(val)\n", + "\n", + "func = lambda x: x**3\n", + "print(func(16))\n", + "print(do_something(func, 5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extreme Lambdas\n", + "This is probably a stretch -- you shouldn't be trying to do this much with Lambdas. \n", + "Some things are better done in a regular function. But this shows what's possible with Lambdas." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n", + "False\n", + "True\n", + "-1\n", + "-21.67 \n" + ] + } + ], + "source": [ + "isnum = lambda q: q.replace('.','',1).isdigit()\n", + "print(isnum('25983'))\n", + "print(isnum('3.1415'))\n", + "print(isnum('T57'))\n", + "print(isnum('-16'))\n", + "\n", + "is_num = lambda r: isnum(r[1:]) if r[0]=='-' else isnum(r)\n", + "print(is_num('-16.4'))\n", + "\n", + "tonum = lambda s: float(s) if is_num(s) else -1\n", + "print(tonum('30y'))\n", + "print(tonum('-21.67'), type(tonum('-21.67')))" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 7a191a168288e1230b9f40998112770e1fe11413 Mon Sep 17 00:00:00 2001 From: Joe James Date: Sat, 9 Mar 2019 19:20:09 -0800 Subject: [PATCH 12/77] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b6b87efd..6f0d92be 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,4 @@ Feel free to post any comments on my YouTube channel. Joe James. Fremont, California. -Copyright (C) 2015-2018, Joe James +Copyright (C) 2015-2019, Joe James From e74d1d6fc5f3e1f2e0d752b1eb757d871706559b Mon Sep 17 00:00:00 2001 From: Joe James Date: Sat, 9 Mar 2019 19:22:44 -0800 Subject: [PATCH 13/77] Python Lambda Functions Jupyter nb initial upload --- .../Python Lambda Functions.ipynb | 364 ++++++++++++++++++ 1 file changed, 364 insertions(+) create mode 100644 Lambda Functions/Python Lambda Functions.ipynb diff --git a/Lambda Functions/Python Lambda Functions.ipynb b/Lambda Functions/Python Lambda Functions.ipynb new file mode 100644 index 00000000..61c11f0c --- /dev/null +++ b/Lambda Functions/Python Lambda Functions.ipynb @@ -0,0 +1,364 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Lambda Functions\n", + "Anonymous, single-use, or throw-away functions. \n", + "**lambda arguments : expression** \n", + "Here are some single-argument lambdas:" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "12\n" + ] + } + ], + "source": [ + "add5 = lambda x: x + 5\n", + "print(add5(7))" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "64\n" + ] + } + ], + "source": [ + "square = lambda x: x * x\n", + "print(square(8))" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "3\n" + ] + } + ], + "source": [ + "get_tens = lambda p: int(p/10)%10\n", + "print(get_tens(749))\n", + "print(get_tens(836.21))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Lambdas as an argument in other functions** \n", + "One of the most popular uses for lambda functions is as an argument inside sort, or filter functions. \n", + "### Sorting a List of Tuples using Lambda" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('carrots', 1.1), ('peaches', 2.45), ('eggs', 5.25), ('honey', 9.7)]\n" + ] + } + ], + "source": [ + "list1 = [('eggs', 5.25), ('honey', 9.70), ('carrots', 1.10), ('peaches', 2.45)]\n", + "list1.sort(key = lambda x: x[1])\n", + "print(list1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sorting a List of Dictionaries using Lambda" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[{'make': 'Tesla', 'model': 'X', 'year': 1999},\n", + " {'make': 'Mercedes', 'model': 'C350E', 'year': 2008},\n", + " {'make': 'Ford', 'model': 'Focus', 'year': 2013}]\n" + ] + } + ], + "source": [ + "import pprint as pp\n", + "list1 = [{'make':'Ford', 'model':'Focus', 'year':2013}, {'make':'Tesla', 'model':'X', 'year':1999}, {'make':'Mercedes', 'model':'C350E', 'year':2008}]\n", + "list2 = sorted(list1, key = lambda x: x['year'])\n", + "pp.pprint(list2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Filtering a List of Integers using Lambda" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6]\n" + ] + } + ], + "source": [ + "list1 = [1, 2, 3, 4, 5, 6]\n", + "list2 = list(filter(lambda x: x%2 == 0, list1))\n", + "print(list2)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 3, 5]\n" + ] + } + ], + "source": [ + "odds = lambda x: x%2 == 1\n", + "list1 = [1, 2, 3, 4, 5, 6]\n", + "list2 = list(filter(odds, list1))\n", + "print(list2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lambda Function on a List using Map\n", + "Python's map function applies the lambda to every element in the list." + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 4, 9, 16, 25, 36]\n" + ] + } + ], + "source": [ + "list1 = [1, 2, 3, 4, 5, 6]\n", + "list2 = list(map(lambda x: x ** 2, list1))\n", + "print(list2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lambda Conditionals\n", + "**lambda args: a if boolean_expression else b** " + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "starts_with_J = lambda x: True if x.startswith('J') else False\n", + "print(starts_with_J('Joey'))" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "and\n" + ] + } + ], + "source": [ + "wordb4 = lambda s, w: s.split()[s.split().index(w)-1] if w in s else None\n", + "sentence = 'Four score and seven years ago'\n", + "print(wordb4(sentence, 'seven'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Lambdas on DataTime Objects\n", + "You sometimes want to get just the year, month, date or time for comparision. \n", + "This would typically be most useful as a parameter in sort or filter functions." + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2019-03-07 19:36:58.442863\n", + "2019\n" + ] + } + ], + "source": [ + "import datetime\n", + "\n", + "now = datetime.datetime.now()\n", + "print(now)\n", + "year = lambda x: x.year\n", + "print(year(now))" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4096\n", + "125\n" + ] + } + ], + "source": [ + "def do_something(f, val):\n", + " return f(val)\n", + "\n", + "func = lambda x: x**3\n", + "print(func(16))\n", + "print(do_something(func, 5))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Extreme Lambdas\n", + "This is probably a stretch -- you shouldn't be trying to do this much with Lambdas. \n", + "Some things are better done in a regular function. But this shows what's possible with Lambdas." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "True\n", + "False\n", + "False\n", + "True\n", + "-1\n", + "-21.67 \n" + ] + } + ], + "source": [ + "isnum = lambda q: q.replace('.','',1).isdigit()\n", + "print(isnum('25983'))\n", + "print(isnum('3.1415'))\n", + "print(isnum('T57'))\n", + "print(isnum('-16'))\n", + "\n", + "is_num = lambda r: isnum(r[1:]) if r[0]=='-' else isnum(r)\n", + "print(is_num('-16.4'))\n", + "\n", + "tonum = lambda s: float(s) if is_num(s) else -1\n", + "print(tonum('30y'))\n", + "print(tonum('-21.67'), type(tonum('-21.67')))" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 3785f2d0dde0af17e8b0f694fa22cb4b02cc20de Mon Sep 17 00:00:00 2001 From: Joe James Date: Sat, 9 Mar 2019 19:26:30 -0800 Subject: [PATCH 14/77] Delete Python Lambda Functions.ipynb --- .../Python Lambda Functions.ipynb | 364 ------------------ 1 file changed, 364 deletions(-) delete mode 100644 Numpy/Lambda Functions/Python Lambda Functions.ipynb diff --git a/Numpy/Lambda Functions/Python Lambda Functions.ipynb b/Numpy/Lambda Functions/Python Lambda Functions.ipynb deleted file mode 100644 index 61c11f0c..00000000 --- a/Numpy/Lambda Functions/Python Lambda Functions.ipynb +++ /dev/null @@ -1,364 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Python Lambda Functions\n", - "Anonymous, single-use, or throw-away functions. \n", - "**lambda arguments : expression** \n", - "Here are some single-argument lambdas:" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "12\n" - ] - } - ], - "source": [ - "add5 = lambda x: x + 5\n", - "print(add5(7))" - ] - }, - { - "cell_type": "code", - "execution_count": 58, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "64\n" - ] - } - ], - "source": [ - "square = lambda x: x * x\n", - "print(square(8))" - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4\n", - "3\n" - ] - } - ], - "source": [ - "get_tens = lambda p: int(p/10)%10\n", - "print(get_tens(749))\n", - "print(get_tens(836.21))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Lambdas as an argument in other functions** \n", - "One of the most popular uses for lambda functions is as an argument inside sort, or filter functions. \n", - "### Sorting a List of Tuples using Lambda" - ] - }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('carrots', 1.1), ('peaches', 2.45), ('eggs', 5.25), ('honey', 9.7)]\n" - ] - } - ], - "source": [ - "list1 = [('eggs', 5.25), ('honey', 9.70), ('carrots', 1.10), ('peaches', 2.45)]\n", - "list1.sort(key = lambda x: x[1])\n", - "print(list1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Sorting a List of Dictionaries using Lambda" - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[{'make': 'Tesla', 'model': 'X', 'year': 1999},\n", - " {'make': 'Mercedes', 'model': 'C350E', 'year': 2008},\n", - " {'make': 'Ford', 'model': 'Focus', 'year': 2013}]\n" - ] - } - ], - "source": [ - "import pprint as pp\n", - "list1 = [{'make':'Ford', 'model':'Focus', 'year':2013}, {'make':'Tesla', 'model':'X', 'year':1999}, {'make':'Mercedes', 'model':'C350E', 'year':2008}]\n", - "list2 = sorted(list1, key = lambda x: x['year'])\n", - "pp.pprint(list2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Filtering a List of Integers using Lambda" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[2, 4, 6]\n" - ] - } - ], - "source": [ - "list1 = [1, 2, 3, 4, 5, 6]\n", - "list2 = list(filter(lambda x: x%2 == 0, list1))\n", - "print(list2)" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 3, 5]\n" - ] - } - ], - "source": [ - "odds = lambda x: x%2 == 1\n", - "list1 = [1, 2, 3, 4, 5, 6]\n", - "list2 = list(filter(odds, list1))\n", - "print(list2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lambda Function on a List using Map\n", - "Python's map function applies the lambda to every element in the list." - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[1, 4, 9, 16, 25, 36]\n" - ] - } - ], - "source": [ - "list1 = [1, 2, 3, 4, 5, 6]\n", - "list2 = list(map(lambda x: x ** 2, list1))\n", - "print(list2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lambda Conditionals\n", - "**lambda args: a if boolean_expression else b** " - ] - }, - { - "cell_type": "code", - "execution_count": 70, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], - "source": [ - "starts_with_J = lambda x: True if x.startswith('J') else False\n", - "print(starts_with_J('Joey'))" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "and\n" - ] - } - ], - "source": [ - "wordb4 = lambda s, w: s.split()[s.split().index(w)-1] if w in s else None\n", - "sentence = 'Four score and seven years ago'\n", - "print(wordb4(sentence, 'seven'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Lambdas on DataTime Objects\n", - "You sometimes want to get just the year, month, date or time for comparision. \n", - "This would typically be most useful as a parameter in sort or filter functions." - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2019-03-07 19:36:58.442863\n", - "2019\n" - ] - } - ], - "source": [ - "import datetime\n", - "\n", - "now = datetime.datetime.now()\n", - "print(now)\n", - "year = lambda x: x.year\n", - "print(year(now))" - ] - }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "4096\n", - "125\n" - ] - } - ], - "source": [ - "def do_something(f, val):\n", - " return f(val)\n", - "\n", - "func = lambda x: x**3\n", - "print(func(16))\n", - "print(do_something(func, 5))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Extreme Lambdas\n", - "This is probably a stretch -- you shouldn't be trying to do this much with Lambdas. \n", - "Some things are better done in a regular function. But this shows what's possible with Lambdas." - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n", - "True\n", - "False\n", - "False\n", - "True\n", - "-1\n", - "-21.67 \n" - ] - } - ], - "source": [ - "isnum = lambda q: q.replace('.','',1).isdigit()\n", - "print(isnum('25983'))\n", - "print(isnum('3.1415'))\n", - "print(isnum('T57'))\n", - "print(isnum('-16'))\n", - "\n", - "is_num = lambda r: isnum(r[1:]) if r[0]=='-' else isnum(r)\n", - "print(is_num('-16.4'))\n", - "\n", - "tonum = lambda s: float(s) if is_num(s) else -1\n", - "print(tonum('30y'))\n", - "print(tonum('-21.67'), type(tonum('-21.67')))" - ] - } - ], - "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.7.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 51354d1dd4a362a33aaa044e158ac8c2eb51c923 Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 11 Mar 2019 19:42:12 -0700 Subject: [PATCH 15/77] Initial Upload - Datasets --- Datasets.txt | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Datasets.txt diff --git a/Datasets.txt b/Datasets.txt new file mode 100644 index 00000000..ce44cedb --- /dev/null +++ b/Datasets.txt @@ -0,0 +1,75 @@ +Data.gov +NOAA - https://www.ncdc.noaa.gov/cdo-web/ + atmospheric, ocean +Bureau of Labor Statistics - https://www.bls.gov/data/ + employment, inflation +US Census Data - https://www.census.gov/data.html + demographics, income, geo, time series +Bureau of Economic Analysis - http://www.bea.gov/data/gdp/gross-domestic-product + GDP, corporate profits, savings rates +Federal Reserve - https://fred.stlouisfed.org/ + curency, interest rates, payroll +Quandl - https://www.quandl.com/ + financial and economic + +Data.gov.uk +UK Dataservice - https://www.ukdataservice.ac.uk + Census data and much more +WorldBank - https://datacatalog.worldbank.org + census, demographics, geographic, health, income, GDP +IMF - https://www.imf.org/en/Data + economic, currency, finance, commodities, time series +OpenData.go.ke + Kenya govt data on agriculture, education, water, health, finance, … +https://data.world/ +Open Data for Africa - http://dataportal.opendataforafrica.org/ + agriculture, energy, environment, industry, … +Kaggle - https://www.kaggle.com/datasets + A huge variety of different datasets +Amazon Reviews - https://snap.stanford.edu/data/web-Amazon.html + 35M product reviews from 6.6M users +GroupLens - https://grouplens.org/datasets/movielens/ + 20M movie ratings +Yelp Reviews - https://www.yelp.com/dataset + 6.7M reviews, pictures, businesses +IMDB Reviews - http://ai.stanford.edu/~amaas/data/sentiment/ + 25k Movie reviews +Twitter Sentiment 140 - http://help.sentiment140.com/for-students/ + 160k Tweets +Airbnb - http://insideairbnb.com/get-the-data.html + A TON of data by geo +UCI ML Datasets - http://mlr.cs.umass.edu/ml/ + iris, wine, abalone, heart disease, poker hands, …. +Enron Email dataset - http://www.cs.cmu.edu/~enron/ + 500k emails from 150 people + From 2001 energy scandal. See the movie: The Smartest Guys in the Room. +Spambase - https://archive.ics.uci.edu/ml/datasets/Spambase + Emails +Jeopardy Questions - https://www.reddit.com/r/datasets/comments/1uyd0t/200000_jeopardy_questions_in_a_json_file/ + 200k Questions and answers in json +Gutenberg Ebooks - http://www.gutenberg.org/wiki/Gutenberg:Offline_Catalogs + Large collection of books + +IMAGES +ImageNet - http://image-net.org + 14M images of objects +Google - https://ai.googleblog.com/2016/09/introducing-open-images-dataset.html + 9M image URLs with labels +Microsoft Coco - http://cocodataset.org + 330k images, most labeled +Labelled Faces in the Wild - http://vis-www.cs.umass.edu/lfw/ + 13k face images with names +Stanford Dogs - http://vision.stanford.edu/aditya86/ImageNetDogs/ + 120 dog breeds, 20k images + +AUTONOMOUS CARS +Berkeley DeepDrive - https://bdd-data.berkeley.edu/ + Massive dataset including 100k videos with 1100 hours of hd driving +Belgian Traffic Signs - http://www.vision.ee.ethz.ch/~timofter/traffic_signs/ + 10k images +Bosch Small Traffic Signals - https://hci.iwr.uni-heidelberg.de/node/6132 + 5k training and 8k test images +WPI Traffic Light, Pedestrian, Lane-Keeping - http://computing.wpi.edu/dataset.html + 30GB of training and test data from Worcester, Mass +UCSD Lisa - http://cvrr.ucsd.edu/LISA/datasets.html + Vehicle detection, traffic signals From 56793e3780c99863e1d5215b9604109d74ff6209 Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 14 Mar 2019 19:23:31 -0700 Subject: [PATCH 16/77] Happy Pi Day - calculating Pi --- Happy Pi Day.ipynb | 105 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 Happy Pi Day.ipynb diff --git a/Happy Pi Day.ipynb b/Happy Pi Day.ipynb new file mode 100644 index 00000000..fd0c8e51 --- /dev/null +++ b/Happy Pi Day.ipynb @@ -0,0 +1,105 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Happy Pi Day!\n", + "\n", + "### Two Ways to Calculate Pi: \n", + "Real pi = 3.14159265359\n", + "\n", + "### 1. percentage of unit square random points that lie in unit circle\n", + "This method is only as good as our random number generator. And with number of iterations the accuracy improves, up to about 1 million." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.1419916\n" + ] + } + ], + "source": [ + "import random\n", + "in_square = in_circle = pi = 0\n", + "\n", + "for i in range(10000000):\n", + " x = random.random()\n", + " y = random.random()\n", + " dist = (x*x + y*y) ** 0.5\n", + "\n", + " in_square += 1\n", + " if dist <= 1.0:\n", + " in_circle += 1\n", + " \n", + "pi = 4 * in_circle / in_square\n", + "print(pi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. using series addition\n", + "pi = 4/1 - 4/3 + 4/5 - 4/7 + 4/9 - 4/11 + 4/13 - 4/15 ... \n", + "This method is the more accurate of the two, and is faster. Its accuracy only depends on the size of n." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "3.1415924535897797\n" + ] + } + ], + "source": [ + "pi = 0.0\n", + "for i in range(1, 10000000, 4):\n", + " pi += 4/i\n", + " pi -= 4/(i+2)\n", + "print(pi)" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From c289db10558858be576f8e6d5af1316a288fdb10 Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 18 Mar 2019 20:14:08 -0700 Subject: [PATCH 17/77] BeautifulSoup Jupyter notebook upload --- ... BeautifulSoup Web Scraping Tutorial.ipynb | 514 ++++++++++++++++++ 1 file changed, 514 insertions(+) create mode 100644 Web Data Mining/Python BeautifulSoup Web Scraping Tutorial.ipynb diff --git a/Web Data Mining/Python BeautifulSoup Web Scraping Tutorial.ipynb b/Web Data Mining/Python BeautifulSoup Web Scraping Tutorial.ipynb new file mode 100644 index 00000000..f7d55aa9 --- /dev/null +++ b/Web Data Mining/Python BeautifulSoup Web Scraping Tutorial.ipynb @@ -0,0 +1,514 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python BeautifulSoup Web Scraping Tutorial\n", + "Learn to scrape data from the web using the Python BeautifulSoup bs4 library. \n", + "BeautifulSoup makes it easy to parse useful data out of an HTML page. \n", + "First install the bs4 library on your system by running at the command line, \n", + "*pip install beautifulsoup4* or *easy_install beautifulsoup4* (or bs4) \n", + "See [BeautifulSoup official documentation](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) for the complete set of functions.\n", + "\n", + "### Import requests so we can fetch the html content of the webpage\n", + "You can see our example page has about 28k characters." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "28556\n" + ] + } + ], + "source": [ + "import requests\n", + "r = requests.get('https://www.usclimatedata.com/climate/united-states/us')\n", + "print(len(r.text))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Import BeautifulSoup, and convert your HTML into a bs4 object\n", + "Now we can access specific HTML tags on the page using dot, just like a JSON object." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Climate United States - normals and averages\n", + "Climate United States - normals and averages\n" + ] + } + ], + "source": [ + "from bs4 import BeautifulSoup\n", + "soup = BeautifulSoup(r.text)\n", + "print(soup.title)\n", + "print(soup.title.string)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Drill into the bs4 object to access page contents\n", + "soup.p will give you the contents of the first paragraph tag on the page. \n", + "soup.a gives you anchors / links on the page. \n", + "Get contents of an attribute inside an HTML tag using square brackets and perentheses. \n", + "Use .parent to get the parent object, and .next_sibling to get the next peer object. \n", + "**Use your browser's *inspect element* feature to find the tag for the data you want.**" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "

You are here: United States

\n", + "You are here: United States\n", + "\n", + "\"US\n", + "\n", + "US Climate Data on Facebook\n", + "\n", + "
\n" + ] + } + ], + "source": [ + "print(soup.p)\n", + "print(soup.p.text)\n", + "print(soup.a)\n", + "print(soup.a['title'])\n", + "print()\n", + "print(soup.p.parent)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prettify() is handy for formatted printing \n", + "but note this works only on bs4 objects, not on strings, dicts or lists. For those you need to import pprint." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "print(soup.p.parent.prettify())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### We need all the state links on this page\n", + "First we find_all anchor tags, and print out the href attribute, which is the actual link url. \n", + "But we see the result includes some links we don't want, so we need to filter those out." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://www.facebook.com/yourweatherservice/n", + "https://twitter.com/usclimatedata/n", + "http://www.usclimatedata.com/n", + "/climate/united-states/us\n", + "#summary\n", + "/climate/united-states/us\n", + "#\n", + "#\n", + "/climate/alabama/united-states/3170\n", + "/climate/kentucky/united-states/3187\n", + "/climate/north-dakota/united-states/3204\n", + "/climate/alaska/united-states/3171\n", + "/climate/louisiana/united-states/3188\n", + "/climate/ohio/united-states/3205\n", + "/climate/arizona/united-states/3172\n", + "/climate/maine/united-states/3189\n", + "/climate/oklahoma/united-states/3206\n", + "/climate/arkansas/united-states/3173\n", + "/climate/maryland/united-states/1872\n", + "/climate/oregon/united-states/3207\n", + "/climate/california/united-states/3174\n", + "/climate/massachusetts/united-states/3191\n", + "/climate/pennsylvania/united-states/3208\n", + "/climate/colorado/united-states/3175\n", + "/climate/michigan/united-states/3192\n", + "/climate/rhode-island/united-states/3209\n", + "/climate/connecticut/united-states/3176\n", + "/climate/minnesota/united-states/3193\n", + "/climate/south-carolina/united-states/3210\n", + "/climate/delaware/united-states/3177\n", + "/climate/mississippi/united-states/3194\n", + "/climate/south-dakota/united-states/3211\n", + "/climate/district-of-columbia/united-states/3178\n", + "/climate/missouri/united-states/3195\n", + "/climate/tennessee/united-states/3212\n", + "/climate/florida/united-states/3179\n", + "/climate/montana/united-states/919\n", + "/climate/texas/united-states/3213\n", + "/climate/georgia/united-states/3180\n", + "/climate/nebraska/united-states/3197\n", + "/climate/utah/united-states/3214\n", + "/climate/hawaii/united-states/3181\n", + "/climate/nevada/united-states/3198\n", + "/climate/vermont/united-states/3215\n", + "/climate/idaho/united-states/3182\n", + "/climate/new-hampshire/united-states/3199\n", + "/climate/virginia/united-states/3216\n", + "/climate/illinois/united-states/3183\n", + "/climate/new-jersey/united-states/3200\n", + "/climate/washington/united-states/3217\n", + "/climate/indiana/united-states/3184\n", + "/climate/new-mexico/united-states/3201\n", + "/climate/west-virginia/united-states/3218\n", + "/climate/iowa/united-states/3185\n", + "/climate/new-york/united-states/3202\n", + "/climate/wisconsin/united-states/3219\n", + "/climate/kansas/united-states/3186\n", + "/climate/north-carolina/united-states/3203\n", + "/climate/wyoming/united-states/3220\n", + "https://www.yourweatherservice.com/n", + "https://www.climatedata.eu/n", + "https://www.weernetwerk.nl/n", + "/about-us.php\n", + "/disclaimer.php\n", + "/cookies.php\n" + ] + } + ], + "source": [ + "for link in soup.find_all('a'):\n", + " print(link.get('href'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Filter urls using string functions\n", + "We just add an *if* to check conditions, then add the good ones to a list. \n", + "In the end we get 51 state links, including Washington DC." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "51\n" + ] + } + ], + "source": [ + "base_url = 'https://www.usclimatedata.com/'\n", + "state_links = []\n", + "for link in soup.find_all('a'):\n", + " url = link.get('href')\n", + " if url and '/climate/' in url and '/climate/united-states/us' not in url:\n", + " state_links.append(url)\n", + "print(len(state_links))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test getting the data for one state\n", + "then print the title for that page." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Climate Ohio - temperature, rainfall and average\n" + ] + } + ], + "source": [ + "r = requests.get(base_url + state_links[5])\n", + "soup = BeautifulSoup(r.text)\n", + "print(soup.title.string)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### The data we need is in *tr* tags\n", + "But look, there are 58 tr tags on the page, and we only want 2 of them - the *Average high* rows." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "58\n" + ] + } + ], + "source": [ + "rows = soup.find_all('tr')\n", + "print(len(rows))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Filter rows, and add temp data to a list\n", + "We use a list comprehension to filter the rows. \n", + "Then we have only 2 rows left. \n", + "We iterate through those 2 rows, and add all the temps from data cells (td) into a list." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "['36', '40', '52', '63', '73', '82', '85', '84', '77', '65', '52', '41']\n" + ] + } + ], + "source": [ + "rows = [row for row in rows if 'Average high' in str(row)]\n", + "print(len(rows))\n", + "\n", + "high_temps = []\n", + "for row in rows:\n", + " tds = row.find_all('td')\n", + " for i in range(1,7):\n", + " high_temps.append(tds[i].text)\n", + "print(high_temps)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get the name of the State\n", + "First attempt we just split the title string into a list, and grab the second word. \n", + "But that doesn't work for 2-word states like New York and North Carolina. \n", + "So instead we slice the string from first blank to the hyphen. " + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wyoming\n", + "Wyoming\n" + ] + } + ], + "source": [ + "state = soup.title.string.split()[1]\n", + "print(state)\n", + "s = soup.title.string\n", + "state = s[s.find(' '):s.find('-')].strip()\n", + "print(state)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add state name and temp list to the data dictionary\n", + "For a single state, this is what our scraped data looks like. \n", + "In this example we only got monthly highs by state, but you could drill into cities, and could get lows and precipitation. " + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Ohio': ['36', '40', '52', '63', '73', '82', '85', '84', '77', '65', '52', '41']}\n" + ] + } + ], + "source": [ + "data = {}\n", + "data[state] = high_temps\n", + "print(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Put it all together and iterate 51 states\n", + "We loop through our 51-state list, and get high temp data for each state, and add it to the data dict. \n", + "This combines all our work above into a single for loop. \n", + "The result is a dict with 51 states and a list of monthly highs for each." + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Alabama': ['57', '62', '70', '77', '84', '90', '92', '92', '87', '78', '69', '60'], 'Kentucky': ['40', '45', '55', '66', '75', '83', '87', '86', '79', '68', '55', '44'], 'North Dakota': ['23', '28', '40', '57', '68', '77', '85', '83', '72', '58', '40', '26'], 'Alaska': ['23', '27', '34', '44', '56', '63', '65', '64', '55', '40', '28', '25'], 'Louisiana': ['62', '65', '72', '78', '85', '89', '91', '91', '87', '80', '72', '64'], 'Ohio': ['36', '40', '52', '63', '73', '82', '85', '84', '77', '65', '52', '41'], 'Arizona': ['67', '71', '77', '85', '95', '104', '106', '104', '100', '89', '76', '66'], 'Maine': ['28', '32', '40', '53', '65', '74', '79', '78', '70', '57', '45', '33'], 'Oklahoma': ['50', '55', '63', '72', '80', '88', '94', '93', '85', '73', '62', '51'], 'Arkansas': ['51', '55', '64', '73', '81', '89', '92', '93', '86', '75', '63', '52'], 'Maryland': ['42', '46', '54', '65', '75', '85', '89', '87', '80', '68', '58', '46'], 'Oregon': ['48', '52', '56', '61', '68', '74', '82', '82', '77', '64', '53', '46'], 'California': ['54', '60', '65', '71', '80', '87', '92', '91', '87', '78', '64', '54'], 'Massachusetts': ['36', '39', '45', '56', '66', '76', '81', '80', '72', '61', '51', '41'], 'Pennsylvania': ['40', '44', '53', '64', '74', '83', '87', '85', '78', '67', '56', '45'], 'Colorado': ['45', '46', '54', '61', '72', '82', '90', '88', '79', '66', '52', '45'], 'Michigan': ['30', '33', '44', '58', '69', '78', '82', '80', '73', '60', '47', '34'], 'Rhode Island': ['37', '40', '48', '59', '68', '78', '83', '81', '74', '63', '53', '42'], 'Connecticut': ['37', '40', '47', '58', '68', '77', '82', '81', '74', '63', '53', '42'], 'Minnesota': ['26', '31', '43', '58', '71', '80', '85', '82', '73', '59', '42', '29'], 'South Carolina': ['56', '60', '68', '76', '84', '90', '93', '91', '85', '76', '67', '58'], 'Delaware': ['43', '47', '55', '66', '75', '83', '87', '85', '79', '69', '58', '47'], 'Mississippi': ['56', '60', '69', '76', '83', '89', '92', '92', '87', '77', '67', '58'], 'South Dakota': ['22', '27', '39', '57', '69', '78', '84', '82', '72', '58', '39', '25'], 'District of Columbia': ['42', '44', '53', '64', '75', '83', '87', '84', '78', '67', '55', '45'], 'Missouri': ['40', '45', '56', '67', '75', '83', '88', '88', '80', '69', '56', '43'], 'Tennessee': ['50', '55', '64', '73', '81', '89', '92', '91', '85', '74', '63', '52'], 'Florida': ['64', '67', '74', '80', '87', '91', '92', '92', '88', '81', '73', '65'], 'Montana': ['33', '39', '48', '58', '67', '76', '86', '85', '73', '59', '43', '32'], 'Texas': ['62', '65', '72', '80', '87', '92', '96', '97', '91', '82', '71', '63'], 'Georgia': ['52', '57', '64', '72', '81', '86', '90', '88', '82', '73', '64', '54'], 'Nebraska': ['32', '37', '50', '63', '73', '84', '88', '86', '77', '64', '48', '36'], 'Utah': ['38', '44', '53', '61', '71', '82', '90', '89', '78', '65', '50', '40'], 'Hawaii': ['80', '80', '81', '83', '85', '87', '88', '89', '89', '87', '84', '81'], 'Nevada': ['45', '50', '57', '63', '71', '81', '90', '88', '80', '68', '54', '45'], 'Vermont': ['27', '31', '40', '55', '67', '76', '81', '79', '70', '57', '46', '33'], 'Idaho': ['38', '45', '55', '62', '72', '81', '91', '90', '79', '65', '48', '38'], 'New Hampshire': ['31', '35', '44', '57', '69', '77', '82', '81', '73', '60', '48', '36'], 'Virginia': ['47', '51', '60', '70', '78', '86', '90', '88', '81', '71', '61', '51'], 'Illinois': ['32', '36', '46', '59', '70', '81', '84', '82', '75', '63', '48', '36'], 'New Jersey': ['39', '42', '51', '62', '72', '82', '86', '84', '77', '65', '55', '44'], 'Washington': ['47', '50', '54', '58', '65', '70', '76', '76', '71', '60', '51', '46'], 'Indiana': ['35', '40', '51', '63', '73', '82', '85', '83', '77', '65', '52', '39'], 'New Mexico': ['44', '48', '56', '65', '74', '83', '86', '83', '78', '67', '53', '43'], 'West Virginia': ['42', '47', '56', '68', '75', '82', '85', '84', '78', '68', '57', '46'], 'Iowa': ['31', '36', '49', '62', '72', '82', '86', '84', '76', '63', '48', '34'], 'New York': ['39', '42', '50', '60', '71', '79', '85', '83', '76', '65', '54', '44'], 'Wisconsin': ['29', '33', '42', '54', '65', '75', '80', '78', '71', '59', '46', '33'], 'Kansas': ['40', '45', '56', '67', '76', '85', '89', '89', '80', '68', '55', '42'], 'North Carolina': ['51', '55', '63', '72', '79', '86', '89', '87', '81', '72', '62', '53'], 'Wyoming': ['40', '40', '47', '55', '65', '75', '83', '81', '72', '59', '47', '38']}\n" + ] + } + ], + "source": [ + "data = {}\n", + "for state_link in state_links:\n", + " url = base_url + state_link\n", + " r = requests.get(base_url + state_link)\n", + " soup = BeautifulSoup(r.text)\n", + " rows = soup.find_all('tr')\n", + " rows = [row for row in rows if 'Average high' in str(row)]\n", + " high_temps = []\n", + " for row in rows:\n", + " tds = row.find_all('td')\n", + " for i in range(1,7):\n", + " high_temps.append(tds[i].text)\n", + " s = soup.title.string\n", + " state = s[s.find(' '):s.find('-')].strip()\n", + " data[state] = high_temps\n", + "print(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Save to CSV file\n", + "Lastly, we might want to write all this data to a CSV file. \n", + "Here's a quick easy way to do that." + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "import csv\n", + "\n", + "with open('high_temps.csv','w') as f:\n", + " w = csv.writer(f)\n", + " w.writerows(data.items())" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 4230ef2751fd9a3fdc07963410706b26b7512a32 Mon Sep 17 00:00:00 2001 From: Abdelrahman Ahmed Date: Wed, 17 Apr 2019 14:27:05 +0200 Subject: [PATCH 18/77] updated add_neighbor and add_edge method so that the graph is weighted --- graph_adjacency-list.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/graph_adjacency-list.py b/graph_adjacency-list.py index fec2f958..ebc3f47c 100644 --- a/graph_adjacency-list.py +++ b/graph_adjacency-list.py @@ -4,9 +4,9 @@ def __init__(self, n): self.name = n self.neighbors = list() - def add_neighbor(self, v): + def add_neighbor(self, v, weight): if v not in self.neighbors: - self.neighbors.append(v) + self.neighbors.append((v, weight)) self.neighbors.sort() class Graph: @@ -19,11 +19,11 @@ def add_vertex(self, vertex): else: return False - def add_edge(self, u, v): + def add_edge(self, u, v, weight=0): if u in self.vertices and v in self.vertices: # my YouTube video shows a silly for loop here, but this is a much faster way to do it - self.vertices[u].add_neighbor(v) - self.vertices[v].add_neighbor(u) + self.vertices[u].add_neighbor(v, weight) + self.vertices[v].add_neighbor(u, weight) return True else: return False From e3b3d1963980bbf85b4c3ce375b3482623d02171 Mon Sep 17 00:00:00 2001 From: tomas2310328 Date: Wed, 17 Apr 2019 14:45:34 +0200 Subject: [PATCH 19/77] Adding Keys function to return all values in hashtable --- HashMap.py | 93 +++++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 43 deletions(-) diff --git a/HashMap.py b/HashMap.py index 445509c5..c5808e00 100644 --- a/HashMap.py +++ b/HashMap.py @@ -1,55 +1,62 @@ # Hash Map class HashMap: - def __init__(self): - self.size = 6 - self.map = [None] * self.size + def __init__(self): + self.size = 6 + self.map = [None] * self.size - def _get_hash(self, key): - hash = 0 - for char in str(key): - hash += ord(char) - return hash % self.size + def _get_hash(self, key): + hash = 0 + for char in str(key): + hash += ord(char) + return hash % self.size - def add(self, key, value): - key_hash = self._get_hash(key) - key_value = [key, value] + def add(self, key, value): + key_hash = self._get_hash(key) + key_value = [key, value] - if self.map[key_hash] is None: - self.map[key_hash] = list([key_value]) - return True - else: - for pair in self.map[key_hash]: - if pair[0] == key: - pair[1] = value - return True - self.map[key_hash].append(key_value) - return True + if self.map[key_hash] is None: + self.map[key_hash] = list([key_value]) + return True + else: + for pair in self.map[key_hash]: + if pair[0] == key: + pair[1] = value + return True + self.map[key_hash].append(key_value) + return True - def get(self, key): - key_hash = self._get_hash(key) - if self.map[key_hash] is not None: - for pair in self.map[key_hash]: - if pair[0] == key: - return pair[1] - return None + def get(self, key): + key_hash = self._get_hash(key) + if self.map[key_hash] is not None: + for pair in self.map[key_hash]: + if pair[0] == key: + return pair[1] + return None - def delete(self, key): - key_hash = self._get_hash(key) + def delete(self, key): + key_hash = self._get_hash(key) - if self.map[key_hash] is None: - return False - for i in range (0, len(self.map[key_hash])): - if self.map[key_hash][i][0] == key: - self.map[key_hash].pop(i) - return True - return False + if self.map[key_hash] is None: + return False + for i in range (0, len(self.map[key_hash])): + if self.map[key_hash][i][0] == key: + self.map[key_hash].pop(i) + return True + return False + + def keys(self): + arr = [] + for i in range(0, len(self.map)): + if self.map[i]: + arr.append(self.map[i][0]) + return arr - def print(self): - print('---PHONEBOOK----') - for item in self.map: - if item is not None: - print(str(item)) + def print(self): + print('---PHONEBOOK----') + for item in self.map: + if item is not None: + print(str(item)) h = HashMap() h.add('Bob', '567-8888') @@ -64,4 +71,4 @@ def print(self): h.delete('Bob') h.print() print('Ming: ' + h.get('Ming')) - \ No newline at end of file +print(h.keys()) From 8098344f23ff7b3790f566db00913c77ea087ff1 Mon Sep 17 00:00:00 2001 From: tomas2310328 Date: Fri, 26 Apr 2019 20:07:29 +0200 Subject: [PATCH 20/77] Queues implementaion --- Queues implementaion.py | 73 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 Queues implementaion.py diff --git a/Queues implementaion.py b/Queues implementaion.py new file mode 100644 index 00000000..da9bad1a --- /dev/null +++ b/Queues implementaion.py @@ -0,0 +1,73 @@ + +# implemented by Linked list +class Node(object): + def __init__(self, item = None): + self.item = item + self.next = None + self.previous = None + + +class Queue(object): + def __init__(self): + self.length = 0 + self.head = None + self.tail = None + + def enqueue(self, x): + newNode = Node(x) + if self.head == None: + self.head = self.tail = newNode + else: + self.tail.next = newNode + newNode.previous = self.tail + self.tail = newNode + self.length += 1 + + + def dequeue (self): + item = self.head.item + self.head = self.head.next + self.length -= 1 + if self.length == 0: + self.last = None + return item + + +################################################# + +# implemented by array +class Queue: + def __init__(self): + self.items = [] + + def is_empty(self): + return self.items == [] + + def enqueue(self, data): + self.items.append(data) + + def dequeue(self): + return self.items.pop(0) + + def display(self): + ar = [] + for i in self.items: + ar.append(i) + return ar + + + + + + + + + +que = Queue() +que.enqueue('google') +que.enqueue('youtube') +que.enqueue('udemy') +que.enqueue('udacity') +que.dequeue() +que.dequeue() +print(que.display()) From 7bf677341359514d9611fa41599bef3b10a264cf Mon Sep 17 00:00:00 2001 From: Manthan Gupta <42516515+Manthan109@users.noreply.github.com> Date: Tue, 1 Oct 2019 20:56:50 +0530 Subject: [PATCH 21/77] Added comments --- BinaryToDecimal.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/BinaryToDecimal.py b/BinaryToDecimal.py index ac41308d..1c3096c8 100644 --- a/BinaryToDecimal.py +++ b/BinaryToDecimal.py @@ -1,25 +1,25 @@ # Python: Binary to Decimal Conversion # binToDec and decToBin functions are rendered obsolete by the universal convert function -def binToDec(binNum): +def binToDec(binNum): #function created to convert binary to decimal with parametere binNum decNum = 0 power = 0 - while binNum > 0: - decNum += 2 ** power * (binNum % 10) - binNum //= 10 - power += 1 + while binNum > 0: #loop will run till binNum is greater than 0 + decNum += 2 ** power * (binNum % 10) + binNum //= 10 # reducing binNum everytime by 1 digit + power += 1 # increasing power by 1 each loop return decNum -def decToBin(decNum): +def decToBin(decNum): #function created to convert decimal to binary with parametere decNum binNum = 0 power = 0 - while decNum > 0: + while decNum > 0:#loop will run till decNum is greater than 0 binNum += 10 ** power * (decNum % 2) - decNum //= 2 - power += 1 + decNum //= 2 # reducing decNum everytime by 1 digit + power += 1 # increasing power by 1 each loop return binNum -def convert(fromNum, fromBase, toBase): +def convert(fromNum, fromBase, toBase): #function for converting from any base to any other base toNum = 0 power = 0 while fromNum > 0: @@ -31,4 +31,4 @@ def convert(fromNum, fromBase, toBase): # print (str(binToDec(101011))) # print (str(decToBin(128))) print (str(convert(127, 10, 8))) # converts 127 in base 10 to base 8 -print (str(convert(101001, 2, 2))) \ No newline at end of file +print (str(convert(101001, 2, 2))) From 38f05bd2f07002f05cdec65b966426dcf21e48ec Mon Sep 17 00:00:00 2001 From: Abhishek garg <33170757+abhi01274@users.noreply.github.com> Date: Sun, 20 Oct 2019 15:41:00 +0530 Subject: [PATCH 22/77] Update Primes.py --- Primes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Primes.py b/Primes.py index 196644d3..3bbf14eb 100644 --- a/Primes.py +++ b/Primes.py @@ -2,7 +2,7 @@ max = int(input("Find primes up to what number? : ")) primeList = [] - +#for loop for checking each number for x in range(2, max + 1): isPrime = True index = 0 @@ -43,4 +43,4 @@ x += 1 -print(primeList) \ No newline at end of file +print(primeList) From a7681007299c90dd26a9d64ce33ecb8922ce461f Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 4 May 2020 17:51:56 -0700 Subject: [PATCH 23/77] Add files via upload --- Strings/Using Python Strings.ipynb | 518 +++++++++++++++++++++++++++++ Strings/bands.txt | 38 +++ 2 files changed, 556 insertions(+) create mode 100644 Strings/Using Python Strings.ipynb create mode 100644 Strings/bands.txt diff --git a/Strings/Using Python Strings.ipynb b/Strings/Using Python Strings.ipynb new file mode 100644 index 00000000..19643b9c --- /dev/null +++ b/Strings/Using Python Strings.ipynb @@ -0,0 +1,518 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using Strings in Python 3\n", + "[Python String docs](https://docs.python.org/3/library/string.html)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Strings\n", + "Enclose a string in single or double quotes, or in triple single quotes. \n", + "And you can embed single quotes within double quotes, or double quotes within single quotes. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tony Stark is Ironman.\n", + "Her book is called \"The Magician\".\n", + "Captain Rogers kicks butt.\n" + ] + } + ], + "source": [ + "s = 'Tony Stark is'\n", + "t = \"Ironman.\"\n", + "print(s, t)\n", + "u = 'Her book is called \"The Magician\".'\n", + "print(u)\n", + "v = '''Captain Rogers kicks butt.'''\n", + "print(v)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Type, Len, Split, Join\n", + "Get the number of characters in a string using len. \n", + "To get the number of words you have to split the string into a list. Split uses a space as its default, or you can split on any substring you like. \n", + "To reverse a split, use join(str)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "13\n" + ] + } + ], + "source": [ + "print(type(s))\n", + "print(len(s))" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Tony', 'Stark', 'is']\n", + "3\n", + "['Her book is c', 'lled \"The M', 'gici', 'n\".']\n", + "['you', 'are', 'so', 'pretty']\n", + "Just do it.\n" + ] + } + ], + "source": [ + "print(s.split())\n", + "print(len(s.split()))\n", + "print(u.split('a'))\n", + "print('you,are,so,pretty'.split(','))\n", + "print(' '.join(['Just', 'do', 'it.']))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Check if a substring is contained in a string\n", + "Use *in* or *not in*. \n", + "Startswith and Endswith are also useful boolean checks." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n", + "False\n", + "True\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "print('dog' in s)\n", + "print('k' in t)\n", + "print('k' not in t)\n", + "print(s.startswith('Tony'))\n", + "print(s.endswith('is'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Replace all substrings\n", + "Second example iterates through a dictionary and replaces all instances of text numbers with numerals." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Captain America kicks butt.\n" + ] + } + ], + "source": [ + "v = v.replace('Rogers', 'America')\n", + "print(v)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Anton has 3 cars. Javier has 4.\n" + ] + } + ], + "source": [ + "z = 'Anton has three cars. Javier has four.'\n", + "numbers = {'one':'1', 'two':'2', 'three':'3', 'four':'4', 'five':'5'}\n", + "for k,v in numbers.items():\n", + " z = z.replace(k,v)\n", + "print(z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Change case" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "tony stark is\n", + "IRONMAN.\n", + "Her Book Is Called \"The Magician\".\n", + "Hulk rules!\n" + ] + } + ], + "source": [ + "print(s.lower())\n", + "print(t.upper())\n", + "print(u.title())\n", + "print('hulk rules!'.capitalize())" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "True\n", + "True\n" + ] + } + ], + "source": [ + "print('david'.islower())\n", + "print('hulk'.isupper())\n", + "print('Hulk'.istitle())\n", + "print('covid19'.isalnum())" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n", + "False\n", + "True\n", + "False\n" + ] + } + ], + "source": [ + "print('Thor'.isalpha())\n", + "print('3.14'.isnumeric())\n", + "print('314'.isdigit())\n", + "print('3.14'.isdecimal())" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0123456789\n", + "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\n", + "abcdefghijklmnopqrstuvwxyz\n", + "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" + ] + } + ], + "source": [ + "import string\n", + "print(string.digits)\n", + "print(string.punctuation)\n", + "print(string.ascii_lowercase)\n", + "print(string.ascii_uppercase)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Strip leading or trailing characters\n", + "This is often used to strip blank spaces or newlines, but can be used for much more." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Natasha is a spy.\n", + "Natasha is a spy \n", + "\n", + "\n", + " Natasha is a spy\n", + "Natasha is a spy. She has red hair.\n", + "She has red \n" + ] + } + ], + "source": [ + "w = '\\n Natasha is a spy \\n'\n", + "x = '\\nShe has red hair\\n'\n", + "\n", + "print(w.strip() + '.')\n", + "print(w.lstrip())\n", + "print(w.rstrip())\n", + "print(w.strip() + '. ' + x.strip() + '.')\n", + "print(x.strip().rstrip('arih'))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "What do you want\n" + ] + } + ], + "source": [ + "y = 'What do you want?!!&?'\n", + "print(y.rstrip(string.punctuation))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Find, and Count substrings\n", + "Search from the left with find, or from the right with rfind. \n", + "The return value is the start index of the first match of the substring." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "5\n", + "What do you want?!!&?\n" + ] + } + ], + "source": [ + "print(y.find('a'))\n", + "print(y.rfind('do'))\n", + "print(y)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Natasha is a spy\n", + "4\n" + ] + } + ], + "source": [ + "print(w.strip())\n", + "print(w.count('a'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Strings are immutable\n", + "Any change to a string results in a new string being written to a new block of memory. " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4565794160\n", + "4565793776\n" + ] + } + ], + "source": [ + "m = 'Black widow'\n", + "print(id(m))\n", + "m = m + 's'\n", + "print(id(m))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tony Stark is Ironman.\n", + "Tony Stark is Ironman.\n" + ] + } + ], + "source": [ + "print(s, t)\n", + "z = s + ' ' + t\n", + "print(z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Slicing Substrings\n", + "string[from:to+1:step]\n", + "Only 1 parameter: it is used as an index. \n", + "From defaults to beginning. \n", + "To defaults to end. \n", + "Step defaults to 1." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "567\n" + ] + } + ], + "source": [ + "z = '0123456789'\n", + "print(z[1])\n", + "print(z[5:8])" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "012\n", + "789\n", + "89\n", + "24\n" + ] + } + ], + "source": [ + "print(z[:3])\n", + "print(z[7:])\n", + "print(z[-2:])\n", + "print(z[2:5:2])" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Strings/bands.txt b/Strings/bands.txt new file mode 100644 index 00000000..7148cf12 --- /dev/null +++ b/Strings/bands.txt @@ -0,0 +1,38 @@ +Rolling Stones +Lady Gaga +Jackson Browne +Maroon 5 +Arijit Singh +Elton John +John Mayer +CCR +Eagles +Pink +Aerosmith +Adele +Taylor Swift +Faye Wong +UB40 +ColdPlay +Boston +4 Non Blondes +The Cars +Cheap Trick +Def Leppard +Ed Sheeran +Dire Straits +Train +Tom Petty +One Direction +Jimmy Buffett +Mumford & Sons +Phil Collins +Rod Stewart +The Script +Elvis +U2 +Simon & Garfunkel +Michael Buble +Abba +The Jackson 5 +R.E.M. \ No newline at end of file From efc50c69c1bde794d5ca1b812b0544f2a0fb0a3c Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 11 May 2020 19:15:44 -0700 Subject: [PATCH 24/77] Add string formatting notebook file --- String Formatting.ipynb | 444 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 444 insertions(+) create mode 100644 String Formatting.ipynb diff --git a/String Formatting.ipynb b/String Formatting.ipynb new file mode 100644 index 00000000..82546e12 --- /dev/null +++ b/String Formatting.ipynb @@ -0,0 +1,444 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python String format()\n", + "[Official docs](https://docs.python.org/3/library/string.html#format-string-syntax) \n", + "[more documentation](https://pyformat.info)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Replace with String - positional" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My name is Alex.\n", + "My name is Alex Marshall.\n" + ] + } + ], + "source": [ + "first_name = 'Alex'\n", + "last_name = 'Marshall'\n", + "print('My name is {}.'.format(first_name))\n", + "print('My name is {} {}.'.format(first_name, last_name))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Replace with String using Index\n", + "Using indexes can be useful when order varies." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My name is Alex Marshall.\n", + "My name is Marshall, Alex. First name Alex\n" + ] + } + ], + "source": [ + "print('My name is {0} {1}.'.format(first_name, last_name))\n", + "print('My name is {1}, {0}. First name {0}'.format(first_name, last_name))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Alignment: Align Left, Right, Middle\n", + "{:<} align Left (default is align left, so this is optional) \n", + "{:>n} align Right with n padding spaces \n", + "{:^n} align Middle with n padding spaces" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of cases: 5\n", + "Number of cases: 16\n", + "Number of cases: 294\n", + "Number of cases: 5\n", + "Number of cases: 16\n", + "Number of cases: 294\n" + ] + } + ], + "source": [ + "# align left - these both do the same thing\n", + "cases = [5, 16, 294]\n", + "for case in cases:\n", + " print('Number of cases: {}'.format(case))\n", + "for case in cases:\n", + " print('Number of cases: {:<}'.format(case))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of cases: 5\n", + "Number of cases: 16\n", + "Number of cases: 294\n" + ] + } + ], + "source": [ + "# align right with 5 total spaces\n", + "for case in cases:\n", + " print('Number of cases:{:>5}'.format(case))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of cases: 5 \n", + "Number of cases: 16 \n", + "Number of cases: 294 \n" + ] + } + ], + "source": [ + "# align center with 5 total spaces\n", + "for case in cases:\n", + " print('Number of cases:{:^5}'.format(case))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Integers & Floats\n", + "{:d} Integer variable \n", + "{:5d} Integer with padding of 5 \n", + "{:f} Floating point variable " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Length is 26.\n", + "Length is 26.\n", + "In dog years, I'm 8 .\n" + ] + } + ], + "source": [ + "length = 26\n", + "print('Length is {:d}.'.format(length))\n", + "\n", + "# align right, padding=6, integer\n", + "print('Length is {:>6d}.'.format(length))\n", + "\n", + "# named variable, align center, padding=4, integer\n", + "print(\"In dog years, I'm {age:^5d}.\".format(age=8))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Distance to moon is 238,900 miles.\n" + ] + } + ], + "source": [ + "# integer with commas\n", + "print('Distance to moon is {:,d} miles.'.format(238900))" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Radius is 4.780000 inches.\n", + "Radius is 4.8 inches.\n", + "Radius is 0004.8 inches.\n", + "Radius is 4.78000 inches.\n" + ] + } + ], + "source": [ + "radius = 4.78\n", + "print('Radius is {:f} inches.'.format(radius))\n", + "\n", + "# round to 1 decimal place, float\n", + "print('Radius is {:.1f} inches.'.format(radius))\n", + "\n", + "# padding=6 (pads with leading 0's), round to 1 decimal\n", + "print('Radius is {:06.1f} inches.'.format(radius))\n", + "\n", + "# padding=5 decimal places\n", + "print('Radius is {:.5f} inches.'.format(radius))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A is +15. B is -9. C is 33.\n", + "A is +15. B is -9. B is -9.\n" + ] + } + ], + "source": [ + "# positive & negative signs\n", + "a, b, c = 15, -9, 33\n", + "print('A is {:+d}. B is {:+d}. C is {:-d}.'.format(a, b, c))\n", + "\n", + "# {+3d} shows pos or neg sign, padding=3. \n", + "# {: d} prints neg or a leading space if positive.\n", + "print('A is {:+3d}. B is {:+4d}. B is {: d}.'.format(a, b, b))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Named Placeholders\n", + "You can pass in named variables as keyword args, or as an unpacked dict. \n", + "And it's easy to pass in a list." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mekael is a Carpenter.\n" + ] + } + ], + "source": [ + "print(\"{name} is a {job}.\".format(name='Mekael', job='Carpenter'))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'name'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'Carpenter'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# THIS DOES NOT WORK!\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"{name} is a {job}.\"\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mjob\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m: 'name'" + ] + } + ], + "source": [ + "name = 'Mekael'\n", + "job = 'Carpenter'\n", + "# THIS DOES NOT WORK!\n", + "print(\"{name} is a {job}.\".format(name, job))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mekael is a Carpenter.\n" + ] + } + ], + "source": [ + "# This works great\n", + "print(\"{n} is a {j}.\".format(n=name, j=job))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Mekael is a Carpenter.\n" + ] + } + ], + "source": [ + "# Or use a dictionary, and ** unpacks the dictionary.\n", + "jobs = {'name':'Mekael', 'job':'Carpenter'}\n", + "print(\"{name} is a {job}.\".format(**jobs))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Score 2 is 96\n" + ] + } + ], + "source": [ + "# passing in a list is clean and easy\n", + "scores = [78, 96, 83, 86]\n", + "print('Score 2 is {s[1]}'.format(s = scores))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scientific Notation\n", + "Use {:e}, or upper case E." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "My big number is 8.745770e+02\n", + "A bigger number is 6.022141E+23\n" + ] + } + ], + "source": [ + "print('My big number is {:e}'.format(874.577))\n", + "print('A bigger number is {:E}'.format(602214090000000000000000))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Binary & Hexadecimal\n", + "{:b} converts decimal to binary\n", + "{:x} converts decimal to hex. Or use upper case X for capitals." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The binary equivalent of 79 is 1001111\n", + "The Hexadecimal equivalent of 183 is B7\n" + ] + } + ], + "source": [ + "print('The binary equivalent of 79 is {:b}'.format(79))\n", + "print('The Hexadecimal equivalent of 183 is {:X}'.format(183))" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 81ff2ea134bfaf5c6ec541b499457ddf728fecf8 Mon Sep 17 00:00:00 2001 From: Joe James Date: Tue, 12 May 2020 09:34:36 -0700 Subject: [PATCH 25/77] Added Unpacking variables notebook file --- Unpacking Variables.ipynb | 360 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 360 insertions(+) create mode 100644 Unpacking Variables.ipynb diff --git a/Unpacking Variables.ipynb b/Unpacking Variables.ipynb new file mode 100644 index 00000000..3b1f8d31 --- /dev/null +++ b/Unpacking Variables.ipynb @@ -0,0 +1,360 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Packing & Unpacking Variables" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Assign variables\n", + "In Python you can assign multiple variables at a time using commas." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n" + ] + } + ], + "source": [ + "a, b, c = 1, 2, 3\n", + "print(a)\n", + "print(b)\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Swap a pair of Variables in Python\n", + "x,y = y,x" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x=12, y=5\n" + ] + } + ], + "source": [ + "x = 5; y = 12\n", + "x, y = y, x\n", + "print('x=' + str(x) + ', y=' + str(y))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Swap a trio of Variables in Python\n", + "Yes, this trick works for 3 variables too." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "88 99 77\n" + ] + } + ], + "source": [ + "x, y, z = 77, 88, 99\n", + "z, x, y = x, y, z\n", + "print(x, y, z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Split String into multiple variables\n", + "But be careful because the number of variables must match the number of substrings from the split." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "5\n", + "6\n" + ] + } + ], + "source": [ + "a, b, c = '4 5 6'.split()\n", + "print(a)\n", + "print(b)\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Splitting a List into variables is magically easy" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "8\n", + "9\n", + "10\n" + ] + } + ], + "source": [ + "my_list = [8, 9, 10]\n", + "a, b, c = my_list\n", + "print(a)\n", + "print(b)\n", + "print(c)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Split Tuple into variables" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25 26 27\n" + ] + } + ], + "source": [ + "tup = (25,26,27)\n", + "x, y, z = tup\n", + "print(x, y, z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### This gives you a Tuple, not a List" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(8, 9, 10)\n", + "\n" + ] + } + ], + "source": [ + "var = a, b, c\n", + "print(var)\n", + "print(type(var))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### *args for Functions\n", + "Used for passing a non-keyworded, variable-length argument list to a function. \n", + "Received as a Tuple." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('Forest', 'Hill', 'High')\n", + "\n" + ] + } + ], + "source": [ + "def pack_it(*args):\n", + " print(args)\n", + " print(type(args))\n", + " \n", + "x = 'Forest'; y = 'Hill'; z = 'High'\n", + "pack_it(x, y, z)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This unpacks the List before sending it, so it can be received by the function as separate variables." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cullen\n", + "McDonough\n" + ] + } + ], + "source": [ + "def unpack_it(x, y):\n", + " print(x)\n", + " print(y)\n", + " \n", + "args = ['Cullen', 'McDonough']\n", + "unpack_it(*args)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### **kwargs for Functions\n", + "Used for passing keyworded, variable-length argument dictionary to functions. \n", + "This works, but it's kinda annoying because some normal Python dictionaries fail. \n", + "func (1:'Edsel', 2:'Betamax') does not work." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'a': 'Edsel', 'b': 'Betamax', 'c': 'mGaetz'}\n", + "Edsel\n", + "\n" + ] + } + ], + "source": [ + "def func(**losers):\n", + " print(losers)\n", + " print(losers['a'])\n", + " print(type(losers))\n", + " \n", + "func(a='Edsel', b='Betamax', c='mGaetz')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This works, but it's kinda annoying because you have to use strings for the keys, so some normal Python dictionaries will give you an error. {1:'Edsel', 2:'Betamax'} fails." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Edsel\n" + ] + } + ], + "source": [ + "def func(a, b, c):\n", + " print(a)\n", + "\n", + "losers = {'a':'Edsel', 'b':'Betamax', 'c':'mGaetz'}\n", + "func(**losers)" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 4842f730320bae8ace4012eb517acb2c22d2da62 Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 13 May 2020 15:51:56 -0700 Subject: [PATCH 26/77] Added Python Random Number Module notebook --- Python Random Numbers Module.ipynb | 450 +++++++++++++++++++++++++++++ 1 file changed, 450 insertions(+) create mode 100644 Python Random Numbers Module.ipynb diff --git a/Python Random Numbers Module.ipynb b/Python Random Numbers Module.ipynb new file mode 100644 index 00000000..db837a8c --- /dev/null +++ b/Python Random Numbers Module.ipynb @@ -0,0 +1,450 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Random Numbers Module\n", + "[Official Documentation](https://docs.python.org/3/library/random.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### randint\n", + "Gives you a random integer between from and to values, inclusive." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2 2 3 1 1 2 0 2 3 2 0 0 2 2 0 3 3 2 1 2 3 0 2 2 2 " + ] + } + ], + "source": [ + "for i in range (25):\n", + " print(random.randint(0, 3), end=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### randrange\n", + "Works similar to the range function -- gives you a random number between from and to-1, with optional step. \n", + "From defaults to 0 if only 1 argument is given. \n", + "Step defaults to 1 if only 2 arguments are given." + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25\n", + "3 6 6 6 6 3 3 3 0 0 6 6 3 0 6 0 3 0 6 6 6 6 3 3 6 " + ] + } + ], + "source": [ + "print(random.randrange(100))\n", + "\n", + "for i in range (25):\n", + " print(random.randrange(0, 9, 3), end=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### choice\n", + "Returns one randomly chosen item from a sequence (list, tuple or string). Works for lists/tuples of integers, floats, strings or other objects. " + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "Roby\n", + "Darby\n", + "Washington\n", + "Hampton\n" + ] + } + ], + "source": [ + "print(random.choice([3, 5, 7, 9, 11]))\n", + "\n", + "names = ['Roby', 'Matthews', 'Washington', 'Darby', 'Hampton']\n", + "for i in range(4):\n", + " print(random.choice(names))" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-\n", + "a c e b b a e d c c " + ] + } + ], + "source": [ + "print(random.choice('bunch-of-letters'))\n", + "\n", + "material = 'brocade'\n", + "for i in range(10):\n", + " print(random.choice(material), end=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### choices\n", + "Just like choice, but returns a list of n random choices, with replacement, so each pick is from the full sequence." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[9, 5, 3, 6, 5, 6, 5, 3, 1, 5, 10, 1, 4, 4, 10]\n", + "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n" + ] + } + ], + "source": [ + "numbers = [n+1 for n in range(10)]\n", + "my_picks = random.choices(numbers, k=15)\n", + "print(my_picks)\n", + "print(numbers)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Darby', 'Hampton']\n" + ] + } + ], + "source": [ + "names = ['Roby', 'Matthews', 'Washington', 'Darby', 'Hampton']\n", + "print(random.choices(names, k=2))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can also add weights if you want some items to have a better chance of being picked. Here, 1 is 4x more likely than 4 to be picked." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 1, 3, 4, 1, 1, 1, 3, 2, 2, 2, 4, 2, 1, 1, 3, 2, 3, 1, 3]\n" + ] + } + ], + "source": [ + "numbers = [1,2,3,4]\n", + "my_picks = random.choices(numbers, weights=[4,3,2,1], k=20)\n", + "print(my_picks)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Use random.choices to generate random passwords \n", + "First we pick a list of 8 random numbers between a and z on the ascii table, then we convert the numbers to ascii letters, then join them into a string." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[100, 109, 104, 100, 103, 102, 118, 121]\n", + "dmhdgfvy\n" + ] + } + ], + "source": [ + "picks = random.choices(range(ord('a'),ord('z')), k=8)\n", + "print(picks)\n", + "picks = [chr(i) for i in picks]\n", + "print(''.join(picks))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's a random password generator that uses all upper and lower case letters and numbers." + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Z81Hw3uk\n" + ] + } + ], + "source": [ + "import string\n", + "all_chars = string.ascii_lowercase + string.ascii_uppercase + string.digits\n", + "pw = ''.join(random.choices(all_chars, k=8))\n", + "print(pw)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### sample\n", + "Just like choices, but without replacement. \n", + "Useful for picking lottery winners or bingo numbers. \n", + "Returned list is in the order they were picked." + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['green', 'pink']\n" + ] + } + ], + "source": [ + "colors = ['red', 'blue', 'green', 'aqua', 'pink', 'black']\n", + "picks = random.sample(colors, k=2)\n", + "print(picks)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the range function as an argument will not give you any duplicate picks." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[18, 38, 20, 50, 1]\n" + ] + } + ], + "source": [ + "picks = random.sample(range(1,51), k=5)\n", + "print(picks)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### shuffle\n", + "Shuffle any sequence into random order. \n", + "This is an in-place shuffle, and it doesn't return anything." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 4, 5, 6, 7, 8]\n", + "None\n", + "[2, 6, 8, 1, 4, 7, 5, 3]\n" + ] + } + ], + "source": [ + "numbers = [1, 2, 3, 4, 5, 6, 7, 8]\n", + "print(numbers)\n", + "print(random.shuffle(numbers))\n", + "\n", + "random.shuffle(numbers)\n", + "print(numbers)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### random.random()\n", + "Random floating point values between 0.0 and 1.0." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.8424897774160051\n", + "0.9016594664191279\n", + "0.5162849368345925\n", + "0.021852081927422384\n", + "0.5740618908246983\n", + "0.6539291129848911\n" + ] + } + ], + "source": [ + "print(random.random())\n", + "\n", + "for i in range(5):\n", + " print(random.random())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### uniform (from, to)\n", + "Random float between a range of values" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2.5032833557221568\n", + "10.31258224982709\n", + "9.431820659293221\n", + "10.4390639618008\n", + "9.6906814789157\n", + "10.559354593909362\n" + ] + } + ], + "source": [ + "print(random.uniform(2.1, 4.3))\n", + "\n", + "for i in range(5):\n", + " print(random.uniform(9.4, 10.7))" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From d195cd976b22a31b72692c18bd4f89d721065bc6 Mon Sep 17 00:00:00 2001 From: Joe James Date: Sun, 17 May 2020 10:43:09 -0700 Subject: [PATCH 27/77] Upload Python Bisect Jupyter notebook --- Python Bisect.ipynb | 267 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 Python Bisect.ipynb diff --git a/Python Bisect.ipynb b/Python Bisect.ipynb new file mode 100644 index 00000000..1390432d --- /dev/null +++ b/Python Bisect.ipynb @@ -0,0 +1,267 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Bisect Module\n", + "Used to find the insertion point for adding an item to a sorted list. \n", + "Advantage: it's fast. Runs in O(log n). \n", + "[Documentation](https://docs.python.org/3/library/bisect.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import bisect" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### bisect_left\n", + "Finds the insertion point for an item in a sorted list, or the spot just left of any matches. \n", + "Works for list of ints, list of floats, list of strings." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n", + "3\n", + "2\n" + ] + } + ], + "source": [ + "a = [24, 33, 41, 41, 45, 50, 53, 59, 62, 66, 70]\n", + "i = bisect.bisect_left(a, 41)\n", + "print(i)\n", + "\n", + "b = [1.3, 2.2, 3.4, 4.6, 5.5, 6.9, 7.2, 8.4]\n", + "j = bisect.bisect_left(b, 4.1)\n", + "print(j)\n", + "\n", + "c = ['aaa', 'bbb', 'ccc', 'ddd']\n", + "k = bisect.bisect_left(c, 'bug')\n", + "print(k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If list is unsorted, results are unpredictable, but it still tries." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2\n" + ] + } + ], + "source": [ + "a = [33, 24, 41, 41, 45, 50, 53, 59, 66, 62, 70]\n", + "i = bisect.bisect_left(a, 30)\n", + "print(i)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### insort_left\n", + "This inserts an item into the list in the correct position." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[24, 33, 41, 41, 44, 45, 50, 53, 59, 62, 66, 70]\n" + ] + } + ], + "source": [ + "d = [24, 33, 41, 41, 45, 50, 53, 59, 62, 66, 70]\n", + "bisect.insort_left(d, 44)\n", + "print(d)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### bisect_right\n", + "Just like bisect_left, but for matches it returns the spot just to the right of matches." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4\n", + "2\n", + "3\n" + ] + } + ], + "source": [ + "a = [24, 33, 41, 41, 45, 50, 53, 59, 62, 66, 70]\n", + "i = bisect.bisect_right(a, 41)\n", + "print(i)\n", + "\n", + "b = [1.3, 2.2, 3.4, 4.6, 5.5, 6.9, 7.2, 8.4]\n", + "j = bisect.bisect_right(b, 2.2)\n", + "print(j)\n", + "\n", + "c = ['A', 'big', 'dog', 'runs', 'slowly']\n", + "k = bisect.bisect_right(c, 'dog')\n", + "print(k)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### insort_right\n", + "Just like insort_left, but for matches it inserts to the right of the match." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[24, 33, 41, 41, 45, 46, 50, 53, 59, 62, 66, 70]\n" + ] + } + ], + "source": [ + "d = [24, 33, 41, 41, 45, 50, 53, 59, 62, 66, 70]\n", + "bisect.insort_right(d, 46)\n", + "print(d)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A fast Find function for a Sorted List\n", + "Find leftmost value greater than x in sorted list a" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n" + ] + } + ], + "source": [ + "def find_next(a, x):\n", + " i = bisect.bisect_right(a, x)\n", + " if i < len(a):\n", + " return a[i]\n", + " return False\n", + "\n", + "print(find_next([10, 15, 20, 25, 30], 33))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### A simple get_grade function\n", + "get_grade uses a list of cutoffs to split grades into 5 ranges, then uses the bisect index to return the corresponding grade. " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['F', 'A', 'C', 'C', 'B', 'A', 'A']\n" + ] + } + ], + "source": [ + "def get_grade(score, cutoffs=[60, 70, 80, 90], grades='FDCBA'):\n", + " i = bisect.bisect_right(cutoffs, score)\n", + " return grades[i]\n", + "\n", + "grades = [get_grade(score) for score in [52, 99, 77, 70, 89, 90, 100]]\n", + "print(grades)" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 916ef1a2893678ddcb90c69b206b29342dd24490 Mon Sep 17 00:00:00 2001 From: Joe James Date: Tue, 19 May 2020 15:27:09 -0700 Subject: [PATCH 28/77] upload Generators notebook --- Python Generators.ipynb | 224 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 Python Generators.ipynb diff --git a/Python Generators.ipynb b/Python Generators.ipynb new file mode 100644 index 00000000..1a68f384 --- /dev/null +++ b/Python Generators.ipynb @@ -0,0 +1,224 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Generators\n", + "[documentation](https://docs.python.org/3/howto/functional.html#generators) \n", + "[Another really good tutorial](https://realpython.com/introduction-to-python-generators/#using-generators)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "*yield* keyword makes a function into a generator. Python keeps the call stack for the generator function open and saves the state. When you invoke the next() function it will return execution to the same point it left off in the generator function." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simple generator function \n", + "The while loop continues indefinitely. The function increments x then returns x with each iteration." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "def my_generator(x=1):\n", + " while True:\n", + " yield x\n", + " x += 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using the generator with a for loop\n", + "Here, gene is a my_generator function. \n", + "The for loop iterates through gene indefinitely. \n", + "Behind the scenes, the for loop is calling the generator's \\__next__ function. \n", + "Big advantages over Lists: \n", + "- Generator can provide an infinite seqence. \n", + "- Generator doesn't load values into memory. " + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 " + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgene\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mend\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m' '\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 7\u001b[0;31m \u001b[0mtime\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0.5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "import time\n", + "gene = my_generator()\n", + "print(type(gene))\n", + "\n", + "for i in gene:\n", + " print(i, end=' ')\n", + " time.sleep(0.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using the generator with explicit next( ) calls\n", + "*range* limits this for loop to 10 iterations. \n", + "Each iteration of the for loop it calls the generator using *next(gene)*." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2 3 4 5 6 7 8 9 10 11 " + ] + } + ], + "source": [ + "gene = my_generator()\n", + "print(gene.__next__())\n", + "for i in range(10):\n", + " print(next(gene), end=' ')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generators from Generator Expressions\n", + "Similar to List Comprehensions, but uses ( ) rather than [ ]. \n", + "Create with a single line of code. \n", + "Only use 120 bytes of memory." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "120\n", + "\n", + "0\n", + "3\n" + ] + } + ], + "source": [ + "gene = (x for x in range(999999))\n", + "\n", + "import sys\n", + "print(sys.getsizeof(gene))\n", + "print(type(gene))\n", + "\n", + "print(next(gene))\n", + "next(gene)\n", + "next(gene)\n", + "print(next(gene))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generator to Read File\n", + "Saves memory, and avoids memory overflow for very large files, because it only *loads one line into memory at a time*." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Rolling Stones\n", + "\n", + "Lady Gaga\n", + "Jackson Browne\n", + "Maroon 5\n", + "Arijit Singh\n", + "Elton John\n", + "John Mayer\n" + ] + } + ], + "source": [ + "def read_file(fn = 'bands.txt'):\n", + " for line in open(fn):\n", + " yield line\n", + " \n", + "band = read_file()\n", + "print(next(band))\n", + "for i in range(6):\n", + " print(next(band), end='')" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a073c629bc57706872daffbf7c321c310f810d5f Mon Sep 17 00:00:00 2001 From: ChelseyOSU <50436670+ChelseyOSU@users.noreply.github.com> Date: Fri, 22 May 2020 01:31:09 -0700 Subject: [PATCH 29/77] Fix bug The current code would fail when remove the root element in a tree where right subtree only have right child. # 17 # 0 20 # -5 5 25 Current code would produce a result with duplicate elements # 20 # 0 20 # -5 5 25 Trick is to move one the assignment to root value to the bottom --- Trees/bst.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Trees/bst.py b/Trees/bst.py index 9137b4b8..f45b2f4f 100644 --- a/Trees/bst.py +++ b/Trees/bst.py @@ -131,7 +131,6 @@ def remove(self, data): delNodeParent = delNode delNode = delNode.leftChild - self.root.value = delNode.value if delNode.rightChild: if delNodeParent.value > delNode.value: delNodeParent.leftChild = delNode.rightChild @@ -142,6 +141,7 @@ def remove(self, data): delNodeParent.leftChild = None else: delNodeParent.rightChild = None + self.root.value = delNode.value return True @@ -233,4 +233,4 @@ def main(): print(bst.remove(10)) bst.preorder() -main() \ No newline at end of file +main() From b1828a7d0117ac2c910df827047f196482095eeb Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 25 May 2020 17:45:08 -0700 Subject: [PATCH 30/77] Initial upload --- Python List Iteration.ipynb | 197 +++++++++++++++++++ Python Set Comprehensions.ipynb | 331 ++++++++++++++++++++++++++++++++ 2 files changed, 528 insertions(+) create mode 100644 Python List Iteration.ipynb create mode 100644 Python Set Comprehensions.ipynb diff --git a/Python List Iteration.ipynb b/Python List Iteration.ipynb new file mode 100644 index 00000000..d680f54f --- /dev/null +++ b/Python List Iteration.ipynb @@ -0,0 +1,197 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python List Iteration\n", + "A variety of ways to iterate Lists, including for loop, while loop, enumerate." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "The standard for loop works great if inside the loop you only need the item and not its index." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a\n", + "b\n", + "c\n", + "d\n", + "e\n" + ] + } + ], + "source": [ + "letters = ['a', 'b', 'c', 'd', 'e']\n", + "\n", + "for letter in letters:\n", + " print(letter)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "If you need the index inside the loop you can use range(len(list)). \n", + "Then you can always get the list item if needed by using the index." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "letters 0 = a\n", + "letters 1 = b\n", + "letters 2 = c\n", + "letters 3 = d\n", + "letters 4 = e\n" + ] + } + ], + "source": [ + "for index in range(len(letters)):\n", + " print('letters', index, '=', letters[index])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "Best option if you need both index and item inside the loop is to use Python's **enumerate** function. \n", + "Enumerate works in both Python 2.x and 3.x" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "letters 0 = a\n", + "letters 1 = b\n", + "letters 2 = c\n", + "letters 3 = d\n", + "letters 4 = e\n" + ] + } + ], + "source": [ + "for index, item in enumerate(letters):\n", + " print('letters', index, '=', item)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Enumerate actually returns an iterable enumerate object, \n", + "which is a sequence of tuples of (index, item)." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(0, 'a')\n", + "(1, 'b')\n", + "\n" + ] + } + ], + "source": [ + "enum_obj = enumerate(letters)\n", + "print(next(enum_obj))\n", + "print(next(enum_obj))\n", + "print(type(enum_obj))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "----\n", + "Probably the clumsiest way to iterate a list in Python -- the **while loop**. \n", + "Requires index initialization before list, and incrementation inside loop." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "letters 0 = a\n", + "letters 1 = b\n", + "letters 2 = c\n", + "letters 3 = d\n", + "letters 4 = e\n" + ] + } + ], + "source": [ + "index = 0\n", + "while index < len(letters): \n", + " print('letters', index, '=', letters[index]) \n", + " index += 1" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Python Set Comprehensions.ipynb b/Python Set Comprehensions.ipynb new file mode 100644 index 00000000..475521cb --- /dev/null +++ b/Python Set Comprehensions.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Set Comprehensions\n", + "Note that Python sets are not ordered, and duplicates are automatically removed. \n", + "Otherwise, comprehensions work just like with lists. \n", + "General syntax is: new_set = {expression for item in iterable if condition}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Simple Comprehension using Range" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}\n" + ] + } + ], + "source": [ + "ints = {i for i in range(10)}\n", + "print(ints)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Comprehension using Range with a Condition filter\n", + "Only take even values from range" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0, 2, 4, 6, 8}\n" + ] + } + ], + "source": [ + "evens = {i for i in range(10) if i%2 == 0}\n", + "print(evens)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Apply math function to values in range\n", + "Here, square each value" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}\n" + ] + } + ], + "source": [ + "squares = {i*i for i in range(10)}\n", + "print(squares)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that Python eliminates duplicates from sets" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{0, 1, 4, 9, 16, 25}\n" + ] + } + ], + "source": [ + "sqrs = {i*i for i in range(-5, 5)}\n", + "print(sqrs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set Comprehension on a List" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{4, 9, 169, 49, 121, 25}\n" + ] + } + ], + "source": [ + "primes = [2, 2, 2, 3, 3, 5, 5, 5, 7, 11, 11, 13, 13, 13, 13]\n", + "primes_squared = {p*p for p in primes}\n", + "print(primes_squared)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### More Complex Expressions: quadratic transformation\n", + "Any expression is allowed. More complex expressions can be put in parentheses. \n", + "Here, quadratic equation: \n", + "2x^2 + 5x + 10" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{43, 143, 307, 85, 28, 413}\n" + ] + } + ], + "source": [ + "transformed = {(2*x*x + 5*x + 10) for x in primes}\n", + "print(transformed)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Flatten List and eliminate duplicates\n", + "Syntax: {leaf for branch in tree for leaf in branch}" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{1, 2, 3, 98, 76}\n" + ] + } + ], + "source": [ + "nums = [[1,3],[2,3],[3,98],[76,1]]\n", + "flat_set = {a for b in nums for a in b}\n", + "print(flat_set)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Eliminate Dups from a List\n", + "We can easily eliminate differences in capitalization, while removing duplicates." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Albert', 'Ella', 'George', 'Salil'}\n" + ] + } + ], + "source": [ + "names = ['salil', 'ALBERT', 'Ella', 'george', 'Salil', 'George', 'ELLA', 'Albert']\n", + "names_set = {n.capitalize() for n in names}\n", + "print(names_set)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And it's easy to convert this back to a list." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Albert', 'Ella', 'George', 'Salil']\n" + ] + } + ], + "source": [ + "names_set = list({n.capitalize() for n in names})\n", + "print(names_set)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get Car Make from list of Make & Model\n", + "We're getting the first word from each string." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Toyota', 'Tesla', 'Chevy'}\n" + ] + } + ], + "source": [ + "cars = ['Toyota Prius', 'Chevy Bolt', 'Tesla Model 3', 'Tesla Model Y']\n", + "makes = {(c.split()[0]) for c in cars}\n", + "print(makes)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get Initials from Names\n", + "Take first and last initials" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'CB', 'NF', 'HP'}\n" + ] + } + ], + "source": [ + "names = ['Clint Barton', 'Tony', 'Nick Fury', 'Hank Pym']\n", + "inits = {(n.split()[0][0] + n.split()[1][0]) for n in names if len(n.split())==2}\n", + "print(inits)" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 0d97aa6a0be7938571078ddc0c35938fecbdce97 Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 25 May 2020 22:15:53 -0700 Subject: [PATCH 31/77] Stack queue heap file upload --- Stacks, Queues & Heaps.ipynb | 346 +++++++++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 Stacks, Queues & Heaps.ipynb diff --git a/Stacks, Queues & Heaps.ipynb b/Stacks, Queues & Heaps.ipynb new file mode 100644 index 00000000..a54ede21 --- /dev/null +++ b/Stacks, Queues & Heaps.ipynb @@ -0,0 +1,346 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Stacks, Queues & Heaps\n", + "© Joe James, 2019.\n", + "\n", + "### Stack using Python List\n", + "Stack is a LIFO data structure -- last-in, first-out. \n", + "Use append() to push an item onto the stack. \n", + "Use pop() to remove an item." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[4, 7, 12, 19]\n" + ] + } + ], + "source": [ + "my_stack = list()\n", + "my_stack.append(4)\n", + "my_stack.append(7)\n", + "my_stack.append(12)\n", + "my_stack.append(19)\n", + "print(my_stack)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "19\n", + "12\n", + "[4, 7]\n" + ] + } + ], + "source": [ + "print(my_stack.pop())\n", + "print(my_stack.pop())\n", + "print(my_stack)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Stack using List with a Wrapper Class\n", + "We create a Stack class and a full set of Stack methods. \n", + "But the underlying data structure is really a Python List. \n", + "For pop and peek methods we first check whether the stack is empty, to avoid exceptions." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "class Stack():\n", + " def __init__(self):\n", + " self.stack = list()\n", + " def push(self, item):\n", + " self.stack.append(item)\n", + " def pop(self):\n", + " if len(self.stack) > 0:\n", + " return self.stack.pop()\n", + " else:\n", + " return None\n", + " def peek(self):\n", + " if len(self.stack) > 0:\n", + " return self.stack[len(self.stack)-1]\n", + " else:\n", + " return None\n", + " def __str__(self):\n", + " return str(self.stack)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test Code for Stack Wrapper Class" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 3]\n", + "3\n", + "1\n", + "1\n", + "None\n" + ] + } + ], + "source": [ + "my_stack = Stack()\n", + "my_stack.push(1)\n", + "my_stack.push(3)\n", + "print(my_stack)\n", + "print(my_stack.pop())\n", + "print(my_stack.peek())\n", + "print(my_stack.pop())\n", + "print(my_stack.pop())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "### Queue using Python Deque\n", + "Queue is a FIFO data structure -- first-in, first-out. \n", + "Deque is a double-ended queue, but we can use it for our queue. \n", + "We use append() to enqueue an item, and popleft() to dequeue an item. \n", + "See [Python docs](https://docs.python.org/3/library/collections.html#collections.deque) for deque." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "deque([5, 10])\n", + "5\n" + ] + } + ], + "source": [ + "from collections import deque\n", + "my_queue = deque()\n", + "my_queue.append(5)\n", + "my_queue.append(10)\n", + "print(my_queue)\n", + "print(my_queue.popleft())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fun exercise:\n", + "Write a wrapper class for the Queue class, similar to what we did for Stack, but using Python deque. \n", + "Try adding enqueue, dequeue, and get_size methods." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Python Single-ended Queue Wrapper Class using Deque\n", + "We rename the append method to enqueue, and popleft to dequeue. \n", + "We also add peek and get_size operations." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from collections import deque\n", + "class Queue():\n", + " def __init__(self):\n", + " self.queue = deque()\n", + " self.size = 0\n", + " def enqueue(self, item):\n", + " self.queue.append(item)\n", + " self.size += 1\n", + " def dequeue(self, item):\n", + " if self.size > 0:\n", + " self.size -= 1\n", + " return self.queue.popleft()\n", + " else: \n", + " return None\n", + " def peek(self):\n", + " if self.size > 0:\n", + " ret_val = self.queue.popleft()\n", + " queue.appendleft(ret_val)\n", + " return ret_val\n", + " else:\n", + " return None\n", + " def get_size(self):\n", + " return self.size" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Python MaxHeap\n", + "A MaxHeap always bubbles the highest value to the top, so it can be removed instantly. \n", + "Public functions: push, peek, pop \n", + "Private functions: __swap, __floatUp, __bubbleDown, __str__." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "class MaxHeap:\n", + " def __init__(self, items=[]):\n", + " super().__init__()\n", + " self.heap = [0]\n", + " for item in items:\n", + " self.heap.append(item)\n", + " self.__floatUp(len(self.heap) - 1)\n", + "\n", + " def push(self, data):\n", + " self.heap.append(data)\n", + " self.__floatUp(len(self.heap) - 1)\n", + "\n", + " def peek(self):\n", + " if self.heap[1]:\n", + " return self.heap[1]\n", + " else:\n", + " return False\n", + " \n", + " def pop(self):\n", + " if len(self.heap) > 2:\n", + " self.__swap(1, len(self.heap) - 1)\n", + " max = self.heap.pop()\n", + " self.__bubbleDown(1)\n", + " elif len(self.heap) == 2:\n", + " max = self.heap.pop()\n", + " else: \n", + " max = False\n", + " return max\n", + "\n", + " def __swap(self, i, j):\n", + " self.heap[i], self.heap[j] = self.heap[j], self.heap[i]\n", + "\n", + " def __floatUp(self, index):\n", + " parent = index//2\n", + " if index <= 1:\n", + " return\n", + " elif self.heap[index] > self.heap[parent]:\n", + " self.__swap(index, parent)\n", + " self.__floatUp(parent)\n", + "\n", + " def __bubbleDown(self, index):\n", + " left = index * 2\n", + " right = index * 2 + 1\n", + " largest = index\n", + " if len(self.heap) > left and self.heap[largest] < self.heap[left]:\n", + " largest = left\n", + " if len(self.heap) > right and self.heap[largest] < self.heap[right]:\n", + " largest = right\n", + " if largest != index:\n", + " self.__swap(index, largest)\n", + " self.__bubbleDown(largest)\n", + " \n", + " def __str__(self):\n", + " return str(self.heap)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### MaxHeap Test Code" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 95, 10, 21, 3]\n", + "95\n", + "21\n" + ] + } + ], + "source": [ + "m = MaxHeap([95, 3, 21])\n", + "m.push(10)\n", + "print(m)\n", + "print(m.pop())\n", + "print(m.peek())" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 1d0b24eff0aa445b906750d070d6233fa32fc721 Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 27 May 2020 10:01:14 -0700 Subject: [PATCH 32/77] added import json statement --- Web Data Mining/Python Requests.ipynb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Web Data Mining/Python Requests.ipynb b/Web Data Mining/Python Requests.ipynb index 6b9274ec..66f27fed 100644 --- a/Web Data Mining/Python Requests.ipynb +++ b/Web Data Mining/Python Requests.ipynb @@ -19,7 +19,8 @@ "metadata": {}, "outputs": [], "source": [ - "import requests" + "import requests\n", + "import json" ] }, { From b038e432cd2bd352a29dfa8b7df7d6481ccb0bee Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 27 May 2020 12:31:59 -0700 Subject: [PATCH 33/77] Revised QuickSort code, in Jupyter nb --- Sorting Algorithms/Python QuickSort.ipynb | 140 ++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 Sorting Algorithms/Python QuickSort.ipynb diff --git a/Sorting Algorithms/Python QuickSort.ipynb b/Sorting Algorithms/Python QuickSort.ipynb new file mode 100644 index 00000000..5f925c81 --- /dev/null +++ b/Sorting Algorithms/Python QuickSort.ipynb @@ -0,0 +1,140 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python QuickSort Algorithm" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 9, 1, 2, 4, 8, 6, 3, 7]\n", + "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n" + ] + } + ], + "source": [ + "#---------------------------------------\n", + "# Quick Sort\n", + "#---------------------------------------\n", + "def quick_sort(A):\n", + " quick_sort2(A, 0, len(A)-1)\n", + " \n", + "def quick_sort2(A, low, hi):\n", + " if hi-low < 1 and low < hi:\n", + " quick_selection(A, low, hi)\n", + " elif low < hi:\n", + " p = partition(A, low, hi)\n", + " quick_sort2(A, low, p - 1)\n", + " quick_sort2(A, p + 1, hi)\n", + " \n", + "def get_pivot(A, low, hi):\n", + " mid = (hi + low) // 2\n", + " s = sorted([A[low], A[mid], A[hi]])\n", + " if s[1] == A[low]:\n", + " return low\n", + " elif s[1] == A[mid]:\n", + " return mid\n", + " return hi\n", + " \n", + "def partition(A, low, hi):\n", + " pivotIndex = get_pivot(A, low, hi)\n", + " pivotValue = A[pivotIndex]\n", + " A[pivotIndex], A[low] = A[low], A[pivotIndex]\n", + " border = low\n", + "\n", + " for i in range(low, hi+1):\n", + " if A[i] < pivotValue:\n", + " border += 1\n", + " A[i], A[border] = A[border], A[i]\n", + " A[low], A[border] = A[border], A[low]\n", + "\n", + " return (border)\n", + " \n", + "def quick_selection(x, first, last):\n", + " for i in range (first, last):\n", + " minIndex = i\n", + " for j in range (i+1, last+1):\n", + " if x[j] < x[minIndex]:\n", + " minIndex = j\n", + " if minIndex != i:\n", + " x[i], x[minIndex] = x[minIndex], x[i]\n", + " \n", + "A = [5,9,1,2,4,8,6,3,7]\n", + "print(A)\n", + "quick_sort(A)\n", + "print(A)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Nice simple version written by Mr. UncleChu in comments\n", + "Slick code, but does not sort in place, so uses a lot more memory. Do not use for large lists or you'll get stackoverflow." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 9, 1, 2, 4, 8, 6, 3, 7]\n", + "[1, 2, 3, 4, 5, 6, 7, 8, 9]\n" + ] + } + ], + "source": [ + "def quick_sort_chu(a_list):\n", + " if len(a_list) < 2: return a_list\n", + " lesser = quick_sort([x for x in a_list[1:] if x <= a_list[0]])\n", + " bigger = quick_sort([x for x in a_list[1:] if x > a_list[0]])\n", + " return sum([lesser, [a_list[0]], bigger], [])\n", + "A = [5,9,1,2,4,8,6,3,7]\n", + "print(A)\n", + "B = quick_sort_chu(A)\n", + "print(B)" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a52176b2bbc4ed5ab2ae644c545d6ed4869eddce Mon Sep 17 00:00:00 2001 From: Joe James Date: Tue, 9 Jun 2020 13:41:55 -0700 Subject: [PATCH 34/77] Add Pandas IO and Time Series notebooks --- Pandas/Python Pandas Input-Output.ipynb | 762 ++++++++++++++++ Pandas/Python Pandas Time Series Data.ipynb | 962 ++++++++++++++++++++ 2 files changed, 1724 insertions(+) create mode 100644 Pandas/Python Pandas Input-Output.ipynb create mode 100644 Pandas/Python Pandas Time Series Data.ipynb diff --git a/Pandas/Python Pandas Input-Output.ipynb b/Pandas/Python Pandas Input-Output.ipynb new file mode 100644 index 00000000..4fc3f862 --- /dev/null +++ b/Pandas/Python Pandas Input-Output.ipynb @@ -0,0 +1,762 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Pandas I/O\n", + "### Creating DataFrames, Reading and Writing to CSV & JSON files \n", + "[Documentation](https://pandas.pydata.org/docs/index.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating DataFrames from Lists and Dicts\n", + "▶ New DataFrame from a **List** \n", + "Pandas automatically assigns numerical row indexes." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
00.027684
10.174996
20.743153
30.628041
40.658552
\n", + "
" + ], + "text/plain": [ + " 0\n", + "0 0.027684\n", + "1 0.174996\n", + "2 0.743153\n", + "3 0.628041\n", + "4 0.658552" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data1 = [random.random() for i in range(10000)]\n", + "df = pd.DataFrame(data1)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "â–¶ New DataFrame from a **2D List** \n", + "Column names default to integers. Each subList is a row." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
0A28
1B78
2C85
3D65
4E98
\n", + "
" + ], + "text/plain": [ + " 0 1\n", + "0 A 28\n", + "1 B 78\n", + "2 C 85\n", + "3 D 65\n", + "4 E 98" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data2 = [[i, random.randint(10,99)] for i in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ']\n", + "df = pd.DataFrame(data2)\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "â–¶ New DataFrame from a **Dictionary** \n", + "Dict Keys become column names" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ModelPriceSize
0T571.4257 inches
1T611.4861 inches
2T641.7364 inches
3T651.9565 inches
\n", + "
" + ], + "text/plain": [ + " Model Price Size\n", + "0 T57 1.42 57 inches\n", + "1 T61 1.48 61 inches\n", + "2 T64 1.73 64 inches\n", + "3 T65 1.95 65 inches" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data3 = {\n", + " 'Model':['T57','T61','T64','T65'],\n", + " 'Price':[1.42,1.48,1.73,1.95],\n", + " 'Size':['57 inches','61 inches','64 inches','65 inches']}\n", + "df = pd.DataFrame(data3)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Change previous example to use Model number as index. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PriceSize
T571.4257 inches
T611.4861 inches
T641.7364 inches
T651.9565 inches
\n", + "
" + ], + "text/plain": [ + " Price Size\n", + "T57 1.42 57 inches\n", + "T61 1.48 61 inches\n", + "T64 1.73 64 inches\n", + "T65 1.95 65 inches" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(\n", + " {'Price':data3['Price'],'Size':data3['Size']}, \n", + " index=data3['Model'])\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "â–¶ New DataFrame from a List of Dictionaries \n", + "Note, missing Length is populated with NaN (not a number)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
HtLenWt
06345.02.6
129NaN1.7
23771.04.2
\n", + "
" + ], + "text/plain": [ + " Ht Len Wt\n", + "0 63 45.0 2.6\n", + "1 29 NaN 1.7\n", + "2 37 71.0 4.2" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data4 = [\n", + " {'Ht':63, 'Len':45, 'Wt':2.6}, \n", + " {'Ht':29, 'Wt':1.7},\n", + " {'Ht':37, 'Len':71, 'Wt':4.2}]\n", + "df = pd.DataFrame(data4)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading & Writing DataFrames to CSV Files\n", + "[Documentation](https://pandas.pydata.org/docs/user_guide/io.html#csv-text-files) of numerous optional parameters. \n", + "\n", + "â–¶ Write DataFrame to CSV file " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.DataFrame(data4)\n", + "df.to_csv('outfile.csv', index=False) #, sep=';')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "â–¶ Read CSV file into DataFrame \n", + "Missing numerical data are given value NaN by default." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
HtLenWt
06345.02.6
129NaN1.7
23771.04.2
\n", + "
" + ], + "text/plain": [ + " Ht Len Wt\n", + "0 63 45.0 2.6\n", + "1 29 NaN 1.7\n", + "2 37 71.0 4.2" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('outfile.csv')\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "â–¶ Convert DataFrame to_string" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' Ht Len Wt\\n0 63 45.0 2.6\\n1 29 NaN 1.7\\n2 37 71.0 4.2'" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(data4)\n", + "d4str = df.to_string()\n", + "d4str" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Reading & Writing DataFrames to JSON files\n", + "[Documentation](https://pandas.pydata.org/docs/user_guide/io.html#csv-text-files) of numerous optional parameters. \n", + "\n", + "â–¶ Convert DataFrame to **JSON** string \n", + "No argument - json by columns is default, {column -> {index -> value}}" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\"Ht\":{\"0\":63,\"1\":29,\"2\":37},\"Len\":{\"0\":45.0,\"1\":null,\"2\":71.0},\"Wt\":{\"0\":2.6,\"1\":1.7,\"2\":4.2}}'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data4_json = df.to_json()\n", + "data4_json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Use orient='index' to structure the json by rows, {index -> {column -> value}}. \n", + "You can also strip out the row indices by using orient='records'." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\"0\":{\"Ht\":63,\"Len\":45.0,\"Wt\":2.6},\"1\":{\"Ht\":29,\"Len\":null,\"Wt\":1.7},\"2\":{\"Ht\":37,\"Len\":71.0,\"Wt\":4.2}}'" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data4_json = df.to_json(orient='index')\n", + "data4_json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "â–¶ Write to a text file in JSON format." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "data4_json = df.to_json('outjson.txt')\n", + "data4_json" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "â–¶ Read same JSON data back in to a DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
HtLenWt
06345.02.6
129NaN1.7
23771.04.2
\n", + "
" + ], + "text/plain": [ + " Ht Len Wt\n", + "0 63 45.0 2.6\n", + "1 29 NaN 1.7\n", + "2 37 71.0 4.2" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data4 = pd.read_json('outjson.txt')\n", + "data4" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Pandas/Python Pandas Time Series Data.ipynb b/Pandas/Python Pandas Time Series Data.ipynb new file mode 100644 index 00000000..1152cd3e --- /dev/null +++ b/Pandas/Python Pandas Time Series Data.ipynb @@ -0,0 +1,962 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python Pandas Time Series Data\n", + "[Documentation](https://pandas.pydata.org/docs/user_guide/timeseries.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import datetime\n", + "import random" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Formats Supported\n", + "Pandas datetime64 can interpret strings, Python datetime, and Numpy datetime64 objects. \n", + "Also note, a list of pd.datetime64 objects are automatically converted to a DatetimeIndex." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DatetimeIndex(['2020-06-01', '2020-06-02', '2020-06-03', '2020-06-04',\n", + " '2020-06-05'],\n", + " dtype='datetime64[ns]', freq=None)" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a1 = pd.to_datetime([\n", + " '6/1/2020', \n", + " '6-2-2020',\n", + " datetime.datetime(2020, 6, 3),\n", + " np.datetime64('2020-06-04'),\n", + " np.datetime64('2020-06-05')])\n", + "a1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pass in a format argument for custom formatted dates (case matters)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DatetimeIndex(['2020-06-14', '2020-06-15'], dtype='datetime64[ns]', freq=None)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a2 = pd.to_datetime(['2020/14/06', '2020/15/06'], format='%Y/%d/%m')\n", + "a2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Hours and Minutes too? No problem." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DatetimeIndex(['2020-08-06 14:05:00', '2020-09-06 06:45:00'], dtype='datetime64[ns]', freq=None)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a3 = pd.to_datetime(\n", + " ['2020/6/8 14.05', '2020/6/9 06.45'], format='%Y/%d/%m %H.%M')\n", + "a3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating a datetime sequence with fixed intervals\n", + "freq parameters: \n", + " D=days, W=weeks, M=months, B=business days, BW=bus weeks, BM=bus months" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DatetimeIndex(['2020-06-01', '2020-06-02', '2020-06-03', '2020-06-04',\n", + " '2020-06-05', '2020-06-06', '2020-06-07', '2020-06-08',\n", + " '2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',\n", + " '2020-06-13', '2020-06-14', '2020-06-15', '2020-06-16',\n", + " '2020-06-17', '2020-06-18', '2020-06-19', '2020-06-20',\n", + " '2020-06-21', '2020-06-22', '2020-06-23', '2020-06-24',\n", + " '2020-06-25', '2020-06-26', '2020-06-27', '2020-06-28',\n", + " '2020-06-29', '2020-06-30'],\n", + " dtype='datetime64[ns]', freq='D')\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
M
2020-06-070.970080
2020-06-140.809867
2020-06-180.917428
2020-06-200.945739
2020-06-260.815245
\n", + "
" + ], + "text/plain": [ + " M\n", + "2020-06-07 0.970080\n", + "2020-06-14 0.809867\n", + "2020-06-18 0.917428\n", + "2020-06-20 0.945739\n", + "2020-06-26 0.815245" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b1 = [random.random() for i in range(30)]\n", + "b2 = pd.date_range('2020-06-01', periods=30, freq='1d')\n", + "print(b2)\n", + "df = pd.DataFrame({'M':b1}, index=b2)\n", + "#df.loc['2020-06-18':]\n", + "df[df['M'] > 0.8]" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
2020-06-070.816153
2020-06-140.142715
2020-06-210.883367
2020-06-280.042243
2020-07-050.902994
2020-07-120.122903
2020-07-190.883686
2020-07-260.599879
2020-08-020.585071
2020-08-090.487260
2020-08-160.577816
2020-08-230.217873
2020-08-300.642893
2020-09-060.269524
2020-09-130.681086
2020-09-200.066728
2020-09-270.192068
2020-10-040.430084
2020-10-110.673437
2020-10-180.216691
2020-10-250.172302
2020-11-010.034461
2020-11-080.764077
2020-11-150.166790
2020-11-220.379369
2020-11-290.026259
2020-12-060.215560
2020-12-130.912649
2020-12-200.752434
2020-12-270.129831
2021-01-030.307117
2021-01-100.119653
2021-01-170.385201
2021-01-240.219277
2021-01-310.962418
2021-02-070.265013
2021-02-140.178213
2021-02-210.833785
2021-02-280.668348
2021-03-070.826616
2021-03-140.345981
2021-03-210.619586
2021-03-280.362562
2021-04-040.765329
2021-04-110.800720
2021-04-180.156365
2021-04-250.988019
2021-05-020.587013
2021-05-090.709290
2021-05-160.862771
2021-05-230.475769
2021-05-300.860615
\n", + "
" + ], + "text/plain": [ + " 0\n", + "2020-06-07 0.816153\n", + "2020-06-14 0.142715\n", + "2020-06-21 0.883367\n", + "2020-06-28 0.042243\n", + "2020-07-05 0.902994\n", + "2020-07-12 0.122903\n", + "2020-07-19 0.883686\n", + "2020-07-26 0.599879\n", + "2020-08-02 0.585071\n", + "2020-08-09 0.487260\n", + "2020-08-16 0.577816\n", + "2020-08-23 0.217873\n", + "2020-08-30 0.642893\n", + "2020-09-06 0.269524\n", + "2020-09-13 0.681086\n", + "2020-09-20 0.066728\n", + "2020-09-27 0.192068\n", + "2020-10-04 0.430084\n", + "2020-10-11 0.673437\n", + "2020-10-18 0.216691\n", + "2020-10-25 0.172302\n", + "2020-11-01 0.034461\n", + "2020-11-08 0.764077\n", + "2020-11-15 0.166790\n", + "2020-11-22 0.379369\n", + "2020-11-29 0.026259\n", + "2020-12-06 0.215560\n", + "2020-12-13 0.912649\n", + "2020-12-20 0.752434\n", + "2020-12-27 0.129831\n", + "2021-01-03 0.307117\n", + "2021-01-10 0.119653\n", + "2021-01-17 0.385201\n", + "2021-01-24 0.219277\n", + "2021-01-31 0.962418\n", + "2021-02-07 0.265013\n", + "2021-02-14 0.178213\n", + "2021-02-21 0.833785\n", + "2021-02-28 0.668348\n", + "2021-03-07 0.826616\n", + "2021-03-14 0.345981\n", + "2021-03-21 0.619586\n", + "2021-03-28 0.362562\n", + "2021-04-04 0.765329\n", + "2021-04-11 0.800720\n", + "2021-04-18 0.156365\n", + "2021-04-25 0.988019\n", + "2021-05-02 0.587013\n", + "2021-05-09 0.709290\n", + "2021-05-16 0.862771\n", + "2021-05-23 0.475769\n", + "2021-05-30 0.860615" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b3 = np.random.rand(52)\n", + "b4 = pd.date_range('2020-06-01', periods=52, freq='W')\n", + "df = pd.DataFrame(b3, index=b4)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Alternative to periods, you can give start and stop dates." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DatetimeIndex(['2020-06-30', '2020-07-31', '2020-08-31', '2020-09-30',\n", + " '2020-10-31', '2020-11-30', '2020-12-31'],\n", + " dtype='datetime64[ns]', freq='M')" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b3 = pd.date_range('2020-06-30', '2020-12-31', freq='M')\n", + "b3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Dates Index to/from CSV file\n", + "Create DataFrame with Dates as Index, Write it to a CSV file, then Read in the CSV data and put the dates as Index" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
alphabeta
2020-05-2910.4026
2020-05-308.9226
2020-05-315.0912
2020-06-013.8727
2020-06-023.9324
2020-06-034.7916
2020-06-049.1216
\n", + "
" + ], + "text/plain": [ + " alpha beta\n", + "2020-05-29 10.40 26\n", + "2020-05-30 8.92 26\n", + "2020-05-31 5.09 12\n", + "2020-06-01 3.87 27\n", + "2020-06-02 3.93 24\n", + "2020-06-03 4.79 16\n", + "2020-06-04 9.12 16" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d1 = np.round(6 + 4 * np.random.randn(7), decimals=2)\n", + "d2 = np.random.randint(12, 30, size=7)\n", + "d3 = pd.Series(pd.date_range('2020-05-29', periods=7, freq='1d'))\n", + "df = pd.DataFrame({'alpha':d1, 'beta':d2}, index=d3)\n", + "\n", + "df.to_csv('file01.csv')\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
alphabeta
2020-05-2910.4026
2020-05-308.9226
2020-05-315.0912
\n", + "
" + ], + "text/plain": [ + " alpha beta\n", + "2020-05-29 10.40 26\n", + "2020-05-30 8.92 26\n", + "2020-05-31 5.09 12" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('file01.csv', index_col=0)\n", + "print(type(df.index[2]))\n", + "df.index = pd.to_datetime(df.index, format='%Y/%m/%d')\n", + "print(type(df.index[2]))\n", + "df.loc[:'2020/05/31']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Constructing Dates from Multiple Columns\n", + "You have Month, Day and Year in separate fields, and need to combine them into a single Datetime field." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1998 10 10 0.4173998814595933\n" + ] + } + ], + "source": [ + "yyyy = [random.randint(1995,2020) for i in range(100)]\n", + "mm = [random.randint(1,12) for i in range(100)]\n", + "dd = [random.randint(1,28) for i in range(100)]\n", + "data = [random.random() for i in range(100)]\n", + "print(yyyy[5], mm[5], dd[5], data[5])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1998-10-10 00:00:00\n", + "1 0.4174\n", + "Name: 5, dtype: object" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df1 = pd.DataFrame({'year': yyyy,'month': mm, 'day': dd})\n", + "df1 = pd.to_datetime(df1) \n", + "df2 = pd.Series(data)\n", + "df = pd.concat([df1, df2], axis=1)\n", + "df.loc[5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Date Arithmetic" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Thursday'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "appointment = pd.Timestamp('2020-06-04')\n", + "appointment.day_name()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Uh oh! my appointment is delayed 2 days. \n", + "Here are 3 different ways to add 2 days to the date." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Saturday'" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "appointment = pd.Timestamp('2020-06-04')\n", + "appointment += pd.Timedelta('2 days')\n", + "appointment.day_name()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Saturday'" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "appointment = pd.Timestamp('2020-06-04')\n", + "appointment += pd.Timedelta(days=2)\n", + "appointment.day_name()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Date offsets: Day, Hour, Minute, Second, Milli, Micro, Nano " + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Saturday'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "appointment = pd.Timestamp('2020-06-04')\n", + "appointment += pd.offsets.Day(2)\n", + "appointment.day_name()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "NO, it's delayed 2 business days. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Monday'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "appointment = pd.Timestamp('2020-06-04')\n", + "appointment += pd.offsets.BDay(2)\n", + "appointment.day_name()" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From c48285101b74831e4e2cc61f17623e454a58db99 Mon Sep 17 00:00:00 2001 From: Joe James Date: Fri, 12 Jun 2020 09:59:37 -0700 Subject: [PATCH 35/77] Adding Data files --- Pandas/Python Pandas Time Series Data.ipynb | 424 ++++++++------------ Pandas/file01.csv | 8 + Pandas/outfile.csv | 4 + Pandas/outjson.txt | 1 + Pandas/pivot.csv | 2 + 5 files changed, 174 insertions(+), 265 deletions(-) create mode 100644 Pandas/file01.csv create mode 100644 Pandas/outfile.csv create mode 100644 Pandas/outjson.txt create mode 100644 Pandas/pivot.csv diff --git a/Pandas/Python Pandas Time Series Data.ipynb b/Pandas/Python Pandas Time Series Data.ipynb index 1152cd3e..3db1b4b4 100644 --- a/Pandas/Python Pandas Time Series Data.ipynb +++ b/Pandas/Python Pandas Time Series Data.ipynb @@ -217,7 +217,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 61, "metadata": {}, "outputs": [ { @@ -246,212 +246,16 @@ " \n", " \n", " \n", - " 2020-06-07\n", - " 0.816153\n", - " \n", - " \n", - " 2020-06-14\n", - " 0.142715\n", - " \n", - " \n", - " 2020-06-21\n", - " 0.883367\n", - " \n", - " \n", - " 2020-06-28\n", - " 0.042243\n", - " \n", - " \n", - " 2020-07-05\n", - " 0.902994\n", - " \n", - " \n", " 2020-07-12\n", - " 0.122903\n", + " 0.581691\n", " \n", " \n", " 2020-07-19\n", - " 0.883686\n", + " 0.611492\n", " \n", " \n", " 2020-07-26\n", - " 0.599879\n", - " \n", - " \n", - " 2020-08-02\n", - " 0.585071\n", - " \n", - " \n", - " 2020-08-09\n", - " 0.487260\n", - " \n", - " \n", - " 2020-08-16\n", - " 0.577816\n", - " \n", - " \n", - " 2020-08-23\n", - " 0.217873\n", - " \n", - " \n", - " 2020-08-30\n", - " 0.642893\n", - " \n", - " \n", - " 2020-09-06\n", - " 0.269524\n", - " \n", - " \n", - " 2020-09-13\n", - " 0.681086\n", - " \n", - " \n", - " 2020-09-20\n", - " 0.066728\n", - " \n", - " \n", - " 2020-09-27\n", - " 0.192068\n", - " \n", - " \n", - " 2020-10-04\n", - " 0.430084\n", - " \n", - " \n", - " 2020-10-11\n", - " 0.673437\n", - " \n", - " \n", - " 2020-10-18\n", - " 0.216691\n", - " \n", - " \n", - " 2020-10-25\n", - " 0.172302\n", - " \n", - " \n", - " 2020-11-01\n", - " 0.034461\n", - " \n", - " \n", - " 2020-11-08\n", - " 0.764077\n", - " \n", - " \n", - " 2020-11-15\n", - " 0.166790\n", - " \n", - " \n", - " 2020-11-22\n", - " 0.379369\n", - " \n", - " \n", - " 2020-11-29\n", - " 0.026259\n", - " \n", - " \n", - " 2020-12-06\n", - " 0.215560\n", - " \n", - " \n", - " 2020-12-13\n", - " 0.912649\n", - " \n", - " \n", - " 2020-12-20\n", - " 0.752434\n", - " \n", - " \n", - " 2020-12-27\n", - " 0.129831\n", - " \n", - " \n", - " 2021-01-03\n", - " 0.307117\n", - " \n", - " \n", - " 2021-01-10\n", - " 0.119653\n", - " \n", - " \n", - " 2021-01-17\n", - " 0.385201\n", - " \n", - " \n", - " 2021-01-24\n", - " 0.219277\n", - " \n", - " \n", - " 2021-01-31\n", - " 0.962418\n", - " \n", - " \n", - " 2021-02-07\n", - " 0.265013\n", - " \n", - " \n", - " 2021-02-14\n", - " 0.178213\n", - " \n", - " \n", - " 2021-02-21\n", - " 0.833785\n", - " \n", - " \n", - " 2021-02-28\n", - " 0.668348\n", - " \n", - " \n", - " 2021-03-07\n", - " 0.826616\n", - " \n", - " \n", - " 2021-03-14\n", - " 0.345981\n", - " \n", - " \n", - " 2021-03-21\n", - " 0.619586\n", - " \n", - " \n", - " 2021-03-28\n", - " 0.362562\n", - " \n", - " \n", - " 2021-04-04\n", - " 0.765329\n", - " \n", - " \n", - " 2021-04-11\n", - " 0.800720\n", - " \n", - " \n", - " 2021-04-18\n", - " 0.156365\n", - " \n", - " \n", - " 2021-04-25\n", - " 0.988019\n", - " \n", - " \n", - " 2021-05-02\n", - " 0.587013\n", - " \n", - " \n", - " 2021-05-09\n", - " 0.709290\n", - " \n", - " \n", - " 2021-05-16\n", - " 0.862771\n", - " \n", - " \n", - " 2021-05-23\n", - " 0.475769\n", - " \n", - " \n", - " 2021-05-30\n", - " 0.860615\n", + " 0.933940\n", " \n", " \n", "\n", @@ -459,61 +263,12 @@ ], "text/plain": [ " 0\n", - "2020-06-07 0.816153\n", - "2020-06-14 0.142715\n", - "2020-06-21 0.883367\n", - "2020-06-28 0.042243\n", - "2020-07-05 0.902994\n", - "2020-07-12 0.122903\n", - "2020-07-19 0.883686\n", - "2020-07-26 0.599879\n", - "2020-08-02 0.585071\n", - "2020-08-09 0.487260\n", - "2020-08-16 0.577816\n", - "2020-08-23 0.217873\n", - "2020-08-30 0.642893\n", - "2020-09-06 0.269524\n", - "2020-09-13 0.681086\n", - "2020-09-20 0.066728\n", - "2020-09-27 0.192068\n", - "2020-10-04 0.430084\n", - "2020-10-11 0.673437\n", - "2020-10-18 0.216691\n", - "2020-10-25 0.172302\n", - "2020-11-01 0.034461\n", - "2020-11-08 0.764077\n", - "2020-11-15 0.166790\n", - "2020-11-22 0.379369\n", - "2020-11-29 0.026259\n", - "2020-12-06 0.215560\n", - "2020-12-13 0.912649\n", - "2020-12-20 0.752434\n", - "2020-12-27 0.129831\n", - "2021-01-03 0.307117\n", - "2021-01-10 0.119653\n", - "2021-01-17 0.385201\n", - "2021-01-24 0.219277\n", - "2021-01-31 0.962418\n", - "2021-02-07 0.265013\n", - "2021-02-14 0.178213\n", - "2021-02-21 0.833785\n", - "2021-02-28 0.668348\n", - "2021-03-07 0.826616\n", - "2021-03-14 0.345981\n", - "2021-03-21 0.619586\n", - "2021-03-28 0.362562\n", - "2021-04-04 0.765329\n", - "2021-04-11 0.800720\n", - "2021-04-18 0.156365\n", - "2021-04-25 0.988019\n", - "2021-05-02 0.587013\n", - "2021-05-09 0.709290\n", - "2021-05-16 0.862771\n", - "2021-05-23 0.475769\n", - "2021-05-30 0.860615" + "2020-07-12 0.581691\n", + "2020-07-19 0.611492\n", + "2020-07-26 0.933940" ] }, - "execution_count": 6, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -522,7 +277,7 @@ "b3 = np.random.rand(52)\n", "b4 = pd.date_range('2020-06-01', periods=52, freq='W')\n", "df = pd.DataFrame(b3, index=b4)\n", - "df" + "df['2020-07-10':'2020-07-28']" ] }, { @@ -661,7 +416,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 63, "metadata": {}, "outputs": [ { @@ -724,7 +479,7 @@ "2020-05-31 5.09 12" ] }, - "execution_count": 9, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -734,7 +489,7 @@ "print(type(df.index[2]))\n", "df.index = pd.to_datetime(df.index, format='%Y/%m/%d')\n", "print(type(df.index[2]))\n", - "df.loc[:'2020/05/31']" + "df[:'2020/05/31']" ] }, { @@ -747,14 +502,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "1998 10 10 0.4173998814595933\n" + "2017 12 7 0.970109923902562\n" ] } ], @@ -768,18 +523,74 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 64, "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01
02016-10-180.282307
12007-09-090.004984
22016-12-120.652762
32017-04-140.199284
42013-03-230.163154
\n", + "
" + ], "text/plain": [ - "0 1998-10-10 00:00:00\n", - "1 0.4174\n", - "Name: 5, dtype: object" + " 0 1\n", + "0 2016-10-18 0.282307\n", + "1 2007-09-09 0.004984\n", + "2 2016-12-12 0.652762\n", + "3 2017-04-14 0.199284\n", + "4 2013-03-23 0.163154" ] }, - "execution_count": 11, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" } @@ -789,7 +600,90 @@ "df1 = pd.to_datetime(df1) \n", "df2 = pd.Series(data)\n", "df = pd.concat([df1, df2], axis=1)\n", - "df.loc[5]" + "df[:5]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pivot (Transpose) Rows & Columns\n", + "You normally want dates as the row index, not the column headers. \n", + "Flip the rows and columns using T." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0
2016-10-18 00:00:000.282307
2007-09-09 00:00:000.004984
2016-12-12 00:00:000.652762
2017-04-14 00:00:000.199284
2013-03-23 00:00:000.163154
\n", + "
" + ], + "text/plain": [ + " 0\n", + "2016-10-18 00:00:00 0.282307\n", + "2007-09-09 00:00:00 0.004984\n", + "2016-12-12 00:00:00 0.652762\n", + "2017-04-14 00:00:00 0.199284\n", + "2013-03-23 00:00:00 0.163154" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('pivot.csv')\n", + "df = df.T\n", + "df.head()" ] }, { diff --git a/Pandas/file01.csv b/Pandas/file01.csv new file mode 100644 index 00000000..229e74ef --- /dev/null +++ b/Pandas/file01.csv @@ -0,0 +1,8 @@ +,alpha,beta +2020-05-29,8.78,24 +2020-05-30,13.0,25 +2020-05-31,0.44,25 +2020-06-01,1.94,28 +2020-06-02,5.4,20 +2020-06-03,5.68,21 +2020-06-04,2.64,16 diff --git a/Pandas/outfile.csv b/Pandas/outfile.csv new file mode 100644 index 00000000..ba5d7289 --- /dev/null +++ b/Pandas/outfile.csv @@ -0,0 +1,4 @@ +Ht,Len,Wt +63,45.0,2.6 +29,,1.7 +37,71.0,4.2 diff --git a/Pandas/outjson.txt b/Pandas/outjson.txt new file mode 100644 index 00000000..0967acb0 --- /dev/null +++ b/Pandas/outjson.txt @@ -0,0 +1 @@ +{"0":{"Ht":63,"Len":45.0,"Wt":2.6},"1":{"Ht":29,"Len":null,"Wt":1.7},"2":{"Ht":37,"Len":71.0,"Wt":4.2}} \ No newline at end of file diff --git a/Pandas/pivot.csv b/Pandas/pivot.csv new file mode 100644 index 00000000..0c603dc6 --- /dev/null +++ b/Pandas/pivot.csv @@ -0,0 +1,2 @@ +2016-10-18 00:00:00,2007-09-09 00:00:00,2016-12-12 00:00:00,2017-04-14 00:00:00,2013-03-23 00:00:00,2017-12-07 00:00:00,2008-06-05 00:00:00,2004-12-06 00:00:00,1995-11-05 00:00:00,1996-09-12 00:00:00,2001-05-23 00:00:00,1997-07-08 00:00:00,1995-05-01 00:00:00,2008-11-06 00:00:00,2020-12-07 00:00:00,1998-02-03 00:00:00,1996-12-20 00:00:00,1998-04-25 00:00:00,2019-03-09 00:00:00,2019-08-25 00:00:00,2015-12-01 00:00:00,2004-04-08 00:00:00,2015-04-19 00:00:00,2013-12-23 00:00:00,2008-07-17 00:00:00,2016-02-16 00:00:00,2004-05-08 00:00:00,2000-10-26 00:00:00,1999-04-27 00:00:00,2014-06-23 00:00:00,2014-04-02 00:00:00,1999-06-05 00:00:00,1998-10-20 00:00:00,2013-01-24 00:00:00,2006-07-27 00:00:00,2002-08-20 00:00:00,2013-11-07 00:00:00,2006-07-01 00:00:00,2004-11-23 00:00:00,2008-09-07 00:00:00,1996-08-19 00:00:00,2016-01-27 00:00:00,2002-09-26 00:00:00,1996-09-09 00:00:00,1998-10-09 00:00:00,2000-07-19 00:00:00,2008-11-19 00:00:00,2014-03-11 00:00:00,1996-07-15 00:00:00,2000-02-05 00:00:00,1998-06-24 00:00:00,1998-01-23 00:00:00,1998-05-06 00:00:00,2003-08-05 00:00:00,2013-08-02 00:00:00,1996-03-07 00:00:00,1995-03-25 00:00:00,2012-10-06 00:00:00,2004-07-27 00:00:00,1999-08-05 00:00:00,2009-06-04 00:00:00,2007-07-27 00:00:00,2002-07-03 00:00:00,2011-06-07 00:00:00,2012-08-19 00:00:00,2018-03-22 00:00:00,1996-09-02 00:00:00,2008-09-02 00:00:00,2006-09-14 00:00:00,2007-07-11 00:00:00,2009-07-16 00:00:00,2016-06-24 00:00:00,2008-10-07 00:00:00,1997-06-13 00:00:00,2017-02-17 00:00:00,2009-05-09 00:00:00,1995-12-28 00:00:00,2014-05-25 00:00:00,1996-03-24 00:00:00,1996-11-12 00:00:00,2011-07-12 00:00:00,2009-11-24 00:00:00,2003-02-05 00:00:00,2010-07-06 00:00:00,1996-12-13 00:00:00,2014-10-11 00:00:00,2008-03-26 00:00:00,2019-07-07 00:00:00,2015-12-13 00:00:00,1997-08-21 00:00:00,2016-10-05 00:00:00,2016-10-08 00:00:00,2005-03-27 00:00:00,2011-03-08 00:00:00,2015-03-14 00:00:00,2001-10-11 00:00:00,1996-07-03 00:00:00,2006-10-22 00:00:00,2004-03-22 00:00:00,1998-12-07 00:00:00 +0.2823066951673592,0.004983503360937558,0.6527617484109105,0.19928401502972315,0.16315370812362973,0.970109923902562,0.28902358319246113,0.3869769040495181,0.036043163595530725,0.8466446865018183,0.3029305402508473,0.9333588096128297,0.1519465926874476,0.9927748105073949,0.4651284520015794,0.14707391568333994,0.08982833065821505,0.5883453931565746,0.3494752580177175,0.10167526699057972,0.07941368601234156,0.9358293552727159,0.10740538848773118,0.4506715669567083,0.8387140420947164,0.5746907600075374,0.758976559783973,0.3110498538520595,0.9993881318470451,0.26265671090461906,0.6470895524293089,0.49971727121051435,0.8195258715074762,0.3630891873905159,0.11926782337362651,0.555536083920244,0.8190498637543558,0.40175480684114895,0.7158884358768607,0.3076511179082977,0.06309063694263983,0.5979927629277495,0.7614082398079934,0.34115186547855936,0.5709798851222291,0.9855403495879589,0.7253074001190444,0.4685492447308346,0.03796109649032342,0.16599775387020776,0.7730834960205076,0.04807532952934723,0.9967131145813193,0.7619403019670993,0.4326634641827285,0.43819600412852544,0.8915384234633204,0.7388190145903542,0.1504441063873443,0.11645793742178479,0.8849805306825719,0.8209440808963199,0.03756126787686931,0.2921962688201817,0.637006806437786,0.21496659424673736,0.0673283796900469,0.2679415763216668,0.845924613974428,0.35520559789032924,0.9358371834432343,0.12177533426329734,0.7385219285657647,0.09006868872192064,0.21716948989174056,0.212482450203213,0.26463884587482933,0.4639594087198322,0.473534405458537,0.31034018086435244,0.4868968278642336,0.7276362315420386,0.5856335537301501,0.3848357918705628,0.5045424488044008,0.3669372132755703,0.5223717711718852,0.07330274927032765,0.12129741612938838,0.4463446916302444,0.06560636427124344,0.5628053006445556,0.6800242556861632,0.13053686078804783,0.9666542996125932,0.21805040691134103,0.920335829229451,0.5715463228495896,0.2984664705574499,0.28766845010273867 From 0db1d49f4a1f55d50107ecc8f988679c87eb2c0d Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 18 Jun 2020 12:54:45 -0700 Subject: [PATCH 36/77] Add files via upload --- Pandas/Pandas - Change Column Names.ipynb | 364 +++++++++ ...ndas - Delete Columns from DataFrame.ipynb | 757 ++++++++++++++++++ ...Pandas - Iterate Rows of a DataFrame.ipynb | 723 +++++++++++++++++ Pandas/iris.data | 151 ++++ 4 files changed, 1995 insertions(+) create mode 100644 Pandas/Pandas - Change Column Names.ipynb create mode 100644 Pandas/Pandas - Delete Columns from DataFrame.ipynb create mode 100644 Pandas/Pandas - Iterate Rows of a DataFrame.ipynb create mode 100644 Pandas/iris.data diff --git a/Pandas/Pandas - Change Column Names.ipynb b/Pandas/Pandas - Change Column Names.ipynb new file mode 100644 index 00000000..aa84e79c --- /dev/null +++ b/Pandas/Pandas - Change Column Names.ipynb @@ -0,0 +1,364 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pandas - Change Column Names" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ABCDLabel
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
..................
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " A B C D Label\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + ".. ... ... ... ... ...\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('iris.data', names=['A','B','C','D','Label'])\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "axis=1 tells Pandas it's column names. \n", + "inplace=True tells Pandas to save the changes to our DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
aabbCDLabel
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
..................
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " aa bb C D Label\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + ".. ... ... ... ... ...\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.rename({'A':'aa', 'B':'bb'}, axis=1, inplace=True)\n", + "df" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Pandas/Pandas - Delete Columns from DataFrame.ipynb b/Pandas/Pandas - Delete Columns from DataFrame.ipynb new file mode 100644 index 00000000..e728b3bf --- /dev/null +++ b/Pandas/Pandas - Delete Columns from DataFrame.ipynb @@ -0,0 +1,757 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pandas - Delete Columns from a DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ABCDLabel
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
..................
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " A B C D Label\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + ".. ... ... ... ... ...\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('iris.data', names=['A','B','C','D','Label'])\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1) to drop a single column\n", + "df.drop('col_name', axis=1) \n", + "To save changes you must either set df = df.drop(), or add inplace=True." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ACDLabel
05.11.40.2Iris-setosa
14.91.40.2Iris-setosa
24.71.30.2Iris-setosa
34.61.50.2Iris-setosa
45.01.40.2Iris-setosa
...............
1456.75.22.3Iris-virginica
1466.35.01.9Iris-virginica
1476.55.22.0Iris-virginica
1486.25.42.3Iris-virginica
1495.95.11.8Iris-virginica
\n", + "

150 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " A C D Label\n", + "0 5.1 1.4 0.2 Iris-setosa\n", + "1 4.9 1.4 0.2 Iris-setosa\n", + "2 4.7 1.3 0.2 Iris-setosa\n", + "3 4.6 1.5 0.2 Iris-setosa\n", + "4 5.0 1.4 0.2 Iris-setosa\n", + ".. ... ... ... ...\n", + "145 6.7 5.2 2.3 Iris-virginica\n", + "146 6.3 5.0 1.9 Iris-virginica\n", + "147 6.5 5.2 2.0 Iris-virginica\n", + "148 6.2 5.4 2.3 Iris-virginica\n", + "149 5.9 5.1 1.8 Iris-virginica\n", + "\n", + "[150 rows x 4 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.drop('B', axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ABCDLabel
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
..................
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " A B C D Label\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + ".. ... ... ... ... ...\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2) to drop multiple axes by name\n", + "df.drop(['col_name1', 'col_name2'], axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
BCD
03.51.40.2
13.01.40.2
23.21.30.2
33.11.50.2
43.61.40.2
............
1453.05.22.3
1462.55.01.9
1473.05.22.0
1483.45.42.3
1493.05.11.8
\n", + "

150 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " B C D\n", + "0 3.5 1.4 0.2\n", + "1 3.0 1.4 0.2\n", + "2 3.2 1.3 0.2\n", + "3 3.1 1.5 0.2\n", + "4 3.6 1.4 0.2\n", + ".. ... ... ...\n", + "145 3.0 5.2 2.3\n", + "146 2.5 5.0 1.9\n", + "147 3.0 5.2 2.0\n", + "148 3.4 5.4 2.3\n", + "149 3.0 5.1 1.8\n", + "\n", + "[150 rows x 3 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.drop(['A','Label'], axis=1, inplace=True)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3) to drop multiple axes by numerical column index\n", + "df.drop(df.columns[[idx1, idx2]], axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
C
01.4
11.4
21.3
31.5
41.4
......
1455.2
1465.0
1475.2
1485.4
1495.1
\n", + "

150 rows × 1 columns

\n", + "
" + ], + "text/plain": [ + " C\n", + "0 1.4\n", + "1 1.4\n", + "2 1.3\n", + "3 1.5\n", + "4 1.4\n", + ".. ...\n", + "145 5.2\n", + "146 5.0\n", + "147 5.2\n", + "148 5.4\n", + "149 5.1\n", + "\n", + "[150 rows x 1 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.drop(df.columns[[0, 2]], axis=1, inplace=True)\n", + "df" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Pandas/Pandas - Iterate Rows of a DataFrame.ipynb b/Pandas/Pandas - Iterate Rows of a DataFrame.ipynb new file mode 100644 index 00000000..e911a4be --- /dev/null +++ b/Pandas/Pandas - Iterate Rows of a DataFrame.ipynb @@ -0,0 +1,723 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pandas - Iterate Rows of a DataFrame " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
01234
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
..................
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 4\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + ".. ... ... ... ... ...\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('iris.data', header=None)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get a List of one Column\n", + "Use a list comprehension." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[1.4,\n", + " 1.4,\n", + " 1.3,\n", + " 1.5,\n", + " 1.4,\n", + " 1.7,\n", + " 1.4,\n", + " 1.5,\n", + " 1.4,\n", + " 1.5,\n", + " 1.5,\n", + " 1.6,\n", + " 1.4,\n", + " 1.1,\n", + " 1.2,\n", + " 1.5,\n", + " 1.3,\n", + " 1.4,\n", + " 1.7,\n", + " 1.5,\n", + " 1.7,\n", + " 1.5,\n", + " 1.0,\n", + " 1.7,\n", + " 1.9,\n", + " 1.6,\n", + " 1.6,\n", + " 1.5,\n", + " 1.4,\n", + " 1.6,\n", + " 1.6,\n", + " 1.5,\n", + " 1.5,\n", + " 1.4,\n", + " 1.5,\n", + " 1.2,\n", + " 1.3,\n", + " 1.5,\n", + " 1.3,\n", + " 1.5,\n", + " 1.3,\n", + " 1.3,\n", + " 1.3,\n", + " 1.6,\n", + " 1.9,\n", + " 1.4,\n", + " 1.6,\n", + " 1.4,\n", + " 1.5,\n", + " 1.4,\n", + " 4.7,\n", + " 4.5,\n", + " 4.9,\n", + " 4.0,\n", + " 4.6,\n", + " 4.5,\n", + " 4.7,\n", + " 3.3,\n", + " 4.6,\n", + " 3.9,\n", + " 3.5,\n", + " 4.2,\n", + " 4.0,\n", + " 4.7,\n", + " 3.6,\n", + " 4.4,\n", + " 4.5,\n", + " 4.1,\n", + " 4.5,\n", + " 3.9,\n", + " 4.8,\n", + " 4.0,\n", + " 4.9,\n", + " 4.7,\n", + " 4.3,\n", + " 4.4,\n", + " 4.8,\n", + " 5.0,\n", + " 4.5,\n", + " 3.5,\n", + " 3.8,\n", + " 3.7,\n", + " 3.9,\n", + " 5.1,\n", + " 4.5,\n", + " 4.5,\n", + " 4.7,\n", + " 4.4,\n", + " 4.1,\n", + " 4.0,\n", + " 4.4,\n", + " 4.6,\n", + " 4.0,\n", + " 3.3,\n", + " 4.2,\n", + " 4.2,\n", + " 4.2,\n", + " 4.3,\n", + " 3.0,\n", + " 4.1,\n", + " 6.0,\n", + " 5.1,\n", + " 5.9,\n", + " 5.6,\n", + " 5.8,\n", + " 6.6,\n", + " 4.5,\n", + " 6.3,\n", + " 5.8,\n", + " 6.1,\n", + " 5.1,\n", + " 5.3,\n", + " 5.5,\n", + " 5.0,\n", + " 5.1,\n", + " 5.3,\n", + " 5.5,\n", + " 6.7,\n", + " 6.9,\n", + " 5.0,\n", + " 5.7,\n", + " 4.9,\n", + " 6.7,\n", + " 4.9,\n", + " 5.7,\n", + " 6.0,\n", + " 4.8,\n", + " 4.9,\n", + " 5.6,\n", + " 5.8,\n", + " 6.1,\n", + " 6.4,\n", + " 5.6,\n", + " 5.1,\n", + " 5.6,\n", + " 6.1,\n", + " 5.6,\n", + " 5.5,\n", + " 4.8,\n", + " 5.4,\n", + " 5.6,\n", + " 5.1,\n", + " 5.1,\n", + " 5.9,\n", + " 5.7,\n", + " 5.2,\n", + " 5.0,\n", + " 5.2,\n", + " 5.4,\n", + " 5.1]" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "col2 = [x for x in df[2]]\n", + "col2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Iterate Rows with Index and each Row as a List\n", + "**DO NOT** try to change data in the df this way, but it is convenient for iterating. \n", + "Itertuples is supposed to be much faster than Iterrows for large datasets." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + "5 5.4 3.9 1.7 0.4 Iris-setosa\n", + "6 4.6 3.4 1.4 0.3 Iris-setosa\n", + "7 5.0 3.4 1.5 0.2 Iris-setosa\n", + "8 4.4 2.9 1.4 0.2 Iris-setosa\n", + "9 4.9 3.1 1.5 0.1 Iris-setosa\n", + "10 5.4 3.7 1.5 0.2 Iris-setosa\n", + "11 4.8 3.4 1.6 0.2 Iris-setosa\n", + "12 4.8 3.0 1.4 0.1 Iris-setosa\n", + "13 4.3 3.0 1.1 0.1 Iris-setosa\n", + "14 5.8 4.0 1.2 0.2 Iris-setosa\n", + "15 5.7 4.4 1.5 0.4 Iris-setosa\n", + "16 5.4 3.9 1.3 0.4 Iris-setosa\n", + "17 5.1 3.5 1.4 0.3 Iris-setosa\n", + "18 5.7 3.8 1.7 0.3 Iris-setosa\n", + "19 5.1 3.8 1.5 0.3 Iris-setosa\n", + "20 5.4 3.4 1.7 0.2 Iris-setosa\n", + "21 5.1 3.7 1.5 0.4 Iris-setosa\n", + "22 4.6 3.6 1.0 0.2 Iris-setosa\n", + "23 5.1 3.3 1.7 0.5 Iris-setosa\n", + "24 4.8 3.4 1.9 0.2 Iris-setosa\n", + "25 5.0 3.0 1.6 0.2 Iris-setosa\n", + "26 5.0 3.4 1.6 0.4 Iris-setosa\n", + "27 5.2 3.5 1.5 0.2 Iris-setosa\n", + "28 5.2 3.4 1.4 0.2 Iris-setosa\n", + "29 4.7 3.2 1.6 0.2 Iris-setosa\n", + "30 4.8 3.1 1.6 0.2 Iris-setosa\n", + "31 5.4 3.4 1.5 0.4 Iris-setosa\n", + "32 5.2 4.1 1.5 0.1 Iris-setosa\n", + "33 5.5 4.2 1.4 0.2 Iris-setosa\n", + "34 4.9 3.1 1.5 0.1 Iris-setosa\n", + "35 5.0 3.2 1.2 0.2 Iris-setosa\n", + "36 5.5 3.5 1.3 0.2 Iris-setosa\n", + "37 4.9 3.1 1.5 0.1 Iris-setosa\n", + "38 4.4 3.0 1.3 0.2 Iris-setosa\n", + "39 5.1 3.4 1.5 0.2 Iris-setosa\n", + "40 5.0 3.5 1.3 0.3 Iris-setosa\n", + "41 4.5 2.3 1.3 0.3 Iris-setosa\n", + "42 4.4 3.2 1.3 0.2 Iris-setosa\n", + "43 5.0 3.5 1.6 0.6 Iris-setosa\n", + "44 5.1 3.8 1.9 0.4 Iris-setosa\n", + "45 4.8 3.0 1.4 0.3 Iris-setosa\n", + "46 5.1 3.8 1.6 0.2 Iris-setosa\n", + "47 4.6 3.2 1.4 0.2 Iris-setosa\n", + "48 5.3 3.7 1.5 0.2 Iris-setosa\n", + "49 5.0 3.3 1.4 0.2 Iris-setosa\n", + "50 7.0 3.2 4.7 1.4 Iris-versicolor\n", + "51 6.4 3.2 4.5 1.5 Iris-versicolor\n", + "52 6.9 3.1 4.9 1.5 Iris-versicolor\n", + "53 5.5 2.3 4.0 1.3 Iris-versicolor\n", + "54 6.5 2.8 4.6 1.5 Iris-versicolor\n", + "55 5.7 2.8 4.5 1.3 Iris-versicolor\n", + "56 6.3 3.3 4.7 1.6 Iris-versicolor\n", + "57 4.9 2.4 3.3 1.0 Iris-versicolor\n", + "58 6.6 2.9 4.6 1.3 Iris-versicolor\n", + "59 5.2 2.7 3.9 1.4 Iris-versicolor\n", + "60 5.0 2.0 3.5 1.0 Iris-versicolor\n", + "61 5.9 3.0 4.2 1.5 Iris-versicolor\n", + "62 6.0 2.2 4.0 1.0 Iris-versicolor\n", + "63 6.1 2.9 4.7 1.4 Iris-versicolor\n", + "64 5.6 2.9 3.6 1.3 Iris-versicolor\n", + "65 6.7 3.1 4.4 1.4 Iris-versicolor\n", + "66 5.6 3.0 4.5 1.5 Iris-versicolor\n", + "67 5.8 2.7 4.1 1.0 Iris-versicolor\n", + "68 6.2 2.2 4.5 1.5 Iris-versicolor\n", + "69 5.6 2.5 3.9 1.1 Iris-versicolor\n", + "70 5.9 3.2 4.8 1.8 Iris-versicolor\n", + "71 6.1 2.8 4.0 1.3 Iris-versicolor\n", + "72 6.3 2.5 4.9 1.5 Iris-versicolor\n", + "73 6.1 2.8 4.7 1.2 Iris-versicolor\n", + "74 6.4 2.9 4.3 1.3 Iris-versicolor\n", + "75 6.6 3.0 4.4 1.4 Iris-versicolor\n", + "76 6.8 2.8 4.8 1.4 Iris-versicolor\n", + "77 6.7 3.0 5.0 1.7 Iris-versicolor\n", + "78 6.0 2.9 4.5 1.5 Iris-versicolor\n", + "79 5.7 2.6 3.5 1.0 Iris-versicolor\n", + "80 5.5 2.4 3.8 1.1 Iris-versicolor\n", + "81 5.5 2.4 3.7 1.0 Iris-versicolor\n", + "82 5.8 2.7 3.9 1.2 Iris-versicolor\n", + "83 6.0 2.7 5.1 1.6 Iris-versicolor\n", + "84 5.4 3.0 4.5 1.5 Iris-versicolor\n", + "85 6.0 3.4 4.5 1.6 Iris-versicolor\n", + "86 6.7 3.1 4.7 1.5 Iris-versicolor\n", + "87 6.3 2.3 4.4 1.3 Iris-versicolor\n", + "88 5.6 3.0 4.1 1.3 Iris-versicolor\n", + "89 5.5 2.5 4.0 1.3 Iris-versicolor\n", + "90 5.5 2.6 4.4 1.2 Iris-versicolor\n", + "91 6.1 3.0 4.6 1.4 Iris-versicolor\n", + "92 5.8 2.6 4.0 1.2 Iris-versicolor\n", + "93 5.0 2.3 3.3 1.0 Iris-versicolor\n", + "94 5.6 2.7 4.2 1.3 Iris-versicolor\n", + "95 5.7 3.0 4.2 1.2 Iris-versicolor\n", + "96 5.7 2.9 4.2 1.3 Iris-versicolor\n", + "97 6.2 2.9 4.3 1.3 Iris-versicolor\n", + "98 5.1 2.5 3.0 1.1 Iris-versicolor\n", + "99 5.7 2.8 4.1 1.3 Iris-versicolor\n", + "100 6.3 3.3 6.0 2.5 Iris-virginica\n", + "101 5.8 2.7 5.1 1.9 Iris-virginica\n", + "102 7.1 3.0 5.9 2.1 Iris-virginica\n", + "103 6.3 2.9 5.6 1.8 Iris-virginica\n", + "104 6.5 3.0 5.8 2.2 Iris-virginica\n", + "105 7.6 3.0 6.6 2.1 Iris-virginica\n", + "106 4.9 2.5 4.5 1.7 Iris-virginica\n", + "107 7.3 2.9 6.3 1.8 Iris-virginica\n", + "108 6.7 2.5 5.8 1.8 Iris-virginica\n", + "109 7.2 3.6 6.1 2.5 Iris-virginica\n", + "110 6.5 3.2 5.1 2.0 Iris-virginica\n", + "111 6.4 2.7 5.3 1.9 Iris-virginica\n", + "112 6.8 3.0 5.5 2.1 Iris-virginica\n", + "113 5.7 2.5 5.0 2.0 Iris-virginica\n", + "114 5.8 2.8 5.1 2.4 Iris-virginica\n", + "115 6.4 3.2 5.3 2.3 Iris-virginica\n", + "116 6.5 3.0 5.5 1.8 Iris-virginica\n", + "117 7.7 3.8 6.7 2.2 Iris-virginica\n", + "118 7.7 2.6 6.9 2.3 Iris-virginica\n", + "119 6.0 2.2 5.0 1.5 Iris-virginica\n", + "120 6.9 3.2 5.7 2.3 Iris-virginica\n", + "121 5.6 2.8 4.9 2.0 Iris-virginica\n", + "122 7.7 2.8 6.7 2.0 Iris-virginica\n", + "123 6.3 2.7 4.9 1.8 Iris-virginica\n", + "124 6.7 3.3 5.7 2.1 Iris-virginica\n", + "125 7.2 3.2 6.0 1.8 Iris-virginica\n", + "126 6.2 2.8 4.8 1.8 Iris-virginica\n", + "127 6.1 3.0 4.9 1.8 Iris-virginica\n", + "128 6.4 2.8 5.6 2.1 Iris-virginica\n", + "129 7.2 3.0 5.8 1.6 Iris-virginica\n", + "130 7.4 2.8 6.1 1.9 Iris-virginica\n", + "131 7.9 3.8 6.4 2.0 Iris-virginica\n", + "132 6.4 2.8 5.6 2.2 Iris-virginica\n", + "133 6.3 2.8 5.1 1.5 Iris-virginica\n", + "134 6.1 2.6 5.6 1.4 Iris-virginica\n", + "135 7.7 3.0 6.1 2.3 Iris-virginica\n", + "136 6.3 3.4 5.6 2.4 Iris-virginica\n", + "137 6.4 3.1 5.5 1.8 Iris-virginica\n", + "138 6.0 3.0 4.8 1.8 Iris-virginica\n", + "139 6.9 3.1 5.4 2.1 Iris-virginica\n", + "140 6.7 3.1 5.6 2.4 Iris-virginica\n", + "141 6.9 3.1 5.1 2.3 Iris-virginica\n", + "142 5.8 2.7 5.1 1.9 Iris-virginica\n", + "143 6.8 3.2 5.9 2.3 Iris-virginica\n", + "144 6.7 3.3 5.7 2.5 Iris-virginica\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n" + ] + } + ], + "source": [ + "for i, row in df.iterrows():\n", + " print(i, row[0], row[1], row[2], row[3], row[4])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + "5 5.4 3.9 1.7 0.4 Iris-setosa\n", + "6 4.6 3.4 1.4 0.3 Iris-setosa\n", + "7 5.0 3.4 1.5 0.2 Iris-setosa\n", + "8 4.4 2.9 1.4 0.2 Iris-setosa\n", + "9 4.9 3.1 1.5 0.1 Iris-setosa\n", + "10 5.4 3.7 1.5 0.2 Iris-setosa\n", + "11 4.8 3.4 1.6 0.2 Iris-setosa\n", + "12 4.8 3.0 1.4 0.1 Iris-setosa\n", + "13 4.3 3.0 1.1 0.1 Iris-setosa\n", + "14 5.8 4.0 1.2 0.2 Iris-setosa\n", + "15 5.7 4.4 1.5 0.4 Iris-setosa\n", + "16 5.4 3.9 1.3 0.4 Iris-setosa\n", + "17 5.1 3.5 1.4 0.3 Iris-setosa\n", + "18 5.7 3.8 1.7 0.3 Iris-setosa\n", + "19 5.1 3.8 1.5 0.3 Iris-setosa\n", + "20 5.4 3.4 1.7 0.2 Iris-setosa\n", + "21 5.1 3.7 1.5 0.4 Iris-setosa\n", + "22 4.6 3.6 1.0 0.2 Iris-setosa\n", + "23 5.1 3.3 1.7 0.5 Iris-setosa\n", + "24 4.8 3.4 1.9 0.2 Iris-setosa\n", + "25 5.0 3.0 1.6 0.2 Iris-setosa\n", + "26 5.0 3.4 1.6 0.4 Iris-setosa\n", + "27 5.2 3.5 1.5 0.2 Iris-setosa\n", + "28 5.2 3.4 1.4 0.2 Iris-setosa\n", + "29 4.7 3.2 1.6 0.2 Iris-setosa\n", + "30 4.8 3.1 1.6 0.2 Iris-setosa\n", + "31 5.4 3.4 1.5 0.4 Iris-setosa\n", + "32 5.2 4.1 1.5 0.1 Iris-setosa\n", + "33 5.5 4.2 1.4 0.2 Iris-setosa\n", + "34 4.9 3.1 1.5 0.1 Iris-setosa\n", + "35 5.0 3.2 1.2 0.2 Iris-setosa\n", + "36 5.5 3.5 1.3 0.2 Iris-setosa\n", + "37 4.9 3.1 1.5 0.1 Iris-setosa\n", + "38 4.4 3.0 1.3 0.2 Iris-setosa\n", + "39 5.1 3.4 1.5 0.2 Iris-setosa\n", + "40 5.0 3.5 1.3 0.3 Iris-setosa\n", + "41 4.5 2.3 1.3 0.3 Iris-setosa\n", + "42 4.4 3.2 1.3 0.2 Iris-setosa\n", + "43 5.0 3.5 1.6 0.6 Iris-setosa\n", + "44 5.1 3.8 1.9 0.4 Iris-setosa\n", + "45 4.8 3.0 1.4 0.3 Iris-setosa\n", + "46 5.1 3.8 1.6 0.2 Iris-setosa\n", + "47 4.6 3.2 1.4 0.2 Iris-setosa\n", + "48 5.3 3.7 1.5 0.2 Iris-setosa\n", + "49 5.0 3.3 1.4 0.2 Iris-setosa\n", + "50 7.0 3.2 4.7 1.4 Iris-versicolor\n", + "51 6.4 3.2 4.5 1.5 Iris-versicolor\n", + "52 6.9 3.1 4.9 1.5 Iris-versicolor\n", + "53 5.5 2.3 4.0 1.3 Iris-versicolor\n", + "54 6.5 2.8 4.6 1.5 Iris-versicolor\n", + "55 5.7 2.8 4.5 1.3 Iris-versicolor\n", + "56 6.3 3.3 4.7 1.6 Iris-versicolor\n", + "57 4.9 2.4 3.3 1.0 Iris-versicolor\n", + "58 6.6 2.9 4.6 1.3 Iris-versicolor\n", + "59 5.2 2.7 3.9 1.4 Iris-versicolor\n", + "60 5.0 2.0 3.5 1.0 Iris-versicolor\n", + "61 5.9 3.0 4.2 1.5 Iris-versicolor\n", + "62 6.0 2.2 4.0 1.0 Iris-versicolor\n", + "63 6.1 2.9 4.7 1.4 Iris-versicolor\n", + "64 5.6 2.9 3.6 1.3 Iris-versicolor\n", + "65 6.7 3.1 4.4 1.4 Iris-versicolor\n", + "66 5.6 3.0 4.5 1.5 Iris-versicolor\n", + "67 5.8 2.7 4.1 1.0 Iris-versicolor\n", + "68 6.2 2.2 4.5 1.5 Iris-versicolor\n", + "69 5.6 2.5 3.9 1.1 Iris-versicolor\n", + "70 5.9 3.2 4.8 1.8 Iris-versicolor\n", + "71 6.1 2.8 4.0 1.3 Iris-versicolor\n", + "72 6.3 2.5 4.9 1.5 Iris-versicolor\n", + "73 6.1 2.8 4.7 1.2 Iris-versicolor\n", + "74 6.4 2.9 4.3 1.3 Iris-versicolor\n", + "75 6.6 3.0 4.4 1.4 Iris-versicolor\n", + "76 6.8 2.8 4.8 1.4 Iris-versicolor\n", + "77 6.7 3.0 5.0 1.7 Iris-versicolor\n", + "78 6.0 2.9 4.5 1.5 Iris-versicolor\n", + "79 5.7 2.6 3.5 1.0 Iris-versicolor\n", + "80 5.5 2.4 3.8 1.1 Iris-versicolor\n", + "81 5.5 2.4 3.7 1.0 Iris-versicolor\n", + "82 5.8 2.7 3.9 1.2 Iris-versicolor\n", + "83 6.0 2.7 5.1 1.6 Iris-versicolor\n", + "84 5.4 3.0 4.5 1.5 Iris-versicolor\n", + "85 6.0 3.4 4.5 1.6 Iris-versicolor\n", + "86 6.7 3.1 4.7 1.5 Iris-versicolor\n", + "87 6.3 2.3 4.4 1.3 Iris-versicolor\n", + "88 5.6 3.0 4.1 1.3 Iris-versicolor\n", + "89 5.5 2.5 4.0 1.3 Iris-versicolor\n", + "90 5.5 2.6 4.4 1.2 Iris-versicolor\n", + "91 6.1 3.0 4.6 1.4 Iris-versicolor\n", + "92 5.8 2.6 4.0 1.2 Iris-versicolor\n", + "93 5.0 2.3 3.3 1.0 Iris-versicolor\n", + "94 5.6 2.7 4.2 1.3 Iris-versicolor\n", + "95 5.7 3.0 4.2 1.2 Iris-versicolor\n", + "96 5.7 2.9 4.2 1.3 Iris-versicolor\n", + "97 6.2 2.9 4.3 1.3 Iris-versicolor\n", + "98 5.1 2.5 3.0 1.1 Iris-versicolor\n", + "99 5.7 2.8 4.1 1.3 Iris-versicolor\n", + "100 6.3 3.3 6.0 2.5 Iris-virginica\n", + "101 5.8 2.7 5.1 1.9 Iris-virginica\n", + "102 7.1 3.0 5.9 2.1 Iris-virginica\n", + "103 6.3 2.9 5.6 1.8 Iris-virginica\n", + "104 6.5 3.0 5.8 2.2 Iris-virginica\n", + "105 7.6 3.0 6.6 2.1 Iris-virginica\n", + "106 4.9 2.5 4.5 1.7 Iris-virginica\n", + "107 7.3 2.9 6.3 1.8 Iris-virginica\n", + "108 6.7 2.5 5.8 1.8 Iris-virginica\n", + "109 7.2 3.6 6.1 2.5 Iris-virginica\n", + "110 6.5 3.2 5.1 2.0 Iris-virginica\n", + "111 6.4 2.7 5.3 1.9 Iris-virginica\n", + "112 6.8 3.0 5.5 2.1 Iris-virginica\n", + "113 5.7 2.5 5.0 2.0 Iris-virginica\n", + "114 5.8 2.8 5.1 2.4 Iris-virginica\n", + "115 6.4 3.2 5.3 2.3 Iris-virginica\n", + "116 6.5 3.0 5.5 1.8 Iris-virginica\n", + "117 7.7 3.8 6.7 2.2 Iris-virginica\n", + "118 7.7 2.6 6.9 2.3 Iris-virginica\n", + "119 6.0 2.2 5.0 1.5 Iris-virginica\n", + "120 6.9 3.2 5.7 2.3 Iris-virginica\n", + "121 5.6 2.8 4.9 2.0 Iris-virginica\n", + "122 7.7 2.8 6.7 2.0 Iris-virginica\n", + "123 6.3 2.7 4.9 1.8 Iris-virginica\n", + "124 6.7 3.3 5.7 2.1 Iris-virginica\n", + "125 7.2 3.2 6.0 1.8 Iris-virginica\n", + "126 6.2 2.8 4.8 1.8 Iris-virginica\n", + "127 6.1 3.0 4.9 1.8 Iris-virginica\n", + "128 6.4 2.8 5.6 2.1 Iris-virginica\n", + "129 7.2 3.0 5.8 1.6 Iris-virginica\n", + "130 7.4 2.8 6.1 1.9 Iris-virginica\n", + "131 7.9 3.8 6.4 2.0 Iris-virginica\n", + "132 6.4 2.8 5.6 2.2 Iris-virginica\n", + "133 6.3 2.8 5.1 1.5 Iris-virginica\n", + "134 6.1 2.6 5.6 1.4 Iris-virginica\n", + "135 7.7 3.0 6.1 2.3 Iris-virginica\n", + "136 6.3 3.4 5.6 2.4 Iris-virginica\n", + "137 6.4 3.1 5.5 1.8 Iris-virginica\n", + "138 6.0 3.0 4.8 1.8 Iris-virginica\n", + "139 6.9 3.1 5.4 2.1 Iris-virginica\n", + "140 6.7 3.1 5.6 2.4 Iris-virginica\n", + "141 6.9 3.1 5.1 2.3 Iris-virginica\n", + "142 5.8 2.7 5.1 1.9 Iris-virginica\n", + "143 6.8 3.2 5.9 2.3 Iris-virginica\n", + "144 6.7 3.3 5.7 2.5 Iris-virginica\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n" + ] + } + ], + "source": [ + "for row in df.itertuples(name=None): \n", + " print(row[0], row[1], row[2], row[3], row[4], row[5])" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Pandas/iris.data b/Pandas/iris.data new file mode 100644 index 00000000..5c4316cd --- /dev/null +++ b/Pandas/iris.data @@ -0,0 +1,151 @@ +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica + From a097b552b60efb914ba57aa9464445bb159a093e Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 18 Jun 2020 22:48:32 -0700 Subject: [PATCH 37/77] Add files via upload --- ...das - Delete NaN Rows from DataFrame.ipynb | 655 ++++++++++++++++++ .../Pandas Reorder Columns in DataFrame.ipynb | 420 +++++++++++ 2 files changed, 1075 insertions(+) create mode 100644 Pandas/Pandas - Delete NaN Rows from DataFrame.ipynb create mode 100644 Pandas/Pandas Reorder Columns in DataFrame.ipynb diff --git a/Pandas/Pandas - Delete NaN Rows from DataFrame.ipynb b/Pandas/Pandas - Delete NaN Rows from DataFrame.ipynb new file mode 100644 index 00000000..79d4b0af --- /dev/null +++ b/Pandas/Pandas - Delete NaN Rows from DataFrame.ipynb @@ -0,0 +1,655 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pandas - Delete NaN Rows from DataFrame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[StackOverflow Thread](https://stackoverflow.com/questions/13413590/how-to-drop-rows-of-pandas-dataframe-whose-value-in-a-certain-column-is-nan)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
0-1.358720-0.4939670.258351
10.3383470.498426-0.050406
20.821865-0.376314-1.504425
3-0.5518760.6945950.540055
4-0.493108-0.5702550.160218
5-0.705264-1.9409840.321970
60.2571330.642613-0.416996
7-1.391762-1.689991-1.804575
81.459479-0.731590-0.061360
91.314401-1.666592-1.778455
10-0.353425-0.654705-0.155042
11-0.898696-0.7568020.539142
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "0 -1.358720 -0.493967 0.258351\n", + "1 0.338347 0.498426 -0.050406\n", + "2 0.821865 -0.376314 -1.504425\n", + "3 -0.551876 0.694595 0.540055\n", + "4 -0.493108 -0.570255 0.160218\n", + "5 -0.705264 -1.940984 0.321970\n", + "6 0.257133 0.642613 -0.416996\n", + "7 -1.391762 -1.689991 -1.804575\n", + "8 1.459479 -0.731590 -0.061360\n", + "9 1.314401 -1.666592 -1.778455\n", + "10 -0.353425 -0.654705 -0.155042\n", + "11 -0.898696 -0.756802 0.539142" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame(np.random.randn(12,3))\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
0NaNNaNNaN
10.3383470.498426-0.050406
2NaN-0.376314-1.504425
3-0.551876NaN0.540055
4NaN-0.570255NaN
5-0.705264-1.9409840.321970
6NaNNaN-0.416996
7-1.391762-1.689991-1.804575
8NaN-0.731590NaN
91.314401NaN-1.778455
10NaN-0.654705-0.155042
11-0.898696-0.7568020.539142
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "0 NaN NaN NaN\n", + "1 0.338347 0.498426 -0.050406\n", + "2 NaN -0.376314 -1.504425\n", + "3 -0.551876 NaN 0.540055\n", + "4 NaN -0.570255 NaN\n", + "5 -0.705264 -1.940984 0.321970\n", + "6 NaN NaN -0.416996\n", + "7 -1.391762 -1.689991 -1.804575\n", + "8 NaN -0.731590 NaN\n", + "9 1.314401 NaN -1.778455\n", + "10 NaN -0.654705 -0.155042\n", + "11 -0.898696 -0.756802 0.539142" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.iloc[::2,0] = np.nan\n", + "df.iloc[::3,1] = np.nan\n", + "df.iloc[::4,2] = np.nan\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**- Drop all rows that have *any* NaN values**" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
10.3383470.498426-0.050406
5-0.705264-1.9409840.321970
7-1.391762-1.689991-1.804575
11-0.898696-0.7568020.539142
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "1 0.338347 0.498426 -0.050406\n", + "5 -0.705264 -1.940984 0.321970\n", + "7 -1.391762 -1.689991 -1.804575\n", + "11 -0.898696 -0.756802 0.539142" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dropna()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**- drop only if *all* columns are NaN**" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
10.3383470.498426-0.050406
2NaN-0.376314-1.504425
3-0.551876NaN0.540055
4NaN-0.570255NaN
5-0.705264-1.9409840.321970
6NaNNaN-0.416996
7-1.391762-1.689991-1.804575
8NaN-0.731590NaN
91.314401NaN-1.778455
10NaN-0.654705-0.155042
11-0.898696-0.7568020.539142
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "1 0.338347 0.498426 -0.050406\n", + "2 NaN -0.376314 -1.504425\n", + "3 -0.551876 NaN 0.540055\n", + "4 NaN -0.570255 NaN\n", + "5 -0.705264 -1.940984 0.321970\n", + "6 NaN NaN -0.416996\n", + "7 -1.391762 -1.689991 -1.804575\n", + "8 NaN -0.731590 NaN\n", + "9 1.314401 NaN -1.778455\n", + "10 NaN -0.654705 -0.155042\n", + "11 -0.898696 -0.756802 0.539142" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dropna(how='all')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**- Drop only if NaN in a specific column**" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
012
10.3383470.498426-0.050406
2NaN-0.376314-1.504425
3-0.551876NaN0.540055
5-0.705264-1.9409840.321970
6NaNNaN-0.416996
7-1.391762-1.689991-1.804575
91.314401NaN-1.778455
10NaN-0.654705-0.155042
11-0.898696-0.7568020.539142
\n", + "
" + ], + "text/plain": [ + " 0 1 2\n", + "1 0.338347 0.498426 -0.050406\n", + "2 NaN -0.376314 -1.504425\n", + "3 -0.551876 NaN 0.540055\n", + "5 -0.705264 -1.940984 0.321970\n", + "6 NaN NaN -0.416996\n", + "7 -1.391762 -1.689991 -1.804575\n", + "9 1.314401 NaN -1.778455\n", + "10 NaN -0.654705 -0.155042\n", + "11 -0.898696 -0.756802 0.539142" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.dropna(subset=[2])" + ] + } + ], + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Pandas/Pandas Reorder Columns in DataFrame.ipynb b/Pandas/Pandas Reorder Columns in DataFrame.ipynb new file mode 100644 index 00000000..0f030051 --- /dev/null +++ b/Pandas/Pandas Reorder Columns in DataFrame.ipynb @@ -0,0 +1,420 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pandas - Reorder Columns\n", + "Swap two columns, or change the order of columns" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ABCDLabel
05.13.51.40.2Iris-setosa
14.93.01.40.2Iris-setosa
24.73.21.30.2Iris-setosa
34.63.11.50.2Iris-setosa
45.03.61.40.2Iris-setosa
..................
1456.73.05.22.3Iris-virginica
1466.32.55.01.9Iris-virginica
1476.53.05.22.0Iris-virginica
1486.23.45.42.3Iris-virginica
1495.93.05.11.8Iris-virginica
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " A B C D Label\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa\n", + ".. ... ... ... ... ...\n", + "145 6.7 3.0 5.2 2.3 Iris-virginica\n", + "146 6.3 2.5 5.0 1.9 Iris-virginica\n", + "147 6.5 3.0 5.2 2.0 Iris-virginica\n", + "148 6.2 3.4 5.4 2.3 Iris-virginica\n", + "149 5.9 3.0 5.1 1.8 Iris-virginica\n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('iris.data', names=['A','B','C','D','Label'])\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "1) get a list of the column names." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['A', 'B', 'C', 'D', 'Label']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titles = list(df.columns)\n", + "titles" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2) Swap or move whatever columns you want in the list." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['A', 'C', 'B', 'D', 'Label']" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "titles[1], titles[2] = titles[2], titles[1]\n", + "titles" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "3) Reassign the columns in the DataFrame." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ACBDLabel
05.11.43.50.2Iris-setosa
14.91.43.00.2Iris-setosa
24.71.33.20.2Iris-setosa
34.61.53.10.2Iris-setosa
45.01.43.60.2Iris-setosa
..................
1456.75.23.02.3Iris-virginica
1466.35.02.51.9Iris-virginica
1476.55.23.02.0Iris-virginica
1486.25.43.42.3Iris-virginica
1495.95.13.01.8Iris-virginica
\n", + "

150 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " A C B D Label\n", + "0 5.1 1.4 3.5 0.2 Iris-setosa\n", + "1 4.9 1.4 3.0 0.2 Iris-setosa\n", + "2 4.7 1.3 3.2 0.2 Iris-setosa\n", + "3 4.6 1.5 3.1 0.2 Iris-setosa\n", + "4 5.0 1.4 3.6 0.2 Iris-setosa\n", + ".. ... ... ... ... ...\n", + "145 6.7 5.2 3.0 2.3 Iris-virginica\n", + "146 6.3 5.0 2.5 1.9 Iris-virginica\n", + "147 6.5 5.2 3.0 2.0 Iris-virginica\n", + "148 6.2 5.4 3.4 2.3 Iris-virginica\n", + "149 5.9 5.1 3.0 1.8 Iris-virginica\n", + "\n", + "[150 rows x 5 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = df[titles]\n", + "df" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 4ed5a68b4dd4d0ed50476d8c001f2a345fb6de38 Mon Sep 17 00:00:00 2001 From: saksham044 <72141820+saksham044@users.noreply.github.com> Date: Wed, 30 Sep 2020 18:40:38 +0530 Subject: [PATCH 38/77] Update .gitattributes --- .gitattributes | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index bdb0cabc..cee6d0d8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,7 @@ -# Auto detect text files and perform LF normalization +# Auto detect the text files and perform LF normalization easily! * text=auto -# Custom for Visual Studio +# Custom for Visual Studio (Any Version) *.cs diff=csharp # Standard to msysgit From 5bd1af68d3d47649459a45a13ecc17ad9d00aff0 Mon Sep 17 00:00:00 2001 From: Ashish0931 <40832481+Ashish0931@users.noreply.github.com> Date: Wed, 30 Sep 2020 21:02:12 +0530 Subject: [PATCH 39/77] Update Pandas - Delete Columns from DataFrame.ipynb --- Pandas/Pandas - Delete Columns from DataFrame.ipynb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pandas/Pandas - Delete Columns from DataFrame.ipynb b/Pandas/Pandas - Delete Columns from DataFrame.ipynb index e728b3bf..28293203 100644 --- a/Pandas/Pandas - Delete Columns from DataFrame.ipynb +++ b/Pandas/Pandas - Delete Columns from DataFrame.ipynb @@ -174,8 +174,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### 1) to drop a single column\n", - "df.drop('col_name', axis=1) \n", + "### 1) to drop a single column\n, and saving it permanently ", + "df.drop('col_name', axis=1,inplace =True) \n", "To save changes you must either set df = df.drop(), or add inplace=True." ] }, From 00e9b3859533f2702dc6b38c6322c60907493dc3 Mon Sep 17 00:00:00 2001 From: Jayant123-Joker <72143741+Jayant123-Joker@users.noreply.github.com> Date: Wed, 30 Sep 2020 21:31:01 +0530 Subject: [PATCH 40/77] Update graph_adjacency-matrix.py --- graph_adjacency-matrix.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/graph_adjacency-matrix.py b/graph_adjacency-matrix.py index b6d05589..3f315001 100644 --- a/graph_adjacency-matrix.py +++ b/graph_adjacency-matrix.py @@ -1,4 +1,5 @@ # implementation of an undirected graph using Adjacency Matrix, with weighted or unweighted edges +# its definitely work class Vertex: def __init__(self, n): self.name = n @@ -46,4 +47,4 @@ def print_graph(self): for edge in edges: g.add_edge(edge[:1], edge[1:]) -g.print_graph() \ No newline at end of file +g.print_graph() From 62d2bc8d665bcfbf101227817b5910db14fee486 Mon Sep 17 00:00:00 2001 From: Parmodsihag <68704187+Parmodsihag@users.noreply.github.com> Date: Wed, 30 Sep 2020 21:53:30 +0530 Subject: [PATCH 41/77] added else statement with try except also added some more explanation --- exception-handling.py | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/exception-handling.py b/exception-handling.py index 8dd489f1..57ddf118 100644 --- a/exception-handling.py +++ b/exception-handling.py @@ -1,3 +1,20 @@ +# something more about try except +# basic syntax +''' +try: + code1 + +except: + some code that will execute if code 1 fails or raise some error + +else: + this code is executed only if try was succesful i.e no error in code1 + +finally: + + this code will execute in every situation if try fails or not +''' + filename = 'exception_data.txt' # Outer try block catches file name or file doesn't exist errors. try: @@ -28,4 +45,22 @@ def this_fails(): try: this_fails() except ZeroDivisionError as err: - print('Handling run-time error:', err) \ No newline at end of file + print('Handling run-time error:', err) + + +def divide_me(n): + x = 1/n + +i = int(input('enter a number ')) +try: + divide_me(i) + +except Exception as e: + print(e) # this will print the error msg but don't kill the execution of program + +else: + print('Your Code Run Successfully') # this will execute if divide_me(i) run sucessfully without an error + +finally: + print('thanks') # this will execute in every condition + From 8c6e715df625ca125a365f7fcfe976d515a24c36 Mon Sep 17 00:00:00 2001 From: OpensourceContributor07 <69769312+OpensourceContributor07@users.noreply.github.com> Date: Thu, 1 Oct 2020 00:12:30 +0530 Subject: [PATCH 42/77] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6f0d92be..f0c8d233 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ and are mainly intended for educational purposes. You are invited to subscribe to my video channel, and to download and use any code in this Python repository, according to the MIT License. Feel free to post any comments on my YouTube channel. +i am very happy to see you there on my you tube channel.excited!!!!!!!!! Joe James. Fremont, California. From 1c8e553935e7d13301f9de44ca18e4c0721752bd Mon Sep 17 00:00:00 2001 From: SaiSuvamPatnaik <63333249+SaiSuvamPatnaik@users.noreply.github.com> Date: Thu, 1 Oct 2020 01:10:13 +0530 Subject: [PATCH 43/77] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6f0d92be..cbfbb2e0 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ Feel free to post any comments on my YouTube channel. Joe James. Fremont, California. Copyright (C) 2015-2019, Joe James +HELLO From 85c2146e1c595f4c19352b8144736290ae3853a7 Mon Sep 17 00:00:00 2001 From: JAI ARORA <64232138+JAI-ARORA@users.noreply.github.com> Date: Thu, 1 Oct 2020 03:08:35 +0530 Subject: [PATCH 44/77] Update factorial.py --- factorial.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/factorial.py b/factorial.py index 2a70c3dc..8e4a65ea 100644 --- a/factorial.py +++ b/factorial.py @@ -14,6 +14,6 @@ def get_iterative_factorial(n): for i in range(1, n+1): fact *= i return fact - +print("input should be an integer") print(get_recursive_factorial(6)) -print(get_iterative_factorial(6)) \ No newline at end of file +print(get_iterative_factorial(6)) From 78ae3b4aa8de92e77af540f2efa8af89e6fba8ae Mon Sep 17 00:00:00 2001 From: anay2310 <70628601+anay2310@users.noreply.github.com> Date: Thu, 1 Oct 2020 09:07:07 +0530 Subject: [PATCH 45/77] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f0d92be..760428bf 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Python +# Python 3 These files are mainly intended to accompany my series of YouTube tutorial videos here, https://www.youtube.com/user/joejamesusa and are mainly intended for educational purposes. From 3677438558ebf2af5cef2fc7fb20f2dbef2b481f Mon Sep 17 00:00:00 2001 From: AmanKumar05032005 <72191898+AmanKumar05032005@users.noreply.github.com> Date: Thu, 1 Oct 2020 14:26:15 +0530 Subject: [PATCH 46/77] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f0d92be..a3544ea3 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ These files are mainly intended to accompany my series of YouTube tutorial videos here, https://www.youtube.com/user/joejamesusa and are mainly intended for educational purposes. -You are invited to subscribe to my video channel, and to download and use any code in +You are invited to subscribe to my video channel-Joe James, and to download and use any code in this Python repository, according to the MIT License. Feel free to post any comments on my YouTube channel. From dc5c7aaf735b6656c0ce24206e7958569623f4bc Mon Sep 17 00:00:00 2001 From: Aniket Gupta <63919139+aniketguptaa@users.noreply.github.com> Date: Thu, 1 Oct 2020 15:20:20 +0530 Subject: [PATCH 47/77] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6f0d92be..b8ce25de 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,10 @@ You are invited to subscribe to my video channel, and to download and use any co this Python repository, according to the MIT License. Feel free to post any comments on my YouTube channel. + +This source codes are easy to understand and reliable for self study and you will learn them easily, try to practice more coding by making algorithms yourself and you can be better python programmer and remember "Try to learn something about everything and everything about something". + +Thank you for reviewing my repositories and keep practising. Joe James. Fremont, California. Copyright (C) 2015-2019, Joe James From 33182dd11d1c66a4a46071a650851ebb16179f74 Mon Sep 17 00:00:00 2001 From: beingritik <72251017+beingritik@users.noreply.github.com> Date: Fri, 2 Oct 2020 14:16:14 +0530 Subject: [PATCH 48/77] change the information --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f0d92be..9f0a1d95 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,5 @@ this Python repository, according to the MIT License. Feel free to post any comments on my YouTube channel. Joe James. -Fremont, California. +Fremont, CA. Copyright (C) 2015-2019, Joe James From 67ed35cf3cc1755ba09649fff201b8d85884b750 Mon Sep 17 00:00:00 2001 From: Aiswarya29 <72244069+Aiswarya29@users.noreply.github.com> Date: Fri, 2 Oct 2020 17:47:45 +0530 Subject: [PATCH 49/77] Create Heapsort.py --- Sorting Algorithms/Heapsort.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 Sorting Algorithms/Heapsort.py diff --git a/Sorting Algorithms/Heapsort.py b/Sorting Algorithms/Heapsort.py new file mode 100644 index 00000000..9a2e2c14 --- /dev/null +++ b/Sorting Algorithms/Heapsort.py @@ -0,0 +1,33 @@ +# heapify +def heapify(arr, n, i): + largest = i # largest value + l = 2 * i + 1 # left + r = 2 * i + 2 # right + # if left child exists + if l < n and arr[i] < arr[l]: + largest = l + # if right child exits + if r < n and arr[largest] < arr[r]: + largest = r + # root + if largest != i: + arr[i],arr[largest] = arr[largest],arr[i] # swap + # root. + heapify(arr, n, largest) +# sort +def heapSort(arr): + n = len(arr) + # maxheap + for i in range(n, -1, -1): + heapify(arr, n, i) + # element extraction + for i in range(n-1, 0, -1): + arr[i], arr[0] = arr[0], arr[i] # swap + heapify(arr, i, 0) +# main +arr = [2,5,3,8,6,5,4,7] +heapSort(arr) +n = len(arr) +print ("Sorted array is") +for i in range(n): + print (arr[i],end=" ") From 6f4622e530df36920567565380582d37e26bcd75 Mon Sep 17 00:00:00 2001 From: Ethan Palani <46998848+Ethan0507@users.noreply.github.com> Date: Fri, 2 Oct 2020 21:23:00 +0530 Subject: [PATCH 50/77] Update CircularLinkedList.py Overwriting the inbuilt '__str__' method to print the Node, rather than creating a new method and calling it. --- LinkedLists/CircularLinkedList.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/LinkedLists/CircularLinkedList.py b/LinkedLists/CircularLinkedList.py index b6733be7..48a5a9df 100644 --- a/LinkedLists/CircularLinkedList.py +++ b/LinkedLists/CircularLinkedList.py @@ -16,7 +16,7 @@ def get_data (self): def set_data (self, d): self.data = d - def to_string (self): + def __str__(self): return "Node value: " + str(self.data) class CircularLinkedList (object): @@ -71,10 +71,10 @@ def print_list (self): if self.root is None: return this_node = self.root - print (this_node.to_string()) + print (this_node) while this_node.get_next() != self.root: this_node = this_node.get_next() - print (this_node.to_string()) + print (this_node) def main(): myList = CircularLinkedList() @@ -87,10 +87,10 @@ def main(): print("Find 12", myList.find(12)) cur = myList.root - print (cur.to_string()) + print (cur) for i in range(8): cur = cur.get_next(); - print (cur.to_string()) + print (cur) print("size="+str(myList.get_size())) myList.print_list() From b02dd159c8d711fd862f6abf5a2fdc4b5f972686 Mon Sep 17 00:00:00 2001 From: Govindrajewar <72288656+Govindrajewar@users.noreply.github.com> Date: Sat, 3 Oct 2020 09:00:21 +0530 Subject: [PATCH 51/77] Create python oriented programming This is all Program which I run in python --- python oriented programming | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 python oriented programming diff --git a/python oriented programming b/python oriented programming new file mode 100644 index 00000000..8e3a4499 --- /dev/null +++ b/python oriented programming @@ -0,0 +1,34 @@ +class Mobile: + def make_call(self): + print("i am making a call") + def play_game(self): + print("i am playing games") + +m1=Mobile() + +m1.make_call() + +m1.play_game() + +class Mobile: + def set_color(self,color): + self.color=color + def set_cost(self,cost): + self.cost=cost + def show_color(self): + print("black") + def show_price(self): + print("5000") + def make_call(self): + print("i am making a call") + def play_game(self): + print("i am playing games") + + + +m2=Mobile() + +m2.show_price() + +m2.show_color() + From b46ea8082cf485c60519cd5f73578bba1c59a2ce Mon Sep 17 00:00:00 2001 From: PRAJESH <47695045+Prajesh-Srivastava@users.noreply.github.com> Date: Sun, 4 Oct 2020 08:18:29 +0530 Subject: [PATCH 52/77] Create Some Basic Terminologies in Python Data Structure --- ...sic Terminologies in Python Data Structure | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Intro to Python Data Structures/Some Basic Terminologies in Python Data Structure diff --git a/Intro to Python Data Structures/Some Basic Terminologies in Python Data Structure b/Intro to Python Data Structures/Some Basic Terminologies in Python Data Structure new file mode 100644 index 00000000..754c07a5 --- /dev/null +++ b/Intro to Python Data Structures/Some Basic Terminologies in Python Data Structure @@ -0,0 +1,31 @@ +##Data Structure Overview +Data structures are fundamental concepts of computer science which helps is writing efficient programs in any language. Python is a high-level, interpreted, interactive and object-oriented scripting language using which we can study the fundamentals of data structure in a simpler way as compared to other programming languages. + +In this chapter we are going to study a short overview of some frequently used data structures in general and how they are related to some specific python data types. There are also some data structures specific to python which is listed as another category. + +##General Data Structures +The various data structures in computer science are divided broadly into two categories shown below. We will discuss about each of the below data structures in detail in subsequent chapters. + +#Liner Data Structures +These are the data structures which store the data elements in a sequential manner. + +Array: It is a sequential arrangement of data elements paired with the index of the data element. +Linked List: Each data element contains a link to another element along with the data present in it. +Stack: It is a data structure which follows only to specific order of operation. LIFO(last in First Out) or FILO(First in Last Out). +Queue: It is similar to Stack but the order of operation is only FIFO(First In First Out). +Matrix: It is two dimensional data structure in which the data element is referred by a pair of indices. + +#Non-Liner Data Structures +These are the data structures in which there is no sequential linking of data elements. Any pair or group of data elements can be linked to each other and can be accessed without a strict sequence. + +Binary Tree: It is a data structure where each data element can be connected to maximum two other data elements and it starts with a root node. +Heap: It is a special case of Tree data structure where the data in the parent node is either strictly greater than/ equal to the child nodes or strictly less than it’s child nodes. +Hash Table: It is a data structure which is made of arrays associated with each other using a hash function. It retrieves values using keys rather than index from a data element. +Graph: .It is an arrangement of vertices and nodes where some of the nodes are connected to each other through links. + +#Python Specific Data Structures +These data structures are specific to python language and they give greater flexibility in storing different types of data and faster processing in python environment. + +List: It is similar to array with the exception that the data elements can be of different data types. You can have both numeric and string data in a python list. +Tuple: Tuples are similar to lists but they are immutable which means the values in a tuple cannot be modified they can only be read. +Dictionary: The dictionary contains Key-value pairs as its data elements. From 42ff89e35a280ef9f8e6e5ff049081a36212a39b Mon Sep 17 00:00:00 2001 From: Ritik <63651014+ritik1234@users.noreply.github.com> Date: Mon, 5 Oct 2020 09:02:43 +0530 Subject: [PATCH 53/77] just made the content easier to read for the user. (#45) --- Python List Iteration.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python List Iteration.ipynb b/Python List Iteration.ipynb index d680f54f..7361caaf 100644 --- a/Python List Iteration.ipynb +++ b/Python List Iteration.ipynb @@ -13,7 +13,7 @@ "metadata": {}, "source": [ "----\n", - "The standard for loop works great if inside the loop you only need the item and not its index." + "The standard for loop works well if it is used inside the loop you only need the item and not its index." ] }, { From 49f05ba131f7525f24208c8138b8351875928f37 Mon Sep 17 00:00:00 2001 From: sid2631 <69759968+sid2631@users.noreply.github.com> Date: Mon, 5 Oct 2020 15:33:43 +0530 Subject: [PATCH 54/77] Create addition of two number addition of two number --- addition of two number | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 addition of two number diff --git a/addition of two number b/addition of two number new file mode 100644 index 00000000..d31335e3 --- /dev/null +++ b/addition of two number @@ -0,0 +1,9 @@ +# Store input numbers +num1 = input('Enter first number: ') +num2 = input('Enter second number: ') + +# Add two numbers +sum = float(num1) + float(num2) + +# Display the sum +print('The sum of {0} and {1} is {2}'.format(num1, num2, sum)) From d0ebf11ae6223e2259dd471d52c41af4f8a5c648 Mon Sep 17 00:00:00 2001 From: PRAJESH <47695045+Prajesh-Srivastava@users.noreply.github.com> Date: Thu, 8 Oct 2020 09:39:20 +0530 Subject: [PATCH 55/77] Update Date_Time_Timestamp.py --- Date Time Timestamp/Date_Time_Timestamp.py | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/Date Time Timestamp/Date_Time_Timestamp.py b/Date Time Timestamp/Date_Time_Timestamp.py index 7897332c..cc533dcf 100644 --- a/Date Time Timestamp/Date_Time_Timestamp.py +++ b/Date Time Timestamp/Date_Time_Timestamp.py @@ -19,21 +19,21 @@ # get day of the week using date.weekday() # Monday is 0 from datetime import date -d1 = date.today() -print(d1) -print(d1.month, d1.day, d1.year) -print(d1.weekday()) +todays_date = date.today() +print(todays_date) +print(todays_date.month, todays_date.day, todays_date.year) +print(todays_date.weekday()) # ISO format is a string format, yyyy-mm-dd # --------------------------- # date_object.isoformat() does the same thing as str(date_object) from datetime import date -d1 = date.fromisoformat('2011-11-23') -print(d1) -print(str(d1)) -print(d1.isoformat()) -d1 +todays_date = date.fromisoformat('2011-11-23') +print(todays_date) +print(str(todays_date)) +print(todays_date.isoformat()) +todays_date # Comparison, addition and sutraction of dates # --------------------------- @@ -42,10 +42,10 @@ # The same comparison and add/subtract operations can be used with time objects. from datetime import date -d1 = date.today() +todays_date = date.today() d2 = date(2015, 5, 14) -print(d1 > d2) -print(d1 - d2) +print(todays_date > d2) +print(todays_date - d2) # Time # --------------------------- @@ -95,9 +95,9 @@ # A timedelta can also be multiplied or divided by an integer or float from datetime import timedelta, date, time -d1 = date(2011, 6, 15) +todays_date = date(2011, 6, 15) d2 = date(2012, 9, 18) -td = d2 - d1 +td = d2 - todays_date print(td, type(td)) print(td.total_seconds()) print(td * 3) @@ -130,4 +130,4 @@ start_time = time.process_time() # do some stuff end_time = time.process_time() -print('operation executed in ', end_time - start_time) \ No newline at end of file +print('operation executed in ', end_time - start_time) From 9aa8a9a31cd5e33dda4150736a84658515d55187 Mon Sep 17 00:00:00 2001 From: Sh1710 <72331454+Sh1710@users.noreply.github.com> Date: Thu, 8 Oct 2020 11:56:34 +0530 Subject: [PATCH 56/77] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dc9c6ad..22d802cb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ You are invited to subscribe to my video channel-Joe James, and to download and this Python repository, according to the MIT License. Feel free to post any comments on my YouTube channel. i am very happy to see you there on my you tube channel.excited!!!!!!!!! - +## Subscribe my channel for more tutorial videos. This source codes are easy to understand and reliable for self study and you will learn them easily, try to practice more coding by making algorithms yourself and you can be better python programmer and remember "Try to learn something about everything and everything about something". @@ -15,3 +15,4 @@ Joe James. Fremont, CA. Copyright (C) 2015-2019, Joe James HELLO +## Happy coding guys!😀 From 576c4ead4535179969a5daca7e54234e41d0c8f2 Mon Sep 17 00:00:00 2001 From: Joe James Date: Fri, 9 Oct 2020 21:50:51 -0700 Subject: [PATCH 57/77] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 22d802cb..3c0ced97 100644 --- a/README.md +++ b/README.md @@ -5,14 +5,14 @@ and are mainly intended for educational purposes. You are invited to subscribe to my video channel-Joe James, and to download and use any code in this Python repository, according to the MIT License. Feel free to post any comments on my YouTube channel. -i am very happy to see you there on my you tube channel.excited!!!!!!!!! -## Subscribe my channel for more tutorial videos. +i am very happy to see you there on my you tube channel. excited!!!!!!!!! +## Subscribe to my channel for more tutorial videos. This source codes are easy to understand and reliable for self study and you will learn them easily, try to practice more coding by making algorithms yourself and you can be better python programmer and remember "Try to learn something about everything and everything about something". -Thank you for reviewing my repositories and keep practising. +Thank you for reviewing my repositories and keep practicing. Joe James. Fremont, CA. -Copyright (C) 2015-2019, Joe James -HELLO +Copyright (C) 2015-2020, Joe James + ## Happy coding guys!😀 From 56045c1a7ecd4579e51aed358861abbaa7a8dee9 Mon Sep 17 00:00:00 2001 From: gopesanjay772 <72152228+gopesanjay772@users.noreply.github.com> Date: Sat, 17 Oct 2020 10:03:45 +0530 Subject: [PATCH 58/77] Update lcm.py --- lcm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lcm.py b/lcm.py index 8d584ab7..a308141e 100644 --- a/lcm.py +++ b/lcm.py @@ -1,4 +1,4 @@ -# computes Lowest Common Multiple LCM / Least Common Denominator LCD +# computes Lowest Common Multiple (LCM) / Least Common Denominator (LCD) # useful for adding and subtracting fractions # 2 numbers @@ -21,4 +21,4 @@ def lcm3(nums): print(str(lcm(7, 12))) nums = [3, 2, 16] -print(str(lcm3(nums))) \ No newline at end of file +print(str(lcm3(nums))) From e7f9b1ad920e3ec4eb2945fbc98d22de298b7d8b Mon Sep 17 00:00:00 2001 From: Aniket Gupta <63919139+aniketguptaa@users.noreply.github.com> Date: Sun, 18 Oct 2020 00:32:44 +0530 Subject: [PATCH 59/77] Update Queues implementaion.py --- Queues implementaion.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Queues implementaion.py b/Queues implementaion.py index da9bad1a..63170c8c 100644 --- a/Queues implementaion.py +++ b/Queues implementaion.py @@ -54,15 +54,6 @@ def display(self): for i in self.items: ar.append(i) return ar - - - - - - - - - que = Queue() que.enqueue('google') que.enqueue('youtube') From 6c2897775348d3151bc1d87dd1c10bdd9ec29a20 Mon Sep 17 00:00:00 2001 From: princerajputana6 <37314665+princerajputana6@users.noreply.github.com> Date: Wed, 21 Oct 2020 03:07:55 +0530 Subject: [PATCH 60/77] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3c0ced97..c520b85f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +#This is a open source project. # Python 3 These files are mainly intended to accompany my series of YouTube tutorial videos here, https://www.youtube.com/user/joejamesusa From ad6cab029a28aac7e1c2fbd6fb7e773e10390a97 Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 21 Oct 2020 11:48:34 -0700 Subject: [PATCH 61/77] Add files via upload --- Sorting Algorithms/Radix_Sort.ipynb | 113 ++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 Sorting Algorithms/Radix_Sort.ipynb diff --git a/Sorting Algorithms/Radix_Sort.ipynb b/Sorting Algorithms/Radix_Sort.ipynb new file mode 100644 index 00000000..4862a2e5 --- /dev/null +++ b/Sorting Algorithms/Radix_Sort.ipynb @@ -0,0 +1,113 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Radix Sort\n", + "(c) 2020, Joe James" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# get number of digits in largest item\n", + "def __get_num_digits(A):\n", + " m = 0\n", + " for item in A:\n", + " m = max(m, item)\n", + " return len(str(m))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# flatten into a 1D List\n", + "from functools import reduce\n", + "def __flatten(A):\n", + " return reduce(lambda x, y: x + y, A)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def radix(A, num_digits):\n", + " for digit in range(0, num_digits):\n", + " B = [[] for i in range(10)]\n", + " for item in A:\n", + " # num is the bucket number that the item will be put into\n", + " num = item // 10 ** (digit) % 10\n", + " B[num].append(item)\n", + " A = __flatten(B)\n", + " return A" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3, 45, 53, 55, 213, 288, 289]\n", + "[0, 1, 2, 3, 4, 5] [999994, 999995, 999996, 999997, 999998, 999999]\n" + ] + } + ], + "source": [ + "def main():\n", + " A = [55, 45, 3, 289, 213, 1, 288, 53, 2]\n", + " num_digits = __get_num_digits(A)\n", + " A = radix(A, num_digits)\n", + " print(A)\n", + " \n", + " B = [i for i in range(1000000)]\n", + " from random import shuffle\n", + " shuffle(B)\n", + " B = radix(B, __get_num_digits(B))\n", + " print(B[:6], B[-6:])\n", + "\n", + "main()" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From f97b3a239189d7c66bb019790e65a0b5ff879f30 Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 21 Oct 2020 19:57:42 -0700 Subject: [PATCH 62/77] Revised function call. Moved __get_num_digits() function call into the radix() function, so the only parameter when calling radix() is a List. --- Sorting Algorithms/Radix_Sort.ipynb | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Sorting Algorithms/Radix_Sort.ipynb b/Sorting Algorithms/Radix_Sort.ipynb index 4862a2e5..0b701528 100644 --- a/Sorting Algorithms/Radix_Sort.ipynb +++ b/Sorting Algorithms/Radix_Sort.ipynb @@ -10,7 +10,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -34,13 +34,22 @@ " return reduce(lambda x, y: x + y, A)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Changed from YouTube video:\n", + "It's much cleaner to put the _get_num_digits call inside the radix function rather than in main as shown in the video. That way you only need to pass a List to the radix function. Thanks to Brother Lui for this suggestion." + ] + }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ - "def radix(A, num_digits):\n", + "def radix(A):\n", + " num_digits = __get_num_digits(A)\n", " for digit in range(0, num_digits):\n", " B = [[] for i in range(10)]\n", " for item in A:\n", @@ -53,7 +62,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -68,14 +77,13 @@ "source": [ "def main():\n", " A = [55, 45, 3, 289, 213, 1, 288, 53, 2]\n", - " num_digits = __get_num_digits(A)\n", - " A = radix(A, num_digits)\n", + " A = radix(A)\n", " print(A)\n", " \n", " B = [i for i in range(1000000)]\n", " from random import shuffle\n", " shuffle(B)\n", - " B = radix(B, __get_num_digits(B))\n", + " B = radix(B)\n", " print(B[:6], B[-6:])\n", "\n", "main()" From f7893b62e479182590acd4fcdb7af277099e47b9 Mon Sep 17 00:00:00 2001 From: Varun Shrivastava Date: Sat, 27 Feb 2021 20:28:14 +0530 Subject: [PATCH 63/77] Added a new .py file for classes in python(OOP) --- .../building our first class.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Object Oriented Programming/building our first class.py diff --git a/Object Oriented Programming/building our first class.py b/Object Oriented Programming/building our first class.py new file mode 100644 index 00000000..51411d5e --- /dev/null +++ b/Object Oriented Programming/building our first class.py @@ -0,0 +1,20 @@ +#Today we will learn how to create a class and other attributes of class +#Below is the method how classes are defined +class Student: + pass + +#Below is the method to create object , Here Varun and rohan are two objects of Class Student +Varun = Student() +larry = Student() + +# Now after creating objects we can use them to call variables +Varun.name = "Harry" +Varun.std = 12 +Varun.section = 1 +larry.std = 9 +larry.subjects = ["hindi", "physics"] +print(Varun.section, larry.subjects) + + + + From 779b27f990a0e21ce6ede0f49b4cd1228ae5f73d Mon Sep 17 00:00:00 2001 From: Varun Shrivastava Date: Mon, 1 Mar 2021 19:41:36 +0530 Subject: [PATCH 64/77] Added contributing file --- Contributing.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Contributing.txt diff --git a/Contributing.txt b/Contributing.txt new file mode 100644 index 00000000..50913f5c --- /dev/null +++ b/Contributing.txt @@ -0,0 +1,19 @@ +Contributions are always welcome!!!! +If you want to contribute to this repository follow the below procedure - +1. Fork this repository +2. Clone the code to your local system and go through readme.md +3. You can create another branch to add further commits + +GIT COMMANDS FOR CONTRIBUTING - +1. To clone this repository +`git clone [code link]` +2.To create new branch +`git checkout -b [branch name] ` +3. To stage files +`git add .` +4.To commit changes +`git commit -m "commit message"` +5. To push changes +`git push [remote branch] [new branch]` + + \ No newline at end of file From 02d3f3dd02cc3041bbf2bafd284503deb92397b7 Mon Sep 17 00:00:00 2001 From: Varun Shrivastava Date: Tue, 2 Mar 2021 19:31:29 +0530 Subject: [PATCH 65/77] updated Contributing.txt --- Contributing.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Contributing.txt b/Contributing.txt index 50913f5c..52d1fd31 100644 --- a/Contributing.txt +++ b/Contributing.txt @@ -16,4 +16,6 @@ GIT COMMANDS FOR CONTRIBUTING - 5. To push changes `git push [remote branch] [new branch]` +HAPPY CONTRIBUTION!!!!!!!! + \ No newline at end of file From 4b7f7777518d20309c9f0dd64aa7f0b20451f58b Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 13 Oct 2021 15:28:41 -0700 Subject: [PATCH 66/77] Added Python 10 match statements notebook --- match statements.ipynb | 222 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 match statements.ipynb diff --git a/match statements.ipynb b/match statements.ipynb new file mode 100644 index 00000000..2bc9b2dd --- /dev/null +++ b/match statements.ipynb @@ -0,0 +1,222 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python 10 - Structural Pattern Matching\n", + "### match statements \n", + "Very similar to switch/case statements in C, Java, and Javascript. \n", + "Can be used in lieu of if/elif/else blocks. \n", + "[documentation](https://www.python.org/dev/peps/pep-0622/)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "large\n" + ] + } + ], + "source": [ + "var = 3\n", + "\n", + "match var:\n", + " case 1:\n", + " print('small')\n", + " case 2:\n", + " print('medium')\n", + " case 3:\n", + " print('large')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### The Default case _ \n", + "The default case, using underscore, is optional. " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "large\n" + ] + } + ], + "source": [ + "var = 4\n", + "\n", + "match var:\n", + " case 1:\n", + " print('small')\n", + " case 2:\n", + " print('medium')\n", + " case _:\n", + " print('large')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Conditionals in case \n", + "if statements and or (using bar) are supported in case statements." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "small\n" + ] + } + ], + "source": [ + "var = 2\n", + "\n", + "match var:\n", + " case x if x<=3:\n", + " print('small')\n", + " case 4 | 5 | 6:\n", + " print('medium')\n", + " case _:\n", + " print('large')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### No breaks needed\n", + "Note that you do not need break statements. The match block will automatically end execution after one case is executed." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A\n", + "F\n" + ] + } + ], + "source": [ + "def print_grade(score):\n", + " match score:\n", + " # case score > 90 this does not work!\n", + " case score if score >= 90:\n", + " print('A')\n", + " case score if score >= 80:\n", + " print('B')\n", + " case score if score >= 70:\n", + " print('C')\n", + " case score if score >= 60:\n", + " print('D')\n", + " case _:\n", + " print('F')\n", + " \n", + "print_grade(94)\n", + "print_grade(48)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Python Objects \n", + "match statements can also use Python objects and instance variables." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "welcome to the business program!\n", + "welcome to the science program!\n" + ] + } + ], + "source": [ + "class Student:\n", + " def __init__(self, n, i, m):\n", + " self.name = n\n", + " self.id = i\n", + " self.major = m\n", + "\n", + "def welcome(student):\n", + " match student.major:\n", + " case 'engineering':\n", + " print('welcome to the engineering program!')\n", + " case 'business':\n", + " print('welcome to the business program!')\n", + " case 'pharmacy':\n", + " print('welcome to the pharmacy program!')\n", + " case x:\n", + " print(f'welcome to the {x} program!')\n", + " \n", + "new_student = Student('Suresh', 5723, 'business')\n", + "welcome(new_student)\n", + "\n", + "new_student = Student('Britney', 5724, 'science')\n", + "welcome(new_student)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 71cc10b4e2063d6b8811e5f16004e207ecfd28c4 Mon Sep 17 00:00:00 2001 From: Joe James Date: Wed, 13 Oct 2021 15:31:36 -0700 Subject: [PATCH 67/77] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c520b85f..939de1ed 100644 --- a/README.md +++ b/README.md @@ -6,14 +6,14 @@ and are mainly intended for educational purposes. You are invited to subscribe to my video channel-Joe James, and to download and use any code in this Python repository, according to the MIT License. Feel free to post any comments on my YouTube channel. -i am very happy to see you there on my you tube channel. excited!!!!!!!!! +I am very happy to see you there on my you tube channel. excited!!!!!!!!! ## Subscribe to my channel for more tutorial videos. -This source codes are easy to understand and reliable for self study and you will learn them easily, try to practice more coding by making algorithms yourself and you can be better python programmer and remember "Try to learn something about everything and everything about something". +This source code is easy to understand and reliable for self study and you will learn them easily, try to practice more coding by making algorithms yourself and you can become a better Python programmer, and remember "Try to learn something about everything and everything about something". Thank you for reviewing my repositories and keep practicing. Joe James. Fremont, CA. -Copyright (C) 2015-2020, Joe James +Copyright (C) 2015-2021, Joe James ## Happy coding guys!😀 From e897fb6703f9672bf3aa353ed7f490f1e5591717 Mon Sep 17 00:00:00 2001 From: Joe James Date: Fri, 15 Oct 2021 21:06:47 -0700 Subject: [PATCH 68/77] updated match-case notebook --- match statements.ipynb | 154 ++++++++++++++++++++++++++++++++++------- 1 file changed, 128 insertions(+), 26 deletions(-) diff --git a/match statements.ipynb b/match statements.ipynb index 2bc9b2dd..eaccdc9f 100644 --- a/match statements.ipynb +++ b/match statements.ipynb @@ -11,6 +11,13 @@ "[documentation](https://www.python.org/dev/peps/pep-0622/)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Can use integer for match variable..." + ] + }, { "cell_type": "code", "execution_count": 1, @@ -36,6 +43,103 @@ " print('large')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### ...or floating point..." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "large\n" + ] + } + ], + "source": [ + "var = 1.5\n", + "\n", + "match var:\n", + " case 1.3:\n", + " print('small')\n", + " case 1.4:\n", + " print('medium')\n", + " case 1.5:\n", + " print('large')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### ...or Tuple...\n", + "Note here we also use a variable to receive *any* value." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "on x-axis\n" + ] + } + ], + "source": [ + "var = (8,0)\n", + "\n", + "match var:\n", + " case (0,x):\n", + " print('on y-axis')\n", + " case (x,0):\n", + " print('on x-axis')\n", + " case (x,y):\n", + " print('not on axis')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### ...or String" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "small\n" + ] + } + ], + "source": [ + "var = \"S\"\n", + "\n", + "match var:\n", + " case \"S\":\n", + " print('small')\n", + " case \"Med\":\n", + " print('medium')\n", + " case \"Lg\":\n", + " print('large')" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -74,12 +178,12 @@ "metadata": {}, "source": [ "#### Conditionals in case \n", - "if statements and or (using bar) are supported in case statements." + "*if* statements and *or* (using bar) are supported in case statements." ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -112,7 +216,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -153,41 +257,39 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "welcome to the business program!\n", - "welcome to the science program!\n" + "medium\n", + "Size XL is not recognized.\n" ] } ], "source": [ - "class Student:\n", - " def __init__(self, n, i, m):\n", - " self.name = n\n", - " self.id = i\n", - " self.major = m\n", + "class T_shirt:\n", + " def __init__(self, s):\n", + " self.size = s\n", "\n", - "def welcome(student):\n", - " match student.major:\n", - " case 'engineering':\n", - " print('welcome to the engineering program!')\n", - " case 'business':\n", - " print('welcome to the business program!')\n", - " case 'pharmacy':\n", - " print('welcome to the pharmacy program!')\n", - " case x:\n", - " print(f'welcome to the {x} program!')\n", + " def order(self):\n", + " match self.size:\n", + " case 'S' | 'Sm':\n", + " print('small')\n", + " case 'M' | 'Med':\n", + " print('medium')\n", + " case 'L' | 'Lg':\n", + " print('large')\n", + " case x:\n", + " print(f'Size {x} is not recognized.')\n", " \n", - "new_student = Student('Suresh', 5723, 'business')\n", - "welcome(new_student)\n", + "shirt1 = T_shirt('Med')\n", + "shirt1.order()\n", "\n", - "new_student = Student('Britney', 5724, 'science')\n", - "welcome(new_student)" + "shirt2 = T_shirt('XL')\n", + "shirt2.order()" ] }, { From 500c2099fa3a4c679b225656baadc0cf861db58e Mon Sep 17 00:00:00 2001 From: Joe James Date: Sun, 17 Oct 2021 17:34:13 -0700 Subject: [PATCH 69/77] 2nd update to match statements notebook --- match statements.ipynb | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/match statements.ipynb b/match statements.ipynb index eaccdc9f..a8fc422d 100644 --- a/match statements.ipynb +++ b/match statements.ipynb @@ -178,7 +178,7 @@ "metadata": {}, "source": [ "#### Conditionals in case \n", - "*if* statements and *or* (using bar) are supported in case statements." + "*or* conditions (using bar) are supported in case statements." ] }, { @@ -198,7 +198,7 @@ "var = 2\n", "\n", "match var:\n", - " case x if x<=3:\n", + " case 2 | 3:\n", " print('small')\n", " case 4 | 5 | 6:\n", " print('medium')\n", @@ -211,6 +211,8 @@ "metadata": {}, "source": [ "#### No breaks needed\n", + "*if* statements are supported, but must follow syntax, case var if (inequality expression). \n", + "\n", "Note that you do not need break statements. The match block will automatically end execution after one case is executed." ] }, @@ -252,7 +254,8 @@ "metadata": {}, "source": [ "#### Python Objects \n", - "match statements can also use Python objects and instance variables." + "Match statements can also use Python objects and instance variables. \n", + "In the final case here we could have used _ default case, but instead used x so that we could use the value of x in our print statement." ] }, { From ccb7bdf4b9369e06c4cd5860d368546365836d50 Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 28 Oct 2021 17:20:21 -0700 Subject: [PATCH 70/77] Create temp --- Iris Dataset/temp | 1 + 1 file changed, 1 insertion(+) create mode 100644 Iris Dataset/temp diff --git a/Iris Dataset/temp b/Iris Dataset/temp new file mode 100644 index 00000000..9c595a6f --- /dev/null +++ b/Iris Dataset/temp @@ -0,0 +1 @@ +temp From 763ba2befbd41a8c66870c58e3b9b6fe08f72a43 Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 28 Oct 2021 17:23:16 -0700 Subject: [PATCH 71/77] Add files via upload --- Iris Dataset/Iris_Dataset.ipynb | 1174 +++++++++++++++++++++++++++++++ Iris Dataset/iris.data | 151 ++++ 2 files changed, 1325 insertions(+) create mode 100644 Iris Dataset/Iris_Dataset.ipynb create mode 100644 Iris Dataset/iris.data diff --git a/Iris Dataset/Iris_Dataset.ipynb b/Iris Dataset/Iris_Dataset.ipynb new file mode 100644 index 00000000..398f454e --- /dev/null +++ b/Iris Dataset/Iris_Dataset.ipynb @@ -0,0 +1,1174 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Data Science\n", + "### Exploring the Iris Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load Data\n", + "Load the data from CSV file into a Pandas dataframe, and print the top few rows." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsepal_lengthsepal_widthpetal_lengthpetal_widthspecies
005.13.51.40.2Iris-setosa
114.93.01.40.2Iris-setosa
224.73.21.30.2Iris-setosa
334.63.11.50.2Iris-setosa
445.03.61.40.2Iris-setosa
\n", + "
" + ], + "text/plain": [ + " id sepal_length sepal_width petal_length petal_width species\n", + "0 0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 4 5.0 3.6 1.4 0.2 Iris-setosa" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('iris.data')\n", + "data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customize columns\n", + "Drop the redundant id column, and rename Attribute columns to integers. Save column names for use later." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123species
05.13.51.40.2Iris-setosa
507.03.24.71.4Iris-versicolor
1006.33.36.02.5Iris-virginica
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 species\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "50 7.0 3.2 4.7 1.4 Iris-versicolor\n", + "100 6.3 3.3 6.0 2.5 Iris-virginica" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = data.drop('id', 1)\n", + "cols = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']\n", + "data.rename(columns = {cols[0]:0, cols[1]:1, cols[2]:2, cols[3]:3}, inplace=True)\n", + "data.loc[::50]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Statistical Overview\n", + "Show shape of dataframe and statistical overview of attribute columns." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(150, 5)\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123
count150.000000150.000000150.000000150.000000
mean5.8433333.0540003.7586671.198667
std0.8280660.4335941.7644200.763161
min4.3000002.0000001.0000000.100000
25%5.1000002.8000001.6000000.300000
50%5.8000003.0000004.3500001.300000
75%6.4000003.3000005.1000001.800000
max7.9000004.4000006.9000002.500000
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3\n", + "count 150.000000 150.000000 150.000000 150.000000\n", + "mean 5.843333 3.054000 3.758667 1.198667\n", + "std 0.828066 0.433594 1.764420 0.763161\n", + "min 4.300000 2.000000 1.000000 0.100000\n", + "25% 5.100000 2.800000 1.600000 0.300000\n", + "50% 5.800000 3.000000 4.350000 1.300000\n", + "75% 6.400000 3.300000 5.100000 1.800000\n", + "max 7.900000 4.400000 6.900000 2.500000" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(data.shape)\n", + "data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Iris-virginica 50\n", + "Iris-setosa 50\n", + "Iris-versicolor 50\n", + "Name: species, dtype: int64" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# same as data['species'].value_counts()\n", + "data.species.value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Histograms\n", + "Histograms are useful for showing how the data is distributed. They're ridiculously easy to use, but can only show two axes." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([ 9., 23., 14., 27., 16., 26., 18., 6., 5., 6.]),\n", + " array([4.3 , 4.66, 5.02, 5.38, 5.74, 6.1 , 6.46, 6.82, 7.18, 7.54, 7.9 ]),\n", + " )" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(data[0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we give 4 columns of data to the Histogram maker, and it automatically color codes them." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([[ 0., 0., 0., 0., 0., 11., 48., 49., 31., 11.],\n", + " [ 0., 0., 11., 97., 38., 4., 0., 0., 0., 0.],\n", + " [ 0., 44., 6., 1., 10., 34., 30., 20., 5., 0.],\n", + " [50., 52., 45., 3., 0., 0., 0., 0., 0., 0.]]),\n", + " array([0.1 , 0.88, 1.66, 2.44, 3.22, 4. , 4.78, 5.56, 6.34, 7.12, 7.9 ]),\n", + " )" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist([data[0], data[1], data[2], data[3]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To add a Legend we need to add labels to the Histogram builder as a list of column names, and call the legend function." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD4CAYAAAAXUaZHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAah0lEQVR4nO3deXCV9dn/8fclIEFFRIgUCRpQBEyCIQZZAmlcUHyCa1N/ZbAENypuqB0FrS1onY62jGtRJ27BecCKUUalalEfGcCiECAOS7BukQYQAwqIkLJ4/f7IIU0wgZwlOYebz2uG8Zx7vTjIh2++931fx9wdEREJliPiXYCIiMSewl1EJIAU7iIiAaRwFxEJIIW7iEgAtY53AQCdO3f21NTUeJchInJIWbp06SZ3T25o3UHD3cyeA0YC37h7emjZ8cBLQCpQAVzh7t+ZmQGPAv8D7ADGuvuyg50jNTWV0tLSpv1uREQEADP7qrF1TZmWKQZG7LdsEvCeu/cC3gu9B7gQ6BX6NQ54MtxiRUQkegcNd3efD3y73+JLgOmh19OBS+ssf8FrfAgcZ2ZdY1WsiIg0TaQXVLu4+4bQ66+BLqHX3YB/19muMrTsJ8xsnJmVmllpVVVVhGWIiEhDor6g6u5uZmH3MHD3IqAIIDs7Wz0QRBLM7t27qayspLq6Ot6lHPaSkpJISUmhTZs2Td4n0nDfaGZd3X1DaNrlm9DydUD3OtulhJaJyCGmsrKS9u3bk5qaSs29EhIP7s7mzZuprKykR48eTd4v0mmZ14HC0OtC4LU6y8dYjUHA1jrTNyJyCKmurqZTp04K9jgzMzp16hT2T1BNuRXyRSAP6GxmlcBk4AFglpldA3wFXBHa/E1qboP8jJpbIa8KqxoRSSgK9sQQyZ/DQcPd3Uc1surcBrZ14MawqxARkZhKiCdURSTxpU76e0yPV/FAfkyPJ/Wpt4zE1pQODf8SSTDz5s1j5MiRja4vLi7mpptuivl5i4uLWb9+fe371NRUNm3aFPPzKNxFRFrQ/uHeXBTuIpKwfvjhB/Lz8znjjDNIT0/npZdeYunSpfz85z/nzDPP5IILLmDDhpob8vLy8pgwYQKZmZmkp6ezePFiABYvXszgwYPp378/Q4YM4ZNPPgm7jqqqKn7xi18wYMAABgwYwAcffADAlClTuPrqq8nLy6Nnz5489thjtfv88Y9/pHfv3gwdOpRRo0YxdepUSkpKKC0tZfTo0WRmZrJz504AHn/8cbKyssjIyGDNmjXRfmyAwl1EEtjbb7/NiSeeyMcff8zKlSsZMWIEN998MyUlJSxdupSrr76a3/3ud7Xb79ixg7KyMp544gmuvvpqAPr06cOCBQtYvnw59913H3fffXfYdUyYMIHbbruNJUuW8Morr3DttdfWrluzZg3/+Mc/WLx4Mffeey+7d++u3e7jjz/mrbfeqm2MWFBQQHZ2NjNmzKCsrIx27doB0LlzZ5YtW8b48eOZOnVqNB9ZLV1QFZGElZGRwW9/+1smTpzIyJEj6dixIytXrmT48OEA7N27l65d/9u+atSompv7cnNz2bZtG1u2bOH777+nsLCQTz/9FDNj9+7dYdfx7rvvsnr16tr327ZtY/v27QDk5+fTtm1b2rZtywknnMDGjRv54IMPuOSSS0hKSiIpKYmLLrrogMe//PLLATjzzDN59dVXw66vIQp3EUlYp512GsuWLePNN9/knnvu4ZxzziEtLY1FixY1uP3+94ObGb///e85++yzmT17NhUVFeTl5YVdx48//siHH35IUlLST9a1bdu29nWrVq3Ys2dP2Mffd4xI92+Iwl1EmiQety6uX7+e448/niuvvJLjjjuOJ554gqqqKhYtWsTgwYPZvXs3//rXv0hLSwPgpZde4uyzz2bhwoV06NCBDh06sHXrVrp1q+lfWFxcHFEd559/Po8//jh33HEHAGVlZWRmZja6fU5ODr/5zW+466672LNnD3PmzGHcuHEAtG/fnu+//z6iOsKhcBeRhLVixQruuOMOjjjiCNq0acOTTz5J69atueWWW9i6dSt79uzh1ltvrQ33pKQk+vfvz+7du3nuuecAuPPOOyksLOT+++8nPz+yf6Aee+wxbrzxRvr168eePXvIzc3lqaeeanT7AQMGcPHFF9OvXz+6dOlCRkYGHTrU3BI8duxYrr/+etq1a9foTyCxYDUPlcZXdna265uYAqKxe9qnbG3ZOiRq5eXl9O3bN95lNFleXh5Tp04lOzs73qUAsH37do455hh27NhBbm4uRUVFZGVlRXy8hv48zGypuzf4G9bIXUSkGYwbN47Vq1dTXV1NYWFhVMEeCYW7iATCvHnzItrv+eef59FHH623LCcn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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist([data[0], data[1], data[2], data[3]], label=[cols[0],cols[1],cols[2],cols[3]])\n", + "plt.legend()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Or we can make 4 separate calls to the Histogram builder and get 4 overlapping plots." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([41., 8., 1., 7., 8., 33., 6., 23., 9., 14.]),\n", + " array([0.1 , 0.34, 0.58, 0.82, 1.06, 1.3 , 1.54, 1.78, 2.02, 2.26, 2.5 ]),\n", + " )" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(data[0])\n", + "plt.hist(data[1]) \n", + "plt.hist(data[2])\n", + "plt.hist(data[3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can use alpha to control the opacity of plots. alpha of 1 is opague. alpha of 0 is transparent." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([41., 8., 1., 7., 8., 33., 6., 23., 9., 14.]),\n", + " array([0.1 , 0.34, 0.58, 0.82, 1.06, 1.3 , 1.54, 1.78, 2.02, 2.26, 2.5 ]),\n", + " )" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.hist(data[0])\n", + "plt.hist(data[1], alpha=1) \n", + "plt.hist(data[2], alpha=0.6)\n", + "plt.hist(data[3], alpha=0.5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also plot the 4 columns on separate subplots to make it more readable. This is very readable, but beware that each plot automatically scales its axes to the data." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(2, 2, figsize=(8, 4))\n", + "ax[0, 0].hist(data[0])\n", + "ax[0, 1].hist(data[1])\n", + "ax[1, 0].hist(data[2])\n", + "ax[1, 1].hist(data[3])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Adding titles to the previous plot makes it more readable." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(2, 2, figsize=(8, 6))\n", + "ax[0, 0].hist(data[0])\n", + "ax[0, 1].hist(data[1])\n", + "ax[1, 0].hist(data[2])\n", + "ax[1, 1].hist(data[3])\n", + "ax[0, 0].set_title(cols[0])\n", + "ax[0, 1].set_title(cols[1])\n", + "ax[1, 0].set_title(cols[2])\n", + "ax[1, 1].set_title(cols[3])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Scatter Plots\n", + "These are probably more useful for this dataset because they can show clusters by species. The most basic scatter plot does not distinguish species." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXUAAAD7CAYAAACVMATUAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAZHElEQVR4nO3dfYwdV3nH8e+vjgETXtyQpYS1jRFE/AGmGFZJ3FQoSpryFhkrRMIRoQRB3NJSXoJADYpoG6WyUCqEWiSQSVQFYkJoCJZBpMESoJYocbWOA4YYSlJCzBLqJcYJoVaKzdM/9u56c7N379y9Z8+cmfv7SKvsnZnMPHP2+PF65jnnKCIwM7N2+L26AzAzs3Sc1M3MWsRJ3cysRZzUzcxaxEndzKxFnNTNzFqkclKXtELSfklfW2Df5ZKmJd3b+Xp32jDNzKyKUwY49v3AQeA5PfbfEhHvHT4kMzNbqkpJXdIa4E3APwBXprjw6aefHuvXr09xKjOzkbFv375fRsRYr/1Vf1P/JPAR4NmLHPMWSa8F/gv4YEQcWuyE69evZ3JysuLlzcwMQNJPF9vf95m6pIuAwxGxb5HDvgqsj4hXAnuAG3uca5ukSUmT09PT/S5tZmYDqvKi9Fxgs6QHgS8C50u6af4BEfFIRDzR+Xg98JqFThQROyJiIiImxsZ6/uvBzMyWqG9Sj4irImJNRKwHtgLfjIjL5h8j6Yx5Hzcz80LVzMwyG6T65UkkXQNMRsRu4H2SNgPHgSPA5WnCMzOzQaiuqXcnJibCL0rNzAYjaV9ETPTav+Tf1M1S2rV/iuvu+BE/P3qMF65exYdf9zK2bByvOyyzxnFSt9rt2j/FVbcd4NhvTwAwdfQYV912AMCJ3WxAnvvFanfdHT+aS+izjv32BNfd8aOaIjJrLid1q93Pjx4baLuZ9eakbrV74epVA203s96c1K12H37dy1i1csWTtq1auYIPv+5lNUVk1lx+UWq1m30Z6uoXs+E5qVsRtmwcdxI3S8CPX8zMWsRJ3cysRZzUzcxaxEndzKxFnNTNzFrESd3MrEWc1M3MWsRJ3cysRZzUzcxaxCNKbWhe4MKsHE7qNhQvcGFWFj9+saF4gQuzsjip21C8wIVZWZzUbShe4MKsLE7qNhQvcGFWFr8otaF4gQuzsjip29C8wIVZOZzUW8415GajxUm9xVxDbjZ6/KK0xVxDbjZ6nNRbzDXkZqPHSb3FXENuNnqc1FvMNeRmo8cvSlvMNeRmo6dyUpe0ApgEpiLioq59Twc+B7wGeAR4a0Q8mDBOWyLXkJuNlkF+U38/cBB4zgL73gX8KiJeKmkr8HHgrQniMwNcb29WVaVn6pLWAG8Cru9xyJuBGzvf3wpcIEnDh2d2st5+6ugxgpP19rv2T9Udmllxqr4o/STwEeB3PfaPA4cAIuI48CjwvKGjM8P19maD6JvUJV0EHI6IfcNeTNI2SZOSJqenp4c9nY0I19ubVVflN/Vzgc2SHgS+CJwv6aauY6aAtQCSTgGey8wL0yeJiB0RMRERE2NjY0MFbqPD9fZm1fVN6hFxVUSsiYj1wFbgmxFxWddhu4F3dL6/pHNMJI3URpbr7c2qW3KduqRrgMmI2A3cAHxe0v3AEWaSv1kSrrc3q051/UI9MTERk5OTtVzbzKypJO2LiIle+z2i1BZ19a4D3Lz3ECciWCFx6dlruXbLhrrDMrMenNStp6t3HeCmux+a+3wiYu6zE7tZmTyhl/V0895DA203s/o5qVtPJ3q8b+m13czq56RuPa3oMdNDr+1mVj8ndevp0rPXDrTdzOrnF6XW0+zLUFe/mDWH69TNzBqkX526H7+YmbWIH7802Ns+exd3PnBk7vO5LzmNnVdsqjGipfMiGFa6FH00Rz/3b+oN1Z3QAe584Ahv++xdNUW0dF4Ew0qXoo/m6udO6g3VndD7bS+ZF8Gw0qXoo7n6uZO61c6LYFjpUvTRXP3cSd1q50UwrHQp+miufu6k3lDnvuS0gbaXzItgWOlS9NFc/dxJvaF2XrHpKQm8qdUvWzaOs/3iDYyvXoWA8dWr2H7xBle/WDFS9NFc/dyDj8zMGsSLZLRYjrpZ14+bNYuTekPN1rzOlkjN1rwClZNuv3OkuIaZ5eVn6g2Vo27W9eNmzeOk3lA56mZdP27WPE7qDZWjbtb142bN46TeUDnqZl0/btY8flHaULMvKoepTOl3jhTXMLO8XKduZtYgrlNfglJqs0uJw2w5uZ+n5aTepZTa7FLiMFtO7ufp+UVpl1Jqs0uJw2w5uZ+n56TepZTa7FLiMFtO7ufpOal3KaU2u5Q4zJaT+3l6TupdSqnNLiUOs+Xkfp6eX5R2KaU2u5Q4zJaT+3l6rlM3M2uQoevUJT0D+Hfg6Z3jb42Iv+065nLgOmCqs+lTEXH9UoO2GVfvOsDNew9xIoIVEpeevZZrt2yovB/y1AC7ztisHFUevzwBnB8Rj0taCXxH0u0RcXfXcbdExHvThziart51gJvufmju84mIuc/XbtnQdz/kqQF2nbFZWfq+KI0Zj3c+rux81fPMZoTcvPfQotv77Yc8NcCuMzYrS6XqF0krJN0LHAb2RMTeBQ57i6TvSbpV0toe59kmaVLS5PT09BBht9+JHu86Zrf32w95aoBdZ2xWlkpJPSJORMSrgDXAWZJe0XXIV4H1EfFKYA9wY4/z7IiIiYiYGBsbGybu1lshLbq9337IUwPsOmOzsgxUpx4RR4FvAa/v2v5IRDzR+Xg98Jo04Y2uS89e8B87c9v77Yc8NcCuMzYrS9+kLmlM0urO96uAC4Efdh1zxryPm4GDKYMcRddu2cBl56x70m/ml52zbu4laL/9MPOicvvFGxhfvQoB46tXsf3iDUlfYOa4hplV17dOXdIrmXmcsoKZvwS+FBHXSLoGmIyI3ZK2M5PMjwNHgPdExA97nhTXqZuZLUW/OnUPPjIzaxAvkrEEKQbTVBkYNOw5qsQ57L2kuI9SpPi55mhzs2E4qXdJMZimysCgYc9RJc5h7yXFfZQixc81R5ubDcuzNHZJMZimysCgYc9RJc5h7yXFfZQixc81R5ubDctJvUuKwTRVBgYNe44qcQ57LynuoxQpfq452txsWE7qXVIMpqkyMGjYc1SJc9h7SXEfpUjxc83R5mbDclLvkmIwTZWBQcOeo0qcw95LivsoRYqfa442NxuWX5R2STFp/+xLxGGqRvqdo0qcw95LivsoRYqfa442NxuW69TNzBrEdeoN1q/e2fXQZSqhtr+EGKweTuqF6lfv7HroMpVQ219CDFYfvygtVL96Z9dDl6mE2v4SYrD6OKkXql+9s+uhy1RCbX8JMVh9nNQL1a/e2fXQZSqhtr+EGKw+TuqF6lfv7HroMpVQ219CDFYfvygtVL96Z9dDl6mE2v4SYrD6uE7dzKxBRq5OPcec2blqgF2HPpimtFeKefJTSDEOItcc9VZdq5J6jjmzc9UAuw59ME1prxTz5KeQYhxErjnqbTCtelGaY87sXDXArkMfTFPaK8U8+SmkGAeRa456G0yrknqOObNz1QC7Dn0wTWmvFPPkp5BiHESuOeptMK1K6jnmzM5VA+w69ME0pb1SzJOfQopxELnmqLfBtCqp55gzO1cNsOvQB9OU9koxT34KKcZB5Jqj3gbTqhelOebMzlUD7Dr0wTSlvVLMk59CinEQueaot8G4Tt3MrEFGrk49hRy1t2/77F3c+cCRuc/nvuQ0dl6xKdk9WLly1GWn6F/uo83UqmfqKczWzU4dPUZwsm521/6pZOfo/sMCcOcDR3jbZ+9KeCdWohT9q58U/ct9tLmc1LvkqL3t/sMyq9d2a48cddkp+pf7aHM5qXdx7a0tJ/cNW25O6l1ce2vLyX3DlpuTepcctbfnvuS0Bf+/XtutPXLUZafoX+6jzeWk3mXLxnG2X7yB8dWrEDC+ehXbL94wcO3tYufYecWmp/zhcGXBaEjRv/pJ0b/cR5vLdepmZg3Sr06972/qkp4h6T8lfVfSDyT9/QLHPF3SLZLul7RX0vrhwjYzs6WoMvjoCeD8iHhc0krgO5Juj4i75x3zLuBXEfFSSVuBjwNvTR1srkn7U0ixEEIJ95IihiqLiuS4TpVr5FoAZTFVBv2kWMglR/9qUz8vIc4qBnr8IumZwHeA90TE3nnb7wD+LiLuknQK8AtgLBY5+aCPX7on04eZF0zzn0dWOSaH7oUQZl12zroFF0JYKM4S7iVFDP3aItd1qlyjSqzLbaFBP/DkxN7vXnK1eT9t6uclxDlr6McvnZOskHQvcBjYMz+hd4wDhwAi4jjwKPC8pYW8sFyT9qeQYiGEEu4lRQxVFhXJcZ0q18i1AMpiqgz6SbGQS47+1aZ+XkKcVVVK6hFxIiJeBawBzpL0iqVcTNI2SZOSJqenpwf6f3NN2p9CioUQSriXFDFUWVQkx3WqXCPXAijDSrGQS47+1aZ+XkKcVQ1U0hgRR4FvAa/v2jUFrAXoPH55LvDIAv//joiYiIiJsbGxgQLNNWl/CikWQijhXlLEUGVRkRzXqXKNXAugDCvFQi45+leb+nkJcVZVpfplTNLqzvergAuBH3Ydtht4R+f7S4BvLvY8fSlyTdqfQoqFEEq4lxQxVFlUJMd1qlwj1wIoi6ky6CfFQi45+leb+nkJcVZVpfrlDOBGSSuY+UvgSxHxNUnXAJMRsRu4Afi8pPuBI8DW1IHmmrQ/hRQLIZRwLyliqLKoSI7rVLlGrgVQFrPzik19q19SLOSSo3+1qZ+XEGdVHnxkZtYgI7dIRlNqSUdJKTXAKeLIdY4U99IWo3SvKbQqqXfXks4uQAC4E9Skys8kx88tRRy5zpHiXtpilO41lVZN6NWkWtJRUUoNcIo4cp0jxb20xSjdayqtSupNqiUdFaXUAKeII9c5+hmlfj5K95pKq5J6k2pJR0UpNcAp4sh1jn5GqZ+P0r2m0qqk3qRa0lFRSg1wijhynSPFvbTFKN1rKq16UdqkWtJRUUoNcIo4cp0jxb20xSjdayquUzcza5CRq1O38qSYxzxXrXKOefBLudc21X+XMs6hBE7qtqyq1Bl3z/99ImLu80JzoS9XrXKKOPodU8q9tqn+u5RxDqVo1YtSK0+Kecxz1SrnmAe/lHttU/13KeMcSuGkbssqxTzmuWqVc8yDX8q9tqn+u5RxDqVwUrdllWIe81y1yjnmwS/lXttU/13KOIdSOKnbskoxj3muWuUc8+CXcq9tqv8uZZxDKfyi1JZVinnMc9Uq55gHv5R7bVP9dynjHErhOnUzswZxnfqIK6G2NkUMF37i2/z48G/mPp/5/FPZc+V52eNIcZ0SfibWXn6m3mKztbVTR48RnKyt3bV/qlExdCd0gB8f/g0XfuLbWeNIcZ0SfibWbk7qLVZCbW2KGLoTer/tyxVHiuuU8DOxdnNSb7ESamtLiCFnHDnmUzdbjJN6i5VQW1tCDDnjyDGfutlinNRbrITa2hQxnPn8UwfavlxxpLhOCT8Tazcn9RbbsnGc7RdvYHz1KgSMr17F9os3ZK20SBHDnivPe0oCH7T6JVdb9LtOCT8TazfXqZuZNYjr1G3Zpai7LqW22zXk1ktT+oaTug0lxTzT/c7hOcatbk3qG36mbkNJUXddSm23a8itlyb1DSd1G0qKuutSartdQ269NKlvOKnbUFLUXZdS2+0acuulSX3DSd2GkqLuupTabteQWy9N6ht+UWpDSTHPdL9zeI5xq1uT+obr1M3MGqRfnXrfxy+S1kr6lqT7JP1A0vsXOOY8SY9Kurfz9bFhAzczs8FVefxyHPhQRNwj6dnAPkl7IuK+ruP+IyIuSh9iO+UYsJNLioFDpdxLClfvOtBzubpc2tSeNpi+ST0iHgYe7nz/a0kHgXGgO6lbRTkG7OSSYuBQKfeSwtW7DnDT3Q/NfT4RMfc5V2JvU3va4AaqfpG0HtgI7F1g9yZJ35V0u6SXJ4ittXIM2MklxcChUu4lhZv3Hhpo+3JoU3va4CpXv0h6FvBl4AMR8VjX7nuAF0XE45LeCOwCzlzgHNuAbQDr1q1bctBNl2PATi4pBg6Vci8pnOhReNBr+3JoU3va4Cr9pi5pJTMJfWdE3Na9PyIei4jHO99/HVgp6fQFjtsRERMRMTE2NjZk6M2VY8BOLikGDpVyLymskAbavhza1J42uCrVLwJuAA5GxCd6HPOCznFIOqtz3kdSBtomOQbs5JJi4FAp95LCpWevHWj7cmhTe9rgqjx+ORd4O3BA0r2dbR8F1gFExGeAS4D3SDoOHAO2Rl0F8A2QY8BOLikGDpVyLynMvgyts/qlTe1pg/PgIzOzBvEiGYVqUx1xCXXZZjbDSb0GbaojLqEu28xO8iyNNWhTHXEJddlmdpKTeg3aVEdcQl22mZ3kpF6DNtURl1CXbWYnOanXoE11xCXUZZvZSX5RWoM21RGXUJdtZie5Tt3MrEFcp96lSfXhTYm1KXHm4vawOo1UUm9SfXhTYm1KnLm4PaxuI/WitEn14U2JtSlx5uL2sLqNVFJvUn14U2JtSpy5uD2sbiOV1JtUH96UWJsSZy5uD6vbSCX1JtWHNyXWpsSZi9vD6jZSL0qbVB/elFibEmcubg+rm+vUzcwaxHXqZh0p5n13DbqVzkndRkKKed9dg25NMFIvSm10pZj33TXo1gRO6jYSUsz77hp0awIndRsJKeZ9dw26NYGTuo2EFPO+uwbdmsAvSm0kpJj33TXo1gSuUzcza5B+dep+/GJm1iJO6mZmLeKkbmbWIk7qZmYt4qRuZtYiTupmZi3ipG5m1iJO6mZmLdI3qUtaK+lbku6T9ANJ71/gGEn6J0n3S/qepFcvT7hmZraYKtMEHAc+FBH3SHo2sE/Snoi4b94xbwDO7HydDXy6818bghdkMLNB9f1NPSIejoh7Ot//GjgIdGeWNwOfixl3A6slnZE82hEyuyDD1NFjBCcXZNi1f6ru0MysYAM9U5e0HtgI7O3aNQ7MX23gZzw18dsAvCCDmS1F5aQu6VnAl4EPRMRjS7mYpG2SJiVNTk9PL+UUI8MLMpjZUlRK6pJWMpPQd0bEbQscMgXMn5h6TWfbk0TEjoiYiIiJsbGxpcQ7Mrwgg5ktRZXqFwE3AAcj4hM9DtsN/FmnCuYc4NGIeDhhnCPHCzKY2VJUqX45F3g7cEDSvZ1tHwXWAUTEZ4CvA28E7gf+F3hn+lBHixdkMLOl8CIZZmYN4kUyzMxGiJO6mVmLOKmbmbWIk7qZWYs4qZuZtUht1S+SpoGf1nLxGacDv6zx+oNoSqyOM62mxAnNibUNcb4oInqO3qwtqddN0uRiZUElaUqsjjOtpsQJzYl1FOL04xczsxZxUjcza5FRTuo76g5gAE2J1XGm1ZQ4oTmxtj7OkX2mbmbWRqP8m7qZWeuMRFKXtELSfklfW2Df5ZKmJd3b+Xp3TTE+KOlAJ4anzHRW0uLeFWI9T9Kj89r0YzXFuVrSrZJ+KOmgpE1d+4to0wpxltKeL5sXw72SHpP0ga5jam/TinGW0qYflPQDSd+XdLOkZ3Ttf7qkWzrtubez+tziIqL1X8CVwBeAry2w73LgUwXE+CBw+iL73wjcDgg4B9hbcKznLdTWNcR5I/DuzvdPA1aX2KYV4iyiPbtiWgH8gpma6eLatEKctbcpM0t+/gRY1fn8JeDyrmP+EvhM5/utwC39ztv639QlrQHeBFxfdyxD8uLeA5D0XOC1zCzwQkT8X0Qc7Tqs9jatGGeJLgAeiIjuAYS1t2mXXnGW4hRglaRTgGcCP+/a/2Zm/tIHuBW4oLNwUU+tT+rAJ4GPAL9b5Ji3dP6peKuktYsct5wC+IakfZK2LbC/pMW9+8UKsEnSdyXdLunlOYPreDEwDfxL59Hb9ZJO7TqmhDatEifU357dtgI3L7C9hDadr1ecUHObRsQU8I/AQ8DDzKwY942uw+baMyKOA48Cz1vsvK1O6pIuAg5HxL5FDvsqsD4iXgns4eTfirn9cUS8GngD8FeSXltTHFX0i/UeZv65+4fAPwO7cgfIzG9ArwY+HREbgd8Af1NDHP1UibOE9pwj6WnAZuBf64yjnz5x1t6mkn6fmd/EXwy8EDhV0mXDnrfVSZ2Zpfg2S3oQ+CJwvqSb5h8QEY9ExBOdj9cDr8kb4lwcU53/Hga+ApzVdUilxb1z6BdrRDwWEY93vv86sFLS6ZnD/Bnws4jY2/l8KzPJc74S2rRvnIW053xvAO6JiP9ZYF8JbTqrZ5yFtOmfAD+JiOmI+C1wG/BHXcfMtWfnEc1zgUcWO2mrk3pEXBURayJiPTP/DPtmRDzpb8Ku532bgYMZQ5yN4VRJz579HvhT4PtdhxWxuHeVWCW9YPa5n6SzmOlni3bE1CLiF8AhSbMrdV8A3Nd1WO1tWiXOEtqzy6X0fqRRe5vO0zPOQtr0IeAcSc/sxHIBT80/u4F3dL6/hJkctujgoioLT7eOpGuAyYjYDbxP0mbgOHCEmWqY3P4A+Eqnj50CfCEi/k3SX0Bxi3tXifUS4D2SjgPHgK39OuIy+WtgZ+ef4f8NvLPQNu0XZyntOfsX+YXAn8/bVlybVoiz9jaNiL2SbmXmUdBxYD+woys/3QB8XtL9zOSnrf3O6xGlZmYt0urHL2Zmo8ZJ3cysRZzUzcxaxEndzKxFnNTNzFrESd3MrEWc1M3MWsRJ3cysRf4fWTLcHs+a8i8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(\n", + " data[0], \n", + " data[1],)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Adding color coding by species allows us to see clustering for 2 attributes for each species. Here setosa is secluded, but virginica and versicolor overlap." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "colors = {'Iris-setosa':'red', 'Iris-virginica':'blue', 'Iris-versicolor':'green'}\n", + "plt.scatter(\n", + " data[2], \n", + " data[3], \n", + " c=data['species'].map(colors))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Adding labels to the x and y axes is useful, but we can see the data for virginica and versicolor still overlap. If we could find 1 attribute where there's no overlap for these 2 species then we could use those to definitively distinguish them. But unfortunately all 4 attributes have some overlap." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'petal_length')" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(\n", + " data[0], \n", + " data[2], \n", + " c=data['species'].map(colors))\n", + "plt.xlabel(cols[0])\n", + "plt.ylabel(cols[2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here we add a title to the plot, and show attributes 1 and 3. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Iris Data Scatter Plot')" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.scatter(\n", + " data[1], \n", + " data[3], \n", + " c=data['species'].map(colors))\n", + "plt.xlabel(cols[1])\n", + "plt.ylabel(cols[3])\n", + "plt.title('Iris Data Scatter Plot')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Correlation\n", + "We can see the correlation between attributes. A correlation close to 1 helps us distinguish between species. Low correlation doesn't help us." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123
01.000000-0.1093690.8717540.817954
1-0.1093691.000000-0.420516-0.356544
20.871754-0.4205161.0000000.962757
30.817954-0.3565440.9627571.000000
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3\n", + "0 1.000000 -0.109369 0.871754 0.817954\n", + "1 -0.109369 1.000000 -0.420516 -0.356544\n", + "2 0.871754 -0.420516 1.000000 0.962757\n", + "3 0.817954 -0.356544 0.962757 1.000000" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.corr()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Box and Whisker Plots\n", + "Box plots show the distribution of data over an attribute by showing the 25th, 50th (median) and 75th percentiles. Again, the simplest plots are not very useful, but when we add labels and color coding the plots are revealing." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'whiskers': [,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ],\n", + " 'caps': [,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ,\n", + " ],\n", + " 'boxes': [,\n", + " ,\n", + " ,\n", + " ],\n", + " 'medians': [,\n", + " ,\n", + " ,\n", + " ],\n", + " 'fliers': [,\n", + " ,\n", + " ,\n", + " ],\n", + " 'means': []}" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWoAAAD4CAYAAADFAawfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAPo0lEQVR4nO3dYWhd933G8eepoqLEjZOr5TLqKJoDG0G1oEl3CdlqCnKWka6lfVNIHFJoEWgvOi0ZBdNOL+y8EMMwSvOiDEyUdbD41luaQAlZ10BVMkGX9ipJWyVKoYtrV3E2K/h2TsLcOspvL3TtWrbse2Sdo/O/934/cIl079HRw0F5OP6f/zl/R4QAAOn6QNkBAABXRlEDQOIoagBIHEUNAImjqAEgcdcUsdObbropdu7cWcSuAaArzc/PvxUR1fU+K6Sod+7cqUajUcSuAaAr2T52uc8Y+gCAxFHUAJA4ihoAEpepqG3/je1XbC/YrtseKDoYAGBV26K2fbOkv5ZUi4hRSX2S7i86GABgVdahj2skXWv7GknXSTpRXCQAwIXaFnVEvCHp7yUdl/SmpP+NiO9dvJ3tCdsN243l5eX8kwJAj8oy9FGR9FlJt0raIWmb7Qcv3i4iDkVELSJq1eq6c7YBAFchy9DHn0k6GhHLEXFW0lOS/rTYWJtjO9cXAJQpy52JxyXdZfs6Sf8n6W5JSd92mGUxBNuZtgOAsmUZo35B0pOSXpT0s9bPHCo4FwCgJdOzPiJiv6T9BWcBAKyDOxMBIHEUNQAkjqIGgMRR1ACQOIoaABJHUQNA4ihqAEgcRQ0AiaOoASBxFDUAJI6iBoDEUdQAkDiKGgASR1EDQOIoagBIHEUNAInLsrjtbbZfvuB12vbDWxEOAJBhhZeI+Lmk2yXJdp+kNyQ9XXAuAEDLRoc+7pb0XxFxrIgwAIBLbbSo75dUX+8D2xO2G7Yby8vLm08GAJC0gaK2/UFJn5H0r+t9HhGHIqIWEbVqtZpXPgDoeRs5o/6kpBcj4n+KCgMAuFTbi4kX2KvLDHsAyMZ2rvuLiFz3hzRlKmrb2yTdI+kvi40DdLesxWqbEsZ5mYo6It6V9HsFZwEArIM7EwEgcRQ1ACSOogaAxFHUAJA4ihoAEkdRA0DiKGoASBxFDQCJo6gBIHEdV9SDg4OyvemXpFz2Y1uDg4MlHxUA3WwjD2VKQrPZTO4ZCHk/aAcALtRxZ9QA0GsoagBIHEUNAImjqAEgcRQ1ACQuU1HbvtH2k7Zfs71o+0+KDgYAWJV1et6jkr4bEZ9rrUZ+XYGZAAAXaFvUtm+Q9AlJX5CkiPitpN8WGwsAcE6WoY9bJS1L+kfbL9l+rLXY7Rq2J2w3bDeWl5dzDwoAvSpLUV8j6WOS/iEi7pD0rqSvXLxRRByKiFpE1KrVas4xAaB3ZSnqJUlLEfFC6/sntVrcAIAt0LaoI+K/Jf3K9m2tt+6W9GqhqQAA52Wd9TEp6YnWjI/XJX2xuEgAgAtlKuqIeFlSreAsmcT+7dKBG8qOsUbs3152BABdrOMec+pHTif5mNM4UHYKAN2KW8gBIHEUNQAkjqIGgMRR1ACQOIoaABJHUQNA4ihqAEgcRQ0AiaOoASBxFDUAJI6iBoDEUdQAkDiKGgASR1EDQOIoagBIHEUNAInLtHCA7V9KelvSiqT3IqLU1V5sl/nrL1GpVMqOgAQMDg6q2Wzmtr+8/s4rlYpOnTqVy75Qjo2s8DIWEW8VliSjvFZ3sZ3cSjHobM1mM8m/qdRObLBxDH0AQOKyFnVI+p7tedsT621ge8J2w3ZjeXk5v4QA0OOyFvXuiPiYpE9K+pLtT1y8QUQciohaRNSq1WquIQGgl2Uq6oh4o/Xfk5KelnRnkaEAAL/Ttqhtb7N9/bmvJf25pIWigwEAVmWZ9fH7kp5uXTm+RtLhiPhuoakAAOe1LeqIeF3SR7cgCwBgHUzPA4DEUdQAkDiKGgASR1EDQOIoagBIHEUNAImjqLEp9Xpdo6Oj6uvr0+joqOr1etmRgK6zkcecAmvU63VNTU1pZmZGu3fv1tzcnMbHxyVJe/fuLTkd0D04o8ZVm56e1szMjMbGxtTf36+xsTHNzMxoenq67GhAV3ERDzqv1WrRaDRy32+eWDhg8/r6+nTmzBn19/eff+/s2bMaGBjQyspKicnKkerfVKq5sJbt+cutnsXQB67ayMiI5ubmNDY2dv69ubk5jYyMlJiqPLF/u3TghrJjXCL2by87AjapK4s669JDWbfjbGR9U1NTuu+++7Rt2zYdP35cw8PDevfdd/Xoo4+WHa0UfuR0kn8rthUHyk6BzejKok7xf5ZuxzEHisPFRFy16elpHTlyREePHtX777+vo0eP6siRI1xMBHJGUeOqLS4uamlpac086qWlJS0uLpYdDegqXTn0ga2xY8cO7du3T4cPHz4/j/qBBx7Qjh07yo4GdJXMZ9S2+2y/ZPuZIgOhs1x8QTbrBVoA2W1k6OMhSfybFuedOHFCBw8e1OTkpAYGBjQ5OamDBw/qxIkTZUcDukqmorY9JOlTkh4rNg46ycjIiIaGhrSwsKCVlRUtLCxoaGioZ+dRA0XJOkb9dUn7JF1/uQ1sT0iakKTh4eHNJ0MyrjScsWfPng3/DFP5gI1pe0Zt+9OSTkbE/JW2i4hDEVGLiFq1Ws0tIMoXEZd9HT58WLt27ZIk7dq1S4cPH77i9pQ0sHFtn/Vh++8kfV7Se5IGJG2X9FREPHi5n+mEZ30gXzxPIt1jkGourHWlZ320PaOOiK9GxFBE7JR0v6TvX6mkAQD54oYXAEjchm54iYgfSPpBIUkAAOvijBoAEkdRA0DiKGoASBxFDQCJo6gBIHEUNQAkjqIGgMRR1ACQOIoaABJHUQNA4ihqAEgcRQ0AiWMV8h42ODioZrOZ2/7yWti2Uqno1KlTuewL6AYUdQ9rNptJPlCelcyBtRj6AIDEUdQAkLgsi9sO2P6R7Z/YfsX2I1sRDACwKssY9W8k7YmId2z3S5qz/W8R8Z8FZwMAKENRx+rVpnda3/a3XuldgQKALpVp1oftPknzkv5Q0jci4oV1tpmQNCFJw8PDeWZEQWL/dunADWXHuETs3152BCAp3sj0LNs3Snpa0mRELFxuu1qtFo1GI4d4KJLtZKfnpZirnVRzp5oLa9mej4jaep9taNZHRPxa0qyke/MIBgBoL8usj2rrTFq2r5V0j6TXig4GAFiVZYz6w5L+qTVO/QFJ/xIRzxQbCwBwTpZZHz+VdMcWZEEJUrxdu1KplB0BSArP+uhheV5g4oIVUBxuIQeAxFHUAJA4ihoAEkdRA0DiKGoASBxFDQCJY3oegI6V930AqU4xpagBdKysxdrp8/wZ+gCAxFHUAJA4ihoAEkdRA0DiKGoASBxFDQCJY3oe2so6VzXrdp08TQooA0WNtihWoFxZ1ky8xfas7Vdtv2L7oa0Ihs5Qr9c1Ojqqvr4+jY6Oql6vlx0J6DpZzqjfk/TliHjR9vWS5m0/FxGvFpwNiavX65qamtLMzIx2796tubk5jY+PS5L27t1bcjqge7Q9o46INyPixdbXb0talHRz0cGQvunpac3MzGhsbEz9/f0aGxvTzMyMpqeny44GdBVvZPzR9k5Jz0sajYjTF302IWlCkoaHh//42LFj+aVEkvr6+nTmzBn19/eff+/s2bMaGBjQyspKicnKkerzJFLNtZU64RjYno+I2nqfZZ6eZ/tDkr4t6eGLS1qSIuJQRNQiolatVq8+LTrGyMiI5ubm1rw3NzenkZGRkhIB3SlTUdvu12pJPxERTxUbCZ1iampK4+Pjmp2d1dmzZzU7O6vx8XFNTU2VHQ3oKm0vJnp1cuyMpMWI+FrxkdApzl0wnJyc1OLiokZGRjQ9Pc2FRCBnbceobe+W9B+Sfibp/dbbfxsRz17uZ2q1WjQajdxCAp0g1XHQVHNtpU44Blcao257Rh0Rc5LyXUYBANoYHBxUs9nMbX95rAZTqVR06tSpHNJsDHcmAkhSs9lM7iw476W/suKhTACQOIoaABJHUQNA4hijBnJU1hjmlVQqlbIjYJMoaiAneV746oTpZNg6DH0AQOIoagBIHEUNAImjqAEgcRQ1ACSOogaAxDE9D0CSYv926cANZcdYI/ZvL+X3UtQAkuRHTic3l9y24sDW/16GPgAgcRQ1ACSubVHbftz2SdsLWxEIALBWljPqb0q6t+AcAIDLaFvUEfG8pK1fewYAICnHWR+2JyRNSNLw8HBeuwW6ykYeg5pl29RmRaAYuV1MjIhDEVGLiFq1Ws1rt0BXiYhcX+gNzPoAgMRR1ACQuCzT8+qSfijpNttLtseLjwUAOKftxcSI2LsVQQAA62PoAwASR1EDQOIoagBIHEUNAImjqAEgcRQ1ACSOogaAxFHUAJA4ihoAEkdRA0DiKGoASBxFDQCJy22FFwDI20ZWxNkKlUqllN9LUQNIUp4r2Nju6BVxGPoAgMRR1ACQuExFbfte2z+3/QvbXyk6FADgd9qOUdvuk/QNSfdIWpL0Y9vfiYhXiw4HAFeykYuNWbZNdRw7y8XEOyX9IiJelyTb35L0WUkUNYBSpVqsecsy9HGzpF9d8P1S6701bE/YbthuLC8v55UPAHpebhcTI+JQRNQiolatVvPaLQD0vCxF/YakWy74fqj1HgBgC2Qp6h9L+iPbt9r+oKT7JX2n2FgAgHPaXkyMiPds/5Wkf5fUJ+nxiHil8GQAAEkZbyGPiGclPVtwFgDAOrgzEQASR1EDQOJcxIRx28uSjuW+43zdJOmtskN0EY5nvjie+eqE4/kHEbHu3OZCiroT2G5ERK3sHN2C45kvjme+Ov14MvQBAImjqAEgcb1c1IfKDtBlOJ754njmq6OPZ8+OUQNAp+jlM2oA6AgUNQAkrueK2vbjtk/aXig7SzewfYvtWduv2n7F9kNlZ+pUtgds/8j2T1rH8pGyM3UD2322X7L9TNlZrlbPFbWkb0q6t+wQXeQ9SV+OiI9IukvSl2x/pORMneo3kvZExEcl3S7pXtt3lZypGzwkabHsEJvRc0UdEc9LOlV2jm4REW9GxIutr9/W6v8Ql6wAhPZi1Tutb/tbL672b4LtIUmfkvRY2Vk2o+eKGsWxvVPSHZJeKDdJ52r9M/1lSSclPRcRHMvN+bqkfZLeLzvIZlDUyIXtD0n6tqSHI+J02Xk6VUSsRMTtWl1J6U7bo2Vn6lS2Py3pZETMl51lsyhqbJrtfq2W9BMR8VTZebpBRPxa0qy4nrIZH5f0Gdu/lPQtSXts/3O5ka4ORY1NsW1JM5IWI+JrZefpZLartm9sfX2tpHskvVZuqs4VEV+NiKGI2KnVJQS/HxEPlhzrqvRcUduuS/qhpNtsL9keLztTh/u4pM9r9Wzl5dbrL8oO1aE+LGnW9k+1ulbpcxHRsVPKkB9uIQeAxPXcGTUAdBqKGgASR1EDQOIoagBIHEUNAImjqAEgcRQ1ACTu/wF/u4D4GapFtgAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plt.boxplot([data[0], data[1], data[2], data[3]])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This shows a boxplot for one attribute, sorted by species. For this attribute we can see a big overlap between the 3 species, so it's not very useful for distinguishing. An iris with 5.5 or 6.0 for this attribute could be any of the 3 species." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "data.boxplot(column=[0], by=['species'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's tricky to do subplots, but worth it. We can see setosa has smaller petals than the other 2 species. And versicolor has, on average, smaller sepals and smaller petals than virginica; but there is some overlap." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'petal_width')" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(2, 2, figsize=(8, 6))\n", + "A = [data[0][data.species == 'Iris-setosa'], data[0][data.species == 'Iris-virginica'], data[0][data.species == 'Iris-versicolor']]\n", + "B = [data[1][data.species == 'Iris-setosa'], data[1][data.species == 'Iris-virginica'], data[1][data.species == 'Iris-versicolor']]\n", + "C = [data[2][data.species == 'Iris-setosa'], data[2][data.species == 'Iris-virginica'], data[2][data.species == 'Iris-versicolor']]\n", + "D = [data[3][data.species == 'Iris-setosa'], data[3][data.species == 'Iris-virginica'], data[3][data.species == 'Iris-versicolor']]\n", + "\n", + "ax[0, 0].boxplot(A, widths = 0.7)\n", + "ax[0, 0].set_title(cols[0])\n", + "ax[0, 1].boxplot(B, widths = 0.7)\n", + "ax[0, 1].set_title(cols[1])\n", + "ax[1, 0].boxplot(C, widths = 0.7)\n", + "ax[1, 0].set_title(cols[2])\n", + "ax[1, 1].boxplot(D, widths = 0.7)\n", + "ax[1, 1].set_title(cols[3])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This plot does an awsome job of showing distributions of all 4 attributes for all 3 species. 12 box plots in 1 graph! The color coding makes it more readable. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/ipykernel_launcher.py:21: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def set_color(bp):\n", + " plt.setp(bp['boxes'][0], color='blue')\n", + " plt.setp(bp['boxes'][1], color='red')\n", + " plt.setp(bp['boxes'][2], color='green')\n", + "\n", + "A = [data[0][data.species == 'Iris-setosa'], data[0][data.species == 'Iris-virginica'], data[0][data.species == 'Iris-versicolor']]\n", + "B = [data[1][data.species == 'Iris-setosa'], data[1][data.species == 'Iris-virginica'], data[1][data.species == 'Iris-versicolor']]\n", + "C = [data[2][data.species == 'Iris-setosa'], data[2][data.species == 'Iris-virginica'], data[2][data.species == 'Iris-versicolor']]\n", + "D = [data[3][data.species == 'Iris-setosa'], data[3][data.species == 'Iris-virginica'], data[3][data.species == 'Iris-versicolor']]\n", + "\n", + "# add this to remove outlier symbols: 0, '',\n", + "bp = plt.boxplot(A, 0, '', positions = [1, 2, 3], widths = 0.7)\n", + "set_color(bp)\n", + "bp = plt.boxplot(B, 0, '', positions = [5, 6, 7], widths = 0.7)\n", + "set_color(bp)\n", + "bp = plt.boxplot(C, 0, '', positions = [9, 10, 11], widths = 0.7)\n", + "set_color(bp)\n", + "bp = plt.boxplot(D, 0, '', positions = [13, 14, 15], widths = 0.7)\n", + "set_color(bp)\n", + "\n", + "ax = plt.axes()\n", + "ax.set_xticks([2, 6, 10, 14])\n", + "ax.set_xticklabels(cols)\n", + "\n", + "plt.show()" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Iris Dataset/iris.data b/Iris Dataset/iris.data new file mode 100644 index 00000000..835f8b44 --- /dev/null +++ b/Iris Dataset/iris.data @@ -0,0 +1,151 @@ +id,sepal_length,sepal_width,petal_length,petal_width,species +0,5.1,3.5,1.4,0.2,Iris-setosa +1,4.9,3.0,1.4,0.2,Iris-setosa +2,4.7,3.2,1.3,0.2,Iris-setosa +3,4.6,3.1,1.5,0.2,Iris-setosa +4,5.0,3.6,1.4,0.2,Iris-setosa +5,5.4,3.9,1.7,0.4,Iris-setosa +6,4.6,3.4,1.4,0.3,Iris-setosa +7,5.0,3.4,1.5,0.2,Iris-setosa +8,4.4,2.9,1.4,0.2,Iris-setosa +9,4.9,3.1,1.5,0.1,Iris-setosa +10,5.4,3.7,1.5,0.2,Iris-setosa +11,4.8,3.4,1.6,0.2,Iris-setosa +12,4.8,3.0,1.4,0.1,Iris-setosa +13,4.3,3.0,1.1,0.1,Iris-setosa +14,5.8,4.0,1.2,0.2,Iris-setosa +15,5.7,4.4,1.5,0.4,Iris-setosa +16,5.4,3.9,1.3,0.4,Iris-setosa +17,5.1,3.5,1.4,0.3,Iris-setosa +18,5.7,3.8,1.7,0.3,Iris-setosa +19,5.1,3.8,1.5,0.3,Iris-setosa +20,5.4,3.4,1.7,0.2,Iris-setosa +21,5.1,3.7,1.5,0.4,Iris-setosa +22,4.6,3.6,1.0,0.2,Iris-setosa +23,5.1,3.3,1.7,0.5,Iris-setosa +24,4.8,3.4,1.9,0.2,Iris-setosa +25,5.0,3.0,1.6,0.2,Iris-setosa +26,5.0,3.4,1.6,0.4,Iris-setosa +27,5.2,3.5,1.5,0.2,Iris-setosa +28,5.2,3.4,1.4,0.2,Iris-setosa +29,4.7,3.2,1.6,0.2,Iris-setosa +30,4.8,3.1,1.6,0.2,Iris-setosa +31,5.4,3.4,1.5,0.4,Iris-setosa +32,5.2,4.1,1.5,0.1,Iris-setosa +33,5.5,4.2,1.4,0.2,Iris-setosa +34,4.9,3.1,1.5,0.1,Iris-setosa +35,5.0,3.2,1.2,0.2,Iris-setosa +36,5.5,3.5,1.3,0.2,Iris-setosa +37,4.9,3.1,1.5,0.1,Iris-setosa +38,4.4,3.0,1.3,0.2,Iris-setosa +39,5.1,3.4,1.5,0.2,Iris-setosa +40,5.0,3.5,1.3,0.3,Iris-setosa +41,4.5,2.3,1.3,0.3,Iris-setosa +42,4.4,3.2,1.3,0.2,Iris-setosa +43,5.0,3.5,1.6,0.6,Iris-setosa +44,5.1,3.8,1.9,0.4,Iris-setosa +45,4.8,3.0,1.4,0.3,Iris-setosa +46,5.1,3.8,1.6,0.2,Iris-setosa +47,4.6,3.2,1.4,0.2,Iris-setosa +48,5.3,3.7,1.5,0.2,Iris-setosa +49,5.0,3.3,1.4,0.2,Iris-setosa +50,7.0,3.2,4.7,1.4,Iris-versicolor +51,6.4,3.2,4.5,1.5,Iris-versicolor +52,6.9,3.1,4.9,1.5,Iris-versicolor +53,5.5,2.3,4.0,1.3,Iris-versicolor +54,6.5,2.8,4.6,1.5,Iris-versicolor +55,5.7,2.8,4.5,1.3,Iris-versicolor +56,6.3,3.3,4.7,1.6,Iris-versicolor +57,4.9,2.4,3.3,1.0,Iris-versicolor +58,6.6,2.9,4.6,1.3,Iris-versicolor +59,5.2,2.7,3.9,1.4,Iris-versicolor +60,5.0,2.0,3.5,1.0,Iris-versicolor +61,5.9,3.0,4.2,1.5,Iris-versicolor +62,6.0,2.2,4.0,1.0,Iris-versicolor +63,6.1,2.9,4.7,1.4,Iris-versicolor +64,5.6,2.9,3.6,1.3,Iris-versicolor +65,6.7,3.1,4.4,1.4,Iris-versicolor +66,5.6,3.0,4.5,1.5,Iris-versicolor +67,5.8,2.7,4.1,1.0,Iris-versicolor +68,6.2,2.2,4.5,1.5,Iris-versicolor +69,5.6,2.5,3.9,1.1,Iris-versicolor +70,5.9,3.2,4.8,1.8,Iris-versicolor +71,6.1,2.8,4.0,1.3,Iris-versicolor +72,6.3,2.5,4.9,1.5,Iris-versicolor +73,6.1,2.8,4.7,1.2,Iris-versicolor +74,6.4,2.9,4.3,1.3,Iris-versicolor +75,6.6,3.0,4.4,1.4,Iris-versicolor +76,6.8,2.8,4.8,1.4,Iris-versicolor +77,6.7,3.0,5.0,1.7,Iris-versicolor +78,6.0,2.9,4.5,1.5,Iris-versicolor +79,5.7,2.6,3.5,1.0,Iris-versicolor +80,5.5,2.4,3.8,1.1,Iris-versicolor +81,5.5,2.4,3.7,1.0,Iris-versicolor +82,5.8,2.7,3.9,1.2,Iris-versicolor +83,6.0,2.7,5.1,1.6,Iris-versicolor +84,5.4,3.0,4.5,1.5,Iris-versicolor +85,6.0,3.4,4.5,1.6,Iris-versicolor +86,6.7,3.1,4.7,1.5,Iris-versicolor +87,6.3,2.3,4.4,1.3,Iris-versicolor +88,5.6,3.0,4.1,1.3,Iris-versicolor +89,5.5,2.5,4.0,1.3,Iris-versicolor +90,5.5,2.6,4.4,1.2,Iris-versicolor +91,6.1,3.0,4.6,1.4,Iris-versicolor +92,5.8,2.6,4.0,1.2,Iris-versicolor +93,5.0,2.3,3.3,1.0,Iris-versicolor +94,5.6,2.7,4.2,1.3,Iris-versicolor +95,5.7,3.0,4.2,1.2,Iris-versicolor +96,5.7,2.9,4.2,1.3,Iris-versicolor +97,6.2,2.9,4.3,1.3,Iris-versicolor +98,5.1,2.5,3.0,1.1,Iris-versicolor +99,5.7,2.8,4.1,1.3,Iris-versicolor +100,6.3,3.3,6.0,2.5,Iris-virginica +101,5.8,2.7,5.1,1.9,Iris-virginica +102,7.1,3.0,5.9,2.1,Iris-virginica +103,6.3,2.9,5.6,1.8,Iris-virginica +104,6.5,3.0,5.8,2.2,Iris-virginica +105,7.6,3.0,6.6,2.1,Iris-virginica +106,4.9,2.5,4.5,1.7,Iris-virginica +107,7.3,2.9,6.3,1.8,Iris-virginica +108,6.7,2.5,5.8,1.8,Iris-virginica +109,7.2,3.6,6.1,2.5,Iris-virginica +110,6.5,3.2,5.1,2.0,Iris-virginica +111,6.4,2.7,5.3,1.9,Iris-virginica +112,6.8,3.0,5.5,2.1,Iris-virginica +113,5.7,2.5,5.0,2.0,Iris-virginica +114,5.8,2.8,5.1,2.4,Iris-virginica +115,6.4,3.2,5.3,2.3,Iris-virginica +116,6.5,3.0,5.5,1.8,Iris-virginica +117,7.7,3.8,6.7,2.2,Iris-virginica +118,7.7,2.6,6.9,2.3,Iris-virginica +119,6.0,2.2,5.0,1.5,Iris-virginica +120,6.9,3.2,5.7,2.3,Iris-virginica +121,5.6,2.8,4.9,2.0,Iris-virginica +122,7.7,2.8,6.7,2.0,Iris-virginica +123,6.3,2.7,4.9,1.8,Iris-virginica +124,6.7,3.3,5.7,2.1,Iris-virginica +125,7.2,3.2,6.0,1.8,Iris-virginica +126,6.2,2.8,4.8,1.8,Iris-virginica +127,6.1,3.0,4.9,1.8,Iris-virginica +128,6.4,2.8,5.6,2.1,Iris-virginica +129,7.2,3.0,5.8,1.6,Iris-virginica +130,7.4,2.8,6.1,1.9,Iris-virginica +131,7.9,3.8,6.4,2.0,Iris-virginica +132,6.4,2.8,5.6,2.2,Iris-virginica +133,6.3,2.8,5.1,1.5,Iris-virginica +134,6.1,2.6,5.6,1.4,Iris-virginica +135,7.7,3.0,6.1,2.3,Iris-virginica +136,6.3,3.4,5.6,2.4,Iris-virginica +137,6.4,3.1,5.5,1.8,Iris-virginica +138,6.0,3.0,4.8,1.8,Iris-virginica +139,6.9,3.1,5.4,2.1,Iris-virginica +140,6.7,3.1,5.6,2.4,Iris-virginica +141,6.9,3.1,5.1,2.3,Iris-virginica +142,5.8,2.7,5.1,1.9,Iris-virginica +143,6.8,3.2,5.9,2.3,Iris-virginica +144,6.7,3.3,5.7,2.5,Iris-virginica +145,6.7,3.0,5.2,2.3,Iris-virginica +146,6.3,2.5,5.0,1.9,Iris-virginica +147,6.5,3.0,5.2,2.0,Iris-virginica +148,6.2,3.4,5.4,2.3,Iris-virginica +149,5.9,3.0,5.1,1.8,Iris-virginica From 9823f4ecf5e01874399aaa1cc03b3b958aa9b3b4 Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 28 Oct 2021 17:23:40 -0700 Subject: [PATCH 72/77] Delete temp --- Iris Dataset/temp | 1 - 1 file changed, 1 deletion(-) delete mode 100644 Iris Dataset/temp diff --git a/Iris Dataset/temp b/Iris Dataset/temp deleted file mode 100644 index 9c595a6f..00000000 --- a/Iris Dataset/temp +++ /dev/null @@ -1 +0,0 @@ -temp From ca9255abe4f071632a89caaf684719488f3525ff Mon Sep 17 00:00:00 2001 From: Joe James Date: Sat, 6 Nov 2021 13:12:09 -0700 Subject: [PATCH 73/77] Add Iris KNN notebook --- Iris Dataset/KNN-IrisData.ipynb | 629 ++++++++++++++++++++++++++++++++ 1 file changed, 629 insertions(+) create mode 100644 Iris Dataset/KNN-IrisData.ipynb diff --git a/Iris Dataset/KNN-IrisData.ipynb b/Iris Dataset/KNN-IrisData.ipynb new file mode 100644 index 00000000..d49be354 --- /dev/null +++ b/Iris Dataset/KNN-IrisData.ipynb @@ -0,0 +1,629 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Classification \n", + "predict which group a new target object belongs to by comparing it to identified objects. The identified, or labeled objects are called the training set." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## KNN - K-Nearest Neighbors\n", + "Find the k nearest objects to the target object using some distance metric. Then these k nearest neighbors get to vote on the identity of the target object. \n", + "For example, if k=5, we find the 5 nearest objects in our training set. If three of them are apples, one is a pear and one is an orange then we predict our target object is an apple. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsepal_lengthsepal_widthpetal_lengthpetal_widthspecies
005.13.51.40.2Iris-setosa
114.93.01.40.2Iris-setosa
224.73.21.30.2Iris-setosa
334.63.11.50.2Iris-setosa
445.03.61.40.2Iris-setosa
\n", + "
" + ], + "text/plain": [ + " id sepal_length sepal_width petal_length petal_width species\n", + "0 0 5.1 3.5 1.4 0.2 Iris-setosa\n", + "1 1 4.9 3.0 1.4 0.2 Iris-setosa\n", + "2 2 4.7 3.2 1.3 0.2 Iris-setosa\n", + "3 3 4.6 3.1 1.5 0.2 Iris-setosa\n", + "4 4 5.0 3.6 1.4 0.2 Iris-setosa" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train = pd.read_csv('iris.data')\n", + "train.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Rename columns of training set, and add a column for distance." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123speciesdistance
05.13.51.40.2Iris-setosa9999
14.93.01.40.2Iris-setosa9999
24.73.21.30.2Iris-setosa9999
34.63.11.50.2Iris-setosa9999
45.03.61.40.2Iris-setosa9999
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 species distance\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa 9999\n", + "1 4.9 3.0 1.4 0.2 Iris-setosa 9999\n", + "2 4.7 3.2 1.3 0.2 Iris-setosa 9999\n", + "3 4.6 3.1 1.5 0.2 Iris-setosa 9999\n", + "4 5.0 3.6 1.4 0.2 Iris-setosa 9999" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train = train.drop('id', 1)\n", + "cols = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']\n", + "train.rename(columns = {cols[0]:0, cols[1]:1, cols[2]:2, cols[3]:3}, inplace=True)\n", + "train['distance'] = 9999\n", + "train.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create an unidentified Target instance, then we will try to predict its species using knn." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 7.0\n", + "1 3.1\n", + "2 5.6\n", + "3 1.9\n", + "dtype: float64" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "target = pd.Series([7.0, 3.1, 5.6, 1.9])\n", + "target" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Distance\n", + "There are a variety of ways to measure [distance](https://towardsdatascience.com/9-distance-measures-in-data-science-918109d069fa). If there are many attributes, we may use a subset of the attributes to compare objects. \n", + "We'll use Euclidean distance, similar to Pythagorean Theorem but scaled to more attributes. \n", + "We compute the distance of every training instance from the target." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
0123speciesdistance
05.13.51.40.2Iris-setosa4.929503
105.43.71.50.2Iris-setosa4.756049
205.43.41.70.2Iris-setosa4.555217
304.83.11.60.2Iris-setosa4.871345
405.03.51.30.3Iris-setosa5.020956
507.03.24.71.4Iris-versicolor1.034408
605.02.03.51.0Iris-versicolor3.229551
705.93.24.81.8Iris-versicolor1.367479
805.52.43.81.1Iris-versicolor2.572936
905.52.64.41.2Iris-versicolor2.104757
1006.33.36.02.5Iris-virginica1.024695
1106.53.25.12.0Iris-virginica0.721110
1206.93.25.72.3Iris-virginica0.435890
1307.42.86.11.9Iris-virginica0.707107
1406.73.15.62.4Iris-virginica0.583095
\n", + "
" + ], + "text/plain": [ + " 0 1 2 3 species distance\n", + "0 5.1 3.5 1.4 0.2 Iris-setosa 4.929503\n", + "10 5.4 3.7 1.5 0.2 Iris-setosa 4.756049\n", + "20 5.4 3.4 1.7 0.2 Iris-setosa 4.555217\n", + "30 4.8 3.1 1.6 0.2 Iris-setosa 4.871345\n", + "40 5.0 3.5 1.3 0.3 Iris-setosa 5.020956\n", + "50 7.0 3.2 4.7 1.4 Iris-versicolor 1.034408\n", + "60 5.0 2.0 3.5 1.0 Iris-versicolor 3.229551\n", + "70 5.9 3.2 4.8 1.8 Iris-versicolor 1.367479\n", + "80 5.5 2.4 3.8 1.1 Iris-versicolor 2.572936\n", + "90 5.5 2.6 4.4 1.2 Iris-versicolor 2.104757\n", + "100 6.3 3.3 6.0 2.5 Iris-virginica 1.024695\n", + "110 6.5 3.2 5.1 2.0 Iris-virginica 0.721110\n", + "120 6.9 3.2 5.7 2.3 Iris-virginica 0.435890\n", + "130 7.4 2.8 6.1 1.9 Iris-virginica 0.707107\n", + "140 6.7 3.1 5.6 2.4 Iris-virginica 0.583095" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "train['distance'] = ((train.loc[:,0]-target[0])**2 + (train.loc[:,1]-target[1])**2 + (train.loc[:,2]-target[2])**2 + (train.loc[:,3]-target[3])**2) ** 0.5\n", + "train.loc[::10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We sort the training records by distance, and add the species of the (k=7) items nearest to the target to a list." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Iris-virginica',\n", + " 'Iris-virginica',\n", + " 'Iris-virginica',\n", + " 'Iris-virginica',\n", + " 'Iris-virginica',\n", + " 'Iris-virginica',\n", + " 'Iris-virginica']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "k = 7\n", + "train = train.sort_values('distance', ascending=True)\n", + "knn = list(train.head(k).species)\n", + "knn" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We use mode to get the most popular of the knn list. In this example the whole knn list is Iris-virginica, so our prediction is obvious. But sometimes the list of nearest neighbors will be a variety, and the mode tells us our prediction." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iris-virginica\n" + ] + } + ], + "source": [ + "from statistics import mode\n", + "print(mode(knn))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To check our prediction, we plot the training set on a scatter plot, then plot our target. Here we can see our target is surrounded by Iris-virginica instances, so our prediction is probably correct." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Iris Data Scatter Plot')" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "colors = {'Iris-setosa':'red', 'Iris-virginica':'blue', 'Iris-versicolor':'green'}\n", + "plt.scatter(\n", + " train[2], \n", + " train[3], \n", + " c=train['species'].map(colors))\n", + "plt.scatter(target[2], target[3], c='orange')\n", + "plt.xlabel(cols[2])\n", + "plt.ylabel(cols[3])\n", + "plt.title('Iris Data Scatter Plot')" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 87f407702a4a8ba18591daeb10fb8a1e5fced93d Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 1 May 2023 12:35:08 -0700 Subject: [PATCH 74/77] Add files via upload --- flatten_list.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 flatten_list.py diff --git a/flatten_list.py b/flatten_list.py new file mode 100644 index 00000000..3f3c57df --- /dev/null +++ b/flatten_list.py @@ -0,0 +1,27 @@ +# Python Flatten Nested Lists +# (c) Joe James 2023 + +# list comprehension method +def flatten1 (myList): + return [i for j in myList for i in j] + +# recursive method +def flatten2 (myList): + flatList = [] + for item in myList: + if isinstance(item, list): + flatList.extend(flatten2(item)) + else: + flatList.append(item) + return flatList + +list1 = [[0], [1, 2], [3, [4, 5]], [6], [7]] +list2 = [0, [1, 2], [3, [4, 5]], [6], 7] + +print("flatten1(list1): ", flatten1(list1)) # works, but only flattens 1 layer of sublists +# print(flatten1(list2)) # error - can't work with list of ints and sublists of ints + +print("flatten2(list1): ", flatten2(list1)) +print("flatten2(list2): ", flatten2(list2)) + + From 57dd4054fa11b8188cb414453e12541fd7b0adf8 Mon Sep 17 00:00:00 2001 From: Joe James Date: Tue, 9 May 2023 11:04:27 -0700 Subject: [PATCH 75/77] Add files via upload --- dict_comprehensions.py | 54 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 dict_comprehensions.py diff --git a/dict_comprehensions.py b/dict_comprehensions.py new file mode 100644 index 00000000..890c7221 --- /dev/null +++ b/dict_comprehensions.py @@ -0,0 +1,54 @@ +# Python Dictionary Comprehensions +# (c) Joe James 2023 + +# 1. math function to compute values using list +dict1 = {x: 2*x for x in [0, 2, 4, 6]} +print ('1. ', dict1) + +# 2. math function to compute values using range +dict2 = {x: x**2 for x in range(0, 7, 2)} +print ('2. ', dict2) + +# 3. from chars in a string +dict3 = {x: ord(x) for x in 'Kumar'} +print ('3. ', dict3) + +# 4. given lists of keys & values +x = ['Aditii', 'Brandon', 'Clumley', 'Magomed', 'Rishi'] +y = [1, 2, 3, 13, 18] +dict4 = {i: j for (i,j) in zip(x,y)} +print ('4. ', dict4) + +# 5. from chars in a string +x = "python" +dict5 = {i: 3*i.upper() for i in x} +print('5. ', dict5) + +# 6. list comprehension for the value +x = [2, 4, 6, 8] +y = [5, 10, 15, 20] +dict6 = {i: [i + 2*j for j in y] for i in x} +print('6. ', dict6) + +#7. using items +x = {'A':10, 'B':20, 'C':30} +dict7 = {i: j*2 for (i,j) in x.items()} +print('7. ', dict7) + +# 8. conditional comprehension +dict8 = {i: i**3 for i in range(10) if i%2 == 0} +print('8. ', dict8) + +# 9. if-else conditional comprehension +x = {'A':10, 'B':20, 'C':30} +dict9 = {i: (j if j < 15 else j+100) for (i,j) in x.items()} +print('9. ', dict9) + +# 10. transformation from an existing dict +x = {'A':10, 'B':20, 'C':30} +dict10 = {i: x[i]+1 for i in x} +print('10. ', dict10) + + + + From 4f3e3a8180e9f9f0ce41ef12ea6d716510c4d7c7 Mon Sep 17 00:00:00 2001 From: Joe James Date: Thu, 11 May 2023 12:11:57 -0700 Subject: [PATCH 76/77] Add files via upload --- remove_from_list.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 remove_from_list.py diff --git a/remove_from_list.py b/remove_from_list.py new file mode 100644 index 00000000..9619664f --- /dev/null +++ b/remove_from_list.py @@ -0,0 +1,48 @@ +# Python: del vs pop vs remove from a list +# (c) Joe James 2023 + +def get_dogs(): + return ['Fido', 'Rover', 'Spot', 'Duke', 'Chip', 'Spot'] + +dogs = get_dogs() +print(dogs) + +# Use pop() to remove last item or an item by index and get the returned value. +print('1. pop last item from list:') +myDog = dogs.pop() +print(myDog, dogs) + +dogs = get_dogs() +print('2. pop item with index 1:') +myDog = dogs.pop(1) +print(myDog, dogs) + +# Use remove() to delete an item by value. (raises ValueError if value not found) +dogs = get_dogs() +print('3. remove first Spot from list:') +dogs.remove('Spot') +print(dogs) + +# Use del to remove an item or range of items by index. Or delete entire list. +dogs = get_dogs() +print('4. del item with index 3:') +del(dogs[3]) +print(dogs) + +dogs = get_dogs() +print('5. del items [1:3] from list:') +del(dogs[1:3]) +print(dogs) + +dogs = get_dogs() +print('6. del entire list:') +del(dogs) +print(dogs) + + + + + + + + From fa2904f71169871485b5fec8f0be0441a8b23f1a Mon Sep 17 00:00:00 2001 From: Joe James Date: Mon, 15 May 2023 11:07:11 -0700 Subject: [PATCH 77/77] Add files via upload --- deep_copy.ipynb | 248 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 deep_copy.ipynb diff --git a/deep_copy.ipynb b/deep_copy.ipynb new file mode 100644 index 00000000..a11d7052 --- /dev/null +++ b/deep_copy.ipynb @@ -0,0 +1,248 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Python: how to Copy and Deep Copy Python Lists \n", + "(c) Joe James 2023" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Assignment is not a Copy\n", + "listA = listB does not create a copy. Changes to one list will be reflected in the other.\n", + "listA and listB both reference the exact same list." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 44, 6, [1, 3]]\n", + "140554034568968\n", + "140554034568968\n" + ] + } + ], + "source": [ + "listA = [2, 4, 6, [1, 3]]\n", + "listB = listA\n", + "listB[1] = 44\n", + "print(listA)\n", + "print(id(listA))\n", + "print(id(listB))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Shallow copy using the list() constructor\n", + "Shallow copy only works for 1D lists of native data types. \n", + "Sublists, dicts, and other objects will retain the same referece to those objects." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6, [55, 3]]\n" + ] + } + ], + "source": [ + "listA = [2, 4, 6, [1, 3]]\n", + "listB = list(listA)\n", + "listB[1] = 44\n", + "listB[3][0] = 55\n", + "print(listA)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Other ways to make a Shallow copy\n", + "List comprehensions, list.copy(), or copy.copy() can also be used to make *shallow* copies" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6, [55, 3]]\n" + ] + } + ], + "source": [ + "listA = [2, 4, 6, [1, 3]]\n", + "listB = [x for x in listA]\n", + "listB[1] = 44\n", + "listB[3][0] = 55\n", + "print(listA)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6, [55, 3]]\n" + ] + } + ], + "source": [ + "listA = [2, 4, 6, [1, 3]]\n", + "listB = listA.copy()\n", + "listB[1] = 44\n", + "listB[3][0] = 55\n", + "print(listA)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6, [55, 3]]\n" + ] + } + ], + "source": [ + "import copy\n", + "listA = [2, 4, 6, [1, 3]]\n", + "listB = copy.copy(listA)\n", + "listB[1] = 44\n", + "listB[3][0] = 55\n", + "print(listA)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### How to Deep Copy a Python List\n", + "use copy.deepcopy()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2, 4, 6, [1, 3]]\n" + ] + } + ], + "source": [ + "import copy\n", + "listA = [2, 4, 6, [1, 3]]\n", + "listB = copy.deepcopy(listA)\n", + "listB[1] = 44\n", + "listB[3][0] = 55\n", + "print(listA)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Deepcopy with Objects" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "140554035637216 140554035637104\n", + "140554035637216 140554035637216\n", + "140554035637216 140554035637048\n" + ] + } + ], + "source": [ + "class Pony():\n", + " def __init__(self, n):\n", + " self.name = n\n", + " \n", + "# copy.copy on an object gives you 2 unique objects (with same attributes)\n", + "pony1 = Pony('Pinto')\n", + "pony2 = copy.copy(pony1)\n", + "print(id(pony1), id(pony2))\n", + "\n", + "# copy.copy on a list of objects gives you 2 unique lists containing the exact same objects \n", + "# (ie. new list is a shallow copy)\n", + "m = [pony1, pony2]\n", + "n = copy.copy (m)\n", + "print(id(m[0]), id(n[0]))\n", + "\n", + "# use copy.deepcopy to deep copy a list of objects\n", + "n = copy.deepcopy (m)\n", + "print(id(m[0]), id(n[0]))" + ] + }, + { + "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.7.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}