From e07d4907125664dafe5f2cf41f8d50dfb60fdcc5 Mon Sep 17 00:00:00 2001
From: Yash Kumar Saini <115717039+yashksaini-coder@users.noreply.github.com>
Date: Sun, 3 Nov 2024 13:26:37 +0000
Subject: [PATCH 1/2] Add Python resources for Data Engineering
---
.../Data/apple_products.csv | 63 +
.../iPhone Data Analysis Mini Project.ipynb | 1478 +
.../2. Python Basics/Python Basics.ipynb | 3219 +
.../2. Python Basics/Untitled.ipynb | 6 +
.../2. Python Basics/images/21_cent.jpg | Bin 0 -> 84357 bytes
.../2. Python Basics/images/data_struc.png | Bin 0 -> 93737 bytes
.../2. Python Basics/images/datatypes.png | Bin 0 -> 389158 bytes
.../images/dictionaries-in-python.jpeg | Bin 0 -> 29290 bytes
.../2. Python Basics/images/exception.png | Bin 0 -> 90376 bytes
.../2. Python Basics/images/forloop.jpeg | Bin 0 -> 28573 bytes
.../2. Python Basics/images/indexing.png | Bin 0 -> 11951 bytes
.../2. Python Basics/images/ipy.png | Bin 0 -> 109729 bytes
.../2. Python Basics/images/numbers.png | Bin 0 -> 125262 bytes
.../2. Python Basics/images/org_data.png | Bin 0 -> 46657 bytes
.../2. Python Basics/images/py.png | Bin 0 -> 7821 bytes
.../images/python-if-else.png | Bin 0 -> 20204 bytes
.../2. Python Basics/images/python-list.jpeg | Bin 0 -> 27578 bytes
.../2. Python Basics/images/python-logo.png | Bin 0 -> 83564 bytes
.../2. Python Basics/images/python_1.jpg | Bin 0 -> 37934 bytes
.../2. Python Basics/images/python_string.png | Bin 0 -> 2718 bytes
.../2. Python Basics/images/sets2.png | Bin 0 -> 83503 bytes
.../images/string-slicing-in-python.png | Bin 0 -> 69963 bytes
.../2. Python Basics/images/string_concat.png | Bin 0 -> 50143 bytes
.../images/try_except_else_finally.webp | Bin 0 -> 16872 bytes
.../2. Python Basics/images/variable.png | Bin 0 -> 59722 bytes
.../2. Python Basics/images/vd.png | Bin 0 -> 76684 bytes
.../2. Python Basics/images/whileloop.png | Bin 0 -> 33738 bytes
.../2. Python Basics/myfile.txt | 3 +
.../Intermediate - Functions and OOPS.ipynb | 1369 +
.../3. Python Intermediate/images/py_func.png | Bin 0 -> 14825 bytes
.../4. Python Advance/Numpy Basics.ipynb | 603 +
.../4. Python Advance/Pandas Basics.ipynb | 6700 +
.../4. Python Advance/data/weather_2012.csv | 8785 +
.../4. Python Advance/images/cute_pandas.jpg | Bin 0 -> 8428 bytes
.../4. Python Advance/images/filters1.jpg | Bin 0 -> 108455 bytes
.../4. Python Advance/images/numpy-logo.jpg | Bin 0 -> 8785 bytes
.../4. Python Advance/images/numpy-types1.jpg | Bin 0 -> 86431 bytes
.../images/pandas-datastructures.jpg | Bin 0 -> 199607 bytes
.../images/pandas-features.jpg | Bin 0 -> 72868 bytes
.../4. Python Advance/images/pandas.png | Bin 0 -> 21842 bytes
.../4. Python Advance/images/python_day3.png | Bin 0 -> 30744 bytes
.../4. Python Advance/images/weather.jpg | Bin 0 -> 24690 bytes
.../4. Python Advance/images/why-pandas.jpg | Bin 0 -> 75620 bytes
.../5.1 Working with date & time.ipynb | 2933 +
.../5.2 Working with file formats.ipynb | 1333 +
.../data/city_sales.csv | 376434 +++++++++++++++
.../data/hrdata.csv | 7 +
.../data/sample-xlsx-file-modifeid.xlsx | Bin 0 -> 5245 bytes
.../data/sample-xlsx-file.xlsx | Bin 0 -> 5295 bytes
.../data/users_test.avro | Bin 0 -> 250 bytes
.../data_file.json | 1 +
.../hello_world.xlsx | Bin 0 -> 4813 bytes
.../images/data_gen.jpeg | Bin 0 -> 31237 bytes
.../images/datetimememe.webp | Bin 0 -> 69362 bytes
.../images/excel.png | Bin 0 -> 146916 bytes
.../5. Python for Data Engineering/users.avro | Bin 0 -> 254 bytes
.../Spotify Data Pipeline Project.ipynb | 22813 +
.../spotify_api_data_extract.py | 30 +
.../spotify_transformation_load_function.py | 107 +
.../spotipy_layer.zip | Bin 0 -> 1602569 bytes
Tutorials/Python_Data_Engineering/README.md | 43 +
61 files changed, 425927 insertions(+)
create mode 100644 Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/Data/apple_products.csv
create mode 100644 Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/iPhone Data Analysis Mini Project.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/Python Basics.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/Untitled.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/21_cent.jpg
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/data_struc.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/datatypes.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/dictionaries-in-python.jpeg
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/exception.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/forloop.jpeg
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/indexing.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/ipy.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/numbers.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/org_data.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/py.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/python-if-else.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/python-list.jpeg
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/python-logo.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/python_1.jpg
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/python_string.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/sets2.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/string-slicing-in-python.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/string_concat.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/try_except_else_finally.webp
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/variable.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/vd.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/images/whileloop.png
create mode 100644 Tutorials/Python_Data_Engineering/2. Python Basics/myfile.txt
create mode 100644 Tutorials/Python_Data_Engineering/3. Python Intermediate/Intermediate - Functions and OOPS.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/3. Python Intermediate/images/py_func.png
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/Numpy Basics.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/Pandas Basics.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/data/weather_2012.csv
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/cute_pandas.jpg
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/filters1.jpg
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/numpy-logo.jpg
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/numpy-types1.jpg
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/pandas-datastructures.jpg
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/pandas-features.jpg
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/pandas.png
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/python_day3.png
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/weather.jpg
create mode 100644 Tutorials/Python_Data_Engineering/4. Python Advance/images/why-pandas.jpg
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/5.1 Working with date & time.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/5.2 Working with file formats.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/data/city_sales.csv
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/data/hrdata.csv
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/data/sample-xlsx-file-modifeid.xlsx
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/data/sample-xlsx-file.xlsx
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/data/users_test.avro
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/data_file.json
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/hello_world.xlsx
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/images/data_gen.jpeg
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/images/datetimememe.webp
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/images/excel.png
create mode 100644 Tutorials/Python_Data_Engineering/5. Python for Data Engineering/users.avro
create mode 100644 Tutorials/Python_Data_Engineering/6. End-To-End Data Pipeline Project/Spotify Data Pipeline Project.ipynb
create mode 100644 Tutorials/Python_Data_Engineering/6. End-To-End Data Pipeline Project/spotify_api_data_extract.py
create mode 100644 Tutorials/Python_Data_Engineering/6. End-To-End Data Pipeline Project/spotify_transformation_load_function.py
create mode 100644 Tutorials/Python_Data_Engineering/6. End-To-End Data Pipeline Project/spotipy_layer.zip
create mode 100644 Tutorials/Python_Data_Engineering/README.md
diff --git a/Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/Data/apple_products.csv b/Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/Data/apple_products.csv
new file mode 100644
index 0000000000..685ddf362f
--- /dev/null
+++ b/Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/Data/apple_products.csv
@@ -0,0 +1,63 @@
+Product Name,Product URL,Brand,Sale Price,Mrp,Discount Percentage,Number Of Ratings,Number Of Reviews,Upc,Star Rating,Ram
+"APPLE iPhone 8 Plus (Gold, 64 GB)",https://www.flipkart.com/apple-iphone-8-plus-gold-64-gb/p/itmexrgvuzgzttzh?pid=MOBEXRGV7EHHTGUH,Apple,49900,49900,0,3431,356,MOBEXRGV7EHHTGUH,4.6,2 GB
+"APPLE iPhone 8 Plus (Space Grey, 256 GB)",https://www.flipkart.com/apple-iphone-8-plus-space-grey-256-gb/p/itmexrgvzkbyqgtf?pid=MOBEXRGVAC6TJT4F,Apple,84900,84900,0,3431,356,MOBEXRGVAC6TJT4F,4.6,2 GB
+"APPLE iPhone 8 Plus (Silver, 256 GB)",https://www.flipkart.com/apple-iphone-8-plus-silver-256-gb/p/itmexrgvxatuyrqw?pid=MOBEXRGVGETABXWZ,Apple,84900,84900,0,3431,356,MOBEXRGVGETABXWZ,4.6,2 GB
+"APPLE iPhone 8 (Silver, 256 GB)",https://www.flipkart.com/apple-iphone-8-silver-256-gb/p/itmexrgvae48gzhp?pid=MOBEXRGVMZWUHCBA,Apple,77000,77000,0,11202,794,MOBEXRGVMZWUHCBA,4.5,2 GB
+"APPLE iPhone 8 (Gold, 256 GB)",https://www.flipkart.com/apple-iphone-8-gold-256-gb/p/itmexrgv8bvfbzgw?pid=MOBEXRGVPK7PFEJZ,Apple,77000,77000,0,11202,794,MOBEXRGVPK7PFEJZ,4.5,2 GB
+"APPLE iPhone 8 Plus (Silver, 64 GB)",https://www.flipkart.com/apple-iphone-8-plus-silver-64-gb/p/itmexrgv7yfjbryy?pid=MOBEXRGVQGYYP8FV,Apple,49900,49900,0,3431,356,MOBEXRGVQGYYP8FV,4.6,2 GB
+"APPLE iPhone 8 Plus (Space Grey, 64 GB)",https://www.flipkart.com/apple-iphone-8-plus-space-grey-64-gb/p/itmexrgvehtzhh9v?pid=MOBEXRGVQKBREZP8,Apple,49900,49900,0,3431,356,MOBEXRGVQKBREZP8,4.6,2 GB
+"APPLE iPhone 8 (Space Grey, 256 GB)",https://www.flipkart.com/apple-iphone-8-space-grey-256-gb/p/itmexrgvypzqw6df?pid=MOBEXRGVZFZGZEWV,Apple,77000,77000,0,11202,794,MOBEXRGVZFZGZEWV,4.5,2 GB
+"APPLE iPhone XS Max (Silver, 64 GB)",https://www.flipkart.com/apple-iphone-xs-max-silver-64-gb/p/itmf944ehzsh7emx?pid=MOBF944E2XAHW8V5,Apple,89900,89900,0,1454,149,MOBF944E2XAHW8V5,4.6,4 GB
+"Apple iPhone XR ((PRODUCT)RED, 128 GB) (Includes EarPods, Power Adapter)",https://www.flipkart.com/apple-iphone-xr-product-red-128-gb-includes-earpods-power-adapter/p/itmf9z7zbkvjzegf?pid=MOBF9Z7ZHQC23PWQ,Apple,41999,52900,20,79512,6796,MOBF9Z7ZHQC23PWQ,4.6,4 GB
+"Apple iPhone XR (Black, 64 GB) (Includes EarPods, Power Adapter)",https://www.flipkart.com/apple-iphone-xr-black-64-gb-includes-earpods-power-adapter/p/itmf9z7zxu4uqyz2?pid=MOBF9Z7ZPHGV4GNH,Apple,39999,47900,16,79512,6796,MOBF9Z7ZPHGV4GNH,4.6,4 GB
+"Apple iPhone XR (Coral, 128 GB) (Includes EarPods, Power Adapter)",https://www.flipkart.com/apple-iphone-xr-coral-128-gb-includes-earpods-power-adapter/p/itmf9z7zgxx5wgez?pid=MOBF9Z7ZS6GF5UAP,Apple,41999,52900,20,79582,6804,MOBF9Z7ZS6GF5UAP,4.6,4 GB
+"Apple iPhone XR (Black, 128 GB) (Includes EarPods, Power Adapter)",https://www.flipkart.com/apple-iphone-xr-black-128-gb-includes-earpods-power-adapter/p/itmf9z7zhdgzwmzm?pid=MOBF9Z7ZYWNFGZUC,Apple,41999,52900,20,79512,6796,MOBF9Z7ZYWNFGZUC,4.6,3 GB
+"Apple iPhone XR (White, 128 GB) (Includes EarPods, Power Adapter)",https://www.flipkart.com/apple-iphone-xr-white-128-gb-includes-earpods-power-adapter/p/itmf9z7zrz4tbhwm?pid=MOBF9Z7ZZY3HCDZZ,Apple,41999,52900,20,79512,6796,MOBF9Z7ZZY3HCDZZ,4.6,4 GB
+"APPLE iPhone 11 Pro Max (Gold, 256 GB)",https://www.flipkart.com/apple-iphone-11-pro-max-gold-256-gb/p/itm94c6536eefc46?pid=MOBFKCTS7HCHSPFH,Apple,131900,131900,0,1078,101,MOBFKCTS7HCHSPFH,4.7,4 GB
+"APPLE iPhone 11 Pro Max (Gold, 64 GB)",https://www.flipkart.com/apple-iphone-11-pro-max-gold-64-gb/p/itm6ef18218efdf6?pid=MOBFKCTSAPAYNSGG,Apple,117100,117100,0,1078,101,MOBFKCTSAPAYNSGG,4.7,4 GB
+"APPLE iPhone 11 Pro Max (Midnight Green, 256 GB)",https://www.flipkart.com/apple-iphone-11-pro-max-midnight-green-256-gb/p/itm68e0db18f9ecc?pid=MOBFKCTSCAAKGQV7,Apple,131900,131900,0,1078,101,MOBFKCTSCAAKGQV7,4.7,4 GB
+"APPLE iPhone 11 Pro Max (Space Grey, 64 GB)",https://www.flipkart.com/apple-iphone-11-pro-max-space-grey-64-gb/p/itme0101031155f8?pid=MOBFKCTSKDMKCGQS,Apple,117100,117100,0,1078,101,MOBFKCTSKDMKCGQS,4.7,4 GB
+"APPLE iPhone 11 Pro (Midnight Green, 64 GB)",https://www.flipkart.com/apple-iphone-11-pro-midnight-green-64-gb/p/itm471de0d2e8474?pid=MOBFKCTSN3TG3RFJ,Apple,74999,106600,29,7088,523,MOBFKCTSN3TG3RFJ,4.6,4 GB
+"APPLE iPhone 11 Pro (Space Grey, 512 GB)",https://www.flipkart.com/apple-iphone-11-pro-space-grey-512-gb/p/itmcd1f0ddbf1c21?pid=MOBFKCTSRTHRQTFT,Apple,117900,140300,15,7088,523,MOBFKCTSRTHRQTFT,4.6,4 GB
+"APPLE iPhone 11 Pro Max (Midnight Green, 64 GB)",https://www.flipkart.com/apple-iphone-11-pro-max-midnight-green-64-gb/p/itmab1763b5ca244?pid=MOBFKCTSRYPAQNYT,Apple,117100,117100,0,1078,101,MOBFKCTSRYPAQNYT,4.7,4 GB
+"APPLE iPhone 11 Pro (Midnight Green, 512 GB)",https://www.flipkart.com/apple-iphone-11-pro-midnight-green-512-gb/p/itm0bdd954387ca9?pid=MOBFKCTSSJCWYGCC,Apple,117900,140300,15,7088,523,MOBFKCTSSJCWYGCC,4.6,4 GB
+"APPLE iPhone 11 Pro (Space Grey, 256 GB)",https://www.flipkart.com/apple-iphone-11-pro-space-grey-256-gb/p/itmbecef22a95790?pid=MOBFKCTSWGYSAS9X,Apple,99900,121300,17,7081,522,MOBFKCTSWGYSAS9X,4.6,4 GB
+"Apple iPhone SE (White, 256 GB) (Includes EarPods, Power Adapter)",https://www.flipkart.com/apple-iphone-se-white-256-gb-includes-earpods-power-adapter/p/itm4d73793c30c4c?pid=MOBFRFXHPZCHAPEH,Apple,44999,54900,18,95909,8161,MOBFRFXHPZCHAPEH,4.5,2 GB
+"APPLE iPhone 12 Pro (Silver, 512 GB)",https://www.flipkart.com/apple-iphone-12-pro-silver-512-gb/p/itm0ccf9fc219a71?pid=MOBFWBYZ5UY6ZBVA,Apple,140900,149900,6,542,42,MOBFWBYZ5UY6ZBVA,4.5,4 GB
+"APPLE iPhone 12 Pro Max (Pacific Blue, 256 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-pacific-blue-256-gb/p/itm3a0860c94250e?pid=MOBFWBYZ8STJXCVT,Apple,130900,139900,6,580,45,MOBFWBYZ8STJXCVT,4.6,6 GB
+"APPLE iPhone 12 Mini (White, 128 GB)",https://www.flipkart.com/apple-iphone-12-mini-white-128-gb/p/itm9098fa76548ba?pid=MOBFWBYZAGXJRDGB,Apple,64900,74900,13,740,64,MOBFWBYZAGXJRDGB,4.5,4 GB
+"APPLE iPhone 12 Pro (Graphite, 256 GB)",https://www.flipkart.com/apple-iphone-12-pro-graphite-256-gb/p/itm4fa4da575698c?pid=MOBFWBYZBA36UB7G,Apple,120900,129900,6,545,42,MOBFWBYZBA36UB7G,4.5,6 GB
+"APPLE iPhone 12 Mini (White, 64 GB)",https://www.flipkart.com/apple-iphone-12-mini-white-64-gb/p/itmf3b16d1640898?pid=MOBFWBYZBH4CEC4C,Apple,59900,69900,14,740,64,MOBFWBYZBH4CEC4C,4.5,4 GB
+"APPLE iPhone 12 (White, 128 GB)",https://www.flipkart.com/apple-iphone-12-white-128-gb/p/itm95393f4c6cc59?pid=MOBFWBYZBTZFGJF9,Apple,75900,84900,10,2101,180,MOBFWBYZBTZFGJF9,4.6,6 GB
+"APPLE iPhone 12 Pro (Graphite, 128 GB)",https://www.flipkart.com/apple-iphone-12-pro-graphite-128-gb/p/itm03e5f2595d843?pid=MOBFWBYZBZ7Y56WD,Apple,110900,119900,7,545,42,MOBFWBYZBZ7Y56WD,4.5,6 GB
+"APPLE iPhone 12 Pro Max (Graphite, 256 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-graphite-256-gb/p/itm8dbdf0b986725?pid=MOBFWBYZEF6XQ5ZW,Apple,130900,139900,6,580,45,MOBFWBYZEF6XQ5ZW,4.6,6 GB
+"APPLE iPhone 12 Pro Max (Graphite, 128 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-graphite-128-gb/p/itm973c298184f51?pid=MOBFWBYZFDGQSDWS,Apple,120900,129900,6,580,45,MOBFWBYZFDGQSDWS,4.6,6 GB
+"APPLE iPhone 12 Mini (Black, 128 GB)",https://www.flipkart.com/apple-iphone-12-mini-black-128-gb/p/itm0eb512c195bdf?pid=MOBFWBYZH2AMPNPD,Apple,64900,74900,13,730,63,MOBFWBYZH2AMPNPD,4.5,4 GB
+"APPLE iPhone 12 Mini (Blue, 128 GB)",https://www.flipkart.com/apple-iphone-12-mini-blue-128-gb/p/itm9b6cdec9700ee?pid=MOBFWBYZHU58PHCZ,Apple,64900,74900,13,730,63,MOBFWBYZHU58PHCZ,4.5,4 GB
+"APPLE iPhone 12 (Black, 128 GB)",https://www.flipkart.com/apple-iphone-12-black-128-gb/p/itmf1f0a58f1ecd7?pid=MOBFWBYZK3HACR72,Apple,75900,84900,10,2101,180,MOBFWBYZK3HACR72,4.6,6 GB
+"APPLE iPhone 12 (Blue, 128 GB)",https://www.flipkart.com/apple-iphone-12-blue-128-gb/p/itm02853ae92e90a?pid=MOBFWBYZKPTZF9VG,Apple,75900,84900,10,2101,180,MOBFWBYZKPTZF9VG,4.6,6 GB
+"APPLE iPhone 12 Pro Max (Silver, 128 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-silver-128-gb/p/itm5a51ba742a17e?pid=MOBFWBYZNSNVGGZC,Apple,120900,129900,6,580,45,MOBFWBYZNSNVGGZC,4.6,6 GB
+"APPLE iPhone 12 Mini (Red, 64 GB)",https://www.flipkart.com/apple-iphone-12-mini-red-64-gb/p/itm255dd64643767?pid=MOBFWBYZNVWGWN2U,Apple,59900,69900,14,740,64,MOBFWBYZNVWGWN2U,4.5,6 GB
+"APPLE iPhone 12 Pro Max (Gold, 128 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-gold-128-gb/p/itme3ae592065711?pid=MOBFWBYZQVKT77YH,Apple,120900,129900,6,580,45,MOBFWBYZQVKT77YH,4.6,6 GB
+"APPLE iPhone 12 (Green, 128 GB)",https://www.flipkart.com/apple-iphone-12-green-128-gb/p/itm4e0a120f7d9c4?pid=MOBFWBYZQXUEHF48,Apple,75900,84900,10,2092,178,MOBFWBYZQXUEHF48,4.6,6 GB
+"APPLE iPhone 12 Pro (Pacific Blue, 512 GB)",https://www.flipkart.com/apple-iphone-12-pro-pacific-blue-512-gb/p/itm8a39d6779b04e?pid=MOBFWBYZTHSXKMGW,Apple,140900,149900,6,545,42,MOBFWBYZTHSXKMGW,4.5,4 GB
+"APPLE iPhone 12 (White, 64 GB)",https://www.flipkart.com/apple-iphone-12-white-64-gb/p/itm8b88bdc03cd79?pid=MOBFWBYZTK33MBG9,Apple,70900,79900,11,2101,180,MOBFWBYZTK33MBG9,4.6,6 GB
+"APPLE iPhone 12 (Black, 64 GB)",https://www.flipkart.com/apple-iphone-12-black-64-gb/p/itma2559422bf7c7?pid=MOBFWBYZU5FWK2VP,Apple,70900,79900,11,2092,178,MOBFWBYZU5FWK2VP,4.6,6 GB
+"APPLE iPhone 12 (Red, 128 GB)",https://www.flipkart.com/apple-iphone-12-red-128-gb/p/itma7bd86885ed98?pid=MOBFWBYZUHPFWQRD,Apple,75900,84900,10,2101,180,MOBFWBYZUHPFWQRD,4.6,6 GB
+"APPLE iPhone 12 Mini (Black, 64 GB)",https://www.flipkart.com/apple-iphone-12-mini-black-64-gb/p/itm38b727191eb08?pid=MOBFWBYZXSEGBS6F,Apple,59900,69900,14,740,64,MOBFWBYZXSEGBS6F,4.5,4 GB
+"APPLE iPhone 12 Pro (Pacific Blue, 128 GB)",https://www.flipkart.com/apple-iphone-12-pro-pacific-blue-128-gb/p/itm97c833296c221?pid=MOBFWBYZXYSCEEEH,Apple,110900,119900,7,545,42,MOBFWBYZXYSCEEEH,4.5,6 GB
+"APPLE iPhone 12 Pro Max (Pacific Blue, 128 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-pacific-blue-128-gb/p/itmd89812b558a03?pid=MOBFWBYZZABKHZQA,Apple,120900,129900,6,580,45,MOBFWBYZZABKHZQA,4.6,6 GB
+"APPLE iPhone 12 Pro Max (Silver, 256 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-silver-256-gb/p/itm30faf74442adb?pid=MOBFWBYZZH4AM8FE,Apple,130900,139900,6,580,45,MOBFWBYZZH4AM8FE,4.6,6 GB
+"APPLE iPhone 12 Pro Max (Gold, 256 GB)",https://www.flipkart.com/apple-iphone-12-pro-max-gold-256-gb/p/itm1e0354f5bbc8c?pid=MOBFWBYZZPW8JHQF,Apple,130900,139900,6,580,45,MOBFWBYZZPW8JHQF,4.6,6 GB
+"APPLE iPhone 11 (White, 128 GB)",https://www.flipkart.com/apple-iphone-11-white-128-gb/p/itme32df47ea6742?pid=MOBFWQ6B7KKRXDDS,Apple,54999,59900,8,43707,3357,MOBFWQ6B7KKRXDDS,4.6,4 GB
+"APPLE iPhone 11 (Red, 128 GB)",https://www.flipkart.com/apple-iphone-11-red-128-gb/p/itm8d14bd0e33a1c?pid=MOBFWQ6BEZTNK59G,Apple,54999,59900,8,43707,3357,MOBFWQ6BEZTNK59G,4.6,4 GB
+"APPLE iPhone SE (White, 64 GB)",https://www.flipkart.com/apple-iphone-se-white-64-gb/p/itma00a19e11c81b?pid=MOBFWQ6BGWDVGF3E,Apple,29999,39900,24,95807,8154,MOBFWQ6BGWDVGF3E,4.5,2 GB
+"APPLE iPhone SE (Black, 128 GB)",https://www.flipkart.com/apple-iphone-se-black-128-gb/p/itma9285ccc6af28?pid=MOBFWQ6BHUEVZPXD,Apple,34999,44900,22,95909,8161,MOBFWQ6BHUEVZPXD,4.5,2 GB
+"APPLE iPhone SE (White, 128 GB)",https://www.flipkart.com/apple-iphone-se-white-128-gb/p/itmc2a0f593a4ad8?pid=MOBFWQ6BJEHMUUZY,Apple,34999,44900,22,95807,8154,MOBFWQ6BJEHMUUZY,4.5,2 GB
+"APPLE iPhone SE (Red, 128 GB)",https://www.flipkart.com/apple-iphone-se-red-128-gb/p/itma4202509da171?pid=MOBFWQ6BJTVFKPEJ,Apple,34999,44900,22,95909,8161,MOBFWQ6BJTVFKPEJ,4.5,2 GB
+"APPLE iPhone 11 (Black, 128 GB)",https://www.flipkart.com/apple-iphone-11-black-128-gb/p/itm8244e8d955aba?pid=MOBFWQ6BKRYBP5X8,Apple,54999,59900,8,43470,3331,MOBFWQ6BKRYBP5X8,4.6,4 GB
+"APPLE iPhone SE (Black, 64 GB)",https://www.flipkart.com/apple-iphone-se-black-64-gb/p/itm4d3d5718a5c95?pid=MOBFWQ6BR3MK7AUG,Apple,29999,39900,24,95909,8161,MOBFWQ6BR3MK7AUG,4.5,4 GB
+"APPLE iPhone 11 (Purple, 64 GB)",https://www.flipkart.com/apple-iphone-11-purple-64-gb/p/itm2b8d03427ddac?pid=MOBFWQ6BTFFJKGKE,Apple,46999,54900,14,43470,3331,MOBFWQ6BTFFJKGKE,4.6,4 GB
+"APPLE iPhone 11 (White, 64 GB)",https://www.flipkart.com/apple-iphone-11-white-64-gb/p/itmfc6a7091eb20b?pid=MOBFWQ6BVWVEH3XE,Apple,46999,54900,14,43470,3331,MOBFWQ6BVWVEH3XE,4.6,4 GB
+"APPLE iPhone 11 (Black, 64 GB)",https://www.flipkart.com/apple-iphone-11-black-64-gb/p/itm4e5041ba101fd?pid=MOBFWQ6BXGJCEYNY,Apple,46999,54900,14,43470,3331,MOBFWQ6BXGJCEYNY,4.6,4 GB
+"APPLE iPhone 11 (Red, 64 GB)",https://www.flipkart.com/apple-iphone-11-red-64-gb/p/itmc3935326f2feb?pid=MOBFWQ6BYYV3FCU7,Apple,46999,54900,14,43470,3331,MOBFWQ6BYYV3FCU7,4.6,4 GB
diff --git a/Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/iPhone Data Analysis Mini Project.ipynb b/Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/iPhone Data Analysis Mini Project.ipynb
new file mode 100644
index 0000000000..cbba8aae6d
--- /dev/null
+++ b/Tutorials/Python_Data_Engineering/1. iPhone Data Analysis Project/iPhone Data Analysis Mini Project.ipynb
@@ -0,0 +1,1478 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "id": "661aa3de",
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: pandas in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (1.3.4)\n",
+ "Requirement already satisfied: pytz>=2017.3 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from pandas) (2022.1)\n",
+ "Requirement already satisfied: numpy>=1.21.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from pandas) (1.21.3)\n",
+ "Requirement already satisfied: python-dateutil>=2.7.3 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from pandas) (2.8.2)\n",
+ "Requirement already satisfied: six>=1.5 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from python-dateutil>=2.7.3->pandas) (1.16.0)\n",
+ "\u001b[33mWARNING: You are using pip version 21.3.1; however, version 22.3.1 is available.\n",
+ "You should consider upgrading via the '/Library/Frameworks/Python.framework/Versions/3.10/bin/python3 -m pip install --upgrade pip' command.\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install pandas"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "id": "819c125b",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "id": "0eaad857",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df = pd.read_csv(\"Data/apple_products.csv\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "id": "a1f12d57",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Product Name | \n",
+ " Product URL | \n",
+ " Brand | \n",
+ " Sale Price | \n",
+ " Mrp | \n",
+ " Discount Percentage | \n",
+ " Number Of Ratings | \n",
+ " Number Of Reviews | \n",
+ " Upc | \n",
+ " Star Rating | \n",
+ " Ram | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " APPLE iPhone 8 Plus (Gold, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-plus-g... | \n",
+ " Apple | \n",
+ " 49900 | \n",
+ " 49900 | \n",
+ " 0 | \n",
+ " 3431 | \n",
+ " 356 | \n",
+ " MOBEXRGV7EHHTGUH | \n",
+ " 4.6 | \n",
+ " 2 GB | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " APPLE iPhone 8 Plus (Space Grey, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-plus-s... | \n",
+ " Apple | \n",
+ " 84900 | \n",
+ " 84900 | \n",
+ " 0 | \n",
+ " 3431 | \n",
+ " 356 | \n",
+ " MOBEXRGVAC6TJT4F | \n",
+ " 4.6 | \n",
+ " 2 GB | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " APPLE iPhone 8 Plus (Silver, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-plus-s... | \n",
+ " Apple | \n",
+ " 84900 | \n",
+ " 84900 | \n",
+ " 0 | \n",
+ " 3431 | \n",
+ " 356 | \n",
+ " MOBEXRGVGETABXWZ | \n",
+ " 4.6 | \n",
+ " 2 GB | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " APPLE iPhone 8 (Silver, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-silver... | \n",
+ " Apple | \n",
+ " 77000 | \n",
+ " 77000 | \n",
+ " 0 | \n",
+ " 11202 | \n",
+ " 794 | \n",
+ " MOBEXRGVMZWUHCBA | \n",
+ " 4.5 | \n",
+ " 2 GB | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " APPLE iPhone 8 (Gold, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-gold-2... | \n",
+ " Apple | \n",
+ " 77000 | \n",
+ " 77000 | \n",
+ " 0 | \n",
+ " 11202 | \n",
+ " 794 | \n",
+ " MOBEXRGVPK7PFEJZ | \n",
+ " 4.5 | \n",
+ " 2 GB | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Product Name \\\n",
+ "0 APPLE iPhone 8 Plus (Gold, 64 GB) \n",
+ "1 APPLE iPhone 8 Plus (Space Grey, 256 GB) \n",
+ "2 APPLE iPhone 8 Plus (Silver, 256 GB) \n",
+ "3 APPLE iPhone 8 (Silver, 256 GB) \n",
+ "4 APPLE iPhone 8 (Gold, 256 GB) \n",
+ "\n",
+ " Product URL Brand Sale Price \\\n",
+ "0 https://www.flipkart.com/apple-iphone-8-plus-g... Apple 49900 \n",
+ "1 https://www.flipkart.com/apple-iphone-8-plus-s... Apple 84900 \n",
+ "2 https://www.flipkart.com/apple-iphone-8-plus-s... Apple 84900 \n",
+ "3 https://www.flipkart.com/apple-iphone-8-silver... Apple 77000 \n",
+ "4 https://www.flipkart.com/apple-iphone-8-gold-2... Apple 77000 \n",
+ "\n",
+ " Mrp Discount Percentage Number Of Ratings Number Of Reviews \\\n",
+ "0 49900 0 3431 356 \n",
+ "1 84900 0 3431 356 \n",
+ "2 84900 0 3431 356 \n",
+ "3 77000 0 11202 794 \n",
+ "4 77000 0 11202 794 \n",
+ "\n",
+ " Upc Star Rating Ram \n",
+ "0 MOBEXRGV7EHHTGUH 4.6 2 GB \n",
+ "1 MOBEXRGVAC6TJT4F 4.6 2 GB \n",
+ "2 MOBEXRGVGETABXWZ 4.6 2 GB \n",
+ "3 MOBEXRGVMZWUHCBA 4.5 2 GB \n",
+ "4 MOBEXRGVPK7PFEJZ 4.5 2 GB "
+ ]
+ },
+ "execution_count": 4,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "id": "8035b3ee",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Product Name 62\n",
+ "Product URL 62\n",
+ "Brand 62\n",
+ "Sale Price 62\n",
+ "Mrp 62\n",
+ "Discount Percentage 62\n",
+ "Number Of Ratings 62\n",
+ "Number Of Reviews 62\n",
+ "Upc 62\n",
+ "Star Rating 62\n",
+ "Ram 62\n",
+ "dtype: int64"
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.count()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "id": "031f3aab",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "149900"
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df['Mrp'].max()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "id": "f3bdb804",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "39900"
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df['Mrp'].min()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "id": "606a759b",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Product Name | \n",
+ " Product URL | \n",
+ " Brand | \n",
+ " Sale Price | \n",
+ " Mrp | \n",
+ " Discount Percentage | \n",
+ " Number Of Ratings | \n",
+ " Number Of Reviews | \n",
+ " Upc | \n",
+ " Star Rating | \n",
+ " Ram | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 24 | \n",
+ " APPLE iPhone 12 Pro (Silver, 512 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-s... | \n",
+ " Apple | \n",
+ " 140900 | \n",
+ " 149900 | \n",
+ " 6 | \n",
+ " 542 | \n",
+ " 42 | \n",
+ " MOBFWBYZ5UY6ZBVA | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " APPLE iPhone 12 Pro (Pacific Blue, 512 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-p... | \n",
+ " Apple | \n",
+ " 140900 | \n",
+ " 149900 | \n",
+ " 6 | \n",
+ " 545 | \n",
+ " 42 | \n",
+ " MOBFWBYZTHSXKMGW | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Product Name \\\n",
+ "24 APPLE iPhone 12 Pro (Silver, 512 GB) \n",
+ "41 APPLE iPhone 12 Pro (Pacific Blue, 512 GB) \n",
+ "\n",
+ " Product URL Brand Sale Price \\\n",
+ "24 https://www.flipkart.com/apple-iphone-12-pro-s... Apple 140900 \n",
+ "41 https://www.flipkart.com/apple-iphone-12-pro-p... Apple 140900 \n",
+ "\n",
+ " Mrp Discount Percentage Number Of Ratings Number Of Reviews \\\n",
+ "24 149900 6 542 42 \n",
+ "41 149900 6 545 42 \n",
+ "\n",
+ " Upc Star Rating Ram \n",
+ "24 MOBFWBYZ5UY6ZBVA 4.5 4 GB \n",
+ "41 MOBFWBYZTHSXKMGW 4.5 4 GB "
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[df['Mrp']==149900]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "id": "7ff9034e",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Product Name | \n",
+ " Product URL | \n",
+ " Brand | \n",
+ " Sale Price | \n",
+ " Mrp | \n",
+ " Discount Percentage | \n",
+ " Number Of Ratings | \n",
+ " Number Of Reviews | \n",
+ " Upc | \n",
+ " Star Rating | \n",
+ " Ram | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 52 | \n",
+ " APPLE iPhone SE (White, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-se-white... | \n",
+ " Apple | \n",
+ " 29999 | \n",
+ " 39900 | \n",
+ " 24 | \n",
+ " 95807 | \n",
+ " 8154 | \n",
+ " MOBFWQ6BGWDVGF3E | \n",
+ " 4.5 | \n",
+ " 2 GB | \n",
+ "
\n",
+ " \n",
+ " 57 | \n",
+ " APPLE iPhone SE (Black, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-se-black... | \n",
+ " Apple | \n",
+ " 29999 | \n",
+ " 39900 | \n",
+ " 24 | \n",
+ " 95909 | \n",
+ " 8161 | \n",
+ " MOBFWQ6BR3MK7AUG | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Product Name \\\n",
+ "52 APPLE iPhone SE (White, 64 GB) \n",
+ "57 APPLE iPhone SE (Black, 64 GB) \n",
+ "\n",
+ " Product URL Brand Sale Price \\\n",
+ "52 https://www.flipkart.com/apple-iphone-se-white... Apple 29999 \n",
+ "57 https://www.flipkart.com/apple-iphone-se-black... Apple 29999 \n",
+ "\n",
+ " Mrp Discount Percentage Number Of Ratings Number Of Reviews \\\n",
+ "52 39900 24 95807 8154 \n",
+ "57 39900 24 95909 8161 \n",
+ "\n",
+ " Upc Star Rating Ram \n",
+ "52 MOBFWQ6BGWDVGF3E 4.5 2 GB \n",
+ "57 MOBFWQ6BR3MK7AUG 4.5 4 GB "
+ ]
+ },
+ "execution_count": 9,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[df['Mrp']==39900]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "id": "fb04614c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Product Name | \n",
+ " Product URL | \n",
+ " Brand | \n",
+ " Sale Price | \n",
+ " Mrp | \n",
+ " Discount Percentage | \n",
+ " Number Of Ratings | \n",
+ " Number Of Reviews | \n",
+ " Upc | \n",
+ " Star Rating | \n",
+ " Ram | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 14 | \n",
+ " APPLE iPhone 11 Pro Max (Gold, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 131900 | \n",
+ " 131900 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTS7HCHSPFH | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " APPLE iPhone 11 Pro Max (Gold, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 117100 | \n",
+ " 117100 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSAPAYNSGG | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " APPLE iPhone 11 Pro Max (Midnight Green, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 131900 | \n",
+ " 131900 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSCAAKGQV7 | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " APPLE iPhone 11 Pro Max (Space Grey, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 117100 | \n",
+ " 117100 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSKDMKCGQS | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " APPLE iPhone 11 Pro (Midnight Green, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 74999 | \n",
+ " 106600 | \n",
+ " 29 | \n",
+ " 7088 | \n",
+ " 523 | \n",
+ " MOBFKCTSN3TG3RFJ | \n",
+ " 4.6 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " APPLE iPhone 11 Pro (Space Grey, 512 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-s... | \n",
+ " Apple | \n",
+ " 117900 | \n",
+ " 140300 | \n",
+ " 15 | \n",
+ " 7088 | \n",
+ " 523 | \n",
+ " MOBFKCTSRTHRQTFT | \n",
+ " 4.6 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " APPLE iPhone 11 Pro Max (Midnight Green, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 117100 | \n",
+ " 117100 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSRYPAQNYT | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " APPLE iPhone 11 Pro (Midnight Green, 512 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 117900 | \n",
+ " 140300 | \n",
+ " 15 | \n",
+ " 7088 | \n",
+ " 523 | \n",
+ " MOBFKCTSSJCWYGCC | \n",
+ " 4.6 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " APPLE iPhone 11 Pro (Space Grey, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-s... | \n",
+ " Apple | \n",
+ " 99900 | \n",
+ " 121300 | \n",
+ " 17 | \n",
+ " 7081 | \n",
+ " 522 | \n",
+ " MOBFKCTSWGYSAS9X | \n",
+ " 4.6 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " APPLE iPhone 12 Pro (Silver, 512 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-s... | \n",
+ " Apple | \n",
+ " 140900 | \n",
+ " 149900 | \n",
+ " 6 | \n",
+ " 542 | \n",
+ " 42 | \n",
+ " MOBFWBYZ5UY6ZBVA | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " APPLE iPhone 12 Pro Max (Pacific Blue, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 130900 | \n",
+ " 139900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZ8STJXCVT | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " APPLE iPhone 12 Pro (Graphite, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-g... | \n",
+ " Apple | \n",
+ " 120900 | \n",
+ " 129900 | \n",
+ " 6 | \n",
+ " 545 | \n",
+ " 42 | \n",
+ " MOBFWBYZBA36UB7G | \n",
+ " 4.5 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 30 | \n",
+ " APPLE iPhone 12 Pro (Graphite, 128 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-g... | \n",
+ " Apple | \n",
+ " 110900 | \n",
+ " 119900 | \n",
+ " 7 | \n",
+ " 545 | \n",
+ " 42 | \n",
+ " MOBFWBYZBZ7Y56WD | \n",
+ " 4.5 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 31 | \n",
+ " APPLE iPhone 12 Pro Max (Graphite, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 130900 | \n",
+ " 139900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZEF6XQ5ZW | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 32 | \n",
+ " APPLE iPhone 12 Pro Max (Graphite, 128 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 120900 | \n",
+ " 129900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZFDGQSDWS | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 37 | \n",
+ " APPLE iPhone 12 Pro Max (Silver, 128 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 120900 | \n",
+ " 129900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZNSNVGGZC | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 39 | \n",
+ " APPLE iPhone 12 Pro Max (Gold, 128 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 120900 | \n",
+ " 129900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZQVKT77YH | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " APPLE iPhone 12 Pro (Pacific Blue, 512 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-p... | \n",
+ " Apple | \n",
+ " 140900 | \n",
+ " 149900 | \n",
+ " 6 | \n",
+ " 545 | \n",
+ " 42 | \n",
+ " MOBFWBYZTHSXKMGW | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ "
\n",
+ " \n",
+ " 46 | \n",
+ " APPLE iPhone 12 Pro (Pacific Blue, 128 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-p... | \n",
+ " Apple | \n",
+ " 110900 | \n",
+ " 119900 | \n",
+ " 7 | \n",
+ " 545 | \n",
+ " 42 | \n",
+ " MOBFWBYZXYSCEEEH | \n",
+ " 4.5 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 47 | \n",
+ " APPLE iPhone 12 Pro Max (Pacific Blue, 128 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 120900 | \n",
+ " 129900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZZABKHZQA | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 48 | \n",
+ " APPLE iPhone 12 Pro Max (Silver, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 130900 | \n",
+ " 139900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZZH4AM8FE | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ " 49 | \n",
+ " APPLE iPhone 12 Pro Max (Gold, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-m... | \n",
+ " Apple | \n",
+ " 130900 | \n",
+ " 139900 | \n",
+ " 6 | \n",
+ " 580 | \n",
+ " 45 | \n",
+ " MOBFWBYZZPW8JHQF | \n",
+ " 4.6 | \n",
+ " 6 GB | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Product Name \\\n",
+ "14 APPLE iPhone 11 Pro Max (Gold, 256 GB) \n",
+ "15 APPLE iPhone 11 Pro Max (Gold, 64 GB) \n",
+ "16 APPLE iPhone 11 Pro Max (Midnight Green, 256 GB) \n",
+ "17 APPLE iPhone 11 Pro Max (Space Grey, 64 GB) \n",
+ "18 APPLE iPhone 11 Pro (Midnight Green, 64 GB) \n",
+ "19 APPLE iPhone 11 Pro (Space Grey, 512 GB) \n",
+ "20 APPLE iPhone 11 Pro Max (Midnight Green, 64 GB) \n",
+ "21 APPLE iPhone 11 Pro (Midnight Green, 512 GB) \n",
+ "22 APPLE iPhone 11 Pro (Space Grey, 256 GB) \n",
+ "24 APPLE iPhone 12 Pro (Silver, 512 GB) \n",
+ "25 APPLE iPhone 12 Pro Max (Pacific Blue, 256 GB) \n",
+ "27 APPLE iPhone 12 Pro (Graphite, 256 GB) \n",
+ "30 APPLE iPhone 12 Pro (Graphite, 128 GB) \n",
+ "31 APPLE iPhone 12 Pro Max (Graphite, 256 GB) \n",
+ "32 APPLE iPhone 12 Pro Max (Graphite, 128 GB) \n",
+ "37 APPLE iPhone 12 Pro Max (Silver, 128 GB) \n",
+ "39 APPLE iPhone 12 Pro Max (Gold, 128 GB) \n",
+ "41 APPLE iPhone 12 Pro (Pacific Blue, 512 GB) \n",
+ "46 APPLE iPhone 12 Pro (Pacific Blue, 128 GB) \n",
+ "47 APPLE iPhone 12 Pro Max (Pacific Blue, 128 GB) \n",
+ "48 APPLE iPhone 12 Pro Max (Silver, 256 GB) \n",
+ "49 APPLE iPhone 12 Pro Max (Gold, 256 GB) \n",
+ "\n",
+ " Product URL Brand Sale Price \\\n",
+ "14 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 131900 \n",
+ "15 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 117100 \n",
+ "16 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 131900 \n",
+ "17 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 117100 \n",
+ "18 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 74999 \n",
+ "19 https://www.flipkart.com/apple-iphone-11-pro-s... Apple 117900 \n",
+ "20 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 117100 \n",
+ "21 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 117900 \n",
+ "22 https://www.flipkart.com/apple-iphone-11-pro-s... Apple 99900 \n",
+ "24 https://www.flipkart.com/apple-iphone-12-pro-s... Apple 140900 \n",
+ "25 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 130900 \n",
+ "27 https://www.flipkart.com/apple-iphone-12-pro-g... Apple 120900 \n",
+ "30 https://www.flipkart.com/apple-iphone-12-pro-g... Apple 110900 \n",
+ "31 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 130900 \n",
+ "32 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 120900 \n",
+ "37 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 120900 \n",
+ "39 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 120900 \n",
+ "41 https://www.flipkart.com/apple-iphone-12-pro-p... Apple 140900 \n",
+ "46 https://www.flipkart.com/apple-iphone-12-pro-p... Apple 110900 \n",
+ "47 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 120900 \n",
+ "48 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 130900 \n",
+ "49 https://www.flipkart.com/apple-iphone-12-pro-m... Apple 130900 \n",
+ "\n",
+ " Mrp Discount Percentage Number Of Ratings Number Of Reviews \\\n",
+ "14 131900 0 1078 101 \n",
+ "15 117100 0 1078 101 \n",
+ "16 131900 0 1078 101 \n",
+ "17 117100 0 1078 101 \n",
+ "18 106600 29 7088 523 \n",
+ "19 140300 15 7088 523 \n",
+ "20 117100 0 1078 101 \n",
+ "21 140300 15 7088 523 \n",
+ "22 121300 17 7081 522 \n",
+ "24 149900 6 542 42 \n",
+ "25 139900 6 580 45 \n",
+ "27 129900 6 545 42 \n",
+ "30 119900 7 545 42 \n",
+ "31 139900 6 580 45 \n",
+ "32 129900 6 580 45 \n",
+ "37 129900 6 580 45 \n",
+ "39 129900 6 580 45 \n",
+ "41 149900 6 545 42 \n",
+ "46 119900 7 545 42 \n",
+ "47 129900 6 580 45 \n",
+ "48 139900 6 580 45 \n",
+ "49 139900 6 580 45 \n",
+ "\n",
+ " Upc Star Rating Ram \n",
+ "14 MOBFKCTS7HCHSPFH 4.7 4 GB \n",
+ "15 MOBFKCTSAPAYNSGG 4.7 4 GB \n",
+ "16 MOBFKCTSCAAKGQV7 4.7 4 GB \n",
+ "17 MOBFKCTSKDMKCGQS 4.7 4 GB \n",
+ "18 MOBFKCTSN3TG3RFJ 4.6 4 GB \n",
+ "19 MOBFKCTSRTHRQTFT 4.6 4 GB \n",
+ "20 MOBFKCTSRYPAQNYT 4.7 4 GB \n",
+ "21 MOBFKCTSSJCWYGCC 4.6 4 GB \n",
+ "22 MOBFKCTSWGYSAS9X 4.6 4 GB \n",
+ "24 MOBFWBYZ5UY6ZBVA 4.5 4 GB \n",
+ "25 MOBFWBYZ8STJXCVT 4.6 6 GB \n",
+ "27 MOBFWBYZBA36UB7G 4.5 6 GB \n",
+ "30 MOBFWBYZBZ7Y56WD 4.5 6 GB \n",
+ "31 MOBFWBYZEF6XQ5ZW 4.6 6 GB \n",
+ "32 MOBFWBYZFDGQSDWS 4.6 6 GB \n",
+ "37 MOBFWBYZNSNVGGZC 4.6 6 GB \n",
+ "39 MOBFWBYZQVKT77YH 4.6 6 GB \n",
+ "41 MOBFWBYZTHSXKMGW 4.5 4 GB \n",
+ "46 MOBFWBYZXYSCEEEH 4.5 6 GB \n",
+ "47 MOBFWBYZZABKHZQA 4.6 6 GB \n",
+ "48 MOBFWBYZZH4AM8FE 4.6 6 GB \n",
+ "49 MOBFWBYZZPW8JHQF 4.6 6 GB "
+ ]
+ },
+ "execution_count": 11,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df[df['Mrp']>=100000]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 24,
+ "id": "d6ca7ae7",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'APPLE IPHONE 8 PLUS (GOLD, 64 GB)'"
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "list(df['Product Name'])[0].upper()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "id": "dc1502b3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'apple iphone 8 plus (gold, 64 gb)'"
+ ]
+ },
+ "execution_count": 25,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "list(df['Product Name'])[0].lower()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "id": "fc0990ca",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'IPHONE 11'"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "list(df['Product Name'])[51][6:15].upper().strip()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "id": "a99e14b5",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "df['Model Name'] = df['Product Name'].str[6:15]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "id": "49df9e15",
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Product Name | \n",
+ " Product URL | \n",
+ " Brand | \n",
+ " Sale Price | \n",
+ " Mrp | \n",
+ " Discount Percentage | \n",
+ " Number Of Ratings | \n",
+ " Number Of Reviews | \n",
+ " Upc | \n",
+ " Star Rating | \n",
+ " Ram | \n",
+ " Model Name | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " APPLE iPhone 8 Plus (Gold, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-plus-g... | \n",
+ " Apple | \n",
+ " 49900 | \n",
+ " 49900 | \n",
+ " 0 | \n",
+ " 3431 | \n",
+ " 356 | \n",
+ " MOBEXRGV7EHHTGUH | \n",
+ " 4.6 | \n",
+ " 2 GB | \n",
+ " iPhone 8 | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " APPLE iPhone 8 Plus (Space Grey, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-plus-s... | \n",
+ " Apple | \n",
+ " 84900 | \n",
+ " 84900 | \n",
+ " 0 | \n",
+ " 3431 | \n",
+ " 356 | \n",
+ " MOBEXRGVAC6TJT4F | \n",
+ " 4.6 | \n",
+ " 2 GB | \n",
+ " iPhone 8 | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " APPLE iPhone 8 Plus (Silver, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-plus-s... | \n",
+ " Apple | \n",
+ " 84900 | \n",
+ " 84900 | \n",
+ " 0 | \n",
+ " 3431 | \n",
+ " 356 | \n",
+ " MOBEXRGVGETABXWZ | \n",
+ " 4.6 | \n",
+ " 2 GB | \n",
+ " iPhone 8 | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " APPLE iPhone 8 (Silver, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-silver... | \n",
+ " Apple | \n",
+ " 77000 | \n",
+ " 77000 | \n",
+ " 0 | \n",
+ " 11202 | \n",
+ " 794 | \n",
+ " MOBEXRGVMZWUHCBA | \n",
+ " 4.5 | \n",
+ " 2 GB | \n",
+ " iPhone 8 | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " APPLE iPhone 8 (Gold, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-8-gold-2... | \n",
+ " Apple | \n",
+ " 77000 | \n",
+ " 77000 | \n",
+ " 0 | \n",
+ " 11202 | \n",
+ " 794 | \n",
+ " MOBEXRGVPK7PFEJZ | \n",
+ " 4.5 | \n",
+ " 2 GB | \n",
+ " iPhone 8 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Product Name \\\n",
+ "0 APPLE iPhone 8 Plus (Gold, 64 GB) \n",
+ "1 APPLE iPhone 8 Plus (Space Grey, 256 GB) \n",
+ "2 APPLE iPhone 8 Plus (Silver, 256 GB) \n",
+ "3 APPLE iPhone 8 (Silver, 256 GB) \n",
+ "4 APPLE iPhone 8 (Gold, 256 GB) \n",
+ "\n",
+ " Product URL Brand Sale Price \\\n",
+ "0 https://www.flipkart.com/apple-iphone-8-plus-g... Apple 49900 \n",
+ "1 https://www.flipkart.com/apple-iphone-8-plus-s... Apple 84900 \n",
+ "2 https://www.flipkart.com/apple-iphone-8-plus-s... Apple 84900 \n",
+ "3 https://www.flipkart.com/apple-iphone-8-silver... Apple 77000 \n",
+ "4 https://www.flipkart.com/apple-iphone-8-gold-2... Apple 77000 \n",
+ "\n",
+ " Mrp Discount Percentage Number Of Ratings Number Of Reviews \\\n",
+ "0 49900 0 3431 356 \n",
+ "1 84900 0 3431 356 \n",
+ "2 84900 0 3431 356 \n",
+ "3 77000 0 11202 794 \n",
+ "4 77000 0 11202 794 \n",
+ "\n",
+ " Upc Star Rating Ram Model Name \n",
+ "0 MOBEXRGV7EHHTGUH 4.6 2 GB iPhone 8 \n",
+ "1 MOBEXRGVAC6TJT4F 4.6 2 GB iPhone 8 \n",
+ "2 MOBEXRGVGETABXWZ 4.6 2 GB iPhone 8 \n",
+ "3 MOBEXRGVMZWUHCBA 4.5 2 GB iPhone 8 \n",
+ "4 MOBEXRGVPK7PFEJZ 4.5 2 GB iPhone 8 "
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "id": "05a997dc",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Product Name | \n",
+ " Product URL | \n",
+ " Brand | \n",
+ " Sale Price | \n",
+ " Mrp | \n",
+ " Discount Percentage | \n",
+ " Number Of Ratings | \n",
+ " Number Of Reviews | \n",
+ " Upc | \n",
+ " Star Rating | \n",
+ " Ram | \n",
+ " Model Name | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 20 | \n",
+ " APPLE iPhone 11 Pro Max (Midnight Green, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 117100 | \n",
+ " 117100 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSRYPAQNYT | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ " iPhone 11 | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " APPLE iPhone 11 Pro Max (Space Grey, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 117100 | \n",
+ " 117100 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSKDMKCGQS | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ " iPhone 11 | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " APPLE iPhone 11 Pro Max (Midnight Green, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 131900 | \n",
+ " 131900 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSCAAKGQV7 | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ " iPhone 11 | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " APPLE iPhone 11 Pro Max (Gold, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 117100 | \n",
+ " 117100 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTSAPAYNSGG | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ " iPhone 11 | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " APPLE iPhone 11 Pro Max (Gold, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-11-pro-m... | \n",
+ " Apple | \n",
+ " 131900 | \n",
+ " 131900 | \n",
+ " 0 | \n",
+ " 1078 | \n",
+ " 101 | \n",
+ " MOBFKCTS7HCHSPFH | \n",
+ " 4.7 | \n",
+ " 4 GB | \n",
+ " iPhone 11 | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 45 | \n",
+ " APPLE iPhone 12 Mini (Black, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-mini-... | \n",
+ " Apple | \n",
+ " 59900 | \n",
+ " 69900 | \n",
+ " 14 | \n",
+ " 740 | \n",
+ " 64 | \n",
+ " MOBFWBYZXSEGBS6F | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ " iPhone 12 | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " APPLE iPhone 12 Mini (White, 64 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-mini-... | \n",
+ " Apple | \n",
+ " 59900 | \n",
+ " 69900 | \n",
+ " 14 | \n",
+ " 740 | \n",
+ " 64 | \n",
+ " MOBFWBYZBH4CEC4C | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ " iPhone 12 | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " Apple iPhone SE (White, 256 GB) (Includes EarP... | \n",
+ " https://www.flipkart.com/apple-iphone-se-white... | \n",
+ " Apple | \n",
+ " 44999 | \n",
+ " 54900 | \n",
+ " 18 | \n",
+ " 95909 | \n",
+ " 8161 | \n",
+ " MOBFRFXHPZCHAPEH | \n",
+ " 4.5 | \n",
+ " 2 GB | \n",
+ " iPhone SE | \n",
+ "
\n",
+ " \n",
+ " 41 | \n",
+ " APPLE iPhone 12 Pro (Pacific Blue, 512 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-p... | \n",
+ " Apple | \n",
+ " 140900 | \n",
+ " 149900 | \n",
+ " 6 | \n",
+ " 545 | \n",
+ " 42 | \n",
+ " MOBFWBYZTHSXKMGW | \n",
+ " 4.5 | \n",
+ " 4 GB | \n",
+ " iPhone 12 | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " APPLE iPhone 12 Pro (Graphite, 256 GB) | \n",
+ " https://www.flipkart.com/apple-iphone-12-pro-g... | \n",
+ " Apple | \n",
+ " 120900 | \n",
+ " 129900 | \n",
+ " 6 | \n",
+ " 545 | \n",
+ " 42 | \n",
+ " MOBFWBYZBA36UB7G | \n",
+ " 4.5 | \n",
+ " 6 GB | \n",
+ " iPhone 12 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
62 rows × 12 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Product Name \\\n",
+ "20 APPLE iPhone 11 Pro Max (Midnight Green, 64 GB) \n",
+ "17 APPLE iPhone 11 Pro Max (Space Grey, 64 GB) \n",
+ "16 APPLE iPhone 11 Pro Max (Midnight Green, 256 GB) \n",
+ "15 APPLE iPhone 11 Pro Max (Gold, 64 GB) \n",
+ "14 APPLE iPhone 11 Pro Max (Gold, 256 GB) \n",
+ ".. ... \n",
+ "45 APPLE iPhone 12 Mini (Black, 64 GB) \n",
+ "28 APPLE iPhone 12 Mini (White, 64 GB) \n",
+ "23 Apple iPhone SE (White, 256 GB) (Includes EarP... \n",
+ "41 APPLE iPhone 12 Pro (Pacific Blue, 512 GB) \n",
+ "27 APPLE iPhone 12 Pro (Graphite, 256 GB) \n",
+ "\n",
+ " Product URL Brand Sale Price \\\n",
+ "20 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 117100 \n",
+ "17 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 117100 \n",
+ "16 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 131900 \n",
+ "15 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 117100 \n",
+ "14 https://www.flipkart.com/apple-iphone-11-pro-m... Apple 131900 \n",
+ ".. ... ... ... \n",
+ "45 https://www.flipkart.com/apple-iphone-12-mini-... Apple 59900 \n",
+ "28 https://www.flipkart.com/apple-iphone-12-mini-... Apple 59900 \n",
+ "23 https://www.flipkart.com/apple-iphone-se-white... Apple 44999 \n",
+ "41 https://www.flipkart.com/apple-iphone-12-pro-p... Apple 140900 \n",
+ "27 https://www.flipkart.com/apple-iphone-12-pro-g... Apple 120900 \n",
+ "\n",
+ " Mrp Discount Percentage Number Of Ratings Number Of Reviews \\\n",
+ "20 117100 0 1078 101 \n",
+ "17 117100 0 1078 101 \n",
+ "16 131900 0 1078 101 \n",
+ "15 117100 0 1078 101 \n",
+ "14 131900 0 1078 101 \n",
+ ".. ... ... ... ... \n",
+ "45 69900 14 740 64 \n",
+ "28 69900 14 740 64 \n",
+ "23 54900 18 95909 8161 \n",
+ "41 149900 6 545 42 \n",
+ "27 129900 6 545 42 \n",
+ "\n",
+ " Upc Star Rating Ram Model Name \n",
+ "20 MOBFKCTSRYPAQNYT 4.7 4 GB iPhone 11 \n",
+ "17 MOBFKCTSKDMKCGQS 4.7 4 GB iPhone 11 \n",
+ "16 MOBFKCTSCAAKGQV7 4.7 4 GB iPhone 11 \n",
+ "15 MOBFKCTSAPAYNSGG 4.7 4 GB iPhone 11 \n",
+ "14 MOBFKCTS7HCHSPFH 4.7 4 GB iPhone 11 \n",
+ ".. ... ... ... ... \n",
+ "45 MOBFWBYZXSEGBS6F 4.5 4 GB iPhone 12 \n",
+ "28 MOBFWBYZBH4CEC4C 4.5 4 GB iPhone 12 \n",
+ "23 MOBFRFXHPZCHAPEH 4.5 2 GB iPhone SE \n",
+ "41 MOBFWBYZTHSXKMGW 4.5 4 GB iPhone 12 \n",
+ "27 MOBFWBYZBA36UB7G 4.5 6 GB iPhone 12 \n",
+ "\n",
+ "[62 rows x 12 columns]"
+ ]
+ },
+ "execution_count": 59,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.sort_values(by=['Star Rating'], ascending = False)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "id": "7ab7c0a7",
+ "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": 5
+}
diff --git a/Tutorials/Python_Data_Engineering/2. Python Basics/Python Basics.ipynb b/Tutorials/Python_Data_Engineering/2. Python Basics/Python Basics.ipynb
new file mode 100644
index 0000000000..c7761be1e5
--- /dev/null
+++ b/Tutorials/Python_Data_Engineering/2. Python Basics/Python Basics.ipynb
@@ -0,0 +1,3219 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Introduction To Python (Basics)
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "\n",
+ "Python is a\n",
+ "\n",
+ "- general purpose programming language\n",
+ "- interpreted, not compiled\n",
+ "- both **dynamically typed** _and_ **strongly typed**\n",
+ "- supports multiple programming paradigms: object oriented, functional\n",
+ "- comes in 2 main versions in use today: 2.7 and 3.x\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "## Python's Interactive Console : The Interpreter\n",
+ "\n",
+ "***\n",
+ "- The Python interpreter is a console that allows interactive development\n",
+ "- We are currently using the Jupyter notebook, which uses an advanced Python interpreter called IPython\n",
+ "- This gives us much more power and flexibility\n",
+ "\n",
+ "**Let's try it out !**\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Hello Data World!\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"Hello Data World!\") #As usual with any language we start with with the print function"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# What are we going to learn today?\n",
+ "***\n",
+ "- CHAPTER 1 - **Python Basics**\n",
+ " - **Strings**\n",
+ " - Creating a String, variable assignments\n",
+ " - String Indexing & Slicing\n",
+ " - String Concatenation & Repetition\n",
+ " - Basic Built-in String Methods\n",
+ " - **Numbers**\n",
+ " - Types of Numbers\n",
+ " - Basic Arithmetic\n",
+ " \n",
+ "\n",
+ "\n",
+ "- CHAPTER 2 - **Data Types & Data Structures**\n",
+ " - Lists\n",
+ " - Dictionaries\n",
+ " - Sets & Booleans\n",
+ "\n",
+ "\n",
+ "- CHAPTER 3 - **Python Programming Constructs**\n",
+ " - Loops & Iterative Statements\n",
+ " - if,elif,else statements\n",
+ " - for loops, while loops\n",
+ " - Comprehensions\n",
+ " - Exception Handling\n",
+ " - Modules, Packages, \n",
+ " - File I/O operations\n",
+ " "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Your turn print = \"Hello Data Science World!\"\n",
+ "print(\"Hello Data Science World!\")\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# CHAPTER - 1 : Python Basics\n",
+ "***\n",
+ "Let's understand \n",
+ "- Basic data types\n",
+ "- Variables and Scoping\n",
+ "- Modules, Packages and the **`import`** statement\n",
+ "- Operators\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "# Strings\n",
+ "***\n",
+ "\n",
+ "Strings are used in Python to record text information, such as name. Strings in Python are actually a *sequence*, which basically means Python keeps track of every element in the string as a sequence. For example, Python understands the string \"Python' to be a sequence of letters in a specific order. This means we will be able to use indexing to grab particular letters (like the first letter, or the last letter).\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "This idea of a sequence is an important one in Python and we will touch upon it later on in the future.\n",
+ "\n",
+ "In this lecture we'll learn about the following:\n",
+ "\n",
+ " 1.) Creating Strings\n",
+ " 2.) Printing Strings\n",
+ " 3.) String Indexing and Slicing\n",
+ " 4.) String Properties\n",
+ " 5.) String Methods\n",
+ " 6.) Print Formatting"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Creating a String\n",
+ "\n",
+ "\n",
+ "To create a string in Python you need to use either single quotes or double quotes. For example:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "hello\n",
+ "\n",
+ "This is also a string\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Single word\n",
+ "print('hello')\n",
+ "\n",
+ "print() # Used to have a line space between two sentences. Try deleting this line & seeing the difference.\n",
+ "\n",
+ "# Entire phrase \n",
+ "print('This is also a string')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "darshil parmar\n"
+ ]
+ }
+ ],
+ "source": [
+ "#print your name here\n",
+ "print(\"darshil parmar\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "## Variables : Store your Value in me!\n",
+ "***\n",
+ "\n",
+ "In the code below we begin to explore how we can use a variable to which a string can be assigned. This can be extremely useful in many cases, where you can call the variable instead of typing the string everytime. This not only makes our code clean but it also makes it less redundant. \n",
+ "Example syntax to assign a value or expression to a variable,\n",
+ "\n",
+ "variable_name = value or expression\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "Now let's get coding!!. With the below block of code showing how to assign a string to variable.\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "### String Indexing\n",
+ "We know strings are a sequence, which means Python can use indexes to call parts of the sequence. Let's learn how this works.\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "In Python, we use brackets [] after an object to call its index. We should also note that indexing starts at 0 for Python. Let's create a new object called s and the walk through a few examples of indexing."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Assign s as a string\n",
+ "s = 'Hello World'"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "l\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(s[2])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Hello World\n",
+ "\n",
+ "H\n",
+ "\n",
+ "e\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print the object\n",
+ "print(s) \n",
+ "\n",
+ "print() \n",
+ "\n",
+ "# Show first element (in this case a letter)\n",
+ "print(s[0])\n",
+ "\n",
+ "print()\n",
+ "\n",
+ "# Show the second element (also a letter)\n",
+ "print(s[1])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Your turn \n",
+ "#print 'l' character from the string\n",
+ "#print 'd' character from the string"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "# String Concatenation and Repetition\n",
+ "\n",
+ "***\n",
+ "**String Concatenation** is a process to combine two strings. It is done using the '+' operator. \n",
+ "\n",
+ "
\n",
+ "\n",
+ "**String Repetition** is a process of repeating a same string multiple times\n",
+ "\n",
+ "The examples of the above concepts is as follows."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:48:56.114365Z",
+ "start_time": "2017-09-25T05:48:56.105824Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Hello World\n"
+ ]
+ }
+ ],
+ "source": [
+ "# concatenation (addition)\n",
+ "\n",
+ "s1 = 'Hello'\n",
+ "s2 = \"World\"\n",
+ "print(s1 + \" \" + s2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:48:56.705418Z",
+ "start_time": "2017-09-25T05:48:56.698786Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Hello_Hello_Hello_Hello_Hello_\n",
+ "----------\n"
+ ]
+ }
+ ],
+ "source": [
+ "# repetition (multiplication)\n",
+ "\n",
+ "print(\"Hello_\" * 5)\n",
+ "print(\"-\" * 10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "darshil darshil darshil darshil darshil darshil darshil darshil darshil darshil \n"
+ ]
+ }
+ ],
+ "source": [
+ "print(\"darshil \" * 10)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Print 'Data' 15 times\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "\n",
+ "\n",
+ "## String Slicing & Indexing\n",
+ "***\n",
+ "**String Indexing** is used to to select the letter at a particular index/position. \n",
+ "\n",
+ "**String Slicing** is a process to select a subset of an entire string\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "The examples of the above stated are as follows"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 25,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:49:04.320983Z",
+ "start_time": "2017-09-25T05:49:04.295626Z"
+ },
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "a\n",
+ "Worl\n",
+ "World\n",
+ "True\n"
+ ]
+ }
+ ],
+ "source": [
+ "s = \"Namaste World\"\n",
+ "\n",
+ "# print sub strings\n",
+ "print(s[1]) #This is indexing.\n",
+ "print(s[8:12]) #This is known as slicing.\n",
+ "print(s[-5:])\n",
+ "\n",
+ "# test substring membership\n",
+ "print(\"World\" in s)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'ste W'"
+ ]
+ },
+ "execution_count": 32,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "s[-9:-4]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Print \"World\" from string\n",
+ "#Print \"ste\" from the string\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Note the above slicing. Here we're telling Python to grab everything from 6 up to 10 and from fifth last to second last. You'll notice this a lot in Python, where statements and are usually in the context of \"up to, but not including\"."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-19T11:18:05.674928Z",
+ "start_time": "2017-09-19T11:18:05.661334Z"
+ },
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "## Basic Built-in String methods\n",
+ "\n",
+ "***\n",
+ "Objects in Python usually have built-in methods. These methods are functions inside the object (we will learn about these in much more depth later) that can perform actions or commands on the object itself.\n",
+ "\n",
+ "We call methods with a period and then the method name. Methods are in the form:\n",
+ "\n",
+ "object.method(parameters)\n",
+ "\n",
+ "Where parameters are extra arguments we can pass into the method. Don't worry if the details don't make 100% sense right now. Later on we will be creating our own objects and functions!\n",
+ "\n",
+ "Here are some examples of built-in methods in strings:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-20T09:29:42.931594Z",
+ "start_time": "2017-09-20T09:29:42.922130Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "HELLO WORLD\n",
+ "hello world\n"
+ ]
+ }
+ ],
+ "source": [
+ "s = \"Hello World\"\n",
+ "\n",
+ "print(s.upper()) ## Convert all the element of the string to Upper case..!!\n",
+ "print(s.lower()) ## Convert all the element of the string to Lower case..!!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(type(s))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-19T11:18:05.674928Z",
+ "start_time": "2017-09-19T11:18:05.661334Z"
+ },
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "## Print Formatting\n",
+ "\n",
+ "We can use the .format() method to add formatted objects to printed string statements. \n",
+ "\n",
+ "The easiest way to show this is through an example:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 37,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:49:13.537471Z",
+ "start_time": "2017-09-25T05:49:13.527853Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "My name is Einstein, my age is 22, and it is True that I am married\n",
+ "My name is Einstein, my age is 22, and it is True that I am married\n"
+ ]
+ }
+ ],
+ "source": [
+ "name = \"Einstein\"\n",
+ "age = 22\n",
+ "married = True\n",
+ "\n",
+ "print(\"My name is %s, my age is %s, and it is %s that I am married\" % (name, age, married))\n",
+ "\n",
+ "print(\"My name is {}, my age is {}, and it is {} that I am married\".format(name, age, married))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 38,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "My name is Einstein, my age is 22\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(f\"My name is {name}, my age is {age}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Mini Challenge\n",
+ "***\n",
+ "\n",
+ "Its your turn now!! store the word `hello` in my_string. print the my_string + name. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Write your solution here\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "# Numbers \n",
+ "***\n",
+ "\n",
+ "
\n",
+ "Having worked with string we will turn our attention to numbers\n",
+ "We'll learn about the following topics:\n",
+ "\n",
+ " 1.) Types of Numbers in Python\n",
+ " 2.) Basic Arithmetic\n",
+ " 3.) Object Assignment in Python"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Types of numbers\n",
+ "***\n",
+ "Python has various \"types\" of numbers (numeric literals). We'll mainly focus on integers and floating point numbers.\n",
+ "\n",
+ "Integers are just whole numbers, positive or negative. For example: 2 and -2 are examples of integers.\n",
+ "\n",
+ "Floating point numbers in Python are notable because they have a decimal point in them, or use an exponential (e) to define the number. For example 2.0 and -2.1 are examples of floating point numbers. 4E2 (4 times 10 to the power of 2) is also an example of a floating point number in Python.\n",
+ "\n",
+ "Throughout this course we will be mainly working with integers or simple float number types.\n",
+ "\n",
+ "Here is a table of the two main types we will spend most of our time working with some examples:\n",
+ "\n",
+ "\n",
+ "\n",
+ " Examples | \n",
+ " Number \"Type\" | \n",
+ "
\n",
+ "\n",
+ "\n",
+ " 1,2,-5,1000 | \n",
+ " Integers | \n",
+ "
\n",
+ "\n",
+ "\n",
+ " 1.2,-0.5,2e2,3E2 | \n",
+ " Floating-point numbers | \n",
+ "
\n",
+ "
"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now let's start with some basic arithmetic."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "-"
+ }
+ },
+ "source": [
+ "## Basic Arithmetic"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "3\n",
+ "1\n",
+ "4\n",
+ "1.5\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Addition\n",
+ "print(2+1)\n",
+ "\n",
+ "# Subtraction\n",
+ "print(2-1)\n",
+ "\n",
+ "# Multiplication\n",
+ "print(2*2)\n",
+ "\n",
+ "# Division\n",
+ "print(3/2)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Arithmetic continued"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "16"
+ ]
+ },
+ "execution_count": 51,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Powers\n",
+ "2**4"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "105"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Order of Operations followed in Python\n",
+ "2 + 10 * 10 + 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "156"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Can use parenthesis to specify orders\n",
+ "(2+10) * (10+3)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# multiply 15 by 2 and add 10 to it\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Variable Assignments\n",
+ "***\n",
+ "Now that we've seen how to use numbers in Python as a calculator let's see how we can assign names and create variables.\n",
+ "\n",
+ "We use a single equals sign to assign labels to variables. Let's see a few examples of how we can do this.\n",
+ "\n",
+ "\n",
+ "\n",
+ "The names you use when creating these labels need to follow a few rules:\n",
+ "\n",
+ " 1. Names can not start with a number.\n",
+ " 2. There can be no spaces in the name, use _ instead.\n",
+ " 3. Can't use any of these symbols :'\",<>/?|\\()!@#$%^&*~-+\n",
+ "\n",
+ "\n",
+ "Using variable names can be a very useful way to keep track of different variables in Python."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "count = 5"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Let's create an object called \"a\" and assign it the number 5\n",
+ "a = 5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now if I call *a* in my Python script, Python will treat it as the number 5."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 68,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "5"
+ ]
+ },
+ "execution_count": 68,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 67,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 67,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Adding the objects\n",
+ "a+a"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "What happens on reassignment? Will Python let us write it over?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Reassignment\n",
+ "a = 10"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "10"
+ ]
+ },
+ "execution_count": 75,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "20"
+ ]
+ },
+ "execution_count": 76,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Check\n",
+ "a+a"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Mini Challenge \n",
+ "***\n",
+ "\n",
+ "**Its your turn now!!!** given the numbers stored in variables `a` and `b`. Can you write a simple code to compute the mean of these two numbers and assign it to a variable `mean`. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#write your code here\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "# CHAPTER - 2 : Data Types & Data Structures\n",
+ "***\n",
+ "- Everything in Python is an \"object\", including integers/floats\n",
+ "- Most common and important types (classes)\n",
+ " - \"Single value\": None, int, float, bool, str, complex\n",
+ " - \"Multiple values\": list, tuple, set, dict\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "- Single/Multiple isn't a real distinction, this is for explanation\n",
+ "- There are many others, but these are most frequently used"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "### Identifying Data Types\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:47:32.052311Z",
+ "start_time": "2017-09-25T05:47:32.041864Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "a = 42\n",
+ "b = 32.30\n",
+ "c = \"Hello\"\n",
+ "d = True\n",
+ "print(type(a))#gets type of a\n",
+ "print(type(b))#gets type of b\n",
+ "print(type(c))\n",
+ "print(type(d))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "True"
+ ]
+ },
+ "execution_count": 3,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "10 == 10"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "# Lists\n",
+ "***\n",
+ "Lists can be thought of the most general version of a *sequence* in Python. \n",
+ "\n",
+ "In this section we will learn about:\n",
+ " \n",
+ " 1.) Creating lists\n",
+ " 2.) Indexing and Slicing Lists\n",
+ " 3.) Basic List Methods\n",
+ " 4.) Nesting Lists\n",
+ " 5.) Introduction to List Comprehensions\n",
+ " \n",
+ "\n",
+ "
\n",
+ "\n",
+ "Lists are constructed with brackets [] and commas separating every element in the list.\n",
+ "\n",
+ "Let's go ahead and see how we can construct lists!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Assign a list to an variable named my_list\n",
+ "my_list = [1,2,3]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We just created a list of integers, but lists can actually hold different object types. For example:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "my_list = [1,2,3,4,5,6,7]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[1, 2, 3, 4, 5, 6, 7]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_list"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Just like strings, the len() function will tell you how many items are in the sequence of the list."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "7"
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "len(my_list)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Create a list which includes a numbers, floating point, strings and character"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "### Adding New Elements to a list\n",
+ "***\n",
+ "We use two special commands to add new elements to a list. Let's make a new list to remind ourselves of how this works:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "my_list = ['one','two','three',4,5]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['one', 'two', 'three', 4, 5]"
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_list"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "my_list.append(\"six\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['one', 'two', 'three', 4, 5, 'six']"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_list"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[1, 2.3, ['a', 'b'], 'New York', 3.1]\n"
+ ]
+ }
+ ],
+ "source": [
+ "# append a value to the end of the list\n",
+ "l = [1, 2.3, ['a', 'b'], 'New York']\n",
+ "l.append(3.1)\n",
+ "print(l)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 26,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l = [1, 2, 3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "IndexError",
+ "evalue": "list index out of range",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m/var/folders/0n/nb074wzd4kl1nmdvkbdnpgym0000gn/T/ipykernel_27358/1388274891.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmy_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mIndexError\u001b[0m: list index out of range"
+ ]
+ }
+ ],
+ "source": [
+ "my_list[3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 22,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l.append([4,5,6,7])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 28,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l.extend([4,5,6,7])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 29,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[1, 2, 3, 4, 5, 6, 7]"
+ ]
+ },
+ "execution_count": 29,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "l"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# extend a list with another list. \n",
+ "l = [1, 2, 3]\n",
+ "l.extend([4, 5, 6])\n",
+ "print(l)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#append '5' to the list\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "[1,2,3,4,5,6]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:47:36.261839Z",
+ "start_time": "2017-09-25T05:47:36.253351Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "# extend a list with another list. "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-19T11:49:42.542856Z",
+ "start_time": "2017-09-19T11:49:42.534053Z"
+ },
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "## Slicing\n",
+ "***\n",
+ "Slicing is used to access individual elements or a rage of elements in a list. \n",
+ "\n",
+ "Python supports \"slicing\" indexable sequences. The syntax for slicing lists is:\n",
+ "\n",
+ "- `list_object[start:end:step]` or\n",
+ "- `list_object[start:end]`\n",
+ "\n",
+ "start and end are indices (start inclusive, end exclusive). All slicing values are optional."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 32,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l = list(range(10))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "l"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 42,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[0, 3, 6, 9]"
+ ]
+ },
+ "execution_count": 42,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "l[0:10:3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:47:39.225276Z",
+ "start_time": "2017-09-25T05:47:39.204399Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
+ "elements from index 4 to 7: [4, 5, 6]\n",
+ "alternate elements, starting at index 0: [0, 2, 4, 6, 8]\n",
+ "every third element, starting at index 1: [1, 4, 7]\n"
+ ]
+ }
+ ],
+ "source": [
+ "lst = list(range(10)) # create a list containing 10 numbers starting from 0 \n",
+ "print(lst)\n",
+ "\n",
+ "print(\"elements from index 4 to 7:\", lst[4:7])\n",
+ "print(\"alternate elements, starting at index 0:\", lst[0::2]) # prints elements from index 0 till last index with a step of 2\n",
+ "print(\"every third element, starting at index 1:\", lst[1::3]) # prints elements from index 1 till last index with a step of 3\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
+ ]
+ },
+ "execution_count": 44,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "l"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l.insert(0,\"darshil\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['darshil', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
+ ]
+ },
+ "execution_count": 46,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "l"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "**Other `list` operations**
\n",
+ "\n",
+ "***\n",
+ "- **`.append`**: add element to end of list\n",
+ "- **`.insert`**: insert element at given index\n",
+ "- **`.extend`**: extend one list with another list"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Mini Challenge\n",
+ "***\n",
+ "Now that you have understood how to access elements in a list. Can you access the last element of l which is a list and find the last element of that list."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l = [1, 2.3, ['a', 'b'], 'New York']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#print Last element of the list\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "# Dictionaries\n",
+ "***\n",
+ "Now we're going to switch gears and learn about *mappings* called *dictionaries* in Python. If you're familiar with other languages you can think of these Dictionaries as hash tables. \n",
+ "\n",
+ "This section will serve as a brief introduction to dictionaries and consist of:\n",
+ "\n",
+ " 1.) Constructing a Dictionary\n",
+ " 2.) Accessing objects from a dictionary\n",
+ " 3.) Nesting Dictionaries\n",
+ " 4.) Basic Dictionary Methods\n",
+ "\n",
+ "\n",
+ "
\n",
+ "\n",
+ "A Python dictionary consists of a key and then an associated value. That value can be almost any Python object.\n",
+ "\n",
+ "\n",
+ "## Constructing a Dictionary\n",
+ "Let's see how we can construct dictionaries to get a better understanding of how they work!"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Make a dictionary with {} and : to signify a key and a value\n",
+ "my_dict = {'key1':'value1','key2':'value2'} "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{'key1': 'value1', 'key2': 'value2'}\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(my_dict)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'value2'"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Call values by their key\n",
+ "my_dict['key2']"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We can effect the values of a key as well. For instance:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'key1': 123, 'key2': 'value2'}"
+ ]
+ },
+ "execution_count": 50,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_dict['key1']=123\n",
+ "my_dict\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 52,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_dict['key1'] - 123"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Subtract 123 from the value\n",
+ "my_dict['key1'] = my_dict['key1'] - 123"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 54,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "#Check\n",
+ "my_dict['key1']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'key1': 0, 'key2': 'value2'}"
+ ]
+ },
+ "execution_count": 55,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_dict"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "my_new_dict = {'name': [\"darshil\", 'jac', 'rahul'], \"surname\": [\"parmar\",'asd','asdas'], \"age\": [25,26,27]}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "'rahul'"
+ ]
+ },
+ "execution_count": 66,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_new_dict['name'][-1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 70,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "my_new_dict['country'] = ['india', 'us', 'india']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 71,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{'name': ['darshil', 'jac', 'rahul'],\n",
+ " 'surname': ['parmar', 'asd', 'asdas'],\n",
+ " 'age': [25, 26, 27],\n",
+ " 'country': ['india', 'us', 'india']}"
+ ]
+ },
+ "execution_count": 71,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "my_new_dict"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "A quick note, Python has a built-in method of doing a self subtraction or addition (or multiplication or division). We could have also used += or -= for the above statement. For example:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "my_dict['key1'] = my_dict['key1'] + 123"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 69,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "246"
+ ]
+ },
+ "execution_count": 69,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Set the object equal to itself minus 123 \n",
+ "my_dict['key1'] += 123\n",
+ "my_dict['key1']"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now its your turn to get hands-on with Dictionary, create a empty dicts. Create a new key calle animal and assign a value 'Dog' to it..\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create a new dictionary\n",
+ "d = {}\n",
+ "# Create a new key through assignment\n",
+ "d['animal'] = 'Dog'"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:47:45.662927Z",
+ "start_time": "2017-09-25T05:47:45.654794Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "source": [
+ "# Set and Booleans\n",
+ "***\n",
+ "There are two other object types in Python that we should quickly cover. Sets and Booleans. \n",
+ "\n",
+ "## Sets\n",
+ "\n",
+ "Sets are an unordered collection of *unique* elements. We can construct them by using the set() function. Let's go ahead and make a set to see how it works"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "#### Set Theory\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 72,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l = [1,1,1,1,1,2,3,3,3]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 73,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[1, 1, 1, 1, 1, 2, 3, 3, 3]"
+ ]
+ },
+ "execution_count": 73,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "l"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 74,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "l_sets = set(l)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 75,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{1, 2, 3}"
+ ]
+ },
+ "execution_count": 75,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "l_sets"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 76,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{1}"
+ ]
+ },
+ "execution_count": 76,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x = set()\n",
+ "\n",
+ "# We add to sets with the add() method\n",
+ "x.add(1)\n",
+ "\n",
+ "#Show\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 77,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "x.add(2)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 81,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{1, 2}"
+ ]
+ },
+ "execution_count": 81,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "x"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Note the curly brackets. This does not indicate a dictionary! Although you can draw analogies as a set being a dictionary with only keys.\n",
+ "\n",
+ "We know that a set has only unique entries. So what happens when we try to add something that is already in a set?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 82,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{1, 2}"
+ ]
+ },
+ "execution_count": 82,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Add a different element\n",
+ "x.add(2)\n",
+ "\n",
+ "#Show\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 94,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{1, 2, 3}"
+ ]
+ },
+ "execution_count": 94,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Try to add the same element\n",
+ "x.add(3)\n",
+ "\n",
+ "#Show\n",
+ "x"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 86,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Try adding 2 to x\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Notice how it won't place another 1 there. That's because a set is only concerned with unique elements! We can cast a list with multiple repeat elements to a set to get the unique elements. For example:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 95,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Create a list with repeats\n",
+ "l = [1,1,2,2,3,4,5,6,1,1]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 107,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "{1, 2, 3, 4, 5, 6}"
+ ]
+ },
+ "execution_count": 107,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Cast as set to get unique values\n",
+ "set(l)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# Python Tuples\n",
+ "***\n",
+ "Tuples are used to store multiple items in a single variable.\n",
+ "\n",
+ "Tuple is one of 4 built-in data types in Python used to store collections of data, the other 3 are List, Set, and Dictionary, all with different qualities and usage.\n",
+ "\n",
+ "A tuple is a collection which is ordered and unchangeable.\n",
+ "\n",
+ "Tuples are written with round brackets."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 98,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "thistuple = (\"apple\", \"banana\", \"cherry\")\n",
+ "print(type(thistuple))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Tuple items are ordered, unchangeable, and allow duplicate values.\n",
+ "\n",
+ "Tuple items are indexed, the first item has index [0], the second item has index [1] etc."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 105,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "apple\n"
+ ]
+ }
+ ],
+ "source": [
+ "thistuple = (\"apple\", \"banana\", \"cherry\", \"apple\", \"cherry\")\n",
+ "print(thistuple[3])"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "\n",
+ "# Python Programming Constructs\n",
+ "***\n",
+ "We'll be talking about\n",
+ "- Conditional Statements\n",
+ "- Looping\n",
+ "- Comprehensions"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# If,elif,else Statements\n",
+ "\n",
+ "if Statements in Python allows us to tell the computer to perform alternative actions based on a certain set of results.\n",
+ "\n",
+ "Verbally, we can imagine we are telling the computer:\n",
+ "\n",
+ "\"Hey if this case happens, perform some action\"\n",
+ "\n",
+ "We can then expand the idea further with elif and else statements, which allow us to tell the computer:\n",
+ "\n",
+ "\"Hey if this case happens, perform some action. Else if another case happens, perform some other action. Else-- none of the above cases happened, perform this action\"\n",
+ "\n",
+ "\n",
+ "\n",
+ "Let's go ahead and look at the syntax format for if statements to get a better idea of this:\n",
+ "\n",
+ " if case1:\n",
+ " perform action1\n",
+ " elif case2:\n",
+ " perform action2\n",
+ " else: \n",
+ " perform action 3"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 126,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "a = 4\n",
+ "b = 2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 123,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "False"
+ ]
+ },
+ "execution_count": 123,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a > b"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "if a > b {\n",
+ " asdasd\n",
+ " \n",
+ "}\n",
+ "else{\n",
+ " asdasd\n",
+ " \n",
+ "}"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 127,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "a is greater than b\n"
+ ]
+ }
+ ],
+ "source": [
+ "if a > b:\n",
+ " print(\"a is greater than b\")\n",
+ "elif b > a:\n",
+ " print(\"b is greater than a\")\n",
+ "else:\n",
+ " print(\"a and b are equal\")\n",
+ " print(\"asdas\")\n",
+ " \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 128,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:49:17.584649Z",
+ "start_time": "2017-09-25T05:49:17.562599Z"
+ },
+ "slideshow": {
+ "slide_type": "fragment"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "a is greater than b\n"
+ ]
+ }
+ ],
+ "source": [
+ "a = 6\n",
+ "b = 2\n",
+ "\n",
+ "if a > b:\n",
+ " print(\"a is greater than b\")\n",
+ "elif b > a:\n",
+ " # we are inside the elif block\n",
+ " print(\"b is greater than a\")\n",
+ "else:\n",
+ " # we are inside the else block\n",
+ " print(\"a and b are equal\")\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Indentation\n",
+ "***\n",
+ "It is important to keep a good understanding of how indentation works in Python to maintain the structure and order of your code. We will touch on this topic again when we start building out functions!"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# For Loops\n",
+ "***\n",
+ "A **for** loop acts as an iterator in Python, it goes through items that are in a *sequence* or any other iterable item. Objects that we've learned about that we can iterate over include strings,lists,tuples, and even built in iterables for dictionaries, such as the keys or values.\n",
+ "\n",
+ "We've already seen the **for** statement a little bit in past lectures but now lets formalize our understanding.\n",
+ "\n",
+ "Here's the general format for a **for** loop in Python:\n",
+ "\n",
+ " for item in object:\n",
+ " statements to do stuff\n",
+ " \n",
+ " \n",
+ "\n",
+ "The variable name used for the item is completely up to the coder, so use your best judgment for choosing a name that makes sense and you will be able to understand when revisiting your code. This item name can then be referenced inside you loop, for example if you wanted to use if statements to perform checks.\n",
+ "\n",
+ "Let's go ahead and work through several example of **for** loops using a variety of data object types.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 134,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "users = list(range(10))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 135,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
+ ]
+ },
+ "execution_count": 135,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "users"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 136,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "This is my 0 user\n",
+ "This is my 1 user\n",
+ "This is my 2 user\n",
+ "This is my 3 user\n",
+ "This is my 4 user\n",
+ "This is my 5 user\n",
+ "This is my 6 user\n",
+ "This is my 7 user\n",
+ "This is my 8 user\n",
+ "This is my 9 user\n"
+ ]
+ }
+ ],
+ "source": [
+ "for user in users:\n",
+ " print(f\"This is my {user} user\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 140,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "0"
+ ]
+ },
+ "execution_count": 140,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "27 % 9 "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 142,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "This is an even number 2\n",
+ "This is an even number 4\n",
+ "This is an odd number 5\n",
+ "This is an even number 6\n",
+ "This is an even number 8\n",
+ "This is an odd number 7\n",
+ "This is an odd number 9\n",
+ "This is an even number 10\n"
+ ]
+ }
+ ],
+ "source": [
+ "#Simple program to find the even numbers in a list\n",
+ "\n",
+ "list_1 = [2,4,5,6,8,7,9,10] # Initialised the list\n",
+ "\n",
+ "for number in list_1: # Selects one element in list_1 \n",
+ " if number % 2 == 0: # Checks if it is even. IF even, only then goes to next step else performs above step and continues iteration\n",
+ " print(f\"This is an even number {number}\") # prints no if even. end=' ' prints the nos on the same line with a space in between. Try deleting this command & seeing the difference.\n",
+ " else:\n",
+ " print(f\"This is an odd number {number}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now its time for you to code again can you create a list of 10 numbers iterate through the list and print the square of each number."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#Write your \"for_loop\" and print all elements\n",
+ "list_1 = [2,4,5,6,8,7,9,10]\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "# While loops\n",
+ "***\n",
+ "The **while** statement in Python is one of most general ways to perform iteration. A **while** statement will repeatedly execute a single statement or group of statements as long as the condition is true. The reason it is called a 'loop' is because the code statements are looped through over and over again until the condition is no longer met.\n",
+ "\n",
+ "The general format of a while loop is:\n",
+ "\n",
+ " while test:\n",
+ " code statement\n",
+ " else:\n",
+ " final code statements\n",
+ " \n",
+ "\n",
+ "
\n",
+ "\n",
+ "\n",
+ "Let’s look at a few simple while loops in action. \n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 147,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "x is currently: 11 x is still less than 10, adding 1 to x\n"
+ ]
+ }
+ ],
+ "source": [
+ "x = 11\n",
+ "\n",
+ "while x > 10:\n",
+ " print ('x is currently: ',x,end=' ') #end=' ' to put print below statement on the same line after thsi statement\n",
+ " print (' x is still less than 10, adding 1 to x')\n",
+ " x = x - 1 # this adds 1 to x "
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "slideshow": {
+ "slide_type": "slide"
+ }
+ },
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "## Modules, Packages, and `import`\n",
+ "***\n",
+ "A module is a collection of functions and variables that have been bundled together in a single file. Module helps us: \n",
+ "- Used for code organization, packaging and reusability\n",
+ "- Module: A Python file\n",
+ "- Package: A folder with an ``__init__.py`` file\n",
+ "- Namespace is based on file's directory path\n",
+ "\n",
+ "Module's are usually organised around a theme. Let's see how to use a module. To access our module we will import it using python's import statement. Math module provides access to the mathematical functions. "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 149,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-25T05:46:46.840463Z",
+ "start_time": "2017-09-25T05:46:46.832495Z"
+ },
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "8.0"
+ ]
+ },
+ "execution_count": 149,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# import the math module\n",
+ "import math\n",
+ "\n",
+ "# use the log10 function in the math module\n",
+ "math.pow(2,3)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "
\n",
+ "\n",
+ "### Mini Challenges\n",
+ "***\n",
+ "Can you compute the square of a 3 assigned to a variable a using the math module?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "#wite your code\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Double-click __here__ for the solution.\n",
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2017-09-19T10:03:27.500870Z",
+ "start_time": "2017-09-19T10:03:27.495827Z"
+ },
+ "slideshow": {
+ "slide_type": "subslide"
+ }
+ },
+ "source": [
+ "## Comprehensions\n",
+ "***\n",
+ "- Python provides syntactic sugar to write small loops to generate lists/sets/tuples/dicts in one line\n",
+ "- These are called comprehensions, and can greatly increase development speed and readability\n",
+ "\n",
+ "Syntax:\n",
+ "```\n",
+ " sequence = [expression(element) for element in iterable if condition]\n",
+ "```\n",
+ "\n",
+ "The brackets used for creating the comprehension define what type of object is created.\n",
+ "\n",
+ "Use **[ ]** for lists, **()** for _generators_, **{}** for sets and dicts"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### `list` Comprehension"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 151,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['Ravi', 'Pooja', 'Vijay', 'Kiran']"
+ ]
+ },
+ "execution_count": 151,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "names = [\"Ravi\", \"Pooja\", \"Vijay\", \"Kiran\"]\n",
+ "names"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 154,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "new_list = []\n",
+ "for name in names:\n",
+ " new_list.append(\"Hello \" + name)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 155,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['Hello Ravi', 'Hello Pooja', 'Hello Vijay', 'Hello Kiran']"
+ ]
+ },
+ "execution_count": 155,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "new_list"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 153,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "['Hello Ravi', 'Hello Pooja', 'Hello Vijay', 'Hello Kiran']\n"
+ ]
+ }
+ ],
+ "source": [
+ "names = [\"Ravi\", \"Pooja\", \"Vijay\", \"Kiran\"]\n",
+ "hello = [\"Hello \" + name for name in names]\n",
+ "print(hello)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 156,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[32, 10, 54, 32]\n",
+ "[(55, 3025), (87, 7569), (99, 9801)]\n"
+ ]
+ }
+ ],
+ "source": [
+ "numbers = [55, 32, 87, 99, 10, 54, 32]\n",
+ "even = [num for num in numbers if num % 2 == 0]\n",
+ "print(even)\n",
+ "\n",
+ "odd_squares = [(num, num * num) for num in numbers if num % 2 == 1]\n",
+ "print(odd_squares)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exception Handling\n",
+ "***\n",
+ "#### try and except\n",
+ "\n",
+ "The basic terminology and syntax used to handle errors in Python is the **try** and **except** statements. The code which can cause an exception to occue is put in the *try* block and the handling of the exception is the implemented in the *except* block of code. The syntax form is:\n",
+ "\n",
+ "\n",
+ "\n",
+ "We can also just check for any exception with just using except: To get a better understanding of all this lets check out an example: We will look at some code that opens and writes a file:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 159,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "NameError",
+ "evalue": "name 'asdasd' is not defined",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m/var/folders/0n/nb074wzd4kl1nmdvkbdnpgym0000gn/T/ipykernel_27358/2488089185.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0masdasd\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mNameError\u001b[0m: name 'asdasd' is not defined"
+ ]
+ }
+ ],
+ "source": [
+ "print(asdasd)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 166,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "hello world\n",
+ "exception occured\n",
+ "bye world\n"
+ ]
+ }
+ ],
+ "source": [
+ "print('hello world')\n",
+ "\n",
+ "try:\n",
+ " 1 / 0\n",
+ "except ZeroDivisionError:\n",
+ " print('exception occured')\n",
+ "\n",
+ "print('bye world')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 169,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "divided by zero\n",
+ "executed when exception occurs\n"
+ ]
+ }
+ ],
+ "source": [
+ "try:\n",
+ " x = 1 / 0\n",
+ "except ZeroDivisionError:\n",
+ " print('divided by zero')\n",
+ " print('executed when exception occurs')\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 171,
+ "metadata": {},
+ "outputs": [
+ {
+ "ename": "IndexError",
+ "evalue": "list index out of range",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m/var/folders/0n/nb074wzd4kl1nmdvkbdnpgym0000gn/T/ipykernel_27358/4117877996.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ml\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m15\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
+ "\u001b[0;31mIndexError\u001b[0m: list index out of range"
+ ]
+ }
+ ],
+ "source": [
+ "l[15]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "\n",
+ "\n",
+ "## File I/O : Helps you read your files\n",
+ "***\n",
+ "- Python provides a `file` object to read text/binary files.\n",
+ "- This is similar to the `FileStream` object in other languages.\n",
+ "- Since a `file` is a resource, it must be closed after use. This can be done manually, or using a context manager (**`with`** statement)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Create a file in the current directory
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 175,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "with open(\"myfile.txt\",'w') as f:\n",
+ " f.write(\"This is my file \\n\")\n",
+ " f.write(\"Second line \\n\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 177,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "/Users/darshil/Documents/DataWithDarshil/Python Course/Code/DWD - Python Code/2. Python Basics\n"
+ ]
+ }
+ ],
+ "source": [
+ "with open('myfile.txt', 'w') as f:\n",
+ " f.write(\"This is my first file!\\n\")\n",
+ " f.write(\"Second line!\\n\")\n",
+ " f.write(\"Last line!\\n\")\n",
+ "\n",
+ "\n",
+ "# let's verify if it was really created.\n",
+ "# For that, let's find out which directory we're working from\n",
+ "import os\n",
+ "print(os.path.abspath(os.curdir))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Read the newly created file
"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 178,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "This is my first file!\n",
+ "\n",
+ "Second line!\n",
+ "\n",
+ "Last line!\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "with open(\"myfile.txt\",'r') as f:\n",
+ " for line in f:\n",
+ " print(line)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 179,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "f.close()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# read the file we just created\n",
+ "with open('myfile.txt', 'r') as f:\n",
+ " for line in f:\n",
+ " print(line)\n"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Mini Challenge - 5\n",
+ "***\n",
+ "Can you create a list of 10 numbers iterate through the list and print the square of each number ?"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# In-session Recap Time\n",
+ "***\n",
+ "* Python Basics\n",
+ " * Variables and Scoping\n",
+ " * Modules, Packages and Imports\n",
+ " * Data Types & Data Structures\n",
+ " * Python Programming Constructs\n",
+ "* Data Types & Data Structures\n",
+ " * Lists\n",
+ " * Dictionaries\n",
+ " * Sets & Booleans\n",
+ "* Python Prograamming constructs\n",
+ " * Loops and Conditional Statements\n",
+ " * Exception Handling\n",
+ " * File I/O"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Thank You\n",
+ "***\n",
+ "### Coming up next...\n",
+ "\n",
+ "- **Python Functions and Object Oriendted Programming**: How to write modular functions to enable code reuse\n",
+ "- **NumPy**: Learn the basis of most numeric computation in Python"
+ ]
+ },
+ {
+ "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.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/Tutorials/Python_Data_Engineering/2. Python Basics/Untitled.ipynb b/Tutorials/Python_Data_Engineering/2. Python Basics/Untitled.ipynb
new file mode 100644
index 0000000000..1c54864904
--- /dev/null
+++ b/Tutorials/Python_Data_Engineering/2. Python Basics/Untitled.ipynb
@@ -0,0 +1,6 @@
+{
+ "cells": [],
+ "metadata": {},
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/Tutorials/Python_Data_Engineering/2. Python Basics/images/21_cent.jpg b/Tutorials/Python_Data_Engineering/2. Python Basics/images/21_cent.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..b3b608a4680a312e9f507c07423f07caefe5748c
GIT binary patch
literal 84357
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