From 855c10a724b480b8f75462b90a1a7eb5a0be73c6 Mon Sep 17 00:00:00 2001 From: Yatharth Date: Fri, 24 May 2024 22:37:19 +0530 Subject: [PATCH 01/68] time space complexity --- contrib/ds-algorithms/index.md | 1 + .../ds-algorithms/time-space-complexity.md | 227 ++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 contrib/ds-algorithms/time-space-complexity.md diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 5b52155..9a0d556 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -1,4 +1,5 @@ # List of sections - [Section title](filename.md) +- [Time and Space Complexity](time-space-complexity.md) - [Sorting Algorithms](sorting-algorithms.md) diff --git a/contrib/ds-algorithms/time-space-complexity.md b/contrib/ds-algorithms/time-space-complexity.md new file mode 100644 index 0000000..79a072f --- /dev/null +++ b/contrib/ds-algorithms/time-space-complexity.md @@ -0,0 +1,227 @@ +# Time and Space Complexity + +We can solve a problem using one or more algorithms. It's essential to learn how to compare the performance of different algorithms and select the best one for a specific task. +Therefore, it is highly required to use a method to compare the solutions in order to judge which one is more optimal.
The method must be: + +- Regardless of the system or its settings on which the algorithm is executing. +- Demonstrate a direct relationship with the quantity of inputs. +- Able to discriminate between two methods with clarity and precision. + +Two such methods use to analyze algorithms are `time complexity` and `space complexity`. + +## What is Time Complexity? + +The _number of operations an algorithm performs in proportion to the quantity of the input_ is measured by time complexity. It facilitates our investigation of how the performance of the algorithm scales with increasing input size. But in real life, **_time complexity does not refer to the time taken by the machine to execute a particular code_**. + +## Order of Growth and Asymptotic Notations + +The Order of Growth explains how an algorithm's space or running time expands as the amount of the input does. This increase is described via asymptotic language, such Big O notation, which concentrates on the dominating term as the input size approaches infinity and is independent of lower-order terms and machine-specific constants. + +### Common Asymptotic Notation + +1. `Big Oh (O)`: Provides the worst-case scenario for describing the upper bound of an algorithm's execution time. +2. `Big Omega (Ω)`: Provides the best-case scenario and describes the lower bound. +3. `Big Theta (Θ)`: Gives a tight constraint on the running time by describing both the upper and lower bounds. + +### 1. Big Oh (O) Notation + +Big O notation describes how an algorithm behaves as the input size gets closer to infinity and provides an upper bound on the time or space complexity of the method. It helps developers and computer scientists to evaluate the effectiveness of various algorithms without regard to the software or hardware environment. + +To denote asymptotic upper bound, we use O-notation. For a given function `g(n)`, we denote by `O(g(n))` (pronounced "big-oh of g of n") the set of functions: + +$$ +O(g(n)) = \{ f(n) : \exists \text{ positive constants } c \text{ and } n_0 \text{ such that } 0 \leq f(n) \leq c \cdot g(n) \text{ for all } n \geq n_0 \} +$$ + +Graphical representation of Big Oh: + +![BigOh Notation Graph](./images/Time-And-Space-Complexity-BigOh.png) + +Image Credit: www.programiz.com + +### 2. Big Omega (Ω) Notation + +Big Omega (Ω) notation is used to describe the lower bound of an algorithm's running time. It provides a way to express the minimum time complexity that an algorithm will take to complete. In other words, Big Omega gives us a guarantee that the algorithm will take at least a certain amount of time to run, regardless of other factors. + +To denote asymptotic lower bound, we use Omega-notation. For a given function `g(n)`, we denote by `Ω(g(n))` (pronounced "big-omega of g of n") the set of functions: + +$$ +\Omega(g(n)) = \{ f(n) : \exists \text{ positive constants } c \text{ and } n_0 \text{ such that } 0 \leq c \cdot g(n) \leq f(n) \text{ for all } n \geq n_0 \} +$$ + +Graphical representation of Big Omega: + +![BigOmega Notation Graph](./images/Time-And-Space-Complexity-BigOmega.png) + +Image Credit: www.programiz.com + +### 3. Big Theta (Θ) Notation + +Big Theta (Θ) notation provides a way to describe the asymptotic tight bound of an algorithm's running time. It offers a precise measure of the time complexity by establishing both an upper and lower bound, indicating that the running time of an algorithm grows at the same rate as a given function, up to constant factors. + +To denote asymptotic tight bound, we use Theta-notation. For a given function `g(n)`, we denote by `Θ(g(n))` (pronounced "big-theta of g of n") the set of functions: + +$$ +\Theta(g(n)) = \{ f(n) : \exists \text{ positive constants } c_1, c_2, \text{ and } n_0 \text{ such that } 0 \leq c_1 \cdot g(n) \leq f(n) \leq c_2 \cdot g(n) \text{ for all } n \geq n_0 \} +$$ + +Graphical representation of Big Theta: + +![Big Theta Notation Graph](./images/Time-And-Space-Complexity-BigTheta.png) + + +Image Credit: www.programiz.com + + +## Best Case, Worst Case and Average Case +### 1. Best-Case Scenario: +The best-case scenario refers to the situation where an algorithm performs optimally, achieving the lowest possible time or space complexity. It represents the most favorable conditions under which an algorithm operates. + +#### Characteristics: +- Represents the minimum time or space required by an algorithm to solve a problem. +- Occurs when the input data is structured in such a way that the algorithm can exploit its strengths fully. +- Often used to analyze the lower bound of an algorithm's performance. + +#### Example: +Consider the `linear search algorithm` where we're searching for a `target element` in an array. The best-case scenario occurs when the target element is found `at the very beginning of the array`. In this case, the algorithm would only need to make one comparison, resulting in a time complexity of O(1). + + +### 2. Worst-Case Scenario: +The worst-case scenario refers to the situation where an algorithm performs at its poorest, achieving the highest possible time or space complexity. It represents the most unfavorable conditions under which an algorithm operates. + +#### Characteristics: +- Represents the maximum time or space required by an algorithm to solve a problem. +- Occurs when the input data is structured in such a way that the algorithm encounters the most challenging conditions. +- Often used to analyze the upper bound of an algorithm's performance. + +#### Example: +Continuing with the `linear search algorithm`, the worst-case scenario occurs when the `target element` is either not present in the array or located `at the very end`. In this case, the algorithm would need to iterate through the entire array, resulting in a time complexity of O(n), where n is the size of the array. + + +### 3. Average-Case Scenario: +The average-case scenario refers to the expected performance of an algorithm over all possible inputs, typically calculated as the arithmetic mean of the time or space complexity. + +#### Characteristics: +- Represents the typical performance of an algorithm across a range of input data. +- Takes into account the distribution of inputs and their likelihood of occurrence. +- Provides a more realistic measure of an algorithm's performance compared to the best-case or worst-case scenarios. + +#### Example: +- For the `linear search algorithm`, the average-case scenario considers the probability distribution of the target element's position within the array. If the `target element is equally likely to be found at any position in the array`, the average-case time complexity would be O(n/2), as the algorithm would, on average, need to search halfway through the array. + + +## Space Complexity +The memory space that a code utilizes as it is being run is often referred to as space complexity. Additionally, space complexity depends on the machine, therefore rather than using the typical memory units like MB, GB, etc., we will express space complexity using the Big O notation. + +#### Examples of Space Complexity +1. `Constant Space Complexity (O(1))`: Algorithms that operate on a fixed-size array or use a constant number of variables have O(1) space complexity. + +2. `Linear Space Complexity (O(n))`: Algorithms that store each element of the input array in a separate variable or data structure have O(n) space complexity. + +3. `Quadratic Space Complexity (O(n^2))`: Algorithms that create a two-dimensional array or matrix with dimensions based on the input size have O(n^2) space complexity. + + +#### Analyzing Space Complexity +To analyze space complexity: + +- Identify the variables, data structures, and recursive calls used by the algorithm. +- Determine how the space requirements scale with the input size. +- Express the space complexity using Big O notation, considering the dominant terms that contribute most to the overall space usage. + +## Examples to calculate time and space complexity + +#### 1. Print all elements of given array : +Consider each line takes one unit of time to run. So, to simply iterate over an array to print all elements it will take `O(n)` time, where n is the size of array. +Code: +```python +arr = [1,2,3,4] #1 +for x in arr: #2 + print(x) #3 +``` +Here, the 1st statement executes only once. So, it takes one unit of time to run. The for loop consisting of 2nd and 3rd statements executes 4 times. +Also, as the code dosen't take any additional space except the input arr its Space Complexity is O(1) constant. + +#### 2. Linear Search +Linear search is a simple algorithm for finding an element in an array by sequentially checking each element until a match is found or the end of the array is reached. Here's an example of calculating the time and space complexity of linear search: + +```python +def linear_search(arr, target): + for x in arr: # n iterations in worst case + if x == target: # 1 + return True # 1 + return False # If element not found + +# Example usage +arr = [1, 3, 5, 7, 9] +target = 5 +print(linear_search(arr, target)) +``` +`Time Complexity Analysis:` +The for loop iterates through the entire array, which takes O(n) time in the worst case, where n is the size of the array. +Inside the loop, each operation takes constant time (O(1)). +Therefore, the time complexity of linear search is `O(n)`. + + +`Space Complexity Analysis:` +The space complexity of linear search is `O(1)` since it only uses a constant amount of additional space for variables regardless of the input size. + + +#### 3. Binary Search +Binary search is an efficient algorithm for finding an element in a sorted array by repeatedly dividing the search interval in half. Here's an example of calculating the time and space complexity of binary search: + +```python +def binary_search(arr, target): + left = 0 # 1 + right = len(arr) - 1 # 1 + + while left <= right: # log(n) iterations in worst case + mid = (left + right) // 2 # log(n) + + if arr[mid] == target: # 1 + return mid # 1 + elif arr[mid] < target: # 1 + left = mid + 1 # 1 + else: + right = mid - 1 # 1 + + return -1 # If element not found + +# Example usage +arr = [1, 3, 5, 7, 9] +target = 5 +print(binary_search(arr, target)) + +``` +`Time Complexity Analysis:` +The initialization of left and right takes constant time (O(1)). +The while loop runs for log(n) iterations in the worst case, where n is the size of the array. +Inside the loop, each operation takes constant time (O(1)). +Therefore, the time complexity of binary search is `O(log n)`. + +`Space Complexity Analysis:` +The space complexity of binary search is `O(1)` since it only uses a constant amount of additional space for variables regardless of the input size. + +#### 4. Fibbonaci Sequence +Let's consider an example of a function that generates Fibonacci numbers up to a given index and stores them in a list. In this case, the space complexity will not be constant because the size of the list grows with the Fibonacci sequence. + +```python +def fibonacci_sequence(n): + fib_list = [0, 1] # Initial Fibonacci sequence with first two numbers + + while len(fib_list) < n: # O(n) iterations in worst case + next_fib = fib_list[-1] + fib_list[-2] # Calculating next Fibonacci number + fib_list.append(next_fib) # Appending next Fibonacci number to list + + return fib_list + +# Example usage +n = 10 +fib_sequence = fibonacci_sequence(n) +print(fib_sequence) +``` +`Time Complexity Analysis:` +The while loop iterates until the length of the Fibonacci sequence list reaches n, so it takes `O(n)` iterations in the `worst case`.Inside the loop, each operation takes constant time (O(1)). + +`Space Complexity Analysis:` +The space complexity of this function is not constant because it creates and stores a list of Fibonacci numbers. +As n grows, the size of the list also grows, so the space complexity is O(n), where n is the index of the last Fibonacci number generated. \ No newline at end of file From 34e349e9f30329c5f0dea478ca41ede8f2bcbc9a Mon Sep 17 00:00:00 2001 From: Yatharth Date: Fri, 24 May 2024 22:40:06 +0530 Subject: [PATCH 02/68] graph images added --- .../images/Time-And-Space-Complexity-BigOh.png | Bin 0 -> 17286 bytes .../Time-And-Space-Complexity-BigOmega.png | Bin 0 -> 15822 bytes .../Time-And-Space-Complexity-BigTheta.png | Bin 0 -> 21022 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/ds-algorithms/images/Time-And-Space-Complexity-BigOh.png create mode 100644 contrib/ds-algorithms/images/Time-And-Space-Complexity-BigOmega.png create mode 100644 contrib/ds-algorithms/images/Time-And-Space-Complexity-BigTheta.png diff --git a/contrib/ds-algorithms/images/Time-And-Space-Complexity-BigOh.png b/contrib/ds-algorithms/images/Time-And-Space-Complexity-BigOh.png new file mode 100644 index 0000000000000000000000000000000000000000..510b4d8117ba9b945e8a18038861fc6256dda749 GIT binary patch literal 17286 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 Z&ui$-5@*Z6^P;ZvjG$c@YnQk`q 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/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 IYPlr-ALFsiXaE2J literal 0 HcmV?d00001 From 6db3d06e0f50d1c7bf28b43d6149c39ddff818d3 Mon Sep 17 00:00:00 2001 From: Yatharth Date: Fri, 24 May 2024 22:46:22 +0530 Subject: [PATCH 03/68] graph queues in index --- contrib/ds-algorithms/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 6569868..4f458f7 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -2,6 +2,8 @@ - [Section title](filename.md) - [Time Space Complexity](time-space-complexity.md) +- [Queues in Python](Queues.md) +- [Graphs](graph.md) - [Sorting Algorithms](sorting-algorithms.md) - [Recursion and Backtracking](recursion.md) - [Divide and Conquer Algorithm](divide-and-conquer-algorithm.md) From 485c508e4dbe68bde1a3842ca6f030f0e2c072f1 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 25 May 2024 12:03:10 +0530 Subject: [PATCH 04/68] Created datetime_with_pandas --- contrib/pandas/datetime_with_pandas.md | 117 +++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 contrib/pandas/datetime_with_pandas.md diff --git a/contrib/pandas/datetime_with_pandas.md b/contrib/pandas/datetime_with_pandas.md new file mode 100644 index 0000000..7b8c720 --- /dev/null +++ b/contrib/pandas/datetime_with_pandas.md @@ -0,0 +1,117 @@ +# Pandas DateTime + +Pandas is a robust Python library that is available as free source. The Pandas library is used to manipulate and analyse data. Pandas are made up of data structures and functions that allow for efficient data processing. + +While working with data, it is common to come across time series data. Pandas is a very handy tool for dealing with time series data. Pandas is a strong Python data analysis toolkit that provides a wide range of date and time data processing options. Many data science jobs require working with time series data, time zones, and date arithmetic, and pandas simplifies these processes. + +Features of Pandas `Data_Time`: + +- **Parsing dates and times**: Pandas provides a number of functions for parsing dates and times from strings, including `to_datetime()` and `parse_dates()`. These functions can handle a variety of date and time formats, Unix timestamps, and human-readable formats. + +- **Manipulating dates and times**: Pandas provides a number of functions for manipulating dates and times, including `shift()`, `resample()`, and `to_timedelta()`. These functions can be used to add or subtract time periods, change the frequency of a time series, and calculate the difference between two dates or times. + +- **Visualizing dates and times**: Pandas provides a number of functions for visualizing dates and times, including `plot()`, `hist()`, and `bar()`. These functions can be used to create line charts, histograms, and bar charts of date and time data. + + + +### Installation of libraries + +`pip install pandas` + +- **Note**: There is no need to install a seperate library for date_time operations, pandas module itself has built-in functions. + +Example for retrieving day, month and year from given date: + +```python +import pandas as pd + +ts = pd.Timestamp('2024-05-05') +y = ts.year +print('Year is: ', y) +m = ts.month +print('Month is: ', m) +d = ts.day +print('Day is: ', d) +``` + +Output: +```python +Year is: 2024 +Month is: 5 +Day is: 5 +``` + +- **Note**: The timestamp function in Pandas is used to convert a datetime object to a Unix timestamp. A Unix timestamp is a numerical representation of datetime. + + +Example for extracting time related data from given date: + +```python +import pandas as pd + +ts = pd.Timestamp('2024-10-24 12:00:00') +print('Hour is: ', ts.hour) +print('Minute is: ', ts.minute) +print('Weekday is: ', ts.weekday()) +print('Quarter is: ', ts.quarter) +``` + +Output: +```python +Hour is: 12 +Minute is: 0 +Weekday is: 1 +Quarter is: 4 +``` + +Example for getting current date and time: + +```python +import pandas as pd + +ts = pd.Timestamp.now() +print('Current date and time is: ', ts) +``` + +Output: +```python +Current date and time is: 2024-05-25 11:48:25.593213 +``` + +Example for generating dates' for next five days: + +```python +import pandas as pd + +ts = pd.date_range(start = pd.Timestamp.now(), periods = 5) +for i in ts: + print(i.date()) +``` + +Output: +```python +2024-05-25 +2024-05-26 +2024-05-27 +2024-05-28 +2024-05-29 +``` + +Example for generating dates' for previous five days: + +```python +import pandas as pd + +ts = pd.date_range(end = pd.Timestamp.now(), periods = 5) +for i in ts: + print(i.date()) +``` + +Output: +```python +2024-05-21 +2024-05-22 +2024-05-23 +2024-05-24 +2024-05-25 +``` \ No newline at end of file From e140e97690b7c06e9e3e31401c72a25b85995865 Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Sat, 25 May 2024 12:06:37 +0530 Subject: [PATCH 05/68] Update index.md --- contrib/pandas/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 834d1f4..9a7a103 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -2,3 +2,4 @@ - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) - [Excel using Pandas DataFrame](excel_with_pandas.md) +- [Working with datetime using Pandas](datetime_with_pandas.md) From 1744d12d8e160aa480399af7f354b077bb8797ae Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Sat, 25 May 2024 12:15:49 +0530 Subject: [PATCH 06/68] Update datetime_with_pandas.md --- contrib/pandas/datetime_with_pandas.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/pandas/datetime_with_pandas.md b/contrib/pandas/datetime_with_pandas.md index 7b8c720..796df4a 100644 --- a/contrib/pandas/datetime_with_pandas.md +++ b/contrib/pandas/datetime_with_pandas.md @@ -4,7 +4,7 @@ Pandas is a robust Python library that is available as free source. The Pandas l While working with data, it is common to come across time series data. Pandas is a very handy tool for dealing with time series data. Pandas is a strong Python data analysis toolkit that provides a wide range of date and time data processing options. Many data science jobs require working with time series data, time zones, and date arithmetic, and pandas simplifies these processes. -Features of Pandas `Data_Time`: +Features of Pandas `Date_Time`: - **Parsing dates and times**: Pandas provides a number of functions for parsing dates and times from strings, including `to_datetime()` and `parse_dates()`. These functions can handle a variety of date and time formats, Unix timestamps, and human-readable formats. @@ -114,4 +114,4 @@ Output: 2024-05-23 2024-05-24 2024-05-25 -``` \ No newline at end of file +``` From d0e9b353f7aaaeecf87096aae77c6a560755ddd0 Mon Sep 17 00:00:00 2001 From: srilekha279 <158455553+srilekha279@users.noreply.github.com> Date: Sat, 25 May 2024 21:17:23 +0530 Subject: [PATCH 07/68] Updated recursion.md with example to explain the working of recursion with simple python program This commit updates the recursion explanation in the recursion.md file to be more beginner-friendly and comprehensive. The factorial example has been revised with n = 4 and stack variables have been included for each recursive call to demonstrate how functions are called and how values are returned. These changes aim to provide a clearer understanding of recursion, especially for beginners, by illustrating the step-by-step process of function calls and return values. --- contrib/ds-algorithms/recursion.md | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/contrib/ds-algorithms/recursion.md b/contrib/ds-algorithms/recursion.md index 7ab3136..67c630b 100644 --- a/contrib/ds-algorithms/recursion.md +++ b/contrib/ds-algorithms/recursion.md @@ -17,6 +17,49 @@ When a recursive function is called, the following sequence of events occurs: - Stack Management: Each recursive call is placed on the call stack. The stack keeps track of each function call, its argument, and the point to return to once the call completes. - Unwinding the Stack: When the base case is eventually met, the function returns a value, and the stack starts unwinding, returning values to previous function calls until the initial call is resolved. +# Python Code: Factorial using Recursion + +```python +def fact(n): + if n == 0 or n == 1: + return 1 + return n * fact(n - 1) + +if __name__ == "__main__": + n = int(input("Enter a positive number: ")) + print("Factorial of", n, "is", fact(n)) +``` + +## Explanation + +This Python script calculates the factorial of a given number using recursion. + +- **Function `fact(n)`:** + - The function takes an integer `n` as input and calculates its factorial. + - It checks if `n` is 0 or 1. If so, it returns 1 (since the factorial of 0 and 1 is 1). + - Otherwise, it returns `n * fact(n - 1)`, which means it recursively calls itself with `n - 1` until it reaches either 0 or 1. + +- **Main Section:** + - The main section prompts the user to enter a positive number. + - It then calls the `fact` function with the input number and prints the result. + +### Example : Let n = 4 + + +The recursion unfolds as follows: +1. When `fact(4)` is called, it computes `4 * fact(3)`. +2. Inside `fact(3)`, it computes `3 * fact(2)`. +3. Inside `fact(2)`, it computes `2 * fact(1)`. +4. `fact(1)` returns 1 (`if` statement executes), which is received by `fact(2)`, resulting in `2 * 1` i.e. `2`. +5. Back to `fact(3)`, it receives the value from `fact(2)`, giving `3 * 2` i.e. `6`. +6. `fact(4)` receives the value from `fact(3)`, resulting in `4 * 6` i.e. `24`. +7. Finally, `fact(4)` returns 24 to the main function. + + +#### So, the result is 24. + + + # What is Stack Overflow in Recursion Stack overflow is an error that occurs when the call stack memory limit is exceeded. During execution of recursion calls they are simultaneously stored in a recursion stack waiting for the recursive function to be completed. Without a base case, the function would call itself indefinitely, leading to a stack overflow. From 5dbf1f07cae3eb5c0694f1a9019a23693f423414 Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Mon, 27 May 2024 10:49:15 +0530 Subject: [PATCH 08/68] Update datetime_with_pandas.md --- contrib/pandas/datetime_with_pandas.md | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/contrib/pandas/datetime_with_pandas.md b/contrib/pandas/datetime_with_pandas.md index 796df4a..d87d9ec 100644 --- a/contrib/pandas/datetime_with_pandas.md +++ b/contrib/pandas/datetime_with_pandas.md @@ -115,3 +115,52 @@ Output: 2024-05-24 2024-05-25 ``` + +### Pandas `DateTime` is Efficient than Built-in `DateTime` library in various aspects like: + +- **In pandas, you may add a time delta to a full column of dates in a single action, but Python's datetime requires a loop.** + +Example using Pandas DateTime: + +```python +import pandas as pd + +dates = pd.DataFrame(pd.date_range('2023-01-01', periods=100000, freq='T')) +dates += pd.Timedelta(days=1) +print(dates) +``` + +Output: +```python + 0 +0 2023-01-02 00:00:00 +1 2023-01-02 00:01:00 +2 2023-01-02 00:02:00 +3 2023-01-02 00:03:00 +4 2023-01-02 00:04:00 +... ... +99995 2023-03-12 10:35:00 +99996 2023-03-12 10:36:00 +99997 2023-03-12 10:37:00 +99998 2023-03-12 10:38:00 +99999 2023-03-12 10:39:00 +``` + +Example using Built-In datetime library: + +```python +from datetime import datetime, timedelta + +dates = [datetime(2023, 1, 1) + timedelta(minutes=i) for i in range(100000)] +dates = [date + timedelta(days=1) for date in dates] +``` + +Output: +```The output is very large to display and taking more time to display``` + + +- **Pandas employs NumPy's datetime64 dtype, which takes up a set amount of bytes (usually 8 bytes per date), to store datetime data more compactly and efficiently.** +- **Each datetime object in Python takes up extra memory since it contains not only the date and time but also the additional metadata and overhead associated with Python objects.** + +- **Pandas Offers a wide range of convenient functions and methods for date manipulation, extraction, and conversion, such as `pd.to_datetime()`, `date_range()`, `timedelta_range()`, and more.** +- **datetime library requires manual implementation for many of these operations, leading to longer and less efficient code.** From b819dfeaf7af4ca999fce1fa74da124b98bbad08 Mon Sep 17 00:00:00 2001 From: Yatharth Date: Mon, 27 May 2024 13:23:28 +0530 Subject: [PATCH 09/68] figma drawn images --- .../Time-And-Space-Complexity-BigOh.png | Bin 17286 -> 12856 bytes .../Time-And-Space-Complexity-BigOmega.png | Bin 15822 -> 9438 bytes .../Time-And-Space-Complexity-BigTheta.png | Bin 21022 -> 13438 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/contrib/ds-algorithms/images/Time-And-Space-Complexity-BigOh.png b/contrib/ds-algorithms/images/Time-And-Space-Complexity-BigOh.png index 510b4d8117ba9b945e8a18038861fc6256dda749..f7480941bc597a9bc6f8f2d4efdd0d8075ffd429 100644 GIT binary patch literal 12856 zcmb`uX*?9(7dV`heT(c{ie%riWeZ6tO2)o~?Ayp5M#KoAFi6%=jAg82U$SPGvJNq_ zg&|FrX)OOc-{14nPg8~3D$3TlyK?C=ExvbK^(=zL zRbPA%qhz6;3HFqdl%C)iqj}RA91ux&UMGl*Bl795O@~(!PAp`B2lTc&&9wKIgXre} zsb_x@iAQcCD{p-oRUSLMhG-`G2kmozN1cuhoxKY}38f0^#bo7mqzUR>l!XfEiAF|> z=^0bgS?i_fKUvaGF*#3emQuvb(U>BL=iu&6Sdbs1c`=gCubr{fMdKoCiBwniH zShmIY=iT7hUrV1~&cf-r|1|Jz?C)JEY6)j(4(E%6?Qc%Tiq3gY$2$O3(&*;PKE2;5 zVTIl^fqsU-)@X>s&dW}zEFiGx<%F!joq1)Jq-Z{Sj&%>}{)45W zIYB|{p;t{)fzdbTw7IO%p6{CMM9pk{7{9TKnW{23T5s{dB%}UYZI6DoItcVfHN){b z=N37~1rJm*zbPknE|D~CU4Adr4Rz~XD6U-VD_@#PF^7Vx&qDM5J*Zy=-G6e3n>g?_ zEL7UGIIlrVoiQ&{dmpzhw0ETInBn+YVpC%24We58II=u)SOYErgETG(+@86lmB`vt z&gHCmS?slAF=w|Vg>+vhbzw=K!#pEQE%`QyL4y|l<%Gl zefst?LhQ5Nl1@d zv^7Z!IkfyUEu7?{Ax^$-ksv6-8_kChw|ddZBr7n(m%fd1(uB13G5NJlDc_%`pOioJ z`@8Y=c<{ty-l*X=zoMA6-bBx(57D;sUE058vs-xyieUANbQX&V*q4ko7-1vlgah0Vs;Cp9zd8Fr(&GiZs9lKNw$ zY!frpS3^GU!dzz1GJsvj-m9e-QLQP*S4$0nJZ_$@m@m+pgd#pCuvLA_qo4AA_+XB9 zS_rK5asd1qZ9>rx7)Hl9oFv2B`IZ1N@s#Jwj1khFM3VH^?1_vCMQq0h4FuKzM}T7O zwT>}9T{7V9_j4rT+4Jqt&pO81Bv@_7x8DzU+t}Ik9%0=BNyKmDdZ{RqzC4lf%nQbk z6pf*CXh~8qq0gXiRK-%*+yA-4ATLSokvxuapyg_aHwkNb*FoN=Tv<OC z>}z{CfpsJXnEz&6Ra^LJnEBiCuOyx;z4LCda#@Kh`*yXV9Z3uLJ~RC})J+QhH^#vU z0AiyH570i0hzffZbrLUdo1%D*^3a zCJG=(yRqikVc9k}h!!M)m4rv8*;_FHDVVh%C!nS)N7(ppt(-4qCV{@euuBf#tPehp zVgFMm`Vw#(m#_He(5Hj9YbqSQ3N$W4mi^DsXJr70T#8-36sjTPDLmMTD57v|KNwBq zo=we=3hnt34Um1mT>!a8FOmCP)auVEkpOv+0?^U39L|iMO`>XahzF}?@@{}5`FnI$ z3<6aJI`u#u-A?y%*q~CX0IQ?TG6Lk+Bf$8`BUjh2 zNKZG{y&1o;RkPw9z-JaYx23B&n4}+ovt^ME1pN1c%5F5Ajj!U9J>d1`i(uEVz+GEc zSNj=v65vQw6@6@`vdOaAemmGKoQ*3E45{_(Ji1vY?I|w`@HJ<; zx%zIrp_jNxa%uro^b%;FvGi=Ew`!+dv;>ITO)y$da%?+_b*?cL3xzjH&SKTob+3CM zH89y&0B|{w5Zfo`W1vmjZK?z06~Y1E0r%2KZaaR)aTi?>L%MnO+3@v??R$68D^d}A zJXWkg?P=N2C&$eJv&nhkYz$YRzG;I%-}*G#U$#;7+FuUtn8uNCFBS2_-&k<0GSv(^ zFX_9t&M>}9g{gL%rUInyb>I|53#`PTI`|C#`BGW@Hz;^8B^!Nz`Ud;lJ`Kd{NA6b^ z*mvMyiuB`n3rpPD+X)|qk4t0#Da2=*6_jn*9<0B_6teZhQXXuh+wyX|rRB|M&5XQ- zUNkPh>-x?B9E6Jf&9K)A;U zfcqo^Dt>GCVM0Tdb{)B1^Nlh@ z5K?8?{o4JRtTB49v+%w{-U2ZHwsAyP=ZblgO>3}>%JaXjFnL-mal$~#X-pM=A6DEk z@?Oz}6rL?+iIba6WcQF`XV+?v#swM(uAWqLO0S3CNJHHHe=mLZ?1s}5tSpX{)K4dh z4GL0lJX+VYzry%QcEqL6qkig)oAdlEhME!5ckG{+5TLRBqp-X`S!Nd7pt;{1ur>8g zG;l0eZ8l5ZqigFD*@7~oDmCCQ@&vkRlKH7EBkxhm(xe&w@ZQf__erE@e-bZtf1xF4 z%%pC*(uUTrAqU?;CzYojek)8|d)%Z}(R=>OV(8h4Or0=Esb!5L>jwj=-uSOQOj!$T z2EF!>(F(ddXjAoigbhEgDnAb{Nspn>dHU~VWvp-GtRG3#g7$V$J zgN>emqZjV!rmuZh_l{SGTo_(vAg?g6H;j!jL|x~^b&ryyjq^Y`@1jK`mHbFDUbXs{;?WLoA*c#1r`j$A zm*`H;iTmo{!x8n6eWXpncd84x{IaAnX0$Z4m?F-v_DoHlb!>3|acl9nD%}TI+s(%~=^IJo;4u#LAOY0>qy&v;|ow&vA3a$?er4(^{lZ z6v9iTB@j3G@#Dv?Nc{FYFHtiQ19|AW#_2WU-Z5c2HdR==O7du7m(F~Wfov#FW4lnu zyvdiD>48YFMa)5hjx4k|{zFz<_@+sTE5WCEY4=o;Cw3iLy&3%yOKqx^E^+H-{*nv~ zyo?Z*n${G6I}Wzn3*M00dDnY;!D6lz&Jgy$%Ga&k?rV-SBTZ0ZW|j9(s~0*EqE{uO z95#Zn8mEPmzlyEAZsA7RbeU54Bgl-Q;wZ5Nfg^RdKQw=aDR?8j~8jOLk4q zgrddC-gkZY^hmi#{6Xh}RQs29;-?6jgo16aa-?s;W8k7n@8IxtMy*6|^UFdHvS@P# zv2SWjm<_kw@;=FX%8SskeES-A)n&HE3HwDwbQT=+XnTh>`;dhyUMVr_(kH+{5l2;K z9SL89@p-UY5y>V=N{rlQ%-0mMm-eQbrk`;%8fyZpE@G+@3GzpRi;GKc&8<6fmlSMU zY7W6HOI;=XNxRE+E$V=HO;-!`Q+VE>?0nOBDF`*(=rTV!?aR=9U~3~*;_J9tW}sb3 zhWjAUy+(zv+ihimzs>nHsRV#S05HScy4$bN;osFa<40o*hr9onZ)kl2@ky}&=~#29 z+x{LD8~x@kSRJ*x1}5a7#bmu9mZwAF>R~e>mh>YrhHhZYLfXh+{0HF}Uv*^=jK;r6 zWc9S(xV-+vW+RP{+-&nR7#xZ*-0Zg zGNq4Z#m6>OBJ_AQqgIC$h(PomhI(d>@@}und`XYvQe=N1Vlg}oYYX&3|K6Xb$3)jj z`8&L2QAEx*j>mD+=1|#moBn(nQzjULQ`b#;YA~APXK!-;7W=JUtUaJ{AJAZ4_u$mG zeYPBpucy~BT2`Vo=SeB*5L7BEf67!tdgY8*wW|{K%4+02-@lA81h)aB(Oiav zRXT3INvk}H8Q7rgNTU%&sYeLPM-{YgMU>gKSr zwY+gQYQ%C(I0schDLV6#k`bQU^Z4=O*<7_yt<^y`-ZjT$J~gg2dwQ!$1ZyQ%Z2SQR zhXKHiGqN(H-NtQwNrvhaB_JG;kH^&1)St5h#o$98vI!n9O%^Pib5894_)En z!A=NH#%^e~-nV^f^iitL_|8I$;)U&M$NsMDtzX|hxs1XWYMc_t%772wj3?CJ02{FW=8Im|_TsCSu$<@pr6=Q;RH%AyE!{D!%7M2{R) z4iEe_p+S3ttIjxr!h6~LyB6!vxLpH5UepGDf!dDGr1UxUh933$^cvA4uQhCzFh`AD zq}LoOp$d;DG&qjypKvx(UsIws=aZ(KjqiOa$|^OvBM8rYhbn&8>&U~l8-}~nBkXEY za~!&~n1rvLcrqXRUK+M|TuI1bd}$gQCaL|(2_oNMlrz}w5`n{ZGYA-+(=_-JC2Vub zkASRNpFmMJQ5{40}QvMiKEr=Ne6E~o6M zsr-o~O)O&%!SZlAJ%R9VrYh=%6T@OY;;!S;_4vu+y6@ZZwi5Z=I+G;OvUcpeomI*~et=Yk z2_3njCY`XHup-0F92fNr#L&-90@&q)J$BnKDC9jJ!OlP_t?7IOcrsph<>?;4WsccY zJM`X5lvxhLi0Ie(%P-@=!M5?KV1{9-Y6s zt25J_VJey%`JMxws^~fMrbAxcejE(CEV4$x<*m@QKgqKM;KEFTM@Sr z&dXTJQH+f%YLbJpXq{t|iNM4uYaXlzj;_PIDgO}W{^xMMDt(Prw!+Bjr#dZNj~0z> zYLS)B8{!dQ{3||D@a|%4uZo?OB>F@;Y`au_VuiCY?#ka1g&_{(q>_)NC8z6)XW<7Y zp}R58Y(OXdUK+;W%^LUQG?2MFZuex{1*>@$an`NDffn+`B%3^-@V+{j)#24&{d^dc zdvX{tb_()Q+W02XyVh~rXnqi{&)<3IlrA4JgyvuKP&Q4re`MbvqKDeTn4jMe{d@l0X#z=wBng^1Q-rGIAp1154W8rK?v*ZQJ<^7k9oOWX=A9xaLB^h@UA^TU4o_RX94 z*1f0GO9_ejfF?ir{h3mZUgAIJxmlRm?PRV(At_b*g^Kndq1nb2iVO8D^`^HfRi~SW zUxOwnB_$W`!<0f~t)A^zFT&Y^c7Kd`FEq1y=PxHx*{t!=FMRIt(%7j+Yz}mKRehLK zW=3nk{^)Has9GJ~IG_IH3Y!0r%z~_LHOOM2jBI=!5%NVMb})$IbOKpB0xSGzlkNGP*q5 z*rt_n#eOR#QHHNC^?Fx2oK02ct%)6l_sc|&Q?!|O!fX$ew{D14yEv@8Ae0~Tk;;NC z0}(QqTI2v!$I32{*sM_tz%*sb@4sq4T23G!PR;3hnA|rLWmNl3-TBBH3QD|nE8@W$ zcjV&(8*WRwc*x-J5JT-^I%0@U^P7%{PPBwZ2faj*vka6wJ{(mzy!eCg_gmF%_dRTP z^36I9HX>AmxLsRWmex{m^}0VJkJ1}!MbX^Ms*Wi*n=u}+(Mx`4z3!uZSfcnNv%a9$ zlgivX;$%94m+g+sCl%KXH5bBj+X^b4`y$@7MD+r#N752dN*W$F&c-%uh-^Tx2ryz zxjT$yPN(yA9H&uq;L93!O7>3G&LFtM)Zbg)8v)v8qV_>&ZE3WSvR^wud)?}gFuLM>##jLq3!)m>46n0BL!M$B&N=i#hJ#lmO z*!?EB6!8(Kw^MMFTkuuQpNz37#m;h2Zs$zwN@IWEDGG-8@3y;T>q|vQn40DaRBB@B zt}xlLYVaOGedouc%df8wL>H0Pz_BZuX!71F8xVK-xdS3fu|w@k_NF3-S{u(a9=N{# zycl2b)adl>#FHh3;VU>EM{U|>UA1a2D_Ff!dHUKt<=0$|SBj|0ZpBI(X}Q`DuwBt} zlZJ9fQ~I*8?!TukD$v>B3po0n-J(k`3iqJ1{=pYO2D$U_Qfq+MYt5NwS}Az6@h!S} zil#uEkSOw z@YB;(MtrnO$iH7Edp>Ei%DaHO;av5Ip0Ops_)9**>JBi)OEni9J#k9j0W>yn;_Uez zm=)01UtlMne^|jqn(B!=IYC<5wD7n6v*QjAWu8+1@HK0EWTT~s_Rcn7m)6^NSyH&; zQkyV7?(pq8v((MH%sVrEFWSD+guz=9N}z?vSZ`~Kkwak-;3>7o%QEe)n9v0Uy|rU( zQ{xUy7sLyO49-`75oL$a+pKy0LJS{X7qJ15Jv13`HoFR2n_%q(`*QQ@tHToP7TCKG zTAQx)5Gyvly*53NV#A!P^IQ3>8kj6vR?vH8<7Tg@Q!dk$;_=m8t(j+;r&ks_1m)iY zsB%MFqGCiUxVyYaSs;wo@i?qzRHYkWtOsonkr= zfIsu{>?GP|V=5cdYqj^{Q8?+EqA#5lO=m$X_cDc#S7T_4cdL0XkQpqgFZ}z#VJPW% zugPY%z+mVue2m^oFNbcPtFWN=jPNZ_Yu~)L>SE*&OBAEVv2=%VyR4R?Lj5^EbPlmV zXrQw~gv;{3)TV9(u>s*-#3W{U-Yq4b&W24_4OBJkh0wYnuJ@r!XnUioXUl068^{&3(I=rX&yV8@5z%YoXq0E>wj2h5uz&J089yXf z>@}<8!pDaPJl>xU#uq>uVR#qHVX`Iu`l_d!Le~i-Bu&#;9;~{=ZK--L_FH8>Vjm# z$K`q&wf@wi34n-&UALOKX|Z6BF0#_PNj9QvE*%Yn2m9v>g1EZk4d#3 zs=bMQ=gWIm`!IfP#t#F0shSXXNO^R|?=0`IE6v#`F7k9W6uhD+4I&8*dGZk=P==V@ z{UU0ebs3s?Zq2m#I!$3C{?{jasu1iJ%H_W@&uEfbA;f!qCQ0DwLHX1w5mEHvySEk7 zByVi!W86f^i)7R_!+%ZTf1aXO=9>x(|6$kH^eBzAkVz4i^R8i^^_`+JBs8u4Jl+(2 z|Gx7mxxfTzn{>Ny;#%0|&F{lZe-uG1a%f4`lb&avJPA?}mbe2E7W8ZVhd5@mWOhp0 zhq-jlGSdng?NO7)I;ElxFP>+W?&st{{M!91#-uGYC4K@0y!Z5Nv+RE(^SOaSS#Sh@Q{)^~cDWNiwSf?ps5(Up(7 zOCGD}*2Q{+#&~S#>pvezCc*Z+p71sxJfk z=+FN^*;Rse=q4dwX-nYB!A~TQPPfp!H{xmM1Vx+@8Lg%3T0!V@T(QT!wiMZf{27@4 zsJ#`43I{2rtjrs~gOro@2M8 z)7)E`EOXof@JLKEgD?yF_=m%nzHY-3IaKv2yiZB1Svj9U8R5Nvri#J4+l5LHLFzP)(#vF>hTWu&4r^p&v~DIS@?hYi z9M++5E~wg6S$5?*_d4_K&@*m$-zK+9v8o`w`8S2TTn zb~s+}F5l*8?Y;f`u_$IVfiB+begJ>GkiSLoaf03P)sCxrZu*i?3##6)A*kc^2YtQ}k9eM_h zU^b09wD#o*J?7JZsdgCi26(N{(3T;1jnmU=`Yw1Ar})^k9(`q~Sr^IADFc88=tKbG`eYOJmJpUXy3b6`gnG_Lcc29V@z5siCSJO2qc#Yh=H=u+JwOB z58=&4FZl#Zk?x$0aN|?>kn5{>{4Nt@@~yJQorXs;9C( z7=ay*s>JYJ?}V8dGQ0Z_l&H7cimyJ^G-LUFcoj-$3SIylBSm=|eFZMZQV-j;xBl+F zkU8X}GAbCG&Iy!tEJ0;?4pn8{p%A`sOn`ex4|Tr(3j67P-GUX&`0N)sKI7AIA$8mp+SBIcr+K z4$C~(e<)LK9f;{~=I@_=kX@U2jY2XrB@JmQo+ZkyJ@m;akAYr>V_Cu=bxs-mJ}YZb z!RH50m*NjW5qS!4#`4SU!FvuImd-I=oLRs{P>4Y!x(D|H^z`3GVkir^*&oR?SQZ7J zg^hf~x;Qqf%7UZwr8DQEAJUWEvex-QL4iR4rmjNHcTqz7Zzb60TjW9KZuVU92h5t! z1PU06TXw+0Pfcs9Bwh)#m;%#sUSfC!8@k|dDVB$6`2mLE@}-&v?}aQ^xl4M;^W;HP zp$FU4WU@PI&E_#`tZ?0}W)f16}#`MzZV;sK485nN7Zh>wy`YJ;#4F z&hQ$s(;%KIm4&XqvNsmBF_lcNv3aH66xThFV_I%5!-8fIF#xJiiJIYXOjB!quq8Q3 z-|^`n@2lv4NH0}4XLd8J)#xhnDU4N=QcZ)mv-;oY9-9AVW%6Yx5^|{)?4={#cR^)| zP$|3i><*_GF%YuuWLD{B^cr>F?0a&G{?$EzUms&k7zXvQUefjsbn+IS5D#MuzG)t8 z{PCsJR1ArE#&hdBlv80H7o1x3oukpQ@2co6-I2gxwS?j<_3Yts8O2=lup?|Nqs{;3 zr(nV19jBj7KJ&bKbN+nBdrdJBCkk&e4)tOg3VhQ-^CRE(owbqo+-vq)_Qt1L}OXrvQTKs5_`PR_EF``$Fr+vTFfdI;?K@#+RO*~yfLV2vAKl>7YH;aK= z7A&$~R<}OiusEQXk_I}tVm^Fuig}jGIG0hR$1VT|sqq8Af z6t*+p^uOJJ6fE;dD(dOKi!AHvQET+IdT4z|=sz|y4VOB#1Fp9Quu2)@H#6n_x%G(*{X0Sf@7BpQ}(1nc15x#wlpBnyNnoj;tb z_aIoMq=A;0n8I)04W!yG+ctC|fKJU~u0El*Ui1AdU0VSB7-{iKgqNnvSS~%PJLa+R zT&8opZs5lrAf`hVbE~4y4?2{A{@DK3bobBBy`TNHHZ6fpU_;|xK^R8xIPATMFliH!20N`()Cy{2@5ncJP17fI zIs-QYD@wtd>kI;Teo#MzU;|y7cT(;6b@XYHFqTjy4=rAcTUcq9 zf$o->EFmo%mii(baP}aE0v%1eehg+Y@dDiBQ|mz~#!fM1TD=jrt)3|N3aC(VAB|bD zw5L$m0g~7Yy;)3<3d3Z(4EmI=}oqD znF&qC)H#29qvlwnIM6%g!aA_vq~*D`&>$t+jP-z4L%&pzqhI3}&;wk6sYQ1U-st#@ z!Kta76k}km(hHVtGDSSG8Q|ujsJtGJbz-PcBGrv`QnCg*CwrkDb|i%n2$WKs8?rla*B^hf}tUs+g%Wm=lrPhcsa^P^l zBO=6yRPIJJ{XDf|T*j)GZ2*^s4eA;j96JWZ^O#)%=zApS4ksnA2PyC5`C1=_g0c)$ zgH%aJslHw$i?{|0)O#rdot*w!sM}30#aP)Aw9CNQX;x`Hut>a3=fqc{t78teTZjsu zI3f^iexC%iT87+>Y0!K8;jMT!%1BcYb*{x#J=# zsAVy@0&`N6nK+gZVF2639rB`r+|`<>4*Q8M;SZqgGL}YPx(xKfS3ZlW37Vo8yelY| zjth5wav|&#O>|rHkX4v@mkvVTQByaA*ke}4XWW+;RTlg6CmqX2TTVRp4(B`~A!0Ml zr@58_{OYmOEele#jlp&e#8sEo@YlvY@pUJCW0M|KVQ7(<#>RLe;(K0XStS)G-~FHD z%8ae83(C9qZvPGKOe`1}3g(|z)UJ~;e;#Ak!SpM3jB`bygd;!f?B#}Hs{!;+yLb0Q znC)@S@A{+6qn73N<@G??dDtO0c}6m}Z}A1Hcjzdj?G)yFqivd{P-%O9i#nr-lFoXc zRjkI=ud#abDo;yXBnC(Jo-*u5|4W!+EyS!1+VOIpg0&+VhM&oCfCesGHf+6`6sE1Y zRUhlyu;|o5OpF{_{NPvjqT%Ps!E@$L;`5V4rnA1BYy2sEYdn>AyN<6|GJe52Nr4>m z7rW4WR%xtLYqDVl<)7a*(>#t+^Sf6XGy_I07(cK&V1*L3J_Kv*h2w(x@kPhO6)%QS z>Ye+h<7+-@;-|3X-7S~!;GFUk3C-RNHqb~{KQ&NN00P=8DAiG zKcDI0LR5XmuV24@*VrA=`$eQ6`#UG^#nVLsM;?=LqE*5TccyHj7d6dsp_u>R4;r6; z*VJ0_t^`5qMP*^YK}7!33lI2*b2=;CedrQ?rotN+@JubOT0a|zD* z$b0heB1>b~*oA;kN40fQAJ2F6b8NODeX`vDPHe$+S$9#3i&su_=GM!E{>KKn@7qa8 z1B0oPBSKz7%)Sxy)mCcwY=5|D$`wRg+W5QFsszLyDy=K(%T+fyrdBOGuxqeGmH4AO z$mytxqwu8Wd;^jvc>55s_r!qXb?u5lzQFX0yE%J)bUN z#fE$WW4y2qoECm8%)I=0%Sq)?n0iKD&Z5ZSz%*7!vl;XtA7A5#e7~nn_uCfi!}L}* zD*f*baT|U#W{NzKMi_sDV+=sP))MUek6Z3@xLn0c&>n>?9=3zX@*z!U_ z^YCxqy*LWHWFk&cmx~-W9%J)z$z|DPg}4Fv+=rUpqJ|eK92Q;b_13ANTs;=g`chuVNHe}39RYNS+&G;1Vv5V?4 znq%Fcnt0O18q@a<`d_9ieWqa&2;nf?iLo~k)$l%MpkQtB4&c7DVOG$G#n{@3jgmEt zoh3!3MjxFVayh+<*lNtbKOz2S32|3;R5XJoDIyC}>8(3SQ~I0ee#Y6RO3gk z*c^}Xg0Zr~q*Mf9$n!^Q2sQxbvnK?RLR_0%)#VSrZ2OE&$|`C(N*t!xcD$z8L47#1 z8}DZTSWYh1tTcGHdw&4_027vbK&qmhrwYG z`C~JcvcfaQ(&V>)9lW%M@p8vDcc~6$qCqY4S{}PDR0ju9p%$dM!)qo?784){RQ3Cx z4L_!9YjIdBPp?nk9YklIvE^~#tr}dzyHTmlGrT} zR3+IE^1q>iA=)30ynxrI6~SR-pT~6}Fb#q#=>{Vh36(fw|5pSGl;|u(=cDXBn^bSi zL1T#no{T7jed2~^(&T}!zyo6$b@sf4-)FMWjj-Kl+*>&*f&0gBx{d;dJU@gro*ntC z6L@}OMlU&zHH6C2XI6)Wn!gE=`$;=hMMeit1eUocTb}}{W&+j53l|qmgWh}uE@?j` zyV@ZzDTg6V%2Liw3&11D3;ktPh919JNl(XvKp?qck6rOV7mo|VSYQc>iNojLzucTP z4V?B+nhYSIlI&u4BYbW_vqg);t2f@=%@uXT^Sj!b*3E;%w?JsY$6td<4Jk1i|@QvkabfCk|lJTuC|5Jv&4c z`)l7~6sm_m@s$hkjO!0Rm-TkFUPhA$7|ssytc8iKPfUviX^~2ol0>(clVN0?I_18DKxg?d<)fKjr*#}$1)YPf#9qtt>Ih^Tv zR*(or!!KPlOcuhR%4|2~58Q4WLQl`nRxeLC2N7@3(TA35bUgP)&>%)e$_OT{79XX6 zvNXN4&dR~Z_O@kvND97s^)DIWyvCqHGa@NBlA`tG+zvEBla4GcoT`)MZ zU}Q6pbm1^rtbr~!x*~UWEY{Z6N}X35p)D;4XjpOzd3kx)x3>{RMU!&+Wyhuo|;I^MaRyL5%_p1x7qC*9mw)-Xr;lJ@q``>Nw@eZ zt(p*~ouz=mOh8109>MqF-a$2=??elYuS^|5UV6FP*Lf=MElNN@z|&qL7kBWp5A8zv zN$K966>T}$Tf3yRu4twou~?J|Tmvt7K=s3~fB!@m2IO#>E(~>7Q(MB)LHl1Yc*;XK z=ovYUN)1Ma79~aNq8iW+G15V%baIvx22Z(B;5DZ!#t2zIzd`pQuD!X5g0sPBPy9yBQJbs9!rU#NO*6jG;RM$7D(o zqUn5o{Fqd26TlH^{^ZRKgU6@&_ycN**l5Z<66W6j8(FPDAS)`(0k(I~oBkAz zVTq7H=W%zamP9FnT*7IHOl?j*N2iGgR`!v!dYD(BhJF8TNb;QJuLY9dlQT!1o}OlO zr2c8_V|bL0lCJag1ybPL?KUz>Vxfc(@~~Drtub1Ee(vnlNKD60Bzbxr>e| zENMe}skIUPEfO?M5h_&OgAg>%l#2>)`f4$1TZ8ldN!0A@4BOb*k(V>mS0~z)_0MSN zt03SqeZ1V5@aHlmeXIl?OcRFU+|+h;hou)sZM#a4REX+LSn#=B5O&Aq*8BwsnjRct zg!wB|>szaaBdR#wg`}X7u!a|)y;~#lp}fL!!j3(iaQe9zQ3Zp`OQ}7Iu9)y*F&+km z-J0)Bm|bBse-|S4LUF%$L+){!upY#R8g6fVV!hJDSPjT2-E+pw>m1>!g zQ-2A;5R@o_0(kWarcyQ}EYn08-5@-(vvqWRWEy=iWa3iCg%Uq4T2hJC<3*p1&gycv zO`Jnh?Nm&V7pqxlD7{L>qfAvY52Oo+g*-~f!+}xJEhwi~^HurK?u*6vo7_Y}R|H;U zaNGjGHD)(XOA6jJ9_N+2hN;?UJJZQ;~zA}<* zj4#rBoftWSLU=O&d}y}S#-nNe;loRIsHeEW?H+5sAT!K8Wq%Xe=d?AJNxBXsPsc8A-P02@jDu^_j#O zbVFjTG4jINLAQy@&1cdC_4W1h18r~L*yQO|P4f@ZT2{I4k*j`$!#1D}5bIEk?lZu* zh^Kq=;2)WXE31!9J{n=mz$G})B)_Nlae9mc89`$s%vFv2joYdwZorzHz)AC{A+)k` z+?EGk3~!7L;Z=wTo_baI_{6$t*xJ%()qx1S*?gFv8|DJy#RyNXrrSB%jZnYTmnSy7 zNz-g^ymN<%sxHFYG$N29RY5}8&^g3T%PJJqDw67L2*Dv*zd5WBx@ptWtA{>W!yNV( zNiM`(l8x%)KF7!mjaJ3sKb?Hi@#0Y3F$CegMQ=V?!t`-G4A;kWChdbb(n36=bKuUI*o3Kj177L{W9kgiDdGcCNA$l_{m=mA5QO?>XRsXYV zz7ga52qYC+%JgXqgjqUC35g>*ZI9n8l)ZR!WDoktg;UB1#FLzmmq4!YoKDmXMh^it zLW7D+Ya0VnMDTcZGPItZlsOUe@EjJ_AE*&0FG#?Uml<7E$?*y##`RCO1LYa6STQ5C zoU~|7_fAO8i$->Oto%gv%D6X}s*-}BV`yAo&J`U!J4!|IUBL5{Bt3zH+Blm!bd5Q` zdv4@XZ~-gb9Kl6|9D^N$5V_quw#qT|%}?60_`a156GS>m=5?2Mlo;gBDsLQ2w|6w! zKjQc8(Sd8ooGT?pw0C#C2&8FxP}e-}k;#^8!l@celiB`tQ^Y0fLw|?XkGG~fOymYLc+RnbsP)}|f zXgs2dQ79w{%|SZMF3jz#?cPwb$nnZIj7zL#{(!=(zp?*;b0j93x9~rlybtY!rRlGB zqpA8m>SMO1z&Ob`iH!XjbB&m%B zy|F-j2{xI7trrtVDa#hqgX1N=cvN?20msd_7IZ8skK7ue5&VkBVmoUAOHXIYv0VT; zc>R@@6_^1j>@UM}>^N922-!G_Vq}9MU79-dlH|GmMg55z=WmkUIK-S5`eTZ`?X#IP+xdL(S-A1&r zR)8a_wglz-+6&n25z0|D+4j9Vv^`iw5$FTk!gZ2s%O@5uEf4w}t-#txhK3*&k*5~| zeC{_0hQF)U0$v1ajq}PvnFS%nw zR02Dy->ib_ej7WrMld4NOH6`_88kIP6zB=VeIo>KuC^(BojrA{Qq6`Us<2N@s$n># zBs2oz*b3@j2WLkyfkk)&kNe@C3L~3p*L!(_Db4f^g)nhyeWB>R+fn%QgDBim$0!7P ze*xcU?g?TUmR58TSC8F@9`Hwe5^N56PLlj;=xTxNC?3qnr-=z;8?f1Waj__hnr=vg zb8U!M9~-@y^xtuCPj%xsgKg!PvBrmyMdwwOUi99O zw&>9|sL{7JJ2W8~En;?TOw!DZs<5z769S3jFmB(e$}x-R`u!yXcR`F@zkaY%DZ|2! zX;U*FNhO>Mr=XG?p;APtYp^CwmO(5|Mk5rP&#!%7ms?}!-+rpZHSihU9>DB>+6!Il z@#k7;G)?tAdzH;%n|(FPFDXfFH0`khu$RMpd9)3dEiC;FBQXOC{JRKJwzrJcprfHn zdNy%#Q)7O4Zv&Or=f^iFL<9sDPuII70xm*ZA%8eBv$L(Ha+}}Zd?n@ydYVHw6%ToN zFE!Wy`s_U3jf|0P!_q}lgPQApUZ&elB%hNtK zr0)a&^ZiL|I3mi>_42`iO~jI!KmwjTWt zb{C2VcW;zcd*m&AF6BW zPl$>FN&QTr5=$^@b5dG(3xP7g#-dr0;T%0v&^t+rW1KrKhuiZ>KeXP2)mifwS1b$~ z<{6S617PrzT2XwNOf0R?6Wb?^l5nv=zu}=F3JfCfP>l{V68sk^R1ydkb`B3?0JKWW z$cO|F4=?1g19!SyS1r|WusspMh$hb|%L;N>%gHp2`?8CMnyf5|(e%yX%8=Z*LF?5( zqKc$RQbZA29NN#tq>&$iOE15-P^FS9!cYi-I;O>x?g#{Hb6<$B;0!|uT{jalC3>lbQBGE1oq91UE z&Mm1Dfz{$~{(fMV9PZC;)h_HMiX6#Aakx55(N8`t)93Fiu=7ElYXNFpsjwbRxqf)S z&F1fY_yK8kUd5sgx-O&9_w@86;djcM^Lzf_;OH0+i$vLPTQ!rJ%;w;&egjy)Y zq+_HPNSb-F4q54VF!3Q1={cA7xg+xVH^9!Se+D{~3>+g9HnB+m~kSy@@p z@QBDX+}xTiX#TaaNGhWH1+bch%<6k`zuB7J4K8tzI41Tbg8>t6`$5r_Ullt z8cHU&bokL~*k!BDKtx8Ca5!C{qR)kqUCGkL&5A~ll}X3MgK|`%{W0I*&2~(R!)?Q*qZ>? zw1IoC4j|Uf0;8}+%jV9K?AXKNMu+t=Dy-%A7n$E?J{~Jnea2B#nU>Sl1xGX?TQ7Zv z_xQ{)?c|%hu6qca-tgSFe$X$cs?yt>2#8~`Aw;m`8Sf+uLD8F@p6jY27Akr!QJuX`)k`8@JxNqq=i3=N72sFv+howOBZ+q?9Zsz}epQ z7NjS#ckFpcFk*@)o6NOni7mDB9N{~(($#LtAR$#Ls!m8LDpE*G?|X6y;A1`b&bI{M z^SK_P5*rNuKxSbMO!CW8z9zs}k-&L(`LR?mO9#|Ypgf7vC@UrjdH?3z$*{s&$G`L4 z%8n}9t!1dLmm{kt1eJj?bI<8o%tVMdJhK%nwDLu2Qor%~rVhn`SOj9os!>`zLaz*^ zqo?Bzm>{q;?DsSSTmN{@8av2=!^QUUys@LuZfTiY>7g|etc^6%gUx5QTPz2q9G0f1 z-{O+t#qLb<#B~)#Jq3R(TJrlwqukg_Y0d3eIpxJA zeOxHWmcPg;m>cjx>pop`1;_l|uVjO7X$d1Q%R?2$jmgcGUHhRYGr7V!B+-cJsPufkKcnM2#vJfdgoL;c;ihgC^1;FTwijHvxS z*!Jpj`%=;Zy}g^)CfE{uH|;p(pGP^Z9ej}7!yRDx!oFN@|XY6=TQws zFv8bQ!7h;0cBhu?p*$!@58{q-4TY>FewTP%>z`5d$=yc}(d zDlfoMPDI@0u3Zzhlu1`8MwpDR;66B1&t&vlP(H`)(!&WZ*PBinh6GgDC4!doPY@oj zW(t9ZR~&!UZA(sFUHpYiWO%j$i^7$IT`^`&zRY6gx{-pxmALN5T&RT;B&XbRu5(N+-T3|-N`r~?zNL&5n9 z*`vm~>e^R(!qzCymO(p@R8r9c0qa~Oab$$S=juE1X7``6@I=ByU0b-x7t>Y?VC%wM zZ+BfRRd#hdD2o+Xnh@8~1j%kpk96&m zd0(MvKO_iU*zZjyBuPy(bT9>1@zVy}o zKkJ4U?9`Sh+u0jLzUy-7Rmxsa9vQ{uhq(lhD4@TS3C->?e{vv2AN{6dMnQ5LFQM zNmsPP{zV*-+e)FiGVni6Y`!|74PR2-Bp`i&z0GmWI8Lpx6v^j(!l^jY>~zIf~f3RzV}b2LfH%$^D2v zRnmji)W1UPy1pE69{&=w^T;pN87P9SWB(|nCbG#{uR4yR4jQHBe5EROUIg`HQri6f zQGKwZhuMwZFPAHX(uh=T{qK@}Y-}td6h+YI@&~HhCI7Dn#3~D`mV$2)dT3V4lszu< zO84YDi4R58#C5T$3&dsCDELtORXNpyMHJsNNB{C_rt&mB%?R&~Jx_Wjd{ZL! zpKJfUX>aj|bg|>~U)mzBHZkptm2oqS*jDH{YxtaO$&Q6->WQpQxVDdH&PM3P*9pE7 zMQ`*X^u89GR~79I<)J|StUH4LeCSN0P)n)%oXP9YwD090l>ec7czcp`B}?s-b9s~( zNy9a7G~rQA=Bz0EXi5~#ZV2y>_D5ie7CS6O(X%pkX=GZ+$;(GDZFabPFRv6(vQzol zKoRusLJRyFl=cJR{;pPYZM89(SbjNY3X3gn;mx-C%xJN7&hEKGYzXCxrVf)<=8{J= zk$m7|%NO0w_pbsoMe#$CQ9iAX`^j!%`9sUo2t-+bQCV6|zqt`%=)a@lWJNxl6^`R^ zZ;j1KZTRswEG8{OVk6$s`+2ynjIU3er-PtpW<%0bizmj{F`=7(I)E~(n~D|RR9kIo+t zz(<An%Q4y`3Q_kwzu@>f)`c)y8!8@_k@I5R;N+P zx$hnsm%JBDJRQ`3PF5Yw^;Tg#V>y&IXT%%1AVWotyP?8;3K#}UwKF{*myuZ+`ViHr z62HaoTYffNL1E!aR;sko^|oU#V>YHNyWzP!M+bB+LY@5c9Pi%w2+bd5lQUzk8;1TK+DXz$`T!@= zUL<3ekM6qur%Zv1Ysv2?7!}mq zO%XdsEYq^gzLzJT5b`wHyRy0*v6Alwto)K=-oyTBn}we-T@W=&gq^^L zd{ek#WRRo>BCQBQLPDhcVct)uXJ$$0b^7ODng5Yj!Zwz_{6Q(g6toSZu?v2oJJq|M z=Vl)u`NJhoFV;bVDDt~BL`{68tVJ*-itR=U_u-;9`Z&(#{hwv2lGm-z#!U%7X;~+Y zY`5k%w+*4i7Jr93R(DPgqKbphl=q?&j}|9ZlJg_xXv~d!w$PMET*;3PHWN zFLIpv#nf%>ugSScFa|tj(ELJ`F!j0_+QmpW z_&6h1=ig#m6Oe#wrrT+#*V=wv>DVA+IYx%P{(9$|_~Sn5PTmn|GHg5Lk7w1>{oTdW z>Etdqmpx%b?jeVvH~A|4!u6H|m(N3;7EFn+`^3TO2VF<>ebqydCRT{CH^pWkKWq-y zEFE+HpuK1^CnpRzvuJ8)$?kW(bImn)JDNt@IOOD8!d#Bp#9rS2uL)Sq*ORLpJYRLFzG~8(Ty}W1yW`gZb{^iqCvgRiU#o?Gj&Zs z^?$O6&do-9s6}J-U)yB4*yoAKl;ji^hVJELyFV-w*V`{Sf+GmMnNcL_#UnJbv9iIP z3FF|Qc6`g@rB<{bfon7(Jp}85#nQ^kR7|R8^hGF`?UkY1BL#vB(C4$a*Y4{ST*-cN zzU+~%1mv7=;m1LfX`!egM&4A#mnp|vlQMj6WC+D6(}Oj2WhBeX)RzyTM`7dRdbE3X zbSokL1Q-MFk@Od4&Jx>=sgZsj!G|_>C6HTo@VEuJ^WE%?=}?DoR|+%YgJqn242>Oy zo-RWL_wO`fVOvrg9bUqfKC{a`acXL#YnRhnUsTn7jTB^kUCr$3jFzSpAAAarPt@AY;aA{sHVad-!z{f}CV%Zs*xA8(d8~j9vAzu= zWrlCQI{fk($VWTm`;>^0lMA?TL-q;;Mk_w(S&V7gH>^w6tq4*jM=2l%g7}(DcLn92 zZ6vG@IfMB61x*SMit9gCOgbc^-S{U$UlJp)Z@gjb)<)MRSr06Pe=0Y`)H5ySEC0A4 z5`oD+^$FPFi~o74LKkEW*We;2_eJ~1H(OF7_za@@)+KFl?iX_N5D`e-uA#OYZit8n zTJXA{LL&01yZF=;8*H?M0>*szJScxjqcZ!qnVb5_^1$=wfdQ=NN+Q;1kN4rYi{GTL zA1$}lqDYuDb&TATY^4~PG(xFe0)wpy0NMx%GdM9^4YL$g$EVihq&*LhGU3#w8 z*82XmvC?!lOF*WAd_gCS@eaGfyMu}3w!A=J0-a26Opsg*9tk6Rqr%eSJF^0}kAun+ zUtPn;ibd~4=*gg=&#%X5bD3W;;orZ1ADf<(G9CROZQ9H;c$#%|Jzh;|VHd^Br=UQv z^T%D?YAr71_{jt_ASUeAA2<0KX&Wp7e*roxNwFI9hWJ?BDO|nAxc5`nJ>Z)COxcjO z7~QSAcKI3CzICdxboA4PUQhx%C9{cGvIZT(dn9B=wux07@{Q282vb>p=UL_bQ6$y% z?LmgZL1^+X!$`MK{#N|@&?go(D4&$S7#}wIYVpXB#`5gCnI;10)t8cr(|4}x_x8v1 zZUaAcqTAa$YBVA-|G!qk50_ZqmIA~Wj4hiQ#k@8YsCn95v4+3vbnsYTN(y}@4w|q; z&vC2-$)f4|__RWE=5TWOg9g|LrVF}C@4Qc^5s2%;HmffyVv>;%eh4}BiV3qbWBk@Y z)mOrWdOY*=3O1vhE*3lca;aq+Zt?;_)R9o*^8?GmqBpniGmTjbO**s0s|x}XE2MSr zrO&^8=gX|Z;8xjfqtvsPpOEvM?c)vs_x-9q!6g#8NTr%_aNB&Y z7R@+|L5{x2N)A&(UwQUjwRE`x=Vx1FAy8|)3m4ovL-wD&wV(Zx z7*>)JWv%#!$-%~aCZ2#-hzHDoG4SF;qVg)J>NyJ0GRoCspOMnDN_k{%mD4lBW|P6* zp<}1F(2mH;su~*AdD!{ljy&8_cv82gO>;ejxYWU~;O~B-FHS^E9Qj&f*7uSZNahy& z=PMGQ(*_)3EW3TZ9LiKk`_DHf6 zrDXs;hNbQ3zP#QUf`3~{c6}`6?B3m6!vp`eA^w&Wj8!C3*F2<8EbmFlq$ZhZ!RpFo zDOU_;E3fDkusX@1*ZOj}c&F{du-X($$6aYE)4BXHBtjk^R_^z5qa&1%7{0poYe7ZV z`@~8(zN$qGt_WUS3gsQCXO1)WTn&I1r&DIAqL|uoTnf^(&UIbu?h(wVb%&&}hqrB&yG6 z401Il$oOe7VdJPPjTbkXSqL&Exl>Gf5)?tiqyb+^R_0}dq|GR+RtY4~h!}6`bQJ!^ zzbs{HgY!F3GCn=T))lp28*&X}MLuN|$I*Cypl%1GmZ6%?jZvip7ClAD9qBbxM+qLY&_ zCa5=1`ppB-Q+zqDA3Cun#Qany``PXSN4}oLg#nqychA;t>a3sCzDIE748+yiX20D~ znH*igU*-N}F0y8@>SgdHKV`uOtInmlI`VS&kw5n4AfY*3K`bC(u+fwjRhTGozM`kh zlzCW;&P>hV+7(%Kkb$n=*#O_;*h7d(?Zf5AI^J8oHLsuO#dnYL86R#_gO!z)OSNk( z9BVc~591Z%Ykm88hv4Jbd_0N+g;<%wccih?>#1eNk3=NGmG9UfbasQLg=&IK2nmTm z*0aa*!d9qf8Rl*Jj|!WpHmvOrS4FhH%#)ygsJar?Iv?xZeLNq?O*jlK1Er!Y_PP2# zv!MbCCloA77W-f>C1xMk%iE4}Ds<|`KfrWx5STZZ0b;#o{BR=;Bn6d`SA(v>>ti%-u#oIQKV=8d1QE4a&Gl`SQ z$2@o!%-$5095;*O>j#I$cKCCbX=>v}DMLN)78P7icFH65Z8=?81fxHKvIF5}pN(gy zSiHsx9_pO)8w5YVy1lw^Mm0uvhabhDXVQ4eiC#RPGswZ1dJPlziA(BRu@Tr{jr{7c_b(m3M^B60&%N@JBN8wiN zge@2u+~wY4y33J}`SSUpA?c-BMmNjTFa71{^SVT7d1wU0HJWX;c^*S8ZTv~MQ! zpP>+2FVl~pZd)w&fP6VDIQcwW)<|Xdy@V#cpn(0HQCHA7(kd*!h4!B;d_EFl{-*21 z`!>g({|;PT@!H+jtJF5rB{B+)Bh*ISOKmGYUHjBWq*hZ8b+88xm+vk1GIZ=4B02T^ zHe~+h$*4Lg`G3QBIv^QxHJz-eZFzQ6N3!r0v;P+*4jBT)CUrD+wZKY`s}0<=<$Mcr zU|^u!+ORw~ybJ@4Hk6LX_7;4;)}`d`S`GKI)YgNVJUxmbCaU#VvdPrb&IDlS(pj3} z@9dui<4kz)xp5Hakl4xIe&QU;z8E;J>O%TDXnu56S_(yt?0#SVED?{x@^5)bX`Lrz zh^DjK@c64hVPA=YEzwG%RNyTC=!|&pcJ{p1 zKlp-Rv8NEaH`$~xJfU1|=V=RYQO6V|D=ju*J?`Mau-8aSd-up@_s7WSDfndc!KyLc zLX5uTaMJ?VJ}HX)MqfeX^7iFudKLZqjHaZb*hD*oZYCNdD3b;xhGX4ezq;gsp79;! zRlgvGFGZDvZ_J<#QKr@8$4O{&%eO(!erN!gcx#{}1Di5VR^5*$Cgu8LeDz^TBWnQl zUu)Wq^2sGD&TKT6@c-DcadAVj)T+a;h{lq4^0BFMma7lkZ^+h2Hv^YKz?99o-_k`* zG*|}bcUXLGf%8%S9(3$?f1g8{uV2FSuW#@><{?Sb8sh9saxIyD9)_xeX=rf-^@?DV zR#50m{~>NMp+06ewzpC?|{dhye{W;BG`39Ug7M zH6xj)_;u#YM8g^|_)z-3^WFEocM{}n>TOCIh~mY4_~yZHL5Cl-=BMwqT4el zTQhb})x7zw+!$B5Y&+N90nV&$6?=N`{_UV|6&{r?~Moh|iu~NS(fs_=jrbeDasfVwR74Tu6X29y9%T;*&jMY9C^q z$~WP=k?{W(^71%*w0mAYo^iW98Nn!F-3WUEW-VBm>x%=->gDyw-6^A7>1H;ELP}E7 zx%KS!v0s=B!7O1)-r=X|{pAk4LF}nhj={sXUQt3j)vbuxezJI{+xq&s3C<634|qVL ze-H+fI^%tk3dYC5CqG{I+y87{X(4CzeEx2&+c8p}Pdg**9rYE=U=k%F`}5U1%E2J~pp`aaxPwJ;p@@{*~g#gep z)bY2N8G`?;ch@W?^6A9TjUS&|8lfDN*pJ7VKR`0jpy$5uSISRZfT}+tC4^&ldyVX9 z#)by`6M5@HQ-woo&G=w-qMzk=gUD$7;@<#oeDLYNDXs`E?7p1sk zMfUG3OrC%YG)I!jMD}e@5m!NlSGrSu3;G!ZQCmwQQnBg_a_GC1U2R% zsF58S!9F4Cd8`0PZi%wR3`(nI5xg5_QU^w3o?_+v-D0!j{))ZT6bF3BmNy3HFADC? zK6-F*GtRwRA^M~N)zE@maGSV@W);Grszg}4&NHmJm{&|0LxHtgq-pqhRpRBZbY8ID zxPCl-{TS+0o&+NKzo2K6p|Q*$mv^4{o5sJ(BNf`b9uXGG=h5DFSl^-q?;e(Kl2vV( z5PnM8PCBTQhe?;+T@YA)w7B6hR}P_E6R5(+;eg!ba1Q<`c@0`p&u=ayU60PCC;k|o5%%qn%!3kRrAS8m+!jY$8{VYNARv%o&%vUQNwUP zw>8-V@@sIK6YfEyFky7klxXj5&|6)Dw|y%5+2~)YUBCV7r;4sMs`psyJrSljucIy1 z!2kN3*m20R!avKG6k9iOpYuP5Ix>ZXf%9}kJ;tt0dp+nVBpF zb#kU+J1qO!xh&5rt2Qj}?Ss`z6x@>k%K7(+^Yq&*K88xJ=#&(^hV-ljq4CMRRa37@ zBVq@WexSEk!9uv<1p+%$S!WJEcag7Rel5+I>aC!_h;KcgZ3tdPYHH*g$0tCCQyY<7 z+1QzX;oc;_3EZJ=o7#d3@6%6lTdIn#*5nVZF)UjJMYaj=*=YrUoz`XpfBJv5~$_SNq#JQEzCZV0#? zUF*{M+ZRR1GeDXhQ&iAoc{;ketc;yeY!p?Mm}0rRAWkM{d+z@~$w}#Y^CtjV@H^uQ zxWDS9uhc1rk>Wq>N5;=qSXN9VZZsbt-`*zN+#VlhZBO|F+7pZG|J*SHlSXk$kw}S| zP%TH^UA33zwIr$?$FZhmrraMKiDEwzZz7b^?1uI>y@x`d0V=*&xqrE08+jb2^I7~6 z|7Ji*F=2|Z1VHJb11LTG#=|r-`9oK5dxd^rbL2~iG!aglH~ry9MndX(zi(67hX5eY9C_P9J( z13&*nT3aJY>0lY6gYET2#q7Ur*9`y>utPG#cmHG^r4^SC?d)DyB72|z@T7t&jzo<| z68N*J+cqBD^Jd{{?`&fRzf?+ATB&K*TWAd{wsID#4Ug0NTe|6EZU*+0>KT(qPO(g! z*pB$=4F?qas*9V)6W6l>ikH|AC^ZwSZw_)^t`6<t}iGiDLvbqzTzy!>`*>6XL!-?ywfpDX}s zOgB`oSU8h1cYM)~Q_mh`b7s~;SpSyKNN*&ficlaV4gg@mINXjf-g#=);QP0Yi;`$8 z7nD4}jXCiVySMNejDrzX^s9?eB9xU*wzgFjWL;!m@imQ}%HLby1u^nHDfv^ri+{vB zMddTFUIKV93m*dmxXMx_z4_(U00OAOr5`KWXLfMsrt-Xxv(D>~$AhkIe z>jM^L!@ELk6@|ervI>U(Ue$4HCQTWB=#-QXNRm=E3IJTpaP94(`49CiW!|@CZg@k~ zv1X@8fP!Y=c!HFr%t#?^={9r3?3A#vbG6zsOA^#$>i`sequHg1NHa)BSCV0418mwQ z>zy{hv>(BFA9LMo5f48x%T^MWH1IIt-g{#>7EvWrvOuAq#a2jV7(3R*Mo<4=TVfZ; zz`}~lEBfu$wZ2PujWKA)sbPDdNeKOWv)HNu^%;J0Z1}He**B%Zy^OsJn-H2@-Dh@%V@)WZ zM=f$kEvE7UFC)h}sTzwMYi*d|&F2f#{&`tc;QM<8UG0F6t=xZkcJuSXXz{qwVA>JZ z$2fY*dj@SzdW^Zl0xWrO|5&omD2eJ@9Bj^6dOdW<(P8cJv}t*H@k>j(ot>RDe0;i3 zS`WW|Wih^u2i$T}(#X@zezW~770-p<;TOC_gYOw7fX?RMOA>H2so)^1;8;tfy4ta3;&a3IrStpil#u5W~w$yLs4Bey9oi+5c1yw zS?8fBG@+m;D2}UAa6Df9@v%ei%kAXxM%S0Lvv_H#{JOHlLuW7tM^(Fl;ej5!vL1n1 zW~kWDwA@@4Zl}4@@WHsX%*@O&JOOqLJYyXm_-7&$PwE9`snfb-GX5ceQfFyr_n@ky z_&J-yIOgx4$KkClv!`t!wFPK_h$n*O*9GG7z(#$PL_|!zaYRH!L-E{8gRz(uIm=6L zUD8=_3u1|FDH%COj&}#ze5oWxK|WH06BFnF)swx0jm(n6q!ULWl`0xgV~PL%i4Q2G z&}C$5wnMcdsxTlXDELnWa2lDcZOmyF9H!j_C|KvfIlP$ozZY-I_wNDu)-64lW7DxS zqRKWh>(r+`5sic`ytI_&<#qJxY5VA(OoLGy)bGM*F4VZqiBJI&bE?~30Ica75CM^; z=NiLSl?ehqw;2LDK6oE#n!_3p(}@D}^XAPY2d$u>!IPJ=3Q2lKMzk&UJz-UE;=T%L z5loI833!Bb^XV(G`OaLKOzG?pD=RC&Ll}JA4o$_P6n@cRSIJ~~Nzxz?mkG*6Qju@s zFltp?LxMW5asm=J6o67nM6??WNXB?qCgdiS!uYk-yR&kpBlO%42JOfiRTZOqn^F|zKgKHq!7}?sb8)$pr@gML&2gL zM7bJBJz&=_^>Y=s(33aF)M?%A{oHL|F-2wwwYkTTg8)p_P(B6f4={y6v+ZntrndD-1&zDpiEY z!N zS#O+rkuVx59Uuv0azQy=Z8Goj4FU9U4jY|3W*<%%wfsK5pK}DFha~MY&AfY!?`J!( zNFmQX5KD!e95F|2m6zR2q2Z;g?#jtxHIMt2C;qlzJZi{#+ds0BP0Y_UE`z$V=yny)qLc z<8G1vmXxY$Qd)f)C<>1h5Q`GFcBH41XfMe=B$K|C$H}?n#Owb^uVA&&=?RDuHM$+0Symgzu#LNV4dFyeZ4DDxcH=av`gx3t5Nr9s-`vX&#oNq55NgW z3r~t`gqH9*rsH&da)W{Iih4}2)Kx70PdkbZ1x8Hr|RrUTaGyW zJMiz1#QoK_`C4ee-)CQ+vlUE$E{!u$IxIph`aX=1U4Lh*FHoATL@e;ZgXm4NO{U}x9H7p|o-z@l-o|L2_NLxoInz#?}c|*a#ksUD|Hy)C*r_3-5 znRIrMF@m1tl}GhP>PJ2)$j0wAh6FdzBCKkC&V545&f5v1flD zw}}s%9a7?BtQo+3O+FVt_-VaI017bD$1;{ArmhoPu0XAO8Dh+4s*v3;ZEe9WV{-F2 zm@=&Ib~B`3*4>tM&cD!RPcYuP~$rYJpm(y#*C!{Qh4ya+A_uY0=(HdBIQa?D4aLqYx(t@ zL5#Z9_ZC~}Oc@z&JTTee{7?SB1?9vE;)=S8P`8cF@Er3H!`y8;SUGCqVV}e2U)OY6 zq`Wq9G`v3Z|EkMqCY%8`P{VxFGf)5@@;5e45=-kx0XwN{O}0J;I`pNa|<84&R#=x0~H)WiM# zifeBXopFFLSV{p+J%DXVou@zPhBXFPE{FdlxsfB7!C92eh4fmmQW4TJ%mudqBv z_&*d8@B`Wh2ZzY=-|qq#DLgLTqCB^()fsTnF0clEJQfWQ>k>$~3^;4(@HkmuEaSwJ zC%gTa_TT<#4n9ew#@s%phl_ucbu+=!VmCbm2ymm0Ie2-s6=M{K6%*)Ke|Y)$EJfFKVNv38d%zZO84>GZVxsO_ z7FOQ@R=%8n!TKvmraX_66cfe3!T@1l@Zm;oFs9R@DVy`VjE#ye=Oas5snt`7`*wSG z2iOwxNU`*oolY)@&s|=H+JO}*n5S}JzL10?l18g1^q=@v;FVYzC12A@i>->(hT@yI zZ{J2Yr4WqIZxF{5qj60y&l|`ktWnA5A|HwibRYnmh5VYBLuY1A4s)d`6K-j|ADQ?( z_dFn+jgw^AE9cj0B?vF)OmK2w9f?B2kFtfo7vv$vq&~r52!?rkdIr>s;_*NKQ1ESY z+cYBKO#i%4ND{nTaU6Fz=a61hE}1_}_s8)y`MmtkF(O=+MudVZBdlC8>4&No1*SVI z-u`6ge?NVYBQfcUIsL2EecOygJIjB*5VvSg27~LMU$K-0ubeBE&r#jmlELi%tR#Vb z?aoDF}0>m)Yywzwh`O zo_up}+0)2{@BZ0oMtv;s>rrwLl9W;lQt>$C8qX8c-f*gI8h0HV(5!c2J`PMwUVT5O zap*@p7jEAU_?|opBDwOHG%4UJ2n5+B}*}A$eBs6NCveC*v?%w1WMWh zCEwosI9XKSfkprBb{U|pPZpd?1)Wg94U~%9AQiY!Ml18V&$DH++r8!`9TaMwYQ0pV z>W_}_g&Dx={@95hjKDt17gu1%DgKFQ{Q7@~-2Yx(Q?Y!;p2q+DT8yy_7p1KWfCp5;(S6%Ux2GEwOu`%j>8-A+kMiHN8??&cZd2GAyRRX6b+0((GIlni_=f6ZEy7)-o6+@%cCoW1p^S({n_mZu@gE?Nw3QW+Z1pCH~gt-T*U zht=k}0v{WX7ur#sULk)!QrAqzsoJB(DC3>c7>Ul`fM2hxFQLG~#I7AhSa-)h7`hNW zke#!`pdVIF^iPS+$4RB4B_-GUDN5$gCQJi9ia6FoQCQX*rgao}pkF*5JZ6hgM>$AB z!H{YeJ{0yl1w91jgp2?e)$}6VkM~x$1~cS3??F%s@CQ&sBO^+B$cV1D2ju@c7{+%OzVh`Igt+XN_z2-*<4+f;01> zWY@n}J5B*ZDgq9-ZMx$)sB7IaUd#CZeNm?{SfpQ2G4V9Gxh`J_FjNNJ<7)<7hrj2k z(MCo_mDfn9Li-kE6_*tZ#NUg#wkL+3PLs#O%sl)qZ z+?G_l_f~pnSkn)-XHSi@C&%C!2<{^NWHh=mDJkjY`d~&*W26TS!*q?)O*GHd<^B}O zspCKEcpF^OyY3{s>N4Om{?-$v7M*!&$;ru)nsLekhIc1hUNs^lZs1j5F5;YuF~(yr zB!Fiz8j5ceg_5z#ULPC)cACY1y_Q8(1QRZnQu*#e!Cr%z4+F;I#3HC}%QDz{s!}we z8_SO#@OR)s-5B8381)VIx7qTP%-63K7-#JKamRFIg)D1hWJ@+KiMjn8$w;wS0GNqd+H%iiCfz<&~VdcTb|!r5)fP zT|3SUp^hv2$Krt8+9k@&265Lm47jv^XK(`s!%!vFyC(PwT&$}9m(iNee>!SuLG{TDyiK-Tfps6v;4=2EBkA}u6JtKtD2L^-maSS28`gudSD8$;%55k z+QzTv7Jn(rD_C>A87v+1=gnD-2${!p2*eMB7?GD<;Tv|Om%%cfJ_mHEv-DHXx(mB^-J z9}o0fFTHN~&*L@Xe^jD?SSa#@aj8q+;Zhn?q)7n)CMo zG#QZ*RYc{&eO?u#aAbs(8epIMneL{a8hXX!>4bGQZv%^M2;o&ULWM$Y!eu(`o2d$m z#Q>&}fFq25vX<|#Z{A?TtE9eR(}A$D@QpD16XxIJb$}R-S~?R20u;^@ZF;#Nw!8j8 zvVk%qopdJmqcdqSxU~)U>XNLg|3B;T-RW9>yw!_Z!;94s4_%d5Vd zOyV8LLVOr+^jMGGd=5$L7uRzH22&LR7P9wX;d4j=oUThBR>{og5Qf-%{vccQUO3`I z7b`rhZZ~mM9vQ*fEu`WA?1z{~uZ_dhf7xJOeCu#7@iixvyJZTrpJQGulE(Xb%EHx- z>u8E;iZUqZMHtiyJzTlq?`Dl*fQOor;%FNxWlS?l@5J4VZ|D^NIz!8OolJON0%XO@ z?G=akP~YJ9$JTf|RK(TD&@j@B*DD6-vwEMwX<}(9>Ks3+ii}uWYY)4LKr%J5YHR=p zmk0hXm_1OS=#+wf;0B!R+O{DtOp%!{H7e?snCyb+{yW5nl|l^}fv-4~4Qjj!#0^RY zCv$Xy{A)}#^X?}gK46U%GT-<>&aE&4EC=A-1(l*K3VL4pf@_)^fV@3rROmEQ$oX@O zKt!EqBsNF_ns~jkZt{l)Op%2T7h|nCdDa`kkar;gHJBbNHmaoO*JhXi@5duPe4m`i zSk(vbqY)oWm&$p)-5}?-m_nxU1@|F32r|O<30zs#3eMdl{CY&sFXDPOhP|L&2Zg_E5&nkA{T0@_!3+0$520W(j)cC+xM zekrGeBrx-_MkT%Zr~%fp!o0ZCPzMBm1K|B41$~SPynSway4FR^IsRXJ<#QtzM?p`i z3SUZYLg6H!Qi*;2nyE;{hwhTnQY7yhKm~4t`El27D6?89UWyT~!dB)T|gsAl3uJ_C1ExRbqf!)zRLu`D!$cU>{u$c;*C^)2h*jMpv zH?C6WVzX5_S6kfGFa4t*{=DqPQ6J?=Vc#mUg`JdbTat!h1B6#;YYQQ%{IfnJ7ggMO z|GHYxMW4?c8RZdu>uKZE_liv*!3w6Ld zV~-oWHVr3RQVIMe`M1AL{t4R}$@{9 zV9sC8w`}1*1wS?g?}|8(YMOKgN_P zUr$n%lF7()cq{f|wB+*0TSxI__fs z=>%x5_34a$S{Q*tDruF#zeMK|d z2<2zYLP?0B@+pc0P_E}t>psIoB3)bCByrpBqERbr11{)-KbY=q$nu@cH{{9}8un1)McNR&V8gE` z_<^N@e%um)61Yk2mn#+Ih*7`ypdjrIcNL<}R|}=5e~MeGXYq_9#kto>h3SU`LKS7r{If zq`AHsCgxSeyT?ZllsY4Z1r?dj=6TCfnFNp!>Q1`Z-sic9HYK0Yge*c+TTVIVd%%z3 zoM8nz2C2X1Bu@OjBp^CcxMBK2xx5a0$2vizwKx!}sn5*!a78IHi|RcZ4dS{(N^NWS z@HkA2nH?9s5lT-e_>ue}N_bAYjDnaX=QV^t;#cZ^qumSit>cO>9(%1f#>%f}TS@2q zD~HYe@o&OlY3u1W(gk9n`mD^~iJ5a~9_=dhHYA&Lad*apONN~Wy>S<68cB?rdd%_a zurcRu^yb}|ll!+@A_zO-Q-tH`)`5#-pCJC}{Z27tx0{NWStp~bwQk2|fA-Qo9ZeHQ zdi&~7(D=gpwGMH6E}?j8%K#Ar)}f{o2e-}ViC^ygcD4Mtm*+1h>u+>a?d~-{@D7YEsNk+*WUom#l6=%qUa0pqis_j z+v}6Z9wBw`?DeDwr}%G3^K%dOH~g_rJeTs z_&&t1lWy2uoP5H69r?C&&ZnZCE<>xJR>m?e9=KU>W!+~_OOZWez+m!5&?X_2e5G-o z5>Cp9Avu8z+&>h5;InOxiDX?@McZ-F2%SY=d(#_}et&8Dc%IC=PE;(YL{&;Htr?Y~btrCVr|jrnElUNxhb97_@HfsRz4 z5!!$2ie3gf#;PTn=E=uKhKd&0cd7OI2B+YTayiZg%;UIVywG0K>S12P(3_HZq)7}( zeQJKZf4{Q1l=xV)aKjq=MW8>vTb22whB&4+{Oq&M*8>>wd85yDN!&AS2S9CF?UVE3@IuE1@Gg{ld}t+2JILl z?T2@0Rj!k_jogZkD;p)z#1xRyDQE16kw_G0vT~zfX_^>Utd}4D%w)K;^O5`;TOCTmOPrt7sRt)8GIxc@P5>S)rJm-LO7<;f;^po z!>qAR6*U53<#Ve%_2VgvnX*zpkNV~vRhw2!n+(fYC)!3YYx+QWFWuZ z-+?mSO>ktl_5Er*PR8JUk!CnU89!yJLl}E1Qesy8a&qG{o<^X=tLthAKFE)GJ(a>lEAhCY0hL-+aZ*FqC}0y|3G>WA;KO*q0E5$v^Gz z7_!k>x$+2YaLlQUqa^tv?CO-B*ZC`&zfnIa0{(X9;%B*&LQaNPHK{#y<$1Rf8M7_E=PGJqc%Dc3i#=>b6 zC>jWOV8V_b;ctQB0Dwi&wkIcm^8oEkf|5<(MZ+;FVV~{kwjW#Tpcxo%h(&Z=unoy4 z%r^UoH6FPT3}-3>NOy(cWWG<2qJP9nLBV;6U}zzc@f_A6_x`(uqoZH7k8d%gsnAk+ zK7?n`s=B&DNi2*)EDSyU%DF~MPQOaCSo2b}82LE`_NQA(qk&vL4~$R_>2jm$FT}ki zf4dvyYRMYxyLY_4E|FJL{6-nx?ue7!eG_*w>jQ*o?7s=QWy`kiVYuah`96iS?-T8J z1Z@@1mtv$}OjQ)LoUMxAj9h(kdF`vePDV-}o5)Yo$PMC@9iWgUUZ@Z5{7sEAF!|LR zDk^B}-n>&kWb^cFU_MYv_k1p3)B09UBksprE1Ez_lF~+l94ITE6)B$M7~Oq0t*=)F zCX|F<>BzdUKN$I@W7n7!C~=(>(YDJNiYJ^85&ADy#RwA9meEEu?CCDHuF=Zb!y*&d z6uWO9gmR)BQ^}|U`$Ne-W$>($(G`$rYS`d~^6byGh_7}(%(i-?CN{kWG&ShiykBS!&j&S5QP=orh;fzjn{KQl-t{MC z5Mmf-b0lYaap(7t#7AaOKe41bIM1+A;-@L*HTi3vl?Rz2Zjl3Br}DpK%|ongD&jJ@ zJcuK)i4NhAG&^AP;s_0VndwrOum3>NLZcQP!nlk0hk4z z@>c|^ndNDL>{APGryzX9-`d2T(@hDfvd~ z<&k|Lp@yYCfHo*3IMT76u}M3R0z{NTDYh#6$*$b{Jgd3d|4|{rkcTuvAfdXo|U(th4eMEhv3SIW9I$UBezHj%ex- zE%mm(dZPsJ0x3AA?z443r$%U=!Lv*A0+V*>?A)u_rbRSi4*EuX-X7I#ee(d!q2UC~ zWkO5Ve~+R;kqPY-_GOnVN2Y3PTM z1tb?YGfN^IY60kUG@qQlnq&H)ods|h38+6ek|c=?{ZSj7_Z;(=;^sqEFbXCK^?ysW z*zr;nqA?);leQZI9*9DW@EGv1UlIGa4s9{YXU>m5UCxwC87`` zlHpXhg+w7RStKM*H%8ufhcn#_*nB;gT!D-}SyHaY{&$mw%Crh_msG?EeK}nOu(H5^ z7*aF;q4)36s!U?4VJyxPCR-!$kXAV1vIgNH{pH^>^aebaDlLb_V;O)fE?Xjk{~xyz z#u2{Po3MW3fDDnLkLm%Szzx`s)|kI4B~ViO#s+YnE#@yN*B)?NlQ|LBj0MP{j6}P`EeHd^6U}A!|@mRG&C;(jl z0rFDPq#iSuW;g&ZT~c}1SM+kaW`Jjbm)8zhSbihp;X?h(?0;IIy}AO_U^d~A;5;kL z-+rJL6RC;1k3T;>#8*5?_ldYvhuP+juepmey(*^ZKtbl=bhV?A_x4P^YYPw%Uv|gd zUOXthly7H2#byZ;QRQpEeM{8*OR0H1YPQaeN6u@*!29Iy&%qKjuzLUg<^(03Jv|K{ zTGXN!sJ`GMIHy`(1u%DST?Hf{jlX5-+a@Y%Pd{AUSro1NvsWe`Frr!QNxY_pi{^z> zH7u*U+`790P(H)N=>1*m{NQA3t!HKGKg$egle)wysw6Gl0dHGMR-*#RGvkr~0O?k3 zmC>qrJpc;H*ipMx-{Pp9HHY~JLfH1hrp5INcJvejkHkX(K(9*X6)C-0B8W?62{N)I z?&#>cb9<(1sNr)j*6yeds0S9Ar2LIm;3OZ-GfPFiSgJIa_cQyQ^i z;Uk~5*d?`?uuPD;iC5XQ=8w%$PfbF6DD%8;VNqOMJeBh}9Kd>uWaA`%%1{}0EGXQJ zj_EM5*p)rpt)quj0u>8L_0$0G|G$cv@%ihiC``}^gvYjBf(F|7ve@y$EV$m`u2wtU zNjNo!_KCl5smX*;+TXcxKj)$%iUeXSGKK?(xW0_CxKqvpFGbgdM{Z93XH=Pug7a(k z<|Z7`6PAlnuQT?qz=hG}udpqjkF<)Qz%QcvhNRy9lx364%Q*)6@qBEng?X_pTZFJZy zu>5fGaJ+53YyRHR)FN<_I|4u}^8J48F>l-1*}ZW@v0%dtE=Y zvoJDWmua;#0OIK~1`@(9?<+3nzM@_SZIzvPkYv&5Es`#|VE%+4cNnuw5zR9!*6QL4?2#a=vjpK#*N32}EU^I^m?TW-hU-IiNTiVHOe zYgV+_Q>x&;1rPW6qp7l|3PYV9U5A0p3OpCvM=43Wa=wJ)SFl^me3Xx`Nouo;+dVFp zU=<1KiXe_fCKE?ZTZi9T$y-6%2=WwAd#8pA)9jTsn(=Djs z!UJDX<%q+G>At$bfVNj8yOP?W8kSlmBveCq52~ACKwt^~bGcsa&QV*dlEcRj%6gBX z8*3jnpHFr(adbzNBPANj>s}e7HQ1$l*fy4ucaI*<_{k^*mz!? z9mfX;oK1brRg;!Swko=O3BTBur)mF%pDQ?OS?8))JpPdxRZAT?`!2TuY>hUxv|y|S zN-H)a5}upU#g<2g8R2Sfzv7p>SA!Qs_So(W@IbAnzMm` zhLaVhiUJ{l+f7&9`t<3i!Rd(|%rWp1)ojF0BVh?XK z6g;H9D3QN`IRsND?PTuyFFS$)6_*U=?C1G2gD2-{3RtPr8YnJWO|`o|6SRbU-yJKHv)gI=bDBj?TzZjx4n(ZXvGLhgSjUDtcxL{%jC6`* zDa5*kw!Lw1-6ElM^h@z3ZmAcGal)-m7u?cyT0vOh2bQhS zbk=fBts!xX&DoAI(|x}cYw4edEZ^spa-MD2pPcWiaP6;;a8;Isr2w!j~0rgL?j(l^#J^L*%wI*chT*8739TKirmiiaF!+_8GF zQMq_HGEl=}5jE1p%(rnzIb=AxZ!bhQhc=5B437EtQI3a08Mx?w__54An<)Yb_7m)p VCGRUz;F}~Oh^n?qsq(Y8{{vz#Cgk3J;_lc~U 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 literal 21022 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/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 IYPlr-ALFsiXaE2J From b5f682559bd50495ab44dd46d75eea7693882c27 Mon Sep 17 00:00:00 2001 From: piyush-poddar Date: Tue, 28 May 2024 02:45:47 +0530 Subject: [PATCH 10/68] Added Content: Bar Plots in Matplotlib --- contrib/plotting-visualization/bar-plots.md | 216 ++++++++++++++++++ .../images/bar_colors_and_legends.png | Bin 0 -> 22079 bytes .../images/bar_labels.png | Bin 0 -> 24793 bytes .../images/basic_bar_plot.png | Bin 0 -> 11890 bytes .../images/horizontal_bar_plot_1.png | Bin 0 -> 25704 bytes .../images/horizontal_bar_plot_2.png | Bin 0 -> 25689 bytes .../images/title_and_axis_labels.png | Bin 0 -> 18124 bytes contrib/plotting-visualization/index.md | 1 + 8 files changed, 217 insertions(+) create mode 100644 contrib/plotting-visualization/bar-plots.md create mode 100644 contrib/plotting-visualization/images/bar_colors_and_legends.png create mode 100644 contrib/plotting-visualization/images/bar_labels.png create mode 100644 contrib/plotting-visualization/images/basic_bar_plot.png create mode 100644 contrib/plotting-visualization/images/horizontal_bar_plot_1.png create mode 100644 contrib/plotting-visualization/images/horizontal_bar_plot_2.png create mode 100644 contrib/plotting-visualization/images/title_and_axis_labels.png diff --git a/contrib/plotting-visualization/bar-plots.md b/contrib/plotting-visualization/bar-plots.md new file mode 100644 index 0000000..104001d --- /dev/null +++ b/contrib/plotting-visualization/bar-plots.md @@ -0,0 +1,216 @@ +# Bar Plots in Matplotlib +A bar plot or a bar chart is a type of data visualisation that represents data in the form of rectangular bars, with lengths or heights proportional to the values and data which they represent. The bar plots can be plotted both vertically and horizontally. + +It is one of the most widely used type of data visualisation as it is easy to interpret and is pleasing to the eyes. + +Matplotlib provides a very easy and intuitive method to create highly customized bar plots. + +## Prerequisites + +Before creating bar plots in matplotlib you must ensure that you have Python as well as Matplotlib installed on your system. + +## Creating a simple Bar Plot with `bar()` method + +A very basic Bar Plot can be created with `bar()` method in `matplotlib.pyplot` + +```Python +import matplotlib.pyplot as plt + +# Creating dataset +x = ["A", "B", "C", "D"] +y = [2, 7, 9, 11] + +# Creating bar plot +plt.bar(x,y) +plt.show() # Shows the plot +``` +When executed, this would show the following bar plot: + +![Basic Bar Plot](images/basic_bar_plot.png) + +The `bar()` function takes arguments that describes the layout of the bars. + +Here, `plt.bar(x,y)` is used to specify that the bar chart is to be plotted by taking the `x` array as X-axis and `y` array as Y-axis. You can customize the graph further like adding labels to the axes, color of the bars, etc. These will be explored in the upcoming sections. + +Additionally, you can also use `numpy` arrays for faster generation when handling large datasets. + +```Python +import matplotlib.pyplot as plt +import numpy as np + +# Using numpy array +x = np.array(["A", "B", "C", "D"]) +y = np.array([2, 7, 9, 11]) + +plt.bar(x,y) +plt.show() +``` +Its output would be the same as above. + +## Customizing Bar Plots + +For creating customized bar plots, it is **highly recommended** to create the plots using `matplotlib.pyplot.subplots()`, otherwise it is difficult to apply the customizations in the newer versions of Matplotlib. + +### Adding title to the graph and labeling the axes + +Let us create an imaginary graph of number of cars sold in a various years. + +```Python +import matplotlib.pyplot as plt + +fig, ax = plt.subplots() + +years = ['1999', '2000', '2001', '2002'] +num_of_cars_sold = [300, 500, 700, 1000] + +# Creating bar plot +ax.bar(years, num_of_cars_sold) + +# Adding axis labels +ax.set_xlabel("Years") +ax.set_ylabel("Number of cars sold") + +# Adding plot title +ax.set_title("Number of cars sold in various years") + +plt.show() +``` + +![Title and axis labels](images/title_and_axis_labels.png) + +Here, we have created a `matplotlib.pyplot.subplots()` object which returns a `Figure` object `fig` as well as an `Axes` object `ax` both of which are used for customizing the bar plot. `ax.set_xlabel`, `ax.set_ylabel` and `ax.set_title` are respectively used for adding labels of X, Y axis and adding title to the graph. + +### Adding bar colors and legends + +Let us consider our previous example of number of cars sold in various years and suppose that we want to add different colors to the bars from different centuries and respective legends for better interpretation. + +This can be achieved by creating two separate arrays `bar_colors` for bar colors and `bar_labels` for legend labels and passing them as arguments to parameters color and label respectively in `ax.bar` method. + +```Python +import matplotlib.pyplot as plt + +fig, ax = plt.subplots() + +years = ['1998', '1999', '2000', '2001', '2002'] +num_of_cars_sold = [200, 300, 500, 700, 1000] +bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] +bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] + +# Creating the customized bar plot +ax.bar(years, num_of_cars_sold, color=bar_colors, label=bar_labels) + +# Adding axis labels +ax.set_xlabel("Years") +ax.set_ylabel("Number of cars sold") + +# Adding plot title +ax.set_title("Number of cars sold in various years") + +# Adding legend title +ax.legend(title='Centuries') + +plt.show() +``` + +![Bar colors and Legends](images/bar_colors_and_legends.png) + +Note that the labels with a preceding underscore won't show up in the legend. Legend titles can be added by simply passing `title` argument in `ax.legend()`, as shown. Also, you can have a different color for all the bars by passing the `HEX` value of that color in the `color` parameter. + +### Adding labels to bars + +We may want to add labels to bars representing their absolute (or truncated) values for instant and accurate reading. This can be achieved by passing the `BarContainer` object (returned by `ax.bar()` method) which is basically a aontainer with all the bars and optionally errorbars to `ax.bar_label` method. + +```Python +import matplotlib.pyplot as plt + +fig, ax = plt.subplots() + +years = ['1998', '1999', '2000', '2001', '2002'] +num_of_cars_sold = [200, 300, 500, 700, 1000] +bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] +bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] + +# BarContainer object +bar_container = ax.bar(years, num_of_cars_sold, color=bar_colors, label=bar_labels) + +ax.set_xlabel("Years") +ax.set_ylabel("Number of cars sold") +ax.set_title("Number of cars sold in various years") +ax.legend(title='Centuries') + +# Adding bar labels +ax.bar_label(bar_container) + +plt.show() +``` + +![Bar Labels](images/bar_labels.png) + +**Note:** There are various other methods of adding bar labels in matplotlib. + +## Horizontal Bar Plot + +We can create horizontal bar plots by using the `barh()` method in `matplotlib.pyplot`. All the relevant customizations are applicable here also. + +```Python +import matplotlib.pyplot as plt + +fig, ax = plt.subplots(figsize=(10,5)) # figsize is used to alter the size of figure + +years = ['1998', '1999', '2000', '2001', '2002'] +num_of_cars_sold = [200, 300, 500, 700, 1000] +bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] +bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] + +# Creating horizontal bar plot +bar_container = ax.barh(years, num_of_cars_sold, color=bar_colors, label=bar_labels) + +# Adding axis labels +ax.set_xlabel("Years") +ax.set_ylabel("Number of cars sold") + +# Adding Title +ax.set_title("Number of cars sold in various years") +ax.legend(title='Centuries') + +# Adding bar labels +ax.bar_label(bar_container) + +plt.show() +``` + +![Horizontal Bar Plot-1](images/horizontal_bar_plot_1.png) + +We can also invert the Y-axis labels here to show the top values first. + +```Python +import matplotlib.pyplot as plt + +fig, ax = plt.subplots(figsize=(10,5)) # figsize is used to alter the size of figure + +years = ['1998', '1999', '2000', '2001', '2002'] +num_of_cars_sold = [200, 300, 500, 700, 1000] +bar_colors = ['tab:green', 'tab:green', 'tab:blue', 'tab:blue', 'tab:blue'] +bar_labels = ['1900s', '_1900s', '2000s', '_2000s', '_2000s'] + +# Creating horizontal bar plot +bar_container = ax.barh(years, num_of_cars_sold, color=bar_colors, label=bar_labels) + +# Adding axis labels +ax.set_xlabel("Years") +ax.set_ylabel("Number of cars sold") + +# Adding Title +ax.set_title("Number of cars sold in various years") +ax.legend(title='Centuries') + +# Adding bar labels +ax.bar_label(bar_container) + +# Inverting Y-axis +ax.invert_yaxis() + +plt.show() +``` + +![Horizontal Bar Plot-2](images/horizontal_bar_plot_2.png) \ No newline at end of file diff --git a/contrib/plotting-visualization/images/bar_colors_and_legends.png b/contrib/plotting-visualization/images/bar_colors_and_legends.png new file mode 100644 index 0000000000000000000000000000000000000000..e3af5965a214411a75e0607fb97f2c13f45c100a GIT binary patch literal 22079 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/bar_labels.png b/contrib/plotting-visualization/images/bar_labels.png new file mode 100644 index 0000000000000000000000000000000000000000..9fdc1a6ae657c03c914c6f6e04b88b01d7f838c4 GIT binary patch literal 24793 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 67bee6d..896e10a 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -1,3 +1,4 @@ # List of sections - [Installing Matplotlib](matplotlib_installation.md) +- [Bar Plots in Matplotlib](bar-plots.md) From 6f9708595d58bbf6945dd9f66355f47b5b56d94e Mon Sep 17 00:00:00 2001 From: piyush-poddar Date: Tue, 28 May 2024 03:19:55 +0530 Subject: [PATCH 11/68] Renamed bar-plots.md file to matplotlib_bar_plots.md --- contrib/plotting-visualization/index.md | 2 +- .../{bar-plots.md => matplotlib_bar_plots.md} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename contrib/plotting-visualization/{bar-plots.md => matplotlib_bar_plots.md} (100%) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 896e10a..e7c5745 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -1,4 +1,4 @@ # List of sections - [Installing Matplotlib](matplotlib_installation.md) -- [Bar Plots in Matplotlib](bar-plots.md) +- [Bar Plots in Matplotlib](matplotlib_bar_plots.md) diff --git a/contrib/plotting-visualization/bar-plots.md b/contrib/plotting-visualization/matplotlib_bar_plots.md similarity index 100% rename from contrib/plotting-visualization/bar-plots.md rename to contrib/plotting-visualization/matplotlib_bar_plots.md From d7608ec46647f127219a9ece2aab5a22704e360e Mon Sep 17 00:00:00 2001 From: Manmita Das <34617961+manmita@users.noreply.github.com> Date: Tue, 28 May 2024 16:15:12 +0530 Subject: [PATCH 12/68] Create concatenation-of-arrays.md --- contrib/numpy/concatenation-of-arrays.md | 195 +++++++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 contrib/numpy/concatenation-of-arrays.md diff --git a/contrib/numpy/concatenation-of-arrays.md b/contrib/numpy/concatenation-of-arrays.md new file mode 100644 index 0000000..a0c5051 --- /dev/null +++ b/contrib/numpy/concatenation-of-arrays.md @@ -0,0 +1,195 @@ +# Concatenation of Arrays + +Concatenation of arrays in NumPy refers to combining multiple arrays into a single array, either along existing axes or by adding new axes. NumPy provides several functions for this purpose. + +# Functions of Concatenation + +## np.concatenate + +Joins two or more arrays along an existing axis. + +### Syntax + +```python +numpy.concatenate((arr1, arr2, ...), axis) +``` + +Args: +- arr1, arr2, ...: Sequence of arrays to concatenate. +- axis: Axis along which the arrays will be joined. Default is 0. + +### Example + +```python +import numpy as np +#creating 2 arrays +arr1 = np.array([1 2 3],[7 8 9]) +arr2 = np.array([4 5 6],[10 11 12]) + +#concatenate along axis 0 +result_1 = np.concatenate((arr1, arr2), axis=0) +print("Concatenation along axis 0:") +print(result_1) +""" Output- Concatenation along axis 0: +[[ 1 2 3] + [ 7 8 9] + [ 4 5 6] + [10 11 12]] """ + +#concatenate along axis 1 +result_2 = np.concatenate((arr1, arr2), axis=1) +print("Concatenation along axis 1:") +print(result_2) +""" Output- Concatenation along axis 1: +[[ 1 2 3 4 5 6 ] + [ 7 8 9 10 11 12]] """ + +``` +## np.vstack + +Vertical stacking of arrays (row-wise). + +### Syntax + +```python +numpy.vstack(arrays) +``` + +Args: +- arrays: Sequence of arrays to stack. + +### Example +```python +import numpy as np +#create arrays +arr1= np.array([1 2 3], [7 8 9]) +arr2 = np.array([4 5 6],[10 11 12]) + +result = np.vstack((arr1, arr2)) +print(result) +"""output- +[[ 1 2 3] + [ 7 8 9] + [ 4 5 6] + [10 11 12]] """ +``` +## 3. np.hstack + +Stacks arrays horizontally (column-wise). + +### Syntax + +```python +numpy.hstack(arrays) +``` + +Args: +- arrays: Sequence of arrays to stack. + +### Example + +```python +import numpy as np +#create arrays +arr1= np.array([1 2 3], [7 8 9]) +arr2 = np.array([4 5 6],[10 11 12]) + +result = np.hstack((arr1, arr2)) +print(result) +"""output- +[[ 1 2 3] [ 4 5 6] + [ 7 8 9] [10 11 12]] """ +``` + +## np.dstack + +Stacks arrays along the third axis (depth-wise). + +### Syntax + +```python +numpy.dstack(arrays) +``` + +- arrays: Sequence of arrays to stack. + +### Example + +```python +import numpy as np +#create arrays +arr1= np.array([1 2 3], [7 8 9]) +arr2 = np.array([4 5 6],[10 11 12]) + +result = np.dstack((arr1, arr2)) +print(result) +""" output- +[[[ 1 4] + [ 2 5] + [ 3 6]] + + [[ 7 10] + [ 8 11] + [ 9 12]]] """ +``` + +## np.stack + +Joins a sequence of arrays along a new axis. + +```python +numpy.stack(arrays, axis) +``` + +Args: +- arrays: Sequence of arrays to stack. + +### Example + +```python +import numpy as np +#create arrays +arr1= np.array([1 2 3], [7 8 9]) +arr2 = np.array([4 5 6],[10 11 12]) + +result = np.stack((arr1, arr2), axis=0) +print(result) +""" output- +[[[ 1 2 3] + [ 7 8 9]] + + [[ 4 5 6] + [10 11 12]]] """ +``` + +# Concatenation with Mixed Dimensions + +When concatenating arrays with different shapes, it's often necessary to reshape them to have compatible dimensions. + +## Example + +```python +arr1 = np.array([[1, 2, 3], [4, 5, 6]]) +arr2 = np.array([7, 8, 9]) + +# Concatenate along axis 0 +result_0= np.concatenate((arr1, arr2[np.newaxis, :]), axis=0) +print("Concatenation along axis 0:") +print(result_0) +""" output- +Concatenation along axis 0: +[[1 2 3] + [4 5 6] + [7 8 9]] """ + +# Concatenate along axis 1 +result_1 = np.concatenate((arr1, arr2[:, np.newaxis]), axis=1) +print("\nConcatenation along axis 1:") +print(result_1) +""" output- +Concatenation along axis 1: +[[1 2 3 7] + [4 5 6 8]] """ +``` + + From 81992560369b3c2e8a6e940ab14c35797623abcb Mon Sep 17 00:00:00 2001 From: Manmita Das <34617961+manmita@users.noreply.github.com> Date: Tue, 28 May 2024 16:16:08 +0530 Subject: [PATCH 13/68] Update index.md --- contrib/numpy/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index b2d459a..fb07865 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -8,3 +8,4 @@ - [Loading Arrays from Files](loading_arrays_from_files.md) - [Saving Numpy Arrays into FIles](saving_numpy_arrays_to_files.md) - [Sorting NumPy Arrays](sorting-array.md) +- [Concatenation of Arrays](concatenation-of-arrays.md) From 13829732888a012ee5b198564e211ddd6375f34d Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:01:23 +0530 Subject: [PATCH 14/68] Create numpy_array_iteration.md Added Introduction Added Basic Iteration Added nditer Added ndenumerate Added flat Added Conclusion --- contrib/pandas/numpy_array_iteration.md | 109 ++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 contrib/pandas/numpy_array_iteration.md diff --git a/contrib/pandas/numpy_array_iteration.md b/contrib/pandas/numpy_array_iteration.md new file mode 100644 index 0000000..ac35d95 --- /dev/null +++ b/contrib/pandas/numpy_array_iteration.md @@ -0,0 +1,109 @@ +# NumPy Array Iteration + +Iterating over arrays in NumPy is a common task when processing data. NumPy provides several ways to iterate over elements of an array efficiently. +Understanding these methods is crucial for performing operations on array elements effectively. + +## 1. Basic Iteration + +- Iterating using basic `for` loop. + +**Single-dimensional array iteration**: + +Iterating over a single-dimensional array is straightforward using a basic `for` loop + +```python +import numpy as np + +arr = np.array([1, 2, 3, 4, 5]) +for i in arr: + print(i) +``` +**Output** : +```python +[ 1 2 3 4 5 ] +``` +**Multi-dimensional array**: + +Iterating over multi-dimensional arrays, each iteration returns a sub-array along the first axis. + +```python +marr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) + +for arr in marr: + print(arr) +``` +**Output** : +```python +[1 2 3] +[4 5 6] +[7 8 9] +``` + +## 2. Iterating with nditer + +- `nditer` is a powerful iterator provided by NumPy for iterating over multi-dimensional arrays. +- In each interation it gives each element. + +```python +import numpy as np + +arr = np.array([[1, 2, 3], [4, 5, 6]]) +for i in np.nditer(arr): + print(i) +``` +**Output** : +```python +1 +2 +3 +4 +5 +6 +``` + +## 3. Iterating with ndenumerate + +- `ndenumerate` allows you to iterate with both the index and the value of each element. +- It gives index and value as output in each iteration + +```python +import numpy as np + +arr = np.array([[1, 2], [3, 4]]) +for index,value in np.ndenumerate(arr): + print(index,value) +``` + +**Output** : + +```python +(0, 0) 1 +(0, 1) 2 +(1, 0) 3 +(1, 1) 4 +``` + +## 4. Iterating with flat + +- The `flat` attribute returns a 1-D iterator over the array. +- + +```python +import numpy as np + +arr = np.array([[1, 2], [3, 4]]) +for element in arr.flat: + print(element) +``` + +**Output** : + +```python +1 +2 +3 +4 +``` + +Understanding the various ways to iterate over NumPy arrays can significantly enhance your data processing efficiency. +Whether you are working with single-dimensional or multi-dimensional arrays, NumPy provides versatile tools to iterate and manipulate array elements effectively. From 6c5f9d9fd7acc118339a00b7c33045028f2e895b Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:03:35 +0530 Subject: [PATCH 15/68] Update index.md Added Numpy Array Iteration --- contrib/pandas/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index c71c324..0af05c7 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -7,3 +7,4 @@ - [Excel using Pandas DataFrame](excel_with_pandas.md) - [Importing and Exporting Data in Pandas](import-export.md) - [Handling Missing Values in Pandas](handling-missing-values.md) +- [NumPy Array Iteration](numpy-array-iteration.md) From b31bfc61498761a219a3be2896633e3d6624ad67 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:04:45 +0530 Subject: [PATCH 16/68] Update index.md --- contrib/pandas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 0af05c7..9bf59a3 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -7,4 +7,4 @@ - [Excel using Pandas DataFrame](excel_with_pandas.md) - [Importing and Exporting Data in Pandas](import-export.md) - [Handling Missing Values in Pandas](handling-missing-values.md) -- [NumPy Array Iteration](numpy-array-iteration.md) +- [NumPy Array Iteration](numpy_array_iteration.md) From 5280fb09a8b8cb7118b1cddee2f045eeea9cc4ee Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:28:52 +0530 Subject: [PATCH 17/68] Create numpy_array_iteration.md Added Introduction Added Methods Added examples Added Conclusion --- contrib/numpy/numpy_array_iteration.md | 109 +++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 contrib/numpy/numpy_array_iteration.md diff --git a/contrib/numpy/numpy_array_iteration.md b/contrib/numpy/numpy_array_iteration.md new file mode 100644 index 0000000..ac35d95 --- /dev/null +++ b/contrib/numpy/numpy_array_iteration.md @@ -0,0 +1,109 @@ +# NumPy Array Iteration + +Iterating over arrays in NumPy is a common task when processing data. NumPy provides several ways to iterate over elements of an array efficiently. +Understanding these methods is crucial for performing operations on array elements effectively. + +## 1. Basic Iteration + +- Iterating using basic `for` loop. + +**Single-dimensional array iteration**: + +Iterating over a single-dimensional array is straightforward using a basic `for` loop + +```python +import numpy as np + +arr = np.array([1, 2, 3, 4, 5]) +for i in arr: + print(i) +``` +**Output** : +```python +[ 1 2 3 4 5 ] +``` +**Multi-dimensional array**: + +Iterating over multi-dimensional arrays, each iteration returns a sub-array along the first axis. + +```python +marr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) + +for arr in marr: + print(arr) +``` +**Output** : +```python +[1 2 3] +[4 5 6] +[7 8 9] +``` + +## 2. Iterating with nditer + +- `nditer` is a powerful iterator provided by NumPy for iterating over multi-dimensional arrays. +- In each interation it gives each element. + +```python +import numpy as np + +arr = np.array([[1, 2, 3], [4, 5, 6]]) +for i in np.nditer(arr): + print(i) +``` +**Output** : +```python +1 +2 +3 +4 +5 +6 +``` + +## 3. Iterating with ndenumerate + +- `ndenumerate` allows you to iterate with both the index and the value of each element. +- It gives index and value as output in each iteration + +```python +import numpy as np + +arr = np.array([[1, 2], [3, 4]]) +for index,value in np.ndenumerate(arr): + print(index,value) +``` + +**Output** : + +```python +(0, 0) 1 +(0, 1) 2 +(1, 0) 3 +(1, 1) 4 +``` + +## 4. Iterating with flat + +- The `flat` attribute returns a 1-D iterator over the array. +- + +```python +import numpy as np + +arr = np.array([[1, 2], [3, 4]]) +for element in arr.flat: + print(element) +``` + +**Output** : + +```python +1 +2 +3 +4 +``` + +Understanding the various ways to iterate over NumPy arrays can significantly enhance your data processing efficiency. +Whether you are working with single-dimensional or multi-dimensional arrays, NumPy provides versatile tools to iterate and manipulate array elements effectively. From 7ef8cb226d414c75cb62167aa20d7fa4b78eb051 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:29:29 +0530 Subject: [PATCH 18/68] Delete contrib/pandas/numpy_array_iteration.md Wrong folder --- contrib/pandas/numpy_array_iteration.md | 109 ------------------------ 1 file changed, 109 deletions(-) delete mode 100644 contrib/pandas/numpy_array_iteration.md diff --git a/contrib/pandas/numpy_array_iteration.md b/contrib/pandas/numpy_array_iteration.md deleted file mode 100644 index ac35d95..0000000 --- a/contrib/pandas/numpy_array_iteration.md +++ /dev/null @@ -1,109 +0,0 @@ -# NumPy Array Iteration - -Iterating over arrays in NumPy is a common task when processing data. NumPy provides several ways to iterate over elements of an array efficiently. -Understanding these methods is crucial for performing operations on array elements effectively. - -## 1. Basic Iteration - -- Iterating using basic `for` loop. - -**Single-dimensional array iteration**: - -Iterating over a single-dimensional array is straightforward using a basic `for` loop - -```python -import numpy as np - -arr = np.array([1, 2, 3, 4, 5]) -for i in arr: - print(i) -``` -**Output** : -```python -[ 1 2 3 4 5 ] -``` -**Multi-dimensional array**: - -Iterating over multi-dimensional arrays, each iteration returns a sub-array along the first axis. - -```python -marr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) - -for arr in marr: - print(arr) -``` -**Output** : -```python -[1 2 3] -[4 5 6] -[7 8 9] -``` - -## 2. Iterating with nditer - -- `nditer` is a powerful iterator provided by NumPy for iterating over multi-dimensional arrays. -- In each interation it gives each element. - -```python -import numpy as np - -arr = np.array([[1, 2, 3], [4, 5, 6]]) -for i in np.nditer(arr): - print(i) -``` -**Output** : -```python -1 -2 -3 -4 -5 -6 -``` - -## 3. Iterating with ndenumerate - -- `ndenumerate` allows you to iterate with both the index and the value of each element. -- It gives index and value as output in each iteration - -```python -import numpy as np - -arr = np.array([[1, 2], [3, 4]]) -for index,value in np.ndenumerate(arr): - print(index,value) -``` - -**Output** : - -```python -(0, 0) 1 -(0, 1) 2 -(1, 0) 3 -(1, 1) 4 -``` - -## 4. Iterating with flat - -- The `flat` attribute returns a 1-D iterator over the array. -- - -```python -import numpy as np - -arr = np.array([[1, 2], [3, 4]]) -for element in arr.flat: - print(element) -``` - -**Output** : - -```python -1 -2 -3 -4 -``` - -Understanding the various ways to iterate over NumPy arrays can significantly enhance your data processing efficiency. -Whether you are working with single-dimensional or multi-dimensional arrays, NumPy provides versatile tools to iterate and manipulate array elements effectively. From 866d28dfdd63539e570e5eead81afc2f1c7e9b06 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:30:02 +0530 Subject: [PATCH 19/68] Update index.md Removed unwanted section --- contrib/pandas/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 9bf59a3..2b3149a 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -7,4 +7,4 @@ - [Excel using Pandas DataFrame](excel_with_pandas.md) - [Importing and Exporting Data in Pandas](import-export.md) - [Handling Missing Values in Pandas](handling-missing-values.md) -- [NumPy Array Iteration](numpy_array_iteration.md) + From 8a2b838e7bd47122c18cb4877399ebc98e559482 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:30:37 +0530 Subject: [PATCH 20/68] Update index.md Added numpy array iteration section --- contrib/numpy/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index b2d459a..5e88e1d 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -8,3 +8,4 @@ - [Loading Arrays from Files](loading_arrays_from_files.md) - [Saving Numpy Arrays into FIles](saving_numpy_arrays_to_files.md) - [Sorting NumPy Arrays](sorting-array.md) +- [NumPy Array Iteration](numpy_array_iteration.md) From 1f4f3abd20eac2ad0c04e8372c2254a12b2e55d6 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Tue, 28 May 2024 21:34:59 +0530 Subject: [PATCH 21/68] Update index.md --- contrib/pandas/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 2b3149a..c71c324 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -7,4 +7,3 @@ - [Excel using Pandas DataFrame](excel_with_pandas.md) - [Importing and Exporting Data in Pandas](import-export.md) - [Handling Missing Values in Pandas](handling-missing-values.md) - From 58cfc5b9021b44c461e14ab309e29e4a28a6be8d Mon Sep 17 00:00:00 2001 From: Ritesh Date: Wed, 29 May 2024 10:34:20 +0530 Subject: [PATCH 22/68] Create Logistic_Regression.md --- .../machine-learning/Logistic_Regression.md | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 contrib/machine-learning/Logistic_Regression.md diff --git a/contrib/machine-learning/Logistic_Regression.md b/contrib/machine-learning/Logistic_Regression.md new file mode 100644 index 0000000..3111550 --- /dev/null +++ b/contrib/machine-learning/Logistic_Regression.md @@ -0,0 +1,121 @@ +# Logistic Regression + +Logistic Regression is a statistical method used for binary classification problems. It is a type of regression analysis where the dependent variable is categorical. This README provides an overview of logistic regression, including its fundamental concepts, assumptions, and how to implement it using Python. + +## Table of Contents + +1. [Introduction](#introduction) +2. [Concepts](#concepts) +3. [Assumptions](#assumptions) +4. [Implementation](#implementation) + - [Using Scikit-learn](#using-scikit-learn) + - [Code Example](#code-example) +5. [Evaluation Metrics](#evaluation-metrics) +6. [Conclusion](#conclusion) +7. [References](#references) + +## Introduction + +Logistic Regression is used to model the probability of a binary outcome based on one or more predictor variables (features). It is widely used in various fields such as medical research, social sciences, and machine learning for tasks such as spam detection, fraud detection, and predicting user behavior. + +## Concepts + +### Sigmoid Function + +The logistic regression model uses the sigmoid function to map predicted values to probabilities. The sigmoid function is defined as: + +$$ +\sigma(z) = \frac{1}{1 + e^{-z}} +$$ + +Where \( z \) is a linear combination of the input features. + +### Odds and Log-Odds + +- **Odds**: The odds represent the ratio of the probability of an event occurring to the probability of it not occurring. + +$$\text{Odds} = \frac{P(Y=1)}{P(Y=0)}$$ + +- **Log-Odds**: The log-odds is the natural logarithm of the odds. + + $$\text{Log-Odds} = \log \left( \frac{P(Y=1)}{P(Y=0)} \right)$$ + +Logistic regression models the log-odds as a linear combination of the input features. + +### Model Equation + +The logistic regression model equation is: + +$$ +\log \left( \frac{P(Y=1)}{P(Y=0)} \right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_n X_n +$$ + +Where: +- β₀ is the intercept. +- βi are the coefficients for the predictor variables Xi. + + +## Assumptions + +1. **Linearity**: The log-odds of the response variable are a linear combination of the predictor variables. +2. **Independence**: Observations should be independent of each other. +3. **No Multicollinearity**: Predictor variables should not be highly correlated with each other. +4. **Large Sample Size**: Logistic regression requires a large sample size to provide reliable results. + +## Implementation + +### Using Scikit-learn + +Scikit-learn is a popular machine learning library in Python that provides tools for logistic regression. + +### Code Example + +```python +import numpy as np +import pandas as pd +from sklearn.model_selection import train_test_split +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import accuracy_score, confusion_matrix, classification_report + +# Load dataset +data = pd.read_csv('path/to/your/dataset.csv') + +# Define features and target variable +X = data[['feature1', 'feature2', 'feature3']] +y = data['target'] + +# Split data into training and testing sets +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Initialize and train logistic regression model +model = LogisticRegression() +model.fit(X_train, y_train) + +# Make predictions +y_pred = model.predict(X_test) + +# Evaluate the model +accuracy = accuracy_score(y_test, y_pred) +conf_matrix = confusion_matrix(y_test, y_pred) +class_report = classification_report(y_test, y_pred) + +print("Accuracy:", accuracy) +print("Confusion Matrix:\n", conf_matrix) +print("Classification Report:\n", class_report) +``` + +## Evaluation Metrics + +- **Accuracy**: The proportion of correctly classified instances among all instances. +- **Confusion Matrix**: A table showing the number of true positives, true negatives, false positives, and false negatives. +- **Precision, Recall, and F1-Score**: Metrics to evaluate the performance of the classification model. + +## Conclusion + +Logistic regression is a fundamental classification technique that is easy to implement and interpret. It is a powerful tool for binary classification problems and provides a probabilistic framework for predicting binary outcomes. + +## References + +- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) +- [Wikipedia: Logistic Regression](https://en.wikipedia.org/wiki/Logistic_regression) +- [Towards Data Science: Understanding Logistic Regression](https://towardsdatascience.com/understanding-logistic-regression-9b02c2aec102) From a8c83302b7c7d063d98951799595c7c7b78050f5 Mon Sep 17 00:00:00 2001 From: Ritesh Date: Wed, 29 May 2024 10:35:42 +0530 Subject: [PATCH 23/68] Update index.md --- contrib/machine-learning/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 94ca1e2..0b9c2b0 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -9,3 +9,4 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) +- [Logistic Regression](Logistic_Regression.md) From 9f0f50fe4803009d1d4968a0e2f4722b061751a2 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Thu, 30 May 2024 19:27:15 +0530 Subject: [PATCH 24/68] Added index --- contrib/numpy/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index b2d459a..df759d9 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -3,6 +3,7 @@ - [Installing NumPy](installing-numpy.md) - [Introduction](introduction.md) - [NumPy Data Types](datatypes.md) +- [Numpy Array Shape and Reshape](array_reshape.md) - [Basic Mathematics](basic_math.md) - [Operations on Arrays in NumPy](operations-on-arrays.md) - [Loading Arrays from Files](loading_arrays_from_files.md) From ed9e0652008dc706d96fbbc0833d7458bcc2e386 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Thu, 30 May 2024 19:55:02 +0530 Subject: [PATCH 25/68] Numpy array reshape() is added --- contrib/numpy/array_reshape.md | 54 ++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 contrib/numpy/array_reshape.md diff --git a/contrib/numpy/array_reshape.md b/contrib/numpy/array_reshape.md new file mode 100644 index 0000000..d3d7f59 --- /dev/null +++ b/contrib/numpy/array_reshape.md @@ -0,0 +1,54 @@ +# Numpy Array Shape and Reshape +In NumPy, the primary data structure is the ndarray (N-dimensional array). An array can have one or more dimensions, and it organizes your data efficiently. + +Code to create a 2D array +``` python +import numpy as np + +numbers = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) +print(numbers) + +# Output: +# array([[1, 2, 3, 4],[5, 6, 7, 8]]) +``` + +## Changing Array Shape using Reshape() +The `reshape()` function allows you to rearrange the data within a NumPy array. +It take 2 arguements, row and columns. The `reshape()` can add or remove the dimensions. For instance, array can convert a 1D array into a 2D array or vice versa. + +``` python +arr_1d = np.array([1, 2, 3, 4, 5, 6]) # 1D array +arr_2d = arr_1d.reshape(2, 3) # Reshaping with 2rows and 3cols + +print(arr_2d) + +# Output: +# array([[1, 2, 3],[4, 5, 6]]) + +``` + +## Changing Array Shape using Resize() +The `resize()` function allows you to modify the shape of a NumPy array directly. +It take 2 arguements, row and columns. + +``` python +import numpy as np +arr_1d = np.array([1, 2, 3, 4, 5, 6]) + +arr_1d.resize((2, 3)) # 2rows and 3cols +print(arr_1d) + +# Output: +# array([[1, 2, 3],[4, 5, 6]]) + +``` + +## Reshape() VS Resize() + +| Reshape | Resize | +| ----------- | ----------- | +| Does not modify the original array | Modifies the original array in-place | +| Creates a new array | Changes the shape of the array | +| Returns a reshaped array | Doesn't return anything | +| Compatibility between dimensions | Does not compatibility between dimensions | +| Syntax: reshape(row,col) | Syntax: resize((row,col)) | From 002178161db58da11a0b6126d6b17bd27f0d769c Mon Sep 17 00:00:00 2001 From: Arihant Yadav <147732947+arihunter-18@users.noreply.github.com> Date: Thu, 30 May 2024 23:12:41 +0530 Subject: [PATCH 26/68] Add files via upload --- contrib/database/intro_sqlalchemy.md | 105 +++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 contrib/database/intro_sqlalchemy.md diff --git a/contrib/database/intro_sqlalchemy.md b/contrib/database/intro_sqlalchemy.md new file mode 100644 index 0000000..6606390 --- /dev/null +++ b/contrib/database/intro_sqlalchemy.md @@ -0,0 +1,105 @@ +# SQLAlchemy +SQLAlchemy is a powerful and flexible SQL toolkit and Object-Relational Mapping (ORM) library for Python. It is a versatile library that bridges the gap between Python applications and relational databases.
+ +SQLAlchemy allows the user to write database-agnostic code that can work with a variety of relational databases such as SQLite, MySQL, PostgreSQL, Oracle, and Microsoft SQL Server. The ORM layer in SQLAlchemy allows developers to map Python classes to database tables. This means you can interact with your database using Python objects instead of writing raw SQL queries. + +## Setting up the Environment +* Python and MySQL Server must be installed and configured. +* The library: **mysql-connector-python** and **sqlalchemy** must be installed. + +```bash +pip install sqlalchemy mysql-connector-python +``` +* If not installed, you can install them using the above command in terminal, + +## Establishing Connection with Database +* Create a connection with the database using the following code snippet: +```python +from sqlalchemy import create_engine +from sqlalchemy.orm import declarative_base +from sqlalchemy.orm import sessionmaker + +DATABASE_URL = 'mysql+mysqlconnector://root:12345@localhost/gssoc' + +engine = create_engine(DATABASE_URL) +Session = sessionmaker(bind=engine) +session = Session() + +Base = declarative_base() +``` +* The connection string **DATABASE_URL** is passed as an argument to **create_engine** function which is used to create a connection to the database. This connection string contains the database credentials such as the database type, username, password, and database name. +* The **sessionmaker** function is used to create a session object which is used to interact with the database +* The **declarative_base** function is used to create a base class for all the database models. This base class is used to define the structure of the database tables. + +## Creating Tables +* The following code snippet creates a table named **"products"** in the database: +```python +from sqlalchemy import Column, Integer, String, Float + +class Product(Base): + __tablename__ = 'products' + id = Column(Integer, primary_key=True) + name = Column(String(50)) + category = Column(String(50)) + price = Column(Float) + quantity = Column(Integer) + +Base.metadata.create_all(engine) +``` +* The **Product class** inherits from **Base**, which is a base class for all the database models. +* The **Base.metadata.create_all(engine)** statement is used to create the table in the database. The engine object is a connection to the database that was created earlier. + +## Inserting Data for Aggregation Functions +* The following code snippet inserts data into the **"products"** table: +```python +products = [ + Product(name='Laptop', category='Electronics', price=1000, quantity=50), + Product(name='Smartphone', category='Electronics', price=700, quantity=150), + Product(name='Tablet', category='Electronics', price=400, quantity=100), + Product(name='Headphones', category='Accessories', price=100, quantity=200), + Product(name='Charger', category='Accessories', price=20, quantity=300), +] + +session.add_all(products) +session.commit() +``` +* A list of **Product** objects is created. Each Product object represents a row in the **products table** in the database. +* The **add_all** method of the session object is used to add all the Product objects to the session. This method takes a **list of objects as an argument** and adds them to the session. +* The **commit** method of the session object is used to commit the changes made to the database. + +## Aggregation Functions +SQLAlchemy provides functions that correspond to SQL aggregation functions and are available in the **sqlalchemy.func module**. +### COUNT +The **COUNT** function returns the number of rows in a result set. It can be demonstrated using the following code snippet: +```python +from sqlalchemy import func + +total_products = session.query(func.count(Product.id)).scalar() +print(f'Total products: {total_products}') +``` +### SUM +The **SUM** function returns the sum of all values in a column. It can be demonstrated using the following code snippet: +```python +total_price = session.query(func.sum(Product.price)).scalar() +print(f'Total price of all products: {total_price}') +``` +### AVG +The **AVG** function returns the average of all values in a column. It can be demonstrated by the following code snippet: +```python +average_price = session.query(func.avg(Product.price)).scalar() +print(f'Average price of products: {average_price}') +``` +### MAX +The **MAX** function returns the maximum value in a column. It can be demonstrated using the following code snippet : +```python +max_price = session.query(func.max(Product.price)).scalar() +print(f'Maximum price of products: {max_price}') +``` +### MIN +The **MIN** function returns the minimum value in a column. It can be demonstrated using the following code snippet: +```python +min_price = session.query(func.min(Product.price)).scalar() +print(f'Minimum price of products: {min_price}') +``` + +In general, the aggregation functions can be implemented by utilising the **session** object to execute the desired query on the table present in a database using the **query()** method. The **scalar()** method is called on the query object to execute the query and return a single value \ No newline at end of file From d2e70303e5388e1b69623cabe980b5d440f1c428 Mon Sep 17 00:00:00 2001 From: Arihant Yadav <147732947+arihunter-18@users.noreply.github.com> Date: Thu, 30 May 2024 23:15:58 +0530 Subject: [PATCH 27/68] Update index.md --- contrib/database/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/database/index.md b/contrib/database/index.md index 56cd85b..2d57e4d 100644 --- a/contrib/database/index.md +++ b/contrib/database/index.md @@ -1,3 +1,4 @@ # List of sections - [Introduction to MySQL and Queries](intro_mysql_queries.md) +- [SQLAlchemy and Aggregation Functions](sqlalchemy_aggregation.md) From 33e2191bac6eb16ce94dddeb0bdbcfd2d9c44787 Mon Sep 17 00:00:00 2001 From: Arihant Yadav <147732947+arihunter-18@users.noreply.github.com> Date: Thu, 30 May 2024 23:16:57 +0530 Subject: [PATCH 28/68] Update and rename intro_sqlalchemy.md to sqlalchemy_aggregation.md --- .../database/{intro_sqlalchemy.md => sqlalchemy_aggregation.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/database/{intro_sqlalchemy.md => sqlalchemy_aggregation.md} (97%) diff --git a/contrib/database/intro_sqlalchemy.md b/contrib/database/sqlalchemy_aggregation.md similarity index 97% rename from contrib/database/intro_sqlalchemy.md rename to contrib/database/sqlalchemy_aggregation.md index 6606390..c18e8df 100644 --- a/contrib/database/intro_sqlalchemy.md +++ b/contrib/database/sqlalchemy_aggregation.md @@ -102,4 +102,4 @@ min_price = session.query(func.min(Product.price)).scalar() print(f'Minimum price of products: {min_price}') ``` -In general, the aggregation functions can be implemented by utilising the **session** object to execute the desired query on the table present in a database using the **query()** method. The **scalar()** method is called on the query object to execute the query and return a single value \ No newline at end of file +In general, the aggregation functions can be implemented by utilising the **session** object to execute the desired query on the table present in a database using the **query()** method. The **scalar()** method is called on the query object to execute the query and return a single value From ac4cca21bd61066338d7ee1d424b8c29ed6f04ef Mon Sep 17 00:00:00 2001 From: piyush-poddar Date: Fri, 31 May 2024 03:21:01 +0530 Subject: [PATCH 29/68] Added Content: Pie Charts in Matplotlib --- .../plotting-visualization/images/autopct.png | Bin 0 -> 22307 bytes .../images/basic_pie_chart.png | Bin 0 -> 13967 bytes .../images/coloring_slices.png | Bin 0 -> 13693 bytes .../images/explode_slice.png | Bin 0 -> 22837 bytes .../images/hatch_patterns.png | Bin 0 -> 45297 bytes .../plotting-visualization/images/legends.png | Bin 0 -> 25236 bytes .../plotting-visualization/images/radius.png | Bin 0 -> 17017 bytes .../images/rotating_slices.png | Bin 0 -> 21976 bytes .../plotting-visualization/images/shadow.png | Bin 0 -> 28011 bytes contrib/plotting-visualization/index.md | 1 + .../matplotlib_pie_charts.md | 233 ++++++++++++++++++ 11 files changed, 234 insertions(+) create mode 100644 contrib/plotting-visualization/images/autopct.png create mode 100644 contrib/plotting-visualization/images/basic_pie_chart.png create mode 100644 contrib/plotting-visualization/images/coloring_slices.png create mode 100644 contrib/plotting-visualization/images/explode_slice.png create mode 100644 contrib/plotting-visualization/images/hatch_patterns.png create mode 100644 contrib/plotting-visualization/images/legends.png create mode 100644 contrib/plotting-visualization/images/radius.png create mode 100644 contrib/plotting-visualization/images/rotating_slices.png create mode 100644 contrib/plotting-visualization/images/shadow.png create mode 100644 contrib/plotting-visualization/matplotlib_pie_charts.md diff --git a/contrib/plotting-visualization/images/autopct.png b/contrib/plotting-visualization/images/autopct.png new file mode 100644 index 0000000000000000000000000000000000000000..8030fc0ed90222379b0eac48f67c97b9c71b3d68 GIT binary patch literal 22307 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/basic_pie_chart.png b/contrib/plotting-visualization/images/basic_pie_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..3feb244a877b5b54d05cf617fdc3c9a460ee7b3b GIT binary patch literal 13967 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 n|NHWP=DgAW-?LGFontYY4X~_QoMH%g% literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/coloring_slices.png b/contrib/plotting-visualization/images/coloring_slices.png new file mode 100644 index 0000000000000000000000000000000000000000..9c87b70addb7e3b2a73f27974d4206b422397edf GIT binary patch literal 13693 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 bcdUo*Lei3>Xg1(gD3F%Au3DXnW%&O9k`Q7b literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/explode_slice.png b/contrib/plotting-visualization/images/explode_slice.png new file mode 100644 index 0000000000000000000000000000000000000000..7bf344d5c864e4136ce062b0dcdb5e729f6a17ef GIT binary patch literal 22837 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/hatch_patterns.png b/contrib/plotting-visualization/images/hatch_patterns.png new file mode 100644 index 0000000000000000000000000000000000000000..d5fed83eae9314739c31fb85c607b9714b324f35 GIT binary patch literal 45297 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

DMUzW{`QgZT)M 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/legends.png b/contrib/plotting-visualization/images/legends.png new file mode 100644 index 0000000000000000000000000000000000000000..880d3233f0b9755e31b97fe2c9b9131255361b9b GIT binary patch literal 25236 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/shadow.png b/contrib/plotting-visualization/images/shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..d1101a782d8d052f8bcdb11b86d25ac65158bcc5 GIT binary patch literal 28011 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�Oa5oehXRSNO^w(0#Pz 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 Date: Fri, 31 May 2024 04:50:16 +0530 Subject: [PATCH 30/68] Update index.md --- contrib/pandas/index.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 58b21a5..051f3b0 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -5,6 +5,7 @@ - [Pandas Descriptive Statistics](Descriptive_Statistics.md) - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [Excel using Pandas DataFrame](excel_with_pandas.md) -- [Working with datetime using Pandas](datetime_with_pandas.md) +- [Working with datetime in Pandas](datetime.md) - [Importing and Exporting Data in Pandas](import-export.md) -- [Handling Missing Values in Pandas](handling-missing-values.md) \ No newline at end of file +- [Handling Missing Values in Pandas](handling-missing-values.md) + From eba755cb6370a9642efdc6298d8a3d46eb3564a6 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:06:11 +0530 Subject: [PATCH 31/68] Update and rename datetime_with_pandas.md to datetime.md --- .../{datetime_with_pandas.md => datetime.md} | 46 ++++++++----------- 1 file changed, 19 insertions(+), 27 deletions(-) rename contrib/pandas/{datetime_with_pandas.md => datetime.md} (58%) diff --git a/contrib/pandas/datetime_with_pandas.md b/contrib/pandas/datetime.md similarity index 58% rename from contrib/pandas/datetime_with_pandas.md rename to contrib/pandas/datetime.md index d87d9ec..008d6fc 100644 --- a/contrib/pandas/datetime_with_pandas.md +++ b/contrib/pandas/datetime.md @@ -1,10 +1,6 @@ -# Pandas DateTime +# Working with Date & Time in Pandas -Pandas is a robust Python library that is available as free source. The Pandas library is used to manipulate and analyse data. Pandas are made up of data structures and functions that allow for efficient data processing. - -While working with data, it is common to come across time series data. Pandas is a very handy tool for dealing with time series data. Pandas is a strong Python data analysis toolkit that provides a wide range of date and time data processing options. Many data science jobs require working with time series data, time zones, and date arithmetic, and pandas simplifies these processes. - -Features of Pandas `Date_Time`: +While working with data, it is common to come across data containing date and time. Pandas is a very handy tool for dealing with such data and provides a wide range of date and time data processing options. - **Parsing dates and times**: Pandas provides a number of functions for parsing dates and times from strings, including `to_datetime()` and `parse_dates()`. These functions can handle a variety of date and time formats, Unix timestamps, and human-readable formats. @@ -12,13 +8,9 @@ Features of Pandas `Date_Time`: - **Visualizing dates and times**: Pandas provides a number of functions for visualizing dates and times, including `plot()`, `hist()`, and `bar()`. These functions can be used to create line charts, histograms, and bar charts of date and time data. +### `Timestamp` function - -### Installation of libraries - -`pip install pandas` - -- **Note**: There is no need to install a seperate library for date_time operations, pandas module itself has built-in functions. +The timestamp function in Pandas is used to convert a datetime object to a Unix timestamp. A Unix timestamp is a numerical representation of datetime. Example for retrieving day, month and year from given date: @@ -35,15 +27,13 @@ print('Day is: ', d) ``` Output: + ```python Year is: 2024 Month is: 5 Day is: 5 ``` -- **Note**: The timestamp function in Pandas is used to convert a datetime object to a Unix timestamp. A Unix timestamp is a numerical representation of datetime. - - Example for extracting time related data from given date: ```python @@ -57,6 +47,7 @@ print('Quarter is: ', ts.quarter) ``` Output: + ```python Hour is: 12 Minute is: 0 @@ -64,6 +55,8 @@ Weekday is: 1 Quarter is: 4 ``` +### `Timestamp.now()` + Example for getting current date and time: ```python @@ -78,6 +71,8 @@ Output: Current date and time is: 2024-05-25 11:48:25.593213 ``` +### `date_range` function + Example for generating dates' for next five days: ```python @@ -89,6 +84,7 @@ for i in ts: ``` Output: + ```python 2024-05-25 2024-05-26 @@ -116,11 +112,11 @@ Output: 2024-05-25 ``` -### Pandas `DateTime` is Efficient than Built-in `DateTime` library in various aspects like: +### Built-in vs pandas date & time operations -- **In pandas, you may add a time delta to a full column of dates in a single action, but Python's datetime requires a loop.** +In `pandas`, you may add a time delta to a full column of dates in a single action, but Python's datetime requires a loop. -Example using Pandas DateTime: +Example in Pandas: ```python import pandas as pd @@ -146,7 +142,7 @@ Output: 99999 2023-03-12 10:39:00 ``` -Example using Built-In datetime library: +Example using Built-in datetime library: ```python from datetime import datetime, timedelta @@ -155,12 +151,8 @@ dates = [datetime(2023, 1, 1) + timedelta(minutes=i) for i in range(100000)] dates = [date + timedelta(days=1) for date in dates] ``` -Output: -```The output is very large to display and taking more time to display``` +Why use pandas functions? - -- **Pandas employs NumPy's datetime64 dtype, which takes up a set amount of bytes (usually 8 bytes per date), to store datetime data more compactly and efficiently.** -- **Each datetime object in Python takes up extra memory since it contains not only the date and time but also the additional metadata and overhead associated with Python objects.** - -- **Pandas Offers a wide range of convenient functions and methods for date manipulation, extraction, and conversion, such as `pd.to_datetime()`, `date_range()`, `timedelta_range()`, and more.** -- **datetime library requires manual implementation for many of these operations, leading to longer and less efficient code.** +- Pandas employs NumPy's datetime64 dtype, which takes up a set amount of bytes (usually 8 bytes per date), to store datetime data more compactly and efficiently. +- Each datetime object in Python takes up extra memory since it contains not only the date and time but also the additional metadata and overhead associated with Python objects. +- Pandas Offers a wide range of convenient functions and methods for date manipulation, extraction, and conversion, such as `pd.to_datetime()`, `date_range()`, `timedelta_range()`, and more. datetime library requires manual implementation for many of these operations, leading to longer and less efficient code. From 90aa15145b2289d9c203bbddf79de917cd7daa8d Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:07:26 +0530 Subject: [PATCH 32/68] Update index.md --- contrib/pandas/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 051f3b0..c17d839 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -5,7 +5,6 @@ - [Pandas Descriptive Statistics](Descriptive_Statistics.md) - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [Excel using Pandas DataFrame](excel_with_pandas.md) -- [Working with datetime in Pandas](datetime.md) +- [Working with Date & Time in Pandas](datetime.md) - [Importing and Exporting Data in Pandas](import-export.md) - [Handling Missing Values in Pandas](handling-missing-values.md) - From 976eb8cffd558f544efd27d2be4e30303a236191 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:10:48 +0530 Subject: [PATCH 33/68] Update index.md --- contrib/ds-algorithms/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 3645f82..31cff39 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -1,7 +1,6 @@ # List of sections -- [Section title](filename.md) -- [Time Space Complexity](time-space-complexity.md) +- [Time & Space Complexity](time-space-complexity.md) - [Queues in Python](Queues.md) - [Graphs](graph.md) - [Sorting Algorithms](sorting-algorithms.md) From db796bfc2b1a30f5167e5f5b4e4cbe73db7ed0ca Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:19:31 +0530 Subject: [PATCH 34/68] Update time-space-complexity.md --- .../ds-algorithms/time-space-complexity.md | 86 +++++++++++-------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/contrib/ds-algorithms/time-space-complexity.md b/contrib/ds-algorithms/time-space-complexity.md index 79a072f..eeadd64 100644 --- a/contrib/ds-algorithms/time-space-complexity.md +++ b/contrib/ds-algorithms/time-space-complexity.md @@ -1,7 +1,10 @@ # Time and Space Complexity We can solve a problem using one or more algorithms. It's essential to learn how to compare the performance of different algorithms and select the best one for a specific task. -Therefore, it is highly required to use a method to compare the solutions in order to judge which one is more optimal.
The method must be: + +Therefore, it is highly required to use a method to compare the solutions in order to judge which one is more optimal. + +The method must be: - Regardless of the system or its settings on which the algorithm is executing. - Demonstrate a direct relationship with the quantity of inputs. @@ -35,9 +38,7 @@ $$ Graphical representation of Big Oh: -![BigOh Notation Graph](./images/Time-And-Space-Complexity-BigOh.png) - -Image Credit: www.programiz.com +![BigOh Notation Graph](images/Time-And-Space-Complexity-BigOh.png) ### 2. Big Omega (Ω) Notation @@ -51,9 +52,7 @@ $$ Graphical representation of Big Omega: -![BigOmega Notation Graph](./images/Time-And-Space-Complexity-BigOmega.png) - -Image Credit: www.programiz.com +![BigOmega Notation Graph](images/Time-And-Space-Complexity-BigOmega.png) ### 3. Big Theta (Θ) Notation @@ -67,61 +66,64 @@ $$ Graphical representation of Big Theta: -![Big Theta Notation Graph](./images/Time-And-Space-Complexity-BigTheta.png) - - -Image Credit: www.programiz.com - +![Big Theta Notation Graph](images/Time-And-Space-Complexity-BigTheta.png) ## Best Case, Worst Case and Average Case + ### 1. Best-Case Scenario: + The best-case scenario refers to the situation where an algorithm performs optimally, achieving the lowest possible time or space complexity. It represents the most favorable conditions under which an algorithm operates. #### Characteristics: -- Represents the minimum time or space required by an algorithm to solve a problem. + +- Represents the minimum time or space required by an algorithm to solve a problem. - Occurs when the input data is structured in such a way that the algorithm can exploit its strengths fully. - Often used to analyze the lower bound of an algorithm's performance. #### Example: -Consider the `linear search algorithm` where we're searching for a `target element` in an array. The best-case scenario occurs when the target element is found `at the very beginning of the array`. In this case, the algorithm would only need to make one comparison, resulting in a time complexity of O(1). +Consider the `linear search algorithm` where we're searching for a `target element` in an array. The best-case scenario occurs when the target element is found `at the very beginning of the array`. In this case, the algorithm would only need to make one comparison, resulting in a time complexity of `O(1)`. ### 2. Worst-Case Scenario: + The worst-case scenario refers to the situation where an algorithm performs at its poorest, achieving the highest possible time or space complexity. It represents the most unfavorable conditions under which an algorithm operates. #### Characteristics: + - Represents the maximum time or space required by an algorithm to solve a problem. - Occurs when the input data is structured in such a way that the algorithm encounters the most challenging conditions. - Often used to analyze the upper bound of an algorithm's performance. #### Example: -Continuing with the `linear search algorithm`, the worst-case scenario occurs when the `target element` is either not present in the array or located `at the very end`. In this case, the algorithm would need to iterate through the entire array, resulting in a time complexity of O(n), where n is the size of the array. +Continuing with the `linear search algorithm`, the worst-case scenario occurs when the `target element` is either not present in the array or located `at the very end`. In this case, the algorithm would need to iterate through the entire array, resulting in a time complexity of `O(n)`, where `n` is the size of the array. ### 3. Average-Case Scenario: + The average-case scenario refers to the expected performance of an algorithm over all possible inputs, typically calculated as the arithmetic mean of the time or space complexity. #### Characteristics: + - Represents the typical performance of an algorithm across a range of input data. - Takes into account the distribution of inputs and their likelihood of occurrence. - Provides a more realistic measure of an algorithm's performance compared to the best-case or worst-case scenarios. #### Example: -- For the `linear search algorithm`, the average-case scenario considers the probability distribution of the target element's position within the array. If the `target element is equally likely to be found at any position in the array`, the average-case time complexity would be O(n/2), as the algorithm would, on average, need to search halfway through the array. +For the `linear search algorithm`, the average-case scenario considers the probability distribution of the target element's position within the array. If the `target element is equally likely to be found at any position in the array`, the average-case time complexity would be `O(n/2)`, as the algorithm would, on average, need to search halfway through the array. ## Space Complexity + The memory space that a code utilizes as it is being run is often referred to as space complexity. Additionally, space complexity depends on the machine, therefore rather than using the typical memory units like MB, GB, etc., we will express space complexity using the Big O notation. #### Examples of Space Complexity + 1. `Constant Space Complexity (O(1))`: Algorithms that operate on a fixed-size array or use a constant number of variables have O(1) space complexity. - 2. `Linear Space Complexity (O(n))`: Algorithms that store each element of the input array in a separate variable or data structure have O(n) space complexity. - 3. `Quadratic Space Complexity (O(n^2))`: Algorithms that create a two-dimensional array or matrix with dimensions based on the input size have O(n^2) space complexity. - #### Analyzing Space Complexity + To analyze space complexity: - Identify the variables, data structures, and recursive calls used by the algorithm. @@ -130,18 +132,23 @@ To analyze space complexity: ## Examples to calculate time and space complexity -#### 1. Print all elements of given array : +#### 1. Print all elements of given array + Consider each line takes one unit of time to run. So, to simply iterate over an array to print all elements it will take `O(n)` time, where n is the size of array. + Code: + ```python arr = [1,2,3,4] #1 for x in arr: #2 print(x) #3 ``` -Here, the 1st statement executes only once. So, it takes one unit of time to run. The for loop consisting of 2nd and 3rd statements executes 4 times. + +Here, the 1st statement executes only once. So, it takes one unit of time to run. The for loop consisting of 2nd and 3rd statements executes 4 times. Also, as the code dosen't take any additional space except the input arr its Space Complexity is O(1) constant. #### 2. Linear Search + Linear search is a simple algorithm for finding an element in an array by sequentially checking each element until a match is found or the end of the array is reached. Here's an example of calculating the time and space complexity of linear search: ```python @@ -156,17 +163,20 @@ arr = [1, 3, 5, 7, 9] target = 5 print(linear_search(arr, target)) ``` -`Time Complexity Analysis:` -The for loop iterates through the entire array, which takes O(n) time in the worst case, where n is the size of the array. -Inside the loop, each operation takes constant time (O(1)). + +**Time Complexity Analysis** + +The for loop iterates through the entire array, which takes O(n) time in the worst case, where n is the size of the array. +Inside the loop, each operation takes constant time (O(1)). Therefore, the time complexity of linear search is `O(n)`. +**Space Complexity Analysis** -`Space Complexity Analysis:` The space complexity of linear search is `O(1)` since it only uses a constant amount of additional space for variables regardless of the input size. #### 3. Binary Search + Binary search is an efficient algorithm for finding an element in a sorted array by repeatedly dividing the search interval in half. Here's an example of calculating the time and space complexity of binary search: ```python @@ -190,18 +200,21 @@ def binary_search(arr, target): arr = [1, 3, 5, 7, 9] target = 5 print(binary_search(arr, target)) - ``` -`Time Complexity Analysis:` -The initialization of left and right takes constant time (O(1)). -The while loop runs for log(n) iterations in the worst case, where n is the size of the array. -Inside the loop, each operation takes constant time (O(1)). + +**Time Complexity Analysis** + +The initialization of left and right takes constant time (O(1)). +The while loop runs for log(n) iterations in the worst case, where n is the size of the array. +Inside the loop, each operation takes constant time (O(1)). Therefore, the time complexity of binary search is `O(log n)`. -`Space Complexity Analysis:` +**Space Complexity Analysis** + The space complexity of binary search is `O(1)` since it only uses a constant amount of additional space for variables regardless of the input size. #### 4. Fibbonaci Sequence + Let's consider an example of a function that generates Fibonacci numbers up to a given index and stores them in a list. In this case, the space complexity will not be constant because the size of the list grows with the Fibonacci sequence. ```python @@ -219,9 +232,12 @@ n = 10 fib_sequence = fibonacci_sequence(n) print(fib_sequence) ``` -`Time Complexity Analysis:` + +**Time Complexity Analysis** + The while loop iterates until the length of the Fibonacci sequence list reaches n, so it takes `O(n)` iterations in the `worst case`.Inside the loop, each operation takes constant time (O(1)). -`Space Complexity Analysis:` -The space complexity of this function is not constant because it creates and stores a list of Fibonacci numbers. -As n grows, the size of the list also grows, so the space complexity is O(n), where n is the index of the last Fibonacci number generated. \ No newline at end of file +**Space Complexity Analysis** + +The space complexity of this function is not constant because it creates and stores a list of Fibonacci numbers. +As n grows, the size of the list also grows, so the space complexity is O(n), where n is the index of the last Fibonacci number generated. From dc015fb32fdb5c8d13beb1f6db76cc669f7d4f5e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:36:53 +0530 Subject: [PATCH 35/68] Update index.md --- contrib/plotting-visualization/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index e7c5745..cabea95 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -1,4 +1,4 @@ # List of sections -- [Installing Matplotlib](matplotlib_installation.md) -- [Bar Plots in Matplotlib](matplotlib_bar_plots.md) +- [Installing Matplotlib](installation.md) +- [Bar Plots in Matplotlib](bar-plots.md) From 5f8a9d01ea69a7eb70ccfdc2c1f4690486f6cf77 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:37:07 +0530 Subject: [PATCH 36/68] Rename matplotlib_bar_plots.md to bar-plots.md --- .../{matplotlib_bar_plots.md => bar-plots.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/plotting-visualization/{matplotlib_bar_plots.md => bar-plots.md} (99%) diff --git a/contrib/plotting-visualization/matplotlib_bar_plots.md b/contrib/plotting-visualization/bar-plots.md similarity index 99% rename from contrib/plotting-visualization/matplotlib_bar_plots.md rename to contrib/plotting-visualization/bar-plots.md index 104001d..97d45ce 100644 --- a/contrib/plotting-visualization/matplotlib_bar_plots.md +++ b/contrib/plotting-visualization/bar-plots.md @@ -213,4 +213,4 @@ ax.invert_yaxis() plt.show() ``` -![Horizontal Bar Plot-2](images/horizontal_bar_plot_2.png) \ No newline at end of file +![Horizontal Bar Plot-2](images/horizontal_bar_plot_2.png) From 077e569deafbb0b0beb244e2c9ddb45df3549723 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:37:52 +0530 Subject: [PATCH 37/68] Rename matplotlib_installation.md to matplotlib-installation.md --- .../{matplotlib_installation.md => matplotlib-installation.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/plotting-visualization/{matplotlib_installation.md => matplotlib-installation.md} (100%) diff --git a/contrib/plotting-visualization/matplotlib_installation.md b/contrib/plotting-visualization/matplotlib-installation.md similarity index 100% rename from contrib/plotting-visualization/matplotlib_installation.md rename to contrib/plotting-visualization/matplotlib-installation.md From 7bb7b05ea1de0d1a6d15d985df652579d20a5724 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 05:38:17 +0530 Subject: [PATCH 38/68] Update index.md --- contrib/plotting-visualization/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index cabea95..4d7fda8 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -1,4 +1,4 @@ # List of sections -- [Installing Matplotlib](installation.md) -- [Bar Plots in Matplotlib](bar-plots.md) +- [Installing Matplotlib](matplotlib-installation.md) +- [Bar Plots in Matplotlib](matplotlib-bar-plots.md) From a904e73c65f8bd1941794fe9a87295b4c0493f5e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 06:07:45 +0530 Subject: [PATCH 39/68] Update concatenation-of-arrays.md --- contrib/numpy/concatenation-of-arrays.md | 90 ++++++++++++++++-------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/contrib/numpy/concatenation-of-arrays.md b/contrib/numpy/concatenation-of-arrays.md index a0c5051..bf27512 100644 --- a/contrib/numpy/concatenation-of-arrays.md +++ b/contrib/numpy/concatenation-of-arrays.md @@ -20,31 +20,39 @@ Args: ### Example +#### Concatenate along axis 0 + ```python import numpy as np #creating 2 arrays arr1 = np.array([1 2 3],[7 8 9]) arr2 = np.array([4 5 6],[10 11 12]) -#concatenate along axis 0 result_1 = np.concatenate((arr1, arr2), axis=0) -print("Concatenation along axis 0:") print(result_1) -""" Output- Concatenation along axis 0: +``` + +#### Output +``` [[ 1 2 3] [ 7 8 9] [ 4 5 6] - [10 11 12]] """ - -#concatenate along axis 1 -result_2 = np.concatenate((arr1, arr2), axis=1) -print("Concatenation along axis 1:") -print(result_2) -""" Output- Concatenation along axis 1: -[[ 1 2 3 4 5 6 ] - [ 7 8 9 10 11 12]] """ - + [10 11 12]] ``` + +#### Concatenate along axis 1 + +```python +result_2 = np.concatenate((arr1, arr2), axis=1) +print(result_2) +``` + +#### Output +``` +[[ 1 2 3 4 5 6 ] + [ 7 8 9 10 11 12]] +``` + ## np.vstack Vertical stacking of arrays (row-wise). @@ -59,6 +67,7 @@ Args: - arrays: Sequence of arrays to stack. ### Example + ```python import numpy as np #create arrays @@ -67,12 +76,16 @@ arr2 = np.array([4 5 6],[10 11 12]) result = np.vstack((arr1, arr2)) print(result) -"""output- +``` + +#### Output +``` [[ 1 2 3] [ 7 8 9] [ 4 5 6] - [10 11 12]] """ + [10 11 12]] ``` + ## 3. np.hstack Stacks arrays horizontally (column-wise). @@ -96,9 +109,12 @@ arr2 = np.array([4 5 6],[10 11 12]) result = np.hstack((arr1, arr2)) print(result) -"""output- +``` + +#### Output +``` [[ 1 2 3] [ 4 5 6] - [ 7 8 9] [10 11 12]] """ + [ 7 8 9] [10 11 12]] ``` ## np.dstack @@ -123,14 +139,17 @@ arr2 = np.array([4 5 6],[10 11 12]) result = np.dstack((arr1, arr2)) print(result) -""" output- +``` + +#### Output +``` [[[ 1 4] [ 2 5] [ 3 6]] [[ 7 10] [ 8 11] - [ 9 12]]] """ + [ 9 12]]] ``` ## np.stack @@ -154,12 +173,15 @@ arr2 = np.array([4 5 6],[10 11 12]) result = np.stack((arr1, arr2), axis=0) print(result) -""" output- +``` + +#### Output +``` [[[ 1 2 3] [ 7 8 9]] [[ 4 5 6] - [10 11 12]]] """ + [10 11 12]]] ``` # Concatenation with Mixed Dimensions @@ -168,28 +190,34 @@ When concatenating arrays with different shapes, it's often necessary to reshape ## Example +#### Concatenate along axis 0 + ```python arr1 = np.array([[1, 2, 3], [4, 5, 6]]) arr2 = np.array([7, 8, 9]) -# Concatenate along axis 0 result_0= np.concatenate((arr1, arr2[np.newaxis, :]), axis=0) -print("Concatenation along axis 0:") print(result_0) -""" output- -Concatenation along axis 0: +``` + +#### Output +``` [[1 2 3] [4 5 6] - [7 8 9]] """ + [7 8 9]] +``` -# Concatenate along axis 1 +#### Concatenate along axis 1 + +```python result_1 = np.concatenate((arr1, arr2[:, np.newaxis]), axis=1) -print("\nConcatenation along axis 1:") print(result_1) -""" output- -Concatenation along axis 1: +``` + +#### Output +``` [[1 2 3 7] - [4 5 6 8]] """ + [4 5 6 8]] ``` From 75423bc5ba6e4a698ebc53df6f13af52f4cfc21f Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 06:14:48 +0530 Subject: [PATCH 40/68] Rename numpy_array_iteration.md to array-iteration.md --- contrib/numpy/{numpy_array_iteration.md => array-iteration.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/numpy/{numpy_array_iteration.md => array-iteration.md} (100%) diff --git a/contrib/numpy/numpy_array_iteration.md b/contrib/numpy/array-iteration.md similarity index 100% rename from contrib/numpy/numpy_array_iteration.md rename to contrib/numpy/array-iteration.md From 3bebec30e0529dac743073495a12ad85cd1e3904 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 06:18:47 +0530 Subject: [PATCH 41/68] Update array-iteration.md --- contrib/numpy/array-iteration.md | 35 +++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/contrib/numpy/array-iteration.md b/contrib/numpy/array-iteration.md index ac35d95..b0a499f 100644 --- a/contrib/numpy/array-iteration.md +++ b/contrib/numpy/array-iteration.md @@ -7,7 +7,7 @@ Understanding these methods is crucial for performing operations on array elemen - Iterating using basic `for` loop. -**Single-dimensional array iteration**: +### Single-dimensional array Iterating over a single-dimensional array is straightforward using a basic `for` loop @@ -18,11 +18,18 @@ arr = np.array([1, 2, 3, 4, 5]) for i in arr: print(i) ``` -**Output** : + +#### Output + ```python -[ 1 2 3 4 5 ] +1 +2 +3 +4 +5 ``` -**Multi-dimensional array**: + +### Multi-dimensional array Iterating over multi-dimensional arrays, each iteration returns a sub-array along the first axis. @@ -32,14 +39,16 @@ marr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) for arr in marr: print(arr) ``` -**Output** : + +#### Output + ```python [1 2 3] [4 5 6] [7 8 9] ``` -## 2. Iterating with nditer +## 2. Iterating with `nditer` - `nditer` is a powerful iterator provided by NumPy for iterating over multi-dimensional arrays. - In each interation it gives each element. @@ -51,7 +60,9 @@ arr = np.array([[1, 2, 3], [4, 5, 6]]) for i in np.nditer(arr): print(i) ``` -**Output** : + +#### Output + ```python 1 2 @@ -61,7 +72,7 @@ for i in np.nditer(arr): 6 ``` -## 3. Iterating with ndenumerate +## 3. Iterating with `ndenumerate` - `ndenumerate` allows you to iterate with both the index and the value of each element. - It gives index and value as output in each iteration @@ -74,7 +85,7 @@ for index,value in np.ndenumerate(arr): print(index,value) ``` -**Output** : +#### Output ```python (0, 0) 1 @@ -86,7 +97,6 @@ for index,value in np.ndenumerate(arr): ## 4. Iterating with flat - The `flat` attribute returns a 1-D iterator over the array. -- ```python import numpy as np @@ -96,7 +106,7 @@ for element in arr.flat: print(element) ``` -**Output** : +#### Output ```python 1 @@ -105,5 +115,6 @@ for element in arr.flat: 4 ``` -Understanding the various ways to iterate over NumPy arrays can significantly enhance your data processing efficiency. +Understanding the various ways to iterate over NumPy arrays can significantly enhance your data processing efficiency. + Whether you are working with single-dimensional or multi-dimensional arrays, NumPy provides versatile tools to iterate and manipulate array elements effectively. From d1bc3127082c3a27b7f2eb27a52fbb4b1013cc36 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 06:21:12 +0530 Subject: [PATCH 42/68] Rename Logistic_Regression.md to logistic-regression.md --- .../{Logistic_Regression.md => logistic-regression.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Logistic_Regression.md => logistic-regression.md} (100%) diff --git a/contrib/machine-learning/Logistic_Regression.md b/contrib/machine-learning/logistic-regression.md similarity index 100% rename from contrib/machine-learning/Logistic_Regression.md rename to contrib/machine-learning/logistic-regression.md From ad01516cf8f834d7c4afbf907cd72320bc432f1e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 06:21:28 +0530 Subject: [PATCH 43/68] Update index.md --- contrib/machine-learning/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 0b9c2b0..46100df 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -9,4 +9,4 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) -- [Logistic Regression](Logistic_Regression.md) +- [Logistic Regression](logistic-regression.md) From 70547423e3af49f0c65c7b444f8d2987239e87a5 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 06:23:46 +0530 Subject: [PATCH 44/68] Update logistic-regression.md --- contrib/machine-learning/logistic-regression.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/contrib/machine-learning/logistic-regression.md b/contrib/machine-learning/logistic-regression.md index 3111550..2e45e98 100644 --- a/contrib/machine-learning/logistic-regression.md +++ b/contrib/machine-learning/logistic-regression.md @@ -113,9 +113,3 @@ print("Classification Report:\n", class_report) ## Conclusion Logistic regression is a fundamental classification technique that is easy to implement and interpret. It is a powerful tool for binary classification problems and provides a probabilistic framework for predicting binary outcomes. - -## References - -- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression) -- [Wikipedia: Logistic Regression](https://en.wikipedia.org/wiki/Logistic_regression) -- [Towards Data Science: Understanding Logistic Regression](https://towardsdatascience.com/understanding-logistic-regression-9b02c2aec102) From 1646a8c0330695ef4750a2ca533062a7c1c61599 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 06:32:34 +0530 Subject: [PATCH 45/68] Update recursion.md --- contrib/ds-algorithms/recursion.md | 41 +++++++----------------------- 1 file changed, 9 insertions(+), 32 deletions(-) diff --git a/contrib/ds-algorithms/recursion.md b/contrib/ds-algorithms/recursion.md index 67c630b..4233242 100644 --- a/contrib/ds-algorithms/recursion.md +++ b/contrib/ds-algorithms/recursion.md @@ -2,7 +2,7 @@ When a function calls itself to solve smaller instances of the same problem until a specified condition is fulfilled is called recursion. It is used for tasks that can be divided into smaller sub-tasks. -# How Recursion Works +## How Recursion Works To solve a problem using recursion we must define: - Base condition :- The condition under which recursion ends. @@ -17,7 +17,7 @@ When a recursive function is called, the following sequence of events occurs: - Stack Management: Each recursive call is placed on the call stack. The stack keeps track of each function call, its argument, and the point to return to once the call completes. - Unwinding the Stack: When the base case is eventually met, the function returns a value, and the stack starts unwinding, returning values to previous function calls until the initial call is resolved. -# Python Code: Factorial using Recursion +## Python Code: Factorial using Recursion ```python def fact(n): @@ -30,7 +30,7 @@ if __name__ == "__main__": print("Factorial of", n, "is", fact(n)) ``` -## Explanation +### Explanation This Python script calculates the factorial of a given number using recursion. @@ -43,8 +43,7 @@ This Python script calculates the factorial of a given number using recursion. - The main section prompts the user to enter a positive number. - It then calls the `fact` function with the input number and prints the result. -### Example : Let n = 4 - +#### Example : Let n = 4 The recursion unfolds as follows: 1. When `fact(4)` is called, it computes `4 * fact(3)`. @@ -55,48 +54,26 @@ The recursion unfolds as follows: 6. `fact(4)` receives the value from `fact(3)`, resulting in `4 * 6` i.e. `24`. 7. Finally, `fact(4)` returns 24 to the main function. - #### So, the result is 24. - - -# What is Stack Overflow in Recursion +#### What is Stack Overflow in Recursion? Stack overflow is an error that occurs when the call stack memory limit is exceeded. During execution of recursion calls they are simultaneously stored in a recursion stack waiting for the recursive function to be completed. Without a base case, the function would call itself indefinitely, leading to a stack overflow. -# Example - -- Factorial of a Number - - The factorial of i natural numbers is nth integer multiplied by factorial of (i-1) numbers. The base case is if i=0 we return 1 as factorial of 0 is 1. - -```python -def factorial(i): - #base case - if i==0 : - return 1 - #recursive case - else : - return i * factorial(i-1) -i = 6 -print("Factorial of i is :", factorial(i)) # Output- Factorial of i is :720 -``` -# What is Backtracking +## What is Backtracking Backtracking is a recursive algorithmic technique used to solve problems by exploring all possible solutions and discarding those that do not meet the problem's constraints. It is particularly useful for problems involving combinations, permutations, and finding paths in a grid. -# How Backtracking Works +## How Backtracking Works - Incremental Solution Building: Solutions are built one step at a time. - Feasibility Check: At each step, a check is made to see if the current partial solution is valid. - Backtracking: If a partial solution is found to be invalid, the algorithm backtracks by removing the last added part of the solution and trying the next possibility. - Exploration of All Possibilities: The process continues recursively, exploring all possible paths, until a solution is found or all possibilities are exhausted. -# Example +## Example: Word Search -- Word Search - - Given a 2D grid of characters and a word, determine if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where "adjacent" cells are horizontally or vertically neighboring. The same letter cell may not be used more than once. +Given a 2D grid of characters and a word, determine if the word exists in the grid. The word can be constructed from letters of sequentially adjacent cells, where "adjacent" cells are horizontally or vertically neighboring. The same letter cell may not be used more than once. Algorithm for Solving the Word Search Problem with Backtracking: - Start at each cell: Attempt to find the word starting from each cell. From 73955bd969f1f799832976af4177d24c3f09b9ff Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 07:10:57 +0530 Subject: [PATCH 46/68] Update index.md --- contrib/numpy/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index df759d9..2e418ab 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -3,7 +3,7 @@ - [Installing NumPy](installing-numpy.md) - [Introduction](introduction.md) - [NumPy Data Types](datatypes.md) -- [Numpy Array Shape and Reshape](array_reshape.md) +- [Numpy Array Shape and Reshape](reshape-array.md) - [Basic Mathematics](basic_math.md) - [Operations on Arrays in NumPy](operations-on-arrays.md) - [Loading Arrays from Files](loading_arrays_from_files.md) From bf4fa5a067c550d3a76403789e33839827c96021 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 07:11:13 +0530 Subject: [PATCH 47/68] Rename array_reshape.md to reshape-array.md --- contrib/numpy/{array_reshape.md => reshape-array.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/numpy/{array_reshape.md => reshape-array.md} (100%) diff --git a/contrib/numpy/array_reshape.md b/contrib/numpy/reshape-array.md similarity index 100% rename from contrib/numpy/array_reshape.md rename to contrib/numpy/reshape-array.md From 02c7f2c3a202fc7234c5000dd010b1f3df6b9910 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 07:19:32 +0530 Subject: [PATCH 48/68] Update reshape-array.md --- contrib/numpy/reshape-array.md | 53 ++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/contrib/numpy/reshape-array.md b/contrib/numpy/reshape-array.md index d3d7f59..91da366 100644 --- a/contrib/numpy/reshape-array.md +++ b/contrib/numpy/reshape-array.md @@ -1,54 +1,57 @@ # Numpy Array Shape and Reshape + In NumPy, the primary data structure is the ndarray (N-dimensional array). An array can have one or more dimensions, and it organizes your data efficiently. -Code to create a 2D array +Let us create a 2D array + ``` python import numpy as np numbers = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) print(numbers) - -# Output: -# array([[1, 2, 3, 4],[5, 6, 7, 8]]) ``` -## Changing Array Shape using Reshape() +#### Output: + +``` python +array([[1, 2, 3, 4],[5, 6, 7, 8]]) +``` + +## Changing Array Shape using `reshape()` + The `reshape()` function allows you to rearrange the data within a NumPy array. -It take 2 arguements, row and columns. The `reshape()` can add or remove the dimensions. For instance, array can convert a 1D array into a 2D array or vice versa. + +It take 2 arguments, row and columns. The `reshape()` can add or remove the dimensions. For instance, array can convert a 1D array into a 2D array or vice versa. ``` python arr_1d = np.array([1, 2, 3, 4, 5, 6]) # 1D array -arr_2d = arr_1d.reshape(2, 3) # Reshaping with 2rows and 3cols +arr_2d = arr_1d.reshape(2, 3) # Reshaping with 2 rows and 3 cols print(arr_2d) - -# Output: -# array([[1, 2, 3],[4, 5, 6]]) - ``` -## Changing Array Shape using Resize() +#### Output: + +``` python +array([[1, 2, 3],[4, 5, 6]]) +``` + +## Changing Array Shape using `resize()` + The `resize()` function allows you to modify the shape of a NumPy array directly. + It take 2 arguements, row and columns. ``` python import numpy as np arr_1d = np.array([1, 2, 3, 4, 5, 6]) -arr_1d.resize((2, 3)) # 2rows and 3cols +arr_1d.resize((2, 3)) # 2 rows and 3 cols print(arr_1d) - -# Output: -# array([[1, 2, 3],[4, 5, 6]]) - ``` -## Reshape() VS Resize() +#### Output: -| Reshape | Resize | -| ----------- | ----------- | -| Does not modify the original array | Modifies the original array in-place | -| Creates a new array | Changes the shape of the array | -| Returns a reshaped array | Doesn't return anything | -| Compatibility between dimensions | Does not compatibility between dimensions | -| Syntax: reshape(row,col) | Syntax: resize((row,col)) | +``` python +array([[1, 2, 3],[4, 5, 6]]) +``` From 1f515ff7fc489e95ced9d41b9c20e9911e454d54 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 07:29:48 +0530 Subject: [PATCH 49/68] Rename matplotlib_pie_charts.md to matplotlib-pie-charts.md --- .../{matplotlib_pie_charts.md => matplotlib-pie-charts.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/plotting-visualization/{matplotlib_pie_charts.md => matplotlib-pie-charts.md} (99%) diff --git a/contrib/plotting-visualization/matplotlib_pie_charts.md b/contrib/plotting-visualization/matplotlib-pie-charts.md similarity index 99% rename from contrib/plotting-visualization/matplotlib_pie_charts.md rename to contrib/plotting-visualization/matplotlib-pie-charts.md index 0a1e56d..66f2aa1 100644 --- a/contrib/plotting-visualization/matplotlib_pie_charts.md +++ b/contrib/plotting-visualization/matplotlib-pie-charts.md @@ -230,4 +230,4 @@ plt.legend(labels, title="Flowers") # Show plot plt.show() ``` -![Legends](images/legends.png) \ No newline at end of file +![Legends](images/legends.png) From 3a1c46a09552b785d6192f3582e91d515238375e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 07:32:57 +0530 Subject: [PATCH 50/68] Update index.md --- contrib/database/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/database/index.md b/contrib/database/index.md index 2d57e4d..bc3d7e6 100644 --- a/contrib/database/index.md +++ b/contrib/database/index.md @@ -1,4 +1,4 @@ # List of sections - [Introduction to MySQL and Queries](intro_mysql_queries.md) -- [SQLAlchemy and Aggregation Functions](sqlalchemy_aggregation.md) +- [SQLAlchemy and Aggregation Functions](sqlalchemy-aggregation.md) From f0db474c8fc1e6536ba78da8057b5590dee43a93 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 07:33:07 +0530 Subject: [PATCH 51/68] Update and rename sqlalchemy_aggregation.md to sqlalchemy-aggregation.md --- .../{sqlalchemy_aggregation.md => sqlalchemy-aggregation.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/database/{sqlalchemy_aggregation.md => sqlalchemy-aggregation.md} (100%) diff --git a/contrib/database/sqlalchemy_aggregation.md b/contrib/database/sqlalchemy-aggregation.md similarity index 100% rename from contrib/database/sqlalchemy_aggregation.md rename to contrib/database/sqlalchemy-aggregation.md From 4eefdc057efe9f519bf860293820880539db9566 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 07:34:49 +0530 Subject: [PATCH 52/68] Update sqlalchemy-aggregation.md --- contrib/database/sqlalchemy-aggregation.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/contrib/database/sqlalchemy-aggregation.md b/contrib/database/sqlalchemy-aggregation.md index c18e8df..9fce96c 100644 --- a/contrib/database/sqlalchemy-aggregation.md +++ b/contrib/database/sqlalchemy-aggregation.md @@ -1,5 +1,5 @@ # SQLAlchemy -SQLAlchemy is a powerful and flexible SQL toolkit and Object-Relational Mapping (ORM) library for Python. It is a versatile library that bridges the gap between Python applications and relational databases.
+SQLAlchemy is a powerful and flexible SQL toolkit and Object-Relational Mapping (ORM) library for Python. It is a versatile library that bridges the gap between Python applications and relational databases. SQLAlchemy allows the user to write database-agnostic code that can work with a variety of relational databases such as SQLite, MySQL, PostgreSQL, Oracle, and Microsoft SQL Server. The ORM layer in SQLAlchemy allows developers to map Python classes to database tables. This means you can interact with your database using Python objects instead of writing raw SQL queries. @@ -10,9 +10,11 @@ SQLAlchemy allows the user to write database-agnostic code that can work with a ```bash pip install sqlalchemy mysql-connector-python ``` + * If not installed, you can install them using the above command in terminal, ## Establishing Connection with Database + * Create a connection with the database using the following code snippet: ```python from sqlalchemy import create_engine @@ -27,11 +29,13 @@ session = Session() Base = declarative_base() ``` + * The connection string **DATABASE_URL** is passed as an argument to **create_engine** function which is used to create a connection to the database. This connection string contains the database credentials such as the database type, username, password, and database name. * The **sessionmaker** function is used to create a session object which is used to interact with the database * The **declarative_base** function is used to create a base class for all the database models. This base class is used to define the structure of the database tables. ## Creating Tables + * The following code snippet creates a table named **"products"** in the database: ```python from sqlalchemy import Column, Integer, String, Float @@ -46,10 +50,12 @@ class Product(Base): Base.metadata.create_all(engine) ``` + * The **Product class** inherits from **Base**, which is a base class for all the database models. * The **Base.metadata.create_all(engine)** statement is used to create the table in the database. The engine object is a connection to the database that was created earlier. ## Inserting Data for Aggregation Functions + * The following code snippet inserts data into the **"products"** table: ```python products = [ @@ -63,13 +69,17 @@ products = [ session.add_all(products) session.commit() ``` + * A list of **Product** objects is created. Each Product object represents a row in the **products table** in the database. * The **add_all** method of the session object is used to add all the Product objects to the session. This method takes a **list of objects as an argument** and adds them to the session. * The **commit** method of the session object is used to commit the changes made to the database. ## Aggregation Functions + SQLAlchemy provides functions that correspond to SQL aggregation functions and are available in the **sqlalchemy.func module**. + ### COUNT + The **COUNT** function returns the number of rows in a result set. It can be demonstrated using the following code snippet: ```python from sqlalchemy import func @@ -77,25 +87,33 @@ from sqlalchemy import func total_products = session.query(func.count(Product.id)).scalar() print(f'Total products: {total_products}') ``` + ### SUM + The **SUM** function returns the sum of all values in a column. It can be demonstrated using the following code snippet: ```python total_price = session.query(func.sum(Product.price)).scalar() print(f'Total price of all products: {total_price}') ``` + ### AVG + The **AVG** function returns the average of all values in a column. It can be demonstrated by the following code snippet: ```python average_price = session.query(func.avg(Product.price)).scalar() print(f'Average price of products: {average_price}') ``` + ### MAX + The **MAX** function returns the maximum value in a column. It can be demonstrated using the following code snippet : ```python max_price = session.query(func.max(Product.price)).scalar() print(f'Maximum price of products: {max_price}') ``` + ### MIN + The **MIN** function returns the minimum value in a column. It can be demonstrated using the following code snippet: ```python min_price = session.query(func.min(Product.price)).scalar() From 21612e4b81468a127feea94ee419d22efcb1133c Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 07:58:39 +0530 Subject: [PATCH 53/68] Update index.md --- contrib/machine-learning/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..e3a8f0b 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -10,3 +10,4 @@ - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) - [Logistic Regression](logistic-regression.md) +- [Grid Search](grid-search.md) From a953122b2681a430e0805de2031f5c20af2ee8cc Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 07:59:40 +0530 Subject: [PATCH 54/68] Create grid-search.md --- contrib/machine-learning/grid-search.md | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 contrib/machine-learning/grid-search.md diff --git a/contrib/machine-learning/grid-search.md b/contrib/machine-learning/grid-search.md new file mode 100644 index 0000000..3bf53ff --- /dev/null +++ b/contrib/machine-learning/grid-search.md @@ -0,0 +1,68 @@ +# Grid Search + +Grid Search is a hyperparameter tuning technique in Machine Learning that helps to find the best combination of hyperparameters for a given model. It works by defining a grid of hyperparameters and then training the model with all the possible combinations of hyperparameters to find the best performing set. +The Grid Search Method considers some hyperparameter combinations and selects the one returning a lower error score. This method is specifically useful when there are only some hyperparameters in order to optimize. However, it is outperformed by other weighted-random search methods when the Machine Learning model grows in complexity. + +## Implementation + +Before applying Grid Searching on any algorithm, Data is used to divided into training and validation set, a validation set is used to validate the models. A model with all possible combinations of hyperparameters is tested on the validation set to choose the best combination. +Grid Searching can be applied to any hyperparameters algorithm whose performance can be improved by tuning hyperparameter. For example, we can apply grid searching on K-Nearest Neighbors by validating its performance on a set of values of K in it. Same thing we can do with Logistic Regression by using a set of values of learning rate to find the best learning rate at which Logistic Regression achieves the best accurac +Let us consider that the model accepts the below three parameters in the form of input: +1. Number of hidden layers [2, 4] +2. Number of neurons in every layer [5, 10] +3. Number of epochs [10, 50] + +If we want to try out two options for every parameter input (as specified in square brackets above), it estimates different combinations. For instance, one possible combination can be [2, 5, 10]. Finding such combinations manually would be a headache. +Now, suppose that we had ten different parameters as input, and we would like to try out five possible values for each and every parameter. It would need manual input from the programmer's end every time we like to alter the value of a parameter, re-execute the code, and keep a record of the outputs for every combination of the parameters. +Grid Search automates that process, as it accepts the possible value for every parameter and executes the code in order to try out each and every possible combination outputs the result for the combinations and outputs the combination having the best accuracy. +Higher values of C tell the model, the training data resembles real world information, place a greater weight on the training data. While lower values of C do the opposite. + +## Explaination of the Code + +The code provided performs hyperparameter tuning for a Logistic Regression model using a manual grid search approach. It evaluates the model's performance for different values of the regularization strength hyperparameter C on the Iris dataset. +1. datasets from sklearn is imported to load the Iris dataset. +2. LogisticRegression from sklearn.linear_model is imported to create and fit the logistic regression model. +3. The Iris dataset is loaded, with X containing the features and y containing the target labels. +4. A LogisticRegression model is instantiated with max_iter=10000 to ensure convergence during the fitting process, as the default maximum iterations (100) might not be sufficient. +5. A list of different values for the regularization strength C is defined. The hyperparameter C controls the regularization strength, with smaller values specifying stronger regularization. +6. An empty list scores is initialized to store the model's performance scores for different values of C. +7. A for loop iterates over each value in the C list: +8. logit.set_params(C=choice) sets the C parameter of the logistic regression model to the current value in the loop. +9. logit.fit(X, y) fits the logistic regression model to the entire Iris dataset (this is typically done on training data in a real scenario, not the entire dataset). +10. logit.score(X, y) calculates the accuracy of the fitted model on the dataset and appends this score to the scores list. +11. After the loop, the scores list is printed, showing the accuracy for each value of C. + +## Python Code + +from sklearn import datasets + +from sklearn.linear_model import LogisticRegression + +iris = datasets.load_iris() + +X = iris['data'] + +y = iris['target'] + +logit = LogisticRegression(max_iter = 10000) + +C = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] + +scores = [] + +for choice in C: + + logit.set_params(C=choice) + + logit.fit(X, y) + + scores.append(logit.score(X, y)) + +print(scores) + +## Results + +[0.9666666666666667, 0.9666666666666667, 0.9733333333333334, 0.9733333333333334, 0.98, 0.98, 0.9866666666666667, 0.9866666666666667] + +We can see that the lower values of C performed worse than the base parameter of 1. However, as we increased the value of C to 1.75 the model experienced increased accuracy. +It seems that increasing C beyond this amount does not help increase model accuracy. From 50d2b654e03d777ef20c20a210732a9b1a44c54e Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:05:09 +0530 Subject: [PATCH 55/68] Update index.md --- contrib/plotting-visualization/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 32261d6..a8416a8 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,3 +3,4 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) +- [Box Plots in Matplotlib](matplotlib-box-plots.md) From c54f6128e9cdee0834d265c7b6ca7a42a105c540 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:06:46 +0530 Subject: [PATCH 56/68] Create matplotlib-box-plots.md --- .../matplotlib-box-plots.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 contrib/plotting-visualization/matplotlib-box-plots.md diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md new file mode 100644 index 0000000..323b5a4 --- /dev/null +++ b/contrib/plotting-visualization/matplotlib-box-plots.md @@ -0,0 +1,104 @@ +# Box Plot + +A box plot represents the distribution of a dataset in a graph. It displays the summary statistics of a dataset, including the minimum, first quartile (Q1), median (Q2), third quartile (Q3), and maximum. The box represents the interquartile range (IQR) between the first and third quartiles, while whiskers extend from the box to the minimum and maximum values. Outliers, if present, may be displayed as individual points beyond the whiskers. + +For example - Imagine you have the exam scores of students from three classes. A box plot is a way to show how these scores are spread out. + +## Key Ranges in Data Distribution + +The data can be distributed between five key ranges, which are as follows - +1. Minimum: Q1-1.5*IQR +2. 1st quartile (Q1): 25th percentile +3. Median: 50th percentile +4. 3rd quartile(Q3): 75th percentile +5. Maximum: Q3+1.5*IQR + +## Purpose of Box Plots + +We can create the box plot of the data to determine the following- +1. The number of outliers in a dataset +2. Is the data skewed or not (skewness is a measure of asymmetry of the distribution) +3. The range of the data + +## Creating Box Plots using Matplotlib + +By using inbuilt funtion boxplot() of pyplot module of matplotlib - + +Syntax - matplotlib.pyplot.boxplot(data,notch=none,vert=none,patch_artist,widths=none) + +1. data: The data should be an array or sequence of arrays which will be plotted. +2. notch: This parameter accepts only Boolean values, either true or false. +3. vert: This attribute accepts a Boolean value. If it is set to true, then the graph will be vertical. Otherwise, it will be horizontal. +4. position: It accepts the array of integers which defines the position of the box. +5. widths: It accepts the array of integers which defines the width of the box. +6. patch_artist: this parameter accepts Boolean values, either true or false, and this is an optional parameter. +7. labels: This accepts the strings which define the labels for each data point +8. meanline: It accepts a boolean value, and it is optional. +9. order: It sets the order of the boxplot. +10. bootstrap: It accepts the integer value, which specifies the range of the notched boxplot. + +## Implementation of Box Plot in Python + +### Import libraries +import matplotlib.pyplot as plt +import numpy as np + +### Creating dataset +np.random.seed(10) +data = np.random.normal(100, 20, 200) +fig = plt.figure(figsize =(10, 7)) + +### Creating plot +plt.boxplot(data) + +### show plot +plt.show() + +### Implementation of Multiple Box Plot in Python +import matplotlib.pyplot as plt +import numpy as np +np.random.seed(10) +dataSet1 = np.random.normal(100, 10, 220) +dataSet2 = np.random.normal(80, 20, 200) +dataSet3 = np.random.normal(60, 35, 220) +dataSet4 = np.random.normal(50, 40, 200) +dataSet = [dataSet1, dataSet2, dataSet3, dataSet4] +figure = plt.figure(figsize =(10, 7)) +ax = figure.add_axes([0, 0, 1, 1]) +bp = ax.boxplot(dataSet) +plt.show() + +### Implementation of Box Plot with Outliers (visual representation of the sales distribution for each product, and the outliers highlight months with exceptionally high or low sales) +import matplotlib.pyplot as plt +import numpy as np + +### Data for monthly sales +product_A_sales = [100, 110, 95, 105, 115, 90, 120, 130, 80, 125, 150, 200] +product_B_sales = [90, 105, 100, 98, 102, 105, 110, 95, 112, 88, 115, 250] +product_C_sales = [80, 85, 90, 78, 82, 85, 88, 92, 75, 85, 200, 95] + +### Introducing outliers +product_A_sales.extend([300, 80]) +product_B_sales.extend([50, 300]) +product_C_sales.extend([70, 250]) + +### Creating a box plot with outliers +plt.boxplot([product_A_sales, product_B_sales, product_C_sales], sym='o') +plt.title('Monthly Sales Performance by Product with Outliers') +plt.xlabel('Products') +plt.ylabel('Sales') +plt.show() + +### Implementation of Grouped Box Plot (to compare the exam scores of students from three different classes (A, B, and C)) +import matplotlib.pyplot as plt +import numpy as np +class_A_scores = [75, 80, 85, 90, 95] +class_B_scores = [70, 75, 80, 85, 90] +class_C_scores = [65, 70, 75, 80, 85] + +### Creating a grouped box plot +plt.boxplot([class_A_scores, class_B_scores, class_C_scores], labels=['Class A', 'Class B', 'Class C']) +plt.title('Exam Scores by Class') +plt.xlabel('Classes') +plt.ylabel('Scores') +plt.show() From c3f715e98321ff5afe0fb50d5dd80e7ec7366a59 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:09:21 +0530 Subject: [PATCH 57/68] Update matplotlib-box-plots.md --- .../matplotlib-box-plots.md | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md index 323b5a4..4d76243 100644 --- a/contrib/plotting-visualization/matplotlib-box-plots.md +++ b/contrib/plotting-visualization/matplotlib-box-plots.md @@ -40,60 +40,97 @@ Syntax - matplotlib.pyplot.boxplot(data,notch=none,vert=none,patch_artist,widths ## Implementation of Box Plot in Python ### Import libraries + import matplotlib.pyplot as plt + import numpy as np ### Creating dataset + np.random.seed(10) + data = np.random.normal(100, 20, 200) + fig = plt.figure(figsize =(10, 7)) ### Creating plot + plt.boxplot(data) ### show plot + plt.show() ### Implementation of Multiple Box Plot in Python + import matplotlib.pyplot as plt + import numpy as np + np.random.seed(10) + dataSet1 = np.random.normal(100, 10, 220) -dataSet2 = np.random.normal(80, 20, 200) + +dataSet2 = np.random.normal(80, 20, 200) + dataSet3 = np.random.normal(60, 35, 220) + dataSet4 = np.random.normal(50, 40, 200) + dataSet = [dataSet1, dataSet2, dataSet3, dataSet4] + figure = plt.figure(figsize =(10, 7)) + ax = figure.add_axes([0, 0, 1, 1]) + bp = ax.boxplot(dataSet) + plt.show() ### Implementation of Box Plot with Outliers (visual representation of the sales distribution for each product, and the outliers highlight months with exceptionally high or low sales) + import matplotlib.pyplot as plt + import numpy as np ### Data for monthly sales + product_A_sales = [100, 110, 95, 105, 115, 90, 120, 130, 80, 125, 150, 200] + product_B_sales = [90, 105, 100, 98, 102, 105, 110, 95, 112, 88, 115, 250] + product_C_sales = [80, 85, 90, 78, 82, 85, 88, 92, 75, 85, 200, 95] ### Introducing outliers + product_A_sales.extend([300, 80]) + product_B_sales.extend([50, 300]) + product_C_sales.extend([70, 250]) ### Creating a box plot with outliers + plt.boxplot([product_A_sales, product_B_sales, product_C_sales], sym='o') + plt.title('Monthly Sales Performance by Product with Outliers') + plt.xlabel('Products') + plt.ylabel('Sales') + plt.show() ### Implementation of Grouped Box Plot (to compare the exam scores of students from three different classes (A, B, and C)) + import matplotlib.pyplot as plt + import numpy as np + class_A_scores = [75, 80, 85, 90, 95] + class_B_scores = [70, 75, 80, 85, 90] + class_C_scores = [65, 70, 75, 80, 85] ### Creating a grouped box plot From d552e04ded85206b731474e0e272f1701641c13a Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:09:57 +0530 Subject: [PATCH 58/68] Update matplotlib-box-plots.md --- contrib/plotting-visualization/matplotlib-box-plots.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md index 4d76243..1780cab 100644 --- a/contrib/plotting-visualization/matplotlib-box-plots.md +++ b/contrib/plotting-visualization/matplotlib-box-plots.md @@ -134,8 +134,13 @@ class_B_scores = [70, 75, 80, 85, 90] class_C_scores = [65, 70, 75, 80, 85] ### Creating a grouped box plot + plt.boxplot([class_A_scores, class_B_scores, class_C_scores], labels=['Class A', 'Class B', 'Class C']) + plt.title('Exam Scores by Class') + plt.xlabel('Classes') + plt.ylabel('Scores') + plt.show() From 208ff1ea06192dc51ebc45f1e32b29a185d4b561 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:13:42 +0530 Subject: [PATCH 59/68] Delete contrib/plotting-visualization/matplotlib-box-plots.md --- .../matplotlib-box-plots.md | 146 ------------------ 1 file changed, 146 deletions(-) delete mode 100644 contrib/plotting-visualization/matplotlib-box-plots.md diff --git a/contrib/plotting-visualization/matplotlib-box-plots.md b/contrib/plotting-visualization/matplotlib-box-plots.md deleted file mode 100644 index 1780cab..0000000 --- a/contrib/plotting-visualization/matplotlib-box-plots.md +++ /dev/null @@ -1,146 +0,0 @@ -# Box Plot - -A box plot represents the distribution of a dataset in a graph. It displays the summary statistics of a dataset, including the minimum, first quartile (Q1), median (Q2), third quartile (Q3), and maximum. The box represents the interquartile range (IQR) between the first and third quartiles, while whiskers extend from the box to the minimum and maximum values. Outliers, if present, may be displayed as individual points beyond the whiskers. - -For example - Imagine you have the exam scores of students from three classes. A box plot is a way to show how these scores are spread out. - -## Key Ranges in Data Distribution - -The data can be distributed between five key ranges, which are as follows - -1. Minimum: Q1-1.5*IQR -2. 1st quartile (Q1): 25th percentile -3. Median: 50th percentile -4. 3rd quartile(Q3): 75th percentile -5. Maximum: Q3+1.5*IQR - -## Purpose of Box Plots - -We can create the box plot of the data to determine the following- -1. The number of outliers in a dataset -2. Is the data skewed or not (skewness is a measure of asymmetry of the distribution) -3. The range of the data - -## Creating Box Plots using Matplotlib - -By using inbuilt funtion boxplot() of pyplot module of matplotlib - - -Syntax - matplotlib.pyplot.boxplot(data,notch=none,vert=none,patch_artist,widths=none) - -1. data: The data should be an array or sequence of arrays which will be plotted. -2. notch: This parameter accepts only Boolean values, either true or false. -3. vert: This attribute accepts a Boolean value. If it is set to true, then the graph will be vertical. Otherwise, it will be horizontal. -4. position: It accepts the array of integers which defines the position of the box. -5. widths: It accepts the array of integers which defines the width of the box. -6. patch_artist: this parameter accepts Boolean values, either true or false, and this is an optional parameter. -7. labels: This accepts the strings which define the labels for each data point -8. meanline: It accepts a boolean value, and it is optional. -9. order: It sets the order of the boxplot. -10. bootstrap: It accepts the integer value, which specifies the range of the notched boxplot. - -## Implementation of Box Plot in Python - -### Import libraries - -import matplotlib.pyplot as plt - -import numpy as np - -### Creating dataset - -np.random.seed(10) - -data = np.random.normal(100, 20, 200) - -fig = plt.figure(figsize =(10, 7)) - -### Creating plot - -plt.boxplot(data) - -### show plot - -plt.show() - -### Implementation of Multiple Box Plot in Python - -import matplotlib.pyplot as plt - -import numpy as np - -np.random.seed(10) - -dataSet1 = np.random.normal(100, 10, 220) - -dataSet2 = np.random.normal(80, 20, 200) - -dataSet3 = np.random.normal(60, 35, 220) - -dataSet4 = np.random.normal(50, 40, 200) - -dataSet = [dataSet1, dataSet2, dataSet3, dataSet4] - -figure = plt.figure(figsize =(10, 7)) - -ax = figure.add_axes([0, 0, 1, 1]) - -bp = ax.boxplot(dataSet) - -plt.show() - -### Implementation of Box Plot with Outliers (visual representation of the sales distribution for each product, and the outliers highlight months with exceptionally high or low sales) - -import matplotlib.pyplot as plt - -import numpy as np - -### Data for monthly sales - -product_A_sales = [100, 110, 95, 105, 115, 90, 120, 130, 80, 125, 150, 200] - -product_B_sales = [90, 105, 100, 98, 102, 105, 110, 95, 112, 88, 115, 250] - -product_C_sales = [80, 85, 90, 78, 82, 85, 88, 92, 75, 85, 200, 95] - -### Introducing outliers - -product_A_sales.extend([300, 80]) - -product_B_sales.extend([50, 300]) - -product_C_sales.extend([70, 250]) - -### Creating a box plot with outliers - -plt.boxplot([product_A_sales, product_B_sales, product_C_sales], sym='o') - -plt.title('Monthly Sales Performance by Product with Outliers') - -plt.xlabel('Products') - -plt.ylabel('Sales') - -plt.show() - -### Implementation of Grouped Box Plot (to compare the exam scores of students from three different classes (A, B, and C)) - -import matplotlib.pyplot as plt - -import numpy as np - -class_A_scores = [75, 80, 85, 90, 95] - -class_B_scores = [70, 75, 80, 85, 90] - -class_C_scores = [65, 70, 75, 80, 85] - -### Creating a grouped box plot - -plt.boxplot([class_A_scores, class_B_scores, class_C_scores], labels=['Class A', 'Class B', 'Class C']) - -plt.title('Exam Scores by Class') - -plt.xlabel('Classes') - -plt.ylabel('Scores') - -plt.show() From dd24cd3a2e82ef40f55ead219868947afdfc12c6 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 31 May 2024 08:14:00 +0530 Subject: [PATCH 60/68] Update index.md --- contrib/plotting-visualization/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index a8416a8..92ec106 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,4 +3,4 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) -- [Box Plots in Matplotlib](matplotlib-box-plots.md) + From cd74a77397850249e8910638f41149a86476f37b Mon Sep 17 00:00:00 2001 From: Ritesh Date: Fri, 31 May 2024 10:17:29 +0530 Subject: [PATCH 61/68] Create clustering.md --- contrib/machine-learning/clustering.md | 115 +++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 contrib/machine-learning/clustering.md diff --git a/contrib/machine-learning/clustering.md b/contrib/machine-learning/clustering.md new file mode 100644 index 0000000..7d5577c --- /dev/null +++ b/contrib/machine-learning/clustering.md @@ -0,0 +1,115 @@ +# Clustering + +Clustering is an unsupervised machine learning technique that groups a set of objects in such a way that objects in the same group (called a cluster) are more similar to each other than to those in other groups (clusters). This README provides an overview of clustering, including its fundamental concepts, types, algorithms, and how to implement it using Python. + +## Table of Contents + +1. [Introduction](#introduction) +2. [Concepts](#concepts) +3. [Types of Clustering](#types-of-clustering) +4. [Clustering Algorithms](#clustering-algorithms) +5. [Implementation](#implementation) + - [Using Scikit-learn](#using-scikit-learn) + - [Code Example](#code-example) +6. [Evaluation Metrics](#evaluation-metrics) +7. [Conclusion](#conclusion) +8. [References](#references) + +## Introduction + +Clustering is a technique used to find inherent groupings within data without pre-labeled targets. It is widely used in exploratory data analysis, pattern recognition, image analysis, information retrieval, and bioinformatics. + +## Concepts + +### Centroid + +A centroid is the center of a cluster. In the k-means clustering algorithm, for example, each cluster is represented by its centroid, which is the mean of all the data points in the cluster. + +### Distance Measure + +Distance measures are used to quantify the similarity or dissimilarity between data points. Common distance measures include Euclidean distance, Manhattan distance, and cosine similarity. + +### Inertia + +Inertia is a metric used to assess the quality of the clusters formed. It is the sum of squared distances of samples to their nearest cluster center. + +## Types of Clustering + +1. **Hard Clustering**: Each data point either belongs to a cluster completely or not at all. +2. **Soft Clustering (Fuzzy Clustering)**: Each data point can belong to multiple clusters with varying degrees of membership. + +## Clustering Algorithms + +### K-Means Clustering + +K-Means is a popular clustering algorithm that partitions the data into k clusters, where each data point belongs to the cluster with the nearest mean. The algorithm follows these steps: +1. Initialize k centroids randomly. +2. Assign each data point to the nearest centroid. +3. Recalculate the centroids as the mean of all data points assigned to each cluster. +4. Repeat steps 2 and 3 until convergence. + +### Hierarchical Clustering + +Hierarchical clustering builds a tree of clusters. There are two types: +- **Agglomerative (bottom-up)**: Starts with each data point as a separate cluster and merges the closest pairs of clusters iteratively. +- **Divisive (top-down)**: Starts with all data points in one cluster and splits the cluster iteratively into smaller clusters. + +### DBSCAN (Density-Based Spatial Clustering of Applications with Noise) + +DBSCAN groups together points that are close to each other based on a distance measurement and a minimum number of points. It can find arbitrarily shaped clusters and is robust to noise. + +## Implementation + +### Using Scikit-learn + +Scikit-learn is a popular machine learning library in Python that provides tools for clustering. + +### Code Example + +```python +import numpy as np +import pandas as pd +from sklearn.cluster import KMeans +from sklearn.preprocessing import StandardScaler +from sklearn.metrics import silhouette_score + +# Load dataset +data = pd.read_csv('path/to/your/dataset.csv') + +# Preprocess the data +scaler = StandardScaler() +data_scaled = scaler.fit_transform(data) + +# Initialize and fit KMeans model +kmeans = KMeans(n_clusters=3, random_state=42) +kmeans.fit(data_scaled) + +# Get cluster labels +labels = kmeans.labels_ + +# Calculate silhouette score +silhouette_avg = silhouette_score(data_scaled, labels) +print("Silhouette Score:", silhouette_avg) + +# Add cluster labels to the original data +data['Cluster'] = labels + +print(data.head()) +``` + +## Evaluation Metrics + +- **Silhouette Score**: Measures how similar a data point is to its own cluster compared to other clusters. +- **Inertia (Within-cluster Sum of Squares)**: Measures the compactness of the clusters. +- **Davies-Bouldin Index**: Measures the average similarity ratio of each cluster with the cluster that is most similar to it. +- **Dunn Index**: Ratio of the minimum inter-cluster distance to the maximum intra-cluster distance. + +## Conclusion + +Clustering is a powerful technique for discovering structure in data. Understanding different clustering algorithms and their evaluation metrics is crucial for selecting the appropriate method for a given problem. + +## References + +- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/clustering.html) +- [Wikipedia: Cluster Analysis](https://en.wikipedia.org/wiki/Cluster_analysis) +- [Towards Data Science: A Comprehensive Guide to Clustering](https://towardsdatascience.com/a-comprehensive-guide-to-clustering-9789897f8b88) From 90e238ebf593caf7cf99ed1d213823f5219a062f Mon Sep 17 00:00:00 2001 From: Ritesh Date: Fri, 31 May 2024 10:18:24 +0530 Subject: [PATCH 62/68] Update index.md --- contrib/machine-learning/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..1e0004d 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -10,3 +10,4 @@ - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) - [Logistic Regression](logistic-regression.md) +- [Clustering](clustering.md) From ef42e881851eb20f9a9c8c28a9afdcff89c7fb67 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 20:49:03 +0530 Subject: [PATCH 63/68] Update index.md --- contrib/plotting-visualization/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/plotting-visualization/index.md b/contrib/plotting-visualization/index.md index 92ec106..32261d6 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -3,4 +3,3 @@ - [Installing Matplotlib](matplotlib-installation.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) - From f26f8da60ec1814d6165a6cb908aa2a0ea7a1b2c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 20:53:21 +0530 Subject: [PATCH 64/68] Update grid-search.md --- contrib/machine-learning/grid-search.md | 41 +++++++++++++------------ 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/contrib/machine-learning/grid-search.md b/contrib/machine-learning/grid-search.md index 3bf53ff..ae44412 100644 --- a/contrib/machine-learning/grid-search.md +++ b/contrib/machine-learning/grid-search.md @@ -1,20 +1,26 @@ # Grid Search Grid Search is a hyperparameter tuning technique in Machine Learning that helps to find the best combination of hyperparameters for a given model. It works by defining a grid of hyperparameters and then training the model with all the possible combinations of hyperparameters to find the best performing set. + The Grid Search Method considers some hyperparameter combinations and selects the one returning a lower error score. This method is specifically useful when there are only some hyperparameters in order to optimize. However, it is outperformed by other weighted-random search methods when the Machine Learning model grows in complexity. ## Implementation -Before applying Grid Searching on any algorithm, Data is used to divided into training and validation set, a validation set is used to validate the models. A model with all possible combinations of hyperparameters is tested on the validation set to choose the best combination. -Grid Searching can be applied to any hyperparameters algorithm whose performance can be improved by tuning hyperparameter. For example, we can apply grid searching on K-Nearest Neighbors by validating its performance on a set of values of K in it. Same thing we can do with Logistic Regression by using a set of values of learning rate to find the best learning rate at which Logistic Regression achieves the best accurac -Let us consider that the model accepts the below three parameters in the form of input: -1. Number of hidden layers [2, 4] -2. Number of neurons in every layer [5, 10] -3. Number of epochs [10, 50] +Before applying Grid Searching on any algorithm, data is divided into training and validation set, a validation set is used to validate the models. A model with all possible combinations of hyperparameters is tested on the validation set to choose the best combination. + +Grid Searching can be applied to any hyperparameters algorithm whose performance can be improved by tuning hyperparameter. For example, we can apply grid searching on K-Nearest Neighbors by validating its performance on a set of values of K in it. Same thing we can do with Logistic Regression by using a set of values of learning rate to find the best learning rate at which Logistic Regression achieves the best accuracy. + +Let us consider that the model accepts the below three parameters in the form of input: +1. Number of hidden layers `[2, 4]` +2. Number of neurons in every layer `[5, 10]` +3. Number of epochs `[10, 50]` + +If we want to try out two options for every parameter input (as specified in square brackets above), it estimates different combinations. For instance, one possible combination can be `[2, 5, 10]`. Finding such combinations manually would be a headache. -If we want to try out two options for every parameter input (as specified in square brackets above), it estimates different combinations. For instance, one possible combination can be [2, 5, 10]. Finding such combinations manually would be a headache. Now, suppose that we had ten different parameters as input, and we would like to try out five possible values for each and every parameter. It would need manual input from the programmer's end every time we like to alter the value of a parameter, re-execute the code, and keep a record of the outputs for every combination of the parameters. + Grid Search automates that process, as it accepts the possible value for every parameter and executes the code in order to try out each and every possible combination outputs the result for the combinations and outputs the combination having the best accuracy. + Higher values of C tell the model, the training data resembles real world information, place a greater weight on the training data. While lower values of C do the opposite. ## Explaination of the Code @@ -32,16 +38,14 @@ The code provided performs hyperparameter tuning for a Logistic Regression model 10. logit.score(X, y) calculates the accuracy of the fitted model on the dataset and appends this score to the scores list. 11. After the loop, the scores list is printed, showing the accuracy for each value of C. -## Python Code +### Python Code +```python from sklearn import datasets - from sklearn.linear_model import LogisticRegression iris = datasets.load_iris() - X = iris['data'] - y = iris['target'] logit = LogisticRegression(max_iter = 10000) @@ -49,20 +53,19 @@ logit = LogisticRegression(max_iter = 10000) C = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2] scores = [] - for choice in C: - logit.set_params(C=choice) - logit.fit(X, y) - scores.append(logit.score(X, y)) - print(scores) +``` -## Results +#### Results +``` [0.9666666666666667, 0.9666666666666667, 0.9733333333333334, 0.9733333333333334, 0.98, 0.98, 0.9866666666666667, 0.9866666666666667] +``` -We can see that the lower values of C performed worse than the base parameter of 1. However, as we increased the value of C to 1.75 the model experienced increased accuracy. -It seems that increasing C beyond this amount does not help increase model accuracy. +We can see that the lower values of `C` performed worse than the base parameter of `1`. However, as we increased the value of `C` to `1.75` the model experienced increased accuracy. + +It seems that increasing `C` beyond this amount does not help increase model accuracy. From d83b6e1deaa84b2d0d2411c7a5eb8b4284ab5351 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 1 Jun 2024 20:56:34 +0530 Subject: [PATCH 65/68] Update CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4a366da..8688009 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,8 +24,8 @@ The list of topics for which we are looking for content are provided below along - Web Scrapping - [Link](https://github.com/animator/learn-python/tree/main/contrib/web-scrapping) - API Development - [Link](https://github.com/animator/learn-python/tree/main/contrib/api-development) - Data Structures & Algorithms - [Link](https://github.com/animator/learn-python/tree/main/contrib/ds-algorithms) -- Python Mini Projects - [Link](https://github.com/animator/learn-python/tree/main/contrib/mini-projects) -- Python Question Bank - [Link](https://github.com/animator/learn-python/tree/main/contrib/question-bank) +- Python Mini Projects - [Link](https://github.com/animator/learn-python/tree/main/contrib/mini-projects) **(Not accepting)** +- Python Question Bank - [Link](https://github.com/animator/learn-python/tree/main/contrib/question-bank) **(Not accepting)** You can check out some content ideas below. From d372975f6c7accb7dd3e7a7852ba61d3e24ea724 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid <109688855+PilotAxis@users.noreply.github.com> Date: Sat, 1 Jun 2024 21:45:43 +0530 Subject: [PATCH 66/68] Added file exception-handling.md --- contrib/advanced-python/exception-handling.md | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 contrib/advanced-python/exception-handling.md diff --git a/contrib/advanced-python/exception-handling.md b/contrib/advanced-python/exception-handling.md new file mode 100644 index 0000000..bddcac4 --- /dev/null +++ b/contrib/advanced-python/exception-handling.md @@ -0,0 +1,192 @@ +# Exception Handling in Python + +Exception handling is a way of managing errors that may occur during program execution, through which you can handle exceptions gracefully. Python's exception handling mechanism has been designed to avoid unexpected termination of the program and offer a means to either regain control after an error or display meaningful messages to the user. + +- **Error** - An error is a mistake or an incorrect result produced by a program. It can be a syntax error, a logical error, or a runtime error. Errors are typically fatal, meaning they prevent the program from continuing to execute. +- **Exception** - An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions. Exceptions are typically unexpected and can be handled by the program to prevent it from crashing or terminating abnormally. It can be runtime, input/output or system exceptions. Exceptions are designed to be handled by the program, allowing it to recover from the error and continue executing. + +## Python Built-in Exceptions + +There are plenty of built-in exceptions in Python that are raised when a corresponding error occur. +We can view all the built-in exceptions using the built-in `local()` function as follows: + +```python +print(dir(locals()['__builtins__'])) +``` + +|**S.No**|**Exception**|**Description**| +|---|---|---| +|1|SyntaxError|A syntax error occurs when the code we write violates the grammatical rules such as misspelled keywords, missing colon, mismatched parentheses etc.| +|2|TypeError|A type error occurs when we try to perform an operation or use a function with objects that are of incompatible data types.| +|3|NameError|A name error occurs when we try to use a variable, function, module or string without quotes that hasn't been defined or isn't used in a valid way.| +|4|IndexError|A index error occurs when we try to access an element in a sequence (like a list, tuple or string) using an index that's outside the valid range of indices for that sequence.| +|5|KeyError|A key error occurs when we try to access a key that doesn't exist in a dictionary. Attempting to retrieve a value using a non-existent key results this error.| +|6|ValueError|A value error occurs when we provide an argument or value that's inappropriate for a specific operation or function such as doing mathematical operations with incompatible types (e.g., dividing a string by an integer.)| +|7|AttributeError|An attribute error occurs when we try to access an attribute (like a variable or method) on an object that doesn't possess that attribute.| +|8|IOError|An IO (Input/Output) error occurs when an operation involving file or device interaction fails. It signifies that there's an issue during communication between your program and the external system.| +|9|ZeroDivisionError|A ZeroDivisionError occurs when we attempt to divide a number by zero. This operation is mathematically undefined, and Python raises this error to prevent nonsensical results.| +|10|ImportError|An import error occurs when we try to use a module or library that Python can't find or import succesfully.| + +## Try and Except Statement - Catching Exception + +The `try-except` statement allows us to anticipate potential errors during program execution and define what actions to take when those errors occur. This prevents the program from crashing unexpectedly and makes it more robust. + +Here's an example to explain this: + +```python +try: + # code that might raise an exception + result = 10 / 0 +except: + print("An error occured!") +``` + +Output + +```markdown +An error occured! +``` + +In this example, the `try` block contains the code that you suspect might raise an exception. Python attempts to execute the code within this block. If an exception occurs, Python jumps to the `except` block and executes the code within it. + +## Specific Exception Handling + +You can specify the type of expection you want to catch using the `except` keyword followed by the exception class name. You can also have multiple `except` blocks to handle different exception types. + +Here's an example: + +```python +try: + # Code that might raise ZeroDivisionError or NameError + result = 10 / 0 + name = undefined_variable +except ZeroDivisionError: + print("Oops! You tried to divide by zero.") +except NameError: + print("There's a variable named 'undefined_variable' that hasn't been defined yet.") +``` + +Output + +```markdown +Oops! You tried to divide by zero. +``` + +If you comment on the line `result = 10 / 0`, then the output will be + +```markdown +There's a variable named 'undefined_variable' that hasn't been defined yet. +``` + +## Important Note + +In this code, the `except` block are specific to each type of expection. If you want to catch both exceptions with a single `except` block, you can use of tuple of exceptions, like this: + +```python +try: + # Code that might raise ZeroDivisionError or NameError + result = 10 / 0 + name = undefined_variable +except (ZeroDivisionError, NameError): + print("An error occured!") +``` + +Output + +```markdown +An error occured! +``` + +## Try with Else Clause + +The `else` clause in a Python `try-except` block provides a way to execute code only when the `try` block succeeds without raising any exceptions. It's like having a section of code that runs exclusively under the condition that no errors occur during the main operation in the `try` block. + +Here's an example to understand this: + +```python +def calculate_average(numbers): + if len(numbers) == 0: # Handle empty list case seperately (optional) + return None + try: + total = sum(numbers) + average = total / len(numbers) + except ZeroDivisionError: + print("Cannot calculate average for a list containing zero.") + else: + print("The average is:", average) + return average #Optionally return the average here + +# Example usage +numbers = [10, 20, 30] +result = calculate_average(numbers) + +if result is not None: # Check if result is available (handles empty list case) + print("Calculation succesfull!") +``` + +Output + +```markdown +The average is: 20.0 +``` + +## Finally Keyword in Python + +The `finally` keyword in Python is used within `try-except` statements to execute a block of code **always**, regardless of whether an exception occurs in the `try` block or not. + +To understand this, let us take an example: + +```python +try: + a = 10 // 0 + print(a) +except ZeroDivisionError: + print("Cannot be divided by zero.") +finally: + print("Program executed!") +``` + +Output + +```markdown +Cannot be divided by zero. +Program executed! +``` + +## Raise Keyword in Python + +In Python, raising an exception allows you to signal that an error condition has occured during your program's execution. The `raise` keyword is used to explicity raise an exception. + +Let us take an example: + +```python +def divide(x, y): + if y == 0: + raise ZeroDivisionError("Can't divide by zero!") # Raise an exception with a message + result = x / y + return result + +try: + division_result = divide(10, 0) + print("Result:", division_result) +except ZeroDivisionError as e: + print("An error occured:", e) # Handle the exception and print the message +``` + +Output + +```markdown +An error occured: Can't divide by zero! +``` + +## Advantages of Exception Handling + +- **Improved Error Handling** - It allows you to gracefully handle unexpected situations that arise during program execution. Instead of crashing abruptly, you can define specific actions to take when exceptions occur, providing a smoother experience. +- **Code Robustness** - Exception Handling helps you to write more resilient programs by anticipating potential issues and providing approriate responses. +- **Enhanced Code Readability** - By seperating error handling logic from the core program flow, your code becomes more readable and easier to understand. The `try-except` blocks clearly indicate where potential errors might occur and how they'll be addressed. + +## Disadvantages of Exception Handling + +- **Hiding Logic Errors** - Relying solely on exception handling might mask underlying logic error in your code. It's essential to write clear and well-tested logic to minimize the need for excessive exception handling. +- **Performance Overhead** - In some cases, using `try-except` blocks can introduce a slight performance overhead compared to code without exception handling. Howerer, this is usually negligible for most applications. +- **Overuse of Exceptions** - Overusing exceptions for common errors or control flow can make code less readable and harder to maintain. It's important to use exceptions judiciously for unexpected situations. From a9e3a4673c62076ba2a764cf6d77d5acda177fc3 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid Date: Sun, 2 Jun 2024 00:39:56 +0530 Subject: [PATCH 67/68] Updated Files --- contrib/advanced-python/exception-handling.md | 6 +++--- contrib/advanced-python/index.md | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/contrib/advanced-python/exception-handling.md b/contrib/advanced-python/exception-handling.md index bddcac4..3e0c672 100644 --- a/contrib/advanced-python/exception-handling.md +++ b/contrib/advanced-python/exception-handling.md @@ -1,6 +1,6 @@ # Exception Handling in Python -Exception handling is a way of managing errors that may occur during program execution, through which you can handle exceptions gracefully. Python's exception handling mechanism has been designed to avoid unexpected termination of the program and offer a means to either regain control after an error or display meaningful messages to the user. +Exception Handling is a way of managing the errors that may occur during a program execution. Python's exception handling mechanism has been designed to avoid the unexpected termination of the program, and offer to either regain control after an error or display a meaningful message to the user. - **Error** - An error is a mistake or an incorrect result produced by a program. It can be a syntax error, a logical error, or a runtime error. Errors are typically fatal, meaning they prevent the program from continuing to execute. - **Exception** - An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions. Exceptions are typically unexpected and can be handled by the program to prevent it from crashing or terminating abnormally. It can be runtime, input/output or system exceptions. Exceptions are designed to be handled by the program, allowing it to recover from the error and continue executing. @@ -35,7 +35,7 @@ Here's an example to explain this: ```python try: - # code that might raise an exception + # Code that might raise an exception result = 10 / 0 except: print("An error occured!") @@ -72,7 +72,7 @@ Output Oops! You tried to divide by zero. ``` -If you comment on the line `result = 10 / 0`, then the output will be +If you comment on the line `result = 10 / 0`, then the output will be: ```markdown There's a variable named 'undefined_variable' that hasn't been defined yet. diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index b95e4b9..febcbbe 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -7,3 +7,4 @@ - [Regular Expressions in Python](regular_expressions.md) - [JSON module](json-module.md) - [Map Function](map-function.md) +- [Exception Handling in Python](exception-handling.md) From 3a8ac54d7cd94a7ceda1552d8be823129230ff78 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:05:00 +0530 Subject: [PATCH 68/68] Update clustering.md --- contrib/machine-learning/clustering.md | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/contrib/machine-learning/clustering.md b/contrib/machine-learning/clustering.md index 7d5577c..bc02d37 100644 --- a/contrib/machine-learning/clustering.md +++ b/contrib/machine-learning/clustering.md @@ -2,19 +2,6 @@ Clustering is an unsupervised machine learning technique that groups a set of objects in such a way that objects in the same group (called a cluster) are more similar to each other than to those in other groups (clusters). This README provides an overview of clustering, including its fundamental concepts, types, algorithms, and how to implement it using Python. -## Table of Contents - -1. [Introduction](#introduction) -2. [Concepts](#concepts) -3. [Types of Clustering](#types-of-clustering) -4. [Clustering Algorithms](#clustering-algorithms) -5. [Implementation](#implementation) - - [Using Scikit-learn](#using-scikit-learn) - - [Code Example](#code-example) -6. [Evaluation Metrics](#evaluation-metrics) -7. [Conclusion](#conclusion) -8. [References](#references) - ## Introduction Clustering is a technique used to find inherent groupings within data without pre-labeled targets. It is widely used in exploratory data analysis, pattern recognition, image analysis, information retrieval, and bioinformatics. @@ -107,9 +94,3 @@ print(data.head()) ## Conclusion Clustering is a powerful technique for discovering structure in data. Understanding different clustering algorithms and their evaluation metrics is crucial for selecting the appropriate method for a given problem. - -## References - -- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/clustering.html) -- [Wikipedia: Cluster Analysis](https://en.wikipedia.org/wiki/Cluster_analysis) -- [Towards Data Science: A Comprehensive Guide to Clustering](https://towardsdatascience.com/a-comprehensive-guide-to-clustering-9789897f8b88)