From 9a516bf34d7471026d1daf551472c16357e6cdcc Mon Sep 17 00:00:00 2001 From: jrasero Date: Wed, 4 Dec 2024 21:24:23 -0500 Subject: [PATCH] Update documentation --- 06_numpy_intro.html | 19 +- ...dab40d296739d7f217feb8266f34cedda3e3ca.png | Bin 92731 -> 0 bytes ...6769baad220cfe3b8ff26899a82d433503ae43.png | Bin 16330 -> 0 bytes ...b95082eb478f1c18a3bf86c68555d25aa48eff.png | Bin 15608 -> 0 bytes ...52b158df7cccdca6e1be627c555a7f2610a7cd.png | Bin 14527 -> 0 bytes ...c25d6382d080de21e885f22ad6dcdbd24172b9.png | Bin 0 -> 90011 bytes ...67021af2192f28a93c9217fee70eb158fe9027.png | Bin 90582 -> 0 bytes ...1f99d7066229bac488649789a0c8d01fc3ca2b.png | Bin 88532 -> 0 bytes ...91dbfc7596c45f6f5441d4b7ecdc76d50e9b2e.png | Bin 88720 -> 0 bytes ...e9d4653c651f6dfb2edba2708c8d0fc1abc493.png | Bin 0 -> 85046 bytes ...d370a394b35506cc1b89a60b2d71b52d5219c2.png | Bin 14844 -> 0 bytes ...4787349037f1791de0ef710daae738cd2d7efe.png | Bin 13859 -> 0 bytes ...4b389608087a22bb19b8d8552621c98c9857b5.png | Bin 0 -> 93125 bytes ...32d4f856a8dc627bacb76741eeba545ccd3a57.png | Bin 14230 -> 0 bytes ...364dac88c5df9e193120f2117cdd9dcd90e51a.png | Bin 87580 -> 0 bytes ...c04d8277a3a49756eb213a92b93e18099005a3.png | Bin 14952 -> 0 bytes ...10ed222a315c174f283c71639551057f692abb.png | Bin 0 -> 14922 bytes ...a81e8a3a0ba98ae4fc28c085a0fab1911aff6e.png | Bin 14871 -> 0 bytes ...537e13c1baa630e0be650380df0813287266cf.png | Bin 14362 -> 0 bytes ...II-Merging_Concatenating_Aggregating.ipynb | 875 ------------- _sources/chapters/wrap-up.ipynb | 593 +++++++++ _sources/epilogue.ipynb | 593 +++++++++ chapters/01-getting_started.html | 15 + chapters/02-python-basics.html | 15 + chapters/04-python-basics.html | 15 + .../module-1/012-intro_python (copia).html | 15 + chapters/module-1/012-intro_python.html | 15 + chapters/module-1/013-intro_R.html | 15 + chapters/module-1/Practice.html | 15 + chapters/module-1/about_course.html | 15 + chapters/module-1/jupyter_notebooks.html | 15 + chapters/module-1/programming.html | 15 + chapters/module-1/tech_stack.html | 15 + chapters/module-1/your_first_program.html | 15 + chapters/module-2/02-cover.html | 15 + chapters/module-2/021-variables.html | 15 + chapters/module-2/022-operators.html | 15 + chapters/module-2/023-strings.html | 15 + chapters/module-2/024-structures.html | 15 + .../module-2/0241-structures_exercises.html | 15 + chapters/module-2/025-conditional.html | 15 + .../module-2/0251-conditional_exercises.html | 15 + .../module-2/026-iterables_and_iterators.html | 15 + .../module-2/0261-functions_exercises.html | 15 + chapters/module-2/027-functions.html | 15 + chapters/module-3/029-packages.html | 19 +- chapters/module-3/03-cover.html | 15 + .../module-3/031-errors_and_exceptions.html | 15 + .../031-errors_and_exceptions_w_sols.html | 15 + chapters/module-3/032-classes.html | 15 + .../module-3/033-reading_writing_files.html | 15 + chapters/module-3/lab-recursion.html | 15 + chapters/module-4/041-numpyI.html | 49 +- chapters/module-4/042-numpyII.html | 77 +- .../module-4/043-PandasI-Introduction.html | 17 +- ...II-Exploration_and_Manipulation-Copy1.html | 17 +- .../module-4/044-PandasII-exploration.html | 27 +- .../module-4/045-PandasIII-manipulation.html | 28 +- .../045-PandasIII-manipulation_sols.html | 12 +- ...III-Merging_Concatenating_Aggregating.html | 1109 ----------------- ...sIV-advanced_manipulation_aggregation.html | 82 +- ...047-PandasV-Intro_Feature_Engineering.html | 26 +- chapters/module-4/07-numpy-continued.html | 15 + chapters/module-4/Untitled.html | 15 + chapters/module-4/Untitled1.html | 16 +- chapters/module-5/051-intro_to_R.html | 12 +- chapters/module-5/052-data-structures.html | 10 +- .../module-5/053-Control-structures-sols.html | 12 +- chapters/module-5/053-Control-structures.html | 8 +- chapters/module-5/054-functions-sols.html | 16 +- chapters/module-5/054-functions.html | 12 +- chapters/module-5/055-tidyverse.html | 22 +- .../module-5/old/013-Control Structures.html | 12 +- .../old/051-dataframes-in-r-student.html | 12 +- .../module-5/old/051-dataframes-in-r.html | 12 +- chapters/wrap-up.html | 880 +++++++++++++ epilogue.html | 887 +++++++++++++ genindex.html | 4 + index.html | 6 + objects.inv | Bin 1784 -> 1816 bytes .../chapters/module-5/051-intro_to_R.err.log | 29 - .../module-5/052-data-structures.err.log | 27 - search.html | 4 + searchindex.js | 2 +- 84 files changed, 3807 insertions(+), 2184 deletions(-) delete mode 100644 _images/050342ad7de84c40a4f5b0c6b4dab40d296739d7f217feb8266f34cedda3e3ca.png delete mode 100644 _images/070678a7e031c9e174b949341b6769baad220cfe3b8ff26899a82d433503ae43.png delete mode 100644 _images/09648ccee61f35c1d83771b6e7b95082eb478f1c18a3bf86c68555d25aa48eff.png delete mode 100644 _images/19b4ef6aa7945c5b3eee41c25052b158df7cccdca6e1be627c555a7f2610a7cd.png create mode 100644 _images/267a46e09f7430ad3fccb6b619c25d6382d080de21e885f22ad6dcdbd24172b9.png delete mode 100644 _images/31805950d8499b57c39bdfbc3a67021af2192f28a93c9217fee70eb158fe9027.png delete mode 100644 _images/404f063734e2f5dcb1228730ff1f99d7066229bac488649789a0c8d01fc3ca2b.png delete mode 100644 _images/49235144743ad3e42d3413bbe691dbfc7596c45f6f5441d4b7ecdc76d50e9b2e.png create mode 100644 _images/49ed94f15827ce8ac14e383ab6e9d4653c651f6dfb2edba2708c8d0fc1abc493.png delete mode 100644 _images/613f5dbe46144df9ed2c32f18ed370a394b35506cc1b89a60b2d71b52d5219c2.png delete mode 100644 _images/7de5d3b5336ce431ec4f22429a4787349037f1791de0ef710daae738cd2d7efe.png create mode 100644 _images/8393299fa27a42e0b7e0f92dbf4b389608087a22bb19b8d8552621c98c9857b5.png delete mode 100644 _images/83fb628c4f337b0bb1bd0b2d7c32d4f856a8dc627bacb76741eeba545ccd3a57.png delete mode 100644 _images/9c819e3921bf42578207b6dea8364dac88c5df9e193120f2117cdd9dcd90e51a.png delete mode 100644 _images/c320e303b93814dfbe08651d9ac04d8277a3a49756eb213a92b93e18099005a3.png create mode 100644 _images/e56d5aba8799217f6afe138ed710ed222a315c174f283c71639551057f692abb.png delete mode 100644 _images/e7e3ff2b906c8e926c0e4d6ac6a81e8a3a0ba98ae4fc28c085a0fab1911aff6e.png delete mode 100644 _images/f51cf89b081544448e064cb8ce537e13c1baa630e0be650380df0813287266cf.png delete mode 100644 _sources/chapters/module-4/046-PandasIII-Merging_Concatenating_Aggregating.ipynb create mode 100644 _sources/chapters/wrap-up.ipynb create mode 100644 _sources/epilogue.ipynb delete mode 100644 chapters/module-4/046-PandasIII-Merging_Concatenating_Aggregating.html create mode 100644 chapters/wrap-up.html create mode 100644 epilogue.html delete mode 100644 reports/chapters/module-5/051-intro_to_R.err.log delete mode 100644 reports/chapters/module-5/052-data-structures.err.log diff --git a/06_numpy_intro.html b/06_numpy_intro.html index e4a21c3..8f3f5c4 100644 --- a/06_numpy_intro.html +++ b/06_numpy_intro.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + @@ -650,7 +665,9 @@

    Images are Numerical Data
    Requirement already satisfied: python-dateutil>=2.7 in /home/javi/anaconda3/lib/python3.11/site-packages (from matplotlib) (2.9.0.post0)
     
    Requirement already satisfied: six>=1.5 in /home/javi/anaconda3/lib/python3.11/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)
    diff --git a/_images/050342ad7de84c40a4f5b0c6b4dab40d296739d7f217feb8266f34cedda3e3ca.png b/_images/050342ad7de84c40a4f5b0c6b4dab40d296739d7f217feb8266f34cedda3e3ca.png
    deleted file mode 100644
    index 565171a7285b6c03bd87768470356f2096b7c471..0000000000000000000000000000000000000000
    GIT binary patch
    literal 0
    HcmV?d00001
    
    literal 92731
    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%0D?|2J+@LEd0FHm=;@m(wa
    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
    +

    Module 5: R

    + +

    Wrapping up

    +
    diff --git a/chapters/02-python-basics.html b/chapters/02-python-basics.html index 16d0b12..4105d9b 100644 --- a/chapters/02-python-basics.html +++ b/chapters/02-python-basics.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    +
    diff --git a/chapters/04-python-basics.html b/chapters/04-python-basics.html index 73e6e86..17e1f43 100644 --- a/chapters/04-python-basics.html +++ b/chapters/04-python-basics.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/012-intro_python (copia).html b/chapters/module-1/012-intro_python (copia).html index 58a1f31..8697b8e 100644 --- a/chapters/module-1/012-intro_python (copia).html +++ b/chapters/module-1/012-intro_python (copia).html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/012-intro_python.html b/chapters/module-1/012-intro_python.html index a090768..4034072 100644 --- a/chapters/module-1/012-intro_python.html +++ b/chapters/module-1/012-intro_python.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/013-intro_R.html b/chapters/module-1/013-intro_R.html index 6cac5c8..35aecc1 100644 --- a/chapters/module-1/013-intro_R.html +++ b/chapters/module-1/013-intro_R.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/Practice.html b/chapters/module-1/Practice.html index 775c938..0476a97 100644 --- a/chapters/module-1/Practice.html +++ b/chapters/module-1/Practice.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/about_course.html b/chapters/module-1/about_course.html index cd6f559..18b9bb7 100644 --- a/chapters/module-1/about_course.html +++ b/chapters/module-1/about_course.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/jupyter_notebooks.html b/chapters/module-1/jupyter_notebooks.html index d431345..4f7e1dc 100644 --- a/chapters/module-1/jupyter_notebooks.html +++ b/chapters/module-1/jupyter_notebooks.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/programming.html b/chapters/module-1/programming.html index 3b639d4..c1e352a 100644 --- a/chapters/module-1/programming.html +++ b/chapters/module-1/programming.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/tech_stack.html b/chapters/module-1/tech_stack.html index c5c9ac4..17a2773 100644 --- a/chapters/module-1/tech_stack.html +++ b/chapters/module-1/tech_stack.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-1/your_first_program.html b/chapters/module-1/your_first_program.html index f6545a5..c3cff9d 100644 --- a/chapters/module-1/your_first_program.html +++ b/chapters/module-1/your_first_program.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/02-cover.html b/chapters/module-2/02-cover.html index 203b94c..e0d62c5 100644 --- a/chapters/module-2/02-cover.html +++ b/chapters/module-2/02-cover.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/021-variables.html b/chapters/module-2/021-variables.html index 26e9f51..b85867e 100644 --- a/chapters/module-2/021-variables.html +++ b/chapters/module-2/021-variables.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/022-operators.html b/chapters/module-2/022-operators.html index d5171e2..cfa7406 100644 --- a/chapters/module-2/022-operators.html +++ b/chapters/module-2/022-operators.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/023-strings.html b/chapters/module-2/023-strings.html index f9f49b8..ca1afc3 100644 --- a/chapters/module-2/023-strings.html +++ b/chapters/module-2/023-strings.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/024-structures.html b/chapters/module-2/024-structures.html index b504c8d..cba1a4e 100644 --- a/chapters/module-2/024-structures.html +++ b/chapters/module-2/024-structures.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/0241-structures_exercises.html b/chapters/module-2/0241-structures_exercises.html index 25bf667..79ba597 100644 --- a/chapters/module-2/0241-structures_exercises.html +++ b/chapters/module-2/0241-structures_exercises.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/025-conditional.html b/chapters/module-2/025-conditional.html index e775456..24819bf 100644 --- a/chapters/module-2/025-conditional.html +++ b/chapters/module-2/025-conditional.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/0251-conditional_exercises.html b/chapters/module-2/0251-conditional_exercises.html index cecd267..c0488c4 100644 --- a/chapters/module-2/0251-conditional_exercises.html +++ b/chapters/module-2/0251-conditional_exercises.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/026-iterables_and_iterators.html b/chapters/module-2/026-iterables_and_iterators.html index d2ff0f2..e4a38cf 100644 --- a/chapters/module-2/026-iterables_and_iterators.html +++ b/chapters/module-2/026-iterables_and_iterators.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/0261-functions_exercises.html b/chapters/module-2/0261-functions_exercises.html index 7e8de7a..e3c5393 100644 --- a/chapters/module-2/0261-functions_exercises.html +++ b/chapters/module-2/0261-functions_exercises.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-2/027-functions.html b/chapters/module-2/027-functions.html index e4a69c7..f8588a9 100644 --- a/chapters/module-2/027-functions.html +++ b/chapters/module-2/027-functions.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-3/029-packages.html b/chapters/module-3/029-packages.html index 0b337c6..a11959f 100644 --- a/chapters/module-3/029-packages.html +++ b/chapters/module-3/029-packages.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + @@ -646,7 +661,9 @@

    Images are Numerical Data diff --git a/chapters/module-3/031-errors_and_exceptions.html b/chapters/module-3/031-errors_and_exceptions.html index 19f36da..46a15f7 100644 --- a/chapters/module-3/031-errors_and_exceptions.html +++ b/chapters/module-3/031-errors_and_exceptions.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-3/031-errors_and_exceptions_w_sols.html b/chapters/module-3/031-errors_and_exceptions_w_sols.html index 7cdf663..fbd78f3 100644 --- a/chapters/module-3/031-errors_and_exceptions_w_sols.html +++ b/chapters/module-3/031-errors_and_exceptions_w_sols.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-3/032-classes.html b/chapters/module-3/032-classes.html index a3f8838..ce8cf40 100644 --- a/chapters/module-3/032-classes.html +++ b/chapters/module-3/032-classes.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-3/033-reading_writing_files.html b/chapters/module-3/033-reading_writing_files.html index 256fd39..1abca80 100644 --- a/chapters/module-3/033-reading_writing_files.html +++ b/chapters/module-3/033-reading_writing_files.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-3/lab-recursion.html b/chapters/module-3/lab-recursion.html index 27e2e68..a978a54 100644 --- a/chapters/module-3/lab-recursion.html +++ b/chapters/module-3/lab-recursion.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-4/041-numpyI.html b/chapters/module-4/041-numpyI.html index f7a8955..1cdf8c9 100644 --- a/chapters/module-4/041-numpyI.html +++ b/chapters/module-4/041-numpyI.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + @@ -483,7 +498,7 @@

    The ndarray object -
    0.9983151051472091 <class 'float'>
    +
    1.5106196181630014 <class 'float'>
     
    @@ -497,8 +512,8 @@

    The ndarray object -
    [[-0.16765433  0.29513178  0.46948154]
    - [ 0.37200198 -1.24104694  0.01450445]] <class 'numpy.ndarray'>
    +
    [[ 0.50357981  1.60435582  0.06693117]
    + [-0.76137145  1.07623844 -0.00815216]] <class 'numpy.ndarray'>
     
    @@ -511,8 +526,8 @@

    The ndarray object -
    array([[ -1.67654327,   2.95131775,   4.69481541],
    -       [  3.7200198 , -12.41046939,   0.14504455]])
    +
    array([[ 5.03579813, 16.04355815,  0.66931166],
    +       [-7.61371454, 10.76238442, -0.08152162]])
     
    @@ -527,10 +542,10 @@

    The ndarray object -
    [[-0.33530865  0.59026355  0.93896308]
    - [ 0.74400396 -2.48209388  0.02900891]]
    -[[-0.33530865  0.59026355  0.93896308]
    - [ 0.74400396 -2.48209388  0.02900891]]
    +
    [[ 1.00715963  3.20871163  0.13386233]
    + [-1.52274291  2.15247688 -0.01630432]]
    +[[ 1.00715963  3.20871163  0.13386233]
    + [-1.52274291  2.15247688 -0.01630432]]
     
    @@ -558,9 +573,9 @@

    The ndarray object -
    [[-0.16765433  0.29513178]
    - [ 0.46948154  0.37200198]
    - [-1.24104694  0.01450445]]
    +
    [[ 0.50357981  1.60435582]
    + [ 0.06693117 -0.76137145]
    + [ 1.07623844 -0.00815216]]
     (3, 2)
     
    @@ -847,11 +862,11 @@

    Creating ndarrays - @@ -819,13 +834,13 @@

    Boolean slicing
    ['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
    -[[-0.36748832  0.41549724 -0.07892885  1.03054864]
    - [ 2.1515256   0.0252963  -0.50860192 -0.81510486]
    - [-1.50438063  1.34625813  0.19001997 -2.75474839]
    - [-2.02413974 -0.40117379 -1.11674174 -0.04430263]
    - [-1.68668132  0.4919675   0.46076492  1.68898003]
    - [ 2.05100384  2.15532653  0.63420939 -0.05512468]
    - [ 0.16083873 -2.08108768  0.47970436 -1.7483949 ]]
    +[[-0.7237047  -0.50762254 -0.48204371 -1.6133627 ]
    + [ 1.69705017  0.80812228 -0.66722951  1.33247531]
    + [-2.81200144  0.89421787 -0.02931852 -1.05156439]
    + [-1.06524316 -1.54260722  0.02495081  0.20867737]
    + [-0.14302032  0.81352009 -0.07620839  0.59158928]
    + [ 2.03311889 -0.3202367  -0.01237379 -1.41072045]
    + [-0.56663455  1.16679853 -1.34970156 -0.41449339]]
     

    @@ -864,8 +879,8 @@

    Boolean slicing -
    array([[-0.36748832,  0.41549724, -0.07892885,  1.03054864],
    -       [-2.02413974, -0.40117379, -1.11674174, -0.04430263]])
    +
    array([[-0.7237047 , -0.50762254, -0.48204371, -1.6133627 ],
    +       [-1.06524316, -1.54260722,  0.02495081,  0.20867737]])
     
    @@ -878,8 +893,8 @@

    Boolean slicing -
    array([[-0.07892885,  1.03054864],
    -       [-1.11674174, -0.04430263]])
    +
    array([[-0.48204371, -1.6133627 ],
    +       [ 0.02495081,  0.20867737]])
     
    @@ -894,11 +909,11 @@

    Boolean slicing -
    array([[ 2.1515256 ,  0.0252963 , -0.50860192, -0.81510486],
    -       [-1.50438063,  1.34625813,  0.19001997, -2.75474839],
    -       [-1.68668132,  0.4919675 ,  0.46076492,  1.68898003],
    -       [ 2.05100384,  2.15532653,  0.63420939, -0.05512468],
    -       [ 0.16083873, -2.08108768,  0.47970436, -1.7483949 ]])
    +
    array([[ 1.69705017,  0.80812228, -0.66722951,  1.33247531],
    +       [-2.81200144,  0.89421787, -0.02931852, -1.05156439],
    +       [-0.14302032,  0.81352009, -0.07620839,  0.59158928],
    +       [ 2.03311889, -0.3202367 , -0.01237379, -1.41072045],
    +       [-0.56663455,  1.16679853, -1.34970156, -0.41449339]])
     
    @@ -911,11 +926,11 @@

    Boolean slicing - @@ -949,12 +964,12 @@

    Boolean slicing
    array([[ 7.        ,  7.        ,  7.        ,  7.        ],
    -       [ 2.1515256 ,  0.0252963 , -0.50860192, -0.81510486],
    +       [ 1.69705017,  0.80812228, -0.66722951,  1.33247531],
            [ 7.        ,  7.        ,  7.        ,  7.        ],
            [ 7.        ,  7.        ,  7.        ,  7.        ],
            [ 7.        ,  7.        ,  7.        ,  7.        ],
    -       [ 2.05100384,  2.15532653,  0.63420939, -0.05512468],
    -       [ 0.16083873, -2.08108768,  0.47970436, -1.7483949 ]])
    +       [ 2.03311889, -0.3202367 , -0.01237379, -1.41072045],
    +       [-0.56663455,  1.16679853, -1.34970156, -0.41449339]])
     

    @@ -1306,8 +1321,8 @@

    More useful calculations -
    0x7f6150364bd0
    -0x7f6150365110
    +
    0x7f73825a3450
    +0x7f735b82c030
     
    @@ -1586,7 +1601,7 @@

    More useful calculations -
    @@ -1463,7 +1478,7 @@

    An introduction to some attributes and methods - @@ -1340,7 +1355,7 @@

    Summarizing data -
    @@ -1337,7 +1353,7 @@

    Summarizing data - diff --git a/chapters/module-4/045-PandasIII-manipulation.html b/chapters/module-4/045-PandasIII-manipulation.html index c3512f9..6e8cc1c 100644 --- a/chapters/module-4/045-PandasIII-manipulation.html +++ b/chapters/module-4/045-PandasIII-manipulation.html @@ -32,9 +32,9 @@ - + - + @@ -61,6 +61,7 @@ + @@ -210,6 +211,20 @@
  • Introduction to Pandas
  • Pandas: Data Exploration
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    +

    @@ -3907,6 +3922,15 @@

    Practice exercisesPandas: Data Exploration

    + +
    +

    next

    +

    Pandas: Advanced Data Manipulation and Aggregation

    +
    + +

    diff --git a/chapters/module-4/045-PandasIII-manipulation_sols.html b/chapters/module-4/045-PandasIII-manipulation_sols.html index 339c22a..07c5271 100644 --- a/chapters/module-4/045-PandasIII-manipulation_sols.html +++ b/chapters/module-4/045-PandasIII-manipulation_sols.html @@ -32,9 +32,9 @@ - + - + @@ -217,12 +217,14 @@

    Module 5: R

    +

    Wrapping up

    +

    diff --git a/chapters/module-4/046-PandasIII-Merging_Concatenating_Aggregating.html b/chapters/module-4/046-PandasIII-Merging_Concatenating_Aggregating.html deleted file mode 100644 index 511e924..0000000 --- a/chapters/module-4/046-PandasIII-Merging_Concatenating_Aggregating.html +++ /dev/null @@ -1,1109 +0,0 @@ - - - - - - - - - - - Concatenating and Merging — DS-1002 Programming for Data Science - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - -
    -
    -
    -
    -
    - - - - -
    -
    - - - - - -
    - - - - - - - - - - - - - -
    - -
    - - - -
    - -
    -
    - -
    -
    - -
    - -
    - -
    - - -
    - -
    - -
    - - - - - - - - - - - - - - - - - - - -
    - -
    - -
    -
    - - - - - - - - -
    - -
    -
    -
    import pandas as pd
    -import numpy as np
    -
    -
    -
    -
    -
    -
    -
    iris_df = pd.read_csv("https://raw.githubusercontent.com/mwaskom/seaborn-data/refs/heads/master/iris.csv")
    -iris_df
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
    05.13.51.40.2setosa
    14.93.01.40.2setosa
    24.73.21.30.2setosa
    34.63.11.50.2setosa
    45.03.61.40.2setosa
    ..................
    1456.73.05.22.3virginica
    1466.32.55.01.9virginica
    1476.53.05.22.0virginica
    1486.23.45.42.3virginica
    1495.93.05.11.8virginica
    -

    150 rows × 5 columns

    -
    -
    -
    -

    Concatenating and Merging#

    -
    -

    Concate: pd.concat()#

    -

    Concatenate pandas objects along an axis

    -

    Details

    -

    Create two dfs and vertically stack them

    -
    -
    -
    df1 = pd.DataFrame(np.random.randn(3, 4))
    -df2 = pd.DataFrame(np.random.randn(3, 4))
    -
    -print(df1)
    -print('-'*45)
    -print(df2)
    -
    -df3 = pd.concat([df1, df2], axis=0)
    -
    -print('-'*45)
    -print(df3)
    -
    -
    -
    -
    -
              0         1         2         3
    -0 -0.974224 -0.361428 -1.260157 -0.425635
    -1  0.917031 -0.046927  1.048192  0.075938
    -2  0.624287 -0.835596 -2.225162 -2.354256
    ----------------------------------------------
    -          0         1         2         3
    -0 -0.367434 -2.306643 -1.030095 -0.373502
    -1 -0.179604 -1.704118  0.127096  0.098003
    -2  2.444379  0.584522 -0.991921 -0.355007
    ----------------------------------------------
    -          0         1         2         3
    -0 -0.974224 -0.361428 -1.260157 -0.425635
    -1  0.917031 -0.046927  1.048192  0.075938
    -2  0.624287 -0.835596 -2.225162 -2.354256
    -0 -0.367434 -2.306643 -1.030095 -0.373502
    -1 -0.179604 -1.704118  0.127096  0.098003
    -2  2.444379  0.584522 -0.991921 -0.355007
    -
    -
    -
    -
    -

    Concat columns
    -This assumes that the indexes represent IDs of specific things or events

    -
    -
    -
    df4 = pd.concat([df1,df2], axis = 1, keys = ['foo', 'bar'])
    -
    -df4
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    foobar
    01230123
    0-0.974224-0.361428-1.260157-0.425635-0.367434-2.306643-1.030095-0.373502
    10.917031-0.0469271.0481920.075938-0.179604-1.7041180.1270960.098003
    20.624287-0.835596-2.225162-2.3542562.4443790.584522-0.991921-0.355007
    -
    -
    -
    -
    -
    df4.foo
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    0123
    0-0.974224-0.361428-1.260157-0.425635
    10.917031-0.0469271.0481920.075938
    20.624287-0.835596-2.225162-2.354256
    -
    -
    -
    -
    -
    df4.bar
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    0123
    0-0.367434-2.306643-1.030095-0.373502
    1-0.179604-1.7041180.1270960.098003
    22.4443790.584522-0.991921-0.355007
    -
    -
    -
    -
    -

    merge: merge()#

    -

    SQL-style joining of tables (DataFrames)

    -

    Important parameters include:

    -
      -
    • how : type of merge {‘left’, ‘right’, ‘outer’, ‘inner’, ‘cross’}, default ‘inner’

    • -
    • on : names to join on

    • -
    -

    Details

    -

    Very useful!

    -

    Create two tables, left and right. Then right join them on key.
    -Right join means include all records from table on right.
    -The key is used for matching up the records.

    -
    -
    -
    left = pd.DataFrame({"key": ["jamie", "bill"], "lval": [15, 22]})
    -right = pd.DataFrame({"key": ["jamie", "bill", "asher"], "rval": [4, 5, 8]})
    -
    -joined = pd.merge(left, right, on="key", how="right")
    -
    -print('---left')
    -print(left)
    -print('\n---right')
    -print(right)
    -print('\n---joined')
    -print(joined)
    -
    -
    -
    -
    -
    ---left
    -     key  lval
    -0  jamie    15
    -1   bill    22
    -
    ----right
    -     key  rval
    -0  jamie     4
    -1   bill     5
    -2  asher     8
    -
    ----joined
    -     key  lval  rval
    -0  jamie  15.0     4
    -1   bill  22.0     5
    -2  asher   NaN     8
    -
    -
    -
    -
    -
    -
    -
    -

    Summary#

    -
      -
    • Use join if you have shared indexes

    • -
    • Use merge if you do not have shared indexes

    • -
    • Use concat to combine based on shared indexes or columns

    • -
    -
    -
    -

    Data Aggregation#

    -

    Involves one or more of:

    -
      -
    • splitting the data into groups

    • -
    • applying a function to each group

    • -
    • combining results

    • -
    -
    -

    Aggregation by .groupby()#

    -

    Compute mean of each column, grouped (separately) by species

    -
    -
    -
    iris_df.groupby("species").mean()
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    sepal_lengthsepal_widthpetal_lengthpetal_width
    species
    setosa5.0063.4281.4620.246
    versicolor5.9362.7704.2601.326
    virginica6.5882.9745.5522.026
    -
    -
    -
    -
    -

    pd.pivot_table()#

    -

    Apply a function aggfunc to selected values grouped by columns

    -

    Details

    -

    Compute mean sepal length for each species:

    -
    -
    -
    pd.pivot_table(iris_df, values="sepal_length", columns=["species"], aggfunc = np.mean)
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    speciessetosaversicolorvirginica
    sepal_length5.0065.9366.588
    -
    -
    -
    -
    -
    -

    Reshaping Data#

    -
    -
    -

    .reshape()#

    -

    Changes the object’s shape

    -

    We illustrate creating pandas Series, extracting array of length 6, and reshaping to 3x2 array.

    -
    -
    -
    # create a series
    -ser = pd.Series([1, 1, 2, 3, 5, 8])
    -
    -# extract values
    -vals = ser.values
    -
    -print('orig data:', vals)
    -print('orig type:', type(vals))
    -print('orig shape:', vals.shape)
    -
    -# reshaping series
    -reshaped_vals = vals.reshape((3, 2))
    -
    -print('\n reshaped vals:')
    -print(reshaped_vals)
    -print('\n new type:', type(reshaped_vals))
    -print('new shape:', reshaped_vals.shape)
    -
    -
    -
    -
    -
    orig data: [1 1 2 3 5 8]
    -orig type: <class 'numpy.ndarray'>
    -orig shape: (6,)
    -
    - reshaped vals:
    -[[1 1]
    - [2 3]
    - [5 8]]
    -
    - new type: <class 'numpy.ndarray'>
    -new shape: (3, 2)
    -
    -
    -
    -
    -
    - - - - -
    - - - - - - -
    - -
    -
    -
    - -
    - - - - - - -
    -
    - - -
    - - -
    -
    -
    - - - - - -
    -
    - - \ No newline at end of file diff --git a/chapters/module-4/046-PandasIV-advanced_manipulation_aggregation.html b/chapters/module-4/046-PandasIV-advanced_manipulation_aggregation.html index e5edf2f..7fb79a5 100644 --- a/chapters/module-4/046-PandasIV-advanced_manipulation_aggregation.html +++ b/chapters/module-4/046-PandasIV-advanced_manipulation_aggregation.html @@ -32,9 +32,9 @@ - + - + @@ -213,6 +213,18 @@
  • Pandas: Data Manipulation
  • Pandas: Advanced Data Manipulation and Aggregation
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    +

    @@ -564,22 +576,22 @@

    Concate: pd.con

              a         b         c         d
    -0  2.185435  1.002872 -0.029634  2.028856
    -1 -0.875013 -1.323426 -0.517671 -0.519281
    -2 -0.655456  0.708395 -0.419140  1.257233
    +0  0.174450 -1.018138  0.968461 -0.412483
    +1  0.703028 -0.594527  1.997723 -1.159000
    +2 -0.415667  0.290691  1.538168  0.236634
     ---------------------------------------------
               a         b         c         d
    -0 -0.640966 -2.015608 -0.241571 -0.303553
    -1 -1.782508 -0.317744 -0.998355 -0.939285
    -2  0.455360 -0.545225  0.459453  0.282877
    +0  1.141372  0.539766  0.924608 -1.013957
    +1  1.333616 -0.966171  1.258023  0.185296
    +2 -0.060995  0.330361 -0.710879 -0.408728
     ---------------------------------------------
               a         b         c         d
    -0  2.185435  1.002872 -0.029634  2.028856
    -1 -0.875013 -1.323426 -0.517671 -0.519281
    -2 -0.655456  0.708395 -0.419140  1.257233
    -0 -0.640966 -2.015608 -0.241571 -0.303553
    -1 -1.782508 -0.317744 -0.998355 -0.939285
    -2  0.455360 -0.545225  0.459453  0.282877
    +0  0.174450 -1.018138  0.968461 -0.412483
    +1  0.703028 -0.594527  1.997723 -1.159000
    +2 -0.415667  0.290691  1.538168  0.236634
    +0  1.141372  0.539766  0.924608 -1.013957
    +1  1.333616 -0.966171  1.258023  0.185296
    +2 -0.060995  0.330361 -0.710879 -0.408728
     
    @@ -632,33 +644,33 @@

    Concate: pd.con 0 - 0.189000 - -1.051835 - 0.675315 - 0.983315 - -0.667326 - -0.367171 - -0.650382 + 0.358929 + -0.851815 + 0.313507 + 0.727029 + 0.732533 + -1.176725 + 0.359086 1 - -0.819721 - 0.084818 - 0.254183 - 0.300219 - 1.210534 - 0.201252 - -0.409164 + 1.212873 + -1.549474 + 0.040366 + 0.525790 + 1.353637 + 1.343218 + -0.161630 2 - -0.911595 - -1.838310 - -0.582055 - -0.404169 - 1.912954 - 0.288270 - 1.105270 + -0.344516 + -0.645047 + -0.412381 + 0.107239 + -0.375055 + -0.723952 + 0.493891 diff --git a/chapters/module-4/047-PandasV-Intro_Feature_Engineering.html b/chapters/module-4/047-PandasV-Intro_Feature_Engineering.html index 79e5910..ae6ae5c 100644 --- a/chapters/module-4/047-PandasV-Intro_Feature_Engineering.html +++ b/chapters/module-4/047-PandasV-Intro_Feature_Engineering.html @@ -32,9 +32,9 @@ - + - + @@ -61,6 +61,7 @@ + @@ -212,6 +213,18 @@
  • Pandas: Data Manipulation
  • Pandas: Advanced Data Manipulation and Aggregation
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    +

    @@ -1411,6 +1424,15 @@

    Practice exercisesPandas: Advanced Data Manipulation and Aggregation

    + +
    +

    next

    +

    Introduction to R

    +
    + +

    diff --git a/chapters/module-4/07-numpy-continued.html b/chapters/module-4/07-numpy-continued.html index c5be5d4..5787685 100644 --- a/chapters/module-4/07-numpy-continued.html +++ b/chapters/module-4/07-numpy-continued.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    +

    diff --git a/chapters/module-4/Untitled.html b/chapters/module-4/Untitled.html index c6e16b2..25e9e49 100644 --- a/chapters/module-4/Untitled.html +++ b/chapters/module-4/Untitled.html @@ -210,6 +210,21 @@
  • NumPy (Part II)
  • Introduction to Pandas
  • Pandas: Data Exploration
  • +
  • Pandas: Data Manipulation
  • +
  • Pandas: Advanced Data Manipulation and Aggregation
  • +
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-4/Untitled1.html b/chapters/module-4/Untitled1.html index 1ada748..9e46511 100644 --- a/chapters/module-4/Untitled1.html +++ b/chapters/module-4/Untitled1.html @@ -32,9 +32,9 @@ - + - + @@ -213,6 +213,18 @@
  • Pandas: Data Manipulation
  • Pandas: Advanced Data Manipulation and Aggregation
  • Pandas: Introduction to Feature Engineering
  • + +

    Module 5: R

    + +

    Wrapping up

    + diff --git a/chapters/module-5/051-intro_to_R.html b/chapters/module-5/051-intro_to_R.html index a4d03f1..bbcc470 100644 --- a/chapters/module-5/051-intro_to_R.html +++ b/chapters/module-5/051-intro_to_R.html @@ -32,9 +32,9 @@ - + - + @@ -223,6 +223,10 @@
  • Control Structures
  • Functions
  • R for data science: Tidyverse
  • + +

    Wrapping up

    + @@ -424,7 +428,7 @@

    Introduction to R -../../_images/404f063734e2f5dcb1228730ff1f99d7066229bac488649789a0c8d01fc3ca2b.png +../../_images/267a46e09f7430ad3fccb6b619c25d6382d080de21e885f22ad6dcdbd24172b9.png

    The standard normal distribution is a special case of a Gaussian distribution with mean (average location) of 1 and a standard deviation (average dispersion) of 0. The gaussian distribution has a characteristic bell shape, as shown in the histogram below using the R’s hist function.

    @@ -435,7 +439,7 @@

    Introduction to R -../../_images/f51cf89b081544448e064cb8ce537e13c1baa630e0be650380df0813287266cf.png +../../_images/e56d5aba8799217f6afe138ed710ed222a315c174f283c71639551057f692abb.png
    diff --git a/chapters/module-5/052-data-structures.html b/chapters/module-5/052-data-structures.html index bea2ed5..85b0fef 100644 --- a/chapters/module-5/052-data-structures.html +++ b/chapters/module-5/052-data-structures.html @@ -32,9 +32,9 @@ - + - + @@ -222,7 +222,11 @@
  • Data Structures
  • Control Structures
  • Functions
  • -
  • R for data science
  • +
  • R for data science: Tidyverse
  • + +

    Wrapping up

    + diff --git a/chapters/module-5/053-Control-structures-sols.html b/chapters/module-5/053-Control-structures-sols.html index 76b3153..b56b4d2 100644 --- a/chapters/module-5/053-Control-structures-sols.html +++ b/chapters/module-5/053-Control-structures-sols.html @@ -32,9 +32,9 @@ - + - + @@ -219,12 +219,14 @@

    Module 5: R

    +

    Wrapping up

    + diff --git a/chapters/module-5/053-Control-structures.html b/chapters/module-5/053-Control-structures.html index d095339..41cd08c 100644 --- a/chapters/module-5/053-Control-structures.html +++ b/chapters/module-5/053-Control-structures.html @@ -32,9 +32,9 @@ - + - + @@ -223,6 +223,10 @@
  • Control Structures
  • Functions
  • R for data science: Tidyverse
  • + +

    Wrapping up

    + diff --git a/chapters/module-5/054-functions-sols.html b/chapters/module-5/054-functions-sols.html index a49ac95..2dd457c 100644 --- a/chapters/module-5/054-functions-sols.html +++ b/chapters/module-5/054-functions-sols.html @@ -32,9 +32,9 @@ - + - + @@ -219,12 +219,14 @@

    Module 5: R

    +

    Wrapping up

    + @@ -612,8 +614,8 @@

    Built-in functions -
    1. 3.44318044976882
    2. 10.9381169236683
    3. 18.8495873534953
    4. 2.41687744073499
    5. 9.08140659032006
    6. 13.8851224456932
    7. 6.25564070974601
    8. 4.19221253135156
    9. 14.8982453260319
    10. 15.849869591281
    -
    9.98102593620911
    10.0097617569942
    +
    1. 17.1064024290231
    2. 4.50870321766152
    3. 13.9520701862171
    4. 5.69629448075557
    5. 4.41933655917822
    6. 3.41442028590302
    7. 16.6392789808824
    8. 9.2228576498917
    9. -3.18074141775111
    10. 16.2434599266992
    +
    8.80220822984607
    7.45957606532364

    Function help#

    diff --git a/chapters/module-5/054-functions.html b/chapters/module-5/054-functions.html index dc4eb7d..126d3a2 100644 --- a/chapters/module-5/054-functions.html +++ b/chapters/module-5/054-functions.html @@ -32,9 +32,9 @@ - + - + @@ -223,6 +223,10 @@
  • Control Structures
  • Functions
  • R for data science: Tidyverse
  • + +

    Wrapping up

    + @@ -605,8 +609,8 @@

    Built-in functions -
    1. 13.1963451166444
    2. 8.72797219132438
    3. 13.1711611847993
    4. 8.81686471098759
    5. 5.77526507710081
    6. 12.9391842738982
    7. 16.3681944750152
    8. 10.6781215679532
    9. 10.4963780372093
    10. 4.00038680441802
    -
    10.416987343935
    10.5872498025813
    +
    1. 17.3154600272022
    2. 2.33314450866007
    3. 2.65690099102852
    4. 17.8482261024962
    5. -0.877821425385072
    6. 16.0673664447932
    7. 11.2335652420367
    8. 13.3946342021372
    9. 1.33792095135807
    10. 10.1419139756298
    +
    9.1451311019957
    10.6877396088333

    Function help#

    diff --git a/chapters/module-5/055-tidyverse.html b/chapters/module-5/055-tidyverse.html index 6ece696..d7d203d 100644 --- a/chapters/module-5/055-tidyverse.html +++ b/chapters/module-5/055-tidyverse.html @@ -32,9 +32,9 @@ - + - + @@ -63,6 +63,7 @@ + @@ -222,6 +223,10 @@
  • Control Structures
  • Functions
  • R for data science: Tidyverse
  • + +

    Wrapping up

    + @@ -424,7 +429,7 @@

    Loading the tidyverse
    -
    ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
    +
    ── Attaching core tidyverse packages ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
     ✔ dplyr     1.1.4     ✔ readr     2.1.5
     ✔ forcats   1.0.0     ✔ stringr   1.5.1
     ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
    @@ -432,7 +437,7 @@ 

    Loading the tidyverse✔ purrr 1.0.2

    -
    ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
    +
    ── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
     ✖ dplyr::filter() masks stats::filter()
     ✖ dplyr::lag()    masks stats::lag()
     ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
    @@ -1298,6 +1303,15 @@ 

    Practice exercisesFunctions

    +
    +
    +

    next

    +

    Looking Ahead

    +
    + +
    diff --git a/chapters/module-5/old/013-Control Structures.html b/chapters/module-5/old/013-Control Structures.html index 67e96d6..3dfb95c 100644 --- a/chapters/module-5/old/013-Control Structures.html +++ b/chapters/module-5/old/013-Control Structures.html @@ -32,9 +32,9 @@ - + - + @@ -217,12 +217,14 @@

    Module 5: R

    +

    Wrapping up

    +
    diff --git a/chapters/module-5/old/051-dataframes-in-r-student.html b/chapters/module-5/old/051-dataframes-in-r-student.html index 42dbc20..a597761 100644 --- a/chapters/module-5/old/051-dataframes-in-r-student.html +++ b/chapters/module-5/old/051-dataframes-in-r-student.html @@ -32,9 +32,9 @@ - + - + @@ -217,12 +217,14 @@

    Module 5: R

    +

    Wrapping up

    +
    diff --git a/chapters/module-5/old/051-dataframes-in-r.html b/chapters/module-5/old/051-dataframes-in-r.html index 18bc464..379a17b 100644 --- a/chapters/module-5/old/051-dataframes-in-r.html +++ b/chapters/module-5/old/051-dataframes-in-r.html @@ -32,9 +32,9 @@ - + - + @@ -219,12 +219,14 @@

    Module 5: R

    +

    Wrapping up

    +
    diff --git a/chapters/wrap-up.html b/chapters/wrap-up.html new file mode 100644 index 0000000..ef47b3b --- /dev/null +++ b/chapters/wrap-up.html @@ -0,0 +1,880 @@ + + + + + + + + + + + Wrapping up — DS-1002 Programming for Data Science + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    Wrapping up

    + +
    + +
    +
    + + + + +
    + +
    +

    Wrapping up#

    +

    Throughout this course, we have covered the most important foundational programming skills a future Data Scientist needs, with a particular emphasis on Python.

    +

    For both languages, we explored their syntax, different data types, and how to work with data structures. We also delved into implementing loops, functions, and even classes (which is uncommon in beginner programming courses). Additionally, we discussed basic data science operations in both languages, particularly focusing on how to inspect and interact with raw data.

    +

    Now, coming to the question of Python vs. R: which one should you choose? It’s entirely up to you—both are excellent tools, as we have emphasized throughout the course. Keep in mind that you can essentially achieve the same results in one language as in the other. For example, when it comes to data manipulation, see this comparison: Python vs R.

    +

    Here is my personal perspective though:

    +
      +
    • Python: Ideal for programmatic scenarios such as developing complex libraries, thanks to its versatility, simple syntax, and readability. Moreover, for machine learning and deep learning applications, Python remains the top choice.

    • +
    • R: Best suited for advanced statistical analysis, such as mixed linear modeling, factor analysis, mediation analysis, and Bayesian statistics. In addition, while I do not use it as often as I should, ggplot2 can produce exceptionally high-quality graphs—so be sure to consider this in the future!

    • +
    +
    +

    Looking Ahead#

    +

    There are certain things we have not covered in this course that a Data Scientist should likely master in the future. Here are some examples:

    +
    +

    Visualization#

    +

    Clear and effective visualization is crucial for communicating with data.

    +

    Here are a few examples:

    +
      +
    • Python: matplotlib, seaborn

    • +
    • R: ggplot2

    • +
    • Cross-platform: plotly, shiny

    • +
    +

    Matplotlib

    +
    +
    +
    import matplotlib.pyplot as plt
    +plt.style.use('classic')
    +%matplotlib inline
    +import numpy as np
    +import pandas as pd
    +
    +
    +
    +
    +
    +
    +
    # Create some data
    +rng = np.random.RandomState(0)              # creates a random range seeded from 0
    +x = np.linspace(0, 10, 500)                 # creates evenly spaced numbers of a specified interval
    +y = np.cumsum(rng.randn(500, 6), 0)         # creates the sum of random numbers within a range.
    +
    +
    +
    +
    +
    +
    +
    # Plot the data with Matplotlib defaults
    +plt.plot(x, y)
    +plt.legend('ABCDEF', ncol=3, loc='upper left');
    +
    +
    +
    +
    +../_images/49ed94f15827ce8ac14e383ab6e9d4653c651f6dfb2edba2708c8d0fc1abc493.png +
    +
    +

    Seaborn

    +
    +
    +
    import seaborn as sns
    +
    +
    +
    +
    +
    +
    +
    xy_df = pd.concat([pd.DataFrame({"x": x}), 
    +                pd.DataFrame(y, columns=["A", "B", "C", "D", "E", "F"])], axis=1)
    +xy_df = pd.melt(xy_df, id_vars=["x"], var_name="group", value_name="y")
    +xy_df
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    xgroupy
    00.00000A1.764052
    10.02004A2.714141
    20.04008A3.475178
    30.06012A3.788246
    40.08016A6.058001
    ............
    29959.91984F-10.465950
    29969.93988F-9.613061
    29979.95992F-9.165378
    29989.97996F-9.004272
    299910.00000F-9.084870
    +

    3000 rows × 3 columns

    +
    +
    +
    +
    +
    sns.set(style="whitegrid")
    +sns.lineplot(x="x", y="y", hue="group", data=xy_df)
    +plt.legend(ncol=3, loc='upper left')
    +
    +
    +
    +
    +
    <matplotlib.legend.Legend at 0x7fb2609bdb90>
    +
    +
    +../_images/8393299fa27a42e0b7e0f92dbf4b389608087a22bb19b8d8552621c98c9857b5.png +
    +
    +
    +
    +

    Analysis#

    +

    Hera are a few examples of basic libraries for data anaylis in Python and R, with a bit of predominance bias towards the former:

    +
      +
    • Statistics: scipy (Python), statsmodels (Python), Base R, lme4 (R), blme (R).

    • +
    • Machine lerning: scikit-learn (Python), caret (R), xgboost (cross-platform).

    • +
    • Deep lerning: keras (Python), pytorch (Python), tensorflow(Python).

    • +
    +

    scikit-learn

    +
    +
    +
    from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import cross_val_score
    +from sklearn.datasets import load_iris
    +
    +X, y = load_iris()["data"], load_iris()["target"]
    +clf = DecisionTreeClassifier()
    +
    +res = cross_val_score(clf, X, y, cv=5)
    +
    +print("the average accuracy in classifying the types of Iris using a decision tree and cross-validation is:", 
    +      res.mean())
    +
    +
    +
    +
    +
    the average accuracy in classifying the types of Iris using a decision tree and cross-validation is: 0.9600000000000002
    +
    +
    +
    +
    +

    scipy

    +
    +
    +
    # A two-sample t-test, adapted from https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html
    +import numpy as np
    +from scipy import stats
    +rng = np.random.RandomState(1234)
    +
    +rvs1 = stats.norm.rvs(loc=5, scale=5, size=500, random_state=rng)
    +rvs2 = stats.norm.rvs(loc=5.57, scale=5, size=500, random_state=rng)
    +stats.ttest_ind(rvs1, rvs2)
    +
    +
    +
    +
    +
    TtestResult(statistic=-2.0456709273958644, pvalue=0.04105049135941344, df=998.0)
    +
    +
    +
    +
    +

    statsmodels

    +
    +
    +
    # The same as above, but using a linear regression model 
    +# (tip for life: any almost basic stastical tests is just a particular instation of a linear regression model).
    +
    +import statsmodels.api as sm
    +
    +y=np.concatenate((rvs1, rvs2))
    +X=np.column_stack(([1]*len(y), 
    +                   [0]*len(rvs1) + [1]*len(rvs2)))
    +model = sm.OLS(endog=y, exog=X)
    +res = model.fit()
    +print(res.summary())
    +
    +
    +
    +
    +
                                OLS Regression Results                            
    +==============================================================================
    +Dep. Variable:                      y   R-squared:                       0.004
    +Model:                            OLS   Adj. R-squared:                  0.003
    +Method:                 Least Squares   F-statistic:                     4.185
    +Date:                Wed, 04 Dec 2024   Prob (F-statistic):             0.0411
    +Time:                        21:16:01   Log-Likelihood:                -3001.1
    +No. Observations:                1000   AIC:                             6006.
    +Df Residuals:                     998   BIC:                             6016.
    +Df Model:                           1                                         
    +Covariance Type:            nonrobust                                         
    +==============================================================================
    +                 coef    std err          t      P>|t|      [0.025      0.975]
    +------------------------------------------------------------------------------
    +const          5.0487      0.218     23.180      0.000       4.621       5.476
    +x1             0.6301      0.308      2.046      0.041       0.026       1.235
    +==============================================================================
    +Omnibus:                        0.183   Durbin-Watson:                   2.112
    +Prob(Omnibus):                  0.913   Jarque-Bera (JB):                0.129
    +Skew:                          -0.024   Prob(JB):                        0.938
    +Kurtosis:                       3.027   Cond. No.                         2.62
    +==============================================================================
    +
    +Notes:
    +[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
    +
    +
    +
    +
    +
    +
    +

    Command-Line Terminal Programming#

    +
      +
    • Programming that takes place in a terminal, which a text-based interface for interacting directly with the computer.

    • +
    • Commands in a terminal are interpreted by a shell. Common shells include Bash (popular on Linux and macOS), Zsh (modern and customizable), and PowerShell (Windows-specific).

    • +
    • Essential for managing files, running scripts, and interacting with compute clusters (e.g. SLURM).

    • +
    +

    In Jupyter notebooks, you can execute shell commands by prefixing them with !.

    +

    For example, we can navigate directories:

    +
    +
    +
    # Print the current directory
    +!pwd
    +
    +# List files in the directory
    +!ls
    +
    +
    +
    +
    +
    /home/javi/Documentos/docencia/DS-1002/DS1002-book/chapters
    +
    +
    +
    01-getting_started.md	module-1  module-4   wrap-up.ipynb
    +02-python-basics.ipynb	module-2  module-5
    +04-python-basics.ipynb	module-3  my_folder
    +
    +
    +
    +
    +

    We can also manage files and directories:

    +
    +
    +
    # Create a new folder and file
    +!mkdir -p my_folder # make new dir; -p option to not raise an error if it already existed
    +!rm -f my_folder/* # Remove preexisting content; -f option to not raise an error if the folder was already empty
    +!touch my_folder/hello_world.py # Create a new file named "hello world.py"
    +!echo "print('Hello, World!\nCode run from:', __file__)" > my_folder/hello_world.py # Add some a line of code to this file
    +
    +
    +
    +
    +
    +
    +
    # List contents of the folder
    +!ls my_folder
    +
    +
    +
    +
    +
    hello_world.py
    +
    +
    +
    +
    +

    And run scripts:

    +
    +
    +
    !python my_folder/hello_world.py
    +
    +
    +
    +
    +
    Hello, World!
    +Code run from: /home/javi/Documentos/docencia/DS-1002/DS1002-book/chapters/my_folder/hello_world.py
    +
    +
    +
    +
    +
    +
    +

    GitHub#

    +
      +
    • Web-based platform for version control and collaboration built on top of Git, a version control system.

    • +
    • It also has a powerful terminal programming where to easily interact and change your repositories.

    • +
    • Allows you to track changes, collaborate with others, and share your work.

    • +
    +

    Common Use Cases:

    +
      +
    • Code Management: Store and version codebases for projects/libraries.

    • +
    • Team Collaboration: Coordinated team efforts on software development or data science projects.

    • +
    • Portfolio Hosting: Showcase projects and skills for personal branding.

    • +
    • Open Source Contribution: Contribute to or learn from public repositories.

    • +
    • Documentation: Use GitHub Pages to create project websites or host documentation.

    • +
    +

    A few personal examples:

    + +
    +
    +
    + + + + +
    + + + + + + +
    + +
    +
    +
    + +
    + + + + + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/epilogue.html b/epilogue.html new file mode 100644 index 0000000..b868941 --- /dev/null +++ b/epilogue.html @@ -0,0 +1,887 @@ + + + + + + + + + + + Wrapping up — DS-1002 Programming for Data Science + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + +
    +
    +
    +
    +
    + + + + +
    +
    + + + +
    + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + + +
    +

    Wrapping up

    + +
    + +
    +
    + + + + +
    + +
    +

    Wrapping up#

    +

    Throughout this course, we have covered the most important foundational programming skills a future Data Scientist needs, with a particular emphasis on Python.

    +

    For both languages, we explored their syntax, different data types, and how to work with data structures. We also delved into implementing loops, functions, and even classes (which is uncommon in beginner programming courses). Additionally, we discussed basic data science operations in both languages, particularly focusing on how to inspect and interact with raw data.

    +

    Now, coming to the question of Python vs. R: which one should you choose? It’s entirely up to you—both are excellent tools, as we have emphasized throughout the course. Keep in mind that you can essentially achieve the same results in one language as in the other. For example, when it comes to data manipulation, see this comparison: Python vs R.

    +

    Here is my personal perspective though:

    +
      +
    • Python: Ideal for programmatic scenarios such as developing complex libraries, thanks to its versatility, simple syntax, and readability. Moreover, for machine learning and deep learning applications, Python remains the top choice.

    • +
    • R: Best suited for advanced statistical analysis, such as mixed linear modeling, factor analysis, mediation analysis, and Bayesian statistics. In addition, while I do not use it as often as I should, ggplot2 can produce exceptionally high-quality graphs—so be sure to consider this in the future!

    • +
    +
    +

    Looking Ahead#

    +

    There are certain things we have not covered in this course that a Data Scientist should likely master in the future. Here are some examples:

    +
    +

    Visualization#

    +

    Clear and effective visualization is crucial for communicating with data.

    +

    Here are a few examples:

    +
      +
    • Python: matplotlib, seaborn

    • +
    • R: ggplot2

    • +
    • Cross-platform: plotly, shiny

    • +
    +

    Matplotlib

    +
    +
    +
    import matplotlib.pyplot as plt
    +plt.style.use('classic')
    +%matplotlib inline
    +import numpy as np
    +import pandas as pd
    +
    +
    +
    +
    +
    +
    +
    # Create some data
    +rng = np.random.RandomState(0)              # creates a random range seeded from 0
    +x = np.linspace(0, 10, 500)                 # creates evenly spaced numbers of a specified interval
    +y = np.cumsum(rng.randn(500, 6), 0)         # creates the sum of random numbers within a range.
    +
    +
    +
    +
    +
    +
    +
    # Plot the data with Matplotlib defaults
    +plt.plot(x, y)
    +plt.legend('ABCDEF', ncol=3, loc='upper left');
    +
    +
    +
    +
    +_images/49ed94f15827ce8ac14e383ab6e9d4653c651f6dfb2edba2708c8d0fc1abc493.png +
    +
    +

    Seaborn

    +
    +
    +
    import seaborn as sns
    +
    +
    +
    +
    +
    +
    +
    xy_df = pd.concat([pd.DataFrame({"x": x}), 
    +                pd.DataFrame(y, columns=["A", "B", "C", "D", "E", "F"])], axis=1)
    +xy_df = pd.melt(xy_df, id_vars=["x"], var_name="group", value_name="y")
    +xy_df
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    xgroupy
    00.00000A1.764052
    10.02004A2.714141
    20.04008A3.475178
    30.06012A3.788246
    40.08016A6.058001
    ............
    29959.91984F-10.465950
    29969.93988F-9.613061
    29979.95992F-9.165378
    29989.97996F-9.004272
    299910.00000F-9.084870
    +

    3000 rows × 3 columns

    +
    +
    +
    +
    +
    sns.set(style="whitegrid")
    +sns.lineplot(x="x", y="y", hue="group", data=xy_df)
    +plt.legend(ncol=3, loc='upper left')
    +
    +
    +
    +
    +
    <matplotlib.legend.Legend at 0x7fcffd3316d0>
    +
    +
    +_images/8393299fa27a42e0b7e0f92dbf4b389608087a22bb19b8d8552621c98c9857b5.png +
    +
    +
    +
    +

    Analysis#

    +

    Hera are a few examples of basic libraries for data anaylis in Python and R, with a bit of predominance bias towards the former:

    +
      +
    • Statistics: scipy (Python), statsmodels (Python), Base R, lme4 (R), blme (R).

    • +
    • Machine lerning: scikit-learn (Python), caret (R), xgboost (cross-platform).

    • +
    • Deep lerning: keras (Python), pytorch (Python), tensorflow(Python).

    • +
    +

    scikit-learn

    +
    +
    +
    from sklearn.tree import DecisionTreeClassifier
    +from sklearn.model_selection import cross_val_score
    +from sklearn.datasets import load_iris
    +
    +X, y = load_iris()["data"], load_iris()["target"]
    +clf = DecisionTreeClassifier()
    +
    +res = cross_val_score(clf, X, y, cv=5)
    +
    +print("the average accuracy in classifying the types of Iris using a decision tree and cross-validation is:", 
    +      res.mean())
    +
    +
    +
    +
    +
    the average accuracy in classifying the types of Iris using a decision tree and cross-validation is: 0.9666666666666668
    +
    +
    +
    +
    +

    scipy

    +
    +
    +
    # A two-sample t-test, adapted from https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html
    +import numpy as np
    +from scipy import stats
    +rng = np.random.RandomState(1234)
    +
    +rvs1 = stats.norm.rvs(loc=5, scale=5, size=500, random_state=rng)
    +rvs2 = stats.norm.rvs(loc=5.57, scale=5, size=500, random_state=rng)
    +stats.ttest_ind(rvs1, rvs2)
    +
    +
    +
    +
    +
    TtestResult(statistic=-2.0456709273958644, pvalue=0.04105049135941344, df=998.0)
    +
    +
    +
    +
    +

    statsmodels

    +
    +
    +
    # The same as above, but using a linear regression model 
    +# (tip for life: any almost basic stastical tests is just a particular instation of a linear regression model).
    +
    +import statsmodels.api as sm
    +
    +y=np.concatenate((rvs1, rvs2))
    +X=np.column_stack(([1]*len(y), 
    +                   [0]*len(rvs1) + [1]*len(rvs2)))
    +model = sm.OLS(endog=y, exog=X)
    +res = model.fit()
    +print(res.summary())
    +
    +
    +
    +
    +
                                OLS Regression Results                            
    +==============================================================================
    +Dep. Variable:                      y   R-squared:                       0.004
    +Model:                            OLS   Adj. R-squared:                  0.003
    +Method:                 Least Squares   F-statistic:                     4.185
    +Date:                Wed, 04 Dec 2024   Prob (F-statistic):             0.0411
    +Time:                        21:16:04   Log-Likelihood:                -3001.1
    +No. Observations:                1000   AIC:                             6006.
    +Df Residuals:                     998   BIC:                             6016.
    +Df Model:                           1                                         
    +Covariance Type:            nonrobust                                         
    +==============================================================================
    +                 coef    std err          t      P>|t|      [0.025      0.975]
    +------------------------------------------------------------------------------
    +const          5.0487      0.218     23.180      0.000       4.621       5.476
    +x1             0.6301      0.308      2.046      0.041       0.026       1.235
    +==============================================================================
    +Omnibus:                        0.183   Durbin-Watson:                   2.112
    +Prob(Omnibus):                  0.913   Jarque-Bera (JB):                0.129
    +Skew:                          -0.024   Prob(JB):                        0.938
    +Kurtosis:                       3.027   Cond. No.                         2.62
    +==============================================================================
    +
    +Notes:
    +[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
    +
    +
    +
    +
    +
    +
    +

    Command-Line Terminal Programming#

    +
      +
    • Programming that takes place in a terminal, which a text-based interface for interacting directly with the computer.

    • +
    • Commands in a terminal are interpreted by a shell. Common shells include Bash (popular on Linux and macOS), Zsh (modern and customizable), and PowerShell (Windows-specific).

    • +
    • Essential for managing files, running scripts, and interacting with compute clusters (e.g. SLURM).

    • +
    +

    In Jupyter notebooks, you can execute shell commands by prefixing them with !.

    +

    For example, we can navigate directories:

    +
    +
    +
    # Print the current directory
    +!pwd
    +
    +# List files in the directory
    +!ls
    +
    +
    +
    +
    +
    /home/javi/Documentos/docencia/DS-1002/DS1002-book
    +
    +
    +
    06_numpy_intro.ipynb  _build	_config.yml  epilogue.ipynb  index.md
    +admonition	      chapters	data	     imgs	     _toc.yml
    +
    +
    +
    +
    +

    We can also manage files and directories:

    +
    +
    +
    # Create a new folder and file
    +!mkdir -p my_folder # make new dir; -p option to not raise an error if it already existed
    +!rm -f my_folder/* # Remove preexisting content; -f option to not raise an error if the folder was already empty
    +!touch my_folder/hello_world.py # Create a new file named "hello world.py"
    +!echo "print('Hello, World!\nCode run from:', __file__)" > my_folder/hello_world.py # Add some a line of code to this file
    +
    +
    +
    +
    +
    +
    +
    # List contents of the folder
    +!ls my_folder
    +
    +
    +
    +
    +
    hello_world.py
    +
    +
    +
    +
    +

    And run scripts:

    +
    +
    +
    !python my_folder/hello_world.py
    +
    +
    +
    +
    +
    Hello, World!
    +Code run from: /home/javi/Documentos/docencia/DS-1002/DS1002-book/my_folder/hello_world.py
    +
    +
    +
    +
    +
    +
    +

    GitHub#

    +
      +
    • Web-based platform for version control and collaboration built on top of Git, a version control system.

    • +
    • It also has a powerful terminal programming where to easily interact and change your repositories.

    • +
    • Allows you to track changes, collaborate with others, and share your work.

    • +
    +

    Common Use Cases:

    +
      +
    • Code Management: Store and version codebases for projects/libraries.

    • +
    • Team Collaboration: Coordinated team efforts on software development or data science projects.

    • +
    • Portfolio Hosting: Showcase projects and skills for personal branding.

    • +
    • Open Source Contribution: Contribute to or learn from public repositories.

    • +
    • Documentation: Use GitHub Pages to create project websites or host documentation.

    • +
    +

    A few personal examples:

    + +
    +
    +
    + + + + +
    + + + + + + + + +
    + + + + + + +
    +
    + + +
    + + +
    +
    +
    + + + + + +
    +
    + + \ No newline at end of file diff --git a/genindex.html b/genindex.html index 5491a8b..9a2bdfb 100644 --- a/genindex.html +++ b/genindex.html @@ -220,6 +220,10 @@
  • Control Structures
  • Functions
  • R for data science: Tidyverse
  • + +

    Epilogue

    +
    diff --git a/index.html b/index.html index 9787bf9..6812427 100644 --- a/index.html +++ b/index.html @@ -224,6 +224,10 @@
  • Control Structures
  • Functions
  • R for data science: Tidyverse
  • + +

    Epilogue

    +
    @@ -396,6 +400,8 @@

    Welcome to DS-1002 +
    +