From 5c3e1c2ed86b57838d16151e4d9c305eae565084 Mon Sep 17 00:00:00 2001 From: Ananyagra24 <155280507+Ananyagra24@users.noreply.github.com> Date: Sun, 12 May 2024 21:49:55 +0530 Subject: [PATCH 001/405] Create History --- contrib/History | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/History diff --git a/contrib/History b/contrib/History new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/contrib/History @@ -0,0 +1 @@ + From b8e682d2fd427f8c76bde3bc30207cad327aec5d Mon Sep 17 00:00:00 2001 From: Ananyagra24 <155280507+Ananyagra24@users.noreply.github.com> Date: Mon, 13 May 2024 08:40:22 +0530 Subject: [PATCH 002/405] Delete contrib/History --- contrib/History | 1 - 1 file changed, 1 deletion(-) delete mode 100644 contrib/History diff --git a/contrib/History b/contrib/History deleted file mode 100644 index 8b13789..0000000 --- a/contrib/History +++ /dev/null @@ -1 +0,0 @@ - From 83809066303a7f962f2063d1613bad26f9776c1d Mon Sep 17 00:00:00 2001 From: Ananyagra24 <155280507+Ananyagra24@users.noreply.github.com> Date: Mon, 13 May 2024 21:10:18 +0530 Subject: [PATCH 003/405] Create dice_roller.md --- contrib/mini-projects/dice_roller.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 contrib/mini-projects/dice_roller.md diff --git a/contrib/mini-projects/dice_roller.md b/contrib/mini-projects/dice_roller.md new file mode 100644 index 0000000..c083934 --- /dev/null +++ b/contrib/mini-projects/dice_roller.md @@ -0,0 +1,19 @@ +``` +import random +def dice(): + dice_no = random.choice([1,2,3,4,5,6]) + return "You got " + str(dice_no) +def roll_dice(): + print("Hey Guys, you will now roll a single dice using Python!") + while True: + start=input("Type \'k\' to roll the dice: ").lower() + if start != 'k': + print("Invalid input. Please try again.") + continue + print(dice()) + roll_again = input("Do you want to reroll? (Yes/No): ").lower() + if roll_again != 'yes': + break + print("Thanks for rolling the dice.") +roll_dice() +``` From f8a67cf65dc3d70cf0a81a0cebd55770f0ffc728 Mon Sep 17 00:00:00 2001 From: Ananyagra24 <155280507+Ananyagra24@users.noreply.github.com> Date: Mon, 13 May 2024 21:11:01 +0530 Subject: [PATCH 004/405] Update index.md --- contrib/mini-projects/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/mini-projects/index.md b/contrib/mini-projects/index.md index 82596a2..f60b286 100644 --- a/contrib/mini-projects/index.md +++ b/contrib/mini-projects/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Dice Roller](dice_roller.md) From fbbef5e5726765ed0bfff9131972f1f6d80374dc Mon Sep 17 00:00:00 2001 From: AritraCh2005 <153842880+AritraCh2005@users.noreply.github.com> Date: Tue, 14 May 2024 19:13:22 +0530 Subject: [PATCH 005/405] Update index.md --- contrib/numpy/index.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index 82596a2..db6f0eb 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,3 +1,12 @@ # List of sections -- [Section title](filename.md) +* [Basic Mathematics](#BasicMaths) + * [What is a Matrix?](#Matrix-Intro) + * [Scalars and Vectors](#Scalars-Vectors) + * [Arrays in Python](#Arrays) + * [What is a Tensor?](#Tensors) + * [Addition and Subtraction in Matrices](#Arithmetic) + * [Transpose of Matrices & Vectors](#Transpose) + * [Dot Product](#DotProduct) + * [Dot Product of Matrices](#DotMatrices) + From c1726d428a368dd1a9f72f896ef1699159ec976e Mon Sep 17 00:00:00 2001 From: AritraCh2005 <153842880+AritraCh2005@users.noreply.github.com> Date: Tue, 14 May 2024 19:14:52 +0530 Subject: [PATCH 006/405] Create basic_math.md Added basic mathematics useful while working with numpy --- contrib/numpy/basic_math.md | 371 ++++++++++++++++++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 contrib/numpy/basic_math.md diff --git a/contrib/numpy/basic_math.md b/contrib/numpy/basic_math.md new file mode 100644 index 0000000..d19f2f8 --- /dev/null +++ b/contrib/numpy/basic_math.md @@ -0,0 +1,371 @@ +# Basic Mathematics +## What is a Matrix? +A matrix is a collection of numbers ordered in rows and columns. Here is one. + + + + + + + + + + + + + + + + + + +
123
456
789
+ + + +A matrix is generally written within square brackets[]. The dimensions of a matrix is represented by (Number of rows x Number of columns).The dimensions of the above matrix is 3x3. + +Matrices are the main characters in mathematical operations like addition, subtraction etc, especially those used in Pandas and NumPy. They can contain only numbers, symbols or expressions. + +In order to refer to a particular element in the matrix we denote it by : +Aij + +where i represents the ith row and j represents the jth column of the matrix. + +## Scalars and Vectors +### Scalars +There exists specific cases of matrices which are also widely used. + +A matrix with only one row and column i.e. containing only one element is commonly referred to as a scalar. + +The numbers ```[12] ; [-5] ; [0] ; [3.14]``` all represent scalars. Scalars have 0 dimensions. + +### Vectors +Vectors are objects with 1 dimension. They sit somewhere between scalars and matrices. They can also be referred to as one dimensional matrices. + +```[1 3 5]``` represents a vector with dimension 1x3. + +A vector is the simplest linear algebraic object.A matrix can be refered to as a collection of vectors + +Vectors are broadly classified into 2 types: +- Row Vectors: Is of the form 1 x n where n refers to the number of columns the vector has. +- Column Vectors: Is of the form m x 1 where m refers to the number of rows the vector has. + +m or n are also called as the length of the column and row vector respectively. + +## Arrays in Python + +To understand arrays, first let us start by declaring scalars, vectors and matrices in Python. + +First we need to import numpy. We do so by importing it as 'np' as it provides better readability, namespace clarity and also aligns with the community guidelines. + +```python +import numpy as np +``` +Next up, we declare a scalar s as, +``` +s = 5 +``` + + + +Now we declare a vector, +```python +v = np.array([5,-2,4]) +``` +On printing v we get the following output, +```python +array([5,-2,4]) +``` +By default, a vector is declared as a **'row vector'**. + +Finally, we declare matrices, +```python +m=np.array([[5,12,6],[-3,0,14]]) +``` +On printing m we get, +```python +array([[5,12,6], + [-3,0,14]]) +``` +> The type() function is used to return the data type of a given variable. + +* The type(s) will return **'int'**. + +* The type(v) will return **'numpy.ndarray'** which represents a **n-dimensional array**, since it is a 1 dimensional array. + + * The type(m) will also return **'numpy.ndarray'** since it is a 2-dimensional array. + +These are some ways in which arrays are useful in python. + +> The shape() function is used to return the shape of a given variable. + +* m.shape() returns (2,3) since we are dealing with a (2,3) matrix. + +* v.shape() returns(3,) indicates it has only one dimensional or that it stores 3 elements in order. + +* However, 'int' objects do not have shape and therefore s.shape() gives an error. + +## What is a Tensor? +A Tensor can be thought of as a collection of matrices. It has dimensions k x m x n. + +**NOTE:** Scalars, vectors and matrices are also tensors of rank 0,1,2 respectively. + +Tensors can be stored in ndarrays. + +Let's create a tensor with 2 matrices, +```python +m1=np.array([[5,12,6],[-3,0,14]]) +m2=np.array([[2,1,8],[-6,2,0]]) +t=np.array([m1,m2]) +``` +Upon printing t we get, +```python +array([[[5,12,6], + [-3,0,14]], + + [[2,1,8], + [-6,2,0]]]) +``` +If we check it's shape, we see that is is a **(2,2,3)** object. + +If we want to manually create a tensor we write, +```python +t=np.array([[[5,12,6], [-3,0,14]],[[2,1,8], [-6,2,0]]]) +``` + ## Addition and Subtraction in Matrices + + ### Addition + For 2 matrices to be added to one another they must have **same dimensions**. + + If we have 2 matrices say, + +```python +A=np.array([[5,12,6],[-3,0,14]]) +B=np.array([[2,1,8],[-6,2,0]]) +C= A+B + ``` +The element at position Aij gets added to the element at position Bij. It's that simple! +The above input will give the resultant C as: +```python +array([[7,13,14], + [-9,2,14]]) +``` +### Subtraction + +As we know, subtraction is a type of addition, the same rules apply here. + + If we have 2 matrices say, + +```python +A=np.array([[5,12,6],[-3,0,14]]) +B=np.array([[2,1,8],[-6,2,0]]) +C= A-B + ``` + +The element at position Bij gets subtracted from the element at position Aij. +The above input will give the resultant C as: +```python +array([[3,11,-2], + [3,-2,14]]) +``` +Similarly the same operations can be done with **floating point numbers** as well. + +In a similar fashion, we can add or subtract vectors as well with the condition that they must be of the **same length**. +```python +A=np.array([1,2,3,4,5]) +B=np.array([6,7,8,9,10]) +C= A+B + ``` +The result is a vector of length 5 with C as, +```python +array([7,9,11,13,15]) +``` + ### Addition of scalars with vectors & matrices + + Scalars show unique behaviour when added to matrices or vectors. + + To demonstrate their behaviour, let's use an example, + Let's declare a matrix, + +```python +A=np.array([[5,12,6],[-3,0,14]]) +A+1 +``` +We see that if we perform the above function, i.e. add scalar [1] to the matrix A we get the output, +```python +array([[6,13,7],[-2,1,15]]) +``` +We see that the scalar is added to the matrix elementwise, i.e. each element gets incremented by 1. + +**The same applies to vectors as well.** + +Mathematically, it is not allowed as the shape of scalars are different from vectors or matrices but while programming in Python it works. + +## Transpose of Matrices & Vectors +### Transposing Vectors + +If X is the vector, then the transpose of the vector is represented as XT. It changes a vector of dimension n x 1 into a vector of dimension 1 x n, i.e. a row vector to a column vector and vice versa. + +> * The values are not changing or transforming ; only their position is. +> * Transposing the same vector (object) twice yields the initial vector (object). + +```python +x=np.array([1,2,3)) +``` +Transposing this in python using ```x.T``` will give +```python +array([1,2,3)) +``` +which is the same vector as the one taken as input. + +> 1-Dimensional arrays don't really get transposed (in the memory of the computer) + +To transpose a vector, we need to reshape it first. +```python +x_new= x.reshape(1,3) +x_new.T +``` +will now result in the vector getting transposed, +```python +array([[1], + [2], + [3]]) +``` + +### Transposing Matrices + +If M is a matrix, then the transpose of the matrix M is represented as MT. When transposed, a m x n matrix becomes a n x m matrix. + +The element Mij of the initial matrix becomes the Nji where N is the transposed matrix of M. + +Let's understand this further with the help of of an example, +```python +A = np.array([[1,5,-6],[8,-2,0]]) +``` +The output for the above code snippet will be, +```python +array([[1,5,-6], + [8,-2,0]]) +``` +> **array.T** returns the transpose of an array (matrix). + +```python +A.T +``` +will give the output as, +```python +array([[1,8], + [5,-2], + [-6,0]]) +``` + +Hope the following examples have cleared your concept on transposing. + +## Dot Product + +> **np.dot()** returns the dot product of two objects +> Dot product is represented by ( * ), for example, x(dot)y = x * y +> +### Scalar * Scalar +Let's start with scalar multiplication first. + +``` [6] * [5] = [30] + [10] * [-2] = [-20] +``` +It is the same multiplication that we are familiar with since learnt as kids. + Therefore, ```np.dot([6]*[5])``` returns ```30```. + +### Vector * Vector +To multiply vectors with one another, they must be of **same length**. + +Now let's understand this with an example, +```python +x = np.array([2,8,-4]) +y = np.array([1,-7,3]) +``` + +The dot product returns the elementwise product of the vector i.e. +x * y = ( x1 * y1 ) + ( x2 * y2 ) + ( x3 * y3 ) in the above example. + +Therefore, ```np.dot(x,y)``` gives ```[-66]``` as the input. + +We observe that **dot product of 2 vectors returns a scalar**. + +### Scalar * Vector + +When we multiply a scalar with a vector, we observe that each element of the vector gets multiplied to the scalar individually. + +A scalar k when multiplied to a vector v([x1,x2,x3]) gives the product = [(k * x1) + (k * x2) + (k * x3)] + +An example would bring further clarity, +```python +y = np.array([1,-7,3]) +y*5 +``` +will give the following output +```python +array[(5,-35,15)] +``` + +We observe that **dot product of 2 vectors returns a scalar**. + +We observe that **dot product of a vector and a scalar returns a vector**. + +## Dot Product of Matrices + +### Scalar * Matrix + Dot product of a scalar with a matrix works similar to dot product of a vector with a scalar. +Now, we come to a very important concept which will be very useful to us while working in Python. + +Each element of the vector gets multiplied to the scalar individually. + +```python +A = np.array([[1,5,-6],[8,-2,0]]) +B = 3 * A +``` +will give the resultant B as +```python +array([[3,15,-18], + [24,-6,0]]) +``` +Thus each element gets multiplied by 3. +> NOTE: The dot product of a scalar and a matrix gives a matrix of the same shape as the input matrix. + +### Matrix * Matrix + A matrix can be multipied to a matrix. However it has certain compatibility measures, + * We can only multiply an m x n matrix with an n x k matrix + * Basically the 2nd dimension of the first matrix has to match the 1st dimension of the 2nd matrix. +> The output of a m x n matrix with a n x k matrix gives a **m x k** matrix. + +**Whenever we have a dot product of 2 matrices, we multiply row vectors within one matrix to the column vector of 2nd matrix.** + +For example, let's use multiply a row vector to a column vector to understand it further. + +``` + ([[1] + ([2 8 4]) * [2] = [(2*1) + (8*2) + (4*3)] = [30] + [3]]) +``` +Now, let's multiply a 2 x 3 matrix with a 3 x 2 matrix. +``` + ([[A1,A2,A3], * ([[B1,B2] ([[(A1 * B1 + A2 * B3 + A3 * B5) , (A1 * B2 + A2 * B4 + A3 * B6)] + [A4,A5,A6]]) [B3,B4], = [ (A4 * B1 + A5 * B3 + A6 * B5) , (A4 * B2 + A5 * B4 + A6 * B6)]]) + [B5,B6]]) +``` +Thus we obtain a 2 x 2 matrix. + +We use the np.dot() method to directly obtain the dot product of the 2 matrices. + +Now let's do an example using python just to solidify our knowledge. + +```python +A=np.array([[5,12,6],[-3,0,14]]) +B=np.array([[2,-1],[8,0],[3,0]]) +np.dot(A,B) +``` +The output we obtain is, +```python +array[[124,-5], + [36, 3]]) +``` From ea32f2bd8ce5c16960c66e72b6e886d9b260f51d Mon Sep 17 00:00:00 2001 From: Hema Sree Date: Wed, 15 May 2024 17:49:44 +0530 Subject: [PATCH 007/405] Added intro to numpy --- contrib/numpy/Introduction.md | 36 +++++++++++++++++++++++++++++++++++ contrib/numpy/index.md | 2 +- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 contrib/numpy/Introduction.md diff --git a/contrib/numpy/Introduction.md b/contrib/numpy/Introduction.md new file mode 100644 index 0000000..59a1938 --- /dev/null +++ b/contrib/numpy/Introduction.md @@ -0,0 +1,36 @@ +# Introduction + +## What is Numpy? + +NumPy is a general-purpose array-processing package. It provides a high-performance multidimensional array object and tools for working with these arrays. It is the fundamental package for scientific computing with Python. It is open-source software. + +## Features of NumPy + +NumPy has various features including these important ones: + +1. A powerful N-dimensional array object +2. Sophisticated (broadcasting) functions +3. Tools for integrating C/C++ and Fortran code +4. Useful linear algebra, Fourier transform, and random number capabilities + +## Install Numpy + +Before installing Numpy, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). + +Numpy can be installed via the following pip command: + +```bash +pip install numpy + +``` + +# How to import NumPy + +To access NumPy and its functions import it in your Python code like this: + +```bash +import numpy as np + +``` + +We shorten the imported name to np for better readability of code using NumPy. This is a widely adopted convention that makes your code more readable for everyone working on it. We recommend to always use import numpy as np. diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index 82596a2..c6bf23c 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Introduction](Introduction.md) From 59e79c7627db41589dc554e1440d0ee5aacf3c9c Mon Sep 17 00:00:00 2001 From: Hema Sree Date: Wed, 15 May 2024 17:57:30 +0530 Subject: [PATCH 008/405] Added numpy intro --- contrib/numpy/Introduction.md | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/contrib/numpy/Introduction.md b/contrib/numpy/Introduction.md index 59a1938..c437c48 100644 --- a/contrib/numpy/Introduction.md +++ b/contrib/numpy/Introduction.md @@ -1,36 +1,30 @@ # Introduction -## What is Numpy? +## What is NumPy? -NumPy is a general-purpose array-processing package. It provides a high-performance multidimensional array object and tools for working with these arrays. It is the fundamental package for scientific computing with Python. It is open-source software. +NumPy is a powerful array-processing library in Python, essential for scientific computing. It provides efficient data structures and tools for working with multidimensional arrays. -## Features of NumPy +## Key Features -NumPy has various features including these important ones: +1. **Efficient Arrays:** NumPy offers high-performance N-dimensional array objects for swift data manipulation. +2. **Broadcasting:** Advanced broadcasting enables seamless element-wise operations on arrays of varying shapes. +3. **Interoperability:** NumPy seamlessly integrates with C, C++, and Fortran, enhancing performance and versatility. +4. **Mathematical Tools:** Comprehensive support for linear algebra, Fourier transforms, and random number generation. -1. A powerful N-dimensional array object -2. Sophisticated (broadcasting) functions -3. Tools for integrating C/C++ and Fortran code -4. Useful linear algebra, Fourier transform, and random number capabilities +## Installation -## Install Numpy - -Before installing Numpy, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). - -Numpy can be installed via the following pip command: +Ensure Python is installed in your system. If not you can install it from here([official Python website](https://www.python.org/)),then install NumPy via: ```bash pip install numpy - ``` -# How to import NumPy +# Importing NumPy -To access NumPy and its functions import it in your Python code like this: +To access NumPy functions, import it with the alias `np`: -```bash +```python import numpy as np - ``` -We shorten the imported name to np for better readability of code using NumPy. This is a widely adopted convention that makes your code more readable for everyone working on it. We recommend to always use import numpy as np. +Using `np` as an alias enhances code readability and is a widely adopted convention. From 9f482ac8181b47e80c5469025ab067bab96ae54a Mon Sep 17 00:00:00 2001 From: Hema Sree Date: Wed, 15 May 2024 17:58:33 +0530 Subject: [PATCH 009/405] intro numpy --- contrib/numpy/Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/numpy/Introduction.md b/contrib/numpy/Introduction.md index c437c48..c0f5f52 100644 --- a/contrib/numpy/Introduction.md +++ b/contrib/numpy/Introduction.md @@ -19,7 +19,7 @@ Ensure Python is installed in your system. If not you can install it from here([ pip install numpy ``` -# Importing NumPy +## Importing NumPy To access NumPy functions, import it with the alias `np`: From 2189d3914cb4194df2ca02eb33a2f0d11cd07844 Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Wed, 15 May 2024 18:53:35 +0530 Subject: [PATCH 010/405] Create Rock Paper Scissors Game.md --- .../mini-projects/Rock Paper Scissors Game.md | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 contrib/mini-projects/Rock Paper Scissors Game.md diff --git a/contrib/mini-projects/Rock Paper Scissors Game.md b/contrib/mini-projects/Rock Paper Scissors Game.md new file mode 100644 index 0000000..ed815d5 --- /dev/null +++ b/contrib/mini-projects/Rock Paper Scissors Game.md @@ -0,0 +1,48 @@ +```python +import tkinter as tk +import random + +def determine_winner(user_choice, computer_choice): + """Determine the winner of the game.""" + if user_choice == computer_choice: + return "It's a tie!", computer_choice + elif (user_choice == "rock" and computer_choice == "scissors") or \ + (user_choice == "paper" and computer_choice == "rock") or \ + (user_choice == "scissors" and computer_choice == "paper"): + return "You win!", computer_choice + else: + return "Computer wins!", computer_choice + +def play_game(): + """Play the game and display the result.""" + user_choice = user_var.get() + computer_choice = random.choice(["rock", "paper", "scissors"]) + result, computer_pick = determine_winner(user_choice, computer_choice) + result_label.config(text=result) + computer_label.config(text=f"Computer picked: {computer_pick}") + +# Create main window +root = tk.Tk() +root.title("Rock Paper Scissors") + +# User choice options +user_var = tk.StringVar() +user_var.set("rock") # Default choice +choices = ["rock", "paper", "scissors"] +for choice in choices: + rb = tk.Radiobutton(root, text=choice, variable=user_var, value=choice) + rb.pack() + +# Play button +play_button = tk.Button(root, text="Play", command=play_game) +play_button.pack() + +# Result label +result_label = tk.Label(root, text="", font=("Helvetica", 16)) +result_label.pack() + +# Computer pick label +computer_label = tk.Label(root, text="", font=("Helvetica", 12)) +computer_label.pack() + +root.mainloop() From 8f0c49efa87011c70be9d9c89889c2d9d63b8ec1 Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Wed, 15 May 2024 18:59:12 +0530 Subject: [PATCH 011/405] Update Rock Paper Scissors Game.md --- contrib/mini-projects/Rock Paper Scissors Game.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contrib/mini-projects/Rock Paper Scissors Game.md b/contrib/mini-projects/Rock Paper Scissors Game.md index ed815d5..9cc17ee 100644 --- a/contrib/mini-projects/Rock Paper Scissors Game.md +++ b/contrib/mini-projects/Rock Paper Scissors Game.md @@ -1,3 +1,12 @@ + +Here's how it looks: + +# Rock Paper Scissors Game + +This is a simple implementation of the classic rock-paper-scissors game in Python. + +## Code: + ```python import tkinter as tk import random From c79f13a28c7f21033c4c85d14a15fb675ee5bd84 Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Wed, 15 May 2024 19:02:05 +0530 Subject: [PATCH 012/405] Update Rock Paper Scissors Game.md --- contrib/mini-projects/Rock Paper Scissors Game.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/contrib/mini-projects/Rock Paper Scissors Game.md b/contrib/mini-projects/Rock Paper Scissors Game.md index 9cc17ee..b08a268 100644 --- a/contrib/mini-projects/Rock Paper Scissors Game.md +++ b/contrib/mini-projects/Rock Paper Scissors Game.md @@ -1,6 +1,3 @@ - -Here's how it looks: - # Rock Paper Scissors Game This is a simple implementation of the classic rock-paper-scissors game in Python. From 25a319ff3cb82a26ddc8f0b272713bb68a8fea77 Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Wed, 15 May 2024 19:54:12 +0530 Subject: [PATCH 013/405] Update Rock Paper Scissors Game.md --- .../mini-projects/Rock Paper Scissors Game.md | 36 +++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/contrib/mini-projects/Rock Paper Scissors Game.md b/contrib/mini-projects/Rock Paper Scissors Game.md index b08a268..c1a5ecf 100644 --- a/contrib/mini-projects/Rock Paper Scissors Game.md +++ b/contrib/mini-projects/Rock Paper Scissors Game.md @@ -2,8 +2,19 @@ This is a simple implementation of the classic rock-paper-scissors game in Python. -## Code: +## Code Explanation: +In this section, we import the required libraries (`tkinter` for GUI and `random` for generating computer choices) and define two functions: + +- `determine_winner(user_choice, computer_choice)`: + - This function determines the winner of the game based on the choices made by the user and the computer. + - It returns a tuple containing the result of the game and the computer's choice. + +- `play_game()`: + - This function handles the gameplay logic. + - It gets the user's choice from the radio buttons, generates a random choice for the computer, determines the winner using the `determine_winner()` function, and updates the result and computer pick labels accordingly. + +### Imports and Function Definitions: ```python import tkinter as tk import random @@ -26,7 +37,9 @@ def play_game(): result, computer_pick = determine_winner(user_choice, computer_choice) result_label.config(text=result) computer_label.config(text=f"Computer picked: {computer_pick}") - +``` +### GUI Setup: +```python # Create main window root = tk.Tk() root.title("Rock Paper Scissors") @@ -38,7 +51,14 @@ choices = ["rock", "paper", "scissors"] for choice in choices: rb = tk.Radiobutton(root, text=choice, variable=user_var, value=choice) rb.pack() - +``` +- Here, we create the main window for the game using `tkinter.Tk()`. We set the title to "Rock Paper Scissors". +- We define a StringVar to store the user's choice and set the default choice to "rock". +- We create radio buttons for the user to choose from ("rock", "paper", "scissors") and pack them into the main window. +``` +``` +### Play Button and Result Labels: +```python # Play button play_button = tk.Button(root, text="Play", command=play_game) play_button.pack() @@ -50,5 +70,15 @@ result_label.pack() # Computer pick label computer_label = tk.Label(root, text="", font=("Helvetica", 12)) computer_label.pack() +``` +- We create a "Play" button that triggers the play_game() function when clicked, using tkinter.Button. +- We create two labels to display the result of the game (result_label) and the computer's choice (computer_label). Both labels initially display no text and are packed into the main window. +``` +``` +### Mainloop: +```python root.mainloop() +``` +- Finally, we start the Tkinter event loop using root.mainloop(), which keeps the GUI window open and responsive until the user closes it. +- From 1196e6ee89d05deb8186e815838c90ab1b49caec Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Wed, 15 May 2024 19:57:34 +0530 Subject: [PATCH 014/405] Update Rock Paper Scissors Game.md --- contrib/mini-projects/Rock Paper Scissors Game.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/mini-projects/Rock Paper Scissors Game.md b/contrib/mini-projects/Rock Paper Scissors Game.md index c1a5ecf..36326b0 100644 --- a/contrib/mini-projects/Rock Paper Scissors Game.md +++ b/contrib/mini-projects/Rock Paper Scissors Game.md @@ -53,7 +53,7 @@ for choice in choices: rb.pack() ``` - Here, we create the main window for the game using `tkinter.Tk()`. We set the title to "Rock Paper Scissors". -- We define a StringVar to store the user's choice and set the default choice to "rock". +- We define a `StringVar` to store the user's choice and set the default choice to "rock". - We create radio buttons for the user to choose from ("rock", "paper", "scissors") and pack them into the main window. ``` ``` @@ -71,8 +71,8 @@ result_label.pack() computer_label = tk.Label(root, text="", font=("Helvetica", 12)) computer_label.pack() ``` -- We create a "Play" button that triggers the play_game() function when clicked, using tkinter.Button. -- We create two labels to display the result of the game (result_label) and the computer's choice (computer_label). Both labels initially display no text and are packed into the main window. +- We create a "Play" button that triggers the `play_game()` function when clicked, using `tkinter.Button`. +- We create two labels to display the result of the game (`result_label`) and the computer's choice (`computer_label`). Both labels initially display no text and are packed into the main window. ``` ``` @@ -80,5 +80,5 @@ computer_label.pack() ```python root.mainloop() ``` -- Finally, we start the Tkinter event loop using root.mainloop(), which keeps the GUI window open and responsive until the user closes it. +- Finally, we start the Tkinter event loop using `root.mainloop()`, which keeps the GUI window open and responsive until the user closes it. - From 989278ebe3ac868d63f6f66b9461474fb2f8679e Mon Sep 17 00:00:00 2001 From: Hema Sree Date: Thu, 16 May 2024 13:08:37 +0530 Subject: [PATCH 015/405] change file name --- contrib/numpy/Introduction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/numpy/Introduction.md b/contrib/numpy/Introduction.md index c0f5f52..eb3af67 100644 --- a/contrib/numpy/Introduction.md +++ b/contrib/numpy/Introduction.md @@ -21,7 +21,7 @@ pip install numpy ## Importing NumPy -To access NumPy functions, import it with the alias `np`: +To access NumPy functions, import it with the alias `np`. ```python import numpy as np From 7ae451cc067a73adc6068b18ddb461cea84942c6 Mon Sep 17 00:00:00 2001 From: Hema Sree Date: Thu, 16 May 2024 13:12:41 +0530 Subject: [PATCH 016/405] change file name --- 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 c6bf23c..5d3f63b 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,3 +1,3 @@ # List of sections -- [Introduction](Introduction.md) +- [Introduction](introduction.md) From 9bb50dcf528efb9cd1dbbd8970e5a52130c86482 Mon Sep 17 00:00:00 2001 From: HEMA SREE VEMULAMADA <109607812+Hemav009@users.noreply.github.com> Date: Thu, 16 May 2024 13:14:26 +0530 Subject: [PATCH 017/405] Rename Introduction.md to introduction.md --- contrib/numpy/{Introduction.md => introduction.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/numpy/{Introduction.md => introduction.md} (100%) diff --git a/contrib/numpy/Introduction.md b/contrib/numpy/introduction.md similarity index 100% rename from contrib/numpy/Introduction.md rename to contrib/numpy/introduction.md From bc4525a817f9f89d046cd9aafd1e496d147e0744 Mon Sep 17 00:00:00 2001 From: Niyonika Gaur <83643952+niyonikagaur@users.noreply.github.com> Date: Thu, 16 May 2024 14:22:43 +0530 Subject: [PATCH 018/405] Create Intro_SciPy.md --- Intro_SciPy.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 Intro_SciPy.md diff --git a/Intro_SciPy.md b/Intro_SciPy.md new file mode 100644 index 0000000..afd8b3a --- /dev/null +++ b/Intro_SciPy.md @@ -0,0 +1,136 @@ +# Introduction to SciPy +#### Python has a powerful library known as SciPy that is used for scientific and technical computing. It functions by extending the capabilities of NumPy and providing numerous operations for numerical data. Although the same library, SciPy is divided into distinct sections meant for various scientific computations. +## Installation of Scipy +### Install using the command: +#### C:\Users\Your Name>pip install scipy + You can also use a Python distribution that already has Scipy installed like Anaconda or Spyder. +### Importing SciPy +#### from scipy import constants +## Key Features of SciPy +### 1. Numerical Integration +#### It helps in computing definite or indefinite integrals of functions +``` +from scipy import integrate + +#Define the function to integrate +def f(x): + return x**2 + +#Compute definite integral of f from 0 to 1 +result, error = integrate.quad(f, 0, 1) +print(result) +``` +#### Output +``` +0.33333333333333337 +``` +### 2. Optimization +#### It can be used to minimize or maximize functions, here is an example of minimizing roots of an equation +``` +from scipy.optimize import minimize + +# Define an objective function to minimize +def objective(x): + return x**2 + 10*np.sin(x) + +# Minimize the objective function starting from x=0 +result = minimize(objective, x0=0) +print(result.x) +``` +#### Output +``` +array([-1.30644012]) +``` +### 3. Linear Algebra +#### Solving Linear computations +``` +from scipy import linalg +import numpy as np + +# Define a square matrix +A = np.array([[1, 2], [3, 4]]) + +# Define a vector +b = np.array([5, 6]) + +# Solve Ax = b for x +x = linalg.solve(A, b) +print(x) +``` +#### Output +``` +array([-4. , 4.5]) +``` +### 4. Statistics +#### Performing statistics functions, like here we'll be distributing the data +``` +from scipy import stats +import numpy as np + +# Generate random data from a normal distribution +data = stats.norm.rvs(loc=0, scale=1, size=1000) + +# Fit a normal distribution to the data +mean, std = stats.norm.fit(data) +``` +### 5. Signal Processing +#### To process spectral signals, like EEG or MEG +``` +from scipy import signal +import numpy as np + +# Create a signal (e.g., sine wave) +t = np.linspace(0, 1, 1000) +signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.randn(1000) + +# Apply a low-pass Butterworth filter +b, a = signal.butter(4, 0.1, 'low') +filtered_signal = signal.filtfilt(b, a, signal) +``` +The various filters applied that are applied here, are a part of signal analysis at a deeper level. +### 6. Sparse Matrix +#### The word ' sparse 'means less, i.e., the data is mostly unused during some operation or analysis. So, to handle this data, a Sparse Matrix is created +#### There are two types of Sparse Matrices: +##### 1. CSC: Compressed Sparse Column, it is used for efficient math functions and for column slicing +##### 2. CSR: Compressed Sparse Row, it is used for fast row slicing +#### In CSC format +``` +from scipy import sparse +import numpy as np + +data = np.array([[0, 0], [0, 1], [2, 0]]) + +row_indices = np.array([1, 2, 1]) +col_indices = np.array([1, 0, 2]) +values = np.array([1, 2, 1]) + +sparse_matrix_csc = sparse.csc_matrix((values, (row_indices, col_indices))) +``` +#### In CSR format +``` +from scipy import sparse +import numpy as np + +data = np.array([[0, 0], [0, 1], [2, 0]]) +sparse_matrix = sparse.csr_matrix(data) +``` +### 7. Image Processing +#### It is used to process the images, like changing dimensions or properties. For example, when you're doing a project on medical imaging, this library is mainly used. +``` +from scipy import ndimage +import matplotlib.pyplot as plt + +image = plt.imread('path/to/image.jpg') +plt.imshow(image) +plt.show() + +# Apply Gaussian blur to the image +blurred_image = ndimage.gaussian_filter(image, sigma=1) +plt.imshow(blurred_image) +plt.show() +``` +#### The gaussian blur is one of the properties of the ' ndimage ' package in SciPy libraries, it used for better understanding of the image. + + + + From 4c665090b7ebffd44593f90cf0cb3061ae25e390 Mon Sep 17 00:00:00 2001 From: Harish-2003 <76206815+Harish-2003@users.noreply.github.com> Date: Thu, 16 May 2024 17:05:02 +0530 Subject: [PATCH 019/405] Create TIC_TAC_TOE_GAME.md --- contrib/mini-projects/TIC_TAC_TOE_GAME.md | 91 +++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 contrib/mini-projects/TIC_TAC_TOE_GAME.md diff --git a/contrib/mini-projects/TIC_TAC_TOE_GAME.md b/contrib/mini-projects/TIC_TAC_TOE_GAME.md new file mode 100644 index 0000000..8589e64 --- /dev/null +++ b/contrib/mini-projects/TIC_TAC_TOE_GAME.md @@ -0,0 +1,91 @@ +# Python Code For The Tic Tac Toe Game +# Tic Tac Toe Game + +## Overview + +### Objective +- Get three of your symbols (X or O) in a row (horizontally, vertically, or diagonally) on a 3x3 grid. + +### Gameplay +- Two players take turns. +- Player 1 uses X, Player 2 uses O. +- Players mark an empty square in each turn. + +### Winning +- The first player to align three of their symbols wins. +- If all squares are filled without any player aligning three symbols, the game is a draw. + +```python +print("this game should be played by two people player1 takes x player2 takes o") +board = [['1','2','3'],['4','5','6'],['7','8','9']] +x = 'X' +o = 'O' +def displayBoard(): + print(f" {board[0][0]} | {board[0][1]} | {board[0][2]}") + print("----------------------------------------") + print(f" {board[1][0]} | {board[1][1]} | {board[1][2]}") + print("----------------------------------------") + print(f" {board[2][0]} | {board[2][1]} | {board[2][2]}") + print("----------------------------------------") +def updateBoard(character,position): + row = (position-1)//3 + column = (position-1)%3 + board[row][column] = character +def check_win(): + for i in range(3): + if board[i][0] == board[i][1] == board[i][2]: + return 1 + elif board[0][i] == board[1][i] == board[2][i]: + return 1 + if board[0][2] == board[1][1] == board[2][0]: + return 1 + elif board[0][0] == board[1][1] == board[2][2]: + return 1 + return 0 +def check_position(position): + row = (position-1)//3 + column = (position-1)%3 + if board[row][column] == x or board[row][column] == o: + return 0 + return 1 +print("==============================welcome to tic tac toe game =====================") +counter = 0 +while 1: + if counter % 2 == 0: + displayBoard() + while 1: + choice = int(input(f"player{(counter%2)+1},enter your position('{x}');")) + if choice < 1 or choice > 9: + print("invalid input oplease try againn") + if check_position(choice): + updateBoard(x,choice) + if check_win(): + print(f"Congratulations !!!!!!!!!!!Player {(counter % 2)+1} won !!!!!!!!!!") + exit(0) + else : + counter += 1 + break + else: + print(f"position{choice} is already occupied.Choose another position") + if counter == 9: + print("the match ended with draw better luck next time") + exit(0) + else: + displayBoard() + while 1: + choice = int(input(f"player{(counter%2)+1},enter your position('{o}'):")) + if choice < 1 or choice > 9: + print("invalid input please try again") + if check_position(choice): + updateBoard(o,choice) + if check_win(): + print(f"congratulations !!!!!!!!!!!!!!! player{(counter%2)+1} won !!!!!!!!!!!!!1") + exit(0) + else: + counter += 1 + break + else: + print(f"position {choice} is already occupied.choose another position") + print() +``` + From 12878fd655130f6b643b07c8b516a1265f7ef768 Mon Sep 17 00:00:00 2001 From: Harish-2003 <76206815+Harish-2003@users.noreply.github.com> Date: Thu, 16 May 2024 17:13:10 +0530 Subject: [PATCH 020/405] Update index.md --- contrib/mini-projects/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/mini-projects/index.md b/contrib/mini-projects/index.md index 82596a2..187d030 100644 --- a/contrib/mini-projects/index.md +++ b/contrib/mini-projects/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [TIC_TAC_TOE_GAME](TIC_TAC_TOE_GAME.md) From 2ff1b14b5cb95f5280b709cff64dd399ce570de4 Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Fri, 17 May 2024 08:45:09 +0530 Subject: [PATCH 021/405] Update index.md --- contrib/mini-projects/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/mini-projects/index.md b/contrib/mini-projects/index.md index 82596a2..37ebc9b 100644 --- a/contrib/mini-projects/index.md +++ b/contrib/mini-projects/index.md @@ -1,3 +1,4 @@ # List of sections -- [Section title](filename.md) +- [Rock Paper Scissors Game](Rock Paper Scissors Game.md) + From 7af22b698cca0a7bbf993319894d8ca69e62bf89 Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Fri, 17 May 2024 08:45:55 +0530 Subject: [PATCH 022/405] Rename Rock Paper Scissors Game.md to Rock_Paper_Scissors_Game.md --- .../{Rock Paper Scissors Game.md => Rock_Paper_Scissors_Game.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/mini-projects/{Rock Paper Scissors Game.md => Rock_Paper_Scissors_Game.md} (100%) diff --git a/contrib/mini-projects/Rock Paper Scissors Game.md b/contrib/mini-projects/Rock_Paper_Scissors_Game.md similarity index 100% rename from contrib/mini-projects/Rock Paper Scissors Game.md rename to contrib/mini-projects/Rock_Paper_Scissors_Game.md From f0d0b515a21467b985766163a027f3a1d6cf9899 Mon Sep 17 00:00:00 2001 From: Ritesh <112797055+Antiquely3059@users.noreply.github.com> Date: Fri, 17 May 2024 08:46:20 +0530 Subject: [PATCH 023/405] Update index.md --- contrib/mini-projects/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/mini-projects/index.md b/contrib/mini-projects/index.md index 37ebc9b..7d0285a 100644 --- a/contrib/mini-projects/index.md +++ b/contrib/mini-projects/index.md @@ -1,4 +1,4 @@ # List of sections -- [Rock Paper Scissors Game](Rock Paper Scissors Game.md) +- [Rock Paper Scissors Game](Rock_Paper_Scissors_Game.md) From 78cfa1f238e2d0a6c90c8bfc73d151a7d4cc3da4 Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Fri, 17 May 2024 16:47:41 +0530 Subject: [PATCH 024/405] Understanding and Building the ANNs from Scratch --- .../ArtificialNeuralNetwork.md | 172 ++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 173 insertions(+) create mode 100644 contrib/machine-learning/ArtificialNeuralNetwork.md diff --git a/contrib/machine-learning/ArtificialNeuralNetwork.md b/contrib/machine-learning/ArtificialNeuralNetwork.md new file mode 100644 index 0000000..0fafc6c --- /dev/null +++ b/contrib/machine-learning/ArtificialNeuralNetwork.md @@ -0,0 +1,172 @@ +# Understanding the Neural Network + +## Table of Contents +
+Click to expand + +- [Introduciton](#introduction) +- [Neuron to Perceptron](#neuron-to-perceptron) +- [Key concepts](#key-concepts) + - [Layers](#layers) + - [Weights and Biases](#weights-and-biases) + - [Activation Function](#activation-functions) + - [Forward and Backward Pass](#forward-and-backward-propagation) +- [Implementation](#building-from-scratch) + +
+ + +## Introduction + +This guide will walk you through a fundamental neural network implementation in Python. We'll build a `Neural Network` from scratch, allowing you to grasp the core concepts of how neural networks learn and make predictions. + +### Let's start by Understanding the Basic Architecture of Neural Nets + +## Neuron to Perceptron + +| `Neuron` cells forming the humand nervous system | `Perceptron` inspired from human brain | +| :----------------------------------------------- | -------------------------------------: | +| | | +| Neurons are nerve cells that send messages all over your body to allow you to do everything from breathing to talking, eating, walking, and thinking. | The perceptron is a mathematical model of a biological neuron. Performing heavy computations to think like humans. | +| Neuron collects signals from dendrites. | The first layer is knownn as Input Layer, acting like dendritres to receive the input signal. | +| Synapses are the connections between neurons where signals are transmitted. | Weights represent synapses. | +The axon terminal releases neurotransmitters to transmit the signal to other neurons. | The output is the final result – between 1 & 0, representing classification or prediction. | +--- +> Human brain has a Network of Neurons, about 86 billion neurons and more than a 100 trillion synapses connections! + + +## **Key Concepts** + +Artificial neurons are the fundamental processing units in an ANN. They receive inputs, multiply them by weights (representing the strength of connections), sum those weighted inputs, and then apply an activation function to produce an output. + +### Layers +Neurons in ANNs are organized into layers: +* **Input Layer:** Receives the raw data. +* **(n) Hidden Layers:** (Optional) Intermediate layers where complex transformations occur. They learn to detect patterns and features in the data. +* **Output Layer:** Produces the final result (prediction or classification). +

+ +

+ +### Weights and Biases +- For each input $(x_i)$, a weight $(w_i)$ is associated with it. Weights, multiplied with input units $(w_i \cdot x_i)$, determine the influence of one neuron's output on another. +- A bias $(b_i)$ is added to help influence the end product, giving the equation as $(w_i \cdot x_i + b_i)$. +- During training, the network adjusts these weights and biases to minimize errors and improve its predictions. + +

+ +

+ +### Activation Functions +- An activation function is applied to the result to introduce non-linearity in the model, allowing ANNs to learn more complex relationships from the data. +- The resulting equation: $y = f(g(x))$, determines whether the neuron will "fire" or not, i.e., if its output will be used as input for the next neuron. +- Common activation functions include the sigmoid function, tanh (hyperbolic tangent), and ReLU (Rectified Linear Unit). + +

+ +

+ +### Forward and Backward Propagation +- **Flow of Information:** All the above steps are part of Forward Propagation. It gives the output equation as $y = f\left(\sum_{i=1}^n w_i x_i + b_i\right)$ +- **Error Correction:** Backpropagation is the algorithm used to train ANNs by calculating the gradient of error at the output layer and then propagating this error backward through the network. This allows the network to adjust its weights and biases in the direction that reduces the error. +- The chain rule of calculus is the foundational concept to compute the gradient of the error: + $ + \delta_{ij}(E) = \frac{\partial E}{\partial w_{ij}} = \frac{\partial E}{\partial \hat{y}_j} \cdot \frac{\partial \hat{y}_j}{\partial \theta_j} \cdot \frac{\partial \theta_j}{\partial w_{ij}} + $ + where $E$ is the error, $\hat{y}_j$ is the predicted output, $\theta_j$ is the input to the activation function of the $j^{th}$ neuron, and $w_{ij}$ is the weight from neuron $i$ to neuron $j$. + +

+ +

+ + +## Building From Scratch + +```python +# Import required libraries +import numpy as np +import matplotlib.pyplot as plt + +class SimpleNeuralNetwork: + def __init__(self, input_size, hidden_size, output_size): + self.input_size = input_size + self.hidden_size = hidden_size + self.output_size = output_size + + # Initialize weights and biases + self.weights_input_hidden = np.random.randn(input_size, hidden_size) + self.bias_hidden = np.random.randn(hidden_size) + self.weights_hidden_output = np.random.randn(hidden_size, output_size) + self.bias_output = np.random.randn(output_size) + + def sigmoid(self, x): + return 1 / (1 + np.exp(-x)) + + def sigmoid_derivative(self, x): + return x * (1 - x) + + def forward(self, X): + self.hidden_layer_input = np.dot(X, self.weights_input_hidden) + self.bias_hidden + self.hidden_layer_output = self.sigmoid(self.hidden_layer_input) + + self.output_layer_input = np.dot(self.hidden_layer_output, self.weights_hidden_output) + self.bias_output + self.output = self.sigmoid(self.output_layer_input) + + return self.output + + def backward(self, X, y, learning_rate): + output_error = y - self.output + output_delta = output_error * self.sigmoid_derivative(self.output) + + hidden_error = output_delta.dot(self.weights_hidden_output.T) + hidden_delta = hidden_error * self.sigmoid_derivative(self.hidden_layer_output) + + self.weights_hidden_output += self.hidden_layer_output.T.dot(output_delta) * learning_rate + self.bias_output += np.sum(output_delta, axis=0) * learning_rate + self.weights_input_hidden += X.T.dot(hidden_delta) * learning_rate + self.bias_hidden += np.sum(hidden_delta, axis=0) * learning_rate + + def train(self, X, y, epochs, learning_rate): + self.losses = [] + for epoch in range(epochs): + self.forward(X) + self.backward(X, y, learning_rate) + loss = np.mean(np.square(y - self.output)) + self.losses.append(loss) + if epoch % 1000 == 0: + print(f"Epoch {epoch}, Loss: {loss}") + + def plot_loss(self): + plt.plot(self.losses) + plt.xlabel('Epochs') + plt.ylabel('Loss') + plt.title('Training Loss Over Epochs') + plt.show() +``` + +### Creating the Input & Output Array +Let's create a dummy input and outpu dataset. Here, the first two columns will be useful, while the rest might be noise. +```python +X = np.array([[0,0], [0,1], [1,0], [1,1]]) +y = np.array([[0], [1], [1], [1]]) +``` + +### Defining the Neural Network +With our input and output data ready, we'll define a simple neural network with one hidden layer containing three neurons. +```python +# neural network architecture +input_size = 2 +hidden_layers = 1 +hidden_neurons = [2] +output_size = 1 +``` + +### Visualizing the Training Loss +To understand how well our model is learning, let's visualize the training loss over epochs. +```python +model = NeuralNetwork(input_size, hidden_layers, hidden_neurons, output_size) +model.train(X, y, 100) +``` +

+ +

diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 82596a2..c6f4df2 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,4 @@ # List of sections - [Section title](filename.md) +- [Artificial Neural Network from the Ground Up](ArtificialNeuralNetwork.md) From 04caabe01b99ba9337e158c9c1018335eed35bcc Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Fri, 17 May 2024 17:06:47 +0530 Subject: [PATCH 025/405] 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 5c0f2b4..aadd970 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,3 +1,4 @@ # List of sections - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) +- [Excel Operations using Pandas DataFrame](excel_with_pandas.md) From 4ffc87b269773a98dfc5824abb32117684b85211 Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Fri, 17 May 2024 17:07:17 +0530 Subject: [PATCH 026/405] Create excel_with_pandas.md --- contrib/pandas/excel_with_pandas.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/pandas/excel_with_pandas.md diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/contrib/pandas/excel_with_pandas.md @@ -0,0 +1 @@ + From 56170159e1ca6e88cfcee929e3316c7dac4432da Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 17 May 2024 18:09:43 +0530 Subject: [PATCH 027/405] written --- contrib/pandas/excel_with_pandas.md | 50 +++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index 8b13789..6902c3f 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -1 +1,51 @@ +# Pandas DataFrame + +The Pandas DataFrame is a two-dimensional, size-mutable, and possibly heterogeneous tabular data format with labelled axes. A data frame is a two-dimensional data structure in which the data can be organised in rows and columns. Pandas DataFrames are comprised of three main components: data, rows, and columns. + +In the real world, Pandas DataFrames are formed by importing datasets from existing storage, which can be a Excel file, a SQL database or CSV file. Pandas DataFrames may be constructed from lists, dictionaries, or lists of dictionaries, etc. + + +### Installation of libraries + +`pip install pandas + pip install xlrd` + + +Example for reading data from an Excel File: + +```python +import pandas as pd + +l = pd.read_excel('example.xlsx') +d = pd.DataFrame(l) +print(d) +``` +Output: +'''python + Name Age +0 John 12 +''' + +- **Note:** The above program can also be used for loading/retrieving the data. + + +Example for Inserting Data into Excel File: + +```python +import pandas as pd + +l = pd.read_excel('file_name.xlsx') +d = {'Name': ['Bob', 'John'], 'Age': [12, 28]} +d = pd.DataFrame(d) +L = pd.concat([l, d], ignore_index = True) +L.to_excel('file_name.xlsx', index = False) +print(L) +``` + +Output: +'''python + Name Age +0 Bob 12 +1 John 28 +''' From 9eb63b951d03e283aa76ee0d9ce980dc4ea509ee Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 17 May 2024 18:11:53 +0530 Subject: [PATCH 028/405] updated --- contrib/pandas/excel_with_pandas.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index 6902c3f..4e67964 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -21,10 +21,10 @@ d = pd.DataFrame(l) print(d) ``` Output: -'''python +```python Name Age 0 John 12 -''' +``` - **Note:** The above program can also be used for loading/retrieving the data. @@ -43,9 +43,9 @@ print(L) ``` Output: -'''python +```python Name Age 0 Bob 12 1 John 28 -''' +``` From 0b6bd74a3b7daae3b28f8fc66576d23baee4bbc0 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 17 May 2024 18:12:42 +0530 Subject: [PATCH 029/405] updated --- contrib/pandas/excel_with_pandas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index 4e67964..b09b8c3 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -7,7 +7,7 @@ In the real world, Pandas DataFrames are formed by importing datasets from exis ### Installation of libraries -`pip install pandas +`pip install pandas
pip install xlrd` From f8044fb421f609c0ae67e65eefb4feabac914568 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 17 May 2024 18:13:28 +0530 Subject: [PATCH 030/405] updated --- contrib/pandas/excel_with_pandas.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index b09b8c3..af87b7b 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -7,8 +7,8 @@ In the real world, Pandas DataFrames are formed by importing datasets from exis ### Installation of libraries -`pip install pandas
- pip install xlrd` +`pip install pandas` +`pip install xlrd` Example for reading data from an Excel File: From 9fe61b8ec04b71037dff7506dd6169f259111bfa Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Fri, 17 May 2024 18:15:20 +0530 Subject: [PATCH 031/405] Update excel_with_pandas.md --- contrib/pandas/excel_with_pandas.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index af87b7b..137ef45 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -7,7 +7,7 @@ In the real world, Pandas DataFrames are formed by importing datasets from exis ### Installation of libraries -`pip install pandas` +`pip install pandas`
`pip install xlrd` From e4e9ad812fe87d70862390074deba405c2f9fe13 Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Fri, 17 May 2024 18:16:41 +0530 Subject: [PATCH 032/405] excel_with_pandas.md --- contrib/pandas/excel_with_pandas.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index 137ef45..13218d6 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -26,8 +26,6 @@ Output: 0 John 12 ``` -- **Note:** The above program can also be used for loading/retrieving the data. - Example for Inserting Data into Excel File: From e830336a54f5f6bce6e597df9900ee35b7a71709 Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Fri, 17 May 2024 18:25:40 +0530 Subject: [PATCH 033/405] Create excel_with_pandas.md --- contrib/pandas/excel_with_pandas.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index 13218d6..5798444 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -5,11 +5,20 @@ The Pandas DataFrame is a two-dimensional, size-mutable, and possibly heterogene In the real world, Pandas DataFrames are formed by importing datasets from existing storage, which can be a Excel file, a SQL database or CSV file. Pandas DataFrames may be constructed from lists, dictionaries, or lists of dictionaries, etc. +Features of Pandas `DataFrame`: + +- **Size mutable**: DataFrames are mutable in size, meaning that new rows and columns can be added or removed as needed. +- **Labeled axes**: DataFrames have labeled axes, which makes it easy to keep track of the data. +- **Arithmetic operations**: DataFrames support arithmetic operations on rows and columns. +- **High performance**: DataFrames are highly performant, making them ideal for working with large datasets. + + ### Installation of libraries `pip install pandas`
`pip install xlrd` +- **Note**: The `xlrd` library is used for Excel operations. Example for reading data from an Excel File: From 7fb2baf809f2cd40c0ccdd406fd75f8cb3e29d1b Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Fri, 17 May 2024 18:31:22 +0530 Subject: [PATCH 034/405] Update excel_with_pandas.md --- contrib/pandas/excel_with_pandas.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel_with_pandas.md index 5798444..d325e46 100644 --- a/contrib/pandas/excel_with_pandas.md +++ b/contrib/pandas/excel_with_pandas.md @@ -56,3 +56,8 @@ Output: 1 John 28 ``` +### Usage of Pandas DataFrame: + +- Can be used to store and analyze financial data, such as stock prices, trading data, and economic data. +- Can be used to store and analyze sensor data, such as data from temperature sensors, motion sensors, and GPS sensors. +- Can be used to store and analyze log data, such as web server logs, application logs, and system logs From fc55d32e87621268fa32e16f0c9bec55464f7ead Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 17 May 2024 18:44:42 +0530 Subject: [PATCH 035/405] Create confusion-matrix.md Added content on Confusion Matrix with code example and heatmap visualization. --- contrib/machine-learning/confusion-matrix.md | 61 ++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 contrib/machine-learning/confusion-matrix.md diff --git a/contrib/machine-learning/confusion-matrix.md b/contrib/machine-learning/confusion-matrix.md new file mode 100644 index 0000000..959df9a --- /dev/null +++ b/contrib/machine-learning/confusion-matrix.md @@ -0,0 +1,61 @@ +Confusion Matrix - A confusion matrix is a fundamental performance evaluation tool used in machine learning to assess the accuracy of a classification model. It is an N x N matrix, where N represents the number of target classes. + +For binary classification, it results in a 2 x 2 matrix that outlines four key parameters: +1. True Positive (TP) - The predicted value matches the actual value, or the predicted class matches the actual class. +For example - the actual value was positive, and the model predicted a positive value. +2. True Negative (TN) - The predicted value matches the actual value, or the predicted class matches the actual class. +For example - the actual value was negative, and the model predicted a negative value. +3. False Positive (FP)/Type I Error - The predicted value was falsely predicted. +For example - the actual value was negative, but the model predicted a positive value. +4. False Negative (FN)/Type II Error - The predicted value was falsely predicted. +For example - the actual value was positive, but the model predicted a negative value. + +The confusion matrix enables the calculation of various metrics like accuracy, precision, recall, F1-Score and specificity. +1. Accuracy - It represents the proportion of correctly classified instances out of the total number of instances in the dataset. +2. Precision - It quantifies the accuracy of positive predictions made by the model. +3. Recall - It quantifies the ability of a model to correctly identify all positive instances in the dataset and is also known as sensitivity or true positive rate. +4. F1-Score - It is a single measure that combines precision and recall, offering a balanced evaluation of a classification model's effectiveness. + +To implement the confusion matrix in Python, we can use the confusion_matrix() function from the sklearn.metrics module of the scikit-learn library. +The function returns a 2D array that represents the confusion matrix. +We can also visualize the confusion matrix using a heatmap. + +# Import necessary libraries +import numpy as np +from sklearn.metrics import confusion_matrix,classification_report +import seaborn as sns +import matplotlib.pyplot as plt + +# Create the NumPy array for actual and predicted labels +actual = np.array(['Apple', 'Apple', 'Apple', 'Not Apple', 'Apple', 'Not Apple', 'Apple', 'Apple', 'Not Apple', 'Not Apple']) +predicted = np.array(['Apple', 'Not Apple', 'Apple', 'Not Apple', 'Apple', 'Apple', 'Apple', 'Apple', 'Not Apple', 'Not Apple']) + +# Compute the confusion matrix +cm = confusion_matrix(actual,predicted) + +# Plot the confusion matrix with the help of the seaborn heatmap +sns.heatmap(cm, + annot=True, + fmt='g', + xticklabels=['Apple', 'Not Apple'], + yticklabels=['Apple', 'Not Apple']) +plt.xlabel('Prediction', fontsize=13) +plt.ylabel('Actual', fontsize=13) +plt.title('Confusion Matrix', fontsize=17) +plt.show() + +# Classifications Report based on Confusion Metrics +print(classification_report(actual, predicted)) + +# Results +1. Confusion Matrix: +[[5 1] +[1 3]] +2. Classification Report: + precision recall f1-score support +Apple 0.83 0.83 0.83 6 +Not Apple 0.75 0.75 0.75 4 + +accuracy 0.80 10 +macro avg 0.79 0.79 0.79 10 +weighted avg 0.80 0.80 0.80 10 From 1e543beeab7c458c3a22060e3c68c73b282fa874 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 17 May 2024 18:46:04 +0530 Subject: [PATCH 036/405] Update confusion-matrix.md --- contrib/machine-learning/confusion-matrix.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/machine-learning/confusion-matrix.md b/contrib/machine-learning/confusion-matrix.md index 959df9a..ac5cd31 100644 --- a/contrib/machine-learning/confusion-matrix.md +++ b/contrib/machine-learning/confusion-matrix.md @@ -1,6 +1,6 @@ Confusion Matrix - A confusion matrix is a fundamental performance evaluation tool used in machine learning to assess the accuracy of a classification model. It is an N x N matrix, where N represents the number of target classes. -For binary classification, it results in a 2 x 2 matrix that outlines four key parameters: +For binary classification, it results in a 2 x 2 matrix that outlines four key parameters: 1. True Positive (TP) - The predicted value matches the actual value, or the predicted class matches the actual class. For example - the actual value was positive, and the model predicted a positive value. 2. True Negative (TN) - The predicted value matches the actual value, or the predicted class matches the actual class. From 08c59bff565efbfff5fa8553e50ec5190046f37d Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Fri, 17 May 2024 18:58:33 +0530 Subject: [PATCH 037/405] Update index.md Added link to new content on Confusion Matrix. This includes the title "Confusion Matrix" and the corresponding markdown file link "confusion-matrix.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 82596a2..2f27fd5 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Confusion Matrix](confusion-matrix.md) From 37280da9d5fdb1ee4b9ac17f89b7c46229fc9cf4 Mon Sep 17 00:00:00 2001 From: Stuti_07 <110724092+StutiRajput07@users.noreply.github.com> Date: Fri, 17 May 2024 19:05:26 +0530 Subject: [PATCH 038/405] Create path-finder.md --- contrib/mini-projects/path-finder.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/mini-projects/path-finder.md diff --git a/contrib/mini-projects/path-finder.md b/contrib/mini-projects/path-finder.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/contrib/mini-projects/path-finder.md @@ -0,0 +1 @@ + From bb1e0e389b9261e8b04087973829f290ef05a44a Mon Sep 17 00:00:00 2001 From: Stuti_07 <110724092+StutiRajput07@users.noreply.github.com> Date: Fri, 17 May 2024 19:20:11 +0530 Subject: [PATCH 039/405] Update path-finder.md --- contrib/mini-projects/path-finder.md | 119 +++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/contrib/mini-projects/path-finder.md b/contrib/mini-projects/path-finder.md index 8b13789..98e9b87 100644 --- a/contrib/mini-projects/path-finder.md +++ b/contrib/mini-projects/path-finder.md @@ -1 +1,120 @@ +# Path Finder +This Python script uses the curses library to visualize the process of finding a path through a maze in real-time within a terminal window. The program represents the maze as a list of lists, where each list represents a row in the maze, and each string element in the lists represents a cell in the maze. The maze includes walls (#), a start point (O), and an end point (X), with empty spaces ( ) that can be traversed. +## The script includes the following main components: +- Visualization Functions:
+ print_maze(maze, stdscr, path=[]): This function is used to display the maze in the terminal. It utilizes color pairs to distinguish between the maze walls, the path, and unexplored spaces. The current path being explored is displayed with a different color to make it stand out. + +- Utility Functions:
+ find_start(maze, start): This function searches the maze for the starting point (marked as O) and returns its position as a tuple (row, col).
+ find_neighbors(maze, row, col): This function identifies the valid adjacent cells (up, down, left, right) that can be moved to from the current position, + ignoring any walls or out-of-bound positions. + +- Pathfinding Logic:
+ find_path(maze, stdscr): This function implements a Breadth-First Search (BFS) algorithm to find a path from the start point to the end point (X). It uses a + queue to explore each possible path sequentially. As it explores the maze, it updates the display in real-time, allowing the viewer to follow the progress + visually. Each visited position is marked and not revisited, ensuring the algorithm efficiently covers all possible paths without repetition. + +Overall, the script demonstrates an effective use of the curses library to create a dynamic visual representation of the BFS algorithm solving a maze, providing both an educational tool for understanding pathfinding and an example of real-time data visualization in a terminal. + +#### Below is the code of the path finder + + +```python +import curses +from curses import wrapper +import queue +import time + +# Define the structure of the maze as a list of lists where each inner list represents a row. +maze = [ + ["#", "O", "#", "#", "#", "#", "#", "#", "#"], + ["#", " ", " ", " ", " ", " ", " ", " ", "#"], + ["#", " ", "#", "#", " ", "#", "#", " ", "#"], + ["#", " ", "#", " ", " ", " ", "#", " ", "#"], + ["#", " ", "#", " ", "#", " ", "#", " ", "#"], + ["#", " ", "#", " ", "#", " ", "#", " ", "#"], + ["#", " ", "#", " ", "#", " ", "#", "#", "#"], + ["#", " ", " ", " ", " ", " ", " ", " ", "#"], + ["#", "#", "#", "#", "#", "#", "#", "X", "#"] +] + +# Function to print the current state of the maze in the terminal. +def print_maze(maze, stdscr, path=[]): + BLUE = curses.color_pair(1) # Color pair for walls and free paths + RED = curses.color_pair(2) # Color pair for the current path + + for i, row in enumerate(maze): + for j, value in enumerate(row): + if (i, j) in path: + stdscr.addstr(i, j*2, "X", RED) # Print path character with red color + else: + stdscr.addstr(i, j*2, value, BLUE) # Print walls and free paths with blue color + +# Function to locate the starting point (marked 'O') in the maze. +def find_start(maze, start): + for i, row in enumerate(maze): + for j, value in enumerate(row): + if value == start: + return i, j + return None + +# Function to find a path from start ('O') to end ('X') using BFS. +def find_path(maze, stdscr): + start = "O" + end = "X" + start_pos = find_start(maze, start) # Get the start position + + q = queue.Queue() + q.put((start_pos, [start_pos])) # Initialize the queue with the start position + + visited = set() # Set to keep track of visited positions + + while not q.empty(): + current_pos, path = q.get() # Get the current position and path + row, col = current_pos + + stdscr.clear() # Clear the screen + print_maze(maze, stdscr, path) # Print the current state of the maze + time.sleep(0.2) # Delay for visibility + stdscr.refresh() # Refresh the screen + + if maze[row][col] == end: # Check if the current position is the end + return path # Return the path if end is reached + + # Get neighbors (up, down, left, right) that are not walls + neighbors = find_neighbors(maze, row, col) + for neighbor in neighbors: + if neighbor not in visited: + r, c = neighbor + if maze[r][c] != "#": + new_path = path + [neighbor] + q.put((neighbor, new_path)) + visited.add(neighbor) + +# Function to find the valid neighboring cells (not walls or out of bounds). +def find_neighbors(maze, row, col): + neighbors = [] + if row > 0: # UP + neighbors.append((row - 1, col)) + if row + 1 < len(maze): # DOWN + neighbors.append((row + 1, col)) + if col > 0: # LEFT + neighbors.append((row, col - 1)) + if col + 1 < len(maze[0]): # RIGHT + neighbors.append((row, col + 1)) + return neighbors + +# Main function to setup curses and run the pathfinding algorithm. +def main(stdscr): + curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_BLACK) # Initialize color pair for blue + curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK) # Initialize color pair for red + + find_path(maze, stdscr) # Find the path using BFS + stdscr.getch() # Wait for a key press before exiting + +wrapper(main) # Use the wrapper to initialize and finalize curses automatically. + +``` + + From c339a064e55185b92f88dd6ec9c71d11b3755167 Mon Sep 17 00:00:00 2001 From: Stuti_07 <110724092+StutiRajput07@users.noreply.github.com> Date: Fri, 17 May 2024 19:21:04 +0530 Subject: [PATCH 040/405] Update index.md --- contrib/mini-projects/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/mini-projects/index.md b/contrib/mini-projects/index.md index 82596a2..d99a43e 100644 --- a/contrib/mini-projects/index.md +++ b/contrib/mini-projects/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Path Finder](path-finder.md) From 0ad50df483d3179134a5e3551a661f6473a3500b Mon Sep 17 00:00:00 2001 From: HimakarC <116370824+HimakarC@users.noreply.github.com> Date: Fri, 17 May 2024 19:28:54 +0530 Subject: [PATCH 041/405] 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 aadd970..834d1f4 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,4 +1,4 @@ # List of sections - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) -- [Excel Operations using Pandas DataFrame](excel_with_pandas.md) +- [Excel using Pandas DataFrame](excel_with_pandas.md) From a758ff832d439bb225dc7f292974204e8f500643 Mon Sep 17 00:00:00 2001 From: Yogesh Vishwakarma <103316955+Yogeshkarma@users.noreply.github.com> Date: Fri, 17 May 2024 19:43:23 +0530 Subject: [PATCH 042/405] Create Regression.md --- contrib/machine-learning/Regression.md | 171 +++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 contrib/machine-learning/Regression.md diff --git a/contrib/machine-learning/Regression.md b/contrib/machine-learning/Regression.md new file mode 100644 index 0000000..6ff6d28 --- /dev/null +++ b/contrib/machine-learning/Regression.md @@ -0,0 +1,171 @@ +# Regression + + +* Regression is a supervised machine learning technique which is used to predict continuous values. + + +> Now, Supervised learning is a category of machine learning that uses labeled datasets to train algorithms to predict outcomes and recognize patterns. + +* Regression is a statistical method used to model the relationship between a dependent variable (often denoted as 'y') and one or more independent variables (often denoted as 'x'). The goal of regression analysis is to understand how the dependent variable changes as the independent variables change. + # Types Of Regression + +1. Linear Regression +2. Polynomial Regression +3. Stepwise Regression +4. Decision Tree Regression +5. Random Forest Regression +6. Ridge Regression +7. Lasso Regression +8. ElasticNet Regression +9. Bayesian Linear Regression +10. Support Vector Regression + +But, we'll first start with Linear Regression +# Linear Regression + +* Linear regression is a fundamental statistical method used to model the relationship between a dependent variable (often denoted as +𝑌) and one or more independent variables (often denoted as +𝑋). The relationship is assumed to be linear, meaning that changes in the independent variables are associated with changes in the dependent variable in a straight-line fashion. + +The basic form of linear regression for a single independent variable is: + +**𝑌=𝛽0+𝛽1𝑋+𝜖** + +Where: + +* Y is the dependent variable. +* X is the independent variable. +* 𝛽0 is the intercept, representing the value of Y when X is zero +* 𝛽1 is the slope coefficient, representing the change in Y for a one-unit change in X +* ϵ is the error term, representing the variability in Y that is not explained by the linear relationship with X. + +# Basic Code of Linear Regression + +* This line imports the numpy library, which is widely used for numerical operations in Python. We use np as an alias for numpy, making it easier to reference functions and objects from the library. +``` +import numpy as np +``` + +* This line imports the LinearRegression class from the linear_model module of the scikit-learn library.scikit-learn is a powerful library for machine learning tasks in Python, and LinearRegression is a class provided by it for linear regression. +``` +from sklearn.linear_model import LinearRegression +``` +* This line creates a NumPy array X containing the independent variable values. In this example, we have a simple one-dimensional array representing the independent variable. The reshape(-1, 1) method reshapes the array into a column vector, necessary for use with scikit-learn + +``` +X = np.array([1, 2, 3, 4, 5]).reshape(-1, 1) +``` +* This line creates a NumPy array Y containing the corresponding dependent variable values. These are the observed values of the dependent variable corresponding to the independent variable values in X. +``` +Y = np.array([2, 4, 5, 8, 5]) +``` + +* This line creates an instance of the LinearRegression class, which represents the linear regression model. We'll use this object to train the model and make predictions. +``` +model = LinearRegression() +``` + +* This line fits the linear regression model to the data. The fit() method takes two arguments: the independent variable (X) and the dependent variable (Y). This method estimates the coefficients of the linear regression equation that best fit the given data. +``` +model.fit(X, Y) +``` +* These lines print out the intercept (beta_0) and coefficient (beta_1) of the linear regression model. model.intercept_ gives the intercept value, and model.coef_ gives an array of coefficients, where model.coef_[0] corresponds to the coefficient of the first independent variable (in this case, there's only one). +``` +print("Intercept:", model.intercept_) +print("Coefficient:", model.coef_[0]) +``` + +* These lines demonstrate how to use the trained model to make predictions for new data. +* We create a new NumPy array new_data containing the values of the independent variable for which we want to predict the dependent variable values. +* We then use the predict() method of the model to obtain the predictions for these new data points. Finally, we print out the predicted values. +``` +new_data = np.array([[6], [7]]) +predictions = model.predict(new_data) +print("Predictions:", predictions) +``` +# Assumptions of Linear Regression + +# Linearity: + +* To assess the linearity assumption, we can visually inspect a scatter plot of the observed values versus the predicted values. +* If the relationship between them appears linear, it suggests that the linearity assumption is reasonable. +``` +import matplotlib.pyplot as plt +predictions = model.predict(X) +plt.scatter(predictions,Y) +plt.xlabel("Predicted Values") +plt.ylabel("Observed Values") +plt.title("Linearity Check: Observed vs Predicted") +plt.show() +``` +# Homoscedasticity: +* Homoscedasticity refers to the constant variance of the residuals across all levels of the independent variable(s). We can visually inspect a plot of residuals versus predicted values to check for homoscedasticity. +``` +residuals = Y - predictions +plt.scatter(predictions, residuals) +plt.xlabel("Predicted Values") +plt.ylabel("Residuals") +plt.title("Homoscedasticity Check: Residuals vs Predicted Values") +plt.axhline(y=0, color='red', linestyle='--') # Add horizontal line at y=0 +plt.show() + +``` +# Normality of Residuals: +* To assess the normality of residuals, we can visually inspect a histogram or a Q-Q plot of the residuals. +``` +import seaborn as sns + +sns.histplot(residuals, kde=True) +plt.xlabel("Residuals") +plt.ylabel("Frequency") +plt.title("Normality of Residuals: Histogram") +plt.show() + +import scipy.stats as stats + +stats.probplot(residuals, dist="norm", plot=plt) +plt.title("Normal Q-Q Plot") +plt.show() + +``` +# Metrics for Regression + + +# Mean Absolute Error (MAE) + +* MAE measures the average magnitude of the errors in a set of predictions, without considering their direction. It is the average of the absolute differences between predicted and actual values. +``` +from sklearn.metrics import mean_absolute_error + +mae = mean_absolute_error(Y, predictions) +print(f"Mean Absolute Error (MAE): {mae}") + +``` +# Mean Squared Error (MSE) + +* MSE measures the average of the squares of the errors. It gives more weight to larger errors, making it sensitive to outliers. +``` +from sklearn.metrics import mean_squared_error + +mse = mean_squared_error(Y, predictions) +print(f"Mean Squared Error (MSE): {mse}") +``` +# Root Mean Squared Error (RMSE) +* RMSE is the square root of the MSE. It provides an error metric that is in the same units as the dependent variable, making it more interpretable. +``` +rmse = np.sqrt(mse) +print(f"Root Mean Squared Error (RMSE): {rmse}") + +``` +# R-squared (Coefficient of Determination) +* R-squared measures the proportion of the variance in the dependent variable that is predictable from the independent variables. It ranges from 0 to 1, where 1 indicates a perfect fit. +``` +from sklearn.metrics import r2_score + +r2 = r2_score(Y, predictions) +print(f"R-squared (R^2): {r2}") +``` + +> In this tutorial, The sample dataset is there for learning purpose only + + From d51207d7c9966ee7122fc687661d6dc271742435 Mon Sep 17 00:00:00 2001 From: Yogesh Vishwakarma <103316955+Yogeshkarma@users.noreply.github.com> Date: Fri, 17 May 2024 19:44:58 +0530 Subject: [PATCH 043/405] 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 82596a2..094b211 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Regression in Machine Learning](Regression.md) From 741bb87351bc533ddace81823ed506aa63188a59 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Fri, 17 May 2024 23:11:26 +0530 Subject: [PATCH 044/405] 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 5c0f2b4..f2a3fa7 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,3 +1,4 @@ # List of sections - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) +- [Pandas Introduction and Dataframes in Pandas](Introduction_to_Pandas_Library_and_DataFrames.md) From 35baa355cb23b9f7dad9818ebc5cbe80fff35e84 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Fri, 17 May 2024 23:11:53 +0530 Subject: [PATCH 045/405] Add files via upload --- ...uction_to_Pandas_Library_and_DataFrames.md | 395 ++++++++++++++++++ 1 file changed, 395 insertions(+) create mode 100644 contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md diff --git a/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md b/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md new file mode 100644 index 0000000..5e7dcd3 --- /dev/null +++ b/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md @@ -0,0 +1,395 @@ +# Introduction_to_Pandas_Library_and_DataFrames + + +> Content Creator - Krishna Kaushik + +**As you have learnt Python Programming , now it's time for some applications.** + +- Machine Learning and Data Science is the emerging field of today's time , to work in this this field your first step should be `Data Science` as Machine Learning is all about data. +- To begin with Data Science your first tool will be `Pandas Library`. + +## Introduction of Pandas Library + +Pandas is a data analysis and manipulation tool, built on top of the python programming language. Pandas got its name from the term Panel data (‘Pa’ from Panel and ‘da’ from data). Panel data is a data which have rows and columns in it like excel spreadsheets, csv files etc. + +**To use Pandas, first we’ve to import it.** + +## Why pandas? + +* Pandas provides a simple-to-use but very capable set of functions that you can use on your data. +* It is also associate with other machine learning libraries , so it is important to learn it. + +* For example - It is highly used to transform tha data which will be use by machine learning model during the training. + + +```python +# Importing the pandas +import pandas as pd +``` + +*To import any module in Python use “import 'module name' ” command, I used “pd” as pandas abbreviation because we don’t need to type pandas every time only type “pd” to use pandas.* + + +```python +# To check available pandas version +print(f"Pandas Version is : {pd.__version__}") +``` + + Pandas Version is : 2.1.4 + + +## Understanding Pandas data types + +Pandas has two main data types : `Series` and `DataFrames` + +* `pandas.Series` is a 1-dimensional column of data. +* `pandas.DataFrames` is 2 -dimensional data table having rows and columns. + +### 1. Series datatype + +**To creeate a series you can use `pd.Series()` and passing a python list inside()**. + +Note: S in Series is capital if you use small s it will give you an error. + +> Let's create a series + + + +```python +# Creating a series of car companies +cars = pd.Series(["Honda","Audi","Thar","BMW"]) +cars +``` + + + + + 0 Honda + 1 Audi + 2 Thar + 3 BMW + dtype: object + + + +The above code creates a Series of cars companies the name of series is “cars” the code “pd.Series([“Honda” , “Audi” , “Thar”, "BMW"])” means Hey! pandas (pd) create a Series of cars named "Honda" , "Audi" , "Thar" and "BMW". + +The default index of a series is 0,1,2….(Remember it starts from 0) + +To change the index of any series set the “index” parameter accordingly. It takes the list of index values: + + +```python +cars = pd.Series(["Honda","Audi","Thar","BMW"],index = ["A" , "B" , "C" ,"D"]) +cars +``` + + + + + A Honda + B Audi + C Thar + D BMW + dtype: object + + + +You can see that the index has been changed from numbers to A, B ,C and D. + +And the mentioned ‘dtype’ tells us about the type of data we have in the series. + +### 2. DataFrames datatype + +DataFrame contains rows and columns like a csv file have. + +You can also create a DataFrame by using `pd.DataFrame()` and passing it a Python dictionary. + + +```python +# Let's create +cars_with_colours = pd.DataFrame({"Cars" : ["BMW","Audi","Thar","Honda"], + "Colour" : ["Black","White","Red","Green"]}) +cars_with_colours +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CarsColour
0BMWBlack
1AudiWhite
2TharRed
3HondaGreen
+
+ + + +The dictionary key is the `column name` and value are the `column data`. + +*You can also create a DataFrame with the help of series.* + + +```python +# Let's create two series +students = pd.Series(["Ram","Mohan","Krishna","Shivam"]) +age = pd.Series([19,20,21,24]) + +students +``` + + + + + 0 Ram + 1 Mohan + 2 Krishna + 3 Shivam + dtype: object + + + + +```python +age +``` + + + + + 0 19 + 1 20 + 2 21 + 3 24 + dtype: int64 + + + + +```python +# Now let's create a dataframe with the help of above series +# pass the series name to the dictionary value + +record = pd.DataFrame({"Student_Name":students , + "Age" :age}) +record +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Student_NameAge
0Ram19
1Mohan20
2Krishna21
3Shivam24
+
+ + + + +```python +# To print the list of columns names +record.columns +``` + + + + + Index(['Student_Name', 'Age'], dtype='object') + + + +### Describe Data + +**The good news is that pandas has many built-in functions which allow you to quickly get information about a DataFrame.** +Let's explore the `record` dataframe + +#### 1. Use `.dtypes` to find what datatype a column contains + + +```python +record.dtypes +``` + + + + + Student_Name object + Age int64 + dtype: object + + + +#### 2. use `.describe()` for statistical overview. + + +```python +record.describe() # It only display the results for numeric data +``` + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Age
count4.000000
mean21.000000
std2.160247
min19.000000
25%19.750000
50%20.500000
75%21.750000
max24.000000
+
+ + + +#### 3. Use `.info()` to find information about the dataframe + + +```python +record.info() +``` + + + RangeIndex: 4 entries, 0 to 3 + Data columns (total 2 columns): + # Column Non-Null Count Dtype + --- ------ -------------- ----- + 0 Student_Name 4 non-null object + 1 Age 4 non-null int64 + dtypes: int64(1), object(1) + memory usage: 196.0+ bytes + + + +```python + +``` From 6bee5482ad8b0b83273f1a8f6c3ddc8aee483d3c Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Fri, 17 May 2024 23:14:01 +0530 Subject: [PATCH 046/405] Update Introduction_to_Pandas_Library_and_DataFrames.md --- ...uction_to_Pandas_Library_and_DataFrames.md | 54 ------------------- 1 file changed, 54 deletions(-) diff --git a/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md b/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md index 5e7dcd3..809a155 100644 --- a/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md +++ b/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md @@ -112,24 +112,6 @@ cars_with_colours = pd.DataFrame({"Cars" : ["BMW","Audi","Thar","Honda"], "Colour" : ["Black","White","Red","Green"]}) cars_with_colours ``` - - - - -
- @@ -214,24 +196,6 @@ record = pd.DataFrame({"Student_Name":students , "Age" :age}) record ``` - - - - -
-
@@ -307,24 +271,6 @@ record.dtypes ```python record.describe() # It only display the results for numeric data ``` - - - - -
-
From 1834690a1064b0e280d1d8f4e6c31ca61f3f13b9 Mon Sep 17 00:00:00 2001 From: Niyonika Gaur <83643952+niyonikagaur@users.noreply.github.com> Date: Fri, 17 May 2024 23:37:59 +0530 Subject: [PATCH 047/405] Introduction_to_SciPy.md --- contrib/scipy/index.md | 132 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 2 deletions(-) diff --git a/contrib/scipy/index.md b/contrib/scipy/index.md index 82596a2..9c35f95 100644 --- a/contrib/scipy/index.md +++ b/contrib/scipy/index.md @@ -1,3 +1,131 @@ -# List of sections +## Installation of Scipy +### Install using the command: +#### C:\Users\Your Name>pip install scipy + You can also use a Python distribution that already has Scipy installed like Anaconda, or Spyder. +### Importing SciPy +#### from scipy import constants +## Key Features of SciPy +### 1. Numerical Integration +#### It helps in computing definite or indefinite integrals of functions +``` +from scipy import integrate + +#Define the function to integrate +def f(x): + return x**2 + +#Compute definite integral of f from 0 to 1 +result, error = integrate.quad(f, 0, 1) +print(result) +``` +#### Output +``` +0.33333333333333337 +``` +### 2. Optimization +#### It can be used to minimize or maximize functions, here is an example of minimizing roots of an equation +``` +from scipy.optimize import minimize + +# Define an objective function to minimize +def objective(x): + return x**2 + 10*np.sin(x) + +# Minimize the objective function starting from x=0 +result = minimize(objective, x0=0) +print(result.x) +``` +#### Output +``` +array([-1.30644012]) +``` +### 3. Linear Algebra +#### Solving Linear computations +``` +from scipy import linalg +import numpy as np + +# Define a square matrix +A = np.array([[1, 2], [3, 4]]) + +# Define a vector +b = np.array([5, 6]) + +# Solve Ax = b for x +x = linalg.solve(A, b) +print(x) +``` +#### Output +``` +array([-4. , 4.5]) +``` +### 4. Statistics +#### Performing statistics functions, like here we'll be distributing the data +``` +from scipy import stats +import numpy as np + +# Generate random data from a normal distribution +data = stats.norm.rvs(loc=0, scale=1, size=1000) + +# Fit a normal distribution to the data +mean, std = stats.norm.fit(data) +``` +### 5. Signal Processing +#### To process spectral signals, like EEG or MEG +``` +from scipy import signal +import numpy as np + +# Create a signal (e.g., sine wave) +t = np.linspace(0, 1, 1000) +signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.randn(1000) + +# Apply a low-pass Butterworth filter +b, a = signal.butter(4, 0.1, 'low') +filtered_signal = signal.filtfilt(b, a, signal) +``` +The various filters applied that are applied here, are a part of signal analysis at a deeper level. +### 6. Sparse Matrix +#### The word ' sparse 'means less, i.e., the data is mostly unused during some operation or analysis. So, to handle this data, a Sparse Matrix is created +#### There are two types of Sparse Matrices: +##### 1. CSC: Compressed Sparse Column, it is used for efficient math functions and for column slicing +##### 2. CSR: Compressed Sparse Row, it is used for fast row slicing +#### In CSC format +``` +from scipy import sparse +import numpy as np + +data = np.array([[0, 0], [0, 1], [2, 0]]) + +row_indices = np.array([1, 2, 1]) +col_indices = np.array([1, 0, 2]) +values = np.array([1, 2, 1]) + +sparse_matrix_csc = sparse.csc_matrix((values, (row_indices, col_indices))) +``` +#### In CSR format +``` +from scipy import sparse +import numpy as np + +data = np.array([[0, 0], [0, 1], [2, 0]]) +sparse_matrix = sparse.csr_matrix(data) +``` +### 7. Image Processing +#### It is used to process the images, like changing dimensions or properties. For example, when you're doing a project on medical imaging, this library is mainly used. +``` +from scipy import ndimage +import matplotlib.pyplot as plt + +image = plt.imread('path/to/image.jpg') +plt.imshow(image) +plt.show() + +# Apply Gaussian blur to the image +blurred_image = ndimage.gaussian_filter(image, sigma=1) +plt.imshow(blurred_image) +plt.show() +``` +#### The gaussian blur is one of the properties of the ' ndimage ' package in SciPy libraries, it used for better understanding of the image. -- [Section title](filename.md) From c60a01491bfbb42a8a9d65b2f28a6e691a4b7e4e Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Fri, 17 May 2024 23:38:40 +0530 Subject: [PATCH 048/405] updated content --- .../ArtificialNeuralNetwork.md | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/contrib/machine-learning/ArtificialNeuralNetwork.md b/contrib/machine-learning/ArtificialNeuralNetwork.md index 0fafc6c..c577c94 100644 --- a/contrib/machine-learning/ArtificialNeuralNetwork.md +++ b/contrib/machine-learning/ArtificialNeuralNetwork.md @@ -26,7 +26,6 @@ This guide will walk you through a fundamental neural network implementation in | `Neuron` cells forming the humand nervous system | `Perceptron` inspired from human brain | | :----------------------------------------------- | -------------------------------------: | -| | | | Neurons are nerve cells that send messages all over your body to allow you to do everything from breathing to talking, eating, walking, and thinking. | The perceptron is a mathematical model of a biological neuron. Performing heavy computations to think like humans. | | Neuron collects signals from dendrites. | The first layer is knownn as Input Layer, acting like dendritres to receive the input signal. | | Synapses are the connections between neurons where signals are transmitted. | Weights represent synapses. | @@ -44,28 +43,17 @@ Neurons in ANNs are organized into layers: * **Input Layer:** Receives the raw data. * **(n) Hidden Layers:** (Optional) Intermediate layers where complex transformations occur. They learn to detect patterns and features in the data. * **Output Layer:** Produces the final result (prediction or classification). -

- -

### Weights and Biases - For each input $(x_i)$, a weight $(w_i)$ is associated with it. Weights, multiplied with input units $(w_i \cdot x_i)$, determine the influence of one neuron's output on another. - A bias $(b_i)$ is added to help influence the end product, giving the equation as $(w_i \cdot x_i + b_i)$. - During training, the network adjusts these weights and biases to minimize errors and improve its predictions. -

- -

- ### Activation Functions - An activation function is applied to the result to introduce non-linearity in the model, allowing ANNs to learn more complex relationships from the data. - The resulting equation: $y = f(g(x))$, determines whether the neuron will "fire" or not, i.e., if its output will be used as input for the next neuron. - Common activation functions include the sigmoid function, tanh (hyperbolic tangent), and ReLU (Rectified Linear Unit). -

- -

- ### Forward and Backward Propagation - **Flow of Information:** All the above steps are part of Forward Propagation. It gives the output equation as $y = f\left(\sum_{i=1}^n w_i x_i + b_i\right)$ - **Error Correction:** Backpropagation is the algorithm used to train ANNs by calculating the gradient of error at the output layer and then propagating this error backward through the network. This allows the network to adjust its weights and biases in the direction that reduces the error. @@ -75,10 +63,6 @@ Neurons in ANNs are organized into layers: $ where $E$ is the error, $\hat{y}_j$ is the predicted output, $\theta_j$ is the input to the activation function of the $j^{th}$ neuron, and $w_{ij}$ is the weight from neuron $i$ to neuron $j$. -

- -

- ## Building From Scratch @@ -167,6 +151,3 @@ To understand how well our model is learning, let's visualize the training loss model = NeuralNetwork(input_size, hidden_layers, hidden_neurons, output_size) model.train(X, y, 100) ``` -

- -

From 7c3b30466982483e69db3513e0afc438e982cad8 Mon Sep 17 00:00:00 2001 From: Niyonika Gaur <83643952+niyonikagaur@users.noreply.github.com> Date: Fri, 17 May 2024 23:58:14 +0530 Subject: [PATCH 049/405] Update index.md --- contrib/scipy/index.md | 131 +---------------------------------------- 1 file changed, 2 insertions(+), 129 deletions(-) diff --git a/contrib/scipy/index.md b/contrib/scipy/index.md index 9c35f95..3ff5a7d 100644 --- a/contrib/scipy/index.md +++ b/contrib/scipy/index.md @@ -1,131 +1,4 @@ -## Installation of Scipy -### Install using the command: -#### C:\Users\Your Name>pip install scipy - You can also use a Python distribution that already has Scipy installed like Anaconda, or Spyder. -### Importing SciPy -#### from scipy import constants -## Key Features of SciPy -### 1. Numerical Integration -#### It helps in computing definite or indefinite integrals of functions -``` -from scipy import integrate +# List of sections -#Define the function to integrate -def f(x): - return x**2 - -#Compute definite integral of f from 0 to 1 -result, error = integrate.quad(f, 0, 1) -print(result) -``` -#### Output -``` -0.33333333333333337 -``` -### 2. Optimization -#### It can be used to minimize or maximize functions, here is an example of minimizing roots of an equation -``` -from scipy.optimize import minimize - -# Define an objective function to minimize -def objective(x): - return x**2 + 10*np.sin(x) - -# Minimize the objective function starting from x=0 -result = minimize(objective, x0=0) -print(result.x) -``` -#### Output -``` -array([-1.30644012]) -``` -### 3. Linear Algebra -#### Solving Linear computations -``` -from scipy import linalg -import numpy as np - -# Define a square matrix -A = np.array([[1, 2], [3, 4]]) - -# Define a vector -b = np.array([5, 6]) - -# Solve Ax = b for x -x = linalg.solve(A, b) -print(x) -``` -#### Output -``` -array([-4. , 4.5]) -``` -### 4. Statistics -#### Performing statistics functions, like here we'll be distributing the data -``` -from scipy import stats -import numpy as np - -# Generate random data from a normal distribution -data = stats.norm.rvs(loc=0, scale=1, size=1000) - -# Fit a normal distribution to the data -mean, std = stats.norm.fit(data) -``` -### 5. Signal Processing -#### To process spectral signals, like EEG or MEG -``` -from scipy import signal -import numpy as np - -# Create a signal (e.g., sine wave) -t = np.linspace(0, 1, 1000) -signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.randn(1000) - -# Apply a low-pass Butterworth filter -b, a = signal.butter(4, 0.1, 'low') -filtered_signal = signal.filtfilt(b, a, signal) -``` -The various filters applied that are applied here, are a part of signal analysis at a deeper level. -### 6. Sparse Matrix -#### The word ' sparse 'means less, i.e., the data is mostly unused during some operation or analysis. So, to handle this data, a Sparse Matrix is created -#### There are two types of Sparse Matrices: -##### 1. CSC: Compressed Sparse Column, it is used for efficient math functions and for column slicing -##### 2. CSR: Compressed Sparse Row, it is used for fast row slicing -#### In CSC format -``` -from scipy import sparse -import numpy as np - -data = np.array([[0, 0], [0, 1], [2, 0]]) - -row_indices = np.array([1, 2, 1]) -col_indices = np.array([1, 0, 2]) -values = np.array([1, 2, 1]) - -sparse_matrix_csc = sparse.csc_matrix((values, (row_indices, col_indices))) -``` -#### In CSR format -``` -from scipy import sparse -import numpy as np - -data = np.array([[0, 0], [0, 1], [2, 0]]) -sparse_matrix = sparse.csr_matrix(data) -``` -### 7. Image Processing -#### It is used to process the images, like changing dimensions or properties. For example, when you're doing a project on medical imaging, this library is mainly used. -``` -from scipy import ndimage -import matplotlib.pyplot as plt - -image = plt.imread('path/to/image.jpg') -plt.imshow(image) -plt.show() - -# Apply Gaussian blur to the image -blurred_image = ndimage.gaussian_filter(image, sigma=1) -plt.imshow(blurred_image) -plt.show() -``` -#### The gaussian blur is one of the properties of the ' ndimage ' package in SciPy libraries, it used for better understanding of the image. +- [Installation of Scipy and its key uses](pandas_series_vs_numpy_ndarray.md) From 0a63d2e17d69b8d8d3032bf36c51a183dc0e2450 Mon Sep 17 00:00:00 2001 From: Niyonika Gaur <83643952+niyonikagaur@users.noreply.github.com> Date: Fri, 17 May 2024 23:59:25 +0530 Subject: [PATCH 050/405] Installation_of_Scipy_&_its_key_uses.md --- .../Installation_of_Scipy_&_its_key_uses.md | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 contrib/scipy/Installation_of_Scipy_&_its_key_uses.md diff --git a/contrib/scipy/Installation_of_Scipy_&_its_key_uses.md b/contrib/scipy/Installation_of_Scipy_&_its_key_uses.md new file mode 100644 index 0000000..33232dc --- /dev/null +++ b/contrib/scipy/Installation_of_Scipy_&_its_key_uses.md @@ -0,0 +1,130 @@ +## Installation of Scipy +### Install using the command: +#### C:\Users\Your Name>pip install scipy + You can also use a Python distribution that already has Scipy installed like Anaconda, or Spyder. +### Importing SciPy +#### from scipy import constants +## Key Features of SciPy +### 1. Numerical Integration +#### It helps in computing definite or indefinite integrals of functions +``` +from scipy import integrate + +#Define the function to integrate +def f(x): + return x**2 + +#Compute definite integral of f from 0 to 1 +result, error = integrate.quad(f, 0, 1) +print(result) +``` +#### Output +``` +0.33333333333333337 +``` +### 2. Optimization +#### It can be used to minimize or maximize functions, here is an example of minimizing roots of an equation +``` +from scipy.optimize import minimize + +# Define an objective function to minimize +def objective(x): + return x**2 + 10*np.sin(x) + +# Minimize the objective function starting from x=0 +result = minimize(objective, x0=0) +print(result.x) +``` +#### Output +``` +array([-1.30644012]) +``` +### 3. Linear Algebra +#### Solving Linear computations +``` +from scipy import linalg +import numpy as np + +# Define a square matrix +A = np.array([[1, 2], [3, 4]]) + +# Define a vector +b = np.array([5, 6]) + +# Solve Ax = b for x +x = linalg.solve(A, b) +print(x) +``` +#### Output +``` +array([-4. , 4.5]) +``` +### 4. Statistics +#### Performing statistics functions, like here we'll be distributing the data +``` +from scipy import stats +import numpy as np + +# Generate random data from a normal distribution +data = stats.norm.rvs(loc=0, scale=1, size=1000) + +# Fit a normal distribution to the data +mean, std = stats.norm.fit(data) +``` +### 5. Signal Processing +#### To process spectral signals, like EEG or MEG +``` +from scipy import signal +import numpy as np + +# Create a signal (e.g., sine wave) +t = np.linspace(0, 1, 1000) +signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.randn(1000) + +# Apply a low-pass Butterworth filter +b, a = signal.butter(4, 0.1, 'low') +filtered_signal = signal.filtfilt(b, a, signal) +``` +The various filters applied that are applied here, are a part of signal analysis at a deeper level. +### 6. Sparse Matrix +#### The word ' sparse 'means less, i.e., the data is mostly unused during some operation or analysis. So, to handle this data, a Sparse Matrix is created +#### There are two types of Sparse Matrices: +##### 1. CSC: Compressed Sparse Column, it is used for efficient math functions and for column slicing +##### 2. CSR: Compressed Sparse Row, it is used for fast row slicing +#### In CSC format +``` +from scipy import sparse +import numpy as np + +data = np.array([[0, 0], [0, 1], [2, 0]]) + +row_indices = np.array([1, 2, 1]) +col_indices = np.array([1, 0, 2]) +values = np.array([1, 2, 1]) + +sparse_matrix_csc = sparse.csc_matrix((values, (row_indices, col_indices))) +``` +#### In CSR format +``` +from scipy import sparse +import numpy as np + +data = np.array([[0, 0], [0, 1], [2, 0]]) +sparse_matrix = sparse.csr_matrix(data) +``` +### 7. Image Processing +#### It is used to process the images, like changing dimensions or properties. For example, when you're doing a project on medical imaging, this library is mainly used. +``` +from scipy import ndimage +import matplotlib.pyplot as plt + +image = plt.imread('path/to/image.jpg') +plt.imshow(image) +plt.show() + +# Apply Gaussian blur to the image +blurred_image = ndimage.gaussian_filter(image, sigma=1) +plt.imshow(blurred_image) +plt.show() +``` +#### The gaussian blur is one of the properties of the ' ndimage ' package in SciPy libraries, it used for better understanding of the image. From 2632f7c8a1a542b98616668311e24d344ca79736 Mon Sep 17 00:00:00 2001 From: Niyonika Gaur <83643952+niyonikagaur@users.noreply.github.com> Date: Fri, 17 May 2024 23:59:48 +0530 Subject: [PATCH 051/405] Update index.md --- contrib/scipy/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/scipy/index.md b/contrib/scipy/index.md index 3ff5a7d..abc2fb0 100644 --- a/contrib/scipy/index.md +++ b/contrib/scipy/index.md @@ -1,4 +1,4 @@ # List of sections -- [Installation of Scipy and its key uses](pandas_series_vs_numpy_ndarray.md) +- [Installation of Scipy and its key uses]( Installation_of_Scipy_&_its_key_uses.md) From 6574b726fecffba739e6fc4d01776944b76333f7 Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Sat, 18 May 2024 12:44:43 +0530 Subject: [PATCH 052/405] 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 2f27fd5..40a2237 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,4 @@ # List of sections - [Confusion Matrix](confusion-matrix.md) +- [Support Vector Machine Algorithm](support-vector-machine.md) From 72909dc3abda33ad617b81007e9f1da69a15f5ba Mon Sep 17 00:00:00 2001 From: Yatharth Date: Sat, 18 May 2024 13:18:25 +0530 Subject: [PATCH 053/405] JSON MDODULE load loads dump dumps update and append --- contrib/advanced-python/index.md | 1 + contrib/advanced-python/json-module.md | 294 +++++++++++++++++++++++++ 2 files changed, 295 insertions(+) create mode 100644 contrib/advanced-python/json-module.md diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 5ea5081..8f4f26a 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,3 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) +- [JSON module](json-module.md) diff --git a/contrib/advanced-python/json-module.md b/contrib/advanced-python/json-module.md new file mode 100644 index 0000000..20a9408 --- /dev/null +++ b/contrib/advanced-python/json-module.md @@ -0,0 +1,294 @@ +# JSON Module + +## What is JSON? + +- JSON (JavaScript Object Notation) is a format for structuring data. +- JSON is a lightweight, text-based data interchange format that is completely language-independent. +- Similar to XML, JSON is a format for structuring data commonly used by web applications to communicate with each other. + +## Why JSON? + +- Whenever we declare a variable and assign a value to it, the variable itself doesn't hold the value. Instead, the variable holds an address in memory where the value is stored. For example: + +```python +age = 21 +``` + +- When we use `age`, it gets replaced with `21`. However, age doesn't contain 21, it contains the address of the memory location where 21 is stored. + +- While this works locally, transferring this data, such as through an API, poses a challenge. Sending your computer’s entire memory with the addresses is impractical and insecure. This is where JSON comes to the rescue. + +### Example JSON + +- JSON supports most widely used data types including String + , Number, Boolean, Null, Array and Object. +- Here is an example of JSON file + +```json +{ + "name": "John Doe", + "age": 21, + "isStudent": true, + "address": null, + "courses": ["Math", "Science", "History"], + "grades": { + "Math": 95, + "Science": 89, + "History": 76 + } +} +``` + +# Python JSON + +Python too supports JSON with a built-in package called `json`. This package provides all the necessary tools for working with JSON Objects including `parsing, serializing, deserializing, and many more`. + +## 1. Python parse JSON string. + +- To parse JSON string Python firstly we import the JSON module. +- JSON string is converted to a Python object using `json.loads()` method of JSON module in Python. +- Example Code: + +```python +# Python program to convert JSON to Python +import json + +# JSON string +students ='{"id":"01", "name": "Yatharth", "department":"Computer Science Engineering"}' + +# Convert string to Python dict +students_dict = json.loads(students) +print(students_dict) + +print(students_dict['name']) + +``` + +- Ouput: + +```json +{'id': '01', 'name': 'Yatharth', 'department': 'Computer Science Engineering'} +Yatharth +``` + +## 2. Python load JSON file. + +- JSON data can also be directly fetch from a json file +- Example: + +```python +import json +# Opening JSON file +f = open('input.json',) + +# Returns JSON object as a dictionary +data = json.load(f) + +# Iterating through the json file +for i in data['students']: + print(i) + +# Closing file +f.close() +``` + +- JSON file + +```json +{ + "students":{ + { + "id": "01", + "name": "Yatharth", + "department": "Computer Science Engineering" + }, + { + "id": "02", + "name": "Raj", + "department": "Mechanical Engineering" + } + } +} +``` + +- Ouput + +```json +{'id': '01', 'name': 'Yatharth', 'department': 'Computer Science Engineering'} +{'id': '02', 'name': 'Raj', 'department': 'Mechanical Engineering'} +``` +- `json.load()`: Reads JSON data from a file object and deserializes it into a Python object. +- `json.loads()`: Deserializes JSON data from a string into a Python object. +
+ +### Addtiotnal Context +Relation between python data types and json data types is given in table below. +
+ +| Python Object | JSON Object | +|-----------------|-------------| +| Dict | object | +| list, tuple | array | +| str | string | +| int, long, float | numbers | +| True | true | +| False | false | +| None | null | + + + +## 3. Python Dictionary to JSON String +- Parsing python dictionary to json string using `json.dumps()`. +- Example Code: +```python +import json + +# Data to be written +dictionary ={ + "id": "03", + "name": "Suraj", + "department": "Civil Engineering" +} + +# Serializing json +json_object = json.dumps(dictionary, indent = 4) +print(json_object) +``` +- Output: +``` json +{ + "department": "Civil Engineering", + "id": "02", + "name": "Suraj" +} +``` +## 4. Python Dictionary to JSON file. +- - Parsing python dictionary to json string using `json.dump()`. +- Example Code: +``` python +import json + +# Data to be written +dictionary ={ + "name" : "Satyendra", + "rollno" : 51, + "cgpa" : 8.8, + "phonenumber" : "123456789" +} + +with open("sample.json", "w") as outfile: + json.dump(dictionary, outfile) + +``` +- Ouput: `sample.json` +``` json +{ + "name" : "Satyendra", + "rollno" : 51, + "cgpa" : 8.8, + "phonenumber" : "123456789" +} + +``` +## 5. Append Python Dictionary to JSON String. +- Append to an already existing string using `json.update()`. +- Example : +```python +import json +# JSON data: +x = { + "id": "03", + "name": "Suraj" +} + +# python object to be appended +y = { "department": "Civil Engineering"} + +# parsing JSON string: +z = json.loads(x) + +# appending the data +z.update(y) + +# the result is a JSON string: +print(json.dumps(z)) + +``` +- Ouput: +```json +{"id": "03", "name": "Suraj", "department": "Civil Engineering"} +``` + + +## 6. Append Python Dictionary to JSON File. +- There is no direct function to append in file. So, we will load file in a dictionary, update dictionary then update content and convert back to json file format. +- `data.json` +``` json +{ + "students":{ + { + "id": "01", + "name": "Yatharth", + "department": "Computer Science Engineering" + }, + { + "id": "02", + "name": "Raj", + "department": "Mechanical Engineering" + } + } +} +``` +- Example Code: +``` python +import json + +# function to add to JSON +def write_json(new_data, filename='data.json'): + with open(filename,'r+') as file: + # First we load existing data into a dict. + file_data = json.load(file) + # Join new_data with file_data inside students + file_data["students"].append(new_data) + # Sets file's current position at offset. + file.seek(0) + # convert back to json. + json.dump(file_data, file, indent = 4) + +# python object to be appended +y = { + "id": "03", + "name": "Suraj", + "department": "Civil Engineering" +} + +write_json(y) + +``` +- Output: +```json +{ + "students":{ + { + "id": "01", + "name": "Yatharth", + "department": "Computer Science Engineering" + }, + { + "id": "02", + "name": "Raj", + "department": "Mechanical Engineering" + }, + { + "id": "03", + "name": "Suraj", + "department": "Civil Engineering" + } + } +} +``` + +
+
+ +The Python json module simplifies the handling of JSON data, offering a bridge between Python data structures and JSON representations, vital for data exchange and storage in modern applications. \ No newline at end of file From a478e70c4bea7637ba6795ab1cf81c7d00d5ca2a Mon Sep 17 00:00:00 2001 From: Anushka Mokashi Date: Sat, 18 May 2024 14:10:53 +0530 Subject: [PATCH 054/405] Descriptive Statistics with Python and Pandas --- contrib/pandas/Descriptive_Statistics.md | 599 +++++++++++++++++++++++ contrib/pandas/index.md | 1 + 2 files changed, 600 insertions(+) create mode 100644 contrib/pandas/Descriptive_Statistics.md diff --git a/contrib/pandas/Descriptive_Statistics.md b/contrib/pandas/Descriptive_Statistics.md new file mode 100644 index 0000000..7775965 --- /dev/null +++ b/contrib/pandas/Descriptive_Statistics.md @@ -0,0 +1,599 @@ +## Descriptive Statistics + +In the realm of data science, understanding the characteristics of data is fundamental. Descriptive statistics provide the tools and techniques to succinctly summarize and present the key features of a dataset. It serves as the cornerstone for exploring, visualizing, and ultimately gaining insights from data. + +Descriptive statistics encompasses a range of methods designed to describe the central tendency, dispersion, and shape of a dataset. Through measures such as mean, median, mode, standard deviation, and variance, descriptive statistics offer a comprehensive snapshot of the data's distribution and variability. + +Data scientists utilize descriptive statistics to uncover patterns, identify outliers, and assess the overall structure of data before delving into more advanced analyses. By summarizing large and complex datasets into manageable and interpretable summaries, descriptive statistics facilitate informed decision-making and actionable insights. + + +```python +import pandas as pd +import numpy as np +``` + + +```python +df = pd.read_csv("Age-Income-Dataset.csv") +df +``` +| | Age | Income | +| --- | ----------- | ------ | +| 0 | Young | 25000 | +| 1 | Middle Age | 54000 | +| 2 | Old | 60000 | +| 3 | Young | 15000 | +| 4 | Young | 45000 | +| 5 | Young | 65000 | +| 6 | Young | 70000 | +| 7 | Young | 30000 | +| 8 | Middle Age | 27000 | +| 9 | Young | 23000 | +| 10 | Young | 48000 | +| 11 | Old | 52000 | +| 12 | Young | 33000 | +| 13 | Old | 80000 | +| 14 | Old | 75000 | +| 15 | Old | 35000 | +| 16 | Middle Age | 29000 | +| 17 | Middle Age | 57000 | +| 18 | Old | 43000 | +| 19 | Middle Age | 56000 | +| 20 | Old | 63000 | +| 21 | Old | 32000 | +| 22 | Old | 45000 | +| 23 | Old | 89000 | +| 24 | Middle Age | 90000 | +| 25 | Middle Age | 93000 | +| 26 | Young | 80000 | +| 27 | Young | 87000 | +| 28 | Young | 38000 | +| 29 | Young | 23000 | +| 30 | Middle Age | 38900 | +| 31 | Middle Age | 53200 | +| 32 | Old | 43800 | +| 33 | Middle Age | 25600 | +| 34 | Middle Age | 65400 | +| 35 | Old | 76800 | +| 36 | Old | 89700 | +| 37 | Old | 41800 | +| 38 | Young | 31900 | +| 39 | Old | 25600 | +| 40 | Middle Age | 45700 | +| 41 | Old | 35600 | +| 42 | Young | 54300 | +| 43 | Middle Age | 65400 | +| 44 | Old | 67800 | +| 45 | Old | 24500 | +| 46 | Middle Age | 34900 | +| 47 | Old | 45300 | +| 48 | Young | 68400 | +| 49 | Middle Age | 51700 | + + + +```python +df.describe() +``` + + + +| | Income | +|-------|-------------| +| count | 50.000000 | +| mean | 50966.000000 | +| std | 21096.683268 | +| min | 15000.000000 | +| 25% | 33475.000000 | +| 50% | 46850.000000 | +| 75% | 65400.000000 | +| max | 93000.000000 | + + +### Mean + +The mean, also known as the average, is a measure of central tendency in a dataset. It represents the typical value of a set of numbers. The formula to calculate the mean of a dataset is: + +$$ \overline{x} = \frac{\sum\limits_{i=1}^{n} x_i}{n} $$ + +* $\overline{x}$ (pronounced "x bar") represents the mean value. +* $x_i$ represents the individual value in the dataset (where i goes from 1 to n). +* $\sum$ (sigma) represents the summation symbol, indicating we add up all the values from i=1 to n. +* $n$ represents the total number of values in the dataset. + + + +```python +df['Income'].mean() +``` + + + + +50966.0 + + + + +```python +def mean_f(df): + for col in df.columns: + if df[col].dtype != 'O': + temp = 0 + for i in df[col]: + temp = temp +i + print("Without pandas Library -> ") + print("Average of {} is {}".format(col,(temp/len(df[col])))) + print() + print("With pandas Library -> ") + print(df[col].mean()) + +mean_f(df) +``` + +Without pandas Library -> +Average of Income is 50966.0 + +With pandas Library -> +50966.0 + + +### Median + + +The median is another measure of central tendency in a dataset. Unlike the mean, which is the average value of all data points, the median represents the middle value when the dataset is ordered from smallest to largest. If the dataset has an odd number of observations, the median is the middle value. If the dataset has an even number of observations, the median is the average of the two middle values. + +The median represents the "middle" value in a dataset. There are two cases to consider depending on whether the number of observations (n) is odd or even: + +**Odd number of observations (n):** + +In this case, the median (M) is the value located at the middle position when the data is ordered from least to greatest. We can calculate the position using the following formula: + +$$ M = x_{n+1/2} $$ + +**Even number of observations (n):** + +When we have an even number of observations, there isn't a single "middle" value. Instead, the median is the average of the two middle values after ordering the data. Here's the formula to find the median: + +$$ M = \frac{x_{n/2} + x_{(n/2)+1}}{2} $$ + +**Explanation:** + +* M represents the median value. +* n represents the total number of observations in the dataset. +* $x$ represents the individual value. + + + + + +```python +df['Income'].median() +``` + + + + +46850.0 + + + + +```python +def median_f(df): + for col in df.columns: + if df[col].dtype != 'O': + sorted_data = sorted(df[col]) + n = len(df[col]) + if n%2 == 0: + x1 =sorted_data[int((n/2))] + x2 =sorted_data[int((n/2))+1] + median=(x1+x2)/2 + else: + median = sorted_data[(n+1)/2] + print("Median without library ->") + print("Median of {} is {} ".format(col,median)) + print("Median with library ->") + print(df[col].median()) +median_f(df) +``` + +Median without library -> +Median of Income is 49850.0 \ +Median with library -> +46850.0 + + +### Mode + + +The mode is a measure of central tendency that represents the value or values that occur most frequently in a dataset. Unlike the mean and median, which focus on the average or middle value, the mode identifies the most common value(s) in the dataset. + + +```python +def mode_f(df): + for col in df.columns: + if df[col].dtype == 'O': + print("Column:", col) + arr = df[col].sort_values() + + prevcnt = 0 + cnt = 0 + ans = arr[0] + temp = arr[0] + + for i in arr: + if(temp == i) : + cnt += 1 + else: + prevcnt = cnt + cnt = 1 + temp = i + if(cnt > prevcnt): + ans = i + + print("Without pandas Library -> ") + print("Mode of {} is {}".format(col,ans)) + print() + print("With pandas Library -> ") + print(df[col].mode()) +mode_f(df) +``` + +Column: Age +Without pandas Library -> \ +Mode of Age is Old + +With pandas Library -> \ +0 Old \ +Name: Age, dtype: object + + + + + +### Standard Deviation + +Standard deviation is a measure of the dispersion or spread of a dataset. It quantifies the amount of variation or dispersion of a set of values from the mean. In other words, it indicates how much individual values in a dataset deviate from the mean. + +$$s = \sqrt{\frac{\sum(x_i-\overline{x})^{2}}{n-1}}$$ + +* $s$ represents the standard deviation. +* $\sum$ (sigma) represents the summation symbol, indicating we add up the values for all data points. +* $x_i$ represents the individual value in the dataset. +* $\overline{x}$ (x bar) represents the mean value of the dataset. +* $n$ represents the total number of values in the dataset. + + +```python +df['Income'].std() +``` + + + + +21096.683267707253 + + + + +```python +import math +def std_f(df): + for col in df.columns: + if len(df[col]) == 0: + print("Column is empty") + if df[col].dtype != 'O': + sum = 0 + mean = df[col].mean() + for i in df[col]: + sum = sum + (i - mean)**2 + + std = math.sqrt(sum/len(df[col])) + print("Without pandas library ->") + print("Std : " , std) + print("With pandas library: ->") + print("Std : {}".format(np.std(df[col]))) ##ddof = 1 + +std_f(df) +``` + +Without pandas library -> +Std : 20884.6509187968 \ +With pandas library: -> +Std : 20884.6509187968 + + + +```python +df['Income'].count() +``` + + + + +50 + + + +### Minimum + + +```python +df['Income'].min() +``` + + + + +15000 + + + + +```python +def min_f(df): + for col in df.columns: + if df[col].dtype != "O": + sorted_data = sorted(df[col]) + min = sorted_data[0] + print("Without pandas Library->",min) + print("With pandas Library->",df[col].min()) + +min_f(df) +``` + +Without pandas Library-> 15000 \ +With pandas Library-> 15000 + + +### Maximum + + +```python +df['Income'].max() +``` + + + + +93000 + + + + +```python +def max_f(df): + for col in df.columns: + if df[col].dtype != "O": + sorted_data = sorted(df[col]) + max = sorted_data[len(df[col])-1] + print("Without pandas Library->",max) + print("With pandas Library->",df[col].max()) + +max_f(df) +``` + + Without pandas Library-> 93000 + With pandas Library-> 93000 + + +### Percentile + + +```python +df['Income'].quantile(0.25) +``` + + + + +33475.0 + + + + +```python +df['Income'].quantile(0.75) +``` + + + + +65400.0 + + + + +```python +def percentile_f(df,percentile): + for col in df.columns: + if df[col].dtype != 'O': + sorted_data = sorted(df[col]) + index = int(percentile*len(df[col])) + percentile_result = sorted_data[index] + print(f"{percentile} Percentile is : ",percentile_result) + +percentile_f(df,0.25) +``` + +0.25 Percentile is : 33000 + + +We have used the method of nearest rank to calculate percentile manually. + +Pandas uses linear interpolation of data to calculate percentiles. + +## Correlation and Covariance + + +```python +df = pd.read_csv('Iris.csv') +df.head(5) +``` + + + + +| | Id | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | +|---|----|---------------|--------------|---------------|--------------|-------------| +| 0 | 1 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | +| 1 | 2 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa | +| 2 | 3 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa | +| 3 | 4 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa | +| 4 | 5 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa | + + + + +```python +df.drop(['Id','Species'],axis=1,inplace= True) +``` + +### Covarience + +Covariance measures the degree to which two variables change together. If the covariance between two variables is positive, it means that they tend to increase or decrease together. If the covariance is negative, it means that as one variable increases, the other tends to decrease. However, covariance does not provide a standardized measure, making it difficult to interpret the strength of the relationship between variables, especially if the variables are measured in different units. + +$$ COV(X,Y) = \frac{\sum\limits_{i=1}^{n} (X_i - \overline{X}) (Y_i - \overline{Y})}{n - 1}$$ + +**Explanation:** + +* $COV(X, Y)$ represents the covariance between variables X and Y. +* $X_i$ and $Y_i$ represent the individual values for variables X and Y in the i-th observation. +* $\overline{X}$ and $\overline{Y}$ represent the mean values for variables X and Y, respectively. +* $n$ represents the total number of observations in the dataset. + + + +```python +df.cov() +``` + + +| | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | +|-------------------|-------------- |---------------|-----------------|--------------| +| **SepalLengthCm** | 0.685694 | -0.039268 | 1.273682 | 0.516904 | +| **SepalWidthCm** | -0.039268 | 0.188004 | -0.321713 | -0.117981 | +| **PetalLengthCm** | 1.273682 | -0.321713 | 3.113179 | 1.296387 | +| **PetalWidthCm** | 0.516904 | -0.117981 | 1.296387 | 0.582414 | + + + +```python +def cov_f(df): + for x in df.columns: + for y in df.columns: + mean_x = df[x].mean() + mean_y = df[y].mean() + + sum = 0 + n = len(df[x]) + + for val in range(n): + sum += (df[x].iloc[val] - mean_x)*(df[y].iloc[val] - mean_y) + print("Covariance of {} and {} is : {}".format(x,y, sum/(n-1))) + print() +cov_f(df) +``` + +Covariance of SepalLengthCm and SepalLengthCm is : 0.6856935123042504 \ +Covariance of SepalLengthCm and SepalWidthCm is : -0.03926845637583892 \ +Covariance of SepalLengthCm and PetalLengthCm is : 1.2736823266219246 \ +Covariance of SepalLengthCm and PetalWidthCm is : 0.5169038031319911 + +Covariance of SepalWidthCm and SepalLengthCm is : -0.03926845637583892 \ +Covariance of SepalWidthCm and SepalWidthCm is : 0.1880040268456377 \ +Covariance of SepalWidthCm and PetalLengthCm is : -0.32171275167785235 \ +Covariance of SepalWidthCm and PetalWidthCm is : -0.11798120805369115 + +Covariance of PetalLengthCm and SepalLengthCm is : 1.2736823266219246 \ +Covariance of PetalLengthCm and SepalWidthCm is : -0.32171275167785235 \ +Covariance of PetalLengthCm and PetalLengthCm is : 3.113179418344519 \ +Covariance of PetalLengthCm and PetalWidthCm is : 1.2963874720357946 + +Covariance of PetalWidthCm and SepalLengthCm is : 0.5169038031319911 \ +Covariance of PetalWidthCm and SepalWidthCm is : -0.11798120805369115 \ +Covariance of PetalWidthCm and PetalLengthCm is : 1.2963874720357946 \ +Covariance of PetalWidthCm and PetalWidthCm is : 0.5824143176733781 + + + +### Correlation + +Correlation, on the other hand, standardizes the measure of relationship between two variables, making it easier to interpret. It measures both the strength and direction of the linear relationship between two variables. Correlation values range between -1 and 1, where: + +$$r = \frac{n(\sum xy) - (\sum x)(\sum y)}{\sqrt{n(\sum x^2) - (\sum x)^2} \cdot \sqrt{n(\sum y^2) - (\sum y)^2}}$$ + +* r represents the correlation coefficient. +* n is the number of data points. + + + + +```python +df.corr() +``` + +| | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | +|-------------------|---------------|--------------|---------------|--------------| +| **SepalLengthCm** | 1.000000 | -0.109369 | 0.871754 | 0.817954 | +| **SepalWidthCm** | -0.109369 | 1.000000 | -0.420516 | -0.356544 | +| **PetalLengthCm** | 0.871754 | -0.420516 | 1.000000 | 0.962757 | +| **PetalWidthCm** | 0.817954 | -0.356544 | 0.962757 | 1.000000 | + + +```python +import math +def corr_f(df): + for i in df.columns: + for j in df.columns: + n = len(df[i]) + + sumX = 0 + for x in df[i]: + sumX += x + sumY = 0 + for y in df[j]: + sumY += y + + sumXY = 0 + for xy in range(n): + sumXY += (df[i].iloc[xy] * df[j].iloc[xy]) + + sumX2 = 0 + for x in df[i]: + sumX2 += (x**2) + sumY2 = 0 + for y in df[j]: + sumY2 += (y**2) + + NR = (n * sumXY) - (sumX*sumY) + DR = math.sqrt( ( (n * sumX2) - (sumX**2))*( (n * sumY2) - (sumY ** 2) ) ) + + print("Correlation of {} and {} :{}".format(i,j,NR/DR)) + print() + +corr_f(df) +``` + +Correlation of SepalLengthCm and SepalLengthCm :1.0 \ +Correlation of SepalLengthCm and SepalWidthCm :-0.10936924995067286 \ +Correlation of SepalLengthCm and PetalLengthCm :0.8717541573048861 \ +Correlation of SepalLengthCm and PetalWidthCm :0.8179536333691775 + +Correlation of SepalWidthCm and SepalLengthCm :-0.10936924995067286 \ +Correlation of SepalWidthCm and SepalWidthCm :1.0 \ +Correlation of SepalWidthCm and PetalLengthCm :-0.42051609640118826 \ +Correlation of SepalWidthCm and PetalWidthCm :-0.3565440896138223 + +Correlation of PetalLengthCm and SepalLengthCm :0.8717541573048861 \ +Correlation of PetalLengthCm and SepalWidthCm :-0.42051609640118826 \ +Correlation of PetalLengthCm and PetalLengthCm :1.0 \ +Correlation of PetalLengthCm and PetalWidthCm :0.9627570970509656 + +Correlation of PetalWidthCm and SepalLengthCm :0.8179536333691775 \ +Correlation of PetalWidthCm and SepalWidthCm :-0.3565440896138223 \ +Correlation of PetalWidthCm and PetalLengthCm :0.9627570970509656 \ +Correlation of PetalWidthCm and PetalWidthCm :1.0 + + diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 5c0f2b4..ae90788 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,3 +1,4 @@ # List of sections - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) +- [Pandas Descriptive Statistics](Descriptive_Statistics.md) From f322f740d2ed2fbb669733b07e6dfc939acb53a9 Mon Sep 17 00:00:00 2001 From: AmrutaJayanti <142327526+AmrutaJayanti@users.noreply.github.com> Date: Sat, 18 May 2024 18:24:03 +0530 Subject: [PATCH 055/405] Update index.md --- contrib/advanced-python/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 5ea5081..6fe4a9f 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,3 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) +- [OOPs](OOPs.md) From 95c272e87edbdbce3593360d36bd1deae6e54432 Mon Sep 17 00:00:00 2001 From: AmrutaJayanti <142327526+AmrutaJayanti@users.noreply.github.com> Date: Sat, 18 May 2024 18:24:30 +0530 Subject: [PATCH 056/405] Added OOPs --- contrib/advanced-python/OOPs.md | 470 ++++++++++++++++++++++++++++++++ 1 file changed, 470 insertions(+) create mode 100644 contrib/advanced-python/OOPs.md diff --git a/contrib/advanced-python/OOPs.md b/contrib/advanced-python/OOPs.md new file mode 100644 index 0000000..7e355f2 --- /dev/null +++ b/contrib/advanced-python/OOPs.md @@ -0,0 +1,470 @@ +--- +jupyter: + colab: + kernelspec: + display_name: Python 3 + name: python3 + language_info: + name: python + nbformat: 4 + nbformat_minor: 0 +--- + +::: {.cell .markdown id="WpcHLEIgeEdz"} +**PYTHON OOP CONCEPTS** +::: + +::: {.cell .markdown id="3j1W5YpNeEmS"} +In Python object-oriented Programming (OOPs) is a programming paradigm +that uses objects and classes in programming. It aims to implement +real-world entities like inheritance, polymorphisms, encapsulation, etc. +in the programming. The main concept of object-oriented Programming +(OOPs) or oops concepts in Python is to bind the data and the functions +that work together as a single unit so that no other part of the code +can access this data. + +**OOPs Concepts in Python** + +1. Class in Python + +2. Objects in Python + +3. Polymorphism in Python + +4. Encapsulation in Python + +5. Inheritance in Python + +6. Data Abstraction in Python + ::: + +::: {.cell .markdown id="3KQXMPlVeEyT"} +Python Class A class is a collection of objects. A class contains the +blueprints or the prototype from which the objects are being created. It +is a logical entity that contains some attributes and methods. +::: + +::: {.cell .code execution_count="2" id="6CdZhHSMerae"} + +```python +#Simple Class in Python +class Dog: + pass +``` + +::: + +::: {.cell .markdown id="y5t7jyHAfAHl"} +**Python Objects** In object oriented programming Python, The object is +an entity that has a state and behavior associated with it. It may be +any real-world object like a mouse, keyboard, chair, table, pen, etc. +Integers, strings, floating-point numbers, even arrays, and +dictionaries, are all objects. +::: + +::: {.cell .code execution_count="3" id="u8Y0G-hse-lm"} + +```python +obj = Dog() +``` + +::: + +::: {.cell .markdown id="\_FtRAPlNfLkb"} +**The Python **init** Method ** + +The **init** method is similar to constructors in C++ and Java. It is +run as soon as an object of a class is instantiated. The method is +useful to do any initialization you want to do with your object. +::: + +::: {.cell .code execution_count="4" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="aMmXUxLHfSz6" outputId="ed23bfbd-445a-4d02-ebba-c210471e0af2"} + +```python +class Dog: + + # class attribute + attr1 = "mammal" + + # Instance attribute + def __init__(self, name): + self.name = name + +# Object instantiation +Rodger = Dog("Rodger") +Tommy = Dog("Tommy") + +# Accessing class attributes +print("Rodger is a {}".format(Rodger.__class__.attr1)) +print("Tommy is also a {}".format(Tommy.__class__.attr1)) + +# Accessing instance attributes +print("My name is {}".format(Rodger.name)) +print("My name is {}".format(Tommy.name)) +``` + +::: {.output .stream .stdout} +Rodger is a mammal +Tommy is also a mammal +My name is Rodger +My name is Tommy +::: +::: + +::: {.cell .markdown id="YFMnh417fZI6"} +**Inheritance** + +In Python object oriented Programming, Inheritance is the capability of +one class to derive or inherit the properties from another class. The +class that derives properties is called the derived class or child class +and the class from which the properties are being derived is called the +base class or parent class. + +Types of Inheritances: + +- Single Inheritance + +- Multilevel Inheritance + +- Multiple Inheritance + +- Hierarchial Inheritance + ::: + +::: {.cell .code execution_count="6" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="PeQoseXogE2f" outputId="9b3a069e-c6f0-41b0-b5f3-704aa0f95160"} + +```python +#Single Inheritance +# Parent class +class Animal: + def __init__(self, name, sound): + self.name = name + self.sound = sound + + def make_sound(self): + print(f"{self.name} says {self.sound}") + +# Child class inheriting from Animal +class Dog(Animal): + def __init__(self, name): + # Call the constructor of the parent class + super().__init__(name, "Woof") + +# Child class inheriting from Animal +class Cat(Animal): + def __init__(self, name): + # Call the constructor of the parent class + super().__init__(name, "Meow") + +# Creating objects of the derived classes +dog = Dog("Buddy") +cat = Cat("Whiskers") + +# Accessing methods of the parent class +dog.make_sound() +cat.make_sound() +``` + +::: {.output .stream .stdout} +Buddy says Woof +Whiskers says Meow +::: +::: + +::: {.cell .code execution_count="7" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="CKEMq39BgSu9" outputId="b252ac43-6116-4a88-9ac9-0475f54e63c0"} + +```python +#Multilevel Inheritance +# Parent class +class Animal: + def __init__(self, name): + self.name = name + + def speak(self): + print(f"{self.name} speaks") + +# Child class inheriting from Animal +class Dog(Animal): + def bark(self): + print(f"{self.name} barks") + +# Grandchild class inheriting from Dog +class GermanShepherd(Dog): + def guard(self): + print(f"{self.name} guards") + +# Creating objects of the derived classes +german_shepherd = GermanShepherd("Rocky") + +# Accessing methods from all levels of inheritance +german_shepherd.speak() # Accessing method from the Animal class +german_shepherd.bark() # Accessing method from the Dog class +german_shepherd.guard() # Accessing method from the GermanShepherd class +``` + +::: {.output .stream .stdout} +Rocky speaks +Rocky barks +Rocky guards +::: +::: + +::: {.cell .code execution_count="8" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="wZ5qxZXBgdQ6" outputId="cd1c9d75-790c-49b3-8040-3334b896d779"} + +```python +#Hierarchial Inheritance +# Parent class +class Animal: + def __init__(self, name): + self.name = name + + def speak(self): + print(f"{self.name} speaks") + +# Child class 1 inheriting from Animal +class Dog(Animal): + def bark(self): + print(f"{self.name} barks") + +# Child class 2 inheriting from Animal +class Cat(Animal): + def meow(self): + print(f"{self.name} meows") + +# Creating objects of the derived classes +dog = Dog("Buddy") +cat = Cat("Whiskers") + +# Accessing methods from the parent and child classes +dog.speak() # Accessing method from the Animal class +dog.bark() # Accessing method from the Dog class +cat.speak() # Accessing method from the Animal class +cat.meow() # Accessing method from the Cat class +``` + +::: {.output .stream .stdout} +Buddy speaks +Buddy barks +Whiskers speaks +Whiskers meows +::: +::: + +::: {.cell .code execution_count="9" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="8nPMri12glO5" outputId="a3c93e8c-f10f-4cd7-c402-3500342c9e28"} + +```python +#Multiple Inheritance +# Parent class 1 +class Herbivore: + def eat_plants(self): + print("Eating plants") + +# Parent class 2 +class Carnivore: + def eat_meat(self): + print("Eating meat") + +# Child class inheriting from both Herbivore and Carnivore +class Omnivore(Herbivore, Carnivore): + def eat(self): + print("Eating everything") + +# Creating an object of the Omnivore class +omnivore = Omnivore() + +# Accessing methods from both parent classes +omnivore.eat_plants() # Accessing method from Herbivore +omnivore.eat_meat() # Accessing method from Carnivore +omnivore.eat() # Accessing method from Omnivore +``` + +::: {.output .stream .stdout} +Eating plants +Eating meat +Eating everything +::: +::: + +::: {.cell .markdown id="KSw-WMePgvCa"} +**Polymorphism** In object oriented Programming Python, Polymorphism +simply means having many forms +::: + +::: {.cell .code execution_count="10" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="cIYtM2_Pg8Ja" outputId="e887848d-060a-4317-a805-cfb0ca4e187f"} + +```python +class Bird: + + def intro(self): + print("There are many types of birds.") + + def flight(self): + print("Most of the birds can fly but some cannot.") + +class sparrow(Bird): + + def flight(self): + print("Sparrows can fly.") + +class ostrich(Bird): + + def flight(self): + print("Ostriches cannot fly.") + +obj_bird = Bird() +obj_spr = sparrow() +obj_ost = ostrich() + +obj_bird.intro() +obj_bird.flight() + +obj_spr.intro() +obj_spr.flight() + +obj_ost.intro() +obj_ost.flight() +``` + +::: {.output .stream .stdout} +There are many types of birds. +Most of the birds can fly but some cannot. +There are many types of birds. +Sparrows can fly. +There are many types of birds. +Ostriches cannot fly. +::: +::: + +::: {.cell .markdown id="NzsPIifmg-FI"} +**Python Encapsulation** + +In Python object oriented programming, Encapsulation is one of the +fundamental concepts in object-oriented programming (OOP). It describes +the idea of wrapping data and the methods that work on data within one +unit. This puts restrictions on accessing variables and methods directly +and can prevent the accidental modification of data. To prevent +accidental change, an object's variable can only be changed by an +object's method. Those types of variables are known as private +variables. +::: + +::: {.cell .code execution_count="11" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="etbhALMHhGb9" outputId="75f27d20-7cee-4c85-b722-b9beb5ffe2b8"} + +```python +class Car: + def __init__(self, make, model, year): + self._make = make # Encapsulated attribute with single underscore + self._model = model # Encapsulated attribute with single underscore + self._year = year # Encapsulated attribute with single underscore + self._odometer_reading = 0 # Encapsulated attribute with single underscore + + def get_make(self): + return self._make + + def get_model(self): + return self._model + + def get_year(self): + return self._year + + def get_odometer_reading(self): + return self._odometer_reading + + def update_odometer(self, mileage): + if mileage >= self._odometer_reading: + self._odometer_reading = mileage + else: + print("You can't roll back an odometer!") + + def increment_odometer(self, miles): + self._odometer_reading += miles + +# Creating an instance of the Car class +my_car = Car("Toyota", "Camry", 2021) + +# Accessing encapsulated attributes through methods +print("Make:", my_car.get_make()) +print("Model:", my_car.get_model()) +print("Year:", my_car.get_year()) + +# Modifying encapsulated attribute through method +my_car.update_odometer(100) +print("Odometer Reading:", my_car.get_odometer_reading()) + +# Incrementing odometer reading +my_car.increment_odometer(50) +print("Odometer Reading after increment:", my_car.get_odometer_reading()) +``` + +::: {.output .stream .stdout} +Make: Toyota +Model: Camry +Year: 2021 +Odometer Reading: 100 +Odometer Reading after increment: 150 +::: +::: + +::: {.cell .markdown id="hJkQ9Tn5hUEV"} +**Data Abstraction** It hides unnecessary code details from the user. +Also, when we do not want to give out sensitive parts of our code +implementation and this is where data abstraction came. +::: + +::: {.cell .code execution_count="12" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="FoMRMWEEhc-Z" outputId="3a77fd0d-8116-4997-c35f-dfebfc786b72"} + +```python +from abc import ABC, abstractmethod + +# Abstract class defining the interface for a Shape +class Shape(ABC): + def __init__(self, name): + self.name = name + + @abstractmethod + def area(self): + pass + + @abstractmethod + def perimeter(self): + pass + +# Concrete class implementing the Shape interface for a Rectangle +class Rectangle(Shape): + def __init__(self, name, length, width): + super().__init__(name) + self.length = length + self.width = width + + def area(self): + return self.length * self.width + + def perimeter(self): + return 2 * (self.length + self.width) + +# Concrete class implementing the Shape interface for a Circle +class Circle(Shape): + def __init__(self, name, radius): + super().__init__(name) + self.radius = radius + + def area(self): + return 3.14 * self.radius * self.radius + + def perimeter(self): + return 2 * 3.14 * self.radius + +# Creating objects of the derived classes +rectangle = Rectangle("Rectangle", 5, 4) +circle = Circle("Circle", 3) + +# Accessing methods defined by the Shape interface +print(f"{rectangle.name}: Area = {rectangle.area()}, Perimeter = {rectangle.perimeter()}") +print(f"{circle.name}: Area = {circle.area()}, Perimeter = {circle.perimeter()}") +``` + +::: {.output .stream .stdout} +Rectangle: Area = 20, Perimeter = 18 +Circle: Area = 28.259999999999998, Perimeter = 18.84 +::: +::: From dd8db2ea7cca92d35f0398c82b8f021e3ed6ae2c Mon Sep 17 00:00:00 2001 From: AmrutaJayanti <142327526+AmrutaJayanti@users.noreply.github.com> Date: Sat, 18 May 2024 18:27:49 +0530 Subject: [PATCH 057/405] Update OOPs.md --- contrib/advanced-python/OOPs.md | 107 +++----------------------------- 1 file changed, 7 insertions(+), 100 deletions(-) diff --git a/contrib/advanced-python/OOPs.md b/contrib/advanced-python/OOPs.md index 7e355f2..d6d1256 100644 --- a/contrib/advanced-python/OOPs.md +++ b/contrib/advanced-python/OOPs.md @@ -1,20 +1,4 @@ ---- -jupyter: - colab: - kernelspec: - display_name: Python 3 - name: python3 - language_info: - name: python - nbformat: 4 - nbformat_minor: 0 ---- -::: {.cell .markdown id="WpcHLEIgeEdz"} -**PYTHON OOP CONCEPTS** -::: - -::: {.cell .markdown id="3j1W5YpNeEmS"} In Python object-oriented Programming (OOPs) is a programming paradigm that uses objects and classes in programming. It aims to implement real-world entities like inheritance, polymorphisms, encapsulation, etc. @@ -36,15 +20,15 @@ can access this data. 5. Inheritance in Python 6. Data Abstraction in Python - ::: -::: {.cell .markdown id="3KQXMPlVeEyT"} + + Python Class A class is a collection of objects. A class contains the blueprints or the prototype from which the objects are being created. It is a logical entity that contains some attributes and methods. -::: -::: {.cell .code execution_count="2" id="6CdZhHSMerae"} + + ```python #Simple Class in Python @@ -54,31 +38,25 @@ class Dog: ::: -::: {.cell .markdown id="y5t7jyHAfAHl"} + **Python Objects** In object oriented programming Python, The object is an entity that has a state and behavior associated with it. It may be any real-world object like a mouse, keyboard, chair, table, pen, etc. Integers, strings, floating-point numbers, even arrays, and dictionaries, are all objects. -::: -::: {.cell .code execution_count="3" id="u8Y0G-hse-lm"} ```python obj = Dog() ``` -::: -::: {.cell .markdown id="\_FtRAPlNfLkb"} **The Python **init** Method ** The **init** method is similar to constructors in C++ and Java. It is run as soon as an object of a class is instantiated. The method is useful to do any initialization you want to do with your object. -::: -::: {.cell .code execution_count="4" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="aMmXUxLHfSz6" outputId="ed23bfbd-445a-4d02-ebba-c210471e0af2"} ```python class Dog: @@ -103,15 +81,7 @@ print("My name is {}".format(Rodger.name)) print("My name is {}".format(Tommy.name)) ``` -::: {.output .stream .stdout} -Rodger is a mammal -Tommy is also a mammal -My name is Rodger -My name is Tommy -::: -::: -::: {.cell .markdown id="YFMnh417fZI6"} **Inheritance** In Python object oriented Programming, Inheritance is the capability of @@ -129,10 +99,7 @@ Types of Inheritances: - Multiple Inheritance - Hierarchial Inheritance - ::: - -::: {.cell .code execution_count="6" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="PeQoseXogE2f" outputId="9b3a069e-c6f0-41b0-b5f3-704aa0f95160"} - + ```python #Single Inheritance # Parent class @@ -165,13 +132,8 @@ dog.make_sound() cat.make_sound() ``` -::: {.output .stream .stdout} -Buddy says Woof -Whiskers says Meow -::: -::: -::: {.cell .code execution_count="7" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="CKEMq39BgSu9" outputId="b252ac43-6116-4a88-9ac9-0475f54e63c0"} + ```python #Multilevel Inheritance @@ -202,14 +164,7 @@ german_shepherd.bark() # Accessing method from the Dog class german_shepherd.guard() # Accessing method from the GermanShepherd class ``` -::: {.output .stream .stdout} -Rocky speaks -Rocky barks -Rocky guards -::: -::: -::: {.cell .code execution_count="8" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="wZ5qxZXBgdQ6" outputId="cd1c9d75-790c-49b3-8040-3334b896d779"} ```python #Hierarchial Inheritance @@ -242,15 +197,6 @@ cat.speak() # Accessing method from the Animal class cat.meow() # Accessing method from the Cat class ``` -::: {.output .stream .stdout} -Buddy speaks -Buddy barks -Whiskers speaks -Whiskers meows -::: -::: - -::: {.cell .code execution_count="9" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="8nPMri12glO5" outputId="a3c93e8c-f10f-4cd7-c402-3500342c9e28"} ```python #Multiple Inheritance @@ -278,19 +224,9 @@ omnivore.eat_meat() # Accessing method from Carnivore omnivore.eat() # Accessing method from Omnivore ``` -::: {.output .stream .stdout} -Eating plants -Eating meat -Eating everything -::: -::: -::: {.cell .markdown id="KSw-WMePgvCa"} **Polymorphism** In object oriented Programming Python, Polymorphism simply means having many forms -::: - -::: {.cell .code execution_count="10" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="cIYtM2_Pg8Ja" outputId="e887848d-060a-4317-a805-cfb0ca4e187f"} ```python class Bird: @@ -325,17 +261,7 @@ obj_ost.intro() obj_ost.flight() ``` -::: {.output .stream .stdout} -There are many types of birds. -Most of the birds can fly but some cannot. -There are many types of birds. -Sparrows can fly. -There are many types of birds. -Ostriches cannot fly. -::: -::: -::: {.cell .markdown id="NzsPIifmg-FI"} **Python Encapsulation** In Python object oriented programming, Encapsulation is one of the @@ -346,9 +272,7 @@ and can prevent the accidental modification of data. To prevent accidental change, an object's variable can only be changed by an object's method. Those types of variables are known as private variables. -::: -::: {.cell .code execution_count="11" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="etbhALMHhGb9" outputId="75f27d20-7cee-4c85-b722-b9beb5ffe2b8"} ```python class Car: @@ -396,22 +320,10 @@ my_car.increment_odometer(50) print("Odometer Reading after increment:", my_car.get_odometer_reading()) ``` -::: {.output .stream .stdout} -Make: Toyota -Model: Camry -Year: 2021 -Odometer Reading: 100 -Odometer Reading after increment: 150 -::: -::: -::: {.cell .markdown id="hJkQ9Tn5hUEV"} **Data Abstraction** It hides unnecessary code details from the user. Also, when we do not want to give out sensitive parts of our code implementation and this is where data abstraction came. -::: - -::: {.cell .code execution_count="12" colab="{\"base_uri\":\"https://localhost:8080/\"}" id="FoMRMWEEhc-Z" outputId="3a77fd0d-8116-4997-c35f-dfebfc786b72"} ```python from abc import ABC, abstractmethod @@ -463,8 +375,3 @@ print(f"{rectangle.name}: Area = {rectangle.area()}, Perimeter = {rectangle.peri print(f"{circle.name}: Area = {circle.area()}, Perimeter = {circle.perimeter()}") ``` -::: {.output .stream .stdout} -Rectangle: Area = 20, Perimeter = 18 -Circle: Area = 28.259999999999998, Perimeter = 18.84 -::: -::: From c56bbb3d4733f0c6770a4bb5755ea03043778182 Mon Sep 17 00:00:00 2001 From: Aditi Bansal <142652964+Aditi22Bansal@users.noreply.github.com> Date: Sat, 18 May 2024 18:51:39 +0530 Subject: [PATCH 058/405] Update index.md --- contrib/mini-projects/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/mini-projects/index.md b/contrib/mini-projects/index.md index 82596a2..0c76d72 100644 --- a/contrib/mini-projects/index.md +++ b/contrib/mini-projects/index.md @@ -1,3 +1,4 @@ # List of sections - [Section title](filename.md) +- [Hangman Game Based on Movies](hangman_game.md) From 7375e91a255113141a9a6e729ceaa56e1898d5dd Mon Sep 17 00:00:00 2001 From: Yatharth Date: Sat, 18 May 2024 18:56:11 +0530 Subject: [PATCH 059/405] removed html tags, removed weird color at line 70 and 117 --- contrib/advanced-python/json-module.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/contrib/advanced-python/json-module.md b/contrib/advanced-python/json-module.md index 20a9408..47e1561 100644 --- a/contrib/advanced-python/json-module.md +++ b/contrib/advanced-python/json-module.md @@ -2,7 +2,7 @@ ## What is JSON? -- JSON (JavaScript Object Notation) is a format for structuring data. +- [JSON]("https://www.json.org/json-en.html") (JavaScript Object Notation) is a format for structuring data. - JSON is a lightweight, text-based data interchange format that is completely language-independent. - Similar to XML, JSON is a format for structuring data commonly used by web applications to communicate with each other. @@ -14,7 +14,7 @@ age = 21 ``` -- When we use `age`, it gets replaced with `21`. However, age doesn't contain 21, it contains the address of the memory location where 21 is stored. +- When we use `age`, it gets replaced with `21`. However, *age doesn't contain 21, it contains the address of the memory location where 21 is stored*. - While this works locally, transferring this data, such as through an API, poses a challenge. Sending your computer’s entire memory with the addresses is impractical and insecure. This is where JSON comes to the rescue. @@ -67,7 +67,7 @@ print(students_dict['name']) - Ouput: ```json -{'id': '01', 'name': 'Yatharth', 'department': 'Computer Science Engineering'} +{"id": "01", "name": "Yatharth", "department": "Computer Science Engineering"} Yatharth ``` @@ -114,16 +114,15 @@ f.close() - Ouput ```json -{'id': '01', 'name': 'Yatharth', 'department': 'Computer Science Engineering'} -{'id': '02', 'name': 'Raj', 'department': 'Mechanical Engineering'} +{"id": "01", "name": "Yatharth", "department": "Computer Science Engineering"} +{"id": "02", "name": "Raj", "department": "Mechanical Engineering"} ``` - `json.load()`: Reads JSON data from a file object and deserializes it into a Python object. - `json.loads()`: Deserializes JSON data from a string into a Python object. -
-### Addtiotnal Context + +## Addtiotnal Context Relation between python data types and json data types is given in table below. -
| Python Object | JSON Object | |-----------------|-------------| @@ -288,7 +287,4 @@ write_json(y) } ``` -
-
- The Python json module simplifies the handling of JSON data, offering a bridge between Python data structures and JSON representations, vital for data exchange and storage in modern applications. \ No newline at end of file From bc5469772704fa51bae90feb259a2adbfcaa0563 Mon Sep 17 00:00:00 2001 From: Yatharth Date: Sat, 18 May 2024 18:57:26 +0530 Subject: [PATCH 060/405] line error 71 removed --- contrib/advanced-python/json-module.md | 1 - 1 file changed, 1 deletion(-) diff --git a/contrib/advanced-python/json-module.md b/contrib/advanced-python/json-module.md index 47e1561..eed0393 100644 --- a/contrib/advanced-python/json-module.md +++ b/contrib/advanced-python/json-module.md @@ -68,7 +68,6 @@ print(students_dict['name']) ```json {"id": "01", "name": "Yatharth", "department": "Computer Science Engineering"} -Yatharth ``` ## 2. Python load JSON file. From 6063f595bdfb82655580a13d0260d547b920cd1c Mon Sep 17 00:00:00 2001 From: Manmita Das <34617961+manmita@users.noreply.github.com> Date: Sat, 18 May 2024 19:03:18 +0530 Subject: [PATCH 061/405] Create recursion.md --- contrib/ds-algorithms/recursion.md | 107 +++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 contrib/ds-algorithms/recursion.md diff --git a/contrib/ds-algorithms/recursion.md b/contrib/ds-algorithms/recursion.md new file mode 100644 index 0000000..7ab3136 --- /dev/null +++ b/contrib/ds-algorithms/recursion.md @@ -0,0 +1,107 @@ +# Introduction to Recursions + +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 + +To solve a problem using recursion we must define: +- Base condition :- The condition under which recursion ends. +- Recursive case :- The part of function which calls itself to solve a smaller instance of problem. + +Steps of Recursion + +When a recursive function is called, the following sequence of events occurs: +- Function Call: The function is invoked with a specific argument. +- Base Condition Check: The function checks if the argument satisfies the base case. +- Recursive Call: If the base case is not met, the function performs some operations and makes a recursive call with a modified argument. +- 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. + +# 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 + +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 + +- 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 + +- 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. + +Algorithm for Solving the Word Search Problem with Backtracking: +- Start at each cell: Attempt to find the word starting from each cell. +- Check all Directions: From each cell, try all four possible directions (up, down, left, right). +- Mark Visited Cells: Use a temporary marker to indicate cells that are part of the current path to avoid revisiting. +- Backtrack: If a path does not lead to a solution, backtrack by unmarking the visited cell and trying the next possibility. + +```python +def exist(board, word): + rows, cols = len(board), len(board[0]) + + def backtrack(r, c, suffix): + if not suffix: + return True + + if r < 0 or r >= rows or c < 0 or c >= cols or board[r][c] != suffix[0]: + return False + + # Mark the cell as visited by replacing its character with a placeholder + ret = False + board[r][c], temp = '#', board[r][c] + + # Explore the four possible directions + for row_offset, col_offset in [(0, 1), (1, 0), (0, -1), (-1, 0)]: + ret = backtrack(r + row_offset, c + col_offset, suffix[1:]) + if ret: + break + + # Restore the cell's original value + board[r][c] = temp + return ret + + for row in range(rows): + for col in range(cols): + if backtrack(row, col, word): + return True + + return False + +# Test case +board = [ + ['A','B','C','E'], + ['S','F','C','S'], + ['A','D','E','E'] +] +word = "ABCES" +print(exist(board, word)) # Output: True +``` + + + From 2c56f3ef278be8220a1a6a10499f21fc7e4be192 Mon Sep 17 00:00:00 2001 From: Manmita Das <34617961+manmita@users.noreply.github.com> Date: Sat, 18 May 2024 19:05:51 +0530 Subject: [PATCH 062/405] Update index.md --- contrib/ds-algorithms/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 5b52155..ab16ebe 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -2,3 +2,4 @@ - [Section title](filename.md) - [Sorting Algorithms](sorting-algorithms.md) +- [Recursion and Backtracking](recursion.md) From acf7acdd8f347a8d762ee0fc912de5ea85d34447 Mon Sep 17 00:00:00 2001 From: Aditi Bansal <142652964+Aditi22Bansal@users.noreply.github.com> Date: Sat, 18 May 2024 19:10:19 +0530 Subject: [PATCH 063/405] Create hangman_game.md This Hangman game script is a simple Python program designed to let players guess movie titles. It starts by importing the random module to select a movie from a predefined list. The game displays the movie title as underscores and reveals correctly guessed letters. Players have six attempts to guess the entire title, entering one letter at a time. The script checks if the input is valid, updates the list of guessed letters, and adjusts the number of attempts based on the correctness of the guess. The game continues until the player either guesses the title correctly or runs out of attempts. Upon completion, it congratulates the player for a correct guess or reveals the movie title if the attempts are exhausted. The main execution block ensures the game runs only when the script is executed directly. --- contrib/mini-projects/hangman_game.md | 220 ++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 contrib/mini-projects/hangman_game.md diff --git a/contrib/mini-projects/hangman_game.md b/contrib/mini-projects/hangman_game.md new file mode 100644 index 0000000..d62db91 --- /dev/null +++ b/contrib/mini-projects/hangman_game.md @@ -0,0 +1,220 @@ +# Hangman - Movies Edition +The Hangman game script is a simple Python program designed to let players guess movie titles. It starts by importing the random module to select a movie from a predefined list. The game displays the movie title as underscores and reveals correctly guessed letters. Players have six attempts to guess the entire title, entering one letter at a time. The script checks if the input is valid, updates the list of guessed letters, and adjusts the number of attempts based on the correctness of the guess. The game continues until the player either guesses the title correctly or runs out of attempts. Upon completion, it congratulates the player for a correct guess or reveals the movie title if the attempts are exhausted. The main execution block ensures the game runs only when the script is executed directly.Below is first the code and then an explanation of the code and its components. + +## Code + +``` +import random + +def choose_movie(): + movies = ['avatar', 'titanic', 'inception', 'jurassicpark', 'thegodfather', 'forrestgump', 'interstellar', 'pulpfiction', 'shawshank'] + return random.choice(movies) + +def display_word(movie, guessed_letters): + display = "" + for letter in movie: + if letter in guessed_letters: + display += letter + " " + else: + display += "_ " + return display + +def hangman_movies(): + movie = choose_movie() + guessed_letters = [] + attempts = 6 + + print("Welcome to Hangman - Movies Edition!") + print("Try to guess the name of the movie. You have 6 attempts.") + + while attempts > 0: + print("\n" + display_word(movie, guessed_letters)) + guess = input("Guess a letter: ").lower() + + if len(guess) != 1 or not guess.isalpha(): + print("Please enter a single letter.") + continue + + if guess in guessed_letters: + print("You've already guessed that letter.") + continue + + guessed_letters.append(guess) + + if guess not in movie: + attempts -= 1 + print(f"Sorry, '{guess}' is not in the movie name. You have {attempts} attempts left.") + else: + print(f"Good guess! '{guess}' is in the movie name.") + + if "_" not in display_word(movie, guessed_letters): + print(f"\nCongratulations! You guessed the movie '{movie.capitalize()}' correctly!") + break + + if attempts == 0: + print(f"\nSorry, you ran out of attempts. The movie was '{movie.capitalize()}'.") + +if __name__ == "__main__": + hangman_movies() +``` + +## Code Explanation + +### Importing the Random Module + +```python + +import random + +``` + +The `random` module is imported to use the `choice` function, which will help in selecting a random movie from a predefined list. + +### Choosing a Movie + +```python + +def choose_movie(): + +movies = ['avatar', 'titanic', 'inception', 'jurassicpark', 'thegodfather', 'forrestgump', 'interstellar', 'pulpfiction', 'shawshank'] + +return random.choice(movies) + +``` + +The `choose_movie` function returns a random movie title from the `movies` list. + +### Displaying the Word + +```python + +def display_word(movie, guessed_letters): + +display = "" + +for letter in movie: + +if letter in guessed_letters: + +display += letter + " " + +else: + +display += "_ " + +return display + +``` + +The `display_word` function takes the movie title and a list of guessed letters as arguments. It constructs a string where correctly guessed letters are shown in their positions, and unknown letters are represented by underscores (`_`). + +### Hangman Game Logic + +```python + +def hangman_movies(): + +movie = choose_movie() + +guessed_letters = [] + +attempts = 6 + +print("Welcome to Hangman - Movies Edition!") + +print("Try to guess the name of the movie. You have 6 attempts.") + +while attempts > 0: + +print("\n" + display_word(movie, guessed_letters)) + +guess = input("Guess a letter: ").lower() + +if len(guess) != 1 or not guess.isalpha(): + +print("Please enter a single letter.") + +continue + +if guess in guessed_letters: + +print("You've already guessed that letter.") + +continue + +guessed_letters.append(guess) + +if guess not in movie: + +attempts -= 1 + +print(f"Sorry, '{guess}' is not in the movie name. You have {attempts} attempts left.") + +else: + +print(f"Good guess! '{guess}' is in the movie name.") + +if "_" not in display_word(movie, guessed_letters): + +print(f"\nCongratulations! You guessed the movie '{movie.capitalize()}' correctly!") + +break + +if attempts == 0: + +print(f"\nSorry, you ran out of attempts. The movie was '{movie.capitalize()}'.") + +``` + +The `hangman_movies` function manages the game's flow: + +1. It selects a random movie title using `choose_movie`. + +2. Initializes an empty list `guessed_letters` and sets the number of attempts to 6. + +3. Prints a welcome message and the initial game state. + +4. Enters a loop that continues until the player runs out of attempts or guesses the movie title. + +5. Displays the current state of the movie title with guessed letters revealed. + +6. Prompts the player to guess a letter. + +7. Validates the player's input: + +- Ensures it is a single alphabetic character. + +- Checks if the letter has already been guessed. + +8. Adds the guessed letter to `guessed_letters`. + +9. Updates the number of attempts if the guessed letter is not in the movie title. + +10. Congratulates the player if they guess the movie correctly. + +11. Informs the player of the correct movie title if they run out of attempts. + +### Main Execution Block + +```python + +if __name__ == "__main__": + +hangman_movies() + +``` +## Conclusion +This block ensures that the game runs only when the script is executed directly, not when it is imported as a module. + +## Output Screenshots: + +![image](https://github.com/Aditi22Bansal/learn-python/assets/142652964/a7af1f7e-c80e-4f83-b1f7-c7c5c72158b4) +![image](https://github.com/Aditi22Bansal/learn-python/assets/142652964/082e54dc-ce68-48fd-85da-3252d7629df8) + + + +## Conclusion + +This script provides a simple yet entertaining Hangman game focused on guessing movie titles. It demonstrates the use of functions, loops, conditionals, and user input handling in Python. + + From 391a0e591b6866c981e1e746473a2ad475b1315e Mon Sep 17 00:00:00 2001 From: Anshika Yadav <14anshika7yadav@gmail.com> Date: Sat, 18 May 2024 19:54:24 +0530 Subject: [PATCH 064/405] Closes #294 - Mini Project : Password Strength Checker --- contrib/mini-projects/index.md | 1 + .../password_strength_checker.md | 100 ++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 contrib/mini-projects/password_strength_checker.md diff --git a/contrib/mini-projects/index.md b/contrib/mini-projects/index.md index 82596a2..71908f8 100644 --- a/contrib/mini-projects/index.md +++ b/contrib/mini-projects/index.md @@ -1,3 +1,4 @@ # List of sections - [Section title](filename.md) +- [Password strength checker](password_strength_checker.md) \ No newline at end of file diff --git a/contrib/mini-projects/password_strength_checker.md b/contrib/mini-projects/password_strength_checker.md new file mode 100644 index 0000000..ca65b8e --- /dev/null +++ b/contrib/mini-projects/password_strength_checker.md @@ -0,0 +1,100 @@ +# about password strength + +> This code is a simple password strength checker. +It evaluates the strength of a user's password based on the presence of +uppercase letters, lowercase letters, digits, spaces, and special characters. + +### About the code: + +- The codebase is break down in two file `password_strength_checker.py` and `main.py`. + +`password_strength_checker.py` The function evaluates password strength based on character types (uppercase, lowercase, digits, spaces, special characters) and provides feedback on its security. +and `main.py` contains basic code. + +``` +import string + + +class password_checker: + def __init__(self, password): + self.password = password + + def check_password_strength(self): + """This function prompts the user to enter a password and then evaluates its strength.""" + + password_strength = 0 + upper_count = 0 + lower_count = 0 + num_count = 0 + space_count = 0 + specialcharacter_count = 0 + review = "" + + for char in list(password): + if char in string.ascii_uppercase: + upper_count += 1 + elif char in string.ascii_lowercase: + lower_count += 1 + elif char in string.digits: + num_count += 1 + elif char == " ": + space_count += 1 + else: + specialcharacter_count += 1 + + if upper_count >= 1: + password_strength += 1 + if lower_count >= 1: + password_strength += 1 + if num_count >= 1: + password_strength += 1 + if space_count >= 1: + password_strength += 1 + if specialcharacter_count >= 1: + password_strength += 1 + + if password_strength == 1: + review = "That's a very easy password, Not good for use" + elif password_strength == 2: + review = ( + "That's a weak password, You should change it to some strong password." + ) + elif password_strength == 3: + review = "Your password is just okay, you may change it." + elif password_strength == 4: + review = "Your password is hard to guess." + elif password_strength == 5: + review = "Its the strong password, No one can guess this password " + + about_password = { + "uppercase_letters ": upper_count, + "lowercase_letters": lower_count, + "space_count": space_count, + "specialcharacter_count": specialcharacter_count, + "password_strength": password_strength, + "about_password_strength": review, + } + print(about_password) + + def check_password(): + """This function prompts the user to decide if they want to check their password strength.""" + + choice = input("Do you want to check your password's strength? (Y/N): ") + if choice.upper() == "Y": + return True + elif choice.upper() == "N": + return False + else: + print("Invalid input. Please enter 'Y' for Yes or 'N' for No.") + return password_checker.check_password() + +``` +### Here's the implementation of 'main.py' +``` +import password_checker from password_strength_checker + +while password_checker.check_password(): + password = input("Enter your password: ") + p = password_checker(password) + p.check_password_strength() +``` \ No newline at end of file From 07d7643c6a0283db1b03c69e518a006a9d646f99 Mon Sep 17 00:00:00 2001 From: AmrutaJayanti <142327526+AmrutaJayanti@users.noreply.github.com> Date: Sat, 18 May 2024 20:01:02 +0530 Subject: [PATCH 065/405] Update OOPs.md --- contrib/advanced-python/OOPs.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/contrib/advanced-python/OOPs.md b/contrib/advanced-python/OOPs.md index d6d1256..0dbd855 100644 --- a/contrib/advanced-python/OOPs.md +++ b/contrib/advanced-python/OOPs.md @@ -36,7 +36,7 @@ class Dog: pass ``` -::: + **Python Objects** In object oriented programming Python, The object is @@ -49,9 +49,9 @@ dictionaries, are all objects. ```python obj = Dog() ``` +This creates an instance for class Dog - -**The Python **init** Method ** +**The Python **init** Method** The **init** method is similar to constructors in C++ and Java. It is run as soon as an object of a class is instantiated. The method is @@ -80,7 +80,7 @@ print("Tommy is also a {}".format(Tommy.__class__.attr1)) print("My name is {}".format(Rodger.name)) print("My name is {}".format(Tommy.name)) ``` - +In the above mentioned code, init method is used to initialize the name. **Inheritance** @@ -131,7 +131,7 @@ cat = Cat("Whiskers") dog.make_sound() cat.make_sound() ``` - +The above code depicts the Single Inheritance, in case of single inheritance there's only a single base class and a derived class. Here, Dog and Cat are the derived classes with Animal as the parent class. They can access the methods of the base class or derive their own methods. @@ -163,7 +163,7 @@ german_shepherd.speak() # Accessing method from the Animal class german_shepherd.bark() # Accessing method from the Dog class german_shepherd.guard() # Accessing method from the GermanShepherd class ``` - +Multilevel inheritance is a concept in object-oriented programming where a class inherits properties and behaviors from another class, which itself may inherit from another class. In other words, it involves a chain of inheritance where a subclass inherits from a superclass, and that subclass can then become a superclass for another subclass.Its similar to GrandFather ,Father and Son .In the above code,Animal class is the superclass, Dog is derived from Animal and Dog is the parent of GermanShepherd. GermenShepherd is the child class of Dog. GermenShepherd can access methods of both Animal and Dog. ```python @@ -196,7 +196,7 @@ dog.bark() # Accessing method from the Dog class cat.speak() # Accessing method from the Animal class cat.meow() # Accessing method from the Cat class ``` - +Hierarchical inheritance is a type of inheritance in object-oriented programming where one class serves as a superclass for multiple subclasses. In this inheritance model, each subclass inherits properties and behaviors from the same superclass, creating a hierarchical tree-like structure. ```python #Multiple Inheritance @@ -223,7 +223,7 @@ omnivore.eat_plants() # Accessing method from Herbivore omnivore.eat_meat() # Accessing method from Carnivore omnivore.eat() # Accessing method from Omnivore ``` - +Multiple inheritance is a concept in object-oriented programming where a class can inherit properties and behaviors from more than one parent class. This means that a subclass can have multiple immediate parent classes, allowing it to inherit features from each of them. **Polymorphism** In object oriented Programming Python, Polymorphism simply means having many forms @@ -260,7 +260,7 @@ obj_spr.flight() obj_ost.intro() obj_ost.flight() ``` - +Poly stands for 'many' and morphism for 'forms'. In the above code, method flight() has many forms. **Python Encapsulation** @@ -374,4 +374,6 @@ circle = Circle("Circle", 3) print(f"{rectangle.name}: Area = {rectangle.area()}, Perimeter = {rectangle.perimeter()}") print(f"{circle.name}: Area = {circle.area()}, Perimeter = {circle.perimeter()}") ``` - +To implement Data Abstraction , we have to import abc . ABC stands for Abstract Base Class . All those classes which want to implement data abstraction have to inherit from ABC. +@abstractmethod is a decorator provided by the abc module, which stands for "abstract method". It's used to define abstract methods within abstract base classes (ABCs). An abstract method is a method declared in a class, but it does not contain an implementation. Instead, it serves as a placeholder, and its concrete implementation must be provided by subclasses. +Abstract methods can be implemented by the derived classes. From 2af70910214b943fa5df5a1f542389dec104ac43 Mon Sep 17 00:00:00 2001 From: AritraCh2005 <153842880+AritraCh2005@users.noreply.github.com> Date: Sat, 18 May 2024 20:28:17 +0530 Subject: [PATCH 066/405] Update index.md --- contrib/numpy/index.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index db6f0eb..fb82485 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,12 +1,5 @@ # List of sections -* [Basic Mathematics](#BasicMaths) - * [What is a Matrix?](#Matrix-Intro) - * [Scalars and Vectors](#Scalars-Vectors) - * [Arrays in Python](#Arrays) - * [What is a Tensor?](#Tensors) - * [Addition and Subtraction in Matrices](#Arithmetic) - * [Transpose of Matrices & Vectors](#Transpose) - * [Dot Product](#DotProduct) - * [Dot Product of Matrices](#DotMatrices) +* [Basic Mathematics](basic_math.md) + From 2604ecd61a9911d1d73e764046ee09c78ab5fb05 Mon Sep 17 00:00:00 2001 From: rohit Date: Sat, 18 May 2024 21:51:53 +0530 Subject: [PATCH 067/405] Added TensorFlow,md File --- contrib/machine-learning/index.md | 2 +- contrib/machine-learning/tensorFlow.md | 64 ++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 contrib/machine-learning/tensorFlow.md diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 82596a2..1abe707 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [TensorFlow.md](learn-python\contrib\machine-learning\tensorFlow.md) diff --git a/contrib/machine-learning/tensorFlow.md b/contrib/machine-learning/tensorFlow.md new file mode 100644 index 0000000..1d9357d --- /dev/null +++ b/contrib/machine-learning/tensorFlow.md @@ -0,0 +1,64 @@ +# TensorFlow + +Developed by the Google Brain team, TensorFlow is an open-source library that provides a comprehensive ecosystem for building and deploying machine learning models. It supports deep learning and neural networks and offers tools for both beginners and experts. + +## Key Features + +- **Flexible and comprehensive ecosystem** +- **Scalable for both production and research** +- **Supports CPUs, GPUs, and TPUs** + +## Basic Example: Linear Regression + +Let's start with a simple linear regression example in TensorFlow. + +```python +import tensorflow as tf +import numpy as np +import matplotlib.pyplot as plt + +# Generate synthetic data +X = np.array([1, 2, 3, 4, 5], dtype=np.float32) +Y = np.array([2, 4, 6, 8, 10], dtype=np.float32) + +# Define the model +model = tf.keras.Sequential([ + tf.keras.layers.Dense(units=1, input_shape=[1]) +]) + +# Compile the model +model.compile(optimizer='sgd', loss='mean_squared_error') + +# Train the model +history = model.fit(X, Y, epochs=500) + +# Predict +predictions = model.predict(X) + +# Plot the results +plt.plot(X, Y, 'ro', label='Original data') +plt.plot(X, predictions, 'b-', label='Fitted line') +plt.legend() +plt.show() +``` + +In this example: + +1. We define a simple dataset with a linear relationship. +2. We build a sequential model with one dense layer (linear regression). +3. We compile the model with stochastic gradient descent (SGD) optimizer and mean squared error loss. +4. We train the model for 500 epochs and then plot the original data and the fitted line. + +## When to Use TensorFlow + +TensorFlow is a great choice if you: + +- **Need to deploy machine learning models in production:** TensorFlow’s robust deployment options, including TensorFlow Serving, TensorFlow Lite, and TensorFlow.js, make it ideal for production environments. +- **Work on large-scale deep learning projects:** TensorFlow’s comprehensive ecosystem supports distributed training and has tools like TensorBoard for visualization. +- **Require high performance and scalability:** TensorFlow is optimized for performance and can leverage GPUs and TPUs for accelerated computing. +- **Want extensive support and documentation:** TensorFlow has a large community and extensive documentation, which can be very helpful for both beginners and advanced users. + +## Example Use Cases + +- Building and deploying complex neural networks for image recognition, natural language processing, or recommendation systems. +- Developing models that need to be run on mobile or embedded devices. \ No newline at end of file From ba9abd57a77ccfeab63e89f28720a97fb13980ae Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 18 May 2024 22:11:38 +0530 Subject: [PATCH 068/405] Add files via upload --- contrib/pandas/Titanic.csv | 1310 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1310 insertions(+) create mode 100644 contrib/pandas/Titanic.csv diff --git a/contrib/pandas/Titanic.csv b/contrib/pandas/Titanic.csv new file mode 100644 index 0000000..f8d49dc --- /dev/null +++ b/contrib/pandas/Titanic.csv @@ -0,0 +1,1310 @@ +"pclass","survived","name","sex","age","sibsp","parch","ticket","fare","cabin","embarked","boat","body","home.dest" +1,1,"Allen, Miss. Elisabeth Walton","female",29,0,0,"24160",211.3375,"B5","S","2",,"St Louis, MO" +1,1,"Allison, Master. Hudson Trevor","male",0.92,1,2,"113781",151.5500,"C22 C26","S","11",,"Montreal, PQ / Chesterville, ON" +1,0,"Allison, Miss. Helen Loraine","female",2,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" +1,0,"Allison, Mr. Hudson Joshua Creighton","male",30,1,2,"113781",151.5500,"C22 C26","S",,"135","Montreal, PQ / Chesterville, ON" +1,0,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)","female",25,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" +1,1,"Anderson, Mr. Harry","male",48,0,0,"19952",26.5500,"E12","S","3",,"New York, NY" +1,1,"Andrews, Miss. Kornelia Theodosia","female",63,1,0,"13502",77.9583,"D7","S","10",,"Hudson, NY" +1,0,"Andrews, Mr. Thomas Jr","male",39,0,0,"112050",0.0000,"A36","S",,,"Belfast, NI" +1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)","female",53,2,0,"11769",51.4792,"C101","S","D",,"Bayside, Queens, NY" +1,0,"Artagaveytia, Mr. Ramon","male",71,0,0,"PC 17609",49.5042,,"C",,"22","Montevideo, Uruguay" +1,0,"Astor, Col. John Jacob","male",47,1,0,"PC 17757",227.5250,"C62 C64","C",,"124","New York, NY" +1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)","female",18,1,0,"PC 17757",227.5250,"C62 C64","C","4",,"New York, NY" +1,1,"Aubart, Mme. Leontine Pauline","female",24,0,0,"PC 17477",69.3000,"B35","C","9",,"Paris, France" +1,1,"Barber, Miss. Ellen ""Nellie""","female",26,0,0,"19877",78.8500,,"S","6",, +1,1,"Barkworth, Mr. Algernon Henry Wilson","male",80,0,0,"27042",30.0000,"A23","S","B",,"Hessle, Yorks" +1,0,"Baumann, Mr. John D","male",,0,0,"PC 17318",25.9250,,"S",,,"New York, NY" +1,0,"Baxter, Mr. Quigg Edmond","male",24,0,1,"PC 17558",247.5208,"B58 B60","C",,,"Montreal, PQ" +1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)","female",50,0,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" +1,1,"Bazzani, Miss. Albina","female",32,0,0,"11813",76.2917,"D15","C","8",, +1,0,"Beattie, Mr. Thomson","male",36,0,0,"13050",75.2417,"C6","C","A",,"Winnipeg, MN" +1,1,"Beckwith, Mr. Richard Leonard","male",37,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" +1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)","female",47,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" +1,1,"Behr, Mr. Karl Howell","male",26,0,0,"111369",30.0000,"C148","C","5",,"New York, NY" +1,1,"Bidois, Miss. Rosalie","female",42,0,0,"PC 17757",227.5250,,"C","4",, +1,1,"Bird, Miss. Ellen","female",29,0,0,"PC 17483",221.7792,"C97","S","8",, +1,0,"Birnbaum, Mr. Jakob","male",25,0,0,"13905",26.0000,,"C",,"148","San Francisco, CA" +1,1,"Bishop, Mr. Dickinson H","male",25,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" +1,1,"Bishop, Mrs. Dickinson H (Helen Walton)","female",19,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" +1,1,"Bissette, Miss. Amelia","female",35,0,0,"PC 17760",135.6333,"C99","S","8",, +1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan","male",28,0,0,"110564",26.5500,"C52","S","D",,"Stockholm, Sweden / Washington, DC" +1,0,"Blackwell, Mr. Stephen Weart","male",45,0,0,"113784",35.5000,"T","S",,,"Trenton, NJ" +1,1,"Blank, Mr. Henry","male",40,0,0,"112277",31.0000,"A31","C","7",,"Glen Ridge, NJ" +1,1,"Bonnell, Miss. Caroline","female",30,0,0,"36928",164.8667,"C7","S","8",,"Youngstown, OH" +1,1,"Bonnell, Miss. Elizabeth","female",58,0,0,"113783",26.5500,"C103","S","8",,"Birkdale, England Cleveland, Ohio" +1,0,"Borebank, Mr. John James","male",42,0,0,"110489",26.5500,"D22","S",,,"London / Winnipeg, MB" +1,1,"Bowen, Miss. Grace Scott","female",45,0,0,"PC 17608",262.3750,,"C","4",,"Cooperstown, NY" +1,1,"Bowerman, Miss. Elsie Edith","female",22,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" +1,1,"Bradley, Mr. George (""George Arthur Brayton"")","male",,0,0,"111427",26.5500,,"S","9",,"Los Angeles, CA" +1,0,"Brady, Mr. John Bertram","male",41,0,0,"113054",30.5000,"A21","S",,,"Pomeroy, WA" +1,0,"Brandeis, Mr. Emil","male",48,0,0,"PC 17591",50.4958,"B10","C",,"208","Omaha, NE" +1,0,"Brewe, Dr. Arthur Jackson","male",,0,0,"112379",39.6000,,"C",,,"Philadelphia, PA" +1,1,"Brown, Mrs. James Joseph (Margaret Tobin)","female",44,0,0,"PC 17610",27.7208,"B4","C","6",,"Denver, CO" +1,1,"Brown, Mrs. John Murray (Caroline Lane Lamson)","female",59,2,0,"11769",51.4792,"C101","S","D",,"Belmont, MA" +1,1,"Bucknell, Mrs. William Robert (Emma Eliza Ward)","female",60,0,0,"11813",76.2917,"D15","C","8",,"Philadelphia, PA" +1,1,"Burns, Miss. Elizabeth Margaret","female",41,0,0,"16966",134.5000,"E40","C","3",, +1,0,"Butt, Major. Archibald Willingham","male",45,0,0,"113050",26.5500,"B38","S",,,"Washington, DC" +1,0,"Cairns, Mr. Alexander","male",,0,0,"113798",31.0000,,"S",,, +1,1,"Calderhead, Mr. Edward Pennington","male",42,0,0,"PC 17476",26.2875,"E24","S","5",,"New York, NY" +1,1,"Candee, Mrs. Edward (Helen Churchill Hungerford)","female",53,0,0,"PC 17606",27.4458,,"C","6",,"Washington, DC" +1,1,"Cardeza, Mr. Thomas Drake Martinez","male",36,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Austria-Hungary / Germantown, Philadelphia, PA" +1,1,"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)","female",58,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Germantown, Philadelphia, PA" +1,0,"Carlsson, Mr. Frans Olof","male",33,0,0,"695",5.0000,"B51 B53 B55","S",,,"New York, NY" +1,0,"Carrau, Mr. Francisco M","male",28,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" +1,0,"Carrau, Mr. Jose Pedro","male",17,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" +1,1,"Carter, Master. William Thornton II","male",11,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" +1,1,"Carter, Miss. Lucile Polk","female",14,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" +1,1,"Carter, Mr. William Ernest","male",36,1,2,"113760",120.0000,"B96 B98","S","C",,"Bryn Mawr, PA" +1,1,"Carter, Mrs. William Ernest (Lucile Polk)","female",36,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" +1,0,"Case, Mr. Howard Brown","male",49,0,0,"19924",26.0000,,"S",,,"Ascot, Berkshire / Rochester, NY" +1,1,"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)","female",,0,0,"17770",27.7208,,"C","5",,"New York, NY" +1,0,"Cavendish, Mr. Tyrell William","male",36,1,0,"19877",78.8500,"C46","S",,"172","Little Onn Hall, Staffs" +1,1,"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)","female",76,1,0,"19877",78.8500,"C46","S","6",,"Little Onn Hall, Staffs" +1,0,"Chaffee, Mr. Herbert Fuller","male",46,1,0,"W.E.P. 5734",61.1750,"E31","S",,,"Amenia, ND" +1,1,"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)","female",47,1,0,"W.E.P. 5734",61.1750,"E31","S","4",,"Amenia, ND" +1,1,"Chambers, Mr. Norman Campbell","male",27,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" +1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)","female",33,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" +1,1,"Chaudanson, Miss. Victorine","female",36,0,0,"PC 17608",262.3750,"B61","C","4",, +1,1,"Cherry, Miss. Gladys","female",30,0,0,"110152",86.5000,"B77","S","8",,"London, England" +1,1,"Chevre, Mr. Paul Romaine","male",45,0,0,"PC 17594",29.7000,"A9","C","7",,"Paris, France" +1,1,"Chibnall, Mrs. (Edith Martha Bowerman)","female",,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" +1,0,"Chisholm, Mr. Roderick Robert Crispin","male",,0,0,"112051",0.0000,,"S",,,"Liverpool, England / Belfast" +1,0,"Clark, Mr. Walter Miller","male",27,1,0,"13508",136.7792,"C89","C",,,"Los Angeles, CA" +1,1,"Clark, Mrs. Walter Miller (Virginia McDowell)","female",26,1,0,"13508",136.7792,"C89","C","4",,"Los Angeles, CA" +1,1,"Cleaver, Miss. Alice","female",22,0,0,"113781",151.5500,,"S","11",, +1,0,"Clifford, Mr. George Quincy","male",,0,0,"110465",52.0000,"A14","S",,,"Stoughton, MA" +1,0,"Colley, Mr. Edward Pomeroy","male",47,0,0,"5727",25.5875,"E58","S",,,"Victoria, BC" +1,1,"Compton, Miss. Sara Rebecca","female",39,1,1,"PC 17756",83.1583,"E49","C","14",,"Lakewood, NJ" +1,0,"Compton, Mr. Alexander Taylor Jr","male",37,1,1,"PC 17756",83.1583,"E52","C",,,"Lakewood, NJ" +1,1,"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)","female",64,0,2,"PC 17756",83.1583,"E45","C","14",,"Lakewood, NJ" +1,1,"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)","female",55,2,0,"11770",25.7000,"C101","S","2",,"New York, NY" +1,0,"Crafton, Mr. John Bertram","male",,0,0,"113791",26.5500,,"S",,,"Roachdale, IN" +1,0,"Crosby, Capt. Edward Gifford","male",70,1,1,"WE/P 5735",71.0000,"B22","S",,"269","Milwaukee, WI" +1,1,"Crosby, Miss. Harriet R","female",36,0,2,"WE/P 5735",71.0000,"B22","S","7",,"Milwaukee, WI" +1,1,"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)","female",64,1,1,"112901",26.5500,"B26","S","7",,"Milwaukee, WI" +1,0,"Cumings, Mr. John Bradley","male",39,1,0,"PC 17599",71.2833,"C85","C",,,"New York, NY" +1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)","female",38,1,0,"PC 17599",71.2833,"C85","C","4",,"New York, NY" +1,1,"Daly, Mr. Peter Denis ","male",51,0,0,"113055",26.5500,"E17","S","5 9",,"Lima, Peru" +1,1,"Daniel, Mr. Robert Williams","male",27,0,0,"113804",30.5000,,"S","3",,"Philadelphia, PA" +1,1,"Daniels, Miss. Sarah","female",33,0,0,"113781",151.5500,,"S","8",, +1,0,"Davidson, Mr. Thornton","male",31,1,0,"F.C. 12750",52.0000,"B71","S",,,"Montreal, PQ" +1,1,"Davidson, Mrs. Thornton (Orian Hays)","female",27,1,2,"F.C. 12750",52.0000,"B71","S","3",,"Montreal, PQ" +1,1,"Dick, Mr. Albert Adrian","male",31,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" +1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)","female",17,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" +1,1,"Dodge, Dr. Washington","male",53,1,1,"33638",81.8583,"A34","S","13",,"San Francisco, CA" +1,1,"Dodge, Master. Washington","male",4,0,2,"33638",81.8583,"A34","S","5",,"San Francisco, CA" +1,1,"Dodge, Mrs. Washington (Ruth Vidaver)","female",54,1,1,"33638",81.8583,"A34","S","5",,"San Francisco, CA" +1,0,"Douglas, Mr. Walter Donald","male",50,1,0,"PC 17761",106.4250,"C86","C",,"62","Deephaven, MN / Cedar Rapids, IA" +1,1,"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)","female",27,1,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" +1,1,"Douglas, Mrs. Walter Donald (Mahala Dutton)","female",48,1,0,"PC 17761",106.4250,"C86","C","2",,"Deephaven, MN / Cedar Rapids, IA" +1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")","female",48,1,0,"11755",39.6000,"A16","C","1",,"London / Paris" +1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")","male",49,1,0,"PC 17485",56.9292,"A20","C","1",,"London / Paris" +1,0,"Dulles, Mr. William Crothers","male",39,0,0,"PC 17580",29.7000,"A18","C",,"133","Philadelphia, PA" +1,1,"Earnshaw, Mrs. Boulton (Olive Potter)","female",23,0,1,"11767",83.1583,"C54","C","7",,"Mt Airy, Philadelphia, PA" +1,1,"Endres, Miss. Caroline Louise","female",38,0,0,"PC 17757",227.5250,"C45","C","4",,"New York, NY" +1,1,"Eustis, Miss. Elizabeth Mussey","female",54,1,0,"36947",78.2667,"D20","C","4",,"Brookline, MA" +1,0,"Evans, Miss. Edith Corse","female",36,0,0,"PC 17531",31.6792,"A29","C",,,"New York, NY" +1,0,"Farthing, Mr. John","male",,0,0,"PC 17483",221.7792,"C95","S",,, +1,1,"Flegenheim, Mrs. Alfred (Antoinette)","female",,0,0,"PC 17598",31.6833,,"S","7",,"New York, NY" +1,1,"Fleming, Miss. Margaret","female",,0,0,"17421",110.8833,,"C","4",, +1,1,"Flynn, Mr. John Irwin (""Irving"")","male",36,0,0,"PC 17474",26.3875,"E25","S","5",,"Brooklyn, NY" +1,0,"Foreman, Mr. Benjamin Laventall","male",30,0,0,"113051",27.7500,"C111","C",,,"New York, NY" +1,1,"Fortune, Miss. Alice Elizabeth","female",24,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,1,"Fortune, Miss. Ethel Flora","female",28,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,1,"Fortune, Miss. Mabel Helen","female",23,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,0,"Fortune, Mr. Charles Alexander","male",19,3,2,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" +1,0,"Fortune, Mr. Mark","male",64,1,4,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" +1,1,"Fortune, Mrs. Mark (Mary McDougald)","female",60,1,4,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,1,"Francatelli, Miss. Laura Mabel","female",30,0,0,"PC 17485",56.9292,"E36","C","1",, +1,0,"Franklin, Mr. Thomas Parham","male",,0,0,"113778",26.5500,"D34","S",,,"Westcliff-on-Sea, Essex" +1,1,"Frauenthal, Dr. Henry William","male",50,2,0,"PC 17611",133.6500,,"S","5",,"New York, NY" +1,1,"Frauenthal, Mr. Isaac Gerald","male",43,1,0,"17765",27.7208,"D40","C","5",,"New York, NY" +1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)","female",,1,0,"PC 17611",133.6500,,"S","5",,"New York, NY" +1,1,"Frolicher, Miss. Hedwig Margaritha","female",22,0,2,"13568",49.5000,"B39","C","5",,"Zurich, Switzerland" +1,1,"Frolicher-Stehli, Mr. Maxmillian","male",60,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" +1,1,"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)","female",48,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" +1,0,"Fry, Mr. Richard","male",,0,0,"112058",0.0000,"B102","S",,, +1,0,"Futrelle, Mr. Jacques Heath","male",37,1,0,"113803",53.1000,"C123","S",,,"Scituate, MA" +1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)","female",35,1,0,"113803",53.1000,"C123","S","D",,"Scituate, MA" +1,0,"Gee, Mr. Arthur H","male",47,0,0,"111320",38.5000,"E63","S",,"275","St Anne's-on-Sea, Lancashire" +1,1,"Geiger, Miss. Amalie","female",35,0,0,"113503",211.5000,"C130","C","4",, +1,1,"Gibson, Miss. Dorothy Winifred","female",22,0,1,"112378",59.4000,,"C","7",,"New York, NY" +1,1,"Gibson, Mrs. Leonard (Pauline C Boeson)","female",45,0,1,"112378",59.4000,,"C","7",,"New York, NY" +1,0,"Giglio, Mr. Victor","male",24,0,0,"PC 17593",79.2000,"B86","C",,, +1,1,"Goldenberg, Mr. Samuel L","male",49,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" +1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)","female",,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" +1,0,"Goldschmidt, Mr. George B","male",71,0,0,"PC 17754",34.6542,"A5","C",,,"New York, NY" +1,1,"Gracie, Col. Archibald IV","male",53,0,0,"113780",28.5000,"C51","C","B",,"Washington, DC" +1,1,"Graham, Miss. Margaret Edith","female",19,0,0,"112053",30.0000,"B42","S","3",,"Greenwich, CT" +1,0,"Graham, Mr. George Edward","male",38,0,1,"PC 17582",153.4625,"C91","S",,"147","Winnipeg, MB" +1,1,"Graham, Mrs. William Thompson (Edith Junkins)","female",58,0,1,"PC 17582",153.4625,"C125","S","3",,"Greenwich, CT" +1,1,"Greenfield, Mr. William Bertram","male",23,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" +1,1,"Greenfield, Mrs. Leo David (Blanche Strouse)","female",45,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" +1,0,"Guggenheim, Mr. Benjamin","male",46,0,0,"PC 17593",79.2000,"B82 B84","C",,,"New York, NY" +1,1,"Harder, Mr. George Achilles","male",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" +1,1,"Harder, Mrs. George Achilles (Dorothy Annan)","female",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" +1,1,"Harper, Mr. Henry Sleeper","male",48,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" +1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)","female",49,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" +1,0,"Harrington, Mr. Charles H","male",,0,0,"113796",42.4000,,"S",,, +1,0,"Harris, Mr. Henry Birkhardt","male",45,1,0,"36973",83.4750,"C83","S",,,"New York, NY" +1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)","female",35,1,0,"36973",83.4750,"C83","S","D",,"New York, NY" +1,0,"Harrison, Mr. William","male",40,0,0,"112059",0.0000,"B94","S",,"110", +1,1,"Hassab, Mr. Hammad","male",27,0,0,"PC 17572",76.7292,"D49","C","3",, +1,1,"Hawksford, Mr. Walter James","male",,0,0,"16988",30.0000,"D45","S","3",,"Kingston, Surrey" +1,1,"Hays, Miss. Margaret Bechstein","female",24,0,0,"11767",83.1583,"C54","C","7",,"New York, NY" +1,0,"Hays, Mr. Charles Melville","male",55,1,1,"12749",93.5000,"B69","S",,"307","Montreal, PQ" +1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)","female",52,1,1,"12749",93.5000,"B69","S","3",,"Montreal, PQ" +1,0,"Head, Mr. Christopher","male",42,0,0,"113038",42.5000,"B11","S",,,"London / Middlesex" +1,0,"Hilliard, Mr. Herbert Henry","male",,0,0,"17463",51.8625,"E46","S",,,"Brighton, MA" +1,0,"Hipkins, Mr. William Edward","male",55,0,0,"680",50.0000,"C39","S",,,"London / Birmingham" +1,1,"Hippach, Miss. Jean Gertrude","female",16,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" +1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)","female",44,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" +1,1,"Hogeboom, Mrs. John C (Anna Andrews)","female",51,1,0,"13502",77.9583,"D11","S","10",,"Hudson, NY" +1,0,"Holverson, Mr. Alexander Oskar","male",42,1,0,"113789",52.0000,,"S",,"38","New York, NY" +1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)","female",35,1,0,"113789",52.0000,,"S","8",,"New York, NY" +1,1,"Homer, Mr. Harry (""Mr E Haven"")","male",35,0,0,"111426",26.5500,,"C","15",,"Indianapolis, IN" +1,1,"Hoyt, Mr. Frederick Maxfield","male",38,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" +1,0,"Hoyt, Mr. William Fisher","male",,0,0,"PC 17600",30.6958,,"C","14",,"New York, NY" +1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)","female",35,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" +1,1,"Icard, Miss. Amelie","female",38,0,0,"113572",80.0000,"B28",,"6",, +1,0,"Isham, Miss. Ann Elizabeth","female",50,0,0,"PC 17595",28.7125,"C49","C",,,"Paris, France New York, NY" +1,1,"Ismay, Mr. Joseph Bruce","male",49,0,0,"112058",0.0000,"B52 B54 B56","S","C",,"Liverpool" +1,0,"Jones, Mr. Charles Cresson","male",46,0,0,"694",26.0000,,"S",,"80","Bennington, VT" +1,0,"Julian, Mr. Henry Forbes","male",50,0,0,"113044",26.0000,"E60","S",,,"London" +1,0,"Keeping, Mr. Edwin","male",32.5,0,0,"113503",211.5000,"C132","C",,"45", +1,0,"Kent, Mr. Edward Austin","male",58,0,0,"11771",29.7000,"B37","C",,"258","Buffalo, NY" +1,0,"Kenyon, Mr. Frederick R","male",41,1,0,"17464",51.8625,"D21","S",,,"Southington / Noank, CT" +1,1,"Kenyon, Mrs. Frederick R (Marion)","female",,1,0,"17464",51.8625,"D21","S","8",,"Southington / Noank, CT" +1,1,"Kimball, Mr. Edwin Nelson Jr","male",42,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" +1,1,"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)","female",45,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" +1,0,"Klaber, Mr. Herman","male",,0,0,"113028",26.5500,"C124","S",,,"Portland, OR" +1,1,"Kreuchen, Miss. Emilie","female",39,0,0,"24160",211.3375,,"S","2",, +1,1,"Leader, Dr. Alice (Farnham)","female",49,0,0,"17465",25.9292,"D17","S","8",,"New York, NY" +1,1,"LeRoy, Miss. Bertha","female",30,0,0,"PC 17761",106.4250,,"C","2",, +1,1,"Lesurer, Mr. Gustave J","male",35,0,0,"PC 17755",512.3292,"B101","C","3",, +1,0,"Lewy, Mr. Ervin G","male",,0,0,"PC 17612",27.7208,,"C",,,"Chicago, IL" +1,0,"Lindeberg-Lind, Mr. Erik Gustaf (""Mr Edward Lingrey"")","male",42,0,0,"17475",26.5500,,"S",,,"Stockholm, Sweden" +1,1,"Lindstrom, Mrs. Carl Johan (Sigrid Posse)","female",55,0,0,"112377",27.7208,,"C","6",,"Stockholm, Sweden" +1,1,"Lines, Miss. Mary Conover","female",16,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" +1,1,"Lines, Mrs. Ernest H (Elizabeth Lindsey James)","female",51,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" +1,0,"Long, Mr. Milton Clyde","male",29,0,0,"113501",30.0000,"D6","S",,"126","Springfield, MA" +1,1,"Longley, Miss. Gretchen Fiske","female",21,0,0,"13502",77.9583,"D9","S","10",,"Hudson, NY" +1,0,"Loring, Mr. Joseph Holland","male",30,0,0,"113801",45.5000,,"S",,,"London / New York, NY" +1,1,"Lurette, Miss. Elise","female",58,0,0,"PC 17569",146.5208,"B80","C",,, +1,1,"Madill, Miss. Georgette Alexandra","female",15,0,1,"24160",211.3375,"B5","S","2",,"St Louis, MO" +1,0,"Maguire, Mr. John Edward","male",30,0,0,"110469",26.0000,"C106","S",,,"Brockton, MA" +1,1,"Maioni, Miss. Roberta","female",16,0,0,"110152",86.5000,"B79","S","8",, +1,1,"Marechal, Mr. Pierre","male",,0,0,"11774",29.7000,"C47","C","7",,"Paris, France" +1,0,"Marvin, Mr. Daniel Warner","male",19,1,0,"113773",53.1000,"D30","S",,,"New York, NY" +1,1,"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)","female",18,1,0,"113773",53.1000,"D30","S","10",,"New York, NY" +1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")","female",24,0,0,"PC 17482",49.5042,"C90","C","6",,"Belgium Montreal, PQ" +1,0,"McCaffry, Mr. Thomas Francis","male",46,0,0,"13050",75.2417,"C6","C",,"292","Vancouver, BC" +1,0,"McCarthy, Mr. Timothy J","male",54,0,0,"17463",51.8625,"E46","S",,"175","Dorchester, MA" +1,1,"McGough, Mr. James Robert","male",36,0,0,"PC 17473",26.2875,"E25","S","7",,"Philadelphia, PA" +1,0,"Meyer, Mr. Edgar Joseph","male",28,1,0,"PC 17604",82.1708,,"C",,,"New York, NY" +1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)","female",,1,0,"PC 17604",82.1708,,"C","6",,"New York, NY" +1,0,"Millet, Mr. Francis Davis","male",65,0,0,"13509",26.5500,"E38","S",,"249","East Bridgewater, MA" +1,0,"Minahan, Dr. William Edward","male",44,2,0,"19928",90.0000,"C78","Q",,"230","Fond du Lac, WI" +1,1,"Minahan, Miss. Daisy E","female",33,1,0,"19928",90.0000,"C78","Q","14",,"Green Bay, WI" +1,1,"Minahan, Mrs. William Edward (Lillian E Thorpe)","female",37,1,0,"19928",90.0000,"C78","Q","14",,"Fond du Lac, WI" +1,1,"Mock, Mr. Philipp Edmund","male",30,1,0,"13236",57.7500,"C78","C","11",,"New York, NY" +1,0,"Molson, Mr. Harry Markland","male",55,0,0,"113787",30.5000,"C30","S",,,"Montreal, PQ" +1,0,"Moore, Mr. Clarence Bloomfield","male",47,0,0,"113796",42.4000,,"S",,,"Washington, DC" +1,0,"Natsch, Mr. Charles H","male",37,0,1,"PC 17596",29.7000,"C118","C",,,"Brooklyn, NY" +1,1,"Newell, Miss. Madeleine","female",31,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" +1,1,"Newell, Miss. Marjorie","female",23,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" +1,0,"Newell, Mr. Arthur Webster","male",58,0,2,"35273",113.2750,"D48","C",,"122","Lexington, MA" +1,1,"Newsom, Miss. Helen Monypeny","female",19,0,2,"11752",26.2833,"D47","S","5",,"New York, NY" +1,0,"Nicholson, Mr. Arthur Ernest","male",64,0,0,"693",26.0000,,"S",,"263","Isle of Wight, England" +1,1,"Oliva y Ocana, Dona. Fermina","female",39,0,0,"PC 17758",108.9000,"C105","C","8",, +1,1,"Omont, Mr. Alfred Fernand","male",,0,0,"F.C. 12998",25.7417,,"C","7",,"Paris, France" +1,1,"Ostby, Miss. Helene Ragnhild","female",22,0,1,"113509",61.9792,"B36","C","5",,"Providence, RI" +1,0,"Ostby, Mr. Engelhart Cornelius","male",65,0,1,"113509",61.9792,"B30","C",,"234","Providence, RI" +1,0,"Ovies y Rodriguez, Mr. Servando","male",28.5,0,0,"PC 17562",27.7208,"D43","C",,"189","?Havana, Cuba" +1,0,"Parr, Mr. William Henry Marsh","male",,0,0,"112052",0.0000,,"S",,,"Belfast" +1,0,"Partner, Mr. Austen","male",45.5,0,0,"113043",28.5000,"C124","S",,"166","Surbiton Hill, Surrey" +1,0,"Payne, Mr. Vivian Ponsonby","male",23,0,0,"12749",93.5000,"B24","S",,,"Montreal, PQ" +1,0,"Pears, Mr. Thomas Clinton","male",29,1,0,"113776",66.6000,"C2","S",,,"Isleworth, England" +1,1,"Pears, Mrs. Thomas (Edith Wearne)","female",22,1,0,"113776",66.6000,"C2","S","8",,"Isleworth, England" +1,0,"Penasco y Castellana, Mr. Victor de Satode","male",18,1,0,"PC 17758",108.9000,"C65","C",,,"Madrid, Spain" +1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)","female",17,1,0,"PC 17758",108.9000,"C65","C","8",,"Madrid, Spain" +1,1,"Perreault, Miss. Anne","female",30,0,0,"12749",93.5000,"B73","S","3",, +1,1,"Peuchen, Major. Arthur Godfrey","male",52,0,0,"113786",30.5000,"C104","S","6",,"Toronto, ON" +1,0,"Porter, Mr. Walter Chamberlain","male",47,0,0,"110465",52.0000,"C110","S",,"207","Worcester, MA" +1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)","female",56,0,1,"11767",83.1583,"C50","C","7",,"Mt Airy, Philadelphia, PA" +1,0,"Reuchlin, Jonkheer. John George","male",38,0,0,"19972",0.0000,,"S",,,"Rotterdam, Netherlands" +1,1,"Rheims, Mr. George Alexander Lucien","male",,0,0,"PC 17607",39.6000,,"S","A",,"Paris / New York, NY" +1,0,"Ringhini, Mr. Sante","male",22,0,0,"PC 17760",135.6333,,"C",,"232", +1,0,"Robbins, Mr. Victor","male",,0,0,"PC 17757",227.5250,,"C",,, +1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)","female",43,0,1,"24160",211.3375,"B3","S","2",,"St Louis, MO" +1,0,"Roebling, Mr. Washington Augustus II","male",31,0,0,"PC 17590",50.4958,"A24","S",,,"Trenton, NJ" +1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")","male",45,0,0,"111428",26.5500,,"S","9",,"New York, NY" +1,0,"Rood, Mr. Hugh Roscoe","male",,0,0,"113767",50.0000,"A32","S",,,"Seattle, WA" +1,1,"Rosenbaum, Miss. Edith Louise","female",33,0,0,"PC 17613",27.7208,"A11","C","11",,"Paris, France" +1,0,"Rosenshine, Mr. George (""Mr George Thorne"")","male",46,0,0,"PC 17585",79.2000,,"C",,"16","New York, NY" +1,0,"Ross, Mr. John Hugo","male",36,0,0,"13049",40.1250,"A10","C",,,"Winnipeg, MB" +1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)","female",33,0,0,"110152",86.5000,"B77","S","8",,"London Vancouver, BC" +1,0,"Rothschild, Mr. Martin","male",55,1,0,"PC 17603",59.4000,,"C",,,"New York, NY" +1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)","female",54,1,0,"PC 17603",59.4000,,"C","6",,"New York, NY" +1,0,"Rowe, Mr. Alfred G","male",33,0,0,"113790",26.5500,,"S",,"109","London" +1,1,"Ryerson, Master. John Borie","male",13,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,1,"Ryerson, Miss. Emily Borie","female",18,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,1,"Ryerson, Miss. Susan Parker ""Suzette""","female",21,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,0,"Ryerson, Mr. Arthur Larned","male",61,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C",,,"Haverford, PA / Cooperstown, NY" +1,1,"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)","female",48,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,1,"Saalfeld, Mr. Adolphe","male",,0,0,"19988",30.5000,"C106","S","3",,"Manchester, England" +1,1,"Sagesser, Mlle. Emma","female",24,0,0,"PC 17477",69.3000,"B35","C","9",, +1,1,"Salomon, Mr. Abraham L","male",,0,0,"111163",26.0000,,"S","1",,"New York, NY" +1,1,"Schabert, Mrs. Paul (Emma Mock)","female",35,1,0,"13236",57.7500,"C28","C","11",,"New York, NY" +1,1,"Serepeca, Miss. Augusta","female",30,0,0,"113798",31.0000,,"C","4",, +1,1,"Seward, Mr. Frederic Kimber","male",34,0,0,"113794",26.5500,,"S","7",,"New York, NY" +1,1,"Shutes, Miss. Elizabeth W","female",40,0,0,"PC 17582",153.4625,"C125","S","3",,"New York, NY / Greenwich CT" +1,1,"Silverthorne, Mr. Spencer Victor","male",35,0,0,"PC 17475",26.2875,"E24","S","5",,"St Louis, MO" +1,0,"Silvey, Mr. William Baird","male",50,1,0,"13507",55.9000,"E44","S",,,"Duluth, MN" +1,1,"Silvey, Mrs. William Baird (Alice Munger)","female",39,1,0,"13507",55.9000,"E44","S","11",,"Duluth, MN" +1,1,"Simonius-Blumer, Col. Oberst Alfons","male",56,0,0,"13213",35.5000,"A26","C","3",,"Basel, Switzerland" +1,1,"Sloper, Mr. William Thompson","male",28,0,0,"113788",35.5000,"A6","S","7",,"New Britain, CT" +1,0,"Smart, Mr. John Montgomery","male",56,0,0,"113792",26.5500,,"S",,,"New York, NY" +1,0,"Smith, Mr. James Clinch","male",56,0,0,"17764",30.6958,"A7","C",,,"St James, Long Island, NY" +1,0,"Smith, Mr. Lucien Philip","male",24,1,0,"13695",60.0000,"C31","S",,,"Huntington, WV" +1,0,"Smith, Mr. Richard William","male",,0,0,"113056",26.0000,"A19","S",,,"Streatham, Surrey" +1,1,"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)","female",18,1,0,"13695",60.0000,"C31","S","6",,"Huntington, WV" +1,1,"Snyder, Mr. John Pillsbury","male",24,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" +1,1,"Snyder, Mrs. John Pillsbury (Nelle Stevenson)","female",23,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" +1,1,"Spedden, Master. Robert Douglas","male",6,0,2,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" +1,1,"Spedden, Mr. Frederic Oakley","male",45,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" +1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)","female",40,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" +1,0,"Spencer, Mr. William Augustus","male",57,1,0,"PC 17569",146.5208,"B78","C",,,"Paris, France" +1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)","female",,1,0,"PC 17569",146.5208,"B78","C","6",,"Paris, France" +1,1,"Stahelin-Maeglin, Dr. Max","male",32,0,0,"13214",30.5000,"B50","C","3",,"Basel, Switzerland" +1,0,"Stead, Mr. William Thomas","male",62,0,0,"113514",26.5500,"C87","S",,,"Wimbledon Park, London / Hayling Island, Hants" +1,1,"Stengel, Mr. Charles Emil Henry","male",54,1,0,"11778",55.4417,"C116","C","1",,"Newark, NJ" +1,1,"Stengel, Mrs. Charles Emil Henry (Annie May Morris)","female",43,1,0,"11778",55.4417,"C116","C","5",,"Newark, NJ" +1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)","female",52,1,0,"36947",78.2667,"D20","C","4",,"Haverford, PA" +1,0,"Stewart, Mr. Albert A","male",,0,0,"PC 17605",27.7208,,"C",,,"Gallipolis, Ohio / ? Paris / New York" +1,1,"Stone, Mrs. George Nelson (Martha Evelyn)","female",62,0,0,"113572",80.0000,"B28",,"6",,"Cincinatti, OH" +1,0,"Straus, Mr. Isidor","male",67,1,0,"PC 17483",221.7792,"C55 C57","S",,"96","New York, NY" +1,0,"Straus, Mrs. Isidor (Rosalie Ida Blun)","female",63,1,0,"PC 17483",221.7792,"C55 C57","S",,,"New York, NY" +1,0,"Sutton, Mr. Frederick","male",61,0,0,"36963",32.3208,"D50","S",,"46","Haddenfield, NJ" +1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)","female",48,0,0,"17466",25.9292,"D17","S","8",,"Brooklyn, NY" +1,1,"Taussig, Miss. Ruth","female",18,0,2,"110413",79.6500,"E68","S","8",,"New York, NY" +1,0,"Taussig, Mr. Emil","male",52,1,1,"110413",79.6500,"E67","S",,,"New York, NY" +1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)","female",39,1,1,"110413",79.6500,"E67","S","8",,"New York, NY" +1,1,"Taylor, Mr. Elmer Zebley","male",48,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" +1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)","female",,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" +1,0,"Thayer, Mr. John Borland","male",49,1,1,"17421",110.8833,"C68","C",,,"Haverford, PA" +1,1,"Thayer, Mr. John Borland Jr","male",17,0,2,"17421",110.8833,"C70","C","B",,"Haverford, PA" +1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)","female",39,1,1,"17421",110.8833,"C68","C","4",,"Haverford, PA" +1,1,"Thorne, Mrs. Gertrude Maybelle","female",,0,0,"PC 17585",79.2000,,"C","D",,"New York, NY" +1,1,"Tucker, Mr. Gilbert Milligan Jr","male",31,0,0,"2543",28.5375,"C53","C","7",,"Albany, NY" +1,0,"Uruchurtu, Don. Manuel E","male",40,0,0,"PC 17601",27.7208,,"C",,,"Mexico City, Mexico" +1,0,"Van der hoef, Mr. Wyckoff","male",61,0,0,"111240",33.5000,"B19","S",,"245","Brooklyn, NY" +1,0,"Walker, Mr. William Anderson","male",47,0,0,"36967",34.0208,"D46","S",,,"East Orange, NJ" +1,1,"Ward, Miss. Anna","female",35,0,0,"PC 17755",512.3292,,"C","3",, +1,0,"Warren, Mr. Frank Manley","male",64,1,0,"110813",75.2500,"D37","C",,,"Portland, OR" +1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)","female",60,1,0,"110813",75.2500,"D37","C","5",,"Portland, OR" +1,0,"Weir, Col. John","male",60,0,0,"113800",26.5500,,"S",,,"England Salt Lake City, Utah" +1,0,"White, Mr. Percival Wayland","male",54,0,1,"35281",77.2875,"D26","S",,,"Brunswick, ME" +1,0,"White, Mr. Richard Frasar","male",21,0,1,"35281",77.2875,"D26","S",,"169","Brunswick, ME" +1,1,"White, Mrs. John Stuart (Ella Holmes)","female",55,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Briarcliff Manor NY" +1,1,"Wick, Miss. Mary Natalie","female",31,0,2,"36928",164.8667,"C7","S","8",,"Youngstown, OH" +1,0,"Wick, Mr. George Dennick","male",57,1,1,"36928",164.8667,,"S",,,"Youngstown, OH" +1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)","female",45,1,1,"36928",164.8667,,"S","8",,"Youngstown, OH" +1,0,"Widener, Mr. George Dunton","male",50,1,1,"113503",211.5000,"C80","C",,,"Elkins Park, PA" +1,0,"Widener, Mr. Harry Elkins","male",27,0,2,"113503",211.5000,"C82","C",,,"Elkins Park, PA" +1,1,"Widener, Mrs. George Dunton (Eleanor Elkins)","female",50,1,1,"113503",211.5000,"C80","C","4",,"Elkins Park, PA" +1,1,"Willard, Miss. Constance","female",21,0,0,"113795",26.5500,,"S","8 10",,"Duluth, MN" +1,0,"Williams, Mr. Charles Duane","male",51,0,1,"PC 17597",61.3792,,"C",,,"Geneva, Switzerland / Radnor, PA" +1,1,"Williams, Mr. Richard Norris II","male",21,0,1,"PC 17597",61.3792,,"C","A",,"Geneva, Switzerland / Radnor, PA" +1,0,"Williams-Lambert, Mr. Fletcher Fellows","male",,0,0,"113510",35.0000,"C128","S",,,"London, England" +1,1,"Wilson, Miss. Helen Alice","female",31,0,0,"16966",134.5000,"E39 E41","C","3",, +1,1,"Woolner, Mr. Hugh","male",,0,0,"19947",35.5000,"C52","S","D",,"London, England" +1,0,"Wright, Mr. George","male",62,0,0,"113807",26.5500,,"S",,,"Halifax, NS" +1,1,"Young, Miss. Marie Grice","female",36,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Washington, DC" +2,0,"Abelson, Mr. Samuel","male",30,1,0,"P/PP 3381",24.0000,,"C",,,"Russia New York, NY" +2,1,"Abelson, Mrs. Samuel (Hannah Wizosky)","female",28,1,0,"P/PP 3381",24.0000,,"C","10",,"Russia New York, NY" +2,0,"Aldworth, Mr. Charles Augustus","male",30,0,0,"248744",13.0000,,"S",,,"Bryn Mawr, PA, USA" +2,0,"Andrew, Mr. Edgardo Samuel","male",18,0,0,"231945",11.5000,,"S",,,"Buenos Aires, Argentina / New Jersey, NJ" +2,0,"Andrew, Mr. Frank Thomas","male",25,0,0,"C.A. 34050",10.5000,,"S",,,"Cornwall, England Houghton, MI" +2,0,"Angle, Mr. William A","male",34,1,0,"226875",26.0000,,"S",,,"Warwick, England" +2,1,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)","female",36,1,0,"226875",26.0000,,"S","11",,"Warwick, England" +2,0,"Ashby, Mr. John","male",57,0,0,"244346",13.0000,,"S",,,"West Hoboken, NJ" +2,0,"Bailey, Mr. Percy Andrew","male",18,0,0,"29108",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" +2,0,"Baimbrigge, Mr. Charles Robert","male",23,0,0,"C.A. 31030",10.5000,,"S",,,"Guernsey" +2,1,"Ball, Mrs. (Ada E Hall)","female",36,0,0,"28551",13.0000,"D","S","10",,"Bristol, Avon / Jacksonville, FL" +2,0,"Banfield, Mr. Frederick James","male",28,0,0,"C.A./SOTON 34068",10.5000,,"S",,,"Plymouth, Dorset / Houghton, MI" +2,0,"Bateman, Rev. Robert James","male",51,0,0,"S.O.P. 1166",12.5250,,"S",,"174","Jacksonville, FL" +2,1,"Beane, Mr. Edward","male",32,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" +2,1,"Beane, Mrs. Edward (Ethel Clarke)","female",19,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" +2,0,"Beauchamp, Mr. Henry James","male",28,0,0,"244358",26.0000,,"S",,,"England" +2,1,"Becker, Master. Richard F","male",1,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" +2,1,"Becker, Miss. Marion Louise","female",4,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" +2,1,"Becker, Miss. Ruth Elizabeth","female",12,2,1,"230136",39.0000,"F4","S","13",,"Guntur, India / Benton Harbour, MI" +2,1,"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)","female",36,0,3,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" +2,1,"Beesley, Mr. Lawrence","male",34,0,0,"248698",13.0000,"D56","S","13",,"London" +2,1,"Bentham, Miss. Lilian W","female",19,0,0,"28404",13.0000,,"S","12",,"Rochester, NY" +2,0,"Berriman, Mr. William John","male",23,0,0,"28425",13.0000,,"S",,,"St Ives, Cornwall / Calumet, MI" +2,0,"Botsford, Mr. William Hull","male",26,0,0,"237670",13.0000,,"S",,,"Elmira, NY / Orange, NJ" +2,0,"Bowenur, Mr. Solomon","male",42,0,0,"211535",13.0000,,"S",,,"London" +2,0,"Bracken, Mr. James H","male",27,0,0,"220367",13.0000,,"S",,,"Lake Arthur, Chavez County, NM" +2,1,"Brown, Miss. Amelia ""Mildred""","female",24,0,0,"248733",13.0000,"F33","S","11",,"London / Montreal, PQ" +2,1,"Brown, Miss. Edith Eileen","female",15,0,2,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" +2,0,"Brown, Mr. Thomas William Solomon","male",60,1,1,"29750",39.0000,,"S",,,"Cape Town, South Africa / Seattle, WA" +2,1,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)","female",40,1,1,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" +2,1,"Bryhl, Miss. Dagmar Jenny Ingeborg ","female",20,1,0,"236853",26.0000,,"S","12",,"Skara, Sweden / Rockford, IL" +2,0,"Bryhl, Mr. Kurt Arnold Gottfrid","male",25,1,0,"236853",26.0000,,"S",,,"Skara, Sweden / Rockford, IL" +2,1,"Buss, Miss. Kate","female",36,0,0,"27849",13.0000,,"S","9",,"Sittingbourne, England / San Diego, CA" +2,0,"Butler, Mr. Reginald Fenton","male",25,0,0,"234686",13.0000,,"S",,"97","Southsea, Hants" +2,0,"Byles, Rev. Thomas Roussel Davids","male",42,0,0,"244310",13.0000,,"S",,,"London" +2,1,"Bystrom, Mrs. (Karolina)","female",42,0,0,"236852",13.0000,,"S",,,"New York, NY" +2,1,"Caldwell, Master. Alden Gates","male",0.83,0,2,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" +2,1,"Caldwell, Mr. Albert Francis","male",26,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" +2,1,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)","female",22,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" +2,1,"Cameron, Miss. Clear Annie","female",35,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" +2,0,"Campbell, Mr. William","male",,0,0,"239853",0.0000,,"S",,,"Belfast" +2,0,"Carbines, Mr. William","male",19,0,0,"28424",13.0000,,"S",,"18","St Ives, Cornwall / Calumet, MI" +2,0,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)","female",44,1,0,"244252",26.0000,,"S",,,"London" +2,0,"Carter, Rev. Ernest Courtenay","male",54,1,0,"244252",26.0000,,"S",,,"London" +2,0,"Chapman, Mr. Charles Henry","male",52,0,0,"248731",13.5000,,"S",,"130","Bronx, NY" +2,0,"Chapman, Mr. John Henry","male",37,1,0,"SC/AH 29037",26.0000,,"S",,"17","Cornwall / Spokane, WA" +2,0,"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)","female",29,1,0,"SC/AH 29037",26.0000,,"S",,,"Cornwall / Spokane, WA" +2,1,"Christy, Miss. Julie Rachel","female",25,1,1,"237789",30.0000,,"S","12",,"London" +2,1,"Christy, Mrs. (Alice Frances)","female",45,0,2,"237789",30.0000,,"S","12",,"London" +2,0,"Clarke, Mr. Charles Valentine","male",29,1,0,"2003",26.0000,,"S",,,"England / San Francisco, CA" +2,1,"Clarke, Mrs. Charles V (Ada Maria Winfield)","female",28,1,0,"2003",26.0000,,"S","14",,"England / San Francisco, CA" +2,0,"Coleridge, Mr. Reginald Charles","male",29,0,0,"W./C. 14263",10.5000,,"S",,,"Hartford, Huntingdonshire" +2,0,"Collander, Mr. Erik Gustaf","male",28,0,0,"248740",13.0000,,"S",,,"Helsinki, Finland Ashtabula, Ohio" +2,1,"Collett, Mr. Sidney C Stuart","male",24,0,0,"28034",10.5000,,"S","9",,"London / Fort Byron, NY" +2,1,"Collyer, Miss. Marjorie ""Lottie""","female",8,0,2,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" +2,0,"Collyer, Mr. Harvey","male",31,1,1,"C.A. 31921",26.2500,,"S",,,"Bishopstoke, Hants / Fayette Valley, ID" +2,1,"Collyer, Mrs. Harvey (Charlotte Annie Tate)","female",31,1,1,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" +2,1,"Cook, Mrs. (Selena Rogers)","female",22,0,0,"W./C. 14266",10.5000,"F33","S","14",,"Pennsylvania" +2,0,"Corbett, Mrs. Walter H (Irene Colvin)","female",30,0,0,"237249",13.0000,,"S",,,"Provo, UT" +2,0,"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)","female",,0,0,"F.C.C. 13534",21.0000,,"S",,,"Upper Burma, India Pittsburgh, PA" +2,0,"Cotterill, Mr. Henry ""Harry""","male",21,0,0,"29107",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" +2,0,"Cunningham, Mr. Alfred Fleming","male",,0,0,"239853",0.0000,,"S",,,"Belfast" +2,1,"Davies, Master. John Morgan Jr","male",8,1,1,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" +2,0,"Davies, Mr. Charles Henry","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"Lyndhurst, England" +2,1,"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ","female",48,0,2,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" +2,1,"Davis, Miss. Mary","female",28,0,0,"237668",13.0000,,"S","13",,"London / Staten Island, NY" +2,0,"de Brito, Mr. Jose Joaquim","male",32,0,0,"244360",13.0000,,"S",,,"Portugal / Sau Paulo, Brazil" +2,0,"Deacon, Mr. Percy William","male",17,0,0,"S.O.C. 14879",73.5000,,"S",,, +2,0,"del Carlo, Mr. Sebastiano","male",29,1,0,"SC/PARIS 2167",27.7208,,"C",,"295","Lucca, Italy / California" +2,1,"del Carlo, Mrs. Sebastiano (Argenia Genovesi)","female",24,1,0,"SC/PARIS 2167",27.7208,,"C","12",,"Lucca, Italy / California" +2,0,"Denbury, Mr. Herbert","male",25,0,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Dibden, Mr. William","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" +2,1,"Doling, Miss. Elsie","female",18,0,1,"231919",23.0000,,"S",,,"Southampton" +2,1,"Doling, Mrs. John T (Ada Julia Bone)","female",34,0,1,"231919",23.0000,,"S",,,"Southampton" +2,0,"Downton, Mr. William James","male",54,0,0,"28403",26.0000,,"S",,,"Holley, NY" +2,1,"Drew, Master. Marshall Brines","male",8,0,2,"28220",32.5000,,"S","10",,"Greenport, NY" +2,0,"Drew, Mr. James Vivian","male",42,1,1,"28220",32.5000,,"S",,,"Greenport, NY" +2,1,"Drew, Mrs. James Vivian (Lulu Thorne Christian)","female",34,1,1,"28220",32.5000,,"S","10",,"Greenport, NY" +2,1,"Duran y More, Miss. Asuncion","female",27,1,0,"SC/PARIS 2149",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" +2,1,"Duran y More, Miss. Florentina","female",30,1,0,"SC/PARIS 2148",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" +2,0,"Eitemiller, Mr. George Floyd","male",23,0,0,"29751",13.0000,,"S",,,"England / Detroit, MI" +2,0,"Enander, Mr. Ingvar","male",21,0,0,"236854",13.0000,,"S",,,"Goteborg, Sweden / Rockford, IL" +2,0,"Fahlstrom, Mr. Arne Jonas","male",18,0,0,"236171",13.0000,,"S",,,"Oslo, Norway Bayonne, NJ" +2,0,"Faunthorpe, Mr. Harry","male",40,1,0,"2926",26.0000,,"S",,"286","England / Philadelphia, PA" +2,1,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)","female",29,1,0,"2926",26.0000,,"S","16",, +2,0,"Fillbrook, Mr. Joseph Charles","male",18,0,0,"C.A. 15185",10.5000,,"S",,,"Cornwall / Houghton, MI" +2,0,"Fox, Mr. Stanley Hubert","male",36,0,0,"229236",13.0000,,"S",,"236","Rochester, NY" +2,0,"Frost, Mr. Anthony Wood ""Archie""","male",,0,0,"239854",0.0000,,"S",,,"Belfast" +2,0,"Funk, Miss. Annie Clemmer","female",38,0,0,"237671",13.0000,,"S",,,"Janjgir, India / Pennsylvania" +2,0,"Fynney, Mr. Joseph J","male",35,0,0,"239865",26.0000,,"S",,"322","Liverpool / Montreal, PQ" +2,0,"Gale, Mr. Harry","male",38,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" +2,0,"Gale, Mr. Shadrach","male",34,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" +2,1,"Garside, Miss. Ethel","female",34,0,0,"243880",13.0000,,"S","12",,"Brooklyn, NY" +2,0,"Gaskell, Mr. Alfred","male",16,0,0,"239865",26.0000,,"S",,,"Liverpool / Montreal, PQ" +2,0,"Gavey, Mr. Lawrence","male",26,0,0,"31028",10.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Gilbert, Mr. William","male",47,0,0,"C.A. 30769",10.5000,,"S",,,"Cornwall" +2,0,"Giles, Mr. Edgar","male",21,1,0,"28133",11.5000,,"S",,,"Cornwall / Camden, NJ" +2,0,"Giles, Mr. Frederick Edward","male",21,1,0,"28134",11.5000,,"S",,,"Cornwall / Camden, NJ" +2,0,"Giles, Mr. Ralph","male",24,0,0,"248726",13.5000,,"S",,"297","West Kensington, London" +2,0,"Gill, Mr. John William","male",24,0,0,"233866",13.0000,,"S",,"155","Clevedon, England" +2,0,"Gillespie, Mr. William Henry","male",34,0,0,"12233",13.0000,,"S",,,"Vancouver, BC" +2,0,"Givard, Mr. Hans Kristensen","male",30,0,0,"250646",13.0000,,"S",,"305", +2,0,"Greenberg, Mr. Samuel","male",52,0,0,"250647",13.0000,,"S",,"19","Bronx, NY" +2,0,"Hale, Mr. Reginald","male",30,0,0,"250653",13.0000,,"S",,"75","Auburn, NY" +2,1,"Hamalainen, Master. Viljo","male",0.67,1,1,"250649",14.5000,,"S","4",,"Detroit, MI" +2,1,"Hamalainen, Mrs. William (Anna)","female",24,0,2,"250649",14.5000,,"S","4",,"Detroit, MI" +2,0,"Harbeck, Mr. William H","male",44,0,0,"248746",13.0000,,"S",,"35","Seattle, WA / Toledo, OH" +2,1,"Harper, Miss. Annie Jessie ""Nina""","female",6,0,1,"248727",33.0000,,"S","11",,"Denmark Hill, Surrey / Chicago" +2,0,"Harper, Rev. John","male",28,0,1,"248727",33.0000,,"S",,,"Denmark Hill, Surrey / Chicago" +2,1,"Harris, Mr. George","male",62,0,0,"S.W./PP 752",10.5000,,"S","15",,"London" +2,0,"Harris, Mr. Walter","male",30,0,0,"W/C 14208",10.5000,,"S",,,"Walthamstow, England" +2,1,"Hart, Miss. Eva Miriam","female",7,0,2,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" +2,0,"Hart, Mr. Benjamin","male",43,1,1,"F.C.C. 13529",26.2500,,"S",,,"Ilford, Essex / Winnipeg, MB" +2,1,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)","female",45,1,1,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" +2,1,"Herman, Miss. Alice","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" +2,1,"Herman, Miss. Kate","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" +2,0,"Herman, Mr. Samuel","male",49,1,2,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" +2,1,"Herman, Mrs. Samuel (Jane Laver)","female",48,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" +2,1,"Hewlett, Mrs. (Mary D Kingcome) ","female",55,0,0,"248706",16.0000,,"S","13",,"India / Rapid City, SD" +2,0,"Hickman, Mr. Leonard Mark","male",24,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" +2,0,"Hickman, Mr. Lewis","male",32,2,0,"S.O.C. 14879",73.5000,,"S",,"256","West Hampstead, London / Neepawa, MB" +2,0,"Hickman, Mr. Stanley George","male",21,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" +2,0,"Hiltunen, Miss. Marta","female",18,1,1,"250650",13.0000,,"S",,,"Kontiolahti, Finland / Detroit, MI" +2,1,"Hocking, Miss. Ellen ""Nellie""","female",20,2,1,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" +2,0,"Hocking, Mr. Richard George","male",23,2,1,"29104",11.5000,,"S",,,"Cornwall / Akron, OH" +2,0,"Hocking, Mr. Samuel James Metcalfe","male",36,0,0,"242963",13.0000,,"S",,,"Devonport, England" +2,1,"Hocking, Mrs. Elizabeth (Eliza Needs)","female",54,1,3,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" +2,0,"Hodges, Mr. Henry Price","male",50,0,0,"250643",13.0000,,"S",,"149","Southampton" +2,0,"Hold, Mr. Stephen","male",44,1,0,"26707",26.0000,,"S",,,"England / Sacramento, CA" +2,1,"Hold, Mrs. Stephen (Annie Margaret Hill)","female",29,1,0,"26707",26.0000,,"S","10",,"England / Sacramento, CA" +2,0,"Hood, Mr. Ambrose Jr","male",21,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" +2,1,"Hosono, Mr. Masabumi","male",42,0,0,"237798",13.0000,,"S","10",,"Tokyo, Japan" +2,0,"Howard, Mr. Benjamin","male",63,1,0,"24065",26.0000,,"S",,,"Swindon, England" +2,0,"Howard, Mrs. Benjamin (Ellen Truelove Arman)","female",60,1,0,"24065",26.0000,,"S",,,"Swindon, England" +2,0,"Hunt, Mr. George Henry","male",33,0,0,"SCO/W 1585",12.2750,,"S",,,"Philadelphia, PA" +2,1,"Ilett, Miss. Bertha","female",17,0,0,"SO/C 14885",10.5000,,"S",,,"Guernsey" +2,0,"Jacobsohn, Mr. Sidney Samuel","male",42,1,0,"243847",27.0000,,"S",,,"London" +2,1,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)","female",24,2,1,"243847",27.0000,,"S","12",,"London" +2,0,"Jarvis, Mr. John Denzil","male",47,0,0,"237565",15.0000,,"S",,,"North Evington, England" +2,0,"Jefferys, Mr. Clifford Thomas","male",24,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Jefferys, Mr. Ernest Wilfred","male",22,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Jenkin, Mr. Stephen Curnow","male",32,0,0,"C.A. 33111",10.5000,,"S",,,"St Ives, Cornwall / Houghton, MI" +2,1,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)","female",23,0,0,"SC/AH Basle 541",13.7917,"D","C","11",,"New York, NY" +2,0,"Kantor, Mr. Sinai","male",34,1,0,"244367",26.0000,,"S",,"283","Moscow / Bronx, NY" +2,1,"Kantor, Mrs. Sinai (Miriam Sternin)","female",24,1,0,"244367",26.0000,,"S","12",,"Moscow / Bronx, NY" +2,0,"Karnes, Mrs. J Frank (Claire Bennett)","female",22,0,0,"F.C.C. 13534",21.0000,,"S",,,"India / Pittsburgh, PA" +2,1,"Keane, Miss. Nora A","female",,0,0,"226593",12.3500,"E101","Q","10",,"Harrisburg, PA" +2,0,"Keane, Mr. Daniel","male",35,0,0,"233734",12.3500,,"Q",,, +2,1,"Kelly, Mrs. Florence ""Fannie""","female",45,0,0,"223596",13.5000,,"S","9",,"London / New York, NY" +2,0,"Kirkland, Rev. Charles Leonard","male",57,0,0,"219533",12.3500,,"Q",,,"Glasgow / Bangor, ME" +2,0,"Knight, Mr. Robert J","male",,0,0,"239855",0.0000,,"S",,,"Belfast" +2,0,"Kvillner, Mr. Johan Henrik Johannesson","male",31,0,0,"C.A. 18723",10.5000,,"S",,"165","Sweden / Arlington, NJ" +2,0,"Lahtinen, Mrs. William (Anna Sylfven)","female",26,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" +2,0,"Lahtinen, Rev. William","male",30,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" +2,0,"Lamb, Mr. John Joseph","male",,0,0,"240261",10.7083,,"Q",,, +2,1,"Laroche, Miss. Louise","female",1,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" +2,1,"Laroche, Miss. Simonne Marie Anne Andree","female",3,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" +2,0,"Laroche, Mr. Joseph Philippe Lemercier","male",25,1,2,"SC/Paris 2123",41.5792,,"C",,,"Paris / Haiti" +2,1,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)","female",22,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" +2,1,"Lehmann, Miss. Bertha","female",17,0,0,"SC 1748",12.0000,,"C","12",,"Berne, Switzerland / Central City, IA" +2,1,"Leitch, Miss. Jessie Wills","female",,0,0,"248727",33.0000,,"S","11",,"London / Chicago, IL" +2,1,"Lemore, Mrs. (Amelia Milley)","female",34,0,0,"C.A. 34260",10.5000,"F33","S","14",,"Chicago, IL" +2,0,"Levy, Mr. Rene Jacques","male",36,0,0,"SC/Paris 2163",12.8750,"D","C",,,"Montreal, PQ" +2,0,"Leyson, Mr. Robert William Norman","male",24,0,0,"C.A. 29566",10.5000,,"S",,"108", +2,0,"Lingane, Mr. John","male",61,0,0,"235509",12.3500,,"Q",,, +2,0,"Louch, Mr. Charles Alexander","male",50,1,0,"SC/AH 3085",26.0000,,"S",,"121","Weston-Super-Mare, Somerset" +2,1,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)","female",42,1,0,"SC/AH 3085",26.0000,,"S",,,"Weston-Super-Mare, Somerset" +2,0,"Mack, Mrs. (Mary)","female",57,0,0,"S.O./P.P. 3",10.5000,"E77","S",,"52","Southampton / New York, NY" +2,0,"Malachard, Mr. Noel","male",,0,0,"237735",15.0458,"D","C",,,"Paris" +2,1,"Mallet, Master. Andre","male",1,0,2,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" +2,0,"Mallet, Mr. Albert","male",31,1,1,"S.C./PARIS 2079",37.0042,,"C",,,"Paris / Montreal, PQ" +2,1,"Mallet, Mrs. Albert (Antoinette Magnin)","female",24,1,1,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" +2,0,"Mangiavacchi, Mr. Serafino Emilio","male",,0,0,"SC/A.3 2861",15.5792,,"C",,,"New York, NY" +2,0,"Matthews, Mr. William John","male",30,0,0,"28228",13.0000,,"S",,,"St Austall, Cornwall" +2,0,"Maybery, Mr. Frank Hubert","male",40,0,0,"239059",16.0000,,"S",,,"Weston-Super-Mare / Moose Jaw, SK" +2,0,"McCrae, Mr. Arthur Gordon","male",32,0,0,"237216",13.5000,,"S",,"209","Sydney, Australia" +2,0,"McCrie, Mr. James Matthew","male",30,0,0,"233478",13.0000,,"S",,,"Sarnia, ON" +2,0,"McKane, Mr. Peter David","male",46,0,0,"28403",26.0000,,"S",,,"Rochester, NY" +2,1,"Mellinger, Miss. Madeleine Violet","female",13,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" +2,1,"Mellinger, Mrs. (Elizabeth Anne Maidment)","female",41,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" +2,1,"Mellors, Mr. William John","male",19,0,0,"SW/PP 751",10.5000,,"S","B",,"Chelsea, London" +2,0,"Meyer, Mr. August","male",39,0,0,"248723",13.0000,,"S",,,"Harrow-on-the-Hill, Middlesex" +2,0,"Milling, Mr. Jacob Christian","male",48,0,0,"234360",13.0000,,"S",,"271","Copenhagen, Denmark" +2,0,"Mitchell, Mr. Henry Michael","male",70,0,0,"C.A. 24580",10.5000,,"S",,,"Guernsey / Montclair, NJ and/or Toledo, Ohio" +2,0,"Montvila, Rev. Juozas","male",27,0,0,"211536",13.0000,,"S",,,"Worcester, MA" +2,0,"Moraweck, Dr. Ernest","male",54,0,0,"29011",14.0000,,"S",,,"Frankfort, KY" +2,0,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")","male",39,0,0,"250655",26.0000,,"S",,, +2,0,"Mudd, Mr. Thomas Charles","male",16,0,0,"S.O./P.P. 3",10.5000,,"S",,,"Halesworth, England" +2,0,"Myles, Mr. Thomas Francis","male",62,0,0,"240276",9.6875,,"Q",,,"Cambridge, MA" +2,0,"Nasser, Mr. Nicholas","male",32.5,1,0,"237736",30.0708,,"C",,"43","New York, NY" +2,1,"Nasser, Mrs. Nicholas (Adele Achem)","female",14,1,0,"237736",30.0708,,"C",,,"New York, NY" +2,1,"Navratil, Master. Edmond Roger","male",2,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" +2,1,"Navratil, Master. Michel M","male",3,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" +2,0,"Navratil, Mr. Michel (""Louis M Hoffman"")","male",36.5,0,2,"230080",26.0000,"F2","S",,"15","Nice, France" +2,0,"Nesson, Mr. Israel","male",26,0,0,"244368",13.0000,"F2","S",,,"Boston, MA" +2,0,"Nicholls, Mr. Joseph Charles","male",19,1,1,"C.A. 33112",36.7500,,"S",,"101","Cornwall / Hancock, MI" +2,0,"Norman, Mr. Robert Douglas","male",28,0,0,"218629",13.5000,,"S",,"287","Glasgow" +2,1,"Nourney, Mr. Alfred (""Baron von Drachstedt"")","male",20,0,0,"SC/PARIS 2166",13.8625,"D38","C","7",,"Cologne, Germany" +2,1,"Nye, Mrs. (Elizabeth Ramell)","female",29,0,0,"C.A. 29395",10.5000,"F33","S","11",,"Folkstone, Kent / New York, NY" +2,0,"Otter, Mr. Richard","male",39,0,0,"28213",13.0000,,"S",,,"Middleburg Heights, OH" +2,1,"Oxenham, Mr. Percy Thomas","male",22,0,0,"W./C. 14260",10.5000,,"S","13",,"Pondersend, England / New Durham, NJ" +2,1,"Padro y Manent, Mr. Julian","male",,0,0,"SC/PARIS 2146",13.8625,,"C","9",,"Spain / Havana, Cuba" +2,0,"Pain, Dr. Alfred","male",23,0,0,"244278",10.5000,,"S",,,"Hamilton, ON" +2,1,"Pallas y Castello, Mr. Emilio","male",29,0,0,"SC/PARIS 2147",13.8583,,"C","9",,"Spain / Havana, Cuba" +2,0,"Parker, Mr. Clifford Richard","male",28,0,0,"SC 14888",10.5000,,"S",,,"St Andrews, Guernsey" +2,0,"Parkes, Mr. Francis ""Frank""","male",,0,0,"239853",0.0000,,"S",,,"Belfast" +2,1,"Parrish, Mrs. (Lutie Davis)","female",50,0,1,"230433",26.0000,,"S","12",,"Woodford County, KY" +2,0,"Pengelly, Mr. Frederick William","male",19,0,0,"28665",10.5000,,"S",,,"Gunnislake, England / Butte, MT" +2,0,"Pernot, Mr. Rene","male",,0,0,"SC/PARIS 2131",15.0500,,"C",,, +2,0,"Peruschitz, Rev. Joseph Maria","male",41,0,0,"237393",13.0000,,"S",,, +2,1,"Phillips, Miss. Alice Frances Louisa","female",21,0,1,"S.O./P.P. 2",21.0000,,"S","12",,"Ilfracombe, Devon" +2,1,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")","female",19,0,0,"250655",26.0000,,"S","11",,"Worcester, England" +2,0,"Phillips, Mr. Escott Robert","male",43,0,1,"S.O./P.P. 2",21.0000,,"S",,,"Ilfracombe, Devon" +2,1,"Pinsky, Mrs. (Rosa)","female",32,0,0,"234604",13.0000,,"S","9",,"Russia" +2,0,"Ponesell, Mr. Martin","male",34,0,0,"250647",13.0000,,"S",,,"Denmark / New York, NY" +2,1,"Portaluppi, Mr. Emilio Ilario Giuseppe","male",30,0,0,"C.A. 34644",12.7375,,"C","14",,"Milford, NH" +2,0,"Pulbaum, Mr. Franz","male",27,0,0,"SC/PARIS 2168",15.0333,,"C",,,"Paris" +2,1,"Quick, Miss. Phyllis May","female",2,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" +2,1,"Quick, Miss. Winifred Vera","female",8,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" +2,1,"Quick, Mrs. Frederick Charles (Jane Richards)","female",33,0,2,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" +2,0,"Reeves, Mr. David","male",36,0,0,"C.A. 17248",10.5000,,"S",,,"Brighton, Sussex" +2,0,"Renouf, Mr. Peter Henry","male",34,1,0,"31027",21.0000,,"S","12",,"Elizabeth, NJ" +2,1,"Renouf, Mrs. Peter Henry (Lillian Jefferys)","female",30,3,0,"31027",21.0000,,"S",,,"Elizabeth, NJ" +2,1,"Reynaldo, Ms. Encarnacion","female",28,0,0,"230434",13.0000,,"S","9",,"Spain" +2,0,"Richard, Mr. Emile","male",23,0,0,"SC/PARIS 2133",15.0458,,"C",,,"Paris / Montreal, PQ" +2,1,"Richards, Master. George Sibley","male",0.83,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" +2,1,"Richards, Master. William Rowe","male",3,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" +2,1,"Richards, Mrs. Sidney (Emily Hocking)","female",24,2,3,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" +2,1,"Ridsdale, Miss. Lucy","female",50,0,0,"W./C. 14258",10.5000,,"S","13",,"London, England / Marietta, Ohio and Milwaukee, WI" +2,0,"Rogers, Mr. Reginald Harry","male",19,0,0,"28004",10.5000,,"S",,, +2,1,"Rugg, Miss. Emily","female",21,0,0,"C.A. 31026",10.5000,,"S","12",,"Guernsey / Wilmington, DE" +2,0,"Schmidt, Mr. August","male",26,0,0,"248659",13.0000,,"S",,,"Newark, NJ" +2,0,"Sedgwick, Mr. Charles Frederick Waddington","male",25,0,0,"244361",13.0000,,"S",,,"Liverpool" +2,0,"Sharp, Mr. Percival James R","male",27,0,0,"244358",26.0000,,"S",,,"Hornsey, England" +2,1,"Shelley, Mrs. William (Imanita Parrish Hall)","female",25,0,1,"230433",26.0000,,"S","12",,"Deer Lodge, MT" +2,1,"Silven, Miss. Lyyli Karoliina","female",18,0,2,"250652",13.0000,,"S","16",,"Finland / Minneapolis, MN" +2,1,"Sincock, Miss. Maude","female",20,0,0,"C.A. 33112",36.7500,,"S","11",,"Cornwall / Hancock, MI" +2,1,"Sinkkonen, Miss. Anna","female",30,0,0,"250648",13.0000,,"S","10",,"Finland / Washington, DC" +2,0,"Sjostedt, Mr. Ernst Adolf","male",59,0,0,"237442",13.5000,,"S",,,"Sault St Marie, ON" +2,1,"Slayter, Miss. Hilda Mary","female",30,0,0,"234818",12.3500,,"Q","13",,"Halifax, NS" +2,0,"Slemen, Mr. Richard James","male",35,0,0,"28206",10.5000,,"S",,,"Cornwall" +2,1,"Smith, Miss. Marion Elsie","female",40,0,0,"31418",13.0000,,"S","9",, +2,0,"Sobey, Mr. Samuel James Hayden","male",25,0,0,"C.A. 29178",13.0000,,"S",,,"Cornwall / Houghton, MI" +2,0,"Stanton, Mr. Samuel Ward","male",41,0,0,"237734",15.0458,,"C",,,"New York, NY" +2,0,"Stokes, Mr. Philip Joseph","male",25,0,0,"F.C.C. 13540",10.5000,,"S",,"81","Catford, Kent / Detroit, MI" +2,0,"Swane, Mr. George","male",18.5,0,0,"248734",13.0000,"F","S",,"294", +2,0,"Sweet, Mr. George Frederick","male",14,0,0,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" +2,1,"Toomey, Miss. Ellen","female",50,0,0,"F.C.C. 13531",10.5000,,"S","9",,"Indianapolis, IN" +2,0,"Troupiansky, Mr. Moses Aaron","male",23,0,0,"233639",13.0000,,"S",,, +2,1,"Trout, Mrs. William H (Jessie L)","female",28,0,0,"240929",12.6500,,"S",,,"Columbus, OH" +2,1,"Troutt, Miss. Edwina Celia ""Winnie""","female",27,0,0,"34218",10.5000,"E101","S","16",,"Bath, England / Massachusetts" +2,0,"Turpin, Mr. William John Robert","male",29,1,0,"11668",21.0000,,"S",,,"Plymouth, England" +2,0,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)","female",27,1,0,"11668",21.0000,,"S",,,"Plymouth, England" +2,0,"Veal, Mr. James","male",40,0,0,"28221",13.0000,,"S",,,"Barre, Co Washington, VT" +2,1,"Walcroft, Miss. Nellie","female",31,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" +2,0,"Ware, Mr. John James","male",30,1,0,"CA 31352",21.0000,,"S",,,"Bristol, England / New Britain, CT" +2,0,"Ware, Mr. William Jeffery","male",23,1,0,"28666",10.5000,,"S",,, +2,1,"Ware, Mrs. John James (Florence Louise Long)","female",31,0,0,"CA 31352",21.0000,,"S","10",,"Bristol, England / New Britain, CT" +2,0,"Watson, Mr. Ennis Hastings","male",,0,0,"239856",0.0000,,"S",,,"Belfast" +2,1,"Watt, Miss. Bertha J","female",12,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" +2,1,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)","female",40,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" +2,1,"Webber, Miss. Susan","female",32.5,0,0,"27267",13.0000,"E101","S","12",,"England / Hartford, CT" +2,0,"Weisz, Mr. Leopold","male",27,1,0,"228414",26.0000,,"S",,"293","Bromsgrove, England / Montreal, PQ" +2,1,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)","female",29,1,0,"228414",26.0000,,"S","10",,"Bromsgrove, England / Montreal, PQ" +2,1,"Wells, Master. Ralph Lester","male",2,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" +2,1,"Wells, Miss. Joan","female",4,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" +2,1,"Wells, Mrs. Arthur Henry (""Addie"" Dart Trevaskis)","female",29,0,2,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" +2,1,"West, Miss. Barbara J","female",0.92,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" +2,1,"West, Miss. Constance Mirium","female",5,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" +2,0,"West, Mr. Edwy Arthur","male",36,1,2,"C.A. 34651",27.7500,,"S",,,"Bournmouth, England" +2,1,"West, Mrs. Edwy Arthur (Ada Mary Worth)","female",33,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" +2,0,"Wheadon, Mr. Edward H","male",66,0,0,"C.A. 24579",10.5000,,"S",,,"Guernsey, England / Edgewood, RI" +2,0,"Wheeler, Mr. Edwin ""Frederick""","male",,0,0,"SC/PARIS 2159",12.8750,,"S",,, +2,1,"Wilhelms, Mr. Charles","male",31,0,0,"244270",13.0000,,"S","9",,"London, England" +2,1,"Williams, Mr. Charles Eugene","male",,0,0,"244373",13.0000,,"S","14",,"Harrow, England" +2,1,"Wright, Miss. Marion","female",26,0,0,"220844",13.5000,,"S","9",,"Yoevil, England / Cottage Grove, OR" +2,0,"Yrois, Miss. Henriette (""Mrs Harbeck"")","female",24,0,0,"248747",13.0000,,"S",,,"Paris" +3,0,"Abbing, Mr. Anthony","male",42,0,0,"C.A. 5547",7.5500,,"S",,, +3,0,"Abbott, Master. Eugene Joseph","male",13,0,2,"C.A. 2673",20.2500,,"S",,,"East Providence, RI" +3,0,"Abbott, Mr. Rossmore Edward","male",16,1,1,"C.A. 2673",20.2500,,"S",,"190","East Providence, RI" +3,1,"Abbott, Mrs. Stanton (Rosa Hunt)","female",35,1,1,"C.A. 2673",20.2500,,"S","A",,"East Providence, RI" +3,1,"Abelseth, Miss. Karen Marie","female",16,0,0,"348125",7.6500,,"S","16",,"Norway Los Angeles, CA" +3,1,"Abelseth, Mr. Olaus Jorgensen","male",25,0,0,"348122",7.6500,"F G63","S","A",,"Perkins County, SD" +3,1,"Abrahamsson, Mr. Abraham August Johannes","male",20,0,0,"SOTON/O2 3101284",7.9250,,"S","15",,"Taalintehdas, Finland Hoboken, NJ" +3,1,"Abrahim, Mrs. Joseph (Sophie Halaut Easu)","female",18,0,0,"2657",7.2292,,"C","C",,"Greensburg, PA" +3,0,"Adahl, Mr. Mauritz Nils Martin","male",30,0,0,"C 7076",7.2500,,"S",,"72","Asarum, Sweden Brooklyn, NY" +3,0,"Adams, Mr. John","male",26,0,0,"341826",8.0500,,"S",,"103","Bournemouth, England" +3,0,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)","female",40,1,0,"7546",9.4750,,"S",,,"Sweden Akeley, MN" +3,1,"Aks, Master. Philip Frank","male",0.83,0,1,"392091",9.3500,,"S","11",,"London, England Norfolk, VA" +3,1,"Aks, Mrs. Sam (Leah Rosen)","female",18,0,1,"392091",9.3500,,"S","13",,"London, England Norfolk, VA" +3,1,"Albimona, Mr. Nassef Cassem","male",26,0,0,"2699",18.7875,,"C","15",,"Syria Fredericksburg, VA" +3,0,"Alexander, Mr. William","male",26,0,0,"3474",7.8875,,"S",,,"England Albion, NY" +3,0,"Alhomaki, Mr. Ilmari Rudolf","male",20,0,0,"SOTON/O2 3101287",7.9250,,"S",,,"Salo, Finland Astoria, OR" +3,0,"Ali, Mr. Ahmed","male",24,0,0,"SOTON/O.Q. 3101311",7.0500,,"S",,, +3,0,"Ali, Mr. William","male",25,0,0,"SOTON/O.Q. 3101312",7.0500,,"S",,"79","Argentina" +3,0,"Allen, Mr. William Henry","male",35,0,0,"373450",8.0500,,"S",,,"Lower Clapton, Middlesex or Erdington, Birmingham" +3,0,"Allum, Mr. Owen George","male",18,0,0,"2223",8.3000,,"S",,"259","Windsor, England New York, NY" +3,0,"Andersen, Mr. Albert Karvin","male",32,0,0,"C 4001",22.5250,,"S",,"260","Bergen, Norway" +3,1,"Andersen-Jensen, Miss. Carla Christine Nielsine","female",19,1,0,"350046",7.8542,,"S","16",, +3,0,"Andersson, Master. Sigvard Harald Elias","male",4,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Miss. Ebba Iris Alfrida","female",6,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Miss. Ellis Anna Maria","female",2,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,1,"Andersson, Miss. Erna Alexandra","female",17,4,2,"3101281",7.9250,,"S","D",,"Ruotsinphyhtaa, Finland New York, NY" +3,0,"Andersson, Miss. Ida Augusta Margareta","female",38,4,2,"347091",7.7750,,"S",,,"Vadsbro, Sweden Ministee, MI" +3,0,"Andersson, Miss. Ingeborg Constanzia","female",9,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Miss. Sigrid Elisabeth","female",11,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Mr. Anders Johan","male",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,1,"Andersson, Mr. August Edvard (""Wennerstrom"")","male",27,0,0,"350043",7.7958,,"S","A",, +3,0,"Andersson, Mr. Johan Samuel","male",26,0,0,"347075",7.7750,,"S",,,"Hartford, CT" +3,0,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)","female",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andreasson, Mr. Paul Edvin","male",20,0,0,"347466",7.8542,,"S",,,"Sweden Chicago, IL" +3,0,"Angheloff, Mr. Minko","male",26,0,0,"349202",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Arnold-Franchi, Mr. Josef","male",25,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" +3,0,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)","female",18,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" +3,0,"Aronsson, Mr. Ernst Axel Algot","male",24,0,0,"349911",7.7750,,"S",,,"Sweden Joliet, IL" +3,0,"Asim, Mr. Adola","male",35,0,0,"SOTON/O.Q. 3101310",7.0500,,"S",,, +3,0,"Asplund, Master. Carl Edgar","male",5,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" +3,0,"Asplund, Master. Clarence Gustaf Hugo","male",9,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" +3,1,"Asplund, Master. Edvin Rojj Felix","male",3,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" +3,0,"Asplund, Master. Filip Oscar","male",13,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" +3,1,"Asplund, Miss. Lillian Gertrud","female",5,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" +3,0,"Asplund, Mr. Carl Oscar Vilhelm Gustafsson","male",40,1,5,"347077",31.3875,,"S",,"142","Sweden Worcester, MA" +3,1,"Asplund, Mr. Johan Charles","male",23,0,0,"350054",7.7958,,"S","13",,"Oskarshamn, Sweden Minneapolis, MN" +3,1,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)","female",38,1,5,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" +3,1,"Assaf Khalil, Mrs. Mariana (""Miriam"")","female",45,0,0,"2696",7.2250,,"C","C",,"Ottawa, ON" +3,0,"Assaf, Mr. Gerios","male",21,0,0,"2692",7.2250,,"C",,,"Ottawa, ON" +3,0,"Assam, Mr. Ali","male",23,0,0,"SOTON/O.Q. 3101309",7.0500,,"S",,, +3,0,"Attalah, Miss. Malake","female",17,0,0,"2627",14.4583,,"C",,, +3,0,"Attalah, Mr. Sleiman","male",30,0,0,"2694",7.2250,,"C",,,"Ottawa, ON" +3,0,"Augustsson, Mr. Albert","male",23,0,0,"347468",7.8542,,"S",,,"Krakoryd, Sweden Bloomington, IL" +3,1,"Ayoub, Miss. Banoura","female",13,0,0,"2687",7.2292,,"C","C",,"Syria Youngstown, OH" +3,0,"Baccos, Mr. Raffull","male",20,0,0,"2679",7.2250,,"C",,, +3,0,"Backstrom, Mr. Karl Alfred","male",32,1,0,"3101278",15.8500,,"S","D",,"Ruotsinphytaa, Finland New York, NY" +3,1,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)","female",33,3,0,"3101278",15.8500,,"S",,,"Ruotsinphytaa, Finland New York, NY" +3,1,"Baclini, Miss. Eugenie","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Baclini, Miss. Helene Barbara","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Baclini, Miss. Marie Catherine","female",5,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Baclini, Mrs. Solomon (Latifa Qurban)","female",24,0,3,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Badman, Miss. Emily Louisa","female",18,0,0,"A/4 31416",8.0500,,"S","C",,"London Skanteales, NY" +3,0,"Badt, Mr. Mohamed","male",40,0,0,"2623",7.2250,,"C",,, +3,0,"Balkic, Mr. Cerin","male",26,0,0,"349248",7.8958,,"S",,, +3,1,"Barah, Mr. Hanna Assi","male",20,0,0,"2663",7.2292,,"C","15",, +3,0,"Barbara, Miss. Saiide","female",18,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" +3,0,"Barbara, Mrs. (Catherine David)","female",45,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" +3,0,"Barry, Miss. Julia","female",27,0,0,"330844",7.8792,,"Q",,,"New York, NY" +3,0,"Barton, Mr. David John","male",22,0,0,"324669",8.0500,,"S",,,"England New York, NY" +3,0,"Beavan, Mr. William Thomas","male",19,0,0,"323951",8.0500,,"S",,,"England" +3,0,"Bengtsson, Mr. John Viktor","male",26,0,0,"347068",7.7750,,"S",,,"Krakudden, Sweden Moune, IL" +3,0,"Berglund, Mr. Karl Ivar Sven","male",22,0,0,"PP 4348",9.3500,,"S",,,"Tranvik, Finland New York" +3,0,"Betros, Master. Seman","male",,0,0,"2622",7.2292,,"C",,, +3,0,"Betros, Mr. Tannous","male",20,0,0,"2648",4.0125,,"C",,,"Syria" +3,1,"Bing, Mr. Lee","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" +3,0,"Birkeland, Mr. Hans Martin Monsen","male",21,0,0,"312992",7.7750,,"S",,,"Brennes, Norway New York" +3,0,"Bjorklund, Mr. Ernst Herbert","male",18,0,0,"347090",7.7500,,"S",,,"Stockholm, Sweden New York" +3,0,"Bostandyeff, Mr. Guentcho","male",26,0,0,"349224",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Boulos, Master. Akar","male",6,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" +3,0,"Boulos, Miss. Nourelain","female",9,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" +3,0,"Boulos, Mr. Hanna","male",,0,0,"2664",7.2250,,"C",,,"Syria" +3,0,"Boulos, Mrs. Joseph (Sultana)","female",,0,2,"2678",15.2458,,"C",,,"Syria Kent, ON" +3,0,"Bourke, Miss. Mary","female",,0,2,"364848",7.7500,,"Q",,,"Ireland Chicago, IL" +3,0,"Bourke, Mr. John","male",40,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" +3,0,"Bourke, Mrs. John (Catherine)","female",32,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" +3,0,"Bowen, Mr. David John ""Dai""","male",21,0,0,"54636",16.1000,,"S",,,"Treherbert, Cardiff, Wales" +3,1,"Bradley, Miss. Bridget Delia","female",22,0,0,"334914",7.7250,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland Glens Falls, NY" +3,0,"Braf, Miss. Elin Ester Maria","female",20,0,0,"347471",7.8542,,"S",,,"Medeltorp, Sweden Chicago, IL" +3,0,"Braund, Mr. Lewis Richard","male",29,1,0,"3460",7.0458,,"S",,,"Bridgerule, Devon" +3,0,"Braund, Mr. Owen Harris","male",22,1,0,"A/5 21171",7.2500,,"S",,,"Bridgerule, Devon" +3,0,"Brobeck, Mr. Karl Rudolf","male",22,0,0,"350045",7.7958,,"S",,,"Sweden Worcester, MA" +3,0,"Brocklebank, Mr. William Alfred","male",35,0,0,"364512",8.0500,,"S",,,"Broomfield, Chelmsford, England" +3,0,"Buckley, Miss. Katherine","female",18.5,0,0,"329944",7.2833,,"Q",,"299","Co Cork, Ireland Roxbury, MA" +3,1,"Buckley, Mr. Daniel","male",21,0,0,"330920",7.8208,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland New York, NY" +3,0,"Burke, Mr. Jeremiah","male",19,0,0,"365222",6.7500,,"Q",,,"Co Cork, Ireland Charlestown, MA" +3,0,"Burns, Miss. Mary Delia","female",18,0,0,"330963",7.8792,,"Q",,,"Co Sligo, Ireland New York, NY" +3,0,"Cacic, Miss. Manda","female",21,0,0,"315087",8.6625,,"S",,, +3,0,"Cacic, Miss. Marija","female",30,0,0,"315084",8.6625,,"S",,, +3,0,"Cacic, Mr. Jego Grga","male",18,0,0,"315091",8.6625,,"S",,, +3,0,"Cacic, Mr. Luka","male",38,0,0,"315089",8.6625,,"S",,,"Croatia" +3,0,"Calic, Mr. Jovo","male",17,0,0,"315093",8.6625,,"S",,, +3,0,"Calic, Mr. Petar","male",17,0,0,"315086",8.6625,,"S",,, +3,0,"Canavan, Miss. Mary","female",21,0,0,"364846",7.7500,,"Q",,, +3,0,"Canavan, Mr. Patrick","male",21,0,0,"364858",7.7500,,"Q",,,"Ireland Philadelphia, PA" +3,0,"Cann, Mr. Ernest Charles","male",21,0,0,"A./5. 2152",8.0500,,"S",,, +3,0,"Caram, Mr. Joseph","male",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" +3,0,"Caram, Mrs. Joseph (Maria Elias)","female",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" +3,0,"Carlsson, Mr. August Sigfrid","male",28,0,0,"350042",7.7958,,"S",,,"Dagsas, Sweden Fower, MN" +3,0,"Carlsson, Mr. Carl Robert","male",24,0,0,"350409",7.8542,,"S",,,"Goteborg, Sweden Huntley, IL" +3,1,"Carr, Miss. Helen ""Ellen""","female",16,0,0,"367231",7.7500,,"Q","16",,"Co Longford, Ireland New York, NY" +3,0,"Carr, Miss. Jeannie","female",37,0,0,"368364",7.7500,,"Q",,,"Co Sligo, Ireland Hartford, CT" +3,0,"Carver, Mr. Alfred John","male",28,0,0,"392095",7.2500,,"S",,,"St Denys, Southampton, Hants" +3,0,"Celotti, Mr. Francesco","male",24,0,0,"343275",8.0500,,"S",,,"London" +3,0,"Charters, Mr. David","male",21,0,0,"A/5. 13032",7.7333,,"Q",,,"Ireland New York, NY" +3,1,"Chip, Mr. Chang","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" +3,0,"Christmann, Mr. Emil","male",29,0,0,"343276",8.0500,,"S",,, +3,0,"Chronopoulos, Mr. Apostolos","male",26,1,0,"2680",14.4542,,"C",,,"Greece" +3,0,"Chronopoulos, Mr. Demetrios","male",18,1,0,"2680",14.4542,,"C",,,"Greece" +3,0,"Coelho, Mr. Domingos Fernandeo","male",20,0,0,"SOTON/O.Q. 3101307",7.0500,,"S",,,"Portugal" +3,1,"Cohen, Mr. Gurshon ""Gus""","male",18,0,0,"A/5 3540",8.0500,,"S","12",,"London Brooklyn, NY" +3,0,"Colbert, Mr. Patrick","male",24,0,0,"371109",7.2500,,"Q",,,"Co Limerick, Ireland Sherbrooke, PQ" +3,0,"Coleff, Mr. Peju","male",36,0,0,"349210",7.4958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Coleff, Mr. Satio","male",24,0,0,"349209",7.4958,,"S",,, +3,0,"Conlon, Mr. Thomas Henry","male",31,0,0,"21332",7.7333,,"Q",,,"Philadelphia, PA" +3,0,"Connaghton, Mr. Michael","male",31,0,0,"335097",7.7500,,"Q",,,"Ireland Brooklyn, NY" +3,1,"Connolly, Miss. Kate","female",22,0,0,"370373",7.7500,,"Q","13",,"Ireland" +3,0,"Connolly, Miss. Kate","female",30,0,0,"330972",7.6292,,"Q",,,"Ireland" +3,0,"Connors, Mr. Patrick","male",70.5,0,0,"370369",7.7500,,"Q",,"171", +3,0,"Cook, Mr. Jacob","male",43,0,0,"A/5 3536",8.0500,,"S",,, +3,0,"Cor, Mr. Bartol","male",35,0,0,"349230",7.8958,,"S",,,"Austria" +3,0,"Cor, Mr. Ivan","male",27,0,0,"349229",7.8958,,"S",,,"Austria" +3,0,"Cor, Mr. Liudevit","male",19,0,0,"349231",7.8958,,"S",,,"Austria" +3,0,"Corn, Mr. Harry","male",30,0,0,"SOTON/OQ 392090",8.0500,,"S",,,"London" +3,1,"Coutts, Master. Eden Leslie ""Neville""","male",9,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" +3,1,"Coutts, Master. William Loch ""William""","male",3,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" +3,1,"Coutts, Mrs. William (Winnie ""Minnie"" Treanor)","female",36,0,2,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" +3,0,"Coxon, Mr. Daniel","male",59,0,0,"364500",7.2500,,"S",,,"Merrill, WI" +3,0,"Crease, Mr. Ernest James","male",19,0,0,"S.P. 3464",8.1583,,"S",,,"Bristol, England Cleveland, OH" +3,1,"Cribb, Miss. Laura Alice","female",17,0,1,"371362",16.1000,,"S","12",,"Bournemouth, England Newark, NJ" +3,0,"Cribb, Mr. John Hatfield","male",44,0,1,"371362",16.1000,,"S",,,"Bournemouth, England Newark, NJ" +3,0,"Culumovic, Mr. Jeso","male",17,0,0,"315090",8.6625,,"S",,,"Austria-Hungary" +3,0,"Daher, Mr. Shedid","male",22.5,0,0,"2698",7.2250,,"C",,"9", +3,1,"Dahl, Mr. Karl Edwart","male",45,0,0,"7598",8.0500,,"S","15",,"Australia Fingal, ND" +3,0,"Dahlberg, Miss. Gerda Ulrika","female",22,0,0,"7552",10.5167,,"S",,,"Norrlot, Sweden Chicago, IL" +3,0,"Dakic, Mr. Branko","male",19,0,0,"349228",10.1708,,"S",,,"Austria" +3,1,"Daly, Miss. Margaret Marcella ""Maggie""","female",30,0,0,"382650",6.9500,,"Q","15",,"Co Athlone, Ireland New York, NY" +3,1,"Daly, Mr. Eugene Patrick","male",29,0,0,"382651",7.7500,,"Q","13 15 B",,"Co Athlone, Ireland New York, NY" +3,0,"Danbom, Master. Gilbert Sigvard Emanuel","male",0.33,0,2,"347080",14.4000,,"S",,,"Stanton, IA" +3,0,"Danbom, Mr. Ernst Gilbert","male",34,1,1,"347080",14.4000,,"S",,"197","Stanton, IA" +3,0,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)","female",28,1,1,"347080",14.4000,,"S",,,"Stanton, IA" +3,0,"Danoff, Mr. Yoto","male",27,0,0,"349219",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Dantcheff, Mr. Ristiu","male",25,0,0,"349203",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Davies, Mr. Alfred J","male",24,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" +3,0,"Davies, Mr. Evan","male",22,0,0,"SC/A4 23568",8.0500,,"S",,, +3,0,"Davies, Mr. John Samuel","male",21,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" +3,0,"Davies, Mr. Joseph","male",17,2,0,"A/4 48873",8.0500,,"S",,,"West Bromwich, England Pontiac, MI" +3,0,"Davison, Mr. Thomas Henry","male",,1,0,"386525",16.1000,,"S",,,"Liverpool, England Bedford, OH" +3,1,"Davison, Mrs. Thomas Henry (Mary E Finck)","female",,1,0,"386525",16.1000,,"S","16",,"Liverpool, England Bedford, OH" +3,1,"de Messemaeker, Mr. Guillaume Joseph","male",36.5,1,0,"345572",17.4000,,"S","15",,"Tampico, MT" +3,1,"de Messemaeker, Mrs. Guillaume Joseph (Emma)","female",36,1,0,"345572",17.4000,,"S","13",,"Tampico, MT" +3,1,"de Mulder, Mr. Theodore","male",30,0,0,"345774",9.5000,,"S","11",,"Belgium Detroit, MI" +3,0,"de Pelsmaeker, Mr. Alfons","male",16,0,0,"345778",9.5000,,"S",,, +3,1,"Dean, Master. Bertram Vere","male",1,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" +3,1,"Dean, Miss. Elizabeth Gladys ""Millvina""","female",0.17,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" +3,0,"Dean, Mr. Bertram Frank","male",26,1,2,"C.A. 2315",20.5750,,"S",,,"Devon, England Wichita, KS" +3,1,"Dean, Mrs. Bertram (Eva Georgetta Light)","female",33,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" +3,0,"Delalic, Mr. Redjo","male",25,0,0,"349250",7.8958,,"S",,, +3,0,"Demetri, Mr. Marinko","male",,0,0,"349238",7.8958,,"S",,, +3,0,"Denkoff, Mr. Mitto","male",,0,0,"349225",7.8958,,"S",,,"Bulgaria Coon Rapids, IA" +3,0,"Dennis, Mr. Samuel","male",22,0,0,"A/5 21172",7.2500,,"S",,, +3,0,"Dennis, Mr. William","male",36,0,0,"A/5 21175",7.2500,,"S",,, +3,1,"Devaney, Miss. Margaret Delia","female",19,0,0,"330958",7.8792,,"Q","C",,"Kilmacowen, Co Sligo, Ireland New York, NY" +3,0,"Dika, Mr. Mirko","male",17,0,0,"349232",7.8958,,"S",,, +3,0,"Dimic, Mr. Jovan","male",42,0,0,"315088",8.6625,,"S",,, +3,0,"Dintcheff, Mr. Valtcho","male",43,0,0,"349226",7.8958,,"S",,, +3,0,"Doharr, Mr. Tannous","male",,0,0,"2686",7.2292,,"C",,, +3,0,"Dooley, Mr. Patrick","male",32,0,0,"370376",7.7500,,"Q",,,"Ireland New York, NY" +3,1,"Dorking, Mr. Edward Arthur","male",19,0,0,"A/5. 10482",8.0500,,"S","B",,"England Oglesby, IL" +3,1,"Dowdell, Miss. Elizabeth","female",30,0,0,"364516",12.4750,,"S","13",,"Union Hill, NJ" +3,0,"Doyle, Miss. Elizabeth","female",24,0,0,"368702",7.7500,,"Q",,,"Ireland New York, NY" +3,1,"Drapkin, Miss. Jennie","female",23,0,0,"SOTON/OQ 392083",8.0500,,"S",,,"London New York, NY" +3,0,"Drazenoic, Mr. Jozef","male",33,0,0,"349241",7.8958,,"C",,"51","Austria Niagara Falls, NY" +3,0,"Duane, Mr. Frank","male",65,0,0,"336439",7.7500,,"Q",,, +3,1,"Duquemin, Mr. Joseph","male",24,0,0,"S.O./P.P. 752",7.5500,,"S","D",,"England Albion, NY" +3,0,"Dyker, Mr. Adolf Fredrik","male",23,1,0,"347072",13.9000,,"S",,,"West Haven, CT" +3,1,"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)","female",22,1,0,"347072",13.9000,,"S","16",,"West Haven, CT" +3,0,"Edvardsson, Mr. Gustaf Hjalmar","male",18,0,0,"349912",7.7750,,"S",,,"Tofta, Sweden Joliet, IL" +3,0,"Eklund, Mr. Hans Linus","male",16,0,0,"347074",7.7750,,"S",,,"Karberg, Sweden Jerome Junction, AZ" +3,0,"Ekstrom, Mr. Johan","male",45,0,0,"347061",6.9750,,"S",,,"Effington Rut, SD" +3,0,"Elias, Mr. Dibo","male",,0,0,"2674",7.2250,,"C",,, +3,0,"Elias, Mr. Joseph","male",39,0,2,"2675",7.2292,,"C",,,"Syria Ottawa, ON" +3,0,"Elias, Mr. Joseph Jr","male",17,1,1,"2690",7.2292,,"C",,, +3,0,"Elias, Mr. Tannous","male",15,1,1,"2695",7.2292,,"C",,,"Syria" +3,0,"Elsbury, Mr. William James","male",47,0,0,"A/5 3902",7.2500,,"S",,,"Illinois, USA" +3,1,"Emanuel, Miss. Virginia Ethel","female",5,0,0,"364516",12.4750,,"S","13",,"New York, NY" +3,0,"Emir, Mr. Farred Chehab","male",,0,0,"2631",7.2250,,"C",,, +3,0,"Everett, Mr. Thomas James","male",40.5,0,0,"C.A. 6212",15.1000,,"S",,"187", +3,0,"Farrell, Mr. James","male",40.5,0,0,"367232",7.7500,,"Q",,"68","Aughnacliff, Co Longford, Ireland New York, NY" +3,1,"Finoli, Mr. Luigi","male",,0,0,"SOTON/O.Q. 3101308",7.0500,,"S","15",,"Italy Philadelphia, PA" +3,0,"Fischer, Mr. Eberhard Thelander","male",18,0,0,"350036",7.7958,,"S",,, +3,0,"Fleming, Miss. Honora","female",,0,0,"364859",7.7500,,"Q",,, +3,0,"Flynn, Mr. James","male",,0,0,"364851",7.7500,,"Q",,, +3,0,"Flynn, Mr. John","male",,0,0,"368323",6.9500,,"Q",,, +3,0,"Foley, Mr. Joseph","male",26,0,0,"330910",7.8792,,"Q",,,"Ireland Chicago, IL" +3,0,"Foley, Mr. William","male",,0,0,"365235",7.7500,,"Q",,,"Ireland" +3,1,"Foo, Mr. Choong","male",,0,0,"1601",56.4958,,"S","13",,"Hong Kong New York, NY" +3,0,"Ford, Miss. Doolina Margaret ""Daisy""","female",21,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Miss. Robina Maggie ""Ruby""","female",9,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Mr. Arthur","male",,0,0,"A/5 1478",8.0500,,"S",,,"Bridgwater, Somerset, England" +3,0,"Ford, Mr. Edward Watson","male",18,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Mr. William Neal","male",16,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Mrs. Edward (Margaret Ann Watson)","female",48,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Fox, Mr. Patrick","male",,0,0,"368573",7.7500,,"Q",,,"Ireland New York, NY" +3,0,"Franklin, Mr. Charles (Charles Fardon)","male",,0,0,"SOTON/O.Q. 3101314",7.2500,,"S",,, +3,0,"Gallagher, Mr. Martin","male",25,0,0,"36864",7.7417,,"Q",,,"New York, NY" +3,0,"Garfirth, Mr. John","male",,0,0,"358585",14.5000,,"S",,, +3,0,"Gheorgheff, Mr. Stanio","male",,0,0,"349254",7.8958,,"C",,, +3,0,"Gilinski, Mr. Eliezer","male",22,0,0,"14973",8.0500,,"S",,"47", +3,1,"Gilnagh, Miss. Katherine ""Katie""","female",16,0,0,"35851",7.7333,,"Q","16",,"Co Longford, Ireland New York, NY" +3,1,"Glynn, Miss. Mary Agatha","female",,0,0,"335677",7.7500,,"Q","13",,"Co Clare, Ireland Washington, DC" +3,1,"Goldsmith, Master. Frank John William ""Frankie""","male",9,0,2,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" +3,0,"Goldsmith, Mr. Frank John","male",33,1,1,"363291",20.5250,,"S",,,"Strood, Kent, England Detroit, MI" +3,0,"Goldsmith, Mr. Nathan","male",41,0,0,"SOTON/O.Q. 3101263",7.8500,,"S",,,"Philadelphia, PA" +3,1,"Goldsmith, Mrs. Frank John (Emily Alice Brown)","female",31,1,1,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" +3,0,"Goncalves, Mr. Manuel Estanslas","male",38,0,0,"SOTON/O.Q. 3101306",7.0500,,"S",,,"Portugal" +3,0,"Goodwin, Master. Harold Victor","male",9,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Master. Sidney Leonard","male",1,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Master. William Frederick","male",11,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Miss. Jessie Allis","female",10,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Miss. Lillian Amy","female",16,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Mr. Charles Edward","male",14,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Mr. Charles Frederick","male",40,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Mrs. Frederick (Augusta Tyler)","female",43,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Green, Mr. George Henry","male",51,0,0,"21440",8.0500,,"S",,,"Dorking, Surrey, England" +3,0,"Gronnestad, Mr. Daniel Danielsen","male",32,0,0,"8471",8.3625,,"S",,,"Foresvik, Norway Portland, ND" +3,0,"Guest, Mr. Robert","male",,0,0,"376563",8.0500,,"S",,, +3,0,"Gustafsson, Mr. Alfred Ossian","male",20,0,0,"7534",9.8458,,"S",,,"Waukegan, Chicago, IL" +3,0,"Gustafsson, Mr. Anders Vilhelm","male",37,2,0,"3101276",7.9250,,"S",,"98","Ruotsinphytaa, Finland New York, NY" +3,0,"Gustafsson, Mr. Johan Birger","male",28,2,0,"3101277",7.9250,,"S",,,"Ruotsinphytaa, Finland New York, NY" +3,0,"Gustafsson, Mr. Karl Gideon","male",19,0,0,"347069",7.7750,,"S",,,"Myren, Sweden New York, NY" +3,0,"Haas, Miss. Aloisia","female",24,0,0,"349236",8.8500,,"S",,, +3,0,"Hagardon, Miss. Kate","female",17,0,0,"AQ/3. 30631",7.7333,,"Q",,, +3,0,"Hagland, Mr. Ingvald Olai Olsen","male",,1,0,"65303",19.9667,,"S",,, +3,0,"Hagland, Mr. Konrad Mathias Reiersen","male",,1,0,"65304",19.9667,,"S",,, +3,0,"Hakkarainen, Mr. Pekka Pietari","male",28,1,0,"STON/O2. 3101279",15.8500,,"S",,, +3,1,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)","female",24,1,0,"STON/O2. 3101279",15.8500,,"S","15",, +3,0,"Hampe, Mr. Leon","male",20,0,0,"345769",9.5000,,"S",,, +3,0,"Hanna, Mr. Mansour","male",23.5,0,0,"2693",7.2292,,"C",,"188", +3,0,"Hansen, Mr. Claus Peter","male",41,2,0,"350026",14.1083,,"S",,, +3,0,"Hansen, Mr. Henrik Juul","male",26,1,0,"350025",7.8542,,"S",,, +3,0,"Hansen, Mr. Henry Damsgaard","male",21,0,0,"350029",7.8542,,"S",,"69", +3,1,"Hansen, Mrs. Claus Peter (Jennie L Howard)","female",45,1,0,"350026",14.1083,,"S","11",, +3,0,"Harknett, Miss. Alice Phoebe","female",,0,0,"W./C. 6609",7.5500,,"S",,, +3,0,"Harmer, Mr. Abraham (David Lishin)","male",25,0,0,"374887",7.2500,,"S","B",, +3,0,"Hart, Mr. Henry","male",,0,0,"394140",6.8583,,"Q",,, +3,0,"Hassan, Mr. Houssein G N","male",11,0,0,"2699",18.7875,,"C",,, +3,1,"Healy, Miss. Hanora ""Nora""","female",,0,0,"370375",7.7500,,"Q","16",, +3,1,"Hedman, Mr. Oskar Arvid","male",27,0,0,"347089",6.9750,,"S","15",, +3,1,"Hee, Mr. Ling","male",,0,0,"1601",56.4958,,"S","C",, +3,0,"Hegarty, Miss. Hanora ""Nora""","female",18,0,0,"365226",6.7500,,"Q",,, +3,1,"Heikkinen, Miss. Laina","female",26,0,0,"STON/O2. 3101282",7.9250,,"S",,, +3,0,"Heininen, Miss. Wendla Maria","female",23,0,0,"STON/O2. 3101290",7.9250,,"S",,, +3,1,"Hellstrom, Miss. Hilda Maria","female",22,0,0,"7548",8.9625,,"S","C",, +3,0,"Hendekovic, Mr. Ignjac","male",28,0,0,"349243",7.8958,,"S",,"306", +3,0,"Henriksson, Miss. Jenny Lovisa","female",28,0,0,"347086",7.7750,,"S",,, +3,0,"Henry, Miss. Delia","female",,0,0,"382649",7.7500,,"Q",,, +3,1,"Hirvonen, Miss. Hildur E","female",2,0,1,"3101298",12.2875,,"S","15",, +3,1,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)","female",22,1,1,"3101298",12.2875,,"S","15",, +3,0,"Holm, Mr. John Fredrik Alexander","male",43,0,0,"C 7075",6.4500,,"S",,, +3,0,"Holthen, Mr. Johan Martin","male",28,0,0,"C 4001",22.5250,,"S",,, +3,1,"Honkanen, Miss. Eliina","female",27,0,0,"STON/O2. 3101283",7.9250,,"S",,, +3,0,"Horgan, Mr. John","male",,0,0,"370377",7.7500,,"Q",,, +3,1,"Howard, Miss. May Elizabeth","female",,0,0,"A. 2. 39186",8.0500,,"S","C",, +3,0,"Humblen, Mr. Adolf Mathias Nicolai Olsen","male",42,0,0,"348121",7.6500,"F G63","S",,"120", +3,1,"Hyman, Mr. Abraham","male",,0,0,"3470",7.8875,,"S","C",, +3,0,"Ibrahim Shawah, Mr. Yousseff","male",30,0,0,"2685",7.2292,,"C",,, +3,0,"Ilieff, Mr. Ylio","male",,0,0,"349220",7.8958,,"S",,, +3,0,"Ilmakangas, Miss. Ida Livija","female",27,1,0,"STON/O2. 3101270",7.9250,,"S",,, +3,0,"Ilmakangas, Miss. Pieta Sofia","female",25,1,0,"STON/O2. 3101271",7.9250,,"S",,, +3,0,"Ivanoff, Mr. Kanio","male",,0,0,"349201",7.8958,,"S",,, +3,1,"Jalsevac, Mr. Ivan","male",29,0,0,"349240",7.8958,,"C","15",, +3,1,"Jansson, Mr. Carl Olof","male",21,0,0,"350034",7.7958,,"S","A",, +3,0,"Jardin, Mr. Jose Neto","male",,0,0,"SOTON/O.Q. 3101305",7.0500,,"S",,, +3,0,"Jensen, Mr. Hans Peder","male",20,0,0,"350050",7.8542,,"S",,, +3,0,"Jensen, Mr. Niels Peder","male",48,0,0,"350047",7.8542,,"S",,, +3,0,"Jensen, Mr. Svend Lauritz","male",17,1,0,"350048",7.0542,,"S",,, +3,1,"Jermyn, Miss. Annie","female",,0,0,"14313",7.7500,,"Q","D",, +3,1,"Johannesen-Bratthammer, Mr. Bernt","male",,0,0,"65306",8.1125,,"S","13",, +3,0,"Johanson, Mr. Jakob Alfred","male",34,0,0,"3101264",6.4958,,"S",,"143", +3,1,"Johansson Palmquist, Mr. Oskar Leander","male",26,0,0,"347070",7.7750,,"S","15",, +3,0,"Johansson, Mr. Erik","male",22,0,0,"350052",7.7958,,"S",,"156", +3,0,"Johansson, Mr. Gustaf Joel","male",33,0,0,"7540",8.6542,,"S",,"285", +3,0,"Johansson, Mr. Karl Johan","male",31,0,0,"347063",7.7750,,"S",,, +3,0,"Johansson, Mr. Nils","male",29,0,0,"347467",7.8542,,"S",,, +3,1,"Johnson, Master. Harold Theodor","male",4,1,1,"347742",11.1333,,"S","15",, +3,1,"Johnson, Miss. Eleanor Ileen","female",1,1,1,"347742",11.1333,,"S","15",, +3,0,"Johnson, Mr. Alfred","male",49,0,0,"LINE",0.0000,,"S",,, +3,0,"Johnson, Mr. Malkolm Joackim","male",33,0,0,"347062",7.7750,,"S",,"37", +3,0,"Johnson, Mr. William Cahoone Jr","male",19,0,0,"LINE",0.0000,,"S",,, +3,1,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)","female",27,0,2,"347742",11.1333,,"S","15",, +3,0,"Johnston, Master. William Arthur ""Willie""","male",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Johnston, Miss. Catherine Helen ""Carrie""","female",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Johnston, Mr. Andrew G","male",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Johnston, Mrs. Andrew G (Elizabeth ""Lily"" Watson)","female",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Jonkoff, Mr. Lalio","male",23,0,0,"349204",7.8958,,"S",,, +3,1,"Jonsson, Mr. Carl","male",32,0,0,"350417",7.8542,,"S","15",, +3,0,"Jonsson, Mr. Nils Hilding","male",27,0,0,"350408",7.8542,,"S",,, +3,0,"Jussila, Miss. Katriina","female",20,1,0,"4136",9.8250,,"S",,, +3,0,"Jussila, Miss. Mari Aina","female",21,1,0,"4137",9.8250,,"S",,, +3,1,"Jussila, Mr. Eiriik","male",32,0,0,"STON/O 2. 3101286",7.9250,,"S","15",, +3,0,"Kallio, Mr. Nikolai Erland","male",17,0,0,"STON/O 2. 3101274",7.1250,,"S",,, +3,0,"Kalvik, Mr. Johannes Halvorsen","male",21,0,0,"8475",8.4333,,"S",,, +3,0,"Karaic, Mr. Milan","male",30,0,0,"349246",7.8958,,"S",,, +3,1,"Karlsson, Mr. Einar Gervasius","male",21,0,0,"350053",7.7958,,"S","13",, +3,0,"Karlsson, Mr. Julius Konrad Eugen","male",33,0,0,"347465",7.8542,,"S",,, +3,0,"Karlsson, Mr. Nils August","male",22,0,0,"350060",7.5208,,"S",,, +3,1,"Karun, Miss. Manca","female",4,0,1,"349256",13.4167,,"C","15",, +3,1,"Karun, Mr. Franz","male",39,0,1,"349256",13.4167,,"C","15",, +3,0,"Kassem, Mr. Fared","male",,0,0,"2700",7.2292,,"C",,, +3,0,"Katavelas, Mr. Vassilios (""Catavelas Vassilios"")","male",18.5,0,0,"2682",7.2292,,"C",,"58", +3,0,"Keane, Mr. Andrew ""Andy""","male",,0,0,"12460",7.7500,,"Q",,, +3,0,"Keefe, Mr. Arthur","male",,0,0,"323592",7.2500,,"S","A",, +3,1,"Kelly, Miss. Anna Katherine ""Annie Kate""","female",,0,0,"9234",7.7500,,"Q","16",, +3,1,"Kelly, Miss. Mary","female",,0,0,"14312",7.7500,,"Q","D",, +3,0,"Kelly, Mr. James","male",34.5,0,0,"330911",7.8292,,"Q",,"70", +3,0,"Kelly, Mr. James","male",44,0,0,"363592",8.0500,,"S",,, +3,1,"Kennedy, Mr. John","male",,0,0,"368783",7.7500,,"Q",,, +3,0,"Khalil, Mr. Betros","male",,1,0,"2660",14.4542,,"C",,, +3,0,"Khalil, Mrs. Betros (Zahie ""Maria"" Elias)","female",,1,0,"2660",14.4542,,"C",,, +3,0,"Kiernan, Mr. John","male",,1,0,"367227",7.7500,,"Q",,, +3,0,"Kiernan, Mr. Philip","male",,1,0,"367229",7.7500,,"Q",,, +3,0,"Kilgannon, Mr. Thomas J","male",,0,0,"36865",7.7375,,"Q",,, +3,0,"Kink, Miss. Maria","female",22,2,0,"315152",8.6625,,"S",,, +3,0,"Kink, Mr. Vincenz","male",26,2,0,"315151",8.6625,,"S",,, +3,1,"Kink-Heilmann, Miss. Luise Gretchen","female",4,0,2,"315153",22.0250,,"S","2",, +3,1,"Kink-Heilmann, Mr. Anton","male",29,3,1,"315153",22.0250,,"S","2",, +3,1,"Kink-Heilmann, Mrs. Anton (Luise Heilmann)","female",26,1,1,"315153",22.0250,,"S","2",, +3,0,"Klasen, Miss. Gertrud Emilia","female",1,1,1,"350405",12.1833,,"S",,, +3,0,"Klasen, Mr. Klas Albin","male",18,1,1,"350404",7.8542,,"S",,, +3,0,"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)","female",36,0,2,"350405",12.1833,,"S",,, +3,0,"Kraeff, Mr. Theodor","male",,0,0,"349253",7.8958,,"C",,, +3,1,"Krekorian, Mr. Neshan","male",25,0,0,"2654",7.2292,"F E57","C","10",, +3,0,"Lahoud, Mr. Sarkis","male",,0,0,"2624",7.2250,,"C",,, +3,0,"Laitinen, Miss. Kristina Sofia","female",37,0,0,"4135",9.5875,,"S",,, +3,0,"Laleff, Mr. Kristo","male",,0,0,"349217",7.8958,,"S",,, +3,1,"Lam, Mr. Ali","male",,0,0,"1601",56.4958,,"S","C",, +3,0,"Lam, Mr. Len","male",,0,0,"1601",56.4958,,"S",,, +3,1,"Landergren, Miss. Aurora Adelia","female",22,0,0,"C 7077",7.2500,,"S","13",, +3,0,"Lane, Mr. Patrick","male",,0,0,"7935",7.7500,,"Q",,, +3,1,"Lang, Mr. Fang","male",26,0,0,"1601",56.4958,,"S","14",, +3,0,"Larsson, Mr. August Viktor","male",29,0,0,"7545",9.4833,,"S",,, +3,0,"Larsson, Mr. Bengt Edvin","male",29,0,0,"347067",7.7750,,"S",,, +3,0,"Larsson-Rondberg, Mr. Edvard A","male",22,0,0,"347065",7.7750,,"S",,, +3,1,"Leeni, Mr. Fahim (""Philip Zenni"")","male",22,0,0,"2620",7.2250,,"C","6",, +3,0,"Lefebre, Master. Henry Forbes","male",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Miss. Ida","female",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Miss. Jeannie","female",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Miss. Mathilde","female",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Mrs. Frank (Frances)","female",,0,4,"4133",25.4667,,"S",,, +3,0,"Leinonen, Mr. Antti Gustaf","male",32,0,0,"STON/O 2. 3101292",7.9250,,"S",,, +3,0,"Lemberopolous, Mr. Peter L","male",34.5,0,0,"2683",6.4375,,"C",,"196", +3,0,"Lennon, Miss. Mary","female",,1,0,"370371",15.5000,,"Q",,, +3,0,"Lennon, Mr. Denis","male",,1,0,"370371",15.5000,,"Q",,, +3,0,"Leonard, Mr. Lionel","male",36,0,0,"LINE",0.0000,,"S",,, +3,0,"Lester, Mr. James","male",39,0,0,"A/4 48871",24.1500,,"S",,, +3,0,"Lievens, Mr. Rene Aime","male",24,0,0,"345781",9.5000,,"S",,, +3,0,"Lindahl, Miss. Agda Thorilda Viktoria","female",25,0,0,"347071",7.7750,,"S",,, +3,0,"Lindblom, Miss. Augusta Charlotta","female",45,0,0,"347073",7.7500,,"S",,, +3,0,"Lindell, Mr. Edvard Bengtsson","male",36,1,0,"349910",15.5500,,"S","A",, +3,0,"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)","female",30,1,0,"349910",15.5500,,"S","A",, +3,1,"Lindqvist, Mr. Eino William","male",20,1,0,"STON/O 2. 3101285",7.9250,,"S","15",, +3,0,"Linehan, Mr. Michael","male",,0,0,"330971",7.8792,,"Q",,, +3,0,"Ling, Mr. Lee","male",28,0,0,"1601",56.4958,,"S",,, +3,0,"Lithman, Mr. Simon","male",,0,0,"S.O./P.P. 251",7.5500,,"S",,, +3,0,"Lobb, Mr. William Arthur","male",30,1,0,"A/5. 3336",16.1000,,"S",,, +3,0,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)","female",26,1,0,"A/5. 3336",16.1000,,"S",,, +3,0,"Lockyer, Mr. Edward","male",,0,0,"1222",7.8792,,"S",,"153", +3,0,"Lovell, Mr. John Hall (""Henry"")","male",20.5,0,0,"A/5 21173",7.2500,,"S",,, +3,1,"Lulic, Mr. Nikola","male",27,0,0,"315098",8.6625,,"S","15",, +3,0,"Lundahl, Mr. Johan Svensson","male",51,0,0,"347743",7.0542,,"S",,, +3,1,"Lundin, Miss. Olga Elida","female",23,0,0,"347469",7.8542,,"S","10",, +3,1,"Lundstrom, Mr. Thure Edvin","male",32,0,0,"350403",7.5792,,"S","15",, +3,0,"Lyntakoff, Mr. Stanko","male",,0,0,"349235",7.8958,,"S",,, +3,0,"MacKay, Mr. George William","male",,0,0,"C.A. 42795",7.5500,,"S",,, +3,1,"Madigan, Miss. Margaret ""Maggie""","female",,0,0,"370370",7.7500,,"Q","15",, +3,1,"Madsen, Mr. Fridtjof Arne","male",24,0,0,"C 17369",7.1417,,"S","13",, +3,0,"Maenpaa, Mr. Matti Alexanteri","male",22,0,0,"STON/O 2. 3101275",7.1250,,"S",,, +3,0,"Mahon, Miss. Bridget Delia","female",,0,0,"330924",7.8792,,"Q",,, +3,0,"Mahon, Mr. John","male",,0,0,"AQ/4 3130",7.7500,,"Q",,, +3,0,"Maisner, Mr. Simon","male",,0,0,"A/S 2816",8.0500,,"S",,, +3,0,"Makinen, Mr. Kalle Edvard","male",29,0,0,"STON/O 2. 3101268",7.9250,,"S",,, +3,1,"Mamee, Mr. Hanna","male",,0,0,"2677",7.2292,,"C","15",, +3,0,"Mangan, Miss. Mary","female",30.5,0,0,"364850",7.7500,,"Q",,"61", +3,1,"Mannion, Miss. Margareth","female",,0,0,"36866",7.7375,,"Q","16",, +3,0,"Mardirosian, Mr. Sarkis","male",,0,0,"2655",7.2292,"F E46","C",,, +3,0,"Markoff, Mr. Marin","male",35,0,0,"349213",7.8958,,"C",,, +3,0,"Markun, Mr. Johann","male",33,0,0,"349257",7.8958,,"S",,, +3,1,"Masselmani, Mrs. Fatima","female",,0,0,"2649",7.2250,,"C","C",, +3,0,"Matinoff, Mr. Nicola","male",,0,0,"349255",7.8958,,"C",,, +3,1,"McCarthy, Miss. Catherine ""Katie""","female",,0,0,"383123",7.7500,,"Q","15 16",, +3,1,"McCormack, Mr. Thomas Joseph","male",,0,0,"367228",7.7500,,"Q",,, +3,1,"McCoy, Miss. Agnes","female",,2,0,"367226",23.2500,,"Q","16",, +3,1,"McCoy, Miss. Alicia","female",,2,0,"367226",23.2500,,"Q","16",, +3,1,"McCoy, Mr. Bernard","male",,2,0,"367226",23.2500,,"Q","16",, +3,1,"McDermott, Miss. Brigdet Delia","female",,0,0,"330932",7.7875,,"Q","13",, +3,0,"McEvoy, Mr. Michael","male",,0,0,"36568",15.5000,,"Q",,, +3,1,"McGovern, Miss. Mary","female",,0,0,"330931",7.8792,,"Q","13",, +3,1,"McGowan, Miss. Anna ""Annie""","female",15,0,0,"330923",8.0292,,"Q",,, +3,0,"McGowan, Miss. Katherine","female",35,0,0,"9232",7.7500,,"Q",,, +3,0,"McMahon, Mr. Martin","male",,0,0,"370372",7.7500,,"Q",,, +3,0,"McNamee, Mr. Neal","male",24,1,0,"376566",16.1000,,"S",,, +3,0,"McNamee, Mrs. Neal (Eileen O'Leary)","female",19,1,0,"376566",16.1000,,"S",,"53", +3,0,"McNeill, Miss. Bridget","female",,0,0,"370368",7.7500,,"Q",,, +3,0,"Meanwell, Miss. (Marion Ogden)","female",,0,0,"SOTON/O.Q. 392087",8.0500,,"S",,, +3,0,"Meek, Mrs. Thomas (Annie Louise Rowley)","female",,0,0,"343095",8.0500,,"S",,, +3,0,"Meo, Mr. Alfonzo","male",55.5,0,0,"A.5. 11206",8.0500,,"S",,"201", +3,0,"Mernagh, Mr. Robert","male",,0,0,"368703",7.7500,,"Q",,, +3,1,"Midtsjo, Mr. Karl Albert","male",21,0,0,"345501",7.7750,,"S","15",, +3,0,"Miles, Mr. Frank","male",,0,0,"359306",8.0500,,"S",,, +3,0,"Mineff, Mr. Ivan","male",24,0,0,"349233",7.8958,,"S",,, +3,0,"Minkoff, Mr. Lazar","male",21,0,0,"349211",7.8958,,"S",,, +3,0,"Mionoff, Mr. Stoytcho","male",28,0,0,"349207",7.8958,,"S",,, +3,0,"Mitkoff, Mr. Mito","male",,0,0,"349221",7.8958,,"S",,, +3,1,"Mockler, Miss. Helen Mary ""Ellie""","female",,0,0,"330980",7.8792,,"Q","16",, +3,0,"Moen, Mr. Sigurd Hansen","male",25,0,0,"348123",7.6500,"F G73","S",,"309", +3,1,"Moor, Master. Meier","male",6,0,1,"392096",12.4750,"E121","S","14",, +3,1,"Moor, Mrs. (Beila)","female",27,0,1,"392096",12.4750,"E121","S","14",, +3,0,"Moore, Mr. Leonard Charles","male",,0,0,"A4. 54510",8.0500,,"S",,, +3,1,"Moran, Miss. Bertha","female",,1,0,"371110",24.1500,,"Q","16",, +3,0,"Moran, Mr. Daniel J","male",,1,0,"371110",24.1500,,"Q",,, +3,0,"Moran, Mr. James","male",,0,0,"330877",8.4583,,"Q",,, +3,0,"Morley, Mr. William","male",34,0,0,"364506",8.0500,,"S",,, +3,0,"Morrow, Mr. Thomas Rowan","male",,0,0,"372622",7.7500,,"Q",,, +3,1,"Moss, Mr. Albert Johan","male",,0,0,"312991",7.7750,,"S","B",, +3,1,"Moubarek, Master. Gerios","male",,1,1,"2661",15.2458,,"C","C",, +3,1,"Moubarek, Master. Halim Gonios (""William George"")","male",,1,1,"2661",15.2458,,"C","C",, +3,1,"Moubarek, Mrs. George (Omine ""Amenia"" Alexander)","female",,0,2,"2661",15.2458,,"C","C",, +3,1,"Moussa, Mrs. (Mantoura Boulos)","female",,0,0,"2626",7.2292,,"C",,, +3,0,"Moutal, Mr. Rahamin Haim","male",,0,0,"374746",8.0500,,"S",,, +3,1,"Mullens, Miss. Katherine ""Katie""","female",,0,0,"35852",7.7333,,"Q","16",, +3,1,"Mulvihill, Miss. Bertha E","female",24,0,0,"382653",7.7500,,"Q","15",, +3,0,"Murdlin, Mr. Joseph","male",,0,0,"A./5. 3235",8.0500,,"S",,, +3,1,"Murphy, Miss. Katherine ""Kate""","female",,1,0,"367230",15.5000,,"Q","16",, +3,1,"Murphy, Miss. Margaret Jane","female",,1,0,"367230",15.5000,,"Q","16",, +3,1,"Murphy, Miss. Nora","female",,0,0,"36568",15.5000,,"Q","16",, +3,0,"Myhrman, Mr. Pehr Fabian Oliver Malkolm","male",18,0,0,"347078",7.7500,,"S",,, +3,0,"Naidenoff, Mr. Penko","male",22,0,0,"349206",7.8958,,"S",,, +3,1,"Najib, Miss. Adele Kiamie ""Jane""","female",15,0,0,"2667",7.2250,,"C","C",, +3,1,"Nakid, Miss. Maria (""Mary"")","female",1,0,2,"2653",15.7417,,"C","C",, +3,1,"Nakid, Mr. Sahid","male",20,1,1,"2653",15.7417,,"C","C",, +3,1,"Nakid, Mrs. Said (Waika ""Mary"" Mowad)","female",19,1,1,"2653",15.7417,,"C","C",, +3,0,"Nancarrow, Mr. William Henry","male",33,0,0,"A./5. 3338",8.0500,,"S",,, +3,0,"Nankoff, Mr. Minko","male",,0,0,"349218",7.8958,,"S",,, +3,0,"Nasr, Mr. Mustafa","male",,0,0,"2652",7.2292,,"C",,, +3,0,"Naughton, Miss. Hannah","female",,0,0,"365237",7.7500,,"Q",,, +3,0,"Nenkoff, Mr. Christo","male",,0,0,"349234",7.8958,,"S",,, +3,1,"Nicola-Yarred, Master. Elias","male",12,1,0,"2651",11.2417,,"C","C",, +3,1,"Nicola-Yarred, Miss. Jamila","female",14,1,0,"2651",11.2417,,"C","C",, +3,0,"Nieminen, Miss. Manta Josefina","female",29,0,0,"3101297",7.9250,,"S",,, +3,0,"Niklasson, Mr. Samuel","male",28,0,0,"363611",8.0500,,"S",,, +3,1,"Nilsson, Miss. Berta Olivia","female",18,0,0,"347066",7.7750,,"S","D",, +3,1,"Nilsson, Miss. Helmina Josefina","female",26,0,0,"347470",7.8542,,"S","13",, +3,0,"Nilsson, Mr. August Ferdinand","male",21,0,0,"350410",7.8542,,"S",,, +3,0,"Nirva, Mr. Iisakki Antino Aijo","male",41,0,0,"SOTON/O2 3101272",7.1250,,"S",,,"Finland Sudbury, ON" +3,1,"Niskanen, Mr. Juha","male",39,0,0,"STON/O 2. 3101289",7.9250,,"S","9",, +3,0,"Nosworthy, Mr. Richard Cater","male",21,0,0,"A/4. 39886",7.8000,,"S",,, +3,0,"Novel, Mr. Mansouer","male",28.5,0,0,"2697",7.2292,,"C",,"181", +3,1,"Nysten, Miss. Anna Sofia","female",22,0,0,"347081",7.7500,,"S","13",, +3,0,"Nysveen, Mr. Johan Hansen","male",61,0,0,"345364",6.2375,,"S",,, +3,0,"O'Brien, Mr. Thomas","male",,1,0,"370365",15.5000,,"Q",,, +3,0,"O'Brien, Mr. Timothy","male",,0,0,"330979",7.8292,,"Q",,, +3,1,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)","female",,1,0,"370365",15.5000,,"Q",,, +3,0,"O'Connell, Mr. Patrick D","male",,0,0,"334912",7.7333,,"Q",,, +3,0,"O'Connor, Mr. Maurice","male",,0,0,"371060",7.7500,,"Q",,, +3,0,"O'Connor, Mr. Patrick","male",,0,0,"366713",7.7500,,"Q",,, +3,0,"Odahl, Mr. Nils Martin","male",23,0,0,"7267",9.2250,,"S",,, +3,0,"O'Donoghue, Ms. Bridget","female",,0,0,"364856",7.7500,,"Q",,, +3,1,"O'Driscoll, Miss. Bridget","female",,0,0,"14311",7.7500,,"Q","D",, +3,1,"O'Dwyer, Miss. Ellen ""Nellie""","female",,0,0,"330959",7.8792,,"Q",,, +3,1,"Ohman, Miss. Velin","female",22,0,0,"347085",7.7750,,"S","C",, +3,1,"O'Keefe, Mr. Patrick","male",,0,0,"368402",7.7500,,"Q","B",, +3,1,"O'Leary, Miss. Hanora ""Norah""","female",,0,0,"330919",7.8292,,"Q","13",, +3,1,"Olsen, Master. Artur Karl","male",9,0,1,"C 17368",3.1708,,"S","13",, +3,0,"Olsen, Mr. Henry Margido","male",28,0,0,"C 4001",22.5250,,"S",,"173", +3,0,"Olsen, Mr. Karl Siegwart Andreas","male",42,0,1,"4579",8.4042,,"S",,, +3,0,"Olsen, Mr. Ole Martin","male",,0,0,"Fa 265302",7.3125,,"S",,, +3,0,"Olsson, Miss. Elina","female",31,0,0,"350407",7.8542,,"S",,, +3,0,"Olsson, Mr. Nils Johan Goransson","male",28,0,0,"347464",7.8542,,"S",,, +3,1,"Olsson, Mr. Oscar Wilhelm","male",32,0,0,"347079",7.7750,,"S","A",, +3,0,"Olsvigen, Mr. Thor Anderson","male",20,0,0,"6563",9.2250,,"S",,"89","Oslo, Norway Cameron, WI" +3,0,"Oreskovic, Miss. Jelka","female",23,0,0,"315085",8.6625,,"S",,, +3,0,"Oreskovic, Miss. Marija","female",20,0,0,"315096",8.6625,,"S",,, +3,0,"Oreskovic, Mr. Luka","male",20,0,0,"315094",8.6625,,"S",,, +3,0,"Osen, Mr. Olaf Elon","male",16,0,0,"7534",9.2167,,"S",,, +3,1,"Osman, Mrs. Mara","female",31,0,0,"349244",8.6833,,"S",,, +3,0,"O'Sullivan, Miss. Bridget Mary","female",,0,0,"330909",7.6292,,"Q",,, +3,0,"Palsson, Master. Gosta Leonard","male",2,3,1,"349909",21.0750,,"S",,"4", +3,0,"Palsson, Master. Paul Folke","male",6,3,1,"349909",21.0750,,"S",,, +3,0,"Palsson, Miss. Stina Viola","female",3,3,1,"349909",21.0750,,"S",,, +3,0,"Palsson, Miss. Torborg Danira","female",8,3,1,"349909",21.0750,,"S",,, +3,0,"Palsson, Mrs. Nils (Alma Cornelia Berglund)","female",29,0,4,"349909",21.0750,,"S",,"206", +3,0,"Panula, Master. Eino Viljami","male",1,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Master. Juha Niilo","male",7,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Master. Urho Abraham","male",2,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Mr. Ernesti Arvid","male",16,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Mr. Jaako Arnold","male",14,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Mrs. Juha (Maria Emilia Ojala)","female",41,0,5,"3101295",39.6875,,"S",,, +3,0,"Pasic, Mr. Jakob","male",21,0,0,"315097",8.6625,,"S",,, +3,0,"Patchett, Mr. George","male",19,0,0,"358585",14.5000,,"S",,, +3,0,"Paulner, Mr. Uscher","male",,0,0,"3411",8.7125,,"C",,, +3,0,"Pavlovic, Mr. Stefo","male",32,0,0,"349242",7.8958,,"S",,, +3,0,"Peacock, Master. Alfred Edward","male",0.75,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, +3,0,"Peacock, Miss. Treasteall","female",3,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, +3,0,"Peacock, Mrs. Benjamin (Edith Nile)","female",26,0,2,"SOTON/O.Q. 3101315",13.7750,,"S",,, +3,0,"Pearce, Mr. Ernest","male",,0,0,"343271",7.0000,,"S",,, +3,0,"Pedersen, Mr. Olaf","male",,0,0,"345498",7.7750,,"S",,, +3,0,"Peduzzi, Mr. Joseph","male",,0,0,"A/5 2817",8.0500,,"S",,, +3,0,"Pekoniemi, Mr. Edvard","male",21,0,0,"STON/O 2. 3101294",7.9250,,"S",,, +3,0,"Peltomaki, Mr. Nikolai Johannes","male",25,0,0,"STON/O 2. 3101291",7.9250,,"S",,, +3,0,"Perkin, Mr. John Henry","male",22,0,0,"A/5 21174",7.2500,,"S",,, +3,1,"Persson, Mr. Ernst Ulrik","male",25,1,0,"347083",7.7750,,"S","15",, +3,1,"Peter, Master. Michael J","male",,1,1,"2668",22.3583,,"C","C",, +3,1,"Peter, Miss. Anna","female",,1,1,"2668",22.3583,"F E69","C","D",, +3,1,"Peter, Mrs. Catherine (Catherine Rizk)","female",,0,2,"2668",22.3583,,"C","D",, +3,0,"Peters, Miss. Katie","female",,0,0,"330935",8.1375,,"Q",,, +3,0,"Petersen, Mr. Marius","male",24,0,0,"342441",8.0500,,"S",,, +3,0,"Petranec, Miss. Matilda","female",28,0,0,"349245",7.8958,,"S",,, +3,0,"Petroff, Mr. Nedelio","male",19,0,0,"349212",7.8958,,"S",,, +3,0,"Petroff, Mr. Pastcho (""Pentcho"")","male",,0,0,"349215",7.8958,,"S",,, +3,0,"Petterson, Mr. Johan Emil","male",25,1,0,"347076",7.7750,,"S",,, +3,0,"Pettersson, Miss. Ellen Natalia","female",18,0,0,"347087",7.7750,,"S",,, +3,1,"Pickard, Mr. Berk (Berk Trembisky)","male",32,0,0,"SOTON/O.Q. 392078",8.0500,"E10","S","9",, +3,0,"Plotcharsky, Mr. Vasil","male",,0,0,"349227",7.8958,,"S",,, +3,0,"Pokrnic, Mr. Mate","male",17,0,0,"315095",8.6625,,"S",,, +3,0,"Pokrnic, Mr. Tome","male",24,0,0,"315092",8.6625,,"S",,, +3,0,"Radeff, Mr. Alexander","male",,0,0,"349223",7.8958,,"S",,, +3,0,"Rasmussen, Mrs. (Lena Jacobsen Solvang)","female",,0,0,"65305",8.1125,,"S",,, +3,0,"Razi, Mr. Raihed","male",,0,0,"2629",7.2292,,"C",,, +3,0,"Reed, Mr. James George","male",,0,0,"362316",7.2500,,"S",,, +3,0,"Rekic, Mr. Tido","male",38,0,0,"349249",7.8958,,"S",,, +3,0,"Reynolds, Mr. Harold J","male",21,0,0,"342684",8.0500,,"S",,, +3,0,"Rice, Master. Albert","male",10,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. Arthur","male",4,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. Eric","male",7,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. Eugene","male",2,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. George Hugh","male",8,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Mrs. William (Margaret Norton)","female",39,0,5,"382652",29.1250,,"Q",,"327", +3,0,"Riihivouri, Miss. Susanna Juhantytar ""Sanni""","female",22,0,0,"3101295",39.6875,,"S",,, +3,0,"Rintamaki, Mr. Matti","male",35,0,0,"STON/O 2. 3101273",7.1250,,"S",,, +3,1,"Riordan, Miss. Johanna ""Hannah""","female",,0,0,"334915",7.7208,,"Q","13",, +3,0,"Risien, Mr. Samuel Beard","male",,0,0,"364498",14.5000,,"S",,, +3,0,"Risien, Mrs. Samuel (Emma)","female",,0,0,"364498",14.5000,,"S",,, +3,0,"Robins, Mr. Alexander A","male",50,1,0,"A/5. 3337",14.5000,,"S",,"119", +3,0,"Robins, Mrs. Alexander A (Grace Charity Laury)","female",47,1,0,"A/5. 3337",14.5000,,"S",,"7", +3,0,"Rogers, Mr. William John","male",,0,0,"S.C./A.4. 23567",8.0500,,"S",,, +3,0,"Rommetvedt, Mr. Knud Paust","male",,0,0,"312993",7.7750,,"S",,, +3,0,"Rosblom, Miss. Salli Helena","female",2,1,1,"370129",20.2125,,"S",,, +3,0,"Rosblom, Mr. Viktor Richard","male",18,1,1,"370129",20.2125,,"S",,, +3,0,"Rosblom, Mrs. Viktor (Helena Wilhelmina)","female",41,0,2,"370129",20.2125,,"S",,, +3,1,"Roth, Miss. Sarah A","female",,0,0,"342712",8.0500,,"S","C",, +3,0,"Rouse, Mr. Richard Henry","male",50,0,0,"A/5 3594",8.0500,,"S",,, +3,0,"Rush, Mr. Alfred George John","male",16,0,0,"A/4. 20589",8.0500,,"S",,, +3,1,"Ryan, Mr. Edward","male",,0,0,"383162",7.7500,,"Q","14",, +3,0,"Ryan, Mr. Patrick","male",,0,0,"371110",24.1500,,"Q",,, +3,0,"Saad, Mr. Amin","male",,0,0,"2671",7.2292,,"C",,, +3,0,"Saad, Mr. Khalil","male",25,0,0,"2672",7.2250,,"C",,, +3,0,"Saade, Mr. Jean Nassr","male",,0,0,"2676",7.2250,,"C",,, +3,0,"Sadlier, Mr. Matthew","male",,0,0,"367655",7.7292,,"Q",,, +3,0,"Sadowitz, Mr. Harry","male",,0,0,"LP 1588",7.5750,,"S",,, +3,0,"Saether, Mr. Simon Sivertsen","male",38.5,0,0,"SOTON/O.Q. 3101262",7.2500,,"S",,"32", +3,0,"Sage, Master. Thomas Henry","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Master. William Henry","male",14.5,8,2,"CA. 2343",69.5500,,"S",,"67", +3,0,"Sage, Miss. Ada","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Miss. Constance Gladys","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Miss. Dorothy Edith ""Dolly""","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Miss. Stella Anna","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. Douglas Bullen","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. Frederick","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. George John Jr","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. John George","male",,1,9,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mrs. John (Annie Bullen)","female",,1,9,"CA. 2343",69.5500,,"S",,, +3,0,"Salander, Mr. Karl Johan","male",24,0,0,"7266",9.3250,,"S",,, +3,1,"Salkjelsvik, Miss. Anna Kristine","female",21,0,0,"343120",7.6500,,"S","C",, +3,0,"Salonen, Mr. Johan Werner","male",39,0,0,"3101296",7.9250,,"S",,, +3,0,"Samaan, Mr. Elias","male",,2,0,"2662",21.6792,,"C",,, +3,0,"Samaan, Mr. Hanna","male",,2,0,"2662",21.6792,,"C",,, +3,0,"Samaan, Mr. Youssef","male",,2,0,"2662",21.6792,,"C",,, +3,1,"Sandstrom, Miss. Beatrice Irene","female",1,1,1,"PP 9549",16.7000,"G6","S","13",, +3,1,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)","female",24,0,2,"PP 9549",16.7000,"G6","S","13",, +3,1,"Sandstrom, Miss. Marguerite Rut","female",4,1,1,"PP 9549",16.7000,"G6","S","13",, +3,1,"Sap, Mr. Julius","male",25,0,0,"345768",9.5000,,"S","11",, +3,0,"Saundercock, Mr. William Henry","male",20,0,0,"A/5. 2151",8.0500,,"S",,, +3,0,"Sawyer, Mr. Frederick Charles","male",24.5,0,0,"342826",8.0500,,"S",,"284", +3,0,"Scanlan, Mr. James","male",,0,0,"36209",7.7250,,"Q",,, +3,0,"Sdycoff, Mr. Todor","male",,0,0,"349222",7.8958,,"S",,, +3,0,"Shaughnessy, Mr. Patrick","male",,0,0,"370374",7.7500,,"Q",,, +3,1,"Sheerlinck, Mr. Jan Baptist","male",29,0,0,"345779",9.5000,,"S","11",, +3,0,"Shellard, Mr. Frederick William","male",,0,0,"C.A. 6212",15.1000,,"S",,, +3,1,"Shine, Miss. Ellen Natalia","female",,0,0,"330968",7.7792,,"Q",,, +3,0,"Shorney, Mr. Charles Joseph","male",,0,0,"374910",8.0500,,"S",,, +3,0,"Simmons, Mr. John","male",,0,0,"SOTON/OQ 392082",8.0500,,"S",,, +3,0,"Sirayanian, Mr. Orsen","male",22,0,0,"2669",7.2292,,"C",,, +3,0,"Sirota, Mr. Maurice","male",,0,0,"392092",8.0500,,"S",,, +3,0,"Sivic, Mr. Husein","male",40,0,0,"349251",7.8958,,"S",,, +3,0,"Sivola, Mr. Antti Wilhelm","male",21,0,0,"STON/O 2. 3101280",7.9250,,"S",,, +3,1,"Sjoblom, Miss. Anna Sofia","female",18,0,0,"3101265",7.4958,,"S","16",, +3,0,"Skoog, Master. Harald","male",4,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Master. Karl Thorsten","male",10,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Miss. Mabel","female",9,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Miss. Margit Elizabeth","female",2,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Mr. Wilhelm","male",40,1,4,"347088",27.9000,,"S",,, +3,0,"Skoog, Mrs. William (Anna Bernhardina Karlsson)","female",45,1,4,"347088",27.9000,,"S",,, +3,0,"Slabenoff, Mr. Petco","male",,0,0,"349214",7.8958,,"S",,, +3,0,"Slocovski, Mr. Selman Francis","male",,0,0,"SOTON/OQ 392086",8.0500,,"S",,, +3,0,"Smiljanic, Mr. Mile","male",,0,0,"315037",8.6625,,"S",,, +3,0,"Smith, Mr. Thomas","male",,0,0,"384461",7.7500,,"Q",,, +3,1,"Smyth, Miss. Julia","female",,0,0,"335432",7.7333,,"Q","13",, +3,0,"Soholt, Mr. Peter Andreas Lauritz Andersen","male",19,0,0,"348124",7.6500,"F G73","S",,, +3,0,"Somerton, Mr. Francis William","male",30,0,0,"A.5. 18509",8.0500,,"S",,, +3,0,"Spector, Mr. Woolf","male",,0,0,"A.5. 3236",8.0500,,"S",,, +3,0,"Spinner, Mr. Henry John","male",32,0,0,"STON/OQ. 369943",8.0500,,"S",,, +3,0,"Staneff, Mr. Ivan","male",,0,0,"349208",7.8958,,"S",,, +3,0,"Stankovic, Mr. Ivan","male",33,0,0,"349239",8.6625,,"C",,, +3,1,"Stanley, Miss. Amy Zillah Elsie","female",23,0,0,"CA. 2314",7.5500,,"S","C",, +3,0,"Stanley, Mr. Edward Roland","male",21,0,0,"A/4 45380",8.0500,,"S",,, +3,0,"Storey, Mr. Thomas","male",60.5,0,0,"3701",,,"S",,"261", +3,0,"Stoytcheff, Mr. Ilia","male",19,0,0,"349205",7.8958,,"S",,, +3,0,"Strandberg, Miss. Ida Sofia","female",22,0,0,"7553",9.8375,,"S",,, +3,1,"Stranden, Mr. Juho","male",31,0,0,"STON/O 2. 3101288",7.9250,,"S","9",, +3,0,"Strilic, Mr. Ivan","male",27,0,0,"315083",8.6625,,"S",,, +3,0,"Strom, Miss. Telma Matilda","female",2,0,1,"347054",10.4625,"G6","S",,, +3,0,"Strom, Mrs. Wilhelm (Elna Matilda Persson)","female",29,1,1,"347054",10.4625,"G6","S",,, +3,1,"Sunderland, Mr. Victor Francis","male",16,0,0,"SOTON/OQ 392089",8.0500,,"S","B",, +3,1,"Sundman, Mr. Johan Julian","male",44,0,0,"STON/O 2. 3101269",7.9250,,"S","15",, +3,0,"Sutehall, Mr. Henry Jr","male",25,0,0,"SOTON/OQ 392076",7.0500,,"S",,, +3,0,"Svensson, Mr. Johan","male",74,0,0,"347060",7.7750,,"S",,, +3,1,"Svensson, Mr. Johan Cervin","male",14,0,0,"7538",9.2250,,"S","13",, +3,0,"Svensson, Mr. Olof","male",24,0,0,"350035",7.7958,,"S",,, +3,1,"Tenglin, Mr. Gunnar Isidor","male",25,0,0,"350033",7.7958,,"S","13 15",, +3,0,"Theobald, Mr. Thomas Leonard","male",34,0,0,"363294",8.0500,,"S",,"176", +3,1,"Thomas, Master. Assad Alexander","male",0.42,0,1,"2625",8.5167,,"C","16",, +3,0,"Thomas, Mr. Charles P","male",,1,0,"2621",6.4375,,"C",,, +3,0,"Thomas, Mr. John","male",,0,0,"2681",6.4375,,"C",,, +3,0,"Thomas, Mr. Tannous","male",,0,0,"2684",7.2250,,"C",,, +3,1,"Thomas, Mrs. Alexander (Thamine ""Thelma"")","female",16,1,1,"2625",8.5167,,"C","14",, +3,0,"Thomson, Mr. Alexander Morrison","male",,0,0,"32302",8.0500,,"S",,, +3,0,"Thorneycroft, Mr. Percival","male",,1,0,"376564",16.1000,,"S",,, +3,1,"Thorneycroft, Mrs. Percival (Florence Kate White)","female",,1,0,"376564",16.1000,,"S","10",, +3,0,"Tikkanen, Mr. Juho","male",32,0,0,"STON/O 2. 3101293",7.9250,,"S",,, +3,0,"Tobin, Mr. Roger","male",,0,0,"383121",7.7500,"F38","Q",,, +3,0,"Todoroff, Mr. Lalio","male",,0,0,"349216",7.8958,,"S",,, +3,0,"Tomlin, Mr. Ernest Portage","male",30.5,0,0,"364499",8.0500,,"S",,"50", +3,0,"Torber, Mr. Ernst William","male",44,0,0,"364511",8.0500,,"S",,, +3,0,"Torfa, Mr. Assad","male",,0,0,"2673",7.2292,,"C",,, +3,1,"Tornquist, Mr. William Henry","male",25,0,0,"LINE",0.0000,,"S","15",, +3,0,"Toufik, Mr. Nakli","male",,0,0,"2641",7.2292,,"C",,, +3,1,"Touma, Master. Georges Youssef","male",7,1,1,"2650",15.2458,,"C","C",, +3,1,"Touma, Miss. Maria Youssef","female",9,1,1,"2650",15.2458,,"C","C",, +3,1,"Touma, Mrs. Darwis (Hanne Youssef Razi)","female",29,0,2,"2650",15.2458,,"C","C",, +3,0,"Turcin, Mr. Stjepan","male",36,0,0,"349247",7.8958,,"S",,, +3,1,"Turja, Miss. Anna Sofia","female",18,0,0,"4138",9.8417,,"S","15",, +3,1,"Turkula, Mrs. (Hedwig)","female",63,0,0,"4134",9.5875,,"S","15",, +3,0,"van Billiard, Master. James William","male",,1,1,"A/5. 851",14.5000,,"S",,, +3,0,"van Billiard, Master. Walter John","male",11.5,1,1,"A/5. 851",14.5000,,"S",,"1", +3,0,"van Billiard, Mr. Austin Blyler","male",40.5,0,2,"A/5. 851",14.5000,,"S",,"255", +3,0,"Van Impe, Miss. Catharina","female",10,0,2,"345773",24.1500,,"S",,, +3,0,"Van Impe, Mr. Jean Baptiste","male",36,1,1,"345773",24.1500,,"S",,, +3,0,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)","female",30,1,1,"345773",24.1500,,"S",,, +3,0,"van Melkebeke, Mr. Philemon","male",,0,0,"345777",9.5000,,"S",,, +3,0,"Vande Velde, Mr. Johannes Joseph","male",33,0,0,"345780",9.5000,,"S",,, +3,0,"Vande Walle, Mr. Nestor Cyriel","male",28,0,0,"345770",9.5000,,"S",,, +3,0,"Vanden Steen, Mr. Leo Peter","male",28,0,0,"345783",9.5000,,"S",,, +3,0,"Vander Cruyssen, Mr. Victor","male",47,0,0,"345765",9.0000,,"S",,, +3,0,"Vander Planke, Miss. Augusta Maria","female",18,2,0,"345764",18.0000,,"S",,, +3,0,"Vander Planke, Mr. Julius","male",31,3,0,"345763",18.0000,,"S",,, +3,0,"Vander Planke, Mr. Leo Edmondus","male",16,2,0,"345764",18.0000,,"S",,, +3,0,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)","female",31,1,0,"345763",18.0000,,"S",,, +3,1,"Vartanian, Mr. David","male",22,0,0,"2658",7.2250,,"C","13 15",, +3,0,"Vendel, Mr. Olof Edvin","male",20,0,0,"350416",7.8542,,"S",,, +3,0,"Vestrom, Miss. Hulda Amanda Adolfina","female",14,0,0,"350406",7.8542,,"S",,, +3,0,"Vovk, Mr. Janko","male",22,0,0,"349252",7.8958,,"S",,, +3,0,"Waelens, Mr. Achille","male",22,0,0,"345767",9.0000,,"S",,,"Antwerp, Belgium / Stanton, OH" +3,0,"Ware, Mr. Frederick","male",,0,0,"359309",8.0500,,"S",,, +3,0,"Warren, Mr. Charles William","male",,0,0,"C.A. 49867",7.5500,,"S",,, +3,0,"Webber, Mr. James","male",,0,0,"SOTON/OQ 3101316",8.0500,,"S",,, +3,0,"Wenzel, Mr. Linhart","male",32.5,0,0,"345775",9.5000,,"S",,"298", +3,1,"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)","female",38,0,0,"2688",7.2292,,"C","C",, +3,0,"Widegren, Mr. Carl/Charles Peter","male",51,0,0,"347064",7.7500,,"S",,, +3,0,"Wiklund, Mr. Jakob Alfred","male",18,1,0,"3101267",6.4958,,"S",,"314", +3,0,"Wiklund, Mr. Karl Johan","male",21,1,0,"3101266",6.4958,,"S",,, +3,1,"Wilkes, Mrs. James (Ellen Needs)","female",47,1,0,"363272",7.0000,,"S",,, +3,0,"Willer, Mr. Aaron (""Abi Weller"")","male",,0,0,"3410",8.7125,,"S",,, +3,0,"Willey, Mr. Edward","male",,0,0,"S.O./P.P. 751",7.5500,,"S",,, +3,0,"Williams, Mr. Howard Hugh ""Harry""","male",,0,0,"A/5 2466",8.0500,,"S",,, +3,0,"Williams, Mr. Leslie","male",28.5,0,0,"54636",16.1000,,"S",,"14", +3,0,"Windelov, Mr. Einar","male",21,0,0,"SOTON/OQ 3101317",7.2500,,"S",,, +3,0,"Wirz, Mr. Albert","male",27,0,0,"315154",8.6625,,"S",,"131", +3,0,"Wiseman, Mr. Phillippe","male",,0,0,"A/4. 34244",7.2500,,"S",,, +3,0,"Wittevrongel, Mr. Camille","male",36,0,0,"345771",9.5000,,"S",,, +3,0,"Yasbeck, Mr. Antoni","male",27,1,0,"2659",14.4542,,"C","C",, +3,1,"Yasbeck, Mrs. Antoni (Selini Alexander)","female",15,1,0,"2659",14.4542,,"C",,, +3,0,"Youseff, Mr. Gerious","male",45.5,0,0,"2628",7.2250,,"C",,"312", +3,0,"Yousif, Mr. Wazli","male",,0,0,"2647",7.2250,,"C",,, +3,0,"Yousseff, Mr. Gerious","male",,0,0,"2627",14.4583,,"C",,, +3,0,"Zabour, Miss. Hileni","female",14.5,1,0,"2665",14.4542,,"C",,"328", +3,0,"Zabour, Miss. Thamine","female",,1,0,"2665",14.4542,,"C",,, +3,0,"Zakarian, Mr. Mapriededer","male",26.5,0,0,"2656",7.2250,,"C",,"304", +3,0,"Zakarian, Mr. Ortin","male",27,0,0,"2670",7.2250,,"C",,, +3,0,"Zimmerman, Mr. Leo","male",29,0,0,"315082",7.8750,,"S",,, From d1e1fc5c9d637395e32235e45891698478929700 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 18 May 2024 22:37:38 +0530 Subject: [PATCH 069/405] Add files via upload --- .../Importing_and_Exporting_Data_in_Pandas.md | 291 ++++++++++++++++++ 1 file changed, 291 insertions(+) create mode 100644 contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md diff --git a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md new file mode 100644 index 0000000..a6949d2 --- /dev/null +++ b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md @@ -0,0 +1,291 @@ +# Importing_and_Exporting_Data_in_Pandas + +>Created by Krishna Kaushik + +- **Now we're able to create `Series` and `DataFrames` in pandas, but we usually do not do this , in practice we import the data which is in the form of .csv (Comma Seperated Values) , a spreadsheet file or something similar.** + +- *Good news is that pandas allows for easy importing of data like this through functions such as ``pd.read_csv()`` and ``pd.read_excel()`` for Microsoft Excel files.* + +## 1. Importing from a Google sheet to a pandas dataframe + +*Let's say that you wanted to get the information from Google Sheet document into a pandas DataFrame.*. + +*You could export it as a .csv file and then import it using ``pd.read_csv()``.* + +*In this case, the exported .csv file is called `Titanic.csv`* + + +```python +## Importing Titanic Data set +import pandas as pd + +titanic_df= pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Titanic.csv") +titanic_df +``` + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
pclasssurvivednamesexagesibspparchticketfarecabinembarkedboatbodyhome.dest
011Allen, Miss. Elisabeth Waltonfemale29.000024160211.3375B5S2NaNSt Louis, MO
111Allison, Master. Hudson Trevormale0.9212113781151.5500C22 C26S11NaNMontreal, PQ / Chesterville, ON
210Allison, Miss. Helen Lorainefemale2.0012113781151.5500C22 C26SNaNNaNMontreal, PQ / Chesterville, ON
310Allison, Mr. Hudson Joshua Creightonmale30.0012113781151.5500C22 C26SNaN135.0Montreal, PQ / Chesterville, ON
410Allison, Mrs. Hudson J C (Bessie Waldo Daniels)female25.0012113781151.5500C22 C26SNaNNaNMontreal, PQ / Chesterville, ON
.............................................
130430Zabour, Miss. Hilenifemale14.5010266514.4542NaNCNaN328.0NaN
130530Zabour, Miss. ThaminefemaleNaN10266514.4542NaNCNaNNaNNaN
130630Zakarian, Mr. Mapriededermale26.500026567.2250NaNCNaN304.0NaN
130730Zakarian, Mr. Ortinmale27.000026707.2250NaNCNaNNaNNaN
130830Zimmerman, Mr. Leomale29.00003150827.8750NaNSNaNNaNNaN
+

1309 rows × 14 columns

+
+ + + +The dataset I am using here for your reference is taken from the same repository i.e ``learn-python`` (https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Titanic.csv) I uploaded it you can use it from there. + +**Now we've got the same data from the Google Spreadsheet , but now available as ``pandas DataFrame`` which means we can now apply all pandas functionality over it.** + +#### Note: The quiet important thing i am telling is that ``pd.read_csv()`` takes the location of the file (which is in your current working directory) or the hyperlink of the dataset from the other source. + +#### But if you want to import the data from Github you can't directly use its link , you have to first convert it to raw by clicking on the raw button present in the repo . + +#### Also you can't use the data directly from `Kaggle` you have to use ``kaggle API`` + +## 2. The Anatomy of DataFrame + +**Different functions use different labels for different things, and can get a little confusing.** + +- Rows are refer as ``axis=0`` +- columns are refer as ``axis=1`` + +## 3. Exporting Data + +**OK, so after you've made a few changes to your data, you might want to export it and save it so someone else can access the changes.** + +**pandas allows you to export ``DataFrame's`` to ``.csv`` format using ``.to_csv()``, or to a spreadsheet format using .to_excel().** + +### Exporting a dataframe to a CSV + +**We haven't made any changes yet to the ``titanic_df`` DataFrame but let's try to export it.** + + +```python +#Export the titanic_df DataFrame to csv +titanic_df.to_csv("exported_titanic.csv") +``` + +Running this will save a file called ``exported_titanic.csv`` to the current folder. From bf4dcff08b1c47b0f15a63634879390156d2f995 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 18 May 2024 22:39:54 +0530 Subject: [PATCH 070/405] 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 f2a3fa7..84871dd 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) - [Pandas Introduction and Dataframes in Pandas](Introduction_to_Pandas_Library_and_DataFrames.md) +- [Importing and Exportin data in pandas](Importing_and_Exporting_Data_in_Pandas.md) From 849f5abc6e072a7f96aec848fb8d0c5658518be8 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 18 May 2024 22:40:30 +0530 Subject: [PATCH 071/405] Update Importing_and_Exporting_Data_in_Pandas.md --- .../Importing_and_Exporting_Data_in_Pandas.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md index a6949d2..4d0ffad 100644 --- a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md +++ b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md @@ -22,24 +22,6 @@ import pandas as pd titanic_df= pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Titanic.csv") titanic_df ``` - - - - -
- From be8993b6164d12fab5d3ec6e94172b8da5deadef Mon Sep 17 00:00:00 2001 From: Vrisha Shah <74671946+Vrisha213@users.noreply.github.com> Date: Sun, 19 May 2024 09:28:58 +0530 Subject: [PATCH 072/405] Create support-vector-machine.md added conetnt on SVM --- .../support-vector-machine.md | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 contrib/machine-learning/support-vector-machine.md diff --git a/contrib/machine-learning/support-vector-machine.md b/contrib/machine-learning/support-vector-machine.md new file mode 100644 index 0000000..90ee922 --- /dev/null +++ b/contrib/machine-learning/support-vector-machine.md @@ -0,0 +1,52 @@ +Support Vector Machine or SVM is one of the most popular Supervised Learning algorithms, which is used for Classification as well as Regression problems. However, primarily, it is used for Classification problems in Machine Learning. +SVM can be of two types - +1. Linear SVM: Linear SVM is used for linearly separable data, which means if a dataset can be classified into two classes by using a single straight line, then such data is termed as linearly separable data, and classifier is used called as Linear SVM classifier. +2. Non-linear SVM: Non-Linear SVM is used for non-linearly separated data, which means if a dataset cannot be classified by using a straight line, then such data is termed as non-linear data and classifier used is called as Non-linear SVM classifier. + +Working of SVM - The goal of SVM is to find a hyperplane that separates the data points into different classes. A hyperplane is a line in 2D space, a plane in 3D space, or a higher-dimensional surface in n-dimensional space. The hyperplane is chosen in such a way that it maximizes the margin, which is the distance between the hyperplane and the closest data points of each class. The closest data points are called the support vectors. +The distance between the hyperplane and a data point "x" can be calculated using the formula − +distance = (w . x + b) / ||w|| +where "w" is the weight vector, "b" is the bias term, and "||w||" is the Euclidean norm of the weight vector. The weight vector "w" is perpendicular to the hyperplane and determines its orientation, while the bias term "b" determines its position. +The optimal hyperplane is found by solving an optimization problem, which is to maximize the margin subject to the constraint that all data points are correctly classified. In other words, we want to find the hyperplane that maximizes the margin between the two classes while ensuring that no data point is misclassified. This is a convex optimization problem that can be solved using quadratic programming. If the data points are not linearly separable, we can use a technique called kernel trick to map the data points into a higher-dimensional space where they become separable. The kernel function computes the inner product between the mapped data points without computing the mapping itself. This allows us to work with the data points in the higherdimensional space without incurring the computational cost of mapping them. + +1. Hyperplane: +There can be multiple lines/decision boundaries to segregate the classes in n-dimensional space, but we need to find out the best decision boundary that helps to classify the data points. This best boundary is known as the hyperplane of SVM. +The dimensions of the hyperplane depend on the features present in the dataset, which means if there are 2 features, then hyperplane will be a straight line. And if there are 3 features, then hyperplane will be a 2-dimension plane. We always create a hyperplane that has a maximum margin, which means the maximum distance between the data points. +2. Support Vectors: +The data points or vectors that are the closest to the hyperplane and which affect the position of the hyperplane are termed as Support Vector. Since these vectors support the hyperplane, hence called a Support vector. +3. Margin: +It may be defined as the gap between two lines on the closet data points of different classes. It can be calculated as the perpendicular distance from the line to the support vectors. Large margin is considered as a good margin and small margin is considered as a bad margin. + +We will use the famous Iris dataset, which contains the sepal length, sepal width, petal length, and petal width of three species of iris flowers: Iris setosa, Iris versicolor, and Iris virginica. The goal is to classify the flowers into their respective species based on these four features. We load the iris dataset using load_iris and split the data into training and testing sets using train_test_split. We use a test size of 0.2, which means that 20% of the data will be used for testing and 80% for training. We set the random state to 42 to ensure reproducibility of the results. + +# Implemetation of SVM in Python + +from sklearn.datasets import load_iris +from sklearn.model_selection import train_test_split +from sklearn.svm import SVC +from sklearn.metrics import accuracy_score + +# load the iris dataset +iris = load_iris() + +# split the data into training and testing sets +X_train, X_test, y_train, y_test = train_test_split(iris.data, +iris.target, test_size=0.2, random_state=42) + +# create an SVM classifier with a linear kernel +svm = SVC(kernel='linear') + +# train the SVM classifier on the training set +svm.fit(X_train, y_train) + +# make predictions on the testing set +y_pred = svm.predict(X_test) + +# calculate the accuracy of the classifier +accuracy = accuracy_score(y_test, y_pred) +print("Accuracy:", accuracy) + +# Output +Accuracy: 1 + + From 4be728eb4764637fa8072aeebcaa9965e619d578 Mon Sep 17 00:00:00 2001 From: Ananyagra24 <155280507+Ananyagra24@users.noreply.github.com> Date: Sun, 19 May 2024 09:44:37 +0530 Subject: [PATCH 074/405] Update dice_roller.md --- contrib/mini-projects/dice_roller.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/contrib/mini-projects/dice_roller.md b/contrib/mini-projects/dice_roller.md index c083934..6e1b793 100644 --- a/contrib/mini-projects/dice_roller.md +++ b/contrib/mini-projects/dice_roller.md @@ -1,8 +1,15 @@ +Dice Roller +
+The aim of this project is to replicate a dice and generate a random number from the numbers 1 to 6.

+For this first we will import the random library which will help make random choices. ``` import random def dice(): dice_no = random.choice([1,2,3,4,5,6]) return "You got " + str(dice_no) +``` +The above snippet of code defines a function called "dice( )" which makes the random choice and returns the number that is generated. +``` def roll_dice(): print("Hey Guys, you will now roll a single dice using Python!") while True: @@ -17,3 +24,6 @@ def roll_dice(): print("Thanks for rolling the dice.") roll_dice() ``` +The above code defines a function called "roll_dice( )" which interacts with the user.
+It prompts the user to give an input and if the input is k,the code proceeds further to generate a random number or gives the message of invalid input and asks the user to try again.
+After the dice has been rolled once, the function asks the user whether they want a reroll in the form of a yes or no question.The dice is rolled again if the user gives 'yes' as an answer and exits the code if the user replies with anything other than yes. From 26053d5382c4f2e26160bba7ea1385b92c228c5c Mon Sep 17 00:00:00 2001 From: Eshparsi Date: Sun, 19 May 2024 12:08:10 +0530 Subject: [PATCH 075/405] graph --- contrib/Data-Structure-Graphs/graph.md | 220 +++++++++++++++++++++++++ contrib/Data-Structure-Graphs/index.md | 3 + 2 files changed, 223 insertions(+) create mode 100644 contrib/Data-Structure-Graphs/graph.md create mode 100644 contrib/Data-Structure-Graphs/index.md diff --git a/contrib/Data-Structure-Graphs/graph.md b/contrib/Data-Structure-Graphs/graph.md new file mode 100644 index 0000000..b9bd709 --- /dev/null +++ b/contrib/Data-Structure-Graphs/graph.md @@ -0,0 +1,220 @@ +# Graph Data Stucture + +Graph is a non-linear data structure consisting of vertices and edges. It is a powerful tool for representing and analyzing complex relationships between objects or entities. + +## Components of a Graph: + +**Vertices:** Vertices are the fundamental units of the graph. Sometimes, vertices are also known as vertex or nodes. Every node/vertex can be labeled or unlabeled. +**Edges:** Edges are drawn or used to connect two nodes of the graph. It can be ordered pair of nodes in a directed graph. Edges can connect any two nodes in any possible way. There are no rules. very edge can be labelled/unlabelled. + +## Basic Operations on Graphs: +- Insertion of Nodes/Edges in the graph +- Deletion of Nodes/Edges in the graph +- Searching on Graphs +- Traversal of Graphs + +## Types of Graph ## + + +**1.Undirected Graph:** In an undirected graph, edges have no direction, and they represent symmetric relationships between nodes. If there is an edge between node A and node B, you can travel from A to B and from B to A. + +**2. Directed Graph (Digraph):** In a directed graph, edges have a direction, indicating a one-way relationship between nodes. If there is an edge from node A to node B, you can travel from A to B but not necessarily from B to A. + +**3. Weighted Graph:** In a weighted graph, edges have associated weights or costs. These weights can represent various attributes such as distance, cost, or capacity. Weighted graphs are commonly used in applications like route planning or network optimization. + +**4. Cyclic Graph:** A cyclic graph contains at least one cycle, which is a path that starts and ends at the same node. In other words, you can traverse the graph and return to a previously visited node by following the edges. + +**5. Acyclic Graph:** An acyclic graph, as the name suggests, does not contain any cycles. This type of graph is often used in scenarios where a cycle would be nonsensical or undesirable, such as representing dependencies between tasks or events. + +**6. Tree:** A tree is a special type of acyclic graph where each node has a unique parent except for the root node, which has no parent. Trees have a hierarchical structure and are frequently used in data structures like binary trees or decision trees. + +## Representation of Graphs:## +There are two ways to store a graph: + +**1. Adjacency Matrix** +In this method, the graph is stored in the form of the 2D matrix where rows and columns denote vertices. Each entry in the matrix represents the weight of the edge between those vertices. + +```python +def create_adjacency_matrix(graph): + num_vertices = len(graph) + + adj_matrix = [[0] * num_vertices for _ in range(num_vertices)] + + for i in range(num_vertices): + for j in range(num_vertices): + if graph[i][j] == 1: + adj_matrix[i][j] = 1 + adj_matrix[j][i] = 1 + + return adj_matrix + + +graph = [ + [0, 1, 0, 0], + [1, 0, 1, 0], + [0, 1, 0, 1], + [0, 0, 1, 0] +] + +adj_matrix = create_adjacency_matrix(graph) + +for row in adj_matrix: + print(' '.join(map(str, row))) + +``` + +**2. Adjacency List** +This graph is represented as a collection of linked lists. There is an array of pointer which points to the edges connected to that vertex. + +```python +def create_adjacency_list(edges, num_vertices): + adj_list = [[] for _ in range(num_vertices)] + + for u, v in edges: + adj_list[u].append(v) + adj_list[v].append(u) + + return adj_list + +if __name__ == "__main__": + num_vertices = 4 + edges = [(0, 1), (0, 2), (1, 2), (2, 3), (3, 1)] + + adj_list = create_adjacency_list(edges, num_vertices) + + for i in range(num_vertices): + print(f"{i} -> {' '.join(map(str, adj_list[i]))}") +``` +`Output +0 -> 1 2 +1 -> 0 2 3 +2 -> 0 1 3 +3 -> 2 1 ` + + + +# Traversal Techniques # + +## Breadth First Search (BFS) ## +- It is a graph traversal algorithm that explores all the vertices in a graph at the current depth before moving on to the vertices at the next depth level. +- It starts at a specified vertex and visits all its neighbors before moving on to the next level of neighbors. +BFS is commonly used in algorithms for pathfinding, connected components, and shortest path problems in graphs. + +**Steps of BFS algorithms** + + +- **Step1:** Initially queue and visited arrays are empty. +- **Step2:** Push node 0 into queue and mark it visited. +- **Step 3:** Remove node 0 from the front of queue and visit the unvisited neighbours and push them into queue. +- **Step 4:** Remove node 1 from the front of queue and visit the unvisited neighbours and push them into queue. +- **Step 5:** Remove node 2 from the front of queue and visit the unvisited neighbours and push them into queue. +- **Step 6:** Remove node 3 from the front of queue and visit the unvisited neighbours and push them into queue. +- **Steps 7:** Remove node 4 from the front of queue and visit the unvisited neighbours and push them into queue. + +```python + +from collections import deque + +def bfs(adjList, startNode, visited): + q = deque() + + visited[startNode] = True + q.append(startNode) + + while q: + currentNode = q.popleft() + print(currentNode, end=" ") + + for neighbor in adjList[currentNode]: + if not visited[neighbor]: + visited[neighbor] = True + q.append(neighbor) + +def addEdge(adjList, u, v): + adjList[u].append(v) + +def main(): + vertices = 5 + + adjList = [[] for _ in range(vertices)] + + addEdge(adjList, 0, 1) + addEdge(adjList, 0, 2) + addEdge(adjList, 1, 3) + addEdge(adjList, 1, 4) + addEdge(adjList, 2, 4) + + visited = [False] * vertices + + print("Breadth First Traversal", end=" ") + bfs(adjList, 0, visited) + +if __name__ == "__main__": #Output : Breadth First Traversal 0 1 2 3 4 + main() + +``` + +**Time Complexity:** `O(V+E)`, where V is the number of nodes and E is the number of edges. +**Auxiliary Space:** `O(V)` + + +## Depth-first search ## + +Depth-first search is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible along each branch before backtracking. + +**Steps of DFS algorithms** +- **Step1:** Initially stack and visited arrays are empty. +- **Step 2:** Visit 0 and put its adjacent nodes which are not visited yet into the stack. +- **Step 3:** Now, Node 1 at the top of the stack, so visit node 1 and pop it from the stack and put all of its adjacent nodes which are not visited in the stack. +- **Step 4:** Now, Node 2 at the top of the stack, so visit node 2 and pop it from the stack and put all of its adjacent nodes which are not visited (i.e, 3, 4) in the stack. +- **Step 5:** Now, Node 4 at the top of the stack, so visit node 4 and pop it from the stack and put all of its adjacent nodes which are not visited in the stack. +- **Step 6:** Now, Node 3 at the top of the stack, so visit node 3 and pop it from the stack and put all of its adjacent nodes which are not visited in the stack. + + + +```python +from collections import defaultdict + +class Graph: + + def __init__(self): + + self.graph = defaultdict(list) + + def addEdge(self, u, v): + self.graph[u].append(v) + + def DFSUtil(self, v, visited): + + visited.add(v) + print(v, end=' ') + + for neighbour in self.graph[v]: + if neighbour not in visited: + self.DFSUtil(neighbour, visited) + + def DFS(self, v): + + visited = set() + + self.DFSUtil(v, visited) + +if __name__ == "__main__": + g = Graph() + g.addEdge(0, 1) + g.addEdge(0, 2) + g.addEdge(1, 2) + g.addEdge(2, 0) + g.addEdge(2, 3) + g.addEdge(3, 3) + + print("Depth First Traversal (starting from vertex 2): ",g.DFS(2)) #Output: Depth First Traversal (starting from vertex 2): 2 0 1 3 + +``` + +**Time complexity:** `O(V + E)`, where V is the number of vertices and E is the number of edges in the graph. +**Auxiliary Space:** `O(V + E)`, since an extra visited array of size V is required, And stack size for iterative call to DFS function. + +
+ + diff --git a/contrib/Data-Structure-Graphs/index.md b/contrib/Data-Structure-Graphs/index.md new file mode 100644 index 0000000..6471576 --- /dev/null +++ b/contrib/Data-Structure-Graphs/index.md @@ -0,0 +1,3 @@ +# List of sections + +- [Graphs](graph.md) \ No newline at end of file From 0db9cef68cc452409013ad9d94335d8e1e0c4124 Mon Sep 17 00:00:00 2001 From: Eshparsi Date: Sun, 19 May 2024 12:21:46 +0530 Subject: [PATCH 076/405] g --- contrib/Data-Structure-Graphs/graph.md | 61 +++++++++++++------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/contrib/Data-Structure-Graphs/graph.md b/contrib/Data-Structure-Graphs/graph.md index b9bd709..9837896 100644 --- a/contrib/Data-Structure-Graphs/graph.md +++ b/contrib/Data-Structure-Graphs/graph.md @@ -2,21 +2,22 @@ Graph is a non-linear data structure consisting of vertices and edges. It is a powerful tool for representing and analyzing complex relationships between objects or entities. -## Components of a Graph: +## Components of a Graph -**Vertices:** Vertices are the fundamental units of the graph. Sometimes, vertices are also known as vertex or nodes. Every node/vertex can be labeled or unlabeled. -**Edges:** Edges are drawn or used to connect two nodes of the graph. It can be ordered pair of nodes in a directed graph. Edges can connect any two nodes in any possible way. There are no rules. very edge can be labelled/unlabelled. +1. **Vertices:** Vertices are the fundamental units of the graph. Sometimes, vertices are also known as vertex or nodes. Every node/vertex can be labeled or unlabeled. -## Basic Operations on Graphs: +2. **Edges:** Edges are drawn or used to connect two nodes of the graph. It can be ordered pair of nodes in a directed graph. Edges can connect any two nodes in any possible way. There are no rules. very edge can be labelled/unlabelled. + +## Basic Operations on Graphs - Insertion of Nodes/Edges in the graph - Deletion of Nodes/Edges in the graph - Searching on Graphs - Traversal of Graphs -## Types of Graph ## +## Types of Graph -**1.Undirected Graph:** In an undirected graph, edges have no direction, and they represent symmetric relationships between nodes. If there is an edge between node A and node B, you can travel from A to B and from B to A. +**1. Undirected Graph:** In an undirected graph, edges have no direction, and they represent symmetric relationships between nodes. If there is an edge between node A and node B, you can travel from A to B and from B to A. **2. Directed Graph (Digraph):** In a directed graph, edges have a direction, indicating a one-way relationship between nodes. If there is an edge from node A to node B, you can travel from A to B but not necessarily from B to A. @@ -28,10 +29,10 @@ Graph is a non-linear data structure consisting of vertices and edges. It is a p **6. Tree:** A tree is a special type of acyclic graph where each node has a unique parent except for the root node, which has no parent. Trees have a hierarchical structure and are frequently used in data structures like binary trees or decision trees. -## Representation of Graphs:## +## Representation of Graphs There are two ways to store a graph: -**1. Adjacency Matrix** +1. **Adjacency Matrix** In this method, the graph is stored in the form of the 2D matrix where rows and columns denote vertices. Each entry in the matrix represents the weight of the edge between those vertices. ```python @@ -63,8 +64,8 @@ for row in adj_matrix: ``` -**2. Adjacency List** -This graph is represented as a collection of linked lists. There is an array of pointer which points to the edges connected to that vertex. +2. **Adjacency List** +In this method, the graph is represented as a collection of linked lists. There is an array of pointer which points to the edges connected to that vertex. ```python def create_adjacency_list(edges, num_vertices): @@ -85,17 +86,17 @@ if __name__ == "__main__": for i in range(num_vertices): print(f"{i} -> {' '.join(map(str, adj_list[i]))}") ``` -`Output -0 -> 1 2 -1 -> 0 2 3 -2 -> 0 1 3 -3 -> 2 1 ` +`Output` +`0 -> 1 2` +`1 -> 0 2 3` +`2 -> 0 1 3` +`3 -> 2 1 ` -# Traversal Techniques # +# Traversal Techniques -## Breadth First Search (BFS) ## +## Breadth First Search (BFS) - It is a graph traversal algorithm that explores all the vertices in a graph at the current depth before moving on to the vertices at the next depth level. - It starts at a specified vertex and visits all its neighbors before moving on to the next level of neighbors. BFS is commonly used in algorithms for pathfinding, connected components, and shortest path problems in graphs. @@ -103,13 +104,13 @@ BFS is commonly used in algorithms for pathfinding, connected components, and sh **Steps of BFS algorithms** -- **Step1:** Initially queue and visited arrays are empty. -- **Step2:** Push node 0 into queue and mark it visited. +- **Step 1:** Initially queue and visited arrays are empty. +- **Step 2:** Push node 0 into queue and mark it visited. - **Step 3:** Remove node 0 from the front of queue and visit the unvisited neighbours and push them into queue. - **Step 4:** Remove node 1 from the front of queue and visit the unvisited neighbours and push them into queue. - **Step 5:** Remove node 2 from the front of queue and visit the unvisited neighbours and push them into queue. - **Step 6:** Remove node 3 from the front of queue and visit the unvisited neighbours and push them into queue. -- **Steps 7:** Remove node 4 from the front of queue and visit the unvisited neighbours and push them into queue. +- **Step 7:** Remove node 4 from the front of queue and visit the unvisited neighbours and push them into queue. ```python @@ -154,16 +155,17 @@ if __name__ == "__main__": #Output : Breadth First Traversal 0 1 2 3 4 ``` -**Time Complexity:** `O(V+E)`, where V is the number of nodes and E is the number of edges. -**Auxiliary Space:** `O(V)` +- **Time Complexity:** `O(V+E)`, where V is the number of nodes and E is the number of edges. +- **Auxiliary Space:** `O(V)` -## Depth-first search ## +## Depth-first search Depth-first search is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible along each branch before backtracking. **Steps of DFS algorithms** -- **Step1:** Initially stack and visited arrays are empty. + +- **Step 1:** Initially stack and visited arrays are empty. - **Step 2:** Visit 0 and put its adjacent nodes which are not visited yet into the stack. - **Step 3:** Now, Node 1 at the top of the stack, so visit node 1 and pop it from the stack and put all of its adjacent nodes which are not visited in the stack. - **Step 4:** Now, Node 2 at the top of the stack, so visit node 2 and pop it from the stack and put all of its adjacent nodes which are not visited (i.e, 3, 4) in the stack. @@ -178,14 +180,12 @@ from collections import defaultdict class Graph: def __init__(self): - self.graph = defaultdict(list) def addEdge(self, u, v): self.graph[u].append(v) def DFSUtil(self, v, visited): - visited.add(v) print(v, end=' ') @@ -194,9 +194,7 @@ class Graph: self.DFSUtil(neighbour, visited) def DFS(self, v): - visited = set() - self.DFSUtil(v, visited) if __name__ == "__main__": @@ -208,12 +206,13 @@ if __name__ == "__main__": g.addEdge(2, 3) g.addEdge(3, 3) - print("Depth First Traversal (starting from vertex 2): ",g.DFS(2)) #Output: Depth First Traversal (starting from vertex 2): 2 0 1 3 + print("Depth First Traversal (starting from vertex 2): ",g.DFS(2)) ``` +`Output: Depth First Traversal (starting from vertex 2): 2 0 1 3 ` -**Time complexity:** `O(V + E)`, where V is the number of vertices and E is the number of edges in the graph. -**Auxiliary Space:** `O(V + E)`, since an extra visited array of size V is required, And stack size for iterative call to DFS function. +- **Time complexity:** `O(V + E)`, where V is the number of vertices and E is the number of edges in the graph. +- **Auxiliary Space:** `O(V + E)`, since an extra visited array of size V is required, And stack size for iterative call to DFS function.
From 05071b50871a74cfa03420c70014f6a6c16d96fd Mon Sep 17 00:00:00 2001 From: Eshparsi <112681516+Eshparsi@users.noreply.github.com> Date: Sun, 19 May 2024 12:24:13 +0530 Subject: [PATCH 077/405] Update graph.md --- contrib/Data-Structure-Graphs/graph.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/Data-Structure-Graphs/graph.md b/contrib/Data-Structure-Graphs/graph.md index 9837896..517c90d 100644 --- a/contrib/Data-Structure-Graphs/graph.md +++ b/contrib/Data-Structure-Graphs/graph.md @@ -32,7 +32,7 @@ Graph is a non-linear data structure consisting of vertices and edges. It is a p ## Representation of Graphs There are two ways to store a graph: -1. **Adjacency Matrix** +1. **Adjacency Matrix:** In this method, the graph is stored in the form of the 2D matrix where rows and columns denote vertices. Each entry in the matrix represents the weight of the edge between those vertices. ```python @@ -64,7 +64,7 @@ for row in adj_matrix: ``` -2. **Adjacency List** +2. **Adjacency List:** In this method, the graph is represented as a collection of linked lists. There is an array of pointer which points to the edges connected to that vertex. ```python From 0b9c7823fac1eb920e4bda3cd7bb5667a7023601 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sun, 19 May 2024 22:09:39 +0530 Subject: [PATCH 078/405] Create loading_arrays_from_files.md Added Introduction Added numpy.loadtxt method Added numpy.genfromtxt method Added numpy.fromfile method Added numpy.load method --- contrib/numpy/loading_arrays_from_files.md | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 contrib/numpy/loading_arrays_from_files.md diff --git a/contrib/numpy/loading_arrays_from_files.md b/contrib/numpy/loading_arrays_from_files.md new file mode 100644 index 0000000..f1717c2 --- /dev/null +++ b/contrib/numpy/loading_arrays_from_files.md @@ -0,0 +1,67 @@ +# Loading Arrays From Files +The ability to load data from various file formats is a critical feature for scientific computing and data analysis. +NumPy provides several functions to read data from different file types and convert them into ndarrays. +This section will cover how to load ndarrays from common file formats, including CSV, TSV, and binary files. + +### Here are the methods available: + +`numpy.loadtxt`: The loadtxt function allows you to load data from a text file.You can specify various parameters such as the file name, data type, delimiter, +and more. It reads the file line by line, splits it at the specified delimiter, and converts the values into an array. + +- **Syntax:** + ```python + numpy.loadtxt(fname, dtype = float, delimiter=None, converters=None, skiprows=0, usecols=None) + ``` + + `fname` : Name of the file
+ `dtype` : Data type of the resulting array. (By default is float)
+ `delimiter`: String or character separating columns; default is any whitespace.
+ `converters`: Dictionary mapping column number to a function to convert that column's string to a float.
+ `skiprows`: Number of lines to skip at the beginning of the file.
+ `usecols`: Which columns to read starting from 0. + +- **Example for `loadtxt`:** + + **example.txt**
+ + ![image](https://github.com/Santhosh-Siddhardha/learn-python/assets/103999924/a0148d29-5fba-45fa-b3f4-058406b3016b) + + **Code**
+ ```python + import numpy as np + arr = np.loadtxt("loadtxt.txt", dtype=int) + print(arr) + ``` + + **Output**
+ ```python + [1 2 3 4 5] + ``` + + +`numpy.genfromtxt`: The genfromtxt function is similar to loadtxt but provides more flexibility. It handles missing values (such as NaNs), allows custom converters +for data parsing, and can handle different data types within the same file. It’s particularly useful for handling complex data formats. + +- **Syntax:** + ```python + numpy.genfromtxt(fname, dtype=float, delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None) + ``` + + `fname` : Name of the file
+ `dtype` : Data type of the resulting array. (By default is float)
+ `delimiter`: String or character separating columns; default is any whitespace.
+ `skip_header`: Number of lines to skip at the beginning of the file.
+ `skip_footer`: Number of lines to skip at the end of the file.
+ `converters`: Dictionary mapping column number to a function to convert that column's string to a float.
+ `missing_values`: Set of strings corresponding to missing data.
+ `filling_values`: Value used to fill in missing data. Default is NaN.
+ `usecols`: Which columns to read starting from 0. + +- **Examples for `genfromtxt`:** + + +`numpy.fromfile`: The fromfile function reads binary data directly from a file into a NumPy array. It doesn’t assume any specific format or delimiter; +instead, it interprets the raw binary data according to the specified data type. + +`numpy.load`: Load arrays saved in NumPy’s native binary format (.npy or .npz). These files preserve the array structure, data types, and metadata. +It’s an efficient way to store and load large arrays. From 09ad3d5d88d79ea4d509cf5822d5ddbef4f05962 Mon Sep 17 00:00:00 2001 From: Anushka Mokashi Date: Sun, 19 May 2024 22:12:47 +0530 Subject: [PATCH 079/405] GroupBy_Pandas --- contrib/pandas/GroupBy_Functions_Pandas.md | 391 +++++++++++++++++++++ contrib/pandas/index.md | 2 + 2 files changed, 393 insertions(+) create mode 100644 contrib/pandas/GroupBy_Functions_Pandas.md diff --git a/contrib/pandas/GroupBy_Functions_Pandas.md b/contrib/pandas/GroupBy_Functions_Pandas.md new file mode 100644 index 0000000..00bad79 --- /dev/null +++ b/contrib/pandas/GroupBy_Functions_Pandas.md @@ -0,0 +1,391 @@ +## Group By Functions + +GroupBy is a powerful function in pandas that allows you to split data into distinct groups based on one or more columns and perform operations on each group independently. It's a fundamental technique for data analysis and summarization. + +Here's a step-by-step breakdown of how groupby functions work in pandas: + +* __Splitting the Data:__ You can group your data based on one or more columns using the .groupby() method. This method takes a column name or a list of column names as input and splits the DataFrame into groups according to the values in those columns. + +* __Applying a Function:__ Once the data is grouped, you can apply various functions to each group. Pandas offers a variety of built-in aggregation functions like sum(), mean(), count(), etc., that can be used to summarize the data within each group. You can also use custom functions or lambda functions for more specific operations. + +* __Combining the Results:__ After applying the function to each group, the results are combined into a new DataFrame or Series, depending on the input data and the function used. This new data structure summarizes the data by group. + + +```python +import pandas as pd +import seaborn as sns +import numpy as np +``` + + +```python +iris_data = sns.load_dataset('iris') +``` + +This code loads the built-in Iris dataset from seaborn and stores it in a pandas DataFrame named iris_data. The Iris dataset contains measurements of flower sepal and petal dimensions for three Iris species (Setosa, Versicolor, Virginica). + + +```python +iris_data +``` + +| | sepal_length | sepal_width | petal_length | petal_width | species | +|----|--------------|-------------|--------------|-------------|-----------| +| 0 | 5.1 | 3.5 | 1.4 | 0.2 | setosa | +| 1 | 4.9 | 3.0 | 1.4 | 0.2 | setosa | +| 2 | 4.7 | 3.2 | 1.3 | 0.2 | setosa | +| 3 | 4.6 | 3.1 | 1.5 | 0.2 | setosa | +| 4 | 5.0 | 3.6 | 1.4 | 0.2 | setosa | +| ...| ... | ... | ... | ... | ... | +| 145| 6.7 | 3.0 | 5.2 | 2.3 | virginica | +| 146| 6.3 | 2.5 | 5.0 | 1.9 | virginica | +| 147| 6.5 | 3.0 | 5.2 | 2.0 | virginica | +| 148| 6.2 | 3.4 | 5.4 | 2.3 | virginica | +| 149| 5.9 | 3.0 | 5.1 | 1.8 | virginica | + + + + + +```python +iris_data.groupby(['species']).count() +``` + + + + +| species | sepal_length | sepal_width | petal_length | petal_width | +|------------|--------------|-------------|--------------|-------------| +| setosa | 50 | 50 | 50 | 50 | +| versicolor | 50 | 50 | 50 | 50 | +| virginica | 50 | 50 | 50 | 50 | + + + + +* We group the data by the 'species' column. +count() is applied to each group, which counts the number of occurrences (rows) in each species category. +* The output (species_counts) is a DataFrame showing the count of each species in the dataset. + + +```python +iris_data.groupby(["species"])["sepal_length"].mean() +``` + + + + + species + setosa 5.006\ + versicolor 5.936\ + virginica 6.588\ + Name: sepal_length, dtype: float64 + + + +* This groups the data by 'species' and selects the 'sepal_length' column. +mean() calculates the average sepal length for each species group. +* The output (species_means) is a Series containing the mean sepal length for each species. + + +```python +iris_data.groupby(["species"])["sepal_length"].std() +``` + + + + + species + setosa 0.352490\ + versicolor 0.516171\ + virginica 0.635880\ + Name: sepal_length, dtype: float64 + + + +* Similar to the previous, this groups by 'species' and selects the 'sepal_length' column. +However, it calculates the standard deviation (spread) of sepal length for each species group using std(). +* The output (species_std) is a Series containing the standard deviation of sepal length for each species + + +```python +iris_data.groupby(["species"])["sepal_length"].describe() +``` + + + +| species | count | mean | std | min | 25% | 50% | 75% | max | +|------------|-------|-------|----------|------|--------|------|------|------| +| setosa | 50.0 | 5.006 | 0.352490 | 4.3 | 4.800 | 5.0 | 5.2 | 5.8 | +| versicolor | 50.0 | 5.936 | 0.516171 | 4.9 | 5.600 | 5.9 | 6.3 | 7.0 | +| virginica | 50.0 | 6.588 | 0.635880 | 4.9 | 6.225 | 6.5 | 6.9 | 7.9 | + + + + +* We have used describe() to generate a more comprehensive summary of sepal length for each species group. +* It provides statistics like count, mean, standard deviation, minimum, maximum, percentiles, etc. +The output (species_descriptions) is a DataFrame containing these descriptive statistics for each species. + + +```python +iris_data.groupby(["species"])["sepal_length"].quantile(q=0.25) +``` + + + + + species\ + setosa 4.800\ + versicolor 5.600\ + virginica 6.225\ + Name: sepal_length, dtype: float64 + + + + +```python +iris_data.groupby(["species"])["sepal_length"].quantile(q=0.75) +``` + + + + + species\ + setosa 5.2\ + versicolor 6.3\ + virginica 6.9\ + Name: sepal_length, dtype: float64 + + + +* To calculate the quartiles (25th percentile and 75th percentile) of sepal length for each species group. +* quantile(q=0.25) gives the 25th percentile, which represents the value below which 25% of the data points lie. +* quantile(q=0.75) gives the 75th percentile, which represents the value below which 75% of the data points lie. +* The outputs (species_q1 and species_q3) are Series containing the respective quartile values for each species. + +## Custom Function For Group By + + +```python +nc = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width','species'] +``` + + +```python +nc +``` + + + + + ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'] + + + + +```python +nc = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width'] +def species_stats(species_data,species_name): + print("Species Name: {}".format(species_name)) + print() + print("Mean:\n",species_data[nc].mean()) + print() + print("Median:\n",species_data[nc].median()) + print() + print("std:\n",species_data[nc].std()) + print() + print("25% percentile:\n",species_data[nc].quantile(0.25)) + print() + print("75% percentile:\n",species_data[nc].quantile(0.75)) + print() + print("Min:\n",species_data[nc].min()) + print() + print("Max:\n",species_data[nc].max()) + print() +``` + + +```python +setosa_data = iris_data[iris_data['species'] == 'setosa'] +``` + + +```python +versicolor_data = iris_data[iris_data['species'] == 'versicolor'] +``` + + +```python +virginica_data = iris_data[iris_data['species'] == 'virginica'] +``` + + +```python +species_data_names = ['setosa_data','viginica_data','versicolor_data'] +for data in species_data_names: + print("************** Species name {} *****************".format(data)) + species_stats(setosa_data,data) + print("------------------------------------") +``` + + ************** Species name setosa_data *****************\ + Species Name: setosa_data + + Mean:\ + sepal_length 5.006\ + sepal_width 3.428\ + petal_length 1.462\ + petal_width 0.246\ + dtype: float64 + + Median:\ + sepal_length 5.0\ + sepal_width 3.4\ + petal_length 1.5\ + petal_width 0.2\ + dtype: float64 + + std:\ + sepal_length 0.352490\ + sepal_width 0.379064\ + petal_length 0.173664\ + petal_width 0.105386\ + dtype: float64 + + 25% percentile:\ + sepal_length 4.8\ + sepal_width 3.2\ + petal_length 1.4\ + petal_width 0.2\ + Name: 0.25, dtype: float64 + + 75% percentile:\ + sepal_length 5.200\ + sepal_width 3.675\ + petal_length 1.575\ + petal_width 0.300\ + Name: 0.75, dtype: float64 + + Min:\ + sepal_length 4.3\ + sepal_width 2.3\ + petal_length 1.0\ + petal_width 0.1\ + dtype: float64 + + Max: + sepal_length 5.8\ + sepal_width 4.4\ + petal_length 1.9\ + petal_width 0.6\ + dtype: float64 + + ------------------------------------\ + ************** Species name viginica_data *****************\ + Species Name: viginica_data + + Mean:\ + sepal_length 5.006\ + sepal_width 3.428\ + petal_length 1.462\ + petal_width 0.246\ + dtype: float64 + + Median:\ + sepal_length 5.0\ + sepal_width 3.4\ + petal_length 1.5\ + petal_width 0.2\ + dtype: float64 + + std:\ + sepal_length 0.352490\ + sepal_width 0.379064\ + petal_length 0.173664\ + petal_width 0.105386\ + dtype: float64 + + 25% percentile:\ + sepal_length 4.8\ + sepal_width 3.2\ + petal_length 1.4\ + petal_width 0.2\ + Name: 0.25, dtype: float64 + + 75% percentile:\ + sepal_length 5.200\ + sepal_width 3.675\ + petal_length 1.575\ + petal_width 0.300\ + Name: 0.75, dtype: float64 + + Min:\ + sepal_length 4.3\ + sepal_width 2.3\ + petal_length 1.0\ + petal_width 0.1\ + dtype: float64 + + Max: + sepal_length 5.8 + sepal_width 4.4 + petal_length 1.9 + petal_width 0.6 + dtype: float64 + + ------------------------------------\ + ************** Species name versicolor_data *****************\ + Species Name: versicolor_data + + Mean:\ + sepal_length 5.006\ + sepal_width 3.428\ + petal_length 1.462\ + petal_width 0.246\ + dtype: float64 + + Median:\ + sepal_length 5.0\ + sepal_width 3.4\ + petal_length 1.5\ + petal_width 0.2\ + dtype: float64 + + std:\ + sepal_length 0.352490\ + sepal_width 0.379064\ + petal_length 0.173664\ + petal_width 0.105386\ + dtype: float64 + + 25% percentile:\ + sepal_length 4.8\ + sepal_width 3.2\ + petal_length 1.4\ + petal_width 0.2\ + Name: 0.25, dtype: float64 + + 75% percentile:\ + sepal_length 5.200\ + sepal_width 3.675\ + petal_length 1.575\ + petal_width 0.300\ + Name: 0.75, dtype: float64 + + Min: + sepal_length 4.3\ + sepal_width 2.3\ + petal_length 1.0\ + petal_width 0.1\ + dtype: float64 + + Max:\ + sepal_length 5.8\ + sepal_width 4.4\ + petal_length 1.9\ + petal_width 0.6\ + dtype: float64 + + ------------------------------------ + diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 5c0f2b4..e975b03 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,3 +1,5 @@ # List of sections - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) + +- [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) From 39ed0f3e85deb55d68897f41e20d998eb8963246 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid <109688855+PilotAxis@users.noreply.github.com> Date: Sun, 19 May 2024 22:59:32 +0530 Subject: [PATCH 080/405] Create Queues.md Added Introduction, Real Life Examples, Operations. --- contrib/ds-algorithms/Queues.md | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 contrib/ds-algorithms/Queues.md diff --git a/contrib/ds-algorithms/Queues.md b/contrib/ds-algorithms/Queues.md new file mode 100644 index 0000000..918c934 --- /dev/null +++ b/contrib/ds-algorithms/Queues.md @@ -0,0 +1,47 @@ +# Introduction to Queues + +A queue is a linear data structure where elements are added at the back (enqueue) and removed from the front (dequeue). Imagine a line at a coffee shop, the first in line (front) gets served first, and new customers join at the back. This FIFO approach ensures order and fairness in processing elements. + +Queues offer efficient implementations for various scenarios. They are often used in: +- Task Scheduling - Operating systems utilize queues to manage processes waiting for CPU time. +- Breadth-first search algorithms - Traversing a tree or graph involves exploring neighbouring nodes level by level, often achieved using a queue. +- Message passing - Communication protocols leverage queues to buffer messages between applications for reliable delivery. + +
+ +Screenshot 2024-05-18 at 10 16 30 PM + + +## Real Life Examples of Queues +- Customer Service - Consider how a customer service phone line works. Customers calling are put into a queue. The first customer to call is the first one to be served (FIFO). As more customers call, they are added to the end of the queue, and as customers are served, they are removed from the front. The entire process follows the queue data structure. + +- Printers - Printers operate using a queue to manage print jobs. When a user sends a document to the printer, the job is added to the queue (enqueue). Once a job completes printing, it's removed from the queue (dequeue), and the next job in line starts. This sequential order of handling tasks perfectly exhibits the queue data structure. + +- Computer Memory - Certain types of computer memory use a queue data structure to hold and process instructions. For example, in a computer's cache memory, the fetch-decode-execute cycle of an instruction follows a queue. The first instruction fetched is the first one to be decoded and executed, while new instructions fetched are added to the rear. + +
+ +# Important Terminologies in Queues + +Understanding these terms is crucial for working with queues: + +- Enqueue - Adding an element to the back of the queue. +- Dequeue - Removing the element at the front of the queue. +- Front - The first element in the queue, to be removed next. +- Rear/Back - The last element in the queue, where new elements are added. +- Empty Queue - A queue with no elements. +- Overflow - Attempting to enqueue an element when the queue is full. +- Underflow - Attempting to dequeue an element from an empty queue. + +
+ +# Operations on a Queue + +There are some key operations in a queue that include - + +- isFULL - This operation is used to check if a queue is full. +- isEMPTY - This operation is used to check if a queue is empty. +- Display - This operation is used to display the queue elements. +- Peek - This operation is the process of getting the front value of a queue, without removing it. (i.e., Value at the front). + +image From 6c50c6e498bc3308fdd3a29c926ff76062744531 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid <109688855+PilotAxis@users.noreply.github.com> Date: Sun, 19 May 2024 23:01:28 +0530 Subject: [PATCH 081/405] Update Queues.md --- contrib/ds-algorithms/Queues.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/Queues.md b/contrib/ds-algorithms/Queues.md index 918c934..ead6ce4 100644 --- a/contrib/ds-algorithms/Queues.md +++ b/contrib/ds-algorithms/Queues.md @@ -9,7 +9,7 @@ Queues offer efficient implementations for various scenarios. They are often use
-Screenshot 2024-05-18 at 10 16 30 PM +Screenshot 2024-05-18 at 10 16 30 PM ## Real Life Examples of Queues From cbf87b0b5d9dc768dfdd8a03878789514cf75d4a Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid <109688855+PilotAxis@users.noreply.github.com> Date: Sun, 19 May 2024 23:03:44 +0530 Subject: [PATCH 082/405] Update Queues.md --- contrib/ds-algorithms/Queues.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/Queues.md b/contrib/ds-algorithms/Queues.md index ead6ce4..8ba2ce3 100644 --- a/contrib/ds-algorithms/Queues.md +++ b/contrib/ds-algorithms/Queues.md @@ -9,7 +9,7 @@ Queues offer efficient implementations for various scenarios. They are often use
-Screenshot 2024-05-18 at 10 16 30 PM +Types of Data Structure ## Real Life Examples of Queues From 811382bfca0d9097c78cff56b9e1fb10655b4088 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sun, 19 May 2024 23:55:40 +0530 Subject: [PATCH 083/405] Update loading_arrays_from_files.md Added syntax for all methods Formatted Content Added examples for all methods Removed fromfile method --- contrib/numpy/loading_arrays_from_files.md | 103 +++++++++++++++------ 1 file changed, 75 insertions(+), 28 deletions(-) diff --git a/contrib/numpy/loading_arrays_from_files.md b/contrib/numpy/loading_arrays_from_files.md index f1717c2..bd3648f 100644 --- a/contrib/numpy/loading_arrays_from_files.md +++ b/contrib/numpy/loading_arrays_from_files.md @@ -1,26 +1,25 @@ # Loading Arrays From Files -The ability to load data from various file formats is a critical feature for scientific computing and data analysis. -NumPy provides several functions to read data from different file types and convert them into ndarrays. -This section will cover how to load ndarrays from common file formats, including CSV, TSV, and binary files. +Scientific computing and data analysis require the critical feature of being able to load data from different file formats. NumPy has several functionalities for reading data from various file types and converting them into arrays. This part of the content will show how one can load arrays from standard file formats. -### Here are the methods available: +## Here are the methods available: -`numpy.loadtxt`: The loadtxt function allows you to load data from a text file.You can specify various parameters such as the file name, data type, delimiter, +### 1. numpy.loadtxt(): +The loadtxt function allows you to load data from a text file.You can specify various parameters such as the file name, data type, delimiter, and more. It reads the file line by line, splits it at the specified delimiter, and converts the values into an array. -- **Syntax:** +- #### Syntax: ```python numpy.loadtxt(fname, dtype = float, delimiter=None, converters=None, skiprows=0, usecols=None) ``` - `fname` : Name of the file
- `dtype` : Data type of the resulting array. (By default is float)
- `delimiter`: String or character separating columns; default is any whitespace.
- `converters`: Dictionary mapping column number to a function to convert that column's string to a float.
- `skiprows`: Number of lines to skip at the beginning of the file.
- `usecols`: Which columns to read starting from 0. + **fname** : Name of the file
+ **dtype** : Data type of the resulting array. (By default is float)
+ **delimiter**: String or character separating columns; default is any whitespace.
+ **converters**: Dictionary mapping column number to a function to convert that column's string to a float.
+ **skiprows**: Number of lines to skip at the beginning of the file.
+ **usecols**: Which columns to read starting from 0. -- **Example for `loadtxt`:** +- #### Example for `loadtxt`: **example.txt**
@@ -38,30 +37,78 @@ and more. It reads the file line by line, splits it at the specified delimiter, [1 2 3 4 5] ``` +
-`numpy.genfromtxt`: The genfromtxt function is similar to loadtxt but provides more flexibility. It handles missing values (such as NaNs), allows custom converters +### 2. numpy.genfromtxt: +The `genfromtxt` function is similar to loadtxt but provides more flexibility. It handles missing values (such as NaNs), allows custom converters for data parsing, and can handle different data types within the same file. It’s particularly useful for handling complex data formats. -- **Syntax:** +- #### Syntax: ```python numpy.genfromtxt(fname, dtype=float, delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None) ``` - `fname` : Name of the file
- `dtype` : Data type of the resulting array. (By default is float)
- `delimiter`: String or character separating columns; default is any whitespace.
- `skip_header`: Number of lines to skip at the beginning of the file.
- `skip_footer`: Number of lines to skip at the end of the file.
- `converters`: Dictionary mapping column number to a function to convert that column's string to a float.
- `missing_values`: Set of strings corresponding to missing data.
- `filling_values`: Value used to fill in missing data. Default is NaN.
- `usecols`: Which columns to read starting from 0. + **fname** : Name of the file
+ **dtype** : Data type of the resulting array. (By default is float)
+ **delimiter**: String or character separating columns; default is any whitespace.
+ **skip_header**: Number of lines to skip at the beginning of the file.
+ **skip_footer**: Number of lines to skip at the end of the file.
+ **converters**: Dictionary mapping column number to a function to convert that column's string to a float.
+ **missing_values**: Set of strings corresponding to missing data.
+ **filling_values**: Value used to fill in missing data. Default is NaN.
+ **usecols**: Which columns to read starting from 0. -- **Examples for `genfromtxt`:** +- #### Example for `genfromtxt`: + + **example.txt**
+ + ![image](https://github.com/Santhosh-Siddhardha/learn-python/assets/103999924/3f9cdd91-4255-4e30-923d-f29c5f237798) -`numpy.fromfile`: The fromfile function reads binary data directly from a file into a NumPy array. It doesn’t assume any specific format or delimiter; -instead, it interprets the raw binary data according to the specified data type. + **Code**
+ ```python + import numpy as np + arr = np.genfromtxt("example.txt", dtype='str', usecols=1) + print(arr) + ``` -`numpy.load`: Load arrays saved in NumPy’s native binary format (.npy or .npz). These files preserve the array structure, data types, and metadata. + **Output**
+ ```python + ['Name' 'Kohli' 'Dhoni' 'Rohit'] + ``` + +
+ + +### 3. numpy.load +`load` method is used to load arrays saved in NumPy’s native binary format (.npy or .npz). These files preserve the array structure, data types, and metadata. It’s an efficient way to store and load large arrays. + +- #### Syntax: + ```python + numpy.load(fname, mmap_mode=None, encoding='ASCII') + ``` + + **fname** : Name of the file
+ **mmap_mode** : Memory-map the file using the given mode (r, r+, w+, c).(By Default None)
+ **encoding**:Encoding is used when reading Python2 strings only. (By Default ASCII)
+ +- #### Example for `load`: + + **Code**
+ ```python + import numpy as np + arr = np.array(['a','b','c']) + np.savez('data.npz', array=arr) + # stores arr in data.npz in NumPy's native binary format + data = np.load('data.npz') + print(data['array']) + ``` + + **Output**
+ ```python + ['a' 'b' 'c'] + ``` +
+ +These methods empower users to seamlessly integrate data into their scientific workflows, whether from text files or binary formats. From efb68d962d83cda93705e6e2c35fefb7622d54a4 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sun, 19 May 2024 23:57:34 +0530 Subject: [PATCH 084/405] Update index.md Added Loading Arrays from Files Section Linked it to its md file --- 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 82596a2..5c8cfa6 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Loading Arrays from Files](loading_arrays_from_files.md) From 53269a5ad335eb89bb768ca26165f447a3f46d22 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sun, 19 May 2024 23:58:31 +0530 Subject: [PATCH 085/405] Update loading_arrays_from_files.md changed format --- contrib/numpy/loading_arrays_from_files.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/numpy/loading_arrays_from_files.md b/contrib/numpy/loading_arrays_from_files.md index bd3648f..85105a3 100644 --- a/contrib/numpy/loading_arrays_from_files.md +++ b/contrib/numpy/loading_arrays_from_files.md @@ -4,7 +4,7 @@ Scientific computing and data analysis require the critical feature of being abl ## Here are the methods available: ### 1. numpy.loadtxt(): -The loadtxt function allows you to load data from a text file.You can specify various parameters such as the file name, data type, delimiter, +The `loadtxt` function allows you to load data from a text file.You can specify various parameters such as the file name, data type, delimiter, and more. It reads the file line by line, splits it at the specified delimiter, and converts the values into an array. - #### Syntax: From cfc731c2acb0b85011b47f3a4b3fe3fc2ea0b91b Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Mon, 20 May 2024 09:50:49 +0530 Subject: [PATCH 086/405] Update loading_arrays_from_files.md Changed introduction content formatted code formatted content --- contrib/numpy/loading_arrays_from_files.md | 27 +++++++++++----------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/contrib/numpy/loading_arrays_from_files.md b/contrib/numpy/loading_arrays_from_files.md index 85105a3..c001121 100644 --- a/contrib/numpy/loading_arrays_from_files.md +++ b/contrib/numpy/loading_arrays_from_files.md @@ -14,7 +14,7 @@ and more. It reads the file line by line, splits it at the specified delimiter, **fname** : Name of the file
**dtype** : Data type of the resulting array. (By default is float)
- **delimiter**: String or character separating columns; default is any whitespace.
+ **delimiter**: String or character separating columns. (By default is whitespace)
**converters**: Dictionary mapping column number to a function to convert that column's string to a float.
**skiprows**: Number of lines to skip at the beginning of the file.
**usecols**: Which columns to read starting from 0. @@ -27,8 +27,9 @@ and more. It reads the file line by line, splits it at the specified delimiter, **Code**
```python - import numpy as np - arr = np.loadtxt("loadtxt.txt", dtype=int) + import numpy as np + + arr = np.loadtxt("example.txt", dtype=int) print(arr) ``` @@ -39,20 +40,18 @@ and more. It reads the file line by line, splits it at the specified delimiter,
-### 2. numpy.genfromtxt: +### 2. numpy.genfromtxt(): The `genfromtxt` function is similar to loadtxt but provides more flexibility. It handles missing values (such as NaNs), allows custom converters for data parsing, and can handle different data types within the same file. It’s particularly useful for handling complex data formats. - #### Syntax: ```python - numpy.genfromtxt(fname, dtype=float, delimiter=None, skip_header=0, skip_footer=0, converters=None, missing_values=None, filling_values=None, usecols=None) + numpy.genfromtxt(fname, dtype=float, delimiter=None, converters=None, missing_values=None, filling_values=None, usecols=None) ``` **fname** : Name of the file
**dtype** : Data type of the resulting array. (By default is float)
**delimiter**: String or character separating columns; default is any whitespace.
- **skip_header**: Number of lines to skip at the beginning of the file.
- **skip_footer**: Number of lines to skip at the end of the file.
**converters**: Dictionary mapping column number to a function to convert that column's string to a float.
**missing_values**: Set of strings corresponding to missing data.
**filling_values**: Value used to fill in missing data. Default is NaN.
@@ -67,7 +66,8 @@ for data parsing, and can handle different data types within the same file. It **Code**
```python - import numpy as np + import numpy as np + arr = np.genfromtxt("example.txt", dtype='str', usecols=1) print(arr) ``` @@ -80,7 +80,7 @@ for data parsing, and can handle different data types within the same file. It
-### 3. numpy.load +### 3. numpy.load(): `load` method is used to load arrays saved in NumPy’s native binary format (.npy or .npz). These files preserve the array structure, data types, and metadata. It’s an efficient way to store and load large arrays. @@ -90,7 +90,7 @@ It’s an efficient way to store and load large arrays. ``` **fname** : Name of the file
- **mmap_mode** : Memory-map the file using the given mode (r, r+, w+, c).(By Default None)
+ **mmap_mode** : Memory-map the file using the given mode (r, r+, w+, c)(By Default None).Memory-mapping only works with arrays stored in a binary file on disk, not with compressed archives like .npz.
**encoding**:Encoding is used when reading Python2 strings only. (By Default ASCII)
- #### Example for `load`: @@ -98,10 +98,11 @@ It’s an efficient way to store and load large arrays. **Code**
```python import numpy as np + arr = np.array(['a','b','c']) - np.savez('data.npz', array=arr) - # stores arr in data.npz in NumPy's native binary format - data = np.load('data.npz') + np.savez('example.npz', array=arr) # stores arr in data.npz in NumPy's native binary format + + data = np.load('example.npz') print(data['array']) ``` From d314d760af6ddcabef554cf07f317a690bff51cb Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 21:46:30 +0530 Subject: [PATCH 087/405] Datatypes.md file is added to the 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 82596a2..6d02025 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,3 +1,4 @@ # List of sections - [Section title](filename.md) +- [Numpy Datatypes](datatypes.md) \ No newline at end of file From 2e33a9b997189dc81f0dc73abd1f0c8ff8793cf0 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 21:47:17 +0530 Subject: [PATCH 088/405] NumPy datatypes list is added --- contrib/numpy/datatypes.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 contrib/numpy/datatypes.md diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md new file mode 100644 index 0000000..768add1 --- /dev/null +++ b/contrib/numpy/datatypes.md @@ -0,0 +1,35 @@ +# Numpy Data Types +In NumPy, data types play a crcial role in representing and manipulating numerical data. + +Numpy supports the following data types: + +- `i` - integer +- `b` - boolean +- `u` - unsigned integer +- `f` - float +- `c` - complex float +- `m` - timedelta +- `M` - datetime +- `O` - object +- `S` - string +- `U` - unicode string + +## Example for integer type + +## Example for float type + +## Example for boolean type + +## Example for unsigned integer type + +## Example for complex type + +## Example for datetime type + +## Example for string type + +## Example for object type + +## Example for unicode string type + +## Example for timedelta type From 68a2219c6830f8af7026853854ff6338d3ffbdbf Mon Sep 17 00:00:00 2001 From: Rithish S Date: Mon, 20 May 2024 21:51:47 +0530 Subject: [PATCH 089/405] binomial distribution added --- .../machine-learning/binomial_distribution.md | 123 ++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 124 insertions(+) create mode 100644 contrib/machine-learning/binomial_distribution.md diff --git a/contrib/machine-learning/binomial_distribution.md b/contrib/machine-learning/binomial_distribution.md new file mode 100644 index 0000000..2fddc31 --- /dev/null +++ b/contrib/machine-learning/binomial_distribution.md @@ -0,0 +1,123 @@ +# Binomial Distribution + +## Introduction + +The binomial distribution is a discrete probability distribution that describes the number of successes in a fixed number of independent Bernoulli trials, each with the same probability of success. It is commonly used in statistics and probability theory. + +### Key Characteristics + +- **Number of trials (n):** The number of independent experiments or trials. +- **Probability of success (p):** The probability of success on an individual trial. +- **Number of successes (k):** The number of successful outcomes in n trials. + +The binomial distribution is defined by the probability mass function (PMF): + +\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \] + +where: +- \(\binom{n}{k}\) is the binomial coefficient, calculated as \(\frac{n!}{k!(n-k)!}\). + +## Properties of Binomial Distribution + +- **Mean:** \( \mu = np \) +- **Variance:** \( \sigma^2 = np(1 - p) \) +- **Standard Deviation:** \( \sigma = \sqrt{np(1 - p)} \) + +## Python Implementation + +Let's implement the binomial distribution using Python. We'll use the `scipy.stats` library to compute the binomial PMF and CDF, and `matplotlib` to visualize it. + +### Step-by-Step Implementation + +1. **Import necessary libraries:** + + ```python + import numpy as np + import matplotlib.pyplot as plt + from scipy.stats import binom + ``` + +2. **Define parameters:** + + ```python + # Number of trials + n = 10 + # Probability of success + p = 0.5 + # Number of successes + k = np.arange(0, n + 1) + ``` + +3. **Compute the PMF:** + + ```python + pmf = binom.pmf(k, n, p) + ``` + +4. **Plot the PMF:** + + ```python + plt.bar(k, pmf, color='blue') + plt.xlabel('Number of Successes') + plt.ylabel('Probability') + plt.title('Binomial Distribution PMF') + plt.show() + ``` + +5. **Compute the CDF:** + + ```python + cdf = binom.cdf(k, n, p) + ``` + +6. **Plot the CDF:** + + ```python + plt.plot(k, cdf, marker='o', linestyle='--', color='blue') + plt.xlabel('Number of Successes') + plt.ylabel('Cumulative Probability') + plt.title('Binomial Distribution CDF') + plt.grid(True) + plt.show() + ``` + +### Complete Code + +Here is the complete code for the binomial distribution implementation: + +```python +import numpy as np +import matplotlib.pyplot as plt +from scipy.stats import binom + +# Parameters +n = 10 # Number of trials +p = 0.5 # Probability of success + +# Number of successes +k = np.arange(0, n + 1) + +# Compute PMF +pmf = binom.pmf(k, n, p) + +# Plot PMF +plt.figure(figsize=(12, 6)) +plt.subplot(1, 2, 1) +plt.bar(k, pmf, color='blue') +plt.xlabel('Number of Successes') +plt.ylabel('Probability') +plt.title('Binomial Distribution PMF') + +# Compute CDF +cdf = binom.cdf(k, n, p) + +# Plot CDF +plt.subplot(1, 2, 2) +plt.plot(k, cdf, marker='o', linestyle='--', color='blue') +plt.xlabel('Number of Successes') +plt.ylabel('Cumulative Probability') +plt.title('Binomial Distribution CDF') +plt.grid(True) + +plt.tight_layout() +plt.show() diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 82596a2..ec4dfc3 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,4 @@ # List of sections - [Section title](filename.md) +- [Binomial Distribution](binomial_distribution.md) From 3f731e7f211facfc725a08d455c90dc6c27b8df6 Mon Sep 17 00:00:00 2001 From: Rithish S <123345316+Rithish5513U@users.noreply.github.com> Date: Mon, 20 May 2024 21:53:31 +0530 Subject: [PATCH 090/405] Update binomial_distribution.md --- contrib/machine-learning/binomial_distribution.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contrib/machine-learning/binomial_distribution.md b/contrib/machine-learning/binomial_distribution.md index 2fddc31..94e4c41 100644 --- a/contrib/machine-learning/binomial_distribution.md +++ b/contrib/machine-learning/binomial_distribution.md @@ -1,3 +1,7 @@ + + # Binomial Distribution ## Introduction From 92beeba6c21b6cb27242d91fb6f6bd4ed3b019ba Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 21:54:39 +0530 Subject: [PATCH 091/405] dtype() definition and example is added --- contrib/numpy/datatypes.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index 768add1..39dd46b 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -14,6 +14,17 @@ Numpy supports the following data types: - `S` - string - `U` - unicode string +## dtype() Function +The `dtype()` function returns the type of the NumPy array object. +``` python + import numpy as np + + arr = np.array([1, 2, 3, 4]) + + print(arr.dtype) + + # Output: int64 +``` ## Example for integer type ## Example for float type @@ -33,3 +44,6 @@ Numpy supports the following data types: ## Example for unicode string type ## Example for timedelta type + +# Data Type Conversion + From 7d800d598046394c7409eab176750f0468198e5f Mon Sep 17 00:00:00 2001 From: Rithish S <123345316+Rithish5513U@users.noreply.github.com> Date: Mon, 20 May 2024 21:57:32 +0530 Subject: [PATCH 092/405] Update binomial_distribution.md --- contrib/machine-learning/binomial_distribution.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/contrib/machine-learning/binomial_distribution.md b/contrib/machine-learning/binomial_distribution.md index 94e4c41..0d1d328 100644 --- a/contrib/machine-learning/binomial_distribution.md +++ b/contrib/machine-learning/binomial_distribution.md @@ -1,7 +1,3 @@ - - # Binomial Distribution ## Introduction @@ -16,16 +12,16 @@ The binomial distribution is a discrete probability distribution that describes The binomial distribution is defined by the probability mass function (PMF): -\[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \] +P(X = k) = (n choose k) p^k (1 - p)^(n - k) where: -- \(\binom{n}{k}\) is the binomial coefficient, calculated as \(\frac{n!}{k!(n-k)!}\). +- (n choose k) is the binomial coefficient, calculated as n! / (k!(n-k)!). ## Properties of Binomial Distribution -- **Mean:** \( \mu = np \) -- **Variance:** \( \sigma^2 = np(1 - p) \) -- **Standard Deviation:** \( \sigma = \sqrt{np(1 - p)} \) +- **Mean:** μ = np +- **Variance:** σ² = np(1 - p) +- **Standard Deviation:** σ = √(np(1 - p)) ## Python Implementation From 8c8544540948ec757d5b2cc97df09278fcaf9e61 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 22:08:40 +0530 Subject: [PATCH 093/405] Example for integer type is added --- contrib/numpy/datatypes.md | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index 39dd46b..c70e810 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -16,17 +16,51 @@ Numpy supports the following data types: ## dtype() Function The `dtype()` function returns the type of the NumPy array object. + +Example 1 ``` python import numpy as np arr = np.array([1, 2, 3, 4]) print(arr.dtype) - + # Output: int64 ``` -## Example for integer type +Example 2 +``` python + import numpy as np + + arr = np.array(['apple', 'banana', 'cherry']) + + print(arr.dtype) + + # Output: Date: Mon, 20 May 2024 22:17:35 +0530 Subject: [PATCH 094/405] Example for float type is added --- contrib/numpy/datatypes.md | 40 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index c70e810..1a355d2 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -46,8 +46,10 @@ Way 1: Using function `int_()` import numpy as np arr = np.int_([2,4,6]) - + # Size: int8, int16, int32, int64 + print(arr.dtype()) + # Output: int64 ``` @@ -56,13 +58,47 @@ Way 2: Using `dtype()` import numpy as np arr = np.array([2,4,6], dtype='i4') + # Size: i1, i2, i4, i8 print(arr.dtype) - # Output: int8 + # Output: int32 ``` + ## Example for float type +Way 1: Using function `float_()` +``` python + import numpy as np + + arr = np.float_(1) + # Size: float8, float16, float32, float64 + + print(arr) + print(arr.dtype()) + + # Output: + # 1.0 + # float64 +``` + +Way 2: Using `dtype()` +``` python + import numpy as np + + arr = np.array([2,4,6], dtype='f4') + # Size: f1, f2, f4, f8 + + print(arr) + print(arr.dtype) + + # Output: + # [1. 2. 3. 4.] + # float32 +``` + +Note: `np.single()` has the same function as `float32()`. + ## Example for boolean type ## Example for unsigned integer type From c64b262eda0bc8a2e74fbb63f9ba9df5423a91a3 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 22:28:30 +0530 Subject: [PATCH 095/405] Example for unsigned integer type is added --- contrib/numpy/datatypes.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index 1a355d2..ea9430b 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -65,6 +65,7 @@ Way 2: Using `dtype()` # Output: int32 ``` +Note: `np.intc()` has the same function as `int32()`. ## Example for float type Way 1: Using function `float_()` @@ -101,8 +102,32 @@ Note: `np.single()` has the same function as `float32()`. ## Example for boolean type +``` python + import numpy as np + + x = np.bool_(1) + + print(x) + print(x.dtype) + + # Output: + # True + # bool +``` ## Example for unsigned integer type +``` python + import numpy as np + + x = np.uintc(1) + + print(x) + print(x.dtype) + + # Output: + # 1 + # uint32 +``` ## Example for complex type ## Example for datetime type From 092c550b67fb80bcd63cb813babe4d7bb4471547 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 22:32:10 +0530 Subject: [PATCH 096/405] Example for complex type is added --- contrib/numpy/datatypes.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index ea9430b..8bf52ad 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -128,7 +128,22 @@ Note: `np.single()` has the same function as `float32()`. # 1 # uint32 ``` + ## Example for complex type +Complex type is a combination of real number + imaginary number. The `complex_()` is used to define the complex type NumPy object. +``` python + import numpy as np + + x = np.complex_(1) + # Size: complex64, complex128 + + print(x) + print(x.dtype) + + # Output: + # (1+0j) + # complex128 +``` ## Example for datetime type From 13c485e7dee1b7563c5c8b4e3f5e17343066d4f7 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 22:39:24 +0530 Subject: [PATCH 097/405] Example for datetime type is added --- contrib/numpy/datatypes.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index 8bf52ad..bf18837 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -136,7 +136,7 @@ Complex type is a combination of real number + imaginary number. The `complex_() x = np.complex_(1) # Size: complex64, complex128 - + print(x) print(x.dtype) @@ -146,6 +146,24 @@ Complex type is a combination of real number + imaginary number. The `complex_() ``` ## Example for datetime type +The `datetime64()` is used to define the date, month and year. + +``` python + import numpy as np + + x = np.datetime64('1970-05') + y = np.datetime64('2024-20-05') + z = np.datetime64('2024') + + print(x,x.dtype) + print(y,y.dtype) + print(z,z.dtype) + + # Output: + # 1970-05 datetime64[M] + # 1970-01-11 datetime64[D] + # 1970 datetime64[Y] +``` ## Example for string type From 722d34de63e7ef058cd3275fdefcbc726dc60f35 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 22:46:00 +0530 Subject: [PATCH 098/405] Example for timedelta type is added --- contrib/numpy/datatypes.md | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index bf18837..616d6c3 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -151,8 +151,8 @@ The `datetime64()` is used to define the date, month and year. ``` python import numpy as np - x = np.datetime64('1970-05') - y = np.datetime64('2024-20-05') + x = np.datetime64('2024-05') + y = np.datetime64('2024-05-20') z = np.datetime64('2024') print(x,x.dtype) @@ -160,9 +160,9 @@ The `datetime64()` is used to define the date, month and year. print(z,z.dtype) # Output: - # 1970-05 datetime64[M] - # 1970-01-11 datetime64[D] - # 1970 datetime64[Y] + # 2024-05 datetime64[M] + # 2024-20-05 datetime64[D] + # 2024 datetime64[Y] ``` ## Example for string type @@ -172,6 +172,21 @@ The `datetime64()` is used to define the date, month and year. ## Example for unicode string type ## Example for timedelta type +The `timedelta64()` used to find the difference between the `datetime64()`. The arguments for timedelta64 are a number, to represent the number of units, and a date/time unit, such as (D)ay, (M)onth, (Y)ear, (h)ours, (m)inutes, or (s)econds. The timedelta64 data type also accepts the string “NAT” in place of the number for a “Not A Time” value. +``` python + import numpy as np + + x = np.datetime64('2024-05-20') + y = np.datetime64('2023-05-20') + res = x - y + + print(res) + print(res.dtype) + + # Output: + # 366 days + # timedelta64[D] +``` # Data Type Conversion From 26a0dc814d76da7c6fd9be4ed40d22ea1c0e04fc Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 22:48:00 +0530 Subject: [PATCH 099/405] Example for object type is added --- contrib/numpy/datatypes.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index 616d6c3..6107d8d 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -168,7 +168,18 @@ The `datetime64()` is used to define the date, month and year. ## Example for string type ## Example for object type +``` python + import numpy as np + arr = np.object_([1, 2, 3, 4]) + + print(arr) + print(arr.dtype) + + # Output: + # [1, 2, 3, 4] + # object +``` ## Example for unicode string type ## Example for timedelta type From cf4a924c0eedfa9672377d967c6ea93efd25b146 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 22:56:17 +0530 Subject: [PATCH 100/405] Example for String type is added --- contrib/numpy/datatypes.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index 6107d8d..d365623 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -166,6 +166,15 @@ The `datetime64()` is used to define the date, month and year. ``` ## Example for string type +``` python + import numpy as np + + arr = np.str_("roopa") + + print(arr.dtype) + + # Output: Date: Mon, 20 May 2024 23:03:59 +0530 Subject: [PATCH 101/405] Example type conversion is added --- contrib/numpy/datatypes.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index d365623..12690b9 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -216,4 +216,35 @@ The `timedelta64()` used to find the difference between the `datetime64()`. The # 366 days # timedelta64[D] ``` -# Data Type Conversion \ No newline at end of file +# Data Type Conversion +`astype()` function is used to the NumPy object from one type to another type. + +It creates a copy of the array and allows to specify the data type of our choice. + +## Example 1 + +``` python + import numpy as np + + x = np.array([1.2, 3.4, 5.6]) + y = x.astype(int) + + print(y,y.dtype) + + # Output: + # [1 3 5] int64 +``` + +## Example 2 + +``` python + import numpy as np + + x = np.array([1, 3, 0]) + y = x.astype(bool) + + print(y,y.dtype) + + # Output: + # [True True False] bool +``` \ No newline at end of file From 5effa72de84fae6d7ee5d4cbba07d0f7a4d2f8e6 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 23:08:12 +0530 Subject: [PATCH 102/405] index.md is modified --- contrib/numpy/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index 6d02025..fa6ae9e 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,4 +1,4 @@ # List of sections -- [Section title](filename.md) -- [Numpy Datatypes](datatypes.md) \ No newline at end of file +- [NumPy Data Types](datatypes.md) +- [Section title](filename.md) \ No newline at end of file From bfdd5dbc41e60d3193991d3687456515f1c17b39 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 23:14:25 +0530 Subject: [PATCH 103/405] Additional datatype longdouble is added --- contrib/numpy/datatypes.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index 12690b9..f58cee5 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -216,6 +216,20 @@ The `timedelta64()` used to find the difference between the `datetime64()`. The # 366 days # timedelta64[D] ``` +## Additional Data Type (`longdouble`) +`longdouble` is a data type that provides higher precision than the standard double-precision floating-point (`float64`) type. + +``` python + import numpy as np + + arr = np.longdouble([1.222222, 4.44, 45.55]) + + print(arr, arr.dtype) + + # Output: + # [1.222222 4.44 45.55] float128 +``` + # Data Type Conversion `astype()` function is used to the NumPy object from one type to another type. From 4e36263a1cf3cf117f51af3643c1e75e2617e329 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Mon, 20 May 2024 23:23:29 +0530 Subject: [PATCH 104/405] datatypes.md modified --- contrib/numpy/datatypes.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/numpy/datatypes.md b/contrib/numpy/datatypes.md index f58cee5..fb9df47 100644 --- a/contrib/numpy/datatypes.md +++ b/contrib/numpy/datatypes.md @@ -14,6 +14,9 @@ Numpy supports the following data types: - `S` - string - `U` - unicode string + +_Referred from: W3schools_ + ## dtype() Function The `dtype()` function returns the type of the NumPy array object. @@ -261,4 +264,4 @@ It creates a copy of the array and allows to specify the data type of our choice # Output: # [True True False] bool -``` \ No newline at end of file +``` From 749aa23485d565a52eee2ec025d3139d2e2b41f9 Mon Sep 17 00:00:00 2001 From: shivam navadiya Date: Tue, 21 May 2024 18:17:04 +0530 Subject: [PATCH 105/405] Updated index.md --- contrib/ds-algorithms/index.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 5b52155..0e1f256 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -2,3 +2,8 @@ - [Section title](filename.md) - [Sorting Algorithms](sorting-algorithms.md) +- [Divide and Conquer Algorithm](divide-and-conquer-algorithm) +- [Searching Algorithms](searching-algorithms.md) +- [Greedy Algorithms](greedy-algorithms.md) +- [Dynamic Programming](dynamic-programming.md) + From ec1e51c677b2a533352542d00ce34cc2579bf585 Mon Sep 17 00:00:00 2001 From: shivam navadiya Date: Tue, 21 May 2024 18:20:05 +0530 Subject: [PATCH 106/405] Created Divide and Conquer Algorithm --- .../divide-and-conquer-algorithm.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 contrib/ds-algorithms/divide-and-conquer-algorithm.md diff --git a/contrib/ds-algorithms/divide-and-conquer-algorithm.md b/contrib/ds-algorithms/divide-and-conquer-algorithm.md new file mode 100644 index 0000000..b5a356e --- /dev/null +++ b/contrib/ds-algorithms/divide-and-conquer-algorithm.md @@ -0,0 +1,54 @@ +# Divide and Conquer Algorithms + +Divide and Conquer is a paradigm for solving problems that involves breaking a problem into smaller sub-problems, solving the sub-problems recursively, and then combining their solutions to solve the original problem. + +## Merge Sort + +Merge Sort is a popular sorting algorithm that follows the divide and conquer strategy. It divides the input array into two halves, recursively sorts the halves, and then merges them. + +**Algorithm Overview:** +- **Divide:** Divide the unsorted list into two sublists of about half the size. +- **Conquer:** Recursively sort each sublist. +- **Combine:** Merge the sorted sublists back into one sorted list. + +```python +def merge_sort(arr): + if len(arr) > 1: + mid = len(arr) // 2 + left_half = arr[:mid] + right_half = arr[mid:] + + merge_sort(left_half) + merge_sort(right_half) + + i = j = k = 0 + + while i < len(left_half) and j < len(right_half): + if left_half[i] < right_half[j]: + arr[k] = left_half[i] + i += 1 + else: + arr[k] = right_half[j] + j += 1 + k += 1 + + while i < len(left_half): + arr[k] = left_half[i] + i += 1 + k += 1 + + while j < len(right_half): + arr[k] = right_half[j] + j += 1 + k += 1 + +arr = [12, 11, 13, 5, 6, 7] +merge_sort(arr) +print("Sorted array:", arr) +``` + +## Complexity Analysis +- **Time Complexity:** O(n log n) in all cases +- **Space Complexity:** O(n) additional space for the merge operation + +--- From bd2103dac33ccbc0fc5f4efa0c797fca1916879c Mon Sep 17 00:00:00 2001 From: shivam navadiya Date: Tue, 21 May 2024 18:21:22 +0530 Subject: [PATCH 107/405] Created Searching Algorithms --- contrib/ds-algorithms/searching-algorithms.md | 161 ++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 contrib/ds-algorithms/searching-algorithms.md diff --git a/contrib/ds-algorithms/searching-algorithms.md b/contrib/ds-algorithms/searching-algorithms.md new file mode 100644 index 0000000..78b86d1 --- /dev/null +++ b/contrib/ds-algorithms/searching-algorithms.md @@ -0,0 +1,161 @@ +# Searching Algorithms + +Searching algorithms are techniques used to locate specific items within a collection of data. These algorithms are fundamental in computer science and are employed in various applications, from databases to web search engines. + +## Real Life Example of Searching +- Searching for a word in a dictionary +- Searching for a specific book in a library +- Searching for a contact in your phone's address book +- Searching for a file on your computer, etc. + +# Some common searching techniques + +# 1. Linear Search + +Linear search, also known as sequential search, is a straightforward searching algorithm that checks each element in a collection until the target element is found or the entire collection has been traversed. It is simple to implement but becomes inefficient for large datasets. + +**Algorithm Overview:** +- **Sequential Checking:** The algorithm iterates through each element in the collection, starting from the first element. +- **Comparing Elements:** At each iteration, it compares the current element with the target element. +- **Finding the Target:** If the current element matches the target, the search terminates, and the index of the element is returned. +- **Completing the Search:** If the entire collection is traversed without finding the target, the algorithm indicates that the element is not present. + +## Linear Search Code in Python + +```python +def linear_search(arr, target): + for i in range(len(arr)): + if arr[i] == target: + return i + return -1 + +arr = [5, 3, 8, 1, 2] +target = 8 +result = linear_search(arr, target) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Complexity Analysis +- **Time Complexity**: O(n) +- **Space Complexity**: O(1) + +
+
+
+ +# 2. Binary Search + +Binary search is an efficient searching algorithm that works on sorted collections. It repeatedly divides the search interval in half until the target element is found or the interval is empty. Binary search is significantly faster than linear search but requires the collection to be sorted beforehand. + +**Algorithm Overview:** +- **Initial State:** Binary search starts with the entire collection as the search interval. +- **Divide and Conquer:** At each step, it calculates the middle element of the current interval and compares it with the target. +- **Narrowing Down the Interval:** If the middle element is equal to the target, the search terminates successfully. Otherwise, it discards half of the search interval based on the comparison result. +- **Repeating the Process:** The algorithm repeats this process on the remaining half of the interval until the target is found or the interval is empty. + +## Binary Search Code in Python (Iterative) + +```python +def binary_search(arr, target): + low = 0 + high = len(arr) - 1 + while low <= high: + mid = (low + high) // 2 + if arr[mid] == target: + return mid + elif arr[mid] < target: + low = mid + 1 + else: + high = mid - 1 + return -1 + +arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] +target = 13 +result = binary_search(arr, target) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Binary Search Code in Python (Recursive) + +```python +def binary_search_recursive(arr, target, low, high): + if low <= high: + mid = (low + high) // 2 + if arr[mid] == target: + return mid + elif arr[mid] < target: + return binary_search_recursive(arr, target, mid + 1, high) + else: + return binary_search_recursive(arr, target, low, mid - 1) + else: + return -1 + +arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] +target = 13 +result = binary_search_recursive(arr, target, 0, len(arr) - 1) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Complexity Analysis +- **Time Complexity**: O(log n) +- **Space Complexity**: O(1) (Iterative), O(log n) (Recursive) + +
+
+
+ +# 3. Interpolation Search + +Interpolation search is an improved version of binary search, especially useful when the elements in the collection are uniformly distributed. Instead of always dividing the search interval in half, interpolation search estimates the position of the target element based on its value and the values of the endpoints of the search interval. + +**Algorithm Overview:** +- **Estimating Position:** Interpolation search calculates an approximate position of the target element within the search interval based on its value and the values of the endpoints. +- **Refining the Estimate:** It adjusts the estimated position based on whether the target value is likely to be closer to the beginning or end of the search interval. +- **Updating the Interval:** Using the refined estimate, it narrows down the search interval iteratively until the target is found or the interval becomes empty. + +## Interpolation Search Code in Python + +```python +def interpolation_search(arr, target): + low = 0 + high = len(arr) - 1 + while low <= high and arr[low] <= target <= arr[high]: + if low == high: + if arr[low] == target: + return low + return -1 + pos = low + ((target - arr[low]) * (high - low)) // (arr[high] - arr[low]) + if arr[pos] == target: + return pos + elif arr[pos] < target: + low = pos + 1 + else: + high = pos - 1 + return -1 + +arr = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] +target = 60 +result = interpolation_search(arr, target) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Complexity Analysis +- **Time Complexity**: O(log log n) (Average) +- **Space Complexity**: O(1) + +
+
+
+ From dbd9fd9081ec04b13c2a2e33889a7ce18b8e5f94 Mon Sep 17 00:00:00 2001 From: shivam navadiya Date: Tue, 21 May 2024 18:22:18 +0530 Subject: [PATCH 108/405] Created Greedy Algorithms --- contrib/ds-algorithms/greedy-algorithms.md | 135 +++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 contrib/ds-algorithms/greedy-algorithms.md diff --git a/contrib/ds-algorithms/greedy-algorithms.md b/contrib/ds-algorithms/greedy-algorithms.md new file mode 100644 index 0000000..c79ee99 --- /dev/null +++ b/contrib/ds-algorithms/greedy-algorithms.md @@ -0,0 +1,135 @@ +# Greedy Algorithms + +Greedy algorithms are simple, intuitive algorithms that make a sequence of choices at each step with the hope of finding a global optimum. They are called "greedy" because at each step, they choose the most advantageous option without considering the future consequences. Despite their simplicity, greedy algorithms are powerful tools for solving optimization problems, especially when the problem exhibits the greedy-choice property. + +## Real-Life Examples of Greedy Algorithms +- **Coin Change:** Finding the minimum number of coins to make a certain amount of change. +- **Job Scheduling:** Assigning tasks to machines to minimize completion time. +- **Huffman Coding:** Constructing an optimal prefix-free binary code for data compression. +- **Fractional Knapsack:** Selecting items to maximize the value within a weight limit. + +# Some Common Greedy Algorithms + +# 1. Coin Change Problem + +The coin change problem is a classic example of a greedy algorithm. Given a set of coin denominations and a target amount, the objective is to find the minimum number of coins required to make up that amount. + +**Algorithm Overview:** +- **Greedy Strategy:** At each step, the algorithm selects the largest denomination coin that is less than or equal to the remaining amount. +- **Repeat Until Amount is Zero:** The process continues until the remaining amount becomes zero. + +## Coin Change Code in Python + +```python +def coin_change(coins, amount): + coins.sort(reverse=True) + num_coins = 0 + for coin in coins: + num_coins += amount // coin + amount %= coin + if amount == 0: + return num_coins + else: + return -1 + +coins = [1, 5, 10, 25] +amount = 63 +result = coin_change(coins, amount) +if result != -1: + print(f"Minimum number of coins required: {result}.") +else: + print("It is not possible to make the amount with the given denominations.") +``` + +## Complexity Analysis +- **Time Complexity**: O(n log n) for sorting (if not pre-sorted), O(n) for iteration +- **Space Complexity**: O(1) + +
+
+
+ +# 2. Activity Selection Problem + +The activity selection problem involves selecting the maximum number of mutually compatible activities that can be performed by a single person or machine, assuming that a person can only work on one activity at a time. + +**Algorithm Overview:** +- **Greedy Strategy:** Sort the activities based on their finish times. +- **Selecting Activities:** Iterate through the sorted activities, selecting each activity if it doesn't conflict with the previously selected ones. + +## Activity Selection Code in Python + +```python +def activity_selection(start, finish): + n = len(start) + activities = [] + i = 0 + activities.append(i) + for j in range(1, n): + if start[j] >= finish[i]: + activities.append(j) + i = j + return activities + +start = [1, 3, 0, 5, 8, 5] +finish = [2, 4, 6, 7, 9, 9] +selected_activities = activity_selection(start, finish) +print("Selected activities:", selected_activities) +``` + +## Complexity Analysis +- **Time Complexity**: O(n log n) for sorting (if not pre-sorted), O(n) for iteration +- **Space Complexity**: O(1) + +
+
+
+ +# 3. Huffman Coding + +Huffman coding is a method of lossless data compression that efficiently represents characters or symbols in a file. It uses variable-length codes to represent characters, with shorter codes assigned to more frequent characters. + +**Algorithm Overview:** +- **Frequency Analysis:** Determine the frequency of each character in the input data. +- **Building the Huffman Tree:** Construct a binary tree where each leaf node represents a character and the path to the leaf node determines its code. +- **Assigning Codes:** Traverse the Huffman tree to assign codes to each character, with shorter codes for more frequent characters. + +## Huffman Coding Code in Python + +```python +from heapq import heappush, heappop, heapify +from collections import defaultdict + +def huffman_coding(data): + frequency = defaultdict(int) + for char in data: + frequency[char] += 1 + + heap = [[weight, [symbol, ""]] for symbol, weight in frequency.items()] + heapify(heap) + + while len(heap) > 1: + lo = heappop(heap) + hi = heappop(heap) + for pair in lo[1:]: + pair[1] = '0' + pair[1] + for pair in hi[1:]: + pair[1] = '1' + pair[1] + heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:]) + + return sorted(heappop(heap)[1:], key=lambda p: (len(p[-1]), p)) + +data = "Huffman coding is a greedy algorithm" +encoded_data = huffman_coding(data) +print("Huffman Codes:") +for symbol, code in encoded_data: + print(f"{symbol}: {code}") +``` + +## Complexity Analysis +- **Time Complexity**: O(n log n) for heap operations, where n is the number of unique characters +- **Space Complexity**: O(n) for the heap + +
+
+
From 20009b0e888e778a112ef18b96c322f1532ec1b8 Mon Sep 17 00:00:00 2001 From: shivam navadiya Date: Tue, 21 May 2024 18:23:16 +0530 Subject: [PATCH 109/405] Created Dynamic Programming --- contrib/ds-algorithms/dynamic-programming.md | 132 +++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 contrib/ds-algorithms/dynamic-programming.md diff --git a/contrib/ds-algorithms/dynamic-programming.md b/contrib/ds-algorithms/dynamic-programming.md new file mode 100644 index 0000000..43149f8 --- /dev/null +++ b/contrib/ds-algorithms/dynamic-programming.md @@ -0,0 +1,132 @@ +# Dynamic Programming + +Dynamic programming is a method for solving complex problems by breaking them down into simpler subproblems and solving each subproblem only once. It stores the solutions to subproblems to avoid redundant computations, making it particularly useful for optimization problems where the solution can be obtained by combining solutions to smaller subproblems. + +## Real-Life Examples of Dynamic Programming +- **Fibonacci Sequence:** Computing the nth Fibonacci number efficiently. +- **Shortest Path:** Finding the shortest path in a graph from a source to a destination. +- **String Edit Distance:** Calculating the minimum number of operations required to transform one string into another. +- **Knapsack Problem:** Maximizing the value of items in a knapsack without exceeding its weight capacity. + +# Some Common Dynamic Programming Techniques + +# 1. Fibonacci Sequence + +The Fibonacci sequence is a classic example used to illustrate dynamic programming. It is a series of numbers where each number is the sum of the two preceding ones, usually starting with 0 and 1. + +**Algorithm Overview:** +- **Base Cases:** The first two numbers in the Fibonacci sequence are defined as 0 and 1. +- **Memoization:** Store the results of previously computed Fibonacci numbers to avoid redundant computations. +- **Recurrence Relation:** Compute each Fibonacci number by adding the two preceding numbers. + +## Fibonacci Sequence Code in Python (Top-Down Approach with Memoization) + +```python +def fibonacci(n, memo={}): + if n in memo: + return memo[n] + if n <= 1: + return n + memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo) + return memo[n] + +n = 10 +print(f"The {n}th Fibonacci number is: {fibonacci(n)}.") +``` + +## Fibonacci Sequence Code in Python (Bottom-Up Approach) + +```python +def fibonacci(n): + fib = [0, 1] + for i in range(2, n + 1): + fib.append(fib[i - 1] + fib[i - 2]) + return fib[n] + +n = 10 +print(f"The {n}th Fibonacci number is: {fibonacci(n)}.") +``` + +## Complexity Analysis +- **Time Complexity**: O(n) for both approaches +- **Space Complexity**: O(n) for the top-down approach (due to memoization), O(1) for the bottom-up approach + +
+
+
+ +# 2. Longest Common Subsequence + +The longest common subsequence (LCS) problem is to find the longest subsequence common to two sequences. A subsequence is a sequence that appears in the same relative order but not necessarily contiguous. + +**Algorithm Overview:** +- **Base Cases:** If one of the sequences is empty, the LCS is empty. +- **Memoization:** Store the results of previously computed LCS lengths to avoid redundant computations. +- **Recurrence Relation:** Compute the LCS length by comparing characters of the sequences and making decisions based on whether they match. + +## Longest Common Subsequence Code in Python (Top-Down Approach with Memoization) + +```python +def longest_common_subsequence(X, Y, m, n, memo={}): + if (m, n) in memo: + return memo[(m, n)] + if m == 0 or n == 0: + return 0 + if X[m - 1] == Y[n - 1]: + memo[(m, n)] = 1 + longest_common_subsequence(X, Y, m - 1, n - 1, memo) + else: + memo[(m, n)] = max(longest_common_subsequence(X, Y, m, n - 1, memo), + longest_common_subsequence(X, Y, m - 1, n, memo)) + return memo[(m, n)] + +X = "AGGTAB" +Y = "GXTXAYB" +print("Length of Longest Common Subsequence:", longest_common_subsequence(X, Y, len(X), len(Y))) +``` + +## Complexity Analysis +- **Time Complexity**: O(m * n) for the top-down approach, where m and n are the lengths of the input sequences +- **Space Complexity**: O(m * n) for the memoization table + +
+
+
+ +# 3. 0-1 Knapsack Problem + +The 0-1 knapsack problem is a classic optimization problem where the goal is to maximize the total value of items selected while keeping the total weight within a specified limit. + +**Algorithm Overview:** +- **Base Cases:** If the capacity of the knapsack is 0 or there are no items to select, the total value is 0. +- **Memoization:** Store the results of previously computed subproblems to avoid redundant computations. +- **Recurrence Relation:** Compute the maximum value by considering whether to include the current item or not. + +## 0-1 Knapsack Problem Code in Python (Top-Down Approach with Memoization) + +```python +def knapsack(weights, values, capacity, n, memo={}): + if (capacity, n) in memo: + return memo[(capacity, n)] + if n == 0 or capacity == 0: + return 0 + if weights[n - 1] > capacity: + memo[(capacity, n)] = knapsack(weights, values, capacity, n - 1, memo) + else: + memo[(capacity, n)] = max(values[n - 1] + knapsack(weights, values, capacity - weights[n - 1], n - 1, memo), + knapsack(weights, values, capacity, n - 1, memo)) + return memo[(capacity, n)] + +weights = [10, 20, 30] +values = [60, 100, 120] +capacity = 50 +n = len(weights) +print("Maximum value that can be obtained:", knapsack(weights, values, capacity, n)) +``` + +## Complexity Analysis +- **Time Complexity**: O(n * W) for the top-down approach, where n is the number of items and W is the capacity of the knapsack +- **Space Complexity**: O(n * W) for the memoization table + +
+
+
\ No newline at end of file From a50c8c9a90a5f4c739a24fd752add4af8627afd0 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid <109688855+PilotAxis@users.noreply.github.com> Date: Tue, 21 May 2024 19:13:40 +0530 Subject: [PATCH 110/405] Update Queues.md --- contrib/ds-algorithms/Queues.md | 131 ++++++++++++++++++++++++++------ 1 file changed, 107 insertions(+), 24 deletions(-) diff --git a/contrib/ds-algorithms/Queues.md b/contrib/ds-algorithms/Queues.md index 8ba2ce3..2c5c0f0 100644 --- a/contrib/ds-algorithms/Queues.md +++ b/contrib/ds-algorithms/Queues.md @@ -1,23 +1,33 @@ -# Introduction to Queues +# Queues in Python A queue is a linear data structure where elements are added at the back (enqueue) and removed from the front (dequeue). Imagine a line at a coffee shop, the first in line (front) gets served first, and new customers join at the back. This FIFO approach ensures order and fairness in processing elements. Queues offer efficient implementations for various scenarios. They are often used in: -- Task Scheduling - Operating systems utilize queues to manage processes waiting for CPU time. -- Breadth-first search algorithms - Traversing a tree or graph involves exploring neighbouring nodes level by level, often achieved using a queue. -- Message passing - Communication protocols leverage queues to buffer messages between applications for reliable delivery. +- **Task Scheduling** - Operating systems utilize queues to manage processes waiting for CPU time. +- **Breadth-first search algorithms** - Traversing a tree or graph involves exploring neighbouring nodes level by level, often achieved using a queue. +- **Message passing** - Communication protocols leverage queues to buffer messages between applications for reliable delivery. -
+## Types of Queue -Types of Data Structure +A queue can be classified into 4 types - +- **Simple Queue** - A simple queue is a queue, where we can only insert an element at the back and remove the element from the front of the queue, this type of queue follows the FIFO principle. +- **Double-Ended Queue (Dequeue)** - In this type of queue, insertions and deletions of elements can be performed from both ends of the queue.
+Double-ended queues can be classified into 2 types -> + - **Input-Restricted Queue** + - **Output-Restricted Queue** +- **Circular Queue** - It is a special type of queue where the back is connected to the front, where the operations follow the FIFO principle. +- **Priority Queue** - In this type of queue, elements are accessed based on their priority in the queue.
+Priority queues are of 2 types -> + - **Ascending Priority Queue** + - **Descending Priority Queue** ## Real Life Examples of Queues -- Customer Service - Consider how a customer service phone line works. Customers calling are put into a queue. The first customer to call is the first one to be served (FIFO). As more customers call, they are added to the end of the queue, and as customers are served, they are removed from the front. The entire process follows the queue data structure. +- **Customer Service** - Consider how a customer service phone line works. Customers calling are put into a queue. The first customer to call is the first one to be served (FIFO). As more customers call, they are added to the end of the queue, and as customers are served, they are removed from the front. The entire process follows the queue data structure. -- Printers - Printers operate using a queue to manage print jobs. When a user sends a document to the printer, the job is added to the queue (enqueue). Once a job completes printing, it's removed from the queue (dequeue), and the next job in line starts. This sequential order of handling tasks perfectly exhibits the queue data structure. +- **Printers** - Printers operate using a queue to manage print jobs. When a user sends a document to the printer, the job is added to the queue (enqueue). Once a job completes printing, it's removed from the queue (dequeue), and the next job in line starts. This sequential order of handling tasks perfectly exhibits the queue data structure. -- Computer Memory - Certain types of computer memory use a queue data structure to hold and process instructions. For example, in a computer's cache memory, the fetch-decode-execute cycle of an instruction follows a queue. The first instruction fetched is the first one to be decoded and executed, while new instructions fetched are added to the rear. +- **Computer Memory** - Certain types of computer memory use a queue data structure to hold and process instructions. For example, in a computer's cache memory, the fetch-decode-execute cycle of an instruction follows a queue. The first instruction fetched is the first one to be decoded and executed, while new instructions fetched are added to the rear.
@@ -25,23 +35,96 @@ Queues offer efficient implementations for various scenarios. They are often use Understanding these terms is crucial for working with queues: -- Enqueue - Adding an element to the back of the queue. -- Dequeue - Removing the element at the front of the queue. -- Front - The first element in the queue, to be removed next. -- Rear/Back - The last element in the queue, where new elements are added. -- Empty Queue - A queue with no elements. -- Overflow - Attempting to enqueue an element when the queue is full. -- Underflow - Attempting to dequeue an element from an empty queue. +- **Enqueue** - Adding an element to the back of the queue. +- **Dequeue** - Removing the element at the front of the queue. +- **Front** - The first element in the queue, to be removed next. +- **Rear/Back** - The last element in the queue, where new elements are added. +- **Empty Queue** - A queue with no elements. +- **Overflow** - Attempting to enqueue an element when the queue is full. +- **Underflow** - Attempting to dequeue an element from an empty queue. -
- -# Operations on a Queue +## Operations on a Queue There are some key operations in a queue that include - -- isFULL - This operation is used to check if a queue is full. -- isEMPTY - This operation is used to check if a queue is empty. -- Display - This operation is used to display the queue elements. -- Peek - This operation is the process of getting the front value of a queue, without removing it. (i.e., Value at the front). +- **isFULL** - This operation checks if a queue is full. +- **isEMPTY** - This operation checks if a queue is empty. +- **Display** - This operation displays the queue elements. +- **Peek** - This operation is the process of getting the front value of a queue, without removing it. (i.e., Value at the front). -image +
+ +# Implementation of Queue + +```python +def isEmpty(Qu): + if Qu == []: + return True + else: + return False + +def Enqueue(Qu, item) : + Qu.append(item) + if len(Qu) == 1: + front = rear = 0 + else: + rear = len(Qu) - 1 + print(item, "enqueued to queue") +def Dequeue(Qu): + if isEmpty(Qu): + print("Underflow") + else: + item = Qu.pop(0) + if len(Qu) == 0: #if it was single-element queue + front = rear = None + print(item, "dequeued from queue") + +def Peek(Qu): + if isEmpty(Qu): + print("Underflow") + else: + front = 0 + print("Frontmost item is :", Qu[front]) + +def Display(Qu): + if isEmpty(Qu): + print("Queue Empty!") + elif len(Qu) == 1: + print(Qu[0], "<== front, rear") + else: + front = 0 + rear = len(Qu) - 1 + print(Qu[front], "<-front") + for a in range(1, rear): + print(Qu[a]) + print(Qu[rear], "<-rear") + +queue = [] #initially queue is empty +front = None + +# Example Usage +Enqueue(queue, 1) +Enqueue(queue, 2) +Enqueue(queue, 3) +Dequeue(queue) +Peek(queue) +Display(queue) +``` + +## Output + +``` +1 enqueued to queue +2 enqueued to queue +3 enqueued to queue +1 dequeued from queue +Frontmost item is : 2 +2 <-front +3 <-rear +``` + +## Complexity Analysis + +- **Worst case**: `O(n^2)` This occurs when the code performs lots of display operations. +- **Best case**: `O(n)` If the code mostly performs enqueue, dequeue and peek operations. +- **Average case**: `O(n^2)` It occurs when the number of operations in display are more than the operations in enqueue, dequeue and peek. From 0f0a658a61f9c90eb503ec575b11f1656e3436e9 Mon Sep 17 00:00:00 2001 From: Mohammed Ahmed Majid <109688855+PilotAxis@users.noreply.github.com> Date: Tue, 21 May 2024 19:19:15 +0530 Subject: [PATCH 111/405] Update index.md Added reference to the file Queues.md --- contrib/ds-algorithms/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 5b52155..e88fab1 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -2,3 +2,4 @@ - [Section title](filename.md) - [Sorting Algorithms](sorting-algorithms.md) +- [Queues in Python](Queues.md) From 4ee5b32b8e217eac48799391a2f8182ac2abae35 Mon Sep 17 00:00:00 2001 From: Pradnya <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Tue, 21 May 2024 21:51:48 +0530 Subject: [PATCH 112/405] Create dates_and_times.md Added content for Working with dates & times in python --- contrib/advanced-python/dates_and_times.md | 129 +++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 contrib/advanced-python/dates_and_times.md diff --git a/contrib/advanced-python/dates_and_times.md b/contrib/advanced-python/dates_and_times.md new file mode 100644 index 0000000..f599e26 --- /dev/null +++ b/contrib/advanced-python/dates_and_times.md @@ -0,0 +1,129 @@ +## Working with Dates and Times in Python +Handling dates and times is an essential aspect of many programming tasks. +Python provides robust modules to work with dates and times, making it easier to perform operations like formatting, parsing, and arithmetic. +This guide provides an overview of these modules and their key functionalities. + +## 1. 'datetime' Module +The datetime module supplies classes for manipulating dates and times. The main classes in the datetime module are: + +* date: Represents a date (year, month, day). +* time: Represents a time (hour, minute, second, microsecond). +* datetime: Combines date and time information. +* timedelta: Represents the difference between two dates or times. +* tzinfo: Provides time zone information objects. + +**Key Concepts:** + +* Naive vs. Aware: Naive datetime objects do not contain time zone information, while aware datetime objects do. +* Immutability: date and time objects are immutable; once created, they cannot be changed. + +Example: +```bash +python +Copy code +import datetime +# Get the current date and time +now = datetime.datetime.now() +print("Current date and time:", now) +``` + +## 2. Formatting Dates and Times +Formatting involves converting datetime objects into human-readable strings. This is achieved using the strftime method, which stands for "string format time." +You can specify various format codes to dictate how the output string should be structured. + +**Common Format Codes:** + +* %Y: Year with century (e.g., 2024) +* %m: Month as a zero-padded decimal number (e.g., 01) +* %d: Day of the month as a zero-padded decimal number (e.g., 15) +* %H: Hour (24-hour clock) as a zero-padded decimal number (e.g., 13) +* %M: Minute as a zero-padded decimal number (e.g., 45) +* %S: Second as a zero-padded decimal number (e.g., 30) + +Example: +```bash +python +Copy code +import datetime + +now = datetime.datetime.now() +formatted_now = now.strftime("%Y-%m-%d %H:%M:%S") +print("Formatted current date and time:", formatted_now) +``` + +## 3. Parsing Dates and Times +Parsing is the process of converting strings representing dates and times into datetime objects. The strptime method, which stands for "string parse time," +allows you to specify the format of the input string. + +Example: +```bash +python +Copy code +import datetime + +date_string = "2024-05-15 13:45:30" +date_object = datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S") +print("Parsed date and time:", date_object) +``` + +## 4. Working with Time Differences +The timedelta class is used to represent the difference between two datetime objects. This is useful for calculations involving durations, such as finding the +number of days between two dates or adding a certain period to a date. + +Example: +```bash +python +Copy code +import datetime + +date1 = datetime.datetime(2024, 5, 15, 12, 0, 0) +date2 = datetime.datetime(2024, 5, 20, 14, 30, 0) + +difference = date2 - date1 +print("Difference:", difference) +print("Days:", difference.days) +print("Total seconds:", difference.total_seconds()) +``` + +## 5. Time Zones +Time zone handling in Python is facilitated by the pytz library. It allows you to convert naive datetime objects into timezone-aware objects and perform +operations across different time zones. + +**Key Concepts:** + +* Timezone-aware: A datetime object that includes timezone information. +* Localization: The process of associating a naive datetime with a time zone. + +Example: +```bash +python +Copy code +import datetime +import pytz + +# Define a timezone +tz = pytz.timezone('Asia/Kolkata') + +# Get the current time in a specific timezone +now = datetime.datetime.now(tz) +print("Current time in Asia/Kolkata:", now) +``` + +## 6. Date Arithmetic +Date arithmetic involves performing operations like addition or subtraction on date or datetime objects using timedelta. This is useful for calculating future +or past dates based on a given date. + +Example: +```bash +python +Copy code +import datetime + +today = datetime.date.today() +future_date = today + datetime.timedelta(days=10) +print("Date after 10 days:", future_date) +``` + +## Summary +Python’s datetime module and the pytz library provide comprehensive tools for working with dates, times, and time zones. They enable you to perform a wide range +of operations, from basic date manipulations to complex time zone conversions. From affc013943c380df51e90c08553573a6da46a143 Mon Sep 17 00:00:00 2001 From: Pradnya <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Tue, 21 May 2024 21:55:23 +0530 Subject: [PATCH 113/405] Update index.md Added index for dates and times --- contrib/advanced-python/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 5ea5081..bf377fc 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,3 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) +- [Working with Dates & Times in Python](dates_and_times.md) From 2967206c16c69227da131aa560efe0831148bc12 Mon Sep 17 00:00:00 2001 From: Pradnya <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Tue, 21 May 2024 22:01:17 +0530 Subject: [PATCH 114/405] Create regular_expressions.md Added content for regular expressions in python --- .../advanced-python/regular_expressions.md | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 contrib/advanced-python/regular_expressions.md diff --git a/contrib/advanced-python/regular_expressions.md b/contrib/advanced-python/regular_expressions.md new file mode 100644 index 0000000..65ff2c2 --- /dev/null +++ b/contrib/advanced-python/regular_expressions.md @@ -0,0 +1,96 @@ +## Regular Expressions in Python +Regular expressions (regex) are a powerful tool for pattern matching and text manipulation. +Python's re module provides comprehensive support for regular expressions, enabling efficient text processing and validation. + +## 1. Introduction to Regular Expressions +A regular expression is a sequence of characters defining a search pattern. Common use cases include validating input, searching within text, and extracting +specific patterns. + +## 2. Basic Syntax +Literal Characters: Match exact characters (e.g., abc matches "abc"). +Metacharacters: Special characters like ., *, ?, +, ^, $, [ ], and | used to build patterns. + +**Common Metacharacters:** + +* .: Any character except newline. +* ^: Start of the string. +* $: End of the string. +* *: 0 or more repetitions. +* +: 1 or more repetitions. +* ?: 0 or 1 repetition. +* []: Any one character inside brackets (e.g., [a-z]). +* |: Either the pattern before or after. + +## 3. Using the re Module + +**Key functions in the re module:** + +* re.match(): Checks for a match at the beginning of the string. +* re.search(): Searches for a match anywhere in the string. +* re.findall(): Returns a list of all matches. +* re.sub(): Replaces matches with a specified string. + +Examples: +```bash +import re + +# Match at the beginning +print(re.match(r'\d+', '123abc').group()) # Output: 123 + +# Search anywhere +print(re.search(r'\d+', 'abc123').group()) # Output: 123 + +# Find all matches +print(re.findall(r'\d+', 'abc123def456')) # Output: ['123', '456'] + +# Substitute matches +print(re.sub(r'\d+', '#', 'abc123def456')) # Output: abc#def# +``` + +## 4. Compiling Regular Expressions +Compiling regular expressions improves performance for repeated use. + +Example: +```bash +import re + +pattern = re.compile(r'\d+') +print(pattern.match('123abc').group()) # Output: 123 +print(pattern.search('abc123').group()) # Output: 123 +print(pattern.findall('abc123def456')) # Output: ['123', '456'] +``` + +## 5. Groups and Capturing +Parentheses () group and capture parts of the match. + +Example: +```bash +import re + +match = re.match(r'(\d{3})-(\d{2})-(\d{4})', '123-45-6789') +if match: + print(match.group()) # Output: 123-45-6789 + print(match.group(1)) # Output: 123 + print(match.group(2)) # Output: 45 + print(match.group(3)) # Output: 6789 +``` + +## 6. Special Sequences +Special sequences are shortcuts for common patterns: + +* \d: Any digit. +* \D: Any non-digit. +* \w: Any alphanumeric character. +* \W: Any non-alphanumeric character. +* \s: Any whitespace character. +* \S: Any non-whitespace character. +Example: +```bash +import re + +print(re.search(r'\w+@\w+\.\w+', 'Contact: support@example.com').group()) # Output: support@example.com +``` + +## Summary +Regular expressions are a versatile tool for text processing in Python. The re module offers powerful functions and metacharacters for pattern matching, +searching, and manipulation, making it an essential skill for handling complex text processing tasks. From d44f8fc253ae6a74af3894ecd77ceb2ef5f01adf Mon Sep 17 00:00:00 2001 From: Pradnya <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Tue, 21 May 2024 22:03:27 +0530 Subject: [PATCH 115/405] Update index.md added index for regular --- contrib/advanced-python/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 5ea5081..ebb567a 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,3 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) +- [Regular Expressions in Python](regular_expressions.md) From d7dc67b678124cd54a93c5b917af9d7a903fb82d Mon Sep 17 00:00:00 2001 From: Pradnya <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Tue, 21 May 2024 22:05:01 +0530 Subject: [PATCH 116/405] Update dates_and_times.md --- contrib/advanced-python/dates_and_times.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/contrib/advanced-python/dates_and_times.md b/contrib/advanced-python/dates_and_times.md index f599e26..983f6b2 100644 --- a/contrib/advanced-python/dates_and_times.md +++ b/contrib/advanced-python/dates_and_times.md @@ -19,8 +19,6 @@ The datetime module supplies classes for manipulating dates and times. The main Example: ```bash -python -Copy code import datetime # Get the current date and time now = datetime.datetime.now() @@ -42,8 +40,6 @@ You can specify various format codes to dictate how the output string should be Example: ```bash -python -Copy code import datetime now = datetime.datetime.now() @@ -57,8 +53,6 @@ allows you to specify the format of the input string. Example: ```bash -python -Copy code import datetime date_string = "2024-05-15 13:45:30" @@ -72,8 +66,6 @@ number of days between two dates or adding a certain period to a date. Example: ```bash -python -Copy code import datetime date1 = datetime.datetime(2024, 5, 15, 12, 0, 0) @@ -96,8 +88,6 @@ operations across different time zones. Example: ```bash -python -Copy code import datetime import pytz @@ -115,8 +105,6 @@ or past dates based on a given date. Example: ```bash -python -Copy code import datetime today = datetime.date.today() From d443fba280e9f1271fd9c54168631f9ff306b8a5 Mon Sep 17 00:00:00 2001 From: Jaya-Prakash-17 Date: Wed, 22 May 2024 22:20:21 +0530 Subject: [PATCH 117/405] "Added Content Decision Trees" --- contrib/machine-learning/Decision-Tree.md | 257 ++++++++++++++++++++++ contrib/machine-learning/index.md | 2 +- 2 files changed, 258 insertions(+), 1 deletion(-) create mode 100644 contrib/machine-learning/Decision-Tree.md diff --git a/contrib/machine-learning/Decision-Tree.md b/contrib/machine-learning/Decision-Tree.md new file mode 100644 index 0000000..6563a22 --- /dev/null +++ b/contrib/machine-learning/Decision-Tree.md @@ -0,0 +1,257 @@ +# Decision Trees +Decision trees are a type of supervised machine learning algorithm that is mostly used in classification problems. They work for both categorical and continuous input and output variables. + +It is also interpreted as acyclic graph that can be utilized for decision-making is called a decision tree. Every branching node in the graph looks at a particular feature (j) of the feature vector. The left branch is taken when the feature's value is less than a certain threshold; the right branch is taken when it is higher. The class to which the example belongs is decided upon as soon as the leaf node is reached. + +## Key Components of a Decision Tree +**Root Node:** This is the decision tree's first node, and it symbolizes the whole population or sample. + +**Internal Nodes:** These are the nodes that make decisions and they stand in for the characteristics or features. + +**Leaf Nodes:** These are the nodes that make decisions and they stand in for the characteristics or features. + +**Branches:** These are the lines that connect the nodes, and they show how the choice was made depending on the feature value. + +### Example: Predicting Loan Approval + +In this example, we will use a decision tree to forecast the approval or denial of a loan application based on a number of features, including job status, credit score, and income. + +``` + Root Node + (All Applications) + / \ + Internal Node Internal Node + (Credit Score) (Employment Status) + / \ / \ + Leaf Node Leaf Node Leaf Node Leaf Node +(Approve Loan) (Deny Loan) (Approve Loan) (Deny Loan) +``` +> There are various formulations of the decision tree learning algorithm. Here, we consider just one, called ID3. + +## Appropriate Problems For Decision Tree Learning +In general, decision tree learning works best on issues that have the following characteristics: +1. ***Instances*** are represented by ***key-value pairs*** +2. The ***output values of the target function are discrete***. Each sample is given a Boolean categorization (yes or no) by the decision tree. Learning functions with multiple possible output values can be effortlessly integrated into decision tree approaches. +3. ***Disjunctive descriptions may be required*** +4. The ***training data may contain errors*** – ***Decision tree learning methods are robust to errors,*** both errors in classifications of the training examples and errors in the attribute +values that describe these examples. +5. ***Missing attribute values could be present in the training data.*** Using decision tree approaches is possible even in cases where some training examples have missing values. + +# Decision Tree Algorithm +The decision tree method classifies the data according to a tree structure. The root node, that holds the complete dataset, is where it all begins. The algorithm then determines which feature, according to a certain criterion like information gain or Gini impurity, is appropriate for splitting the dataset. Subsets of the dataset are then created according to the values of the chosen feature. Until a halting condition is satisfied—for example, obtaining a minimal number of samples per leaf node or a maximum tree depth—this procedure is repeated recursively for every subset. + + +### Which Attribute Is the Best Classifier? +- The ID3 algorithm's primary idea is choose which characteristic to test at each tree node. +- Information gain, a statistical feature that quantifies how well a certain attribute divides the training samples into groups based on the target classification. +- When building the tree, ID3 chooses a candidate attribute  using the information gain metric. + +## Entropy & Information + +**Entropy** is a metric that quantifies the level of impurity or uncertainty present in a given dataset. When it comes to decision trees, entropy measures how similar the target variable is within a specific node or subset of the data. It is utilized for assessing the quality of potential splits during the tree construction process. + +The entropy of a node is calculated as: +__Entropy = -Σ(pi * log2(pi))__ + +where `p``i` is the proportion of instances belonging to class `i` in the current node. The entropy is at its maximum when all classes are equally represented in the node, indicating maximum impurity or uncertainty. + +**Information Gain** is a measure used to estimate the possible reduction in entropy achieved by separating the data according to a certain attribute. It quantifies the projected decrease in impurity or uncertainty after the separation. + +The information gain for a feature `A` is calculated as: +__Information Gain = Entropy(parent) - Σ(weight(child) * Entropy(child))__ + +### Example of a Decision Tree +Let us look at a basic decision tree example that predicts a person's likelihood of playing tennis based on climate conditions + +**Data Set:** +--- +| Day | Outlook | Temperature | Humidity | Wind | PlayTennis | +|-----|---------|-------------|----------|------|------------| +| D1 | Sunny | Hot | High | Weak | No | +| D2 | Sunny | Hot | High | Strong | No | +| D3 | Overcast| Hot | High | Weak | Yes | +| D4 | Rain | Mild | High | Weak | Yes | +| D5 | Rain | Cool | Normal | Weak | Yes | +| D6 | Rain | Cool | Normal | Strong | No | +| D7 | Overcast| Cool | Normal | Strong | Yes | +| D8 | Sunny | Mild | High | Weak | No | +| D9 | Sunny | Cool | Normal | Weak | Yes | +| D10 | Rain | Mild | Normal | Weak | Yes | +| D11 | Sunny | Mild | Normal | Strong | Yes | +| D12 | Overcast| Mild | High | Strong | Yes | +| D13 | Overcast| Hot | Normal | Weak | Yes | +| D14 | Rain | Mild | High | Strong | No | +--- + + +1. Calculate the entropy of the entire dataset. +2. For each feature, calculate the information gain by splitting the data based on that feature. +3. Select the feature with the highest information gain to create the root node. +4. Repeat steps 1-3 for each child node until a stopping criterion is met (e.g., all instances in a node belong to the same class, or the maximum depth is reached). + +Let's start with calculating the entropy of the entire dataset: +Total instances: 14 +No instances: 5 +Yes instances: 9 + +**Entropy** = -((5/14) * log2(5/14) + (9/14) * log2(9/14)) = 0.940 + +Now, we'll calculate the information gain for each feature: + +**Outlook**: +- Sunny: 2 No, 3 Yes (Entropy = 0.971) +- Overcast: 0 No, 4 Yes (Entropy = 0) +- Rain: 3 No, 2 Yes (Entropy = 0.971) + +Information Gain = 0.940 - ((5/14) * 0.971 + (4/14) * 0 + (5/14) * 0.971) = 0.246 + +**Temperature**: +- Hot: 2 No, 2 Yes (Entropy = 1) +- Mild: 2 No, 4 Yes (Entropy = 0.811) +- Cool: 1 No, 3 Yes (Entropy = 0.918) + +Information Gain = 0.940 - ((4/14) * 1 + (6/14) * 0.811 + (4/14) * 0.918) = 0.029 + +**Humidity**: +- High: 3 No, 4 Yes (Entropy = 0.985) +- Normal: 2 No, 5 Yes (Entropy = 0.971) + +Information Gain = 0.940 - ((7/14) * 0.985 + (7/14) * 0.971) = 0.012 + +**Wind**: +- Weak: 2 No, 6 Yes (Entropy = 0.811) +- Strong: 3 No, 3 Yes (Entropy = 1) + +Information Gain = 0.940 - ((8/14) * 0.811 + (6/14) * 1) = 0.048 + +The feature with the highest information gain is Outlook, so we'll create the root node based on that. + +**Step 1: Root Node (Outlook)** +``` + Root Node (Outlook) + / | \ + Sunny Overcast Rain + Entropy: 0.971 Entropy: 0 Entropy: 0.971 + 5 instances 4 instances 5 instances + +``` + +Now, we'll continue building the tree by recursively splitting the child nodes based on the feature with the highest information gain within each subset. + +**Step 2: Splitting Sunny and Rain Nodes** + +For the Sunny node: +- Temperature: + - Hot: 2 No, 0 Yes (Entropy = 0) + - Mild: 0 No, 3 Yes (Entropy = 0) + - Cool: 0 No, 0 Yes (Entropy = 0) + Information Gain = 0.971 + +- Humidity: + - High: 1 No, 2 Yes (Entropy = 0.918) + - Normal: 1 No, 1 Yes (Entropy = 1) + Information Gain = 0.153 + +- Wind: + - Weak: 1 No, 2 Yes (Entropy = 0.918) + - Strong: 1 No, 1 Yes (Entropy = 1) + Information Gain = 0.153 + +The highest information gain is achieved by splitting on Temperature, so we'll create child nodes for Sunny based on Temperature. + +For the Rain node: +- Wind: + - Weak: 1 No, 3 Yes (Entropy = 0.918) + - Strong: 2 No, 0 Yes (Entropy = 0) + Information Gain = 0.153 + +Since there is only one feature left (Wind), we'll create child nodes for Rain based on Wind. + +**Step 3: Updated Decision Tree** +``` + Root Node (Outlook) + / | \ + Sunny Overcast Rain + / | \ Entropy: 0 / \ + Hot Mild Cool 4 instances Weak Strong + Entropy: 0 Entropy: 0 Entropy: 0.918 Entropy: 0 + 2 instances 3 instances 4 instances 1 instance +``` +At this point, all leaf nodes are either pure (entropy = 0) or have instances belonging to a single class. Therefore, we can stop the tree construction process. + +**Step 4: Pruning the Decision Tree** + +The decision tree we constructed in the previous steps is a complete tree that perfectly classifies the training data. However, this can lead to overfitting, meaning the tree may perform poorly on new, unseen data due to its complexity and memorization of noise in the training set. + +To address this, we can prune the tree by removing some of the leaf nodes or branches that contribute little to the overall classification accuracy. Pruning helps to generalize the tree and improve its performance on unseen data. + +There are various pruning techniques, such as: + +1. **Pre-pruning**: Stopping the tree growth based on a pre-defined criterion (e.g., maximum depth, minimum instances in a node, etc.). +2. **Post-pruning**: Growing the tree to its full depth and then removing subtrees or branches based on a pruning criterion. + +>We can observe that the "Cool" node under the "Sunny" branch has no instances in the training data. Removing this node will not affect the classification accuracy on the training set, and it may help generalize the tree better. + +**Step 5: Pruned Decision Tree** +``` + Root Node (Outlook) + / | \ + / | \ + Sunny Overcast Rain + / \ Entropy: 0 / \ + Hot Mild 4 instances Weak Strong +Entropy: 0 Entropy: 0.918 Entropy: 0 Entropy: 0 + 2 instances 4 instances 3 instances 2 instances +``` + +**Step 6: Visualizing the Decision Tree** + +Decision trees can be visualized graphically to provide a clear representation of the hierarchical structure and the decision rules. This visualization can aid in understanding the tree's logic and interpreting the results. + +There are various tools and libraries available for visualizing decision trees. One popular library in Python is `graphviz`, which can create tree-like diagrams and visualizations. + +Here's an example of how to visualize our pruned decision tree using `graphviz` in Python: + +```python +import graphviz +from sklearn import tree + +# Create a decision tree classifier +decision_tree_classifier = tree.DecisionTreeClassifier() + +# Train the classifier on the dataset X and labels y +decision_tree_classifier.fit(X, y) + +# Visualize the decision tree +tree_dot_data = tree.export_graphviz(decision_tree_classifier, out_file=None, + feature_names=['Outlook', 'Temperature', 'Humidity', 'Wind'], + class_names=['No', 'Yes'], filled=True, rounded=True, special_characters=True) + +# Create a graph from the DOT data +graph = graphviz.Source(tree_dot_data) + +# Render and save the decision tree as an image file +graph.render("decision_tree") + +``` +``` + Outlook + / | \ + Sunny Overcast Rain + / | / \ + Humidity Yes Wind Wind + / \ / \ +High Normal Weak Strong + No Yes Yes No +``` + +The final decision tree classifies instances based on the following rules: + +- If Outlook is Overcast, PlayTennis is Yes +- If Outlook is Sunny and Temperature is Hot, PlayTennis is No +- If Outlook is Sunny and Temperature is Mild, PlayTennis is Yes +- If Outlook is Sunny and Temperature is Cool, PlayTennis is Yes (no instances in the dataset) +- If Outlook is Rain and Wind is Weak, PlayTennis is Yes +- If Outlook is Rain and Wind is Strong, PlayTennis is No + +> Note that the calculated entropies and information gains may vary slightly depending on the specific implementation and rounding methods used. \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 82596a2..971efaf 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Decision Tree Learning](Decision-Tree.md) From 5e95059765b6cb99498c1302b94f68c8d5ee482c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 23 May 2024 02:57:11 +0530 Subject: [PATCH 118/405] Update dice_roller.md --- contrib/mini-projects/dice_roller.md | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/contrib/mini-projects/dice_roller.md b/contrib/mini-projects/dice_roller.md index 6e1b793..0f4e5f9 100644 --- a/contrib/mini-projects/dice_roller.md +++ b/contrib/mini-projects/dice_roller.md @@ -1,14 +1,18 @@ -Dice Roller -
-The aim of this project is to replicate a dice and generate a random number from the numbers 1 to 6.

+## Dice Roller + +The aim of this project is to replicate a dice and generate a random number from the numbers 1 to 6. + For this first we will import the random library which will help make random choices. + ``` import random def dice(): dice_no = random.choice([1,2,3,4,5,6]) return "You got " + str(dice_no) ``` -The above snippet of code defines a function called "dice( )" which makes the random choice and returns the number that is generated. + +The above snippet of code defines a function called `dice()` which makes the random choice and returns the number that is generated. + ``` def roll_dice(): print("Hey Guys, you will now roll a single dice using Python!") @@ -24,6 +28,9 @@ def roll_dice(): print("Thanks for rolling the dice.") roll_dice() ``` -The above code defines a function called "roll_dice( )" which interacts with the user.
-It prompts the user to give an input and if the input is k,the code proceeds further to generate a random number or gives the message of invalid input and asks the user to try again.
-After the dice has been rolled once, the function asks the user whether they want a reroll in the form of a yes or no question.The dice is rolled again if the user gives 'yes' as an answer and exits the code if the user replies with anything other than yes. + +The above code defines a function called `roll_dice()` which interacts with the user. + +It prompts the user to give an input and if the input is `k`,the code proceeds further to generate a random number or gives the message of invalid input and asks the user to try again. + +After the dice has been rolled once, the function asks the user whether they want a reroll in the form of a `yes` or `no` question. The dice is rolled again if the user gives `yes` as an answer and exits the code if the user replies with anything other than yes. From 4d86a0af83d35990a71144e88c8979e5146529e8 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 23 May 2024 04:15:56 +0530 Subject: [PATCH 119/405] Update index.md --- contrib/machine-learning/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 40a2237..44b39d4 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,4 +1,6 @@ # List of sections +- [Section title](filename.md) - [Confusion Matrix](confusion-matrix.md) - [Support Vector Machine Algorithm](support-vector-machine.md) + From 428bd62cd219830b77dde615f5a0efb3432afbb1 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 23 May 2024 04:20:12 +0530 Subject: [PATCH 120/405] Update confusion-matrix.md --- contrib/machine-learning/confusion-matrix.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/contrib/machine-learning/confusion-matrix.md b/contrib/machine-learning/confusion-matrix.md index ac5cd31..4bedf66 100644 --- a/contrib/machine-learning/confusion-matrix.md +++ b/contrib/machine-learning/confusion-matrix.md @@ -1,4 +1,6 @@ -Confusion Matrix - A confusion matrix is a fundamental performance evaluation tool used in machine learning to assess the accuracy of a classification model. It is an N x N matrix, where N represents the number of target classes. +## Confusion Matrix + +A confusion matrix is a fundamental performance evaluation tool used in machine learning to assess the accuracy of a classification model. It is an N x N matrix, where N represents the number of target classes. For binary classification, it results in a 2 x 2 matrix that outlines four key parameters: 1. True Positive (TP) - The predicted value matches the actual value, or the predicted class matches the actual class. @@ -20,15 +22,18 @@ To implement the confusion matrix in Python, we can use the confusion_matrix() f The function returns a 2D array that represents the confusion matrix. We can also visualize the confusion matrix using a heatmap. +```python # Import necessary libraries import numpy as np -from sklearn.metrics import confusion_matrix,classification_report +from sklearn.metrics import confusion_matrix, classification_report import seaborn as sns import matplotlib.pyplot as plt # Create the NumPy array for actual and predicted labels -actual = np.array(['Apple', 'Apple', 'Apple', 'Not Apple', 'Apple', 'Not Apple', 'Apple', 'Apple', 'Not Apple', 'Not Apple']) -predicted = np.array(['Apple', 'Not Apple', 'Apple', 'Not Apple', 'Apple', 'Apple', 'Apple', 'Apple', 'Not Apple', 'Not Apple']) +actual = np.array(['Apple', 'Apple', 'Apple', 'Not Apple', 'Apple', + 'Not Apple', 'Apple', 'Apple', 'Not Apple', 'Not Apple']) +predicted = np.array(['Apple', 'Not Apple', 'Apple', 'Not Apple', 'Apple', + 'Apple', 'Apple', 'Apple', 'Not Apple', 'Not Apple']) # Compute the confusion matrix cm = confusion_matrix(actual,predicted) @@ -46,8 +51,11 @@ plt.show() # Classifications Report based on Confusion Metrics print(classification_report(actual, predicted)) +``` -# Results +### Results + +``` 1. Confusion Matrix: [[5 1] [1 3]] @@ -59,3 +67,4 @@ Not Apple 0.75 0.75 0.75 4 accuracy 0.80 10 macro avg 0.79 0.79 0.79 10 weighted avg 0.80 0.80 0.80 10 +``` From 34131322a2753f32d44630e1c127a6716b099fca Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 23 May 2024 04:22:17 +0530 Subject: [PATCH 121/405] Update support-vector-machine.md --- .../support-vector-machine.md | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/contrib/machine-learning/support-vector-machine.md b/contrib/machine-learning/support-vector-machine.md index 90ee922..0117e9f 100644 --- a/contrib/machine-learning/support-vector-machine.md +++ b/contrib/machine-learning/support-vector-machine.md @@ -1,12 +1,19 @@ +## Support Vector Machine + Support Vector Machine or SVM is one of the most popular Supervised Learning algorithms, which is used for Classification as well as Regression problems. However, primarily, it is used for Classification problems in Machine Learning. + SVM can be of two types - 1. Linear SVM: Linear SVM is used for linearly separable data, which means if a dataset can be classified into two classes by using a single straight line, then such data is termed as linearly separable data, and classifier is used called as Linear SVM classifier. 2. Non-linear SVM: Non-Linear SVM is used for non-linearly separated data, which means if a dataset cannot be classified by using a straight line, then such data is termed as non-linear data and classifier used is called as Non-linear SVM classifier. -Working of SVM - The goal of SVM is to find a hyperplane that separates the data points into different classes. A hyperplane is a line in 2D space, a plane in 3D space, or a higher-dimensional surface in n-dimensional space. The hyperplane is chosen in such a way that it maximizes the margin, which is the distance between the hyperplane and the closest data points of each class. The closest data points are called the support vectors. -The distance between the hyperplane and a data point "x" can be calculated using the formula − +Working of SVM - The goal of SVM is to find a hyperplane that separates the data points into different classes. A hyperplane is a line in 2D space, a plane in 3D space, or a higher-dimensional surface in n-dimensional space. The hyperplane is chosen in such a way that it maximizes the margin, which is the distance between the hyperplane and the closest data points of each class. The closest data points are called the support vectors. + +The distance between the hyperplane and a data point "x" can be calculated using the formula − +``` distance = (w . x + b) / ||w|| +``` where "w" is the weight vector, "b" is the bias term, and "||w||" is the Euclidean norm of the weight vector. The weight vector "w" is perpendicular to the hyperplane and determines its orientation, while the bias term "b" determines its position. + The optimal hyperplane is found by solving an optimization problem, which is to maximize the margin subject to the constraint that all data points are correctly classified. In other words, we want to find the hyperplane that maximizes the margin between the two classes while ensuring that no data point is misclassified. This is a convex optimization problem that can be solved using quadratic programming. If the data points are not linearly separable, we can use a technique called kernel trick to map the data points into a higher-dimensional space where they become separable. The kernel function computes the inner product between the mapped data points without computing the mapping itself. This allows us to work with the data points in the higherdimensional space without incurring the computational cost of mapping them. 1. Hyperplane: @@ -19,8 +26,9 @@ It may be defined as the gap between two lines on the closet data points of diff We will use the famous Iris dataset, which contains the sepal length, sepal width, petal length, and petal width of three species of iris flowers: Iris setosa, Iris versicolor, and Iris virginica. The goal is to classify the flowers into their respective species based on these four features. We load the iris dataset using load_iris and split the data into training and testing sets using train_test_split. We use a test size of 0.2, which means that 20% of the data will be used for testing and 80% for training. We set the random state to 42 to ensure reproducibility of the results. -# Implemetation of SVM in Python +### Implemetation of SVM in Python +```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.svm import SVC @@ -45,8 +53,10 @@ y_pred = svm.predict(X_test) # calculate the accuracy of the classifier accuracy = accuracy_score(y_test, y_pred) print("Accuracy:", accuracy) +``` -# Output +#### Output +``` Accuracy: 1 - +``` From 5b74a4be6581161649b2056588b93ac4702ba3d2 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 23 May 2024 04:54:25 +0530 Subject: [PATCH 122/405] Update Descriptive_Statistics.md --- contrib/pandas/Descriptive_Statistics.md | 190 ++++++++++------------- 1 file changed, 82 insertions(+), 108 deletions(-) diff --git a/contrib/pandas/Descriptive_Statistics.md b/contrib/pandas/Descriptive_Statistics.md index 7775965..abdb33b 100644 --- a/contrib/pandas/Descriptive_Statistics.md +++ b/contrib/pandas/Descriptive_Statistics.md @@ -10,13 +10,11 @@ Data scientists utilize descriptive statistics to uncover patterns, identify out ```python import pandas as pd import numpy as np -``` - -```python df = pd.read_csv("Age-Income-Dataset.csv") df ``` + | | Age | Income | | --- | ----------- | ------ | | 0 | Young | 25000 | @@ -70,14 +68,10 @@ df | 48 | Young | 68400 | | 49 | Middle Age | 51700 | - - ```python df.describe() ``` - - | | Income | |-------|-------------| | count | 50.000000 | @@ -101,18 +95,17 @@ $$ \overline{x} = \frac{\sum\limits_{i=1}^{n} x_i}{n} $$ * $\sum$ (sigma) represents the summation symbol, indicating we add up all the values from i=1 to n. * $n$ represents the total number of values in the dataset. - - ```python df['Income'].mean() ``` +#### Result - - +``` 50966.0 +``` - +#### Without pandas ```python @@ -131,12 +124,10 @@ def mean_f(df): mean_f(df) ``` -Without pandas Library -> -Average of Income is 50966.0 +Average of Income: -With pandas Library -> -50966.0 - +- Without pandas Library -> 50966.0 +- With pandas Library -> 50966.0 ### Median @@ -163,21 +154,17 @@ $$ M = \frac{x_{n/2} + x_{(n/2)+1}}{2} $$ * n represents the total number of observations in the dataset. * $x$ represents the individual value. - - - - ```python df['Income'].median() ``` +#### Result - - +``` 46850.0 +``` - - +#### Without pandas ```python def median_f(df): @@ -198,18 +185,15 @@ def median_f(df): median_f(df) ``` -Median without library -> -Median of Income is 49850.0 \ -Median with library -> -46850.0 - +Median of Income: + +- Median without library -> 49850.0 +- Median with library -> 46850.0 ### Mode - The mode is a measure of central tendency that represents the value or values that occur most frequently in a dataset. Unlike the mean and median, which focus on the average or middle value, the mode identifies the most common value(s) in the dataset. - ```python def mode_f(df): for col in df.columns: @@ -240,17 +224,17 @@ def mode_f(df): mode_f(df) ``` +#### Result + +``` Column: Age -Without pandas Library -> \ +Without pandas Library -> Mode of Age is Old -With pandas Library -> \ -0 Old \ +With pandas Library -> +0 Old Name: Age, dtype: object - - - - +``` ### Standard Deviation @@ -264,18 +248,17 @@ $$s = \sqrt{\frac{\sum(x_i-\overline{x})^{2}}{n-1}}$$ * $\overline{x}$ (x bar) represents the mean value of the dataset. * $n$ represents the total number of values in the dataset. - ```python df['Income'].std() ``` +#### Result - - +``` 21096.683267707253 +``` - - +#### Without pandas ```python import math @@ -304,17 +287,17 @@ With pandas library: -> Std : 20884.6509187968 +### Count ```python df['Income'].count() ``` +#### Result - - +``` 50 - - +``` ### Minimum @@ -323,13 +306,13 @@ df['Income'].count() df['Income'].min() ``` +#### Result - - +``` 15000 +``` - - +#### Without pandas ```python def min_f(df): @@ -354,13 +337,13 @@ With pandas Library-> 15000 df['Income'].max() ``` +#### Result - - +``` 93000 +``` - - +#### Without pandas ```python def max_f(df): @@ -374,8 +357,8 @@ def max_f(df): max_f(df) ``` - Without pandas Library-> 93000 - With pandas Library-> 93000 +Without pandas Library-> 93000 +With pandas Library-> 93000 ### Percentile @@ -385,25 +368,23 @@ max_f(df) df['Income'].quantile(0.25) ``` +#### Result - - +``` 33475.0 - - - +``` ```python df['Income'].quantile(0.75) ``` +#### Result - - +``` 65400.0 +``` - - +#### Without pandas ```python def percentile_f(df,percentile): @@ -432,9 +413,6 @@ df = pd.read_csv('Iris.csv') df.head(5) ``` - - - | | Id | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | Species | |---|----|---------------|--------------|---------------|--------------|-------------| | 0 | 1 | 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | @@ -443,9 +421,6 @@ df.head(5) | 3 | 4 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa | | 4 | 5 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa | - - - ```python df.drop(['Id','Species'],axis=1,inplace= True) ``` @@ -463,13 +438,10 @@ $$ COV(X,Y) = \frac{\sum\limits_{i=1}^{n} (X_i - \overline{X}) (Y_i - \overline{ * $\overline{X}$ and $\overline{Y}$ represent the mean values for variables X and Y, respectively. * $n$ represents the total number of observations in the dataset. - - ```python df.cov() ``` - | | SepalLengthCm | SepalWidthCm | PetalLengthCm | PetalWidthCm | |-------------------|-------------- |---------------|-----------------|--------------| | **SepalLengthCm** | 0.685694 | -0.039268 | 1.273682 | 0.516904 | @@ -477,7 +449,7 @@ df.cov() | **PetalLengthCm** | 1.273682 | -0.321713 | 3.113179 | 1.296387 | | **PetalWidthCm** | 0.516904 | -0.117981 | 1.296387 | 0.582414 | - +#### Without pandas ```python def cov_f(df): @@ -496,27 +468,29 @@ def cov_f(df): cov_f(df) ``` -Covariance of SepalLengthCm and SepalLengthCm is : 0.6856935123042504 \ -Covariance of SepalLengthCm and SepalWidthCm is : -0.03926845637583892 \ -Covariance of SepalLengthCm and PetalLengthCm is : 1.2736823266219246 \ +#### Result + +``` +Covariance of SepalLengthCm and SepalLengthCm is : 0.6856935123042504 +Covariance of SepalLengthCm and SepalWidthCm is : -0.03926845637583892 +Covariance of SepalLengthCm and PetalLengthCm is : 1.2736823266219246 Covariance of SepalLengthCm and PetalWidthCm is : 0.5169038031319911 -Covariance of SepalWidthCm and SepalLengthCm is : -0.03926845637583892 \ -Covariance of SepalWidthCm and SepalWidthCm is : 0.1880040268456377 \ -Covariance of SepalWidthCm and PetalLengthCm is : -0.32171275167785235 \ +Covariance of SepalWidthCm and SepalLengthCm is : -0.03926845637583892 +Covariance of SepalWidthCm and SepalWidthCm is : 0.1880040268456377 +Covariance of SepalWidthCm and PetalLengthCm is : -0.32171275167785235 Covariance of SepalWidthCm and PetalWidthCm is : -0.11798120805369115 -Covariance of PetalLengthCm and SepalLengthCm is : 1.2736823266219246 \ -Covariance of PetalLengthCm and SepalWidthCm is : -0.32171275167785235 \ -Covariance of PetalLengthCm and PetalLengthCm is : 3.113179418344519 \ +Covariance of PetalLengthCm and SepalLengthCm is : 1.2736823266219246 +Covariance of PetalLengthCm and SepalWidthCm is : -0.32171275167785235 +Covariance of PetalLengthCm and PetalLengthCm is : 3.113179418344519 Covariance of PetalLengthCm and PetalWidthCm is : 1.2963874720357946 -Covariance of PetalWidthCm and SepalLengthCm is : 0.5169038031319911 \ -Covariance of PetalWidthCm and SepalWidthCm is : -0.11798120805369115 \ -Covariance of PetalWidthCm and PetalLengthCm is : 1.2963874720357946 \ +Covariance of PetalWidthCm and SepalLengthCm is : 0.5169038031319911 +Covariance of PetalWidthCm and SepalWidthCm is : -0.11798120805369115 +Covariance of PetalWidthCm and PetalLengthCm is : 1.2963874720357946 Covariance of PetalWidthCm and PetalWidthCm is : 0.5824143176733781 - - +```` ### Correlation @@ -527,9 +501,6 @@ $$r = \frac{n(\sum xy) - (\sum x)(\sum y)}{\sqrt{n(\sum x^2) - (\sum x)^2} \cdot * r represents the correlation coefficient. * n is the number of data points. - - - ```python df.corr() ``` @@ -541,6 +512,7 @@ df.corr() | **PetalLengthCm** | 0.871754 | -0.420516 | 1.000000 | 0.962757 | | **PetalWidthCm** | 0.817954 | -0.356544 | 0.962757 | 1.000000 | +#### Without using pandas ```python import math @@ -576,24 +548,26 @@ def corr_f(df): corr_f(df) ``` -Correlation of SepalLengthCm and SepalLengthCm :1.0 \ -Correlation of SepalLengthCm and SepalWidthCm :-0.10936924995067286 \ -Correlation of SepalLengthCm and PetalLengthCm :0.8717541573048861 \ +#### Result + +``` +Correlation of SepalLengthCm and SepalLengthCm :1.0 +Correlation of SepalLengthCm and SepalWidthCm :-0.10936924995067286 +Correlation of SepalLengthCm and PetalLengthCm :0.8717541573048861 Correlation of SepalLengthCm and PetalWidthCm :0.8179536333691775 -Correlation of SepalWidthCm and SepalLengthCm :-0.10936924995067286 \ -Correlation of SepalWidthCm and SepalWidthCm :1.0 \ -Correlation of SepalWidthCm and PetalLengthCm :-0.42051609640118826 \ +Correlation of SepalWidthCm and SepalLengthCm :-0.10936924995067286 +Correlation of SepalWidthCm and SepalWidthCm :1.0 +Correlation of SepalWidthCm and PetalLengthCm :-0.42051609640118826 Correlation of SepalWidthCm and PetalWidthCm :-0.3565440896138223 -Correlation of PetalLengthCm and SepalLengthCm :0.8717541573048861 \ -Correlation of PetalLengthCm and SepalWidthCm :-0.42051609640118826 \ -Correlation of PetalLengthCm and PetalLengthCm :1.0 \ +Correlation of PetalLengthCm and SepalLengthCm :0.8717541573048861 +Correlation of PetalLengthCm and SepalWidthCm :-0.42051609640118826 +Correlation of PetalLengthCm and PetalLengthCm :1.0 Correlation of PetalLengthCm and PetalWidthCm :0.9627570970509656 -Correlation of PetalWidthCm and SepalLengthCm :0.8179536333691775 \ -Correlation of PetalWidthCm and SepalWidthCm :-0.3565440896138223 \ -Correlation of PetalWidthCm and PetalLengthCm :0.9627570970509656 \ +Correlation of PetalWidthCm and SepalLengthCm :0.8179536333691775 +Correlation of PetalWidthCm and SepalWidthCm :-0.3565440896138223 +Correlation of PetalWidthCm and PetalLengthCm :0.9627570970509656 Correlation of PetalWidthCm and PetalWidthCm :1.0 - - +``` From 519a5052ec83364fc2f74b4345f65dab63650e1d Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 23 May 2024 05:10:19 +0530 Subject: [PATCH 123/405] 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 1abe707..7a247eb 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,3 +1,3 @@ # List of sections -- [TensorFlow.md](learn-python\contrib\machine-learning\tensorFlow.md) +- [TensorFlow.md](tensorFlow.md) From eefc5d342a7b08a1bbad81ca802e2837b6735171 Mon Sep 17 00:00:00 2001 From: Yodha Sudarsi <101962069+Yodha-Sudarsi@users.noreply.github.com> Date: Thu, 23 May 2024 05:36:06 +0530 Subject: [PATCH 124/405] Installing numpy (#463) * Updated List of sections * Updated index.md Added info about how to install NumPy in a system. * Added installing numpy.md file and updated the index.md * Added installing-numpy.md file and updated the index.md * Create installing-numpy.md for installation * Update index.md Added operations-on-arrays.md * Create operations-on-arrays.md * Update index.md * Update index.md * Rename installing-numpy.md to installing_numpy.md * Rename operations-on-arrays.md to operations_on_arrays.md * Update installing_numpy.md * Update index.md * Rename installing_numpy.md to installing-numpy.md * Rename operations_on_arrays.md to operations-on-arrays.md * Update operations-on-arrays.md * Update operations-on-arrays.md * Revert "Update operations-on-arrays.md" * Delete contrib/numpy/operations-on-arrays.md * Update index.md --------- Co-authored-by: Ankit Mahato --- contrib/numpy/index.md | 1 + contrib/numpy/installing-numpy.md | 82 +++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 contrib/numpy/installing-numpy.md diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index 5d3f63b..ff0f25b 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -1,3 +1,4 @@ # List of sections +- [Installing NumPy](installing-numpy.md) - [Introduction](introduction.md) diff --git a/contrib/numpy/installing-numpy.md b/contrib/numpy/installing-numpy.md new file mode 100644 index 0000000..7339e8c --- /dev/null +++ b/contrib/numpy/installing-numpy.md @@ -0,0 +1,82 @@ +# Installing NumPy + +NumPy is the fundamental package for scientific computing in Python. +NumPy is used for working with arrays. + +The only prerequisite for installing NumPy is Python itself. +# +**Step 1: Check if PIP is Installed** + +Before installing NumPy, it's essential to ensure that PIP (Python Package Installer) is installed on your system. PIP is a package management system used to install and manage Python packages. You can verify if PIP is installed by running a simple command in your terminal or command prompt. + +```bash +pip --version +``` + +If PIP is not currently installed on your system, you can install it by visiting the [pypi.org](https://pypi.org/project/pip/) webpage. + +# + +**Step 2: Installing PIP** + +**get-pip.py** + +This is a Python script that uses some bootstrapping logic to install pip. + +Open a terminal / command prompt and run: + +**Linux** +```bash +python get-pip.py +``` + +**Windows** +```bash +py get-pip.py +``` + +**MacOS** +```bash +python get-pip.py +``` + +# + +**Step 3: Installing NumPy** + +NumPy can be installed either through conda or pip. + +If you use pip, you can install NumPy with: + +```bash +pip install numpy +``` + +If you use conda, you can install NumPy from the defaults or conda-forge channels: + +``` +# Best practice, use an environment rather than install in the base env +conda create -n my-env +conda activate my-env +``` + +``` +# If you want to install from conda-forge +conda config --env --add channels conda-forge +``` + +``` +# The actual install command +conda install numpy +``` + +You can find more information about how to install [NumPy](https://numpy.org/install/) on numpy.org. + +# + +**Step 4: Check if NumPy is Installed** + +We can utilize the "pip show" command not only to display the version but also to determine whether NumPy is installed on the system. +```bash +pip show numpy +``` From aa0a00137b48b0251ff421602c46aa905fb3ef5c Mon Sep 17 00:00:00 2001 From: Yodha Sudarsi <101962069+Yodha-Sudarsi@users.noreply.github.com> Date: Thu, 23 May 2024 05:56:34 +0530 Subject: [PATCH 125/405] Operation on numpy (#464) * Updated List of sections * Updated index.md Added info about how to install NumPy in a system. * Added installing numpy.md file and updated the index.md * Added installing-numpy.md file and updated the index.md * Create installing-numpy.md for installation * Update index.md Added operations-on-arrays.md * Create operations-on-arrays.md * Update index.md * Update index.md * Rename installing-numpy.md to installing_numpy.md * Rename operations-on-arrays.md to operations_on_arrays.md * Update installing_numpy.md * Update index.md * Rename installing_numpy.md to installing-numpy.md * Rename operations_on_arrays.md to operations-on-arrays.md * Update operations-on-arrays.md * Update operations-on-arrays.md * Revert "Update operations-on-arrays.md" * Delete contrib/numpy/installing-numpy.md * Update operations-on-arrays.md --------- Co-authored-by: Ankit Mahato --- contrib/numpy/index.md | 1 + contrib/numpy/operations-on-arrays.md | 281 ++++++++++++++++++++++++++ 2 files changed, 282 insertions(+) create mode 100644 contrib/numpy/operations-on-arrays.md diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index b38006c..6ee2e9d 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -3,3 +3,4 @@ - [Installing NumPy](installing-numpy.md) - [Introduction](introduction.md) - [NumPy Data Types](datatypes.md) +- [Operations on Arrays in NumPy](operations-on-arrays.md) diff --git a/contrib/numpy/operations-on-arrays.md b/contrib/numpy/operations-on-arrays.md new file mode 100644 index 0000000..e3966d2 --- /dev/null +++ b/contrib/numpy/operations-on-arrays.md @@ -0,0 +1,281 @@ +# Operations on Arrays + +## NumPy Arithmetic Operations + +NumPy offers a broad array of operations for arrays, including arithmetic functions. + +The arithmetic operations in NumPy are popular for their simplicity and efficiency in handling array calculations. + +**Addition** + +we can use the `+` operator to perform element-wise addition between two or more NumPy arrays. + +**Code** +```python +import numpy as np +array_1 = np.array([9, 10, 11, 12]) +array_2 = np.array([1, 3, 5, 7]) +result_1 = array_1 + array_2 +print("Utilizing the + operator:", result_1) +``` + +**Output:** +``` +Utilizing the + operator: [10 13 16 19] +``` + +**Subtraction** + +we can use the `-` operator to perform element-wise subtraction between two or more NumPy arrays. + +**Code** +```python +import numpy as np +array_1 = np.array([9, 10, 11, 12]) +array_2 = np.array([1, 3, 5, 7]) +result_1 = array_1 - array_2 +print("Utilizing the - operator:", result_1) +``` + +**Output:** +``` +Utilizing the - operator: [8 7 6 5] +``` + +**Multiplication** + +we can use the `*` operator to perform element-wise multiplication between two or more NumPy arrays. + +**Code** +```python +import numpy as np +array_1 = np.array([9, 10, 11, 12]) +array_2 = np.array([1, 3, 5, 7]) +result_1 = array_1 * array_2 +print("Utilizing the * operator:", result_1) +``` + +**Output:** +``` +Utilizing the * operator: [9 30 55 84] +``` + +**Division** + +we can use the `/` operator to perform element-wise division between two or more NumPy arrays. + +**Code** +```python +import numpy as np +array_1 = np.array([9, 10, 11, 12]) +array_2 = np.array([1, 3, 5, 7]) +result_1 = array_1 / array_2 +print("Utilizing the / operator:", result_1) +``` + +**Output:** +``` +Utilizing the / operator: [9. 3.33333333 2.2 1.71428571] +``` + +**Exponentiation** + +we can use the `**` operator to perform element-wise exponentiation between two or more NumPy arrays. + +**Code** +```python +import numpy as np +array_1 = np.array([9, 10, 11, 12]) +array_2 = np.array([1, 3, 5, 7]) +result_1 = array_1 ** array_2 +print("Utilizing the ** operator:", result_1) +``` + +**Output:** +``` +Utilizing the ** operator: [9 1000 161051 35831808] +``` + +**Modulus** + +We can use the `%` operator to perform element-wise modulus operations between two or more NumPy arrays. + +**Code** +```python +import numpy as np +array_1 = np.array([9, 10, 11, 12]) +array_2 = np.array([1, 3, 5, 7]) +result_1 = array_1 % array_2 +print("Utilizing the % operator:", result_1) +``` + +**Output:** +``` +Utilizing the % operator: [0 1 1 5] +``` + +
+ +## NumPy Comparision Operations + +
+ +NumPy provides various comparison operators that can compare elements across multiple NumPy arrays. + +**less than operator** + +The `<` operator returns `True` if the value of operand on left is less than the value of operand on right. + +**Code** +```python +import numpy as np +array_1 = np.array([12,15,20]) +array_2 = np.array([20,15,12]) +result_1 = array_1 < array_2 +print("array_1 < array_2:",result_1) +``` +**Output:** +``` +array_1 < array_2 : [True False False] +``` + +**less than or equal to operator** + +The `<=` operator returns `True` if the value of operand on left is lesser than or equal to the value of operand on right. + +**Code** +```python +import numpy as np +array_1 = np.array([12,15,20]) +array_2 = np.array([20,15,12]) +result_1 = array_1 <= array_2 +print("array_1 <= array_2:",result_1) +``` +**Output:** +``` +array_1 <= array_2: [True True False] +``` + +**greater than operator** + +The `>` operator returns `True` if the value of operand on left is greater than the value of operand on right. + +**Code** +```python +import numpy as np +array_1 = np.array([12,15,20]) +array_2 = np.array([20,15,12]) +result_2 = array_1 > array_2 +print("array_1 > array_2:",result_2) +``` +**Output:** +``` +array_1 > array_2 : [False False True] +``` + +**greater than or equal to operator** + +The `>=` operator returns `True` if the value of operand on left is greater than or equal to the value of operand on right. + +**Code** +```python +import numpy as np +array_1 = np.array([12,15,20]) +array_2 = np.array([20,15,12]) +result_2 = array_1 >= array_2 +print("array_1 >= array_2:",result_2) +``` +**Output:** +``` +array_1 >= array_2: [False True True] +``` + +**equal to operator** + +The `==` operator returns `True` if the value of operand on left is same as the value of operand on right. + +**Code** +```python +import numpy as np +array_1 = np.array([12,15,20]) +array_2 = np.array([20,15,12]) +result_3 = array_1 == array_2 +print("array_1 == array_2:",result_3) +``` +**Output:** +``` +array_1 == array_2: [False True False] +``` + +**not equal to operator** + +The `!=` operator returns `True` if the value of operand on left is not equal to the value of operand on right. + +**Code** +```python +import numpy as np +array_1 = np.array([12,15,20]) +array_2 = np.array([20,15,12]) +result_3 = array_1 != array_2 +print("array_1 != array_2:",result_3) +``` +**Output:** +``` +array_1 != array_2: [True False True] +``` + +
+ +## NumPy Logical Operations + +Logical operators perform Boolean algebra. A branch of algebra that deals with `True` and `False` statements. + +It illustrates the logical operations of AND, OR, and NOT using np.logical_and(), np.logical_or(), and np.logical_not() functions, respectively. + +**Logical AND** + +Evaluates the element-wise truth value of `array_1` AND `array_2` + +**Code** +```python +import numpy as np +array_1 = np.array([True, False, True]) +array_2 = np.array([False, False, True]) +print(np.logical_and(array_1, array_2)) +``` +**Output:** +``` +[False False True] +``` + +**Logical OR** + +Evaluates the element-wise truth value of `array_1` OR `array_2` + +**Code** +```python +import numpy as np +array_1 = np.array([True, False, True]) +array_2 = np.array([False, False, True]) +print(np.logical_or(array_1, array_2)) +``` +**Output:** +``` +[True False True] +``` + +**Logical NOT** + +Evaluates the element-wise truth value of `array_1` NOT `array_2` + +**Code** +```python +import numpy as np +array_1 = np.array([True, False, True]) +array_2 = np.array([False, False, True]) +print(np.logical_not(array_1)) +``` +**Output:** +``` +[False True False] +``` From 1ed2c2f5d8566616b54563c2130d37dbee05569d Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 23 May 2024 06:18:13 +0530 Subject: [PATCH 126/405] Rename TIC_TAC_TOE_GAME.md to tic-tac-toe.md --- contrib/mini-projects/{TIC_TAC_TOE_GAME.md => tic-tac-toe.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/mini-projects/{TIC_TAC_TOE_GAME.md => tic-tac-toe.md} (100%) diff --git a/contrib/mini-projects/TIC_TAC_TOE_GAME.md b/contrib/mini-projects/tic-tac-toe.md similarity index 100% rename from contrib/mini-projects/TIC_TAC_TOE_GAME.md rename to contrib/mini-projects/tic-tac-toe.md From 7d98fe81f13817199ba58f2f2709423bebfe35b7 Mon Sep 17 00:00:00 2001 From: Eshparsi Date: Thu, 23 May 2024 07:20:00 +0530 Subject: [PATCH 127/405] shifted content to ds-algorithms --- contrib/Data-Structure-Graphs/index.md | 3 --- contrib/{Data-Structure-Graphs => ds-algorithms}/graph.md | 0 contrib/ds-algorithms/index.md | 1 + 3 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 contrib/Data-Structure-Graphs/index.md rename contrib/{Data-Structure-Graphs => ds-algorithms}/graph.md (100%) diff --git a/contrib/Data-Structure-Graphs/index.md b/contrib/Data-Structure-Graphs/index.md deleted file mode 100644 index 6471576..0000000 --- a/contrib/Data-Structure-Graphs/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# List of sections - -- [Graphs](graph.md) \ No newline at end of file diff --git a/contrib/Data-Structure-Graphs/graph.md b/contrib/ds-algorithms/graph.md similarity index 100% rename from contrib/Data-Structure-Graphs/graph.md rename to contrib/ds-algorithms/graph.md diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 5b52155..347a9d0 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -2,3 +2,4 @@ - [Section title](filename.md) - [Sorting Algorithms](sorting-algorithms.md) +- [Graphs](graph.md) From f52fa729cffddbeed121826024ca972ff97cd1a9 Mon Sep 17 00:00:00 2001 From: Eshparsi <112681516+Eshparsi@users.noreply.github.com> Date: Thu, 23 May 2024 07:28:59 +0530 Subject: [PATCH 128/405] Update index.md --- contrib/ds-algorithms/index.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 347a9d0..adec6aa 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -1,5 +1,11 @@ # List of sections -- [Section title](filename.md) -- [Sorting Algorithms](sorting-algorithms.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) +- [Searching Algorithms](searching-algorithms.md) +- [Greedy Algorithms](greedy-algorithms.md) +- [Dynamic Programming](dynamic-programming.md) + From bc18bfed040ddae6301112acda317672950291fa Mon Sep 17 00:00:00 2001 From: Eshparsi Date: Thu, 23 May 2024 07:32:15 +0530 Subject: [PATCH 129/405] . --- .../divide-and-conquer-algorithm.md | 54 ++++++ contrib/ds-algorithms/dynamic-programming.md | 132 ++++++++++++++ contrib/ds-algorithms/greedy-algorithms.md | 135 +++++++++++++++ contrib/ds-algorithms/recursion.md | 107 ++++++++++++ contrib/ds-algorithms/searching-algorithms.md | 161 ++++++++++++++++++ 5 files changed, 589 insertions(+) create mode 100644 contrib/ds-algorithms/divide-and-conquer-algorithm.md create mode 100644 contrib/ds-algorithms/dynamic-programming.md create mode 100644 contrib/ds-algorithms/greedy-algorithms.md create mode 100644 contrib/ds-algorithms/recursion.md create mode 100644 contrib/ds-algorithms/searching-algorithms.md diff --git a/contrib/ds-algorithms/divide-and-conquer-algorithm.md b/contrib/ds-algorithms/divide-and-conquer-algorithm.md new file mode 100644 index 0000000..b5a356e --- /dev/null +++ b/contrib/ds-algorithms/divide-and-conquer-algorithm.md @@ -0,0 +1,54 @@ +# Divide and Conquer Algorithms + +Divide and Conquer is a paradigm for solving problems that involves breaking a problem into smaller sub-problems, solving the sub-problems recursively, and then combining their solutions to solve the original problem. + +## Merge Sort + +Merge Sort is a popular sorting algorithm that follows the divide and conquer strategy. It divides the input array into two halves, recursively sorts the halves, and then merges them. + +**Algorithm Overview:** +- **Divide:** Divide the unsorted list into two sublists of about half the size. +- **Conquer:** Recursively sort each sublist. +- **Combine:** Merge the sorted sublists back into one sorted list. + +```python +def merge_sort(arr): + if len(arr) > 1: + mid = len(arr) // 2 + left_half = arr[:mid] + right_half = arr[mid:] + + merge_sort(left_half) + merge_sort(right_half) + + i = j = k = 0 + + while i < len(left_half) and j < len(right_half): + if left_half[i] < right_half[j]: + arr[k] = left_half[i] + i += 1 + else: + arr[k] = right_half[j] + j += 1 + k += 1 + + while i < len(left_half): + arr[k] = left_half[i] + i += 1 + k += 1 + + while j < len(right_half): + arr[k] = right_half[j] + j += 1 + k += 1 + +arr = [12, 11, 13, 5, 6, 7] +merge_sort(arr) +print("Sorted array:", arr) +``` + +## Complexity Analysis +- **Time Complexity:** O(n log n) in all cases +- **Space Complexity:** O(n) additional space for the merge operation + +--- diff --git a/contrib/ds-algorithms/dynamic-programming.md b/contrib/ds-algorithms/dynamic-programming.md new file mode 100644 index 0000000..43149f8 --- /dev/null +++ b/contrib/ds-algorithms/dynamic-programming.md @@ -0,0 +1,132 @@ +# Dynamic Programming + +Dynamic programming is a method for solving complex problems by breaking them down into simpler subproblems and solving each subproblem only once. It stores the solutions to subproblems to avoid redundant computations, making it particularly useful for optimization problems where the solution can be obtained by combining solutions to smaller subproblems. + +## Real-Life Examples of Dynamic Programming +- **Fibonacci Sequence:** Computing the nth Fibonacci number efficiently. +- **Shortest Path:** Finding the shortest path in a graph from a source to a destination. +- **String Edit Distance:** Calculating the minimum number of operations required to transform one string into another. +- **Knapsack Problem:** Maximizing the value of items in a knapsack without exceeding its weight capacity. + +# Some Common Dynamic Programming Techniques + +# 1. Fibonacci Sequence + +The Fibonacci sequence is a classic example used to illustrate dynamic programming. It is a series of numbers where each number is the sum of the two preceding ones, usually starting with 0 and 1. + +**Algorithm Overview:** +- **Base Cases:** The first two numbers in the Fibonacci sequence are defined as 0 and 1. +- **Memoization:** Store the results of previously computed Fibonacci numbers to avoid redundant computations. +- **Recurrence Relation:** Compute each Fibonacci number by adding the two preceding numbers. + +## Fibonacci Sequence Code in Python (Top-Down Approach with Memoization) + +```python +def fibonacci(n, memo={}): + if n in memo: + return memo[n] + if n <= 1: + return n + memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo) + return memo[n] + +n = 10 +print(f"The {n}th Fibonacci number is: {fibonacci(n)}.") +``` + +## Fibonacci Sequence Code in Python (Bottom-Up Approach) + +```python +def fibonacci(n): + fib = [0, 1] + for i in range(2, n + 1): + fib.append(fib[i - 1] + fib[i - 2]) + return fib[n] + +n = 10 +print(f"The {n}th Fibonacci number is: {fibonacci(n)}.") +``` + +## Complexity Analysis +- **Time Complexity**: O(n) for both approaches +- **Space Complexity**: O(n) for the top-down approach (due to memoization), O(1) for the bottom-up approach + +
+
+
+ +# 2. Longest Common Subsequence + +The longest common subsequence (LCS) problem is to find the longest subsequence common to two sequences. A subsequence is a sequence that appears in the same relative order but not necessarily contiguous. + +**Algorithm Overview:** +- **Base Cases:** If one of the sequences is empty, the LCS is empty. +- **Memoization:** Store the results of previously computed LCS lengths to avoid redundant computations. +- **Recurrence Relation:** Compute the LCS length by comparing characters of the sequences and making decisions based on whether they match. + +## Longest Common Subsequence Code in Python (Top-Down Approach with Memoization) + +```python +def longest_common_subsequence(X, Y, m, n, memo={}): + if (m, n) in memo: + return memo[(m, n)] + if m == 0 or n == 0: + return 0 + if X[m - 1] == Y[n - 1]: + memo[(m, n)] = 1 + longest_common_subsequence(X, Y, m - 1, n - 1, memo) + else: + memo[(m, n)] = max(longest_common_subsequence(X, Y, m, n - 1, memo), + longest_common_subsequence(X, Y, m - 1, n, memo)) + return memo[(m, n)] + +X = "AGGTAB" +Y = "GXTXAYB" +print("Length of Longest Common Subsequence:", longest_common_subsequence(X, Y, len(X), len(Y))) +``` + +## Complexity Analysis +- **Time Complexity**: O(m * n) for the top-down approach, where m and n are the lengths of the input sequences +- **Space Complexity**: O(m * n) for the memoization table + +
+
+
+ +# 3. 0-1 Knapsack Problem + +The 0-1 knapsack problem is a classic optimization problem where the goal is to maximize the total value of items selected while keeping the total weight within a specified limit. + +**Algorithm Overview:** +- **Base Cases:** If the capacity of the knapsack is 0 or there are no items to select, the total value is 0. +- **Memoization:** Store the results of previously computed subproblems to avoid redundant computations. +- **Recurrence Relation:** Compute the maximum value by considering whether to include the current item or not. + +## 0-1 Knapsack Problem Code in Python (Top-Down Approach with Memoization) + +```python +def knapsack(weights, values, capacity, n, memo={}): + if (capacity, n) in memo: + return memo[(capacity, n)] + if n == 0 or capacity == 0: + return 0 + if weights[n - 1] > capacity: + memo[(capacity, n)] = knapsack(weights, values, capacity, n - 1, memo) + else: + memo[(capacity, n)] = max(values[n - 1] + knapsack(weights, values, capacity - weights[n - 1], n - 1, memo), + knapsack(weights, values, capacity, n - 1, memo)) + return memo[(capacity, n)] + +weights = [10, 20, 30] +values = [60, 100, 120] +capacity = 50 +n = len(weights) +print("Maximum value that can be obtained:", knapsack(weights, values, capacity, n)) +``` + +## Complexity Analysis +- **Time Complexity**: O(n * W) for the top-down approach, where n is the number of items and W is the capacity of the knapsack +- **Space Complexity**: O(n * W) for the memoization table + +
+
+
\ No newline at end of file diff --git a/contrib/ds-algorithms/greedy-algorithms.md b/contrib/ds-algorithms/greedy-algorithms.md new file mode 100644 index 0000000..c79ee99 --- /dev/null +++ b/contrib/ds-algorithms/greedy-algorithms.md @@ -0,0 +1,135 @@ +# Greedy Algorithms + +Greedy algorithms are simple, intuitive algorithms that make a sequence of choices at each step with the hope of finding a global optimum. They are called "greedy" because at each step, they choose the most advantageous option without considering the future consequences. Despite their simplicity, greedy algorithms are powerful tools for solving optimization problems, especially when the problem exhibits the greedy-choice property. + +## Real-Life Examples of Greedy Algorithms +- **Coin Change:** Finding the minimum number of coins to make a certain amount of change. +- **Job Scheduling:** Assigning tasks to machines to minimize completion time. +- **Huffman Coding:** Constructing an optimal prefix-free binary code for data compression. +- **Fractional Knapsack:** Selecting items to maximize the value within a weight limit. + +# Some Common Greedy Algorithms + +# 1. Coin Change Problem + +The coin change problem is a classic example of a greedy algorithm. Given a set of coin denominations and a target amount, the objective is to find the minimum number of coins required to make up that amount. + +**Algorithm Overview:** +- **Greedy Strategy:** At each step, the algorithm selects the largest denomination coin that is less than or equal to the remaining amount. +- **Repeat Until Amount is Zero:** The process continues until the remaining amount becomes zero. + +## Coin Change Code in Python + +```python +def coin_change(coins, amount): + coins.sort(reverse=True) + num_coins = 0 + for coin in coins: + num_coins += amount // coin + amount %= coin + if amount == 0: + return num_coins + else: + return -1 + +coins = [1, 5, 10, 25] +amount = 63 +result = coin_change(coins, amount) +if result != -1: + print(f"Minimum number of coins required: {result}.") +else: + print("It is not possible to make the amount with the given denominations.") +``` + +## Complexity Analysis +- **Time Complexity**: O(n log n) for sorting (if not pre-sorted), O(n) for iteration +- **Space Complexity**: O(1) + +
+
+
+ +# 2. Activity Selection Problem + +The activity selection problem involves selecting the maximum number of mutually compatible activities that can be performed by a single person or machine, assuming that a person can only work on one activity at a time. + +**Algorithm Overview:** +- **Greedy Strategy:** Sort the activities based on their finish times. +- **Selecting Activities:** Iterate through the sorted activities, selecting each activity if it doesn't conflict with the previously selected ones. + +## Activity Selection Code in Python + +```python +def activity_selection(start, finish): + n = len(start) + activities = [] + i = 0 + activities.append(i) + for j in range(1, n): + if start[j] >= finish[i]: + activities.append(j) + i = j + return activities + +start = [1, 3, 0, 5, 8, 5] +finish = [2, 4, 6, 7, 9, 9] +selected_activities = activity_selection(start, finish) +print("Selected activities:", selected_activities) +``` + +## Complexity Analysis +- **Time Complexity**: O(n log n) for sorting (if not pre-sorted), O(n) for iteration +- **Space Complexity**: O(1) + +
+
+
+ +# 3. Huffman Coding + +Huffman coding is a method of lossless data compression that efficiently represents characters or symbols in a file. It uses variable-length codes to represent characters, with shorter codes assigned to more frequent characters. + +**Algorithm Overview:** +- **Frequency Analysis:** Determine the frequency of each character in the input data. +- **Building the Huffman Tree:** Construct a binary tree where each leaf node represents a character and the path to the leaf node determines its code. +- **Assigning Codes:** Traverse the Huffman tree to assign codes to each character, with shorter codes for more frequent characters. + +## Huffman Coding Code in Python + +```python +from heapq import heappush, heappop, heapify +from collections import defaultdict + +def huffman_coding(data): + frequency = defaultdict(int) + for char in data: + frequency[char] += 1 + + heap = [[weight, [symbol, ""]] for symbol, weight in frequency.items()] + heapify(heap) + + while len(heap) > 1: + lo = heappop(heap) + hi = heappop(heap) + for pair in lo[1:]: + pair[1] = '0' + pair[1] + for pair in hi[1:]: + pair[1] = '1' + pair[1] + heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:]) + + return sorted(heappop(heap)[1:], key=lambda p: (len(p[-1]), p)) + +data = "Huffman coding is a greedy algorithm" +encoded_data = huffman_coding(data) +print("Huffman Codes:") +for symbol, code in encoded_data: + print(f"{symbol}: {code}") +``` + +## Complexity Analysis +- **Time Complexity**: O(n log n) for heap operations, where n is the number of unique characters +- **Space Complexity**: O(n) for the heap + +
+
+
diff --git a/contrib/ds-algorithms/recursion.md b/contrib/ds-algorithms/recursion.md new file mode 100644 index 0000000..7ab3136 --- /dev/null +++ b/contrib/ds-algorithms/recursion.md @@ -0,0 +1,107 @@ +# Introduction to Recursions + +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 + +To solve a problem using recursion we must define: +- Base condition :- The condition under which recursion ends. +- Recursive case :- The part of function which calls itself to solve a smaller instance of problem. + +Steps of Recursion + +When a recursive function is called, the following sequence of events occurs: +- Function Call: The function is invoked with a specific argument. +- Base Condition Check: The function checks if the argument satisfies the base case. +- Recursive Call: If the base case is not met, the function performs some operations and makes a recursive call with a modified argument. +- 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. + +# 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 + +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 + +- 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 + +- 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. + +Algorithm for Solving the Word Search Problem with Backtracking: +- Start at each cell: Attempt to find the word starting from each cell. +- Check all Directions: From each cell, try all four possible directions (up, down, left, right). +- Mark Visited Cells: Use a temporary marker to indicate cells that are part of the current path to avoid revisiting. +- Backtrack: If a path does not lead to a solution, backtrack by unmarking the visited cell and trying the next possibility. + +```python +def exist(board, word): + rows, cols = len(board), len(board[0]) + + def backtrack(r, c, suffix): + if not suffix: + return True + + if r < 0 or r >= rows or c < 0 or c >= cols or board[r][c] != suffix[0]: + return False + + # Mark the cell as visited by replacing its character with a placeholder + ret = False + board[r][c], temp = '#', board[r][c] + + # Explore the four possible directions + for row_offset, col_offset in [(0, 1), (1, 0), (0, -1), (-1, 0)]: + ret = backtrack(r + row_offset, c + col_offset, suffix[1:]) + if ret: + break + + # Restore the cell's original value + board[r][c] = temp + return ret + + for row in range(rows): + for col in range(cols): + if backtrack(row, col, word): + return True + + return False + +# Test case +board = [ + ['A','B','C','E'], + ['S','F','C','S'], + ['A','D','E','E'] +] +word = "ABCES" +print(exist(board, word)) # Output: True +``` + + + diff --git a/contrib/ds-algorithms/searching-algorithms.md b/contrib/ds-algorithms/searching-algorithms.md new file mode 100644 index 0000000..78b86d1 --- /dev/null +++ b/contrib/ds-algorithms/searching-algorithms.md @@ -0,0 +1,161 @@ +# Searching Algorithms + +Searching algorithms are techniques used to locate specific items within a collection of data. These algorithms are fundamental in computer science and are employed in various applications, from databases to web search engines. + +## Real Life Example of Searching +- Searching for a word in a dictionary +- Searching for a specific book in a library +- Searching for a contact in your phone's address book +- Searching for a file on your computer, etc. + +# Some common searching techniques + +# 1. Linear Search + +Linear search, also known as sequential search, is a straightforward searching algorithm that checks each element in a collection until the target element is found or the entire collection has been traversed. It is simple to implement but becomes inefficient for large datasets. + +**Algorithm Overview:** +- **Sequential Checking:** The algorithm iterates through each element in the collection, starting from the first element. +- **Comparing Elements:** At each iteration, it compares the current element with the target element. +- **Finding the Target:** If the current element matches the target, the search terminates, and the index of the element is returned. +- **Completing the Search:** If the entire collection is traversed without finding the target, the algorithm indicates that the element is not present. + +## Linear Search Code in Python + +```python +def linear_search(arr, target): + for i in range(len(arr)): + if arr[i] == target: + return i + return -1 + +arr = [5, 3, 8, 1, 2] +target = 8 +result = linear_search(arr, target) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Complexity Analysis +- **Time Complexity**: O(n) +- **Space Complexity**: O(1) + +
+
+
+ +# 2. Binary Search + +Binary search is an efficient searching algorithm that works on sorted collections. It repeatedly divides the search interval in half until the target element is found or the interval is empty. Binary search is significantly faster than linear search but requires the collection to be sorted beforehand. + +**Algorithm Overview:** +- **Initial State:** Binary search starts with the entire collection as the search interval. +- **Divide and Conquer:** At each step, it calculates the middle element of the current interval and compares it with the target. +- **Narrowing Down the Interval:** If the middle element is equal to the target, the search terminates successfully. Otherwise, it discards half of the search interval based on the comparison result. +- **Repeating the Process:** The algorithm repeats this process on the remaining half of the interval until the target is found or the interval is empty. + +## Binary Search Code in Python (Iterative) + +```python +def binary_search(arr, target): + low = 0 + high = len(arr) - 1 + while low <= high: + mid = (low + high) // 2 + if arr[mid] == target: + return mid + elif arr[mid] < target: + low = mid + 1 + else: + high = mid - 1 + return -1 + +arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] +target = 13 +result = binary_search(arr, target) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Binary Search Code in Python (Recursive) + +```python +def binary_search_recursive(arr, target, low, high): + if low <= high: + mid = (low + high) // 2 + if arr[mid] == target: + return mid + elif arr[mid] < target: + return binary_search_recursive(arr, target, mid + 1, high) + else: + return binary_search_recursive(arr, target, low, mid - 1) + else: + return -1 + +arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] +target = 13 +result = binary_search_recursive(arr, target, 0, len(arr) - 1) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Complexity Analysis +- **Time Complexity**: O(log n) +- **Space Complexity**: O(1) (Iterative), O(log n) (Recursive) + +
+
+
+ +# 3. Interpolation Search + +Interpolation search is an improved version of binary search, especially useful when the elements in the collection are uniformly distributed. Instead of always dividing the search interval in half, interpolation search estimates the position of the target element based on its value and the values of the endpoints of the search interval. + +**Algorithm Overview:** +- **Estimating Position:** Interpolation search calculates an approximate position of the target element within the search interval based on its value and the values of the endpoints. +- **Refining the Estimate:** It adjusts the estimated position based on whether the target value is likely to be closer to the beginning or end of the search interval. +- **Updating the Interval:** Using the refined estimate, it narrows down the search interval iteratively until the target is found or the interval becomes empty. + +## Interpolation Search Code in Python + +```python +def interpolation_search(arr, target): + low = 0 + high = len(arr) - 1 + while low <= high and arr[low] <= target <= arr[high]: + if low == high: + if arr[low] == target: + return low + return -1 + pos = low + ((target - arr[low]) * (high - low)) // (arr[high] - arr[low]) + if arr[pos] == target: + return pos + elif arr[pos] < target: + low = pos + 1 + else: + high = pos - 1 + return -1 + +arr = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] +target = 60 +result = interpolation_search(arr, target) +if result != -1: + print(f"Element {target} found at index {result}.") +else: + print(f"Element {target} not found.") +``` + +## Complexity Analysis +- **Time Complexity**: O(log log n) (Average) +- **Space Complexity**: O(1) + +
+
+
+ From 8b11aa5ade20c585a25ff48e34e08af59742d34b Mon Sep 17 00:00:00 2001 From: Eshparsi Date: Thu, 23 May 2024 07:34:09 +0530 Subject: [PATCH 130/405] . --- contrib/ds-algorithms/index.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 347a9d0..706729e 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -1,5 +1,10 @@ # List of sections -- [Section title](filename.md) -- [Sorting Algorithms](sorting-algorithms.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) +- [Searching Algorithms](searching-algorithms.md) +- [Greedy Algorithms](greedy-algorithms.md) +- [Dynamic Programming](dynamic-programming.md) \ No newline at end of file From b39147fb12bb40ce2652dc03737d60e3ab3ce23d Mon Sep 17 00:00:00 2001 From: Niyonika Gaur <83643952+niyonikagaur@users.noreply.github.com> Date: Thu, 23 May 2024 09:38:49 +0530 Subject: [PATCH 131/405] Delete Intro_SciPy.md --- Intro_SciPy.md | 136 ------------------------------------------------- 1 file changed, 136 deletions(-) delete mode 100644 Intro_SciPy.md diff --git a/Intro_SciPy.md b/Intro_SciPy.md deleted file mode 100644 index afd8b3a..0000000 --- a/Intro_SciPy.md +++ /dev/null @@ -1,136 +0,0 @@ -# Introduction to SciPy -#### Python has a powerful library known as SciPy that is used for scientific and technical computing. It functions by extending the capabilities of NumPy and providing numerous operations for numerical data. Although the same library, SciPy is divided into distinct sections meant for various scientific computations. -## Installation of Scipy -### Install using the command: -#### C:\Users\Your Name>pip install scipy - You can also use a Python distribution that already has Scipy installed like Anaconda or Spyder. -### Importing SciPy -#### from scipy import constants -## Key Features of SciPy -### 1. Numerical Integration -#### It helps in computing definite or indefinite integrals of functions -``` -from scipy import integrate - -#Define the function to integrate -def f(x): - return x**2 - -#Compute definite integral of f from 0 to 1 -result, error = integrate.quad(f, 0, 1) -print(result) -``` -#### Output -``` -0.33333333333333337 -``` -### 2. Optimization -#### It can be used to minimize or maximize functions, here is an example of minimizing roots of an equation -``` -from scipy.optimize import minimize - -# Define an objective function to minimize -def objective(x): - return x**2 + 10*np.sin(x) - -# Minimize the objective function starting from x=0 -result = minimize(objective, x0=0) -print(result.x) -``` -#### Output -``` -array([-1.30644012]) -``` -### 3. Linear Algebra -#### Solving Linear computations -``` -from scipy import linalg -import numpy as np - -# Define a square matrix -A = np.array([[1, 2], [3, 4]]) - -# Define a vector -b = np.array([5, 6]) - -# Solve Ax = b for x -x = linalg.solve(A, b) -print(x) -``` -#### Output -``` -array([-4. , 4.5]) -``` -### 4. Statistics -#### Performing statistics functions, like here we'll be distributing the data -``` -from scipy import stats -import numpy as np - -# Generate random data from a normal distribution -data = stats.norm.rvs(loc=0, scale=1, size=1000) - -# Fit a normal distribution to the data -mean, std = stats.norm.fit(data) -``` -### 5. Signal Processing -#### To process spectral signals, like EEG or MEG -``` -from scipy import signal -import numpy as np - -# Create a signal (e.g., sine wave) -t = np.linspace(0, 1, 1000) -signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.randn(1000) - -# Apply a low-pass Butterworth filter -b, a = signal.butter(4, 0.1, 'low') -filtered_signal = signal.filtfilt(b, a, signal) -``` -The various filters applied that are applied here, are a part of signal analysis at a deeper level. -### 6. Sparse Matrix -#### The word ' sparse 'means less, i.e., the data is mostly unused during some operation or analysis. So, to handle this data, a Sparse Matrix is created -#### There are two types of Sparse Matrices: -##### 1. CSC: Compressed Sparse Column, it is used for efficient math functions and for column slicing -##### 2. CSR: Compressed Sparse Row, it is used for fast row slicing -#### In CSC format -``` -from scipy import sparse -import numpy as np - -data = np.array([[0, 0], [0, 1], [2, 0]]) - -row_indices = np.array([1, 2, 1]) -col_indices = np.array([1, 0, 2]) -values = np.array([1, 2, 1]) - -sparse_matrix_csc = sparse.csc_matrix((values, (row_indices, col_indices))) -``` -#### In CSR format -``` -from scipy import sparse -import numpy as np - -data = np.array([[0, 0], [0, 1], [2, 0]]) -sparse_matrix = sparse.csr_matrix(data) -``` -### 7. Image Processing -#### It is used to process the images, like changing dimensions or properties. For example, when you're doing a project on medical imaging, this library is mainly used. -``` -from scipy import ndimage -import matplotlib.pyplot as plt - -image = plt.imread('path/to/image.jpg') -plt.imshow(image) -plt.show() - -# Apply Gaussian blur to the image -blurred_image = ndimage.gaussian_filter(image, sigma=1) -plt.imshow(blurred_image) -plt.show() -``` -#### The gaussian blur is one of the properties of the ' ndimage ' package in SciPy libraries, it used for better understanding of the image. - - - - From f012e8c481de8f98a8a32e822268602bfe93f6b6 Mon Sep 17 00:00:00 2001 From: Labqari Date: Thu, 23 May 2024 15:38:35 +0530 Subject: [PATCH 132/405] adding flask --- contrib/advanced-python/index.md | 1 + ...duction-to-flask-a-python-web-framework.md | 440 ++++++++++++++++++ 2 files changed, 441 insertions(+) create mode 100644 contrib/advanced-python/introduction-to-flask-a-python-web-framework.md diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 5ea5081..027f989 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,3 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) +- [Decorators/\*args/**kwargs](introduction-to-flask-a-python-web-framework.md) diff --git a/contrib/advanced-python/introduction-to-flask-a-python-web-framework.md b/contrib/advanced-python/introduction-to-flask-a-python-web-framework.md new file mode 100644 index 0000000..957f39b --- /dev/null +++ b/contrib/advanced-python/introduction-to-flask-a-python-web-framework.md @@ -0,0 +1,440 @@ +Sure, here's the guide without Markdown formatting: + +--- + +# Introduction to Flask: A Python Web Framework + +## Table of Contents +1. Introduction +2. Prerequisites +3. Setting Up Your Environment +4. Creating Your First Flask Application + - Project Structure + - Hello World Application +5. Routing +6. Templates and Static Files + - Jinja2 Templating Engine + - Serving Static Files +7. Working with Forms + - Handling Form Data +8. Database Integration + - Setting Up SQLAlchemy + - Performing CRUD Operations +9. Error Handling +10. Testing Your Application +11. Deploying Your Flask Application + - Using Gunicorn + - Deploying to Render +12. Conclusion +13. Further Reading and Resources + +--- + +## 1. Introduction +Flask is a lightweight WSGI web application framework in Python. It is designed with simplicity and flexibility in mind, allowing developers to create web applications with minimal setup. Flask was created by Armin Ronacher as part of the Pocoo project and has gained popularity for its ease of use and extensive documentation. + +## 2. Prerequisites +Before starting with Flask, ensure you have the following: +- Basic knowledge of Python. +- Understanding of web development concepts (HTML, CSS, JavaScript). +- Python installed on your machine (version 3.6 or higher). +- pip (Python package installer) installed. + +## 3. Setting Up Your Environment +1. **Install Python**: Download and install Python from python.org. +2. **Create a Virtual Environment**: + ``` + python -m venv venv + ``` +3. **Activate the Virtual Environment**: + - On Windows: + ``` + venv\Scripts\activate + ``` + - On macOS/Linux: + ``` + source venv/bin/activate + ``` +4. **Install Flask**: + ``` + pip install Flask + ``` + +## 4. Creating Your First Flask Application +### Project Structure +A typical Flask project structure might look like this: +``` +my_flask_app/ + app/ + __init__.py + routes.py + templates/ + static/ + venv/ + run.py +``` + +### Hello World Application +1. **Create a Directory for Your Project**: + ``` + mkdir my_flask_app + cd my_flask_app + ``` +2. **Initialize the Application**: + - Create `app/__init__.py`: + ```python + from flask import Flask + + def create_app(): + app = Flask(__name__) + + with app.app_context(): + from . import routes + return app + ``` + - Create `run.py`: + ```python + from app import create_app + + app = create_app() + + if __name__ == "__main__": + app.run(debug=True) + ``` + - Create `app/routes.py`: + ```python + from flask import current_app as app + + @app.route('/') + def hello_world(): + return 'Hello, World!' + ``` + +3. **Run the Application**: + ``` + python run.py + ``` + Navigate to `http://127.0.0.1:5000` in your browser to see "Hello, World!". + +## 5. Routing +In Flask, routes are defined using the `@app.route` decorator. Here's an example of different routes: + +```python +from flask import Flask + +app = Flask(__name__) + +@app.route('/') +def home(): + return 'Home Page' + +@app.route('/about') +def about(): + return 'About Page' + +@app.route('/user/') +def show_user_profile(username): + return f'User: {username}' +``` + +- **Explanation**: + - The `@app.route('/')` decorator binds the URL `'/'` to the `home` function, which returns 'Home Page'. + - The `@app.route('/about')` decorator binds the URL `/about` to the `about` function. + - The `@app.route('/user/')` decorator binds the URL `/user/` to the `show_user_profile` function, capturing the part of the URL as the `username` variable. + +## 6. Templates and Static Files +### Jinja2 Templating Engine +Jinja2 is Flask's templating engine. Templates are HTML files that can include dynamic content. + +- **Create a Template**: + - `app/templates/index.html`: + ```html + + + + {{ title }} + + +

{{ heading }}

+

{{ content }}

+ + + ``` + +- **Render the Template**: + ```python + from flask import Flask, render_template + + app = Flask(__name__) + + @app.route('/') + def home(): + return render_template('index.html', title='Home', heading='Welcome to Flask', content='This is a Flask application.') + ``` + +### Serving Static Files +Static files like CSS, JavaScript, and images are placed in the `static` directory. + +- **Create Static Files**: + - `app/static/style.css`: + ```css + body { + font-family: Arial, sans-serif; + } + ``` + +- **Include Static Files in Templates**: + ```html + + + + {{ title }} + + + +

{{ heading }}

+

{{ content }}

+ + + ``` + +## 7. Working with Forms +### Handling Form Data +Forms are used to collect user input. Flask provides utilities to handle form submissions. + +- **Create a Form**: + - `app/templates/form.html`: + ```html + + + + Form + + +
+ + + + + + + ``` + +- **Handle Form Submission**: + ```python + from flask import Flask, request, render_template + + app = Flask(__name__) + + @app.route('/form') + def form(): + return render_template('form.html') + + @app.route('/submit', methods=['POST']) + def submit(): + name = request.form['name'] + return f'Hello, {name}!' + ``` + +- **Explanation**: + - The `@app.route('/form')` route renders the form. + - The `@app.route('/submit', methods=['POST'])` route handles the form submission and displays the input name. + +## 8. Database Integration +### Setting Up SQLAlchemy +SQLAlchemy is an ORM that allows you to interact with databases using Python objects. + +- **Install SQLAlchemy**: + ``` + pip install flask_sqlalchemy + ``` + +- **Configure SQLAlchemy**: + - `app/__init__.py`: + ```python + from flask import Flask + from flask_sqlalchemy import SQLAlchemy + + db = SQLAlchemy() + + def create_app(): + app = Flask(__name__) + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' + db.init_app(app) + return app + ``` + +### Performing CRUD Operations +Define models and perform CRUD operations. + +- **Define a Model**: + - `app/models.py`: + ```python + from app import db + + class User(db.Model): + id = db.Column(db.Integer, primary key=True) + username = db.Column(db.String(80), unique=True, nullable=False) + + def __repr__(self): + return f'' + ``` + +- **Create the Database**: + ```python + from app import create_app, db + from app.models import User + + app = create_app() + with app.app_context(): + db.create_all() + ``` + +- **Perform CRUD Operations**: + ```python + from app import db + from app.models import User + + # Create + new_user = User(username='new_user') + db.session.add(new_user) + db.session.commit() + + # Read + user = User.query.first() + + # Update + user.username = 'updated_user' + db.session.commit() + + # Delete + db.session.delete(user) + db.session.commit() + ``` + +## 9. Error Handling +Error handling in Flask can be managed by defining error handlers for different HTTP status codes. + +- **Define an Error Handler**: + ```python + from flask import Flask, render_template + + app = Flask(__name__) + + @app.errorhandler(404) + def page_not_found(e): + return render_template('404.html'), 404 + + @app.errorhandler(500) + def internal_server_error(e): + return render_template('500.html'), 500 + ``` + + - **Create Error Pages**: + `app/templates/404.html`: + + + + + Page Not Found + + +

404 - Page Not Found

+

The page you are looking for does not exist.

+ + + + + + - **app/templates/500.html:** + + + + + Internal Server Error + + +

500 - Internal Server Error

+

Something went wrong on our end. Please try again later.

+ + + + +## 10. Testing Your Application +Flask applications can be tested using Python's built-in `unittest` framework. + +- **Write a Test Case**: + - `tests/test_app.py`: + ```python + import unittest + from app import create_app + + class BasicTestCase(unittest.TestCase): + def setUp(self): + self.app = create_app() + self.app.config['TESTING'] = True + self.client = self.app.test_client() + + def test_home(self): + response = self.client.get('/') + self.assertEqual(response.status_code, 200) + self.assertIn(b'Hello, World!', response.data) + + if __name__ == '__main__': + unittest.main() + ``` + + - **Run the Tests**: + ``` + python -m unittest discover -s tests + ``` + +## 11. Deploying Your Flask Application +### Using Gunicorn +Gunicorn is a Python WSGI HTTP Server for UNIX. It’s a pre-fork worker model, meaning that it forks multiple worker processes to handle requests. + +- **Install Gunicorn**: + ``` + pip install gunicorn + ``` + +- **Run Your Application with Gunicorn**: + ``` + gunicorn -w 4 run:app + ``` + +### Deploying to Render +Render is a cloud platform for deploying web applications. + +- **Create a `requirements.txt` File**: + ``` + Flask + gunicorn + flask_sqlalchemy + ``` + +- **Create a `render.yaml` File**: + ```yaml + services: + - type: web + name: my-flask-app + env: python + plan: free + buildCommand: pip install -r requirements.txt + startCommand: gunicorn -w 4 run:app + ``` + +- **Deploy Your Application**: + 1. Push your code to a Git repository. + 2. Sign in to Render and create a new Web Service. + 3. Connect your repository and select the branch to deploy. + 4. Render will automatically use the `render.yaml` file to configure and deploy your application. + +## 12. Conclusion +Flask is a powerful and flexible framework for building web applications in Python. It offers simplicity and ease of use, making it a great choice for both beginners and experienced developers. This guide covered the basics of setting up a Flask application, routing, templating, working with forms, integrating databases, error handling, testing, and deployment. + +## 13. Further Reading and Resources +- Flask Documentation: https://flask.palletsprojects.com/en/latest/ +- Jinja2 Documentation: https://jinja.palletsprojects.com/en/latest/ +- SQLAlchemy Documentation: https://docs.sqlalchemy.org/en/latest/ +- Render Documentation: https://render.com/docs \ No newline at end of file From 0a2ca67628da43f74aa1dda7278b11fbadc4a2ac Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Thu, 23 May 2024 23:07:21 +0530 Subject: [PATCH 133/405] Create saving_numpy_arrays_to_files.md Added introduction Added save method --- contrib/numpy/saving_numpy_arrays_to_files.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 contrib/numpy/saving_numpy_arrays_to_files.md diff --git a/contrib/numpy/saving_numpy_arrays_to_files.md b/contrib/numpy/saving_numpy_arrays_to_files.md new file mode 100644 index 0000000..8856a0c --- /dev/null +++ b/contrib/numpy/saving_numpy_arrays_to_files.md @@ -0,0 +1,40 @@ +# Saving NumPy Arrays to Files + +- Saving arrays in NumPy is important due to its efficiency in storage and speed, maintaining data integrity and precision, and offering convenience and interoperability. +- NumPy provides several methods to save arrays efficiently, either in binary or text formats. +- The primary methods are `save`, `savez`, and `savetxt`. + +### 1. numpy.save(): + +The `np.save` function saves a single NumPy array to a binary file with a `.npy` extension. This format is efficient and preserves the array's data type and shape. + +#### Syntax : + + ```python + numpy.save(file, arr, allow_pickle=True, fix_imports=True) + ``` +- **file** : Name of the file. +- **arr** : Array to be saved. +- **allow_pickle** : This is an Optional parameter, Allows saving object arrays using Python pickles.(By Default True) +- **fix_imports** : This is an Optional parameter, Fixes issues for Python 2 to Python 3 compatibility.(By Default True) + +#### Example : + +```python +import numpy as np + +arr = np.array([1,2,3,4,5]) +np.save("example.npy",arr) #saves arr into example.npy file in binary format +``` + +Inorder to load the array from example.npy + +```python +arr1 = np.load("example.npy") +print(arr1) +``` +**Output** : + +```python +[1,2,3,4,5] +``` From e734ba6a3ef7eb4e6a3fa746be6b2211cf724380 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Fri, 24 May 2024 01:09:23 +0530 Subject: [PATCH 134/405] Update saving_numpy_arrays_to_files.md Added savez method --- contrib/numpy/saving_numpy_arrays_to_files.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/contrib/numpy/saving_numpy_arrays_to_files.md b/contrib/numpy/saving_numpy_arrays_to_files.md index 8856a0c..0d45e5d 100644 --- a/contrib/numpy/saving_numpy_arrays_to_files.md +++ b/contrib/numpy/saving_numpy_arrays_to_files.md @@ -38,3 +38,57 @@ print(arr1) ```python [1,2,3,4,5] ``` +### 2. numpy.savez(): + +The `np.savez` function saves multiple NumPy arrays into a single file with a `.npz` extension. Each array is stored with a unique name. + +#### Syntax : + + ```python +numpy.savez(file, *args, **kwds) + ``` +- **file** : Name of the file. +- **args** : Arrays to be saved.( If arrays are unnamed, they are stored with default names like arr_0, arr_1, etc.) +- **kwds** : Named arrays to be saved. + +#### Example : + +```python +import numpy as np + +arr1 = np.array([1,2,3,4,5]) +arr2 = np.array(['a','b','c','d']) +arr3 = np.array([1.2,3.4,5]) +np.savez('example.npz', a1=arr1, a2=arr2, a3 = arr3) #saves arrays in npz format + +``` + +Inorder to load the array from example.npz + +```python + +arr = np.load('example.npz') +print(arr['a1']) +print(arr['a2']) +print(arr['a3']) + +``` +**Output** : +```python +[1 2 3 4 5] +['a' 'b' 'c' 'd'] +[1.2 3.4 5. ] +``` + +### 3. np.savetxt() + +The `np.savetxt` function saves a NumPy array to a text file, such as `.txt` or `.csv`. This format is human-readable and can be used for interoperability with other tools. + +#### Syntax : + + ```python +numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None) + ``` +- **fname** : Name of the file. +- **X** : Array to be saved. +- **kwds** : Named arrays to be saved. From f715f2751c58659a254e7a18905e38c89e1558af Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Fri, 24 May 2024 09:06:55 +0530 Subject: [PATCH 135/405] Update saving_numpy_arrays_to_files.md Added examples Added savetxt method --- contrib/numpy/saving_numpy_arrays_to_files.md | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/contrib/numpy/saving_numpy_arrays_to_files.md b/contrib/numpy/saving_numpy_arrays_to_files.md index 0d45e5d..c8935b8 100644 --- a/contrib/numpy/saving_numpy_arrays_to_files.md +++ b/contrib/numpy/saving_numpy_arrays_to_files.md @@ -87,8 +87,40 @@ The `np.savetxt` function saves a NumPy array to a text file, such as `.txt` or #### Syntax : ```python -numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None) +numpy.savetxt(fname, X, delimiter=' ', newline='\n', header='', footer='', encoding=None) ``` - **fname** : Name of the file. - **X** : Array to be saved. -- **kwds** : Named arrays to be saved. +- **delimiter** : It is a Optional parameter,This is a character or string that is used to separate columns.(By Default it is " ") +- **newline** : It is a Optional parameter, Character for seperating lines.(By Default it is "\n") +- **header** : It is a Optional parameter, String that is written at beginning of the file. +- **footer** : It is a Optional parameter, String that is written at ending of the file. +- **encoding** : It is a Optional parameter, Encoding of the output file. (By Default it is None) + +#### Example : + +```python +import numpy as np + +arr = np.array([1.1,2.2,3,4.4,5]) +np.savetxt("example.txt",arr) #saves the array in example.txt + +``` + +Inorder to load the array from example.txt + +```python + +arr1 = np.loadtxt("example.txt") +print(arr1) + +``` +**Output** : +```python +[1.1 2.2 3. 4.4 5. ] +``` + + +By using these methods, you can efficiently save and load NumPy arrays in various formats suitable for your needs. + + From 1306c8e37ec17ba45166587f781b9036b5e03b2b Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Fri, 24 May 2024 09:19:01 +0530 Subject: [PATCH 136/405] Update index.md Added saving numpy arrays into files section --- contrib/numpy/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index f784798..18ed17a 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -6,3 +6,4 @@ - [Basic Mathematics](basic_math.md) - [Operations on Arrays in NumPy](operations-on-arrays.md) - [Loading Arrays from Files](loading_arrays_from_files.md) +- [Saving Numpy Arrays into FIles](saving_numpy_arrays_to_files.md) From 091a5daeda4ec4afb9d7c90ad249ad27fa0fdcf6 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 24 May 2024 21:07:23 +0530 Subject: [PATCH 137/405] Rename Installation_of_Scipy_&_its_key_uses.md to installation_features.md --- ...lation_of_Scipy_&_its_key_uses.md => installation_features.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/scipy/{Installation_of_Scipy_&_its_key_uses.md => installation_features.md} (100%) diff --git a/contrib/scipy/Installation_of_Scipy_&_its_key_uses.md b/contrib/scipy/installation_features.md similarity index 100% rename from contrib/scipy/Installation_of_Scipy_&_its_key_uses.md rename to contrib/scipy/installation_features.md From bcf4df6d7d13627d33a1419178db4f42dca12581 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 24 May 2024 21:08:03 +0530 Subject: [PATCH 138/405] Update index.md --- contrib/scipy/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/scipy/index.md b/contrib/scipy/index.md index abc2fb0..5737114 100644 --- a/contrib/scipy/index.md +++ b/contrib/scipy/index.md @@ -1,4 +1,4 @@ # List of sections -- [Installation of Scipy and its key uses]( Installation_of_Scipy_&_its_key_uses.md) +- [Installation of Scipy and its key uses](installation_features.md) From cdb57900d40905a8cb0685bba807e4a6484475d2 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Fri, 24 May 2024 21:11:33 +0530 Subject: [PATCH 139/405] Delete contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md --- .../Importing_and_Exporting_Data_in_Pandas.md | 273 ------------------ 1 file changed, 273 deletions(-) delete mode 100644 contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md diff --git a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md deleted file mode 100644 index 4d0ffad..0000000 --- a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md +++ /dev/null @@ -1,273 +0,0 @@ -# Importing_and_Exporting_Data_in_Pandas - ->Created by Krishna Kaushik - -- **Now we're able to create `Series` and `DataFrames` in pandas, but we usually do not do this , in practice we import the data which is in the form of .csv (Comma Seperated Values) , a spreadsheet file or something similar.** - -- *Good news is that pandas allows for easy importing of data like this through functions such as ``pd.read_csv()`` and ``pd.read_excel()`` for Microsoft Excel files.* - -## 1. Importing from a Google sheet to a pandas dataframe - -*Let's say that you wanted to get the information from Google Sheet document into a pandas DataFrame.*. - -*You could export it as a .csv file and then import it using ``pd.read_csv()``.* - -*In this case, the exported .csv file is called `Titanic.csv`* - - -```python -## Importing Titanic Data set -import pandas as pd - -titanic_df= pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Titanic.csv") -titanic_df -``` -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pclasssurvivednamesexagesibspparchticketfarecabinembarkedboatbodyhome.dest
011Allen, Miss. Elisabeth Waltonfemale29.000024160211.3375B5S2NaNSt Louis, MO
111Allison, Master. Hudson Trevormale0.9212113781151.5500C22 C26S11NaNMontreal, PQ / Chesterville, ON
210Allison, Miss. Helen Lorainefemale2.0012113781151.5500C22 C26SNaNNaNMontreal, PQ / Chesterville, ON
310Allison, Mr. Hudson Joshua Creightonmale30.0012113781151.5500C22 C26SNaN135.0Montreal, PQ / Chesterville, ON
410Allison, Mrs. Hudson J C (Bessie Waldo Daniels)female25.0012113781151.5500C22 C26SNaNNaNMontreal, PQ / Chesterville, ON
.............................................
130430Zabour, Miss. Hilenifemale14.5010266514.4542NaNCNaN328.0NaN
130530Zabour, Miss. ThaminefemaleNaN10266514.4542NaNCNaNNaNNaN
130630Zakarian, Mr. Mapriededermale26.500026567.2250NaNCNaN304.0NaN
130730Zakarian, Mr. Ortinmale27.000026707.2250NaNCNaNNaNNaN
130830Zimmerman, Mr. Leomale29.00003150827.8750NaNSNaNNaNNaN
-

1309 rows × 14 columns

-
- - - -The dataset I am using here for your reference is taken from the same repository i.e ``learn-python`` (https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Titanic.csv) I uploaded it you can use it from there. - -**Now we've got the same data from the Google Spreadsheet , but now available as ``pandas DataFrame`` which means we can now apply all pandas functionality over it.** - -#### Note: The quiet important thing i am telling is that ``pd.read_csv()`` takes the location of the file (which is in your current working directory) or the hyperlink of the dataset from the other source. - -#### But if you want to import the data from Github you can't directly use its link , you have to first convert it to raw by clicking on the raw button present in the repo . - -#### Also you can't use the data directly from `Kaggle` you have to use ``kaggle API`` - -## 2. The Anatomy of DataFrame - -**Different functions use different labels for different things, and can get a little confusing.** - -- Rows are refer as ``axis=0`` -- columns are refer as ``axis=1`` - -## 3. Exporting Data - -**OK, so after you've made a few changes to your data, you might want to export it and save it so someone else can access the changes.** - -**pandas allows you to export ``DataFrame's`` to ``.csv`` format using ``.to_csv()``, or to a spreadsheet format using .to_excel().** - -### Exporting a dataframe to a CSV - -**We haven't made any changes yet to the ``titanic_df`` DataFrame but let's try to export it.** - - -```python -#Export the titanic_df DataFrame to csv -titanic_df.to_csv("exported_titanic.csv") -``` - -Running this will save a file called ``exported_titanic.csv`` to the current folder. From bd52a3a43bf558f158b3bf2880d8212a93ad8a83 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Fri, 24 May 2024 21:12:23 +0530 Subject: [PATCH 140/405] Delete contrib/pandas/Titanic.csv --- contrib/pandas/Titanic.csv | 1310 ------------------------------------ 1 file changed, 1310 deletions(-) delete mode 100644 contrib/pandas/Titanic.csv diff --git a/contrib/pandas/Titanic.csv b/contrib/pandas/Titanic.csv deleted file mode 100644 index f8d49dc..0000000 --- a/contrib/pandas/Titanic.csv +++ /dev/null @@ -1,1310 +0,0 @@ -"pclass","survived","name","sex","age","sibsp","parch","ticket","fare","cabin","embarked","boat","body","home.dest" -1,1,"Allen, Miss. Elisabeth Walton","female",29,0,0,"24160",211.3375,"B5","S","2",,"St Louis, MO" -1,1,"Allison, Master. Hudson Trevor","male",0.92,1,2,"113781",151.5500,"C22 C26","S","11",,"Montreal, PQ / Chesterville, ON" -1,0,"Allison, Miss. Helen Loraine","female",2,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" -1,0,"Allison, Mr. Hudson Joshua Creighton","male",30,1,2,"113781",151.5500,"C22 C26","S",,"135","Montreal, PQ / Chesterville, ON" -1,0,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)","female",25,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" -1,1,"Anderson, Mr. Harry","male",48,0,0,"19952",26.5500,"E12","S","3",,"New York, NY" -1,1,"Andrews, Miss. Kornelia Theodosia","female",63,1,0,"13502",77.9583,"D7","S","10",,"Hudson, NY" -1,0,"Andrews, Mr. Thomas Jr","male",39,0,0,"112050",0.0000,"A36","S",,,"Belfast, NI" -1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)","female",53,2,0,"11769",51.4792,"C101","S","D",,"Bayside, Queens, NY" -1,0,"Artagaveytia, Mr. Ramon","male",71,0,0,"PC 17609",49.5042,,"C",,"22","Montevideo, Uruguay" -1,0,"Astor, Col. John Jacob","male",47,1,0,"PC 17757",227.5250,"C62 C64","C",,"124","New York, NY" -1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)","female",18,1,0,"PC 17757",227.5250,"C62 C64","C","4",,"New York, NY" -1,1,"Aubart, Mme. Leontine Pauline","female",24,0,0,"PC 17477",69.3000,"B35","C","9",,"Paris, France" -1,1,"Barber, Miss. Ellen ""Nellie""","female",26,0,0,"19877",78.8500,,"S","6",, -1,1,"Barkworth, Mr. Algernon Henry Wilson","male",80,0,0,"27042",30.0000,"A23","S","B",,"Hessle, Yorks" -1,0,"Baumann, Mr. John D","male",,0,0,"PC 17318",25.9250,,"S",,,"New York, NY" -1,0,"Baxter, Mr. Quigg Edmond","male",24,0,1,"PC 17558",247.5208,"B58 B60","C",,,"Montreal, PQ" -1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)","female",50,0,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" -1,1,"Bazzani, Miss. Albina","female",32,0,0,"11813",76.2917,"D15","C","8",, -1,0,"Beattie, Mr. Thomson","male",36,0,0,"13050",75.2417,"C6","C","A",,"Winnipeg, MN" -1,1,"Beckwith, Mr. Richard Leonard","male",37,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" -1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)","female",47,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" -1,1,"Behr, Mr. Karl Howell","male",26,0,0,"111369",30.0000,"C148","C","5",,"New York, NY" -1,1,"Bidois, Miss. Rosalie","female",42,0,0,"PC 17757",227.5250,,"C","4",, -1,1,"Bird, Miss. Ellen","female",29,0,0,"PC 17483",221.7792,"C97","S","8",, -1,0,"Birnbaum, Mr. Jakob","male",25,0,0,"13905",26.0000,,"C",,"148","San Francisco, CA" -1,1,"Bishop, Mr. Dickinson H","male",25,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" -1,1,"Bishop, Mrs. Dickinson H (Helen Walton)","female",19,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" -1,1,"Bissette, Miss. Amelia","female",35,0,0,"PC 17760",135.6333,"C99","S","8",, -1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan","male",28,0,0,"110564",26.5500,"C52","S","D",,"Stockholm, Sweden / Washington, DC" -1,0,"Blackwell, Mr. Stephen Weart","male",45,0,0,"113784",35.5000,"T","S",,,"Trenton, NJ" -1,1,"Blank, Mr. Henry","male",40,0,0,"112277",31.0000,"A31","C","7",,"Glen Ridge, NJ" -1,1,"Bonnell, Miss. Caroline","female",30,0,0,"36928",164.8667,"C7","S","8",,"Youngstown, OH" -1,1,"Bonnell, Miss. Elizabeth","female",58,0,0,"113783",26.5500,"C103","S","8",,"Birkdale, England Cleveland, Ohio" -1,0,"Borebank, Mr. John James","male",42,0,0,"110489",26.5500,"D22","S",,,"London / Winnipeg, MB" -1,1,"Bowen, Miss. Grace Scott","female",45,0,0,"PC 17608",262.3750,,"C","4",,"Cooperstown, NY" -1,1,"Bowerman, Miss. Elsie Edith","female",22,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" -1,1,"Bradley, Mr. George (""George Arthur Brayton"")","male",,0,0,"111427",26.5500,,"S","9",,"Los Angeles, CA" -1,0,"Brady, Mr. John Bertram","male",41,0,0,"113054",30.5000,"A21","S",,,"Pomeroy, WA" -1,0,"Brandeis, Mr. Emil","male",48,0,0,"PC 17591",50.4958,"B10","C",,"208","Omaha, NE" -1,0,"Brewe, Dr. Arthur Jackson","male",,0,0,"112379",39.6000,,"C",,,"Philadelphia, PA" -1,1,"Brown, Mrs. James Joseph (Margaret Tobin)","female",44,0,0,"PC 17610",27.7208,"B4","C","6",,"Denver, CO" -1,1,"Brown, Mrs. John Murray (Caroline Lane Lamson)","female",59,2,0,"11769",51.4792,"C101","S","D",,"Belmont, MA" -1,1,"Bucknell, Mrs. William Robert (Emma Eliza Ward)","female",60,0,0,"11813",76.2917,"D15","C","8",,"Philadelphia, PA" -1,1,"Burns, Miss. Elizabeth Margaret","female",41,0,0,"16966",134.5000,"E40","C","3",, -1,0,"Butt, Major. Archibald Willingham","male",45,0,0,"113050",26.5500,"B38","S",,,"Washington, DC" -1,0,"Cairns, Mr. Alexander","male",,0,0,"113798",31.0000,,"S",,, -1,1,"Calderhead, Mr. Edward Pennington","male",42,0,0,"PC 17476",26.2875,"E24","S","5",,"New York, NY" -1,1,"Candee, Mrs. Edward (Helen Churchill Hungerford)","female",53,0,0,"PC 17606",27.4458,,"C","6",,"Washington, DC" -1,1,"Cardeza, Mr. Thomas Drake Martinez","male",36,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Austria-Hungary / Germantown, Philadelphia, PA" -1,1,"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)","female",58,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Germantown, Philadelphia, PA" -1,0,"Carlsson, Mr. Frans Olof","male",33,0,0,"695",5.0000,"B51 B53 B55","S",,,"New York, NY" -1,0,"Carrau, Mr. Francisco M","male",28,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" -1,0,"Carrau, Mr. Jose Pedro","male",17,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" -1,1,"Carter, Master. William Thornton II","male",11,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" -1,1,"Carter, Miss. Lucile Polk","female",14,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" -1,1,"Carter, Mr. William Ernest","male",36,1,2,"113760",120.0000,"B96 B98","S","C",,"Bryn Mawr, PA" -1,1,"Carter, Mrs. William Ernest (Lucile Polk)","female",36,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" -1,0,"Case, Mr. Howard Brown","male",49,0,0,"19924",26.0000,,"S",,,"Ascot, Berkshire / Rochester, NY" -1,1,"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)","female",,0,0,"17770",27.7208,,"C","5",,"New York, NY" -1,0,"Cavendish, Mr. Tyrell William","male",36,1,0,"19877",78.8500,"C46","S",,"172","Little Onn Hall, Staffs" -1,1,"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)","female",76,1,0,"19877",78.8500,"C46","S","6",,"Little Onn Hall, Staffs" -1,0,"Chaffee, Mr. Herbert Fuller","male",46,1,0,"W.E.P. 5734",61.1750,"E31","S",,,"Amenia, ND" -1,1,"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)","female",47,1,0,"W.E.P. 5734",61.1750,"E31","S","4",,"Amenia, ND" -1,1,"Chambers, Mr. Norman Campbell","male",27,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" -1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)","female",33,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" -1,1,"Chaudanson, Miss. Victorine","female",36,0,0,"PC 17608",262.3750,"B61","C","4",, -1,1,"Cherry, Miss. Gladys","female",30,0,0,"110152",86.5000,"B77","S","8",,"London, England" -1,1,"Chevre, Mr. Paul Romaine","male",45,0,0,"PC 17594",29.7000,"A9","C","7",,"Paris, France" -1,1,"Chibnall, Mrs. (Edith Martha Bowerman)","female",,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" -1,0,"Chisholm, Mr. Roderick Robert Crispin","male",,0,0,"112051",0.0000,,"S",,,"Liverpool, England / Belfast" -1,0,"Clark, Mr. Walter Miller","male",27,1,0,"13508",136.7792,"C89","C",,,"Los Angeles, CA" -1,1,"Clark, Mrs. Walter Miller (Virginia McDowell)","female",26,1,0,"13508",136.7792,"C89","C","4",,"Los Angeles, CA" -1,1,"Cleaver, Miss. Alice","female",22,0,0,"113781",151.5500,,"S","11",, -1,0,"Clifford, Mr. George Quincy","male",,0,0,"110465",52.0000,"A14","S",,,"Stoughton, MA" -1,0,"Colley, Mr. Edward Pomeroy","male",47,0,0,"5727",25.5875,"E58","S",,,"Victoria, BC" -1,1,"Compton, Miss. Sara Rebecca","female",39,1,1,"PC 17756",83.1583,"E49","C","14",,"Lakewood, NJ" -1,0,"Compton, Mr. Alexander Taylor Jr","male",37,1,1,"PC 17756",83.1583,"E52","C",,,"Lakewood, NJ" -1,1,"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)","female",64,0,2,"PC 17756",83.1583,"E45","C","14",,"Lakewood, NJ" -1,1,"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)","female",55,2,0,"11770",25.7000,"C101","S","2",,"New York, NY" -1,0,"Crafton, Mr. John Bertram","male",,0,0,"113791",26.5500,,"S",,,"Roachdale, IN" -1,0,"Crosby, Capt. Edward Gifford","male",70,1,1,"WE/P 5735",71.0000,"B22","S",,"269","Milwaukee, WI" -1,1,"Crosby, Miss. Harriet R","female",36,0,2,"WE/P 5735",71.0000,"B22","S","7",,"Milwaukee, WI" -1,1,"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)","female",64,1,1,"112901",26.5500,"B26","S","7",,"Milwaukee, WI" -1,0,"Cumings, Mr. John Bradley","male",39,1,0,"PC 17599",71.2833,"C85","C",,,"New York, NY" -1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)","female",38,1,0,"PC 17599",71.2833,"C85","C","4",,"New York, NY" -1,1,"Daly, Mr. Peter Denis ","male",51,0,0,"113055",26.5500,"E17","S","5 9",,"Lima, Peru" -1,1,"Daniel, Mr. Robert Williams","male",27,0,0,"113804",30.5000,,"S","3",,"Philadelphia, PA" -1,1,"Daniels, Miss. Sarah","female",33,0,0,"113781",151.5500,,"S","8",, -1,0,"Davidson, Mr. Thornton","male",31,1,0,"F.C. 12750",52.0000,"B71","S",,,"Montreal, PQ" -1,1,"Davidson, Mrs. Thornton (Orian Hays)","female",27,1,2,"F.C. 12750",52.0000,"B71","S","3",,"Montreal, PQ" -1,1,"Dick, Mr. Albert Adrian","male",31,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" -1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)","female",17,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" -1,1,"Dodge, Dr. Washington","male",53,1,1,"33638",81.8583,"A34","S","13",,"San Francisco, CA" -1,1,"Dodge, Master. Washington","male",4,0,2,"33638",81.8583,"A34","S","5",,"San Francisco, CA" -1,1,"Dodge, Mrs. Washington (Ruth Vidaver)","female",54,1,1,"33638",81.8583,"A34","S","5",,"San Francisco, CA" -1,0,"Douglas, Mr. Walter Donald","male",50,1,0,"PC 17761",106.4250,"C86","C",,"62","Deephaven, MN / Cedar Rapids, IA" -1,1,"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)","female",27,1,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" -1,1,"Douglas, Mrs. Walter Donald (Mahala Dutton)","female",48,1,0,"PC 17761",106.4250,"C86","C","2",,"Deephaven, MN / Cedar Rapids, IA" -1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")","female",48,1,0,"11755",39.6000,"A16","C","1",,"London / Paris" -1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")","male",49,1,0,"PC 17485",56.9292,"A20","C","1",,"London / Paris" -1,0,"Dulles, Mr. William Crothers","male",39,0,0,"PC 17580",29.7000,"A18","C",,"133","Philadelphia, PA" -1,1,"Earnshaw, Mrs. Boulton (Olive Potter)","female",23,0,1,"11767",83.1583,"C54","C","7",,"Mt Airy, Philadelphia, PA" -1,1,"Endres, Miss. Caroline Louise","female",38,0,0,"PC 17757",227.5250,"C45","C","4",,"New York, NY" -1,1,"Eustis, Miss. Elizabeth Mussey","female",54,1,0,"36947",78.2667,"D20","C","4",,"Brookline, MA" -1,0,"Evans, Miss. Edith Corse","female",36,0,0,"PC 17531",31.6792,"A29","C",,,"New York, NY" -1,0,"Farthing, Mr. John","male",,0,0,"PC 17483",221.7792,"C95","S",,, -1,1,"Flegenheim, Mrs. Alfred (Antoinette)","female",,0,0,"PC 17598",31.6833,,"S","7",,"New York, NY" -1,1,"Fleming, Miss. Margaret","female",,0,0,"17421",110.8833,,"C","4",, -1,1,"Flynn, Mr. John Irwin (""Irving"")","male",36,0,0,"PC 17474",26.3875,"E25","S","5",,"Brooklyn, NY" -1,0,"Foreman, Mr. Benjamin Laventall","male",30,0,0,"113051",27.7500,"C111","C",,,"New York, NY" -1,1,"Fortune, Miss. Alice Elizabeth","female",24,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,1,"Fortune, Miss. Ethel Flora","female",28,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,1,"Fortune, Miss. Mabel Helen","female",23,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,0,"Fortune, Mr. Charles Alexander","male",19,3,2,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" -1,0,"Fortune, Mr. Mark","male",64,1,4,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" -1,1,"Fortune, Mrs. Mark (Mary McDougald)","female",60,1,4,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,1,"Francatelli, Miss. Laura Mabel","female",30,0,0,"PC 17485",56.9292,"E36","C","1",, -1,0,"Franklin, Mr. Thomas Parham","male",,0,0,"113778",26.5500,"D34","S",,,"Westcliff-on-Sea, Essex" -1,1,"Frauenthal, Dr. Henry William","male",50,2,0,"PC 17611",133.6500,,"S","5",,"New York, NY" -1,1,"Frauenthal, Mr. Isaac Gerald","male",43,1,0,"17765",27.7208,"D40","C","5",,"New York, NY" -1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)","female",,1,0,"PC 17611",133.6500,,"S","5",,"New York, NY" -1,1,"Frolicher, Miss. Hedwig Margaritha","female",22,0,2,"13568",49.5000,"B39","C","5",,"Zurich, Switzerland" -1,1,"Frolicher-Stehli, Mr. Maxmillian","male",60,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" -1,1,"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)","female",48,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" -1,0,"Fry, Mr. Richard","male",,0,0,"112058",0.0000,"B102","S",,, -1,0,"Futrelle, Mr. Jacques Heath","male",37,1,0,"113803",53.1000,"C123","S",,,"Scituate, MA" -1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)","female",35,1,0,"113803",53.1000,"C123","S","D",,"Scituate, MA" -1,0,"Gee, Mr. Arthur H","male",47,0,0,"111320",38.5000,"E63","S",,"275","St Anne's-on-Sea, Lancashire" -1,1,"Geiger, Miss. Amalie","female",35,0,0,"113503",211.5000,"C130","C","4",, -1,1,"Gibson, Miss. Dorothy Winifred","female",22,0,1,"112378",59.4000,,"C","7",,"New York, NY" -1,1,"Gibson, Mrs. Leonard (Pauline C Boeson)","female",45,0,1,"112378",59.4000,,"C","7",,"New York, NY" -1,0,"Giglio, Mr. Victor","male",24,0,0,"PC 17593",79.2000,"B86","C",,, -1,1,"Goldenberg, Mr. Samuel L","male",49,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" -1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)","female",,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" -1,0,"Goldschmidt, Mr. George B","male",71,0,0,"PC 17754",34.6542,"A5","C",,,"New York, NY" -1,1,"Gracie, Col. Archibald IV","male",53,0,0,"113780",28.5000,"C51","C","B",,"Washington, DC" -1,1,"Graham, Miss. Margaret Edith","female",19,0,0,"112053",30.0000,"B42","S","3",,"Greenwich, CT" -1,0,"Graham, Mr. George Edward","male",38,0,1,"PC 17582",153.4625,"C91","S",,"147","Winnipeg, MB" -1,1,"Graham, Mrs. William Thompson (Edith Junkins)","female",58,0,1,"PC 17582",153.4625,"C125","S","3",,"Greenwich, CT" -1,1,"Greenfield, Mr. William Bertram","male",23,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" -1,1,"Greenfield, Mrs. Leo David (Blanche Strouse)","female",45,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" -1,0,"Guggenheim, Mr. Benjamin","male",46,0,0,"PC 17593",79.2000,"B82 B84","C",,,"New York, NY" -1,1,"Harder, Mr. George Achilles","male",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" -1,1,"Harder, Mrs. George Achilles (Dorothy Annan)","female",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" -1,1,"Harper, Mr. Henry Sleeper","male",48,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" -1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)","female",49,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" -1,0,"Harrington, Mr. Charles H","male",,0,0,"113796",42.4000,,"S",,, -1,0,"Harris, Mr. Henry Birkhardt","male",45,1,0,"36973",83.4750,"C83","S",,,"New York, NY" -1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)","female",35,1,0,"36973",83.4750,"C83","S","D",,"New York, NY" -1,0,"Harrison, Mr. William","male",40,0,0,"112059",0.0000,"B94","S",,"110", -1,1,"Hassab, Mr. Hammad","male",27,0,0,"PC 17572",76.7292,"D49","C","3",, -1,1,"Hawksford, Mr. Walter James","male",,0,0,"16988",30.0000,"D45","S","3",,"Kingston, Surrey" -1,1,"Hays, Miss. Margaret Bechstein","female",24,0,0,"11767",83.1583,"C54","C","7",,"New York, NY" -1,0,"Hays, Mr. Charles Melville","male",55,1,1,"12749",93.5000,"B69","S",,"307","Montreal, PQ" -1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)","female",52,1,1,"12749",93.5000,"B69","S","3",,"Montreal, PQ" -1,0,"Head, Mr. Christopher","male",42,0,0,"113038",42.5000,"B11","S",,,"London / Middlesex" -1,0,"Hilliard, Mr. Herbert Henry","male",,0,0,"17463",51.8625,"E46","S",,,"Brighton, MA" -1,0,"Hipkins, Mr. William Edward","male",55,0,0,"680",50.0000,"C39","S",,,"London / Birmingham" -1,1,"Hippach, Miss. Jean Gertrude","female",16,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" -1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)","female",44,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" -1,1,"Hogeboom, Mrs. John C (Anna Andrews)","female",51,1,0,"13502",77.9583,"D11","S","10",,"Hudson, NY" -1,0,"Holverson, Mr. Alexander Oskar","male",42,1,0,"113789",52.0000,,"S",,"38","New York, NY" -1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)","female",35,1,0,"113789",52.0000,,"S","8",,"New York, NY" -1,1,"Homer, Mr. Harry (""Mr E Haven"")","male",35,0,0,"111426",26.5500,,"C","15",,"Indianapolis, IN" -1,1,"Hoyt, Mr. Frederick Maxfield","male",38,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" -1,0,"Hoyt, Mr. William Fisher","male",,0,0,"PC 17600",30.6958,,"C","14",,"New York, NY" -1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)","female",35,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" -1,1,"Icard, Miss. Amelie","female",38,0,0,"113572",80.0000,"B28",,"6",, -1,0,"Isham, Miss. Ann Elizabeth","female",50,0,0,"PC 17595",28.7125,"C49","C",,,"Paris, France New York, NY" -1,1,"Ismay, Mr. Joseph Bruce","male",49,0,0,"112058",0.0000,"B52 B54 B56","S","C",,"Liverpool" -1,0,"Jones, Mr. Charles Cresson","male",46,0,0,"694",26.0000,,"S",,"80","Bennington, VT" -1,0,"Julian, Mr. Henry Forbes","male",50,0,0,"113044",26.0000,"E60","S",,,"London" -1,0,"Keeping, Mr. Edwin","male",32.5,0,0,"113503",211.5000,"C132","C",,"45", -1,0,"Kent, Mr. Edward Austin","male",58,0,0,"11771",29.7000,"B37","C",,"258","Buffalo, NY" -1,0,"Kenyon, Mr. Frederick R","male",41,1,0,"17464",51.8625,"D21","S",,,"Southington / Noank, CT" -1,1,"Kenyon, Mrs. Frederick R (Marion)","female",,1,0,"17464",51.8625,"D21","S","8",,"Southington / Noank, CT" -1,1,"Kimball, Mr. Edwin Nelson Jr","male",42,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" -1,1,"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)","female",45,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" -1,0,"Klaber, Mr. Herman","male",,0,0,"113028",26.5500,"C124","S",,,"Portland, OR" -1,1,"Kreuchen, Miss. Emilie","female",39,0,0,"24160",211.3375,,"S","2",, -1,1,"Leader, Dr. Alice (Farnham)","female",49,0,0,"17465",25.9292,"D17","S","8",,"New York, NY" -1,1,"LeRoy, Miss. Bertha","female",30,0,0,"PC 17761",106.4250,,"C","2",, -1,1,"Lesurer, Mr. Gustave J","male",35,0,0,"PC 17755",512.3292,"B101","C","3",, -1,0,"Lewy, Mr. Ervin G","male",,0,0,"PC 17612",27.7208,,"C",,,"Chicago, IL" -1,0,"Lindeberg-Lind, Mr. Erik Gustaf (""Mr Edward Lingrey"")","male",42,0,0,"17475",26.5500,,"S",,,"Stockholm, Sweden" -1,1,"Lindstrom, Mrs. Carl Johan (Sigrid Posse)","female",55,0,0,"112377",27.7208,,"C","6",,"Stockholm, Sweden" -1,1,"Lines, Miss. Mary Conover","female",16,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" -1,1,"Lines, Mrs. Ernest H (Elizabeth Lindsey James)","female",51,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" -1,0,"Long, Mr. Milton Clyde","male",29,0,0,"113501",30.0000,"D6","S",,"126","Springfield, MA" -1,1,"Longley, Miss. Gretchen Fiske","female",21,0,0,"13502",77.9583,"D9","S","10",,"Hudson, NY" -1,0,"Loring, Mr. Joseph Holland","male",30,0,0,"113801",45.5000,,"S",,,"London / New York, NY" -1,1,"Lurette, Miss. Elise","female",58,0,0,"PC 17569",146.5208,"B80","C",,, -1,1,"Madill, Miss. Georgette Alexandra","female",15,0,1,"24160",211.3375,"B5","S","2",,"St Louis, MO" -1,0,"Maguire, Mr. John Edward","male",30,0,0,"110469",26.0000,"C106","S",,,"Brockton, MA" -1,1,"Maioni, Miss. Roberta","female",16,0,0,"110152",86.5000,"B79","S","8",, -1,1,"Marechal, Mr. Pierre","male",,0,0,"11774",29.7000,"C47","C","7",,"Paris, France" -1,0,"Marvin, Mr. Daniel Warner","male",19,1,0,"113773",53.1000,"D30","S",,,"New York, NY" -1,1,"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)","female",18,1,0,"113773",53.1000,"D30","S","10",,"New York, NY" -1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")","female",24,0,0,"PC 17482",49.5042,"C90","C","6",,"Belgium Montreal, PQ" -1,0,"McCaffry, Mr. Thomas Francis","male",46,0,0,"13050",75.2417,"C6","C",,"292","Vancouver, BC" -1,0,"McCarthy, Mr. Timothy J","male",54,0,0,"17463",51.8625,"E46","S",,"175","Dorchester, MA" -1,1,"McGough, Mr. James Robert","male",36,0,0,"PC 17473",26.2875,"E25","S","7",,"Philadelphia, PA" -1,0,"Meyer, Mr. Edgar Joseph","male",28,1,0,"PC 17604",82.1708,,"C",,,"New York, NY" -1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)","female",,1,0,"PC 17604",82.1708,,"C","6",,"New York, NY" -1,0,"Millet, Mr. Francis Davis","male",65,0,0,"13509",26.5500,"E38","S",,"249","East Bridgewater, MA" -1,0,"Minahan, Dr. William Edward","male",44,2,0,"19928",90.0000,"C78","Q",,"230","Fond du Lac, WI" -1,1,"Minahan, Miss. Daisy E","female",33,1,0,"19928",90.0000,"C78","Q","14",,"Green Bay, WI" -1,1,"Minahan, Mrs. William Edward (Lillian E Thorpe)","female",37,1,0,"19928",90.0000,"C78","Q","14",,"Fond du Lac, WI" -1,1,"Mock, Mr. Philipp Edmund","male",30,1,0,"13236",57.7500,"C78","C","11",,"New York, NY" -1,0,"Molson, Mr. Harry Markland","male",55,0,0,"113787",30.5000,"C30","S",,,"Montreal, PQ" -1,0,"Moore, Mr. Clarence Bloomfield","male",47,0,0,"113796",42.4000,,"S",,,"Washington, DC" -1,0,"Natsch, Mr. Charles H","male",37,0,1,"PC 17596",29.7000,"C118","C",,,"Brooklyn, NY" -1,1,"Newell, Miss. Madeleine","female",31,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" -1,1,"Newell, Miss. Marjorie","female",23,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" -1,0,"Newell, Mr. Arthur Webster","male",58,0,2,"35273",113.2750,"D48","C",,"122","Lexington, MA" -1,1,"Newsom, Miss. Helen Monypeny","female",19,0,2,"11752",26.2833,"D47","S","5",,"New York, NY" -1,0,"Nicholson, Mr. Arthur Ernest","male",64,0,0,"693",26.0000,,"S",,"263","Isle of Wight, England" -1,1,"Oliva y Ocana, Dona. Fermina","female",39,0,0,"PC 17758",108.9000,"C105","C","8",, -1,1,"Omont, Mr. Alfred Fernand","male",,0,0,"F.C. 12998",25.7417,,"C","7",,"Paris, France" -1,1,"Ostby, Miss. Helene Ragnhild","female",22,0,1,"113509",61.9792,"B36","C","5",,"Providence, RI" -1,0,"Ostby, Mr. Engelhart Cornelius","male",65,0,1,"113509",61.9792,"B30","C",,"234","Providence, RI" -1,0,"Ovies y Rodriguez, Mr. Servando","male",28.5,0,0,"PC 17562",27.7208,"D43","C",,"189","?Havana, Cuba" -1,0,"Parr, Mr. William Henry Marsh","male",,0,0,"112052",0.0000,,"S",,,"Belfast" -1,0,"Partner, Mr. Austen","male",45.5,0,0,"113043",28.5000,"C124","S",,"166","Surbiton Hill, Surrey" -1,0,"Payne, Mr. Vivian Ponsonby","male",23,0,0,"12749",93.5000,"B24","S",,,"Montreal, PQ" -1,0,"Pears, Mr. Thomas Clinton","male",29,1,0,"113776",66.6000,"C2","S",,,"Isleworth, England" -1,1,"Pears, Mrs. Thomas (Edith Wearne)","female",22,1,0,"113776",66.6000,"C2","S","8",,"Isleworth, England" -1,0,"Penasco y Castellana, Mr. Victor de Satode","male",18,1,0,"PC 17758",108.9000,"C65","C",,,"Madrid, Spain" -1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)","female",17,1,0,"PC 17758",108.9000,"C65","C","8",,"Madrid, Spain" -1,1,"Perreault, Miss. Anne","female",30,0,0,"12749",93.5000,"B73","S","3",, -1,1,"Peuchen, Major. Arthur Godfrey","male",52,0,0,"113786",30.5000,"C104","S","6",,"Toronto, ON" -1,0,"Porter, Mr. Walter Chamberlain","male",47,0,0,"110465",52.0000,"C110","S",,"207","Worcester, MA" -1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)","female",56,0,1,"11767",83.1583,"C50","C","7",,"Mt Airy, Philadelphia, PA" -1,0,"Reuchlin, Jonkheer. John George","male",38,0,0,"19972",0.0000,,"S",,,"Rotterdam, Netherlands" -1,1,"Rheims, Mr. George Alexander Lucien","male",,0,0,"PC 17607",39.6000,,"S","A",,"Paris / New York, NY" -1,0,"Ringhini, Mr. Sante","male",22,0,0,"PC 17760",135.6333,,"C",,"232", -1,0,"Robbins, Mr. Victor","male",,0,0,"PC 17757",227.5250,,"C",,, -1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)","female",43,0,1,"24160",211.3375,"B3","S","2",,"St Louis, MO" -1,0,"Roebling, Mr. Washington Augustus II","male",31,0,0,"PC 17590",50.4958,"A24","S",,,"Trenton, NJ" -1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")","male",45,0,0,"111428",26.5500,,"S","9",,"New York, NY" -1,0,"Rood, Mr. Hugh Roscoe","male",,0,0,"113767",50.0000,"A32","S",,,"Seattle, WA" -1,1,"Rosenbaum, Miss. Edith Louise","female",33,0,0,"PC 17613",27.7208,"A11","C","11",,"Paris, France" -1,0,"Rosenshine, Mr. George (""Mr George Thorne"")","male",46,0,0,"PC 17585",79.2000,,"C",,"16","New York, NY" -1,0,"Ross, Mr. John Hugo","male",36,0,0,"13049",40.1250,"A10","C",,,"Winnipeg, MB" -1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)","female",33,0,0,"110152",86.5000,"B77","S","8",,"London Vancouver, BC" -1,0,"Rothschild, Mr. Martin","male",55,1,0,"PC 17603",59.4000,,"C",,,"New York, NY" -1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)","female",54,1,0,"PC 17603",59.4000,,"C","6",,"New York, NY" -1,0,"Rowe, Mr. Alfred G","male",33,0,0,"113790",26.5500,,"S",,"109","London" -1,1,"Ryerson, Master. John Borie","male",13,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,1,"Ryerson, Miss. Emily Borie","female",18,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,1,"Ryerson, Miss. Susan Parker ""Suzette""","female",21,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,0,"Ryerson, Mr. Arthur Larned","male",61,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C",,,"Haverford, PA / Cooperstown, NY" -1,1,"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)","female",48,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,1,"Saalfeld, Mr. Adolphe","male",,0,0,"19988",30.5000,"C106","S","3",,"Manchester, England" -1,1,"Sagesser, Mlle. Emma","female",24,0,0,"PC 17477",69.3000,"B35","C","9",, -1,1,"Salomon, Mr. Abraham L","male",,0,0,"111163",26.0000,,"S","1",,"New York, NY" -1,1,"Schabert, Mrs. Paul (Emma Mock)","female",35,1,0,"13236",57.7500,"C28","C","11",,"New York, NY" -1,1,"Serepeca, Miss. Augusta","female",30,0,0,"113798",31.0000,,"C","4",, -1,1,"Seward, Mr. Frederic Kimber","male",34,0,0,"113794",26.5500,,"S","7",,"New York, NY" -1,1,"Shutes, Miss. Elizabeth W","female",40,0,0,"PC 17582",153.4625,"C125","S","3",,"New York, NY / Greenwich CT" -1,1,"Silverthorne, Mr. Spencer Victor","male",35,0,0,"PC 17475",26.2875,"E24","S","5",,"St Louis, MO" -1,0,"Silvey, Mr. William Baird","male",50,1,0,"13507",55.9000,"E44","S",,,"Duluth, MN" -1,1,"Silvey, Mrs. William Baird (Alice Munger)","female",39,1,0,"13507",55.9000,"E44","S","11",,"Duluth, MN" -1,1,"Simonius-Blumer, Col. Oberst Alfons","male",56,0,0,"13213",35.5000,"A26","C","3",,"Basel, Switzerland" -1,1,"Sloper, Mr. William Thompson","male",28,0,0,"113788",35.5000,"A6","S","7",,"New Britain, CT" -1,0,"Smart, Mr. John Montgomery","male",56,0,0,"113792",26.5500,,"S",,,"New York, NY" -1,0,"Smith, Mr. James Clinch","male",56,0,0,"17764",30.6958,"A7","C",,,"St James, Long Island, NY" -1,0,"Smith, Mr. Lucien Philip","male",24,1,0,"13695",60.0000,"C31","S",,,"Huntington, WV" -1,0,"Smith, Mr. Richard William","male",,0,0,"113056",26.0000,"A19","S",,,"Streatham, Surrey" -1,1,"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)","female",18,1,0,"13695",60.0000,"C31","S","6",,"Huntington, WV" -1,1,"Snyder, Mr. John Pillsbury","male",24,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" -1,1,"Snyder, Mrs. John Pillsbury (Nelle Stevenson)","female",23,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" -1,1,"Spedden, Master. Robert Douglas","male",6,0,2,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" -1,1,"Spedden, Mr. Frederic Oakley","male",45,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" -1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)","female",40,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" -1,0,"Spencer, Mr. William Augustus","male",57,1,0,"PC 17569",146.5208,"B78","C",,,"Paris, France" -1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)","female",,1,0,"PC 17569",146.5208,"B78","C","6",,"Paris, France" -1,1,"Stahelin-Maeglin, Dr. Max","male",32,0,0,"13214",30.5000,"B50","C","3",,"Basel, Switzerland" -1,0,"Stead, Mr. William Thomas","male",62,0,0,"113514",26.5500,"C87","S",,,"Wimbledon Park, London / Hayling Island, Hants" -1,1,"Stengel, Mr. Charles Emil Henry","male",54,1,0,"11778",55.4417,"C116","C","1",,"Newark, NJ" -1,1,"Stengel, Mrs. Charles Emil Henry (Annie May Morris)","female",43,1,0,"11778",55.4417,"C116","C","5",,"Newark, NJ" -1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)","female",52,1,0,"36947",78.2667,"D20","C","4",,"Haverford, PA" -1,0,"Stewart, Mr. Albert A","male",,0,0,"PC 17605",27.7208,,"C",,,"Gallipolis, Ohio / ? Paris / New York" -1,1,"Stone, Mrs. George Nelson (Martha Evelyn)","female",62,0,0,"113572",80.0000,"B28",,"6",,"Cincinatti, OH" -1,0,"Straus, Mr. Isidor","male",67,1,0,"PC 17483",221.7792,"C55 C57","S",,"96","New York, NY" -1,0,"Straus, Mrs. Isidor (Rosalie Ida Blun)","female",63,1,0,"PC 17483",221.7792,"C55 C57","S",,,"New York, NY" -1,0,"Sutton, Mr. Frederick","male",61,0,0,"36963",32.3208,"D50","S",,"46","Haddenfield, NJ" -1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)","female",48,0,0,"17466",25.9292,"D17","S","8",,"Brooklyn, NY" -1,1,"Taussig, Miss. Ruth","female",18,0,2,"110413",79.6500,"E68","S","8",,"New York, NY" -1,0,"Taussig, Mr. Emil","male",52,1,1,"110413",79.6500,"E67","S",,,"New York, NY" -1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)","female",39,1,1,"110413",79.6500,"E67","S","8",,"New York, NY" -1,1,"Taylor, Mr. Elmer Zebley","male",48,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" -1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)","female",,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" -1,0,"Thayer, Mr. John Borland","male",49,1,1,"17421",110.8833,"C68","C",,,"Haverford, PA" -1,1,"Thayer, Mr. John Borland Jr","male",17,0,2,"17421",110.8833,"C70","C","B",,"Haverford, PA" -1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)","female",39,1,1,"17421",110.8833,"C68","C","4",,"Haverford, PA" -1,1,"Thorne, Mrs. Gertrude Maybelle","female",,0,0,"PC 17585",79.2000,,"C","D",,"New York, NY" -1,1,"Tucker, Mr. Gilbert Milligan Jr","male",31,0,0,"2543",28.5375,"C53","C","7",,"Albany, NY" -1,0,"Uruchurtu, Don. Manuel E","male",40,0,0,"PC 17601",27.7208,,"C",,,"Mexico City, Mexico" -1,0,"Van der hoef, Mr. Wyckoff","male",61,0,0,"111240",33.5000,"B19","S",,"245","Brooklyn, NY" -1,0,"Walker, Mr. William Anderson","male",47,0,0,"36967",34.0208,"D46","S",,,"East Orange, NJ" -1,1,"Ward, Miss. Anna","female",35,0,0,"PC 17755",512.3292,,"C","3",, -1,0,"Warren, Mr. Frank Manley","male",64,1,0,"110813",75.2500,"D37","C",,,"Portland, OR" -1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)","female",60,1,0,"110813",75.2500,"D37","C","5",,"Portland, OR" -1,0,"Weir, Col. John","male",60,0,0,"113800",26.5500,,"S",,,"England Salt Lake City, Utah" -1,0,"White, Mr. Percival Wayland","male",54,0,1,"35281",77.2875,"D26","S",,,"Brunswick, ME" -1,0,"White, Mr. Richard Frasar","male",21,0,1,"35281",77.2875,"D26","S",,"169","Brunswick, ME" -1,1,"White, Mrs. John Stuart (Ella Holmes)","female",55,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Briarcliff Manor NY" -1,1,"Wick, Miss. Mary Natalie","female",31,0,2,"36928",164.8667,"C7","S","8",,"Youngstown, OH" -1,0,"Wick, Mr. George Dennick","male",57,1,1,"36928",164.8667,,"S",,,"Youngstown, OH" -1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)","female",45,1,1,"36928",164.8667,,"S","8",,"Youngstown, OH" -1,0,"Widener, Mr. George Dunton","male",50,1,1,"113503",211.5000,"C80","C",,,"Elkins Park, PA" -1,0,"Widener, Mr. Harry Elkins","male",27,0,2,"113503",211.5000,"C82","C",,,"Elkins Park, PA" -1,1,"Widener, Mrs. George Dunton (Eleanor Elkins)","female",50,1,1,"113503",211.5000,"C80","C","4",,"Elkins Park, PA" -1,1,"Willard, Miss. Constance","female",21,0,0,"113795",26.5500,,"S","8 10",,"Duluth, MN" -1,0,"Williams, Mr. Charles Duane","male",51,0,1,"PC 17597",61.3792,,"C",,,"Geneva, Switzerland / Radnor, PA" -1,1,"Williams, Mr. Richard Norris II","male",21,0,1,"PC 17597",61.3792,,"C","A",,"Geneva, Switzerland / Radnor, PA" -1,0,"Williams-Lambert, Mr. Fletcher Fellows","male",,0,0,"113510",35.0000,"C128","S",,,"London, England" -1,1,"Wilson, Miss. Helen Alice","female",31,0,0,"16966",134.5000,"E39 E41","C","3",, -1,1,"Woolner, Mr. Hugh","male",,0,0,"19947",35.5000,"C52","S","D",,"London, England" -1,0,"Wright, Mr. George","male",62,0,0,"113807",26.5500,,"S",,,"Halifax, NS" -1,1,"Young, Miss. Marie Grice","female",36,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Washington, DC" -2,0,"Abelson, Mr. Samuel","male",30,1,0,"P/PP 3381",24.0000,,"C",,,"Russia New York, NY" -2,1,"Abelson, Mrs. Samuel (Hannah Wizosky)","female",28,1,0,"P/PP 3381",24.0000,,"C","10",,"Russia New York, NY" -2,0,"Aldworth, Mr. Charles Augustus","male",30,0,0,"248744",13.0000,,"S",,,"Bryn Mawr, PA, USA" -2,0,"Andrew, Mr. Edgardo Samuel","male",18,0,0,"231945",11.5000,,"S",,,"Buenos Aires, Argentina / New Jersey, NJ" -2,0,"Andrew, Mr. Frank Thomas","male",25,0,0,"C.A. 34050",10.5000,,"S",,,"Cornwall, England Houghton, MI" -2,0,"Angle, Mr. William A","male",34,1,0,"226875",26.0000,,"S",,,"Warwick, England" -2,1,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)","female",36,1,0,"226875",26.0000,,"S","11",,"Warwick, England" -2,0,"Ashby, Mr. John","male",57,0,0,"244346",13.0000,,"S",,,"West Hoboken, NJ" -2,0,"Bailey, Mr. Percy Andrew","male",18,0,0,"29108",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" -2,0,"Baimbrigge, Mr. Charles Robert","male",23,0,0,"C.A. 31030",10.5000,,"S",,,"Guernsey" -2,1,"Ball, Mrs. (Ada E Hall)","female",36,0,0,"28551",13.0000,"D","S","10",,"Bristol, Avon / Jacksonville, FL" -2,0,"Banfield, Mr. Frederick James","male",28,0,0,"C.A./SOTON 34068",10.5000,,"S",,,"Plymouth, Dorset / Houghton, MI" -2,0,"Bateman, Rev. Robert James","male",51,0,0,"S.O.P. 1166",12.5250,,"S",,"174","Jacksonville, FL" -2,1,"Beane, Mr. Edward","male",32,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" -2,1,"Beane, Mrs. Edward (Ethel Clarke)","female",19,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" -2,0,"Beauchamp, Mr. Henry James","male",28,0,0,"244358",26.0000,,"S",,,"England" -2,1,"Becker, Master. Richard F","male",1,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" -2,1,"Becker, Miss. Marion Louise","female",4,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" -2,1,"Becker, Miss. Ruth Elizabeth","female",12,2,1,"230136",39.0000,"F4","S","13",,"Guntur, India / Benton Harbour, MI" -2,1,"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)","female",36,0,3,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" -2,1,"Beesley, Mr. Lawrence","male",34,0,0,"248698",13.0000,"D56","S","13",,"London" -2,1,"Bentham, Miss. Lilian W","female",19,0,0,"28404",13.0000,,"S","12",,"Rochester, NY" -2,0,"Berriman, Mr. William John","male",23,0,0,"28425",13.0000,,"S",,,"St Ives, Cornwall / Calumet, MI" -2,0,"Botsford, Mr. William Hull","male",26,0,0,"237670",13.0000,,"S",,,"Elmira, NY / Orange, NJ" -2,0,"Bowenur, Mr. Solomon","male",42,0,0,"211535",13.0000,,"S",,,"London" -2,0,"Bracken, Mr. James H","male",27,0,0,"220367",13.0000,,"S",,,"Lake Arthur, Chavez County, NM" -2,1,"Brown, Miss. Amelia ""Mildred""","female",24,0,0,"248733",13.0000,"F33","S","11",,"London / Montreal, PQ" -2,1,"Brown, Miss. Edith Eileen","female",15,0,2,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" -2,0,"Brown, Mr. Thomas William Solomon","male",60,1,1,"29750",39.0000,,"S",,,"Cape Town, South Africa / Seattle, WA" -2,1,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)","female",40,1,1,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" -2,1,"Bryhl, Miss. Dagmar Jenny Ingeborg ","female",20,1,0,"236853",26.0000,,"S","12",,"Skara, Sweden / Rockford, IL" -2,0,"Bryhl, Mr. Kurt Arnold Gottfrid","male",25,1,0,"236853",26.0000,,"S",,,"Skara, Sweden / Rockford, IL" -2,1,"Buss, Miss. Kate","female",36,0,0,"27849",13.0000,,"S","9",,"Sittingbourne, England / San Diego, CA" -2,0,"Butler, Mr. Reginald Fenton","male",25,0,0,"234686",13.0000,,"S",,"97","Southsea, Hants" -2,0,"Byles, Rev. Thomas Roussel Davids","male",42,0,0,"244310",13.0000,,"S",,,"London" -2,1,"Bystrom, Mrs. (Karolina)","female",42,0,0,"236852",13.0000,,"S",,,"New York, NY" -2,1,"Caldwell, Master. Alden Gates","male",0.83,0,2,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" -2,1,"Caldwell, Mr. Albert Francis","male",26,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" -2,1,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)","female",22,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" -2,1,"Cameron, Miss. Clear Annie","female",35,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" -2,0,"Campbell, Mr. William","male",,0,0,"239853",0.0000,,"S",,,"Belfast" -2,0,"Carbines, Mr. William","male",19,0,0,"28424",13.0000,,"S",,"18","St Ives, Cornwall / Calumet, MI" -2,0,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)","female",44,1,0,"244252",26.0000,,"S",,,"London" -2,0,"Carter, Rev. Ernest Courtenay","male",54,1,0,"244252",26.0000,,"S",,,"London" -2,0,"Chapman, Mr. Charles Henry","male",52,0,0,"248731",13.5000,,"S",,"130","Bronx, NY" -2,0,"Chapman, Mr. John Henry","male",37,1,0,"SC/AH 29037",26.0000,,"S",,"17","Cornwall / Spokane, WA" -2,0,"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)","female",29,1,0,"SC/AH 29037",26.0000,,"S",,,"Cornwall / Spokane, WA" -2,1,"Christy, Miss. Julie Rachel","female",25,1,1,"237789",30.0000,,"S","12",,"London" -2,1,"Christy, Mrs. (Alice Frances)","female",45,0,2,"237789",30.0000,,"S","12",,"London" -2,0,"Clarke, Mr. Charles Valentine","male",29,1,0,"2003",26.0000,,"S",,,"England / San Francisco, CA" -2,1,"Clarke, Mrs. Charles V (Ada Maria Winfield)","female",28,1,0,"2003",26.0000,,"S","14",,"England / San Francisco, CA" -2,0,"Coleridge, Mr. Reginald Charles","male",29,0,0,"W./C. 14263",10.5000,,"S",,,"Hartford, Huntingdonshire" -2,0,"Collander, Mr. Erik Gustaf","male",28,0,0,"248740",13.0000,,"S",,,"Helsinki, Finland Ashtabula, Ohio" -2,1,"Collett, Mr. Sidney C Stuart","male",24,0,0,"28034",10.5000,,"S","9",,"London / Fort Byron, NY" -2,1,"Collyer, Miss. Marjorie ""Lottie""","female",8,0,2,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" -2,0,"Collyer, Mr. Harvey","male",31,1,1,"C.A. 31921",26.2500,,"S",,,"Bishopstoke, Hants / Fayette Valley, ID" -2,1,"Collyer, Mrs. Harvey (Charlotte Annie Tate)","female",31,1,1,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" -2,1,"Cook, Mrs. (Selena Rogers)","female",22,0,0,"W./C. 14266",10.5000,"F33","S","14",,"Pennsylvania" -2,0,"Corbett, Mrs. Walter H (Irene Colvin)","female",30,0,0,"237249",13.0000,,"S",,,"Provo, UT" -2,0,"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)","female",,0,0,"F.C.C. 13534",21.0000,,"S",,,"Upper Burma, India Pittsburgh, PA" -2,0,"Cotterill, Mr. Henry ""Harry""","male",21,0,0,"29107",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" -2,0,"Cunningham, Mr. Alfred Fleming","male",,0,0,"239853",0.0000,,"S",,,"Belfast" -2,1,"Davies, Master. John Morgan Jr","male",8,1,1,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" -2,0,"Davies, Mr. Charles Henry","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"Lyndhurst, England" -2,1,"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ","female",48,0,2,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" -2,1,"Davis, Miss. Mary","female",28,0,0,"237668",13.0000,,"S","13",,"London / Staten Island, NY" -2,0,"de Brito, Mr. Jose Joaquim","male",32,0,0,"244360",13.0000,,"S",,,"Portugal / Sau Paulo, Brazil" -2,0,"Deacon, Mr. Percy William","male",17,0,0,"S.O.C. 14879",73.5000,,"S",,, -2,0,"del Carlo, Mr. Sebastiano","male",29,1,0,"SC/PARIS 2167",27.7208,,"C",,"295","Lucca, Italy / California" -2,1,"del Carlo, Mrs. Sebastiano (Argenia Genovesi)","female",24,1,0,"SC/PARIS 2167",27.7208,,"C","12",,"Lucca, Italy / California" -2,0,"Denbury, Mr. Herbert","male",25,0,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Dibden, Mr. William","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" -2,1,"Doling, Miss. Elsie","female",18,0,1,"231919",23.0000,,"S",,,"Southampton" -2,1,"Doling, Mrs. John T (Ada Julia Bone)","female",34,0,1,"231919",23.0000,,"S",,,"Southampton" -2,0,"Downton, Mr. William James","male",54,0,0,"28403",26.0000,,"S",,,"Holley, NY" -2,1,"Drew, Master. Marshall Brines","male",8,0,2,"28220",32.5000,,"S","10",,"Greenport, NY" -2,0,"Drew, Mr. James Vivian","male",42,1,1,"28220",32.5000,,"S",,,"Greenport, NY" -2,1,"Drew, Mrs. James Vivian (Lulu Thorne Christian)","female",34,1,1,"28220",32.5000,,"S","10",,"Greenport, NY" -2,1,"Duran y More, Miss. Asuncion","female",27,1,0,"SC/PARIS 2149",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" -2,1,"Duran y More, Miss. Florentina","female",30,1,0,"SC/PARIS 2148",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" -2,0,"Eitemiller, Mr. George Floyd","male",23,0,0,"29751",13.0000,,"S",,,"England / Detroit, MI" -2,0,"Enander, Mr. Ingvar","male",21,0,0,"236854",13.0000,,"S",,,"Goteborg, Sweden / Rockford, IL" -2,0,"Fahlstrom, Mr. Arne Jonas","male",18,0,0,"236171",13.0000,,"S",,,"Oslo, Norway Bayonne, NJ" -2,0,"Faunthorpe, Mr. Harry","male",40,1,0,"2926",26.0000,,"S",,"286","England / Philadelphia, PA" -2,1,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)","female",29,1,0,"2926",26.0000,,"S","16",, -2,0,"Fillbrook, Mr. Joseph Charles","male",18,0,0,"C.A. 15185",10.5000,,"S",,,"Cornwall / Houghton, MI" -2,0,"Fox, Mr. Stanley Hubert","male",36,0,0,"229236",13.0000,,"S",,"236","Rochester, NY" -2,0,"Frost, Mr. Anthony Wood ""Archie""","male",,0,0,"239854",0.0000,,"S",,,"Belfast" -2,0,"Funk, Miss. Annie Clemmer","female",38,0,0,"237671",13.0000,,"S",,,"Janjgir, India / Pennsylvania" -2,0,"Fynney, Mr. Joseph J","male",35,0,0,"239865",26.0000,,"S",,"322","Liverpool / Montreal, PQ" -2,0,"Gale, Mr. Harry","male",38,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" -2,0,"Gale, Mr. Shadrach","male",34,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" -2,1,"Garside, Miss. Ethel","female",34,0,0,"243880",13.0000,,"S","12",,"Brooklyn, NY" -2,0,"Gaskell, Mr. Alfred","male",16,0,0,"239865",26.0000,,"S",,,"Liverpool / Montreal, PQ" -2,0,"Gavey, Mr. Lawrence","male",26,0,0,"31028",10.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Gilbert, Mr. William","male",47,0,0,"C.A. 30769",10.5000,,"S",,,"Cornwall" -2,0,"Giles, Mr. Edgar","male",21,1,0,"28133",11.5000,,"S",,,"Cornwall / Camden, NJ" -2,0,"Giles, Mr. Frederick Edward","male",21,1,0,"28134",11.5000,,"S",,,"Cornwall / Camden, NJ" -2,0,"Giles, Mr. Ralph","male",24,0,0,"248726",13.5000,,"S",,"297","West Kensington, London" -2,0,"Gill, Mr. John William","male",24,0,0,"233866",13.0000,,"S",,"155","Clevedon, England" -2,0,"Gillespie, Mr. William Henry","male",34,0,0,"12233",13.0000,,"S",,,"Vancouver, BC" -2,0,"Givard, Mr. Hans Kristensen","male",30,0,0,"250646",13.0000,,"S",,"305", -2,0,"Greenberg, Mr. Samuel","male",52,0,0,"250647",13.0000,,"S",,"19","Bronx, NY" -2,0,"Hale, Mr. Reginald","male",30,0,0,"250653",13.0000,,"S",,"75","Auburn, NY" -2,1,"Hamalainen, Master. Viljo","male",0.67,1,1,"250649",14.5000,,"S","4",,"Detroit, MI" -2,1,"Hamalainen, Mrs. William (Anna)","female",24,0,2,"250649",14.5000,,"S","4",,"Detroit, MI" -2,0,"Harbeck, Mr. William H","male",44,0,0,"248746",13.0000,,"S",,"35","Seattle, WA / Toledo, OH" -2,1,"Harper, Miss. Annie Jessie ""Nina""","female",6,0,1,"248727",33.0000,,"S","11",,"Denmark Hill, Surrey / Chicago" -2,0,"Harper, Rev. John","male",28,0,1,"248727",33.0000,,"S",,,"Denmark Hill, Surrey / Chicago" -2,1,"Harris, Mr. George","male",62,0,0,"S.W./PP 752",10.5000,,"S","15",,"London" -2,0,"Harris, Mr. Walter","male",30,0,0,"W/C 14208",10.5000,,"S",,,"Walthamstow, England" -2,1,"Hart, Miss. Eva Miriam","female",7,0,2,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" -2,0,"Hart, Mr. Benjamin","male",43,1,1,"F.C.C. 13529",26.2500,,"S",,,"Ilford, Essex / Winnipeg, MB" -2,1,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)","female",45,1,1,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" -2,1,"Herman, Miss. Alice","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" -2,1,"Herman, Miss. Kate","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" -2,0,"Herman, Mr. Samuel","male",49,1,2,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" -2,1,"Herman, Mrs. Samuel (Jane Laver)","female",48,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" -2,1,"Hewlett, Mrs. (Mary D Kingcome) ","female",55,0,0,"248706",16.0000,,"S","13",,"India / Rapid City, SD" -2,0,"Hickman, Mr. Leonard Mark","male",24,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" -2,0,"Hickman, Mr. Lewis","male",32,2,0,"S.O.C. 14879",73.5000,,"S",,"256","West Hampstead, London / Neepawa, MB" -2,0,"Hickman, Mr. Stanley George","male",21,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" -2,0,"Hiltunen, Miss. Marta","female",18,1,1,"250650",13.0000,,"S",,,"Kontiolahti, Finland / Detroit, MI" -2,1,"Hocking, Miss. Ellen ""Nellie""","female",20,2,1,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" -2,0,"Hocking, Mr. Richard George","male",23,2,1,"29104",11.5000,,"S",,,"Cornwall / Akron, OH" -2,0,"Hocking, Mr. Samuel James Metcalfe","male",36,0,0,"242963",13.0000,,"S",,,"Devonport, England" -2,1,"Hocking, Mrs. Elizabeth (Eliza Needs)","female",54,1,3,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" -2,0,"Hodges, Mr. Henry Price","male",50,0,0,"250643",13.0000,,"S",,"149","Southampton" -2,0,"Hold, Mr. Stephen","male",44,1,0,"26707",26.0000,,"S",,,"England / Sacramento, CA" -2,1,"Hold, Mrs. Stephen (Annie Margaret Hill)","female",29,1,0,"26707",26.0000,,"S","10",,"England / Sacramento, CA" -2,0,"Hood, Mr. Ambrose Jr","male",21,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" -2,1,"Hosono, Mr. Masabumi","male",42,0,0,"237798",13.0000,,"S","10",,"Tokyo, Japan" -2,0,"Howard, Mr. Benjamin","male",63,1,0,"24065",26.0000,,"S",,,"Swindon, England" -2,0,"Howard, Mrs. Benjamin (Ellen Truelove Arman)","female",60,1,0,"24065",26.0000,,"S",,,"Swindon, England" -2,0,"Hunt, Mr. George Henry","male",33,0,0,"SCO/W 1585",12.2750,,"S",,,"Philadelphia, PA" -2,1,"Ilett, Miss. Bertha","female",17,0,0,"SO/C 14885",10.5000,,"S",,,"Guernsey" -2,0,"Jacobsohn, Mr. Sidney Samuel","male",42,1,0,"243847",27.0000,,"S",,,"London" -2,1,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)","female",24,2,1,"243847",27.0000,,"S","12",,"London" -2,0,"Jarvis, Mr. John Denzil","male",47,0,0,"237565",15.0000,,"S",,,"North Evington, England" -2,0,"Jefferys, Mr. Clifford Thomas","male",24,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Jefferys, Mr. Ernest Wilfred","male",22,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Jenkin, Mr. Stephen Curnow","male",32,0,0,"C.A. 33111",10.5000,,"S",,,"St Ives, Cornwall / Houghton, MI" -2,1,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)","female",23,0,0,"SC/AH Basle 541",13.7917,"D","C","11",,"New York, NY" -2,0,"Kantor, Mr. Sinai","male",34,1,0,"244367",26.0000,,"S",,"283","Moscow / Bronx, NY" -2,1,"Kantor, Mrs. Sinai (Miriam Sternin)","female",24,1,0,"244367",26.0000,,"S","12",,"Moscow / Bronx, NY" -2,0,"Karnes, Mrs. J Frank (Claire Bennett)","female",22,0,0,"F.C.C. 13534",21.0000,,"S",,,"India / Pittsburgh, PA" -2,1,"Keane, Miss. Nora A","female",,0,0,"226593",12.3500,"E101","Q","10",,"Harrisburg, PA" -2,0,"Keane, Mr. Daniel","male",35,0,0,"233734",12.3500,,"Q",,, -2,1,"Kelly, Mrs. Florence ""Fannie""","female",45,0,0,"223596",13.5000,,"S","9",,"London / New York, NY" -2,0,"Kirkland, Rev. Charles Leonard","male",57,0,0,"219533",12.3500,,"Q",,,"Glasgow / Bangor, ME" -2,0,"Knight, Mr. Robert J","male",,0,0,"239855",0.0000,,"S",,,"Belfast" -2,0,"Kvillner, Mr. Johan Henrik Johannesson","male",31,0,0,"C.A. 18723",10.5000,,"S",,"165","Sweden / Arlington, NJ" -2,0,"Lahtinen, Mrs. William (Anna Sylfven)","female",26,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" -2,0,"Lahtinen, Rev. William","male",30,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" -2,0,"Lamb, Mr. John Joseph","male",,0,0,"240261",10.7083,,"Q",,, -2,1,"Laroche, Miss. Louise","female",1,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" -2,1,"Laroche, Miss. Simonne Marie Anne Andree","female",3,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" -2,0,"Laroche, Mr. Joseph Philippe Lemercier","male",25,1,2,"SC/Paris 2123",41.5792,,"C",,,"Paris / Haiti" -2,1,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)","female",22,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" -2,1,"Lehmann, Miss. Bertha","female",17,0,0,"SC 1748",12.0000,,"C","12",,"Berne, Switzerland / Central City, IA" -2,1,"Leitch, Miss. Jessie Wills","female",,0,0,"248727",33.0000,,"S","11",,"London / Chicago, IL" -2,1,"Lemore, Mrs. (Amelia Milley)","female",34,0,0,"C.A. 34260",10.5000,"F33","S","14",,"Chicago, IL" -2,0,"Levy, Mr. Rene Jacques","male",36,0,0,"SC/Paris 2163",12.8750,"D","C",,,"Montreal, PQ" -2,0,"Leyson, Mr. Robert William Norman","male",24,0,0,"C.A. 29566",10.5000,,"S",,"108", -2,0,"Lingane, Mr. John","male",61,0,0,"235509",12.3500,,"Q",,, -2,0,"Louch, Mr. Charles Alexander","male",50,1,0,"SC/AH 3085",26.0000,,"S",,"121","Weston-Super-Mare, Somerset" -2,1,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)","female",42,1,0,"SC/AH 3085",26.0000,,"S",,,"Weston-Super-Mare, Somerset" -2,0,"Mack, Mrs. (Mary)","female",57,0,0,"S.O./P.P. 3",10.5000,"E77","S",,"52","Southampton / New York, NY" -2,0,"Malachard, Mr. Noel","male",,0,0,"237735",15.0458,"D","C",,,"Paris" -2,1,"Mallet, Master. Andre","male",1,0,2,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" -2,0,"Mallet, Mr. Albert","male",31,1,1,"S.C./PARIS 2079",37.0042,,"C",,,"Paris / Montreal, PQ" -2,1,"Mallet, Mrs. Albert (Antoinette Magnin)","female",24,1,1,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" -2,0,"Mangiavacchi, Mr. Serafino Emilio","male",,0,0,"SC/A.3 2861",15.5792,,"C",,,"New York, NY" -2,0,"Matthews, Mr. William John","male",30,0,0,"28228",13.0000,,"S",,,"St Austall, Cornwall" -2,0,"Maybery, Mr. Frank Hubert","male",40,0,0,"239059",16.0000,,"S",,,"Weston-Super-Mare / Moose Jaw, SK" -2,0,"McCrae, Mr. Arthur Gordon","male",32,0,0,"237216",13.5000,,"S",,"209","Sydney, Australia" -2,0,"McCrie, Mr. James Matthew","male",30,0,0,"233478",13.0000,,"S",,,"Sarnia, ON" -2,0,"McKane, Mr. Peter David","male",46,0,0,"28403",26.0000,,"S",,,"Rochester, NY" -2,1,"Mellinger, Miss. Madeleine Violet","female",13,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" -2,1,"Mellinger, Mrs. (Elizabeth Anne Maidment)","female",41,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" -2,1,"Mellors, Mr. William John","male",19,0,0,"SW/PP 751",10.5000,,"S","B",,"Chelsea, London" -2,0,"Meyer, Mr. August","male",39,0,0,"248723",13.0000,,"S",,,"Harrow-on-the-Hill, Middlesex" -2,0,"Milling, Mr. Jacob Christian","male",48,0,0,"234360",13.0000,,"S",,"271","Copenhagen, Denmark" -2,0,"Mitchell, Mr. Henry Michael","male",70,0,0,"C.A. 24580",10.5000,,"S",,,"Guernsey / Montclair, NJ and/or Toledo, Ohio" -2,0,"Montvila, Rev. Juozas","male",27,0,0,"211536",13.0000,,"S",,,"Worcester, MA" -2,0,"Moraweck, Dr. Ernest","male",54,0,0,"29011",14.0000,,"S",,,"Frankfort, KY" -2,0,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")","male",39,0,0,"250655",26.0000,,"S",,, -2,0,"Mudd, Mr. Thomas Charles","male",16,0,0,"S.O./P.P. 3",10.5000,,"S",,,"Halesworth, England" -2,0,"Myles, Mr. Thomas Francis","male",62,0,0,"240276",9.6875,,"Q",,,"Cambridge, MA" -2,0,"Nasser, Mr. Nicholas","male",32.5,1,0,"237736",30.0708,,"C",,"43","New York, NY" -2,1,"Nasser, Mrs. Nicholas (Adele Achem)","female",14,1,0,"237736",30.0708,,"C",,,"New York, NY" -2,1,"Navratil, Master. Edmond Roger","male",2,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" -2,1,"Navratil, Master. Michel M","male",3,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" -2,0,"Navratil, Mr. Michel (""Louis M Hoffman"")","male",36.5,0,2,"230080",26.0000,"F2","S",,"15","Nice, France" -2,0,"Nesson, Mr. Israel","male",26,0,0,"244368",13.0000,"F2","S",,,"Boston, MA" -2,0,"Nicholls, Mr. Joseph Charles","male",19,1,1,"C.A. 33112",36.7500,,"S",,"101","Cornwall / Hancock, MI" -2,0,"Norman, Mr. Robert Douglas","male",28,0,0,"218629",13.5000,,"S",,"287","Glasgow" -2,1,"Nourney, Mr. Alfred (""Baron von Drachstedt"")","male",20,0,0,"SC/PARIS 2166",13.8625,"D38","C","7",,"Cologne, Germany" -2,1,"Nye, Mrs. (Elizabeth Ramell)","female",29,0,0,"C.A. 29395",10.5000,"F33","S","11",,"Folkstone, Kent / New York, NY" -2,0,"Otter, Mr. Richard","male",39,0,0,"28213",13.0000,,"S",,,"Middleburg Heights, OH" -2,1,"Oxenham, Mr. Percy Thomas","male",22,0,0,"W./C. 14260",10.5000,,"S","13",,"Pondersend, England / New Durham, NJ" -2,1,"Padro y Manent, Mr. Julian","male",,0,0,"SC/PARIS 2146",13.8625,,"C","9",,"Spain / Havana, Cuba" -2,0,"Pain, Dr. Alfred","male",23,0,0,"244278",10.5000,,"S",,,"Hamilton, ON" -2,1,"Pallas y Castello, Mr. Emilio","male",29,0,0,"SC/PARIS 2147",13.8583,,"C","9",,"Spain / Havana, Cuba" -2,0,"Parker, Mr. Clifford Richard","male",28,0,0,"SC 14888",10.5000,,"S",,,"St Andrews, Guernsey" -2,0,"Parkes, Mr. Francis ""Frank""","male",,0,0,"239853",0.0000,,"S",,,"Belfast" -2,1,"Parrish, Mrs. (Lutie Davis)","female",50,0,1,"230433",26.0000,,"S","12",,"Woodford County, KY" -2,0,"Pengelly, Mr. Frederick William","male",19,0,0,"28665",10.5000,,"S",,,"Gunnislake, England / Butte, MT" -2,0,"Pernot, Mr. Rene","male",,0,0,"SC/PARIS 2131",15.0500,,"C",,, -2,0,"Peruschitz, Rev. Joseph Maria","male",41,0,0,"237393",13.0000,,"S",,, -2,1,"Phillips, Miss. Alice Frances Louisa","female",21,0,1,"S.O./P.P. 2",21.0000,,"S","12",,"Ilfracombe, Devon" -2,1,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")","female",19,0,0,"250655",26.0000,,"S","11",,"Worcester, England" -2,0,"Phillips, Mr. Escott Robert","male",43,0,1,"S.O./P.P. 2",21.0000,,"S",,,"Ilfracombe, Devon" -2,1,"Pinsky, Mrs. (Rosa)","female",32,0,0,"234604",13.0000,,"S","9",,"Russia" -2,0,"Ponesell, Mr. Martin","male",34,0,0,"250647",13.0000,,"S",,,"Denmark / New York, NY" -2,1,"Portaluppi, Mr. Emilio Ilario Giuseppe","male",30,0,0,"C.A. 34644",12.7375,,"C","14",,"Milford, NH" -2,0,"Pulbaum, Mr. Franz","male",27,0,0,"SC/PARIS 2168",15.0333,,"C",,,"Paris" -2,1,"Quick, Miss. Phyllis May","female",2,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" -2,1,"Quick, Miss. Winifred Vera","female",8,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" -2,1,"Quick, Mrs. Frederick Charles (Jane Richards)","female",33,0,2,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" -2,0,"Reeves, Mr. David","male",36,0,0,"C.A. 17248",10.5000,,"S",,,"Brighton, Sussex" -2,0,"Renouf, Mr. Peter Henry","male",34,1,0,"31027",21.0000,,"S","12",,"Elizabeth, NJ" -2,1,"Renouf, Mrs. Peter Henry (Lillian Jefferys)","female",30,3,0,"31027",21.0000,,"S",,,"Elizabeth, NJ" -2,1,"Reynaldo, Ms. Encarnacion","female",28,0,0,"230434",13.0000,,"S","9",,"Spain" -2,0,"Richard, Mr. Emile","male",23,0,0,"SC/PARIS 2133",15.0458,,"C",,,"Paris / Montreal, PQ" -2,1,"Richards, Master. George Sibley","male",0.83,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" -2,1,"Richards, Master. William Rowe","male",3,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" -2,1,"Richards, Mrs. Sidney (Emily Hocking)","female",24,2,3,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" -2,1,"Ridsdale, Miss. Lucy","female",50,0,0,"W./C. 14258",10.5000,,"S","13",,"London, England / Marietta, Ohio and Milwaukee, WI" -2,0,"Rogers, Mr. Reginald Harry","male",19,0,0,"28004",10.5000,,"S",,, -2,1,"Rugg, Miss. Emily","female",21,0,0,"C.A. 31026",10.5000,,"S","12",,"Guernsey / Wilmington, DE" -2,0,"Schmidt, Mr. August","male",26,0,0,"248659",13.0000,,"S",,,"Newark, NJ" -2,0,"Sedgwick, Mr. Charles Frederick Waddington","male",25,0,0,"244361",13.0000,,"S",,,"Liverpool" -2,0,"Sharp, Mr. Percival James R","male",27,0,0,"244358",26.0000,,"S",,,"Hornsey, England" -2,1,"Shelley, Mrs. William (Imanita Parrish Hall)","female",25,0,1,"230433",26.0000,,"S","12",,"Deer Lodge, MT" -2,1,"Silven, Miss. Lyyli Karoliina","female",18,0,2,"250652",13.0000,,"S","16",,"Finland / Minneapolis, MN" -2,1,"Sincock, Miss. Maude","female",20,0,0,"C.A. 33112",36.7500,,"S","11",,"Cornwall / Hancock, MI" -2,1,"Sinkkonen, Miss. Anna","female",30,0,0,"250648",13.0000,,"S","10",,"Finland / Washington, DC" -2,0,"Sjostedt, Mr. Ernst Adolf","male",59,0,0,"237442",13.5000,,"S",,,"Sault St Marie, ON" -2,1,"Slayter, Miss. Hilda Mary","female",30,0,0,"234818",12.3500,,"Q","13",,"Halifax, NS" -2,0,"Slemen, Mr. Richard James","male",35,0,0,"28206",10.5000,,"S",,,"Cornwall" -2,1,"Smith, Miss. Marion Elsie","female",40,0,0,"31418",13.0000,,"S","9",, -2,0,"Sobey, Mr. Samuel James Hayden","male",25,0,0,"C.A. 29178",13.0000,,"S",,,"Cornwall / Houghton, MI" -2,0,"Stanton, Mr. Samuel Ward","male",41,0,0,"237734",15.0458,,"C",,,"New York, NY" -2,0,"Stokes, Mr. Philip Joseph","male",25,0,0,"F.C.C. 13540",10.5000,,"S",,"81","Catford, Kent / Detroit, MI" -2,0,"Swane, Mr. George","male",18.5,0,0,"248734",13.0000,"F","S",,"294", -2,0,"Sweet, Mr. George Frederick","male",14,0,0,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" -2,1,"Toomey, Miss. Ellen","female",50,0,0,"F.C.C. 13531",10.5000,,"S","9",,"Indianapolis, IN" -2,0,"Troupiansky, Mr. Moses Aaron","male",23,0,0,"233639",13.0000,,"S",,, -2,1,"Trout, Mrs. William H (Jessie L)","female",28,0,0,"240929",12.6500,,"S",,,"Columbus, OH" -2,1,"Troutt, Miss. Edwina Celia ""Winnie""","female",27,0,0,"34218",10.5000,"E101","S","16",,"Bath, England / Massachusetts" -2,0,"Turpin, Mr. William John Robert","male",29,1,0,"11668",21.0000,,"S",,,"Plymouth, England" -2,0,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)","female",27,1,0,"11668",21.0000,,"S",,,"Plymouth, England" -2,0,"Veal, Mr. James","male",40,0,0,"28221",13.0000,,"S",,,"Barre, Co Washington, VT" -2,1,"Walcroft, Miss. Nellie","female",31,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" -2,0,"Ware, Mr. John James","male",30,1,0,"CA 31352",21.0000,,"S",,,"Bristol, England / New Britain, CT" -2,0,"Ware, Mr. William Jeffery","male",23,1,0,"28666",10.5000,,"S",,, -2,1,"Ware, Mrs. John James (Florence Louise Long)","female",31,0,0,"CA 31352",21.0000,,"S","10",,"Bristol, England / New Britain, CT" -2,0,"Watson, Mr. Ennis Hastings","male",,0,0,"239856",0.0000,,"S",,,"Belfast" -2,1,"Watt, Miss. Bertha J","female",12,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" -2,1,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)","female",40,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" -2,1,"Webber, Miss. Susan","female",32.5,0,0,"27267",13.0000,"E101","S","12",,"England / Hartford, CT" -2,0,"Weisz, Mr. Leopold","male",27,1,0,"228414",26.0000,,"S",,"293","Bromsgrove, England / Montreal, PQ" -2,1,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)","female",29,1,0,"228414",26.0000,,"S","10",,"Bromsgrove, England / Montreal, PQ" -2,1,"Wells, Master. Ralph Lester","male",2,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" -2,1,"Wells, Miss. Joan","female",4,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" -2,1,"Wells, Mrs. Arthur Henry (""Addie"" Dart Trevaskis)","female",29,0,2,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" -2,1,"West, Miss. Barbara J","female",0.92,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" -2,1,"West, Miss. Constance Mirium","female",5,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" -2,0,"West, Mr. Edwy Arthur","male",36,1,2,"C.A. 34651",27.7500,,"S",,,"Bournmouth, England" -2,1,"West, Mrs. Edwy Arthur (Ada Mary Worth)","female",33,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" -2,0,"Wheadon, Mr. Edward H","male",66,0,0,"C.A. 24579",10.5000,,"S",,,"Guernsey, England / Edgewood, RI" -2,0,"Wheeler, Mr. Edwin ""Frederick""","male",,0,0,"SC/PARIS 2159",12.8750,,"S",,, -2,1,"Wilhelms, Mr. Charles","male",31,0,0,"244270",13.0000,,"S","9",,"London, England" -2,1,"Williams, Mr. Charles Eugene","male",,0,0,"244373",13.0000,,"S","14",,"Harrow, England" -2,1,"Wright, Miss. Marion","female",26,0,0,"220844",13.5000,,"S","9",,"Yoevil, England / Cottage Grove, OR" -2,0,"Yrois, Miss. Henriette (""Mrs Harbeck"")","female",24,0,0,"248747",13.0000,,"S",,,"Paris" -3,0,"Abbing, Mr. Anthony","male",42,0,0,"C.A. 5547",7.5500,,"S",,, -3,0,"Abbott, Master. Eugene Joseph","male",13,0,2,"C.A. 2673",20.2500,,"S",,,"East Providence, RI" -3,0,"Abbott, Mr. Rossmore Edward","male",16,1,1,"C.A. 2673",20.2500,,"S",,"190","East Providence, RI" -3,1,"Abbott, Mrs. Stanton (Rosa Hunt)","female",35,1,1,"C.A. 2673",20.2500,,"S","A",,"East Providence, RI" -3,1,"Abelseth, Miss. Karen Marie","female",16,0,0,"348125",7.6500,,"S","16",,"Norway Los Angeles, CA" -3,1,"Abelseth, Mr. Olaus Jorgensen","male",25,0,0,"348122",7.6500,"F G63","S","A",,"Perkins County, SD" -3,1,"Abrahamsson, Mr. Abraham August Johannes","male",20,0,0,"SOTON/O2 3101284",7.9250,,"S","15",,"Taalintehdas, Finland Hoboken, NJ" -3,1,"Abrahim, Mrs. Joseph (Sophie Halaut Easu)","female",18,0,0,"2657",7.2292,,"C","C",,"Greensburg, PA" -3,0,"Adahl, Mr. Mauritz Nils Martin","male",30,0,0,"C 7076",7.2500,,"S",,"72","Asarum, Sweden Brooklyn, NY" -3,0,"Adams, Mr. John","male",26,0,0,"341826",8.0500,,"S",,"103","Bournemouth, England" -3,0,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)","female",40,1,0,"7546",9.4750,,"S",,,"Sweden Akeley, MN" -3,1,"Aks, Master. Philip Frank","male",0.83,0,1,"392091",9.3500,,"S","11",,"London, England Norfolk, VA" -3,1,"Aks, Mrs. Sam (Leah Rosen)","female",18,0,1,"392091",9.3500,,"S","13",,"London, England Norfolk, VA" -3,1,"Albimona, Mr. Nassef Cassem","male",26,0,0,"2699",18.7875,,"C","15",,"Syria Fredericksburg, VA" -3,0,"Alexander, Mr. William","male",26,0,0,"3474",7.8875,,"S",,,"England Albion, NY" -3,0,"Alhomaki, Mr. Ilmari Rudolf","male",20,0,0,"SOTON/O2 3101287",7.9250,,"S",,,"Salo, Finland Astoria, OR" -3,0,"Ali, Mr. Ahmed","male",24,0,0,"SOTON/O.Q. 3101311",7.0500,,"S",,, -3,0,"Ali, Mr. William","male",25,0,0,"SOTON/O.Q. 3101312",7.0500,,"S",,"79","Argentina" -3,0,"Allen, Mr. William Henry","male",35,0,0,"373450",8.0500,,"S",,,"Lower Clapton, Middlesex or Erdington, Birmingham" -3,0,"Allum, Mr. Owen George","male",18,0,0,"2223",8.3000,,"S",,"259","Windsor, England New York, NY" -3,0,"Andersen, Mr. Albert Karvin","male",32,0,0,"C 4001",22.5250,,"S",,"260","Bergen, Norway" -3,1,"Andersen-Jensen, Miss. Carla Christine Nielsine","female",19,1,0,"350046",7.8542,,"S","16",, -3,0,"Andersson, Master. Sigvard Harald Elias","male",4,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Miss. Ebba Iris Alfrida","female",6,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Miss. Ellis Anna Maria","female",2,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,1,"Andersson, Miss. Erna Alexandra","female",17,4,2,"3101281",7.9250,,"S","D",,"Ruotsinphyhtaa, Finland New York, NY" -3,0,"Andersson, Miss. Ida Augusta Margareta","female",38,4,2,"347091",7.7750,,"S",,,"Vadsbro, Sweden Ministee, MI" -3,0,"Andersson, Miss. Ingeborg Constanzia","female",9,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Miss. Sigrid Elisabeth","female",11,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Mr. Anders Johan","male",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,1,"Andersson, Mr. August Edvard (""Wennerstrom"")","male",27,0,0,"350043",7.7958,,"S","A",, -3,0,"Andersson, Mr. Johan Samuel","male",26,0,0,"347075",7.7750,,"S",,,"Hartford, CT" -3,0,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)","female",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andreasson, Mr. Paul Edvin","male",20,0,0,"347466",7.8542,,"S",,,"Sweden Chicago, IL" -3,0,"Angheloff, Mr. Minko","male",26,0,0,"349202",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Arnold-Franchi, Mr. Josef","male",25,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" -3,0,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)","female",18,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" -3,0,"Aronsson, Mr. Ernst Axel Algot","male",24,0,0,"349911",7.7750,,"S",,,"Sweden Joliet, IL" -3,0,"Asim, Mr. Adola","male",35,0,0,"SOTON/O.Q. 3101310",7.0500,,"S",,, -3,0,"Asplund, Master. Carl Edgar","male",5,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" -3,0,"Asplund, Master. Clarence Gustaf Hugo","male",9,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" -3,1,"Asplund, Master. Edvin Rojj Felix","male",3,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" -3,0,"Asplund, Master. Filip Oscar","male",13,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" -3,1,"Asplund, Miss. Lillian Gertrud","female",5,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" -3,0,"Asplund, Mr. Carl Oscar Vilhelm Gustafsson","male",40,1,5,"347077",31.3875,,"S",,"142","Sweden Worcester, MA" -3,1,"Asplund, Mr. Johan Charles","male",23,0,0,"350054",7.7958,,"S","13",,"Oskarshamn, Sweden Minneapolis, MN" -3,1,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)","female",38,1,5,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" -3,1,"Assaf Khalil, Mrs. Mariana (""Miriam"")","female",45,0,0,"2696",7.2250,,"C","C",,"Ottawa, ON" -3,0,"Assaf, Mr. Gerios","male",21,0,0,"2692",7.2250,,"C",,,"Ottawa, ON" -3,0,"Assam, Mr. Ali","male",23,0,0,"SOTON/O.Q. 3101309",7.0500,,"S",,, -3,0,"Attalah, Miss. Malake","female",17,0,0,"2627",14.4583,,"C",,, -3,0,"Attalah, Mr. Sleiman","male",30,0,0,"2694",7.2250,,"C",,,"Ottawa, ON" -3,0,"Augustsson, Mr. Albert","male",23,0,0,"347468",7.8542,,"S",,,"Krakoryd, Sweden Bloomington, IL" -3,1,"Ayoub, Miss. Banoura","female",13,0,0,"2687",7.2292,,"C","C",,"Syria Youngstown, OH" -3,0,"Baccos, Mr. Raffull","male",20,0,0,"2679",7.2250,,"C",,, -3,0,"Backstrom, Mr. Karl Alfred","male",32,1,0,"3101278",15.8500,,"S","D",,"Ruotsinphytaa, Finland New York, NY" -3,1,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)","female",33,3,0,"3101278",15.8500,,"S",,,"Ruotsinphytaa, Finland New York, NY" -3,1,"Baclini, Miss. Eugenie","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Baclini, Miss. Helene Barbara","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Baclini, Miss. Marie Catherine","female",5,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Baclini, Mrs. Solomon (Latifa Qurban)","female",24,0,3,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Badman, Miss. Emily Louisa","female",18,0,0,"A/4 31416",8.0500,,"S","C",,"London Skanteales, NY" -3,0,"Badt, Mr. Mohamed","male",40,0,0,"2623",7.2250,,"C",,, -3,0,"Balkic, Mr. Cerin","male",26,0,0,"349248",7.8958,,"S",,, -3,1,"Barah, Mr. Hanna Assi","male",20,0,0,"2663",7.2292,,"C","15",, -3,0,"Barbara, Miss. Saiide","female",18,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" -3,0,"Barbara, Mrs. (Catherine David)","female",45,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" -3,0,"Barry, Miss. Julia","female",27,0,0,"330844",7.8792,,"Q",,,"New York, NY" -3,0,"Barton, Mr. David John","male",22,0,0,"324669",8.0500,,"S",,,"England New York, NY" -3,0,"Beavan, Mr. William Thomas","male",19,0,0,"323951",8.0500,,"S",,,"England" -3,0,"Bengtsson, Mr. John Viktor","male",26,0,0,"347068",7.7750,,"S",,,"Krakudden, Sweden Moune, IL" -3,0,"Berglund, Mr. Karl Ivar Sven","male",22,0,0,"PP 4348",9.3500,,"S",,,"Tranvik, Finland New York" -3,0,"Betros, Master. Seman","male",,0,0,"2622",7.2292,,"C",,, -3,0,"Betros, Mr. Tannous","male",20,0,0,"2648",4.0125,,"C",,,"Syria" -3,1,"Bing, Mr. Lee","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" -3,0,"Birkeland, Mr. Hans Martin Monsen","male",21,0,0,"312992",7.7750,,"S",,,"Brennes, Norway New York" -3,0,"Bjorklund, Mr. Ernst Herbert","male",18,0,0,"347090",7.7500,,"S",,,"Stockholm, Sweden New York" -3,0,"Bostandyeff, Mr. Guentcho","male",26,0,0,"349224",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Boulos, Master. Akar","male",6,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" -3,0,"Boulos, Miss. Nourelain","female",9,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" -3,0,"Boulos, Mr. Hanna","male",,0,0,"2664",7.2250,,"C",,,"Syria" -3,0,"Boulos, Mrs. Joseph (Sultana)","female",,0,2,"2678",15.2458,,"C",,,"Syria Kent, ON" -3,0,"Bourke, Miss. Mary","female",,0,2,"364848",7.7500,,"Q",,,"Ireland Chicago, IL" -3,0,"Bourke, Mr. John","male",40,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" -3,0,"Bourke, Mrs. John (Catherine)","female",32,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" -3,0,"Bowen, Mr. David John ""Dai""","male",21,0,0,"54636",16.1000,,"S",,,"Treherbert, Cardiff, Wales" -3,1,"Bradley, Miss. Bridget Delia","female",22,0,0,"334914",7.7250,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland Glens Falls, NY" -3,0,"Braf, Miss. Elin Ester Maria","female",20,0,0,"347471",7.8542,,"S",,,"Medeltorp, Sweden Chicago, IL" -3,0,"Braund, Mr. Lewis Richard","male",29,1,0,"3460",7.0458,,"S",,,"Bridgerule, Devon" -3,0,"Braund, Mr. Owen Harris","male",22,1,0,"A/5 21171",7.2500,,"S",,,"Bridgerule, Devon" -3,0,"Brobeck, Mr. Karl Rudolf","male",22,0,0,"350045",7.7958,,"S",,,"Sweden Worcester, MA" -3,0,"Brocklebank, Mr. William Alfred","male",35,0,0,"364512",8.0500,,"S",,,"Broomfield, Chelmsford, England" -3,0,"Buckley, Miss. Katherine","female",18.5,0,0,"329944",7.2833,,"Q",,"299","Co Cork, Ireland Roxbury, MA" -3,1,"Buckley, Mr. Daniel","male",21,0,0,"330920",7.8208,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland New York, NY" -3,0,"Burke, Mr. Jeremiah","male",19,0,0,"365222",6.7500,,"Q",,,"Co Cork, Ireland Charlestown, MA" -3,0,"Burns, Miss. Mary Delia","female",18,0,0,"330963",7.8792,,"Q",,,"Co Sligo, Ireland New York, NY" -3,0,"Cacic, Miss. Manda","female",21,0,0,"315087",8.6625,,"S",,, -3,0,"Cacic, Miss. Marija","female",30,0,0,"315084",8.6625,,"S",,, -3,0,"Cacic, Mr. Jego Grga","male",18,0,0,"315091",8.6625,,"S",,, -3,0,"Cacic, Mr. Luka","male",38,0,0,"315089",8.6625,,"S",,,"Croatia" -3,0,"Calic, Mr. Jovo","male",17,0,0,"315093",8.6625,,"S",,, -3,0,"Calic, Mr. Petar","male",17,0,0,"315086",8.6625,,"S",,, -3,0,"Canavan, Miss. Mary","female",21,0,0,"364846",7.7500,,"Q",,, -3,0,"Canavan, Mr. Patrick","male",21,0,0,"364858",7.7500,,"Q",,,"Ireland Philadelphia, PA" -3,0,"Cann, Mr. Ernest Charles","male",21,0,0,"A./5. 2152",8.0500,,"S",,, -3,0,"Caram, Mr. Joseph","male",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" -3,0,"Caram, Mrs. Joseph (Maria Elias)","female",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" -3,0,"Carlsson, Mr. August Sigfrid","male",28,0,0,"350042",7.7958,,"S",,,"Dagsas, Sweden Fower, MN" -3,0,"Carlsson, Mr. Carl Robert","male",24,0,0,"350409",7.8542,,"S",,,"Goteborg, Sweden Huntley, IL" -3,1,"Carr, Miss. Helen ""Ellen""","female",16,0,0,"367231",7.7500,,"Q","16",,"Co Longford, Ireland New York, NY" -3,0,"Carr, Miss. Jeannie","female",37,0,0,"368364",7.7500,,"Q",,,"Co Sligo, Ireland Hartford, CT" -3,0,"Carver, Mr. Alfred John","male",28,0,0,"392095",7.2500,,"S",,,"St Denys, Southampton, Hants" -3,0,"Celotti, Mr. Francesco","male",24,0,0,"343275",8.0500,,"S",,,"London" -3,0,"Charters, Mr. David","male",21,0,0,"A/5. 13032",7.7333,,"Q",,,"Ireland New York, NY" -3,1,"Chip, Mr. Chang","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" -3,0,"Christmann, Mr. Emil","male",29,0,0,"343276",8.0500,,"S",,, -3,0,"Chronopoulos, Mr. Apostolos","male",26,1,0,"2680",14.4542,,"C",,,"Greece" -3,0,"Chronopoulos, Mr. Demetrios","male",18,1,0,"2680",14.4542,,"C",,,"Greece" -3,0,"Coelho, Mr. Domingos Fernandeo","male",20,0,0,"SOTON/O.Q. 3101307",7.0500,,"S",,,"Portugal" -3,1,"Cohen, Mr. Gurshon ""Gus""","male",18,0,0,"A/5 3540",8.0500,,"S","12",,"London Brooklyn, NY" -3,0,"Colbert, Mr. Patrick","male",24,0,0,"371109",7.2500,,"Q",,,"Co Limerick, Ireland Sherbrooke, PQ" -3,0,"Coleff, Mr. Peju","male",36,0,0,"349210",7.4958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Coleff, Mr. Satio","male",24,0,0,"349209",7.4958,,"S",,, -3,0,"Conlon, Mr. Thomas Henry","male",31,0,0,"21332",7.7333,,"Q",,,"Philadelphia, PA" -3,0,"Connaghton, Mr. Michael","male",31,0,0,"335097",7.7500,,"Q",,,"Ireland Brooklyn, NY" -3,1,"Connolly, Miss. Kate","female",22,0,0,"370373",7.7500,,"Q","13",,"Ireland" -3,0,"Connolly, Miss. Kate","female",30,0,0,"330972",7.6292,,"Q",,,"Ireland" -3,0,"Connors, Mr. Patrick","male",70.5,0,0,"370369",7.7500,,"Q",,"171", -3,0,"Cook, Mr. Jacob","male",43,0,0,"A/5 3536",8.0500,,"S",,, -3,0,"Cor, Mr. Bartol","male",35,0,0,"349230",7.8958,,"S",,,"Austria" -3,0,"Cor, Mr. Ivan","male",27,0,0,"349229",7.8958,,"S",,,"Austria" -3,0,"Cor, Mr. Liudevit","male",19,0,0,"349231",7.8958,,"S",,,"Austria" -3,0,"Corn, Mr. Harry","male",30,0,0,"SOTON/OQ 392090",8.0500,,"S",,,"London" -3,1,"Coutts, Master. Eden Leslie ""Neville""","male",9,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" -3,1,"Coutts, Master. William Loch ""William""","male",3,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" -3,1,"Coutts, Mrs. William (Winnie ""Minnie"" Treanor)","female",36,0,2,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" -3,0,"Coxon, Mr. Daniel","male",59,0,0,"364500",7.2500,,"S",,,"Merrill, WI" -3,0,"Crease, Mr. Ernest James","male",19,0,0,"S.P. 3464",8.1583,,"S",,,"Bristol, England Cleveland, OH" -3,1,"Cribb, Miss. Laura Alice","female",17,0,1,"371362",16.1000,,"S","12",,"Bournemouth, England Newark, NJ" -3,0,"Cribb, Mr. John Hatfield","male",44,0,1,"371362",16.1000,,"S",,,"Bournemouth, England Newark, NJ" -3,0,"Culumovic, Mr. Jeso","male",17,0,0,"315090",8.6625,,"S",,,"Austria-Hungary" -3,0,"Daher, Mr. Shedid","male",22.5,0,0,"2698",7.2250,,"C",,"9", -3,1,"Dahl, Mr. Karl Edwart","male",45,0,0,"7598",8.0500,,"S","15",,"Australia Fingal, ND" -3,0,"Dahlberg, Miss. Gerda Ulrika","female",22,0,0,"7552",10.5167,,"S",,,"Norrlot, Sweden Chicago, IL" -3,0,"Dakic, Mr. Branko","male",19,0,0,"349228",10.1708,,"S",,,"Austria" -3,1,"Daly, Miss. Margaret Marcella ""Maggie""","female",30,0,0,"382650",6.9500,,"Q","15",,"Co Athlone, Ireland New York, NY" -3,1,"Daly, Mr. Eugene Patrick","male",29,0,0,"382651",7.7500,,"Q","13 15 B",,"Co Athlone, Ireland New York, NY" -3,0,"Danbom, Master. Gilbert Sigvard Emanuel","male",0.33,0,2,"347080",14.4000,,"S",,,"Stanton, IA" -3,0,"Danbom, Mr. Ernst Gilbert","male",34,1,1,"347080",14.4000,,"S",,"197","Stanton, IA" -3,0,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)","female",28,1,1,"347080",14.4000,,"S",,,"Stanton, IA" -3,0,"Danoff, Mr. Yoto","male",27,0,0,"349219",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Dantcheff, Mr. Ristiu","male",25,0,0,"349203",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Davies, Mr. Alfred J","male",24,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" -3,0,"Davies, Mr. Evan","male",22,0,0,"SC/A4 23568",8.0500,,"S",,, -3,0,"Davies, Mr. John Samuel","male",21,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" -3,0,"Davies, Mr. Joseph","male",17,2,0,"A/4 48873",8.0500,,"S",,,"West Bromwich, England Pontiac, MI" -3,0,"Davison, Mr. Thomas Henry","male",,1,0,"386525",16.1000,,"S",,,"Liverpool, England Bedford, OH" -3,1,"Davison, Mrs. Thomas Henry (Mary E Finck)","female",,1,0,"386525",16.1000,,"S","16",,"Liverpool, England Bedford, OH" -3,1,"de Messemaeker, Mr. Guillaume Joseph","male",36.5,1,0,"345572",17.4000,,"S","15",,"Tampico, MT" -3,1,"de Messemaeker, Mrs. Guillaume Joseph (Emma)","female",36,1,0,"345572",17.4000,,"S","13",,"Tampico, MT" -3,1,"de Mulder, Mr. Theodore","male",30,0,0,"345774",9.5000,,"S","11",,"Belgium Detroit, MI" -3,0,"de Pelsmaeker, Mr. Alfons","male",16,0,0,"345778",9.5000,,"S",,, -3,1,"Dean, Master. Bertram Vere","male",1,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" -3,1,"Dean, Miss. Elizabeth Gladys ""Millvina""","female",0.17,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" -3,0,"Dean, Mr. Bertram Frank","male",26,1,2,"C.A. 2315",20.5750,,"S",,,"Devon, England Wichita, KS" -3,1,"Dean, Mrs. Bertram (Eva Georgetta Light)","female",33,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" -3,0,"Delalic, Mr. Redjo","male",25,0,0,"349250",7.8958,,"S",,, -3,0,"Demetri, Mr. Marinko","male",,0,0,"349238",7.8958,,"S",,, -3,0,"Denkoff, Mr. Mitto","male",,0,0,"349225",7.8958,,"S",,,"Bulgaria Coon Rapids, IA" -3,0,"Dennis, Mr. Samuel","male",22,0,0,"A/5 21172",7.2500,,"S",,, -3,0,"Dennis, Mr. William","male",36,0,0,"A/5 21175",7.2500,,"S",,, -3,1,"Devaney, Miss. Margaret Delia","female",19,0,0,"330958",7.8792,,"Q","C",,"Kilmacowen, Co Sligo, Ireland New York, NY" -3,0,"Dika, Mr. Mirko","male",17,0,0,"349232",7.8958,,"S",,, -3,0,"Dimic, Mr. Jovan","male",42,0,0,"315088",8.6625,,"S",,, -3,0,"Dintcheff, Mr. Valtcho","male",43,0,0,"349226",7.8958,,"S",,, -3,0,"Doharr, Mr. Tannous","male",,0,0,"2686",7.2292,,"C",,, -3,0,"Dooley, Mr. Patrick","male",32,0,0,"370376",7.7500,,"Q",,,"Ireland New York, NY" -3,1,"Dorking, Mr. Edward Arthur","male",19,0,0,"A/5. 10482",8.0500,,"S","B",,"England Oglesby, IL" -3,1,"Dowdell, Miss. Elizabeth","female",30,0,0,"364516",12.4750,,"S","13",,"Union Hill, NJ" -3,0,"Doyle, Miss. Elizabeth","female",24,0,0,"368702",7.7500,,"Q",,,"Ireland New York, NY" -3,1,"Drapkin, Miss. Jennie","female",23,0,0,"SOTON/OQ 392083",8.0500,,"S",,,"London New York, NY" -3,0,"Drazenoic, Mr. Jozef","male",33,0,0,"349241",7.8958,,"C",,"51","Austria Niagara Falls, NY" -3,0,"Duane, Mr. Frank","male",65,0,0,"336439",7.7500,,"Q",,, -3,1,"Duquemin, Mr. Joseph","male",24,0,0,"S.O./P.P. 752",7.5500,,"S","D",,"England Albion, NY" -3,0,"Dyker, Mr. Adolf Fredrik","male",23,1,0,"347072",13.9000,,"S",,,"West Haven, CT" -3,1,"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)","female",22,1,0,"347072",13.9000,,"S","16",,"West Haven, CT" -3,0,"Edvardsson, Mr. Gustaf Hjalmar","male",18,0,0,"349912",7.7750,,"S",,,"Tofta, Sweden Joliet, IL" -3,0,"Eklund, Mr. Hans Linus","male",16,0,0,"347074",7.7750,,"S",,,"Karberg, Sweden Jerome Junction, AZ" -3,0,"Ekstrom, Mr. Johan","male",45,0,0,"347061",6.9750,,"S",,,"Effington Rut, SD" -3,0,"Elias, Mr. Dibo","male",,0,0,"2674",7.2250,,"C",,, -3,0,"Elias, Mr. Joseph","male",39,0,2,"2675",7.2292,,"C",,,"Syria Ottawa, ON" -3,0,"Elias, Mr. Joseph Jr","male",17,1,1,"2690",7.2292,,"C",,, -3,0,"Elias, Mr. Tannous","male",15,1,1,"2695",7.2292,,"C",,,"Syria" -3,0,"Elsbury, Mr. William James","male",47,0,0,"A/5 3902",7.2500,,"S",,,"Illinois, USA" -3,1,"Emanuel, Miss. Virginia Ethel","female",5,0,0,"364516",12.4750,,"S","13",,"New York, NY" -3,0,"Emir, Mr. Farred Chehab","male",,0,0,"2631",7.2250,,"C",,, -3,0,"Everett, Mr. Thomas James","male",40.5,0,0,"C.A. 6212",15.1000,,"S",,"187", -3,0,"Farrell, Mr. James","male",40.5,0,0,"367232",7.7500,,"Q",,"68","Aughnacliff, Co Longford, Ireland New York, NY" -3,1,"Finoli, Mr. Luigi","male",,0,0,"SOTON/O.Q. 3101308",7.0500,,"S","15",,"Italy Philadelphia, PA" -3,0,"Fischer, Mr. Eberhard Thelander","male",18,0,0,"350036",7.7958,,"S",,, -3,0,"Fleming, Miss. Honora","female",,0,0,"364859",7.7500,,"Q",,, -3,0,"Flynn, Mr. James","male",,0,0,"364851",7.7500,,"Q",,, -3,0,"Flynn, Mr. John","male",,0,0,"368323",6.9500,,"Q",,, -3,0,"Foley, Mr. Joseph","male",26,0,0,"330910",7.8792,,"Q",,,"Ireland Chicago, IL" -3,0,"Foley, Mr. William","male",,0,0,"365235",7.7500,,"Q",,,"Ireland" -3,1,"Foo, Mr. Choong","male",,0,0,"1601",56.4958,,"S","13",,"Hong Kong New York, NY" -3,0,"Ford, Miss. Doolina Margaret ""Daisy""","female",21,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Miss. Robina Maggie ""Ruby""","female",9,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Mr. Arthur","male",,0,0,"A/5 1478",8.0500,,"S",,,"Bridgwater, Somerset, England" -3,0,"Ford, Mr. Edward Watson","male",18,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Mr. William Neal","male",16,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Mrs. Edward (Margaret Ann Watson)","female",48,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Fox, Mr. Patrick","male",,0,0,"368573",7.7500,,"Q",,,"Ireland New York, NY" -3,0,"Franklin, Mr. Charles (Charles Fardon)","male",,0,0,"SOTON/O.Q. 3101314",7.2500,,"S",,, -3,0,"Gallagher, Mr. Martin","male",25,0,0,"36864",7.7417,,"Q",,,"New York, NY" -3,0,"Garfirth, Mr. John","male",,0,0,"358585",14.5000,,"S",,, -3,0,"Gheorgheff, Mr. Stanio","male",,0,0,"349254",7.8958,,"C",,, -3,0,"Gilinski, Mr. Eliezer","male",22,0,0,"14973",8.0500,,"S",,"47", -3,1,"Gilnagh, Miss. Katherine ""Katie""","female",16,0,0,"35851",7.7333,,"Q","16",,"Co Longford, Ireland New York, NY" -3,1,"Glynn, Miss. Mary Agatha","female",,0,0,"335677",7.7500,,"Q","13",,"Co Clare, Ireland Washington, DC" -3,1,"Goldsmith, Master. Frank John William ""Frankie""","male",9,0,2,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" -3,0,"Goldsmith, Mr. Frank John","male",33,1,1,"363291",20.5250,,"S",,,"Strood, Kent, England Detroit, MI" -3,0,"Goldsmith, Mr. Nathan","male",41,0,0,"SOTON/O.Q. 3101263",7.8500,,"S",,,"Philadelphia, PA" -3,1,"Goldsmith, Mrs. Frank John (Emily Alice Brown)","female",31,1,1,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" -3,0,"Goncalves, Mr. Manuel Estanslas","male",38,0,0,"SOTON/O.Q. 3101306",7.0500,,"S",,,"Portugal" -3,0,"Goodwin, Master. Harold Victor","male",9,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Master. Sidney Leonard","male",1,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Master. William Frederick","male",11,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Miss. Jessie Allis","female",10,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Miss. Lillian Amy","female",16,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Mr. Charles Edward","male",14,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Mr. Charles Frederick","male",40,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Mrs. Frederick (Augusta Tyler)","female",43,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Green, Mr. George Henry","male",51,0,0,"21440",8.0500,,"S",,,"Dorking, Surrey, England" -3,0,"Gronnestad, Mr. Daniel Danielsen","male",32,0,0,"8471",8.3625,,"S",,,"Foresvik, Norway Portland, ND" -3,0,"Guest, Mr. Robert","male",,0,0,"376563",8.0500,,"S",,, -3,0,"Gustafsson, Mr. Alfred Ossian","male",20,0,0,"7534",9.8458,,"S",,,"Waukegan, Chicago, IL" -3,0,"Gustafsson, Mr. Anders Vilhelm","male",37,2,0,"3101276",7.9250,,"S",,"98","Ruotsinphytaa, Finland New York, NY" -3,0,"Gustafsson, Mr. Johan Birger","male",28,2,0,"3101277",7.9250,,"S",,,"Ruotsinphytaa, Finland New York, NY" -3,0,"Gustafsson, Mr. Karl Gideon","male",19,0,0,"347069",7.7750,,"S",,,"Myren, Sweden New York, NY" -3,0,"Haas, Miss. Aloisia","female",24,0,0,"349236",8.8500,,"S",,, -3,0,"Hagardon, Miss. Kate","female",17,0,0,"AQ/3. 30631",7.7333,,"Q",,, -3,0,"Hagland, Mr. Ingvald Olai Olsen","male",,1,0,"65303",19.9667,,"S",,, -3,0,"Hagland, Mr. Konrad Mathias Reiersen","male",,1,0,"65304",19.9667,,"S",,, -3,0,"Hakkarainen, Mr. Pekka Pietari","male",28,1,0,"STON/O2. 3101279",15.8500,,"S",,, -3,1,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)","female",24,1,0,"STON/O2. 3101279",15.8500,,"S","15",, -3,0,"Hampe, Mr. Leon","male",20,0,0,"345769",9.5000,,"S",,, -3,0,"Hanna, Mr. Mansour","male",23.5,0,0,"2693",7.2292,,"C",,"188", -3,0,"Hansen, Mr. Claus Peter","male",41,2,0,"350026",14.1083,,"S",,, -3,0,"Hansen, Mr. Henrik Juul","male",26,1,0,"350025",7.8542,,"S",,, -3,0,"Hansen, Mr. Henry Damsgaard","male",21,0,0,"350029",7.8542,,"S",,"69", -3,1,"Hansen, Mrs. Claus Peter (Jennie L Howard)","female",45,1,0,"350026",14.1083,,"S","11",, -3,0,"Harknett, Miss. Alice Phoebe","female",,0,0,"W./C. 6609",7.5500,,"S",,, -3,0,"Harmer, Mr. Abraham (David Lishin)","male",25,0,0,"374887",7.2500,,"S","B",, -3,0,"Hart, Mr. Henry","male",,0,0,"394140",6.8583,,"Q",,, -3,0,"Hassan, Mr. Houssein G N","male",11,0,0,"2699",18.7875,,"C",,, -3,1,"Healy, Miss. Hanora ""Nora""","female",,0,0,"370375",7.7500,,"Q","16",, -3,1,"Hedman, Mr. Oskar Arvid","male",27,0,0,"347089",6.9750,,"S","15",, -3,1,"Hee, Mr. Ling","male",,0,0,"1601",56.4958,,"S","C",, -3,0,"Hegarty, Miss. Hanora ""Nora""","female",18,0,0,"365226",6.7500,,"Q",,, -3,1,"Heikkinen, Miss. Laina","female",26,0,0,"STON/O2. 3101282",7.9250,,"S",,, -3,0,"Heininen, Miss. Wendla Maria","female",23,0,0,"STON/O2. 3101290",7.9250,,"S",,, -3,1,"Hellstrom, Miss. Hilda Maria","female",22,0,0,"7548",8.9625,,"S","C",, -3,0,"Hendekovic, Mr. Ignjac","male",28,0,0,"349243",7.8958,,"S",,"306", -3,0,"Henriksson, Miss. Jenny Lovisa","female",28,0,0,"347086",7.7750,,"S",,, -3,0,"Henry, Miss. Delia","female",,0,0,"382649",7.7500,,"Q",,, -3,1,"Hirvonen, Miss. Hildur E","female",2,0,1,"3101298",12.2875,,"S","15",, -3,1,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)","female",22,1,1,"3101298",12.2875,,"S","15",, -3,0,"Holm, Mr. John Fredrik Alexander","male",43,0,0,"C 7075",6.4500,,"S",,, -3,0,"Holthen, Mr. Johan Martin","male",28,0,0,"C 4001",22.5250,,"S",,, -3,1,"Honkanen, Miss. Eliina","female",27,0,0,"STON/O2. 3101283",7.9250,,"S",,, -3,0,"Horgan, Mr. John","male",,0,0,"370377",7.7500,,"Q",,, -3,1,"Howard, Miss. May Elizabeth","female",,0,0,"A. 2. 39186",8.0500,,"S","C",, -3,0,"Humblen, Mr. Adolf Mathias Nicolai Olsen","male",42,0,0,"348121",7.6500,"F G63","S",,"120", -3,1,"Hyman, Mr. Abraham","male",,0,0,"3470",7.8875,,"S","C",, -3,0,"Ibrahim Shawah, Mr. Yousseff","male",30,0,0,"2685",7.2292,,"C",,, -3,0,"Ilieff, Mr. Ylio","male",,0,0,"349220",7.8958,,"S",,, -3,0,"Ilmakangas, Miss. Ida Livija","female",27,1,0,"STON/O2. 3101270",7.9250,,"S",,, -3,0,"Ilmakangas, Miss. Pieta Sofia","female",25,1,0,"STON/O2. 3101271",7.9250,,"S",,, -3,0,"Ivanoff, Mr. Kanio","male",,0,0,"349201",7.8958,,"S",,, -3,1,"Jalsevac, Mr. Ivan","male",29,0,0,"349240",7.8958,,"C","15",, -3,1,"Jansson, Mr. Carl Olof","male",21,0,0,"350034",7.7958,,"S","A",, -3,0,"Jardin, Mr. Jose Neto","male",,0,0,"SOTON/O.Q. 3101305",7.0500,,"S",,, -3,0,"Jensen, Mr. Hans Peder","male",20,0,0,"350050",7.8542,,"S",,, -3,0,"Jensen, Mr. Niels Peder","male",48,0,0,"350047",7.8542,,"S",,, -3,0,"Jensen, Mr. Svend Lauritz","male",17,1,0,"350048",7.0542,,"S",,, -3,1,"Jermyn, Miss. Annie","female",,0,0,"14313",7.7500,,"Q","D",, -3,1,"Johannesen-Bratthammer, Mr. Bernt","male",,0,0,"65306",8.1125,,"S","13",, -3,0,"Johanson, Mr. Jakob Alfred","male",34,0,0,"3101264",6.4958,,"S",,"143", -3,1,"Johansson Palmquist, Mr. Oskar Leander","male",26,0,0,"347070",7.7750,,"S","15",, -3,0,"Johansson, Mr. Erik","male",22,0,0,"350052",7.7958,,"S",,"156", -3,0,"Johansson, Mr. Gustaf Joel","male",33,0,0,"7540",8.6542,,"S",,"285", -3,0,"Johansson, Mr. Karl Johan","male",31,0,0,"347063",7.7750,,"S",,, -3,0,"Johansson, Mr. Nils","male",29,0,0,"347467",7.8542,,"S",,, -3,1,"Johnson, Master. Harold Theodor","male",4,1,1,"347742",11.1333,,"S","15",, -3,1,"Johnson, Miss. Eleanor Ileen","female",1,1,1,"347742",11.1333,,"S","15",, -3,0,"Johnson, Mr. Alfred","male",49,0,0,"LINE",0.0000,,"S",,, -3,0,"Johnson, Mr. Malkolm Joackim","male",33,0,0,"347062",7.7750,,"S",,"37", -3,0,"Johnson, Mr. William Cahoone Jr","male",19,0,0,"LINE",0.0000,,"S",,, -3,1,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)","female",27,0,2,"347742",11.1333,,"S","15",, -3,0,"Johnston, Master. William Arthur ""Willie""","male",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Johnston, Miss. Catherine Helen ""Carrie""","female",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Johnston, Mr. Andrew G","male",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Johnston, Mrs. Andrew G (Elizabeth ""Lily"" Watson)","female",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Jonkoff, Mr. Lalio","male",23,0,0,"349204",7.8958,,"S",,, -3,1,"Jonsson, Mr. Carl","male",32,0,0,"350417",7.8542,,"S","15",, -3,0,"Jonsson, Mr. Nils Hilding","male",27,0,0,"350408",7.8542,,"S",,, -3,0,"Jussila, Miss. Katriina","female",20,1,0,"4136",9.8250,,"S",,, -3,0,"Jussila, Miss. Mari Aina","female",21,1,0,"4137",9.8250,,"S",,, -3,1,"Jussila, Mr. Eiriik","male",32,0,0,"STON/O 2. 3101286",7.9250,,"S","15",, -3,0,"Kallio, Mr. Nikolai Erland","male",17,0,0,"STON/O 2. 3101274",7.1250,,"S",,, -3,0,"Kalvik, Mr. Johannes Halvorsen","male",21,0,0,"8475",8.4333,,"S",,, -3,0,"Karaic, Mr. Milan","male",30,0,0,"349246",7.8958,,"S",,, -3,1,"Karlsson, Mr. Einar Gervasius","male",21,0,0,"350053",7.7958,,"S","13",, -3,0,"Karlsson, Mr. Julius Konrad Eugen","male",33,0,0,"347465",7.8542,,"S",,, -3,0,"Karlsson, Mr. Nils August","male",22,0,0,"350060",7.5208,,"S",,, -3,1,"Karun, Miss. Manca","female",4,0,1,"349256",13.4167,,"C","15",, -3,1,"Karun, Mr. Franz","male",39,0,1,"349256",13.4167,,"C","15",, -3,0,"Kassem, Mr. Fared","male",,0,0,"2700",7.2292,,"C",,, -3,0,"Katavelas, Mr. Vassilios (""Catavelas Vassilios"")","male",18.5,0,0,"2682",7.2292,,"C",,"58", -3,0,"Keane, Mr. Andrew ""Andy""","male",,0,0,"12460",7.7500,,"Q",,, -3,0,"Keefe, Mr. Arthur","male",,0,0,"323592",7.2500,,"S","A",, -3,1,"Kelly, Miss. Anna Katherine ""Annie Kate""","female",,0,0,"9234",7.7500,,"Q","16",, -3,1,"Kelly, Miss. Mary","female",,0,0,"14312",7.7500,,"Q","D",, -3,0,"Kelly, Mr. James","male",34.5,0,0,"330911",7.8292,,"Q",,"70", -3,0,"Kelly, Mr. James","male",44,0,0,"363592",8.0500,,"S",,, -3,1,"Kennedy, Mr. John","male",,0,0,"368783",7.7500,,"Q",,, -3,0,"Khalil, Mr. Betros","male",,1,0,"2660",14.4542,,"C",,, -3,0,"Khalil, Mrs. Betros (Zahie ""Maria"" Elias)","female",,1,0,"2660",14.4542,,"C",,, -3,0,"Kiernan, Mr. John","male",,1,0,"367227",7.7500,,"Q",,, -3,0,"Kiernan, Mr. Philip","male",,1,0,"367229",7.7500,,"Q",,, -3,0,"Kilgannon, Mr. Thomas J","male",,0,0,"36865",7.7375,,"Q",,, -3,0,"Kink, Miss. Maria","female",22,2,0,"315152",8.6625,,"S",,, -3,0,"Kink, Mr. Vincenz","male",26,2,0,"315151",8.6625,,"S",,, -3,1,"Kink-Heilmann, Miss. Luise Gretchen","female",4,0,2,"315153",22.0250,,"S","2",, -3,1,"Kink-Heilmann, Mr. Anton","male",29,3,1,"315153",22.0250,,"S","2",, -3,1,"Kink-Heilmann, Mrs. Anton (Luise Heilmann)","female",26,1,1,"315153",22.0250,,"S","2",, -3,0,"Klasen, Miss. Gertrud Emilia","female",1,1,1,"350405",12.1833,,"S",,, -3,0,"Klasen, Mr. Klas Albin","male",18,1,1,"350404",7.8542,,"S",,, -3,0,"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)","female",36,0,2,"350405",12.1833,,"S",,, -3,0,"Kraeff, Mr. Theodor","male",,0,0,"349253",7.8958,,"C",,, -3,1,"Krekorian, Mr. Neshan","male",25,0,0,"2654",7.2292,"F E57","C","10",, -3,0,"Lahoud, Mr. Sarkis","male",,0,0,"2624",7.2250,,"C",,, -3,0,"Laitinen, Miss. Kristina Sofia","female",37,0,0,"4135",9.5875,,"S",,, -3,0,"Laleff, Mr. Kristo","male",,0,0,"349217",7.8958,,"S",,, -3,1,"Lam, Mr. Ali","male",,0,0,"1601",56.4958,,"S","C",, -3,0,"Lam, Mr. Len","male",,0,0,"1601",56.4958,,"S",,, -3,1,"Landergren, Miss. Aurora Adelia","female",22,0,0,"C 7077",7.2500,,"S","13",, -3,0,"Lane, Mr. Patrick","male",,0,0,"7935",7.7500,,"Q",,, -3,1,"Lang, Mr. Fang","male",26,0,0,"1601",56.4958,,"S","14",, -3,0,"Larsson, Mr. August Viktor","male",29,0,0,"7545",9.4833,,"S",,, -3,0,"Larsson, Mr. Bengt Edvin","male",29,0,0,"347067",7.7750,,"S",,, -3,0,"Larsson-Rondberg, Mr. Edvard A","male",22,0,0,"347065",7.7750,,"S",,, -3,1,"Leeni, Mr. Fahim (""Philip Zenni"")","male",22,0,0,"2620",7.2250,,"C","6",, -3,0,"Lefebre, Master. Henry Forbes","male",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Miss. Ida","female",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Miss. Jeannie","female",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Miss. Mathilde","female",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Mrs. Frank (Frances)","female",,0,4,"4133",25.4667,,"S",,, -3,0,"Leinonen, Mr. Antti Gustaf","male",32,0,0,"STON/O 2. 3101292",7.9250,,"S",,, -3,0,"Lemberopolous, Mr. Peter L","male",34.5,0,0,"2683",6.4375,,"C",,"196", -3,0,"Lennon, Miss. Mary","female",,1,0,"370371",15.5000,,"Q",,, -3,0,"Lennon, Mr. Denis","male",,1,0,"370371",15.5000,,"Q",,, -3,0,"Leonard, Mr. Lionel","male",36,0,0,"LINE",0.0000,,"S",,, -3,0,"Lester, Mr. James","male",39,0,0,"A/4 48871",24.1500,,"S",,, -3,0,"Lievens, Mr. Rene Aime","male",24,0,0,"345781",9.5000,,"S",,, -3,0,"Lindahl, Miss. Agda Thorilda Viktoria","female",25,0,0,"347071",7.7750,,"S",,, -3,0,"Lindblom, Miss. Augusta Charlotta","female",45,0,0,"347073",7.7500,,"S",,, -3,0,"Lindell, Mr. Edvard Bengtsson","male",36,1,0,"349910",15.5500,,"S","A",, -3,0,"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)","female",30,1,0,"349910",15.5500,,"S","A",, -3,1,"Lindqvist, Mr. Eino William","male",20,1,0,"STON/O 2. 3101285",7.9250,,"S","15",, -3,0,"Linehan, Mr. Michael","male",,0,0,"330971",7.8792,,"Q",,, -3,0,"Ling, Mr. Lee","male",28,0,0,"1601",56.4958,,"S",,, -3,0,"Lithman, Mr. Simon","male",,0,0,"S.O./P.P. 251",7.5500,,"S",,, -3,0,"Lobb, Mr. William Arthur","male",30,1,0,"A/5. 3336",16.1000,,"S",,, -3,0,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)","female",26,1,0,"A/5. 3336",16.1000,,"S",,, -3,0,"Lockyer, Mr. Edward","male",,0,0,"1222",7.8792,,"S",,"153", -3,0,"Lovell, Mr. John Hall (""Henry"")","male",20.5,0,0,"A/5 21173",7.2500,,"S",,, -3,1,"Lulic, Mr. Nikola","male",27,0,0,"315098",8.6625,,"S","15",, -3,0,"Lundahl, Mr. Johan Svensson","male",51,0,0,"347743",7.0542,,"S",,, -3,1,"Lundin, Miss. Olga Elida","female",23,0,0,"347469",7.8542,,"S","10",, -3,1,"Lundstrom, Mr. Thure Edvin","male",32,0,0,"350403",7.5792,,"S","15",, -3,0,"Lyntakoff, Mr. Stanko","male",,0,0,"349235",7.8958,,"S",,, -3,0,"MacKay, Mr. George William","male",,0,0,"C.A. 42795",7.5500,,"S",,, -3,1,"Madigan, Miss. Margaret ""Maggie""","female",,0,0,"370370",7.7500,,"Q","15",, -3,1,"Madsen, Mr. Fridtjof Arne","male",24,0,0,"C 17369",7.1417,,"S","13",, -3,0,"Maenpaa, Mr. Matti Alexanteri","male",22,0,0,"STON/O 2. 3101275",7.1250,,"S",,, -3,0,"Mahon, Miss. Bridget Delia","female",,0,0,"330924",7.8792,,"Q",,, -3,0,"Mahon, Mr. John","male",,0,0,"AQ/4 3130",7.7500,,"Q",,, -3,0,"Maisner, Mr. Simon","male",,0,0,"A/S 2816",8.0500,,"S",,, -3,0,"Makinen, Mr. Kalle Edvard","male",29,0,0,"STON/O 2. 3101268",7.9250,,"S",,, -3,1,"Mamee, Mr. Hanna","male",,0,0,"2677",7.2292,,"C","15",, -3,0,"Mangan, Miss. Mary","female",30.5,0,0,"364850",7.7500,,"Q",,"61", -3,1,"Mannion, Miss. Margareth","female",,0,0,"36866",7.7375,,"Q","16",, -3,0,"Mardirosian, Mr. Sarkis","male",,0,0,"2655",7.2292,"F E46","C",,, -3,0,"Markoff, Mr. Marin","male",35,0,0,"349213",7.8958,,"C",,, -3,0,"Markun, Mr. Johann","male",33,0,0,"349257",7.8958,,"S",,, -3,1,"Masselmani, Mrs. Fatima","female",,0,0,"2649",7.2250,,"C","C",, -3,0,"Matinoff, Mr. Nicola","male",,0,0,"349255",7.8958,,"C",,, -3,1,"McCarthy, Miss. Catherine ""Katie""","female",,0,0,"383123",7.7500,,"Q","15 16",, -3,1,"McCormack, Mr. Thomas Joseph","male",,0,0,"367228",7.7500,,"Q",,, -3,1,"McCoy, Miss. Agnes","female",,2,0,"367226",23.2500,,"Q","16",, -3,1,"McCoy, Miss. Alicia","female",,2,0,"367226",23.2500,,"Q","16",, -3,1,"McCoy, Mr. Bernard","male",,2,0,"367226",23.2500,,"Q","16",, -3,1,"McDermott, Miss. Brigdet Delia","female",,0,0,"330932",7.7875,,"Q","13",, -3,0,"McEvoy, Mr. Michael","male",,0,0,"36568",15.5000,,"Q",,, -3,1,"McGovern, Miss. Mary","female",,0,0,"330931",7.8792,,"Q","13",, -3,1,"McGowan, Miss. Anna ""Annie""","female",15,0,0,"330923",8.0292,,"Q",,, -3,0,"McGowan, Miss. Katherine","female",35,0,0,"9232",7.7500,,"Q",,, -3,0,"McMahon, Mr. Martin","male",,0,0,"370372",7.7500,,"Q",,, -3,0,"McNamee, Mr. Neal","male",24,1,0,"376566",16.1000,,"S",,, -3,0,"McNamee, Mrs. Neal (Eileen O'Leary)","female",19,1,0,"376566",16.1000,,"S",,"53", -3,0,"McNeill, Miss. Bridget","female",,0,0,"370368",7.7500,,"Q",,, -3,0,"Meanwell, Miss. (Marion Ogden)","female",,0,0,"SOTON/O.Q. 392087",8.0500,,"S",,, -3,0,"Meek, Mrs. Thomas (Annie Louise Rowley)","female",,0,0,"343095",8.0500,,"S",,, -3,0,"Meo, Mr. Alfonzo","male",55.5,0,0,"A.5. 11206",8.0500,,"S",,"201", -3,0,"Mernagh, Mr. Robert","male",,0,0,"368703",7.7500,,"Q",,, -3,1,"Midtsjo, Mr. Karl Albert","male",21,0,0,"345501",7.7750,,"S","15",, -3,0,"Miles, Mr. Frank","male",,0,0,"359306",8.0500,,"S",,, -3,0,"Mineff, Mr. Ivan","male",24,0,0,"349233",7.8958,,"S",,, -3,0,"Minkoff, Mr. Lazar","male",21,0,0,"349211",7.8958,,"S",,, -3,0,"Mionoff, Mr. Stoytcho","male",28,0,0,"349207",7.8958,,"S",,, -3,0,"Mitkoff, Mr. Mito","male",,0,0,"349221",7.8958,,"S",,, -3,1,"Mockler, Miss. Helen Mary ""Ellie""","female",,0,0,"330980",7.8792,,"Q","16",, -3,0,"Moen, Mr. Sigurd Hansen","male",25,0,0,"348123",7.6500,"F G73","S",,"309", -3,1,"Moor, Master. Meier","male",6,0,1,"392096",12.4750,"E121","S","14",, -3,1,"Moor, Mrs. (Beila)","female",27,0,1,"392096",12.4750,"E121","S","14",, -3,0,"Moore, Mr. Leonard Charles","male",,0,0,"A4. 54510",8.0500,,"S",,, -3,1,"Moran, Miss. Bertha","female",,1,0,"371110",24.1500,,"Q","16",, -3,0,"Moran, Mr. Daniel J","male",,1,0,"371110",24.1500,,"Q",,, -3,0,"Moran, Mr. James","male",,0,0,"330877",8.4583,,"Q",,, -3,0,"Morley, Mr. William","male",34,0,0,"364506",8.0500,,"S",,, -3,0,"Morrow, Mr. Thomas Rowan","male",,0,0,"372622",7.7500,,"Q",,, -3,1,"Moss, Mr. Albert Johan","male",,0,0,"312991",7.7750,,"S","B",, -3,1,"Moubarek, Master. Gerios","male",,1,1,"2661",15.2458,,"C","C",, -3,1,"Moubarek, Master. Halim Gonios (""William George"")","male",,1,1,"2661",15.2458,,"C","C",, -3,1,"Moubarek, Mrs. George (Omine ""Amenia"" Alexander)","female",,0,2,"2661",15.2458,,"C","C",, -3,1,"Moussa, Mrs. (Mantoura Boulos)","female",,0,0,"2626",7.2292,,"C",,, -3,0,"Moutal, Mr. Rahamin Haim","male",,0,0,"374746",8.0500,,"S",,, -3,1,"Mullens, Miss. Katherine ""Katie""","female",,0,0,"35852",7.7333,,"Q","16",, -3,1,"Mulvihill, Miss. Bertha E","female",24,0,0,"382653",7.7500,,"Q","15",, -3,0,"Murdlin, Mr. Joseph","male",,0,0,"A./5. 3235",8.0500,,"S",,, -3,1,"Murphy, Miss. Katherine ""Kate""","female",,1,0,"367230",15.5000,,"Q","16",, -3,1,"Murphy, Miss. Margaret Jane","female",,1,0,"367230",15.5000,,"Q","16",, -3,1,"Murphy, Miss. Nora","female",,0,0,"36568",15.5000,,"Q","16",, -3,0,"Myhrman, Mr. Pehr Fabian Oliver Malkolm","male",18,0,0,"347078",7.7500,,"S",,, -3,0,"Naidenoff, Mr. Penko","male",22,0,0,"349206",7.8958,,"S",,, -3,1,"Najib, Miss. Adele Kiamie ""Jane""","female",15,0,0,"2667",7.2250,,"C","C",, -3,1,"Nakid, Miss. Maria (""Mary"")","female",1,0,2,"2653",15.7417,,"C","C",, -3,1,"Nakid, Mr. Sahid","male",20,1,1,"2653",15.7417,,"C","C",, -3,1,"Nakid, Mrs. Said (Waika ""Mary"" Mowad)","female",19,1,1,"2653",15.7417,,"C","C",, -3,0,"Nancarrow, Mr. William Henry","male",33,0,0,"A./5. 3338",8.0500,,"S",,, -3,0,"Nankoff, Mr. Minko","male",,0,0,"349218",7.8958,,"S",,, -3,0,"Nasr, Mr. Mustafa","male",,0,0,"2652",7.2292,,"C",,, -3,0,"Naughton, Miss. Hannah","female",,0,0,"365237",7.7500,,"Q",,, -3,0,"Nenkoff, Mr. Christo","male",,0,0,"349234",7.8958,,"S",,, -3,1,"Nicola-Yarred, Master. Elias","male",12,1,0,"2651",11.2417,,"C","C",, -3,1,"Nicola-Yarred, Miss. Jamila","female",14,1,0,"2651",11.2417,,"C","C",, -3,0,"Nieminen, Miss. Manta Josefina","female",29,0,0,"3101297",7.9250,,"S",,, -3,0,"Niklasson, Mr. Samuel","male",28,0,0,"363611",8.0500,,"S",,, -3,1,"Nilsson, Miss. Berta Olivia","female",18,0,0,"347066",7.7750,,"S","D",, -3,1,"Nilsson, Miss. Helmina Josefina","female",26,0,0,"347470",7.8542,,"S","13",, -3,0,"Nilsson, Mr. August Ferdinand","male",21,0,0,"350410",7.8542,,"S",,, -3,0,"Nirva, Mr. Iisakki Antino Aijo","male",41,0,0,"SOTON/O2 3101272",7.1250,,"S",,,"Finland Sudbury, ON" -3,1,"Niskanen, Mr. Juha","male",39,0,0,"STON/O 2. 3101289",7.9250,,"S","9",, -3,0,"Nosworthy, Mr. Richard Cater","male",21,0,0,"A/4. 39886",7.8000,,"S",,, -3,0,"Novel, Mr. Mansouer","male",28.5,0,0,"2697",7.2292,,"C",,"181", -3,1,"Nysten, Miss. Anna Sofia","female",22,0,0,"347081",7.7500,,"S","13",, -3,0,"Nysveen, Mr. Johan Hansen","male",61,0,0,"345364",6.2375,,"S",,, -3,0,"O'Brien, Mr. Thomas","male",,1,0,"370365",15.5000,,"Q",,, -3,0,"O'Brien, Mr. Timothy","male",,0,0,"330979",7.8292,,"Q",,, -3,1,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)","female",,1,0,"370365",15.5000,,"Q",,, -3,0,"O'Connell, Mr. Patrick D","male",,0,0,"334912",7.7333,,"Q",,, -3,0,"O'Connor, Mr. Maurice","male",,0,0,"371060",7.7500,,"Q",,, -3,0,"O'Connor, Mr. Patrick","male",,0,0,"366713",7.7500,,"Q",,, -3,0,"Odahl, Mr. Nils Martin","male",23,0,0,"7267",9.2250,,"S",,, -3,0,"O'Donoghue, Ms. Bridget","female",,0,0,"364856",7.7500,,"Q",,, -3,1,"O'Driscoll, Miss. Bridget","female",,0,0,"14311",7.7500,,"Q","D",, -3,1,"O'Dwyer, Miss. Ellen ""Nellie""","female",,0,0,"330959",7.8792,,"Q",,, -3,1,"Ohman, Miss. Velin","female",22,0,0,"347085",7.7750,,"S","C",, -3,1,"O'Keefe, Mr. Patrick","male",,0,0,"368402",7.7500,,"Q","B",, -3,1,"O'Leary, Miss. Hanora ""Norah""","female",,0,0,"330919",7.8292,,"Q","13",, -3,1,"Olsen, Master. Artur Karl","male",9,0,1,"C 17368",3.1708,,"S","13",, -3,0,"Olsen, Mr. Henry Margido","male",28,0,0,"C 4001",22.5250,,"S",,"173", -3,0,"Olsen, Mr. Karl Siegwart Andreas","male",42,0,1,"4579",8.4042,,"S",,, -3,0,"Olsen, Mr. Ole Martin","male",,0,0,"Fa 265302",7.3125,,"S",,, -3,0,"Olsson, Miss. Elina","female",31,0,0,"350407",7.8542,,"S",,, -3,0,"Olsson, Mr. Nils Johan Goransson","male",28,0,0,"347464",7.8542,,"S",,, -3,1,"Olsson, Mr. Oscar Wilhelm","male",32,0,0,"347079",7.7750,,"S","A",, -3,0,"Olsvigen, Mr. Thor Anderson","male",20,0,0,"6563",9.2250,,"S",,"89","Oslo, Norway Cameron, WI" -3,0,"Oreskovic, Miss. Jelka","female",23,0,0,"315085",8.6625,,"S",,, -3,0,"Oreskovic, Miss. Marija","female",20,0,0,"315096",8.6625,,"S",,, -3,0,"Oreskovic, Mr. Luka","male",20,0,0,"315094",8.6625,,"S",,, -3,0,"Osen, Mr. Olaf Elon","male",16,0,0,"7534",9.2167,,"S",,, -3,1,"Osman, Mrs. Mara","female",31,0,0,"349244",8.6833,,"S",,, -3,0,"O'Sullivan, Miss. Bridget Mary","female",,0,0,"330909",7.6292,,"Q",,, -3,0,"Palsson, Master. Gosta Leonard","male",2,3,1,"349909",21.0750,,"S",,"4", -3,0,"Palsson, Master. Paul Folke","male",6,3,1,"349909",21.0750,,"S",,, -3,0,"Palsson, Miss. Stina Viola","female",3,3,1,"349909",21.0750,,"S",,, -3,0,"Palsson, Miss. Torborg Danira","female",8,3,1,"349909",21.0750,,"S",,, -3,0,"Palsson, Mrs. Nils (Alma Cornelia Berglund)","female",29,0,4,"349909",21.0750,,"S",,"206", -3,0,"Panula, Master. Eino Viljami","male",1,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Master. Juha Niilo","male",7,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Master. Urho Abraham","male",2,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Mr. Ernesti Arvid","male",16,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Mr. Jaako Arnold","male",14,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Mrs. Juha (Maria Emilia Ojala)","female",41,0,5,"3101295",39.6875,,"S",,, -3,0,"Pasic, Mr. Jakob","male",21,0,0,"315097",8.6625,,"S",,, -3,0,"Patchett, Mr. George","male",19,0,0,"358585",14.5000,,"S",,, -3,0,"Paulner, Mr. Uscher","male",,0,0,"3411",8.7125,,"C",,, -3,0,"Pavlovic, Mr. Stefo","male",32,0,0,"349242",7.8958,,"S",,, -3,0,"Peacock, Master. Alfred Edward","male",0.75,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, -3,0,"Peacock, Miss. Treasteall","female",3,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, -3,0,"Peacock, Mrs. Benjamin (Edith Nile)","female",26,0,2,"SOTON/O.Q. 3101315",13.7750,,"S",,, -3,0,"Pearce, Mr. Ernest","male",,0,0,"343271",7.0000,,"S",,, -3,0,"Pedersen, Mr. Olaf","male",,0,0,"345498",7.7750,,"S",,, -3,0,"Peduzzi, Mr. Joseph","male",,0,0,"A/5 2817",8.0500,,"S",,, -3,0,"Pekoniemi, Mr. Edvard","male",21,0,0,"STON/O 2. 3101294",7.9250,,"S",,, -3,0,"Peltomaki, Mr. Nikolai Johannes","male",25,0,0,"STON/O 2. 3101291",7.9250,,"S",,, -3,0,"Perkin, Mr. John Henry","male",22,0,0,"A/5 21174",7.2500,,"S",,, -3,1,"Persson, Mr. Ernst Ulrik","male",25,1,0,"347083",7.7750,,"S","15",, -3,1,"Peter, Master. Michael J","male",,1,1,"2668",22.3583,,"C","C",, -3,1,"Peter, Miss. Anna","female",,1,1,"2668",22.3583,"F E69","C","D",, -3,1,"Peter, Mrs. Catherine (Catherine Rizk)","female",,0,2,"2668",22.3583,,"C","D",, -3,0,"Peters, Miss. Katie","female",,0,0,"330935",8.1375,,"Q",,, -3,0,"Petersen, Mr. Marius","male",24,0,0,"342441",8.0500,,"S",,, -3,0,"Petranec, Miss. Matilda","female",28,0,0,"349245",7.8958,,"S",,, -3,0,"Petroff, Mr. Nedelio","male",19,0,0,"349212",7.8958,,"S",,, -3,0,"Petroff, Mr. Pastcho (""Pentcho"")","male",,0,0,"349215",7.8958,,"S",,, -3,0,"Petterson, Mr. Johan Emil","male",25,1,0,"347076",7.7750,,"S",,, -3,0,"Pettersson, Miss. Ellen Natalia","female",18,0,0,"347087",7.7750,,"S",,, -3,1,"Pickard, Mr. Berk (Berk Trembisky)","male",32,0,0,"SOTON/O.Q. 392078",8.0500,"E10","S","9",, -3,0,"Plotcharsky, Mr. Vasil","male",,0,0,"349227",7.8958,,"S",,, -3,0,"Pokrnic, Mr. Mate","male",17,0,0,"315095",8.6625,,"S",,, -3,0,"Pokrnic, Mr. Tome","male",24,0,0,"315092",8.6625,,"S",,, -3,0,"Radeff, Mr. Alexander","male",,0,0,"349223",7.8958,,"S",,, -3,0,"Rasmussen, Mrs. (Lena Jacobsen Solvang)","female",,0,0,"65305",8.1125,,"S",,, -3,0,"Razi, Mr. Raihed","male",,0,0,"2629",7.2292,,"C",,, -3,0,"Reed, Mr. James George","male",,0,0,"362316",7.2500,,"S",,, -3,0,"Rekic, Mr. Tido","male",38,0,0,"349249",7.8958,,"S",,, -3,0,"Reynolds, Mr. Harold J","male",21,0,0,"342684",8.0500,,"S",,, -3,0,"Rice, Master. Albert","male",10,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. Arthur","male",4,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. Eric","male",7,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. Eugene","male",2,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. George Hugh","male",8,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Mrs. William (Margaret Norton)","female",39,0,5,"382652",29.1250,,"Q",,"327", -3,0,"Riihivouri, Miss. Susanna Juhantytar ""Sanni""","female",22,0,0,"3101295",39.6875,,"S",,, -3,0,"Rintamaki, Mr. Matti","male",35,0,0,"STON/O 2. 3101273",7.1250,,"S",,, -3,1,"Riordan, Miss. Johanna ""Hannah""","female",,0,0,"334915",7.7208,,"Q","13",, -3,0,"Risien, Mr. Samuel Beard","male",,0,0,"364498",14.5000,,"S",,, -3,0,"Risien, Mrs. Samuel (Emma)","female",,0,0,"364498",14.5000,,"S",,, -3,0,"Robins, Mr. Alexander A","male",50,1,0,"A/5. 3337",14.5000,,"S",,"119", -3,0,"Robins, Mrs. Alexander A (Grace Charity Laury)","female",47,1,0,"A/5. 3337",14.5000,,"S",,"7", -3,0,"Rogers, Mr. William John","male",,0,0,"S.C./A.4. 23567",8.0500,,"S",,, -3,0,"Rommetvedt, Mr. Knud Paust","male",,0,0,"312993",7.7750,,"S",,, -3,0,"Rosblom, Miss. Salli Helena","female",2,1,1,"370129",20.2125,,"S",,, -3,0,"Rosblom, Mr. Viktor Richard","male",18,1,1,"370129",20.2125,,"S",,, -3,0,"Rosblom, Mrs. Viktor (Helena Wilhelmina)","female",41,0,2,"370129",20.2125,,"S",,, -3,1,"Roth, Miss. Sarah A","female",,0,0,"342712",8.0500,,"S","C",, -3,0,"Rouse, Mr. Richard Henry","male",50,0,0,"A/5 3594",8.0500,,"S",,, -3,0,"Rush, Mr. Alfred George John","male",16,0,0,"A/4. 20589",8.0500,,"S",,, -3,1,"Ryan, Mr. Edward","male",,0,0,"383162",7.7500,,"Q","14",, -3,0,"Ryan, Mr. Patrick","male",,0,0,"371110",24.1500,,"Q",,, -3,0,"Saad, Mr. Amin","male",,0,0,"2671",7.2292,,"C",,, -3,0,"Saad, Mr. Khalil","male",25,0,0,"2672",7.2250,,"C",,, -3,0,"Saade, Mr. Jean Nassr","male",,0,0,"2676",7.2250,,"C",,, -3,0,"Sadlier, Mr. Matthew","male",,0,0,"367655",7.7292,,"Q",,, -3,0,"Sadowitz, Mr. Harry","male",,0,0,"LP 1588",7.5750,,"S",,, -3,0,"Saether, Mr. Simon Sivertsen","male",38.5,0,0,"SOTON/O.Q. 3101262",7.2500,,"S",,"32", -3,0,"Sage, Master. Thomas Henry","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Master. William Henry","male",14.5,8,2,"CA. 2343",69.5500,,"S",,"67", -3,0,"Sage, Miss. Ada","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Miss. Constance Gladys","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Miss. Dorothy Edith ""Dolly""","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Miss. Stella Anna","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. Douglas Bullen","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. Frederick","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. George John Jr","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. John George","male",,1,9,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mrs. John (Annie Bullen)","female",,1,9,"CA. 2343",69.5500,,"S",,, -3,0,"Salander, Mr. Karl Johan","male",24,0,0,"7266",9.3250,,"S",,, -3,1,"Salkjelsvik, Miss. Anna Kristine","female",21,0,0,"343120",7.6500,,"S","C",, -3,0,"Salonen, Mr. Johan Werner","male",39,0,0,"3101296",7.9250,,"S",,, -3,0,"Samaan, Mr. Elias","male",,2,0,"2662",21.6792,,"C",,, -3,0,"Samaan, Mr. Hanna","male",,2,0,"2662",21.6792,,"C",,, -3,0,"Samaan, Mr. Youssef","male",,2,0,"2662",21.6792,,"C",,, -3,1,"Sandstrom, Miss. Beatrice Irene","female",1,1,1,"PP 9549",16.7000,"G6","S","13",, -3,1,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)","female",24,0,2,"PP 9549",16.7000,"G6","S","13",, -3,1,"Sandstrom, Miss. Marguerite Rut","female",4,1,1,"PP 9549",16.7000,"G6","S","13",, -3,1,"Sap, Mr. Julius","male",25,0,0,"345768",9.5000,,"S","11",, -3,0,"Saundercock, Mr. William Henry","male",20,0,0,"A/5. 2151",8.0500,,"S",,, -3,0,"Sawyer, Mr. Frederick Charles","male",24.5,0,0,"342826",8.0500,,"S",,"284", -3,0,"Scanlan, Mr. James","male",,0,0,"36209",7.7250,,"Q",,, -3,0,"Sdycoff, Mr. Todor","male",,0,0,"349222",7.8958,,"S",,, -3,0,"Shaughnessy, Mr. Patrick","male",,0,0,"370374",7.7500,,"Q",,, -3,1,"Sheerlinck, Mr. Jan Baptist","male",29,0,0,"345779",9.5000,,"S","11",, -3,0,"Shellard, Mr. Frederick William","male",,0,0,"C.A. 6212",15.1000,,"S",,, -3,1,"Shine, Miss. Ellen Natalia","female",,0,0,"330968",7.7792,,"Q",,, -3,0,"Shorney, Mr. Charles Joseph","male",,0,0,"374910",8.0500,,"S",,, -3,0,"Simmons, Mr. John","male",,0,0,"SOTON/OQ 392082",8.0500,,"S",,, -3,0,"Sirayanian, Mr. Orsen","male",22,0,0,"2669",7.2292,,"C",,, -3,0,"Sirota, Mr. Maurice","male",,0,0,"392092",8.0500,,"S",,, -3,0,"Sivic, Mr. Husein","male",40,0,0,"349251",7.8958,,"S",,, -3,0,"Sivola, Mr. Antti Wilhelm","male",21,0,0,"STON/O 2. 3101280",7.9250,,"S",,, -3,1,"Sjoblom, Miss. Anna Sofia","female",18,0,0,"3101265",7.4958,,"S","16",, -3,0,"Skoog, Master. Harald","male",4,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Master. Karl Thorsten","male",10,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Miss. Mabel","female",9,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Miss. Margit Elizabeth","female",2,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Mr. Wilhelm","male",40,1,4,"347088",27.9000,,"S",,, -3,0,"Skoog, Mrs. William (Anna Bernhardina Karlsson)","female",45,1,4,"347088",27.9000,,"S",,, -3,0,"Slabenoff, Mr. Petco","male",,0,0,"349214",7.8958,,"S",,, -3,0,"Slocovski, Mr. Selman Francis","male",,0,0,"SOTON/OQ 392086",8.0500,,"S",,, -3,0,"Smiljanic, Mr. Mile","male",,0,0,"315037",8.6625,,"S",,, -3,0,"Smith, Mr. Thomas","male",,0,0,"384461",7.7500,,"Q",,, -3,1,"Smyth, Miss. Julia","female",,0,0,"335432",7.7333,,"Q","13",, -3,0,"Soholt, Mr. Peter Andreas Lauritz Andersen","male",19,0,0,"348124",7.6500,"F G73","S",,, -3,0,"Somerton, Mr. Francis William","male",30,0,0,"A.5. 18509",8.0500,,"S",,, -3,0,"Spector, Mr. Woolf","male",,0,0,"A.5. 3236",8.0500,,"S",,, -3,0,"Spinner, Mr. Henry John","male",32,0,0,"STON/OQ. 369943",8.0500,,"S",,, -3,0,"Staneff, Mr. Ivan","male",,0,0,"349208",7.8958,,"S",,, -3,0,"Stankovic, Mr. Ivan","male",33,0,0,"349239",8.6625,,"C",,, -3,1,"Stanley, Miss. Amy Zillah Elsie","female",23,0,0,"CA. 2314",7.5500,,"S","C",, -3,0,"Stanley, Mr. Edward Roland","male",21,0,0,"A/4 45380",8.0500,,"S",,, -3,0,"Storey, Mr. Thomas","male",60.5,0,0,"3701",,,"S",,"261", -3,0,"Stoytcheff, Mr. Ilia","male",19,0,0,"349205",7.8958,,"S",,, -3,0,"Strandberg, Miss. Ida Sofia","female",22,0,0,"7553",9.8375,,"S",,, -3,1,"Stranden, Mr. Juho","male",31,0,0,"STON/O 2. 3101288",7.9250,,"S","9",, -3,0,"Strilic, Mr. Ivan","male",27,0,0,"315083",8.6625,,"S",,, -3,0,"Strom, Miss. Telma Matilda","female",2,0,1,"347054",10.4625,"G6","S",,, -3,0,"Strom, Mrs. Wilhelm (Elna Matilda Persson)","female",29,1,1,"347054",10.4625,"G6","S",,, -3,1,"Sunderland, Mr. Victor Francis","male",16,0,0,"SOTON/OQ 392089",8.0500,,"S","B",, -3,1,"Sundman, Mr. Johan Julian","male",44,0,0,"STON/O 2. 3101269",7.9250,,"S","15",, -3,0,"Sutehall, Mr. Henry Jr","male",25,0,0,"SOTON/OQ 392076",7.0500,,"S",,, -3,0,"Svensson, Mr. Johan","male",74,0,0,"347060",7.7750,,"S",,, -3,1,"Svensson, Mr. Johan Cervin","male",14,0,0,"7538",9.2250,,"S","13",, -3,0,"Svensson, Mr. Olof","male",24,0,0,"350035",7.7958,,"S",,, -3,1,"Tenglin, Mr. Gunnar Isidor","male",25,0,0,"350033",7.7958,,"S","13 15",, -3,0,"Theobald, Mr. Thomas Leonard","male",34,0,0,"363294",8.0500,,"S",,"176", -3,1,"Thomas, Master. Assad Alexander","male",0.42,0,1,"2625",8.5167,,"C","16",, -3,0,"Thomas, Mr. Charles P","male",,1,0,"2621",6.4375,,"C",,, -3,0,"Thomas, Mr. John","male",,0,0,"2681",6.4375,,"C",,, -3,0,"Thomas, Mr. Tannous","male",,0,0,"2684",7.2250,,"C",,, -3,1,"Thomas, Mrs. Alexander (Thamine ""Thelma"")","female",16,1,1,"2625",8.5167,,"C","14",, -3,0,"Thomson, Mr. Alexander Morrison","male",,0,0,"32302",8.0500,,"S",,, -3,0,"Thorneycroft, Mr. Percival","male",,1,0,"376564",16.1000,,"S",,, -3,1,"Thorneycroft, Mrs. Percival (Florence Kate White)","female",,1,0,"376564",16.1000,,"S","10",, -3,0,"Tikkanen, Mr. Juho","male",32,0,0,"STON/O 2. 3101293",7.9250,,"S",,, -3,0,"Tobin, Mr. Roger","male",,0,0,"383121",7.7500,"F38","Q",,, -3,0,"Todoroff, Mr. Lalio","male",,0,0,"349216",7.8958,,"S",,, -3,0,"Tomlin, Mr. Ernest Portage","male",30.5,0,0,"364499",8.0500,,"S",,"50", -3,0,"Torber, Mr. Ernst William","male",44,0,0,"364511",8.0500,,"S",,, -3,0,"Torfa, Mr. Assad","male",,0,0,"2673",7.2292,,"C",,, -3,1,"Tornquist, Mr. William Henry","male",25,0,0,"LINE",0.0000,,"S","15",, -3,0,"Toufik, Mr. Nakli","male",,0,0,"2641",7.2292,,"C",,, -3,1,"Touma, Master. Georges Youssef","male",7,1,1,"2650",15.2458,,"C","C",, -3,1,"Touma, Miss. Maria Youssef","female",9,1,1,"2650",15.2458,,"C","C",, -3,1,"Touma, Mrs. Darwis (Hanne Youssef Razi)","female",29,0,2,"2650",15.2458,,"C","C",, -3,0,"Turcin, Mr. Stjepan","male",36,0,0,"349247",7.8958,,"S",,, -3,1,"Turja, Miss. Anna Sofia","female",18,0,0,"4138",9.8417,,"S","15",, -3,1,"Turkula, Mrs. (Hedwig)","female",63,0,0,"4134",9.5875,,"S","15",, -3,0,"van Billiard, Master. James William","male",,1,1,"A/5. 851",14.5000,,"S",,, -3,0,"van Billiard, Master. Walter John","male",11.5,1,1,"A/5. 851",14.5000,,"S",,"1", -3,0,"van Billiard, Mr. Austin Blyler","male",40.5,0,2,"A/5. 851",14.5000,,"S",,"255", -3,0,"Van Impe, Miss. Catharina","female",10,0,2,"345773",24.1500,,"S",,, -3,0,"Van Impe, Mr. Jean Baptiste","male",36,1,1,"345773",24.1500,,"S",,, -3,0,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)","female",30,1,1,"345773",24.1500,,"S",,, -3,0,"van Melkebeke, Mr. Philemon","male",,0,0,"345777",9.5000,,"S",,, -3,0,"Vande Velde, Mr. Johannes Joseph","male",33,0,0,"345780",9.5000,,"S",,, -3,0,"Vande Walle, Mr. Nestor Cyriel","male",28,0,0,"345770",9.5000,,"S",,, -3,0,"Vanden Steen, Mr. Leo Peter","male",28,0,0,"345783",9.5000,,"S",,, -3,0,"Vander Cruyssen, Mr. Victor","male",47,0,0,"345765",9.0000,,"S",,, -3,0,"Vander Planke, Miss. Augusta Maria","female",18,2,0,"345764",18.0000,,"S",,, -3,0,"Vander Planke, Mr. Julius","male",31,3,0,"345763",18.0000,,"S",,, -3,0,"Vander Planke, Mr. Leo Edmondus","male",16,2,0,"345764",18.0000,,"S",,, -3,0,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)","female",31,1,0,"345763",18.0000,,"S",,, -3,1,"Vartanian, Mr. David","male",22,0,0,"2658",7.2250,,"C","13 15",, -3,0,"Vendel, Mr. Olof Edvin","male",20,0,0,"350416",7.8542,,"S",,, -3,0,"Vestrom, Miss. Hulda Amanda Adolfina","female",14,0,0,"350406",7.8542,,"S",,, -3,0,"Vovk, Mr. Janko","male",22,0,0,"349252",7.8958,,"S",,, -3,0,"Waelens, Mr. Achille","male",22,0,0,"345767",9.0000,,"S",,,"Antwerp, Belgium / Stanton, OH" -3,0,"Ware, Mr. Frederick","male",,0,0,"359309",8.0500,,"S",,, -3,0,"Warren, Mr. Charles William","male",,0,0,"C.A. 49867",7.5500,,"S",,, -3,0,"Webber, Mr. James","male",,0,0,"SOTON/OQ 3101316",8.0500,,"S",,, -3,0,"Wenzel, Mr. Linhart","male",32.5,0,0,"345775",9.5000,,"S",,"298", -3,1,"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)","female",38,0,0,"2688",7.2292,,"C","C",, -3,0,"Widegren, Mr. Carl/Charles Peter","male",51,0,0,"347064",7.7500,,"S",,, -3,0,"Wiklund, Mr. Jakob Alfred","male",18,1,0,"3101267",6.4958,,"S",,"314", -3,0,"Wiklund, Mr. Karl Johan","male",21,1,0,"3101266",6.4958,,"S",,, -3,1,"Wilkes, Mrs. James (Ellen Needs)","female",47,1,0,"363272",7.0000,,"S",,, -3,0,"Willer, Mr. Aaron (""Abi Weller"")","male",,0,0,"3410",8.7125,,"S",,, -3,0,"Willey, Mr. Edward","male",,0,0,"S.O./P.P. 751",7.5500,,"S",,, -3,0,"Williams, Mr. Howard Hugh ""Harry""","male",,0,0,"A/5 2466",8.0500,,"S",,, -3,0,"Williams, Mr. Leslie","male",28.5,0,0,"54636",16.1000,,"S",,"14", -3,0,"Windelov, Mr. Einar","male",21,0,0,"SOTON/OQ 3101317",7.2500,,"S",,, -3,0,"Wirz, Mr. Albert","male",27,0,0,"315154",8.6625,,"S",,"131", -3,0,"Wiseman, Mr. Phillippe","male",,0,0,"A/4. 34244",7.2500,,"S",,, -3,0,"Wittevrongel, Mr. Camille","male",36,0,0,"345771",9.5000,,"S",,, -3,0,"Yasbeck, Mr. Antoni","male",27,1,0,"2659",14.4542,,"C","C",, -3,1,"Yasbeck, Mrs. Antoni (Selini Alexander)","female",15,1,0,"2659",14.4542,,"C",,, -3,0,"Youseff, Mr. Gerious","male",45.5,0,0,"2628",7.2250,,"C",,"312", -3,0,"Yousif, Mr. Wazli","male",,0,0,"2647",7.2250,,"C",,, -3,0,"Yousseff, Mr. Gerious","male",,0,0,"2627",14.4583,,"C",,, -3,0,"Zabour, Miss. Hileni","female",14.5,1,0,"2665",14.4542,,"C",,"328", -3,0,"Zabour, Miss. Thamine","female",,1,0,"2665",14.4542,,"C",,, -3,0,"Zakarian, Mr. Mapriededer","male",26.5,0,0,"2656",7.2250,,"C",,"304", -3,0,"Zakarian, Mr. Ortin","male",27,0,0,"2670",7.2250,,"C",,, -3,0,"Zimmerman, Mr. Leo","male",29,0,0,"315082",7.8750,,"S",,, From f8f8686d6e127743dcfcc017422a2d701b5abe12 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Fri, 24 May 2024 21:12:48 +0530 Subject: [PATCH 141/405] 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 d194bfa..c578ade 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -2,7 +2,6 @@ - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) - [Pandas Introduction and Dataframes in Pandas](Introduction_to_Pandas_Library_and_DataFrames.md) -- [Importing and Exportin data in pandas](Importing_and_Exporting_Data_in_Pandas.md) - [Pandas Descriptive Statistics](Descriptive_Statistics.md) - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [Excel using Pandas DataFrame](excel_with_pandas.md) From e6a7ceee0cf230f7d8377f5f19b96a20ac1bfadd Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 24 May 2024 21:12:54 +0530 Subject: [PATCH 142/405] Update installation_features.md --- contrib/scipy/installation_features.md | 89 +++++++++++++++++++------- 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/contrib/scipy/installation_features.md b/contrib/scipy/installation_features.md index 33232dc..d541086 100644 --- a/contrib/scipy/installation_features.md +++ b/contrib/scipy/installation_features.md @@ -1,13 +1,25 @@ ## Installation of Scipy -### Install using the command: -#### C:\Users\Your Name>pip install scipy - You can also use a Python distribution that already has Scipy installed like Anaconda, or Spyder. + +You can install scipy using the command: + +``` +$ pip install scipy +``` + +You can also use a Python distribution that already has Scipy installed like Anaconda, or Spyder. + ### Importing SciPy -#### from scipy import constants + +```python +from scipy import constants +``` + ## Key Features of SciPy ### 1. Numerical Integration -#### It helps in computing definite or indefinite integrals of functions -``` + +It helps in computing definite or indefinite integrals of functions + +```python from scipy import integrate #Define the function to integrate @@ -18,13 +30,18 @@ def f(x): result, error = integrate.quad(f, 0, 1) print(result) ``` + #### Output + ``` 0.33333333333333337 ``` + ### 2. Optimization -#### It can be used to minimize or maximize functions, here is an example of minimizing roots of an equation -``` + +It can be used to minimize or maximize functions, here is an example of minimizing roots of an equation + +```python from scipy.optimize import minimize # Define an objective function to minimize @@ -35,13 +52,18 @@ def objective(x): result = minimize(objective, x0=0) print(result.x) ``` + #### Output + ``` array([-1.30644012]) ``` + ### 3. Linear Algebra -#### Solving Linear computations -``` + +Solving Linear computations + +```python from scipy import linalg import numpy as np @@ -55,13 +77,18 @@ b = np.array([5, 6]) x = linalg.solve(A, b) print(x) ``` + #### Output + ``` array([-4. , 4.5]) ``` + ### 4. Statistics -#### Performing statistics functions, like here we'll be distributing the data -``` + +Performing statistics functions, like here we'll be distributing the data + +```python from scipy import stats import numpy as np @@ -71,9 +98,12 @@ data = stats.norm.rvs(loc=0, scale=1, size=1000) # Fit a normal distribution to the data mean, std = stats.norm.fit(data) ``` + ### 5. Signal Processing -#### To process spectral signals, like EEG or MEG -``` + +To process spectral signals, like EEG or MEG + +```python from scipy import signal import numpy as np @@ -85,14 +115,21 @@ signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.random.randn(1000) b, a = signal.butter(4, 0.1, 'low') filtered_signal = signal.filtfilt(b, a, signal) ``` + The various filters applied that are applied here, are a part of signal analysis at a deeper level. + ### 6. Sparse Matrix -#### The word ' sparse 'means less, i.e., the data is mostly unused during some operation or analysis. So, to handle this data, a Sparse Matrix is created -#### There are two types of Sparse Matrices: -##### 1. CSC: Compressed Sparse Column, it is used for efficient math functions and for column slicing -##### 2. CSR: Compressed Sparse Row, it is used for fast row slicing + +The word ' sparse 'means less, i.e., the data is mostly unused during some operation or analysis. So, to handle this data, a Sparse Matrix is created + +There are two types of Sparse Matrices: + +1. CSC: Compressed Sparse Column, it is used for efficient math functions and for column slicing +2. CSR: Compressed Sparse Row, it is used for fast row slicing + #### In CSC format -``` + +```python from scipy import sparse import numpy as np @@ -104,17 +141,22 @@ values = np.array([1, 2, 1]) sparse_matrix_csc = sparse.csc_matrix((values, (row_indices, col_indices))) ``` + #### In CSR format -``` + +```python from scipy import sparse import numpy as np data = np.array([[0, 0], [0, 1], [2, 0]]) sparse_matrix = sparse.csr_matrix(data) ``` + ### 7. Image Processing -#### It is used to process the images, like changing dimensions or properties. For example, when you're doing a project on medical imaging, this library is mainly used. -``` + +It is used to process the images, like changing dimensions or properties. For example, when you're doing a project on medical imaging, this library is mainly used. + +```python from scipy import ndimage import matplotlib.pyplot as plt @@ -127,4 +169,5 @@ blurred_image = ndimage.gaussian_filter(image, sigma=1) plt.imshow(blurred_image) plt.show() ``` -#### The gaussian blur is one of the properties of the ' ndimage ' package in SciPy libraries, it used for better understanding of the image. + +The gaussian blur is one of the properties of the ' ndimage ' package in SciPy libraries, it used for better understanding of the image. From ab6428fd59dfae627ff94613cc55b19472b6c500 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Fri, 24 May 2024 21:40:43 +0530 Subject: [PATCH 143/405] Update Introduction_to_Pandas_Library_and_DataFrames.md --- ...uction_to_Pandas_Library_and_DataFrames.md | 147 +++--------------- 1 file changed, 25 insertions(+), 122 deletions(-) diff --git a/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md b/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md index 809a155..3552437 100644 --- a/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md +++ b/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md @@ -1,8 +1,5 @@ # Introduction_to_Pandas_Library_and_DataFrames - -> Content Creator - Krishna Kaushik - **As you have learnt Python Programming , now it's time for some applications.** - Machine Learning and Data Science is the emerging field of today's time , to work in this this field your first step should be `Data Science` as Machine Learning is all about data. @@ -110,42 +107,15 @@ You can also create a DataFrame by using `pd.DataFrame()` and passing it a Pytho # Let's create cars_with_colours = pd.DataFrame({"Cars" : ["BMW","Audi","Thar","Honda"], "Colour" : ["Black","White","Red","Green"]}) -cars_with_colours +print(cars_with_colours) ``` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CarsColour
0BMWBlack
1AudiWhite
2TharRed
3HondaGreen
- - + Cars Colour + 0 BMW Black + 1 Audi White + 2 Thar Red + 3 Honda Green + The dictionary key is the `column name` and value are the `column data`. @@ -194,42 +164,15 @@ age record = pd.DataFrame({"Student_Name":students , "Age" :age}) -record +print(record) ``` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Student_NameAge
0Ram19
1Mohan20
2Krishna21
3Shivam24
- - + Student_Name Age + 0 Ram 19 + 1 Mohan 20 + 2 Krishna 21 + 3 Shivam 24 + ```python @@ -269,53 +212,19 @@ record.dtypes ```python -record.describe() # It only display the results for numeric data +print(record.describe()) # It only display the results for numeric data ``` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Age
count4.000000
mean21.000000
std2.160247
min19.000000
25%19.750000
50%20.500000
75%21.750000
max24.000000
- - + Age + count 4.000000 + mean 21.000000 + std 2.160247 + min 19.000000 + 25% 19.750000 + 50% 20.500000 + 75% 21.750000 + max 24.000000 + #### 3. Use `.info()` to find information about the dataframe @@ -333,9 +242,3 @@ record.info() 1 Age 4 non-null int64 dtypes: int64(1), object(1) memory usage: 196.0+ bytes - - - -```python - -``` From 5ccb3f2b0fc0650b26eba3b99fc7f780df6a0fe8 Mon Sep 17 00:00:00 2001 From: Pranshu shah <97401387+shahpranshu27@users.noreply.github.com> Date: Fri, 24 May 2024 22:11:05 +0530 Subject: [PATCH 144/405] create lambda-function.md --- contrib/advanced-python/index.md | 1 + contrib/advanced-python/lambda-function.md | 88 ++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 contrib/advanced-python/lambda-function.md diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 5ea5081..b884dde 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,3 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) +- [Lambda Function](lambda-function.md) diff --git a/contrib/advanced-python/lambda-function.md b/contrib/advanced-python/lambda-function.md new file mode 100644 index 0000000..93a5330 --- /dev/null +++ b/contrib/advanced-python/lambda-function.md @@ -0,0 +1,88 @@ +# Lambda Function + +Lambda functions in Python are small, anonymous functions that can be created on-the-fly. They are defined using the `lambda` keyword instead of the `def` keyword used for regular functions. Lambda functions are typically used for simple tasks where a full-blown function definition is not necessary. + +Here's an example of a lambda function that adds two numbers: + +```python +add = lambda x, y: x + y +print(add(3, 5)) # Output: 8 +``` + +The above lambda function is equivalent to the following regular function: + +```python +def add(x, y): + return x + y + +print(add(3, 5)) # Output: 8 +``` + +The difference between a regular function and a lambda function lies mainly in syntax and usage. Here are some key distinctions: + +1. **Syntax**: Lambda functions are defined using the `lambda` keyword, followed by parameters and a colon, while regular functions use the `def` keyword, followed by the function name, parameters, and a colon. + +2. **Name**: Lambda functions are anonymous; they do not have a name like regular functions. Regular functions are defined with a name. + +3. **Complexity**: Lambda functions are suitable for simple, one-liner tasks. They are not meant for complex operations or tasks that require multiple lines of code. Regular functions can handle more complex logic and can contain multiple statements and lines of code. + +4. **Usage**: Lambda functions are often used in situations where a function is needed as an argument to another function (e.g., sorting, filtering, mapping), or when you want to write concise code without defining a separate function. + +Lambda functions are used primarily for convenience and brevity in situations where a full function definition would be overkill or too cumbersome. They are handy for tasks that require a small, one-time function and can improve code readability when used judiciously. + +## Use Cases + +1. **Sorting**: Lambda functions are often used as key functions for sorting lists, dictionaries, or other data structures based on specific criteria. For example: + + ```python + students = [ + {"name": "Alice", "age": 20}, + {"name": "Bob", "age": 18}, + {"name": "Charlie", "age": 22} + ] + sorted_students = sorted(students, key=lambda x: x["age"]) + ``` + +2. **Filtering**: Lambda functions can be used with filter() to selectively include elements from a collection based on a condition. For instance: + + ```python + numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) + ``` + +3. **Mapping**: Lambda functions are useful with map() to apply a transformation to each element of a collection. For example: + + ```python + numbers = [1, 2, 3, 4, 5] + squared_numbers = list(map(lambda x: x**2, numbers)) + ``` + +4. **Event Handling**: In GUI programming or event-driven systems, lambda functions can be used as event handlers to execute specific actions when an event occurs. For instance: + + ```python + button.clicked.connect(lambda: self.on_button_click(argument)) + ``` + +5. **Callback Functions**: Lambda functions can be passed as callback functions to other functions, especially when a simple operation needs to be performed in response to an event. For example: + + ```python + def process_data(data, callback): + # Process data + result = ... + # Execute callback function + callback(result) + + process_data(data, lambda x: print("Result:", x)) + ``` + +6. **Anonymous Functions in Higher-Order Functions**: Lambda functions are commonly used with higher-order functions such as reduce(), which applies a rolling computation to sequential pairs of values in a list. For example: + + ```python + from functools import reduce + numbers = [1, 2, 3, 4, 5] + sum_of_numbers = reduce(lambda x, y: x + y, numbers) + ``` + +These are just a few examples of how lambda functions can be applied in Python to simplify code and make it more expressive. They are particularly useful in situations where a small, one-time function is needed and defining a separate named function would be excessive. + +In conclusion, **lambda functions** in Python offer a concise and powerful way to handle simple tasks without the need for full function definitions. Their versatility, especially in scenarios like sorting, filtering, and event handling, makes them valuable tools for improving code readability and efficiency. By mastering lambda functions, you can enhance your Python programming skills and tackle various tasks with elegance and brevity. \ No newline at end of file From 855c10a724b480b8f75462b90a1a7eb5a0be73c6 Mon Sep 17 00:00:00 2001 From: Yatharth Date: Fri, 24 May 2024 22:37:19 +0530 Subject: [PATCH 145/405] 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 146/405] 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 147/405] 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 534475bf7a9e19bd4cd432f6ec4e54f5ae825b4d Mon Sep 17 00:00:00 2001 From: manishh12 Date: Fri, 24 May 2024 22:57:17 +0530 Subject: [PATCH 148/405] Added types of optimizers issue#527 --- .../machine-learning/Types_of_optimizers.md | 357 ++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 358 insertions(+) create mode 100644 contrib/machine-learning/Types_of_optimizers.md diff --git a/contrib/machine-learning/Types_of_optimizers.md b/contrib/machine-learning/Types_of_optimizers.md new file mode 100644 index 0000000..7d0a617 --- /dev/null +++ b/contrib/machine-learning/Types_of_optimizers.md @@ -0,0 +1,357 @@ +Sure, here's a more detailed explanation for each optimizer, including the mathematical formulation, intuition, advantages, and disadvantages, along with the Python implementation. + +--- + +# Optimizers in Machine Learning + +Optimizers are algorithms or methods used to change the attributes of your neural network such as weights and learning rate in order to reduce the losses. Optimization algorithms help to minimize (or maximize) an objective function (also called a loss function) which is simply a mathematical function dependent on the model's internal learnable parameters which are used in computing the target values from the set of features. + +## Types of Optimizers + +### 1. Gradient Descent + +**Explanation:** +Gradient Descent is the simplest and most commonly used optimization algorithm. It works by iteratively updating the model parameters in the opposite direction of the gradient of the objective function with respect to the parameters. The idea is to find the minimum of a function by taking steps proportional to the negative of the gradient of the function at the current point. + +**Mathematical Formulation:** + +The update rule for the parameter vector θ in gradient descent is represented by the equation: + +- \(theta_new = theta_old - alpha * gradient/) + +Where: +- theta_old is the old parameter vector. +- theta_new is the updated parameter vector. +- alpha is the learning rate. +- gradient is the gradient of the objective function with respect to the parameters. + + +**Intuition:** +- At each iteration, we calculate the gradient of the cost function. +- The parameters are updated in the opposite direction of the gradient. +- The size of the step is controlled by the learning rate \( \alpha \). + +**Advantages:** +- Simple to implement. +- Suitable for convex problems. + +**Disadvantages:** +- Can be slow for large datasets. +- May get stuck in local minima for non-convex problems. +- Requires careful tuning of the learning rate. + +**Python Implementation:** +```python +import numpy as np + +def gradient_descent(X, y, lr=0.01, epochs=1000): + m, n = X.shape + theta = np.zeros(n) + for epoch in range(epochs): + gradient = np.dot(X.T, (np.dot(X, theta) - y)) / m + theta -= lr * gradient + return theta +``` + +### 2. Stochastic Gradient Descent (SGD) + +**Explanation:** +SGD is a variation of gradient descent where we use only one training example to calculate the gradient and update the parameters. This introduces noise into the parameter updates, which can help to escape local minima but may cause the loss to fluctuate. + +**Mathematical Formulation:** + +- \(theta = theta - alpha * dJ(theta; x_i, y_i) / d(theta)/) + +\( x_i, y_i \) are a single training example and its target. + +**Intuition:** +- At each iteration, a random training example is selected. +- The gradient is calculated and the parameters are updated for this single example. +- This process is repeated for a specified number of epochs. + +**Advantages:** +- Faster updates compared to batch gradient descent. +- Can handle large datasets. +- Helps to escape local minima due to the noise in updates. + +**Disadvantages:** +- Loss function may fluctuate. +- Requires more iterations to converge. + +**Python Implementation:** +```python +def stochastic_gradient_descent(X, y, lr=0.01, epochs=1000): + m, n = X.shape + theta = np.zeros(n) + for epoch in range(epochs): + for i in range(m): + rand_index = np.random.randint(0, m) + xi = X[rand_index:rand_index+1] + yi = y[rand_index:rand_index+1] + gradient = np.dot(xi.T, (np.dot(xi, theta) - yi)) + theta -= lr * gradient + return theta +``` + +### 3. Mini-Batch Gradient Descent + +**Explanation:** +Mini-Batch Gradient Descent is a variation where instead of a single training example or the whole dataset, a mini-batch of examples is used to compute the gradient. This reduces the variance of the parameter updates, leading to more stable convergence. + +**Mathematical Formulation:** + +- theta = theta - alpha * (1/k) * sum(dJ(theta; x_i, y_i) / d(theta)) + +Where: +- \( k \) is the batch size. + +**Intuition:** +- At each iteration, a mini-batch of training examples is selected. +- The gradient is calculated for this mini-batch. +- The parameters are updated based on the average gradient of the mini-batch. + +**Advantages:** +- More stable updates compared to SGD. +- Faster convergence than batch gradient descent. +- Efficient on large datasets. + +**Disadvantages:** +- Requires tuning of batch size. +- Computationally more expensive than SGD per iteration. + +**Python Implementation:** +```python +def mini_batch_gradient_descent(X, y, lr=0.01, epochs=1000, batch_size=32): + m, n = X.shape + theta = np.zeros(n) + for epoch in range(epochs): + indices = np.random.permutation(m) + X_shuffled = X[indices] + y_shuffled = y[indices] + for i in range(0, m, batch_size): + X_i = X_shuffled[i:i+batch_size] + y_i = y_shuffled[i:i+batch_size] + gradient = np.dot(X_i.T, (np.dot(X_i, theta) - y_i)) / batch_size + theta -= lr * gradient + return theta +``` + +### 4. Momentum + +**Explanation:** +Momentum helps accelerate gradient vectors in the right directions, thus leading to faster converging. It accumulates a velocity vector in directions of persistent reduction in the objective function, which helps to smooth the path towards the minimum. + +**Mathematical Formulation:** + +- v_t = gamma * v_{t-1} + alpha * dJ(theta) / d(theta) + +- theta = theta - v_t + +where: + +- \( v_t \) is the velocity. +- \( \gamma \) is the momentum term, typically set between 0.9 and 0.99. + +**Intuition:** +- At each iteration, the gradient is calculated. +- The velocity is updated based on the current gradient and the previous velocity. +- The parameters are updated based on the velocity. + +**Advantages:** +- Faster convergence. +- Reduces oscillations in the parameter updates. + +**Disadvantages:** +- Requires tuning of the momentum term. + +**Python Implementation:** +```python +def momentum_gradient_descent(X, y, lr=0.01, epochs=1000, gamma=0.9): + m, n = X.shape + theta = np.zeros(n) + v = np.zeros(n) + for epoch in range(epochs): + gradient = np.dot(X.T, (np.dot(X, theta) - y)) / m + v = gamma * v + lr * gradient + theta -= v + return theta +``` + +### 5. Nesterov Accelerated Gradient (NAG) + +**Explanation:** +NAG is a variant of the gradient descent with momentum. It looks ahead by a step and calculates the gradient at that point, thus providing more accurate updates. This method helps to correct the overshooting problem seen in standard momentum. + +**Mathematical Formulation:** + +- v_t = gamma * v_{t-1} + alpha * dJ(theta - gamma * v_{t-1}) / d(theta) + +- theta = theta - v_t + + +**Intuition:** +- At each iteration, the parameters are temporarily updated using the previous velocity. +- The gradient is calculated at this lookahead position. +- The velocity and parameters are then updated based on this gradient. + +**Advantages:** +- More accurate updates compared to standard momentum. +- Faster convergence. + +**Disadvantages:** +- Requires tuning of the momentum term. + +**Python Implementation:** +```python +def nesterov_accelerated_gradient(X, y, lr=0.01, epochs=1000, gamma=0.9): + m, n = X.shape + theta = np.zeros(n) + v = np.zeros(n) + for epoch in range(epochs): + lookahead_theta = theta - gamma * v + gradient = np.dot(X.T, (np.dot(X, lookahead_theta) - y)) / m + v = gamma * v + lr * gradient + theta -= v + return theta +``` + +### 6. AdaGrad + +**Explanation:** +AdaGrad adapts the learning rate to the parameters, performing larger updates for infrequent and smaller updates for frequent parameters. It scales the learning rate inversely proportional to the square root of the sum of all historical squared values of the gradient. + +**Mathematical Formulation:** + +- G_t = G_{t-1} + (dJ(theta) / d(theta)) ⊙ (dJ(theta) / d(theta)) + +- theta = theta - (alpha / sqrt(G_t + epsilon)) * (dJ(theta) / d(theta)) + +Where: +- \( G_t \) is the sum of squares of the gradients up to time step \( t \). +- \( \epsilon \) is a small constant to avoid division by zero. + +**Intuition:** +- Accumulates the sum of the squares of the gradients for each parameter. +- Uses this accumulated + + sum to scale the learning rate. +- Parameters with large gradients in the past have smaller learning rates. + +**Advantages:** +- Effective for sparse data. +- Automatically adjusts learning rate. + +**Disadvantages:** +- Learning rate decreases continuously, which can lead to premature convergence. + +**Python Implementation:** +```python +def adagrad(X, y, lr=0.01, epochs=1000, epsilon=1e-8): + m, n = X.shape + theta = np.zeros(n) + G = np.zeros(n) + for epoch in range(epochs): + gradient = np.dot(X.T, (np.dot(X, theta) - y)) / m + G += gradient**2 + adjusted_lr = lr / (np.sqrt(G) + epsilon) + theta -= adjusted_lr * gradient + return theta +``` + +### 7. RMSprop + +**Explanation:** +RMSprop modifies AdaGrad to perform well in non-convex settings by using a moving average of squared gradients to scale the learning rate. It helps to keep the learning rate in check, especially in the presence of noisy gradients. + +**Mathematical Formulation:** + +E[g^2]_t = beta * E[g^2]_{t-1} + (1 - beta) * (dJ(theta) / d(theta)) ⊙ (dJ(theta) / d(theta)) + +theta = theta - (alpha / sqrt(E[g^2]_t + epsilon)) * (dJ(theta) / d(theta)) + +Where: +- \( E[g^2]_t \) is the exponentially decaying average of past squared gradients. +- \( \beta \) is the decay rate. + +**Intuition:** +- Keeps a running average of the squared gradients. +- Uses this average to scale the learning rate. +- Parameters with large gradients have their learning rates reduced. + +**Advantages:** +- Effective for non-convex problems. +- Reduces oscillations in parameter updates. + +**Disadvantages:** +- Requires tuning of the decay rate. + +**Python Implementation:** +```python +def rmsprop(X, y, lr=0.01, epochs=1000, beta=0.9, epsilon=1e-8): + m, n = X.shape + theta = np.zeros(n) + E_g = np.zeros(n) + for epoch in range(epochs): + gradient = np.dot(X.T, (np.dot(X, theta) - y)) / m + E_g = beta * E_g + (1 - beta) * gradient**2 + adjusted_lr = lr / (np.sqrt(E_g) + epsilon) + theta -= adjusted_lr * gradient + return theta +``` + +### 8. Adam + +**Explanation:** +Adam (Adaptive Moment Estimation) combines the advantages of both RMSprop and AdaGrad by keeping an exponentially decaying average of past gradients and past squared gradients. + +**Mathematical Formulation:** + +- m_t = beta1 * m_{t-1} + (1 - beta1) * (dJ(theta) / d(theta)) + +- v_t = beta2 * v_{t-1} + (1 - beta2) * ((dJ(theta) / d(theta))^2) + +- hat_m_t = m_t / (1 - beta1^t) + +- hat_v_t = v_t / (1 - beta2^t) + +- theta = theta - (alpha * hat_m_t) / (sqrt(hat_v_t) + epsilon) + +Where: +- \( m_t \) is the first moment (mean) of the gradient. +- \( v_t \) is the second moment (uncentered variance) of the gradient. +- \( \beta_1, \beta_2 \) are the decay rates for the moment estimates. + +**Intuition:** +- Keeps track of both the mean and the variance of the gradients. +- Uses these to adaptively scale the learning rate. +- Provides a balance between AdaGrad and RMSprop. + +**Advantages:** +- Efficient for large datasets. +- Well-suited for non-convex optimization. +- Handles sparse gradients well. + +**Disadvantages:** +- Requires careful tuning of hyperparameters. +- Can be computationally intensive. + +**Python Implementation:** +```python +def adam(X, y, lr=0.01, epochs=1000, beta1=0.9, beta2=0.999, epsilon=1e-8): + m, n = X.shape + theta = np.zeros(n) + m_t = np.zeros(n) + v_t = np.zeros(n) + for epoch in range(1, epochs+1): + gradient = np.dot(X.T, (np.dot(X, theta) - y)) / m + m_t = beta1 * m_t + (1 - beta1) * gradient + v_t = beta2 * v_t + (1 - beta2) * gradient**2 + m_t_hat = m_t / (1 - beta1**epoch) + v_t_hat = v_t / (1 - beta2**epoch) + theta -= lr * m_t_hat / (np.sqrt(v_t_hat) + epsilon) + return theta +``` + +These implementations are basic examples of how these optimizers can be implemented in Python using NumPy. In practice, libraries like TensorFlow and PyTorch provide highly optimized and more sophisticated implementations of these and other optimization algorithms. + +--- \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 45235e4..ce75c70 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -7,3 +7,4 @@ - [Support Vector Machine Algorithm](support-vector-machine.md) - [Artificial Neural Network from the Ground Up](ArtificialNeuralNetwork.md) - [TensorFlow.md](tensorFlow.md) +- [Types of optimizers](Types_of_optimizers.md) From a51621da8aabd6601923b20eab801707713b5bef Mon Sep 17 00:00:00 2001 From: manishh12 Date: Fri, 24 May 2024 23:01:05 +0530 Subject: [PATCH 149/405] updated readme issue#527 --- contrib/machine-learning/Types_of_optimizers.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/contrib/machine-learning/Types_of_optimizers.md b/contrib/machine-learning/Types_of_optimizers.md index 7d0a617..e941597 100644 --- a/contrib/machine-learning/Types_of_optimizers.md +++ b/contrib/machine-learning/Types_of_optimizers.md @@ -1,7 +1,5 @@ -Sure, here's a more detailed explanation for each optimizer, including the mathematical formulation, intuition, advantages, and disadvantages, along with the Python implementation. --- - # Optimizers in Machine Learning Optimizers are algorithms or methods used to change the attributes of your neural network such as weights and learning rate in order to reduce the losses. Optimization algorithms help to minimize (or maximize) an objective function (also called a loss function) which is simply a mathematical function dependent on the model's internal learnable parameters which are used in computing the target values from the set of features. From 7d1c8f449a297e0c4d2ec6ef4e902971077286b7 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sat, 25 May 2024 00:38:57 +0530 Subject: [PATCH 150/405] Create sorting_numpy_array.md Added Introduction Added sort method Added argsort method Added lexsort method --- contrib/numpy/sorting_numpy_array.md | 104 +++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 contrib/numpy/sorting_numpy_array.md diff --git a/contrib/numpy/sorting_numpy_array.md b/contrib/numpy/sorting_numpy_array.md new file mode 100644 index 0000000..65e9c25 --- /dev/null +++ b/contrib/numpy/sorting_numpy_array.md @@ -0,0 +1,104 @@ +# Sorting NumPy Arrays +- Sorting arrays is a common operation in data manipulation and analysis. +- NumPy provides various functions to sort arrays efficiently. +- The primary methods are `numpy.sort`,`numpy.argsort`, and `numpy.lexsort` + +### 1. numpy.sort() + +The `numpy.sort` function returns a sorted copy of an array. + +#### Syntax : + +```python +numpy.sort(arr, axis=-1, kind=None, order=None) +``` +- **arr** : Array to be sorted. +- **axis** : Axis along which to sort. (By Default is -1) +- **kind** : Sorting algorithm. Options are 'quicksort', 'mergesort', 'heapsort', and 'stable'. (By Default 'quicksort') +- **order** : When arr is an array with fields defined, this argument specifies which fields to compare first. + +#### Example : + +```python +import numpy as np + +arr = np.array([1,7,0,4,6]) +sarr = np.sort(arr) +print(sarr) +``` + +**Output** : +```python +[0 1 4 6 7] +``` + +### 2. numpy.argsort() + +The `numpy.argsort` function returns the indices that would sort an array. Using those indices you can sort the array. + +#### Syntax : + +```python +numpy.argsort(a, axis=-1, kind=None, order=None) +``` +- **arr** : Array to be sorted. +- **axis** : Axis along which to sort. (By Default is -1) +- **kind** : Sorting algorithm. Options are 'quicksort', 'mergesort', 'heapsort', and 'stable'. (By Default 'quicksort') +- **order** : When arr is an array with fields defined, this argument specifies which fields to compare first. + +#### Example : + +```python +import numpy as np + +arr = np.array([2.1,7,4.2,4.3,6]) +indices = np.argsort(arr) +print(indices) +s_arr = arr[indices] +print(s_arr) +``` + +**Output** : +```python +[0 2 3 4 1] +[2.1 4.2 4.3 6. 7. ] +``` + +### 3. np.lexsort() + +The np.lexsort function performs an indirect stable sort using a sequence of keys. + +#### Syntax : + +```python +numpy.lexsort(keys, axis=-1) +``` +- **keys**: Sequence of arrays to sort by. The last key is the primary sort key. +- **axis**: Axis to be indirectly sorted.(By Default -1) + +#### Example : + +```python +import numpy as np + +a = np.array([5,4,3,2]) +b = np.array(['a','d','c','b']) +indices = np.lexsort((a,b)) +print(indices) + +s_arr = a[indices] +print(s_arr) + +s_arr = b[indices] +print(s_arr) +``` + +**Output** : +```python +[0 3 2 1] +[2 3 4 5] +['a' 'b' 'c' 'd'] +``` + +NumPy provides powerful and flexible functions for sorting arrays, including `np.sort`, `np.argsort`, and `np.lexsort`. +These functions support sorting along different axes, using various algorithms, and sorting by multiple keys, making them suitable for a wide range of data manipulation tasks. From 366743436cc8905d9b2163015eb27827114f14e9 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sat, 25 May 2024 00:41:11 +0530 Subject: [PATCH 151/405] Update index.md Added sorting numpy array section --- contrib/numpy/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/numpy/index.md b/contrib/numpy/index.md index 18ed17a..4b4a2c8 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -7,3 +7,4 @@ - [Operations on Arrays in NumPy](operations-on-arrays.md) - [Loading Arrays from Files](loading_arrays_from_files.md) - [Saving Numpy Arrays into FIles](saving_numpy_arrays_to_files.md) +- [Sorting NumPy Arrays](sorting_numpy_array.md) From cc4fa4a47c0802f5bd50456358a888ac6212f459 Mon Sep 17 00:00:00 2001 From: Arihant Yadav <147732947+arihunter-18@users.noreply.github.com> Date: Sat, 25 May 2024 03:07:10 +0530 Subject: [PATCH 152/405] Add files via upload --- contrib/database/intro_mysql_queries.md | 371 ++++++++++++++++++++++++ 1 file changed, 371 insertions(+) create mode 100644 contrib/database/intro_mysql_queries.md diff --git a/contrib/database/intro_mysql_queries.md b/contrib/database/intro_mysql_queries.md new file mode 100644 index 0000000..b955ead --- /dev/null +++ b/contrib/database/intro_mysql_queries.md @@ -0,0 +1,371 @@ +# Introduction to MySQL Queries +MySQL is a widely-used open-source relational database management system (RDBMS) that utilizes SQL (Structured Query Language) for managing and querying data. In Python, the **mysql-connector-python** library allows you to connect to MySQL databases and execute SQL queries, providing a way to interact with the database from within a Python program. + +## Prerequisites +* Python and MySQL Server must be installed and configured. +* The library: **mysql-connector-python** must be installed. + +## Establishing connection with server +To establish a connection with the MySQL server, you need to import the **mysql.connector** module and create a connection object using the **connect()** function by providing the prompt server details as mentioned. + +```python +import mysql.connector + +con = mysql.connector.connect( +host ="localhost", +user ="root", +passwd ="12345" +) + +print((con.is_connected())) +``` +Having established a connection with the server, you get the following output : +``` +True +``` +## Creating a Database [CREATE] +To create a database, you need to execute the **CREATE DATABASE** query. The following code snippet demonstrates how to create a database named **GSSOC**. +```python +import mysql.connector + +# Establish the connection +conn = mysql.connector.connect( + host="localhost", + user="root", + password="12345" +) + +# Create a cursor object +cursor = conn.cursor() + +# Execute the query to show databases +cursor.execute("SHOW DATABASES") + +# Fetch and print the databases +databases = cursor.fetchall() +for database in databases: + print(database[0]) + +# Execute the query to create database GSSOC +cursor.execute("CREATE DATABASE GSSOC") + +print("\nAfter creation of the database\n") + +# Execute the query to show databases +cursor.execute("SHOW DATABASES") +# Fetch and print the databases +databases = cursor.fetchall() +for database in databases: + print(database[0]) + +cursor.close() +conn.close() +``` +You can observe in the output below, after execution of the query a new database named **GSSOC** has been created. +#### Output: +``` +information_schema +mysql +performance_schema +sakila +sys +world + +After creation of the database + +gssoc +information_schema +mysql +performance_schema +sakila +sys +world +``` +## Creating a Table in the Database [CREATE] +Now, we will create a table in the database. We will create a table named **example_table** in the database **GSSOC**. We will execute **CREATE TABLE** query and provide the fields for the table as mentioned in the code below: +```python +import mysql.connector + +# Establish the connection +conn = mysql.connector.connect( + host="localhost", + user="root", + password="12345" +) +# Create a cursor object +cursor = conn.cursor() + +# Execute the query to show tables +cursor.execute("USE GSSOC") +cursor.execute("SHOW TABLES") + +# Fetch and print the tables +tables = cursor.fetchall() +print("Before creation of table\n") +for table in tables: + print(table[0]) + +create_table_query = """ +CREATE TABLE example_table ( + name VARCHAR(255) NOT NULL, + age INT NOT NULL, + email VARCHAR(255) +) +""" +# Execute the query +cursor.execute(create_table_query) + +# Commit the changes +conn.commit() + +print("\nAfter creation of Table\n") +# Execute the query to show tables in GSSOC +cursor.execute("SHOW TABLES") + +# Fetch and print the tables +tables = cursor.fetchall() +for table in tables: + print(table[0]) + +cursor.close() +conn.close() +``` +#### Output: +``` +Before creation of table + + +After creation of Table + +example_table +``` +## Inserting Data [INSERT] +To insert data in an existing table, the **INSERT INTO** query is used, followed by the name of the table in which the data needs to be inserted. The following code demonstrates the insertion of multiple records in the table by **executemany()**. +```python +import mysql.connector + +# Establish the connection +conn = mysql.connector.connect( + host="localhost", + user="root", + password="12345" +) +# Create a cursor object +cursor = conn.cursor() +cursor.execute("USE GSSOC") +# SQL query to insert data +insert_data_query = """ +INSERT INTO example_table (name, age, email) +VALUES (%s, %s, %s) +""" + +# Data to be inserted +data_to_insert = [ + ("John Doe", 28, "john.doe@example.com"), + ("Jane Smith", 34, "jane.smith@example.com"), + ("Sam Brown", 22, "sam.brown@example.com") +] + +# Execute the query for each data entry +cursor.executemany(insert_data_query, data_to_insert) + +conn.commit() +cursor.close() +conn.close() +``` +## Displaying Data [SELECT] +To display the data from a table, the **SELECT** query is used. The following code demonstrates the display of data from the table. +```python +import mysql.connector + +# Establish the connection +conn = mysql.connector.connect( + host="localhost", + user="root", + password="12345" +) +# Create a cursor object +cursor = conn.cursor() +cursor.execute("USE GSSOC") + +# SQL query to display data +display_data_query = "SELECT * FROM example_table" + +# Execute the query for each data entry +cursor.execute(display_data_query) + +# Fetch all the rows +rows = cursor.fetchall() + +# Print the column names +column_names = [desc[0] for desc in cursor.description] +print(column_names) + +# Print the rows +for row in rows: + print(row) + +cursor.close() +conn.close() +``` +#### Output : +``` +['name', 'age', 'email'] +('John Doe', 28, 'john.doe@example.com') +('Jane Smith', 34, 'jane.smith@example.com') +('Sam Brown', 22, 'sam.brown@example.com') +``` +## Updating Data [UPDATE] +To update data in the table, **UPDATE** query is used. In the following code, we will be updating the email and age of the record where the name is John Doe. +```python +import mysql.connector + +# Establish the connection +conn = mysql.connector.connect( + host="localhost", + user="root", + password="12345" +) +# Create a cursor object +cursor = conn.cursor() +cursor.execute("USE GSSOC") + +# SQL query to display data +display_data_query = "SELECT * FROM example_table" + +# SQL Query to update data of John Doe +update_data_query = """ +UPDATE example_table +SET age = %s, email = %s +WHERE name = %s +""" + +# Data to be updated +data_to_update = (30, "new.email@example.com", "John Doe") + +# Execute the query +cursor.execute(update_data_query, data_to_update) + +# Commit the changes +conn.commit() + +# Execute the query for each data entry +cursor.execute(display_data_query) + +# Fetch all the rows +rows = cursor.fetchall() + +# Print the column names +column_names = [desc[0] for desc in cursor.description] +print(column_names) + +# Print the rows +for row in rows: + print(row) + +cursor.close() +conn.close() +``` +#### Output: +``` +['name', 'age', 'email'] +('John Doe', 30, 'new.email@example.com') +('Jane Smith', 34, 'jane.smith@example.com') +('Sam Brown', 22, 'sam.brown@example.com') +``` + +## Deleting Data [DELETE] +In this segment, we will Delete the record named "John Doe" using the **DELETE** and **WHERE** statements in the query. The following code explains the same and the observe the change in output. +```python +import mysql.connector + +# Establish the connection +conn = mysql.connector.connect( + host="localhost", + user="root", + password="12345" +) +# Create a cursor object +cursor = conn.cursor() +cursor.execute("USE GSSOC") + +# SQL query to display data +display_data_query = "SELECT * FROM example_table" + +# SQL query to delete data +delete_data_query = "DELETE FROM example_table WHERE name = %s" + +# Data to be deleted +data_to_delete = ("John Doe",) + +# Execute the query +cursor.execute(delete_data_query, data_to_delete) + +# Commit the changes +conn.commit() + +# Execute the query for each data entry +cursor.execute(display_data_query) + +# Fetch all the rows +rows = cursor.fetchall() + +# Print the column names +column_names = [desc[0] for desc in cursor.description] +print(column_names) + +# Print the rows +for row in rows: + print(row) + +cursor.close() +conn.close() +``` +#### Output: +``` +['name', 'age', 'email'] +('Jane Smith', 34, 'jane.smith@example.com') +('Sam Brown', 22, 'sam.brown@example.com') +``` +## Deleting the Table/Database [DROP] +For deleting a table, you can use the **DROP** query in the following manner: +```python +import mysql.connector + +# Establish the connection +conn = mysql.connector.connect( + host="localhost", + user="root", + password="12345" +) +# Create a cursor object +cursor = conn.cursor() +cursor.execute("USE GSSOC") + +# SQL query to delete the table +delete_table_query = "DROP TABLE IF EXISTS example_table" + +# Execute the query +cursor.execute(delete_table_query) + +# Verify the table deletion +cursor.execute("SHOW TABLES LIKE 'example_table'") +result = cursor.fetchone() + +cursor.close() +conn.close() + +if result: + print("Table deletion failed.") +else: + print("Table successfully deleted.") +``` +#### Output: +``` +Table successfully deleted. +``` +Similarly, you can delete the database also by using the **DROP** and accordingly changing the query to be executed. + + + + From fd5c4ec3345a48c46eff8ed0db3826b6b6845227 Mon Sep 17 00:00:00 2001 From: Arihant Yadav <147732947+arihunter-18@users.noreply.github.com> Date: Sat, 25 May 2024 03:09:38 +0530 Subject: [PATCH 153/405] Add files via upload --- 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 82596a2..56cd85b 100644 --- a/contrib/database/index.md +++ b/contrib/database/index.md @@ -1,3 +1,3 @@ # List of sections -- [Section title](filename.md) +- [Introduction to MySQL and Queries](intro_mysql_queries.md) From 91c57b20b772613d779c2bbd963385d2458f6773 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 25 May 2024 04:58:13 +0530 Subject: [PATCH 154/405] Rename Introduction_to_Pandas_Library_and_DataFrames.md to introduction.md --- ...uction_to_Pandas_Library_and_DataFrames.md => introduction.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{Introduction_to_Pandas_Library_and_DataFrames.md => introduction.md} (100%) diff --git a/contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md b/contrib/pandas/introduction.md similarity index 100% rename from contrib/pandas/Introduction_to_Pandas_Library_and_DataFrames.md rename to contrib/pandas/introduction.md From 6ec6fd6f409f96d26afb7b0b6554da02a1dfc74d Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 25 May 2024 04:58:34 +0530 Subject: [PATCH 155/405] 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 c578ade..2874431 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,7 +1,7 @@ # List of sections +- [Pandas Introduction and Dataframes in Pandas](introduction.md) - [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) -- [Pandas Introduction and Dataframes in Pandas](Introduction_to_Pandas_Library_and_DataFrames.md) - [Pandas Descriptive Statistics](Descriptive_Statistics.md) - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [Excel using Pandas DataFrame](excel_with_pandas.md) From 54eec70ca9001137fb9d80d442c3fd7d31f7b1ce Mon Sep 17 00:00:00 2001 From: Pranshu shah <97401387+shahpranshu27@users.noreply.github.com> Date: Sat, 25 May 2024 07:25:26 +0530 Subject: [PATCH 156/405] create map-function.md --- contrib/advanced-python/index.md | 1 + contrib/advanced-python/map-function.md | 54 +++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 contrib/advanced-python/map-function.md diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 880b393..e1ff216 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -5,3 +5,4 @@ - [Regular Expressions in Python](regular_expressions.md) - [JSON module](json-module.md) - [OOPs](OOPs.md) +- [Map Function](map-function.md) diff --git a/contrib/advanced-python/map-function.md b/contrib/advanced-python/map-function.md new file mode 100644 index 0000000..be035d0 --- /dev/null +++ b/contrib/advanced-python/map-function.md @@ -0,0 +1,54 @@ +The `map()` function in Python is a built-in function used for applying a given function to each item of an iterable (like a list, tuple, or dictionary) and returning a new iterable with the results. It's a powerful tool for transforming data without the need for explicit loops. Let's break down its syntax, explore examples, and discuss various use cases. + +### Syntax: + +```python +map(function, iterable1, iterable2, ...) +``` + +- `function`: The function to apply to each item in the iterables. +- `iterable1`, `iterable2`, ...: One or more iterable objects whose items will be passed as arguments to `function`. + +### Examples: + +#### Example 1: Doubling the values in a list + +```python +# Define the function +def double(x): + return x * 2 + +# Apply the function to each item in the list using map +original_list = [1, 2, 3, 4, 5] +doubled_list = list(map(double, original_list)) +print(doubled_list) # Output: [2, 4, 6, 8, 10] +``` + +#### Example 2: Converting temperatures from Celsius to Fahrenheit + +```python +# Define the function +def celsius_to_fahrenheit(celsius): + return (celsius * 9/5) + 32 + +# Apply the function to each Celsius temperature using map +celsius_temperatures = [0, 10, 20, 30, 40] +fahrenheit_temperatures = list(map(celsius_to_fahrenheit, celsius_temperatures)) +print(fahrenheit_temperatures) # Output: [32.0, 50.0, 68.0, 86.0, 104.0] +``` + +### Use Cases: + +1. **Data Transformation**: When you need to apply a function to each item of a collection and obtain the transformed values, `map()` is very handy. + +2. **Parallel Processing**: In some cases, `map()` can be utilized in parallel processing scenarios, especially when combined with `multiprocessing` or `concurrent.futures`. + +3. **Cleaning and Formatting Data**: It's often used in data processing pipelines for tasks like converting data types, normalizing values, or applying formatting functions. + +4. **Functional Programming**: In functional programming paradigms, `map()` is frequently used along with other functional constructs like `filter()` and `reduce()` for concise and expressive code. + +5. **Generating Multiple Outputs**: You can use `map()` to generate multiple outputs simultaneously by passing multiple iterables. The function will be applied to corresponding items in the iterables. + +6. **Lazy Evaluation**: In Python 3, `map()` returns an iterator rather than a list. This means it's memory efficient and can handle large datasets without loading everything into memory at once. + +Remember, while `map()` is powerful, it's essential to balance its use with readability and clarity. Sometimes, a simple loop might be more understandable than a `map()` call. \ No newline at end of file From 9680263fa2e36061cf81665b6c1e2a6560e8e77b Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 25 May 2024 08:19:34 +0530 Subject: [PATCH 157/405] Create readme.md --- contrib/pandas/Datasets/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/pandas/Datasets/readme.md diff --git a/contrib/pandas/Datasets/readme.md b/contrib/pandas/Datasets/readme.md new file mode 100644 index 0000000..ea2255c --- /dev/null +++ b/contrib/pandas/Datasets/readme.md @@ -0,0 +1 @@ +## This folder contains all the Datasets used in the content. From 1b654fd3abd8a6a940f99e367e5a4ca0d67e9a44 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 25 May 2024 08:19:56 +0530 Subject: [PATCH 158/405] Add files via upload --- contrib/pandas/Datasets/Titanic.csv | 1310 +++++++++++++++++++++++++++ 1 file changed, 1310 insertions(+) create mode 100644 contrib/pandas/Datasets/Titanic.csv diff --git a/contrib/pandas/Datasets/Titanic.csv b/contrib/pandas/Datasets/Titanic.csv new file mode 100644 index 0000000..f8d49dc --- /dev/null +++ b/contrib/pandas/Datasets/Titanic.csv @@ -0,0 +1,1310 @@ +"pclass","survived","name","sex","age","sibsp","parch","ticket","fare","cabin","embarked","boat","body","home.dest" +1,1,"Allen, Miss. Elisabeth Walton","female",29,0,0,"24160",211.3375,"B5","S","2",,"St Louis, MO" +1,1,"Allison, Master. Hudson Trevor","male",0.92,1,2,"113781",151.5500,"C22 C26","S","11",,"Montreal, PQ / Chesterville, ON" +1,0,"Allison, Miss. Helen Loraine","female",2,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" +1,0,"Allison, Mr. Hudson Joshua Creighton","male",30,1,2,"113781",151.5500,"C22 C26","S",,"135","Montreal, PQ / Chesterville, ON" +1,0,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)","female",25,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" +1,1,"Anderson, Mr. Harry","male",48,0,0,"19952",26.5500,"E12","S","3",,"New York, NY" +1,1,"Andrews, Miss. Kornelia Theodosia","female",63,1,0,"13502",77.9583,"D7","S","10",,"Hudson, NY" +1,0,"Andrews, Mr. Thomas Jr","male",39,0,0,"112050",0.0000,"A36","S",,,"Belfast, NI" +1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)","female",53,2,0,"11769",51.4792,"C101","S","D",,"Bayside, Queens, NY" +1,0,"Artagaveytia, Mr. Ramon","male",71,0,0,"PC 17609",49.5042,,"C",,"22","Montevideo, Uruguay" +1,0,"Astor, Col. John Jacob","male",47,1,0,"PC 17757",227.5250,"C62 C64","C",,"124","New York, NY" +1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)","female",18,1,0,"PC 17757",227.5250,"C62 C64","C","4",,"New York, NY" +1,1,"Aubart, Mme. Leontine Pauline","female",24,0,0,"PC 17477",69.3000,"B35","C","9",,"Paris, France" +1,1,"Barber, Miss. Ellen ""Nellie""","female",26,0,0,"19877",78.8500,,"S","6",, +1,1,"Barkworth, Mr. Algernon Henry Wilson","male",80,0,0,"27042",30.0000,"A23","S","B",,"Hessle, Yorks" +1,0,"Baumann, Mr. John D","male",,0,0,"PC 17318",25.9250,,"S",,,"New York, NY" +1,0,"Baxter, Mr. Quigg Edmond","male",24,0,1,"PC 17558",247.5208,"B58 B60","C",,,"Montreal, PQ" +1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)","female",50,0,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" +1,1,"Bazzani, Miss. Albina","female",32,0,0,"11813",76.2917,"D15","C","8",, +1,0,"Beattie, Mr. Thomson","male",36,0,0,"13050",75.2417,"C6","C","A",,"Winnipeg, MN" +1,1,"Beckwith, Mr. Richard Leonard","male",37,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" +1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)","female",47,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" +1,1,"Behr, Mr. Karl Howell","male",26,0,0,"111369",30.0000,"C148","C","5",,"New York, NY" +1,1,"Bidois, Miss. Rosalie","female",42,0,0,"PC 17757",227.5250,,"C","4",, +1,1,"Bird, Miss. Ellen","female",29,0,0,"PC 17483",221.7792,"C97","S","8",, +1,0,"Birnbaum, Mr. Jakob","male",25,0,0,"13905",26.0000,,"C",,"148","San Francisco, CA" +1,1,"Bishop, Mr. Dickinson H","male",25,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" +1,1,"Bishop, Mrs. Dickinson H (Helen Walton)","female",19,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" +1,1,"Bissette, Miss. Amelia","female",35,0,0,"PC 17760",135.6333,"C99","S","8",, +1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan","male",28,0,0,"110564",26.5500,"C52","S","D",,"Stockholm, Sweden / Washington, DC" +1,0,"Blackwell, Mr. Stephen Weart","male",45,0,0,"113784",35.5000,"T","S",,,"Trenton, NJ" +1,1,"Blank, Mr. Henry","male",40,0,0,"112277",31.0000,"A31","C","7",,"Glen Ridge, NJ" +1,1,"Bonnell, Miss. Caroline","female",30,0,0,"36928",164.8667,"C7","S","8",,"Youngstown, OH" +1,1,"Bonnell, Miss. Elizabeth","female",58,0,0,"113783",26.5500,"C103","S","8",,"Birkdale, England Cleveland, Ohio" +1,0,"Borebank, Mr. John James","male",42,0,0,"110489",26.5500,"D22","S",,,"London / Winnipeg, MB" +1,1,"Bowen, Miss. Grace Scott","female",45,0,0,"PC 17608",262.3750,,"C","4",,"Cooperstown, NY" +1,1,"Bowerman, Miss. Elsie Edith","female",22,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" +1,1,"Bradley, Mr. George (""George Arthur Brayton"")","male",,0,0,"111427",26.5500,,"S","9",,"Los Angeles, CA" +1,0,"Brady, Mr. John Bertram","male",41,0,0,"113054",30.5000,"A21","S",,,"Pomeroy, WA" +1,0,"Brandeis, Mr. Emil","male",48,0,0,"PC 17591",50.4958,"B10","C",,"208","Omaha, NE" +1,0,"Brewe, Dr. Arthur Jackson","male",,0,0,"112379",39.6000,,"C",,,"Philadelphia, PA" +1,1,"Brown, Mrs. James Joseph (Margaret Tobin)","female",44,0,0,"PC 17610",27.7208,"B4","C","6",,"Denver, CO" +1,1,"Brown, Mrs. John Murray (Caroline Lane Lamson)","female",59,2,0,"11769",51.4792,"C101","S","D",,"Belmont, MA" +1,1,"Bucknell, Mrs. William Robert (Emma Eliza Ward)","female",60,0,0,"11813",76.2917,"D15","C","8",,"Philadelphia, PA" +1,1,"Burns, Miss. Elizabeth Margaret","female",41,0,0,"16966",134.5000,"E40","C","3",, +1,0,"Butt, Major. Archibald Willingham","male",45,0,0,"113050",26.5500,"B38","S",,,"Washington, DC" +1,0,"Cairns, Mr. Alexander","male",,0,0,"113798",31.0000,,"S",,, +1,1,"Calderhead, Mr. Edward Pennington","male",42,0,0,"PC 17476",26.2875,"E24","S","5",,"New York, NY" +1,1,"Candee, Mrs. Edward (Helen Churchill Hungerford)","female",53,0,0,"PC 17606",27.4458,,"C","6",,"Washington, DC" +1,1,"Cardeza, Mr. Thomas Drake Martinez","male",36,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Austria-Hungary / Germantown, Philadelphia, PA" +1,1,"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)","female",58,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Germantown, Philadelphia, PA" +1,0,"Carlsson, Mr. Frans Olof","male",33,0,0,"695",5.0000,"B51 B53 B55","S",,,"New York, NY" +1,0,"Carrau, Mr. Francisco M","male",28,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" +1,0,"Carrau, Mr. Jose Pedro","male",17,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" +1,1,"Carter, Master. William Thornton II","male",11,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" +1,1,"Carter, Miss. Lucile Polk","female",14,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" +1,1,"Carter, Mr. William Ernest","male",36,1,2,"113760",120.0000,"B96 B98","S","C",,"Bryn Mawr, PA" +1,1,"Carter, Mrs. William Ernest (Lucile Polk)","female",36,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" +1,0,"Case, Mr. Howard Brown","male",49,0,0,"19924",26.0000,,"S",,,"Ascot, Berkshire / Rochester, NY" +1,1,"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)","female",,0,0,"17770",27.7208,,"C","5",,"New York, NY" +1,0,"Cavendish, Mr. Tyrell William","male",36,1,0,"19877",78.8500,"C46","S",,"172","Little Onn Hall, Staffs" +1,1,"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)","female",76,1,0,"19877",78.8500,"C46","S","6",,"Little Onn Hall, Staffs" +1,0,"Chaffee, Mr. Herbert Fuller","male",46,1,0,"W.E.P. 5734",61.1750,"E31","S",,,"Amenia, ND" +1,1,"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)","female",47,1,0,"W.E.P. 5734",61.1750,"E31","S","4",,"Amenia, ND" +1,1,"Chambers, Mr. Norman Campbell","male",27,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" +1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)","female",33,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" +1,1,"Chaudanson, Miss. Victorine","female",36,0,0,"PC 17608",262.3750,"B61","C","4",, +1,1,"Cherry, Miss. Gladys","female",30,0,0,"110152",86.5000,"B77","S","8",,"London, England" +1,1,"Chevre, Mr. Paul Romaine","male",45,0,0,"PC 17594",29.7000,"A9","C","7",,"Paris, France" +1,1,"Chibnall, Mrs. (Edith Martha Bowerman)","female",,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" +1,0,"Chisholm, Mr. Roderick Robert Crispin","male",,0,0,"112051",0.0000,,"S",,,"Liverpool, England / Belfast" +1,0,"Clark, Mr. Walter Miller","male",27,1,0,"13508",136.7792,"C89","C",,,"Los Angeles, CA" +1,1,"Clark, Mrs. Walter Miller (Virginia McDowell)","female",26,1,0,"13508",136.7792,"C89","C","4",,"Los Angeles, CA" +1,1,"Cleaver, Miss. Alice","female",22,0,0,"113781",151.5500,,"S","11",, +1,0,"Clifford, Mr. George Quincy","male",,0,0,"110465",52.0000,"A14","S",,,"Stoughton, MA" +1,0,"Colley, Mr. Edward Pomeroy","male",47,0,0,"5727",25.5875,"E58","S",,,"Victoria, BC" +1,1,"Compton, Miss. Sara Rebecca","female",39,1,1,"PC 17756",83.1583,"E49","C","14",,"Lakewood, NJ" +1,0,"Compton, Mr. Alexander Taylor Jr","male",37,1,1,"PC 17756",83.1583,"E52","C",,,"Lakewood, NJ" +1,1,"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)","female",64,0,2,"PC 17756",83.1583,"E45","C","14",,"Lakewood, NJ" +1,1,"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)","female",55,2,0,"11770",25.7000,"C101","S","2",,"New York, NY" +1,0,"Crafton, Mr. John Bertram","male",,0,0,"113791",26.5500,,"S",,,"Roachdale, IN" +1,0,"Crosby, Capt. Edward Gifford","male",70,1,1,"WE/P 5735",71.0000,"B22","S",,"269","Milwaukee, WI" +1,1,"Crosby, Miss. Harriet R","female",36,0,2,"WE/P 5735",71.0000,"B22","S","7",,"Milwaukee, WI" +1,1,"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)","female",64,1,1,"112901",26.5500,"B26","S","7",,"Milwaukee, WI" +1,0,"Cumings, Mr. John Bradley","male",39,1,0,"PC 17599",71.2833,"C85","C",,,"New York, NY" +1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)","female",38,1,0,"PC 17599",71.2833,"C85","C","4",,"New York, NY" +1,1,"Daly, Mr. Peter Denis ","male",51,0,0,"113055",26.5500,"E17","S","5 9",,"Lima, Peru" +1,1,"Daniel, Mr. Robert Williams","male",27,0,0,"113804",30.5000,,"S","3",,"Philadelphia, PA" +1,1,"Daniels, Miss. Sarah","female",33,0,0,"113781",151.5500,,"S","8",, +1,0,"Davidson, Mr. Thornton","male",31,1,0,"F.C. 12750",52.0000,"B71","S",,,"Montreal, PQ" +1,1,"Davidson, Mrs. Thornton (Orian Hays)","female",27,1,2,"F.C. 12750",52.0000,"B71","S","3",,"Montreal, PQ" +1,1,"Dick, Mr. Albert Adrian","male",31,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" +1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)","female",17,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" +1,1,"Dodge, Dr. Washington","male",53,1,1,"33638",81.8583,"A34","S","13",,"San Francisco, CA" +1,1,"Dodge, Master. Washington","male",4,0,2,"33638",81.8583,"A34","S","5",,"San Francisco, CA" +1,1,"Dodge, Mrs. Washington (Ruth Vidaver)","female",54,1,1,"33638",81.8583,"A34","S","5",,"San Francisco, CA" +1,0,"Douglas, Mr. Walter Donald","male",50,1,0,"PC 17761",106.4250,"C86","C",,"62","Deephaven, MN / Cedar Rapids, IA" +1,1,"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)","female",27,1,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" +1,1,"Douglas, Mrs. Walter Donald (Mahala Dutton)","female",48,1,0,"PC 17761",106.4250,"C86","C","2",,"Deephaven, MN / Cedar Rapids, IA" +1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")","female",48,1,0,"11755",39.6000,"A16","C","1",,"London / Paris" +1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")","male",49,1,0,"PC 17485",56.9292,"A20","C","1",,"London / Paris" +1,0,"Dulles, Mr. William Crothers","male",39,0,0,"PC 17580",29.7000,"A18","C",,"133","Philadelphia, PA" +1,1,"Earnshaw, Mrs. Boulton (Olive Potter)","female",23,0,1,"11767",83.1583,"C54","C","7",,"Mt Airy, Philadelphia, PA" +1,1,"Endres, Miss. Caroline Louise","female",38,0,0,"PC 17757",227.5250,"C45","C","4",,"New York, NY" +1,1,"Eustis, Miss. Elizabeth Mussey","female",54,1,0,"36947",78.2667,"D20","C","4",,"Brookline, MA" +1,0,"Evans, Miss. Edith Corse","female",36,0,0,"PC 17531",31.6792,"A29","C",,,"New York, NY" +1,0,"Farthing, Mr. John","male",,0,0,"PC 17483",221.7792,"C95","S",,, +1,1,"Flegenheim, Mrs. Alfred (Antoinette)","female",,0,0,"PC 17598",31.6833,,"S","7",,"New York, NY" +1,1,"Fleming, Miss. Margaret","female",,0,0,"17421",110.8833,,"C","4",, +1,1,"Flynn, Mr. John Irwin (""Irving"")","male",36,0,0,"PC 17474",26.3875,"E25","S","5",,"Brooklyn, NY" +1,0,"Foreman, Mr. Benjamin Laventall","male",30,0,0,"113051",27.7500,"C111","C",,,"New York, NY" +1,1,"Fortune, Miss. Alice Elizabeth","female",24,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,1,"Fortune, Miss. Ethel Flora","female",28,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,1,"Fortune, Miss. Mabel Helen","female",23,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,0,"Fortune, Mr. Charles Alexander","male",19,3,2,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" +1,0,"Fortune, Mr. Mark","male",64,1,4,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" +1,1,"Fortune, Mrs. Mark (Mary McDougald)","female",60,1,4,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" +1,1,"Francatelli, Miss. Laura Mabel","female",30,0,0,"PC 17485",56.9292,"E36","C","1",, +1,0,"Franklin, Mr. Thomas Parham","male",,0,0,"113778",26.5500,"D34","S",,,"Westcliff-on-Sea, Essex" +1,1,"Frauenthal, Dr. Henry William","male",50,2,0,"PC 17611",133.6500,,"S","5",,"New York, NY" +1,1,"Frauenthal, Mr. Isaac Gerald","male",43,1,0,"17765",27.7208,"D40","C","5",,"New York, NY" +1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)","female",,1,0,"PC 17611",133.6500,,"S","5",,"New York, NY" +1,1,"Frolicher, Miss. Hedwig Margaritha","female",22,0,2,"13568",49.5000,"B39","C","5",,"Zurich, Switzerland" +1,1,"Frolicher-Stehli, Mr. Maxmillian","male",60,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" +1,1,"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)","female",48,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" +1,0,"Fry, Mr. Richard","male",,0,0,"112058",0.0000,"B102","S",,, +1,0,"Futrelle, Mr. Jacques Heath","male",37,1,0,"113803",53.1000,"C123","S",,,"Scituate, MA" +1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)","female",35,1,0,"113803",53.1000,"C123","S","D",,"Scituate, MA" +1,0,"Gee, Mr. Arthur H","male",47,0,0,"111320",38.5000,"E63","S",,"275","St Anne's-on-Sea, Lancashire" +1,1,"Geiger, Miss. Amalie","female",35,0,0,"113503",211.5000,"C130","C","4",, +1,1,"Gibson, Miss. Dorothy Winifred","female",22,0,1,"112378",59.4000,,"C","7",,"New York, NY" +1,1,"Gibson, Mrs. Leonard (Pauline C Boeson)","female",45,0,1,"112378",59.4000,,"C","7",,"New York, NY" +1,0,"Giglio, Mr. Victor","male",24,0,0,"PC 17593",79.2000,"B86","C",,, +1,1,"Goldenberg, Mr. Samuel L","male",49,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" +1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)","female",,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" +1,0,"Goldschmidt, Mr. George B","male",71,0,0,"PC 17754",34.6542,"A5","C",,,"New York, NY" +1,1,"Gracie, Col. Archibald IV","male",53,0,0,"113780",28.5000,"C51","C","B",,"Washington, DC" +1,1,"Graham, Miss. Margaret Edith","female",19,0,0,"112053",30.0000,"B42","S","3",,"Greenwich, CT" +1,0,"Graham, Mr. George Edward","male",38,0,1,"PC 17582",153.4625,"C91","S",,"147","Winnipeg, MB" +1,1,"Graham, Mrs. William Thompson (Edith Junkins)","female",58,0,1,"PC 17582",153.4625,"C125","S","3",,"Greenwich, CT" +1,1,"Greenfield, Mr. William Bertram","male",23,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" +1,1,"Greenfield, Mrs. Leo David (Blanche Strouse)","female",45,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" +1,0,"Guggenheim, Mr. Benjamin","male",46,0,0,"PC 17593",79.2000,"B82 B84","C",,,"New York, NY" +1,1,"Harder, Mr. George Achilles","male",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" +1,1,"Harder, Mrs. George Achilles (Dorothy Annan)","female",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" +1,1,"Harper, Mr. Henry Sleeper","male",48,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" +1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)","female",49,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" +1,0,"Harrington, Mr. Charles H","male",,0,0,"113796",42.4000,,"S",,, +1,0,"Harris, Mr. Henry Birkhardt","male",45,1,0,"36973",83.4750,"C83","S",,,"New York, NY" +1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)","female",35,1,0,"36973",83.4750,"C83","S","D",,"New York, NY" +1,0,"Harrison, Mr. William","male",40,0,0,"112059",0.0000,"B94","S",,"110", +1,1,"Hassab, Mr. Hammad","male",27,0,0,"PC 17572",76.7292,"D49","C","3",, +1,1,"Hawksford, Mr. Walter James","male",,0,0,"16988",30.0000,"D45","S","3",,"Kingston, Surrey" +1,1,"Hays, Miss. Margaret Bechstein","female",24,0,0,"11767",83.1583,"C54","C","7",,"New York, NY" +1,0,"Hays, Mr. Charles Melville","male",55,1,1,"12749",93.5000,"B69","S",,"307","Montreal, PQ" +1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)","female",52,1,1,"12749",93.5000,"B69","S","3",,"Montreal, PQ" +1,0,"Head, Mr. Christopher","male",42,0,0,"113038",42.5000,"B11","S",,,"London / Middlesex" +1,0,"Hilliard, Mr. Herbert Henry","male",,0,0,"17463",51.8625,"E46","S",,,"Brighton, MA" +1,0,"Hipkins, Mr. William Edward","male",55,0,0,"680",50.0000,"C39","S",,,"London / Birmingham" +1,1,"Hippach, Miss. Jean Gertrude","female",16,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" +1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)","female",44,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" +1,1,"Hogeboom, Mrs. John C (Anna Andrews)","female",51,1,0,"13502",77.9583,"D11","S","10",,"Hudson, NY" +1,0,"Holverson, Mr. Alexander Oskar","male",42,1,0,"113789",52.0000,,"S",,"38","New York, NY" +1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)","female",35,1,0,"113789",52.0000,,"S","8",,"New York, NY" +1,1,"Homer, Mr. Harry (""Mr E Haven"")","male",35,0,0,"111426",26.5500,,"C","15",,"Indianapolis, IN" +1,1,"Hoyt, Mr. Frederick Maxfield","male",38,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" +1,0,"Hoyt, Mr. William Fisher","male",,0,0,"PC 17600",30.6958,,"C","14",,"New York, NY" +1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)","female",35,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" +1,1,"Icard, Miss. Amelie","female",38,0,0,"113572",80.0000,"B28",,"6",, +1,0,"Isham, Miss. Ann Elizabeth","female",50,0,0,"PC 17595",28.7125,"C49","C",,,"Paris, France New York, NY" +1,1,"Ismay, Mr. Joseph Bruce","male",49,0,0,"112058",0.0000,"B52 B54 B56","S","C",,"Liverpool" +1,0,"Jones, Mr. Charles Cresson","male",46,0,0,"694",26.0000,,"S",,"80","Bennington, VT" +1,0,"Julian, Mr. Henry Forbes","male",50,0,0,"113044",26.0000,"E60","S",,,"London" +1,0,"Keeping, Mr. Edwin","male",32.5,0,0,"113503",211.5000,"C132","C",,"45", +1,0,"Kent, Mr. Edward Austin","male",58,0,0,"11771",29.7000,"B37","C",,"258","Buffalo, NY" +1,0,"Kenyon, Mr. Frederick R","male",41,1,0,"17464",51.8625,"D21","S",,,"Southington / Noank, CT" +1,1,"Kenyon, Mrs. Frederick R (Marion)","female",,1,0,"17464",51.8625,"D21","S","8",,"Southington / Noank, CT" +1,1,"Kimball, Mr. Edwin Nelson Jr","male",42,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" +1,1,"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)","female",45,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" +1,0,"Klaber, Mr. Herman","male",,0,0,"113028",26.5500,"C124","S",,,"Portland, OR" +1,1,"Kreuchen, Miss. Emilie","female",39,0,0,"24160",211.3375,,"S","2",, +1,1,"Leader, Dr. Alice (Farnham)","female",49,0,0,"17465",25.9292,"D17","S","8",,"New York, NY" +1,1,"LeRoy, Miss. Bertha","female",30,0,0,"PC 17761",106.4250,,"C","2",, +1,1,"Lesurer, Mr. Gustave J","male",35,0,0,"PC 17755",512.3292,"B101","C","3",, +1,0,"Lewy, Mr. Ervin G","male",,0,0,"PC 17612",27.7208,,"C",,,"Chicago, IL" +1,0,"Lindeberg-Lind, Mr. Erik Gustaf (""Mr Edward Lingrey"")","male",42,0,0,"17475",26.5500,,"S",,,"Stockholm, Sweden" +1,1,"Lindstrom, Mrs. Carl Johan (Sigrid Posse)","female",55,0,0,"112377",27.7208,,"C","6",,"Stockholm, Sweden" +1,1,"Lines, Miss. Mary Conover","female",16,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" +1,1,"Lines, Mrs. Ernest H (Elizabeth Lindsey James)","female",51,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" +1,0,"Long, Mr. Milton Clyde","male",29,0,0,"113501",30.0000,"D6","S",,"126","Springfield, MA" +1,1,"Longley, Miss. Gretchen Fiske","female",21,0,0,"13502",77.9583,"D9","S","10",,"Hudson, NY" +1,0,"Loring, Mr. Joseph Holland","male",30,0,0,"113801",45.5000,,"S",,,"London / New York, NY" +1,1,"Lurette, Miss. Elise","female",58,0,0,"PC 17569",146.5208,"B80","C",,, +1,1,"Madill, Miss. Georgette Alexandra","female",15,0,1,"24160",211.3375,"B5","S","2",,"St Louis, MO" +1,0,"Maguire, Mr. John Edward","male",30,0,0,"110469",26.0000,"C106","S",,,"Brockton, MA" +1,1,"Maioni, Miss. Roberta","female",16,0,0,"110152",86.5000,"B79","S","8",, +1,1,"Marechal, Mr. Pierre","male",,0,0,"11774",29.7000,"C47","C","7",,"Paris, France" +1,0,"Marvin, Mr. Daniel Warner","male",19,1,0,"113773",53.1000,"D30","S",,,"New York, NY" +1,1,"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)","female",18,1,0,"113773",53.1000,"D30","S","10",,"New York, NY" +1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")","female",24,0,0,"PC 17482",49.5042,"C90","C","6",,"Belgium Montreal, PQ" +1,0,"McCaffry, Mr. Thomas Francis","male",46,0,0,"13050",75.2417,"C6","C",,"292","Vancouver, BC" +1,0,"McCarthy, Mr. Timothy J","male",54,0,0,"17463",51.8625,"E46","S",,"175","Dorchester, MA" +1,1,"McGough, Mr. James Robert","male",36,0,0,"PC 17473",26.2875,"E25","S","7",,"Philadelphia, PA" +1,0,"Meyer, Mr. Edgar Joseph","male",28,1,0,"PC 17604",82.1708,,"C",,,"New York, NY" +1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)","female",,1,0,"PC 17604",82.1708,,"C","6",,"New York, NY" +1,0,"Millet, Mr. Francis Davis","male",65,0,0,"13509",26.5500,"E38","S",,"249","East Bridgewater, MA" +1,0,"Minahan, Dr. William Edward","male",44,2,0,"19928",90.0000,"C78","Q",,"230","Fond du Lac, WI" +1,1,"Minahan, Miss. Daisy E","female",33,1,0,"19928",90.0000,"C78","Q","14",,"Green Bay, WI" +1,1,"Minahan, Mrs. William Edward (Lillian E Thorpe)","female",37,1,0,"19928",90.0000,"C78","Q","14",,"Fond du Lac, WI" +1,1,"Mock, Mr. Philipp Edmund","male",30,1,0,"13236",57.7500,"C78","C","11",,"New York, NY" +1,0,"Molson, Mr. Harry Markland","male",55,0,0,"113787",30.5000,"C30","S",,,"Montreal, PQ" +1,0,"Moore, Mr. Clarence Bloomfield","male",47,0,0,"113796",42.4000,,"S",,,"Washington, DC" +1,0,"Natsch, Mr. Charles H","male",37,0,1,"PC 17596",29.7000,"C118","C",,,"Brooklyn, NY" +1,1,"Newell, Miss. Madeleine","female",31,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" +1,1,"Newell, Miss. Marjorie","female",23,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" +1,0,"Newell, Mr. Arthur Webster","male",58,0,2,"35273",113.2750,"D48","C",,"122","Lexington, MA" +1,1,"Newsom, Miss. Helen Monypeny","female",19,0,2,"11752",26.2833,"D47","S","5",,"New York, NY" +1,0,"Nicholson, Mr. Arthur Ernest","male",64,0,0,"693",26.0000,,"S",,"263","Isle of Wight, England" +1,1,"Oliva y Ocana, Dona. Fermina","female",39,0,0,"PC 17758",108.9000,"C105","C","8",, +1,1,"Omont, Mr. Alfred Fernand","male",,0,0,"F.C. 12998",25.7417,,"C","7",,"Paris, France" +1,1,"Ostby, Miss. Helene Ragnhild","female",22,0,1,"113509",61.9792,"B36","C","5",,"Providence, RI" +1,0,"Ostby, Mr. Engelhart Cornelius","male",65,0,1,"113509",61.9792,"B30","C",,"234","Providence, RI" +1,0,"Ovies y Rodriguez, Mr. Servando","male",28.5,0,0,"PC 17562",27.7208,"D43","C",,"189","?Havana, Cuba" +1,0,"Parr, Mr. William Henry Marsh","male",,0,0,"112052",0.0000,,"S",,,"Belfast" +1,0,"Partner, Mr. Austen","male",45.5,0,0,"113043",28.5000,"C124","S",,"166","Surbiton Hill, Surrey" +1,0,"Payne, Mr. Vivian Ponsonby","male",23,0,0,"12749",93.5000,"B24","S",,,"Montreal, PQ" +1,0,"Pears, Mr. Thomas Clinton","male",29,1,0,"113776",66.6000,"C2","S",,,"Isleworth, England" +1,1,"Pears, Mrs. Thomas (Edith Wearne)","female",22,1,0,"113776",66.6000,"C2","S","8",,"Isleworth, England" +1,0,"Penasco y Castellana, Mr. Victor de Satode","male",18,1,0,"PC 17758",108.9000,"C65","C",,,"Madrid, Spain" +1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)","female",17,1,0,"PC 17758",108.9000,"C65","C","8",,"Madrid, Spain" +1,1,"Perreault, Miss. Anne","female",30,0,0,"12749",93.5000,"B73","S","3",, +1,1,"Peuchen, Major. Arthur Godfrey","male",52,0,0,"113786",30.5000,"C104","S","6",,"Toronto, ON" +1,0,"Porter, Mr. Walter Chamberlain","male",47,0,0,"110465",52.0000,"C110","S",,"207","Worcester, MA" +1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)","female",56,0,1,"11767",83.1583,"C50","C","7",,"Mt Airy, Philadelphia, PA" +1,0,"Reuchlin, Jonkheer. John George","male",38,0,0,"19972",0.0000,,"S",,,"Rotterdam, Netherlands" +1,1,"Rheims, Mr. George Alexander Lucien","male",,0,0,"PC 17607",39.6000,,"S","A",,"Paris / New York, NY" +1,0,"Ringhini, Mr. Sante","male",22,0,0,"PC 17760",135.6333,,"C",,"232", +1,0,"Robbins, Mr. Victor","male",,0,0,"PC 17757",227.5250,,"C",,, +1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)","female",43,0,1,"24160",211.3375,"B3","S","2",,"St Louis, MO" +1,0,"Roebling, Mr. Washington Augustus II","male",31,0,0,"PC 17590",50.4958,"A24","S",,,"Trenton, NJ" +1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")","male",45,0,0,"111428",26.5500,,"S","9",,"New York, NY" +1,0,"Rood, Mr. Hugh Roscoe","male",,0,0,"113767",50.0000,"A32","S",,,"Seattle, WA" +1,1,"Rosenbaum, Miss. Edith Louise","female",33,0,0,"PC 17613",27.7208,"A11","C","11",,"Paris, France" +1,0,"Rosenshine, Mr. George (""Mr George Thorne"")","male",46,0,0,"PC 17585",79.2000,,"C",,"16","New York, NY" +1,0,"Ross, Mr. John Hugo","male",36,0,0,"13049",40.1250,"A10","C",,,"Winnipeg, MB" +1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)","female",33,0,0,"110152",86.5000,"B77","S","8",,"London Vancouver, BC" +1,0,"Rothschild, Mr. Martin","male",55,1,0,"PC 17603",59.4000,,"C",,,"New York, NY" +1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)","female",54,1,0,"PC 17603",59.4000,,"C","6",,"New York, NY" +1,0,"Rowe, Mr. Alfred G","male",33,0,0,"113790",26.5500,,"S",,"109","London" +1,1,"Ryerson, Master. John Borie","male",13,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,1,"Ryerson, Miss. Emily Borie","female",18,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,1,"Ryerson, Miss. Susan Parker ""Suzette""","female",21,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,0,"Ryerson, Mr. Arthur Larned","male",61,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C",,,"Haverford, PA / Cooperstown, NY" +1,1,"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)","female",48,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" +1,1,"Saalfeld, Mr. Adolphe","male",,0,0,"19988",30.5000,"C106","S","3",,"Manchester, England" +1,1,"Sagesser, Mlle. Emma","female",24,0,0,"PC 17477",69.3000,"B35","C","9",, +1,1,"Salomon, Mr. Abraham L","male",,0,0,"111163",26.0000,,"S","1",,"New York, NY" +1,1,"Schabert, Mrs. Paul (Emma Mock)","female",35,1,0,"13236",57.7500,"C28","C","11",,"New York, NY" +1,1,"Serepeca, Miss. Augusta","female",30,0,0,"113798",31.0000,,"C","4",, +1,1,"Seward, Mr. Frederic Kimber","male",34,0,0,"113794",26.5500,,"S","7",,"New York, NY" +1,1,"Shutes, Miss. Elizabeth W","female",40,0,0,"PC 17582",153.4625,"C125","S","3",,"New York, NY / Greenwich CT" +1,1,"Silverthorne, Mr. Spencer Victor","male",35,0,0,"PC 17475",26.2875,"E24","S","5",,"St Louis, MO" +1,0,"Silvey, Mr. William Baird","male",50,1,0,"13507",55.9000,"E44","S",,,"Duluth, MN" +1,1,"Silvey, Mrs. William Baird (Alice Munger)","female",39,1,0,"13507",55.9000,"E44","S","11",,"Duluth, MN" +1,1,"Simonius-Blumer, Col. Oberst Alfons","male",56,0,0,"13213",35.5000,"A26","C","3",,"Basel, Switzerland" +1,1,"Sloper, Mr. William Thompson","male",28,0,0,"113788",35.5000,"A6","S","7",,"New Britain, CT" +1,0,"Smart, Mr. John Montgomery","male",56,0,0,"113792",26.5500,,"S",,,"New York, NY" +1,0,"Smith, Mr. James Clinch","male",56,0,0,"17764",30.6958,"A7","C",,,"St James, Long Island, NY" +1,0,"Smith, Mr. Lucien Philip","male",24,1,0,"13695",60.0000,"C31","S",,,"Huntington, WV" +1,0,"Smith, Mr. Richard William","male",,0,0,"113056",26.0000,"A19","S",,,"Streatham, Surrey" +1,1,"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)","female",18,1,0,"13695",60.0000,"C31","S","6",,"Huntington, WV" +1,1,"Snyder, Mr. John Pillsbury","male",24,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" +1,1,"Snyder, Mrs. John Pillsbury (Nelle Stevenson)","female",23,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" +1,1,"Spedden, Master. Robert Douglas","male",6,0,2,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" +1,1,"Spedden, Mr. Frederic Oakley","male",45,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" +1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)","female",40,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" +1,0,"Spencer, Mr. William Augustus","male",57,1,0,"PC 17569",146.5208,"B78","C",,,"Paris, France" +1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)","female",,1,0,"PC 17569",146.5208,"B78","C","6",,"Paris, France" +1,1,"Stahelin-Maeglin, Dr. Max","male",32,0,0,"13214",30.5000,"B50","C","3",,"Basel, Switzerland" +1,0,"Stead, Mr. William Thomas","male",62,0,0,"113514",26.5500,"C87","S",,,"Wimbledon Park, London / Hayling Island, Hants" +1,1,"Stengel, Mr. Charles Emil Henry","male",54,1,0,"11778",55.4417,"C116","C","1",,"Newark, NJ" +1,1,"Stengel, Mrs. Charles Emil Henry (Annie May Morris)","female",43,1,0,"11778",55.4417,"C116","C","5",,"Newark, NJ" +1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)","female",52,1,0,"36947",78.2667,"D20","C","4",,"Haverford, PA" +1,0,"Stewart, Mr. Albert A","male",,0,0,"PC 17605",27.7208,,"C",,,"Gallipolis, Ohio / ? Paris / New York" +1,1,"Stone, Mrs. George Nelson (Martha Evelyn)","female",62,0,0,"113572",80.0000,"B28",,"6",,"Cincinatti, OH" +1,0,"Straus, Mr. Isidor","male",67,1,0,"PC 17483",221.7792,"C55 C57","S",,"96","New York, NY" +1,0,"Straus, Mrs. Isidor (Rosalie Ida Blun)","female",63,1,0,"PC 17483",221.7792,"C55 C57","S",,,"New York, NY" +1,0,"Sutton, Mr. Frederick","male",61,0,0,"36963",32.3208,"D50","S",,"46","Haddenfield, NJ" +1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)","female",48,0,0,"17466",25.9292,"D17","S","8",,"Brooklyn, NY" +1,1,"Taussig, Miss. Ruth","female",18,0,2,"110413",79.6500,"E68","S","8",,"New York, NY" +1,0,"Taussig, Mr. Emil","male",52,1,1,"110413",79.6500,"E67","S",,,"New York, NY" +1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)","female",39,1,1,"110413",79.6500,"E67","S","8",,"New York, NY" +1,1,"Taylor, Mr. Elmer Zebley","male",48,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" +1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)","female",,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" +1,0,"Thayer, Mr. John Borland","male",49,1,1,"17421",110.8833,"C68","C",,,"Haverford, PA" +1,1,"Thayer, Mr. John Borland Jr","male",17,0,2,"17421",110.8833,"C70","C","B",,"Haverford, PA" +1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)","female",39,1,1,"17421",110.8833,"C68","C","4",,"Haverford, PA" +1,1,"Thorne, Mrs. Gertrude Maybelle","female",,0,0,"PC 17585",79.2000,,"C","D",,"New York, NY" +1,1,"Tucker, Mr. Gilbert Milligan Jr","male",31,0,0,"2543",28.5375,"C53","C","7",,"Albany, NY" +1,0,"Uruchurtu, Don. Manuel E","male",40,0,0,"PC 17601",27.7208,,"C",,,"Mexico City, Mexico" +1,0,"Van der hoef, Mr. Wyckoff","male",61,0,0,"111240",33.5000,"B19","S",,"245","Brooklyn, NY" +1,0,"Walker, Mr. William Anderson","male",47,0,0,"36967",34.0208,"D46","S",,,"East Orange, NJ" +1,1,"Ward, Miss. Anna","female",35,0,0,"PC 17755",512.3292,,"C","3",, +1,0,"Warren, Mr. Frank Manley","male",64,1,0,"110813",75.2500,"D37","C",,,"Portland, OR" +1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)","female",60,1,0,"110813",75.2500,"D37","C","5",,"Portland, OR" +1,0,"Weir, Col. John","male",60,0,0,"113800",26.5500,,"S",,,"England Salt Lake City, Utah" +1,0,"White, Mr. Percival Wayland","male",54,0,1,"35281",77.2875,"D26","S",,,"Brunswick, ME" +1,0,"White, Mr. Richard Frasar","male",21,0,1,"35281",77.2875,"D26","S",,"169","Brunswick, ME" +1,1,"White, Mrs. John Stuart (Ella Holmes)","female",55,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Briarcliff Manor NY" +1,1,"Wick, Miss. Mary Natalie","female",31,0,2,"36928",164.8667,"C7","S","8",,"Youngstown, OH" +1,0,"Wick, Mr. George Dennick","male",57,1,1,"36928",164.8667,,"S",,,"Youngstown, OH" +1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)","female",45,1,1,"36928",164.8667,,"S","8",,"Youngstown, OH" +1,0,"Widener, Mr. George Dunton","male",50,1,1,"113503",211.5000,"C80","C",,,"Elkins Park, PA" +1,0,"Widener, Mr. Harry Elkins","male",27,0,2,"113503",211.5000,"C82","C",,,"Elkins Park, PA" +1,1,"Widener, Mrs. George Dunton (Eleanor Elkins)","female",50,1,1,"113503",211.5000,"C80","C","4",,"Elkins Park, PA" +1,1,"Willard, Miss. Constance","female",21,0,0,"113795",26.5500,,"S","8 10",,"Duluth, MN" +1,0,"Williams, Mr. Charles Duane","male",51,0,1,"PC 17597",61.3792,,"C",,,"Geneva, Switzerland / Radnor, PA" +1,1,"Williams, Mr. Richard Norris II","male",21,0,1,"PC 17597",61.3792,,"C","A",,"Geneva, Switzerland / Radnor, PA" +1,0,"Williams-Lambert, Mr. Fletcher Fellows","male",,0,0,"113510",35.0000,"C128","S",,,"London, England" +1,1,"Wilson, Miss. Helen Alice","female",31,0,0,"16966",134.5000,"E39 E41","C","3",, +1,1,"Woolner, Mr. Hugh","male",,0,0,"19947",35.5000,"C52","S","D",,"London, England" +1,0,"Wright, Mr. George","male",62,0,0,"113807",26.5500,,"S",,,"Halifax, NS" +1,1,"Young, Miss. Marie Grice","female",36,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Washington, DC" +2,0,"Abelson, Mr. Samuel","male",30,1,0,"P/PP 3381",24.0000,,"C",,,"Russia New York, NY" +2,1,"Abelson, Mrs. Samuel (Hannah Wizosky)","female",28,1,0,"P/PP 3381",24.0000,,"C","10",,"Russia New York, NY" +2,0,"Aldworth, Mr. Charles Augustus","male",30,0,0,"248744",13.0000,,"S",,,"Bryn Mawr, PA, USA" +2,0,"Andrew, Mr. Edgardo Samuel","male",18,0,0,"231945",11.5000,,"S",,,"Buenos Aires, Argentina / New Jersey, NJ" +2,0,"Andrew, Mr. Frank Thomas","male",25,0,0,"C.A. 34050",10.5000,,"S",,,"Cornwall, England Houghton, MI" +2,0,"Angle, Mr. William A","male",34,1,0,"226875",26.0000,,"S",,,"Warwick, England" +2,1,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)","female",36,1,0,"226875",26.0000,,"S","11",,"Warwick, England" +2,0,"Ashby, Mr. John","male",57,0,0,"244346",13.0000,,"S",,,"West Hoboken, NJ" +2,0,"Bailey, Mr. Percy Andrew","male",18,0,0,"29108",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" +2,0,"Baimbrigge, Mr. Charles Robert","male",23,0,0,"C.A. 31030",10.5000,,"S",,,"Guernsey" +2,1,"Ball, Mrs. (Ada E Hall)","female",36,0,0,"28551",13.0000,"D","S","10",,"Bristol, Avon / Jacksonville, FL" +2,0,"Banfield, Mr. Frederick James","male",28,0,0,"C.A./SOTON 34068",10.5000,,"S",,,"Plymouth, Dorset / Houghton, MI" +2,0,"Bateman, Rev. Robert James","male",51,0,0,"S.O.P. 1166",12.5250,,"S",,"174","Jacksonville, FL" +2,1,"Beane, Mr. Edward","male",32,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" +2,1,"Beane, Mrs. Edward (Ethel Clarke)","female",19,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" +2,0,"Beauchamp, Mr. Henry James","male",28,0,0,"244358",26.0000,,"S",,,"England" +2,1,"Becker, Master. Richard F","male",1,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" +2,1,"Becker, Miss. Marion Louise","female",4,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" +2,1,"Becker, Miss. Ruth Elizabeth","female",12,2,1,"230136",39.0000,"F4","S","13",,"Guntur, India / Benton Harbour, MI" +2,1,"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)","female",36,0,3,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" +2,1,"Beesley, Mr. Lawrence","male",34,0,0,"248698",13.0000,"D56","S","13",,"London" +2,1,"Bentham, Miss. Lilian W","female",19,0,0,"28404",13.0000,,"S","12",,"Rochester, NY" +2,0,"Berriman, Mr. William John","male",23,0,0,"28425",13.0000,,"S",,,"St Ives, Cornwall / Calumet, MI" +2,0,"Botsford, Mr. William Hull","male",26,0,0,"237670",13.0000,,"S",,,"Elmira, NY / Orange, NJ" +2,0,"Bowenur, Mr. Solomon","male",42,0,0,"211535",13.0000,,"S",,,"London" +2,0,"Bracken, Mr. James H","male",27,0,0,"220367",13.0000,,"S",,,"Lake Arthur, Chavez County, NM" +2,1,"Brown, Miss. Amelia ""Mildred""","female",24,0,0,"248733",13.0000,"F33","S","11",,"London / Montreal, PQ" +2,1,"Brown, Miss. Edith Eileen","female",15,0,2,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" +2,0,"Brown, Mr. Thomas William Solomon","male",60,1,1,"29750",39.0000,,"S",,,"Cape Town, South Africa / Seattle, WA" +2,1,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)","female",40,1,1,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" +2,1,"Bryhl, Miss. Dagmar Jenny Ingeborg ","female",20,1,0,"236853",26.0000,,"S","12",,"Skara, Sweden / Rockford, IL" +2,0,"Bryhl, Mr. Kurt Arnold Gottfrid","male",25,1,0,"236853",26.0000,,"S",,,"Skara, Sweden / Rockford, IL" +2,1,"Buss, Miss. Kate","female",36,0,0,"27849",13.0000,,"S","9",,"Sittingbourne, England / San Diego, CA" +2,0,"Butler, Mr. Reginald Fenton","male",25,0,0,"234686",13.0000,,"S",,"97","Southsea, Hants" +2,0,"Byles, Rev. Thomas Roussel Davids","male",42,0,0,"244310",13.0000,,"S",,,"London" +2,1,"Bystrom, Mrs. (Karolina)","female",42,0,0,"236852",13.0000,,"S",,,"New York, NY" +2,1,"Caldwell, Master. Alden Gates","male",0.83,0,2,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" +2,1,"Caldwell, Mr. Albert Francis","male",26,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" +2,1,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)","female",22,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" +2,1,"Cameron, Miss. Clear Annie","female",35,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" +2,0,"Campbell, Mr. William","male",,0,0,"239853",0.0000,,"S",,,"Belfast" +2,0,"Carbines, Mr. William","male",19,0,0,"28424",13.0000,,"S",,"18","St Ives, Cornwall / Calumet, MI" +2,0,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)","female",44,1,0,"244252",26.0000,,"S",,,"London" +2,0,"Carter, Rev. Ernest Courtenay","male",54,1,0,"244252",26.0000,,"S",,,"London" +2,0,"Chapman, Mr. Charles Henry","male",52,0,0,"248731",13.5000,,"S",,"130","Bronx, NY" +2,0,"Chapman, Mr. John Henry","male",37,1,0,"SC/AH 29037",26.0000,,"S",,"17","Cornwall / Spokane, WA" +2,0,"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)","female",29,1,0,"SC/AH 29037",26.0000,,"S",,,"Cornwall / Spokane, WA" +2,1,"Christy, Miss. Julie Rachel","female",25,1,1,"237789",30.0000,,"S","12",,"London" +2,1,"Christy, Mrs. (Alice Frances)","female",45,0,2,"237789",30.0000,,"S","12",,"London" +2,0,"Clarke, Mr. Charles Valentine","male",29,1,0,"2003",26.0000,,"S",,,"England / San Francisco, CA" +2,1,"Clarke, Mrs. Charles V (Ada Maria Winfield)","female",28,1,0,"2003",26.0000,,"S","14",,"England / San Francisco, CA" +2,0,"Coleridge, Mr. Reginald Charles","male",29,0,0,"W./C. 14263",10.5000,,"S",,,"Hartford, Huntingdonshire" +2,0,"Collander, Mr. Erik Gustaf","male",28,0,0,"248740",13.0000,,"S",,,"Helsinki, Finland Ashtabula, Ohio" +2,1,"Collett, Mr. Sidney C Stuart","male",24,0,0,"28034",10.5000,,"S","9",,"London / Fort Byron, NY" +2,1,"Collyer, Miss. Marjorie ""Lottie""","female",8,0,2,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" +2,0,"Collyer, Mr. Harvey","male",31,1,1,"C.A. 31921",26.2500,,"S",,,"Bishopstoke, Hants / Fayette Valley, ID" +2,1,"Collyer, Mrs. Harvey (Charlotte Annie Tate)","female",31,1,1,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" +2,1,"Cook, Mrs. (Selena Rogers)","female",22,0,0,"W./C. 14266",10.5000,"F33","S","14",,"Pennsylvania" +2,0,"Corbett, Mrs. Walter H (Irene Colvin)","female",30,0,0,"237249",13.0000,,"S",,,"Provo, UT" +2,0,"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)","female",,0,0,"F.C.C. 13534",21.0000,,"S",,,"Upper Burma, India Pittsburgh, PA" +2,0,"Cotterill, Mr. Henry ""Harry""","male",21,0,0,"29107",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" +2,0,"Cunningham, Mr. Alfred Fleming","male",,0,0,"239853",0.0000,,"S",,,"Belfast" +2,1,"Davies, Master. John Morgan Jr","male",8,1,1,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" +2,0,"Davies, Mr. Charles Henry","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"Lyndhurst, England" +2,1,"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ","female",48,0,2,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" +2,1,"Davis, Miss. Mary","female",28,0,0,"237668",13.0000,,"S","13",,"London / Staten Island, NY" +2,0,"de Brito, Mr. Jose Joaquim","male",32,0,0,"244360",13.0000,,"S",,,"Portugal / Sau Paulo, Brazil" +2,0,"Deacon, Mr. Percy William","male",17,0,0,"S.O.C. 14879",73.5000,,"S",,, +2,0,"del Carlo, Mr. Sebastiano","male",29,1,0,"SC/PARIS 2167",27.7208,,"C",,"295","Lucca, Italy / California" +2,1,"del Carlo, Mrs. Sebastiano (Argenia Genovesi)","female",24,1,0,"SC/PARIS 2167",27.7208,,"C","12",,"Lucca, Italy / California" +2,0,"Denbury, Mr. Herbert","male",25,0,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Dibden, Mr. William","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" +2,1,"Doling, Miss. Elsie","female",18,0,1,"231919",23.0000,,"S",,,"Southampton" +2,1,"Doling, Mrs. John T (Ada Julia Bone)","female",34,0,1,"231919",23.0000,,"S",,,"Southampton" +2,0,"Downton, Mr. William James","male",54,0,0,"28403",26.0000,,"S",,,"Holley, NY" +2,1,"Drew, Master. Marshall Brines","male",8,0,2,"28220",32.5000,,"S","10",,"Greenport, NY" +2,0,"Drew, Mr. James Vivian","male",42,1,1,"28220",32.5000,,"S",,,"Greenport, NY" +2,1,"Drew, Mrs. James Vivian (Lulu Thorne Christian)","female",34,1,1,"28220",32.5000,,"S","10",,"Greenport, NY" +2,1,"Duran y More, Miss. Asuncion","female",27,1,0,"SC/PARIS 2149",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" +2,1,"Duran y More, Miss. Florentina","female",30,1,0,"SC/PARIS 2148",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" +2,0,"Eitemiller, Mr. George Floyd","male",23,0,0,"29751",13.0000,,"S",,,"England / Detroit, MI" +2,0,"Enander, Mr. Ingvar","male",21,0,0,"236854",13.0000,,"S",,,"Goteborg, Sweden / Rockford, IL" +2,0,"Fahlstrom, Mr. Arne Jonas","male",18,0,0,"236171",13.0000,,"S",,,"Oslo, Norway Bayonne, NJ" +2,0,"Faunthorpe, Mr. Harry","male",40,1,0,"2926",26.0000,,"S",,"286","England / Philadelphia, PA" +2,1,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)","female",29,1,0,"2926",26.0000,,"S","16",, +2,0,"Fillbrook, Mr. Joseph Charles","male",18,0,0,"C.A. 15185",10.5000,,"S",,,"Cornwall / Houghton, MI" +2,0,"Fox, Mr. Stanley Hubert","male",36,0,0,"229236",13.0000,,"S",,"236","Rochester, NY" +2,0,"Frost, Mr. Anthony Wood ""Archie""","male",,0,0,"239854",0.0000,,"S",,,"Belfast" +2,0,"Funk, Miss. Annie Clemmer","female",38,0,0,"237671",13.0000,,"S",,,"Janjgir, India / Pennsylvania" +2,0,"Fynney, Mr. Joseph J","male",35,0,0,"239865",26.0000,,"S",,"322","Liverpool / Montreal, PQ" +2,0,"Gale, Mr. Harry","male",38,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" +2,0,"Gale, Mr. Shadrach","male",34,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" +2,1,"Garside, Miss. Ethel","female",34,0,0,"243880",13.0000,,"S","12",,"Brooklyn, NY" +2,0,"Gaskell, Mr. Alfred","male",16,0,0,"239865",26.0000,,"S",,,"Liverpool / Montreal, PQ" +2,0,"Gavey, Mr. Lawrence","male",26,0,0,"31028",10.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Gilbert, Mr. William","male",47,0,0,"C.A. 30769",10.5000,,"S",,,"Cornwall" +2,0,"Giles, Mr. Edgar","male",21,1,0,"28133",11.5000,,"S",,,"Cornwall / Camden, NJ" +2,0,"Giles, Mr. Frederick Edward","male",21,1,0,"28134",11.5000,,"S",,,"Cornwall / Camden, NJ" +2,0,"Giles, Mr. Ralph","male",24,0,0,"248726",13.5000,,"S",,"297","West Kensington, London" +2,0,"Gill, Mr. John William","male",24,0,0,"233866",13.0000,,"S",,"155","Clevedon, England" +2,0,"Gillespie, Mr. William Henry","male",34,0,0,"12233",13.0000,,"S",,,"Vancouver, BC" +2,0,"Givard, Mr. Hans Kristensen","male",30,0,0,"250646",13.0000,,"S",,"305", +2,0,"Greenberg, Mr. Samuel","male",52,0,0,"250647",13.0000,,"S",,"19","Bronx, NY" +2,0,"Hale, Mr. Reginald","male",30,0,0,"250653",13.0000,,"S",,"75","Auburn, NY" +2,1,"Hamalainen, Master. Viljo","male",0.67,1,1,"250649",14.5000,,"S","4",,"Detroit, MI" +2,1,"Hamalainen, Mrs. William (Anna)","female",24,0,2,"250649",14.5000,,"S","4",,"Detroit, MI" +2,0,"Harbeck, Mr. William H","male",44,0,0,"248746",13.0000,,"S",,"35","Seattle, WA / Toledo, OH" +2,1,"Harper, Miss. Annie Jessie ""Nina""","female",6,0,1,"248727",33.0000,,"S","11",,"Denmark Hill, Surrey / Chicago" +2,0,"Harper, Rev. John","male",28,0,1,"248727",33.0000,,"S",,,"Denmark Hill, Surrey / Chicago" +2,1,"Harris, Mr. George","male",62,0,0,"S.W./PP 752",10.5000,,"S","15",,"London" +2,0,"Harris, Mr. Walter","male",30,0,0,"W/C 14208",10.5000,,"S",,,"Walthamstow, England" +2,1,"Hart, Miss. Eva Miriam","female",7,0,2,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" +2,0,"Hart, Mr. Benjamin","male",43,1,1,"F.C.C. 13529",26.2500,,"S",,,"Ilford, Essex / Winnipeg, MB" +2,1,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)","female",45,1,1,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" +2,1,"Herman, Miss. Alice","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" +2,1,"Herman, Miss. Kate","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" +2,0,"Herman, Mr. Samuel","male",49,1,2,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" +2,1,"Herman, Mrs. Samuel (Jane Laver)","female",48,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" +2,1,"Hewlett, Mrs. (Mary D Kingcome) ","female",55,0,0,"248706",16.0000,,"S","13",,"India / Rapid City, SD" +2,0,"Hickman, Mr. Leonard Mark","male",24,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" +2,0,"Hickman, Mr. Lewis","male",32,2,0,"S.O.C. 14879",73.5000,,"S",,"256","West Hampstead, London / Neepawa, MB" +2,0,"Hickman, Mr. Stanley George","male",21,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" +2,0,"Hiltunen, Miss. Marta","female",18,1,1,"250650",13.0000,,"S",,,"Kontiolahti, Finland / Detroit, MI" +2,1,"Hocking, Miss. Ellen ""Nellie""","female",20,2,1,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" +2,0,"Hocking, Mr. Richard George","male",23,2,1,"29104",11.5000,,"S",,,"Cornwall / Akron, OH" +2,0,"Hocking, Mr. Samuel James Metcalfe","male",36,0,0,"242963",13.0000,,"S",,,"Devonport, England" +2,1,"Hocking, Mrs. Elizabeth (Eliza Needs)","female",54,1,3,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" +2,0,"Hodges, Mr. Henry Price","male",50,0,0,"250643",13.0000,,"S",,"149","Southampton" +2,0,"Hold, Mr. Stephen","male",44,1,0,"26707",26.0000,,"S",,,"England / Sacramento, CA" +2,1,"Hold, Mrs. Stephen (Annie Margaret Hill)","female",29,1,0,"26707",26.0000,,"S","10",,"England / Sacramento, CA" +2,0,"Hood, Mr. Ambrose Jr","male",21,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" +2,1,"Hosono, Mr. Masabumi","male",42,0,0,"237798",13.0000,,"S","10",,"Tokyo, Japan" +2,0,"Howard, Mr. Benjamin","male",63,1,0,"24065",26.0000,,"S",,,"Swindon, England" +2,0,"Howard, Mrs. Benjamin (Ellen Truelove Arman)","female",60,1,0,"24065",26.0000,,"S",,,"Swindon, England" +2,0,"Hunt, Mr. George Henry","male",33,0,0,"SCO/W 1585",12.2750,,"S",,,"Philadelphia, PA" +2,1,"Ilett, Miss. Bertha","female",17,0,0,"SO/C 14885",10.5000,,"S",,,"Guernsey" +2,0,"Jacobsohn, Mr. Sidney Samuel","male",42,1,0,"243847",27.0000,,"S",,,"London" +2,1,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)","female",24,2,1,"243847",27.0000,,"S","12",,"London" +2,0,"Jarvis, Mr. John Denzil","male",47,0,0,"237565",15.0000,,"S",,,"North Evington, England" +2,0,"Jefferys, Mr. Clifford Thomas","male",24,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Jefferys, Mr. Ernest Wilfred","male",22,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" +2,0,"Jenkin, Mr. Stephen Curnow","male",32,0,0,"C.A. 33111",10.5000,,"S",,,"St Ives, Cornwall / Houghton, MI" +2,1,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)","female",23,0,0,"SC/AH Basle 541",13.7917,"D","C","11",,"New York, NY" +2,0,"Kantor, Mr. Sinai","male",34,1,0,"244367",26.0000,,"S",,"283","Moscow / Bronx, NY" +2,1,"Kantor, Mrs. Sinai (Miriam Sternin)","female",24,1,0,"244367",26.0000,,"S","12",,"Moscow / Bronx, NY" +2,0,"Karnes, Mrs. J Frank (Claire Bennett)","female",22,0,0,"F.C.C. 13534",21.0000,,"S",,,"India / Pittsburgh, PA" +2,1,"Keane, Miss. Nora A","female",,0,0,"226593",12.3500,"E101","Q","10",,"Harrisburg, PA" +2,0,"Keane, Mr. Daniel","male",35,0,0,"233734",12.3500,,"Q",,, +2,1,"Kelly, Mrs. Florence ""Fannie""","female",45,0,0,"223596",13.5000,,"S","9",,"London / New York, NY" +2,0,"Kirkland, Rev. Charles Leonard","male",57,0,0,"219533",12.3500,,"Q",,,"Glasgow / Bangor, ME" +2,0,"Knight, Mr. Robert J","male",,0,0,"239855",0.0000,,"S",,,"Belfast" +2,0,"Kvillner, Mr. Johan Henrik Johannesson","male",31,0,0,"C.A. 18723",10.5000,,"S",,"165","Sweden / Arlington, NJ" +2,0,"Lahtinen, Mrs. William (Anna Sylfven)","female",26,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" +2,0,"Lahtinen, Rev. William","male",30,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" +2,0,"Lamb, Mr. John Joseph","male",,0,0,"240261",10.7083,,"Q",,, +2,1,"Laroche, Miss. Louise","female",1,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" +2,1,"Laroche, Miss. Simonne Marie Anne Andree","female",3,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" +2,0,"Laroche, Mr. Joseph Philippe Lemercier","male",25,1,2,"SC/Paris 2123",41.5792,,"C",,,"Paris / Haiti" +2,1,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)","female",22,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" +2,1,"Lehmann, Miss. Bertha","female",17,0,0,"SC 1748",12.0000,,"C","12",,"Berne, Switzerland / Central City, IA" +2,1,"Leitch, Miss. Jessie Wills","female",,0,0,"248727",33.0000,,"S","11",,"London / Chicago, IL" +2,1,"Lemore, Mrs. (Amelia Milley)","female",34,0,0,"C.A. 34260",10.5000,"F33","S","14",,"Chicago, IL" +2,0,"Levy, Mr. Rene Jacques","male",36,0,0,"SC/Paris 2163",12.8750,"D","C",,,"Montreal, PQ" +2,0,"Leyson, Mr. Robert William Norman","male",24,0,0,"C.A. 29566",10.5000,,"S",,"108", +2,0,"Lingane, Mr. John","male",61,0,0,"235509",12.3500,,"Q",,, +2,0,"Louch, Mr. Charles Alexander","male",50,1,0,"SC/AH 3085",26.0000,,"S",,"121","Weston-Super-Mare, Somerset" +2,1,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)","female",42,1,0,"SC/AH 3085",26.0000,,"S",,,"Weston-Super-Mare, Somerset" +2,0,"Mack, Mrs. (Mary)","female",57,0,0,"S.O./P.P. 3",10.5000,"E77","S",,"52","Southampton / New York, NY" +2,0,"Malachard, Mr. Noel","male",,0,0,"237735",15.0458,"D","C",,,"Paris" +2,1,"Mallet, Master. Andre","male",1,0,2,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" +2,0,"Mallet, Mr. Albert","male",31,1,1,"S.C./PARIS 2079",37.0042,,"C",,,"Paris / Montreal, PQ" +2,1,"Mallet, Mrs. Albert (Antoinette Magnin)","female",24,1,1,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" +2,0,"Mangiavacchi, Mr. Serafino Emilio","male",,0,0,"SC/A.3 2861",15.5792,,"C",,,"New York, NY" +2,0,"Matthews, Mr. William John","male",30,0,0,"28228",13.0000,,"S",,,"St Austall, Cornwall" +2,0,"Maybery, Mr. Frank Hubert","male",40,0,0,"239059",16.0000,,"S",,,"Weston-Super-Mare / Moose Jaw, SK" +2,0,"McCrae, Mr. Arthur Gordon","male",32,0,0,"237216",13.5000,,"S",,"209","Sydney, Australia" +2,0,"McCrie, Mr. James Matthew","male",30,0,0,"233478",13.0000,,"S",,,"Sarnia, ON" +2,0,"McKane, Mr. Peter David","male",46,0,0,"28403",26.0000,,"S",,,"Rochester, NY" +2,1,"Mellinger, Miss. Madeleine Violet","female",13,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" +2,1,"Mellinger, Mrs. (Elizabeth Anne Maidment)","female",41,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" +2,1,"Mellors, Mr. William John","male",19,0,0,"SW/PP 751",10.5000,,"S","B",,"Chelsea, London" +2,0,"Meyer, Mr. August","male",39,0,0,"248723",13.0000,,"S",,,"Harrow-on-the-Hill, Middlesex" +2,0,"Milling, Mr. Jacob Christian","male",48,0,0,"234360",13.0000,,"S",,"271","Copenhagen, Denmark" +2,0,"Mitchell, Mr. Henry Michael","male",70,0,0,"C.A. 24580",10.5000,,"S",,,"Guernsey / Montclair, NJ and/or Toledo, Ohio" +2,0,"Montvila, Rev. Juozas","male",27,0,0,"211536",13.0000,,"S",,,"Worcester, MA" +2,0,"Moraweck, Dr. Ernest","male",54,0,0,"29011",14.0000,,"S",,,"Frankfort, KY" +2,0,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")","male",39,0,0,"250655",26.0000,,"S",,, +2,0,"Mudd, Mr. Thomas Charles","male",16,0,0,"S.O./P.P. 3",10.5000,,"S",,,"Halesworth, England" +2,0,"Myles, Mr. Thomas Francis","male",62,0,0,"240276",9.6875,,"Q",,,"Cambridge, MA" +2,0,"Nasser, Mr. Nicholas","male",32.5,1,0,"237736",30.0708,,"C",,"43","New York, NY" +2,1,"Nasser, Mrs. Nicholas (Adele Achem)","female",14,1,0,"237736",30.0708,,"C",,,"New York, NY" +2,1,"Navratil, Master. Edmond Roger","male",2,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" +2,1,"Navratil, Master. Michel M","male",3,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" +2,0,"Navratil, Mr. Michel (""Louis M Hoffman"")","male",36.5,0,2,"230080",26.0000,"F2","S",,"15","Nice, France" +2,0,"Nesson, Mr. Israel","male",26,0,0,"244368",13.0000,"F2","S",,,"Boston, MA" +2,0,"Nicholls, Mr. Joseph Charles","male",19,1,1,"C.A. 33112",36.7500,,"S",,"101","Cornwall / Hancock, MI" +2,0,"Norman, Mr. Robert Douglas","male",28,0,0,"218629",13.5000,,"S",,"287","Glasgow" +2,1,"Nourney, Mr. Alfred (""Baron von Drachstedt"")","male",20,0,0,"SC/PARIS 2166",13.8625,"D38","C","7",,"Cologne, Germany" +2,1,"Nye, Mrs. (Elizabeth Ramell)","female",29,0,0,"C.A. 29395",10.5000,"F33","S","11",,"Folkstone, Kent / New York, NY" +2,0,"Otter, Mr. Richard","male",39,0,0,"28213",13.0000,,"S",,,"Middleburg Heights, OH" +2,1,"Oxenham, Mr. Percy Thomas","male",22,0,0,"W./C. 14260",10.5000,,"S","13",,"Pondersend, England / New Durham, NJ" +2,1,"Padro y Manent, Mr. Julian","male",,0,0,"SC/PARIS 2146",13.8625,,"C","9",,"Spain / Havana, Cuba" +2,0,"Pain, Dr. Alfred","male",23,0,0,"244278",10.5000,,"S",,,"Hamilton, ON" +2,1,"Pallas y Castello, Mr. Emilio","male",29,0,0,"SC/PARIS 2147",13.8583,,"C","9",,"Spain / Havana, Cuba" +2,0,"Parker, Mr. Clifford Richard","male",28,0,0,"SC 14888",10.5000,,"S",,,"St Andrews, Guernsey" +2,0,"Parkes, Mr. Francis ""Frank""","male",,0,0,"239853",0.0000,,"S",,,"Belfast" +2,1,"Parrish, Mrs. (Lutie Davis)","female",50,0,1,"230433",26.0000,,"S","12",,"Woodford County, KY" +2,0,"Pengelly, Mr. Frederick William","male",19,0,0,"28665",10.5000,,"S",,,"Gunnislake, England / Butte, MT" +2,0,"Pernot, Mr. Rene","male",,0,0,"SC/PARIS 2131",15.0500,,"C",,, +2,0,"Peruschitz, Rev. Joseph Maria","male",41,0,0,"237393",13.0000,,"S",,, +2,1,"Phillips, Miss. Alice Frances Louisa","female",21,0,1,"S.O./P.P. 2",21.0000,,"S","12",,"Ilfracombe, Devon" +2,1,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")","female",19,0,0,"250655",26.0000,,"S","11",,"Worcester, England" +2,0,"Phillips, Mr. Escott Robert","male",43,0,1,"S.O./P.P. 2",21.0000,,"S",,,"Ilfracombe, Devon" +2,1,"Pinsky, Mrs. (Rosa)","female",32,0,0,"234604",13.0000,,"S","9",,"Russia" +2,0,"Ponesell, Mr. Martin","male",34,0,0,"250647",13.0000,,"S",,,"Denmark / New York, NY" +2,1,"Portaluppi, Mr. Emilio Ilario Giuseppe","male",30,0,0,"C.A. 34644",12.7375,,"C","14",,"Milford, NH" +2,0,"Pulbaum, Mr. Franz","male",27,0,0,"SC/PARIS 2168",15.0333,,"C",,,"Paris" +2,1,"Quick, Miss. Phyllis May","female",2,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" +2,1,"Quick, Miss. Winifred Vera","female",8,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" +2,1,"Quick, Mrs. Frederick Charles (Jane Richards)","female",33,0,2,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" +2,0,"Reeves, Mr. David","male",36,0,0,"C.A. 17248",10.5000,,"S",,,"Brighton, Sussex" +2,0,"Renouf, Mr. Peter Henry","male",34,1,0,"31027",21.0000,,"S","12",,"Elizabeth, NJ" +2,1,"Renouf, Mrs. Peter Henry (Lillian Jefferys)","female",30,3,0,"31027",21.0000,,"S",,,"Elizabeth, NJ" +2,1,"Reynaldo, Ms. Encarnacion","female",28,0,0,"230434",13.0000,,"S","9",,"Spain" +2,0,"Richard, Mr. Emile","male",23,0,0,"SC/PARIS 2133",15.0458,,"C",,,"Paris / Montreal, PQ" +2,1,"Richards, Master. George Sibley","male",0.83,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" +2,1,"Richards, Master. William Rowe","male",3,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" +2,1,"Richards, Mrs. Sidney (Emily Hocking)","female",24,2,3,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" +2,1,"Ridsdale, Miss. Lucy","female",50,0,0,"W./C. 14258",10.5000,,"S","13",,"London, England / Marietta, Ohio and Milwaukee, WI" +2,0,"Rogers, Mr. Reginald Harry","male",19,0,0,"28004",10.5000,,"S",,, +2,1,"Rugg, Miss. Emily","female",21,0,0,"C.A. 31026",10.5000,,"S","12",,"Guernsey / Wilmington, DE" +2,0,"Schmidt, Mr. August","male",26,0,0,"248659",13.0000,,"S",,,"Newark, NJ" +2,0,"Sedgwick, Mr. Charles Frederick Waddington","male",25,0,0,"244361",13.0000,,"S",,,"Liverpool" +2,0,"Sharp, Mr. Percival James R","male",27,0,0,"244358",26.0000,,"S",,,"Hornsey, England" +2,1,"Shelley, Mrs. William (Imanita Parrish Hall)","female",25,0,1,"230433",26.0000,,"S","12",,"Deer Lodge, MT" +2,1,"Silven, Miss. Lyyli Karoliina","female",18,0,2,"250652",13.0000,,"S","16",,"Finland / Minneapolis, MN" +2,1,"Sincock, Miss. Maude","female",20,0,0,"C.A. 33112",36.7500,,"S","11",,"Cornwall / Hancock, MI" +2,1,"Sinkkonen, Miss. Anna","female",30,0,0,"250648",13.0000,,"S","10",,"Finland / Washington, DC" +2,0,"Sjostedt, Mr. Ernst Adolf","male",59,0,0,"237442",13.5000,,"S",,,"Sault St Marie, ON" +2,1,"Slayter, Miss. Hilda Mary","female",30,0,0,"234818",12.3500,,"Q","13",,"Halifax, NS" +2,0,"Slemen, Mr. Richard James","male",35,0,0,"28206",10.5000,,"S",,,"Cornwall" +2,1,"Smith, Miss. Marion Elsie","female",40,0,0,"31418",13.0000,,"S","9",, +2,0,"Sobey, Mr. Samuel James Hayden","male",25,0,0,"C.A. 29178",13.0000,,"S",,,"Cornwall / Houghton, MI" +2,0,"Stanton, Mr. Samuel Ward","male",41,0,0,"237734",15.0458,,"C",,,"New York, NY" +2,0,"Stokes, Mr. Philip Joseph","male",25,0,0,"F.C.C. 13540",10.5000,,"S",,"81","Catford, Kent / Detroit, MI" +2,0,"Swane, Mr. George","male",18.5,0,0,"248734",13.0000,"F","S",,"294", +2,0,"Sweet, Mr. George Frederick","male",14,0,0,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" +2,1,"Toomey, Miss. Ellen","female",50,0,0,"F.C.C. 13531",10.5000,,"S","9",,"Indianapolis, IN" +2,0,"Troupiansky, Mr. Moses Aaron","male",23,0,0,"233639",13.0000,,"S",,, +2,1,"Trout, Mrs. William H (Jessie L)","female",28,0,0,"240929",12.6500,,"S",,,"Columbus, OH" +2,1,"Troutt, Miss. Edwina Celia ""Winnie""","female",27,0,0,"34218",10.5000,"E101","S","16",,"Bath, England / Massachusetts" +2,0,"Turpin, Mr. William John Robert","male",29,1,0,"11668",21.0000,,"S",,,"Plymouth, England" +2,0,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)","female",27,1,0,"11668",21.0000,,"S",,,"Plymouth, England" +2,0,"Veal, Mr. James","male",40,0,0,"28221",13.0000,,"S",,,"Barre, Co Washington, VT" +2,1,"Walcroft, Miss. Nellie","female",31,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" +2,0,"Ware, Mr. John James","male",30,1,0,"CA 31352",21.0000,,"S",,,"Bristol, England / New Britain, CT" +2,0,"Ware, Mr. William Jeffery","male",23,1,0,"28666",10.5000,,"S",,, +2,1,"Ware, Mrs. John James (Florence Louise Long)","female",31,0,0,"CA 31352",21.0000,,"S","10",,"Bristol, England / New Britain, CT" +2,0,"Watson, Mr. Ennis Hastings","male",,0,0,"239856",0.0000,,"S",,,"Belfast" +2,1,"Watt, Miss. Bertha J","female",12,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" +2,1,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)","female",40,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" +2,1,"Webber, Miss. Susan","female",32.5,0,0,"27267",13.0000,"E101","S","12",,"England / Hartford, CT" +2,0,"Weisz, Mr. Leopold","male",27,1,0,"228414",26.0000,,"S",,"293","Bromsgrove, England / Montreal, PQ" +2,1,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)","female",29,1,0,"228414",26.0000,,"S","10",,"Bromsgrove, England / Montreal, PQ" +2,1,"Wells, Master. Ralph Lester","male",2,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" +2,1,"Wells, Miss. Joan","female",4,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" +2,1,"Wells, Mrs. Arthur Henry (""Addie"" Dart Trevaskis)","female",29,0,2,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" +2,1,"West, Miss. Barbara J","female",0.92,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" +2,1,"West, Miss. Constance Mirium","female",5,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" +2,0,"West, Mr. Edwy Arthur","male",36,1,2,"C.A. 34651",27.7500,,"S",,,"Bournmouth, England" +2,1,"West, Mrs. Edwy Arthur (Ada Mary Worth)","female",33,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" +2,0,"Wheadon, Mr. Edward H","male",66,0,0,"C.A. 24579",10.5000,,"S",,,"Guernsey, England / Edgewood, RI" +2,0,"Wheeler, Mr. Edwin ""Frederick""","male",,0,0,"SC/PARIS 2159",12.8750,,"S",,, +2,1,"Wilhelms, Mr. Charles","male",31,0,0,"244270",13.0000,,"S","9",,"London, England" +2,1,"Williams, Mr. Charles Eugene","male",,0,0,"244373",13.0000,,"S","14",,"Harrow, England" +2,1,"Wright, Miss. Marion","female",26,0,0,"220844",13.5000,,"S","9",,"Yoevil, England / Cottage Grove, OR" +2,0,"Yrois, Miss. Henriette (""Mrs Harbeck"")","female",24,0,0,"248747",13.0000,,"S",,,"Paris" +3,0,"Abbing, Mr. Anthony","male",42,0,0,"C.A. 5547",7.5500,,"S",,, +3,0,"Abbott, Master. Eugene Joseph","male",13,0,2,"C.A. 2673",20.2500,,"S",,,"East Providence, RI" +3,0,"Abbott, Mr. Rossmore Edward","male",16,1,1,"C.A. 2673",20.2500,,"S",,"190","East Providence, RI" +3,1,"Abbott, Mrs. Stanton (Rosa Hunt)","female",35,1,1,"C.A. 2673",20.2500,,"S","A",,"East Providence, RI" +3,1,"Abelseth, Miss. Karen Marie","female",16,0,0,"348125",7.6500,,"S","16",,"Norway Los Angeles, CA" +3,1,"Abelseth, Mr. Olaus Jorgensen","male",25,0,0,"348122",7.6500,"F G63","S","A",,"Perkins County, SD" +3,1,"Abrahamsson, Mr. Abraham August Johannes","male",20,0,0,"SOTON/O2 3101284",7.9250,,"S","15",,"Taalintehdas, Finland Hoboken, NJ" +3,1,"Abrahim, Mrs. Joseph (Sophie Halaut Easu)","female",18,0,0,"2657",7.2292,,"C","C",,"Greensburg, PA" +3,0,"Adahl, Mr. Mauritz Nils Martin","male",30,0,0,"C 7076",7.2500,,"S",,"72","Asarum, Sweden Brooklyn, NY" +3,0,"Adams, Mr. John","male",26,0,0,"341826",8.0500,,"S",,"103","Bournemouth, England" +3,0,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)","female",40,1,0,"7546",9.4750,,"S",,,"Sweden Akeley, MN" +3,1,"Aks, Master. Philip Frank","male",0.83,0,1,"392091",9.3500,,"S","11",,"London, England Norfolk, VA" +3,1,"Aks, Mrs. Sam (Leah Rosen)","female",18,0,1,"392091",9.3500,,"S","13",,"London, England Norfolk, VA" +3,1,"Albimona, Mr. Nassef Cassem","male",26,0,0,"2699",18.7875,,"C","15",,"Syria Fredericksburg, VA" +3,0,"Alexander, Mr. William","male",26,0,0,"3474",7.8875,,"S",,,"England Albion, NY" +3,0,"Alhomaki, Mr. Ilmari Rudolf","male",20,0,0,"SOTON/O2 3101287",7.9250,,"S",,,"Salo, Finland Astoria, OR" +3,0,"Ali, Mr. Ahmed","male",24,0,0,"SOTON/O.Q. 3101311",7.0500,,"S",,, +3,0,"Ali, Mr. William","male",25,0,0,"SOTON/O.Q. 3101312",7.0500,,"S",,"79","Argentina" +3,0,"Allen, Mr. William Henry","male",35,0,0,"373450",8.0500,,"S",,,"Lower Clapton, Middlesex or Erdington, Birmingham" +3,0,"Allum, Mr. Owen George","male",18,0,0,"2223",8.3000,,"S",,"259","Windsor, England New York, NY" +3,0,"Andersen, Mr. Albert Karvin","male",32,0,0,"C 4001",22.5250,,"S",,"260","Bergen, Norway" +3,1,"Andersen-Jensen, Miss. Carla Christine Nielsine","female",19,1,0,"350046",7.8542,,"S","16",, +3,0,"Andersson, Master. Sigvard Harald Elias","male",4,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Miss. Ebba Iris Alfrida","female",6,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Miss. Ellis Anna Maria","female",2,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,1,"Andersson, Miss. Erna Alexandra","female",17,4,2,"3101281",7.9250,,"S","D",,"Ruotsinphyhtaa, Finland New York, NY" +3,0,"Andersson, Miss. Ida Augusta Margareta","female",38,4,2,"347091",7.7750,,"S",,,"Vadsbro, Sweden Ministee, MI" +3,0,"Andersson, Miss. Ingeborg Constanzia","female",9,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Miss. Sigrid Elisabeth","female",11,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andersson, Mr. Anders Johan","male",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,1,"Andersson, Mr. August Edvard (""Wennerstrom"")","male",27,0,0,"350043",7.7958,,"S","A",, +3,0,"Andersson, Mr. Johan Samuel","male",26,0,0,"347075",7.7750,,"S",,,"Hartford, CT" +3,0,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)","female",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" +3,0,"Andreasson, Mr. Paul Edvin","male",20,0,0,"347466",7.8542,,"S",,,"Sweden Chicago, IL" +3,0,"Angheloff, Mr. Minko","male",26,0,0,"349202",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Arnold-Franchi, Mr. Josef","male",25,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" +3,0,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)","female",18,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" +3,0,"Aronsson, Mr. Ernst Axel Algot","male",24,0,0,"349911",7.7750,,"S",,,"Sweden Joliet, IL" +3,0,"Asim, Mr. Adola","male",35,0,0,"SOTON/O.Q. 3101310",7.0500,,"S",,, +3,0,"Asplund, Master. Carl Edgar","male",5,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" +3,0,"Asplund, Master. Clarence Gustaf Hugo","male",9,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" +3,1,"Asplund, Master. Edvin Rojj Felix","male",3,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" +3,0,"Asplund, Master. Filip Oscar","male",13,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" +3,1,"Asplund, Miss. Lillian Gertrud","female",5,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" +3,0,"Asplund, Mr. Carl Oscar Vilhelm Gustafsson","male",40,1,5,"347077",31.3875,,"S",,"142","Sweden Worcester, MA" +3,1,"Asplund, Mr. Johan Charles","male",23,0,0,"350054",7.7958,,"S","13",,"Oskarshamn, Sweden Minneapolis, MN" +3,1,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)","female",38,1,5,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" +3,1,"Assaf Khalil, Mrs. Mariana (""Miriam"")","female",45,0,0,"2696",7.2250,,"C","C",,"Ottawa, ON" +3,0,"Assaf, Mr. Gerios","male",21,0,0,"2692",7.2250,,"C",,,"Ottawa, ON" +3,0,"Assam, Mr. Ali","male",23,0,0,"SOTON/O.Q. 3101309",7.0500,,"S",,, +3,0,"Attalah, Miss. Malake","female",17,0,0,"2627",14.4583,,"C",,, +3,0,"Attalah, Mr. Sleiman","male",30,0,0,"2694",7.2250,,"C",,,"Ottawa, ON" +3,0,"Augustsson, Mr. Albert","male",23,0,0,"347468",7.8542,,"S",,,"Krakoryd, Sweden Bloomington, IL" +3,1,"Ayoub, Miss. Banoura","female",13,0,0,"2687",7.2292,,"C","C",,"Syria Youngstown, OH" +3,0,"Baccos, Mr. Raffull","male",20,0,0,"2679",7.2250,,"C",,, +3,0,"Backstrom, Mr. Karl Alfred","male",32,1,0,"3101278",15.8500,,"S","D",,"Ruotsinphytaa, Finland New York, NY" +3,1,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)","female",33,3,0,"3101278",15.8500,,"S",,,"Ruotsinphytaa, Finland New York, NY" +3,1,"Baclini, Miss. Eugenie","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Baclini, Miss. Helene Barbara","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Baclini, Miss. Marie Catherine","female",5,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Baclini, Mrs. Solomon (Latifa Qurban)","female",24,0,3,"2666",19.2583,,"C","C",,"Syria New York, NY" +3,1,"Badman, Miss. Emily Louisa","female",18,0,0,"A/4 31416",8.0500,,"S","C",,"London Skanteales, NY" +3,0,"Badt, Mr. Mohamed","male",40,0,0,"2623",7.2250,,"C",,, +3,0,"Balkic, Mr. Cerin","male",26,0,0,"349248",7.8958,,"S",,, +3,1,"Barah, Mr. Hanna Assi","male",20,0,0,"2663",7.2292,,"C","15",, +3,0,"Barbara, Miss. Saiide","female",18,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" +3,0,"Barbara, Mrs. (Catherine David)","female",45,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" +3,0,"Barry, Miss. Julia","female",27,0,0,"330844",7.8792,,"Q",,,"New York, NY" +3,0,"Barton, Mr. David John","male",22,0,0,"324669",8.0500,,"S",,,"England New York, NY" +3,0,"Beavan, Mr. William Thomas","male",19,0,0,"323951",8.0500,,"S",,,"England" +3,0,"Bengtsson, Mr. John Viktor","male",26,0,0,"347068",7.7750,,"S",,,"Krakudden, Sweden Moune, IL" +3,0,"Berglund, Mr. Karl Ivar Sven","male",22,0,0,"PP 4348",9.3500,,"S",,,"Tranvik, Finland New York" +3,0,"Betros, Master. Seman","male",,0,0,"2622",7.2292,,"C",,, +3,0,"Betros, Mr. Tannous","male",20,0,0,"2648",4.0125,,"C",,,"Syria" +3,1,"Bing, Mr. Lee","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" +3,0,"Birkeland, Mr. Hans Martin Monsen","male",21,0,0,"312992",7.7750,,"S",,,"Brennes, Norway New York" +3,0,"Bjorklund, Mr. Ernst Herbert","male",18,0,0,"347090",7.7500,,"S",,,"Stockholm, Sweden New York" +3,0,"Bostandyeff, Mr. Guentcho","male",26,0,0,"349224",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Boulos, Master. Akar","male",6,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" +3,0,"Boulos, Miss. Nourelain","female",9,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" +3,0,"Boulos, Mr. Hanna","male",,0,0,"2664",7.2250,,"C",,,"Syria" +3,0,"Boulos, Mrs. Joseph (Sultana)","female",,0,2,"2678",15.2458,,"C",,,"Syria Kent, ON" +3,0,"Bourke, Miss. Mary","female",,0,2,"364848",7.7500,,"Q",,,"Ireland Chicago, IL" +3,0,"Bourke, Mr. John","male",40,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" +3,0,"Bourke, Mrs. John (Catherine)","female",32,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" +3,0,"Bowen, Mr. David John ""Dai""","male",21,0,0,"54636",16.1000,,"S",,,"Treherbert, Cardiff, Wales" +3,1,"Bradley, Miss. Bridget Delia","female",22,0,0,"334914",7.7250,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland Glens Falls, NY" +3,0,"Braf, Miss. Elin Ester Maria","female",20,0,0,"347471",7.8542,,"S",,,"Medeltorp, Sweden Chicago, IL" +3,0,"Braund, Mr. Lewis Richard","male",29,1,0,"3460",7.0458,,"S",,,"Bridgerule, Devon" +3,0,"Braund, Mr. Owen Harris","male",22,1,0,"A/5 21171",7.2500,,"S",,,"Bridgerule, Devon" +3,0,"Brobeck, Mr. Karl Rudolf","male",22,0,0,"350045",7.7958,,"S",,,"Sweden Worcester, MA" +3,0,"Brocklebank, Mr. William Alfred","male",35,0,0,"364512",8.0500,,"S",,,"Broomfield, Chelmsford, England" +3,0,"Buckley, Miss. Katherine","female",18.5,0,0,"329944",7.2833,,"Q",,"299","Co Cork, Ireland Roxbury, MA" +3,1,"Buckley, Mr. Daniel","male",21,0,0,"330920",7.8208,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland New York, NY" +3,0,"Burke, Mr. Jeremiah","male",19,0,0,"365222",6.7500,,"Q",,,"Co Cork, Ireland Charlestown, MA" +3,0,"Burns, Miss. Mary Delia","female",18,0,0,"330963",7.8792,,"Q",,,"Co Sligo, Ireland New York, NY" +3,0,"Cacic, Miss. Manda","female",21,0,0,"315087",8.6625,,"S",,, +3,0,"Cacic, Miss. Marija","female",30,0,0,"315084",8.6625,,"S",,, +3,0,"Cacic, Mr. Jego Grga","male",18,0,0,"315091",8.6625,,"S",,, +3,0,"Cacic, Mr. Luka","male",38,0,0,"315089",8.6625,,"S",,,"Croatia" +3,0,"Calic, Mr. Jovo","male",17,0,0,"315093",8.6625,,"S",,, +3,0,"Calic, Mr. Petar","male",17,0,0,"315086",8.6625,,"S",,, +3,0,"Canavan, Miss. Mary","female",21,0,0,"364846",7.7500,,"Q",,, +3,0,"Canavan, Mr. Patrick","male",21,0,0,"364858",7.7500,,"Q",,,"Ireland Philadelphia, PA" +3,0,"Cann, Mr. Ernest Charles","male",21,0,0,"A./5. 2152",8.0500,,"S",,, +3,0,"Caram, Mr. Joseph","male",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" +3,0,"Caram, Mrs. Joseph (Maria Elias)","female",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" +3,0,"Carlsson, Mr. August Sigfrid","male",28,0,0,"350042",7.7958,,"S",,,"Dagsas, Sweden Fower, MN" +3,0,"Carlsson, Mr. Carl Robert","male",24,0,0,"350409",7.8542,,"S",,,"Goteborg, Sweden Huntley, IL" +3,1,"Carr, Miss. Helen ""Ellen""","female",16,0,0,"367231",7.7500,,"Q","16",,"Co Longford, Ireland New York, NY" +3,0,"Carr, Miss. Jeannie","female",37,0,0,"368364",7.7500,,"Q",,,"Co Sligo, Ireland Hartford, CT" +3,0,"Carver, Mr. Alfred John","male",28,0,0,"392095",7.2500,,"S",,,"St Denys, Southampton, Hants" +3,0,"Celotti, Mr. Francesco","male",24,0,0,"343275",8.0500,,"S",,,"London" +3,0,"Charters, Mr. David","male",21,0,0,"A/5. 13032",7.7333,,"Q",,,"Ireland New York, NY" +3,1,"Chip, Mr. Chang","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" +3,0,"Christmann, Mr. Emil","male",29,0,0,"343276",8.0500,,"S",,, +3,0,"Chronopoulos, Mr. Apostolos","male",26,1,0,"2680",14.4542,,"C",,,"Greece" +3,0,"Chronopoulos, Mr. Demetrios","male",18,1,0,"2680",14.4542,,"C",,,"Greece" +3,0,"Coelho, Mr. Domingos Fernandeo","male",20,0,0,"SOTON/O.Q. 3101307",7.0500,,"S",,,"Portugal" +3,1,"Cohen, Mr. Gurshon ""Gus""","male",18,0,0,"A/5 3540",8.0500,,"S","12",,"London Brooklyn, NY" +3,0,"Colbert, Mr. Patrick","male",24,0,0,"371109",7.2500,,"Q",,,"Co Limerick, Ireland Sherbrooke, PQ" +3,0,"Coleff, Mr. Peju","male",36,0,0,"349210",7.4958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Coleff, Mr. Satio","male",24,0,0,"349209",7.4958,,"S",,, +3,0,"Conlon, Mr. Thomas Henry","male",31,0,0,"21332",7.7333,,"Q",,,"Philadelphia, PA" +3,0,"Connaghton, Mr. Michael","male",31,0,0,"335097",7.7500,,"Q",,,"Ireland Brooklyn, NY" +3,1,"Connolly, Miss. Kate","female",22,0,0,"370373",7.7500,,"Q","13",,"Ireland" +3,0,"Connolly, Miss. Kate","female",30,0,0,"330972",7.6292,,"Q",,,"Ireland" +3,0,"Connors, Mr. Patrick","male",70.5,0,0,"370369",7.7500,,"Q",,"171", +3,0,"Cook, Mr. Jacob","male",43,0,0,"A/5 3536",8.0500,,"S",,, +3,0,"Cor, Mr. Bartol","male",35,0,0,"349230",7.8958,,"S",,,"Austria" +3,0,"Cor, Mr. Ivan","male",27,0,0,"349229",7.8958,,"S",,,"Austria" +3,0,"Cor, Mr. Liudevit","male",19,0,0,"349231",7.8958,,"S",,,"Austria" +3,0,"Corn, Mr. Harry","male",30,0,0,"SOTON/OQ 392090",8.0500,,"S",,,"London" +3,1,"Coutts, Master. Eden Leslie ""Neville""","male",9,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" +3,1,"Coutts, Master. William Loch ""William""","male",3,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" +3,1,"Coutts, Mrs. William (Winnie ""Minnie"" Treanor)","female",36,0,2,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" +3,0,"Coxon, Mr. Daniel","male",59,0,0,"364500",7.2500,,"S",,,"Merrill, WI" +3,0,"Crease, Mr. Ernest James","male",19,0,0,"S.P. 3464",8.1583,,"S",,,"Bristol, England Cleveland, OH" +3,1,"Cribb, Miss. Laura Alice","female",17,0,1,"371362",16.1000,,"S","12",,"Bournemouth, England Newark, NJ" +3,0,"Cribb, Mr. John Hatfield","male",44,0,1,"371362",16.1000,,"S",,,"Bournemouth, England Newark, NJ" +3,0,"Culumovic, Mr. Jeso","male",17,0,0,"315090",8.6625,,"S",,,"Austria-Hungary" +3,0,"Daher, Mr. Shedid","male",22.5,0,0,"2698",7.2250,,"C",,"9", +3,1,"Dahl, Mr. Karl Edwart","male",45,0,0,"7598",8.0500,,"S","15",,"Australia Fingal, ND" +3,0,"Dahlberg, Miss. Gerda Ulrika","female",22,0,0,"7552",10.5167,,"S",,,"Norrlot, Sweden Chicago, IL" +3,0,"Dakic, Mr. Branko","male",19,0,0,"349228",10.1708,,"S",,,"Austria" +3,1,"Daly, Miss. Margaret Marcella ""Maggie""","female",30,0,0,"382650",6.9500,,"Q","15",,"Co Athlone, Ireland New York, NY" +3,1,"Daly, Mr. Eugene Patrick","male",29,0,0,"382651",7.7500,,"Q","13 15 B",,"Co Athlone, Ireland New York, NY" +3,0,"Danbom, Master. Gilbert Sigvard Emanuel","male",0.33,0,2,"347080",14.4000,,"S",,,"Stanton, IA" +3,0,"Danbom, Mr. Ernst Gilbert","male",34,1,1,"347080",14.4000,,"S",,"197","Stanton, IA" +3,0,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)","female",28,1,1,"347080",14.4000,,"S",,,"Stanton, IA" +3,0,"Danoff, Mr. Yoto","male",27,0,0,"349219",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Dantcheff, Mr. Ristiu","male",25,0,0,"349203",7.8958,,"S",,,"Bulgaria Chicago, IL" +3,0,"Davies, Mr. Alfred J","male",24,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" +3,0,"Davies, Mr. Evan","male",22,0,0,"SC/A4 23568",8.0500,,"S",,, +3,0,"Davies, Mr. John Samuel","male",21,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" +3,0,"Davies, Mr. Joseph","male",17,2,0,"A/4 48873",8.0500,,"S",,,"West Bromwich, England Pontiac, MI" +3,0,"Davison, Mr. Thomas Henry","male",,1,0,"386525",16.1000,,"S",,,"Liverpool, England Bedford, OH" +3,1,"Davison, Mrs. Thomas Henry (Mary E Finck)","female",,1,0,"386525",16.1000,,"S","16",,"Liverpool, England Bedford, OH" +3,1,"de Messemaeker, Mr. Guillaume Joseph","male",36.5,1,0,"345572",17.4000,,"S","15",,"Tampico, MT" +3,1,"de Messemaeker, Mrs. Guillaume Joseph (Emma)","female",36,1,0,"345572",17.4000,,"S","13",,"Tampico, MT" +3,1,"de Mulder, Mr. Theodore","male",30,0,0,"345774",9.5000,,"S","11",,"Belgium Detroit, MI" +3,0,"de Pelsmaeker, Mr. Alfons","male",16,0,0,"345778",9.5000,,"S",,, +3,1,"Dean, Master. Bertram Vere","male",1,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" +3,1,"Dean, Miss. Elizabeth Gladys ""Millvina""","female",0.17,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" +3,0,"Dean, Mr. Bertram Frank","male",26,1,2,"C.A. 2315",20.5750,,"S",,,"Devon, England Wichita, KS" +3,1,"Dean, Mrs. Bertram (Eva Georgetta Light)","female",33,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" +3,0,"Delalic, Mr. Redjo","male",25,0,0,"349250",7.8958,,"S",,, +3,0,"Demetri, Mr. Marinko","male",,0,0,"349238",7.8958,,"S",,, +3,0,"Denkoff, Mr. Mitto","male",,0,0,"349225",7.8958,,"S",,,"Bulgaria Coon Rapids, IA" +3,0,"Dennis, Mr. Samuel","male",22,0,0,"A/5 21172",7.2500,,"S",,, +3,0,"Dennis, Mr. William","male",36,0,0,"A/5 21175",7.2500,,"S",,, +3,1,"Devaney, Miss. Margaret Delia","female",19,0,0,"330958",7.8792,,"Q","C",,"Kilmacowen, Co Sligo, Ireland New York, NY" +3,0,"Dika, Mr. Mirko","male",17,0,0,"349232",7.8958,,"S",,, +3,0,"Dimic, Mr. Jovan","male",42,0,0,"315088",8.6625,,"S",,, +3,0,"Dintcheff, Mr. Valtcho","male",43,0,0,"349226",7.8958,,"S",,, +3,0,"Doharr, Mr. Tannous","male",,0,0,"2686",7.2292,,"C",,, +3,0,"Dooley, Mr. Patrick","male",32,0,0,"370376",7.7500,,"Q",,,"Ireland New York, NY" +3,1,"Dorking, Mr. Edward Arthur","male",19,0,0,"A/5. 10482",8.0500,,"S","B",,"England Oglesby, IL" +3,1,"Dowdell, Miss. Elizabeth","female",30,0,0,"364516",12.4750,,"S","13",,"Union Hill, NJ" +3,0,"Doyle, Miss. Elizabeth","female",24,0,0,"368702",7.7500,,"Q",,,"Ireland New York, NY" +3,1,"Drapkin, Miss. Jennie","female",23,0,0,"SOTON/OQ 392083",8.0500,,"S",,,"London New York, NY" +3,0,"Drazenoic, Mr. Jozef","male",33,0,0,"349241",7.8958,,"C",,"51","Austria Niagara Falls, NY" +3,0,"Duane, Mr. Frank","male",65,0,0,"336439",7.7500,,"Q",,, +3,1,"Duquemin, Mr. Joseph","male",24,0,0,"S.O./P.P. 752",7.5500,,"S","D",,"England Albion, NY" +3,0,"Dyker, Mr. Adolf Fredrik","male",23,1,0,"347072",13.9000,,"S",,,"West Haven, CT" +3,1,"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)","female",22,1,0,"347072",13.9000,,"S","16",,"West Haven, CT" +3,0,"Edvardsson, Mr. Gustaf Hjalmar","male",18,0,0,"349912",7.7750,,"S",,,"Tofta, Sweden Joliet, IL" +3,0,"Eklund, Mr. Hans Linus","male",16,0,0,"347074",7.7750,,"S",,,"Karberg, Sweden Jerome Junction, AZ" +3,0,"Ekstrom, Mr. Johan","male",45,0,0,"347061",6.9750,,"S",,,"Effington Rut, SD" +3,0,"Elias, Mr. Dibo","male",,0,0,"2674",7.2250,,"C",,, +3,0,"Elias, Mr. Joseph","male",39,0,2,"2675",7.2292,,"C",,,"Syria Ottawa, ON" +3,0,"Elias, Mr. Joseph Jr","male",17,1,1,"2690",7.2292,,"C",,, +3,0,"Elias, Mr. Tannous","male",15,1,1,"2695",7.2292,,"C",,,"Syria" +3,0,"Elsbury, Mr. William James","male",47,0,0,"A/5 3902",7.2500,,"S",,,"Illinois, USA" +3,1,"Emanuel, Miss. Virginia Ethel","female",5,0,0,"364516",12.4750,,"S","13",,"New York, NY" +3,0,"Emir, Mr. Farred Chehab","male",,0,0,"2631",7.2250,,"C",,, +3,0,"Everett, Mr. Thomas James","male",40.5,0,0,"C.A. 6212",15.1000,,"S",,"187", +3,0,"Farrell, Mr. James","male",40.5,0,0,"367232",7.7500,,"Q",,"68","Aughnacliff, Co Longford, Ireland New York, NY" +3,1,"Finoli, Mr. Luigi","male",,0,0,"SOTON/O.Q. 3101308",7.0500,,"S","15",,"Italy Philadelphia, PA" +3,0,"Fischer, Mr. Eberhard Thelander","male",18,0,0,"350036",7.7958,,"S",,, +3,0,"Fleming, Miss. Honora","female",,0,0,"364859",7.7500,,"Q",,, +3,0,"Flynn, Mr. James","male",,0,0,"364851",7.7500,,"Q",,, +3,0,"Flynn, Mr. John","male",,0,0,"368323",6.9500,,"Q",,, +3,0,"Foley, Mr. Joseph","male",26,0,0,"330910",7.8792,,"Q",,,"Ireland Chicago, IL" +3,0,"Foley, Mr. William","male",,0,0,"365235",7.7500,,"Q",,,"Ireland" +3,1,"Foo, Mr. Choong","male",,0,0,"1601",56.4958,,"S","13",,"Hong Kong New York, NY" +3,0,"Ford, Miss. Doolina Margaret ""Daisy""","female",21,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Miss. Robina Maggie ""Ruby""","female",9,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Mr. Arthur","male",,0,0,"A/5 1478",8.0500,,"S",,,"Bridgwater, Somerset, England" +3,0,"Ford, Mr. Edward Watson","male",18,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Mr. William Neal","male",16,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Ford, Mrs. Edward (Margaret Ann Watson)","female",48,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" +3,0,"Fox, Mr. Patrick","male",,0,0,"368573",7.7500,,"Q",,,"Ireland New York, NY" +3,0,"Franklin, Mr. Charles (Charles Fardon)","male",,0,0,"SOTON/O.Q. 3101314",7.2500,,"S",,, +3,0,"Gallagher, Mr. Martin","male",25,0,0,"36864",7.7417,,"Q",,,"New York, NY" +3,0,"Garfirth, Mr. John","male",,0,0,"358585",14.5000,,"S",,, +3,0,"Gheorgheff, Mr. Stanio","male",,0,0,"349254",7.8958,,"C",,, +3,0,"Gilinski, Mr. Eliezer","male",22,0,0,"14973",8.0500,,"S",,"47", +3,1,"Gilnagh, Miss. Katherine ""Katie""","female",16,0,0,"35851",7.7333,,"Q","16",,"Co Longford, Ireland New York, NY" +3,1,"Glynn, Miss. Mary Agatha","female",,0,0,"335677",7.7500,,"Q","13",,"Co Clare, Ireland Washington, DC" +3,1,"Goldsmith, Master. Frank John William ""Frankie""","male",9,0,2,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" +3,0,"Goldsmith, Mr. Frank John","male",33,1,1,"363291",20.5250,,"S",,,"Strood, Kent, England Detroit, MI" +3,0,"Goldsmith, Mr. Nathan","male",41,0,0,"SOTON/O.Q. 3101263",7.8500,,"S",,,"Philadelphia, PA" +3,1,"Goldsmith, Mrs. Frank John (Emily Alice Brown)","female",31,1,1,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" +3,0,"Goncalves, Mr. Manuel Estanslas","male",38,0,0,"SOTON/O.Q. 3101306",7.0500,,"S",,,"Portugal" +3,0,"Goodwin, Master. Harold Victor","male",9,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Master. Sidney Leonard","male",1,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Master. William Frederick","male",11,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Miss. Jessie Allis","female",10,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Miss. Lillian Amy","female",16,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Mr. Charles Edward","male",14,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Mr. Charles Frederick","male",40,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Goodwin, Mrs. Frederick (Augusta Tyler)","female",43,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" +3,0,"Green, Mr. George Henry","male",51,0,0,"21440",8.0500,,"S",,,"Dorking, Surrey, England" +3,0,"Gronnestad, Mr. Daniel Danielsen","male",32,0,0,"8471",8.3625,,"S",,,"Foresvik, Norway Portland, ND" +3,0,"Guest, Mr. Robert","male",,0,0,"376563",8.0500,,"S",,, +3,0,"Gustafsson, Mr. Alfred Ossian","male",20,0,0,"7534",9.8458,,"S",,,"Waukegan, Chicago, IL" +3,0,"Gustafsson, Mr. Anders Vilhelm","male",37,2,0,"3101276",7.9250,,"S",,"98","Ruotsinphytaa, Finland New York, NY" +3,0,"Gustafsson, Mr. Johan Birger","male",28,2,0,"3101277",7.9250,,"S",,,"Ruotsinphytaa, Finland New York, NY" +3,0,"Gustafsson, Mr. Karl Gideon","male",19,0,0,"347069",7.7750,,"S",,,"Myren, Sweden New York, NY" +3,0,"Haas, Miss. Aloisia","female",24,0,0,"349236",8.8500,,"S",,, +3,0,"Hagardon, Miss. Kate","female",17,0,0,"AQ/3. 30631",7.7333,,"Q",,, +3,0,"Hagland, Mr. Ingvald Olai Olsen","male",,1,0,"65303",19.9667,,"S",,, +3,0,"Hagland, Mr. Konrad Mathias Reiersen","male",,1,0,"65304",19.9667,,"S",,, +3,0,"Hakkarainen, Mr. Pekka Pietari","male",28,1,0,"STON/O2. 3101279",15.8500,,"S",,, +3,1,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)","female",24,1,0,"STON/O2. 3101279",15.8500,,"S","15",, +3,0,"Hampe, Mr. Leon","male",20,0,0,"345769",9.5000,,"S",,, +3,0,"Hanna, Mr. Mansour","male",23.5,0,0,"2693",7.2292,,"C",,"188", +3,0,"Hansen, Mr. Claus Peter","male",41,2,0,"350026",14.1083,,"S",,, +3,0,"Hansen, Mr. Henrik Juul","male",26,1,0,"350025",7.8542,,"S",,, +3,0,"Hansen, Mr. Henry Damsgaard","male",21,0,0,"350029",7.8542,,"S",,"69", +3,1,"Hansen, Mrs. Claus Peter (Jennie L Howard)","female",45,1,0,"350026",14.1083,,"S","11",, +3,0,"Harknett, Miss. Alice Phoebe","female",,0,0,"W./C. 6609",7.5500,,"S",,, +3,0,"Harmer, Mr. Abraham (David Lishin)","male",25,0,0,"374887",7.2500,,"S","B",, +3,0,"Hart, Mr. Henry","male",,0,0,"394140",6.8583,,"Q",,, +3,0,"Hassan, Mr. Houssein G N","male",11,0,0,"2699",18.7875,,"C",,, +3,1,"Healy, Miss. Hanora ""Nora""","female",,0,0,"370375",7.7500,,"Q","16",, +3,1,"Hedman, Mr. Oskar Arvid","male",27,0,0,"347089",6.9750,,"S","15",, +3,1,"Hee, Mr. Ling","male",,0,0,"1601",56.4958,,"S","C",, +3,0,"Hegarty, Miss. Hanora ""Nora""","female",18,0,0,"365226",6.7500,,"Q",,, +3,1,"Heikkinen, Miss. Laina","female",26,0,0,"STON/O2. 3101282",7.9250,,"S",,, +3,0,"Heininen, Miss. Wendla Maria","female",23,0,0,"STON/O2. 3101290",7.9250,,"S",,, +3,1,"Hellstrom, Miss. Hilda Maria","female",22,0,0,"7548",8.9625,,"S","C",, +3,0,"Hendekovic, Mr. Ignjac","male",28,0,0,"349243",7.8958,,"S",,"306", +3,0,"Henriksson, Miss. Jenny Lovisa","female",28,0,0,"347086",7.7750,,"S",,, +3,0,"Henry, Miss. Delia","female",,0,0,"382649",7.7500,,"Q",,, +3,1,"Hirvonen, Miss. Hildur E","female",2,0,1,"3101298",12.2875,,"S","15",, +3,1,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)","female",22,1,1,"3101298",12.2875,,"S","15",, +3,0,"Holm, Mr. John Fredrik Alexander","male",43,0,0,"C 7075",6.4500,,"S",,, +3,0,"Holthen, Mr. Johan Martin","male",28,0,0,"C 4001",22.5250,,"S",,, +3,1,"Honkanen, Miss. Eliina","female",27,0,0,"STON/O2. 3101283",7.9250,,"S",,, +3,0,"Horgan, Mr. John","male",,0,0,"370377",7.7500,,"Q",,, +3,1,"Howard, Miss. May Elizabeth","female",,0,0,"A. 2. 39186",8.0500,,"S","C",, +3,0,"Humblen, Mr. Adolf Mathias Nicolai Olsen","male",42,0,0,"348121",7.6500,"F G63","S",,"120", +3,1,"Hyman, Mr. Abraham","male",,0,0,"3470",7.8875,,"S","C",, +3,0,"Ibrahim Shawah, Mr. Yousseff","male",30,0,0,"2685",7.2292,,"C",,, +3,0,"Ilieff, Mr. Ylio","male",,0,0,"349220",7.8958,,"S",,, +3,0,"Ilmakangas, Miss. Ida Livija","female",27,1,0,"STON/O2. 3101270",7.9250,,"S",,, +3,0,"Ilmakangas, Miss. Pieta Sofia","female",25,1,0,"STON/O2. 3101271",7.9250,,"S",,, +3,0,"Ivanoff, Mr. Kanio","male",,0,0,"349201",7.8958,,"S",,, +3,1,"Jalsevac, Mr. Ivan","male",29,0,0,"349240",7.8958,,"C","15",, +3,1,"Jansson, Mr. Carl Olof","male",21,0,0,"350034",7.7958,,"S","A",, +3,0,"Jardin, Mr. Jose Neto","male",,0,0,"SOTON/O.Q. 3101305",7.0500,,"S",,, +3,0,"Jensen, Mr. Hans Peder","male",20,0,0,"350050",7.8542,,"S",,, +3,0,"Jensen, Mr. Niels Peder","male",48,0,0,"350047",7.8542,,"S",,, +3,0,"Jensen, Mr. Svend Lauritz","male",17,1,0,"350048",7.0542,,"S",,, +3,1,"Jermyn, Miss. Annie","female",,0,0,"14313",7.7500,,"Q","D",, +3,1,"Johannesen-Bratthammer, Mr. Bernt","male",,0,0,"65306",8.1125,,"S","13",, +3,0,"Johanson, Mr. Jakob Alfred","male",34,0,0,"3101264",6.4958,,"S",,"143", +3,1,"Johansson Palmquist, Mr. Oskar Leander","male",26,0,0,"347070",7.7750,,"S","15",, +3,0,"Johansson, Mr. Erik","male",22,0,0,"350052",7.7958,,"S",,"156", +3,0,"Johansson, Mr. Gustaf Joel","male",33,0,0,"7540",8.6542,,"S",,"285", +3,0,"Johansson, Mr. Karl Johan","male",31,0,0,"347063",7.7750,,"S",,, +3,0,"Johansson, Mr. Nils","male",29,0,0,"347467",7.8542,,"S",,, +3,1,"Johnson, Master. Harold Theodor","male",4,1,1,"347742",11.1333,,"S","15",, +3,1,"Johnson, Miss. Eleanor Ileen","female",1,1,1,"347742",11.1333,,"S","15",, +3,0,"Johnson, Mr. Alfred","male",49,0,0,"LINE",0.0000,,"S",,, +3,0,"Johnson, Mr. Malkolm Joackim","male",33,0,0,"347062",7.7750,,"S",,"37", +3,0,"Johnson, Mr. William Cahoone Jr","male",19,0,0,"LINE",0.0000,,"S",,, +3,1,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)","female",27,0,2,"347742",11.1333,,"S","15",, +3,0,"Johnston, Master. William Arthur ""Willie""","male",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Johnston, Miss. Catherine Helen ""Carrie""","female",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Johnston, Mr. Andrew G","male",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Johnston, Mrs. Andrew G (Elizabeth ""Lily"" Watson)","female",,1,2,"W./C. 6607",23.4500,,"S",,, +3,0,"Jonkoff, Mr. Lalio","male",23,0,0,"349204",7.8958,,"S",,, +3,1,"Jonsson, Mr. Carl","male",32,0,0,"350417",7.8542,,"S","15",, +3,0,"Jonsson, Mr. Nils Hilding","male",27,0,0,"350408",7.8542,,"S",,, +3,0,"Jussila, Miss. Katriina","female",20,1,0,"4136",9.8250,,"S",,, +3,0,"Jussila, Miss. Mari Aina","female",21,1,0,"4137",9.8250,,"S",,, +3,1,"Jussila, Mr. Eiriik","male",32,0,0,"STON/O 2. 3101286",7.9250,,"S","15",, +3,0,"Kallio, Mr. Nikolai Erland","male",17,0,0,"STON/O 2. 3101274",7.1250,,"S",,, +3,0,"Kalvik, Mr. Johannes Halvorsen","male",21,0,0,"8475",8.4333,,"S",,, +3,0,"Karaic, Mr. Milan","male",30,0,0,"349246",7.8958,,"S",,, +3,1,"Karlsson, Mr. Einar Gervasius","male",21,0,0,"350053",7.7958,,"S","13",, +3,0,"Karlsson, Mr. Julius Konrad Eugen","male",33,0,0,"347465",7.8542,,"S",,, +3,0,"Karlsson, Mr. Nils August","male",22,0,0,"350060",7.5208,,"S",,, +3,1,"Karun, Miss. Manca","female",4,0,1,"349256",13.4167,,"C","15",, +3,1,"Karun, Mr. Franz","male",39,0,1,"349256",13.4167,,"C","15",, +3,0,"Kassem, Mr. Fared","male",,0,0,"2700",7.2292,,"C",,, +3,0,"Katavelas, Mr. Vassilios (""Catavelas Vassilios"")","male",18.5,0,0,"2682",7.2292,,"C",,"58", +3,0,"Keane, Mr. Andrew ""Andy""","male",,0,0,"12460",7.7500,,"Q",,, +3,0,"Keefe, Mr. Arthur","male",,0,0,"323592",7.2500,,"S","A",, +3,1,"Kelly, Miss. Anna Katherine ""Annie Kate""","female",,0,0,"9234",7.7500,,"Q","16",, +3,1,"Kelly, Miss. Mary","female",,0,0,"14312",7.7500,,"Q","D",, +3,0,"Kelly, Mr. James","male",34.5,0,0,"330911",7.8292,,"Q",,"70", +3,0,"Kelly, Mr. James","male",44,0,0,"363592",8.0500,,"S",,, +3,1,"Kennedy, Mr. John","male",,0,0,"368783",7.7500,,"Q",,, +3,0,"Khalil, Mr. Betros","male",,1,0,"2660",14.4542,,"C",,, +3,0,"Khalil, Mrs. Betros (Zahie ""Maria"" Elias)","female",,1,0,"2660",14.4542,,"C",,, +3,0,"Kiernan, Mr. John","male",,1,0,"367227",7.7500,,"Q",,, +3,0,"Kiernan, Mr. Philip","male",,1,0,"367229",7.7500,,"Q",,, +3,0,"Kilgannon, Mr. Thomas J","male",,0,0,"36865",7.7375,,"Q",,, +3,0,"Kink, Miss. Maria","female",22,2,0,"315152",8.6625,,"S",,, +3,0,"Kink, Mr. Vincenz","male",26,2,0,"315151",8.6625,,"S",,, +3,1,"Kink-Heilmann, Miss. Luise Gretchen","female",4,0,2,"315153",22.0250,,"S","2",, +3,1,"Kink-Heilmann, Mr. Anton","male",29,3,1,"315153",22.0250,,"S","2",, +3,1,"Kink-Heilmann, Mrs. Anton (Luise Heilmann)","female",26,1,1,"315153",22.0250,,"S","2",, +3,0,"Klasen, Miss. Gertrud Emilia","female",1,1,1,"350405",12.1833,,"S",,, +3,0,"Klasen, Mr. Klas Albin","male",18,1,1,"350404",7.8542,,"S",,, +3,0,"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)","female",36,0,2,"350405",12.1833,,"S",,, +3,0,"Kraeff, Mr. Theodor","male",,0,0,"349253",7.8958,,"C",,, +3,1,"Krekorian, Mr. Neshan","male",25,0,0,"2654",7.2292,"F E57","C","10",, +3,0,"Lahoud, Mr. Sarkis","male",,0,0,"2624",7.2250,,"C",,, +3,0,"Laitinen, Miss. Kristina Sofia","female",37,0,0,"4135",9.5875,,"S",,, +3,0,"Laleff, Mr. Kristo","male",,0,0,"349217",7.8958,,"S",,, +3,1,"Lam, Mr. Ali","male",,0,0,"1601",56.4958,,"S","C",, +3,0,"Lam, Mr. Len","male",,0,0,"1601",56.4958,,"S",,, +3,1,"Landergren, Miss. Aurora Adelia","female",22,0,0,"C 7077",7.2500,,"S","13",, +3,0,"Lane, Mr. Patrick","male",,0,0,"7935",7.7500,,"Q",,, +3,1,"Lang, Mr. Fang","male",26,0,0,"1601",56.4958,,"S","14",, +3,0,"Larsson, Mr. August Viktor","male",29,0,0,"7545",9.4833,,"S",,, +3,0,"Larsson, Mr. Bengt Edvin","male",29,0,0,"347067",7.7750,,"S",,, +3,0,"Larsson-Rondberg, Mr. Edvard A","male",22,0,0,"347065",7.7750,,"S",,, +3,1,"Leeni, Mr. Fahim (""Philip Zenni"")","male",22,0,0,"2620",7.2250,,"C","6",, +3,0,"Lefebre, Master. Henry Forbes","male",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Miss. Ida","female",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Miss. Jeannie","female",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Miss. Mathilde","female",,3,1,"4133",25.4667,,"S",,, +3,0,"Lefebre, Mrs. Frank (Frances)","female",,0,4,"4133",25.4667,,"S",,, +3,0,"Leinonen, Mr. Antti Gustaf","male",32,0,0,"STON/O 2. 3101292",7.9250,,"S",,, +3,0,"Lemberopolous, Mr. Peter L","male",34.5,0,0,"2683",6.4375,,"C",,"196", +3,0,"Lennon, Miss. Mary","female",,1,0,"370371",15.5000,,"Q",,, +3,0,"Lennon, Mr. Denis","male",,1,0,"370371",15.5000,,"Q",,, +3,0,"Leonard, Mr. Lionel","male",36,0,0,"LINE",0.0000,,"S",,, +3,0,"Lester, Mr. James","male",39,0,0,"A/4 48871",24.1500,,"S",,, +3,0,"Lievens, Mr. Rene Aime","male",24,0,0,"345781",9.5000,,"S",,, +3,0,"Lindahl, Miss. Agda Thorilda Viktoria","female",25,0,0,"347071",7.7750,,"S",,, +3,0,"Lindblom, Miss. Augusta Charlotta","female",45,0,0,"347073",7.7500,,"S",,, +3,0,"Lindell, Mr. Edvard Bengtsson","male",36,1,0,"349910",15.5500,,"S","A",, +3,0,"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)","female",30,1,0,"349910",15.5500,,"S","A",, +3,1,"Lindqvist, Mr. Eino William","male",20,1,0,"STON/O 2. 3101285",7.9250,,"S","15",, +3,0,"Linehan, Mr. Michael","male",,0,0,"330971",7.8792,,"Q",,, +3,0,"Ling, Mr. Lee","male",28,0,0,"1601",56.4958,,"S",,, +3,0,"Lithman, Mr. Simon","male",,0,0,"S.O./P.P. 251",7.5500,,"S",,, +3,0,"Lobb, Mr. William Arthur","male",30,1,0,"A/5. 3336",16.1000,,"S",,, +3,0,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)","female",26,1,0,"A/5. 3336",16.1000,,"S",,, +3,0,"Lockyer, Mr. Edward","male",,0,0,"1222",7.8792,,"S",,"153", +3,0,"Lovell, Mr. John Hall (""Henry"")","male",20.5,0,0,"A/5 21173",7.2500,,"S",,, +3,1,"Lulic, Mr. Nikola","male",27,0,0,"315098",8.6625,,"S","15",, +3,0,"Lundahl, Mr. Johan Svensson","male",51,0,0,"347743",7.0542,,"S",,, +3,1,"Lundin, Miss. Olga Elida","female",23,0,0,"347469",7.8542,,"S","10",, +3,1,"Lundstrom, Mr. Thure Edvin","male",32,0,0,"350403",7.5792,,"S","15",, +3,0,"Lyntakoff, Mr. Stanko","male",,0,0,"349235",7.8958,,"S",,, +3,0,"MacKay, Mr. George William","male",,0,0,"C.A. 42795",7.5500,,"S",,, +3,1,"Madigan, Miss. Margaret ""Maggie""","female",,0,0,"370370",7.7500,,"Q","15",, +3,1,"Madsen, Mr. Fridtjof Arne","male",24,0,0,"C 17369",7.1417,,"S","13",, +3,0,"Maenpaa, Mr. Matti Alexanteri","male",22,0,0,"STON/O 2. 3101275",7.1250,,"S",,, +3,0,"Mahon, Miss. Bridget Delia","female",,0,0,"330924",7.8792,,"Q",,, +3,0,"Mahon, Mr. John","male",,0,0,"AQ/4 3130",7.7500,,"Q",,, +3,0,"Maisner, Mr. Simon","male",,0,0,"A/S 2816",8.0500,,"S",,, +3,0,"Makinen, Mr. Kalle Edvard","male",29,0,0,"STON/O 2. 3101268",7.9250,,"S",,, +3,1,"Mamee, Mr. Hanna","male",,0,0,"2677",7.2292,,"C","15",, +3,0,"Mangan, Miss. Mary","female",30.5,0,0,"364850",7.7500,,"Q",,"61", +3,1,"Mannion, Miss. Margareth","female",,0,0,"36866",7.7375,,"Q","16",, +3,0,"Mardirosian, Mr. Sarkis","male",,0,0,"2655",7.2292,"F E46","C",,, +3,0,"Markoff, Mr. Marin","male",35,0,0,"349213",7.8958,,"C",,, +3,0,"Markun, Mr. Johann","male",33,0,0,"349257",7.8958,,"S",,, +3,1,"Masselmani, Mrs. Fatima","female",,0,0,"2649",7.2250,,"C","C",, +3,0,"Matinoff, Mr. Nicola","male",,0,0,"349255",7.8958,,"C",,, +3,1,"McCarthy, Miss. Catherine ""Katie""","female",,0,0,"383123",7.7500,,"Q","15 16",, +3,1,"McCormack, Mr. Thomas Joseph","male",,0,0,"367228",7.7500,,"Q",,, +3,1,"McCoy, Miss. Agnes","female",,2,0,"367226",23.2500,,"Q","16",, +3,1,"McCoy, Miss. Alicia","female",,2,0,"367226",23.2500,,"Q","16",, +3,1,"McCoy, Mr. Bernard","male",,2,0,"367226",23.2500,,"Q","16",, +3,1,"McDermott, Miss. Brigdet Delia","female",,0,0,"330932",7.7875,,"Q","13",, +3,0,"McEvoy, Mr. Michael","male",,0,0,"36568",15.5000,,"Q",,, +3,1,"McGovern, Miss. Mary","female",,0,0,"330931",7.8792,,"Q","13",, +3,1,"McGowan, Miss. Anna ""Annie""","female",15,0,0,"330923",8.0292,,"Q",,, +3,0,"McGowan, Miss. Katherine","female",35,0,0,"9232",7.7500,,"Q",,, +3,0,"McMahon, Mr. Martin","male",,0,0,"370372",7.7500,,"Q",,, +3,0,"McNamee, Mr. Neal","male",24,1,0,"376566",16.1000,,"S",,, +3,0,"McNamee, Mrs. Neal (Eileen O'Leary)","female",19,1,0,"376566",16.1000,,"S",,"53", +3,0,"McNeill, Miss. Bridget","female",,0,0,"370368",7.7500,,"Q",,, +3,0,"Meanwell, Miss. (Marion Ogden)","female",,0,0,"SOTON/O.Q. 392087",8.0500,,"S",,, +3,0,"Meek, Mrs. Thomas (Annie Louise Rowley)","female",,0,0,"343095",8.0500,,"S",,, +3,0,"Meo, Mr. Alfonzo","male",55.5,0,0,"A.5. 11206",8.0500,,"S",,"201", +3,0,"Mernagh, Mr. Robert","male",,0,0,"368703",7.7500,,"Q",,, +3,1,"Midtsjo, Mr. Karl Albert","male",21,0,0,"345501",7.7750,,"S","15",, +3,0,"Miles, Mr. Frank","male",,0,0,"359306",8.0500,,"S",,, +3,0,"Mineff, Mr. Ivan","male",24,0,0,"349233",7.8958,,"S",,, +3,0,"Minkoff, Mr. Lazar","male",21,0,0,"349211",7.8958,,"S",,, +3,0,"Mionoff, Mr. Stoytcho","male",28,0,0,"349207",7.8958,,"S",,, +3,0,"Mitkoff, Mr. Mito","male",,0,0,"349221",7.8958,,"S",,, +3,1,"Mockler, Miss. Helen Mary ""Ellie""","female",,0,0,"330980",7.8792,,"Q","16",, +3,0,"Moen, Mr. Sigurd Hansen","male",25,0,0,"348123",7.6500,"F G73","S",,"309", +3,1,"Moor, Master. Meier","male",6,0,1,"392096",12.4750,"E121","S","14",, +3,1,"Moor, Mrs. (Beila)","female",27,0,1,"392096",12.4750,"E121","S","14",, +3,0,"Moore, Mr. Leonard Charles","male",,0,0,"A4. 54510",8.0500,,"S",,, +3,1,"Moran, Miss. Bertha","female",,1,0,"371110",24.1500,,"Q","16",, +3,0,"Moran, Mr. Daniel J","male",,1,0,"371110",24.1500,,"Q",,, +3,0,"Moran, Mr. James","male",,0,0,"330877",8.4583,,"Q",,, +3,0,"Morley, Mr. William","male",34,0,0,"364506",8.0500,,"S",,, +3,0,"Morrow, Mr. Thomas Rowan","male",,0,0,"372622",7.7500,,"Q",,, +3,1,"Moss, Mr. Albert Johan","male",,0,0,"312991",7.7750,,"S","B",, +3,1,"Moubarek, Master. Gerios","male",,1,1,"2661",15.2458,,"C","C",, +3,1,"Moubarek, Master. Halim Gonios (""William George"")","male",,1,1,"2661",15.2458,,"C","C",, +3,1,"Moubarek, Mrs. George (Omine ""Amenia"" Alexander)","female",,0,2,"2661",15.2458,,"C","C",, +3,1,"Moussa, Mrs. (Mantoura Boulos)","female",,0,0,"2626",7.2292,,"C",,, +3,0,"Moutal, Mr. Rahamin Haim","male",,0,0,"374746",8.0500,,"S",,, +3,1,"Mullens, Miss. Katherine ""Katie""","female",,0,0,"35852",7.7333,,"Q","16",, +3,1,"Mulvihill, Miss. Bertha E","female",24,0,0,"382653",7.7500,,"Q","15",, +3,0,"Murdlin, Mr. Joseph","male",,0,0,"A./5. 3235",8.0500,,"S",,, +3,1,"Murphy, Miss. Katherine ""Kate""","female",,1,0,"367230",15.5000,,"Q","16",, +3,1,"Murphy, Miss. Margaret Jane","female",,1,0,"367230",15.5000,,"Q","16",, +3,1,"Murphy, Miss. Nora","female",,0,0,"36568",15.5000,,"Q","16",, +3,0,"Myhrman, Mr. Pehr Fabian Oliver Malkolm","male",18,0,0,"347078",7.7500,,"S",,, +3,0,"Naidenoff, Mr. Penko","male",22,0,0,"349206",7.8958,,"S",,, +3,1,"Najib, Miss. Adele Kiamie ""Jane""","female",15,0,0,"2667",7.2250,,"C","C",, +3,1,"Nakid, Miss. Maria (""Mary"")","female",1,0,2,"2653",15.7417,,"C","C",, +3,1,"Nakid, Mr. Sahid","male",20,1,1,"2653",15.7417,,"C","C",, +3,1,"Nakid, Mrs. Said (Waika ""Mary"" Mowad)","female",19,1,1,"2653",15.7417,,"C","C",, +3,0,"Nancarrow, Mr. William Henry","male",33,0,0,"A./5. 3338",8.0500,,"S",,, +3,0,"Nankoff, Mr. Minko","male",,0,0,"349218",7.8958,,"S",,, +3,0,"Nasr, Mr. Mustafa","male",,0,0,"2652",7.2292,,"C",,, +3,0,"Naughton, Miss. Hannah","female",,0,0,"365237",7.7500,,"Q",,, +3,0,"Nenkoff, Mr. Christo","male",,0,0,"349234",7.8958,,"S",,, +3,1,"Nicola-Yarred, Master. Elias","male",12,1,0,"2651",11.2417,,"C","C",, +3,1,"Nicola-Yarred, Miss. Jamila","female",14,1,0,"2651",11.2417,,"C","C",, +3,0,"Nieminen, Miss. Manta Josefina","female",29,0,0,"3101297",7.9250,,"S",,, +3,0,"Niklasson, Mr. Samuel","male",28,0,0,"363611",8.0500,,"S",,, +3,1,"Nilsson, Miss. Berta Olivia","female",18,0,0,"347066",7.7750,,"S","D",, +3,1,"Nilsson, Miss. Helmina Josefina","female",26,0,0,"347470",7.8542,,"S","13",, +3,0,"Nilsson, Mr. August Ferdinand","male",21,0,0,"350410",7.8542,,"S",,, +3,0,"Nirva, Mr. Iisakki Antino Aijo","male",41,0,0,"SOTON/O2 3101272",7.1250,,"S",,,"Finland Sudbury, ON" +3,1,"Niskanen, Mr. Juha","male",39,0,0,"STON/O 2. 3101289",7.9250,,"S","9",, +3,0,"Nosworthy, Mr. Richard Cater","male",21,0,0,"A/4. 39886",7.8000,,"S",,, +3,0,"Novel, Mr. Mansouer","male",28.5,0,0,"2697",7.2292,,"C",,"181", +3,1,"Nysten, Miss. Anna Sofia","female",22,0,0,"347081",7.7500,,"S","13",, +3,0,"Nysveen, Mr. Johan Hansen","male",61,0,0,"345364",6.2375,,"S",,, +3,0,"O'Brien, Mr. Thomas","male",,1,0,"370365",15.5000,,"Q",,, +3,0,"O'Brien, Mr. Timothy","male",,0,0,"330979",7.8292,,"Q",,, +3,1,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)","female",,1,0,"370365",15.5000,,"Q",,, +3,0,"O'Connell, Mr. Patrick D","male",,0,0,"334912",7.7333,,"Q",,, +3,0,"O'Connor, Mr. Maurice","male",,0,0,"371060",7.7500,,"Q",,, +3,0,"O'Connor, Mr. Patrick","male",,0,0,"366713",7.7500,,"Q",,, +3,0,"Odahl, Mr. Nils Martin","male",23,0,0,"7267",9.2250,,"S",,, +3,0,"O'Donoghue, Ms. Bridget","female",,0,0,"364856",7.7500,,"Q",,, +3,1,"O'Driscoll, Miss. Bridget","female",,0,0,"14311",7.7500,,"Q","D",, +3,1,"O'Dwyer, Miss. Ellen ""Nellie""","female",,0,0,"330959",7.8792,,"Q",,, +3,1,"Ohman, Miss. Velin","female",22,0,0,"347085",7.7750,,"S","C",, +3,1,"O'Keefe, Mr. Patrick","male",,0,0,"368402",7.7500,,"Q","B",, +3,1,"O'Leary, Miss. Hanora ""Norah""","female",,0,0,"330919",7.8292,,"Q","13",, +3,1,"Olsen, Master. Artur Karl","male",9,0,1,"C 17368",3.1708,,"S","13",, +3,0,"Olsen, Mr. Henry Margido","male",28,0,0,"C 4001",22.5250,,"S",,"173", +3,0,"Olsen, Mr. Karl Siegwart Andreas","male",42,0,1,"4579",8.4042,,"S",,, +3,0,"Olsen, Mr. Ole Martin","male",,0,0,"Fa 265302",7.3125,,"S",,, +3,0,"Olsson, Miss. Elina","female",31,0,0,"350407",7.8542,,"S",,, +3,0,"Olsson, Mr. Nils Johan Goransson","male",28,0,0,"347464",7.8542,,"S",,, +3,1,"Olsson, Mr. Oscar Wilhelm","male",32,0,0,"347079",7.7750,,"S","A",, +3,0,"Olsvigen, Mr. Thor Anderson","male",20,0,0,"6563",9.2250,,"S",,"89","Oslo, Norway Cameron, WI" +3,0,"Oreskovic, Miss. Jelka","female",23,0,0,"315085",8.6625,,"S",,, +3,0,"Oreskovic, Miss. Marija","female",20,0,0,"315096",8.6625,,"S",,, +3,0,"Oreskovic, Mr. Luka","male",20,0,0,"315094",8.6625,,"S",,, +3,0,"Osen, Mr. Olaf Elon","male",16,0,0,"7534",9.2167,,"S",,, +3,1,"Osman, Mrs. Mara","female",31,0,0,"349244",8.6833,,"S",,, +3,0,"O'Sullivan, Miss. Bridget Mary","female",,0,0,"330909",7.6292,,"Q",,, +3,0,"Palsson, Master. Gosta Leonard","male",2,3,1,"349909",21.0750,,"S",,"4", +3,0,"Palsson, Master. Paul Folke","male",6,3,1,"349909",21.0750,,"S",,, +3,0,"Palsson, Miss. Stina Viola","female",3,3,1,"349909",21.0750,,"S",,, +3,0,"Palsson, Miss. Torborg Danira","female",8,3,1,"349909",21.0750,,"S",,, +3,0,"Palsson, Mrs. Nils (Alma Cornelia Berglund)","female",29,0,4,"349909",21.0750,,"S",,"206", +3,0,"Panula, Master. Eino Viljami","male",1,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Master. Juha Niilo","male",7,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Master. Urho Abraham","male",2,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Mr. Ernesti Arvid","male",16,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Mr. Jaako Arnold","male",14,4,1,"3101295",39.6875,,"S",,, +3,0,"Panula, Mrs. Juha (Maria Emilia Ojala)","female",41,0,5,"3101295",39.6875,,"S",,, +3,0,"Pasic, Mr. Jakob","male",21,0,0,"315097",8.6625,,"S",,, +3,0,"Patchett, Mr. George","male",19,0,0,"358585",14.5000,,"S",,, +3,0,"Paulner, Mr. Uscher","male",,0,0,"3411",8.7125,,"C",,, +3,0,"Pavlovic, Mr. Stefo","male",32,0,0,"349242",7.8958,,"S",,, +3,0,"Peacock, Master. Alfred Edward","male",0.75,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, +3,0,"Peacock, Miss. Treasteall","female",3,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, +3,0,"Peacock, Mrs. Benjamin (Edith Nile)","female",26,0,2,"SOTON/O.Q. 3101315",13.7750,,"S",,, +3,0,"Pearce, Mr. Ernest","male",,0,0,"343271",7.0000,,"S",,, +3,0,"Pedersen, Mr. Olaf","male",,0,0,"345498",7.7750,,"S",,, +3,0,"Peduzzi, Mr. Joseph","male",,0,0,"A/5 2817",8.0500,,"S",,, +3,0,"Pekoniemi, Mr. Edvard","male",21,0,0,"STON/O 2. 3101294",7.9250,,"S",,, +3,0,"Peltomaki, Mr. Nikolai Johannes","male",25,0,0,"STON/O 2. 3101291",7.9250,,"S",,, +3,0,"Perkin, Mr. John Henry","male",22,0,0,"A/5 21174",7.2500,,"S",,, +3,1,"Persson, Mr. Ernst Ulrik","male",25,1,0,"347083",7.7750,,"S","15",, +3,1,"Peter, Master. Michael J","male",,1,1,"2668",22.3583,,"C","C",, +3,1,"Peter, Miss. Anna","female",,1,1,"2668",22.3583,"F E69","C","D",, +3,1,"Peter, Mrs. Catherine (Catherine Rizk)","female",,0,2,"2668",22.3583,,"C","D",, +3,0,"Peters, Miss. Katie","female",,0,0,"330935",8.1375,,"Q",,, +3,0,"Petersen, Mr. Marius","male",24,0,0,"342441",8.0500,,"S",,, +3,0,"Petranec, Miss. Matilda","female",28,0,0,"349245",7.8958,,"S",,, +3,0,"Petroff, Mr. Nedelio","male",19,0,0,"349212",7.8958,,"S",,, +3,0,"Petroff, Mr. Pastcho (""Pentcho"")","male",,0,0,"349215",7.8958,,"S",,, +3,0,"Petterson, Mr. Johan Emil","male",25,1,0,"347076",7.7750,,"S",,, +3,0,"Pettersson, Miss. Ellen Natalia","female",18,0,0,"347087",7.7750,,"S",,, +3,1,"Pickard, Mr. Berk (Berk Trembisky)","male",32,0,0,"SOTON/O.Q. 392078",8.0500,"E10","S","9",, +3,0,"Plotcharsky, Mr. Vasil","male",,0,0,"349227",7.8958,,"S",,, +3,0,"Pokrnic, Mr. Mate","male",17,0,0,"315095",8.6625,,"S",,, +3,0,"Pokrnic, Mr. Tome","male",24,0,0,"315092",8.6625,,"S",,, +3,0,"Radeff, Mr. Alexander","male",,0,0,"349223",7.8958,,"S",,, +3,0,"Rasmussen, Mrs. (Lena Jacobsen Solvang)","female",,0,0,"65305",8.1125,,"S",,, +3,0,"Razi, Mr. Raihed","male",,0,0,"2629",7.2292,,"C",,, +3,0,"Reed, Mr. James George","male",,0,0,"362316",7.2500,,"S",,, +3,0,"Rekic, Mr. Tido","male",38,0,0,"349249",7.8958,,"S",,, +3,0,"Reynolds, Mr. Harold J","male",21,0,0,"342684",8.0500,,"S",,, +3,0,"Rice, Master. Albert","male",10,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. Arthur","male",4,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. Eric","male",7,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. Eugene","male",2,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Master. George Hugh","male",8,4,1,"382652",29.1250,,"Q",,, +3,0,"Rice, Mrs. William (Margaret Norton)","female",39,0,5,"382652",29.1250,,"Q",,"327", +3,0,"Riihivouri, Miss. Susanna Juhantytar ""Sanni""","female",22,0,0,"3101295",39.6875,,"S",,, +3,0,"Rintamaki, Mr. Matti","male",35,0,0,"STON/O 2. 3101273",7.1250,,"S",,, +3,1,"Riordan, Miss. Johanna ""Hannah""","female",,0,0,"334915",7.7208,,"Q","13",, +3,0,"Risien, Mr. Samuel Beard","male",,0,0,"364498",14.5000,,"S",,, +3,0,"Risien, Mrs. Samuel (Emma)","female",,0,0,"364498",14.5000,,"S",,, +3,0,"Robins, Mr. Alexander A","male",50,1,0,"A/5. 3337",14.5000,,"S",,"119", +3,0,"Robins, Mrs. Alexander A (Grace Charity Laury)","female",47,1,0,"A/5. 3337",14.5000,,"S",,"7", +3,0,"Rogers, Mr. William John","male",,0,0,"S.C./A.4. 23567",8.0500,,"S",,, +3,0,"Rommetvedt, Mr. Knud Paust","male",,0,0,"312993",7.7750,,"S",,, +3,0,"Rosblom, Miss. Salli Helena","female",2,1,1,"370129",20.2125,,"S",,, +3,0,"Rosblom, Mr. Viktor Richard","male",18,1,1,"370129",20.2125,,"S",,, +3,0,"Rosblom, Mrs. Viktor (Helena Wilhelmina)","female",41,0,2,"370129",20.2125,,"S",,, +3,1,"Roth, Miss. Sarah A","female",,0,0,"342712",8.0500,,"S","C",, +3,0,"Rouse, Mr. Richard Henry","male",50,0,0,"A/5 3594",8.0500,,"S",,, +3,0,"Rush, Mr. Alfred George John","male",16,0,0,"A/4. 20589",8.0500,,"S",,, +3,1,"Ryan, Mr. Edward","male",,0,0,"383162",7.7500,,"Q","14",, +3,0,"Ryan, Mr. Patrick","male",,0,0,"371110",24.1500,,"Q",,, +3,0,"Saad, Mr. Amin","male",,0,0,"2671",7.2292,,"C",,, +3,0,"Saad, Mr. Khalil","male",25,0,0,"2672",7.2250,,"C",,, +3,0,"Saade, Mr. Jean Nassr","male",,0,0,"2676",7.2250,,"C",,, +3,0,"Sadlier, Mr. Matthew","male",,0,0,"367655",7.7292,,"Q",,, +3,0,"Sadowitz, Mr. Harry","male",,0,0,"LP 1588",7.5750,,"S",,, +3,0,"Saether, Mr. Simon Sivertsen","male",38.5,0,0,"SOTON/O.Q. 3101262",7.2500,,"S",,"32", +3,0,"Sage, Master. Thomas Henry","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Master. William Henry","male",14.5,8,2,"CA. 2343",69.5500,,"S",,"67", +3,0,"Sage, Miss. Ada","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Miss. Constance Gladys","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Miss. Dorothy Edith ""Dolly""","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Miss. Stella Anna","female",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. Douglas Bullen","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. Frederick","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. George John Jr","male",,8,2,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mr. John George","male",,1,9,"CA. 2343",69.5500,,"S",,, +3,0,"Sage, Mrs. John (Annie Bullen)","female",,1,9,"CA. 2343",69.5500,,"S",,, +3,0,"Salander, Mr. Karl Johan","male",24,0,0,"7266",9.3250,,"S",,, +3,1,"Salkjelsvik, Miss. Anna Kristine","female",21,0,0,"343120",7.6500,,"S","C",, +3,0,"Salonen, Mr. Johan Werner","male",39,0,0,"3101296",7.9250,,"S",,, +3,0,"Samaan, Mr. Elias","male",,2,0,"2662",21.6792,,"C",,, +3,0,"Samaan, Mr. Hanna","male",,2,0,"2662",21.6792,,"C",,, +3,0,"Samaan, Mr. Youssef","male",,2,0,"2662",21.6792,,"C",,, +3,1,"Sandstrom, Miss. Beatrice Irene","female",1,1,1,"PP 9549",16.7000,"G6","S","13",, +3,1,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)","female",24,0,2,"PP 9549",16.7000,"G6","S","13",, +3,1,"Sandstrom, Miss. Marguerite Rut","female",4,1,1,"PP 9549",16.7000,"G6","S","13",, +3,1,"Sap, Mr. Julius","male",25,0,0,"345768",9.5000,,"S","11",, +3,0,"Saundercock, Mr. William Henry","male",20,0,0,"A/5. 2151",8.0500,,"S",,, +3,0,"Sawyer, Mr. Frederick Charles","male",24.5,0,0,"342826",8.0500,,"S",,"284", +3,0,"Scanlan, Mr. James","male",,0,0,"36209",7.7250,,"Q",,, +3,0,"Sdycoff, Mr. Todor","male",,0,0,"349222",7.8958,,"S",,, +3,0,"Shaughnessy, Mr. Patrick","male",,0,0,"370374",7.7500,,"Q",,, +3,1,"Sheerlinck, Mr. Jan Baptist","male",29,0,0,"345779",9.5000,,"S","11",, +3,0,"Shellard, Mr. Frederick William","male",,0,0,"C.A. 6212",15.1000,,"S",,, +3,1,"Shine, Miss. Ellen Natalia","female",,0,0,"330968",7.7792,,"Q",,, +3,0,"Shorney, Mr. Charles Joseph","male",,0,0,"374910",8.0500,,"S",,, +3,0,"Simmons, Mr. John","male",,0,0,"SOTON/OQ 392082",8.0500,,"S",,, +3,0,"Sirayanian, Mr. Orsen","male",22,0,0,"2669",7.2292,,"C",,, +3,0,"Sirota, Mr. Maurice","male",,0,0,"392092",8.0500,,"S",,, +3,0,"Sivic, Mr. Husein","male",40,0,0,"349251",7.8958,,"S",,, +3,0,"Sivola, Mr. Antti Wilhelm","male",21,0,0,"STON/O 2. 3101280",7.9250,,"S",,, +3,1,"Sjoblom, Miss. Anna Sofia","female",18,0,0,"3101265",7.4958,,"S","16",, +3,0,"Skoog, Master. Harald","male",4,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Master. Karl Thorsten","male",10,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Miss. Mabel","female",9,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Miss. Margit Elizabeth","female",2,3,2,"347088",27.9000,,"S",,, +3,0,"Skoog, Mr. Wilhelm","male",40,1,4,"347088",27.9000,,"S",,, +3,0,"Skoog, Mrs. William (Anna Bernhardina Karlsson)","female",45,1,4,"347088",27.9000,,"S",,, +3,0,"Slabenoff, Mr. Petco","male",,0,0,"349214",7.8958,,"S",,, +3,0,"Slocovski, Mr. Selman Francis","male",,0,0,"SOTON/OQ 392086",8.0500,,"S",,, +3,0,"Smiljanic, Mr. Mile","male",,0,0,"315037",8.6625,,"S",,, +3,0,"Smith, Mr. Thomas","male",,0,0,"384461",7.7500,,"Q",,, +3,1,"Smyth, Miss. Julia","female",,0,0,"335432",7.7333,,"Q","13",, +3,0,"Soholt, Mr. Peter Andreas Lauritz Andersen","male",19,0,0,"348124",7.6500,"F G73","S",,, +3,0,"Somerton, Mr. Francis William","male",30,0,0,"A.5. 18509",8.0500,,"S",,, +3,0,"Spector, Mr. Woolf","male",,0,0,"A.5. 3236",8.0500,,"S",,, +3,0,"Spinner, Mr. Henry John","male",32,0,0,"STON/OQ. 369943",8.0500,,"S",,, +3,0,"Staneff, Mr. Ivan","male",,0,0,"349208",7.8958,,"S",,, +3,0,"Stankovic, Mr. Ivan","male",33,0,0,"349239",8.6625,,"C",,, +3,1,"Stanley, Miss. Amy Zillah Elsie","female",23,0,0,"CA. 2314",7.5500,,"S","C",, +3,0,"Stanley, Mr. Edward Roland","male",21,0,0,"A/4 45380",8.0500,,"S",,, +3,0,"Storey, Mr. Thomas","male",60.5,0,0,"3701",,,"S",,"261", +3,0,"Stoytcheff, Mr. Ilia","male",19,0,0,"349205",7.8958,,"S",,, +3,0,"Strandberg, Miss. Ida Sofia","female",22,0,0,"7553",9.8375,,"S",,, +3,1,"Stranden, Mr. Juho","male",31,0,0,"STON/O 2. 3101288",7.9250,,"S","9",, +3,0,"Strilic, Mr. Ivan","male",27,0,0,"315083",8.6625,,"S",,, +3,0,"Strom, Miss. Telma Matilda","female",2,0,1,"347054",10.4625,"G6","S",,, +3,0,"Strom, Mrs. Wilhelm (Elna Matilda Persson)","female",29,1,1,"347054",10.4625,"G6","S",,, +3,1,"Sunderland, Mr. Victor Francis","male",16,0,0,"SOTON/OQ 392089",8.0500,,"S","B",, +3,1,"Sundman, Mr. Johan Julian","male",44,0,0,"STON/O 2. 3101269",7.9250,,"S","15",, +3,0,"Sutehall, Mr. Henry Jr","male",25,0,0,"SOTON/OQ 392076",7.0500,,"S",,, +3,0,"Svensson, Mr. Johan","male",74,0,0,"347060",7.7750,,"S",,, +3,1,"Svensson, Mr. Johan Cervin","male",14,0,0,"7538",9.2250,,"S","13",, +3,0,"Svensson, Mr. Olof","male",24,0,0,"350035",7.7958,,"S",,, +3,1,"Tenglin, Mr. Gunnar Isidor","male",25,0,0,"350033",7.7958,,"S","13 15",, +3,0,"Theobald, Mr. Thomas Leonard","male",34,0,0,"363294",8.0500,,"S",,"176", +3,1,"Thomas, Master. Assad Alexander","male",0.42,0,1,"2625",8.5167,,"C","16",, +3,0,"Thomas, Mr. Charles P","male",,1,0,"2621",6.4375,,"C",,, +3,0,"Thomas, Mr. John","male",,0,0,"2681",6.4375,,"C",,, +3,0,"Thomas, Mr. Tannous","male",,0,0,"2684",7.2250,,"C",,, +3,1,"Thomas, Mrs. Alexander (Thamine ""Thelma"")","female",16,1,1,"2625",8.5167,,"C","14",, +3,0,"Thomson, Mr. Alexander Morrison","male",,0,0,"32302",8.0500,,"S",,, +3,0,"Thorneycroft, Mr. Percival","male",,1,0,"376564",16.1000,,"S",,, +3,1,"Thorneycroft, Mrs. Percival (Florence Kate White)","female",,1,0,"376564",16.1000,,"S","10",, +3,0,"Tikkanen, Mr. Juho","male",32,0,0,"STON/O 2. 3101293",7.9250,,"S",,, +3,0,"Tobin, Mr. Roger","male",,0,0,"383121",7.7500,"F38","Q",,, +3,0,"Todoroff, Mr. Lalio","male",,0,0,"349216",7.8958,,"S",,, +3,0,"Tomlin, Mr. Ernest Portage","male",30.5,0,0,"364499",8.0500,,"S",,"50", +3,0,"Torber, Mr. Ernst William","male",44,0,0,"364511",8.0500,,"S",,, +3,0,"Torfa, Mr. Assad","male",,0,0,"2673",7.2292,,"C",,, +3,1,"Tornquist, Mr. William Henry","male",25,0,0,"LINE",0.0000,,"S","15",, +3,0,"Toufik, Mr. Nakli","male",,0,0,"2641",7.2292,,"C",,, +3,1,"Touma, Master. Georges Youssef","male",7,1,1,"2650",15.2458,,"C","C",, +3,1,"Touma, Miss. Maria Youssef","female",9,1,1,"2650",15.2458,,"C","C",, +3,1,"Touma, Mrs. Darwis (Hanne Youssef Razi)","female",29,0,2,"2650",15.2458,,"C","C",, +3,0,"Turcin, Mr. Stjepan","male",36,0,0,"349247",7.8958,,"S",,, +3,1,"Turja, Miss. Anna Sofia","female",18,0,0,"4138",9.8417,,"S","15",, +3,1,"Turkula, Mrs. (Hedwig)","female",63,0,0,"4134",9.5875,,"S","15",, +3,0,"van Billiard, Master. James William","male",,1,1,"A/5. 851",14.5000,,"S",,, +3,0,"van Billiard, Master. Walter John","male",11.5,1,1,"A/5. 851",14.5000,,"S",,"1", +3,0,"van Billiard, Mr. Austin Blyler","male",40.5,0,2,"A/5. 851",14.5000,,"S",,"255", +3,0,"Van Impe, Miss. Catharina","female",10,0,2,"345773",24.1500,,"S",,, +3,0,"Van Impe, Mr. Jean Baptiste","male",36,1,1,"345773",24.1500,,"S",,, +3,0,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)","female",30,1,1,"345773",24.1500,,"S",,, +3,0,"van Melkebeke, Mr. Philemon","male",,0,0,"345777",9.5000,,"S",,, +3,0,"Vande Velde, Mr. Johannes Joseph","male",33,0,0,"345780",9.5000,,"S",,, +3,0,"Vande Walle, Mr. Nestor Cyriel","male",28,0,0,"345770",9.5000,,"S",,, +3,0,"Vanden Steen, Mr. Leo Peter","male",28,0,0,"345783",9.5000,,"S",,, +3,0,"Vander Cruyssen, Mr. Victor","male",47,0,0,"345765",9.0000,,"S",,, +3,0,"Vander Planke, Miss. Augusta Maria","female",18,2,0,"345764",18.0000,,"S",,, +3,0,"Vander Planke, Mr. Julius","male",31,3,0,"345763",18.0000,,"S",,, +3,0,"Vander Planke, Mr. Leo Edmondus","male",16,2,0,"345764",18.0000,,"S",,, +3,0,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)","female",31,1,0,"345763",18.0000,,"S",,, +3,1,"Vartanian, Mr. David","male",22,0,0,"2658",7.2250,,"C","13 15",, +3,0,"Vendel, Mr. Olof Edvin","male",20,0,0,"350416",7.8542,,"S",,, +3,0,"Vestrom, Miss. Hulda Amanda Adolfina","female",14,0,0,"350406",7.8542,,"S",,, +3,0,"Vovk, Mr. Janko","male",22,0,0,"349252",7.8958,,"S",,, +3,0,"Waelens, Mr. Achille","male",22,0,0,"345767",9.0000,,"S",,,"Antwerp, Belgium / Stanton, OH" +3,0,"Ware, Mr. Frederick","male",,0,0,"359309",8.0500,,"S",,, +3,0,"Warren, Mr. Charles William","male",,0,0,"C.A. 49867",7.5500,,"S",,, +3,0,"Webber, Mr. James","male",,0,0,"SOTON/OQ 3101316",8.0500,,"S",,, +3,0,"Wenzel, Mr. Linhart","male",32.5,0,0,"345775",9.5000,,"S",,"298", +3,1,"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)","female",38,0,0,"2688",7.2292,,"C","C",, +3,0,"Widegren, Mr. Carl/Charles Peter","male",51,0,0,"347064",7.7500,,"S",,, +3,0,"Wiklund, Mr. Jakob Alfred","male",18,1,0,"3101267",6.4958,,"S",,"314", +3,0,"Wiklund, Mr. Karl Johan","male",21,1,0,"3101266",6.4958,,"S",,, +3,1,"Wilkes, Mrs. James (Ellen Needs)","female",47,1,0,"363272",7.0000,,"S",,, +3,0,"Willer, Mr. Aaron (""Abi Weller"")","male",,0,0,"3410",8.7125,,"S",,, +3,0,"Willey, Mr. Edward","male",,0,0,"S.O./P.P. 751",7.5500,,"S",,, +3,0,"Williams, Mr. Howard Hugh ""Harry""","male",,0,0,"A/5 2466",8.0500,,"S",,, +3,0,"Williams, Mr. Leslie","male",28.5,0,0,"54636",16.1000,,"S",,"14", +3,0,"Windelov, Mr. Einar","male",21,0,0,"SOTON/OQ 3101317",7.2500,,"S",,, +3,0,"Wirz, Mr. Albert","male",27,0,0,"315154",8.6625,,"S",,"131", +3,0,"Wiseman, Mr. Phillippe","male",,0,0,"A/4. 34244",7.2500,,"S",,, +3,0,"Wittevrongel, Mr. Camille","male",36,0,0,"345771",9.5000,,"S",,, +3,0,"Yasbeck, Mr. Antoni","male",27,1,0,"2659",14.4542,,"C","C",, +3,1,"Yasbeck, Mrs. Antoni (Selini Alexander)","female",15,1,0,"2659",14.4542,,"C",,, +3,0,"Youseff, Mr. Gerious","male",45.5,0,0,"2628",7.2250,,"C",,"312", +3,0,"Yousif, Mr. Wazli","male",,0,0,"2647",7.2250,,"C",,, +3,0,"Yousseff, Mr. Gerious","male",,0,0,"2627",14.4583,,"C",,, +3,0,"Zabour, Miss. Hileni","female",14.5,1,0,"2665",14.4542,,"C",,"328", +3,0,"Zabour, Miss. Thamine","female",,1,0,"2665",14.4542,,"C",,, +3,0,"Zakarian, Mr. Mapriededer","male",26.5,0,0,"2656",7.2250,,"C",,"304", +3,0,"Zakarian, Mr. Ortin","male",27,0,0,"2670",7.2250,,"C",,, +3,0,"Zimmerman, Mr. Leo","male",29,0,0,"315082",7.8750,,"S",,, From f4b24fdfd85416c3fdceec43d5425a94a4cf3bc3 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 25 May 2024 08:24:05 +0530 Subject: [PATCH 159/405] Add files via upload --- .../Importing_and_Exporting_Data_in_Pandas.md | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md diff --git a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md new file mode 100644 index 0000000..bb490b9 --- /dev/null +++ b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md @@ -0,0 +1,103 @@ +# Importing_and_Exporting_Data_in_Pandas + +>Created by Krishna Kaushik + +- **Now we're able to create `Series` and `DataFrames` in pandas, but we usually do not do this , in practice we import the data which is in the form of .csv (Comma Seperated Values) , a spreadsheet file or something similar.** + +- *Good news is that pandas allows for easy importing of data like this through functions such as ``pd.read_csv()`` and ``pd.read_excel()`` for Microsoft Excel files.* + +## 1. Importing from a Google sheet to a pandas dataframe + +*Let's say that you wanted to get the information from Google Sheet document into a pandas DataFrame.*. + +*You could export it as a .csv file and then import it using ``pd.read_csv()``.* + +*In this case, the exported .csv file is called `Titanic.csv`* + + +```python +## Importing Titanic Data set +import pandas as pd + +titanic_df= pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/Titanic.csv") +print(titanic_df) +``` + + pclass survived name \ + 0 1 1 Allen, Miss. Elisabeth Walton + 1 1 1 Allison, Master. Hudson Trevor + 2 1 0 Allison, Miss. Helen Loraine + 3 1 0 Allison, Mr. Hudson Joshua Creighton + 4 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) + ... ... ... ... + 1304 3 0 Zabour, Miss. Hileni + 1305 3 0 Zabour, Miss. Thamine + 1306 3 0 Zakarian, Mr. Mapriededer + 1307 3 0 Zakarian, Mr. Ortin + 1308 3 0 Zimmerman, Mr. Leo + + sex age sibsp parch ticket fare cabin embarked boat \ + 0 female 29.00 0 0 24160 211.3375 B5 S 2 + 1 male 0.92 1 2 113781 151.5500 C22 C26 S 11 + 2 female 2.00 1 2 113781 151.5500 C22 C26 S NaN + 3 male 30.00 1 2 113781 151.5500 C22 C26 S NaN + 4 female 25.00 1 2 113781 151.5500 C22 C26 S NaN + ... ... ... ... ... ... ... ... ... ... + 1304 female 14.50 1 0 2665 14.4542 NaN C NaN + 1305 female NaN 1 0 2665 14.4542 NaN C NaN + 1306 male 26.50 0 0 2656 7.2250 NaN C NaN + 1307 male 27.00 0 0 2670 7.2250 NaN C NaN + 1308 male 29.00 0 0 315082 7.8750 NaN S NaN + + body home.dest + 0 NaN St Louis, MO + 1 NaN Montreal, PQ / Chesterville, ON + 2 NaN Montreal, PQ / Chesterville, ON + 3 135.0 Montreal, PQ / Chesterville, ON + 4 NaN Montreal, PQ / Chesterville, ON + ... ... ... + 1304 328.0 NaN + 1305 NaN NaN + 1306 304.0 NaN + 1307 NaN NaN + 1308 NaN NaN + + [1309 rows x 14 columns] + + +The dataset I am using here for your reference is taken from the same repository i.e ``learn-python`` (https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/Titanic.csv) I uploaded it in the Datasets folder,you can use it from there. + +You can also place the filename with its path in `pd.read_csv()`. + +**Now we've got the same data from the Google Spreadsheet , but now available as ``pandas DataFrame`` which means we can now apply all pandas functionality over it.** + +#### Note: The quiet important thing i am telling is that ``pd.read_csv()`` takes the location of the file (which is in your current working directory) or the hyperlink of the dataset from the other source. + +#### But if you want to import the data from Github you can't directly use its link , you have to first convert it to raw by clicking on the raw button present in the repo . + +#### Also you can't use the data directly from `Kaggle` you have to use ``kaggle API`` + +## 2. The Anatomy of DataFrame + +**Different functions use different labels for different things, and can get a little confusing.** + +- Rows are refer as ``axis=0`` +- columns are refer as ``axis=1`` + +## 3. Exporting Data + +**OK, so after you've made a few changes to your data, you might want to export it and save it so someone else can access the changes.** + +**pandas allows you to export ``DataFrame's`` to ``.csv`` format using ``.to_csv()``, or to a spreadsheet format using .to_excel().** + +### Exporting a dataframe to a CSV + +**We haven't made any changes yet to the ``titanic_df`` DataFrame but let's try to export it.** + + +```python +#Export the titanic_df DataFrame to csv +titanic_df.to_csv("exported_titanic.csv") +``` + +Running this will save a file called ``exported_titanic.csv`` to the current folder. From 485c508e4dbe68bde1a3842ca6f030f0e2c072f1 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 25 May 2024 12:03:10 +0530 Subject: [PATCH 160/405] 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 161/405] 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 43a1b5a652b74852b2a17cd169d1412cf5114fb0 Mon Sep 17 00:00:00 2001 From: rohit Date: Sat, 25 May 2024 12:12:28 +0530 Subject: [PATCH 162/405] Added PyTorch.md --- contrib/machine-learning/PyTorch.md | 113 ++++++++++++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 114 insertions(+) create mode 100644 contrib/machine-learning/PyTorch.md diff --git a/contrib/machine-learning/PyTorch.md b/contrib/machine-learning/PyTorch.md new file mode 100644 index 0000000..7de853b --- /dev/null +++ b/contrib/machine-learning/PyTorch.md @@ -0,0 +1,113 @@ +# PyTorch: A Comprehensive Overview + +## Introduction +PyTorch is an open-source deep learning framework developed by Facebook's AI Research lab. It provides a flexible and efficient platform for building and deploying machine learning models. PyTorch is known for its dynamic computational graph, ease of use, and strong support for GPU acceleration. + +## Key Features +- **Dynamic Computational Graphs**: PyTorch's dynamic computation graph (or define-by-run) allows you to change the network architecture during runtime. This feature makes debugging and experimenting with different model architectures easier. +- **GPU Acceleration**: PyTorch supports CUDA, enabling efficient computation on GPUs. +- **Extensive Libraries and Tools**: PyTorch has a rich ecosystem of libraries and tools such as torchvision for computer vision, torchtext for natural language processing, and more. +- **Community Support**: PyTorch has a large and active community, providing extensive resources, tutorials, and forums for support. + +## Installation +To install PyTorch, you can use pip: + +```sh +pip install torch torchvision +``` + +For detailed installation instructions, including GPU support, visit the [official PyTorch installation guide](https://pytorch.org/get-started/locally/). + +## Basic Usage + +### Tensors +Tensors are the fundamental building blocks in PyTorch. They are similar to NumPy arrays but can run on GPUs. + +```python +import torch + +# Creating a tensor +x = torch.tensor([1.0, 2.0, 3.0]) +print(x) + +# Performing basic operations +y = torch.tensor([4.0, 5.0, 6.0]) +z = x + y +print(z) +``` + +### Autograd +Autograd is PyTorch's automatic differentiation engine that powers neural network training. It tracks operations on tensors to automatically compute gradients. + +```python +# Requires gradient +x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True) + +# Perform operations +y = x ** 2 +z = y.sum() + +# Compute gradients +z.backward() +print(x.grad) +``` + +### Building Neural Networks +PyTorch provides the `torch.nn` module to build neural networks. + +```python +import torch +import torch.nn as nn +import torch.optim as optim + +# Define a simple neural network +class SimpleNN(nn.Module): + def __init__(self): + super(SimpleNN, self).__init__() + self.fc1 = nn.Linear(3, 1) + + def forward(self, x): + x = self.fc1(x) + return x + +# Create the network, define the criterion and optimizer +model = SimpleNN() +criterion = nn.MSELoss() +optimizer = optim.SGD(model.parameters(), lr=0.01) + +# Dummy input and target +inputs = torch.tensor([[1.0, 2.0, 3.0]]) +targets = torch.tensor([[0.5]]) + +# Forward pass +outputs = model(inputs) +loss = criterion(outputs, targets) + +# Backward pass and optimization +loss.backward() +optimizer.step() + +print(f'Loss: {loss.item()}') +``` + +## When to Use PyTorch +### Use PyTorch When: +1. **Research and Development**: PyTorch's dynamic computation graph makes it ideal for experimentation and prototyping. +2. **Computer Vision and NLP**: With extensive libraries like torchvision and torchtext, PyTorch is well-suited for these domains. +3. **Custom Operations**: If your work involves custom layers or operations, PyTorch provides the flexibility to implement and integrate them easily. +4. **Community and Ecosystem**: If you prefer a strong community support and extensive third-party resources, PyTorch is a good choice. + +### Consider Alternatives When: +1. **Production Deployment**: While PyTorch has made strides in deployment (e.g., TorchServe), TensorFlow's TensorFlow Serving is more mature for large-scale deployment. +2. **Static Graphs**: If your model architecture doesn't change frequently and you prefer static computation graphs, TensorFlow might be more suitable. +3. **Multi-Language Support**: If you need integration with languages other than Python (e.g., Java, JavaScript), TensorFlow offers better support. + +## Conclusion +PyTorch is a powerful and flexible deep learning framework that caters to both researchers and practitioners. Its ease of use, dynamic computation graph, and strong community support make it an excellent choice for many machine learning tasks. However, for certain production scenarios or specific requirements, alternatives like TensorFlow may be more appropriate. + +## Additional Resources +- [PyTorch Official Documentation](https://pytorch.org/docs/stable/index.html) +- [PyTorch Tutorials](https://pytorch.org/tutorials/) +- [PyTorch Forum](https://discuss.pytorch.org/) + +Feel free to explore and experiment with PyTorch to harness the full potential of this versatile framework! \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 45235e4..edb0860 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -7,3 +7,4 @@ - [Support Vector Machine Algorithm](support-vector-machine.md) - [Artificial Neural Network from the Ground Up](ArtificialNeuralNetwork.md) - [TensorFlow.md](tensorFlow.md) +- [PyTorch.md](PyTorch.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 163/405] 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 ce0fc1208d986f166487a35bfcbe8fcfd47c1f61 Mon Sep 17 00:00:00 2001 From: Ramya Korupolu <104009248+Ramya-korupolu@users.noreply.github.com> Date: Sat, 25 May 2024 12:34:32 +0530 Subject: [PATCH 164/405] Update sorting-algorithms.md --- contrib/ds-algorithms/sorting-algorithms.md | 159 ++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/contrib/ds-algorithms/sorting-algorithms.md b/contrib/ds-algorithms/sorting-algorithms.md index 6423b4b..25bee49 100644 --- a/contrib/ds-algorithms/sorting-algorithms.md +++ b/contrib/ds-algorithms/sorting-algorithms.md @@ -327,3 +327,162 @@ print("Sorted array:", arr) # Output: [3, 9, 10, 27, 38, 43, 82]


+ +# 5. Insertion Sort + +Insertion sort is a straightforward and efficient sorting algorithm for small datasets. It builds the final sorted array one element at a time. It is much like sorting playing cards in your hands: you take one card at a time and insert it into its correct position among the already sorted cards. + +**Algorithm Overview:** +- **Start from the Second Element:** Begin with the second element, assuming the first element is already sorted. +- **Compare with Sorted Subarray:** Take the current element and compare it with elements in the sorted subarray (the part of the array before the current element). +- **Insert in Correct Position:** Shift all elements in the sorted subarray that are greater than the current element to one position ahead. Insert the current element into its correct position. +- **Repeat Until End:** Repeat this process for all elements in the array. + +## Example with Visualization +Let's sort the list `[5, 3, 8, 1, 2]` using insertion sort. + +**Step-by-Step Visualization:** +**Initial List:** `[5, 3, 8, 1, 2]` + +1. **Pass 1:** + - Current element: 3 + - Compare 3 with 5, move 5 to the right: `[5, 5, 8, 1, 2]` + - Insert 3 in its correct position: `[3, 5, 8, 1, 2]` + +2. **Pass 2:** + - Current element: 8 + - 8 is already in the correct position: `[3, 5, 8, 1, 2]` + +3. **Pass 3:** + - Current element: 1 + - Compare 1 with 8, move 8 to the right: `[3, 5, 8, 8, 2]` + - Compare 1 with 5, move 5 to the right: `[3, 5, 5, 8, 2]` + - Compare 1 with 3, move 3 to the right: `[3, 3, 5, 8, 2]` + - Insert 1 in its correct position: `[1, 3, 5, 8, 2]` + +4. **Pass 4:** + - Current element: 2 + - Compare 2 with 8, move 8 to the right: `[1, 3, 5, 8, 8]` + - Compare 2 with 5, move 5 to the right: `[1, 3, 5, 5, 8]` + - Compare 2 with 3, move 3 to the right: `[1, 3, 3, 5, 8]` + - Insert 2 in its correct position: `[1, 2, 3, 5, 8]` + +## Insertion Sort Code in Python + + +```python + +def insertion_sort(arr): + # Traverse from 1 to len(arr) + for i in range(1, len(arr)): + key = arr[i] + # Move elements of arr[0..i-1], that are greater than key, + # to one position ahead of their current position + j = i - 1 + while j >= 0 and key < arr[j]: + arr[j + 1] = arr[j] + j -= 1 + arr[j + 1] = key + +# Example usage +arr = [5, 3, 8, 1, 2] +insertion_sort(arr) +print("Sorted array:", arr) # Output: [1, 2, 3, 5, 8] +``` +## Complexity Analysis + - **Worst Case:** `𝑂(𝑛^2)` comparisons and swaps. This occurs when the array is in reverse order. + - **Best Case:** `𝑂(𝑛)` comparisons and `𝑂(1)` swaps. This happens when the array is already sorted. + - **Average Case:** `𝑂(𝑛^2)` comparisons and swaps. This is the expected number of comparisons and swaps over all possible input sequences. + + +
+
+
+ +# 6. Heap Sort + +Heap Sort is an efficient comparison-based sorting algorithm that uses a binary heap data structure. It divides its input into a sorted and an unsorted region and iteratively shrinks the unsorted region by extracting the largest (or smallest) element and moving it to the sorted region. + +**Algorithm Overview:** +- **Build a Max Heap:** Convert the array into a max heap, a complete binary tree where the value of each node is greater than or equal to the values of its children. +- **Heapify:** Ensure that the subtree rooted at each node satisfies the max heap property. This process is called heapify. +- **Extract Maximum:** Swap the root (the maximum element) with the last element of the heap and reduce the heap size by one. Restore the max heap property by heapifying the root. +- **Repeat:** Continue extracting the maximum element and heapifying until the entire array is sorted. + +## Example with Visualization + +Let's sort the list `[5, 3, 8, 1, 2]` using heap sort. + +1. **Build Max Heap:** + - Initial array: `[5, 3, 8, 1, 2]` + - Start heapifying from the last non-leaf node. + - Heapify at index 1: `[5, 3, 8, 1, 2]` (no change, children are already less than the parent) + - Heapify at index 0: `[8, 3, 5, 1, 2]` (swap 5 and 8 to make 8 the root) + +2. **Heapify Process:** + - Heapify at index 0: `[8, 3, 5, 1, 2]` (no change needed, already a max heap) + +3. **Extract Maximum:** + - Swap root with the last element: `[2, 3, 5, 1, 8]` + - Heapify at index 0: `[5, 3, 2, 1, 8]` (swap 2 and 5) + +4. **Repeat Extraction:** + - Swap root with the second last element: `[1, 3, 2, 5, 8]` + - Heapify at index 0: `[3, 1, 2, 5, 8]` (swap 1 and 3) + - Swap root with the third last element: `[2, 1, 3, 5, 8]` + - Heapify at index 0: `[2, 1, 3, 5, 8]` (no change needed) + - Swap root with the fourth last element: `[1, 2, 3, 5, 8]` + +After all extractions, the array is sorted: `[1, 2, 3, 5, 8]`. + +## Heap Sort Code in Python + +```python +def heapify(arr, n, i): + largest = i # Initialize largest as root + left = 2 * i + 1 # left child index + right = 2 * i + 2 # right child index + + # See if left child of root exists and is greater than root + if left < n and arr[largest] < arr[left]: + largest = left + + # See if right child of root exists and is greater than root + if right < n and arr[largest] < arr[right]: + largest = right + + # Change root, if needed + if largest != i: + arr[i], arr[largest] = arr[largest], arr[i] # swap + + # Heapify the root. + heapify(arr, n, largest) + +def heap_sort(arr): + n = len(arr) + + # Build a maxheap. + for i in range(n // 2 - 1, -1, -1): + heapify(arr, n, i) + + # One by one extract elements + for i in range(n - 1, 0, -1): + arr[i], arr[0] = arr[0], arr[i] # swap + heapify(arr, i, 0) + +# Example usage +arr = [5, 3, 8, 1, 2] +heap_sort(arr) +print("Sorted array:", arr) # Output: [1, 2, 3, 5, 8] +``` + +## Complexity Analysis + - **Worst Case:** `𝑂(𝑛log𝑛)`. Building the heap takes `𝑂(𝑛)` time, and each of the 𝑛 element extractions takes `𝑂(log𝑛)` time. + - **Best Case:** `𝑂(𝑛log𝑛)`. Even if the array is already sorted, heap sort will still build the heap and perform the extractions. + - **Average Case:** `𝑂(𝑛log𝑛)`. Similar to the worst-case, the overall complexity remains `𝑂(𝑛log𝑛)` because each insertion and deletion in a heap takes `𝑂(log𝑛)` time, and these operations are performed 𝑛 times. + +
+
+
+ + From 7db982f3a3b94320c5638f7925cfa64054d1bd51 Mon Sep 17 00:00:00 2001 From: Labqari Date: Sat, 25 May 2024 12:50:18 +0530 Subject: [PATCH 165/405] Adding Flask --- contrib/web-scrapping/index.md | 1 + ...duction-to-flask-a-python-web-framework.md | 440 ++++++++++++++++++ 2 files changed, 441 insertions(+) create mode 100644 contrib/web-scrapping/introduction-to-flask-a-python-web-framework.md diff --git a/contrib/web-scrapping/index.md b/contrib/web-scrapping/index.md index 82596a2..a78be3d 100644 --- a/contrib/web-scrapping/index.md +++ b/contrib/web-scrapping/index.md @@ -1,3 +1,4 @@ # List of sections - [Section title](filename.md) +- [Introduction-to-flask-a-python-web-framework](introduction-to-flask-a-python-web-framework.md) diff --git a/contrib/web-scrapping/introduction-to-flask-a-python-web-framework.md b/contrib/web-scrapping/introduction-to-flask-a-python-web-framework.md new file mode 100644 index 0000000..957f39b --- /dev/null +++ b/contrib/web-scrapping/introduction-to-flask-a-python-web-framework.md @@ -0,0 +1,440 @@ +Sure, here's the guide without Markdown formatting: + +--- + +# Introduction to Flask: A Python Web Framework + +## Table of Contents +1. Introduction +2. Prerequisites +3. Setting Up Your Environment +4. Creating Your First Flask Application + - Project Structure + - Hello World Application +5. Routing +6. Templates and Static Files + - Jinja2 Templating Engine + - Serving Static Files +7. Working with Forms + - Handling Form Data +8. Database Integration + - Setting Up SQLAlchemy + - Performing CRUD Operations +9. Error Handling +10. Testing Your Application +11. Deploying Your Flask Application + - Using Gunicorn + - Deploying to Render +12. Conclusion +13. Further Reading and Resources + +--- + +## 1. Introduction +Flask is a lightweight WSGI web application framework in Python. It is designed with simplicity and flexibility in mind, allowing developers to create web applications with minimal setup. Flask was created by Armin Ronacher as part of the Pocoo project and has gained popularity for its ease of use and extensive documentation. + +## 2. Prerequisites +Before starting with Flask, ensure you have the following: +- Basic knowledge of Python. +- Understanding of web development concepts (HTML, CSS, JavaScript). +- Python installed on your machine (version 3.6 or higher). +- pip (Python package installer) installed. + +## 3. Setting Up Your Environment +1. **Install Python**: Download and install Python from python.org. +2. **Create a Virtual Environment**: + ``` + python -m venv venv + ``` +3. **Activate the Virtual Environment**: + - On Windows: + ``` + venv\Scripts\activate + ``` + - On macOS/Linux: + ``` + source venv/bin/activate + ``` +4. **Install Flask**: + ``` + pip install Flask + ``` + +## 4. Creating Your First Flask Application +### Project Structure +A typical Flask project structure might look like this: +``` +my_flask_app/ + app/ + __init__.py + routes.py + templates/ + static/ + venv/ + run.py +``` + +### Hello World Application +1. **Create a Directory for Your Project**: + ``` + mkdir my_flask_app + cd my_flask_app + ``` +2. **Initialize the Application**: + - Create `app/__init__.py`: + ```python + from flask import Flask + + def create_app(): + app = Flask(__name__) + + with app.app_context(): + from . import routes + return app + ``` + - Create `run.py`: + ```python + from app import create_app + + app = create_app() + + if __name__ == "__main__": + app.run(debug=True) + ``` + - Create `app/routes.py`: + ```python + from flask import current_app as app + + @app.route('/') + def hello_world(): + return 'Hello, World!' + ``` + +3. **Run the Application**: + ``` + python run.py + ``` + Navigate to `http://127.0.0.1:5000` in your browser to see "Hello, World!". + +## 5. Routing +In Flask, routes are defined using the `@app.route` decorator. Here's an example of different routes: + +```python +from flask import Flask + +app = Flask(__name__) + +@app.route('/') +def home(): + return 'Home Page' + +@app.route('/about') +def about(): + return 'About Page' + +@app.route('/user/') +def show_user_profile(username): + return f'User: {username}' +``` + +- **Explanation**: + - The `@app.route('/')` decorator binds the URL `'/'` to the `home` function, which returns 'Home Page'. + - The `@app.route('/about')` decorator binds the URL `/about` to the `about` function. + - The `@app.route('/user/')` decorator binds the URL `/user/` to the `show_user_profile` function, capturing the part of the URL as the `username` variable. + +## 6. Templates and Static Files +### Jinja2 Templating Engine +Jinja2 is Flask's templating engine. Templates are HTML files that can include dynamic content. + +- **Create a Template**: + - `app/templates/index.html`: + ```html + + + + {{ title }} + + +

{{ heading }}

+

{{ content }}

+ + + ``` + +- **Render the Template**: + ```python + from flask import Flask, render_template + + app = Flask(__name__) + + @app.route('/') + def home(): + return render_template('index.html', title='Home', heading='Welcome to Flask', content='This is a Flask application.') + ``` + +### Serving Static Files +Static files like CSS, JavaScript, and images are placed in the `static` directory. + +- **Create Static Files**: + - `app/static/style.css`: + ```css + body { + font-family: Arial, sans-serif; + } + ``` + +- **Include Static Files in Templates**: + ```html + + + + {{ title }} + + + +

{{ heading }}

+

{{ content }}

+ + + ``` + +## 7. Working with Forms +### Handling Form Data +Forms are used to collect user input. Flask provides utilities to handle form submissions. + +- **Create a Form**: + - `app/templates/form.html`: + ```html + + + + Form + + +
+ + + +
+ + + ``` + +- **Handle Form Submission**: + ```python + from flask import Flask, request, render_template + + app = Flask(__name__) + + @app.route('/form') + def form(): + return render_template('form.html') + + @app.route('/submit', methods=['POST']) + def submit(): + name = request.form['name'] + return f'Hello, {name}!' + ``` + +- **Explanation**: + - The `@app.route('/form')` route renders the form. + - The `@app.route('/submit', methods=['POST'])` route handles the form submission and displays the input name. + +## 8. Database Integration +### Setting Up SQLAlchemy +SQLAlchemy is an ORM that allows you to interact with databases using Python objects. + +- **Install SQLAlchemy**: + ``` + pip install flask_sqlalchemy + ``` + +- **Configure SQLAlchemy**: + - `app/__init__.py`: + ```python + from flask import Flask + from flask_sqlalchemy import SQLAlchemy + + db = SQLAlchemy() + + def create_app(): + app = Flask(__name__) + app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' + db.init_app(app) + return app + ``` + +### Performing CRUD Operations +Define models and perform CRUD operations. + +- **Define a Model**: + - `app/models.py`: + ```python + from app import db + + class User(db.Model): + id = db.Column(db.Integer, primary key=True) + username = db.Column(db.String(80), unique=True, nullable=False) + + def __repr__(self): + return f'' + ``` + +- **Create the Database**: + ```python + from app import create_app, db + from app.models import User + + app = create_app() + with app.app_context(): + db.create_all() + ``` + +- **Perform CRUD Operations**: + ```python + from app import db + from app.models import User + + # Create + new_user = User(username='new_user') + db.session.add(new_user) + db.session.commit() + + # Read + user = User.query.first() + + # Update + user.username = 'updated_user' + db.session.commit() + + # Delete + db.session.delete(user) + db.session.commit() + ``` + +## 9. Error Handling +Error handling in Flask can be managed by defining error handlers for different HTTP status codes. + +- **Define an Error Handler**: + ```python + from flask import Flask, render_template + + app = Flask(__name__) + + @app.errorhandler(404) + def page_not_found(e): + return render_template('404.html'), 404 + + @app.errorhandler(500) + def internal_server_error(e): + return render_template('500.html'), 500 + ``` + + - **Create Error Pages**: + `app/templates/404.html`: + + + + + Page Not Found + + +

404 - Page Not Found

+

The page you are looking for does not exist.

+ + + + + + - **app/templates/500.html:** + + + + + Internal Server Error + + +

500 - Internal Server Error

+

Something went wrong on our end. Please try again later.

+ + + + +## 10. Testing Your Application +Flask applications can be tested using Python's built-in `unittest` framework. + +- **Write a Test Case**: + - `tests/test_app.py`: + ```python + import unittest + from app import create_app + + class BasicTestCase(unittest.TestCase): + def setUp(self): + self.app = create_app() + self.app.config['TESTING'] = True + self.client = self.app.test_client() + + def test_home(self): + response = self.client.get('/') + self.assertEqual(response.status_code, 200) + self.assertIn(b'Hello, World!', response.data) + + if __name__ == '__main__': + unittest.main() + ``` + + - **Run the Tests**: + ``` + python -m unittest discover -s tests + ``` + +## 11. Deploying Your Flask Application +### Using Gunicorn +Gunicorn is a Python WSGI HTTP Server for UNIX. It’s a pre-fork worker model, meaning that it forks multiple worker processes to handle requests. + +- **Install Gunicorn**: + ``` + pip install gunicorn + ``` + +- **Run Your Application with Gunicorn**: + ``` + gunicorn -w 4 run:app + ``` + +### Deploying to Render +Render is a cloud platform for deploying web applications. + +- **Create a `requirements.txt` File**: + ``` + Flask + gunicorn + flask_sqlalchemy + ``` + +- **Create a `render.yaml` File**: + ```yaml + services: + - type: web + name: my-flask-app + env: python + plan: free + buildCommand: pip install -r requirements.txt + startCommand: gunicorn -w 4 run:app + ``` + +- **Deploy Your Application**: + 1. Push your code to a Git repository. + 2. Sign in to Render and create a new Web Service. + 3. Connect your repository and select the branch to deploy. + 4. Render will automatically use the `render.yaml` file to configure and deploy your application. + +## 12. Conclusion +Flask is a powerful and flexible framework for building web applications in Python. It offers simplicity and ease of use, making it a great choice for both beginners and experienced developers. This guide covered the basics of setting up a Flask application, routing, templating, working with forms, integrating databases, error handling, testing, and deployment. + +## 13. Further Reading and Resources +- Flask Documentation: https://flask.palletsprojects.com/en/latest/ +- Jinja2 Documentation: https://jinja.palletsprojects.com/en/latest/ +- SQLAlchemy Documentation: https://docs.sqlalchemy.org/en/latest/ +- Render Documentation: https://render.com/docs \ No newline at end of file From 365cc3a62f07d3b013529bca18590f0041524fee Mon Sep 17 00:00:00 2001 From: Labqari Date: Sat, 25 May 2024 13:04:32 +0530 Subject: [PATCH 166/405] flask commit --- contrib/advanced-python/index.md | 1 - ...duction-to-flask-a-python-web-framework.md | 440 ------------------ 2 files changed, 441 deletions(-) delete mode 100644 contrib/advanced-python/introduction-to-flask-a-python-web-framework.md diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 027f989..5ea5081 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,4 +1,3 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) -- [Decorators/\*args/**kwargs](introduction-to-flask-a-python-web-framework.md) diff --git a/contrib/advanced-python/introduction-to-flask-a-python-web-framework.md b/contrib/advanced-python/introduction-to-flask-a-python-web-framework.md deleted file mode 100644 index 957f39b..0000000 --- a/contrib/advanced-python/introduction-to-flask-a-python-web-framework.md +++ /dev/null @@ -1,440 +0,0 @@ -Sure, here's the guide without Markdown formatting: - ---- - -# Introduction to Flask: A Python Web Framework - -## Table of Contents -1. Introduction -2. Prerequisites -3. Setting Up Your Environment -4. Creating Your First Flask Application - - Project Structure - - Hello World Application -5. Routing -6. Templates and Static Files - - Jinja2 Templating Engine - - Serving Static Files -7. Working with Forms - - Handling Form Data -8. Database Integration - - Setting Up SQLAlchemy - - Performing CRUD Operations -9. Error Handling -10. Testing Your Application -11. Deploying Your Flask Application - - Using Gunicorn - - Deploying to Render -12. Conclusion -13. Further Reading and Resources - ---- - -## 1. Introduction -Flask is a lightweight WSGI web application framework in Python. It is designed with simplicity and flexibility in mind, allowing developers to create web applications with minimal setup. Flask was created by Armin Ronacher as part of the Pocoo project and has gained popularity for its ease of use and extensive documentation. - -## 2. Prerequisites -Before starting with Flask, ensure you have the following: -- Basic knowledge of Python. -- Understanding of web development concepts (HTML, CSS, JavaScript). -- Python installed on your machine (version 3.6 or higher). -- pip (Python package installer) installed. - -## 3. Setting Up Your Environment -1. **Install Python**: Download and install Python from python.org. -2. **Create a Virtual Environment**: - ``` - python -m venv venv - ``` -3. **Activate the Virtual Environment**: - - On Windows: - ``` - venv\Scripts\activate - ``` - - On macOS/Linux: - ``` - source venv/bin/activate - ``` -4. **Install Flask**: - ``` - pip install Flask - ``` - -## 4. Creating Your First Flask Application -### Project Structure -A typical Flask project structure might look like this: -``` -my_flask_app/ - app/ - __init__.py - routes.py - templates/ - static/ - venv/ - run.py -``` - -### Hello World Application -1. **Create a Directory for Your Project**: - ``` - mkdir my_flask_app - cd my_flask_app - ``` -2. **Initialize the Application**: - - Create `app/__init__.py`: - ```python - from flask import Flask - - def create_app(): - app = Flask(__name__) - - with app.app_context(): - from . import routes - return app - ``` - - Create `run.py`: - ```python - from app import create_app - - app = create_app() - - if __name__ == "__main__": - app.run(debug=True) - ``` - - Create `app/routes.py`: - ```python - from flask import current_app as app - - @app.route('/') - def hello_world(): - return 'Hello, World!' - ``` - -3. **Run the Application**: - ``` - python run.py - ``` - Navigate to `http://127.0.0.1:5000` in your browser to see "Hello, World!". - -## 5. Routing -In Flask, routes are defined using the `@app.route` decorator. Here's an example of different routes: - -```python -from flask import Flask - -app = Flask(__name__) - -@app.route('/') -def home(): - return 'Home Page' - -@app.route('/about') -def about(): - return 'About Page' - -@app.route('/user/') -def show_user_profile(username): - return f'User: {username}' -``` - -- **Explanation**: - - The `@app.route('/')` decorator binds the URL `'/'` to the `home` function, which returns 'Home Page'. - - The `@app.route('/about')` decorator binds the URL `/about` to the `about` function. - - The `@app.route('/user/')` decorator binds the URL `/user/` to the `show_user_profile` function, capturing the part of the URL as the `username` variable. - -## 6. Templates and Static Files -### Jinja2 Templating Engine -Jinja2 is Flask's templating engine. Templates are HTML files that can include dynamic content. - -- **Create a Template**: - - `app/templates/index.html`: - ```html - - - - {{ title }} - - -

{{ heading }}

-

{{ content }}

- - - ``` - -- **Render the Template**: - ```python - from flask import Flask, render_template - - app = Flask(__name__) - - @app.route('/') - def home(): - return render_template('index.html', title='Home', heading='Welcome to Flask', content='This is a Flask application.') - ``` - -### Serving Static Files -Static files like CSS, JavaScript, and images are placed in the `static` directory. - -- **Create Static Files**: - - `app/static/style.css`: - ```css - body { - font-family: Arial, sans-serif; - } - ``` - -- **Include Static Files in Templates**: - ```html - - - - {{ title }} - - - -

{{ heading }}

-

{{ content }}

- - - ``` - -## 7. Working with Forms -### Handling Form Data -Forms are used to collect user input. Flask provides utilities to handle form submissions. - -- **Create a Form**: - - `app/templates/form.html`: - ```html - - - - Form - - -
- - - -
- - - ``` - -- **Handle Form Submission**: - ```python - from flask import Flask, request, render_template - - app = Flask(__name__) - - @app.route('/form') - def form(): - return render_template('form.html') - - @app.route('/submit', methods=['POST']) - def submit(): - name = request.form['name'] - return f'Hello, {name}!' - ``` - -- **Explanation**: - - The `@app.route('/form')` route renders the form. - - The `@app.route('/submit', methods=['POST'])` route handles the form submission and displays the input name. - -## 8. Database Integration -### Setting Up SQLAlchemy -SQLAlchemy is an ORM that allows you to interact with databases using Python objects. - -- **Install SQLAlchemy**: - ``` - pip install flask_sqlalchemy - ``` - -- **Configure SQLAlchemy**: - - `app/__init__.py`: - ```python - from flask import Flask - from flask_sqlalchemy import SQLAlchemy - - db = SQLAlchemy() - - def create_app(): - app = Flask(__name__) - app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' - db.init_app(app) - return app - ``` - -### Performing CRUD Operations -Define models and perform CRUD operations. - -- **Define a Model**: - - `app/models.py`: - ```python - from app import db - - class User(db.Model): - id = db.Column(db.Integer, primary key=True) - username = db.Column(db.String(80), unique=True, nullable=False) - - def __repr__(self): - return f'' - ``` - -- **Create the Database**: - ```python - from app import create_app, db - from app.models import User - - app = create_app() - with app.app_context(): - db.create_all() - ``` - -- **Perform CRUD Operations**: - ```python - from app import db - from app.models import User - - # Create - new_user = User(username='new_user') - db.session.add(new_user) - db.session.commit() - - # Read - user = User.query.first() - - # Update - user.username = 'updated_user' - db.session.commit() - - # Delete - db.session.delete(user) - db.session.commit() - ``` - -## 9. Error Handling -Error handling in Flask can be managed by defining error handlers for different HTTP status codes. - -- **Define an Error Handler**: - ```python - from flask import Flask, render_template - - app = Flask(__name__) - - @app.errorhandler(404) - def page_not_found(e): - return render_template('404.html'), 404 - - @app.errorhandler(500) - def internal_server_error(e): - return render_template('500.html'), 500 - ``` - - - **Create Error Pages**: - `app/templates/404.html`: - - - - - Page Not Found - - -

404 - Page Not Found

-

The page you are looking for does not exist.

- - - - - - - **app/templates/500.html:** - - - - - Internal Server Error - - -

500 - Internal Server Error

-

Something went wrong on our end. Please try again later.

- - - - -## 10. Testing Your Application -Flask applications can be tested using Python's built-in `unittest` framework. - -- **Write a Test Case**: - - `tests/test_app.py`: - ```python - import unittest - from app import create_app - - class BasicTestCase(unittest.TestCase): - def setUp(self): - self.app = create_app() - self.app.config['TESTING'] = True - self.client = self.app.test_client() - - def test_home(self): - response = self.client.get('/') - self.assertEqual(response.status_code, 200) - self.assertIn(b'Hello, World!', response.data) - - if __name__ == '__main__': - unittest.main() - ``` - - - **Run the Tests**: - ``` - python -m unittest discover -s tests - ``` - -## 11. Deploying Your Flask Application -### Using Gunicorn -Gunicorn is a Python WSGI HTTP Server for UNIX. It’s a pre-fork worker model, meaning that it forks multiple worker processes to handle requests. - -- **Install Gunicorn**: - ``` - pip install gunicorn - ``` - -- **Run Your Application with Gunicorn**: - ``` - gunicorn -w 4 run:app - ``` - -### Deploying to Render -Render is a cloud platform for deploying web applications. - -- **Create a `requirements.txt` File**: - ``` - Flask - gunicorn - flask_sqlalchemy - ``` - -- **Create a `render.yaml` File**: - ```yaml - services: - - type: web - name: my-flask-app - env: python - plan: free - buildCommand: pip install -r requirements.txt - startCommand: gunicorn -w 4 run:app - ``` - -- **Deploy Your Application**: - 1. Push your code to a Git repository. - 2. Sign in to Render and create a new Web Service. - 3. Connect your repository and select the branch to deploy. - 4. Render will automatically use the `render.yaml` file to configure and deploy your application. - -## 12. Conclusion -Flask is a powerful and flexible framework for building web applications in Python. It offers simplicity and ease of use, making it a great choice for both beginners and experienced developers. This guide covered the basics of setting up a Flask application, routing, templating, working with forms, integrating databases, error handling, testing, and deployment. - -## 13. Further Reading and Resources -- Flask Documentation: https://flask.palletsprojects.com/en/latest/ -- Jinja2 Documentation: https://jinja.palletsprojects.com/en/latest/ -- SQLAlchemy Documentation: https://docs.sqlalchemy.org/en/latest/ -- Render Documentation: https://render.com/docs \ No newline at end of file From 1496dac821b26a46cd5bd2432af95b052cc43494 Mon Sep 17 00:00:00 2001 From: Manish kumar gupta <97523900+manishh12@users.noreply.github.com> Date: Sat, 25 May 2024 16:10:18 +0530 Subject: [PATCH 167/405] Updated maths formulas --- .../machine-learning/Types_of_optimizers.md | 74 ++++++++++--------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/contrib/machine-learning/Types_of_optimizers.md b/contrib/machine-learning/Types_of_optimizers.md index e941597..ae2759d 100644 --- a/contrib/machine-learning/Types_of_optimizers.md +++ b/contrib/machine-learning/Types_of_optimizers.md @@ -6,6 +6,8 @@ Optimizers are algorithms or methods used to change the attributes of your neura ## Types of Optimizers + + ### 1. Gradient Descent **Explanation:** @@ -15,19 +17,20 @@ Gradient Descent is the simplest and most commonly used optimization algorithm. The update rule for the parameter vector θ in gradient descent is represented by the equation: -- \(theta_new = theta_old - alpha * gradient/) +- $$\theta_{\text{new}} = \theta_{\text{old}} - \alpha \cdot \nabla J(\theta)$$ Where: -- theta_old is the old parameter vector. -- theta_new is the updated parameter vector. -- alpha is the learning rate. -- gradient is the gradient of the objective function with respect to the parameters. +- θold is the old parameter vector. +- θnew is the updated parameter vector. +- alpha(α) is the learning rate. +- ∇J(θ) is the gradient of the objective function with respect to the parameters. + **Intuition:** - At each iteration, we calculate the gradient of the cost function. - The parameters are updated in the opposite direction of the gradient. -- The size of the step is controlled by the learning rate \( \alpha \). +- The size of the step is controlled by the learning rate α. **Advantages:** - Simple to implement. @@ -58,9 +61,10 @@ SGD is a variation of gradient descent where we use only one training example to **Mathematical Formulation:** -- \(theta = theta - alpha * dJ(theta; x_i, y_i) / d(theta)/) +- $$θ = θ - α \cdot \frac{∂J (θ; xᵢ, yᵢ)}{∂θ}$$ -\( x_i, y_i \) are a single training example and its target. + +- xᵢ, yᵢ are a single training example and its target. **Intuition:** - At each iteration, a random training example is selected. @@ -98,7 +102,8 @@ Mini-Batch Gradient Descent is a variation where instead of a single training ex **Mathematical Formulation:** -- theta = theta - alpha * (1/k) * sum(dJ(theta; x_i, y_i) / d(theta)) +- $$θ = θ - α \cdot \frac{1}{k} \sum_{i=1}^{k} \frac{∂J (θ; xᵢ, yᵢ)}{∂θ}$$ + Where: - \( k \) is the batch size. @@ -141,14 +146,13 @@ Momentum helps accelerate gradient vectors in the right directions, thus leading **Mathematical Formulation:** -- v_t = gamma * v_{t-1} + alpha * dJ(theta) / d(theta) - -- theta = theta - v_t +- $$v_t = γ \cdot v_{t-1} + α \cdot ∇J(θ)$$ +- $$θ = θ - v_t$$ where: - \( v_t \) is the velocity. -- \( \gamma \) is the momentum term, typically set between 0.9 and 0.99. +- γ is the momentum term, typically set between 0.9 and 0.99. **Intuition:** - At each iteration, the gradient is calculated. @@ -182,9 +186,11 @@ NAG is a variant of the gradient descent with momentum. It looks ahead by a step **Mathematical Formulation:** -- v_t = gamma * v_{t-1} + alpha * dJ(theta - gamma * v_{t-1}) / d(theta) +- $$v_t = γv_{t-1} + α \cdot ∇J(θ - γ \cdot v_{t-1})$$ + +- $$θ = θ - v_t$$ + -- theta = theta - v_t **Intuition:** @@ -220,13 +226,13 @@ AdaGrad adapts the learning rate to the parameters, performing larger updates fo **Mathematical Formulation:** -- G_t = G_{t-1} + (dJ(theta) / d(theta)) ⊙ (dJ(theta) / d(theta)) +- $$G_t = G_{t-1} + (∂J(θ)/∂θ)^2$$ -- theta = theta - (alpha / sqrt(G_t + epsilon)) * (dJ(theta) / d(theta)) +- $$θ = θ - \frac{α}{\sqrt{G_t + ε}} \cdot ∇J(θ)$$ Where: -- \( G_t \) is the sum of squares of the gradients up to time step \( t \). -- \( \epsilon \) is a small constant to avoid division by zero. +- \(G_t\) is the sum of squares of the gradients up to time step \( t \). +- ε is a small constant to avoid division by zero. **Intuition:** - Accumulates the sum of the squares of the gradients for each parameter. @@ -263,13 +269,13 @@ RMSprop modifies AdaGrad to perform well in non-convex settings by using a movin **Mathematical Formulation:** -E[g^2]_t = beta * E[g^2]_{t-1} + (1 - beta) * (dJ(theta) / d(theta)) ⊙ (dJ(theta) / d(theta)) +- E[g²]ₜ = βE[g²]ₜ₋₁ + (1 - β)(∂J(θ) / ∂θ)² -theta = theta - (alpha / sqrt(E[g^2]_t + epsilon)) * (dJ(theta) / d(theta)) +- $$θ = θ - \frac{α}{\sqrt{E[g^2]_t + ε}} \cdot ∇J(θ)$$ Where: -- \( E[g^2]_t \) is the exponentially decaying average of past squared gradients. -- \( \beta \) is the decay rate. +- \( E[g^2]_t \) is the exponentially decaying average of past squared gradients. +- β is the decay rate. **Intuition:** - Keeps a running average of the squared gradients. @@ -304,20 +310,16 @@ Adam (Adaptive Moment Estimation) combines the advantages of both RMSprop and Ad **Mathematical Formulation:** -- m_t = beta1 * m_{t-1} + (1 - beta1) * (dJ(theta) / d(theta)) - -- v_t = beta2 * v_{t-1} + (1 - beta2) * ((dJ(theta) / d(theta))^2) - -- hat_m_t = m_t / (1 - beta1^t) - -- hat_v_t = v_t / (1 - beta2^t) - -- theta = theta - (alpha * hat_m_t) / (sqrt(hat_v_t) + epsilon) +- $$m_t = β_1m_{t-1} + (1 - β_1)(∂J(θ)/∂θ)$$ +- $$v_t = β_2v_{t-1} + (1 - β_2)(∂J(θ)/∂θ)^2$$ +- $$\hat{m}_t = \frac{m_t}{1 - β_1^t}$$ +- $$\hat{v}_t = \frac{v_t}{1 - β_2^t}$$ +- $$θ = θ - \frac{α\hat{m}_t}{\sqrt{\hat{v}_t} + ε}$$ Where: -- \( m_t \) is the first moment (mean) of the gradient. -- \( v_t \) is the second moment (uncentered variance) of the gradient. -- \( \beta_1, \beta_2 \) are the decay rates for the moment estimates. +- \( mt \) is the first moment (mean) of the gradient. +- \( vt \) is the second moment (uncentered variance) of the gradient. +- β_1.β_2 are the decay rates for the moment estimates. **Intuition:** - Keeps track of both the mean and the variance of the gradients. @@ -352,4 +354,4 @@ def adam(X, y, lr=0.01, epochs=1000, beta1=0.9, beta2=0.999, epsilon=1e-8): These implementations are basic examples of how these optimizers can be implemented in Python using NumPy. In practice, libraries like TensorFlow and PyTorch provide highly optimized and more sophisticated implementations of these and other optimization algorithms. ---- \ No newline at end of file +--- From 534eaca30dce735f3be6034aea0b2e9376f2643e Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 25 May 2024 19:39:50 +0530 Subject: [PATCH 168/405] Add files via upload --- contrib/pandas/Datasets/car-sales.csv | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 contrib/pandas/Datasets/car-sales.csv diff --git a/contrib/pandas/Datasets/car-sales.csv b/contrib/pandas/Datasets/car-sales.csv new file mode 100644 index 0000000..63a63bf --- /dev/null +++ b/contrib/pandas/Datasets/car-sales.csv @@ -0,0 +1,11 @@ +Make,Colour,Odometer (KM),Doors,Price +Toyota,White,150043,4,"$4,000.00" +Honda,Red,87899,4,"$5,000.00" +Toyota,Blue,32549,3,"$7,000.00" +BMW,Black,11179,5,"$22,000.00" +Nissan,White,213095,4,"$3,500.00" +Toyota,Green,99213,4,"$4,500.00" +Honda,Blue,45698,4,"$7,500.00" +Honda,Blue,54738,4,"$7,000.00" +Toyota,White,60000,4,"$6,250.00" +Nissan,White,31600,4,"$9,700.00" \ No newline at end of file From 5fd2169b54ec03e88b3d4d645cef209c8feab85e Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 25 May 2024 19:40:22 +0530 Subject: [PATCH 169/405] Delete contrib/pandas/Datasets/Titanic.csv --- contrib/pandas/Datasets/Titanic.csv | 1310 --------------------------- 1 file changed, 1310 deletions(-) delete mode 100644 contrib/pandas/Datasets/Titanic.csv diff --git a/contrib/pandas/Datasets/Titanic.csv b/contrib/pandas/Datasets/Titanic.csv deleted file mode 100644 index f8d49dc..0000000 --- a/contrib/pandas/Datasets/Titanic.csv +++ /dev/null @@ -1,1310 +0,0 @@ -"pclass","survived","name","sex","age","sibsp","parch","ticket","fare","cabin","embarked","boat","body","home.dest" -1,1,"Allen, Miss. Elisabeth Walton","female",29,0,0,"24160",211.3375,"B5","S","2",,"St Louis, MO" -1,1,"Allison, Master. Hudson Trevor","male",0.92,1,2,"113781",151.5500,"C22 C26","S","11",,"Montreal, PQ / Chesterville, ON" -1,0,"Allison, Miss. Helen Loraine","female",2,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" -1,0,"Allison, Mr. Hudson Joshua Creighton","male",30,1,2,"113781",151.5500,"C22 C26","S",,"135","Montreal, PQ / Chesterville, ON" -1,0,"Allison, Mrs. Hudson J C (Bessie Waldo Daniels)","female",25,1,2,"113781",151.5500,"C22 C26","S",,,"Montreal, PQ / Chesterville, ON" -1,1,"Anderson, Mr. Harry","male",48,0,0,"19952",26.5500,"E12","S","3",,"New York, NY" -1,1,"Andrews, Miss. Kornelia Theodosia","female",63,1,0,"13502",77.9583,"D7","S","10",,"Hudson, NY" -1,0,"Andrews, Mr. Thomas Jr","male",39,0,0,"112050",0.0000,"A36","S",,,"Belfast, NI" -1,1,"Appleton, Mrs. Edward Dale (Charlotte Lamson)","female",53,2,0,"11769",51.4792,"C101","S","D",,"Bayside, Queens, NY" -1,0,"Artagaveytia, Mr. Ramon","male",71,0,0,"PC 17609",49.5042,,"C",,"22","Montevideo, Uruguay" -1,0,"Astor, Col. John Jacob","male",47,1,0,"PC 17757",227.5250,"C62 C64","C",,"124","New York, NY" -1,1,"Astor, Mrs. John Jacob (Madeleine Talmadge Force)","female",18,1,0,"PC 17757",227.5250,"C62 C64","C","4",,"New York, NY" -1,1,"Aubart, Mme. Leontine Pauline","female",24,0,0,"PC 17477",69.3000,"B35","C","9",,"Paris, France" -1,1,"Barber, Miss. Ellen ""Nellie""","female",26,0,0,"19877",78.8500,,"S","6",, -1,1,"Barkworth, Mr. Algernon Henry Wilson","male",80,0,0,"27042",30.0000,"A23","S","B",,"Hessle, Yorks" -1,0,"Baumann, Mr. John D","male",,0,0,"PC 17318",25.9250,,"S",,,"New York, NY" -1,0,"Baxter, Mr. Quigg Edmond","male",24,0,1,"PC 17558",247.5208,"B58 B60","C",,,"Montreal, PQ" -1,1,"Baxter, Mrs. James (Helene DeLaudeniere Chaput)","female",50,0,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" -1,1,"Bazzani, Miss. Albina","female",32,0,0,"11813",76.2917,"D15","C","8",, -1,0,"Beattie, Mr. Thomson","male",36,0,0,"13050",75.2417,"C6","C","A",,"Winnipeg, MN" -1,1,"Beckwith, Mr. Richard Leonard","male",37,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" -1,1,"Beckwith, Mrs. Richard Leonard (Sallie Monypeny)","female",47,1,1,"11751",52.5542,"D35","S","5",,"New York, NY" -1,1,"Behr, Mr. Karl Howell","male",26,0,0,"111369",30.0000,"C148","C","5",,"New York, NY" -1,1,"Bidois, Miss. Rosalie","female",42,0,0,"PC 17757",227.5250,,"C","4",, -1,1,"Bird, Miss. Ellen","female",29,0,0,"PC 17483",221.7792,"C97","S","8",, -1,0,"Birnbaum, Mr. Jakob","male",25,0,0,"13905",26.0000,,"C",,"148","San Francisco, CA" -1,1,"Bishop, Mr. Dickinson H","male",25,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" -1,1,"Bishop, Mrs. Dickinson H (Helen Walton)","female",19,1,0,"11967",91.0792,"B49","C","7",,"Dowagiac, MI" -1,1,"Bissette, Miss. Amelia","female",35,0,0,"PC 17760",135.6333,"C99","S","8",, -1,1,"Bjornstrom-Steffansson, Mr. Mauritz Hakan","male",28,0,0,"110564",26.5500,"C52","S","D",,"Stockholm, Sweden / Washington, DC" -1,0,"Blackwell, Mr. Stephen Weart","male",45,0,0,"113784",35.5000,"T","S",,,"Trenton, NJ" -1,1,"Blank, Mr. Henry","male",40,0,0,"112277",31.0000,"A31","C","7",,"Glen Ridge, NJ" -1,1,"Bonnell, Miss. Caroline","female",30,0,0,"36928",164.8667,"C7","S","8",,"Youngstown, OH" -1,1,"Bonnell, Miss. Elizabeth","female",58,0,0,"113783",26.5500,"C103","S","8",,"Birkdale, England Cleveland, Ohio" -1,0,"Borebank, Mr. John James","male",42,0,0,"110489",26.5500,"D22","S",,,"London / Winnipeg, MB" -1,1,"Bowen, Miss. Grace Scott","female",45,0,0,"PC 17608",262.3750,,"C","4",,"Cooperstown, NY" -1,1,"Bowerman, Miss. Elsie Edith","female",22,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" -1,1,"Bradley, Mr. George (""George Arthur Brayton"")","male",,0,0,"111427",26.5500,,"S","9",,"Los Angeles, CA" -1,0,"Brady, Mr. John Bertram","male",41,0,0,"113054",30.5000,"A21","S",,,"Pomeroy, WA" -1,0,"Brandeis, Mr. Emil","male",48,0,0,"PC 17591",50.4958,"B10","C",,"208","Omaha, NE" -1,0,"Brewe, Dr. Arthur Jackson","male",,0,0,"112379",39.6000,,"C",,,"Philadelphia, PA" -1,1,"Brown, Mrs. James Joseph (Margaret Tobin)","female",44,0,0,"PC 17610",27.7208,"B4","C","6",,"Denver, CO" -1,1,"Brown, Mrs. John Murray (Caroline Lane Lamson)","female",59,2,0,"11769",51.4792,"C101","S","D",,"Belmont, MA" -1,1,"Bucknell, Mrs. William Robert (Emma Eliza Ward)","female",60,0,0,"11813",76.2917,"D15","C","8",,"Philadelphia, PA" -1,1,"Burns, Miss. Elizabeth Margaret","female",41,0,0,"16966",134.5000,"E40","C","3",, -1,0,"Butt, Major. Archibald Willingham","male",45,0,0,"113050",26.5500,"B38","S",,,"Washington, DC" -1,0,"Cairns, Mr. Alexander","male",,0,0,"113798",31.0000,,"S",,, -1,1,"Calderhead, Mr. Edward Pennington","male",42,0,0,"PC 17476",26.2875,"E24","S","5",,"New York, NY" -1,1,"Candee, Mrs. Edward (Helen Churchill Hungerford)","female",53,0,0,"PC 17606",27.4458,,"C","6",,"Washington, DC" -1,1,"Cardeza, Mr. Thomas Drake Martinez","male",36,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Austria-Hungary / Germantown, Philadelphia, PA" -1,1,"Cardeza, Mrs. James Warburton Martinez (Charlotte Wardle Drake)","female",58,0,1,"PC 17755",512.3292,"B51 B53 B55","C","3",,"Germantown, Philadelphia, PA" -1,0,"Carlsson, Mr. Frans Olof","male",33,0,0,"695",5.0000,"B51 B53 B55","S",,,"New York, NY" -1,0,"Carrau, Mr. Francisco M","male",28,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" -1,0,"Carrau, Mr. Jose Pedro","male",17,0,0,"113059",47.1000,,"S",,,"Montevideo, Uruguay" -1,1,"Carter, Master. William Thornton II","male",11,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" -1,1,"Carter, Miss. Lucile Polk","female",14,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" -1,1,"Carter, Mr. William Ernest","male",36,1,2,"113760",120.0000,"B96 B98","S","C",,"Bryn Mawr, PA" -1,1,"Carter, Mrs. William Ernest (Lucile Polk)","female",36,1,2,"113760",120.0000,"B96 B98","S","4",,"Bryn Mawr, PA" -1,0,"Case, Mr. Howard Brown","male",49,0,0,"19924",26.0000,,"S",,,"Ascot, Berkshire / Rochester, NY" -1,1,"Cassebeer, Mrs. Henry Arthur Jr (Eleanor Genevieve Fosdick)","female",,0,0,"17770",27.7208,,"C","5",,"New York, NY" -1,0,"Cavendish, Mr. Tyrell William","male",36,1,0,"19877",78.8500,"C46","S",,"172","Little Onn Hall, Staffs" -1,1,"Cavendish, Mrs. Tyrell William (Julia Florence Siegel)","female",76,1,0,"19877",78.8500,"C46","S","6",,"Little Onn Hall, Staffs" -1,0,"Chaffee, Mr. Herbert Fuller","male",46,1,0,"W.E.P. 5734",61.1750,"E31","S",,,"Amenia, ND" -1,1,"Chaffee, Mrs. Herbert Fuller (Carrie Constance Toogood)","female",47,1,0,"W.E.P. 5734",61.1750,"E31","S","4",,"Amenia, ND" -1,1,"Chambers, Mr. Norman Campbell","male",27,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" -1,1,"Chambers, Mrs. Norman Campbell (Bertha Griggs)","female",33,1,0,"113806",53.1000,"E8","S","5",,"New York, NY / Ithaca, NY" -1,1,"Chaudanson, Miss. Victorine","female",36,0,0,"PC 17608",262.3750,"B61","C","4",, -1,1,"Cherry, Miss. Gladys","female",30,0,0,"110152",86.5000,"B77","S","8",,"London, England" -1,1,"Chevre, Mr. Paul Romaine","male",45,0,0,"PC 17594",29.7000,"A9","C","7",,"Paris, France" -1,1,"Chibnall, Mrs. (Edith Martha Bowerman)","female",,0,1,"113505",55.0000,"E33","S","6",,"St Leonards-on-Sea, England Ohio" -1,0,"Chisholm, Mr. Roderick Robert Crispin","male",,0,0,"112051",0.0000,,"S",,,"Liverpool, England / Belfast" -1,0,"Clark, Mr. Walter Miller","male",27,1,0,"13508",136.7792,"C89","C",,,"Los Angeles, CA" -1,1,"Clark, Mrs. Walter Miller (Virginia McDowell)","female",26,1,0,"13508",136.7792,"C89","C","4",,"Los Angeles, CA" -1,1,"Cleaver, Miss. Alice","female",22,0,0,"113781",151.5500,,"S","11",, -1,0,"Clifford, Mr. George Quincy","male",,0,0,"110465",52.0000,"A14","S",,,"Stoughton, MA" -1,0,"Colley, Mr. Edward Pomeroy","male",47,0,0,"5727",25.5875,"E58","S",,,"Victoria, BC" -1,1,"Compton, Miss. Sara Rebecca","female",39,1,1,"PC 17756",83.1583,"E49","C","14",,"Lakewood, NJ" -1,0,"Compton, Mr. Alexander Taylor Jr","male",37,1,1,"PC 17756",83.1583,"E52","C",,,"Lakewood, NJ" -1,1,"Compton, Mrs. Alexander Taylor (Mary Eliza Ingersoll)","female",64,0,2,"PC 17756",83.1583,"E45","C","14",,"Lakewood, NJ" -1,1,"Cornell, Mrs. Robert Clifford (Malvina Helen Lamson)","female",55,2,0,"11770",25.7000,"C101","S","2",,"New York, NY" -1,0,"Crafton, Mr. John Bertram","male",,0,0,"113791",26.5500,,"S",,,"Roachdale, IN" -1,0,"Crosby, Capt. Edward Gifford","male",70,1,1,"WE/P 5735",71.0000,"B22","S",,"269","Milwaukee, WI" -1,1,"Crosby, Miss. Harriet R","female",36,0,2,"WE/P 5735",71.0000,"B22","S","7",,"Milwaukee, WI" -1,1,"Crosby, Mrs. Edward Gifford (Catherine Elizabeth Halstead)","female",64,1,1,"112901",26.5500,"B26","S","7",,"Milwaukee, WI" -1,0,"Cumings, Mr. John Bradley","male",39,1,0,"PC 17599",71.2833,"C85","C",,,"New York, NY" -1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)","female",38,1,0,"PC 17599",71.2833,"C85","C","4",,"New York, NY" -1,1,"Daly, Mr. Peter Denis ","male",51,0,0,"113055",26.5500,"E17","S","5 9",,"Lima, Peru" -1,1,"Daniel, Mr. Robert Williams","male",27,0,0,"113804",30.5000,,"S","3",,"Philadelphia, PA" -1,1,"Daniels, Miss. Sarah","female",33,0,0,"113781",151.5500,,"S","8",, -1,0,"Davidson, Mr. Thornton","male",31,1,0,"F.C. 12750",52.0000,"B71","S",,,"Montreal, PQ" -1,1,"Davidson, Mrs. Thornton (Orian Hays)","female",27,1,2,"F.C. 12750",52.0000,"B71","S","3",,"Montreal, PQ" -1,1,"Dick, Mr. Albert Adrian","male",31,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" -1,1,"Dick, Mrs. Albert Adrian (Vera Gillespie)","female",17,1,0,"17474",57.0000,"B20","S","3",,"Calgary, AB" -1,1,"Dodge, Dr. Washington","male",53,1,1,"33638",81.8583,"A34","S","13",,"San Francisco, CA" -1,1,"Dodge, Master. Washington","male",4,0,2,"33638",81.8583,"A34","S","5",,"San Francisco, CA" -1,1,"Dodge, Mrs. Washington (Ruth Vidaver)","female",54,1,1,"33638",81.8583,"A34","S","5",,"San Francisco, CA" -1,0,"Douglas, Mr. Walter Donald","male",50,1,0,"PC 17761",106.4250,"C86","C",,"62","Deephaven, MN / Cedar Rapids, IA" -1,1,"Douglas, Mrs. Frederick Charles (Mary Helene Baxter)","female",27,1,1,"PC 17558",247.5208,"B58 B60","C","6",,"Montreal, PQ" -1,1,"Douglas, Mrs. Walter Donald (Mahala Dutton)","female",48,1,0,"PC 17761",106.4250,"C86","C","2",,"Deephaven, MN / Cedar Rapids, IA" -1,1,"Duff Gordon, Lady. (Lucille Christiana Sutherland) (""Mrs Morgan"")","female",48,1,0,"11755",39.6000,"A16","C","1",,"London / Paris" -1,1,"Duff Gordon, Sir. Cosmo Edmund (""Mr Morgan"")","male",49,1,0,"PC 17485",56.9292,"A20","C","1",,"London / Paris" -1,0,"Dulles, Mr. William Crothers","male",39,0,0,"PC 17580",29.7000,"A18","C",,"133","Philadelphia, PA" -1,1,"Earnshaw, Mrs. Boulton (Olive Potter)","female",23,0,1,"11767",83.1583,"C54","C","7",,"Mt Airy, Philadelphia, PA" -1,1,"Endres, Miss. Caroline Louise","female",38,0,0,"PC 17757",227.5250,"C45","C","4",,"New York, NY" -1,1,"Eustis, Miss. Elizabeth Mussey","female",54,1,0,"36947",78.2667,"D20","C","4",,"Brookline, MA" -1,0,"Evans, Miss. Edith Corse","female",36,0,0,"PC 17531",31.6792,"A29","C",,,"New York, NY" -1,0,"Farthing, Mr. John","male",,0,0,"PC 17483",221.7792,"C95","S",,, -1,1,"Flegenheim, Mrs. Alfred (Antoinette)","female",,0,0,"PC 17598",31.6833,,"S","7",,"New York, NY" -1,1,"Fleming, Miss. Margaret","female",,0,0,"17421",110.8833,,"C","4",, -1,1,"Flynn, Mr. John Irwin (""Irving"")","male",36,0,0,"PC 17474",26.3875,"E25","S","5",,"Brooklyn, NY" -1,0,"Foreman, Mr. Benjamin Laventall","male",30,0,0,"113051",27.7500,"C111","C",,,"New York, NY" -1,1,"Fortune, Miss. Alice Elizabeth","female",24,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,1,"Fortune, Miss. Ethel Flora","female",28,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,1,"Fortune, Miss. Mabel Helen","female",23,3,2,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,0,"Fortune, Mr. Charles Alexander","male",19,3,2,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" -1,0,"Fortune, Mr. Mark","male",64,1,4,"19950",263.0000,"C23 C25 C27","S",,,"Winnipeg, MB" -1,1,"Fortune, Mrs. Mark (Mary McDougald)","female",60,1,4,"19950",263.0000,"C23 C25 C27","S","10",,"Winnipeg, MB" -1,1,"Francatelli, Miss. Laura Mabel","female",30,0,0,"PC 17485",56.9292,"E36","C","1",, -1,0,"Franklin, Mr. Thomas Parham","male",,0,0,"113778",26.5500,"D34","S",,,"Westcliff-on-Sea, Essex" -1,1,"Frauenthal, Dr. Henry William","male",50,2,0,"PC 17611",133.6500,,"S","5",,"New York, NY" -1,1,"Frauenthal, Mr. Isaac Gerald","male",43,1,0,"17765",27.7208,"D40","C","5",,"New York, NY" -1,1,"Frauenthal, Mrs. Henry William (Clara Heinsheimer)","female",,1,0,"PC 17611",133.6500,,"S","5",,"New York, NY" -1,1,"Frolicher, Miss. Hedwig Margaritha","female",22,0,2,"13568",49.5000,"B39","C","5",,"Zurich, Switzerland" -1,1,"Frolicher-Stehli, Mr. Maxmillian","male",60,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" -1,1,"Frolicher-Stehli, Mrs. Maxmillian (Margaretha Emerentia Stehli)","female",48,1,1,"13567",79.2000,"B41","C","5",,"Zurich, Switzerland" -1,0,"Fry, Mr. Richard","male",,0,0,"112058",0.0000,"B102","S",,, -1,0,"Futrelle, Mr. Jacques Heath","male",37,1,0,"113803",53.1000,"C123","S",,,"Scituate, MA" -1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)","female",35,1,0,"113803",53.1000,"C123","S","D",,"Scituate, MA" -1,0,"Gee, Mr. Arthur H","male",47,0,0,"111320",38.5000,"E63","S",,"275","St Anne's-on-Sea, Lancashire" -1,1,"Geiger, Miss. Amalie","female",35,0,0,"113503",211.5000,"C130","C","4",, -1,1,"Gibson, Miss. Dorothy Winifred","female",22,0,1,"112378",59.4000,,"C","7",,"New York, NY" -1,1,"Gibson, Mrs. Leonard (Pauline C Boeson)","female",45,0,1,"112378",59.4000,,"C","7",,"New York, NY" -1,0,"Giglio, Mr. Victor","male",24,0,0,"PC 17593",79.2000,"B86","C",,, -1,1,"Goldenberg, Mr. Samuel L","male",49,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" -1,1,"Goldenberg, Mrs. Samuel L (Edwiga Grabowska)","female",,1,0,"17453",89.1042,"C92","C","5",,"Paris, France / New York, NY" -1,0,"Goldschmidt, Mr. George B","male",71,0,0,"PC 17754",34.6542,"A5","C",,,"New York, NY" -1,1,"Gracie, Col. Archibald IV","male",53,0,0,"113780",28.5000,"C51","C","B",,"Washington, DC" -1,1,"Graham, Miss. Margaret Edith","female",19,0,0,"112053",30.0000,"B42","S","3",,"Greenwich, CT" -1,0,"Graham, Mr. George Edward","male",38,0,1,"PC 17582",153.4625,"C91","S",,"147","Winnipeg, MB" -1,1,"Graham, Mrs. William Thompson (Edith Junkins)","female",58,0,1,"PC 17582",153.4625,"C125","S","3",,"Greenwich, CT" -1,1,"Greenfield, Mr. William Bertram","male",23,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" -1,1,"Greenfield, Mrs. Leo David (Blanche Strouse)","female",45,0,1,"PC 17759",63.3583,"D10 D12","C","7",,"New York, NY" -1,0,"Guggenheim, Mr. Benjamin","male",46,0,0,"PC 17593",79.2000,"B82 B84","C",,,"New York, NY" -1,1,"Harder, Mr. George Achilles","male",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" -1,1,"Harder, Mrs. George Achilles (Dorothy Annan)","female",25,1,0,"11765",55.4417,"E50","C","5",,"Brooklyn, NY" -1,1,"Harper, Mr. Henry Sleeper","male",48,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" -1,1,"Harper, Mrs. Henry Sleeper (Myna Haxtun)","female",49,1,0,"PC 17572",76.7292,"D33","C","3",,"New York, NY" -1,0,"Harrington, Mr. Charles H","male",,0,0,"113796",42.4000,,"S",,, -1,0,"Harris, Mr. Henry Birkhardt","male",45,1,0,"36973",83.4750,"C83","S",,,"New York, NY" -1,1,"Harris, Mrs. Henry Birkhardt (Irene Wallach)","female",35,1,0,"36973",83.4750,"C83","S","D",,"New York, NY" -1,0,"Harrison, Mr. William","male",40,0,0,"112059",0.0000,"B94","S",,"110", -1,1,"Hassab, Mr. Hammad","male",27,0,0,"PC 17572",76.7292,"D49","C","3",, -1,1,"Hawksford, Mr. Walter James","male",,0,0,"16988",30.0000,"D45","S","3",,"Kingston, Surrey" -1,1,"Hays, Miss. Margaret Bechstein","female",24,0,0,"11767",83.1583,"C54","C","7",,"New York, NY" -1,0,"Hays, Mr. Charles Melville","male",55,1,1,"12749",93.5000,"B69","S",,"307","Montreal, PQ" -1,1,"Hays, Mrs. Charles Melville (Clara Jennings Gregg)","female",52,1,1,"12749",93.5000,"B69","S","3",,"Montreal, PQ" -1,0,"Head, Mr. Christopher","male",42,0,0,"113038",42.5000,"B11","S",,,"London / Middlesex" -1,0,"Hilliard, Mr. Herbert Henry","male",,0,0,"17463",51.8625,"E46","S",,,"Brighton, MA" -1,0,"Hipkins, Mr. William Edward","male",55,0,0,"680",50.0000,"C39","S",,,"London / Birmingham" -1,1,"Hippach, Miss. Jean Gertrude","female",16,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" -1,1,"Hippach, Mrs. Louis Albert (Ida Sophia Fischer)","female",44,0,1,"111361",57.9792,"B18","C","4",,"Chicago, IL" -1,1,"Hogeboom, Mrs. John C (Anna Andrews)","female",51,1,0,"13502",77.9583,"D11","S","10",,"Hudson, NY" -1,0,"Holverson, Mr. Alexander Oskar","male",42,1,0,"113789",52.0000,,"S",,"38","New York, NY" -1,1,"Holverson, Mrs. Alexander Oskar (Mary Aline Towner)","female",35,1,0,"113789",52.0000,,"S","8",,"New York, NY" -1,1,"Homer, Mr. Harry (""Mr E Haven"")","male",35,0,0,"111426",26.5500,,"C","15",,"Indianapolis, IN" -1,1,"Hoyt, Mr. Frederick Maxfield","male",38,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" -1,0,"Hoyt, Mr. William Fisher","male",,0,0,"PC 17600",30.6958,,"C","14",,"New York, NY" -1,1,"Hoyt, Mrs. Frederick Maxfield (Jane Anne Forby)","female",35,1,0,"19943",90.0000,"C93","S","D",,"New York, NY / Stamford CT" -1,1,"Icard, Miss. Amelie","female",38,0,0,"113572",80.0000,"B28",,"6",, -1,0,"Isham, Miss. Ann Elizabeth","female",50,0,0,"PC 17595",28.7125,"C49","C",,,"Paris, France New York, NY" -1,1,"Ismay, Mr. Joseph Bruce","male",49,0,0,"112058",0.0000,"B52 B54 B56","S","C",,"Liverpool" -1,0,"Jones, Mr. Charles Cresson","male",46,0,0,"694",26.0000,,"S",,"80","Bennington, VT" -1,0,"Julian, Mr. Henry Forbes","male",50,0,0,"113044",26.0000,"E60","S",,,"London" -1,0,"Keeping, Mr. Edwin","male",32.5,0,0,"113503",211.5000,"C132","C",,"45", -1,0,"Kent, Mr. Edward Austin","male",58,0,0,"11771",29.7000,"B37","C",,"258","Buffalo, NY" -1,0,"Kenyon, Mr. Frederick R","male",41,1,0,"17464",51.8625,"D21","S",,,"Southington / Noank, CT" -1,1,"Kenyon, Mrs. Frederick R (Marion)","female",,1,0,"17464",51.8625,"D21","S","8",,"Southington / Noank, CT" -1,1,"Kimball, Mr. Edwin Nelson Jr","male",42,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" -1,1,"Kimball, Mrs. Edwin Nelson Jr (Gertrude Parsons)","female",45,1,0,"11753",52.5542,"D19","S","5",,"Boston, MA" -1,0,"Klaber, Mr. Herman","male",,0,0,"113028",26.5500,"C124","S",,,"Portland, OR" -1,1,"Kreuchen, Miss. Emilie","female",39,0,0,"24160",211.3375,,"S","2",, -1,1,"Leader, Dr. Alice (Farnham)","female",49,0,0,"17465",25.9292,"D17","S","8",,"New York, NY" -1,1,"LeRoy, Miss. Bertha","female",30,0,0,"PC 17761",106.4250,,"C","2",, -1,1,"Lesurer, Mr. Gustave J","male",35,0,0,"PC 17755",512.3292,"B101","C","3",, -1,0,"Lewy, Mr. Ervin G","male",,0,0,"PC 17612",27.7208,,"C",,,"Chicago, IL" -1,0,"Lindeberg-Lind, Mr. Erik Gustaf (""Mr Edward Lingrey"")","male",42,0,0,"17475",26.5500,,"S",,,"Stockholm, Sweden" -1,1,"Lindstrom, Mrs. Carl Johan (Sigrid Posse)","female",55,0,0,"112377",27.7208,,"C","6",,"Stockholm, Sweden" -1,1,"Lines, Miss. Mary Conover","female",16,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" -1,1,"Lines, Mrs. Ernest H (Elizabeth Lindsey James)","female",51,0,1,"PC 17592",39.4000,"D28","S","9",,"Paris, France" -1,0,"Long, Mr. Milton Clyde","male",29,0,0,"113501",30.0000,"D6","S",,"126","Springfield, MA" -1,1,"Longley, Miss. Gretchen Fiske","female",21,0,0,"13502",77.9583,"D9","S","10",,"Hudson, NY" -1,0,"Loring, Mr. Joseph Holland","male",30,0,0,"113801",45.5000,,"S",,,"London / New York, NY" -1,1,"Lurette, Miss. Elise","female",58,0,0,"PC 17569",146.5208,"B80","C",,, -1,1,"Madill, Miss. Georgette Alexandra","female",15,0,1,"24160",211.3375,"B5","S","2",,"St Louis, MO" -1,0,"Maguire, Mr. John Edward","male",30,0,0,"110469",26.0000,"C106","S",,,"Brockton, MA" -1,1,"Maioni, Miss. Roberta","female",16,0,0,"110152",86.5000,"B79","S","8",, -1,1,"Marechal, Mr. Pierre","male",,0,0,"11774",29.7000,"C47","C","7",,"Paris, France" -1,0,"Marvin, Mr. Daniel Warner","male",19,1,0,"113773",53.1000,"D30","S",,,"New York, NY" -1,1,"Marvin, Mrs. Daniel Warner (Mary Graham Carmichael Farquarson)","female",18,1,0,"113773",53.1000,"D30","S","10",,"New York, NY" -1,1,"Mayne, Mlle. Berthe Antonine (""Mrs de Villiers"")","female",24,0,0,"PC 17482",49.5042,"C90","C","6",,"Belgium Montreal, PQ" -1,0,"McCaffry, Mr. Thomas Francis","male",46,0,0,"13050",75.2417,"C6","C",,"292","Vancouver, BC" -1,0,"McCarthy, Mr. Timothy J","male",54,0,0,"17463",51.8625,"E46","S",,"175","Dorchester, MA" -1,1,"McGough, Mr. James Robert","male",36,0,0,"PC 17473",26.2875,"E25","S","7",,"Philadelphia, PA" -1,0,"Meyer, Mr. Edgar Joseph","male",28,1,0,"PC 17604",82.1708,,"C",,,"New York, NY" -1,1,"Meyer, Mrs. Edgar Joseph (Leila Saks)","female",,1,0,"PC 17604",82.1708,,"C","6",,"New York, NY" -1,0,"Millet, Mr. Francis Davis","male",65,0,0,"13509",26.5500,"E38","S",,"249","East Bridgewater, MA" -1,0,"Minahan, Dr. William Edward","male",44,2,0,"19928",90.0000,"C78","Q",,"230","Fond du Lac, WI" -1,1,"Minahan, Miss. Daisy E","female",33,1,0,"19928",90.0000,"C78","Q","14",,"Green Bay, WI" -1,1,"Minahan, Mrs. William Edward (Lillian E Thorpe)","female",37,1,0,"19928",90.0000,"C78","Q","14",,"Fond du Lac, WI" -1,1,"Mock, Mr. Philipp Edmund","male",30,1,0,"13236",57.7500,"C78","C","11",,"New York, NY" -1,0,"Molson, Mr. Harry Markland","male",55,0,0,"113787",30.5000,"C30","S",,,"Montreal, PQ" -1,0,"Moore, Mr. Clarence Bloomfield","male",47,0,0,"113796",42.4000,,"S",,,"Washington, DC" -1,0,"Natsch, Mr. Charles H","male",37,0,1,"PC 17596",29.7000,"C118","C",,,"Brooklyn, NY" -1,1,"Newell, Miss. Madeleine","female",31,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" -1,1,"Newell, Miss. Marjorie","female",23,1,0,"35273",113.2750,"D36","C","6",,"Lexington, MA" -1,0,"Newell, Mr. Arthur Webster","male",58,0,2,"35273",113.2750,"D48","C",,"122","Lexington, MA" -1,1,"Newsom, Miss. Helen Monypeny","female",19,0,2,"11752",26.2833,"D47","S","5",,"New York, NY" -1,0,"Nicholson, Mr. Arthur Ernest","male",64,0,0,"693",26.0000,,"S",,"263","Isle of Wight, England" -1,1,"Oliva y Ocana, Dona. Fermina","female",39,0,0,"PC 17758",108.9000,"C105","C","8",, -1,1,"Omont, Mr. Alfred Fernand","male",,0,0,"F.C. 12998",25.7417,,"C","7",,"Paris, France" -1,1,"Ostby, Miss. Helene Ragnhild","female",22,0,1,"113509",61.9792,"B36","C","5",,"Providence, RI" -1,0,"Ostby, Mr. Engelhart Cornelius","male",65,0,1,"113509",61.9792,"B30","C",,"234","Providence, RI" -1,0,"Ovies y Rodriguez, Mr. Servando","male",28.5,0,0,"PC 17562",27.7208,"D43","C",,"189","?Havana, Cuba" -1,0,"Parr, Mr. William Henry Marsh","male",,0,0,"112052",0.0000,,"S",,,"Belfast" -1,0,"Partner, Mr. Austen","male",45.5,0,0,"113043",28.5000,"C124","S",,"166","Surbiton Hill, Surrey" -1,0,"Payne, Mr. Vivian Ponsonby","male",23,0,0,"12749",93.5000,"B24","S",,,"Montreal, PQ" -1,0,"Pears, Mr. Thomas Clinton","male",29,1,0,"113776",66.6000,"C2","S",,,"Isleworth, England" -1,1,"Pears, Mrs. Thomas (Edith Wearne)","female",22,1,0,"113776",66.6000,"C2","S","8",,"Isleworth, England" -1,0,"Penasco y Castellana, Mr. Victor de Satode","male",18,1,0,"PC 17758",108.9000,"C65","C",,,"Madrid, Spain" -1,1,"Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)","female",17,1,0,"PC 17758",108.9000,"C65","C","8",,"Madrid, Spain" -1,1,"Perreault, Miss. Anne","female",30,0,0,"12749",93.5000,"B73","S","3",, -1,1,"Peuchen, Major. Arthur Godfrey","male",52,0,0,"113786",30.5000,"C104","S","6",,"Toronto, ON" -1,0,"Porter, Mr. Walter Chamberlain","male",47,0,0,"110465",52.0000,"C110","S",,"207","Worcester, MA" -1,1,"Potter, Mrs. Thomas Jr (Lily Alexenia Wilson)","female",56,0,1,"11767",83.1583,"C50","C","7",,"Mt Airy, Philadelphia, PA" -1,0,"Reuchlin, Jonkheer. John George","male",38,0,0,"19972",0.0000,,"S",,,"Rotterdam, Netherlands" -1,1,"Rheims, Mr. George Alexander Lucien","male",,0,0,"PC 17607",39.6000,,"S","A",,"Paris / New York, NY" -1,0,"Ringhini, Mr. Sante","male",22,0,0,"PC 17760",135.6333,,"C",,"232", -1,0,"Robbins, Mr. Victor","male",,0,0,"PC 17757",227.5250,,"C",,, -1,1,"Robert, Mrs. Edward Scott (Elisabeth Walton McMillan)","female",43,0,1,"24160",211.3375,"B3","S","2",,"St Louis, MO" -1,0,"Roebling, Mr. Washington Augustus II","male",31,0,0,"PC 17590",50.4958,"A24","S",,,"Trenton, NJ" -1,1,"Romaine, Mr. Charles Hallace (""Mr C Rolmane"")","male",45,0,0,"111428",26.5500,,"S","9",,"New York, NY" -1,0,"Rood, Mr. Hugh Roscoe","male",,0,0,"113767",50.0000,"A32","S",,,"Seattle, WA" -1,1,"Rosenbaum, Miss. Edith Louise","female",33,0,0,"PC 17613",27.7208,"A11","C","11",,"Paris, France" -1,0,"Rosenshine, Mr. George (""Mr George Thorne"")","male",46,0,0,"PC 17585",79.2000,,"C",,"16","New York, NY" -1,0,"Ross, Mr. John Hugo","male",36,0,0,"13049",40.1250,"A10","C",,,"Winnipeg, MB" -1,1,"Rothes, the Countess. of (Lucy Noel Martha Dyer-Edwards)","female",33,0,0,"110152",86.5000,"B77","S","8",,"London Vancouver, BC" -1,0,"Rothschild, Mr. Martin","male",55,1,0,"PC 17603",59.4000,,"C",,,"New York, NY" -1,1,"Rothschild, Mrs. Martin (Elizabeth L. Barrett)","female",54,1,0,"PC 17603",59.4000,,"C","6",,"New York, NY" -1,0,"Rowe, Mr. Alfred G","male",33,0,0,"113790",26.5500,,"S",,"109","London" -1,1,"Ryerson, Master. John Borie","male",13,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,1,"Ryerson, Miss. Emily Borie","female",18,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,1,"Ryerson, Miss. Susan Parker ""Suzette""","female",21,2,2,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,0,"Ryerson, Mr. Arthur Larned","male",61,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C",,,"Haverford, PA / Cooperstown, NY" -1,1,"Ryerson, Mrs. Arthur Larned (Emily Maria Borie)","female",48,1,3,"PC 17608",262.3750,"B57 B59 B63 B66","C","4",,"Haverford, PA / Cooperstown, NY" -1,1,"Saalfeld, Mr. Adolphe","male",,0,0,"19988",30.5000,"C106","S","3",,"Manchester, England" -1,1,"Sagesser, Mlle. Emma","female",24,0,0,"PC 17477",69.3000,"B35","C","9",, -1,1,"Salomon, Mr. Abraham L","male",,0,0,"111163",26.0000,,"S","1",,"New York, NY" -1,1,"Schabert, Mrs. Paul (Emma Mock)","female",35,1,0,"13236",57.7500,"C28","C","11",,"New York, NY" -1,1,"Serepeca, Miss. Augusta","female",30,0,0,"113798",31.0000,,"C","4",, -1,1,"Seward, Mr. Frederic Kimber","male",34,0,0,"113794",26.5500,,"S","7",,"New York, NY" -1,1,"Shutes, Miss. Elizabeth W","female",40,0,0,"PC 17582",153.4625,"C125","S","3",,"New York, NY / Greenwich CT" -1,1,"Silverthorne, Mr. Spencer Victor","male",35,0,0,"PC 17475",26.2875,"E24","S","5",,"St Louis, MO" -1,0,"Silvey, Mr. William Baird","male",50,1,0,"13507",55.9000,"E44","S",,,"Duluth, MN" -1,1,"Silvey, Mrs. William Baird (Alice Munger)","female",39,1,0,"13507",55.9000,"E44","S","11",,"Duluth, MN" -1,1,"Simonius-Blumer, Col. Oberst Alfons","male",56,0,0,"13213",35.5000,"A26","C","3",,"Basel, Switzerland" -1,1,"Sloper, Mr. William Thompson","male",28,0,0,"113788",35.5000,"A6","S","7",,"New Britain, CT" -1,0,"Smart, Mr. John Montgomery","male",56,0,0,"113792",26.5500,,"S",,,"New York, NY" -1,0,"Smith, Mr. James Clinch","male",56,0,0,"17764",30.6958,"A7","C",,,"St James, Long Island, NY" -1,0,"Smith, Mr. Lucien Philip","male",24,1,0,"13695",60.0000,"C31","S",,,"Huntington, WV" -1,0,"Smith, Mr. Richard William","male",,0,0,"113056",26.0000,"A19","S",,,"Streatham, Surrey" -1,1,"Smith, Mrs. Lucien Philip (Mary Eloise Hughes)","female",18,1,0,"13695",60.0000,"C31","S","6",,"Huntington, WV" -1,1,"Snyder, Mr. John Pillsbury","male",24,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" -1,1,"Snyder, Mrs. John Pillsbury (Nelle Stevenson)","female",23,1,0,"21228",82.2667,"B45","S","7",,"Minneapolis, MN" -1,1,"Spedden, Master. Robert Douglas","male",6,0,2,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" -1,1,"Spedden, Mr. Frederic Oakley","male",45,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" -1,1,"Spedden, Mrs. Frederic Oakley (Margaretta Corning Stone)","female",40,1,1,"16966",134.5000,"E34","C","3",,"Tuxedo Park, NY" -1,0,"Spencer, Mr. William Augustus","male",57,1,0,"PC 17569",146.5208,"B78","C",,,"Paris, France" -1,1,"Spencer, Mrs. William Augustus (Marie Eugenie)","female",,1,0,"PC 17569",146.5208,"B78","C","6",,"Paris, France" -1,1,"Stahelin-Maeglin, Dr. Max","male",32,0,0,"13214",30.5000,"B50","C","3",,"Basel, Switzerland" -1,0,"Stead, Mr. William Thomas","male",62,0,0,"113514",26.5500,"C87","S",,,"Wimbledon Park, London / Hayling Island, Hants" -1,1,"Stengel, Mr. Charles Emil Henry","male",54,1,0,"11778",55.4417,"C116","C","1",,"Newark, NJ" -1,1,"Stengel, Mrs. Charles Emil Henry (Annie May Morris)","female",43,1,0,"11778",55.4417,"C116","C","5",,"Newark, NJ" -1,1,"Stephenson, Mrs. Walter Bertram (Martha Eustis)","female",52,1,0,"36947",78.2667,"D20","C","4",,"Haverford, PA" -1,0,"Stewart, Mr. Albert A","male",,0,0,"PC 17605",27.7208,,"C",,,"Gallipolis, Ohio / ? Paris / New York" -1,1,"Stone, Mrs. George Nelson (Martha Evelyn)","female",62,0,0,"113572",80.0000,"B28",,"6",,"Cincinatti, OH" -1,0,"Straus, Mr. Isidor","male",67,1,0,"PC 17483",221.7792,"C55 C57","S",,"96","New York, NY" -1,0,"Straus, Mrs. Isidor (Rosalie Ida Blun)","female",63,1,0,"PC 17483",221.7792,"C55 C57","S",,,"New York, NY" -1,0,"Sutton, Mr. Frederick","male",61,0,0,"36963",32.3208,"D50","S",,"46","Haddenfield, NJ" -1,1,"Swift, Mrs. Frederick Joel (Margaret Welles Barron)","female",48,0,0,"17466",25.9292,"D17","S","8",,"Brooklyn, NY" -1,1,"Taussig, Miss. Ruth","female",18,0,2,"110413",79.6500,"E68","S","8",,"New York, NY" -1,0,"Taussig, Mr. Emil","male",52,1,1,"110413",79.6500,"E67","S",,,"New York, NY" -1,1,"Taussig, Mrs. Emil (Tillie Mandelbaum)","female",39,1,1,"110413",79.6500,"E67","S","8",,"New York, NY" -1,1,"Taylor, Mr. Elmer Zebley","male",48,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" -1,1,"Taylor, Mrs. Elmer Zebley (Juliet Cummins Wright)","female",,1,0,"19996",52.0000,"C126","S","5 7",,"London / East Orange, NJ" -1,0,"Thayer, Mr. John Borland","male",49,1,1,"17421",110.8833,"C68","C",,,"Haverford, PA" -1,1,"Thayer, Mr. John Borland Jr","male",17,0,2,"17421",110.8833,"C70","C","B",,"Haverford, PA" -1,1,"Thayer, Mrs. John Borland (Marian Longstreth Morris)","female",39,1,1,"17421",110.8833,"C68","C","4",,"Haverford, PA" -1,1,"Thorne, Mrs. Gertrude Maybelle","female",,0,0,"PC 17585",79.2000,,"C","D",,"New York, NY" -1,1,"Tucker, Mr. Gilbert Milligan Jr","male",31,0,0,"2543",28.5375,"C53","C","7",,"Albany, NY" -1,0,"Uruchurtu, Don. Manuel E","male",40,0,0,"PC 17601",27.7208,,"C",,,"Mexico City, Mexico" -1,0,"Van der hoef, Mr. Wyckoff","male",61,0,0,"111240",33.5000,"B19","S",,"245","Brooklyn, NY" -1,0,"Walker, Mr. William Anderson","male",47,0,0,"36967",34.0208,"D46","S",,,"East Orange, NJ" -1,1,"Ward, Miss. Anna","female",35,0,0,"PC 17755",512.3292,,"C","3",, -1,0,"Warren, Mr. Frank Manley","male",64,1,0,"110813",75.2500,"D37","C",,,"Portland, OR" -1,1,"Warren, Mrs. Frank Manley (Anna Sophia Atkinson)","female",60,1,0,"110813",75.2500,"D37","C","5",,"Portland, OR" -1,0,"Weir, Col. John","male",60,0,0,"113800",26.5500,,"S",,,"England Salt Lake City, Utah" -1,0,"White, Mr. Percival Wayland","male",54,0,1,"35281",77.2875,"D26","S",,,"Brunswick, ME" -1,0,"White, Mr. Richard Frasar","male",21,0,1,"35281",77.2875,"D26","S",,"169","Brunswick, ME" -1,1,"White, Mrs. John Stuart (Ella Holmes)","female",55,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Briarcliff Manor NY" -1,1,"Wick, Miss. Mary Natalie","female",31,0,2,"36928",164.8667,"C7","S","8",,"Youngstown, OH" -1,0,"Wick, Mr. George Dennick","male",57,1,1,"36928",164.8667,,"S",,,"Youngstown, OH" -1,1,"Wick, Mrs. George Dennick (Mary Hitchcock)","female",45,1,1,"36928",164.8667,,"S","8",,"Youngstown, OH" -1,0,"Widener, Mr. George Dunton","male",50,1,1,"113503",211.5000,"C80","C",,,"Elkins Park, PA" -1,0,"Widener, Mr. Harry Elkins","male",27,0,2,"113503",211.5000,"C82","C",,,"Elkins Park, PA" -1,1,"Widener, Mrs. George Dunton (Eleanor Elkins)","female",50,1,1,"113503",211.5000,"C80","C","4",,"Elkins Park, PA" -1,1,"Willard, Miss. Constance","female",21,0,0,"113795",26.5500,,"S","8 10",,"Duluth, MN" -1,0,"Williams, Mr. Charles Duane","male",51,0,1,"PC 17597",61.3792,,"C",,,"Geneva, Switzerland / Radnor, PA" -1,1,"Williams, Mr. Richard Norris II","male",21,0,1,"PC 17597",61.3792,,"C","A",,"Geneva, Switzerland / Radnor, PA" -1,0,"Williams-Lambert, Mr. Fletcher Fellows","male",,0,0,"113510",35.0000,"C128","S",,,"London, England" -1,1,"Wilson, Miss. Helen Alice","female",31,0,0,"16966",134.5000,"E39 E41","C","3",, -1,1,"Woolner, Mr. Hugh","male",,0,0,"19947",35.5000,"C52","S","D",,"London, England" -1,0,"Wright, Mr. George","male",62,0,0,"113807",26.5500,,"S",,,"Halifax, NS" -1,1,"Young, Miss. Marie Grice","female",36,0,0,"PC 17760",135.6333,"C32","C","8",,"New York, NY / Washington, DC" -2,0,"Abelson, Mr. Samuel","male",30,1,0,"P/PP 3381",24.0000,,"C",,,"Russia New York, NY" -2,1,"Abelson, Mrs. Samuel (Hannah Wizosky)","female",28,1,0,"P/PP 3381",24.0000,,"C","10",,"Russia New York, NY" -2,0,"Aldworth, Mr. Charles Augustus","male",30,0,0,"248744",13.0000,,"S",,,"Bryn Mawr, PA, USA" -2,0,"Andrew, Mr. Edgardo Samuel","male",18,0,0,"231945",11.5000,,"S",,,"Buenos Aires, Argentina / New Jersey, NJ" -2,0,"Andrew, Mr. Frank Thomas","male",25,0,0,"C.A. 34050",10.5000,,"S",,,"Cornwall, England Houghton, MI" -2,0,"Angle, Mr. William A","male",34,1,0,"226875",26.0000,,"S",,,"Warwick, England" -2,1,"Angle, Mrs. William A (Florence ""Mary"" Agnes Hughes)","female",36,1,0,"226875",26.0000,,"S","11",,"Warwick, England" -2,0,"Ashby, Mr. John","male",57,0,0,"244346",13.0000,,"S",,,"West Hoboken, NJ" -2,0,"Bailey, Mr. Percy Andrew","male",18,0,0,"29108",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" -2,0,"Baimbrigge, Mr. Charles Robert","male",23,0,0,"C.A. 31030",10.5000,,"S",,,"Guernsey" -2,1,"Ball, Mrs. (Ada E Hall)","female",36,0,0,"28551",13.0000,"D","S","10",,"Bristol, Avon / Jacksonville, FL" -2,0,"Banfield, Mr. Frederick James","male",28,0,0,"C.A./SOTON 34068",10.5000,,"S",,,"Plymouth, Dorset / Houghton, MI" -2,0,"Bateman, Rev. Robert James","male",51,0,0,"S.O.P. 1166",12.5250,,"S",,"174","Jacksonville, FL" -2,1,"Beane, Mr. Edward","male",32,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" -2,1,"Beane, Mrs. Edward (Ethel Clarke)","female",19,1,0,"2908",26.0000,,"S","13",,"Norwich / New York, NY" -2,0,"Beauchamp, Mr. Henry James","male",28,0,0,"244358",26.0000,,"S",,,"England" -2,1,"Becker, Master. Richard F","male",1,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" -2,1,"Becker, Miss. Marion Louise","female",4,2,1,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" -2,1,"Becker, Miss. Ruth Elizabeth","female",12,2,1,"230136",39.0000,"F4","S","13",,"Guntur, India / Benton Harbour, MI" -2,1,"Becker, Mrs. Allen Oliver (Nellie E Baumgardner)","female",36,0,3,"230136",39.0000,"F4","S","11",,"Guntur, India / Benton Harbour, MI" -2,1,"Beesley, Mr. Lawrence","male",34,0,0,"248698",13.0000,"D56","S","13",,"London" -2,1,"Bentham, Miss. Lilian W","female",19,0,0,"28404",13.0000,,"S","12",,"Rochester, NY" -2,0,"Berriman, Mr. William John","male",23,0,0,"28425",13.0000,,"S",,,"St Ives, Cornwall / Calumet, MI" -2,0,"Botsford, Mr. William Hull","male",26,0,0,"237670",13.0000,,"S",,,"Elmira, NY / Orange, NJ" -2,0,"Bowenur, Mr. Solomon","male",42,0,0,"211535",13.0000,,"S",,,"London" -2,0,"Bracken, Mr. James H","male",27,0,0,"220367",13.0000,,"S",,,"Lake Arthur, Chavez County, NM" -2,1,"Brown, Miss. Amelia ""Mildred""","female",24,0,0,"248733",13.0000,"F33","S","11",,"London / Montreal, PQ" -2,1,"Brown, Miss. Edith Eileen","female",15,0,2,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" -2,0,"Brown, Mr. Thomas William Solomon","male",60,1,1,"29750",39.0000,,"S",,,"Cape Town, South Africa / Seattle, WA" -2,1,"Brown, Mrs. Thomas William Solomon (Elizabeth Catherine Ford)","female",40,1,1,"29750",39.0000,,"S","14",,"Cape Town, South Africa / Seattle, WA" -2,1,"Bryhl, Miss. Dagmar Jenny Ingeborg ","female",20,1,0,"236853",26.0000,,"S","12",,"Skara, Sweden / Rockford, IL" -2,0,"Bryhl, Mr. Kurt Arnold Gottfrid","male",25,1,0,"236853",26.0000,,"S",,,"Skara, Sweden / Rockford, IL" -2,1,"Buss, Miss. Kate","female",36,0,0,"27849",13.0000,,"S","9",,"Sittingbourne, England / San Diego, CA" -2,0,"Butler, Mr. Reginald Fenton","male",25,0,0,"234686",13.0000,,"S",,"97","Southsea, Hants" -2,0,"Byles, Rev. Thomas Roussel Davids","male",42,0,0,"244310",13.0000,,"S",,,"London" -2,1,"Bystrom, Mrs. (Karolina)","female",42,0,0,"236852",13.0000,,"S",,,"New York, NY" -2,1,"Caldwell, Master. Alden Gates","male",0.83,0,2,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" -2,1,"Caldwell, Mr. Albert Francis","male",26,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" -2,1,"Caldwell, Mrs. Albert Francis (Sylvia Mae Harbaugh)","female",22,1,1,"248738",29.0000,,"S","13",,"Bangkok, Thailand / Roseville, IL" -2,1,"Cameron, Miss. Clear Annie","female",35,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" -2,0,"Campbell, Mr. William","male",,0,0,"239853",0.0000,,"S",,,"Belfast" -2,0,"Carbines, Mr. William","male",19,0,0,"28424",13.0000,,"S",,"18","St Ives, Cornwall / Calumet, MI" -2,0,"Carter, Mrs. Ernest Courtenay (Lilian Hughes)","female",44,1,0,"244252",26.0000,,"S",,,"London" -2,0,"Carter, Rev. Ernest Courtenay","male",54,1,0,"244252",26.0000,,"S",,,"London" -2,0,"Chapman, Mr. Charles Henry","male",52,0,0,"248731",13.5000,,"S",,"130","Bronx, NY" -2,0,"Chapman, Mr. John Henry","male",37,1,0,"SC/AH 29037",26.0000,,"S",,"17","Cornwall / Spokane, WA" -2,0,"Chapman, Mrs. John Henry (Sara Elizabeth Lawry)","female",29,1,0,"SC/AH 29037",26.0000,,"S",,,"Cornwall / Spokane, WA" -2,1,"Christy, Miss. Julie Rachel","female",25,1,1,"237789",30.0000,,"S","12",,"London" -2,1,"Christy, Mrs. (Alice Frances)","female",45,0,2,"237789",30.0000,,"S","12",,"London" -2,0,"Clarke, Mr. Charles Valentine","male",29,1,0,"2003",26.0000,,"S",,,"England / San Francisco, CA" -2,1,"Clarke, Mrs. Charles V (Ada Maria Winfield)","female",28,1,0,"2003",26.0000,,"S","14",,"England / San Francisco, CA" -2,0,"Coleridge, Mr. Reginald Charles","male",29,0,0,"W./C. 14263",10.5000,,"S",,,"Hartford, Huntingdonshire" -2,0,"Collander, Mr. Erik Gustaf","male",28,0,0,"248740",13.0000,,"S",,,"Helsinki, Finland Ashtabula, Ohio" -2,1,"Collett, Mr. Sidney C Stuart","male",24,0,0,"28034",10.5000,,"S","9",,"London / Fort Byron, NY" -2,1,"Collyer, Miss. Marjorie ""Lottie""","female",8,0,2,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" -2,0,"Collyer, Mr. Harvey","male",31,1,1,"C.A. 31921",26.2500,,"S",,,"Bishopstoke, Hants / Fayette Valley, ID" -2,1,"Collyer, Mrs. Harvey (Charlotte Annie Tate)","female",31,1,1,"C.A. 31921",26.2500,,"S","14",,"Bishopstoke, Hants / Fayette Valley, ID" -2,1,"Cook, Mrs. (Selena Rogers)","female",22,0,0,"W./C. 14266",10.5000,"F33","S","14",,"Pennsylvania" -2,0,"Corbett, Mrs. Walter H (Irene Colvin)","female",30,0,0,"237249",13.0000,,"S",,,"Provo, UT" -2,0,"Corey, Mrs. Percy C (Mary Phyllis Elizabeth Miller)","female",,0,0,"F.C.C. 13534",21.0000,,"S",,,"Upper Burma, India Pittsburgh, PA" -2,0,"Cotterill, Mr. Henry ""Harry""","male",21,0,0,"29107",11.5000,,"S",,,"Penzance, Cornwall / Akron, OH" -2,0,"Cunningham, Mr. Alfred Fleming","male",,0,0,"239853",0.0000,,"S",,,"Belfast" -2,1,"Davies, Master. John Morgan Jr","male",8,1,1,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" -2,0,"Davies, Mr. Charles Henry","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"Lyndhurst, England" -2,1,"Davies, Mrs. John Morgan (Elizabeth Agnes Mary White) ","female",48,0,2,"C.A. 33112",36.7500,,"S","14",,"St Ives, Cornwall / Hancock, MI" -2,1,"Davis, Miss. Mary","female",28,0,0,"237668",13.0000,,"S","13",,"London / Staten Island, NY" -2,0,"de Brito, Mr. Jose Joaquim","male",32,0,0,"244360",13.0000,,"S",,,"Portugal / Sau Paulo, Brazil" -2,0,"Deacon, Mr. Percy William","male",17,0,0,"S.O.C. 14879",73.5000,,"S",,, -2,0,"del Carlo, Mr. Sebastiano","male",29,1,0,"SC/PARIS 2167",27.7208,,"C",,"295","Lucca, Italy / California" -2,1,"del Carlo, Mrs. Sebastiano (Argenia Genovesi)","female",24,1,0,"SC/PARIS 2167",27.7208,,"C","12",,"Lucca, Italy / California" -2,0,"Denbury, Mr. Herbert","male",25,0,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Dibden, Mr. William","male",18,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" -2,1,"Doling, Miss. Elsie","female",18,0,1,"231919",23.0000,,"S",,,"Southampton" -2,1,"Doling, Mrs. John T (Ada Julia Bone)","female",34,0,1,"231919",23.0000,,"S",,,"Southampton" -2,0,"Downton, Mr. William James","male",54,0,0,"28403",26.0000,,"S",,,"Holley, NY" -2,1,"Drew, Master. Marshall Brines","male",8,0,2,"28220",32.5000,,"S","10",,"Greenport, NY" -2,0,"Drew, Mr. James Vivian","male",42,1,1,"28220",32.5000,,"S",,,"Greenport, NY" -2,1,"Drew, Mrs. James Vivian (Lulu Thorne Christian)","female",34,1,1,"28220",32.5000,,"S","10",,"Greenport, NY" -2,1,"Duran y More, Miss. Asuncion","female",27,1,0,"SC/PARIS 2149",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" -2,1,"Duran y More, Miss. Florentina","female",30,1,0,"SC/PARIS 2148",13.8583,,"C","12",,"Barcelona, Spain / Havana, Cuba" -2,0,"Eitemiller, Mr. George Floyd","male",23,0,0,"29751",13.0000,,"S",,,"England / Detroit, MI" -2,0,"Enander, Mr. Ingvar","male",21,0,0,"236854",13.0000,,"S",,,"Goteborg, Sweden / Rockford, IL" -2,0,"Fahlstrom, Mr. Arne Jonas","male",18,0,0,"236171",13.0000,,"S",,,"Oslo, Norway Bayonne, NJ" -2,0,"Faunthorpe, Mr. Harry","male",40,1,0,"2926",26.0000,,"S",,"286","England / Philadelphia, PA" -2,1,"Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson)","female",29,1,0,"2926",26.0000,,"S","16",, -2,0,"Fillbrook, Mr. Joseph Charles","male",18,0,0,"C.A. 15185",10.5000,,"S",,,"Cornwall / Houghton, MI" -2,0,"Fox, Mr. Stanley Hubert","male",36,0,0,"229236",13.0000,,"S",,"236","Rochester, NY" -2,0,"Frost, Mr. Anthony Wood ""Archie""","male",,0,0,"239854",0.0000,,"S",,,"Belfast" -2,0,"Funk, Miss. Annie Clemmer","female",38,0,0,"237671",13.0000,,"S",,,"Janjgir, India / Pennsylvania" -2,0,"Fynney, Mr. Joseph J","male",35,0,0,"239865",26.0000,,"S",,"322","Liverpool / Montreal, PQ" -2,0,"Gale, Mr. Harry","male",38,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" -2,0,"Gale, Mr. Shadrach","male",34,1,0,"28664",21.0000,,"S",,,"Cornwall / Clear Creek, CO" -2,1,"Garside, Miss. Ethel","female",34,0,0,"243880",13.0000,,"S","12",,"Brooklyn, NY" -2,0,"Gaskell, Mr. Alfred","male",16,0,0,"239865",26.0000,,"S",,,"Liverpool / Montreal, PQ" -2,0,"Gavey, Mr. Lawrence","male",26,0,0,"31028",10.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Gilbert, Mr. William","male",47,0,0,"C.A. 30769",10.5000,,"S",,,"Cornwall" -2,0,"Giles, Mr. Edgar","male",21,1,0,"28133",11.5000,,"S",,,"Cornwall / Camden, NJ" -2,0,"Giles, Mr. Frederick Edward","male",21,1,0,"28134",11.5000,,"S",,,"Cornwall / Camden, NJ" -2,0,"Giles, Mr. Ralph","male",24,0,0,"248726",13.5000,,"S",,"297","West Kensington, London" -2,0,"Gill, Mr. John William","male",24,0,0,"233866",13.0000,,"S",,"155","Clevedon, England" -2,0,"Gillespie, Mr. William Henry","male",34,0,0,"12233",13.0000,,"S",,,"Vancouver, BC" -2,0,"Givard, Mr. Hans Kristensen","male",30,0,0,"250646",13.0000,,"S",,"305", -2,0,"Greenberg, Mr. Samuel","male",52,0,0,"250647",13.0000,,"S",,"19","Bronx, NY" -2,0,"Hale, Mr. Reginald","male",30,0,0,"250653",13.0000,,"S",,"75","Auburn, NY" -2,1,"Hamalainen, Master. Viljo","male",0.67,1,1,"250649",14.5000,,"S","4",,"Detroit, MI" -2,1,"Hamalainen, Mrs. William (Anna)","female",24,0,2,"250649",14.5000,,"S","4",,"Detroit, MI" -2,0,"Harbeck, Mr. William H","male",44,0,0,"248746",13.0000,,"S",,"35","Seattle, WA / Toledo, OH" -2,1,"Harper, Miss. Annie Jessie ""Nina""","female",6,0,1,"248727",33.0000,,"S","11",,"Denmark Hill, Surrey / Chicago" -2,0,"Harper, Rev. John","male",28,0,1,"248727",33.0000,,"S",,,"Denmark Hill, Surrey / Chicago" -2,1,"Harris, Mr. George","male",62,0,0,"S.W./PP 752",10.5000,,"S","15",,"London" -2,0,"Harris, Mr. Walter","male",30,0,0,"W/C 14208",10.5000,,"S",,,"Walthamstow, England" -2,1,"Hart, Miss. Eva Miriam","female",7,0,2,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" -2,0,"Hart, Mr. Benjamin","male",43,1,1,"F.C.C. 13529",26.2500,,"S",,,"Ilford, Essex / Winnipeg, MB" -2,1,"Hart, Mrs. Benjamin (Esther Ada Bloomfield)","female",45,1,1,"F.C.C. 13529",26.2500,,"S","14",,"Ilford, Essex / Winnipeg, MB" -2,1,"Herman, Miss. Alice","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" -2,1,"Herman, Miss. Kate","female",24,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" -2,0,"Herman, Mr. Samuel","male",49,1,2,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" -2,1,"Herman, Mrs. Samuel (Jane Laver)","female",48,1,2,"220845",65.0000,,"S","9",,"Somerset / Bernardsville, NJ" -2,1,"Hewlett, Mrs. (Mary D Kingcome) ","female",55,0,0,"248706",16.0000,,"S","13",,"India / Rapid City, SD" -2,0,"Hickman, Mr. Leonard Mark","male",24,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" -2,0,"Hickman, Mr. Lewis","male",32,2,0,"S.O.C. 14879",73.5000,,"S",,"256","West Hampstead, London / Neepawa, MB" -2,0,"Hickman, Mr. Stanley George","male",21,2,0,"S.O.C. 14879",73.5000,,"S",,,"West Hampstead, London / Neepawa, MB" -2,0,"Hiltunen, Miss. Marta","female",18,1,1,"250650",13.0000,,"S",,,"Kontiolahti, Finland / Detroit, MI" -2,1,"Hocking, Miss. Ellen ""Nellie""","female",20,2,1,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" -2,0,"Hocking, Mr. Richard George","male",23,2,1,"29104",11.5000,,"S",,,"Cornwall / Akron, OH" -2,0,"Hocking, Mr. Samuel James Metcalfe","male",36,0,0,"242963",13.0000,,"S",,,"Devonport, England" -2,1,"Hocking, Mrs. Elizabeth (Eliza Needs)","female",54,1,3,"29105",23.0000,,"S","4",,"Cornwall / Akron, OH" -2,0,"Hodges, Mr. Henry Price","male",50,0,0,"250643",13.0000,,"S",,"149","Southampton" -2,0,"Hold, Mr. Stephen","male",44,1,0,"26707",26.0000,,"S",,,"England / Sacramento, CA" -2,1,"Hold, Mrs. Stephen (Annie Margaret Hill)","female",29,1,0,"26707",26.0000,,"S","10",,"England / Sacramento, CA" -2,0,"Hood, Mr. Ambrose Jr","male",21,0,0,"S.O.C. 14879",73.5000,,"S",,,"New Forest, England" -2,1,"Hosono, Mr. Masabumi","male",42,0,0,"237798",13.0000,,"S","10",,"Tokyo, Japan" -2,0,"Howard, Mr. Benjamin","male",63,1,0,"24065",26.0000,,"S",,,"Swindon, England" -2,0,"Howard, Mrs. Benjamin (Ellen Truelove Arman)","female",60,1,0,"24065",26.0000,,"S",,,"Swindon, England" -2,0,"Hunt, Mr. George Henry","male",33,0,0,"SCO/W 1585",12.2750,,"S",,,"Philadelphia, PA" -2,1,"Ilett, Miss. Bertha","female",17,0,0,"SO/C 14885",10.5000,,"S",,,"Guernsey" -2,0,"Jacobsohn, Mr. Sidney Samuel","male",42,1,0,"243847",27.0000,,"S",,,"London" -2,1,"Jacobsohn, Mrs. Sidney Samuel (Amy Frances Christy)","female",24,2,1,"243847",27.0000,,"S","12",,"London" -2,0,"Jarvis, Mr. John Denzil","male",47,0,0,"237565",15.0000,,"S",,,"North Evington, England" -2,0,"Jefferys, Mr. Clifford Thomas","male",24,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Jefferys, Mr. Ernest Wilfred","male",22,2,0,"C.A. 31029",31.5000,,"S",,,"Guernsey / Elizabeth, NJ" -2,0,"Jenkin, Mr. Stephen Curnow","male",32,0,0,"C.A. 33111",10.5000,,"S",,,"St Ives, Cornwall / Houghton, MI" -2,1,"Jerwan, Mrs. Amin S (Marie Marthe Thuillard)","female",23,0,0,"SC/AH Basle 541",13.7917,"D","C","11",,"New York, NY" -2,0,"Kantor, Mr. Sinai","male",34,1,0,"244367",26.0000,,"S",,"283","Moscow / Bronx, NY" -2,1,"Kantor, Mrs. Sinai (Miriam Sternin)","female",24,1,0,"244367",26.0000,,"S","12",,"Moscow / Bronx, NY" -2,0,"Karnes, Mrs. J Frank (Claire Bennett)","female",22,0,0,"F.C.C. 13534",21.0000,,"S",,,"India / Pittsburgh, PA" -2,1,"Keane, Miss. Nora A","female",,0,0,"226593",12.3500,"E101","Q","10",,"Harrisburg, PA" -2,0,"Keane, Mr. Daniel","male",35,0,0,"233734",12.3500,,"Q",,, -2,1,"Kelly, Mrs. Florence ""Fannie""","female",45,0,0,"223596",13.5000,,"S","9",,"London / New York, NY" -2,0,"Kirkland, Rev. Charles Leonard","male",57,0,0,"219533",12.3500,,"Q",,,"Glasgow / Bangor, ME" -2,0,"Knight, Mr. Robert J","male",,0,0,"239855",0.0000,,"S",,,"Belfast" -2,0,"Kvillner, Mr. Johan Henrik Johannesson","male",31,0,0,"C.A. 18723",10.5000,,"S",,"165","Sweden / Arlington, NJ" -2,0,"Lahtinen, Mrs. William (Anna Sylfven)","female",26,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" -2,0,"Lahtinen, Rev. William","male",30,1,1,"250651",26.0000,,"S",,,"Minneapolis, MN" -2,0,"Lamb, Mr. John Joseph","male",,0,0,"240261",10.7083,,"Q",,, -2,1,"Laroche, Miss. Louise","female",1,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" -2,1,"Laroche, Miss. Simonne Marie Anne Andree","female",3,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" -2,0,"Laroche, Mr. Joseph Philippe Lemercier","male",25,1,2,"SC/Paris 2123",41.5792,,"C",,,"Paris / Haiti" -2,1,"Laroche, Mrs. Joseph (Juliette Marie Louise Lafargue)","female",22,1,2,"SC/Paris 2123",41.5792,,"C","14",,"Paris / Haiti" -2,1,"Lehmann, Miss. Bertha","female",17,0,0,"SC 1748",12.0000,,"C","12",,"Berne, Switzerland / Central City, IA" -2,1,"Leitch, Miss. Jessie Wills","female",,0,0,"248727",33.0000,,"S","11",,"London / Chicago, IL" -2,1,"Lemore, Mrs. (Amelia Milley)","female",34,0,0,"C.A. 34260",10.5000,"F33","S","14",,"Chicago, IL" -2,0,"Levy, Mr. Rene Jacques","male",36,0,0,"SC/Paris 2163",12.8750,"D","C",,,"Montreal, PQ" -2,0,"Leyson, Mr. Robert William Norman","male",24,0,0,"C.A. 29566",10.5000,,"S",,"108", -2,0,"Lingane, Mr. John","male",61,0,0,"235509",12.3500,,"Q",,, -2,0,"Louch, Mr. Charles Alexander","male",50,1,0,"SC/AH 3085",26.0000,,"S",,"121","Weston-Super-Mare, Somerset" -2,1,"Louch, Mrs. Charles Alexander (Alice Adelaide Slow)","female",42,1,0,"SC/AH 3085",26.0000,,"S",,,"Weston-Super-Mare, Somerset" -2,0,"Mack, Mrs. (Mary)","female",57,0,0,"S.O./P.P. 3",10.5000,"E77","S",,"52","Southampton / New York, NY" -2,0,"Malachard, Mr. Noel","male",,0,0,"237735",15.0458,"D","C",,,"Paris" -2,1,"Mallet, Master. Andre","male",1,0,2,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" -2,0,"Mallet, Mr. Albert","male",31,1,1,"S.C./PARIS 2079",37.0042,,"C",,,"Paris / Montreal, PQ" -2,1,"Mallet, Mrs. Albert (Antoinette Magnin)","female",24,1,1,"S.C./PARIS 2079",37.0042,,"C","10",,"Paris / Montreal, PQ" -2,0,"Mangiavacchi, Mr. Serafino Emilio","male",,0,0,"SC/A.3 2861",15.5792,,"C",,,"New York, NY" -2,0,"Matthews, Mr. William John","male",30,0,0,"28228",13.0000,,"S",,,"St Austall, Cornwall" -2,0,"Maybery, Mr. Frank Hubert","male",40,0,0,"239059",16.0000,,"S",,,"Weston-Super-Mare / Moose Jaw, SK" -2,0,"McCrae, Mr. Arthur Gordon","male",32,0,0,"237216",13.5000,,"S",,"209","Sydney, Australia" -2,0,"McCrie, Mr. James Matthew","male",30,0,0,"233478",13.0000,,"S",,,"Sarnia, ON" -2,0,"McKane, Mr. Peter David","male",46,0,0,"28403",26.0000,,"S",,,"Rochester, NY" -2,1,"Mellinger, Miss. Madeleine Violet","female",13,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" -2,1,"Mellinger, Mrs. (Elizabeth Anne Maidment)","female",41,0,1,"250644",19.5000,,"S","14",,"England / Bennington, VT" -2,1,"Mellors, Mr. William John","male",19,0,0,"SW/PP 751",10.5000,,"S","B",,"Chelsea, London" -2,0,"Meyer, Mr. August","male",39,0,0,"248723",13.0000,,"S",,,"Harrow-on-the-Hill, Middlesex" -2,0,"Milling, Mr. Jacob Christian","male",48,0,0,"234360",13.0000,,"S",,"271","Copenhagen, Denmark" -2,0,"Mitchell, Mr. Henry Michael","male",70,0,0,"C.A. 24580",10.5000,,"S",,,"Guernsey / Montclair, NJ and/or Toledo, Ohio" -2,0,"Montvila, Rev. Juozas","male",27,0,0,"211536",13.0000,,"S",,,"Worcester, MA" -2,0,"Moraweck, Dr. Ernest","male",54,0,0,"29011",14.0000,,"S",,,"Frankfort, KY" -2,0,"Morley, Mr. Henry Samuel (""Mr Henry Marshall"")","male",39,0,0,"250655",26.0000,,"S",,, -2,0,"Mudd, Mr. Thomas Charles","male",16,0,0,"S.O./P.P. 3",10.5000,,"S",,,"Halesworth, England" -2,0,"Myles, Mr. Thomas Francis","male",62,0,0,"240276",9.6875,,"Q",,,"Cambridge, MA" -2,0,"Nasser, Mr. Nicholas","male",32.5,1,0,"237736",30.0708,,"C",,"43","New York, NY" -2,1,"Nasser, Mrs. Nicholas (Adele Achem)","female",14,1,0,"237736",30.0708,,"C",,,"New York, NY" -2,1,"Navratil, Master. Edmond Roger","male",2,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" -2,1,"Navratil, Master. Michel M","male",3,1,1,"230080",26.0000,"F2","S","D",,"Nice, France" -2,0,"Navratil, Mr. Michel (""Louis M Hoffman"")","male",36.5,0,2,"230080",26.0000,"F2","S",,"15","Nice, France" -2,0,"Nesson, Mr. Israel","male",26,0,0,"244368",13.0000,"F2","S",,,"Boston, MA" -2,0,"Nicholls, Mr. Joseph Charles","male",19,1,1,"C.A. 33112",36.7500,,"S",,"101","Cornwall / Hancock, MI" -2,0,"Norman, Mr. Robert Douglas","male",28,0,0,"218629",13.5000,,"S",,"287","Glasgow" -2,1,"Nourney, Mr. Alfred (""Baron von Drachstedt"")","male",20,0,0,"SC/PARIS 2166",13.8625,"D38","C","7",,"Cologne, Germany" -2,1,"Nye, Mrs. (Elizabeth Ramell)","female",29,0,0,"C.A. 29395",10.5000,"F33","S","11",,"Folkstone, Kent / New York, NY" -2,0,"Otter, Mr. Richard","male",39,0,0,"28213",13.0000,,"S",,,"Middleburg Heights, OH" -2,1,"Oxenham, Mr. Percy Thomas","male",22,0,0,"W./C. 14260",10.5000,,"S","13",,"Pondersend, England / New Durham, NJ" -2,1,"Padro y Manent, Mr. Julian","male",,0,0,"SC/PARIS 2146",13.8625,,"C","9",,"Spain / Havana, Cuba" -2,0,"Pain, Dr. Alfred","male",23,0,0,"244278",10.5000,,"S",,,"Hamilton, ON" -2,1,"Pallas y Castello, Mr. Emilio","male",29,0,0,"SC/PARIS 2147",13.8583,,"C","9",,"Spain / Havana, Cuba" -2,0,"Parker, Mr. Clifford Richard","male",28,0,0,"SC 14888",10.5000,,"S",,,"St Andrews, Guernsey" -2,0,"Parkes, Mr. Francis ""Frank""","male",,0,0,"239853",0.0000,,"S",,,"Belfast" -2,1,"Parrish, Mrs. (Lutie Davis)","female",50,0,1,"230433",26.0000,,"S","12",,"Woodford County, KY" -2,0,"Pengelly, Mr. Frederick William","male",19,0,0,"28665",10.5000,,"S",,,"Gunnislake, England / Butte, MT" -2,0,"Pernot, Mr. Rene","male",,0,0,"SC/PARIS 2131",15.0500,,"C",,, -2,0,"Peruschitz, Rev. Joseph Maria","male",41,0,0,"237393",13.0000,,"S",,, -2,1,"Phillips, Miss. Alice Frances Louisa","female",21,0,1,"S.O./P.P. 2",21.0000,,"S","12",,"Ilfracombe, Devon" -2,1,"Phillips, Miss. Kate Florence (""Mrs Kate Louise Phillips Marshall"")","female",19,0,0,"250655",26.0000,,"S","11",,"Worcester, England" -2,0,"Phillips, Mr. Escott Robert","male",43,0,1,"S.O./P.P. 2",21.0000,,"S",,,"Ilfracombe, Devon" -2,1,"Pinsky, Mrs. (Rosa)","female",32,0,0,"234604",13.0000,,"S","9",,"Russia" -2,0,"Ponesell, Mr. Martin","male",34,0,0,"250647",13.0000,,"S",,,"Denmark / New York, NY" -2,1,"Portaluppi, Mr. Emilio Ilario Giuseppe","male",30,0,0,"C.A. 34644",12.7375,,"C","14",,"Milford, NH" -2,0,"Pulbaum, Mr. Franz","male",27,0,0,"SC/PARIS 2168",15.0333,,"C",,,"Paris" -2,1,"Quick, Miss. Phyllis May","female",2,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" -2,1,"Quick, Miss. Winifred Vera","female",8,1,1,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" -2,1,"Quick, Mrs. Frederick Charles (Jane Richards)","female",33,0,2,"26360",26.0000,,"S","11",,"Plymouth, Devon / Detroit, MI" -2,0,"Reeves, Mr. David","male",36,0,0,"C.A. 17248",10.5000,,"S",,,"Brighton, Sussex" -2,0,"Renouf, Mr. Peter Henry","male",34,1,0,"31027",21.0000,,"S","12",,"Elizabeth, NJ" -2,1,"Renouf, Mrs. Peter Henry (Lillian Jefferys)","female",30,3,0,"31027",21.0000,,"S",,,"Elizabeth, NJ" -2,1,"Reynaldo, Ms. Encarnacion","female",28,0,0,"230434",13.0000,,"S","9",,"Spain" -2,0,"Richard, Mr. Emile","male",23,0,0,"SC/PARIS 2133",15.0458,,"C",,,"Paris / Montreal, PQ" -2,1,"Richards, Master. George Sibley","male",0.83,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" -2,1,"Richards, Master. William Rowe","male",3,1,1,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" -2,1,"Richards, Mrs. Sidney (Emily Hocking)","female",24,2,3,"29106",18.7500,,"S","4",,"Cornwall / Akron, OH" -2,1,"Ridsdale, Miss. Lucy","female",50,0,0,"W./C. 14258",10.5000,,"S","13",,"London, England / Marietta, Ohio and Milwaukee, WI" -2,0,"Rogers, Mr. Reginald Harry","male",19,0,0,"28004",10.5000,,"S",,, -2,1,"Rugg, Miss. Emily","female",21,0,0,"C.A. 31026",10.5000,,"S","12",,"Guernsey / Wilmington, DE" -2,0,"Schmidt, Mr. August","male",26,0,0,"248659",13.0000,,"S",,,"Newark, NJ" -2,0,"Sedgwick, Mr. Charles Frederick Waddington","male",25,0,0,"244361",13.0000,,"S",,,"Liverpool" -2,0,"Sharp, Mr. Percival James R","male",27,0,0,"244358",26.0000,,"S",,,"Hornsey, England" -2,1,"Shelley, Mrs. William (Imanita Parrish Hall)","female",25,0,1,"230433",26.0000,,"S","12",,"Deer Lodge, MT" -2,1,"Silven, Miss. Lyyli Karoliina","female",18,0,2,"250652",13.0000,,"S","16",,"Finland / Minneapolis, MN" -2,1,"Sincock, Miss. Maude","female",20,0,0,"C.A. 33112",36.7500,,"S","11",,"Cornwall / Hancock, MI" -2,1,"Sinkkonen, Miss. Anna","female",30,0,0,"250648",13.0000,,"S","10",,"Finland / Washington, DC" -2,0,"Sjostedt, Mr. Ernst Adolf","male",59,0,0,"237442",13.5000,,"S",,,"Sault St Marie, ON" -2,1,"Slayter, Miss. Hilda Mary","female",30,0,0,"234818",12.3500,,"Q","13",,"Halifax, NS" -2,0,"Slemen, Mr. Richard James","male",35,0,0,"28206",10.5000,,"S",,,"Cornwall" -2,1,"Smith, Miss. Marion Elsie","female",40,0,0,"31418",13.0000,,"S","9",, -2,0,"Sobey, Mr. Samuel James Hayden","male",25,0,0,"C.A. 29178",13.0000,,"S",,,"Cornwall / Houghton, MI" -2,0,"Stanton, Mr. Samuel Ward","male",41,0,0,"237734",15.0458,,"C",,,"New York, NY" -2,0,"Stokes, Mr. Philip Joseph","male",25,0,0,"F.C.C. 13540",10.5000,,"S",,"81","Catford, Kent / Detroit, MI" -2,0,"Swane, Mr. George","male",18.5,0,0,"248734",13.0000,"F","S",,"294", -2,0,"Sweet, Mr. George Frederick","male",14,0,0,"220845",65.0000,,"S",,,"Somerset / Bernardsville, NJ" -2,1,"Toomey, Miss. Ellen","female",50,0,0,"F.C.C. 13531",10.5000,,"S","9",,"Indianapolis, IN" -2,0,"Troupiansky, Mr. Moses Aaron","male",23,0,0,"233639",13.0000,,"S",,, -2,1,"Trout, Mrs. William H (Jessie L)","female",28,0,0,"240929",12.6500,,"S",,,"Columbus, OH" -2,1,"Troutt, Miss. Edwina Celia ""Winnie""","female",27,0,0,"34218",10.5000,"E101","S","16",,"Bath, England / Massachusetts" -2,0,"Turpin, Mr. William John Robert","male",29,1,0,"11668",21.0000,,"S",,,"Plymouth, England" -2,0,"Turpin, Mrs. William John Robert (Dorothy Ann Wonnacott)","female",27,1,0,"11668",21.0000,,"S",,,"Plymouth, England" -2,0,"Veal, Mr. James","male",40,0,0,"28221",13.0000,,"S",,,"Barre, Co Washington, VT" -2,1,"Walcroft, Miss. Nellie","female",31,0,0,"F.C.C. 13528",21.0000,,"S","14",,"Mamaroneck, NY" -2,0,"Ware, Mr. John James","male",30,1,0,"CA 31352",21.0000,,"S",,,"Bristol, England / New Britain, CT" -2,0,"Ware, Mr. William Jeffery","male",23,1,0,"28666",10.5000,,"S",,, -2,1,"Ware, Mrs. John James (Florence Louise Long)","female",31,0,0,"CA 31352",21.0000,,"S","10",,"Bristol, England / New Britain, CT" -2,0,"Watson, Mr. Ennis Hastings","male",,0,0,"239856",0.0000,,"S",,,"Belfast" -2,1,"Watt, Miss. Bertha J","female",12,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" -2,1,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis Milne)","female",40,0,0,"C.A. 33595",15.7500,,"S","9",,"Aberdeen / Portland, OR" -2,1,"Webber, Miss. Susan","female",32.5,0,0,"27267",13.0000,"E101","S","12",,"England / Hartford, CT" -2,0,"Weisz, Mr. Leopold","male",27,1,0,"228414",26.0000,,"S",,"293","Bromsgrove, England / Montreal, PQ" -2,1,"Weisz, Mrs. Leopold (Mathilde Francoise Pede)","female",29,1,0,"228414",26.0000,,"S","10",,"Bromsgrove, England / Montreal, PQ" -2,1,"Wells, Master. Ralph Lester","male",2,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" -2,1,"Wells, Miss. Joan","female",4,1,1,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" -2,1,"Wells, Mrs. Arthur Henry (""Addie"" Dart Trevaskis)","female",29,0,2,"29103",23.0000,,"S","14",,"Cornwall / Akron, OH" -2,1,"West, Miss. Barbara J","female",0.92,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" -2,1,"West, Miss. Constance Mirium","female",5,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" -2,0,"West, Mr. Edwy Arthur","male",36,1,2,"C.A. 34651",27.7500,,"S",,,"Bournmouth, England" -2,1,"West, Mrs. Edwy Arthur (Ada Mary Worth)","female",33,1,2,"C.A. 34651",27.7500,,"S","10",,"Bournmouth, England" -2,0,"Wheadon, Mr. Edward H","male",66,0,0,"C.A. 24579",10.5000,,"S",,,"Guernsey, England / Edgewood, RI" -2,0,"Wheeler, Mr. Edwin ""Frederick""","male",,0,0,"SC/PARIS 2159",12.8750,,"S",,, -2,1,"Wilhelms, Mr. Charles","male",31,0,0,"244270",13.0000,,"S","9",,"London, England" -2,1,"Williams, Mr. Charles Eugene","male",,0,0,"244373",13.0000,,"S","14",,"Harrow, England" -2,1,"Wright, Miss. Marion","female",26,0,0,"220844",13.5000,,"S","9",,"Yoevil, England / Cottage Grove, OR" -2,0,"Yrois, Miss. Henriette (""Mrs Harbeck"")","female",24,0,0,"248747",13.0000,,"S",,,"Paris" -3,0,"Abbing, Mr. Anthony","male",42,0,0,"C.A. 5547",7.5500,,"S",,, -3,0,"Abbott, Master. Eugene Joseph","male",13,0,2,"C.A. 2673",20.2500,,"S",,,"East Providence, RI" -3,0,"Abbott, Mr. Rossmore Edward","male",16,1,1,"C.A. 2673",20.2500,,"S",,"190","East Providence, RI" -3,1,"Abbott, Mrs. Stanton (Rosa Hunt)","female",35,1,1,"C.A. 2673",20.2500,,"S","A",,"East Providence, RI" -3,1,"Abelseth, Miss. Karen Marie","female",16,0,0,"348125",7.6500,,"S","16",,"Norway Los Angeles, CA" -3,1,"Abelseth, Mr. Olaus Jorgensen","male",25,0,0,"348122",7.6500,"F G63","S","A",,"Perkins County, SD" -3,1,"Abrahamsson, Mr. Abraham August Johannes","male",20,0,0,"SOTON/O2 3101284",7.9250,,"S","15",,"Taalintehdas, Finland Hoboken, NJ" -3,1,"Abrahim, Mrs. Joseph (Sophie Halaut Easu)","female",18,0,0,"2657",7.2292,,"C","C",,"Greensburg, PA" -3,0,"Adahl, Mr. Mauritz Nils Martin","male",30,0,0,"C 7076",7.2500,,"S",,"72","Asarum, Sweden Brooklyn, NY" -3,0,"Adams, Mr. John","male",26,0,0,"341826",8.0500,,"S",,"103","Bournemouth, England" -3,0,"Ahlin, Mrs. Johan (Johanna Persdotter Larsson)","female",40,1,0,"7546",9.4750,,"S",,,"Sweden Akeley, MN" -3,1,"Aks, Master. Philip Frank","male",0.83,0,1,"392091",9.3500,,"S","11",,"London, England Norfolk, VA" -3,1,"Aks, Mrs. Sam (Leah Rosen)","female",18,0,1,"392091",9.3500,,"S","13",,"London, England Norfolk, VA" -3,1,"Albimona, Mr. Nassef Cassem","male",26,0,0,"2699",18.7875,,"C","15",,"Syria Fredericksburg, VA" -3,0,"Alexander, Mr. William","male",26,0,0,"3474",7.8875,,"S",,,"England Albion, NY" -3,0,"Alhomaki, Mr. Ilmari Rudolf","male",20,0,0,"SOTON/O2 3101287",7.9250,,"S",,,"Salo, Finland Astoria, OR" -3,0,"Ali, Mr. Ahmed","male",24,0,0,"SOTON/O.Q. 3101311",7.0500,,"S",,, -3,0,"Ali, Mr. William","male",25,0,0,"SOTON/O.Q. 3101312",7.0500,,"S",,"79","Argentina" -3,0,"Allen, Mr. William Henry","male",35,0,0,"373450",8.0500,,"S",,,"Lower Clapton, Middlesex or Erdington, Birmingham" -3,0,"Allum, Mr. Owen George","male",18,0,0,"2223",8.3000,,"S",,"259","Windsor, England New York, NY" -3,0,"Andersen, Mr. Albert Karvin","male",32,0,0,"C 4001",22.5250,,"S",,"260","Bergen, Norway" -3,1,"Andersen-Jensen, Miss. Carla Christine Nielsine","female",19,1,0,"350046",7.8542,,"S","16",, -3,0,"Andersson, Master. Sigvard Harald Elias","male",4,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Miss. Ebba Iris Alfrida","female",6,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Miss. Ellis Anna Maria","female",2,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,1,"Andersson, Miss. Erna Alexandra","female",17,4,2,"3101281",7.9250,,"S","D",,"Ruotsinphyhtaa, Finland New York, NY" -3,0,"Andersson, Miss. Ida Augusta Margareta","female",38,4,2,"347091",7.7750,,"S",,,"Vadsbro, Sweden Ministee, MI" -3,0,"Andersson, Miss. Ingeborg Constanzia","female",9,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Miss. Sigrid Elisabeth","female",11,4,2,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andersson, Mr. Anders Johan","male",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,1,"Andersson, Mr. August Edvard (""Wennerstrom"")","male",27,0,0,"350043",7.7958,,"S","A",, -3,0,"Andersson, Mr. Johan Samuel","male",26,0,0,"347075",7.7750,,"S",,,"Hartford, CT" -3,0,"Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren)","female",39,1,5,"347082",31.2750,,"S",,,"Sweden Winnipeg, MN" -3,0,"Andreasson, Mr. Paul Edvin","male",20,0,0,"347466",7.8542,,"S",,,"Sweden Chicago, IL" -3,0,"Angheloff, Mr. Minko","male",26,0,0,"349202",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Arnold-Franchi, Mr. Josef","male",25,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" -3,0,"Arnold-Franchi, Mrs. Josef (Josefine Franchi)","female",18,1,0,"349237",17.8000,,"S",,,"Altdorf, Switzerland" -3,0,"Aronsson, Mr. Ernst Axel Algot","male",24,0,0,"349911",7.7750,,"S",,,"Sweden Joliet, IL" -3,0,"Asim, Mr. Adola","male",35,0,0,"SOTON/O.Q. 3101310",7.0500,,"S",,, -3,0,"Asplund, Master. Carl Edgar","male",5,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" -3,0,"Asplund, Master. Clarence Gustaf Hugo","male",9,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" -3,1,"Asplund, Master. Edvin Rojj Felix","male",3,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" -3,0,"Asplund, Master. Filip Oscar","male",13,4,2,"347077",31.3875,,"S",,,"Sweden Worcester, MA" -3,1,"Asplund, Miss. Lillian Gertrud","female",5,4,2,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" -3,0,"Asplund, Mr. Carl Oscar Vilhelm Gustafsson","male",40,1,5,"347077",31.3875,,"S",,"142","Sweden Worcester, MA" -3,1,"Asplund, Mr. Johan Charles","male",23,0,0,"350054",7.7958,,"S","13",,"Oskarshamn, Sweden Minneapolis, MN" -3,1,"Asplund, Mrs. Carl Oscar (Selma Augusta Emilia Johansson)","female",38,1,5,"347077",31.3875,,"S","15",,"Sweden Worcester, MA" -3,1,"Assaf Khalil, Mrs. Mariana (""Miriam"")","female",45,0,0,"2696",7.2250,,"C","C",,"Ottawa, ON" -3,0,"Assaf, Mr. Gerios","male",21,0,0,"2692",7.2250,,"C",,,"Ottawa, ON" -3,0,"Assam, Mr. Ali","male",23,0,0,"SOTON/O.Q. 3101309",7.0500,,"S",,, -3,0,"Attalah, Miss. Malake","female",17,0,0,"2627",14.4583,,"C",,, -3,0,"Attalah, Mr. Sleiman","male",30,0,0,"2694",7.2250,,"C",,,"Ottawa, ON" -3,0,"Augustsson, Mr. Albert","male",23,0,0,"347468",7.8542,,"S",,,"Krakoryd, Sweden Bloomington, IL" -3,1,"Ayoub, Miss. Banoura","female",13,0,0,"2687",7.2292,,"C","C",,"Syria Youngstown, OH" -3,0,"Baccos, Mr. Raffull","male",20,0,0,"2679",7.2250,,"C",,, -3,0,"Backstrom, Mr. Karl Alfred","male",32,1,0,"3101278",15.8500,,"S","D",,"Ruotsinphytaa, Finland New York, NY" -3,1,"Backstrom, Mrs. Karl Alfred (Maria Mathilda Gustafsson)","female",33,3,0,"3101278",15.8500,,"S",,,"Ruotsinphytaa, Finland New York, NY" -3,1,"Baclini, Miss. Eugenie","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Baclini, Miss. Helene Barbara","female",0.75,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Baclini, Miss. Marie Catherine","female",5,2,1,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Baclini, Mrs. Solomon (Latifa Qurban)","female",24,0,3,"2666",19.2583,,"C","C",,"Syria New York, NY" -3,1,"Badman, Miss. Emily Louisa","female",18,0,0,"A/4 31416",8.0500,,"S","C",,"London Skanteales, NY" -3,0,"Badt, Mr. Mohamed","male",40,0,0,"2623",7.2250,,"C",,, -3,0,"Balkic, Mr. Cerin","male",26,0,0,"349248",7.8958,,"S",,, -3,1,"Barah, Mr. Hanna Assi","male",20,0,0,"2663",7.2292,,"C","15",, -3,0,"Barbara, Miss. Saiide","female",18,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" -3,0,"Barbara, Mrs. (Catherine David)","female",45,0,1,"2691",14.4542,,"C",,,"Syria Ottawa, ON" -3,0,"Barry, Miss. Julia","female",27,0,0,"330844",7.8792,,"Q",,,"New York, NY" -3,0,"Barton, Mr. David John","male",22,0,0,"324669",8.0500,,"S",,,"England New York, NY" -3,0,"Beavan, Mr. William Thomas","male",19,0,0,"323951",8.0500,,"S",,,"England" -3,0,"Bengtsson, Mr. John Viktor","male",26,0,0,"347068",7.7750,,"S",,,"Krakudden, Sweden Moune, IL" -3,0,"Berglund, Mr. Karl Ivar Sven","male",22,0,0,"PP 4348",9.3500,,"S",,,"Tranvik, Finland New York" -3,0,"Betros, Master. Seman","male",,0,0,"2622",7.2292,,"C",,, -3,0,"Betros, Mr. Tannous","male",20,0,0,"2648",4.0125,,"C",,,"Syria" -3,1,"Bing, Mr. Lee","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" -3,0,"Birkeland, Mr. Hans Martin Monsen","male",21,0,0,"312992",7.7750,,"S",,,"Brennes, Norway New York" -3,0,"Bjorklund, Mr. Ernst Herbert","male",18,0,0,"347090",7.7500,,"S",,,"Stockholm, Sweden New York" -3,0,"Bostandyeff, Mr. Guentcho","male",26,0,0,"349224",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Boulos, Master. Akar","male",6,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" -3,0,"Boulos, Miss. Nourelain","female",9,1,1,"2678",15.2458,,"C",,,"Syria Kent, ON" -3,0,"Boulos, Mr. Hanna","male",,0,0,"2664",7.2250,,"C",,,"Syria" -3,0,"Boulos, Mrs. Joseph (Sultana)","female",,0,2,"2678",15.2458,,"C",,,"Syria Kent, ON" -3,0,"Bourke, Miss. Mary","female",,0,2,"364848",7.7500,,"Q",,,"Ireland Chicago, IL" -3,0,"Bourke, Mr. John","male",40,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" -3,0,"Bourke, Mrs. John (Catherine)","female",32,1,1,"364849",15.5000,,"Q",,,"Ireland Chicago, IL" -3,0,"Bowen, Mr. David John ""Dai""","male",21,0,0,"54636",16.1000,,"S",,,"Treherbert, Cardiff, Wales" -3,1,"Bradley, Miss. Bridget Delia","female",22,0,0,"334914",7.7250,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland Glens Falls, NY" -3,0,"Braf, Miss. Elin Ester Maria","female",20,0,0,"347471",7.8542,,"S",,,"Medeltorp, Sweden Chicago, IL" -3,0,"Braund, Mr. Lewis Richard","male",29,1,0,"3460",7.0458,,"S",,,"Bridgerule, Devon" -3,0,"Braund, Mr. Owen Harris","male",22,1,0,"A/5 21171",7.2500,,"S",,,"Bridgerule, Devon" -3,0,"Brobeck, Mr. Karl Rudolf","male",22,0,0,"350045",7.7958,,"S",,,"Sweden Worcester, MA" -3,0,"Brocklebank, Mr. William Alfred","male",35,0,0,"364512",8.0500,,"S",,,"Broomfield, Chelmsford, England" -3,0,"Buckley, Miss. Katherine","female",18.5,0,0,"329944",7.2833,,"Q",,"299","Co Cork, Ireland Roxbury, MA" -3,1,"Buckley, Mr. Daniel","male",21,0,0,"330920",7.8208,,"Q","13",,"Kingwilliamstown, Co Cork, Ireland New York, NY" -3,0,"Burke, Mr. Jeremiah","male",19,0,0,"365222",6.7500,,"Q",,,"Co Cork, Ireland Charlestown, MA" -3,0,"Burns, Miss. Mary Delia","female",18,0,0,"330963",7.8792,,"Q",,,"Co Sligo, Ireland New York, NY" -3,0,"Cacic, Miss. Manda","female",21,0,0,"315087",8.6625,,"S",,, -3,0,"Cacic, Miss. Marija","female",30,0,0,"315084",8.6625,,"S",,, -3,0,"Cacic, Mr. Jego Grga","male",18,0,0,"315091",8.6625,,"S",,, -3,0,"Cacic, Mr. Luka","male",38,0,0,"315089",8.6625,,"S",,,"Croatia" -3,0,"Calic, Mr. Jovo","male",17,0,0,"315093",8.6625,,"S",,, -3,0,"Calic, Mr. Petar","male",17,0,0,"315086",8.6625,,"S",,, -3,0,"Canavan, Miss. Mary","female",21,0,0,"364846",7.7500,,"Q",,, -3,0,"Canavan, Mr. Patrick","male",21,0,0,"364858",7.7500,,"Q",,,"Ireland Philadelphia, PA" -3,0,"Cann, Mr. Ernest Charles","male",21,0,0,"A./5. 2152",8.0500,,"S",,, -3,0,"Caram, Mr. Joseph","male",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" -3,0,"Caram, Mrs. Joseph (Maria Elias)","female",,1,0,"2689",14.4583,,"C",,,"Ottawa, ON" -3,0,"Carlsson, Mr. August Sigfrid","male",28,0,0,"350042",7.7958,,"S",,,"Dagsas, Sweden Fower, MN" -3,0,"Carlsson, Mr. Carl Robert","male",24,0,0,"350409",7.8542,,"S",,,"Goteborg, Sweden Huntley, IL" -3,1,"Carr, Miss. Helen ""Ellen""","female",16,0,0,"367231",7.7500,,"Q","16",,"Co Longford, Ireland New York, NY" -3,0,"Carr, Miss. Jeannie","female",37,0,0,"368364",7.7500,,"Q",,,"Co Sligo, Ireland Hartford, CT" -3,0,"Carver, Mr. Alfred John","male",28,0,0,"392095",7.2500,,"S",,,"St Denys, Southampton, Hants" -3,0,"Celotti, Mr. Francesco","male",24,0,0,"343275",8.0500,,"S",,,"London" -3,0,"Charters, Mr. David","male",21,0,0,"A/5. 13032",7.7333,,"Q",,,"Ireland New York, NY" -3,1,"Chip, Mr. Chang","male",32,0,0,"1601",56.4958,,"S","C",,"Hong Kong New York, NY" -3,0,"Christmann, Mr. Emil","male",29,0,0,"343276",8.0500,,"S",,, -3,0,"Chronopoulos, Mr. Apostolos","male",26,1,0,"2680",14.4542,,"C",,,"Greece" -3,0,"Chronopoulos, Mr. Demetrios","male",18,1,0,"2680",14.4542,,"C",,,"Greece" -3,0,"Coelho, Mr. Domingos Fernandeo","male",20,0,0,"SOTON/O.Q. 3101307",7.0500,,"S",,,"Portugal" -3,1,"Cohen, Mr. Gurshon ""Gus""","male",18,0,0,"A/5 3540",8.0500,,"S","12",,"London Brooklyn, NY" -3,0,"Colbert, Mr. Patrick","male",24,0,0,"371109",7.2500,,"Q",,,"Co Limerick, Ireland Sherbrooke, PQ" -3,0,"Coleff, Mr. Peju","male",36,0,0,"349210",7.4958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Coleff, Mr. Satio","male",24,0,0,"349209",7.4958,,"S",,, -3,0,"Conlon, Mr. Thomas Henry","male",31,0,0,"21332",7.7333,,"Q",,,"Philadelphia, PA" -3,0,"Connaghton, Mr. Michael","male",31,0,0,"335097",7.7500,,"Q",,,"Ireland Brooklyn, NY" -3,1,"Connolly, Miss. Kate","female",22,0,0,"370373",7.7500,,"Q","13",,"Ireland" -3,0,"Connolly, Miss. Kate","female",30,0,0,"330972",7.6292,,"Q",,,"Ireland" -3,0,"Connors, Mr. Patrick","male",70.5,0,0,"370369",7.7500,,"Q",,"171", -3,0,"Cook, Mr. Jacob","male",43,0,0,"A/5 3536",8.0500,,"S",,, -3,0,"Cor, Mr. Bartol","male",35,0,0,"349230",7.8958,,"S",,,"Austria" -3,0,"Cor, Mr. Ivan","male",27,0,0,"349229",7.8958,,"S",,,"Austria" -3,0,"Cor, Mr. Liudevit","male",19,0,0,"349231",7.8958,,"S",,,"Austria" -3,0,"Corn, Mr. Harry","male",30,0,0,"SOTON/OQ 392090",8.0500,,"S",,,"London" -3,1,"Coutts, Master. Eden Leslie ""Neville""","male",9,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" -3,1,"Coutts, Master. William Loch ""William""","male",3,1,1,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" -3,1,"Coutts, Mrs. William (Winnie ""Minnie"" Treanor)","female",36,0,2,"C.A. 37671",15.9000,,"S","2",,"England Brooklyn, NY" -3,0,"Coxon, Mr. Daniel","male",59,0,0,"364500",7.2500,,"S",,,"Merrill, WI" -3,0,"Crease, Mr. Ernest James","male",19,0,0,"S.P. 3464",8.1583,,"S",,,"Bristol, England Cleveland, OH" -3,1,"Cribb, Miss. Laura Alice","female",17,0,1,"371362",16.1000,,"S","12",,"Bournemouth, England Newark, NJ" -3,0,"Cribb, Mr. John Hatfield","male",44,0,1,"371362",16.1000,,"S",,,"Bournemouth, England Newark, NJ" -3,0,"Culumovic, Mr. Jeso","male",17,0,0,"315090",8.6625,,"S",,,"Austria-Hungary" -3,0,"Daher, Mr. Shedid","male",22.5,0,0,"2698",7.2250,,"C",,"9", -3,1,"Dahl, Mr. Karl Edwart","male",45,0,0,"7598",8.0500,,"S","15",,"Australia Fingal, ND" -3,0,"Dahlberg, Miss. Gerda Ulrika","female",22,0,0,"7552",10.5167,,"S",,,"Norrlot, Sweden Chicago, IL" -3,0,"Dakic, Mr. Branko","male",19,0,0,"349228",10.1708,,"S",,,"Austria" -3,1,"Daly, Miss. Margaret Marcella ""Maggie""","female",30,0,0,"382650",6.9500,,"Q","15",,"Co Athlone, Ireland New York, NY" -3,1,"Daly, Mr. Eugene Patrick","male",29,0,0,"382651",7.7500,,"Q","13 15 B",,"Co Athlone, Ireland New York, NY" -3,0,"Danbom, Master. Gilbert Sigvard Emanuel","male",0.33,0,2,"347080",14.4000,,"S",,,"Stanton, IA" -3,0,"Danbom, Mr. Ernst Gilbert","male",34,1,1,"347080",14.4000,,"S",,"197","Stanton, IA" -3,0,"Danbom, Mrs. Ernst Gilbert (Anna Sigrid Maria Brogren)","female",28,1,1,"347080",14.4000,,"S",,,"Stanton, IA" -3,0,"Danoff, Mr. Yoto","male",27,0,0,"349219",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Dantcheff, Mr. Ristiu","male",25,0,0,"349203",7.8958,,"S",,,"Bulgaria Chicago, IL" -3,0,"Davies, Mr. Alfred J","male",24,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" -3,0,"Davies, Mr. Evan","male",22,0,0,"SC/A4 23568",8.0500,,"S",,, -3,0,"Davies, Mr. John Samuel","male",21,2,0,"A/4 48871",24.1500,,"S",,,"West Bromwich, England Pontiac, MI" -3,0,"Davies, Mr. Joseph","male",17,2,0,"A/4 48873",8.0500,,"S",,,"West Bromwich, England Pontiac, MI" -3,0,"Davison, Mr. Thomas Henry","male",,1,0,"386525",16.1000,,"S",,,"Liverpool, England Bedford, OH" -3,1,"Davison, Mrs. Thomas Henry (Mary E Finck)","female",,1,0,"386525",16.1000,,"S","16",,"Liverpool, England Bedford, OH" -3,1,"de Messemaeker, Mr. Guillaume Joseph","male",36.5,1,0,"345572",17.4000,,"S","15",,"Tampico, MT" -3,1,"de Messemaeker, Mrs. Guillaume Joseph (Emma)","female",36,1,0,"345572",17.4000,,"S","13",,"Tampico, MT" -3,1,"de Mulder, Mr. Theodore","male",30,0,0,"345774",9.5000,,"S","11",,"Belgium Detroit, MI" -3,0,"de Pelsmaeker, Mr. Alfons","male",16,0,0,"345778",9.5000,,"S",,, -3,1,"Dean, Master. Bertram Vere","male",1,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" -3,1,"Dean, Miss. Elizabeth Gladys ""Millvina""","female",0.17,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" -3,0,"Dean, Mr. Bertram Frank","male",26,1,2,"C.A. 2315",20.5750,,"S",,,"Devon, England Wichita, KS" -3,1,"Dean, Mrs. Bertram (Eva Georgetta Light)","female",33,1,2,"C.A. 2315",20.5750,,"S","10",,"Devon, England Wichita, KS" -3,0,"Delalic, Mr. Redjo","male",25,0,0,"349250",7.8958,,"S",,, -3,0,"Demetri, Mr. Marinko","male",,0,0,"349238",7.8958,,"S",,, -3,0,"Denkoff, Mr. Mitto","male",,0,0,"349225",7.8958,,"S",,,"Bulgaria Coon Rapids, IA" -3,0,"Dennis, Mr. Samuel","male",22,0,0,"A/5 21172",7.2500,,"S",,, -3,0,"Dennis, Mr. William","male",36,0,0,"A/5 21175",7.2500,,"S",,, -3,1,"Devaney, Miss. Margaret Delia","female",19,0,0,"330958",7.8792,,"Q","C",,"Kilmacowen, Co Sligo, Ireland New York, NY" -3,0,"Dika, Mr. Mirko","male",17,0,0,"349232",7.8958,,"S",,, -3,0,"Dimic, Mr. Jovan","male",42,0,0,"315088",8.6625,,"S",,, -3,0,"Dintcheff, Mr. Valtcho","male",43,0,0,"349226",7.8958,,"S",,, -3,0,"Doharr, Mr. Tannous","male",,0,0,"2686",7.2292,,"C",,, -3,0,"Dooley, Mr. Patrick","male",32,0,0,"370376",7.7500,,"Q",,,"Ireland New York, NY" -3,1,"Dorking, Mr. Edward Arthur","male",19,0,0,"A/5. 10482",8.0500,,"S","B",,"England Oglesby, IL" -3,1,"Dowdell, Miss. Elizabeth","female",30,0,0,"364516",12.4750,,"S","13",,"Union Hill, NJ" -3,0,"Doyle, Miss. Elizabeth","female",24,0,0,"368702",7.7500,,"Q",,,"Ireland New York, NY" -3,1,"Drapkin, Miss. Jennie","female",23,0,0,"SOTON/OQ 392083",8.0500,,"S",,,"London New York, NY" -3,0,"Drazenoic, Mr. Jozef","male",33,0,0,"349241",7.8958,,"C",,"51","Austria Niagara Falls, NY" -3,0,"Duane, Mr. Frank","male",65,0,0,"336439",7.7500,,"Q",,, -3,1,"Duquemin, Mr. Joseph","male",24,0,0,"S.O./P.P. 752",7.5500,,"S","D",,"England Albion, NY" -3,0,"Dyker, Mr. Adolf Fredrik","male",23,1,0,"347072",13.9000,,"S",,,"West Haven, CT" -3,1,"Dyker, Mrs. Adolf Fredrik (Anna Elisabeth Judith Andersson)","female",22,1,0,"347072",13.9000,,"S","16",,"West Haven, CT" -3,0,"Edvardsson, Mr. Gustaf Hjalmar","male",18,0,0,"349912",7.7750,,"S",,,"Tofta, Sweden Joliet, IL" -3,0,"Eklund, Mr. Hans Linus","male",16,0,0,"347074",7.7750,,"S",,,"Karberg, Sweden Jerome Junction, AZ" -3,0,"Ekstrom, Mr. Johan","male",45,0,0,"347061",6.9750,,"S",,,"Effington Rut, SD" -3,0,"Elias, Mr. Dibo","male",,0,0,"2674",7.2250,,"C",,, -3,0,"Elias, Mr. Joseph","male",39,0,2,"2675",7.2292,,"C",,,"Syria Ottawa, ON" -3,0,"Elias, Mr. Joseph Jr","male",17,1,1,"2690",7.2292,,"C",,, -3,0,"Elias, Mr. Tannous","male",15,1,1,"2695",7.2292,,"C",,,"Syria" -3,0,"Elsbury, Mr. William James","male",47,0,0,"A/5 3902",7.2500,,"S",,,"Illinois, USA" -3,1,"Emanuel, Miss. Virginia Ethel","female",5,0,0,"364516",12.4750,,"S","13",,"New York, NY" -3,0,"Emir, Mr. Farred Chehab","male",,0,0,"2631",7.2250,,"C",,, -3,0,"Everett, Mr. Thomas James","male",40.5,0,0,"C.A. 6212",15.1000,,"S",,"187", -3,0,"Farrell, Mr. James","male",40.5,0,0,"367232",7.7500,,"Q",,"68","Aughnacliff, Co Longford, Ireland New York, NY" -3,1,"Finoli, Mr. Luigi","male",,0,0,"SOTON/O.Q. 3101308",7.0500,,"S","15",,"Italy Philadelphia, PA" -3,0,"Fischer, Mr. Eberhard Thelander","male",18,0,0,"350036",7.7958,,"S",,, -3,0,"Fleming, Miss. Honora","female",,0,0,"364859",7.7500,,"Q",,, -3,0,"Flynn, Mr. James","male",,0,0,"364851",7.7500,,"Q",,, -3,0,"Flynn, Mr. John","male",,0,0,"368323",6.9500,,"Q",,, -3,0,"Foley, Mr. Joseph","male",26,0,0,"330910",7.8792,,"Q",,,"Ireland Chicago, IL" -3,0,"Foley, Mr. William","male",,0,0,"365235",7.7500,,"Q",,,"Ireland" -3,1,"Foo, Mr. Choong","male",,0,0,"1601",56.4958,,"S","13",,"Hong Kong New York, NY" -3,0,"Ford, Miss. Doolina Margaret ""Daisy""","female",21,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Miss. Robina Maggie ""Ruby""","female",9,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Mr. Arthur","male",,0,0,"A/5 1478",8.0500,,"S",,,"Bridgwater, Somerset, England" -3,0,"Ford, Mr. Edward Watson","male",18,2,2,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Mr. William Neal","male",16,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Ford, Mrs. Edward (Margaret Ann Watson)","female",48,1,3,"W./C. 6608",34.3750,,"S",,,"Rotherfield, Sussex, England Essex Co, MA" -3,0,"Fox, Mr. Patrick","male",,0,0,"368573",7.7500,,"Q",,,"Ireland New York, NY" -3,0,"Franklin, Mr. Charles (Charles Fardon)","male",,0,0,"SOTON/O.Q. 3101314",7.2500,,"S",,, -3,0,"Gallagher, Mr. Martin","male",25,0,0,"36864",7.7417,,"Q",,,"New York, NY" -3,0,"Garfirth, Mr. John","male",,0,0,"358585",14.5000,,"S",,, -3,0,"Gheorgheff, Mr. Stanio","male",,0,0,"349254",7.8958,,"C",,, -3,0,"Gilinski, Mr. Eliezer","male",22,0,0,"14973",8.0500,,"S",,"47", -3,1,"Gilnagh, Miss. Katherine ""Katie""","female",16,0,0,"35851",7.7333,,"Q","16",,"Co Longford, Ireland New York, NY" -3,1,"Glynn, Miss. Mary Agatha","female",,0,0,"335677",7.7500,,"Q","13",,"Co Clare, Ireland Washington, DC" -3,1,"Goldsmith, Master. Frank John William ""Frankie""","male",9,0,2,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" -3,0,"Goldsmith, Mr. Frank John","male",33,1,1,"363291",20.5250,,"S",,,"Strood, Kent, England Detroit, MI" -3,0,"Goldsmith, Mr. Nathan","male",41,0,0,"SOTON/O.Q. 3101263",7.8500,,"S",,,"Philadelphia, PA" -3,1,"Goldsmith, Mrs. Frank John (Emily Alice Brown)","female",31,1,1,"363291",20.5250,,"S","C D",,"Strood, Kent, England Detroit, MI" -3,0,"Goncalves, Mr. Manuel Estanslas","male",38,0,0,"SOTON/O.Q. 3101306",7.0500,,"S",,,"Portugal" -3,0,"Goodwin, Master. Harold Victor","male",9,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Master. Sidney Leonard","male",1,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Master. William Frederick","male",11,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Miss. Jessie Allis","female",10,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Miss. Lillian Amy","female",16,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Mr. Charles Edward","male",14,5,2,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Mr. Charles Frederick","male",40,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Goodwin, Mrs. Frederick (Augusta Tyler)","female",43,1,6,"CA 2144",46.9000,,"S",,,"Wiltshire, England Niagara Falls, NY" -3,0,"Green, Mr. George Henry","male",51,0,0,"21440",8.0500,,"S",,,"Dorking, Surrey, England" -3,0,"Gronnestad, Mr. Daniel Danielsen","male",32,0,0,"8471",8.3625,,"S",,,"Foresvik, Norway Portland, ND" -3,0,"Guest, Mr. Robert","male",,0,0,"376563",8.0500,,"S",,, -3,0,"Gustafsson, Mr. Alfred Ossian","male",20,0,0,"7534",9.8458,,"S",,,"Waukegan, Chicago, IL" -3,0,"Gustafsson, Mr. Anders Vilhelm","male",37,2,0,"3101276",7.9250,,"S",,"98","Ruotsinphytaa, Finland New York, NY" -3,0,"Gustafsson, Mr. Johan Birger","male",28,2,0,"3101277",7.9250,,"S",,,"Ruotsinphytaa, Finland New York, NY" -3,0,"Gustafsson, Mr. Karl Gideon","male",19,0,0,"347069",7.7750,,"S",,,"Myren, Sweden New York, NY" -3,0,"Haas, Miss. Aloisia","female",24,0,0,"349236",8.8500,,"S",,, -3,0,"Hagardon, Miss. Kate","female",17,0,0,"AQ/3. 30631",7.7333,,"Q",,, -3,0,"Hagland, Mr. Ingvald Olai Olsen","male",,1,0,"65303",19.9667,,"S",,, -3,0,"Hagland, Mr. Konrad Mathias Reiersen","male",,1,0,"65304",19.9667,,"S",,, -3,0,"Hakkarainen, Mr. Pekka Pietari","male",28,1,0,"STON/O2. 3101279",15.8500,,"S",,, -3,1,"Hakkarainen, Mrs. Pekka Pietari (Elin Matilda Dolck)","female",24,1,0,"STON/O2. 3101279",15.8500,,"S","15",, -3,0,"Hampe, Mr. Leon","male",20,0,0,"345769",9.5000,,"S",,, -3,0,"Hanna, Mr. Mansour","male",23.5,0,0,"2693",7.2292,,"C",,"188", -3,0,"Hansen, Mr. Claus Peter","male",41,2,0,"350026",14.1083,,"S",,, -3,0,"Hansen, Mr. Henrik Juul","male",26,1,0,"350025",7.8542,,"S",,, -3,0,"Hansen, Mr. Henry Damsgaard","male",21,0,0,"350029",7.8542,,"S",,"69", -3,1,"Hansen, Mrs. Claus Peter (Jennie L Howard)","female",45,1,0,"350026",14.1083,,"S","11",, -3,0,"Harknett, Miss. Alice Phoebe","female",,0,0,"W./C. 6609",7.5500,,"S",,, -3,0,"Harmer, Mr. Abraham (David Lishin)","male",25,0,0,"374887",7.2500,,"S","B",, -3,0,"Hart, Mr. Henry","male",,0,0,"394140",6.8583,,"Q",,, -3,0,"Hassan, Mr. Houssein G N","male",11,0,0,"2699",18.7875,,"C",,, -3,1,"Healy, Miss. Hanora ""Nora""","female",,0,0,"370375",7.7500,,"Q","16",, -3,1,"Hedman, Mr. Oskar Arvid","male",27,0,0,"347089",6.9750,,"S","15",, -3,1,"Hee, Mr. Ling","male",,0,0,"1601",56.4958,,"S","C",, -3,0,"Hegarty, Miss. Hanora ""Nora""","female",18,0,0,"365226",6.7500,,"Q",,, -3,1,"Heikkinen, Miss. Laina","female",26,0,0,"STON/O2. 3101282",7.9250,,"S",,, -3,0,"Heininen, Miss. Wendla Maria","female",23,0,0,"STON/O2. 3101290",7.9250,,"S",,, -3,1,"Hellstrom, Miss. Hilda Maria","female",22,0,0,"7548",8.9625,,"S","C",, -3,0,"Hendekovic, Mr. Ignjac","male",28,0,0,"349243",7.8958,,"S",,"306", -3,0,"Henriksson, Miss. Jenny Lovisa","female",28,0,0,"347086",7.7750,,"S",,, -3,0,"Henry, Miss. Delia","female",,0,0,"382649",7.7500,,"Q",,, -3,1,"Hirvonen, Miss. Hildur E","female",2,0,1,"3101298",12.2875,,"S","15",, -3,1,"Hirvonen, Mrs. Alexander (Helga E Lindqvist)","female",22,1,1,"3101298",12.2875,,"S","15",, -3,0,"Holm, Mr. John Fredrik Alexander","male",43,0,0,"C 7075",6.4500,,"S",,, -3,0,"Holthen, Mr. Johan Martin","male",28,0,0,"C 4001",22.5250,,"S",,, -3,1,"Honkanen, Miss. Eliina","female",27,0,0,"STON/O2. 3101283",7.9250,,"S",,, -3,0,"Horgan, Mr. John","male",,0,0,"370377",7.7500,,"Q",,, -3,1,"Howard, Miss. May Elizabeth","female",,0,0,"A. 2. 39186",8.0500,,"S","C",, -3,0,"Humblen, Mr. Adolf Mathias Nicolai Olsen","male",42,0,0,"348121",7.6500,"F G63","S",,"120", -3,1,"Hyman, Mr. Abraham","male",,0,0,"3470",7.8875,,"S","C",, -3,0,"Ibrahim Shawah, Mr. Yousseff","male",30,0,0,"2685",7.2292,,"C",,, -3,0,"Ilieff, Mr. Ylio","male",,0,0,"349220",7.8958,,"S",,, -3,0,"Ilmakangas, Miss. Ida Livija","female",27,1,0,"STON/O2. 3101270",7.9250,,"S",,, -3,0,"Ilmakangas, Miss. Pieta Sofia","female",25,1,0,"STON/O2. 3101271",7.9250,,"S",,, -3,0,"Ivanoff, Mr. Kanio","male",,0,0,"349201",7.8958,,"S",,, -3,1,"Jalsevac, Mr. Ivan","male",29,0,0,"349240",7.8958,,"C","15",, -3,1,"Jansson, Mr. Carl Olof","male",21,0,0,"350034",7.7958,,"S","A",, -3,0,"Jardin, Mr. Jose Neto","male",,0,0,"SOTON/O.Q. 3101305",7.0500,,"S",,, -3,0,"Jensen, Mr. Hans Peder","male",20,0,0,"350050",7.8542,,"S",,, -3,0,"Jensen, Mr. Niels Peder","male",48,0,0,"350047",7.8542,,"S",,, -3,0,"Jensen, Mr. Svend Lauritz","male",17,1,0,"350048",7.0542,,"S",,, -3,1,"Jermyn, Miss. Annie","female",,0,0,"14313",7.7500,,"Q","D",, -3,1,"Johannesen-Bratthammer, Mr. Bernt","male",,0,0,"65306",8.1125,,"S","13",, -3,0,"Johanson, Mr. Jakob Alfred","male",34,0,0,"3101264",6.4958,,"S",,"143", -3,1,"Johansson Palmquist, Mr. Oskar Leander","male",26,0,0,"347070",7.7750,,"S","15",, -3,0,"Johansson, Mr. Erik","male",22,0,0,"350052",7.7958,,"S",,"156", -3,0,"Johansson, Mr. Gustaf Joel","male",33,0,0,"7540",8.6542,,"S",,"285", -3,0,"Johansson, Mr. Karl Johan","male",31,0,0,"347063",7.7750,,"S",,, -3,0,"Johansson, Mr. Nils","male",29,0,0,"347467",7.8542,,"S",,, -3,1,"Johnson, Master. Harold Theodor","male",4,1,1,"347742",11.1333,,"S","15",, -3,1,"Johnson, Miss. Eleanor Ileen","female",1,1,1,"347742",11.1333,,"S","15",, -3,0,"Johnson, Mr. Alfred","male",49,0,0,"LINE",0.0000,,"S",,, -3,0,"Johnson, Mr. Malkolm Joackim","male",33,0,0,"347062",7.7750,,"S",,"37", -3,0,"Johnson, Mr. William Cahoone Jr","male",19,0,0,"LINE",0.0000,,"S",,, -3,1,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)","female",27,0,2,"347742",11.1333,,"S","15",, -3,0,"Johnston, Master. William Arthur ""Willie""","male",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Johnston, Miss. Catherine Helen ""Carrie""","female",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Johnston, Mr. Andrew G","male",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Johnston, Mrs. Andrew G (Elizabeth ""Lily"" Watson)","female",,1,2,"W./C. 6607",23.4500,,"S",,, -3,0,"Jonkoff, Mr. Lalio","male",23,0,0,"349204",7.8958,,"S",,, -3,1,"Jonsson, Mr. Carl","male",32,0,0,"350417",7.8542,,"S","15",, -3,0,"Jonsson, Mr. Nils Hilding","male",27,0,0,"350408",7.8542,,"S",,, -3,0,"Jussila, Miss. Katriina","female",20,1,0,"4136",9.8250,,"S",,, -3,0,"Jussila, Miss. Mari Aina","female",21,1,0,"4137",9.8250,,"S",,, -3,1,"Jussila, Mr. Eiriik","male",32,0,0,"STON/O 2. 3101286",7.9250,,"S","15",, -3,0,"Kallio, Mr. Nikolai Erland","male",17,0,0,"STON/O 2. 3101274",7.1250,,"S",,, -3,0,"Kalvik, Mr. Johannes Halvorsen","male",21,0,0,"8475",8.4333,,"S",,, -3,0,"Karaic, Mr. Milan","male",30,0,0,"349246",7.8958,,"S",,, -3,1,"Karlsson, Mr. Einar Gervasius","male",21,0,0,"350053",7.7958,,"S","13",, -3,0,"Karlsson, Mr. Julius Konrad Eugen","male",33,0,0,"347465",7.8542,,"S",,, -3,0,"Karlsson, Mr. Nils August","male",22,0,0,"350060",7.5208,,"S",,, -3,1,"Karun, Miss. Manca","female",4,0,1,"349256",13.4167,,"C","15",, -3,1,"Karun, Mr. Franz","male",39,0,1,"349256",13.4167,,"C","15",, -3,0,"Kassem, Mr. Fared","male",,0,0,"2700",7.2292,,"C",,, -3,0,"Katavelas, Mr. Vassilios (""Catavelas Vassilios"")","male",18.5,0,0,"2682",7.2292,,"C",,"58", -3,0,"Keane, Mr. Andrew ""Andy""","male",,0,0,"12460",7.7500,,"Q",,, -3,0,"Keefe, Mr. Arthur","male",,0,0,"323592",7.2500,,"S","A",, -3,1,"Kelly, Miss. Anna Katherine ""Annie Kate""","female",,0,0,"9234",7.7500,,"Q","16",, -3,1,"Kelly, Miss. Mary","female",,0,0,"14312",7.7500,,"Q","D",, -3,0,"Kelly, Mr. James","male",34.5,0,0,"330911",7.8292,,"Q",,"70", -3,0,"Kelly, Mr. James","male",44,0,0,"363592",8.0500,,"S",,, -3,1,"Kennedy, Mr. John","male",,0,0,"368783",7.7500,,"Q",,, -3,0,"Khalil, Mr. Betros","male",,1,0,"2660",14.4542,,"C",,, -3,0,"Khalil, Mrs. Betros (Zahie ""Maria"" Elias)","female",,1,0,"2660",14.4542,,"C",,, -3,0,"Kiernan, Mr. John","male",,1,0,"367227",7.7500,,"Q",,, -3,0,"Kiernan, Mr. Philip","male",,1,0,"367229",7.7500,,"Q",,, -3,0,"Kilgannon, Mr. Thomas J","male",,0,0,"36865",7.7375,,"Q",,, -3,0,"Kink, Miss. Maria","female",22,2,0,"315152",8.6625,,"S",,, -3,0,"Kink, Mr. Vincenz","male",26,2,0,"315151",8.6625,,"S",,, -3,1,"Kink-Heilmann, Miss. Luise Gretchen","female",4,0,2,"315153",22.0250,,"S","2",, -3,1,"Kink-Heilmann, Mr. Anton","male",29,3,1,"315153",22.0250,,"S","2",, -3,1,"Kink-Heilmann, Mrs. Anton (Luise Heilmann)","female",26,1,1,"315153",22.0250,,"S","2",, -3,0,"Klasen, Miss. Gertrud Emilia","female",1,1,1,"350405",12.1833,,"S",,, -3,0,"Klasen, Mr. Klas Albin","male",18,1,1,"350404",7.8542,,"S",,, -3,0,"Klasen, Mrs. (Hulda Kristina Eugenia Lofqvist)","female",36,0,2,"350405",12.1833,,"S",,, -3,0,"Kraeff, Mr. Theodor","male",,0,0,"349253",7.8958,,"C",,, -3,1,"Krekorian, Mr. Neshan","male",25,0,0,"2654",7.2292,"F E57","C","10",, -3,0,"Lahoud, Mr. Sarkis","male",,0,0,"2624",7.2250,,"C",,, -3,0,"Laitinen, Miss. Kristina Sofia","female",37,0,0,"4135",9.5875,,"S",,, -3,0,"Laleff, Mr. Kristo","male",,0,0,"349217",7.8958,,"S",,, -3,1,"Lam, Mr. Ali","male",,0,0,"1601",56.4958,,"S","C",, -3,0,"Lam, Mr. Len","male",,0,0,"1601",56.4958,,"S",,, -3,1,"Landergren, Miss. Aurora Adelia","female",22,0,0,"C 7077",7.2500,,"S","13",, -3,0,"Lane, Mr. Patrick","male",,0,0,"7935",7.7500,,"Q",,, -3,1,"Lang, Mr. Fang","male",26,0,0,"1601",56.4958,,"S","14",, -3,0,"Larsson, Mr. August Viktor","male",29,0,0,"7545",9.4833,,"S",,, -3,0,"Larsson, Mr. Bengt Edvin","male",29,0,0,"347067",7.7750,,"S",,, -3,0,"Larsson-Rondberg, Mr. Edvard A","male",22,0,0,"347065",7.7750,,"S",,, -3,1,"Leeni, Mr. Fahim (""Philip Zenni"")","male",22,0,0,"2620",7.2250,,"C","6",, -3,0,"Lefebre, Master. Henry Forbes","male",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Miss. Ida","female",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Miss. Jeannie","female",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Miss. Mathilde","female",,3,1,"4133",25.4667,,"S",,, -3,0,"Lefebre, Mrs. Frank (Frances)","female",,0,4,"4133",25.4667,,"S",,, -3,0,"Leinonen, Mr. Antti Gustaf","male",32,0,0,"STON/O 2. 3101292",7.9250,,"S",,, -3,0,"Lemberopolous, Mr. Peter L","male",34.5,0,0,"2683",6.4375,,"C",,"196", -3,0,"Lennon, Miss. Mary","female",,1,0,"370371",15.5000,,"Q",,, -3,0,"Lennon, Mr. Denis","male",,1,0,"370371",15.5000,,"Q",,, -3,0,"Leonard, Mr. Lionel","male",36,0,0,"LINE",0.0000,,"S",,, -3,0,"Lester, Mr. James","male",39,0,0,"A/4 48871",24.1500,,"S",,, -3,0,"Lievens, Mr. Rene Aime","male",24,0,0,"345781",9.5000,,"S",,, -3,0,"Lindahl, Miss. Agda Thorilda Viktoria","female",25,0,0,"347071",7.7750,,"S",,, -3,0,"Lindblom, Miss. Augusta Charlotta","female",45,0,0,"347073",7.7500,,"S",,, -3,0,"Lindell, Mr. Edvard Bengtsson","male",36,1,0,"349910",15.5500,,"S","A",, -3,0,"Lindell, Mrs. Edvard Bengtsson (Elin Gerda Persson)","female",30,1,0,"349910",15.5500,,"S","A",, -3,1,"Lindqvist, Mr. Eino William","male",20,1,0,"STON/O 2. 3101285",7.9250,,"S","15",, -3,0,"Linehan, Mr. Michael","male",,0,0,"330971",7.8792,,"Q",,, -3,0,"Ling, Mr. Lee","male",28,0,0,"1601",56.4958,,"S",,, -3,0,"Lithman, Mr. Simon","male",,0,0,"S.O./P.P. 251",7.5500,,"S",,, -3,0,"Lobb, Mr. William Arthur","male",30,1,0,"A/5. 3336",16.1000,,"S",,, -3,0,"Lobb, Mrs. William Arthur (Cordelia K Stanlick)","female",26,1,0,"A/5. 3336",16.1000,,"S",,, -3,0,"Lockyer, Mr. Edward","male",,0,0,"1222",7.8792,,"S",,"153", -3,0,"Lovell, Mr. John Hall (""Henry"")","male",20.5,0,0,"A/5 21173",7.2500,,"S",,, -3,1,"Lulic, Mr. Nikola","male",27,0,0,"315098",8.6625,,"S","15",, -3,0,"Lundahl, Mr. Johan Svensson","male",51,0,0,"347743",7.0542,,"S",,, -3,1,"Lundin, Miss. Olga Elida","female",23,0,0,"347469",7.8542,,"S","10",, -3,1,"Lundstrom, Mr. Thure Edvin","male",32,0,0,"350403",7.5792,,"S","15",, -3,0,"Lyntakoff, Mr. Stanko","male",,0,0,"349235",7.8958,,"S",,, -3,0,"MacKay, Mr. George William","male",,0,0,"C.A. 42795",7.5500,,"S",,, -3,1,"Madigan, Miss. Margaret ""Maggie""","female",,0,0,"370370",7.7500,,"Q","15",, -3,1,"Madsen, Mr. Fridtjof Arne","male",24,0,0,"C 17369",7.1417,,"S","13",, -3,0,"Maenpaa, Mr. Matti Alexanteri","male",22,0,0,"STON/O 2. 3101275",7.1250,,"S",,, -3,0,"Mahon, Miss. Bridget Delia","female",,0,0,"330924",7.8792,,"Q",,, -3,0,"Mahon, Mr. John","male",,0,0,"AQ/4 3130",7.7500,,"Q",,, -3,0,"Maisner, Mr. Simon","male",,0,0,"A/S 2816",8.0500,,"S",,, -3,0,"Makinen, Mr. Kalle Edvard","male",29,0,0,"STON/O 2. 3101268",7.9250,,"S",,, -3,1,"Mamee, Mr. Hanna","male",,0,0,"2677",7.2292,,"C","15",, -3,0,"Mangan, Miss. Mary","female",30.5,0,0,"364850",7.7500,,"Q",,"61", -3,1,"Mannion, Miss. Margareth","female",,0,0,"36866",7.7375,,"Q","16",, -3,0,"Mardirosian, Mr. Sarkis","male",,0,0,"2655",7.2292,"F E46","C",,, -3,0,"Markoff, Mr. Marin","male",35,0,0,"349213",7.8958,,"C",,, -3,0,"Markun, Mr. Johann","male",33,0,0,"349257",7.8958,,"S",,, -3,1,"Masselmani, Mrs. Fatima","female",,0,0,"2649",7.2250,,"C","C",, -3,0,"Matinoff, Mr. Nicola","male",,0,0,"349255",7.8958,,"C",,, -3,1,"McCarthy, Miss. Catherine ""Katie""","female",,0,0,"383123",7.7500,,"Q","15 16",, -3,1,"McCormack, Mr. Thomas Joseph","male",,0,0,"367228",7.7500,,"Q",,, -3,1,"McCoy, Miss. Agnes","female",,2,0,"367226",23.2500,,"Q","16",, -3,1,"McCoy, Miss. Alicia","female",,2,0,"367226",23.2500,,"Q","16",, -3,1,"McCoy, Mr. Bernard","male",,2,0,"367226",23.2500,,"Q","16",, -3,1,"McDermott, Miss. Brigdet Delia","female",,0,0,"330932",7.7875,,"Q","13",, -3,0,"McEvoy, Mr. Michael","male",,0,0,"36568",15.5000,,"Q",,, -3,1,"McGovern, Miss. Mary","female",,0,0,"330931",7.8792,,"Q","13",, -3,1,"McGowan, Miss. Anna ""Annie""","female",15,0,0,"330923",8.0292,,"Q",,, -3,0,"McGowan, Miss. Katherine","female",35,0,0,"9232",7.7500,,"Q",,, -3,0,"McMahon, Mr. Martin","male",,0,0,"370372",7.7500,,"Q",,, -3,0,"McNamee, Mr. Neal","male",24,1,0,"376566",16.1000,,"S",,, -3,0,"McNamee, Mrs. Neal (Eileen O'Leary)","female",19,1,0,"376566",16.1000,,"S",,"53", -3,0,"McNeill, Miss. Bridget","female",,0,0,"370368",7.7500,,"Q",,, -3,0,"Meanwell, Miss. (Marion Ogden)","female",,0,0,"SOTON/O.Q. 392087",8.0500,,"S",,, -3,0,"Meek, Mrs. Thomas (Annie Louise Rowley)","female",,0,0,"343095",8.0500,,"S",,, -3,0,"Meo, Mr. Alfonzo","male",55.5,0,0,"A.5. 11206",8.0500,,"S",,"201", -3,0,"Mernagh, Mr. Robert","male",,0,0,"368703",7.7500,,"Q",,, -3,1,"Midtsjo, Mr. Karl Albert","male",21,0,0,"345501",7.7750,,"S","15",, -3,0,"Miles, Mr. Frank","male",,0,0,"359306",8.0500,,"S",,, -3,0,"Mineff, Mr. Ivan","male",24,0,0,"349233",7.8958,,"S",,, -3,0,"Minkoff, Mr. Lazar","male",21,0,0,"349211",7.8958,,"S",,, -3,0,"Mionoff, Mr. Stoytcho","male",28,0,0,"349207",7.8958,,"S",,, -3,0,"Mitkoff, Mr. Mito","male",,0,0,"349221",7.8958,,"S",,, -3,1,"Mockler, Miss. Helen Mary ""Ellie""","female",,0,0,"330980",7.8792,,"Q","16",, -3,0,"Moen, Mr. Sigurd Hansen","male",25,0,0,"348123",7.6500,"F G73","S",,"309", -3,1,"Moor, Master. Meier","male",6,0,1,"392096",12.4750,"E121","S","14",, -3,1,"Moor, Mrs. (Beila)","female",27,0,1,"392096",12.4750,"E121","S","14",, -3,0,"Moore, Mr. Leonard Charles","male",,0,0,"A4. 54510",8.0500,,"S",,, -3,1,"Moran, Miss. Bertha","female",,1,0,"371110",24.1500,,"Q","16",, -3,0,"Moran, Mr. Daniel J","male",,1,0,"371110",24.1500,,"Q",,, -3,0,"Moran, Mr. James","male",,0,0,"330877",8.4583,,"Q",,, -3,0,"Morley, Mr. William","male",34,0,0,"364506",8.0500,,"S",,, -3,0,"Morrow, Mr. Thomas Rowan","male",,0,0,"372622",7.7500,,"Q",,, -3,1,"Moss, Mr. Albert Johan","male",,0,0,"312991",7.7750,,"S","B",, -3,1,"Moubarek, Master. Gerios","male",,1,1,"2661",15.2458,,"C","C",, -3,1,"Moubarek, Master. Halim Gonios (""William George"")","male",,1,1,"2661",15.2458,,"C","C",, -3,1,"Moubarek, Mrs. George (Omine ""Amenia"" Alexander)","female",,0,2,"2661",15.2458,,"C","C",, -3,1,"Moussa, Mrs. (Mantoura Boulos)","female",,0,0,"2626",7.2292,,"C",,, -3,0,"Moutal, Mr. Rahamin Haim","male",,0,0,"374746",8.0500,,"S",,, -3,1,"Mullens, Miss. Katherine ""Katie""","female",,0,0,"35852",7.7333,,"Q","16",, -3,1,"Mulvihill, Miss. Bertha E","female",24,0,0,"382653",7.7500,,"Q","15",, -3,0,"Murdlin, Mr. Joseph","male",,0,0,"A./5. 3235",8.0500,,"S",,, -3,1,"Murphy, Miss. Katherine ""Kate""","female",,1,0,"367230",15.5000,,"Q","16",, -3,1,"Murphy, Miss. Margaret Jane","female",,1,0,"367230",15.5000,,"Q","16",, -3,1,"Murphy, Miss. Nora","female",,0,0,"36568",15.5000,,"Q","16",, -3,0,"Myhrman, Mr. Pehr Fabian Oliver Malkolm","male",18,0,0,"347078",7.7500,,"S",,, -3,0,"Naidenoff, Mr. Penko","male",22,0,0,"349206",7.8958,,"S",,, -3,1,"Najib, Miss. Adele Kiamie ""Jane""","female",15,0,0,"2667",7.2250,,"C","C",, -3,1,"Nakid, Miss. Maria (""Mary"")","female",1,0,2,"2653",15.7417,,"C","C",, -3,1,"Nakid, Mr. Sahid","male",20,1,1,"2653",15.7417,,"C","C",, -3,1,"Nakid, Mrs. Said (Waika ""Mary"" Mowad)","female",19,1,1,"2653",15.7417,,"C","C",, -3,0,"Nancarrow, Mr. William Henry","male",33,0,0,"A./5. 3338",8.0500,,"S",,, -3,0,"Nankoff, Mr. Minko","male",,0,0,"349218",7.8958,,"S",,, -3,0,"Nasr, Mr. Mustafa","male",,0,0,"2652",7.2292,,"C",,, -3,0,"Naughton, Miss. Hannah","female",,0,0,"365237",7.7500,,"Q",,, -3,0,"Nenkoff, Mr. Christo","male",,0,0,"349234",7.8958,,"S",,, -3,1,"Nicola-Yarred, Master. Elias","male",12,1,0,"2651",11.2417,,"C","C",, -3,1,"Nicola-Yarred, Miss. Jamila","female",14,1,0,"2651",11.2417,,"C","C",, -3,0,"Nieminen, Miss. Manta Josefina","female",29,0,0,"3101297",7.9250,,"S",,, -3,0,"Niklasson, Mr. Samuel","male",28,0,0,"363611",8.0500,,"S",,, -3,1,"Nilsson, Miss. Berta Olivia","female",18,0,0,"347066",7.7750,,"S","D",, -3,1,"Nilsson, Miss. Helmina Josefina","female",26,0,0,"347470",7.8542,,"S","13",, -3,0,"Nilsson, Mr. August Ferdinand","male",21,0,0,"350410",7.8542,,"S",,, -3,0,"Nirva, Mr. Iisakki Antino Aijo","male",41,0,0,"SOTON/O2 3101272",7.1250,,"S",,,"Finland Sudbury, ON" -3,1,"Niskanen, Mr. Juha","male",39,0,0,"STON/O 2. 3101289",7.9250,,"S","9",, -3,0,"Nosworthy, Mr. Richard Cater","male",21,0,0,"A/4. 39886",7.8000,,"S",,, -3,0,"Novel, Mr. Mansouer","male",28.5,0,0,"2697",7.2292,,"C",,"181", -3,1,"Nysten, Miss. Anna Sofia","female",22,0,0,"347081",7.7500,,"S","13",, -3,0,"Nysveen, Mr. Johan Hansen","male",61,0,0,"345364",6.2375,,"S",,, -3,0,"O'Brien, Mr. Thomas","male",,1,0,"370365",15.5000,,"Q",,, -3,0,"O'Brien, Mr. Timothy","male",,0,0,"330979",7.8292,,"Q",,, -3,1,"O'Brien, Mrs. Thomas (Johanna ""Hannah"" Godfrey)","female",,1,0,"370365",15.5000,,"Q",,, -3,0,"O'Connell, Mr. Patrick D","male",,0,0,"334912",7.7333,,"Q",,, -3,0,"O'Connor, Mr. Maurice","male",,0,0,"371060",7.7500,,"Q",,, -3,0,"O'Connor, Mr. Patrick","male",,0,0,"366713",7.7500,,"Q",,, -3,0,"Odahl, Mr. Nils Martin","male",23,0,0,"7267",9.2250,,"S",,, -3,0,"O'Donoghue, Ms. Bridget","female",,0,0,"364856",7.7500,,"Q",,, -3,1,"O'Driscoll, Miss. Bridget","female",,0,0,"14311",7.7500,,"Q","D",, -3,1,"O'Dwyer, Miss. Ellen ""Nellie""","female",,0,0,"330959",7.8792,,"Q",,, -3,1,"Ohman, Miss. Velin","female",22,0,0,"347085",7.7750,,"S","C",, -3,1,"O'Keefe, Mr. Patrick","male",,0,0,"368402",7.7500,,"Q","B",, -3,1,"O'Leary, Miss. Hanora ""Norah""","female",,0,0,"330919",7.8292,,"Q","13",, -3,1,"Olsen, Master. Artur Karl","male",9,0,1,"C 17368",3.1708,,"S","13",, -3,0,"Olsen, Mr. Henry Margido","male",28,0,0,"C 4001",22.5250,,"S",,"173", -3,0,"Olsen, Mr. Karl Siegwart Andreas","male",42,0,1,"4579",8.4042,,"S",,, -3,0,"Olsen, Mr. Ole Martin","male",,0,0,"Fa 265302",7.3125,,"S",,, -3,0,"Olsson, Miss. Elina","female",31,0,0,"350407",7.8542,,"S",,, -3,0,"Olsson, Mr. Nils Johan Goransson","male",28,0,0,"347464",7.8542,,"S",,, -3,1,"Olsson, Mr. Oscar Wilhelm","male",32,0,0,"347079",7.7750,,"S","A",, -3,0,"Olsvigen, Mr. Thor Anderson","male",20,0,0,"6563",9.2250,,"S",,"89","Oslo, Norway Cameron, WI" -3,0,"Oreskovic, Miss. Jelka","female",23,0,0,"315085",8.6625,,"S",,, -3,0,"Oreskovic, Miss. Marija","female",20,0,0,"315096",8.6625,,"S",,, -3,0,"Oreskovic, Mr. Luka","male",20,0,0,"315094",8.6625,,"S",,, -3,0,"Osen, Mr. Olaf Elon","male",16,0,0,"7534",9.2167,,"S",,, -3,1,"Osman, Mrs. Mara","female",31,0,0,"349244",8.6833,,"S",,, -3,0,"O'Sullivan, Miss. Bridget Mary","female",,0,0,"330909",7.6292,,"Q",,, -3,0,"Palsson, Master. Gosta Leonard","male",2,3,1,"349909",21.0750,,"S",,"4", -3,0,"Palsson, Master. Paul Folke","male",6,3,1,"349909",21.0750,,"S",,, -3,0,"Palsson, Miss. Stina Viola","female",3,3,1,"349909",21.0750,,"S",,, -3,0,"Palsson, Miss. Torborg Danira","female",8,3,1,"349909",21.0750,,"S",,, -3,0,"Palsson, Mrs. Nils (Alma Cornelia Berglund)","female",29,0,4,"349909",21.0750,,"S",,"206", -3,0,"Panula, Master. Eino Viljami","male",1,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Master. Juha Niilo","male",7,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Master. Urho Abraham","male",2,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Mr. Ernesti Arvid","male",16,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Mr. Jaako Arnold","male",14,4,1,"3101295",39.6875,,"S",,, -3,0,"Panula, Mrs. Juha (Maria Emilia Ojala)","female",41,0,5,"3101295",39.6875,,"S",,, -3,0,"Pasic, Mr. Jakob","male",21,0,0,"315097",8.6625,,"S",,, -3,0,"Patchett, Mr. George","male",19,0,0,"358585",14.5000,,"S",,, -3,0,"Paulner, Mr. Uscher","male",,0,0,"3411",8.7125,,"C",,, -3,0,"Pavlovic, Mr. Stefo","male",32,0,0,"349242",7.8958,,"S",,, -3,0,"Peacock, Master. Alfred Edward","male",0.75,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, -3,0,"Peacock, Miss. Treasteall","female",3,1,1,"SOTON/O.Q. 3101315",13.7750,,"S",,, -3,0,"Peacock, Mrs. Benjamin (Edith Nile)","female",26,0,2,"SOTON/O.Q. 3101315",13.7750,,"S",,, -3,0,"Pearce, Mr. Ernest","male",,0,0,"343271",7.0000,,"S",,, -3,0,"Pedersen, Mr. Olaf","male",,0,0,"345498",7.7750,,"S",,, -3,0,"Peduzzi, Mr. Joseph","male",,0,0,"A/5 2817",8.0500,,"S",,, -3,0,"Pekoniemi, Mr. Edvard","male",21,0,0,"STON/O 2. 3101294",7.9250,,"S",,, -3,0,"Peltomaki, Mr. Nikolai Johannes","male",25,0,0,"STON/O 2. 3101291",7.9250,,"S",,, -3,0,"Perkin, Mr. John Henry","male",22,0,0,"A/5 21174",7.2500,,"S",,, -3,1,"Persson, Mr. Ernst Ulrik","male",25,1,0,"347083",7.7750,,"S","15",, -3,1,"Peter, Master. Michael J","male",,1,1,"2668",22.3583,,"C","C",, -3,1,"Peter, Miss. Anna","female",,1,1,"2668",22.3583,"F E69","C","D",, -3,1,"Peter, Mrs. Catherine (Catherine Rizk)","female",,0,2,"2668",22.3583,,"C","D",, -3,0,"Peters, Miss. Katie","female",,0,0,"330935",8.1375,,"Q",,, -3,0,"Petersen, Mr. Marius","male",24,0,0,"342441",8.0500,,"S",,, -3,0,"Petranec, Miss. Matilda","female",28,0,0,"349245",7.8958,,"S",,, -3,0,"Petroff, Mr. Nedelio","male",19,0,0,"349212",7.8958,,"S",,, -3,0,"Petroff, Mr. Pastcho (""Pentcho"")","male",,0,0,"349215",7.8958,,"S",,, -3,0,"Petterson, Mr. Johan Emil","male",25,1,0,"347076",7.7750,,"S",,, -3,0,"Pettersson, Miss. Ellen Natalia","female",18,0,0,"347087",7.7750,,"S",,, -3,1,"Pickard, Mr. Berk (Berk Trembisky)","male",32,0,0,"SOTON/O.Q. 392078",8.0500,"E10","S","9",, -3,0,"Plotcharsky, Mr. Vasil","male",,0,0,"349227",7.8958,,"S",,, -3,0,"Pokrnic, Mr. Mate","male",17,0,0,"315095",8.6625,,"S",,, -3,0,"Pokrnic, Mr. Tome","male",24,0,0,"315092",8.6625,,"S",,, -3,0,"Radeff, Mr. Alexander","male",,0,0,"349223",7.8958,,"S",,, -3,0,"Rasmussen, Mrs. (Lena Jacobsen Solvang)","female",,0,0,"65305",8.1125,,"S",,, -3,0,"Razi, Mr. Raihed","male",,0,0,"2629",7.2292,,"C",,, -3,0,"Reed, Mr. James George","male",,0,0,"362316",7.2500,,"S",,, -3,0,"Rekic, Mr. Tido","male",38,0,0,"349249",7.8958,,"S",,, -3,0,"Reynolds, Mr. Harold J","male",21,0,0,"342684",8.0500,,"S",,, -3,0,"Rice, Master. Albert","male",10,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. Arthur","male",4,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. Eric","male",7,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. Eugene","male",2,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Master. George Hugh","male",8,4,1,"382652",29.1250,,"Q",,, -3,0,"Rice, Mrs. William (Margaret Norton)","female",39,0,5,"382652",29.1250,,"Q",,"327", -3,0,"Riihivouri, Miss. Susanna Juhantytar ""Sanni""","female",22,0,0,"3101295",39.6875,,"S",,, -3,0,"Rintamaki, Mr. Matti","male",35,0,0,"STON/O 2. 3101273",7.1250,,"S",,, -3,1,"Riordan, Miss. Johanna ""Hannah""","female",,0,0,"334915",7.7208,,"Q","13",, -3,0,"Risien, Mr. Samuel Beard","male",,0,0,"364498",14.5000,,"S",,, -3,0,"Risien, Mrs. Samuel (Emma)","female",,0,0,"364498",14.5000,,"S",,, -3,0,"Robins, Mr. Alexander A","male",50,1,0,"A/5. 3337",14.5000,,"S",,"119", -3,0,"Robins, Mrs. Alexander A (Grace Charity Laury)","female",47,1,0,"A/5. 3337",14.5000,,"S",,"7", -3,0,"Rogers, Mr. William John","male",,0,0,"S.C./A.4. 23567",8.0500,,"S",,, -3,0,"Rommetvedt, Mr. Knud Paust","male",,0,0,"312993",7.7750,,"S",,, -3,0,"Rosblom, Miss. Salli Helena","female",2,1,1,"370129",20.2125,,"S",,, -3,0,"Rosblom, Mr. Viktor Richard","male",18,1,1,"370129",20.2125,,"S",,, -3,0,"Rosblom, Mrs. Viktor (Helena Wilhelmina)","female",41,0,2,"370129",20.2125,,"S",,, -3,1,"Roth, Miss. Sarah A","female",,0,0,"342712",8.0500,,"S","C",, -3,0,"Rouse, Mr. Richard Henry","male",50,0,0,"A/5 3594",8.0500,,"S",,, -3,0,"Rush, Mr. Alfred George John","male",16,0,0,"A/4. 20589",8.0500,,"S",,, -3,1,"Ryan, Mr. Edward","male",,0,0,"383162",7.7500,,"Q","14",, -3,0,"Ryan, Mr. Patrick","male",,0,0,"371110",24.1500,,"Q",,, -3,0,"Saad, Mr. Amin","male",,0,0,"2671",7.2292,,"C",,, -3,0,"Saad, Mr. Khalil","male",25,0,0,"2672",7.2250,,"C",,, -3,0,"Saade, Mr. Jean Nassr","male",,0,0,"2676",7.2250,,"C",,, -3,0,"Sadlier, Mr. Matthew","male",,0,0,"367655",7.7292,,"Q",,, -3,0,"Sadowitz, Mr. Harry","male",,0,0,"LP 1588",7.5750,,"S",,, -3,0,"Saether, Mr. Simon Sivertsen","male",38.5,0,0,"SOTON/O.Q. 3101262",7.2500,,"S",,"32", -3,0,"Sage, Master. Thomas Henry","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Master. William Henry","male",14.5,8,2,"CA. 2343",69.5500,,"S",,"67", -3,0,"Sage, Miss. Ada","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Miss. Constance Gladys","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Miss. Dorothy Edith ""Dolly""","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Miss. Stella Anna","female",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. Douglas Bullen","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. Frederick","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. George John Jr","male",,8,2,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mr. John George","male",,1,9,"CA. 2343",69.5500,,"S",,, -3,0,"Sage, Mrs. John (Annie Bullen)","female",,1,9,"CA. 2343",69.5500,,"S",,, -3,0,"Salander, Mr. Karl Johan","male",24,0,0,"7266",9.3250,,"S",,, -3,1,"Salkjelsvik, Miss. Anna Kristine","female",21,0,0,"343120",7.6500,,"S","C",, -3,0,"Salonen, Mr. Johan Werner","male",39,0,0,"3101296",7.9250,,"S",,, -3,0,"Samaan, Mr. Elias","male",,2,0,"2662",21.6792,,"C",,, -3,0,"Samaan, Mr. Hanna","male",,2,0,"2662",21.6792,,"C",,, -3,0,"Samaan, Mr. Youssef","male",,2,0,"2662",21.6792,,"C",,, -3,1,"Sandstrom, Miss. Beatrice Irene","female",1,1,1,"PP 9549",16.7000,"G6","S","13",, -3,1,"Sandstrom, Mrs. Hjalmar (Agnes Charlotta Bengtsson)","female",24,0,2,"PP 9549",16.7000,"G6","S","13",, -3,1,"Sandstrom, Miss. Marguerite Rut","female",4,1,1,"PP 9549",16.7000,"G6","S","13",, -3,1,"Sap, Mr. Julius","male",25,0,0,"345768",9.5000,,"S","11",, -3,0,"Saundercock, Mr. William Henry","male",20,0,0,"A/5. 2151",8.0500,,"S",,, -3,0,"Sawyer, Mr. Frederick Charles","male",24.5,0,0,"342826",8.0500,,"S",,"284", -3,0,"Scanlan, Mr. James","male",,0,0,"36209",7.7250,,"Q",,, -3,0,"Sdycoff, Mr. Todor","male",,0,0,"349222",7.8958,,"S",,, -3,0,"Shaughnessy, Mr. Patrick","male",,0,0,"370374",7.7500,,"Q",,, -3,1,"Sheerlinck, Mr. Jan Baptist","male",29,0,0,"345779",9.5000,,"S","11",, -3,0,"Shellard, Mr. Frederick William","male",,0,0,"C.A. 6212",15.1000,,"S",,, -3,1,"Shine, Miss. Ellen Natalia","female",,0,0,"330968",7.7792,,"Q",,, -3,0,"Shorney, Mr. Charles Joseph","male",,0,0,"374910",8.0500,,"S",,, -3,0,"Simmons, Mr. John","male",,0,0,"SOTON/OQ 392082",8.0500,,"S",,, -3,0,"Sirayanian, Mr. Orsen","male",22,0,0,"2669",7.2292,,"C",,, -3,0,"Sirota, Mr. Maurice","male",,0,0,"392092",8.0500,,"S",,, -3,0,"Sivic, Mr. Husein","male",40,0,0,"349251",7.8958,,"S",,, -3,0,"Sivola, Mr. Antti Wilhelm","male",21,0,0,"STON/O 2. 3101280",7.9250,,"S",,, -3,1,"Sjoblom, Miss. Anna Sofia","female",18,0,0,"3101265",7.4958,,"S","16",, -3,0,"Skoog, Master. Harald","male",4,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Master. Karl Thorsten","male",10,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Miss. Mabel","female",9,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Miss. Margit Elizabeth","female",2,3,2,"347088",27.9000,,"S",,, -3,0,"Skoog, Mr. Wilhelm","male",40,1,4,"347088",27.9000,,"S",,, -3,0,"Skoog, Mrs. William (Anna Bernhardina Karlsson)","female",45,1,4,"347088",27.9000,,"S",,, -3,0,"Slabenoff, Mr. Petco","male",,0,0,"349214",7.8958,,"S",,, -3,0,"Slocovski, Mr. Selman Francis","male",,0,0,"SOTON/OQ 392086",8.0500,,"S",,, -3,0,"Smiljanic, Mr. Mile","male",,0,0,"315037",8.6625,,"S",,, -3,0,"Smith, Mr. Thomas","male",,0,0,"384461",7.7500,,"Q",,, -3,1,"Smyth, Miss. Julia","female",,0,0,"335432",7.7333,,"Q","13",, -3,0,"Soholt, Mr. Peter Andreas Lauritz Andersen","male",19,0,0,"348124",7.6500,"F G73","S",,, -3,0,"Somerton, Mr. Francis William","male",30,0,0,"A.5. 18509",8.0500,,"S",,, -3,0,"Spector, Mr. Woolf","male",,0,0,"A.5. 3236",8.0500,,"S",,, -3,0,"Spinner, Mr. Henry John","male",32,0,0,"STON/OQ. 369943",8.0500,,"S",,, -3,0,"Staneff, Mr. Ivan","male",,0,0,"349208",7.8958,,"S",,, -3,0,"Stankovic, Mr. Ivan","male",33,0,0,"349239",8.6625,,"C",,, -3,1,"Stanley, Miss. Amy Zillah Elsie","female",23,0,0,"CA. 2314",7.5500,,"S","C",, -3,0,"Stanley, Mr. Edward Roland","male",21,0,0,"A/4 45380",8.0500,,"S",,, -3,0,"Storey, Mr. Thomas","male",60.5,0,0,"3701",,,"S",,"261", -3,0,"Stoytcheff, Mr. Ilia","male",19,0,0,"349205",7.8958,,"S",,, -3,0,"Strandberg, Miss. Ida Sofia","female",22,0,0,"7553",9.8375,,"S",,, -3,1,"Stranden, Mr. Juho","male",31,0,0,"STON/O 2. 3101288",7.9250,,"S","9",, -3,0,"Strilic, Mr. Ivan","male",27,0,0,"315083",8.6625,,"S",,, -3,0,"Strom, Miss. Telma Matilda","female",2,0,1,"347054",10.4625,"G6","S",,, -3,0,"Strom, Mrs. Wilhelm (Elna Matilda Persson)","female",29,1,1,"347054",10.4625,"G6","S",,, -3,1,"Sunderland, Mr. Victor Francis","male",16,0,0,"SOTON/OQ 392089",8.0500,,"S","B",, -3,1,"Sundman, Mr. Johan Julian","male",44,0,0,"STON/O 2. 3101269",7.9250,,"S","15",, -3,0,"Sutehall, Mr. Henry Jr","male",25,0,0,"SOTON/OQ 392076",7.0500,,"S",,, -3,0,"Svensson, Mr. Johan","male",74,0,0,"347060",7.7750,,"S",,, -3,1,"Svensson, Mr. Johan Cervin","male",14,0,0,"7538",9.2250,,"S","13",, -3,0,"Svensson, Mr. Olof","male",24,0,0,"350035",7.7958,,"S",,, -3,1,"Tenglin, Mr. Gunnar Isidor","male",25,0,0,"350033",7.7958,,"S","13 15",, -3,0,"Theobald, Mr. Thomas Leonard","male",34,0,0,"363294",8.0500,,"S",,"176", -3,1,"Thomas, Master. Assad Alexander","male",0.42,0,1,"2625",8.5167,,"C","16",, -3,0,"Thomas, Mr. Charles P","male",,1,0,"2621",6.4375,,"C",,, -3,0,"Thomas, Mr. John","male",,0,0,"2681",6.4375,,"C",,, -3,0,"Thomas, Mr. Tannous","male",,0,0,"2684",7.2250,,"C",,, -3,1,"Thomas, Mrs. Alexander (Thamine ""Thelma"")","female",16,1,1,"2625",8.5167,,"C","14",, -3,0,"Thomson, Mr. Alexander Morrison","male",,0,0,"32302",8.0500,,"S",,, -3,0,"Thorneycroft, Mr. Percival","male",,1,0,"376564",16.1000,,"S",,, -3,1,"Thorneycroft, Mrs. Percival (Florence Kate White)","female",,1,0,"376564",16.1000,,"S","10",, -3,0,"Tikkanen, Mr. Juho","male",32,0,0,"STON/O 2. 3101293",7.9250,,"S",,, -3,0,"Tobin, Mr. Roger","male",,0,0,"383121",7.7500,"F38","Q",,, -3,0,"Todoroff, Mr. Lalio","male",,0,0,"349216",7.8958,,"S",,, -3,0,"Tomlin, Mr. Ernest Portage","male",30.5,0,0,"364499",8.0500,,"S",,"50", -3,0,"Torber, Mr. Ernst William","male",44,0,0,"364511",8.0500,,"S",,, -3,0,"Torfa, Mr. Assad","male",,0,0,"2673",7.2292,,"C",,, -3,1,"Tornquist, Mr. William Henry","male",25,0,0,"LINE",0.0000,,"S","15",, -3,0,"Toufik, Mr. Nakli","male",,0,0,"2641",7.2292,,"C",,, -3,1,"Touma, Master. Georges Youssef","male",7,1,1,"2650",15.2458,,"C","C",, -3,1,"Touma, Miss. Maria Youssef","female",9,1,1,"2650",15.2458,,"C","C",, -3,1,"Touma, Mrs. Darwis (Hanne Youssef Razi)","female",29,0,2,"2650",15.2458,,"C","C",, -3,0,"Turcin, Mr. Stjepan","male",36,0,0,"349247",7.8958,,"S",,, -3,1,"Turja, Miss. Anna Sofia","female",18,0,0,"4138",9.8417,,"S","15",, -3,1,"Turkula, Mrs. (Hedwig)","female",63,0,0,"4134",9.5875,,"S","15",, -3,0,"van Billiard, Master. James William","male",,1,1,"A/5. 851",14.5000,,"S",,, -3,0,"van Billiard, Master. Walter John","male",11.5,1,1,"A/5. 851",14.5000,,"S",,"1", -3,0,"van Billiard, Mr. Austin Blyler","male",40.5,0,2,"A/5. 851",14.5000,,"S",,"255", -3,0,"Van Impe, Miss. Catharina","female",10,0,2,"345773",24.1500,,"S",,, -3,0,"Van Impe, Mr. Jean Baptiste","male",36,1,1,"345773",24.1500,,"S",,, -3,0,"Van Impe, Mrs. Jean Baptiste (Rosalie Paula Govaert)","female",30,1,1,"345773",24.1500,,"S",,, -3,0,"van Melkebeke, Mr. Philemon","male",,0,0,"345777",9.5000,,"S",,, -3,0,"Vande Velde, Mr. Johannes Joseph","male",33,0,0,"345780",9.5000,,"S",,, -3,0,"Vande Walle, Mr. Nestor Cyriel","male",28,0,0,"345770",9.5000,,"S",,, -3,0,"Vanden Steen, Mr. Leo Peter","male",28,0,0,"345783",9.5000,,"S",,, -3,0,"Vander Cruyssen, Mr. Victor","male",47,0,0,"345765",9.0000,,"S",,, -3,0,"Vander Planke, Miss. Augusta Maria","female",18,2,0,"345764",18.0000,,"S",,, -3,0,"Vander Planke, Mr. Julius","male",31,3,0,"345763",18.0000,,"S",,, -3,0,"Vander Planke, Mr. Leo Edmondus","male",16,2,0,"345764",18.0000,,"S",,, -3,0,"Vander Planke, Mrs. Julius (Emelia Maria Vandemoortele)","female",31,1,0,"345763",18.0000,,"S",,, -3,1,"Vartanian, Mr. David","male",22,0,0,"2658",7.2250,,"C","13 15",, -3,0,"Vendel, Mr. Olof Edvin","male",20,0,0,"350416",7.8542,,"S",,, -3,0,"Vestrom, Miss. Hulda Amanda Adolfina","female",14,0,0,"350406",7.8542,,"S",,, -3,0,"Vovk, Mr. Janko","male",22,0,0,"349252",7.8958,,"S",,, -3,0,"Waelens, Mr. Achille","male",22,0,0,"345767",9.0000,,"S",,,"Antwerp, Belgium / Stanton, OH" -3,0,"Ware, Mr. Frederick","male",,0,0,"359309",8.0500,,"S",,, -3,0,"Warren, Mr. Charles William","male",,0,0,"C.A. 49867",7.5500,,"S",,, -3,0,"Webber, Mr. James","male",,0,0,"SOTON/OQ 3101316",8.0500,,"S",,, -3,0,"Wenzel, Mr. Linhart","male",32.5,0,0,"345775",9.5000,,"S",,"298", -3,1,"Whabee, Mrs. George Joseph (Shawneene Abi-Saab)","female",38,0,0,"2688",7.2292,,"C","C",, -3,0,"Widegren, Mr. Carl/Charles Peter","male",51,0,0,"347064",7.7500,,"S",,, -3,0,"Wiklund, Mr. Jakob Alfred","male",18,1,0,"3101267",6.4958,,"S",,"314", -3,0,"Wiklund, Mr. Karl Johan","male",21,1,0,"3101266",6.4958,,"S",,, -3,1,"Wilkes, Mrs. James (Ellen Needs)","female",47,1,0,"363272",7.0000,,"S",,, -3,0,"Willer, Mr. Aaron (""Abi Weller"")","male",,0,0,"3410",8.7125,,"S",,, -3,0,"Willey, Mr. Edward","male",,0,0,"S.O./P.P. 751",7.5500,,"S",,, -3,0,"Williams, Mr. Howard Hugh ""Harry""","male",,0,0,"A/5 2466",8.0500,,"S",,, -3,0,"Williams, Mr. Leslie","male",28.5,0,0,"54636",16.1000,,"S",,"14", -3,0,"Windelov, Mr. Einar","male",21,0,0,"SOTON/OQ 3101317",7.2500,,"S",,, -3,0,"Wirz, Mr. Albert","male",27,0,0,"315154",8.6625,,"S",,"131", -3,0,"Wiseman, Mr. Phillippe","male",,0,0,"A/4. 34244",7.2500,,"S",,, -3,0,"Wittevrongel, Mr. Camille","male",36,0,0,"345771",9.5000,,"S",,, -3,0,"Yasbeck, Mr. Antoni","male",27,1,0,"2659",14.4542,,"C","C",, -3,1,"Yasbeck, Mrs. Antoni (Selini Alexander)","female",15,1,0,"2659",14.4542,,"C",,, -3,0,"Youseff, Mr. Gerious","male",45.5,0,0,"2628",7.2250,,"C",,"312", -3,0,"Yousif, Mr. Wazli","male",,0,0,"2647",7.2250,,"C",,, -3,0,"Yousseff, Mr. Gerious","male",,0,0,"2627",14.4583,,"C",,, -3,0,"Zabour, Miss. Hileni","female",14.5,1,0,"2665",14.4542,,"C",,"328", -3,0,"Zabour, Miss. Thamine","female",,1,0,"2665",14.4542,,"C",,, -3,0,"Zakarian, Mr. Mapriededer","male",26.5,0,0,"2656",7.2250,,"C",,"304", -3,0,"Zakarian, Mr. Ortin","male",27,0,0,"2670",7.2250,,"C",,, -3,0,"Zimmerman, Mr. Leo","male",29,0,0,"315082",7.8750,,"S",,, From 255d6092bc304c46e471f324b28e6e6d1ab49790 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 25 May 2024 19:44:31 +0530 Subject: [PATCH 170/405] Update Importing_and_Exporting_Data_in_Pandas.md --- .../Importing_and_Exporting_Data_in_Pandas.md | 63 +++++-------------- 1 file changed, 17 insertions(+), 46 deletions(-) diff --git a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md index bb490b9..a4bc1be 100644 --- a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md +++ b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md @@ -12,60 +12,31 @@ *You could export it as a .csv file and then import it using ``pd.read_csv()``.* -*In this case, the exported .csv file is called `Titanic.csv`* +*In this case, the exported .csv file is called `car-sales.csv`* ```python ## Importing Titanic Data set import pandas as pd -titanic_df= pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/Titanic.csv") -print(titanic_df) +car_sales_df= pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/car-sales.csv") +print(car_sales_df) ``` - pclass survived name \ - 0 1 1 Allen, Miss. Elisabeth Walton - 1 1 1 Allison, Master. Hudson Trevor - 2 1 0 Allison, Miss. Helen Loraine - 3 1 0 Allison, Mr. Hudson Joshua Creighton - 4 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) - ... ... ... ... - 1304 3 0 Zabour, Miss. Hileni - 1305 3 0 Zabour, Miss. Thamine - 1306 3 0 Zakarian, Mr. Mapriededer - 1307 3 0 Zakarian, Mr. Ortin - 1308 3 0 Zimmerman, Mr. Leo - - sex age sibsp parch ticket fare cabin embarked boat \ - 0 female 29.00 0 0 24160 211.3375 B5 S 2 - 1 male 0.92 1 2 113781 151.5500 C22 C26 S 11 - 2 female 2.00 1 2 113781 151.5500 C22 C26 S NaN - 3 male 30.00 1 2 113781 151.5500 C22 C26 S NaN - 4 female 25.00 1 2 113781 151.5500 C22 C26 S NaN - ... ... ... ... ... ... ... ... ... ... - 1304 female 14.50 1 0 2665 14.4542 NaN C NaN - 1305 female NaN 1 0 2665 14.4542 NaN C NaN - 1306 male 26.50 0 0 2656 7.2250 NaN C NaN - 1307 male 27.00 0 0 2670 7.2250 NaN C NaN - 1308 male 29.00 0 0 315082 7.8750 NaN S NaN - - body home.dest - 0 NaN St Louis, MO - 1 NaN Montreal, PQ / Chesterville, ON - 2 NaN Montreal, PQ / Chesterville, ON - 3 135.0 Montreal, PQ / Chesterville, ON - 4 NaN Montreal, PQ / Chesterville, ON - ... ... ... - 1304 328.0 NaN - 1305 NaN NaN - 1306 304.0 NaN - 1307 NaN NaN - 1308 NaN NaN - - [1309 rows x 14 columns] + Make Colour Odometer (KM) Doors Price + 0 Toyota White 150043 4 $4,000.00 + 1 Honda Red 87899 4 $5,000.00 + 2 Toyota Blue 32549 3 $7,000.00 + 3 BMW Black 11179 5 $22,000.00 + 4 Nissan White 213095 4 $3,500.00 + 5 Toyota Green 99213 4 $4,500.00 + 6 Honda Blue 45698 4 $7,500.00 + 7 Honda Blue 54738 4 $7,000.00 + 8 Toyota White 60000 4 $6,250.00 + 9 Nissan White 31600 4 $9,700.00 -The dataset I am using here for your reference is taken from the same repository i.e ``learn-python`` (https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/Titanic.csv) I uploaded it in the Datasets folder,you can use it from there. +The dataset I am using here for your reference is taken from the same repository i.e ``learn-python`` (https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/car-sales.csv) I uploaded it in the Datasets folder,you can use it from there. You can also place the filename with its path in `pd.read_csv()`. @@ -92,12 +63,12 @@ You can also place the filename with its path in `pd.read_csv()`. ### Exporting a dataframe to a CSV -**We haven't made any changes yet to the ``titanic_df`` DataFrame but let's try to export it.** +**We haven't made any changes yet to the ``car_sales_df`` DataFrame but let's try to export it.** ```python #Export the titanic_df DataFrame to csv -titanic_df.to_csv("exported_titanic.csv") +car_sales_df.to_csv("exported_car_sales_df.csv") ``` Running this will save a file called ``exported_titanic.csv`` to the current folder. From cb52a821a21faa902dc53ee012732a8232ffd7f0 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sat, 25 May 2024 19:45:29 +0530 Subject: [PATCH 171/405] 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 2874431..a2d826c 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -5,3 +5,4 @@ - [Pandas Descriptive Statistics](Descriptive_Statistics.md) - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [Excel using Pandas DataFrame](excel_with_pandas.md) +- [Importing and Exporting Data in Pandas](Importing_and_Exporting_Data_in_Pandas.md) From 577df2c86e89ea943be4d9ac7415b88006181c2a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 25 May 2024 20:46:11 +0530 Subject: [PATCH 172/405] Update car-sales.csv --- contrib/pandas/Datasets/car-sales.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pandas/Datasets/car-sales.csv b/contrib/pandas/Datasets/car-sales.csv index 63a63bf..81e534a 100644 --- a/contrib/pandas/Datasets/car-sales.csv +++ b/contrib/pandas/Datasets/car-sales.csv @@ -8,4 +8,4 @@ Toyota,Green,99213,4,"$4,500.00" Honda,Blue,45698,4,"$7,500.00" Honda,Blue,54738,4,"$7,000.00" Toyota,White,60000,4,"$6,250.00" -Nissan,White,31600,4,"$9,700.00" \ No newline at end of file +Nissan,White,31600,4,"$9,700.00" From 14d806ff7052ac1eace6a200abde29c4aaf06562 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 25 May 2024 21:01:18 +0530 Subject: [PATCH 173/405] Update and rename Importing_and_Exporting_Data_in_Pandas.md to import-export.md --- .../Importing_and_Exporting_Data_in_Pandas.md | 74 ------------------- contrib/pandas/import-export.md | 46 ++++++++++++ 2 files changed, 46 insertions(+), 74 deletions(-) delete mode 100644 contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md create mode 100644 contrib/pandas/import-export.md diff --git a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md b/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md deleted file mode 100644 index a4bc1be..0000000 --- a/contrib/pandas/Importing_and_Exporting_Data_in_Pandas.md +++ /dev/null @@ -1,74 +0,0 @@ -# Importing_and_Exporting_Data_in_Pandas - ->Created by Krishna Kaushik - -- **Now we're able to create `Series` and `DataFrames` in pandas, but we usually do not do this , in practice we import the data which is in the form of .csv (Comma Seperated Values) , a spreadsheet file or something similar.** - -- *Good news is that pandas allows for easy importing of data like this through functions such as ``pd.read_csv()`` and ``pd.read_excel()`` for Microsoft Excel files.* - -## 1. Importing from a Google sheet to a pandas dataframe - -*Let's say that you wanted to get the information from Google Sheet document into a pandas DataFrame.*. - -*You could export it as a .csv file and then import it using ``pd.read_csv()``.* - -*In this case, the exported .csv file is called `car-sales.csv`* - - -```python -## Importing Titanic Data set -import pandas as pd - -car_sales_df= pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/car-sales.csv") -print(car_sales_df) -``` - - Make Colour Odometer (KM) Doors Price - 0 Toyota White 150043 4 $4,000.00 - 1 Honda Red 87899 4 $5,000.00 - 2 Toyota Blue 32549 3 $7,000.00 - 3 BMW Black 11179 5 $22,000.00 - 4 Nissan White 213095 4 $3,500.00 - 5 Toyota Green 99213 4 $4,500.00 - 6 Honda Blue 45698 4 $7,500.00 - 7 Honda Blue 54738 4 $7,000.00 - 8 Toyota White 60000 4 $6,250.00 - 9 Nissan White 31600 4 $9,700.00 - - -The dataset I am using here for your reference is taken from the same repository i.e ``learn-python`` (https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/car-sales.csv) I uploaded it in the Datasets folder,you can use it from there. - -You can also place the filename with its path in `pd.read_csv()`. - -**Now we've got the same data from the Google Spreadsheet , but now available as ``pandas DataFrame`` which means we can now apply all pandas functionality over it.** - -#### Note: The quiet important thing i am telling is that ``pd.read_csv()`` takes the location of the file (which is in your current working directory) or the hyperlink of the dataset from the other source. - -#### But if you want to import the data from Github you can't directly use its link , you have to first convert it to raw by clicking on the raw button present in the repo . - -#### Also you can't use the data directly from `Kaggle` you have to use ``kaggle API`` - -## 2. The Anatomy of DataFrame - -**Different functions use different labels for different things, and can get a little confusing.** - -- Rows are refer as ``axis=0`` -- columns are refer as ``axis=1`` - -## 3. Exporting Data - -**OK, so after you've made a few changes to your data, you might want to export it and save it so someone else can access the changes.** - -**pandas allows you to export ``DataFrame's`` to ``.csv`` format using ``.to_csv()``, or to a spreadsheet format using .to_excel().** - -### Exporting a dataframe to a CSV - -**We haven't made any changes yet to the ``car_sales_df`` DataFrame but let's try to export it.** - - -```python -#Export the titanic_df DataFrame to csv -car_sales_df.to_csv("exported_car_sales_df.csv") -``` - -Running this will save a file called ``exported_titanic.csv`` to the current folder. diff --git a/contrib/pandas/import-export.md b/contrib/pandas/import-export.md new file mode 100644 index 0000000..23d1ad8 --- /dev/null +++ b/contrib/pandas/import-export.md @@ -0,0 +1,46 @@ +# Importing and Exporting Data in Pandas + +## Importing Data from a CSV + +We can create `Series` and `DataFrame` in pandas, but often we have to import the data which is in the form of `.csv` (Comma Separated Values), a spreadsheet file or similar tabular data file format. + +`pandas` allows for easy importing of this data using functions such as `read_csv()` and `read_excel()` for Microsoft Excel files. + +*Note: In case you want to get the information from a **Google Sheet** you can export it as a .csv file.* + +The `read_csv()` function can be used to import a CSV file into a pandas DataFrame. The path can be a file system path or a URL where the CSV is available. + +```python +import pandas as pd + +car_sales_df= pd.read_csv("Datasets/car-sales.csv") +print(car_sales_df) +``` + +``` + Make Colour Odometer (KM) Doors Price + 0 Toyota White 150043 4 $4,000.00 + 1 Honda Red 87899 4 $5,000.00 + 2 Toyota Blue 32549 3 $7,000.00 + 3 BMW Black 11179 5 $22,000.00 + 4 Nissan White 213095 4 $3,500.00 + 5 Toyota Green 99213 4 $4,500.00 + 6 Honda Blue 45698 4 $7,500.00 + 7 Honda Blue 54738 4 $7,000.00 + 8 Toyota White 60000 4 $6,250.00 + 9 Nissan White 31600 4 $9,700.00 +``` + +You can find the dataset used above in the `Datasets` folder. + +*Note: If you want to import the data from Github you can't directly use its link, you have to first obtain the raw file URL by clicking on the raw button present in the repo* + +## Exporting Data to a CSV + +`pandas` allows you to export `DataFrame` to `.csv` format using `.to_csv()`, or to a Excel spreadsheet using `.to_excel()`. + +```python +car_sales_df.to_csv("exported_car_sales.csv") +``` + +Running this will save a file called ``exported_car_sales.csv`` to the current folder. From 0db944c7900aa2e72c0df64af1049864dbcb5541 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 25 May 2024 21:01:48 +0530 Subject: [PATCH 174/405] 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 a2d826c..bf677cf 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -5,4 +5,4 @@ - [Pandas Descriptive Statistics](Descriptive_Statistics.md) - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [Excel using Pandas DataFrame](excel_with_pandas.md) -- [Importing and Exporting Data in Pandas](Importing_and_Exporting_Data_in_Pandas.md) +- [Importing and Exporting Data in Pandas](import-export.md) 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 175/405] 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 18b4c52c96d8d74a79816fb96e0b7789f1b3ba11 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sun, 26 May 2024 02:23:42 +0530 Subject: [PATCH 176/405] Add files via upload --- contrib/pandas/Datasets/car-sales-missing-data.csv | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 contrib/pandas/Datasets/car-sales-missing-data.csv diff --git a/contrib/pandas/Datasets/car-sales-missing-data.csv b/contrib/pandas/Datasets/car-sales-missing-data.csv new file mode 100644 index 0000000..e34cd5f --- /dev/null +++ b/contrib/pandas/Datasets/car-sales-missing-data.csv @@ -0,0 +1,11 @@ +Make,Colour,Odometer,Doors,Price +Toyota,White,150043,4,"$4,000" +Honda,Red,87899,4,"$5,000" +Toyota,Blue,,3,"$7,000" +BMW,Black,11179,5,"$22,000" +Nissan,White,213095,4,"$3,500" +Toyota,Green,,4,"$4,500" +Honda,,,4,"$7,500" +Honda,Blue,,4, +Toyota,White,60000,, +,White,31600,4,"$9,700" \ No newline at end of file From 76fadaa2fd3edf6d17dd96e3d9d1aa13dd88de43 Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 12:09:47 +0530 Subject: [PATCH 177/405] this is the new change --- contrib/Linklist/linklist.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/Linklist/linklist.md diff --git a/contrib/Linklist/linklist.md b/contrib/Linklist/linklist.md new file mode 100644 index 0000000..e69de29 From 05e14ba89825fe857c9b3ec1333e0f288161d83e Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 13:26:15 +0530 Subject: [PATCH 178/405] New change --- contrib/{Linklist/linklist.md => ds-algorithms/Linked-list.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/{Linklist/linklist.md => ds-algorithms/Linked-list.md} (100%) diff --git a/contrib/Linklist/linklist.md b/contrib/ds-algorithms/Linked-list.md similarity index 100% rename from contrib/Linklist/linklist.md rename to contrib/ds-algorithms/Linked-list.md From b2a16691059d9b0cff7b544a779299b1722708b1 Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:09:10 +0530 Subject: [PATCH 179/405] this is commit --- contrib/ds-algorithms/Linked-list.md | 181 +++++++++++++++++++++++++++ contrib/ds-algorithms/index.md | 1 + 2 files changed, 182 insertions(+) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index e69de29..d3d7ec1 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -0,0 +1,181 @@ +# Linked List Data Structure + +Link list is a linear data Structure which can be defined as collection of objects called nodes that are randomly stored in the memory. +A node contains two types of metadata i.e. data stored at that particular address and the pointer which contains the address of the next node in the memory. +The last node of the list contains pointer to the null. + +## Why use linked list over array? + +From the beginning, we are using array data structure to organize the group of elements that are stored individually in the memory. +However, there are some advantage and disadvantage of array which should be known to decide which data structure will used throughout the program. + +limitations + +1. The size of array must be known in advance before using it in the program. +2. Increasing size of the array is a time taking process. It is almost impossible to expand the size of the array at run time. +3. All the elements in the array need to be contiguously stored in the memory. Inserting any element in the array needs shifting of all its predecessors. + +So we introduce a new data structure to overcome these limitations. + +Linked list is used because, +1. It allocates the memory dynamically. All the nodes of linked list are non-contiguously stored in the memory and linked together with the help of pointers. +2. Sizing is no longer a problem since we do not need to define its size at the time of declaration. List grows as per the program's demand and limited to the available memory space. + +Let's code something + +The smallest Unit: Node + +class Node: + def __init__(self, data): + self.data = data # Assigns the given data to the node + self.next = None # Initialize the next attribute to null + +Now, we will see the types of linked list. + +There are mainly four types of linked list, +1. Singly Link list +2. Doubly link list +3. Circular link list +4. Doubly circular link list + + +## 1. Singly linked list. + +Simply think it is a chain of nodes in which each node remember(contains) the addresses of it next node. + +### Creating a linked list class + +class LinkedList: + def __init__(self): + self.head = None # Initialize head as None + +### Inserting a new node at the beginning of a linked list + + def insertAtBeginning(self, new_data): + new_node = Node(new_data) # Create a new node + new_node.next = self.head # Next for new node becomes the current head + self.head = new_node # Head now points to the new node + +### Inserting a new node at the end of a linked list + + def insertAtEnd(self, new_data): + new_node = Node(new_data) # Create a new node + if self.head is None: + self.head = new_node # If the list is empty, make the new node the head + return + last = self.head + while last.next: # Otherwise, traverse the list to find the last node + last = last.next + last.next = new_node # Make the new node the next node of the last node + +### Inserting a new node at the middle of a linked list + + def insertAtPosition(self, data, position): + new_node = Node(data) + if position <= 0: #check if position is valid or not + print("Position should be greater than 0") + return + if position == 1: + new_node.next = self.head + self.head = new_node + return + current_node = self.head + current_position = 1 + while current_node and current_position < position - 1: #Iterating to behind of the postion. + current_node = current_node.next + current_position += 1 + if not current_node: #Check if Position is out of bound or not + print("Position is out of bounds") + return + new_node.next = current_node.next #connect the intermediate node + current_node.next = new_node + +### Printing the Linked list + + def printList(self): + temp = self.head # Start from the head of the list + while temp: + print(temp.data,end=' ') # Print the data in the current node + temp = temp.next # Move to the next node + print() # Ensures the output is followed by a new line + + +Lets complete the code and create a linked list. + +Connect all the code. + +if __name__ == '__main__': + llist = LinkedList() + + # Insert words at the beginning + llist.insertAtBeginning(4) # <4> + llist.insertAtBeginning(3) # <3> 4 + llist.insertAtBeginning(2) # <2> 3 4 + llist.insertAtBeginning(1) # <1> 2 3 4 + + # Insert a word at the end + llist.insertAtEnd(10) # 1 2 3 4 <10> + llist.insertAtEnd(7) # 1 2 3 4 10 <7> + + #Insert at a random position + llist.insertAtPosition(9,4) ## 1 2 3 <9> 4 10 7 + # Print the list + llist.printList() + + + + output: + 1 2 3 9 4 10 7 + + +### Deleting a node from the beginning of a linked list +check the list is empty otherwise shift the head to next node. + +def deleteFromBeginning(self): + if self.head is None: + return "The list is empty" # If the list is empty, return this string + self.head = self.head.next # Otherwise, remove the head by making the next node the new head + +### Deleting a node from the end of a linked list + +def deleteFromEnd(self): + if self.head is None: + return "The list is empty" + if self.head.next is None: + self.head = None # If there's only one node, remove the head by making it None + return + temp = self.head + while temp.next.next: # Otherwise, go to the second-last node + temp = temp.next + temp.next = None # Remove the last node by setting the next pointer of the second-last node to None + + +### Search in a linked list + +def search(self, value): + current = self.head # Start with the head of the list + position = 0 # Counter to keep track of the position + while current: # Traverse the list + if current.data == value: # Compare the list's data to the search value + return f"Value '{value}' found at position {position}" # Print the value if a match is found + current = current.next + position += 1 + return f"Value '{value}' not found in the list" + + + + + + + + + + + + + + + + + + diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 666bcfd..4b6e20d 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -8,3 +8,4 @@ - [Searching Algorithms](searching-algorithms.md) - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) +- [Linked list](Linked-list.md) From d2a25f16cca049ed1f1b06cd5d25a677144f4ea4 Mon Sep 17 00:00:00 2001 From: Vinay Sagar <64737008+vinay-sagar123@users.noreply.github.com> Date: Sun, 26 May 2024 14:13:10 +0530 Subject: [PATCH 180/405] Update Linked-list.md new change --- contrib/ds-algorithms/Linked-list.md | 39 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index d3d7ec1..a660b1c 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -104,28 +104,27 @@ Lets complete the code and create a linked list. Connect all the code. -if __name__ == '__main__': - llist = LinkedList() - - # Insert words at the beginning - llist.insertAtBeginning(4) # <4> - llist.insertAtBeginning(3) # <3> 4 - llist.insertAtBeginning(2) # <2> 3 4 - llist.insertAtBeginning(1) # <1> 2 3 4 - - # Insert a word at the end - llist.insertAtEnd(10) # 1 2 3 4 <10> - llist.insertAtEnd(7) # 1 2 3 4 10 <7> - - #Insert at a random position - llist.insertAtPosition(9,4) ## 1 2 3 <9> 4 10 7 - # Print the list - llist.printList() + if __name__ == '__main__': + llist = LinkedList() + + # Insert words at the beginning + llist.insertAtBeginning(4) # <4> + llist.insertAtBeginning(3) # <3> 4 + llist.insertAtBeginning(2) # <2> 3 4 + llist.insertAtBeginning(1) # <1> 2 3 4 + + # Insert a word at the end + llist.insertAtEnd(10) # 1 2 3 4 <10> + llist.insertAtEnd(7) # 1 2 3 4 10 <7> + + #Insert at a random position + llist.insertAtPosition(9,4) ## 1 2 3 <9> 4 10 7 + # Print the list + llist.printList() - - output: - 1 2 3 9 4 10 7 +## output: +1 2 3 9 4 10 7 ### Deleting a node from the beginning of a linked list From 4a0576633fc3e06900b2c34e134c0ac5a77de8d1 Mon Sep 17 00:00:00 2001 From: Vinay Sagar <64737008+vinay-sagar123@users.noreply.github.com> Date: Sun, 26 May 2024 14:14:13 +0530 Subject: [PATCH 181/405] Update Linked-list.md change2 --- contrib/ds-algorithms/Linked-list.md | 62 ++++++++++++++-------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index a660b1c..e3abc9a 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -25,10 +25,10 @@ Let's code something The smallest Unit: Node -class Node: - def __init__(self, data): - self.data = data # Assigns the given data to the node - self.next = None # Initialize the next attribute to null + class Node: + def __init__(self, data): + self.data = data # Assigns the given data to the node + self.next = None # Initialize the next attribute to null Now, we will see the types of linked list. @@ -45,9 +45,9 @@ Simply think it is a chain of nodes in which each node remember(contains) the ad ### Creating a linked list class -class LinkedList: - def __init__(self): - self.head = None # Initialize head as None + class LinkedList: + def __init__(self): + self.head = None # Initialize head as None ### Inserting a new node at the beginning of a linked list @@ -130,37 +130,37 @@ Connect all the code. ### Deleting a node from the beginning of a linked list check the list is empty otherwise shift the head to next node. -def deleteFromBeginning(self): - if self.head is None: - return "The list is empty" # If the list is empty, return this string - self.head = self.head.next # Otherwise, remove the head by making the next node the new head + def deleteFromBeginning(self): + if self.head is None: + return "The list is empty" # If the list is empty, return this string + self.head = self.head.next # Otherwise, remove the head by making the next node the new head ### Deleting a node from the end of a linked list -def deleteFromEnd(self): - if self.head is None: - return "The list is empty" - if self.head.next is None: - self.head = None # If there's only one node, remove the head by making it None - return - temp = self.head - while temp.next.next: # Otherwise, go to the second-last node - temp = temp.next - temp.next = None # Remove the last node by setting the next pointer of the second-last node to None + def deleteFromEnd(self): + if self.head is None: + return "The list is empty" + if self.head.next is None: + self.head = None # If there's only one node, remove the head by making it None + return + temp = self.head + while temp.next.next: # Otherwise, go to the second-last node + temp = temp.next + temp.next = None # Remove the last node by setting the next pointer of the second-last node to None ### Search in a linked list -def search(self, value): - current = self.head # Start with the head of the list - position = 0 # Counter to keep track of the position - while current: # Traverse the list - if current.data == value: # Compare the list's data to the search value - return f"Value '{value}' found at position {position}" # Print the value if a match is found - current = current.next - position += 1 - return f"Value '{value}' not found in the list" - + def search(self, value): + current = self.head # Start with the head of the list + position = 0 # Counter to keep track of the position + while current: # Traverse the list + if current.data == value: # Compare the list's data to the search value + return f"Value '{value}' found at position {position}" # Print the value if a match is found + current = current.next + position += 1 + return f"Value '{value}' not found in the list" + From b2264d4e6fe3dfe738bc321fe3e6edd946fb9f7e Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:22:13 +0530 Subject: [PATCH 182/405] COMM3 --- contrib/ds-algorithms/Linked-list.md | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index e3abc9a..147527b 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -25,10 +25,12 @@ Let's code something The smallest Unit: Node + ```python class Node: def __init__(self, data): self.data = data # Assigns the given data to the node self.next = None # Initialize the next attribute to null + ``` Now, we will see the types of linked list. @@ -44,20 +46,24 @@ There are mainly four types of linked list, Simply think it is a chain of nodes in which each node remember(contains) the addresses of it next node. ### Creating a linked list class - + ```python class LinkedList: def __init__(self): self.head = None # Initialize head as None + ``` ### Inserting a new node at the beginning of a linked list + ```python def insertAtBeginning(self, new_data): new_node = Node(new_data) # Create a new node new_node.next = self.head # Next for new node becomes the current head self.head = new_node # Head now points to the new node + ``` ### Inserting a new node at the end of a linked list +```python def insertAtEnd(self, new_data): new_node = Node(new_data) # Create a new node if self.head is None: @@ -67,9 +73,10 @@ Simply think it is a chain of nodes in which each node remember(contains) the ad while last.next: # Otherwise, traverse the list to find the last node last = last.next last.next = new_node # Make the new node the next node of the last node - +``` ### Inserting a new node at the middle of a linked list +```python def insertAtPosition(self, data, position): new_node = Node(data) if position <= 0: #check if position is valid or not @@ -89,21 +96,23 @@ Simply think it is a chain of nodes in which each node remember(contains) the ad return new_node.next = current_node.next #connect the intermediate node current_node.next = new_node - +``` ### Printing the Linked list +```python def printList(self): temp = self.head # Start from the head of the list while temp: print(temp.data,end=' ') # Print the data in the current node temp = temp.next # Move to the next node print() # Ensures the output is followed by a new line - +``` Lets complete the code and create a linked list. Connect all the code. +```python if __name__ == '__main__': llist = LinkedList() @@ -121,7 +130,7 @@ Connect all the code. llist.insertAtPosition(9,4) ## 1 2 3 <9> 4 10 7 # Print the list llist.printList() - +``` ## output: 1 2 3 9 4 10 7 @@ -129,14 +138,15 @@ Connect all the code. ### Deleting a node from the beginning of a linked list check the list is empty otherwise shift the head to next node. - +```python def deleteFromBeginning(self): if self.head is None: return "The list is empty" # If the list is empty, return this string self.head = self.head.next # Otherwise, remove the head by making the next node the new head - +``` ### Deleting a node from the end of a linked list +```python def deleteFromEnd(self): if self.head is None: return "The list is empty" @@ -147,6 +157,7 @@ check the list is empty otherwise shift the head to next node. while temp.next.next: # Otherwise, go to the second-last node temp = temp.next temp.next = None # Remove the last node by setting the next pointer of the second-last node to None + ``` ### Search in a linked list From a1dd770b20179f859dc669fdda163bc7c01a96a2 Mon Sep 17 00:00:00 2001 From: Vinay Sagar <64737008+vinay-sagar123@users.noreply.github.com> Date: Sun, 26 May 2024 14:24:19 +0530 Subject: [PATCH 183/405] Update Linked-list.md chnage3 --- contrib/ds-algorithms/Linked-list.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 147527b..541410c 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -25,12 +25,12 @@ Let's code something The smallest Unit: Node - ```python +```python class Node: def __init__(self, data): self.data = data # Assigns the given data to the node self.next = None # Initialize the next attribute to null - ``` +``` Now, we will see the types of linked list. @@ -46,20 +46,20 @@ There are mainly four types of linked list, Simply think it is a chain of nodes in which each node remember(contains) the addresses of it next node. ### Creating a linked list class - ```python +```python class LinkedList: def __init__(self): self.head = None # Initialize head as None - ``` +``` ### Inserting a new node at the beginning of a linked list - ```python +```python def insertAtBeginning(self, new_data): new_node = Node(new_data) # Create a new node new_node.next = self.head # Next for new node becomes the current head self.head = new_node # Head now points to the new node - ``` +``` ### Inserting a new node at the end of a linked list From beba33d28736209440c9d9cb4784426a9d38ce9b Mon Sep 17 00:00:00 2001 From: Vinay Sagar <64737008+vinay-sagar123@users.noreply.github.com> Date: Sun, 26 May 2024 14:24:51 +0530 Subject: [PATCH 184/405] Update Linked-list.md change4 --- contrib/ds-algorithms/Linked-list.md | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 541410c..9e51ab5 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -171,21 +171,3 @@ check the list is empty otherwise shift the head to next node. current = current.next position += 1 return f"Value '{value}' not found in the list" - - - - - - - - - - - - - - - - - - From c3b01f340fc1948f8d6f03d4115d822bb07221f7 Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:32:08 +0530 Subject: [PATCH 185/405] commit4 --- contrib/ds-algorithms/Linked-list.md | 47 ++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 147527b..194cd92 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -157,11 +157,11 @@ check the list is empty otherwise shift the head to next node. while temp.next.next: # Otherwise, go to the second-last node temp = temp.next temp.next = None # Remove the last node by setting the next pointer of the second-last node to None - ``` +``` ### Search in a linked list - +```python def search(self, value): current = self.head # Start with the head of the list position = 0 # Counter to keep track of the position @@ -171,14 +171,43 @@ check the list is empty otherwise shift the head to next node. current = current.next position += 1 return f"Value '{value}' not found in the list" +``` + +```python + if __name__ == '__main__': + llist = LinkedList() + + # Insert words at the beginning + llist.insertAtBeginning(4) # <4> + llist.insertAtBeginning(3) # <3> 4 + llist.insertAtBeginning(2) # <2> 3 4 + llist.insertAtBeginning(1) # <1> 2 3 4 - - - - - - - + # Insert a word at the end + llist.insertAtEnd(10) # 1 2 3 4 <10> + llist.insertAtEnd(7) # 1 2 3 4 10 <7> + + #Insert at a random position + llist.insertAtPosition(9,4) # 1 2 3 <9> 4 10 7 + llist.insertAtPositon(56,4) # 1 2 3 <56> 9 4 10 7 + + #delete at the beginning + llist.deleteFromBeginning() # 2 3 56 9 4 10 7 + + #delete at the end + llist.deleteFromEnd() # 2 3 56 9 4 10 + # Print the list + llist.printList() +``` + + + +## Real Life uses of Linked List +Music Player – Songs in the music player are linked to the previous and next songs. So you can play songs either from starting or ending of the list. +GPS navigation systems- Linked lists can be used to store and manage a list of locations and routes, allowing users to easily navigate to their desired destination. +Task Scheduling- Operating systems use linked lists to manage task scheduling, where each process waiting to be executed is represented as a node in the list. +Speech Recognition- Speech recognition software uses linked lists to represent the possible phonetic pronunciations of a word, where each possible pronunciation is represented as a node in the list. +and more.... From c91b657e2c186a509cd0e32a3cf398d30c79ab6b Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:36:28 +0530 Subject: [PATCH 186/405] hello --- contrib/ds-algorithms/Linked-list.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 5febd22..0ec285d 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -171,7 +171,6 @@ check the list is empty otherwise shift the head to next node. current = current.next position += 1 return f"Value '{value}' not found in the list" -<<<<<<< HEAD ``` ```python @@ -219,5 +218,3 @@ and more.... -======= ->>>>>>> beba33d28736209440c9d9cb4784426a9d38ce9b From 297d68fadbc26f0f752c3272c9bc04094882b7fe Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:38:31 +0530 Subject: [PATCH 187/405] comm6 --- contrib/ds-algorithms/Linked-list.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 0ec285d..007674f 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -204,9 +204,13 @@ check the list is empty otherwise shift the head to next node. ## Real Life uses of Linked List Music Player – Songs in the music player are linked to the previous and next songs. So you can play songs either from starting or ending of the list. +
GPS navigation systems- Linked lists can be used to store and manage a list of locations and routes, allowing users to easily navigate to their desired destination. +
Task Scheduling- Operating systems use linked lists to manage task scheduling, where each process waiting to be executed is represented as a node in the list. +
Speech Recognition- Speech recognition software uses linked lists to represent the possible phonetic pronunciations of a word, where each possible pronunciation is represented as a node in the list. +
and more.... From e8a1d62febf2195d49d0207f76cd82591fa24c31 Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:40:43 +0530 Subject: [PATCH 188/405] commit7 --- contrib/ds-algorithms/Linked-list.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 007674f..95350fd 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -199,17 +199,19 @@ check the list is empty otherwise shift the head to next node. # Print the list llist.printList() ``` +##Output +2 3 56 9 4 10 ## Real Life uses of Linked List -Music Player – Songs in the music player are linked to the previous and next songs. So you can play songs either from starting or ending of the list. +1. Music Player – Songs in the music player are linked to the previous and next songs. So you can play songs either from starting or ending of the list.
-GPS navigation systems- Linked lists can be used to store and manage a list of locations and routes, allowing users to easily navigate to their desired destination. +2. GPS navigation systems- Linked lists can be used to store and manage a list of locations and routes, allowing users to easily navigate to their desired destination.
-Task Scheduling- Operating systems use linked lists to manage task scheduling, where each process waiting to be executed is represented as a node in the list. +3. Task Scheduling- Operating systems use linked lists to manage task scheduling, where each process waiting to be executed is represented as a node in the list.
-Speech Recognition- Speech recognition software uses linked lists to represent the possible phonetic pronunciations of a word, where each possible pronunciation is represented as a node in the list. +4. Speech Recognition- Speech recognition software uses linked lists to represent the possible phonetic pronunciations of a word, where each possible pronunciation is represented as a node in the list.
and more.... From 7e979edff8636325b197246275db488e13952347 Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:41:38 +0530 Subject: [PATCH 189/405] commit8 --- contrib/ds-algorithms/Linked-list.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 95350fd..424a8fb 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -199,7 +199,8 @@ check the list is empty otherwise shift the head to next node. # Print the list llist.printList() ``` -##Output +## Output: + 2 3 56 9 4 10 From 4c51b5916e64e1e6f64fa2987905e9e98d9a0efd Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:42:37 +0530 Subject: [PATCH 190/405] c10 --- contrib/ds-algorithms/Linked-list.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 424a8fb..1c4511e 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -207,13 +207,9 @@ check the list is empty otherwise shift the head to next node. ## Real Life uses of Linked List 1. Music Player – Songs in the music player are linked to the previous and next songs. So you can play songs either from starting or ending of the list. -
2. GPS navigation systems- Linked lists can be used to store and manage a list of locations and routes, allowing users to easily navigate to their desired destination. -
3. Task Scheduling- Operating systems use linked lists to manage task scheduling, where each process waiting to be executed is represented as a node in the list. -
4. Speech Recognition- Speech recognition software uses linked lists to represent the possible phonetic pronunciations of a word, where each possible pronunciation is represented as a node in the list. -
and more.... From 45e8763b5a25403f8a3eba79cf0e8a7c0fa46879 Mon Sep 17 00:00:00 2001 From: Vinay Date: Sun, 26 May 2024 14:53:04 +0530 Subject: [PATCH 191/405] com11 --- contrib/ds-algorithms/Linked-list.md | 31 ++++++++++++++++++---------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/Linked-list.md index 1c4511e..11f4016 100644 --- a/contrib/ds-algorithms/Linked-list.md +++ b/contrib/ds-algorithms/Linked-list.md @@ -2,7 +2,8 @@ Link list is a linear data Structure which can be defined as collection of objects called nodes that are randomly stored in the memory. A node contains two types of metadata i.e. data stored at that particular address and the pointer which contains the address of the next node in the memory. -The last node of the list contains pointer to the null. + +The last element in a linked list features a null pointer. ## Why use linked list over array? @@ -11,15 +12,15 @@ However, there are some advantage and disadvantage of array which should be know limitations -1. The size of array must be known in advance before using it in the program. -2. Increasing size of the array is a time taking process. It is almost impossible to expand the size of the array at run time. -3. All the elements in the array need to be contiguously stored in the memory. Inserting any element in the array needs shifting of all its predecessors. +1. Before an array can be utilized in a program, its size must be established in advance. +2. Expanding an array's size is a lengthy process and is almost impossible to achieve during runtime. +3. Array elements must be stored in contiguous memory locations. To insert an element, all subsequent elements must be shifted So we introduce a new data structure to overcome these limitations. Linked list is used because, -1. It allocates the memory dynamically. All the nodes of linked list are non-contiguously stored in the memory and linked together with the help of pointers. -2. Sizing is no longer a problem since we do not need to define its size at the time of declaration. List grows as per the program's demand and limited to the available memory space. +1. Dynamic Memory Management: Linked lists allocate memory dynamically, meaning nodes can be located anywhere in memory and are connected through pointers, rather than being stored contiguously. +2. Adaptive Sizing: There is no need to predefine the size of a linked list. It can expand or contract during runtime, adapting to the program's requirements within the constraints of the available memory. Let's code something @@ -206,11 +207,19 @@ check the list is empty otherwise shift the head to next node. ## Real Life uses of Linked List -1. Music Player – Songs in the music player are linked to the previous and next songs. So you can play songs either from starting or ending of the list. -2. GPS navigation systems- Linked lists can be used to store and manage a list of locations and routes, allowing users to easily navigate to their desired destination. -3. Task Scheduling- Operating systems use linked lists to manage task scheduling, where each process waiting to be executed is represented as a node in the list. -4. Speech Recognition- Speech recognition software uses linked lists to represent the possible phonetic pronunciations of a word, where each possible pronunciation is represented as a node in the list. -and more.... + + +Here are a few practical applications of linked lists in various fields: + +1. **Music Player**: In a music player, songs are often linked to the previous and next tracks. This allows for seamless navigation between songs, enabling you to play tracks either from the beginning or the end of the playlist. This is akin to a doubly linked list where each song node points to both the previous and the next song, enhancing the flexibility of song selection. + +2. **GPS Navigation Systems**: Linked lists can be highly effective for managing lists of locations and routes in GPS navigation systems. Each location or waypoint can be represented as a node, making it easy to add or remove destinations and to navigate smoothly from one location to another. This is similar to how you might plan a road trip, plotting stops along the way in a flexible, dynamic manner. + +3. **Task Scheduling**: Operating systems utilize linked lists to manage task scheduling. Each process waiting to be executed is represented as a node in a linked list. This organization allows the system to efficiently keep track of which processes need to be run, enabling fair and systematic scheduling of tasks. Think of it like a to-do list where each task is a node, and the system executes tasks in a structured order. + +4. **Speech Recognition**: Speech recognition software uses linked lists to represent possible phonetic pronunciations of words. Each potential pronunciation is a node, allowing the software to dynamically explore different pronunciation paths as it processes spoken input. This method helps in accurately recognizing and understanding speech by considering multiple possibilities in a flexible manner, much like evaluating various potential meanings in a conversation. + +These examples illustrate how linked lists provide a flexible, dynamic data structure that can be adapted to a wide range of practical applications, making them a valuable tool in both software development and real-world problem-solving. From 8c562fc874b9c416cd6e81c8acad41e955be5977 Mon Sep 17 00:00:00 2001 From: seeratfatima19 Date: Sun, 26 May 2024 20:30:40 +0500 Subject: [PATCH 192/405] fast api tutorial completed --- contrib/api-development/assets/image.png | Bin 0 -> 139430 bytes contrib/api-development/assets/image2.png | Bin 0 -> 36188 bytes contrib/api-development/fast-api.md | 289 ++++++++++++++++++++++ contrib/api-development/index.md | 1 + 4 files changed, 290 insertions(+) create mode 100644 contrib/api-development/assets/image.png create mode 100644 contrib/api-development/assets/image2.png create mode 100644 contrib/api-development/fast-api.md diff --git a/contrib/api-development/assets/image.png b/contrib/api-development/assets/image.png new file mode 100644 index 0000000000000000000000000000000000000000..682e9ed4aac9a6fba3e490219dbac5226cb569e8 GIT binary patch literal 139430 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 Li{}c?UXA<@z1!r- literal 0 HcmV?d00001 diff --git a/contrib/api-development/assets/image2.png b/contrib/api-development/assets/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..298a726b2f0b33ccfeb7e23ba8bacf3d370cde1a GIT binary patch literal 36188 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

cEZfX@h4yV^Mn^h11ik7u~!Qq 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 literal 0 HcmV?d00001 diff --git a/contrib/api-development/fast-api.md b/contrib/api-development/fast-api.md new file mode 100644 index 0000000..52966d6 --- /dev/null +++ b/contrib/api-development/fast-api.md @@ -0,0 +1,289 @@ + +# FastAPI + + +## Table of Contents + +- [Introduction](#introduction) +- [Features](#features) +- [Installation](#installation) +- [Making First API](#making-first-api) + - [GET Method](#get-method) + - [Running Server and calling API](#running-server-and-calling-api) +- [Path Parameters](#pata-parameters) +- [Query Parameters](#query-parameters) +- [POST Method](#post-method) +- [PUT Method](#put-method) +- [Additional Content](#additional-content) + - [Swagger UI](#swagger-ui) + +## Introduction +FastAPI is a modern, web-framework for building APIs with Python. +It uses python 3.7+ +## Features + +1. **Speed ⚡:** FastAPI is built on top of Starlette, a lightweight ASGI framework. It's designed for high performance and handles thousands of requests per second . +2. **Easy to use 😃:** FastAPI is designed to be intuitive and easy to use, especially for developers familiar with Python. It uses standard Python type hints for request and response validation, making it easy to understand and write code. +3. **Automatic Interactive API Documentation generation 🤩:** FastAPI automatically generates interactive API documentation (Swagger UI or ReDoc) based on your code and type annotations. Swagger UI also allows you to test API endpoints. +4. **Asynchronous Support 🔁:** FastAPI fully supports asynchronous programming, allowing you to write asynchronous code with async/await syntax. This enables handling high-concurrency scenarios and improves overall performance. + +Now, lets get hands-on with FastAPI. + + +## Installation + +Make sure that you have python version 3.7 or greater. + +Then, simply open your command shell and give the following command. + +```bash + pip install fastapi +``` +After this, you need to install uvicorn. uvicorn is an ASGI server on which we will be running our API. + +```bash + pip install uvicorn +``` + + + +## Making First API + +After successful installation we will be moving towards making an API and seeing how to use it. + +Firstly, the first thing in an API is its root/index page which is sent as response when API is called. + +Follow the given steps to make your first FastAPI🫨 + +First, lets import FastAPI to get things started. + +```python +from fastapi import FastAPI +app = FastAPI() +``` +Now, we will write the ``GET`` method for the root of the API. As you have already seen, the GET method is ``HTTP request`` method used to fetch data from a source. In web development, it is primarily used to *retrieve data* from server. + +The root of the app is ``"/"`` When the API will be called, response will be generated by on this url: ```localhost:8000``` + +### GET method +Following is the code to write GET method which will be calling API. + +When the API is called, the ``read_root()`` function will be hit and the JSON response will be returned which will be shown on your web browser. + +```python +@app.get("/") +def read_root(): + return {"Hello": "World"} + +``` + +Tadaaa! you have made your first FastAPI! Now lets run it! + +### Running Server and calling API + +Open your terminal and give following command: +```bash +uvicorn myapi:app --reload +``` +Here, ``myapi`` is the name of your API which is name of your python file. ``app`` is the name you have given to your API in assignment ``app = FastAPI()`` + +After running this command, uvicorn server will be live and you can access your API. + +As right now we have only written root ``GET`` method, only its corresponding response will be displayed. + +On running this API, we get the response in JSON form: + +```json +{ + "Hello": "World" +} +``` +## Path Parameters +Path parameters are a way to send variables to an API endpoint so that an operation may be perfomed on it. + +This feature is particularly useful for defining routes that need to operate on resources identified by unique identifiers, such as user IDs, product IDs, or any other unique value. + +### Example +Lets take an example to make it understandable. + + +Assume that we have some Students 🧑‍🎓 in our class and we have saved their data in form of dictionary in our API (in practical scenarios they will be saved in a database and API will query database). +So we have a student dictionary that looks something like this: + +```python +students = { + 1: { + "name": "John", + "age": 17, + "class": "year 12" + }, + 2: { + "name": "Jane", + "age": 16, + "class": "year 11" + }, + 3: { + "name": "Alice", + "age": 17, + "class": "year 12" + } +} +``` +Here, keys are ``student_id``. + +Let's say user wants the data of the student whose ID is 2. Here, we will take ID as **path parameter** from the user and return the data of that ID. + + +Lets see how it will be done! + +```python +@app.get("/students/{student_id}") +def read_student(student_id: int): + return students[student_id] +``` +Here is the explanatory breakdown of the method: + +- ``/students`` is the URL of students endpoint in API. +- ``{student_id}`` is the path parameter, which is a dynamic variable the user will give to fetch the record of a particular student. +- ``def read_student(student_id: int)`` is the signature of function which takes the student_id we got from path parameter. Its type is defined as ``int`` as our ID will be an integer. +**Note that there will be automatic type checking of the parameter. If it is not same as type defined in method, an Error response ⛔ will be generated.** + +- ``return students[student_id]`` will return the data of required student from dictionary. + +When the user passes the URL ``http://127.0.0.1:8000/students/1`` the data of student with student_id=1 is fetched and displayed. +In this case following output will be displayed: + +```json +{ + "name": "John", + "age": 17, + "class": "year 12" +} +``` + +## Query Parameters +Query parameters in FastAPI allow you to pass data to your API endpoints via the URL's query string. This is useful for filtering, searching, and other operations that do not fit well with the path parameters. + +Query parameters are specified after the ``?`` symbol in the URL and are typically used for optional parameters. + +### Example +Lets continue the example of students to understand the query parameters. + +Assume that we want to search students by name. In this case, we will be sending datat in query parameter which will be read by our method and respective result will be returned. + +Lets see the method: + +```python +@app.get("/get-by-name") +def read_student(name: str): + for student_id in students: + if students[student_id]["name"] == name: + return students[student_id] + return {"Error": "Student not found"} +``` +Here is the explanatory breakdown of this process: + +- ``/get-by-name`` is the URL of the endpoint. After this URL, client will enter the query parameter(s). +- ``http://127.0.0.1:8000/get-by-name?name=Jane`` In this URL, ``name=Jane`` is the query parameter. It means that user needs to search the student whose name is Jane. When you hit this URL, ``read_student(name:str)`` method is called and respective response is returned. + +In this case, the output will be: +```json +{ + "name": "Jane", + "age": 16, + "class": "year 11" +} +``` +If we pass a name that doesn't exist in dictionary, Error response will be returned. + +## POST Method +The ``POST`` method in FastAPI is used to **create resources** or submit data to an API endpoint. This method typically involves sending data in the request body, which the server processes to create or modify resources. + +**⛔ In case of ``GET`` method, sent data is part of URL, but in case of ``POST`` metohod, sent data is part of request body.** + +### Example +Again continuing with the example of student. Now, lets assume we need to add student. Following is the ``POST`` method to do this: + +```python +@app.post("/create-student/{student_id}") +def create_student(student_id: int, student: dict): + if student_id in students: + return {"Error": "Student exists"} + students[student_id] = student + return students +``` +Here is the explanation of process: + +- ``/create-student/{student_id}`` shows that only student_id will be part of URL, rest of the data will be sent in request body. +- Data in the request body will be in JSON format and will be received in ``student: dict`` +- Data sent in JSON format is given as: +```json +{ +"name":"Seerat", +"age":22, +"class":"8 sem" + +} +``` +*Note:* I have used Swagger UI to send data in request body to test my ``POST`` method but you may use any other API tesing tool like Postman etc. + +- This new student will be added in the dictionary, and if operation is successful, new dictionary will be returned as response. + +Following is the output of this ``POST`` method call: + +```json +{ + "1": { + "name": "John", + "age": 17, + "class": "year 12" + }, + "2": { + "name": "Jane", + "age": 16, + "class": "year 11" + }, + "3": { + "name": "Alice", + "age": 17, + "class": "year 12" + }, + "4": { + "name": "Seerat", + "age": 22, + "class": "8 sem" + } +} +``` + +## PUT Method +The ``PUT`` method in FastAPI is used to **update** existing resources or create resources if they do not already exist. It is one of the standard HTTP methods and is idempotent, meaning that multiple identical requests should have the same effect as a single request. + +### Example +Let's update the record of a student. + +```python +@app.put("/update-student/{student_id}") +def update_student(student_id: int, student: dict): + if student_id not in students: + return {"Error": "Student does not exist"} + students[student_id] = student + return students +``` +``PUT`` method is nearly same as ``POST`` method but ``PUT`` is indempotent while ``POST`` is not. + +The given method will update an existing student record and if student doesnt exist, it'll send error response. + +## Additional Content + +### Swagger UI + +Swagger UI automatically generates UI for API tesing. Just write ``/docs`` with the URL and UI mode of Swagger UI will be launched. + +Following Screenshot shows the Swagger UI +![App Screenshot](/assets/image.png) + +Here is how I tested ``POST`` method in UI: +![Screenshot](/assets/image2.png) + +That's all for FastAPI for now.... Happy Learning! \ No newline at end of file diff --git a/contrib/api-development/index.md b/contrib/api-development/index.md index 75c702a..7278907 100644 --- a/contrib/api-development/index.md +++ b/contrib/api-development/index.md @@ -1,3 +1,4 @@ # List of sections - [API Methods](api-methods.md) +- [FastAPI](fast-api.md) \ No newline at end of file From 8dc01e263549680c0cda00b53d49f9d33133a603 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sun, 26 May 2024 21:48:11 +0530 Subject: [PATCH 193/405] Add files via upload --- contrib/pandas/Handling_Missing_Values.md | 273 ++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 contrib/pandas/Handling_Missing_Values.md diff --git a/contrib/pandas/Handling_Missing_Values.md b/contrib/pandas/Handling_Missing_Values.md new file mode 100644 index 0000000..7207d81 --- /dev/null +++ b/contrib/pandas/Handling_Missing_Values.md @@ -0,0 +1,273 @@ +# Handling Missing Values in Pandas + +**Upuntil now we're working on complete data i.e not having any missing values. But in real life it is the one of the main problem.** + +*Many datasets arrive with missing data either because it exists and was not collected or it never existed.* + +In Pandas missing data is represented by two values: + +* `None` : None is simply is `keyword` refer as empty or none. +* `NaN` : Acronym for `Not a Number`. + +**There are several useful functions for detecting, removing, and replacing null values in Pandas DataFrame :** + +1. isnull() +2. notnull() +3. dropna() +4. fillna() +5. replace() + +## 2. Checking for missing values using `isnull()` and `notnull()` + +Let's import pandas and our fancy car-sales dataset having some missing values. + + +```python +import pandas as pd +``` + + +```python +car_sales_missing_df = pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/car-sales-missing-data.csv") +print(car_sales_missing_df) +``` + + Make Colour Odometer Doors Price + 0 Toyota White 150043.0 4.0 $4,000 + 1 Honda Red 87899.0 4.0 $5,000 + 2 Toyota Blue NaN 3.0 $7,000 + 3 BMW Black 11179.0 5.0 $22,000 + 4 Nissan White 213095.0 4.0 $3,500 + 5 Toyota Green NaN 4.0 $4,500 + 6 Honda NaN NaN 4.0 $7,500 + 7 Honda Blue NaN 4.0 NaN + 8 Toyota White 60000.0 NaN NaN + 9 NaN White 31600.0 4.0 $9,700 + + + +```python +## Using isnull() + +print(car_sales_missing_df.isnull()) +``` + + Make Colour Odometer Doors Price + 0 False False False False False + 1 False False False False False + 2 False False True False False + 3 False False False False False + 4 False False False False False + 5 False False True False False + 6 False True True False False + 7 False False True False True + 8 False False False True True + 9 True False False False False + + +Note here: +* `True` means for `NaN` values +* `False` means for no `Nan` values + +If we want to find the number of missing values in each column use `isnull().sum()`. + + +```python +print(car_sales_missing_df.isnull().sum()) +``` + + Make 1 + Colour 1 + Odometer 4 + Doors 1 + Price 2 + dtype: int64 + + +You can also check presense of null values in a single column. + + +```python +print(car_sales_missing_df["Odometer"].isnull()) +``` + + 0 False + 1 False + 2 True + 3 False + 4 False + 5 True + 6 True + 7 True + 8 False + 9 False + Name: Odometer, dtype: bool + + + +```python +## using notnull() + +print(car_sales_missing_df.notnull()) +``` + + Make Colour Odometer Doors Price + 0 True True True True True + 1 True True True True True + 2 True True False True True + 3 True True True True True + 4 True True True True True + 5 True True False True True + 6 True False False True True + 7 True True False True False + 8 True True True False False + 9 False True True True True + + +Note here: +* `True` means no `NaN` values +* `False` means for `NaN` values + +#### A little note here : `isnull()` means having null values so it gives boolean `True` for NaN values. And `notnull()` means having no null values so it gives `True` for no NaN value. + +## 2. Filling missing values using `fillna()`, `replace()`. + + +```python +## Filling missing values with a single value using `fillna` +print(car_sales_missing_df.fillna(0)) +``` + + Make Colour Odometer Doors Price + 0 Toyota White 150043.0 4.0 $4,000 + 1 Honda Red 87899.0 4.0 $5,000 + 2 Toyota Blue 0.0 3.0 $7,000 + 3 BMW Black 11179.0 5.0 $22,000 + 4 Nissan White 213095.0 4.0 $3,500 + 5 Toyota Green 0.0 4.0 $4,500 + 6 Honda 0 0.0 4.0 $7,500 + 7 Honda Blue 0.0 4.0 0 + 8 Toyota White 60000.0 0.0 0 + 9 0 White 31600.0 4.0 $9,700 + + + +```python +## Filling missing values with the previous value using `ffill()` +print(car_sales_missing_df.ffill()) +``` + + Make Colour Odometer Doors Price + 0 Toyota White 150043.0 4.0 $4,000 + 1 Honda Red 87899.0 4.0 $5,000 + 2 Toyota Blue 87899.0 3.0 $7,000 + 3 BMW Black 11179.0 5.0 $22,000 + 4 Nissan White 213095.0 4.0 $3,500 + 5 Toyota Green 213095.0 4.0 $4,500 + 6 Honda Green 213095.0 4.0 $7,500 + 7 Honda Blue 213095.0 4.0 $7,500 + 8 Toyota White 60000.0 4.0 $7,500 + 9 Toyota White 31600.0 4.0 $9,700 + + + +```python +## illing null value with the next ones using 'bfill()' +print(car_sales_missing_df.bfill()) +``` + + Make Colour Odometer Doors Price + 0 Toyota White 150043.0 4.0 $4,000 + 1 Honda Red 87899.0 4.0 $5,000 + 2 Toyota Blue 11179.0 3.0 $7,000 + 3 BMW Black 11179.0 5.0 $22,000 + 4 Nissan White 213095.0 4.0 $3,500 + 5 Toyota Green 60000.0 4.0 $4,500 + 6 Honda Blue 60000.0 4.0 $7,500 + 7 Honda Blue 60000.0 4.0 $9,700 + 8 Toyota White 60000.0 4.0 $9,700 + 9 NaN White 31600.0 4.0 $9,700 + + +#### Filling a null values using `replace()` method + +**Now we are going to replace the all Nan value in the data frame with -125 value** + +*For this we will need numpy also* + + +```python +import numpy as np +``` + + +```python +print(car_sales_missing_df.replace(to_replace = np.nan, value = -125) ) +``` + + Make Colour Odometer Doors Price + 0 Toyota White 150043.0 4.0 $4,000 + 1 Honda Red 87899.0 4.0 $5,000 + 2 Toyota Blue -125.0 3.0 $7,000 + 3 BMW Black 11179.0 5.0 $22,000 + 4 Nissan White 213095.0 4.0 $3,500 + 5 Toyota Green -125.0 4.0 $4,500 + 6 Honda -125 -125.0 4.0 $7,500 + 7 Honda Blue -125.0 4.0 -125 + 8 Toyota White 60000.0 -125.0 -125 + 9 -125 White 31600.0 4.0 $9,700 + + +## 3. Dropping missing values using `dropna()` + +**In order to drop a null values from a dataframe, we used `dropna()` function this function drop Rows/Columns of datasets with Null values in different ways.** + +#### Dropping rows with at least 1 null value. + + +```python +print(car_sales_missing_df.dropna(axis = 0)) ##Now we drop rows with at least one Nan value (Null value) +``` + + Make Colour Odometer Doors Price + 0 Toyota White 150043.0 4.0 $4,000 + 1 Honda Red 87899.0 4.0 $5,000 + 3 BMW Black 11179.0 5.0 $22,000 + 4 Nissan White 213095.0 4.0 $3,500 + + +#### Dropping rows if all values in that row are missing. + + +```python +print(car_sales_missing_df.dropna(how = 'all',axis = 0)) ## If not have leave the row as it is +``` + + Make Colour Odometer Doors Price + 0 Toyota White 150043.0 4.0 $4,000 + 1 Honda Red 87899.0 4.0 $5,000 + 2 Toyota Blue NaN 3.0 $7,000 + 3 BMW Black 11179.0 5.0 $22,000 + 4 Nissan White 213095.0 4.0 $3,500 + 5 Toyota Green NaN 4.0 $4,500 + 6 Honda NaN NaN 4.0 $7,500 + 7 Honda Blue NaN 4.0 NaN + 8 Toyota White 60000.0 NaN NaN + 9 NaN White 31600.0 4.0 $9,700 + + +#### Dropping columns with at least 1 null value + + +```python +print(car_sales_missing_df.dropna(axis = 1)) +``` + + Empty DataFrame + Columns: [] + Index: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + +Now we drop a columns which have at least 1 missing values. + +**Here the dataset becomes empty after dropna() because each column as atleast 1 null value so it remove that columns resulting in an empty dataframe.** From eeef1dc21c19e1275c92fbbb6923b81d0a0635d0 Mon Sep 17 00:00:00 2001 From: Krishna Kaushik <131583096+kRiShNa-429407@users.noreply.github.com> Date: Sun, 26 May 2024 21:50:20 +0530 Subject: [PATCH 194/405] 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 bf677cf..894be52 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -6,3 +6,4 @@ - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [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 be7781b1e35a22cfcbc853bf8cb2c31304308e15 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:16:52 +0530 Subject: [PATCH 195/405] Rename Handling_Missing_Values.md to handling-missing-values.md --- .../{Handling_Missing_Values.md => handling-missing-values.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{Handling_Missing_Values.md => handling-missing-values.md} (100%) diff --git a/contrib/pandas/Handling_Missing_Values.md b/contrib/pandas/handling-missing-values.md similarity index 100% rename from contrib/pandas/Handling_Missing_Values.md rename to contrib/pandas/handling-missing-values.md From ad6fd6b6233140c0e128cdd424409247921d1b6f Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:17:16 +0530 Subject: [PATCH 196/405] 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 894be52..c71c324 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -6,4 +6,4 @@ - [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) - [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) +- [Handling Missing Values in Pandas](handling-missing-values.md) From 5d15c73a87290afdf5cf8928f92e4f315b6e4c74 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:17:31 +0530 Subject: [PATCH 197/405] Update car-sales-missing-data.csv --- contrib/pandas/Datasets/car-sales-missing-data.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/pandas/Datasets/car-sales-missing-data.csv b/contrib/pandas/Datasets/car-sales-missing-data.csv index e34cd5f..21a3157 100644 --- a/contrib/pandas/Datasets/car-sales-missing-data.csv +++ b/contrib/pandas/Datasets/car-sales-missing-data.csv @@ -8,4 +8,4 @@ Toyota,Green,,4,"$4,500" Honda,,,4,"$7,500" Honda,Blue,,4, Toyota,White,60000,, -,White,31600,4,"$9,700" \ No newline at end of file +,White,31600,4,"$9,700" From 8c95bb1de779e455c53c52bd22622b8a533d63c4 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:21:10 +0530 Subject: [PATCH 198/405] Update handling-missing-values.md --- contrib/pandas/handling-missing-values.md | 37 +++++++++-------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/contrib/pandas/handling-missing-values.md b/contrib/pandas/handling-missing-values.md index 7207d81..da6c377 100644 --- a/contrib/pandas/handling-missing-values.md +++ b/contrib/pandas/handling-missing-values.md @@ -1,34 +1,28 @@ # Handling Missing Values in Pandas -**Upuntil now we're working on complete data i.e not having any missing values. But in real life it is the one of the main problem.** - -*Many datasets arrive with missing data either because it exists and was not collected or it never existed.* +In real life, many datasets arrive with missing data either because it exists and was not collected or it never existed. In Pandas missing data is represented by two values: * `None` : None is simply is `keyword` refer as empty or none. * `NaN` : Acronym for `Not a Number`. -**There are several useful functions for detecting, removing, and replacing null values in Pandas DataFrame :** +There are several useful functions for detecting, removing, and replacing null values in Pandas DataFrame: -1. isnull() -2. notnull() -3. dropna() -4. fillna() -5. replace() +1. `isnull()` +2. `notnull()` +3. `dropna()` +4. `fillna()` +5. `replace()` ## 2. Checking for missing values using `isnull()` and `notnull()` Let's import pandas and our fancy car-sales dataset having some missing values. - ```python import pandas as pd -``` - -```python -car_sales_missing_df = pd.read_csv("https://raw.githubusercontent.com/kRiShNa-429407/learn-python/main/contrib/pandas/Datasets/car-sales-missing-data.csv") +car_sales_missing_df = pd.read_csv("Datasets/car-sales-missing-data.csv") print(car_sales_missing_df) ``` @@ -128,7 +122,7 @@ Note here: * `True` means no `NaN` values * `False` means for `NaN` values -#### A little note here : `isnull()` means having null values so it gives boolean `True` for NaN values. And `notnull()` means having no null values so it gives `True` for no NaN value. +`isnull()` means having null values so it gives boolean `True` for NaN values. And `notnull()` means having no null values so it gives `True` for no NaN value. ## 2. Filling missing values using `fillna()`, `replace()`. @@ -191,18 +185,15 @@ print(car_sales_missing_df.bfill()) #### Filling a null values using `replace()` method -**Now we are going to replace the all Nan value in the data frame with -125 value** +Now we are going to replace the all `NaN` value in the data frame with -125 value -*For this we will need numpy also* +For this we will also need numpy ```python import numpy as np -``` - -```python -print(car_sales_missing_df.replace(to_replace = np.nan, value = -125) ) +print(car_sales_missing_df.replace(to_replace = np.nan, value = -125)) ``` Make Colour Odometer Doors Price @@ -220,7 +211,7 @@ print(car_sales_missing_df.replace(to_replace = np.nan, value = -125) ) ## 3. Dropping missing values using `dropna()` -**In order to drop a null values from a dataframe, we used `dropna()` function this function drop Rows/Columns of datasets with Null values in different ways.** +In order to drop a null values from a dataframe, we used `dropna()` function this function drop Rows/Columns of datasets with Null values in different ways. #### Dropping rows with at least 1 null value. @@ -270,4 +261,4 @@ print(car_sales_missing_df.dropna(axis = 1)) Now we drop a columns which have at least 1 missing values. -**Here the dataset becomes empty after dropna() because each column as atleast 1 null value so it remove that columns resulting in an empty dataframe.** +Here the dataset becomes empty after `dropna()` because each column as atleast 1 null value so it remove that columns resulting in an empty dataframe. From 02081e65791893aa1075b0d2a12a1b731e40a5d6 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:23:06 +0530 Subject: [PATCH 199/405] Update fast-api.md --- contrib/api-development/fast-api.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contrib/api-development/fast-api.md b/contrib/api-development/fast-api.md index 52966d6..b67c56e 100644 --- a/contrib/api-development/fast-api.md +++ b/contrib/api-development/fast-api.md @@ -281,9 +281,9 @@ The given method will update an existing student record and if student doesnt ex Swagger UI automatically generates UI for API tesing. Just write ``/docs`` with the URL and UI mode of Swagger UI will be launched. Following Screenshot shows the Swagger UI -![App Screenshot](/assets/image.png) +![App Screenshot](assets/image.png) Here is how I tested ``POST`` method in UI: -![Screenshot](/assets/image2.png) +![Screenshot](assets/image2.png) -That's all for FastAPI for now.... Happy Learning! \ No newline at end of file +That's all for FastAPI for now.... Happy Learning! From 1c6166e03c00415a836f784659b9016f91695dc3 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:38:32 +0530 Subject: [PATCH 200/405] Rename Linked-list.md to linked-list.md --- contrib/ds-algorithms/{Linked-list.md => linked-list.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/ds-algorithms/{Linked-list.md => linked-list.md} (100%) diff --git a/contrib/ds-algorithms/Linked-list.md b/contrib/ds-algorithms/linked-list.md similarity index 100% rename from contrib/ds-algorithms/Linked-list.md rename to contrib/ds-algorithms/linked-list.md From fd0c10df6bb1e5c3d11e42861db95dc212aa9777 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:39:03 +0530 Subject: [PATCH 201/405] Update linked-list.md --- contrib/ds-algorithms/linked-list.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/contrib/ds-algorithms/linked-list.md b/contrib/ds-algorithms/linked-list.md index 11f4016..ddbc6d5 100644 --- a/contrib/ds-algorithms/linked-list.md +++ b/contrib/ds-algorithms/linked-list.md @@ -220,13 +220,3 @@ Here are a few practical applications of linked lists in various fields: 4. **Speech Recognition**: Speech recognition software uses linked lists to represent possible phonetic pronunciations of words. Each potential pronunciation is a node, allowing the software to dynamically explore different pronunciation paths as it processes spoken input. This method helps in accurately recognizing and understanding speech by considering multiple possibilities in a flexible manner, much like evaluating various potential meanings in a conversation. These examples illustrate how linked lists provide a flexible, dynamic data structure that can be adapted to a wide range of practical applications, making them a valuable tool in both software development and real-world problem-solving. - - - - - - - - - - From 76df5a6a9fb679418444caed6e233c456f19991d Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:39:22 +0530 Subject: [PATCH 202/405] Update index.md --- contrib/ds-algorithms/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 4b6e20d..c61ca0b 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -8,4 +8,4 @@ - [Searching Algorithms](searching-algorithms.md) - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) -- [Linked list](Linked-list.md) +- [Linked list](linked-list.md) From 8f0a0865d944d30d121fb4c14122cd8c431e4bf9 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:40:56 +0530 Subject: [PATCH 203/405] 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 edb0860..ce42538 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -7,4 +7,4 @@ - [Support Vector Machine Algorithm](support-vector-machine.md) - [Artificial Neural Network from the Ground Up](ArtificialNeuralNetwork.md) - [TensorFlow.md](tensorFlow.md) -- [PyTorch.md](PyTorch.md) +- [PyTorch.md](pytorch.md) From d9129ccde313a1b3ef56d102da5abb5ba09da076 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:41:13 +0530 Subject: [PATCH 204/405] Rename PyTorch.md to pytorch.md --- contrib/machine-learning/{PyTorch.md => pytorch.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{PyTorch.md => pytorch.md} (99%) diff --git a/contrib/machine-learning/PyTorch.md b/contrib/machine-learning/pytorch.md similarity index 99% rename from contrib/machine-learning/PyTorch.md rename to contrib/machine-learning/pytorch.md index 7de853b..ccfee21 100644 --- a/contrib/machine-learning/PyTorch.md +++ b/contrib/machine-learning/pytorch.md @@ -110,4 +110,4 @@ PyTorch is a powerful and flexible deep learning framework that caters to both r - [PyTorch Tutorials](https://pytorch.org/tutorials/) - [PyTorch Forum](https://discuss.pytorch.org/) -Feel free to explore and experiment with PyTorch to harness the full potential of this versatile framework! \ No newline at end of file +Feel free to explore and experiment with PyTorch to harness the full potential of this versatile framework! From 8761dcec7a3b333b8562724b77c740a25e7b4012 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:49:39 +0530 Subject: [PATCH 205/405] Rename introduction-to-flask-a-python-web-framework.md to flask.md --- ...introduction-to-flask-a-python-web-framework.md => flask.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/web-scrapping/{introduction-to-flask-a-python-web-framework.md => flask.md} (99%) diff --git a/contrib/web-scrapping/introduction-to-flask-a-python-web-framework.md b/contrib/web-scrapping/flask.md similarity index 99% rename from contrib/web-scrapping/introduction-to-flask-a-python-web-framework.md rename to contrib/web-scrapping/flask.md index 957f39b..fbd1829 100644 --- a/contrib/web-scrapping/introduction-to-flask-a-python-web-framework.md +++ b/contrib/web-scrapping/flask.md @@ -437,4 +437,4 @@ Flask is a powerful and flexible framework for building web applications in Pyth - Flask Documentation: https://flask.palletsprojects.com/en/latest/ - Jinja2 Documentation: https://jinja.palletsprojects.com/en/latest/ - SQLAlchemy Documentation: https://docs.sqlalchemy.org/en/latest/ -- Render Documentation: https://render.com/docs \ No newline at end of file +- Render Documentation: https://render.com/docs From 2acbfeab38ba07eccb00c4e3281f9ff60a8f53f9 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:50:06 +0530 Subject: [PATCH 206/405] Update flask.md --- contrib/web-scrapping/flask.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/contrib/web-scrapping/flask.md b/contrib/web-scrapping/flask.md index fbd1829..d65da02 100644 --- a/contrib/web-scrapping/flask.md +++ b/contrib/web-scrapping/flask.md @@ -1,7 +1,3 @@ -Sure, here's the guide without Markdown formatting: - ---- - # Introduction to Flask: A Python Web Framework ## Table of Contents From b0e24b769f157a3776512305ac10ffab0d3f8ae7 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 08:50:47 +0530 Subject: [PATCH 207/405] Update index.md --- contrib/web-scrapping/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/web-scrapping/index.md b/contrib/web-scrapping/index.md index a78be3d..276014e 100644 --- a/contrib/web-scrapping/index.md +++ b/contrib/web-scrapping/index.md @@ -1,4 +1,4 @@ # List of sections - [Section title](filename.md) -- [Introduction-to-flask-a-python-web-framework](introduction-to-flask-a-python-web-framework.md) +- [Introduction to Flask](flask.md) From dcf0065e1216c106657115354c0d90c5b242c079 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 09:04:27 +0530 Subject: [PATCH 208/405] Update sorting-algorithms.md --- contrib/ds-algorithms/sorting-algorithms.md | 69 +++++++++------------ 1 file changed, 29 insertions(+), 40 deletions(-) diff --git a/contrib/ds-algorithms/sorting-algorithms.md b/contrib/ds-algorithms/sorting-algorithms.md index 6423b4b..09eccd7 100644 --- a/contrib/ds-algorithms/sorting-algorithms.md +++ b/contrib/ds-algorithms/sorting-algorithms.md @@ -2,14 +2,15 @@ In computer science, a sorting algorithm takes a collection of items and arranges them in a specific order. This order is usually determined by comparing the items using a defined rule. -## Real Life Example of Sorting +Real Life Example of Sorting + - Sorting a deck of cards - Sorting names in alphabetical order - Sorting a list of items, etc. -# Some common sorting techniques +Some common sorting techniques: -# 1. Bubble Sort +## 1. Bubble Sort Bubble sort is a basic sorting technique that iteratively steps through a list, comparing neighboring elements. If elements are out of order, it swaps them. While easy to understand, bubble sort becomes inefficient for large datasets due to its slow execution time. @@ -21,7 +22,7 @@ Bubble sort is a basic sorting technique that iteratively steps through a list, - **Repeating Until Sorted:** The algorithm continues making passes through the list until no more swaps are needed. This indicates the entire list is sorted. -## Bubble Sort Code in Python +### Bubble Sort Code in Python ```python def bubble_sort(arr): @@ -35,7 +36,8 @@ arr = [5, 3, 8, 1, 2] bubble_sort(arr) print("Sorted array:", arr) # Output: [1, 2, 3, 5, 8] ``` -## Example with Visualization + +### Example with Visualization Let's sort the list `[5, 3, 8, 1, 2]` using bubble sort. @@ -53,17 +55,13 @@ Let's sort the list `[5, 3, 8, 1, 2]` using bubble sort. - Comparing neighbors: `[1, 2, 3, 5, 8]` - No swapping needed, the list is already sorted. -## Complexity Analysis +### Complexity Analysis - **Worst Case:** `O(n^2)` comparisons and swaps. This happens when the list is in reverse order, and we need to make maximum swaps. - **Best Case:** `O(n)` comparisons. This occurs when the list is already sorted, but we still need O(n^2) swaps because of the nested loops. - **Average Case:** `O(n^2)` comparisons and swaps. This is the expected number of comparisons and swaps over all possible input sequences. -
-


-
- -# 2. Selection Sort +## 2. Selection Sort Selection sort is a simple sorting algorithm that divides the input list into two parts: a sorted sublist and an unsorted sublist. The algorithm repeatedly finds the smallest (or largest, depending on sorting order) element from the unsorted sublist and moves it to the sorted sublist. It's not efficient for large datasets but performs better than bubble sort due to fewer swaps. @@ -73,7 +71,7 @@ Selection sort is a simple sorting algorithm that divides the input list into tw - **Expanding the Sorted Sublist:** As elements are moved to the sorted sublist, it expands until all elements are sorted. - **Repeating Until Sorted:** The process continues until the entire list is sorted. -## Example with Visualization +### Example with Visualization Let's sort the list `[5, 3, 8, 1, 2]` using selection sort. @@ -97,7 +95,7 @@ Let's sort the list `[5, 3, 8, 1, 2]` using selection sort. - Find the minimum: `5` - No swapping needed, the list is already sorted. -## Selection Sort Code in Python +### Selection Sort Code in Python ```python def selection_sort(arr): @@ -114,15 +112,13 @@ selection_sort(arr) print("Sorted array:", arr) # Output: [1, 2, 3, 5, 8] ``` -## Complexity Analysis +### Complexity Analysis + - **Worst Case**: `O(n^2)` comparisons and O(n) swaps. This occurs when the list is in reverse order, and we need to make maximum comparisons and swaps. - **Best Case**: `O(n^2)` comparisons and O(n) swaps. This happens when the list is in sorted order, but the algorithm still needs to iterate through all elements for comparisons. - **Average Case**: `O(n^2)` comparisons and O(n) swaps. This is the expected number of comparisons and swaps over all possible input sequences. -
-
-
-# 3. Quick Sort +## 3. Quick Sort Quick sort is a popular divide-and-conquer sorting algorithm known for its efficiency on average. It works by selecting a 'pivot' element from the array and partitioning the other elements into two sub-arrays according to whether they are less than or greater than the pivot. The sub-arrays are then recursively sorted. **Algorithm Overview:** @@ -131,29 +127,24 @@ Quick sort is a popular divide-and-conquer sorting algorithm known for its effic - **Recursion:** Apply the above steps recursively to the sub-arrays formed by partitioning until the base case is reached. The base case is usually when the size of the sub-array becomes 0 or 1, indicating it is already sorted. - **Base Case:** If the sub-array size becomes 0 or 1, it is already sorted. -## Example with Visualization +### Example with Visualization Let's sort the list `[5, 3, 8, 1, 2]` using quick sort. 1. **Initial Array:** `[5, 3, 8, 1, 2]` - 2. **Choose Pivot:** Let's choose the last element, `2`, as the pivot. - 3. **Partitioning:** - We'll partition the array around the pivot `2`. All elements less than `2` will be placed to its left, and all elements greater than `2` will be placed to its right. - - After partitioning, the array becomes `[1, 2, 5, 3, 8]`. The pivot element, `2`, is now in its correct sorted position. - 4. **Recursion:** - Now, we recursively sort the sub-arrays `[1]` and `[5, 3, 8]`. - For the sub-array `[5, 3, 8]`, we choose `8` as the pivot and partition it. - After partitioning, the sub-array becomes `[3, 5, 8]`. The pivot element, `8`, is now in its correct sorted position. - - 5. **Concatenation:** - Concatenating the sorted sub-arrays `[1]`, `[2]`, `[3, 5, 8]`, we get the final sorted array `[1, 2, 3, 5, 8]`. -## Quick Sort Code in Python (Iterative) +### Quick Sort Code in Python (Iterative) + ```python def partition(arr, low, high): pivot = arr[high] @@ -180,7 +171,8 @@ quick_sort_iterative(arr) print("Sorted array:", arr) # Output: [3, 9, 10, 27, 38, 43, 82] ``` -## Quick Sort Code in Python (Recursive) + +### Quick Sort Code in Python (Recursive) ```python def quick_sort(arr): @@ -196,17 +188,15 @@ arr = [5, 3, 8, 1, 2] sorted_arr = quick_sort(arr) print("Sorted array:", sorted_arr) # Output: [1, 2, 3, 5, 8] ``` -## Complexity Analysis + +### Complexity Analysis - **Worst Case**: The worst-case time complexity of quick sort is `O(n^2)`. This occurs when the pivot selection consistently results in unbalanced partitioning, such as choosing the smallest or largest element as the pivot. -**Best Case**: The best-case time complexity is `O(n log n)`. This happens when the pivot selection leads to well-balanced partitioning, halving the array size in each recursive call. - **Average Case**: The average-case time complexity is `O(n log n)`. This is the expected time complexity when the pivot selection results in reasonably balanced partitioning across recursive calls. - **Space Complexity**: Quick sort has an `O(log n)` space complexity for the recursion stack, as it recursively sorts sub-arrays. -
-
-
-# 4. Merge Sort +## 4. Merge Sort Merge sort is a divide-and-conquer algorithm that recursively divides the input list into smaller sublists until each sublist contains only one element. Then, it repeatedly merges adjacent sublists while maintaining the sorted order until there is only one sublist remaining, which represents the sorted list. @@ -214,7 +204,7 @@ Merge sort is a divide-and-conquer algorithm that recursively divides the input - **Divide:** Split the input list into smaller sublists recursively until each sublist contains only one element. - **Merge:** Repeatedly merge adjacent sublists while maintaining the sorted order until there is only one sublist remaining, which represents the sorted list. -## Example with Visualization +### Example with Visualization Let's sort the list `[38, 27, 43, 3, 9, 82, 10]` using merge sort. @@ -233,7 +223,7 @@ Let's sort the list `[38, 27, 43, 3, 9, 82, 10]` using merge sort. 3. **Final Sorted List:** - `[3, 9, 10, 27, 38, 43, 82]` -## Merge Sort Code in Python (Iterative) +### Merge Sort Code in Python (Iterative) ```python def merge_sort_iterative(arr): @@ -280,7 +270,9 @@ arr = [38, 27, 43, 3, 9, 82, 10] merge_sort_iterative(arr) print("Sorted array:", arr) # Output: [3, 9, 10, 27, 38, 43, 82] ``` -## Merge Sort Code in Python (Recursive) + +### Merge Sort Code in Python (Recursive) + ```python def merge_sort(arr): if len(arr) > 1: @@ -320,10 +312,7 @@ arr = [38, 27, 43, 3, 9, 82, 10] merge_sort(arr) print("Sorted array:", arr) # Output: [3, 9, 10, 27, 38, 43, 82] ``` -## Complexity Analysis + +### Complexity Analysis - **Time Complexity**: `O(n log n)` for all cases. Merge sort always divides the list into halves until each sublist contains only one element, and then merges them back together, resulting in O(n log n) time complexity. - **Space Complexity**: `O(n)` auxiliary space. In the iterative version, merge sort uses additional space for creating temporary sublists during merging operations. - -
-
-
From 9d35a7fd1827eebce44a08660ed7f9e5cc4496b4 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 09:36:18 +0530 Subject: [PATCH 209/405] Rename sorting_numpy_array.md to sorting-array.md --- contrib/numpy/{sorting_numpy_array.md => sorting-array.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/numpy/{sorting_numpy_array.md => sorting-array.md} (100%) diff --git a/contrib/numpy/sorting_numpy_array.md b/contrib/numpy/sorting-array.md similarity index 100% rename from contrib/numpy/sorting_numpy_array.md rename to contrib/numpy/sorting-array.md From 8c756d0534fda5ba190575b64df40290058eb239 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Mon, 27 May 2024 09:36:37 +0530 Subject: [PATCH 210/405] 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 4b4a2c8..b2d459a 100644 --- a/contrib/numpy/index.md +++ b/contrib/numpy/index.md @@ -7,4 +7,4 @@ - [Operations on Arrays in NumPy](operations-on-arrays.md) - [Loading Arrays from Files](loading_arrays_from_files.md) - [Saving Numpy Arrays into FIles](saving_numpy_arrays_to_files.md) -- [Sorting NumPy Arrays](sorting_numpy_array.md) +- [Sorting NumPy Arrays](sorting-array.md) 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 211/405] 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 212/405] 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 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 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 a32635c40089e1d82de3709cbc7e04a7050308ac Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 18:48:59 +0530 Subject: [PATCH 213/405] first --- contrib/machine-learning/Random_Forest.md | 175 ++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 contrib/machine-learning/Random_Forest.md diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md new file mode 100644 index 0000000..3506a34 --- /dev/null +++ b/contrib/machine-learning/Random_Forest.md @@ -0,0 +1,175 @@ +Random Forest +Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). + +Table of Contents +Introduction +How Random Forest Works +Advantages and Disadvantages +Hyperparameters +Code Examples +Classification Example +Feature Importance +Hyperparameter Tuning +Regression Example +Conclusion +References +Introduction +Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. + +How Random Forest Works +Bootstrap Sampling: +Random subsets of the training dataset are created with replacement. Each subset is used to train an individual tree. +Decision Trees: +Multiple decision trees are trained on these subsets. +Feature Selection: +At each split in the decision tree, a random selection of features is chosen. This randomness helps create diverse trees. +Voting/Averaging: +For classification, the mode of the classes predicted by individual trees is taken (majority vote). +For regression, the average of the outputs of the individual trees is taken. +Detailed Working Mechanism +Step 1: Bootstrap Sampling: Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. +Step 2: Tree Construction: Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. +Step 3: Aggregation: For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. +Advantages and Disadvantages +Advantages +Robustness: Reduces overfitting and generalizes well due to the law of large numbers. +Accuracy: Often provides high accuracy because of the ensemble method. +Versatility: Can be used for both classification and regression tasks. +Handles Missing Values: Can handle missing data better than many other algorithms. +Feature Importance: Provides estimates of feature importance, which can be valuable for understanding the model. +Disadvantages +Complexity: More complex than individual decision trees, making interpretation difficult. +Computational Cost: Requires more computational resources due to multiple trees. +Training Time: Can be slow to train compared to simpler models, especially with large datasets. +Hyperparameters +Key Hyperparameters +n_estimators: The number of trees in the forest. +max_features: The number of features to consider when looking for the best split. +max_depth: The maximum depth of the tree. +min_samples_split: The minimum number of samples required to split an internal node. +min_samples_leaf: The minimum number of samples required to be at a leaf node. +bootstrap: Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree. +Tuning Hyperparameters +Hyperparameter tuning can significantly improve the performance of a Random Forest model. Common techniques include Grid Search and Random Search. + +Code Examples +Classification Example +Below is a simple example of using Random Forest for a classification task with the Iris dataset. + +python +Copy code +import numpy as np +import pandas as pd +from sklearn.datasets import load_iris +from sklearn.ensemble import RandomForestClassifier +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score, classification_report + +# Load dataset +iris = load_iris() +X, y = iris.data, iris.target + +# Split dataset +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Initialize Random Forest model +clf = RandomForestClassifier(n_estimators=100, random_state=42) + +# Train the model +clf.fit(X_train, y_train) + +# Make predictions +y_pred = clf.predict(X_test) + +# Evaluate the model +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +print("Classification Report:\n", classification_report(y_test, y_pred)) +Feature Importance +Random Forest provides a way to measure the importance of each feature in making predictions. + +python +Copy code +import matplotlib.pyplot as plt + +# Get feature importances +importances = clf.feature_importances_ +indices = np.argsort(importances)[::-1] + +# Print feature ranking +print("Feature ranking:") +for f in range(X.shape[1]): + print(f"{f + 1}. Feature {indices[f]} ({importances[indices[f]]})") + +# Plot the feature importances +plt.figure() +plt.title("Feature importances") +plt.bar(range(X.shape[1]), importances[indices], align='center') +plt.xticks(range(X.shape[1]), indices) +plt.xlim([-1, X.shape[1]]) +plt.show() +Hyperparameter Tuning +Using Grid Search for hyperparameter tuning. + +python +Copy code +from sklearn.model_selection import GridSearchCV + +# Define the parameter grid +param_grid = { + 'n_estimators': [100, 200, 300], + 'max_features': ['auto', 'sqrt', 'log2'], + 'max_depth': [4, 6, 8, 10, 12], + 'criterion': ['gini', 'entropy'] +} + +# Initialize the Grid Search model +grid_search = GridSearchCV(estimator=clf, param_grid=param_grid, cv=3, n_jobs=-1, verbose=2) + +# Fit the model +grid_search.fit(X_train, y_train) + +# Print the best parameters +print("Best parameters found: ", grid_search.best_params_) +Regression Example +Below is a simple example of using Random Forest for a regression task with the Boston housing dataset. + +python +Copy code +import numpy as np +import pandas as pd +from sklearn.datasets import load_boston +from sklearn.ensemble import RandomForestRegressor +from sklearn.model_selection import train_test_split +from sklearn.metrics import mean_squared_error, r2_score + +# Load dataset +boston = load_boston() +X, y = boston.data, boston.target + +# Split dataset +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Initialize Random Forest model +regr = RandomForestRegressor(n_estimators=100, random_state=42) + +# Train the model +regr.fit(X_train, y_train) + +# Make predictions +y_pred = regr.predict(X_test) + +# Evaluate the model +mse = mean_squared_error(y_test, y_pred) +r2 = r2_score(y_test, y_pred) +print(f"Mean Squared Error: {mse:.2f}") +print(f"R^2 Score: {r2:.2f}") +Conclusion +Random Forest is a powerful and flexible machine learning algorithm that can handle both classification and regression tasks. Its ability to create an ensemble of decision trees leads to robust and accurate models. However, it is important to be mindful of the computational cost associated with training multiple trees. + +References +Scikit-learn Random Forest Documentation +Wikipedia: Random Forest +Machine Learning Mastery: Introduction to Random Forest +Kaggle: Random Forest Guide +Towards Data Science: Understanding Random Forests \ No newline at end of file From 9e1a20de440dc20bd465e20fe2b0709241ac3595 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:19:52 +0530 Subject: [PATCH 214/405] second --- contrib/machine-learning/Random_Forest.md | 97 ++++++++++++----------- 1 file changed, 52 insertions(+), 45 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index 3506a34..8c62255 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -1,7 +1,8 @@ -Random Forest +# Random Forest + Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). -Table of Contents +## Table of Contents Introduction How Random Forest Works Advantages and Disadvantages @@ -13,51 +14,54 @@ Hyperparameter Tuning Regression Example Conclusion References -Introduction + +## Introduction Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. -How Random Forest Works -Bootstrap Sampling: -Random subsets of the training dataset are created with replacement. Each subset is used to train an individual tree. -Decision Trees: -Multiple decision trees are trained on these subsets. -Feature Selection: -At each split in the decision tree, a random selection of features is chosen. This randomness helps create diverse trees. -Voting/Averaging: +## How Random Forest Works +### 1. Bootstrap Sampling: +* Random subsets of the training dataset are created with replacement. Each subset is used to train an individual tree. +### 2. Decision Trees: +* Multiple decision trees are trained on these subsets. +### 3. Feature Selection: +* At each split in the decision tree, a random selection of features is chosen. This randomness helps create diverse trees. +### 4. Voting/Averaging: For classification, the mode of the classes predicted by individual trees is taken (majority vote). For regression, the average of the outputs of the individual trees is taken. -Detailed Working Mechanism -Step 1: Bootstrap Sampling: Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. -Step 2: Tree Construction: Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. -Step 3: Aggregation: For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. -Advantages and Disadvantages -Advantages -Robustness: Reduces overfitting and generalizes well due to the law of large numbers. -Accuracy: Often provides high accuracy because of the ensemble method. -Versatility: Can be used for both classification and regression tasks. -Handles Missing Values: Can handle missing data better than many other algorithms. -Feature Importance: Provides estimates of feature importance, which can be valuable for understanding the model. -Disadvantages -Complexity: More complex than individual decision trees, making interpretation difficult. -Computational Cost: Requires more computational resources due to multiple trees. -Training Time: Can be slow to train compared to simpler models, especially with large datasets. -Hyperparameters -Key Hyperparameters -n_estimators: The number of trees in the forest. -max_features: The number of features to consider when looking for the best split. -max_depth: The maximum depth of the tree. -min_samples_split: The minimum number of samples required to split an internal node. -min_samples_leaf: The minimum number of samples required to be at a leaf node. -bootstrap: Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree. -Tuning Hyperparameters +### Detailed Working Mechanism +* #### Step 1: Bootstrap Sampling: + Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. +* #### Step 2: Tree Construction: + Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. +#### Step 3: Aggregation: + For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. +### Advantages and Disadvantages +#### Advantages +* Robustness: Reduces overfitting and generalizes well due to the law of large numbers. +* Accuracy: Often provides high accuracy because of the ensemble method. +* Versatility: Can be used for both classification and regression tasks. +* Handles Missing Values: Can handle missing data better than many other algorithms. +* Feature Importance: Provides estimates of feature importance, which can be valuable for understanding the model. +#### Disadvantages +* Complexity: More complex than individual decision trees, making interpretation difficult. +* Computational Cost: Requires more computational resources due to multiple trees. +* Training Time: Can be slow to train compared to simpler models, especially with large datasets. +### Hyperparameters +#### Key Hyperparameters +* n_estimators: The number of trees in the forest. +* max_features: The number of features to consider when looking for the best split. +* max_depth: The maximum depth of the tree. +* min_samples_split: The minimum number of samples required to split an internal node. +* min_samples_leaf: The minimum number of samples required to be at a leaf node. +* bootstrap: Whether bootstrap samples are used when building trees. If False, the whole dataset is used to build each tree. +##### Tuning Hyperparameters Hyperparameter tuning can significantly improve the performance of a Random Forest model. Common techniques include Grid Search and Random Search. -Code Examples -Classification Example +### Code Examples +#### Classification Example Below is a simple example of using Random Forest for a classification task with the Iris dataset. -python -Copy code +''' import numpy as np import pandas as pd from sklearn.datasets import load_iris @@ -85,11 +89,14 @@ y_pred = clf.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy * 100:.2f}%") print("Classification Report:\n", classification_report(y_test, y_pred)) -Feature Importance + +''' + +#### Feature Importance Random Forest provides a way to measure the importance of each feature in making predictions. -python -Copy code + +''' import matplotlib.pyplot as plt # Get feature importances @@ -108,11 +115,11 @@ plt.bar(range(X.shape[1]), importances[indices], align='center') plt.xticks(range(X.shape[1]), indices) plt.xlim([-1, X.shape[1]]) plt.show() -Hyperparameter Tuning +''' +#### Hyperparameter Tuning Using Grid Search for hyperparameter tuning. -python -Copy code +''' from sklearn.model_selection import GridSearchCV # Define the parameter grid From d138b0e6252f0cf28be7e014f8625352c4e90dd1 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:23:51 +0530 Subject: [PATCH 215/405] third --- contrib/machine-learning/Random_Forest.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index 8c62255..a3672d0 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -61,7 +61,7 @@ Hyperparameter tuning can significantly improve the performance of a Random Fore #### Classification Example Below is a simple example of using Random Forest for a classification task with the Iris dataset. -''' +``` import numpy as np import pandas as pd from sklearn.datasets import load_iris @@ -69,6 +69,7 @@ from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, classification_report + # Load dataset iris = load_iris() X, y = iris.data, iris.target @@ -90,13 +91,13 @@ accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy: {accuracy * 100:.2f}%") print("Classification Report:\n", classification_report(y_test, y_pred)) -''' +``` #### Feature Importance Random Forest provides a way to measure the importance of each feature in making predictions. -''' +``` import matplotlib.pyplot as plt # Get feature importances @@ -115,11 +116,11 @@ plt.bar(range(X.shape[1]), importances[indices], align='center') plt.xticks(range(X.shape[1]), indices) plt.xlim([-1, X.shape[1]]) plt.show() -''' +``` #### Hyperparameter Tuning Using Grid Search for hyperparameter tuning. -''' +``` from sklearn.model_selection import GridSearchCV # Define the parameter grid @@ -138,11 +139,11 @@ grid_search.fit(X_train, y_train) # Print the best parameters print("Best parameters found: ", grid_search.best_params_) -Regression Example +``` +#### Regression Example Below is a simple example of using Random Forest for a regression task with the Boston housing dataset. -python -Copy code +``` import numpy as np import pandas as pd from sklearn.datasets import load_boston @@ -171,10 +172,11 @@ mse = mean_squared_error(y_test, y_pred) r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") print(f"R^2 Score: {r2:.2f}") -Conclusion +``` +### Conclusion Random Forest is a powerful and flexible machine learning algorithm that can handle both classification and regression tasks. Its ability to create an ensemble of decision trees leads to robust and accurate models. However, it is important to be mindful of the computational cost associated with training multiple trees. -References +### References Scikit-learn Random Forest Documentation Wikipedia: Random Forest Machine Learning Mastery: Introduction to Random Forest From 834aade79acb60eb6cfc8dae1731ac93f794c2b6 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:41:22 +0530 Subject: [PATCH 216/405] third --- contrib/machine-learning/Random_Forest.md | 36 +++++++++++++++-------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index a3672d0..d2d7f5c 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -2,18 +2,30 @@ Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). -## Table of Contents -Introduction -How Random Forest Works -Advantages and Disadvantages -Hyperparameters -Code Examples -Classification Example -Feature Importance -Hyperparameter Tuning -Regression Example -Conclusion -References + +- [Random Forest](#random-forest) + - [Introduction](#introduction) + - [How Random Forest Works](#how-random-forest-works) + - [1. Bootstrap Sampling:](#1-bootstrap-sampling) + - [2. Decision Trees:](#2-decision-trees) + - [3. Feature Selection:](#3-feature-selection) + - [4. Voting/Averaging:](#4-votingaveraging) + - [Detailed Working Mechanism](#detailed-working-mechanism) + - [Step 3: Aggregation:](#step-3-aggregation) + - [Advantages and Disadvantages](#advantages-and-disadvantages) + - [Advantages](#advantages) + - [Disadvantages](#disadvantages) + - [Hyperparameters](#hyperparameters) + - [Key Hyperparameters](#key-hyperparameters) + - [Tuning Hyperparameters](#tuning-hyperparameters) + - [Code Examples](#code-examples) + - [Classification Example](#classification-example) + - [Feature Importance](#feature-importance) + - [Hyperparameter Tuning](#hyperparameter-tuning) + - [Regression Example](#regression-example) + - [Conclusion](#conclusion) + - [References](#references) + ## Introduction Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. From 0185122fb9ae4aada0feff6cd45f1e688644ad1c Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 19:48:33 +0530 Subject: [PATCH 217/405] fourth --- .vscode/settings.json | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7a73a41 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file From 91a2b6d4b81bc46098d6c5007a45b0d0df3b572e Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Mon, 27 May 2024 21:22:06 +0530 Subject: [PATCH 218/405] Added Random Forest --- contrib/machine-learning/Random_Forest.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/Random_Forest.md index d2d7f5c..59c44ef 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/Random_Forest.md @@ -23,8 +23,8 @@ Random Forest is a versatile machine learning algorithm capable of performing bo - [Feature Importance](#feature-importance) - [Hyperparameter Tuning](#hyperparameter-tuning) - [Regression Example](#regression-example) - - [Conclusion](#conclusion) - - [References](#references) + - [Conclusion](#conclusion) + - [References](#references) ## Introduction @@ -185,10 +185,10 @@ r2 = r2_score(y_test, y_pred) print(f"Mean Squared Error: {mse:.2f}") print(f"R^2 Score: {r2:.2f}") ``` -### Conclusion +## Conclusion Random Forest is a powerful and flexible machine learning algorithm that can handle both classification and regression tasks. Its ability to create an ensemble of decision trees leads to robust and accurate models. However, it is important to be mindful of the computational cost associated with training multiple trees. -### References +## References Scikit-learn Random Forest Documentation Wikipedia: Random Forest Machine Learning Mastery: Introduction to Random Forest From b5f682559bd50495ab44dd46d75eea7693882c27 Mon Sep 17 00:00:00 2001 From: piyush-poddar Date: Tue, 28 May 2024 02:45:47 +0530 Subject: [PATCH 219/405] 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 220/405] 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 221/405] 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 222/405] 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 223/405] 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 224/405] 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 225/405] 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 226/405] 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 227/405] 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 228/405] 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 229/405] 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 230/405] 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 231/405] 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 232/405] 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 cb5fcb4953a9b0a181479fc4b434c64123280497 Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Thu, 30 May 2024 10:56:55 +0530 Subject: [PATCH 233/405] Added stacks.md --- contrib/ds-algorithms/stacks.md | 131 ++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 contrib/ds-algorithms/stacks.md diff --git a/contrib/ds-algorithms/stacks.md b/contrib/ds-algorithms/stacks.md new file mode 100644 index 0000000..f9f662b --- /dev/null +++ b/contrib/ds-algorithms/stacks.md @@ -0,0 +1,131 @@ +# STACKS IN PYTHON +In Data Structures and Algorithms, a stack is a linear data structure that complies with the Last In, First Out (LIFO) rule. It works by use of two fundamental techniques: *PUSH* which inserts an element on top of the stack and *POP* which takes out the topmost element.This concept is similar to a stack of plates in a cafeteria. Stacks are usually used for handling function calls, expression evaluation, and parsing in programming. Indeed, they are efficient in managing memory as well as tracking program state. + +**POINTS TO BE REMEMBERED :-** +- A stack is a collection of data items that can be accessed at only one end, called *TOP*. +- Items can be inserted and deleted in a stack only at the *TOP*. +- The last item inserted in a stack is the first one to be deleted. +- Therefore, a stack is called a **Last-In-First-Out (LIFO)** data structure. + +## REAL LIFE EXAMPLES OF STACKS + +**PILE OF BOOKS** - Suppose a set of books are placed one over the other in a pile. When you remove books from the pile, the topmost book will be removed first. Similarly, when you have to add a book to the pile, the book will be placed at the top of the file. + +**PILE OF PLATES** - The first plate begins the pile. The second plate is placed on the top of the first plate and the third plate is placed on the top of the second plate, and so on. In general, if you want to add a plate to the pile, you can keep it on the top of the pile. Similarly, if you want to remove a plate, you can remove the plate from the top of the pile. + +**BANGLES IN A HAND** - When a person wears bangles, the last bangle worn is the first one to be removed. + +## APPLICATIONS OF STACKS + +Stacks are widely used in Computer Science: +- *Function call* management +- Maintaining the *UNDO* list for the application +- Web browser *history management* +- Evaluating expressions +- Checking the nesting of parentheses in an expression +- *Backtracking* algorithms (Recursion) + +Understanding these applications is essential for Software Development. + +## OPERATIONS ON A STACK + +Key operations on a stack include: +- **PUSH** - It is the process of inserting a new element on the top of a stack. +- **OVERFLOW** - A situation when we are pushing an item in a stack that is full. +- **POP** - It is the process of deleting an element from the top of a stack. +- **UNDERFLOW** - A situation when we are popping item from an empty stack. +- **PEEK** - It is the process of getting the most recent value of stack *(i.e. the value at the top of the stack)* +- **ISEMPTY** - It is the function which return true if stack is empty else false. +- **SHOW** -Displaying stack items. + +## IMPLEMENTING STACKS IN PYTHON + +```python +def isEmpty(S): + + if len(S) == 0: + return True + + else: + + return False + +def Push(S, item): + S.append(item) + +def Pop(S): + + if isEmpty(S): + return "Underflow" + + else: + val = S.pop() + return val + +def Peek(S): + + if isEmpty(S): + return "Underflow" + + else: + top = len(S) - 1 + return S[top] + +def Show(S): + + if isEmpty(S): + print("Sorry, No items in Stack") + + else: + print("(Top)", end=' ') + t = len(S) - 1 + while t >= 0: + print(S[t], "<", end=' ') + t -= 1 + print() +``` + +This code defines a stack data structure along with functions to manipulate it. To provide output, we would need to use these functions to interact with the stack. + +Here's an example: +```python +stack = [] + +Push(stack, 5) +Push(stack, 10) +Push(stack, 15) + +print("Stack after Push operations:") +Show(stack) + +print("Peek operation:", Peek(stack)) + +print("Pop operation:", Pop(stack)) + +print("Stack after Pop operation:") +Show(stack) +``` + +This would output: + +``` +Stack after Push operations: + +(Top) 15 < 10 < 5 < + +Peek operation: 15 + +Pop operation: 15 + +Stack after Pop operation: + +(Top) 10 < 5 < +``` + +## Complexity Analysis + +- **Worst case**: `O(n)` This occurs when the stack is full, it is dominated by the usage of Show operation. +- **Best case**: `O(1)` When the operations like isEmpty, Push, Pop and Peek are used, they have a constant time complexity of O(1). +- **Average case**: `O(n)` The average complexity is likely to be lower than O(n), as the stack is not always full. + + From 79017403f82fe8cd5e1737ff573eab8506a7fffa Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Thu, 30 May 2024 10:58:36 +0530 Subject: [PATCH 234/405] Update index.md --- contrib/ds-algorithms/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index c61ca0b..783f982 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -9,3 +9,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) +- [Stacks in Python](stacks.md) From 3ba006417ca0b66db7c42647398a94b05c4bf99c Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Thu, 30 May 2024 17:30:59 +0530 Subject: [PATCH 235/405] understanding cnn from scratch --- contrib/machine-learning/IntroToCNNs.md | 453 ++++++++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 454 insertions(+) create mode 100644 contrib/machine-learning/IntroToCNNs.md diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md new file mode 100644 index 0000000..5f81ace --- /dev/null +++ b/contrib/machine-learning/IntroToCNNs.md @@ -0,0 +1,453 @@ +# Understanding Convolutional Neural Networks (CNN) + +## Table of Contents +
+Click to expand + +- [Introduction](#introduction) +- [CNN Architecture](#cnn-architecture) + -
+ Convolutional Layer + + - [Input Shape](#input-shape) + - [Stride](#strides) + - [Padding](#padding) + - [Filter](#filters) + - [Output](#output) + +
+ +- [Pooling Layer](#pooling-layer) +- [Flatten Layer](#flatten-layer) +- [Dropout Layer](#dropout-layer) + +- [Implementation](#implementation) + +
+ +## Introduction + +Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. + +### Why CNNs are Superior to Traditional Neural Networks + +1. **Localized Receptive Fields**: + - CNNs use convolutional layers that apply filters to local regions of the input image. This localized connectivity ensures that the network learns spatial hierarchies and patterns, such as edges and textures, which are essential for image recognition tasks. + +2. **Parameter Sharing**: + - In CNNs, the same filter (set of weights) is used across different parts of the input, significantly reducing the number of parameters compared to fully connected layers in traditional neural networks. This not only lowers the computational cost but also mitigates the risk of overfitting. + +3. **Translation Invariance**: + - Due to the shared weights and pooling operations, CNNs are inherently invariant to translations of the input image. This means that they can recognize objects even when they appear in different locations within the image. + +4. **Hierarchical Feature Learning**: + - CNNs automatically learn a hierarchy of features from low-level features like edges to high-level features like shapes and objects. Traditional neural networks, on the other hand, require manual feature extraction which is less effective and more time-consuming. + +### Use Cases of CNNs + +- **Image Classification**: Identifying objects within an image (e.g., classifying a picture as containing a cat or a dog). +- **Object Detection**: Detecting and locating objects within an image (e.g., finding faces in a photo). +- **Image Segmentation**: Partitioning an image into segments or regions (e.g., dividing an image into different objects and background). +- **Medical Imaging**: Analyzing medical scans like MRI, CT, and X-rays for diagnosis. + +> This guide will walk you through the fundamentals of CNNs and their implementation in Python. We'll build a simple CNN from scratch, explaining each component to help you understand how CNNs process images and extract features. + +### Let's start by understanding the basic architecture of CNNs. + +## CNN Architecture + +Convolution layers, pooling layers, and fully connected layers are just a few of the many building blocks that CNNs use to automatically and adaptively learn spatial hierarchies of information through backpropagation. + +### Convolutional Layer +The convolutional layer is the core building block of a CNN. The layer's parameters consist of a set of learnable filters (or kernels), which have a small receptive field but extend through the full depth of the input volume. + +#### Input Shape +The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). +
+ + + + + + + + + + + +
1 and 0
10111
10101
10101
10101
10101
10101
10111
+ + + + + + + + + + + +
9
01110
01010
01110
00010
00010
00010
00010
+
+ +- The input matrix represents a simplified binary image of handwritten digits, +where '1' denotes the presence of ink and '0' represents the absence of ink. + +- The first matrix shows the represnetation of 1 and 0, which can be depicted as a vertical line and a closed loop. + +- The second matrix represents 9, combining the loop and line. + +
+ +#### Strides +The step size with which the filter moves across the input image. +
+ + + + + + + + + + + +
3
011 + 10
010 + 10
01110
00010
000 + 10
000 + 10
00010
+ + + + + + + + + + + +
2
01 + 110
01 + 010
01110
00 + 010
00 + 010
00010
00010
+
+ +- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of 3 and 2. + +- A stride of 1 means the filter moves one step at a time, ensuring it covers the entire input matrix. + +- However, with larger strides (like 3 or 2 in this example), the filter may not cover all elements, potentially missing some information. + +- While this might seem like a drawback, higher strides are often used to reduce computational cost and decrease the output size, which can be beneficial in speeding up the training process and preventing overfitting. + +
+ +#### Padding +Determines whether the output size is the same as the input size ('same') or reduced ('valid'). +
+ + + + + + + + + + + + + +
padding='same'
0000000
0011100
0010100
0011100
0000100
0000100
0000100
0000100
0000000
+ + + + + + + + + + + +
padding='valid'
01110
01010
01110
00010
00010
00010
00010
+
+ +- `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. + +- Choose `valid` padding when focusing on the central input region or requiring specific output dimensions. + +
+ +#### Filters +Small matrices that slide over the input data to extract features. +
+ + + + + + + +
closed loop
111
101
111
+ + + + + + + +
vertical line
010
010
010
+ + + + + + + +
both diagonals
101
010
101
+
+ +- The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. + +- The next filter helps in detecting vertical lines, crucial for identifying digits like '1', '4', '7', and parts of other digits that contain vertical strokes. + +- The last filter shows how to detect diagonal lines in the input image, useful for identifying the slashes present in digits like '1', '7', or parts of '4' and '9'. + +
+ +#### Output +A set of feature maps that represent the presence of different features in the input. +
+ + + + + + + + + +
('valid', 1)
404
25-3
25-3
032
032
+ + + + + + + + + + + +
('same', 1)
22422
34843
22533
12533
00323
00323
00212
+ + + + + + + +
('valid', 2)
44
23
02
+
+ +- With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. + +- By adding zero padding to the input matrix, it is expanded to 9x7, allowing the 3x3 filter to "fit" fully on the edges and corners. With a stride of 1, the filter still moves one step at a time, but now the output matrix is the same size (7x5) as the original input. Same padding is often preferred in early layers of a CNN to preserve spatial information and avoid rapid feature map shrinkage. + +- Without padding, the 3x3 filter operates within the original input matrix boundaries, but now it moves two steps at a time (stride 2). This significantly reduces the output matrix size to 3x2. Larger strides are employed to decrease computational cost and the output size, which can be beneficial in speeding up the training process and preventing overfitting. However, they might miss some finer details due to the larger jumps. + +
+ +### Pooling Layer +Pooling layers reduce the dimensionality of each feature map while retaining the most critical information. The most common form of pooling is max pooling. +- **Input Shape:** The dimensions of the feature map from the convolutional layer. +- **Pooling Size:** The size of the pooling window (e.g., 2x2). +- **Strides:** The step size for the pooling operation. +- **Output:** A reduced feature map highlighting the most important features. +
+ + + + + + + + + + +
((2,2), 1)
4884
4884
2553
2553
0333
0333
+ + + + + + + +
((3,3) 2)
88
55
33
+
+ +- The high values (8) indicate that the "closed loop" filter found a strong match in those regions. + +- First matrix of size 6x4 represents a downsampled version of the input. + +- While the second matrix with 3x2, resulting in more aggressive downsampling. + + +
+ +### Flatten Layer +The flatten layer converts the 2D matrix data to a 1D vector, which can be fed into a fully connected (dense) layer. +- **Input Shape:** The 2D feature maps from the previous layer. +- **Output:** A 1D vector that represents the same data in a flattened format. +
+ + + + + + + + + + +
After max pooling (with kernel size = 3 and stride = 1)
888888555555333
+
+ +
+ +### Dropout Layer +Dropout is a regularization technique to prevent overfitting in neural networks by randomly setting a fraction of input units to zero at each update during training time. +- **Input Shape:** The data from the previous layer. +- **Dropout Rate:** The fraction of units to drop (e.g., 0.5 for 50% dropout). +- **Output:** The same shape as the input, with some units set to zero. +
+ + + + + +
dropout rate = 0.3
880800 505055 033
+
+ +- The updated 0 values represents the dropped units. + +## Implementation + +Below is the implementation of a simple CNN in Python. Each function within the `CNN` class corresponds to a layer in the network. + +```python +import numpy as np + +class CNN: + def __init__(self): + pass + + def convLayer(self, input_shape, channels, strides, padding, filter_size): + height, width = input_shape + input_shape_with_channels = (height, width, channels) + print("Input Shape (with channels):", input_shape_with_channels) + + # Generate random input and filter matrices + input_matrix = np.random.randint(0, 10, size=input_shape_with_channels) + filter_matrix = np.random.randint(0, 5, size=(filter_size[0], filter_size[1], channels)) + + print("\nInput Matrix:\n", input_matrix[:, :, 0]) + print("\nFilter Matrix:\n", filter_matrix[:, :, 0]) + + padding = padding.lower() + + if padding == 'same': + # Calculate padding needed for each dimension + pad_height = filter_size[0] // 2 + pad_width = filter_size[1] // 2 + + # Apply padding to the input matrix + input_matrix = np.pad(input_matrix, ((pad_height, pad_height), (pad_width, pad_width), (0, 0)), mode='constant') + + # Adjust height and width to consider the padding + height += 2 * pad_height + width += 2 * pad_width + + elif padding == 'valid': + pass + + else: + return "Invalid Padding!!" + + # Output dimensions + conv_height = (height - filter_size[0]) // strides[0] + 1 + conv_width = (width - filter_size[1]) // strides[1] + 1 + + output_matrix = np.zeros((conv_height, conv_width, channels)) + + # Convolution Operation + for i in range(0, height - filter_size[0] + 1, strides[0]): + for j in range(0, width - filter_size[1] + 1, strides[1]): + receptive_field = input_matrix[i:i + filter_size[0], j:j + filter_size[1], :] + output_matrix[i // strides[0], j // strides[1], :] = np.sum(receptive_field * filter_matrix, axis=(0, 1, 2)) + + return output_matrix + + def maxPooling(self, input_matrix, pool_size=(2, 2), strides_pooling=(2, 2)): + input_height, input_width, input_channels = input_matrix.shape + pool_height, pool_width = pool_size + stride_height, stride_width = strides_pooling + + # Calculate output dimensions + pooled_height = (input_height - pool_height) // stride_height + 1 + pooled_width = (input_width - pool_width) // stride_width + 1 + + # Initialize output + pooled_matrix = np.zeros((pooled_height, pooled_width, input_channels)) + + # Perform max pooling + for c in range(input_channels): + for i in range(0, input_height - pool_height + 1, stride_height): + for j in range(0, input_width - pool_width + 1, stride_width): + patch = input_matrix[i:i + pool_height, j:j + pool_width, c] + pooled_matrix[i // stride_height, j // stride_width, c] = np.max(patch) + + return pooled_matrix + + def flatten(self, input_matrix): + return input_matrix.flatten() + + def dropout(self, input_matrix, dropout_rate=0.5): + assert 0 <= dropout_rate < 1, "Dropout rate must be in [0, 1)." + dropout_mask = np.random.binomial(1, 1 - dropout_rate, size=input_matrix.shape) + return input_matrix * dropout_mask +``` + +Run the below command to generate output, based on random input and filter matrices. + +```python +input_shape = (5, 5) +channels = 1 +strides = (1, 1) +padding = 'valid' +filter_size = (3, 3) + +cnn_model = CNN() + +conv_output = cnn_model.convLayer(input_shape, channels, strides, padding, filter_size) +print("\nConvolution Output:\n", conv_output[:, :, 0]) + +pool_size = (2, 2) +strides_pooling = (1, 1) + +maxPool_output = cnn_model.maxPooling(conv_output, pool_size, strides_pooling) +print("\nMax Pooling Output:\n", maxPool_output[:, :, 0]) + +flattened_output = cnn_model.flatten(maxPool_output) +print("\nFlattened Output:\n", flattened_output) + +dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) +print("\nDropout Output:\n", dropout_output) +``` + +Feel free to play around with the parameters! \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 94ca1e2..ea8b5cb 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) +- [Introduction To Convolutional Neural Networks (CNNs)](IntroToCNNs.md) From f89ffbd58c0082f8533064aa864483799a9c1751 Mon Sep 17 00:00:00 2001 From: Aman Barthwal Date: Thu, 30 May 2024 17:41:16 +0530 Subject: [PATCH 236/405] Update IntroToCNNs.md --- contrib/machine-learning/IntroToCNNs.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index 5f81ace..7c0812f 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -63,7 +63,8 @@ The convolutional layer is the core building block of a CNN. The layer's paramet #### Input Shape The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). -
+
+

@@ -76,6 +77,8 @@ The dimensions of the input image, including the number of channels (e.g., 3 for
1 and 0
10111
+

+

@@ -88,6 +91,7 @@ The dimensions of the input image, including the number of channels (e.g., 3 for
9
00010
+

- The input matrix represents a simplified binary image of handwritten digits, @@ -450,4 +454,4 @@ dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) print("\nDropout Output:\n", dropout_output) ``` -Feel free to play around with the parameters! \ No newline at end of file +Feel free to play around with the parameters! From d9ab12136329bf485af34a2dbf31fa8e933a9ebe Mon Sep 17 00:00:00 2001 From: Aman Barthwal Date: Thu, 30 May 2024 17:42:51 +0530 Subject: [PATCH 237/405] Update IntroToCNNs.md --- contrib/machine-learning/IntroToCNNs.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index 7c0812f..802cfdb 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -25,6 +25,22 @@ + + +
Table 1 Heading 1 Table 1 Heading 2
+ +|Table 1| Middle | Table 2| +|--|--|--| +|a| not b|and c | + + + +|b|1|2|3| +|--|--|--|--| +|a|s|d|f| + +
+ ## Introduction Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. From 9f0f50fe4803009d1d4968a0e2f4722b061751a2 Mon Sep 17 00:00:00 2001 From: Rupa-Rd Date: Thu, 30 May 2024 19:27:15 +0530 Subject: [PATCH 238/405] 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 239/405] 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 240/405] 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 241/405] 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 242/405] 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 1d01704f40d48be974079d84a7511d281caab497 Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Thu, 30 May 2024 23:59:27 +0530 Subject: [PATCH 243/405] replaced tables with images --- contrib/machine-learning/IntroToCNNs.md | 230 ++---------------- .../machine-learning/assets/cnn-dropout.png | Bin 0 -> 28288 bytes .../machine-learning/assets/cnn-filters.png | Bin 0 -> 38260 bytes .../machine-learning/assets/cnn-flattened.png | Bin 0 -> 33305 bytes .../assets/cnn-input_shape.png | Bin 0 -> 54890 bytes .../machine-learning/assets/cnn-ouputs.png | Bin 0 -> 94050 bytes .../machine-learning/assets/cnn-padding.png | Bin 0 -> 98306 bytes .../machine-learning/assets/cnn-pooling.png | Bin 0 -> 79460 bytes .../machine-learning/assets/cnn-strides.png | Bin 0 -> 75501 bytes 9 files changed, 19 insertions(+), 211 deletions(-) create mode 100644 contrib/machine-learning/assets/cnn-dropout.png create mode 100644 contrib/machine-learning/assets/cnn-filters.png create mode 100644 contrib/machine-learning/assets/cnn-flattened.png create mode 100644 contrib/machine-learning/assets/cnn-input_shape.png create mode 100644 contrib/machine-learning/assets/cnn-ouputs.png create mode 100644 contrib/machine-learning/assets/cnn-padding.png create mode 100644 contrib/machine-learning/assets/cnn-pooling.png create mode 100644 contrib/machine-learning/assets/cnn-strides.png diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index 802cfdb..f832980 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -25,22 +25,6 @@ - - -
Table 1 Heading 1 Table 1 Heading 2
- -|Table 1| Middle | Table 2| -|--|--|--| -|a| not b|and c | - - - -|b|1|2|3| -|--|--|--|--| -|a|s|d|f| - -
- ## Introduction Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. @@ -79,35 +63,8 @@ The convolutional layer is the core building block of a CNN. The layer's paramet #### Input Shape The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). -
-

- - - - - - - - - - - -
1 and 0
10111
10101
10101
10101
10101
10101
10111
-

-

- - - - - - - - - - - -
9
01110
01010
01110
00010
00010
00010
00010
-

+
+
- The input matrix represents a simplified binary image of handwritten digits, @@ -121,39 +78,8 @@ where '1' denotes the presence of ink and '0' represents the absence of ink. #### Strides The step size with which the filter moves across the input image. -
- - - - - - - - - - - -
3
011 - 10
010 - 10
01110
00010
000 - 10
000 - 10
00010
- - - - - - - - - - - -
2
01 - 110
01 - 010
01110
00 - 010
00 - 010
00010
00010
+
+
- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of 3 and 2. @@ -168,33 +94,8 @@ The step size with which the filter moves across the input image. #### Padding Determines whether the output size is the same as the input size ('same') or reduced ('valid'). -
- - - - - - - - - - - - - -
padding='same'
0000000
0011100
0010100
0011100
0000100
0000100
0000100
0000100
0000000
- - - - - - - - - - - -
padding='valid'
01110
01010
01110
00010
00010
00010
00010
+
+
- `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. @@ -205,31 +106,8 @@ Determines whether the output size is the same as the input size ('same') or red #### Filters Small matrices that slide over the input data to extract features. -
- - - - - - - -
closed loop
111
101
111
- - - - - - - -
vertical line
010
010
010
- - - - - - - -
both diagonals
101
010
101
+
+
- The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. @@ -242,37 +120,8 @@ Small matrices that slide over the input data to extract features. #### Output A set of feature maps that represent the presence of different features in the input. -
- - - - - - - - - -
('valid', 1)
404
25-3
25-3
032
032
- - - - - - - - - - - -
('same', 1)
22422
34843
22533
12533
00323
00323
00212
- - - - - - - -
('valid', 2)
44
23
02
+
+
- With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. @@ -289,69 +138,29 @@ Pooling layers reduce the dimensionality of each feature map while retaining the - **Pooling Size:** The size of the pooling window (e.g., 2x2). - **Strides:** The step size for the pooling operation. - **Output:** A reduced feature map highlighting the most important features. -
- - - - - - - - - - -
((2,2), 1)
4884
4884
2553
2553
0333
0333
- - - - - - - -
((3,3) 2)
88
55
33
+
+
- The high values (8) indicate that the "closed loop" filter found a strong match in those regions. - - First matrix of size 6x4 represents a downsampled version of the input. - - While the second matrix with 3x2, resulting in more aggressive downsampling. - -
- ### Flatten Layer The flatten layer converts the 2D matrix data to a 1D vector, which can be fed into a fully connected (dense) layer. - **Input Shape:** The 2D feature maps from the previous layer. - **Output:** A 1D vector that represents the same data in a flattened format. -
- - - - - - - - - - -
After max pooling (with kernel size = 3 and stride = 1)
888888555555333
+
+
-
- ### Dropout Layer Dropout is a regularization technique to prevent overfitting in neural networks by randomly setting a fraction of input units to zero at each update during training time. - **Input Shape:** The data from the previous layer. - **Dropout Rate:** The fraction of units to drop (e.g., 0.5 for 50% dropout). - **Output:** The same shape as the input, with some units set to zero. -
- - - - - -
dropout rate = 0.3
880800 505055 033
+
+
- The updated 0 values represents the dropped units. @@ -402,9 +211,8 @@ class CNN: # Output dimensions conv_height = (height - filter_size[0]) // strides[0] + 1 conv_width = (width - filter_size[1]) // strides[1] + 1 - output_matrix = np.zeros((conv_height, conv_width, channels)) - + # Convolution Operation for i in range(0, height - filter_size[0] + 1, strides[0]): for j in range(0, width - filter_size[1] + 1, strides[1]): @@ -443,7 +251,7 @@ class CNN: return input_matrix * dropout_mask ``` -Run the below command to generate output, based on random input and filter matrices. +Run the below command to generate output with random input and filter matrices, depending on the given size. ```python input_shape = (5, 5) @@ -470,4 +278,4 @@ dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) print("\nDropout Output:\n", dropout_output) ``` -Feel free to play around with the parameters! +Feel free to play around with the parameters! \ No newline at end of file diff --git a/contrib/machine-learning/assets/cnn-dropout.png b/contrib/machine-learning/assets/cnn-dropout.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb18f9567de980472ceb8cbdd7aaa1130ba7231 GIT binary patch literal 28288 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 Wl5qCa5HSBmr=h0%JMPBahyMbWFn6v1 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-filters.png b/contrib/machine-learning/assets/cnn-filters.png new file mode 100644 index 0000000000000000000000000000000000000000..463ca60003a60f2637d95e9dd0caa92db550ae97 GIT binary patch literal 38260 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

C}&V{e*Tl_n=cCi*Am#{)R^RmrYse{u_3`mpby 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 _pbkH-fS=}@8**(x!%2OfVRSW+1FE+ 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 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-input_shape.png b/contrib/machine-learning/assets/cnn-input_shape.png new file mode 100644 index 0000000000000000000000000000000000000000..34379f1db595776f40f5598108a896f5d973f8a1 GIT binary patch literal 54890 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 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-ouputs.png b/contrib/machine-learning/assets/cnn-ouputs.png new file mode 100644 index 0000000000000000000000000000000000000000..279722659207e9add1d851556189994dae0e1ee4 GIT binary patch literal 94050 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 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-padding.png b/contrib/machine-learning/assets/cnn-padding.png new file mode 100644 index 0000000000000000000000000000000000000000..a441b2b96e0ec075fb0c2e2e81cf21bc33ed4388 GIT binary patch literal 98306 zcmeFZcQ{;I8#hc42~koIorvCvZV(c^_g=z`=wZ}R1}P$HbWxKi(K}HFA^PaOCpx1u zME|yPPR^6(yl>8TUEjaoGuJh#o0Bu)3-o0UiY&1_lO!g8U;*42-Kt z3=FIf*RBFBLjk+M;fAD*jEuU1j0~N+ixb4g9*lt@9~`TPtFP5Tnrft}@Dvj}kD`>8~o#k}}{W;w&mUVjBoW#;T>`ajD*WUTY zWK7WO6r8%oXRpKP2uYV8$$t7#?yA8<_T;m4U(N>~NAa)6#N2n5a9VQg1r?cFa(&*T zS2YQZTGHkfNckP}3k^+)wGX<;%H9j7$mLNG^hKo$>gEB?2VbWCH7)Z0>gbDe{Lp*sqvWLhYtx zGQPV33xxT`%C)`LM>mj<>2BQ6?4d^8dUJbDTa@^Pl?}#4Fa|P5-aKm-Bhr-!6~fi^x@cI&9oxD=$#;`YR`A=~9A0yU8~3i> zk_rCuNNkGuum!Pm%@Z9ojAQ*h6>IN@qnfAUQ)cmd#>}q7j%s&E6yR@M9<2Buf5|n@ zI7`5vqOh&`j`^8LJE-$BjpH>cXT6o6u#<=Hjeh9z`F_LbjU+)yFlGSy{l> zTGF1J?8&=%yH!0T@hXHPBlt$jzxY6}dix#p9?_p%8GChMAI$mnz|y)TddzG6+6YF% zm~;M3yO!|Ioo{Qf5BerpGfzl%tYoPBB~J;&4ZN84lI>DzQyN%Kc3)~OZar;Gyr0NK z0=8P>AKwn4vvO(i$+l1?vnJESSePYSM4?nd=V}91D*Tq0&M^IZch1kxn`f(w=P}mN z{*xDd9zAh5lGL^s$zosQ74T!IxEhGR8A)SpKEN`+!r{-E9D)A~cczgRJAj86XYL_i z0>;PQ7bs)AEPrxyE|#mA=H&VWY>iio$?b7#8zuTM!u_Ma-S~Ws>pAKhmoX^i8_o*O zR--lcL-}je7Iar%vp#t#OviN%f9G*vx3bLASZ#)WZk0fsw&$wd{piP$)Nnyq9 za!n*SS#IL(WV=iTrB|4bG;hqSwe;3c0-{vl_x2B{!sOaMlCM~m6Q@LQJ?!eYb!9e; zNPWcpVYHucA7>&6Q<-3}8Ob9T`qH_Wg#$;aEn|!$ADg{7w?s7my2NsxKJLhK-><>K zSk`ml&v1g~t_#zqh4wa)&6E6aucLALQZz@jV|q#%pvrSkn7HnmanoJts}^|g6VzqL z6ouu52@W-xzf-@JA7Ypw27NPCW`f+zzD;&}^rpvcHR8$Oh+yCQw>tb6q;}~azxB-U z(d4z^v|(NqUd79a-Vex^6=bZ9eBQxo#asQ_Sa#;2glxUEpX|AEe}=wB9gD^tOfUtQ z6^x%5>=HbnaHKr^VM5*a)6Njbnz5}&ML6soEaF&JMWx%gTZ>axB|}iIz}O*TLZl+d zmeywCfj32vU^vr9&i4)A(p|hB4>q%-U~>xE3)g^ zm5dM;>=~L&+;_0spmPW~@Y(2|$S$Yl=Xr(my!jjd5^p7sD!-`PYf(W_;}nh*%@h++ z2T?@LL``8$aE+E5yIaJX`-%l@1ZIq&LS({D_8nJzDV~VG06h}6>W{3U*LzhrN}Ib? z#685_KU)AdxroLbq-&>}G_QX6{EM&5RNo9w>$5lCVaOqpTs^cdt8*6v-q@&Jgy?n zBcDZ=BTqR`K-aop#%NNX*?_y)v3Rqzzv}zMor$4|sj|$;<8jr>f=UELuH14QJXugy zYacODJ8nIpH(}-?MLk9Rh!90J5p?sF7vXK9JR0}Gw@dBr9MAIId{#1+?|j!@82YyF z@_BJP=6hFA8ufYic(+KKSIFM<%?XAk**jrRDRw4WW?pV-uDUqf_qEz?A7`MHt9NmG zMp9Ggfmm#PM!8YhSTMekR~uA2gy=y`HV-fif9#xRQVJsJHbjapD{SA`PTuhPy7w`@ zRH_`6W}$DrOnr`0#)W z-3x1bF?UjL<`b|#)c?UZ^G5G*GHa&gM|7ljZ|UC}Bh8?WA=bXRPd6qm%ea zWbVA4lPw6Xp>?Ln4M_#%9p^EKnM#mWR8Ss&Hy|YVbbYNPWqzuaB%+pg268&I zv&?)~wLS5f>xb4yGhfegUJPXnQRkR>YSh`9no$T9uocAjelPmoK>Pz=_j=7si6)XJ z>s5(W_JLYHA3j}(tMxHB4t(%h_yb;lUVdLbfx%YU$I>eB;qv{(^&ZCMtRJh?U17ZlDh?bM&sP2K{)j|u{g9@_f^Lw zb?kCIZBY+SY(la?>^Hbh9YiHkBoSV(#zU+5X?m=Bryk%Z#tPHJkN9o<@gIUk>aH~kN|(@<%gFJA+lVCwJS!! z=?l_1P#c5Q_?FWaGC%4ayQ88rrGfZzPB*g}KXT_p&+)KDzpkpHK0}Sqb32{=>?l26 zz1VzMEo^RW4_pYQ98n)_A90P5ixDcUFs`-Vh<}58gNntBt<4L~CDlQgG3$GP5f{fb z1g(^cLOv5L6P|Wj?ODgRsI}7WuiZFFX^sk0E(by*P69>*RdJ4IH7a!lmfq_JaTF2n z-cien#f^NZD4p0$nRhpxA^DtF(o^C%=!lrk^lqdXPhIxbI-D6Jt1t4Bw1ZD$=3(jJ zlH)3^y*;);BM1@+sKYwKHiDW61%$kWsKwV^JtuFLF~rKbMR0*+L4p_h7duV!zRdTT zVXBa1pDFQ@qs<)N?81t#<>e`alD?bD+lgA%W&G*xfiE1U?JwAI-`QH6ejMkX?SQ~K^VJ6<;y_*R= z*E$|7wa)6btud|%cg6KE^OHF6TE_1P=>@gGZO;tQ0|$!%4W}2j8`Oi7M~cU}7w9>m zt4@^&H{Z!AvgyNbCY!arTS^jlea6n;qIcG_Gt_z|)Q+T&HP44P?FOs1oeqzoCnt>J ztZF;#{$Ji?Wn*o_C^7b}Fz#;q$WrHtU$EkR5HDjR{-LJtC98eM17q#mg|{-%X>IlO z##GMjA2?`%R!m|QT)LUt=?rp&BLQXa=8RdnA9)gv-Q5@96e2iH`XCNHCqC@ujLfSE zOq+ybJ|*(uDYB+=13Zd1V0{IMiV6lBaDEK~8%Ucf#c;T68K*B`SXYs^$G(Q`0Ez%^-RC=^X{w2bgZA}SRa6E7!S2%6cm7? zmZb|A>J+Xx`rj#virO)_2ucQ5Lmya^SMCa(V*h z@^pB1ISz)nrzmjh0Cu&Y^K`Ixgo=8C?)`CxC~$t+%zcmUk6T>rK=<@j)ahiLT)=dK zTs&Mn_ayM>=;*{R`4<9!l zA181JC)CT))xwk05z6rAAV0@>1cq9=*gSK!adM=)9M|HBlbb8(-o48Q{r&m#J;9zf z|9O%l^si|F6Xd?U!p+OY!~OTzKv(h0R#9~uPq4kgBO3>RX23HfMEH5c|G5AExbmMT z{?b$bKRtPc9{g9=UoQQ#s}2@P`zJ!lQ@Uo|x;? zxCyt1XWDk)m4jkRMxxgOKWIKG#y^HY#Qdaw8R_^+IckHy!pWiG=M25I&ErAng=wen$W z!^l!I_=Of!C~ z$8lKq85tFdKGqs^>i?ek>2$HLAp^_zD>uZfroJ+B+8I7@V)7uU>Cn_2dAaI@V1^@8 zoW^~=q4gBnWF`{99z>K3)n3(0rGz{*)Iy!c;jxK9v~XELr*YfrDSkDv$EsqBkCe#q zNyriaWtb><=Fo*Ho+_O9z#=p=6zBKb@X2HUMhIB^9{d4QY{)}(Y3)bmOX3fJPOZt9zuV<>rGHFRPxwk1JwvOas%p4F(!zpO;*W3g zP!V0oHDt1r%@zLTFcGZZF}IY}b>ajZo1$mf5Ha^n&49$MyO3bbZ1)1Xijd6@%h~lz zN^u3n#tUGw6lO&DCWO`U{oED1k-~UpX0;NkblvWEeC`XNI6l(f%c9pLm~B_eOllA1 z{ru`z^${=u1x4itafchT-0ZrAZ@Z1E6m6TY4%{m+NNj#zSLb6;=7?C=ZJR|{M_7Ta zm11M=Fu$1%aG>{%Y$bHM_`+{zp$`+|b|Gvi)k~B)-su+4o1ng@ z<9fSj4@vz4S|1d~u%JyGAEMaE%YM4j#67pTq}Y!pCs%oGsE{+L+>Uc+X9x2HoBh)Y zC^pTEuGW34l4<~@nXXu6KhBmnk{^wQOL+GX9J17XWkN=h0VQM~Gi*1S(TKa6QufAZ) zr+IkhvBb^aZmid=m~vOjLVZuHz9z_VMEa^pJglK{PN?JElVr=7$QYqMEirXU7%2}n zhPHrZSHR;XPaopqoB5tRKi%)zDz)C4F;BV+78MrTh`GJ^V+IsLK<$^b7hiYS&m2|I zboFAjohwLTHaa{yI6Ac~f54*6hEdNNa4BJDfD^9_h_?r0tRFi`Svh*@PNIs40z##p`ULdCRq( z$wliRbZ^w+?i_njQrjSZ)s$!0O`0B`3x@G3rv|Wzk8xeHs}J`uB%5M!_MFE^;$(Ny z|3uvk)xo?kxM|si=|f6L)qck}yc+*pH*>^V!AZAFmY{l}3A(VYO6_|fDtyvssn!)& zFo_Jj9f4vbONPFxM&9_{M#s2Pa{rsWd6u_Q80=YKONmL+NL0N|^!hBkQFF64{dr*C zu?a_tD9xOa{fm1=4M&Bi0`T{lbr~<`y=fW9QarN2x2YqM2}kv(A|3&mQ}Bm}%AI?w z9hsxJ_(pP7aE9yg2L{~XN{TeuwJpv z3NE|BCR1J9=R{qEkMWtQyhDvW3x}nP3=3eA2=Oz{@w|z=&kBby+wl+8`G$zr(qO_@ zgf^qCEM@#Wdt1|bwYr?-{7+tcZSIF9fd`=6I4_i!uKMu{i5_C1%p_;%_u{OqSe8GZ$ISH;@}?ZEGP?(NfDBS)q2f5y&{3$Of!)jGu}_k2*;@x%;1xT z#XM*kQ`lmvm=kaK_p^BFL+#>5q_>ZlgqyyI>vln0u^O(!Jd-LLZw6ZOFelez*&zF{ z!RrfctgkZ!`}`$fsCF^(_hVd$8U zUdgVfMAT8CdS8YrHzvctTMhf3VAu^FknZ3FdbQNN|4BvXv90Kt=vPNMH(vJ+O-uVQ z9SfybFr4=nuAa*>k0U&zby)=Ejxvz8pT30S zhMp}>f9YxDpqF?!k;hxRHeA526vwHjdjV6k^h@nU@zK&ep*89AK zdPRIg^RQTLc=i>3Cs3g8+Rk{Y=hEY@++*~b0xcS^8|H?(`*31lksUk(7#9xvflj^~ zHQ9=IND2Y_r{%$fS)^xW_tPb20d4)0|peI^whY_N(|A@#O?~O5x6?F;J%u6xc>f(u<_pS_a!eU@jzq#o3$@4&BGVW z4n|cE`rKX%IJ7ETo^sCW_Pw7-xOw==IUzTMkSf*dJIVYYw?duFv#{bV4ka^8 z^Q?UlR_tiedd$%SA@8-7oiC=IM{eVh_5I#=_XZ0aIe2+BHtRQ-Y^GR-g)3>C?B}9; zaj@UE(Ll?MUA~OB3f7!A(|WReLni=l97S2QTGWcKBv?6E^v-7|mb_FIN9R1+38TWV zS+?K7pg$)SPZBj$sI#^yd2tZL>lnZFs{VU!mCu@;Q)g2HSxBYLfUwRxK}U|ZPkNMs zYIe5vPewsH#^xjMeZ|N>=DG)RMkSy40SYt?h5 zA)%#nYm)1m593BJR>MYfX1pUL_W~F7VPAxJ@by>K12!N3*hM*Ar80?7%koCA@=hC8 z$n&?RO_q720aldU{#}T=q<%?USc)@Y10}ktnN@%r>$nm{rKEh z?WIZmVE=S@)J5(7m5=ff-?Q7e_EPpe;aG);rmFV4vm56@G-cQyYL>sPoLn`kwEV4^ z3V5k_IMR0$ycYU*KHgVAAMd1@!citi(9J7KJDFsu>k+UldD$>fHGZVySGcr?J+m6~BC z=>0t{PSoH#fmr$~qHkGS4>Jr^3(~G)8$JqG>ES3Jjt(J!X^M(lfNF zvN(%T>#u%O##Klm0^M)S`kcbiHW`aVT;ggSGJjt<+xmf>i&xv5GNRBaXh(Y1S7YNZ=Aw$fB+3^asK$~s=&p1m(${2QA1h&9{gqUCc%S~QIXx{I-IC_=V_nUdHR1oNV{@Kx0h>ToBJQDc^ z7XqsFi1mw4rd=Px1Rs;6eraX7)TmF>XiOqv%7#Gdd5|!F6*g}*94MhX?aC;JM3HIL zikREeSzX8a@3yn|&=akTYa|IpMx8!bW#nwwNqeK>UB|l|;`@y}mg|kX>&=zFk1~7> zlxn}i51JWkCb~gnOJVO*k~$rsNw4@lZ{^^V9-Tx{>y^pRHqgGa5O#4iV20)os`Ba* zQ46T@owbe+6n(W*Z!m4#6pc(0UKLTQb^_*FUz6R7w&ln%9~{yfPB6USsLU^A;89Xk zjFM{$E2Yxo<}j((O!Z#X`SbR3Y9ft!M-zA~n0Bivk1gX}t@&Gz{vS8=%(KiIM8Ff2 zYZL{Rz6NZ|Rq1VYl(5l)HG$yaZUOfxtuI&jXZ^dpOU*Iui%%H!i$^wChMU)Sn`j_k zU<$Bajkw-|0z*L|)9XK`iOQbS$dE~#j`5dzp>(@oXLwBy&}`Bd ztoqNsQzop^sMcghZw*y{Tzl{40H3`FJ@4qy3e}T;hhy6s-kATHm``77{zS3W+|r`L zaa?-y^WxQ6ws(7K5_xM4j)>}f>n6a6fs%cKlX9HOEuD&}k#d`GReO!>Z0!pI>SEh! z6hy+oGYFbEHgkW!xSxrWFcbEC+M^y#NNT+1dwcG7T@cF-bUPh$Am3*GR+R{mUGc)loR;(YXY;OrB_{V`7qR#w(l_EW%2co-TI!tXw4 znZ8=m=aUV{Zv)jWXq3jC^@_kVE(tT(!OB`~2rq3uZX6(J=zXKbk7Fuu4L1xc76NX{ ze4Y1rK;07xnAI!1r9RAJSITU4^4|D$r(S3qN_}ke^`09ic$kzzFM@Kla)bUA8SHV8Kx!8tQ*A<5J2+KtT{UZ$9LOThu) zC}pZ{sG+wfLDS$n6K-nb)CsHGTR6kf10K5@B?mj%W}Tz67b~@fJ)pe@B8y)wIl&zN z5=E0b!j`5;SjAArwWuHLF{xerB9|IdcPc*nqd(^}eT5O#xuTNdv^;J)Jq~g(KoEeJV9USX=uj^3T>zuj+DI#|G)2T9T-vB5MEv z8kH+SG_xAlT>Se$ArJt4@qp(x8j7INS|8F<<>@8-yJq$ z7ZEXdsd5pU22Zjyn5}o9tafV@fQ$pNgN2+9EiCD(dS+^F>$LvSF~=_-TGou6-ko?_ z!(7EQk4=06)^e73VH${?9$Y?;bLlPHy+I+K!I!sFlc{*J3}e}JLNS;N48GgZp!05; zX&{yfsf5jG+Qe@6G%AnMkA1eSsT=K|UTo(|VU(0KJ3k!c-tCP7*9e>M5+JYWifV6v zd!bNzHVfyJBRXK~FbB1}PKxtoJ-Y#_-ON$Pg|xivT2A)L-51#r9t5`{55q=vfITfM zsYH}F^BRal)VCo2C1UG;>zcETw<8ijJio|04-9L`tQy2L`6!!{J31iPk0=UMIS()>9$hBc zT;_$LzqYiI2N)KQVy$g7Q706bmZ>s<4mFFFIJFFbxR+D?g~IvCDj6nvu*hirnY@wB zz^AvoBhyasQ$ddrY;H?^0dJcDHCBek@hMbPsbJbhm*qFckPV)4?194DxX&&ws4 zI}@{0Z>g(d{$8G3d%?=Xe!X6GV}fsYM(jR4{g*NOy|@BdC$8!FoH{MTvMj!ZgMcN+ zJZ<@XZ5)|<7mdoa`_=KL(V1O(32ofH%Ac|LO-9X&ayU=|FBo{bwC6KG=g2z@V;puM zwEOY!i|0;={%bM&r6z~kz_d0lHi@ZEA?uUb+?mSJgr9<@LGt@!aOK}CK00C+Vn9{U z*r+!Y+D|(AW~MsDQVbO_kD83D;ZWw(x9qlzUfLX2!xa{5H4rs!VY~&W&nw;@5(@U9 zrVjwg5#u45%vfDrJ@dg|?d)AEV2V-BTY2eS#YgVzYZUb)u(InF?KqNd8x$Do^dpi^ z+w`C^=2`3~i$WLCYV|)v(`RP>h(y$SY`v|G>IVLBa)m}0HEA-y1TNqs-1eQ6L?GnH->ciZ3z$%IcTr_MW74m;s z8J2)Z90=g{Qy_e1w2NYl_787$d0L7N3D-g8s`mq-I@}2h{;yco8KLJ1d8TcLnd{x{ z#rdO%Aebvix(9@Ma0D1oSb;f!ohvP3h+|$q_-bEeZP=Z*{Z-iUu-oy<%VcVTCtL3*9(h_7L7gdeS*C&e?8=Tyqcxnm9OQbz14X2g^F7Ju?Rf{p?5GAT5l3oYU<0ef z#SNv`1UU^VrT5vH&|_w+ltSd+6_a#17yH6DGL@EP!0#x69A=stIBREoC#7ssM}{;> zb6>6}Qyn?<7$2RtrD3%`*c*9xa>!=e^-dtyJEU7pY?BovJH5ad%Wv(1l2itF*qmnJblp^EF2e$65`L{V_{e`*pVMd=11q521ev z5K7U#mXgORv+$UOXg|CdYXH1IftevL1r-N6mEkcZXJ_Y!xz?Nm^D(P>0}kVr(<}5N z<<6EiW9g}$;xwpNVB-PIQ6Om0>ZwYZsJU~a6c&bvxQou!NHoM=jk1$PC9u|`eOH5`X}J+$y-2{e0s zs(SL81?m%VN#UA`P98+XO^w9kF|M8MA;@jJ{e9BlJjU7%Mpe$Yd?1c2>pcR5n}-k0 zR$PT||DN+Q@n10Vup+5rG`*ng+aSKoDah2BWD;x{q>e#mQ&E)!digv?slC4taYzvZ(dH8~G4MZ%3fRoh$|!=x(vSU}{l zeya$w`O{@Nn2iPh-WVj7qPvH44SBD0oXu=?%P)bGw&%D`8kgePM(lt>m{aSEe@kjT zdJeqHgYqXhh4g?@0Zd#0gL)U8>VwUp9b)ol8zhSpL1Dj-76V~qAs}y9UF}9yI9Y#o zvWOs(eA}?Z$%0l64h|luwe}D}^eSj(Dk|nomi?RLr6Xp&5{?bQ!NIxIX;Eor=AuKN zOjQgk<@w_iog*3n+XcKcuviL2WTW1esPP?a=*6-}PE^<_08%c)F=b+)(v3aG;A4$9 zn~KW6cvTpfN!V1^k@mTiK@WeQSiQ`}G&*Bm;cp8T`PaAh_fG;SKQ$#fMDV-(%^y$s z-(bHOUjL)nuMGM>*7zT5{6@C_k2U_s8vnm%jY+IBWOcTPsg3F{%z$y_{Y`n1-H^WI z*Jb|d4KDf>&@m-`76{Y!HUiHMP*kieEIdV-eu$cZqdvkV z7cYozp&+0>0g)!?vXLOI=b6sHPNX|ze7d<+ z-qEzMI$tIni0AUfTY{Iqx1|BFluARcL*$_9+d);4e$A!0m!;)K29>NRbd0-GkI|1R z<)rh<#b-2X$;$6|S~Xk$M$oBWu5hVh3H2{VJ}*Es(&u44jBPPeHt!#K@m@oAa><(O zmg?9XG6fiP_~k$TlT8A40gA`YhJt>b6*(|qf{iWL16dqJe8$c$X>(n7-YaEM1&Xyo z*O7_`mYjb*D#i?0Ss-W-@XN{~FIQGs3;LdyP2G@1!!)iG8zLhc8k?LVUdjhs7K=Y6wc*&#o${D#n#V!ZK~zQa_m*jf>pQbd|igT!%GEBRh774Y5_8UR0fZ3tI=WbJxVA@JM!z=IL1awlOXI zAlBz>nkeoJcUDxYLM_*7ebR|lO=Hwlhy0Gv(d_e@`Y+P$ol{!i>&VW5%KB0DL~pHG z+{17m^-DmWjQd|%7HA^*PpOhF4j>>G`=1#7YyepCi83HNS}BsdIIE;u>wWp2AQ|G$ zF7rsPpgA5d%O$wBe1$@R*pKJ+Gdu-0x2u=lbcObHm0I=(63*5iAK)IX#?OL#XAoZm zc{^R7xlgb%ckUp(-vxwUv^I1fDb1X$-0sk|NV;&fif_)?QfTY=s?ckoTk&*8d6U95 zI#Zc@h1d>Ahjo>buw#v^));#owd}T;?JY)B?{T7VP2sVw;u$FhOBWLo)K^uuy&30I zWaNwjBTeNz;-Nk3?EFJVWZWi>*ICd3ZY%ER zUxHioi(ltq9XQL$7F_(#f9}&5Ibh?88`_8bYydE~p#U(iMgKXpdXcmbWGf32{!(gI zD_FqjJIFNNaN(ah015J&~2u;DcU)WYJbQ-|rWX^RRF*~wit zff`i6!obl+j&-vC7r+jle`S|U1PGk--1M$_1dMYmfKf1xfl}=@$y~M}Irp>ZF$vmZgN?R|(4oNZ5}Az2JBQI(>89krcP5g0L0y zd6JMBU%%5M53jA}2t)|@oJwrhG)JfGRW)KWqiK(}I(gPE|2xgBN@vrApQxk%iv592WWpl_h&KLzY<^ znxOSMt&g$NkNIzWG!_^y>@(8-tXApc|~KpPtdEe5gMFir&|^s0kV= zoW_NZ9j0!7HU%xt?e+4Jy7}`-$p3iX#y(i|AiqF5y#h4|1`-aoN+=+GfFiD?9&Qm< zjia!%TYtek>=O2CUZe-A!|A^El!(x{b+-I3P&d83pdrQQt2*e6Y0aWu3;wOglSie0~r# zzT2PQdx<@fX#JidmP_M)#5gjW(}*;RFi(Sb8?h82j>5sQ2lenD(`(=m-0VvPKy-9A z6^A->I8P_KgkkIEw0B>jw_;j4KscMpF<&P`uH?T_x9L%U^oqr{^7uu1eJ}u|*E^$l zyE2*d&zI1e#lN97svn;R+VDdt=ADjG^@40IWv3Vf?6k?Ijbslw2GVAv@@3I$d_L_P zniXqbO!<53g;nB;j2FG{3iyq#x@c<1@1I3TcHz>(AqGWlAK7doG~&oj*qD} z*zUIILE3B3l%e2RIFNY0qW}Urup*rvVuSWfJKc-qnqBSg#Wb!(TA_scrqk0I~``abfwDtSSIm zCk$gyB}M>Qkqza*WLw!3lRSDO4@u8JWOfPzwhk4^9Lx(8Z8AcmFK1xF0P zTdclU#IEp*ZK-rUF8kZZ7z64GAXxW;egVqT83N|YhYD~tS1ooRE`-L*^^`?H6ZGLU zdvq42cb;6^sOhu%a#?XJb(#}AgEJkX*x>He4cG;`XJxPr(T<*;gF->clVsPrWT>o} zrHDRJIp(M-Yl>*4P}O12so*lV*WNTyT}W&8|0~jk=B~v3bdQm#qmYGRAqY&($!E>f zRqwE2D8Vdq?IH$#mL&L=-ebysysdV-{dR9B6N&DzYJI@CIC`xE3pXD#cB?Y8TgYxe z9{@YEI`CVb0WkWZA6C&rb(_q3!T<|){5aX--z+dMau@giaw!)tcfQEZi3z%``RXn451_9>(!Lfk$t|_FiPkk5(57 zUK?RY3h|trMO5#$ie2nXKPE&C^?OcdWEMZA*N+eY7BZrZA(|a_Ufioh~; zk!r&gC=h{;bJIiDKB}Sd`V3ew+6SovZN&^cWq_b}dm{bQ4P3uN$5W;iZAt$(H_;J; zfxV_Nl5QNnaRtDD{DobC6`ETLqu2dn@HDu1DrY~M2K=bQlLm}XD%XoSJT=hbBN0@& zR_L&dTv)VngL9?qjCb~fPiEZa9@OnB$@|HfQve)HceYuKmTlB*xVJRI!(uHDK-xnSsgtpDs8kJt*Y>-Xje5JOUxV@3XG5uLJD(Y^gN z!0Dg|oR4nJbznyL_M#rzpz^{Er%RS!SO72|_YqykgMT4bh(u=f_|5^ebKOC!SpD$Z z5l*9a>Z&Po);%uqqx{^98uZNLdH&>p#CqmU+KW#>@{k90hnB3UHBU?-Z2F+WAj?`+ zyfEJQSr2&}U+pHVulipS<7MgJYyAHvF>oNqW6hiODioQ5H-x*(SDiv=aJxKe=5|9e zPBi4?i+7qdH8n%^eoz;hKEF#wX1$)(CN*gJ{z%n28CIG+vwZ&}%a|R`Us&d04>C&$ zeIgD3z9w_bF}Ba`ZRseoLz(Rd;Mi&Eb#?(TzP&KChV} z5kF{i@^)|i({Z(+2+JYQr=ld_r1;{z9ujTH1KTvgCxSPv`bH z+PEDoMy$;`^k&c0Cm@&VGistZ04(o-9pBk)Du+|F&C$kw0wJK5gcF`eR9Bfz3&P5M}nL-CmsiS zmsUu%C}ros`_k*+oLt2LXgPU69hH(oQmkTtZ#$gJ3K%EssHIl-i_I}s%VFPnI6*xw zYvE|J$zhB{Jas@~%3;M2L#<~`&DNsUh0f;i)xNZY+%xl&#mELTm5cMSPm^T*gYwGc{O|1k485^b2NY+|V4| zOhuAvbgSL{f8a~L!9N#Yh1BqUY1J8A1d4ySQ7u3{7Uw!G%a6T%iz9j4ha~4Bqr5vEL;^UZTvn>rP>jDxd*< zggYOXM9;M$JiL6w=Q^<$WkHFB&44pw1(Xtak+Li~ z?xi+omqLT_{(XJp(bk*B6#PIY_dbFf&2`DN(B1oob);0hp;E(I!T zn#iiTwLAC6H}>0ZTa`1QTA*l2EwU}u@8O7(ypV_8WKHap;I=4qTD@5i<-%(OGNzJtEAW+WO0 zX@6bPDr`3+eP*i!8cDjilV24@hQnQ743GTe$r*w*4s-U}a}mDt2(uxQ=*-&76W_Y+xNCs$t8Cb*$=9_ZGV&cV{!p zHw8yF=V7rNK|8k8&$&@>a~+E$aG_p>=nu(P7WwzG4{oP-pGr;Dx2J_TI=%Nl-U-Et z{9NmAjhx=No#9@x8+sEcK=gS-ynT~}i-*$v(4kcqC}L*|onR4Nm%l`gPzptT{w$ov zfSooxALDT05oE6cYH%eg0SfVyny;e2&hKE)zK_wQepX*Xc|%@- zQB@AHWAsqIhRh`f-i+O#-%_-CR+`#yX;Cpnv?8OHCt3i1$=9}xipt)4N2vZqDVoj>|Gv|5L{ypkhfZ^s z!2E2Mp)08`-bM8-z=Dgsb3bKpeA~yVu4T0DZjNg3aBLLCYhsW}dfA5HvtI0N>0Ei~ zXO>#hm!x+PDsCA|a%1DXMrL;6sbDW)97}q5*p27WJ}ahHst2OWrHr1vsedC! z%DD7?MGA}auxN~rA&KK!ABWTEdQ_EV!QPc}paNAeEkKgY;i}v5GjU5*{7FBbRNhI2 z6p;B12}_`&bw-m4v2HhWZVRwRxS$%WW>s&-wD`tE^!(y05#Bu(7 zPo{vwJ(0Re^B&qEJO0B@#06zvhlQJrnQ@My5bJ~;vkmL! zg$iO`)HP60ic~WcF+u5s5Ust?g_a z9Fh6(!sx*Kuq8p{3sor*VKDp8{{_&%$A8qPH*_7}8*9zI-IP}uuM}-Q@={CMRuWy) zYF8H$RW+Z~G-~sX5&1&XUl2dD60|(m``DXG#_djOiMqn12TdyP35SexhQ2TG%F@mr z&f)T;m#>UkTwd;iawC|!^a|PZz+!IVkANzP$JGZGmVXPzfOZl(9(G%?>E|5PgEwLk zUnv=ny#3!KLvtq~(YD zPbR2unOz{8Hiq)Z%Sh2=ph9x36`ZGK0P8M=o>uFVBevJO_(^FF-=xM`=YMedKFO_{ z2IMKWr=iIre1N9B_c7%FDEi&<{SkaB;PfzuL{(Wi29Tazmo+nNI+}{psRaMw+Yd58 zO!O1=JSv$km=iq)ei^-)6Vq_Wz4c*{zhu$(mf3PfQ)%6e4r9;6PuQ)c1o%Dp_dSx? zQez&>KRP-&*C;ZgqT0_$UC4S2>c`Vt&Qgn=D%iR@9Vcy#^OWD(cSAxH&NacgcDm!) znk-bgcSGFL-S*Xze#!CW=36?S6XU#1biUlMRv&0bV}j?z^9vvwqBB0krxj$XnE z(H*pE?AIlaBvfhKjhH~JylyZgnQZ&3Ui?DytQIqy54Gjy5_wdu4XlJ&b@PGAKDz)q zropb#s))vDy)yrqtiK?%b-3f>?(&D|ngiM-Yowo6c0@b>Qh70=En?9+v=KSu9sKbZ zkMYv4_zVc5{7)uP6CgnP5(&lO5$4C_GgjT1eB!J#sW?C%-HjHpqlv3anN8|K3UjAV zDpnQABQ0feeaD&$;($i8Z2#+Jl1oLG053S^DN z?cN`XS!gD#AK(@`V?@7^oSqD3)xNS*;jQ!}uYYN^G;S&%c0?lSUj|0LJyq^VhNo6@ z^S{3dY}k4GWrH8kepQv_h!*~(x{_(@Z{%f0L*w%;yZo}|OY4Z1{$Gs9OQU)UFtBxp z2txfU-RT#`p}h0XKh_VBLCF&<^2cs zrB8hWta?B)-DG!aLG0^*xL6l*JAQpyy>dzaW%9C7{yTE>G;$~|Oqhqh4H_j~zW4i0z zSKr}w8$Nq~XJLas{>=K8CU@)$CS0@T1d$74fdqrN3kZi8i&T=xYgFI+BWORpeh^_7 z{}OTj^Poj?DDh~3Oxqu{Xe4N%{|7CMfh@7^(EYfEMZ~;ahk^GqpM3MnH<2Mp(Baix zbkM?_d=-UNY2KEeKX(Na-sOFMq!|fMAH!mLP$v(lHJ(vx&d>5V_T)=^{5|*pPf$+! zUOhK1zg&QwP!SaBYd^pf>Ta6}fAWNfnX}bDc;XN+^+_rocYfc>qk#;EWtL)_v&tbg zovf4}RQ67v#w|F)DpuruUP#lKqIs0c_j%YwFqGsG%4nY2o_xcly0Rfka_Ao$DZLxm zpC>m?tDjbVDr=i3hmMQ}f7}ZddA~NrYk5S@zysZ^pKJfeZrucgIlFDhLXXp@)4ckU zn5r`^fmh>NjO9^scx^oFQ};dQyP|3rQ*KpS$4*}XHgNpcrRUwv5YDyiR-Q=xwOSx@Fidz!SiMl>btU$0RIuu}gY_TDlq%J%CQRs1L>5_Bndr_n+InpMAW~d+g)=@NPdT*UUB7d9FU!`mJ?|cZ7}E z`MW4<-jv<1@`_x3iXs_(lGNZ9KDICK;L&-INoRY=@RQmNgTlH5T0tC&?`yWzfDiku zy_+m;<(b(qDEQ?rTgx~j2`zTkFQ`&_4i*4 zX?Ox3al0~`pXEde0nq4WE-=LYaWvUGH~n(^do`H&KWPH1#Zs0smE-t6Z8xHQMQER5*uvPtUkah*aQPzj?!>o&Y8^D0r89){5xJ?R8&j&Yg6XO^ODqjE6brYP< z`3O!Xqp;bz=eZ!$fb}-t*-mHM zy`=DFV(Cr!f9?TE|1A_$FMv?!TB6I}UX5oYP;a~oIIUeAeVMr5vAyce2B~@tjJ6ay z#?osTy};QX^N2n4>kkZV%0~a3pM#o6mM(HH0&dmrGDVx+!N27gs2s`w!DzGM4UguH z77-Gh9$}$v-%WfiLb3w8)E(y1^a$5_(A=eIIsDSFoxu*!nTx}$O@9Azwm<*(8K4yA zUM0sk`8EuS^s=;03aWz`QNK2>`#e&0Z|ZWtYFx(W=%q9&%a8D@+$lHKY13skQ`mFM zx#)?LRNur4CC9udoHAfV-w|Gu=i;LE4(je@0 z920|O=I2;`2c3ysNRIO`H&CDylCMJT+mpM({6z0Og$zY^oi^0>6P{T)Oe#AWEc2Zm)4_n~z+v5{y( zO*;Sm-&9r*sH{)PtJTQ&Lq}|WxvqWngJ{=s6`@XhJ_I9t^q7pJHrDxuuo(L_z48!R z9=KXfVv%QE>lW&m5x&4Kd+Z%~dg<=@z^xJ=9|qm}4Kl^g4qQoi(E(Y59V07n@9DRiS+q9$bB`_*^WNN|TWP9X$9ExE ze3xkSzJ#jP(%oojIXkB!Efq zPfA$?zkPQFC|y~E{lgPHO$DWQ7Ppab=HDRScXfenav>WyL5^!%;C4>0i>LlEU_UkOzagx3Kbd#E04SUK;W`}m#N`AqddWd1YWjB<1)kO}pD(I&;s>6` zg3Tgty{;9?MTJ;|!B+mK& zQ%J}YvIRsf^)Zk{nOot=6PN4ovBpbPfd1bMdpQckV{CxB@9*pqR?0{K6X98$Sr>l$ zt|8Ec;BI^U6Ou#?0Dml-qoK?v9)%V5yE?#ly`U*Oahb{lNSs000{r=j`#}{h1FXOx z2M*Ubak&k9d=O?YllZsdypsb`*J8z|W!VuzRc3F`@z*VP#i<-t&C{*wE%@-)b-I7k z7VH{+DHpF#FfxSddY^_W(NBf+zI%;|BOp&=rpmyml%({8+F+lX6$8v-<5;Q%yC<$+ z&fJW_FAaQN1C(zmzC~HImRXbk_aSh90d$8pwTVT1-b)7jZD&6e1LFNmuDPpU%I7l` z`}fYyhk$3fjOjS4dE(kVb$Id@HZB$T0G8som^J^fe%-#`!uk&e;3tV30&;5huG8kk zMFjkEAay(7a)B+iEZ%;B*>8|wK<>XvK1c`1(RpPG*0R5GpKZX_K2_r=Io#6WESX67 ztz(D^3(@;-=iCq3zuxe)L)7>eE#A3d8De2j%PgS=RXT~^!AV*KzS#x%$Btx?- z6xh!GvVw!yo~&9w7NVJ|)HkpG!O{F8i1%HPJPpnF0 zl1OZ+WB3<={*ix>an&cLa8^%@q!iWezpeU<7T#GPn-`ErKleufz5fW{9|8RTqXi_I zpOX&Vi_>Y0NT5$jQ)O%!Wd_;dC?5~mzN6ZyUH_I%v;FI|puLqhEfcxeZ%J!7DJ+nu z!eBn}fR%cbR*e~rEJU^rKleMctkLju$4_yf&a=1TRLxI5Rzaf&u4%YN82wp83d#?W$&Fe+QNqKUFuNl16* zj{O6j{L?fy(YaIk;`+o5Y_$WN;a^{X^4dq~&{Dkc@-4|$h@cYsO85;Uj~OEIFCkQV zo;#%v4u)I!f|DF72GjiMrT<>>0b$9ZI29TJ{4ESoWdwXY&FYe9ZO= zZu+hEk$Ov!yeq|&iMv6?#nAhh2s1Nrla(NXb?sdo zwYwYPLlzZGJA3&>Y;$Xg48yq;*LKwX@|mfhGxm7l#%^!JHrruck#{F+bp%~k`m=jJ ziM}EzH#By^by^;}6OBU1s1;}%W4+6Rl_yECTH)!-q})!`@QdED(%;)ilQ`9R10am! zu-#Ny_GnhEvN+>o?i`xTz}uX11@J`~%+u@e+uh!f|J2c}3XcsUuXJoWb+EZso!1~+ zm?WZk8N)<<%@L<)Z?Y`Qvf+Fc6=3VxwGzWu8tHb((+iHw&z+QVBC{AMUcg^zw1!Vi;D=-qqi-^YY{M=}(&ED3D9R|(=Q>_g^#~}9&U2oI`CM3|y#btO=;#Z?EZRoz?>+IlGm}YK z8~OS*u0y<3f?r>q9HKxF)CUP&zsH~7cCK3{`jSQkg$-ZA&qntx-74ga-g0tR*<-SW z(Qbl$R2j@js~F;@iczUyMv2MuNg(R=nB>Q5P;pIbID$IAkvg{)kgH!e?1@&b*YKbW z$UsMdnF{uqq>HE!myfhwU2EYr_Np&S7#K^}eF+r5Uw!&d@lRY?H0}6&>X%Q@HL_<< z7ywAwS=)l9^U%MY35?S`RN2#?b1MU3kR&>5h<&L}0a^XB^t$>kTmP z*ce~ynfGGG{%*VTOqgGYv_w)?}89G4}HLcY`Da)dk zEOt;Mwr0SAQFra#X8=jd?->Qhqo4Po7_Mj!Qv$6Ch7CsrCYCm2X#1OJzXPHM=ZJT4 zA$^phHl#0n-8W{{-|!=1oEy)Z+!-AiSR#&@o1l-txK zIIiLqdtp4ctbnLR-MVM-PB)VQC|eT|cO@#|IG(9iWlguaWjWc4GvIu?od2h;^}shZ z_-)$W>5ETGOp_dH;pph(u5jLbt$1WD_YF$uBi#h9{=174`MK5TxfhfD*ZC;3y&?9^ z*;CTe+|^qs^he!te*UZ)2DrJBV#()z_<{as!Q=CH<_a!Fhzkj> zw4u`6kNYP|n!HMOiSB9M;Kmujv)`|hhpzH8c1<$G6{oYS>FOQWXD}M*>Vdx))DHCI z}r zhNrvExG$0k+8O1Vtj4+bYJb$aJU;=t z3$d^JfTo)XJPxip(7a&MA)CAlt0KSe{K<2Dqq!BLP!E@lW>cQhz7^~P8AeUaF_tVbaP;GH zgvM4@44*=dT7Qzc7OZ*>^O?0-R(EuWbfvraO{a&gAzoM9PTcX}kb2*YY~J}H+EC=A zHScWqw&C}+8@=3Vg2K9bm0PB6+tsylU7?+OKfLZ)Puz`p3MICN7QWWp-kqb)HIdq{ z-oQ^6`_8LeBDP}e$V4LaP1~dy-B{G=+awywUc0A!MPyNf@+cx?BHGD%^k8d;VGOAO zkA~S(YM~Zr3TuxZq3PSf_|g8welE*_OfLPknyFo>dY0fXS)}C}bG5ej9T$Hzi`Tbj za@hEwV(b{DZ+;~;O=MNctewplnVm_Q7>>s$6J$Qv#nilyigJ}-tzEhzu>MlCHIA%C z!LXhMF`lISRnSS|Lx2{qbDF~&Z&&=p=~ZW9#>k#wNm?t*g9||(;=S^IS5IqUMWkaO zA97?vi0qc^pTMvzyggf>3gO80l3o>HkSa-~O|fx-MbM7z%q;FGF(x{Oa+Avs zP0SG8I`pT95|H8WUYyx z2&@7Fqu$T2hUXY}NjIiKBV29E1kc z@-^E`VZsVBM?GoL#(i(1U95S>OKRM=>!H7PdTGvd@Qz!z<%sA3WXo4a4RZX)#|~YuinkAUxRf%#XCy`w(Hv zVN*%j5{pC;Jum99Sr>fg+?q><3(H>;<6|2;ujNe+Y`gx>R0{#NW8v;_#zec#gPvGE zR;8_jo^VEo=`>7#2|Pt#ZH3hN?XW+i@`l)o5YsIh_K6MGO#Ok+T2FTZRP?oCs_O=Z z9Ab*)rm0$H_%d2r9FFI%mzi}xnrlC%Wt_JxRE%=yB%3WAj=|CDVK6j?o#%*|WXbE; zO?&YpE~socDF&qh>&`$o_}+F(YeyfD*&ZU+^X-+A*}8m&dSaGe2Hg>2Y-iKG>jqZG-P?P0wHNWkpq-O)!hLZdGO@e-L#Sf@XpWQm+ zqv%ln;z!Txi_f_y3{Oun3^|S~to%T-M}E(|Ec=zKtYVeaWKdT~?QH@Fzd1BQJ%=Sm zz%+)aA@NyM^(o?2t|739vh$h;3wJt+NSWmoWIqq_>=NCexWo*~5)iBo=0l#jZcY+@ zTZ@>aO%*+hQ(endXV?oa?Ciup=GnV^`alnH`u&szFxUFxXbOi#J@OiO&TJt+isKML z`~HsK_!pLeH2V$QZ0!Tp@LiL_9{%&2t59yEA#<-C{fiea7_E}PBB;TfGRT^4jZxc- zdU%75W(+{V+FQU3R@dVg2KaSEV?8ttg0$e z997e0@t|=p5ht+6x6KFQdnWzEJYKEKaKfEVp?0-BVCg>VD2A<@h#3aZ%qrhM{B$7S z*KWDYoKsKt1efJT%j_C2QaO9|`QG7Uoi6`*>b)7SeITW# z-A*XkESHP6Y{iRb7?b&UQ(k0!ctyAa9n;g>=uK2EJu>#v9eoXqEhM=!$}ps`#u>RB zODVH7P{fT(wuQiWFKQl zkv?jC1I<%?(WS)d;)l=B}hYUlKfOB-(0{ z?av`St}eq5dPT*omKUnybO=*KFQ$D>FVe^UM&#V5p=hx!z36wIBS38`9L5czVk zOPCd$?{?-(>Zoh@vruwp4 zwiip^R156)KbALcI;3oA{bGRng2h&LnRu|Q()pDN^ANYw7E1X$yVu{j>be{$i(!ro zz(i2t-CL+Za$sALOVWX&f5n;*yb8X;|uYYdpabt26M{KDL4J=QCXiLMW=H zNn3|j*Y;&7h<~fDRZVOCLA3y)2RCf=Fjqd>3vcgyT5D4bYnt-pTqbO5OYn)E^BoWk zMI;F*XVmPJNqQ}FO11{^X%Cv+8pzjT@Y?I8P*zgW=u1i*_#wg4UU}-( zK7^sm%=g6)uBnSgh7*R~pBTm$=99a^XhO1&i-LRY543D$%58MW#^<86Y@?y8&^oR1 zUIoFnhD-xfdA<>i`bUv?+|8wCqfolO)N+P|<-DS^>NL;&jcvN+mc%Uelydp(Xg)xw zq7kD!^Br%8_75B0vcy3zRoAw61YHi>I4HgoP)~6NU6`?xsjoJ@aBSh?%OJj~=^{(L zgoxa$EK?hs(yc}hxNsUtf>;0)ClI?b}7Nr~y#fZwH-gZIz8du24+Hgsxgz~i9h%T@VM zg~a;@<}T(vNc(QOXz8abqOkZwLn|=uMb;Y?f7atvAbiF%8Hp6i4{)C~)-0UiJ zHDc5zWW0)HMtfl`hx6m?`v{9JZ9SMt&?OPW*X;@W+0Li(HA~+w*eXVrS&ziHJ|rWJ z9Poi;eF`A77O96b8Scz-BvPt9ZAWy%qgM`#Xs*6V|1g*yK54_Qmuk^Sn7#Mi#7h?} zxi(e8(mGe+fm;hz zPUCV{1b#eR7^sPN?kZN-gX*M)WtG>;Mt5#*26Rau?yjJBqIu}DFQsRmIU9){kBmexe=qjI zrTTMjRi-g;)3|=&)G6I0PR&~FNBL!8Pbzd)a&mT*cX!~OA-M*o*9Qu|-b;rUX355x zUH>FTrH&X~Zb_Q>_-*Y*4ZQc7Kq32ONDmoJA$tv+o6#Per=l-kFxg=Nr>B*1B#Y|M zdXJ}Lyo8$9a)QU)*j78dJ$To5PBhevhsg#H9W1!EdC@Rv_9F;BHfL^xw3Uro^$uA? zky3#@o|cxngM0r4qdsZRdsNIFKQr3E{fopc5YuFaNe`3{D8KeqQeUm-jA>lz)<=T-tdn8fXIy|X0S)lW7@mbIa+iE&Pyq^6Ow6wz&Zx>nD< zU~%*#$K}ti&8#?Q1PI&17GSU7Y)N zE&6biBMk>1n((tYV9Y^SqVw?6gt$`F-ellHPm!VT*%b}_;8Say4))y|v`d49(VT|O z$fbzPmbaJ5rs7_#j!8?PR~`uL#(bm`LF~$*DkR!WR7u)%^0)ZL6+e$FI23ehKpB6; z@jM=Ir;ZGumogIDq&AZW6CcV`3e74xH}2?vd|2R7J{%(^-`wy&ABBxQ^R^LOUDxqo zMsGXW-);Gqhdv3=?eu7GqnpxJV9+f48m~|mTjt1n*$2ErMsu!x|4|g17QGPfq;}cz zxa|EG`q%VEEyG;^w#HkV=-p##F53zB{mtCMH1Po9o+@?rg?`J6_`YA%!iInYl$N?X zru&HX&?VX+P>m(RY~hig8cQL>x)H;>LzFLd{+#zqE^qC98a_%Yt)8d_!&uj$w znlxdKdQvaOwN2f0Qu9^W%8jql68N=z77s8wKEf+@8oxiBVym|>4D)SEn6db}=C$s9 zbhJe_)DjUjhxd3yF^2(%;a9+y`=&i+E?o1PT0bHjGc$33YPLqB5h3)EhsH1gkM ztH3uYVCnkAOp9!;`G@z>jjIH0mW*MSw+zsYJ;@2t8hw4ykT$#F9(B3>x?ylMi+fC^ zUOO6x8^F*ir9YeVl*@6EC+vyT6~P&OFafva$NtdG)4~Xs%SN&bQ(*Z;Y_-3<=^(~D*`#jJFh|n)d~=+7GJ2_SDr_)W1g-a z&5v(RG9*XkUD-=LmcNOpaqH{*M{Tzwd>}$!j+~&HYQ!jYS<(+&HKc1IW9IE+EuI9e(rqhK1i#28@D*DH`c{f@b z*Lau0vzA{{cy4o&dhIxR_7S$bU!Yee{I8WHr`7LE^wv1DC zOvS&<@dA6wNbfF4yhsjo+7VkbxvuQKe^QZ%5I5>SEJ}?U3>4c*PH<&&QC&BYkcGsg3YUTcJ3quR)9s~H1`*>?wn zYAi|;?0cSgCHZ~Ba|yvqer0rhW)UjqP@ktCAe+FA+}-NEm9Nbh7VexN>s09EZ-%C| zjYvFlBnXn)=bM)`@>p@!UXc+}i97Und+$eh8j5SbQ`M1lX;Cm-lEOo~NzWl4Q;vY* z61H#8cE5hNf5dg?BAn<7ff(@^{d$T2f9GaJ{{iB1R=YOfv(Zbx{DxFna@PEHIa?=3sn z4-*+S)F5IHD=gZHxRz%kj&|g5nb+GJOlK>}Y~J_h4mRLD0@Zk$ud&U^F3L@Tl&SSoNkdAB-8lbAUIgp!ai#Y@66-SJ=DxQc4T66yx6g zC(BsyQKQ(%PusQMC3bgU^fC@8&Axn%M|P)feo%s{J53rWiUom0Qd%$&CPxmggfxA% z%RiDt)%s9MrbjfBS_BYu%6l)7jMKJRpJc5*&=QheD$wRtVj>xz{E(P|2dFe=Ff_?d zwxU$Ux0T2{>$ouD2s^utIU207KO}c{Lza&fmsf9$ATN)6qN>8VNWvQ4tsWc+-dWlG zBbYJfUR(Ii8=Dl@Wb~ELHy24<4~2i_`G(HgRqzpzbF80&!0pq^S33o5BE_xY8~&`T3+wWT+K&$>u55!rHtYR#OX^RQ!p<50FCoxkkSc zj=SeQQaVLdNnktg-<0Q&uFt#0i9k;%e_gte+=niGZqy;?RlE9Fv=B*)KnoX%KebHX z-m0Gp^y#xswa^5$r{Vb|_CiI^FEFQb^W&liO%&icks_;=nX0O)F1eH*dy~b7HdXfq z-Wx-%?QJwC&xC#n3Ex>7JcL?K)+SmNx6)4)I8Xxhk9){a>%u}zCq%``hIEH6CR`#AWq=k5WhE|8oqvywj3Z*!G}Xg z_~d@pkamf-jEJBFt@6ZOOHW@><*!@RUOK~LFi`rd6)CiS1V}{TMfz<_%sjT)r^lWfZ}2sXE8ut_XZpE{L9N5nY0_F9zA_L$qlX$} zSS^hoKZggqm8g&L+RQec@n#fAdl^s@sOM;gac_^9>?b?k*m_s{lAh%CN{a z>HVYJ8uK8G*$T5o3B3t!$xleg?wGkhCh$6q@nXr4@lCA~vpa^(fl=t)QT5}!OrfJM zAN1!`IEuo6ELqbMc5o2@BTggCt3U;eI8F=?i3&&VTjpg4*i7l_T8B8FJG-$%mx5H> zpgl9=*qn`*N23o}TFwmXUzO@~WK=7K7sWRf#NHTpPx;#Ju{+w&Zn`i`k^=f!>%sGH z!uA-U(*4}YsQo#jEYkK#n=0$sF<4jlnX@bGcQQY7tu9&urDOMK>+*c#Fx<|N?4NkO zXs!0lj5ib$xh^0hBU8;SV0o*0@96PD724?@>?m3M^n@X#q4T*q{D`7ggTvv_&&I20 zPKnbtK{Y=IO$Y7RjKf?kzs>GyZD?8|i6p*{stH18eK4uXz}y26vV8((9A11Zct+lp z2dy!7+7xvT3SLvK&}r{^Z8Tk$gwc-es$zZnc6%&2WwM^hd~?)~y`y5f2ov&iz`w;` z#X`%(M<@7M@fD5w1LeLK54=ukuF^+j-gLZDHX<0qnK!zl7W$ zIER_}h)UNPEdvz7M=9H_(oK(nGVVc3E<5500)Goapi$~p+8(!)eQ5|C21CGD2>C>`e(?{k-A1`-@QXzQSPvHJ1f%^miI zGK%!0CT$cMe~=3<4R{E=?;u~$ex|ScSzTfb-ASDe01WS5Tg&UE6oD!NBd8+e{#33w zl^Y>Q)+o5wpz~s1_tg-rRy~dbVv>&EY{H1Yz8^_I62zwrv@7WKNQ((!drr!tE^nsA zK2jN=7o_n6yfAUF+Jo>1owF`u$W1d3v)j1)-@GW>zD6kSv}|o{&BhlBE4E><4ygxO zxIJPuQ4?P+WG&OPo7Y}@3Jn45-^%$ubT`JlC4883bKls>(<(T)i#;9|pJ+I} zm1~~Jh{eaDywqqBk$mc<%L3UNFKm?;rpWaOTA8;;RM|WW~w7 z)3u;^B%U8G{kA&^YsoEZB+&ALh(`!Cloo0ifQtJRP-tlOdPR@ zlo}_Kvv%h=Vm0o0^fcXA{w`NwI_#>mjR~>f#d1%r-gzMI@_cl{xK>2i4Qn~%%vRid zK7hqa&1@mZ#)c?Jll96>EA~S|x(YMyW&FQ_PF3>lCvqP~q$L#A2tzsrY~K%>7+$cF zP7aLhpa%E_*e8?iw7;QJYXWRl+Xe#D+ux;=*FJ~^huYSn2P|Qncx7pdO>Oif--HHc z(nv*~0e%AX!sb%)Gu}ffKM7u1ckR5> zo7(j~o1RQDr5#peZ>W2#skD1Yo##r}%WEyyvGD*hjF1c(bBUiU{?64kbmq3Z zOaNlDR?8>$HgQ+|YT1Vm59d5N1sUzfp)otF{jwQyo^=0`%6}kI!+%4h-kVvCo`6Wz zKci?mzfQqTPvl7j?5_%hW9j(^!tLt1F1`OYTYv$d0q8OtDr2BYQQ?ePZZ!Pm0eK<-RpL;Dr>OW%@Ux(XQ4vZk-b~@wl%QEL6LD zECn<5yqmAp+O^6~7E*T_r)cCFXCxl%=TWWO(*%hSmIR=Xt@$NI!tL91`{Y+Pi6xn3)0VexEb=LF z7Zw#}osE8Y{gWIPY{DX&Uisx&9pon%tc!hGIh-3XF_JsmrtHitur%gBEsc$U?&iqq z9B{eq(Z%pmKF31Eq(KWo#<7DdUUrSu8_J~?Z?O>yfGzqHF&jmXA1|vQ?l0gCyDbU- z%js6H2}41{(zpt6DyJ`U#85uRxiyT|nD^K++c})8JF^>IwI<^}XDu!5cVssxgf?~k zKAf4Zhp0V%aHIa>I>kldb2~IGzif>zGC%Ekd=;8UtsSA6qt@i9`i(u0TdAUdC%n9s zvYM{@@>W9aY|DL1M|q27=0yT}P2A<{SY?D3XKhIVWsK#ENCo^&vzk$30sK{~jh{Bd z^7kp0zu#>#Wh;;yMFR831nHeY!*m3KDyhP*o@l5>JL#f!xT!1J#A2@WiqCTKXi~9( zxZk|{VLo5$cVF_jukP!i5i`?@CT>fT=oM{&wK3R@GGlQL04h0$#iH62wWE6+DQn!U z@7OAM-g~x1y5>d2a5Z2&H}lh{hr;nYMHSJqv(J8&=ap_?J;;CXQqp=Yvd?CFFfy}K zn7%aF1m+*eRMdYUQ*J>)$^9ehJQPuAgPDzs|*{Z5o>kj;vOyMzo6DUX3akO*t7jove_E^fTH(5 zkf~k>C+60Cap2m)*2LqxiWj_`^SuNl{M4j}qrcE<9?QB5iaTf?`uo4bCpw+`^I)Gt z%k<#p*#si`j=E5Amgis;xJHnyClETra+?~&g}&gN5o|0PvPFlOu0IY32_g^|CU}`Q zJpkDEOE3Ef`x7kUxKD9`1APG6nn%Hm92ZjMl+P_CBBfRkc)7=RJTv6M(O2AszU+_5 zZ=>mJSV(m2V^yC%bwzeMo!wx!KfC1$@>BY?t^#&6m4``(Gi9TOD7K3N>UXLv+RX%J z(?(zxgLx1dFuLgux2fkM`NLc_R^x+Fm2~TPUK5HZS0o#u?d>!3AjM%>4?sNP{$RySD|*B(-t{1poXa|mKt}*21s%D%cVS*M$(^J z(iN{Vhdn3DR2XO`rE1+8e9D?Ulc3`iEmG+CXp5@lhN3W?dNApHuk%V}>}~t6-aYwH zzO^Ld!rI-+$23Z|9?@)xv$G`05xXm+hbyrhk}vDs9qg6(!i$T!NMC$SIfj_5R(hX7 zg^fFpKlMcKsJk}0hM?EKgdEfVgOM`*d>b4d=4MiDXn%==gTs8%v$-U5wZnJ*P}e52 zeS7@U5s63Nol0|a24sf^=kJRY_$Ov-RXrMfKUbT|W}YfucjYH!j0Wl!;&a;cCqhaX zA=f6c+VFW^eRZZ%AmlxWrh3!$)w;L}X9p%~+8@2S%)X*tZf>;G+&OI8Db$sKTsHGE zqrml(_&7nz;XLLVt#{Lsg%aB?#*plyS~hMH-=qd>KLs$_m!%&0T$^LppfXMLNODJw zqwqBwh#9J)^?NQuVu`RPp=Sz~4DdaQUTqEsCIjWK9}&@{TQiyj5hPj^Go!O zuPz$4yoVy{h@!iXyG(@5=RslF(=EV0hcR4M+S~^X15S-C^U*r{mp08n{^gbjNIdXY zA}+E0a7~#h9ft3Q3*K8v;O=CKe!v!qs2=)uY;sS&1a13;s%3Odj>MT`ubI-zqRwl* z{#+X!i7u58bl2=tFy7pGZ75n~M&zo{GTw`+(0cohy`ni>N!nshv>Uc@v|8BJ-)iX7 z9fdT9c?GUT+xga_=G(0M`=zGeo9-FVKL^|M&ZIIw1>dDm(c#GLG&;^Wl&%;x@9ZbF zWXIEqm}!YqOtbIC^|O*X7JC)9n}M+v)9Zd=I3-pm;jMjW1LO3K3pU?byjQ%%R^`7H zuer8?Ani>zY`zkA#arVtIQk+#7|lGq3+&j#aG1+GcTeMB`FfVvl&y)10pE&+HwZ=DoKqW36X#Di_G zPi%R{njiMfB)x`4eQ$KEkrPWuEm8zc=4U{?e_k(J%OJmIVv$Q`{ z`y*?A)ZmZt_+xVac!NJa^iSmRCn)+8O8#FJfcuS!J!`eyI)_iR6Z+&CiJw}2SW6{4 zZKX{CcMV&&8dLNr*LecJ$41{%#kstWaUfMTiOXNh3%8et#f%l~@BKiD>^<~6cJ;F= z?O#j702~w3tGH=hxJ9H~;(d8q!tgIw1T?@~gZmnia=kYxxJ9-s2lB$OJxz)ttnaUo z-){*P+>It~Y@9onWbnF-u>FzvI9;KmUM6Bl=aDNbUGX#BJcPzU1Py__QsdZM*)~xJ z5j_{~GI2}f8gCUWYx)OhDwa$tk!W3#wVZp=(6J;dnZzS5jbTPxDREdfupw4f306Hb zxc9pA!%CI1nPS<9M8;+UU#apG>rPUWofV}=aEja1&hp026CxLd?>jA1Rjrlf29gO% zjFehyITQ81#dqK8D7W8JYL*cfe{)HARRexpnR_`P^!egNP{1;9HSb}bm?G`Xl#XW8 zS>$^*K?Tm`XX!qMJ^39|g%J1jthGXnmvJ4HJj2cbJ3y8ynz6^c`D{%)w(_EN@MW9&Mxt=eM%|J>Q0Qg{*^7%a?*Na%UJ9PjBOAj?hrbwt2Z~- z^tQ#tV>nctJJ|bJea;o&i@G=v1&+h3+N_I?9X$N7kRu(?x<%csOxYb znZrNl+k{uEjnbDpduq%QcjTzmMpq~Ll#U$wUwDUq{qz#9{YF(sB`uR66=<7|;xPUW z`lbK*=hc^VOg~R6NC%t*O(Ff^h)cnFiPJ12s+%J#j496ry#iWtP=?~%UVfeU9j~am z5bNREFIv-u-BC8|g5o8fpjM!8eBVzZ?I?bWuDEtru)rxjiLt{&T&V4_Keodfs>*e(n~}xr zzOp5GPE<(SJTrjdkTNz-zjTworD{GBIqv1_xw&?3?PuEX;6}2C0$Y_qUvuf`b#lF#dZI!D5u05T7?B4IsXBfS?8~r2x z>xg&~By)|U^MqaQZTof6%OmERA4>JrKJ5#HPcA%9uKe#Ir?yaj|DniV^m!Kz z2s4KzjH%~g4d?+Tsx3IQ{N555d+a{$2Qu8!o`)U=0XYLQ3-hlUN%68rANQAlMrK%- zke+Vx(Oc7%E4M4pybBTnTVwVbb5zXE%34h-B6Mn&pv|1>K1?E9#F7pm^VAtjIT__T>>s)L$-Zc=yu!=jZ}0HhE!+V_{AK z!2`qTopcdjddky<>=Ce!e7x8}NrKoy9Nu_W_)({1<6P>j^1(1Cb=amv>6YN7aGxZS z{iU|KBy61zTWSU1y4^kGsrh3zulPIXzWGbwIzTK{}Rg|yD*ZLs*7mUi{ z|Gx zCf|PEj09V=T!Hrzih#i@|Ja_tEK!mMcH%+7&v{9^aLA@63N@EXRtu`MrVQ^pE#Z-b zHV);8T7&w_%1<|={;JXT7$c2BM6Rx9>$$IzE{r-u!ElX+ijBb*nh>GytQ7puDdCu; zk)wWFr2E!|zDskq<>O`ctHY+Pr(f+xhjJeX{tb*8=~{LAF;;(2-%QD1Du6f7rc){9 z=U~o%!Nfd*cj+y_j7649Cm&sy?at3wG{Cz9>{d*Tv*+CwcjeWl! z=ff2XlYVqzk^bE7jqziHj*kWt{MnjMp&8cyE5H=d1Iq!+13g1Mr3m&SYW;|x5TW;y zy&-Q9ieQG+>Yj_oLTBqqS9kCK%d0*mg^_<+2)J78)6!}}|5 zMy0y1lt%YwYj3}Fh$TmnG~cHLMf=*lDOrJ|EJKfVMPWBR5Q{8z4JJQlH=Nb&Z1b=J z)v)S=&5Jwn9LaRvPjl6gd649`mo+H=Q5rlL|CNs>V+OH@wb)`AB?%sP^5+Wt3B#sz z+Gh_<6CBIr5)Y!vkKaf5x|!P2TP^4P7{#E#0F=3V@WTQ@;49D4S=wyh2UCau_F6`C zZHUyH&1QHktdr>M9NmlHs!2$is*EXR*r)u3pO~SO5E_dqyA70|AEbzZURQ5-rl*1C z`;M`J+II6}FmK603OjFU)z~2?3c*4oG9Ig1xrZtgSjuH@oz@O+u3-roz|PXTdW=fB zB($#@@&G{4Yxfto(vG_1+|}4>j${fu=Ekd9M|(49t-IQmFFxTw{v2bYA9Z4k%|8&S z*1sWAdGI6Sx`&YJJ=4OD4nAFWNy?{C3@nZ8R)w;0ecmx07%ocH?H~TS@_UCu`18St z+(F6o7XzZ5FL<7TsXhQk6SpjFb$;k)otJn1>6ap~#kVXAL1BZ@6JzG@5(cB+vc!_p zfKK|3t9USruBqcL|C#d5xtu5=2BLsfc_y9eX<2I5H@fivbs{@EbuOZe&ov$Fl+jip z@;Xh|j)qpL1!Ho@0YBr0Y=mx<5{d3q>F|r*-OcWEYji(%$`O<7u_d=F<;!-XM!#%U zh&T{hTtng3(7oBO?odOouD$Cl;IWt88i(|JbtMYK*DlsgA>=d+m&wC_La>P2KPLu< zug{t8=l$<+QDUF|3tSY4vSl+~G=V7FbfV-jh_Yof+JhpnF61rNg^ZD!FlR_LUM)ps znFUt6G|wmcKrY%o?Ppi;wtlvWqh;9jtc?pmZ6YRPsA;4vF~P89()Er`)EI9(X1Qds1X?u+?>dvirMa{Xs{;(vR#2)wjvKETYJvsY=rr z9q5h*sr~0~KgW(0>(3=TQ@iH;7P5(>QGwJ4ix{CcTgdd~S2xPz5n#nP>>W~m; z+q1nKw}GG{rpCT3W5WLjdv6^U<=eFjD`EgD3IZY$(m22n(o!NFD%}XkAT3goBdOBe z1B!%ngXAbk43{Xn`x`5ZE#&s*4CBi^?w!n!A#sz*i}77m#>y>uB!%rcZswyMh)iKUB zTB}HU>_|x7%q(-@S>3rE?6EA@KQiY41YO<^_Zt1^KCqtO8P>eNdbqbwd|p^u*5i$L zbwgJx5zE1$&;J^C)_C+JL;kY$sIGmz8%u(YtIE#)lyh!bL|yLcFER}j1yn5?w!1OJ z2;h5I_s(%}xl?2-J3>D+w|r$1sQV`0(JkkxLZ<45gO%d)`!B|X!PP=t09c34GSM`k zdp^itN4=h@Zn`Y}~%V&tvN=5+2bigBK!`Z%s z#U2Z5^*YmoJ;`mOodWhGgNooJ;P2zMVU$z^d$Jh2C%J*kjOQdE!aF-+kkVVhS@qBe zIg$4$$>5lZ)Xq;ZW=cyR85i%I>rGR&RF;vW`D8+1%wtgz>vuEWqrN{yzqcC^H@g1> zE~L>Rw6o-6rFA_J$outkMwN!3{e0{Ba>~`hpG(Bcg8=nQsk76SJwUoXGo?Yy6ZID@ zMVS2`Xes*s{qLF_5!JLTqig5i+@C7cV8`UEvL8M2y5W=h>9~ieb?lpt!Pa87@|y8- zNG_4(vn3;7i5iRJT|OJ|n~rg!B#ZwZ@PNY@OT~c)oFGWz3HZap7(aSrnfvB}2fQ2y zV9T>yLK=IOEgiQ44jKwnm?3ufCj?7JE;BONk`XEl00}VgjlR(PXa;y=5r^ZCTxCGu zqWnmdcqOLhNZHj<`y)jm$0ERjnIi6gqy#L5Z=s<0o7_pkrO5w^Ffs)&{L4w9HHlQ0P49=f>v=)JRdc2U4t7qaFv0CcOYOSGRP7 zzOY1BNd6}k927>gtHcyV&sR8q?Q`+*@jh%^Z1ZEi;CdNQD)lFOX$55*WRFuO-Dt5G zXM2}(tlo;WwO*nMBGEd8~y$%{;#=!fPiO1 z2@z>_8A?}_Z9Cm}+Stk)J^Ik;?TqWALOrP_ZP8bT3TZR}Uc`Irk;5wBM`Nmep4UNctjJbYv&RtU)|yCtEaN zlH!r%$%qFismn3X2aVuZU-_aq@Vgc-(_9UYf*7BBi)9!k6ul>or4Y>+Pm_hVNyg|h zs;Q}s78N7THU=bmN>R<=am3o_D}_rwe8V0W9JdHKl;Qx^vEq?+m9XP#QK(%SGP^M_ zT16>K*v=hW`UqNea@oyfjGiqq?^8}k3abs3nHkTVwR)xsTy@|$E0DSo5H{6@?~E&!U!MBxqN z*)0=~;Cs@|i}H5csCNipR7`te3%?$J&gH(eZWDIcUn-y7FZT?sK|9W?gvbfu77L%v z&(;=c5vW>XhwCq5i{zM++~o3Zb9ZE{4mofOOuavsrn6%`D%_^;zU=T$DrIz^T~DyB z4JyL4JY2pr%nhK8-g}@Sj4|y8iE>UkSn0ShOkKo0g#`kM5Wh&dkZdx;P7S<}LH7Z@ z=>Y?Hlt$ueA+^VDVS0tGTNg9Az=Q(!he5H|;`09lLP}Eezd%SKA8pPkNlaDO-g_o% z6IfllIn$Ba4E!lQUf=>2qbw>)ouI{!4eR9(`mAngVG8ZGNaQ~Pjm>@_=tFP|L(ALv7&Ld7VI^U@dEuF-)nQ<(_Wj%sEiu>(WiuQ{3~24 zC?{7ha>)Zxnrp9M#vUs`!pSlx@&J@)CEXU%W|*Jr^gpu;>)nYE&OI=SX z2~gKRZ|}pK;Z!a^2AYsj`kS zdr?ry+Fl`OyqxylqWhZG#yeH^c$%;)EdlR&mKBf3{AyF?8^67I9fVV{jfNRt<)I}0 zPh8=>!tUeN`_ea1;pBoynhwb51ArS9*x`i4ytNZRJRf{uBRB{f>L0v!smOfGJdS&o zK&#R+Zu5tm-C&UubpE@ixSLhJ>;#to>7^PCs8_Cb-k5I7uMH<<)0P1Qo~au7Z1lIU z>PQ*^=32%(A6~fPl`c){`EzO)Dx{_O>R@b9N>~5%8=3^aLY|!R`OG||(U!ye-+8N^ zW`d!~6DPD9a$XAeC;i*5iADt=pW^UgPOkg@gIh40e`!F6MO%FZLnCNJf2!fSWTYy1 z>CX=>f*+cf<2)VOsn$-{+UYj<-}&%R{&0Wk%$c)mvJb^oPj~D8ExYv)e&)=X<6{>^ z8!-7|XRwnGnpGs;klf#0Gj)WWDSU@flv$NE!wr{tvyhp!)5ERO zUyP=Fs|juSnQgg!hun>Cw3Wa!1z9^O$rzWABR9p?aGcyP%BX;a^gi{}>jj zY+`k+Ru3MHy)I127*X~6`}-&O>7Nm2@VJwIs%1sXUW-Z**Ez9WI1FC<#OZUwaz1HP zKmUuGKKa0FF>@Sxl(HT70yCp{AU+e~54)!GSt3~L8|HM+KoVnq&69^%Ud`XV06A2_ z_kHkGOxIEHqW>tV_2;pS29UDSYm}-}vrEUu{2vhUU((=1qAPNJt@Lk|$KP|F=-?(+ z2l>~y)q5fOCI2MXO0qtG3G|G={L} zPb20@BWPNlKlv+cH+USK_rAP|TYa-XVdx(pI=oI}I1^F@0!Mf$s{GF{pR9sLf>4eg z$hSa}Eq}7yzg($*XF(CW)~uzlYwgK+>YoCO&_x8R2FjQq?=Shqj z{aqRY`v0ZbE>_Q}j9?ac_&x?35qa7!V`SluD z>6`eR#*#G?k{18c4;s6sm5ISD#3wwF=EO5n<)8nf=T@L+6_JOWSDxkEtpEDYR{EI>VK^RK} zbMcKWOwnIUDgB3@Gx5MIw6}ly7>mn!H_`r&o~MBVSg2ECFL0>`jz2yBcWa*X>iqH; z>>R%fym8i?c;SJhCVzyb(F2d?@m*Z+8%x^MWd5U2;tMr+d-NHi28p1N^Yv~#*;$|> z1CP7r0ZQ{p{;RHk`YOFZ&uKHT-X{uPH%XKP|LA!gh!{!uMByAcr13?8*Wa!A=lec^ z?~^!}pimx*D=QUH^hemxJg}kc&({bi6{eJr_Wtu&3juFmt$2pw>Z~$))>#uVGl$7+ z3F6u8s?$=;XthyHP^L{gsxXQJHX2s_qK5!cK)=Xm8H#Y(iC#fhnUP26n%(2m0UZB)6_2p%GSPdjXqhvy9tnkE@0&*2%dU z3`v=n?m9QrRcl88Aj$?IY?-k^48I9i-* z^e*1nj(qw8=J=8`vl`vcZil9PS>UmFHdHcC>-qY&^R8G+XXm3e1pj5vPiMvqGL!M> zQSk)?WrI2o^g7EJMJw+W^3nFCai^}wB;-1WwlZ!nmbduGhO(?GMPXx+q?#>7`}tQX zhuTJ6msuv8g0O7oy<-hUojBi6vuEhFFs)JWR=u4ONT;Hkcvf~c`lI*P_e-Daw?S0P zkZZ1)Ze*GD6B7sgD1>V+b~3G~NclqYi|UaV7@h?lt~WZ77Rj7wVwmS+3p@t_6|V%s zf};%H{H{2POl`WT0PDzKm4iXs^Pj)^6s82Pl#riApMSYruDJ7RzTcw*il$B1a1}sq z`p4kqQaY@qt?y6qA@Wd(oO*z+Lt&28{g?Rb)%?va*;pQq%Vp?C>#o6NWfyKOz0~lZ(K}|&QHfEUXk-9uHasrqVmC0zsH*lP6_1y3Xza&P{x9he~^TNA_$jG8{KRCDBJqI9BY56U)e` zTs7_jyKCt&7k{-!Ua6TKXnK*4`@jlKS7#yejT2C!!EM|< zz{E3BF0lLlsAw?{UP|=5Z5r(~7QrANQ+d#+CoH8TWb&!1!|NCaa7*u}|J3U>J?;GwF{qxmYo)lxkk;BQIKFJy_E(m$DUB-R@|+BTLUpvH^|! z)mYhSfL3ykwx@zDd{mIX&LK^s0Ut)adp{&ReyA)YQdu6nA-{8JVc-ah$Y9iUMF=^W z?SOmH!&db}gB#q09iJYxpv9YbCUYNym#Mv7qC@-md&_>n#4&$o=3DDPnLVd^24#Id zttHa_=i&php@52QegOV@<33eF)vA*FRG~CgBxr0`u^*xDqLp`3SbfRVWH3LwDLC3N zBWYsA^sCNUqnTVMMswGh!FODaBe=7<>+9=Nev5fw#KEHd?iL3k!;V}ti#9WY!-Co^ z3n3zjj2|91v(v?v zXnIW|s>c%MZ?fWi<1V=oI&aP1sm7(xwM)mjN@r8&yF<>Wk~z`DCb9<1Ee;0Ms{A0*v{&8Y=aaR%W5q~>LZusFR9nD&Xb9m+Di{N&R(RX4IqQs zj;>FEz~T_zBuz@lHGIO()1`NVEAG9v?S5NqH(=KqQN6CE)S~L z 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 Q5Adh1s(m$2+2Yav0-xBKjsO4v literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-pooling.png b/contrib/machine-learning/assets/cnn-pooling.png new file mode 100644 index 0000000000000000000000000000000000000000..c3ada5cff41c3b35ecc515bde1f3a6311f2d4787 GIT binary patch literal 79460 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 G#{U8{`h7M4 literal 0 HcmV?d00001 diff --git a/contrib/machine-learning/assets/cnn-strides.png b/contrib/machine-learning/assets/cnn-strides.png new file mode 100644 index 0000000000000000000000000000000000000000..26339a9fa6fda4afbc7c2c6d3271326753c86957 GIT binary patch literal 75501 zcmeFZcT`i|_BIL%qM(8zpi%|tO;G7on)FWSLFpj9ga83S5s)rjn$mmk)k3cVp*Mj* zBtYl{63VxEkMB9}Ip6r5d+#6L9pjGsW|(BN_g-_YJ=dJieCAv$hH9uO+#tSBjE9GJ zL-Dz+79QS}Qarp%M^~=^XNY&MIO5@5m$a3U(NL6;VbE}Ova)?;iHG+*G#*5xuiZnL zZltAXgHMqCcAnrCJAU@tAD5o<21Y~^TxIT*(x}J^BQ79VITa7^`}umTsIEO?q+@wUx%I6AEY)Cpk_hlAo0-(QEVehpPuB5m#6Su<_k~ z=@F8)TeJdW)f@d(GfC`A@`c;2 zC;dknmVV`w66&`kQ%O7x*sNHu|GK)@DSN$Nj^X-stwGxL+waMjbVTSM9^+T^RtV{S zATO!x8VC}8;5tw9a-umkDljwjzl_7PgEqRGnC3|=UZm{&d)w6f}gLYz7X*1 zkA8U=O(^RienWg)ZHoN5mlQGoYciq2q<~wB@9FrOI|H6=v&ue;78K%<8s;P*j6N6X z<|vC~Fc~)bbT{Tk`m!xo$sE=1 zP$>GpcYX5fHTG+varS8v$?Sc*#zp*kQk~%5dOF9eG%lcD!4Wv=A;;*I{G|lzpySxX z1*`4vqZ(71sqAc)S35FZ;`W|<_;}PwQ$S1o`=j{BtH1iXUGecd96El0yEOUk{8cD- z`=PmYMeHPW3sP*_^5KAzeRW3X`T@XdRnLS;<_!b2=jt*o!BhA%Y*{HpOouAbt* z9@;rOJNv%SP`-?}aqxQP{0C$(fl!jx4lh--JyDS)j)td=?5EMQ%jhSU%`S1h=1z?w zaVDDoLQfFzh>UPanm-9IYv}E|F>&teduBXrS8~km>EGb^a;5ymLxf$uAw7}$0}o)(;Be+9XJ=t*iN`6()*)#6jokUb-;K) zn_FHrTR@@2*dc0KxF*<+-gf$l&;4M5NR}+_&kk8>pXPE~K98=AyZd_+i)XaHHI7> zk3~E}L_8ou0?!Od! zD=sT!F&y3a0Q9bTg1&I8j2F&3yinqAavqC6%FxX)W7Z)3<||BQ_Q(9APUrWF-rq;x ziOYDr^Cn#(<-XVG^oy1W-aXGYZqqnym8F*@VNSkGW*)j@xUAhN&f?8-#$v!yq!O9z zp2DvJQxVXBs{|Ta`0| zol>hUsco@Rs5YOnoGGbldKER@G-W*vng+W{(azG!-dv}d4!-pcdXt>Ah|Y5~X0_Xs z%emOY_g6OZ&Y}(i{&U~8eq}puu`f7-_H1BkK)4GUwl{Zcn(3STod}!zJJTKWL0ejD zt_}}j7TeuZOwXti&cz>x4vETQhA-RSU!m5>a`NnWn}PZcgt;pFYHraTA>DRJbL- za8vTJWIDKJfytl5Kj2*N-1?QMC#4T7&hoX}>nA_WzW78^S+gKz87S}G*1tVTnN1r< zrgLkbVNy(psa~L7u$|k&yE|0lnT^-4-5)8&<~$ij-#2gUT}`<+ep`(silpqS|D6}~ z4}d3&h`dSN;=14Ryy&@$h0L9hCHa!@MtTQwabc|Ubv_o6T>e$tjgZNE71qmlUC5U` z+grj&L%{d_1-}YNC;Ujwj}hXjVA+9bnT@>9j^z8^)lcKbH}%LMZZ_$elA_Ag#}PpR zn+;S&+VX5CMN|{tywwSO2g!O@tvlJ-J+o7GzWub|Ej$}eTLAXbY_>B6-xn<5C`lYz zEL&_NJ0j7$))*x5jpCd2n#3CCNE5#=zn+!5HP$l0@-RdwlX$qO_($;#gRQEp$~sF7 z^5M$HATu&|mF~8ESXBpitO|>28l1-^`i`;)i;t?QcmwD@&)mmgM8uGN|3rY~ZVA89 z6mMlPVJl%gA${&cwJAwm`$8|f^(Q#nuv~G@>pUk8A`)qmEzoyU;SG=J1}%nWpO7TS z3lu?XJ2sB1M3Ha%rz8?Z1bxt3a)WZ5@8<`VKTbSZ@H$I9j`F{DoKvgcqHpNy7Jv!7 zL9!E+8RQTq&tus1%P8~{;#q;4t-)Gi$4Lj3AMK9)aoMTzNMbd&2e{Gio=dXVRK$v3 zUtQS`L(Tf7o!(*2br2sYzSz6TdkM8?S!zi=t})R)?jENQCswdTMl| zF2V7%QMI|m+-Ku3;eOP|kF@fl3FDbHmDA|7Wlz(2iu$68!3xJw$CkMqpD%P%=|~@K z%={!(YZ+A1-hU3i=&~-+JtAdP4A%Cb-~I7S!n<(1a7S68Rql!T#Gwv)B3r>vtg_Jkpb z=80n&Dt)T^JdNODCl7n^qo$cHqM6wl6fe}+u6YC6Pyo}xRdD)&)J$(Qd#~QdOn0ou zOw2evoUQk8n;nQW3N$jQb8~EK)OJSh%?V?!VwBMK^SnN0`=79+O_H9FdI$~d?os)H z=4@6|)NvG8tjA|J$L&lTJ6dU-J7m{r+!*Oj1OfX=972&KJz+!Q9sYKw1_vXDD*xRQIi?OTkaK8TfJ~!|3wl_82z6IXhZC`oXBC&IJ;!LqB4zeS4eW<+7 z9S9!k=edsx=}A+=wJ+)1+ed^4Pdo9+REZeo$v-hE+#C<6`nY7w&MWJ6bMo%~Q*OZ< zCn=d?Zf9heA@1m+#=wjje|#HK-$!NEG#)@k@!nEj(MnYnj{`WqibsHdACC|?!Ux_G z_|*SAmd9tqyZp!bOL%y}ws-`;?@Q4#poHg~nObabi2KamGLH5CM)aPV+J{ z{BeuBy*Q)3ss@9MldC0z0M8?yM~o803=9lnt`=4zTC(!Ln*)D|GupVjJB#r0LLd+x z$YUNSS8HBAVPRq3NBq3}{M^7D+-^`u_ZME=j&4l<5b~!SSxYx_S6gRyTPH_`3%M^| zI(fK@GcsOu^v~Bn#%bwg`>&oH-F`n7@PND*S9tk&9`XKDHqcb;;;e{0d7WXH#7_OIH~u2cS=PiGR)4?|%P! z@pnTp-it^7iz@!1=ReK@ik2W2_R$9jke`AiQ9G4nRYGG&X5pKiGEe?o7 z_*LCf6Stq?;S-Qa{f{3EF9KLtN^eKvB`W-n_gq|XCQPbly!BrM0XJzq_|mS+@lA^L zzuyK3BKq%l{4MBj9sPgNj$B1uo?2}P9lOJ+TCeNBXh!DhMke8ij?|h zervVA7)KmpN=I^4*Pm6rJ5A+V78HE9;D>2B;oBoM$X@^E2o`~$9&#H#2|8RZc){C^ zqxVIi?Z*n^X*_-fjMO@${HT2;`)>~Z;m%J9Aqm(V?&pI4xrzMwBYD3w%jOe)zvk*! z!&;Q+k)GqSDjY5(f!nBaq9^+C`Tm~QJyA4ko@84$+;%i)IgmD68L5Uo-M+L}M=Jd6 zE$*iVr2yk=yh~RZUQ4~bl$>1uk>BH^*crTve@JYvo33d?L-4EHcW^>i>Rx=S=d_>w z)T`wiN`kh$3(&1MyMrMyt%nL{r+AvNFQDE7$&VFynm6ui3d*8#-lGFf)o!T#6vus2 z-aQFBj{#fvU)_H4v?iKcU{0fU&Q%+8B=sglFrWIJ|NI{BvEx1_6T5Jd!%}`YV=uVY z>Q%SeggB_1kH^uSNIK!X?aSDGHfyu$1}|NV^^XBxd}tKmVZPS%K0Opl1C(-pBx4Fa zxPg)In%-agOlxfOIkM7zYtte=K7n+OentL(C`J9IkEz7*#vXs3!v~KELlbYOrkrZ~ ziSdbdI5T=8&fl`h-bkTXORWYza`U!f8^umHoRfEEoOTm+^*+cPE;Kn3vy`G(u8V&) z+G^#6ESyKzIn}h4auA`Lg6qzLwTl<_zA)|1cat_dtWd)9%CI6CW*iuh=}P3|DG5|q z8KSlc9lJK_U*e@7M#*h~q^*sK5Y(TTP@D5jh0S*`lRK-rj#LEqeVC)d)R+_gTP*lN z@l!${#6i1RI7d{ZZeZd$5V5Ju?$u^R_rE}9a(?We#$Z%%` zk+80{>I(|59JL1N`u#Sp-xD@{X_m-dJ16r+4bJR9C29uUtS*0c90HwF!?>hlE5=d& zV-BTrYOoPh?`Ofj{^Z9sQ3e)^K`U@_Y@_-YcA9pWvvgp_pOX|URmfT@fjd!dKFRAz0agTA6}GHW$-a3xmp&3fzVk{LpUAc`9l5>vf`X z65^JlMBsI>jrxo^mw3nUqM@7#vwMG?r44exPmTCWJn2sc>K1xd2J=cjwymZ?Op&7L zO(GfJ?z6TDt0&r?*@-Xsx}FJJ%bp#bd=^|-^j&~#@4QBd)*1@=7Ykd>&UT#%ZmDl= z)_&j?nEEl(|8H~15Iqyhd7ycEjhq$tT-0-eVXxM1WhS@jw!pOyd7+#uP;^kD@|uPE z-qv-J6fT_%H4(&Xn8oKvlHP2^*tsrNmDDFaU9EHDDShK9PD?X-TkpO1JCl*ATM~Yi z`^G-##;iS>t*5i9D3=fFVtdAGju_s4o_laGJnOPDIMEdL#uqnd<22gKDUxwVlr3HT zJ(TJN{$I6FOdjI4^d9%qW>gL-aTIEup7>&@?N^gCQY{Vf>pQ9I)|;{AeX!3SE%azX z9Xp*LuN@_+LP4Fkj&$&E@cz-!0*MR8RC(RnDu5DftmZsy+;SkcJU|nALXv z6_Q-;V~l3MsNd~WNKmcKB39IECDfOXtp8YS^{ z1sF=c2DBjQzSTyzv$@rvLb_!zsfFuvw#>i0d8{QcHe#U3}NxJis{d7JjC!szu&%H$}~ONPlb^aAW2HvXWIb!0?wVTX&>6mv+EYSeF}`6iFHqwQ$aU{r8Je*MdnwZSHwyLSNXU(!SCi+& z?yWR7|CQ7+fC2Z!T)*K(xAlg%!PUm>_AfJ}Pt!Td*B`Q&VI$zQ&}-s&(* zgcH)2{zpU$xJvjkrCw`+dVgG$36YEh@4}Fpd#$_`M=vWA_ByhtOY0KqI5&9vo70#{ z{Ea*;g>Bke5P2E?F0Dpu?>~q$qRcl?Qv(ATOmnR!qQc8@<|_kr3PMrDzMYVMo|d|J zRRQCnI@J=Dbg_=puq;im@4d;1QWK*o|E;-|G>m+&D3d()FcH^2Mnn%oQ3m8>sBzHb zw<@fa6&17jplh>48$gqeyL;7DM1A4+9;@8ksWGu07_-a}_dIkcs?B5xfLmxR=A;Ld zq$-0^ygl$`0zVp2y-uMhnIuGg;j?DTzNNgxZ!BMyj@si<6S7EhQ&d?GoC;Bx!O7E> zdeTwB+iW$I&XkuX{u~Y-rZ6o@RY#b(JGOmUz7OA_GWPcPoQ!iz;TDK@sGIJui=g;x zLQoERjWfH2eshZXiqck;Jl_pd$v7)YJbFWv%7cQC=ae;V`RmVnLuA)jreMhV)`j>Z z&++n1Kc~-UKV5g@*fU#Glv@P!Ar4dKiL}1f+WvQa2ajcZXLS5^+mykxM2U9g;lB}E zlek^L#RCZ=ZHyIeOq;Vg^{}W*tA(Wa?@l3IPq`sF;?>(Q(2F5G9!NQs^RwHam;s!i z$6Q@}-G2OJ*wYS41%@sA#h?KC;p?Cbg6G*QNp9*+PBfc=f<9v}je-`uihg8o3`LUg zun`Gm@M~o#J%&B?Ub366UK`n(C4pTrdes=SKkuoWRa&(5rP1}5D!)hJ0yf(`Dw?^8 z*U`Pyo4QE9KtUv5j2%`|Zp@36e|0{hI$!Cnv&6gH<+HBL+weBkdH=<{2+3cGgIOIw z9KMEfqTe7_eHROOQ4kUosaHx{>3#1o-{S+p)`6}Aah-&MMaZSr*f@h^0a)W+{TX}a z+1#*xG`;1sb>ZudNPtLAalI*QkGc6vL$eeU{RBzb#lpAC#qX zZT-h(TsH?NH?NDDu|w_7l}wg=IEG3W@PVL}Phn;5bVfqM?re^@RdUdPq&#>t8x`~Z z@}Q8xbghGSNr97p7HjD|?7YpjOZXFSX7qAwj;hwpant+l7St)iNXLT)^Qu^Nw1&JqzlpZt@g-MZS&@8SWNib&fL{mS}0cD8jt*@^Hu+OrnWPY@5hcD=ZWtMV+Xf<{o}n06bK8|ZIgYM zQ1q-c++o5C%sG!;C=Mq@JWLL3*$$oyAFu)czO4>@)^mUtRhwlX#1b5TFoUpkqIuK# zTSrg$oOripFzv&>17ns)H0U>%AHMpX?+08Z zc$r);;`4(!peJ>YD0R_~pyh}40ql7q*e&bv@#C4atA?}37OEKZoW=TpAp4V;@~uV= zF}ff22(Gx4`i~RG*?n|P`w2M-`m?7514$Ki=I_)eJ1Mm9b_$nE5kq& zWXPsWrM3*Eh!Pwpuw%96F9Gt5UbIu|@_T!y4`t_= zk~)Kf<0a`+7#NM(d{z4iD}pHeJWxAmqU%3UbJl3z(>#b#dW!N`c7XIKWcX6n8z&B? zt$dR3>0JurzCQ_?Bumf+D1c>0PwBUclfR}!0k24$>BR*7W{K9371;SAd#6V6Z5+Wt zdrWMUxK<w|XD-ZdNburg2 zEOmHg;tCyZyf@ibzXR$%yE_Q}wQpP-%msImw$8L_e*9omZ@Su+R^*d6U_q@_h0dSL zmkO&-vwO4=8`4x%AJ31g6xBp`*e(*l*3GQeBc;-o9f1Xb8ZE2_< z1yZ$ESjwyV^oWKUxnUQ+x#hRG(2;UZL z=gjVx?@_{u`|5@T3oEJ6UKjM1^Ed2wm~#^G%x_VjOfSF=@CoxlrqTJrNx_4=4HSu6 zD`$BUj-{=n`Nu``p+!J!$k|{GE>ty!9Uq(nCLoAw%x2M46GlH@sQuO}j0E5J+JEuc z3>0-oEN4MV6Rc!}63+&r zu;*#kIl}^LGjWtJyrC5vmyA^_7)%rC1p?1X{KULFeTu&K2EQ^dbJxMC&sy$eLWa){ zMe^cgjqPaXackiaqR0vyS;SMkH13w1a~XEDTjYc&TzA@W053cF$DCrO=KeDXtG~wm zY~WjwsP}eMPv_SyZCKPpuJN5oI_fI$%;topy7wLo&Uz?V zGdc{Eo1g{IZ~8{cFaIXYD6$aCB_;7I+l8O&2v`_;546SKIRrb@MYoA89Oz&Rt(WZ5 zp{p?ukfc{tu2T$x9hOif5c%#oQZZv2^qEe^UD5q7+fiNMweY&*hYFv~&Mi*}gfZXx ze3ASHQ_d|O7MQfU35o2O1(%%Gl=V12BoMP;Nay9eU? zQUf~Vk|}gOK+b?<))#36&|B9`H>Tke3QFXPHxH)*t*6;uZZXrJP!9yy z*OmZ>9J;}V`5I4dq-tmaJ1q%dt<2AY13_cUcdM=^3&#mA!Ol~Gp{jJyje;NVW*lph zUsZMFe#Q|~H<0o?-zNX9lgv98I`P;BsBogu88oUt^{IAK+l=Gd9XTV)uuN~3QaEcP zHpBDflszb=o|to9&jc!WjKjyhP2XFc*@_{RIBTyf(7PW0p}_}u5!EuUo1V;98#p?+m%^>FvPDnU~fJ+*gym|xx1#o zAG_#o`Xm5O69mJI^m20X2Gh>6R^t-EK3TqdZCk!LVsa2_`5Z~w&|9Zo(my&PxpT{A z8~Kg`^h?+C8`nmXyqa+kMM2-8zG0;JZghDmbjI)e6mmRp%)8N4^zA*et)#J%rh372 zen*ohpVdp<`mzw~RkVaD^tglI2iNgJSsiy8m7vZ0?=Rxoyib!W6t0bMj^2O6F?;XT+@WUG0vx8n_#XmF*; zEQ0d|IX6q5A*AG~#nv2TL;~>yDOzfEa+oqe(|I+9i3MsZGZPs=@yuiQ1^$A7M`-|+F>0oE@MBS*gwMvtOegVQc^X0n03qK6 zBC1N`IZ`lWPtp>O1XBt?CC9RUMLE;eEQ}wgugJH^!*=40A)}IMIQMf{Db{@H^l*Bt z<$QdT1oO2~t6JuFm61H4o3&JDcz2jJLwLykZ0b~9m4my*0wP>Kly2Gv-v^2rk)CZb zg~wp(0winEHG%`J4tR~={3;LCne_@qnz}eG;vB9$**>N<_*7j?6ESRQ&MqM4LjEzz>Bd4gY5}e9rd;K{O>nE0KlT%s0h!CkU09K zjnuYIvy3S$$;a{19}8_hIrDL0?1A7%#NQlztAg{~d}280;5sh{I+Dzjj6yc4nRsyOwRO7h|}F_NA~MJ_Q<@BXhMf>FXpYmm^fGN8#S2 z|9O$(%}EHv;Iym=D+n@JmZ&EtYx?a`pI9!YV*VbV7P=YpRmvJ(_0flW=6l^~@490` zS?h6zlhK;2{N&?`vA2WwSn1bQ`cHVYbJY@g(x_Y|?C4M0$Nu2cLSQ>Xw64RF5-kLv zHNB*gkvnOb5qlsF1yORfIjXHyM^LPN-8?ko1iN0=>S>o#ZRY=Tu`9KUrFF%AG{?;v zd2gHuI#f=F8Rd2T{Mh!f{UH~)X@16${UR%KGWw_oL_Gn_sCy2qaU;;pmt4vYJP84L z=$qjS?|*{HQEapcXG}Lv9QzgBVv=MNk8kqbtx)K_JxAr1sN1y1)B4OxG~*pdGdznz z=W7}6;}hG;RPmz^QhUIpfPiu{CnhE!BNF@U3_5g~AJ!;Yi>jdFs2u<^Nghr11o^;H za2qu##Wh$kZ066x!awGuiJ+d8r!yA!bBX>L2gLzAhJ>f3(||)FAm>w!Z<*yBYtxRECZ`G=D7jQS)wBHIlqZh{-rj0fws7&()7Dp=&@P{YNRQ2{fpy&5Ol_jdabAq z>PKGBe^x+IxK!_beJyY9Q5nOUk6p()<7`NB-LFwS88EEki0$V{^p9_J6QH|Q*sDH6 zmIq*1xw_JFn^&i$@*&*ZSR_~ zQbJdgFX1wFGB(5s9xywZ-t^SrU2B3Rjf#Op|>6rGeYLhqnl6B zxFFrE47*I5st7^nsL&+|eepEQZDvq?)UF^ZWK@5S6};p-C%s37`8pt{|9j;!fQ{fn znQ7h!5p^p8!RHRMZL16B*(@%DG+v+kQ-vSz8wd5guLnRvZpfi2Wlm%N2h88oQhPrjeuh7vh#HkU@5kBChpm*bV$)I)*tztB9qOL{=&wc&5!_h1s* zLVC8;SGIzpcI19^_q%#wOYEn;{FNLMB58?LVZS-TICdPNQ@ zbVF(SqsZl%8KaB)&GMtWbJlZRn;lbLcP2JKMe z1@^9kc*R)OzAq#^Znc#3Qxio=g^*HfkfHz-;kOFj^#8Ot3d3eGJ&3v}!Z zzc=rAa3u4zpmM@d^gY(EklLwfbS957(u0n@?p0Kd?+m;bskT!np?2P~cWRJ>pdN9`?T(Tnobe@b;*?Xkq2?&M`5V!F~jXZ?t)lbu?R zElxeg<2Gxj`=P}aMPK|ZJv)V|j#$nqw`%iKy}xM&)QV8UA^PIN8&K$G1mxLnwIXmS zB!AXMB0$d@UEVW#`Ec(0QJ91BP!IoKa(93d zAm)NbJVFPHNS%H~A738artO23N4@!zqK0TNjE5FIlN{S??NU#ANY0{m=ipjyt%G6T zGg>P5vvoG0m;F?!)!F_L1OD<(XQCoS96MoUB-C)dA{v#s0@*g05o+b@e`Qj2Z2+FR7k*8Nkn) zPBl)G7sYZb*T1FBiD~;A=xye(*o>Kzk?@kIcc zgl6R+_HcmROx&>V`fIAnKpgN+#aM1wb1=pc|LL0B;mlsTM-tW+dHQhl#x`7#~KT>WM&($u%3N#)NqB%>%hX&58wu!%mJK2^Q20A!CG z4zy19ZgzkEE7mTSRXqkDNxCE6xZQ4kGchOO7u{I2FzH{-0$8;rCafn--;@i&nMDN> z{w@;dYrhUH62TX4X8XkAJlJ$Ze0+*oXo&!p2byu+;!ZLIButVg`i?EjrWh3f?gt^^ zn-AAZYrF}pOE>QfiJfPP9ry3ee+8;^%`~1G^iFAi3jUMsi(Yg}4MM-!?01q6`p1K6 zT~aY-W_DWh2o^v8Ahy%*HvbDKF>?bY=J|Q=J0xza{V~#1VD`;4-e6s@-VAKVQ8TqR z*X?4(5l%I$2JkfTR?D!2i*iTrHxrRDcZr+-u@9y@0hrubB5O|bHST|CVU5aciQ|;7 zSBKPkFm+9hLp4cgcoR~jSAv-J%TogEjFGmhtZguQ+`&*;JKOrHQx3)O&i3J^Qf(`?cgO(!vhU;9lR z_kk@sBXya~|30a|^PfNK)l%VrYCA&u3jV|1{#wTY%F*FapJG5$rnNWZ=3j+O~j}hpH_EP@_8m|UsSe-iQS>dFdOymDKck*j~{cF zFNmf->mzG5qxH`A*JL3|KnX7Y;RP{!VraGqIiLBZ>?#f@m_Yy^ZSXS7;V3k@-cCrE zN)|8R$+br=@wqmWqf{)V8==fh(s%)xc!B|PBnf0TJita=w_D@4q!>7XaBs=1wGR}+ z-3jWghc$cUQzltTk1U-9ZZmMUaLr!*05S;G$Kn*#awO#q&@Wyry$@vX)9jaD=&5y%d4Y_q6p?mgnzWY`zI08PnRg=%OM~#z@N;S5x_Bxp`U*hmH zFC`1WBh)1bN&UturFJZ&AFBU4ko~2G8c6T8F{kqP$g70iRag0h<7+O#6UN^O3EsFjD;J!4rw*ez+-`x$u9m1Q&Lm-xG!K$lb;QndGazjfXv=&re|K`y~e z4!TD4x^MlOhQ^xkuoC!nDnOWW8t@2X8}2E?Pr5uun>bu14 zb~zjueKRsndLbv&PrXsy@``S>t^=(!W=p-TNru9V#2lR8KmPjET_Ag0(k4V0d+v5p*T!M^ zPZzcMUE-bb>YLN?2;W|8M2}t-QZ2?{ByL8}t4S7=H(h|G!7u z!moU3;y$(EXJ2HuC%#T z+m3TiQaW%z=z3(Wa+~@u-#Fgs;;Y=K?CUNpDjx9_TxY(709||cl~LI0^~#f+$R~Ro z)vNRM44=O8C`HzVItO31K2KMD1kPd1pyY`ArA`)8f5yrOa+A6yi>&Q4I z8yBHvPj%<=4M}#3Ka$~Yk$tY^${=heO{^=Z4Q?)EK`cnx!I72AJWYM{{wEK7HY=J^ zC6A2#FOU0PLL^4X*ay*!zTAD98M*IbQ|9bcth(~_;e^=xFVFPs`B+LXeGa$&P60Au z0)gF3I$|-XDeW^TZlKaRk%wYt#f6nH-W0x7zwUU?3vE`$M-HNsGYd#1j@Fr#a@0j! z+sHNpj_0Hzb(x7Bq)LM-y{HS?#NIbjc2_kX2??OGV}YLcuh48 z;qR^_f*XkVTy*CmPYNA%rUPj>$9{lwBjI%%)d)bXFAigkNie;x+@0;ZUMfs;SpO&q z7S;^!kC4HRMvqvB+IcMz2%5{O4Oe=d{wx#tnFIuaL5KA%M@evP&eUP1tG<9Ap%7ov zAahKYho})NA4J}T7VWy;SzB@Vxb>j!W0(#&&+N~h9~rSs^!jM}$Jg=A$)qR0AC`y$ z2L3gFPlDzN-`q3Pwa^IM8msV8^moMQkUW&=k;{r^oC!l)?+Afsv^oCm%^UETX&pxy zbi_cjl2NRE&V9GUD$_7N7m9G(Y$L0|RQ8ltt?{^UOOGX8kb!|?%kh=9$%-sUS}>iT zteRw1TfVhw;l$MGP~2tA!qCjnC2~-_t66^%pX>P4Wy_;5Uc!%nEQTEcjclJgmQ>v( zl}~gb8jp0DU8$qZz189kV}R8>ICzn##*ul*E`GUQ?3#uVHfsP^zK}Kkbhof^_6?~x z*BjpY=Pbasef$3Q_$Vg#pc7)tYp))5U3w@_ozHYoUoSZBRtSG@yth870StX5$`)a7 zr-h==!?+F26zX!`JDYu6`71Mwpww-^W1?>bWW3_IHEeDRJzQhG|*(fZqdEZFbq3gdFsl3oY+j*nFcwcU~SsN~mqg?pjoXr_8 zK^T;{(j>Ct+bR23L+KBF;EnR8@rl%@rlj7iJ5zHMyr8mkdc6tE zSa^TdqpPG6EwcW$c3@eaxX=uaBfZOpne}ON>cXyAbU;!peA@@yjYQL5O zGMwlxa&91%JbCUp?Lq2A!#qujVsZ zu9wut<>s;oBWI;mjDuo>9GTnx5UCHP9u>u|Wq_RjI#Q?R_WxDls@cDa!ENDg!62DmkaYw?B;wd%~IOm+|B!# zckCn0W5KM*CxXiu-c>6U(DIj+@&#`5<;L)eV@^n1Wf#n6_iF7Y^v*<=(%w&aZS1fj zfbi!r!&R-J0L4XsIBSPS)rdJ-Z1$p3(qrx9)Ygm&5)cW=RD`j~RKiwhU7H_n#k|zFf}Y4EY)ZJ;-`VZObaDm5qTN+SQO}e0%zo{GmDmbxMmckbEq`VTt?lr zN-jznV;^Su_cG1+_ZYkSTZk2+?FmDd)KO)bayrTg1Dy}4T~-(7=KiO-C12w&Fk6-L zONJJV1G>EDk=<~w&7V(D8)zvfXk-V(-1mGDz6DPdr|XA_V6csZ3l8nxJF4dI<`2-k+ecv!&V^YeDJ$v-_z!oUTd>N;MDb`kUF30ITG4 zEBkf}VJMw>6pJmgxixkhN*VtUSz!QBy}Ks!!C{mKJTV}vKoyQ8XbjlOwD760m7_eZ ztz+jFxPJf+v>YBtxFB>dRhYo{CHy zkZ>BGeof1nRRHEq4)*O4-$FNS0<-i;X#f6bu4?SqgrWM`(K0FI+@WrkjoLx~q+0Kn zwD9zEz`I`kH}AT3u8!huQ)sdOCzvby17Q9SQjpxk_dj}822F2bkPxP7I3^WmKc1o731>eZeu{867TNGaxOC4 zFh(1zSIFF8xhnV7VpT3O*@q&MVS@PfSq2>J7v(+CUFA(EEI|q|#51-%i49D?M?^D! zthv_L{;(7NJ*|=+KDWoH=WdVv&R;s_0xeG*{}t5X1=^O&1GOJQ$ypnb=&`E2Sr;7l zNRG1gmSL3m+1pfK)EdA2I2U9_6BZR6t1dPVkippNjly3f9UHX(4}{NN;No2X7ZdGN zBa{E|9%n&RnRB9H-3RNMUKitZf+NCm$?0ZNoVc9{Q&~SE>3?%OA9J_I9s~`mkgCs= z=1aZwqx$3MmUDdJqI2Q-1}YQxTT^~B4%ss==VrI6y-{n{7K0nY=(AE2ssz@v(-8NK z$zl8d>rw4G!oe#JDwt^N+?UluS$J)DH|5hXi=RT*C;_w%|KHHMUQpla1PKNd&u`$KVcUwk}OfIyN~V z;IV3P%)nlh$*wCb_uSpgb`k8A(;w}_9)p12WcY4Utj#vWq8A(N6k;4H9e+FBKjP8_ zxOf2bg_0jLjJ6(oI~j$C;f!~EjagI@iO0AMX-(xF&r2i0Y;|*f!A$_$IQ+18<)+R2 z+k@NqyF~;tZZR~YZ#it`X$=BDH*~jDu;^4-Aq*c!e;6ws2ecMXP@x$X%c7oeLEAbb zsafZ!z{cKOEphIscEmGgf8s(Vk&Pm`*Qtea5$5iMY)S4pHlQ-RhFsp~r#Vhz&CJko zr@05JAl13TOK{^KISR!Vl*G+JRm;) zb-5uSN{CflX_ss5s`Dw=RShGn2TD`xOwjn2B+G&>1Slahey&wZ!Aj86U|qN&p(aFk ziw(67vPt10J?-(gs3Kx-fBK}PG(W%oLHn>% z;09BcnUc(%-C-hEZh99r?>L0P$gQ7P1F}!G{mg z1zeG(G`!v>H4d`VfgXF%$?0q|A(K zk@x_b3NuLXR`IiBH=Nq!^sw+WPpnCgwKoXUKRDwDY91k!>|}uHNRx4`UlO)7kkS^Q zAY+pi0+fxz=%E>SdY2CTr_`wh$mhg8hqqIzA{IsobNcxEqETs4sgGV;Si~e?o z?i!W1J^8UJ#`j!?h1db>&PHsu@CaKvy&8SQPn`Qi_5nSNVPf|dGFw40otYNDG=mTj z$R*3}1AACjNma#lkaW_kRb4p)LUnI+^4N>BPE=A>piV893L9^6YcT+(6Ud-HPUzZO z`8xNN&>a&|?!8d`8eHCI&L)KbK^U`y;c9!q90ERA~3 z`7J3_I@&(@YOE$}ay|c2ri&I}-HJUkJ|?cc^OLzREbge-hCGwNN|mlK4Jt-`5K|Vp zWGqPn2s8-MI>bIVwdA!jK=B>N=h#@*mBC}CB231;)k-b7UykAW+I2mc46~&G(;<{D zFD606S>mfsIkP2cQIdr<$&?z<%-*>XA*QVP=$DcmVLrDu^+y#*cyq7&k=6oqm-FC3 zW#$`rjNV&5@;3|<{I^)L)c9R2+vS$C0qg$op$^lCh-;}({oc)%G(r~SyB}cOr;r*; z#|%vXR-^qW0iIMvma}mX)7)#?UkNwgUjMlF7`AKGs;XJ_&8lzKj2jSyK7aBR?X$`$FJFD!8t?RO)n zn6O32W>{|p-L+^P2Mi@k^*$0XKadsBmfErJxsymI^8min>YT#RmqI1|?T#6ZZz8)N zIWT0UIAU|F3)0GItYlhlpKm#Wou#>lx&XTqx8`g?8UI3D=_hkzQUH%-U$te4W9_u3 z8ehKv$Uqk~l&MIP!w4e^uCrn}akGx%sDRY>>`-6V$p4u2`&t zcH*`QIP-_yqGasp>=I^zf@FFW;>j$lXee+`q<)04eh1K=!V*M_BFB&FC@P;Aoy1iX z@uq8qy?WN(Ucf5K?!>9;x5lgd#mx7WI={3Nx4@@@DlnX8Xx7|;6f_lNaoQ|FS1CID zdGsr=A$WCH#31vWs~I~1jVTG^$YW`x!*_rJPkW9B#wL9?ZRr7*FBT}x1jl^GCR6bZ+ZTZLE)2d1A5ev z-4A9t)IN8f41ShXHnV$bzA2l(5~m7X5s9{zNsNv%5yO@NMV%Cx(JP216V9RXNKoti zQ0{>a6c=iG0qqEVsXV>*r&ejBmwwzoaNB? zFr(EpTxx}WYn-bo&3YvN_b<^D8I?La3DI}$Ds`GhpS=YKSv^C+NC^(E{DK-%e@ zQv_Yj#?3=efIgwGvaW%y$dgY*TFZnuDS)Pd*7;}q1fj^XKRO=qc#1UHm`~+Ay#Dvb zp*g7Sw@X%exA7Zrj4y(QBcJ$j4RKKQvK z9%tF>snxNfYLM*FFz@-4z_u%u6#3DMNIus5MpNpQ;WO{O+agDU12xV(!+G&G#rrY+ zm7rUUnsPTk+@dt^PN=M|b~nvR(=ixr#EY8 zM9A%SC+zFnl&d$dCqYjGM~pkT1!IS_Q1Sec0$Pc_2cAc#K@2s%=esxAF0PNX=vkQL zgF^;7tXrq%-!;cS=yMHi@v1|QBvy5pdsh4AM{7X+{Q`3r%AxnG3xQ`Eo8V?f(!$Jr zq9_$9nnk(>phVRlWEbX|-?>$EmaNUSg>eu|Yo|O7(@m%0>5lgm_|13vx%n-+-zf=B zxBE61iEabR-A&MCeU520Rd?SfmSW0C8Z#O!W*u5vKecENKp~bkECOEV$cx;1(s@l} zZ9RbR?h$hX6C@*~3bHT3%udiRnrzDaoVf_xv_J^-8T+nv%R_DGXd98(i}%H@zxPf^#M}B)o2N_ei22 zBr7EfJ$i(jD%EoI9`1{jVx%+_e~_;Hk-}!i#$=B3-M6XVlyPkb7mm{PY`9b9poq;$ z_oUi|nt=1zmopUO<`i4)xv#P*yC4l*zoiwS-6k%KFM6KGRbO1*J=Gj*G2;dPC4(m4 zR9n;ft1*`Lucl#pM=0Q1uDB1MJL<`S1qwdKys|vfjdq`M%*n0p7Bx|Ft_%fy zF}MA!Yx^tj`$zs_UA_K`b+y31)JHwB4;W5~R;6H0e=XZP_KD z6^q)eEOv3V!T3pv(NJ^>^Wf(uD(-kXJb zW7g}H?hKyDTGGu^W+Ew#Q^)p)zjxp@Z_NeK^+61;Ng}uXZO2O@vCybC3OyTE>)g`B zk@x@l+S7~l@A!K}C#F70QXMD78sZ5aJBNH=l$c4bueMfFVqyrRy^fhuQ05DF1Ju7T z;s43cZ6cO(s*f!%aL0u34xU==d>XIknTQ}&@V)q=i_o`5vw}6hGr&ZPifEC|zbny? zn+6WnCg||@mln=9w|UXn%zfOQ4i{(V$}36vI|agLS81{N)5z}>h-~BKAt^hn9piuJ zZ{aNU*@B*KUSnB=`rT;$k8-w?XASj}bn&)juP0s5u3u!Kc5$~%o}oDU?mdT|P2Vr- z59T7%az2ZCmgR)M^{3Acrkvt`7_1Hy&w)hD?}DzC&Ktfz2uV2(UmCv-;e+8|Ewrwm zZEA;N`WH?FrbL#Afb%BYbm2N8H=9L+RxpBMwYB}(Bn{*T`;ENR#uJkqt_`%tN**tp zjyc9o)$Z1z4%Ujm%wD+HF7Ey)_x>UG{wnCzi|>C;?TTM;`v^SOOTaR1=d(g=H(VJr zHawePK_gzso{%JHBZas|AIGgY6qzS=&6pq)S5#Dex3co#5MKaSP^df_owzAm# z&GN3f5Z9>Kmr{^I-$XaHM=LV%uel`HhJq9DbvKHq19pb>?5o9;MYlafst}}KWLfkC zC(WFXW`h`}xMTHQ>ej0iwo!%h9~PY=pS6jv*Fb+KA|%uNoP-BhQI3F6;fGuMr`-Me z5q}U7v|Nf8YyY6zcx@h0F1)I1saUcd$!HPHqj)w~^*aB}_nh(*%d z+9Siy#(d#Y2%{ftHST3uH2Iw@cLGl>7-P#4=ra~wGygY^kUk(g8QtZD|FF=fusf6s z@X;R}81kuqxz0-oRKlLbu`sd*v&4zz>h!j$RiyY8!z2%I%0s&!K)yxkltlrCN%Efz zle;+^-iVt?euC{&j>nc6ttL>Z8>5+K9c2@U8>y0KlT#`DeVR_0`yrricKtiL82SH0UBtv<(M3EQgDy`hgdsz_$(V!>e{Ht|bY{`-ApE;gb5(DDo$* z5tdAeFuEJ%RsKls1A&vh%?}<=uw7YA>>q?sW;g>!HA3g4J2nzg%K{kZyxt#a?5kvW zsutAT&oKBUTzpS@tju%bF2I$Jf6$$>l85d>r4$W4%{SfGvQ+f4R17q|@=8{%_)MD# z%iFkx40z*hYE;v{SB}elF{8Kp6IJ$xVn{3qKw>ex8`kq2z~bBO|HiAU0Mx|#XNEPu z>z~e&2M|O4WIpa-Ks|u)EM*jc^sRFI#DL z8n}G_cM5B?;qsrnv1eN66OhT(r#{5vPu92>$8%tWATxDFJyLhp4f5Z`^WNVOk_!+ zf8B140l1zRfcwM7jbMfSKyZmeoGp%?SCY&2Pg^>TUEz>8^r_u>lR92l-WI0X_r z|3@?cj5rUFNC26tb%aQw21W?oWwu zD8bz>p8Jcl;DVM3>FOH0WWXdA|AQo|Q8CmUZ_DumlZr1lpwpoB{MeU=9#mTinKV9d zpMJ{Pb=|!FDsFzHojL5%cQs2g zOTJ3kMZ27!S~=?FOg6?p3ALKX_Mq)@(pe*mQOKzC2W#r1-0JCyk@tzj?!mngzV3R} zZnlfjv4#;u1UF|&O#+@}#n8^6b0`Fy@)D@`AtG_(WzJW%L9b&`0b>UH|1~q1>Qp07 zFD~SsE_o~&y7bAIp=`?|?Lu6g>jze|GLj-iikB)-)oupbiHAt${z6kZm;`~3sI1V% z!xkk-Z~`aWK4zb%HL*G4yDDEg0T7z`ROv{Jk>8O_q6-{$imbP{fuw)y1{#de_@YOZ@ zx=7}5QLVbexsILC1c~Una@bse$ml~53eElug`Qx8y(5_J-O8_idwdBT-r~FF3J-eD znyv>p>45wR*uStH;Nia?NU-DtCqgPmCjrMeS^v+?W*Ikc?MZOvy;Yzh0)5l!jj~8} z6;ag~?G$fg2AcO~y+i$w6YO$du7i3li?UiQGN%NkW3VSn88@(RETiBPd72(qV#Fx$7jj z9tWTQNjLsTSKW1S)Ozvx3$T*@5{JVeqP2;NagH}MWGOUp37YfALTr$adD4JK=?*xFF4)mlf#;&HA$UFUL*`q;4wt3=D5Zt+s%yYGb% ziCd%d;Xy+XJ?`Af=Dl0y!Ciq`GZY$mE(tWR{S#LeZMWyX%?4bgC#k_{yHf zlK@#kI)e08?6wNp+8Dir8t1*Y_SGUFATU(FqKuqiam+m^hIB%5B-ROJ1DC z(#-K;xawvBX8K`<9m12Z($jmG@b7c)M&qNrZ1qcp_?WQ4!|?94=Hf_1>m)}i zwLIe}lIG))gPGIXJy0L8APxNV?kR3AcWNl>O5>hp|F(=#&1tY?%1!)|uui7t8?2v3 z-oDCu6e*aG??|N|ppc)7DFm zQ1cR4&DrBq$a;*9R?}S>wxWx(bIa1qA5l}t^{o}mAE%)r4FC_rxo)QQEV2D&Z)>{g z7cw12s@T*KJ|dx%td-(djgRC@u!m#%WTRY6jyYEjQ+N%bG7PE|xVmyrNKLOq^;$pt zs*(8{4J5FFkVm26S@z8%A4E>ZPM6@zIGtPHBJK%T^;!?LR<7%;78hN0I3vT!PJs#nmTX3fBf4gYJufas|EdooBKLrmnxw6;4?Ws zzcUOy=B({h%hrabz0;~H)s;(+H?WFcD;>OIZ3GL&ERhF{#&^l@;>ATLXYdi+DO%CK zB}4IB^Wt*po2JmGR>wC}ZoRvb=U-}G(s#q)eVx2$-Ezo?QJ>s9nSkL)ov-h|-q_Q< za+{p9zghD-&-0Ee1<9NWlGCWwET7^~lP464w?97$rQXvOaN_ZfInG_jnUul>pGl@B z50mwcHhjXNnOm4i zzsD!HoX;kS{bGJe`%yGY62f<1qi(GE7C%AyHMLCH%U*fZBC!$*zFKbBn@P{WXX10D zK~n4Fd5hn14jXZ#Mcd^KN3J}H)m`-BF8w+_Vm+T-8%auvr~OEVrDa;>#imtuuHCxBTWZ>*I%4#8W0g|lDb>{mGZ70!Nzv%jIU1DpBm zN8}f-GD;`k2(XkwD?M~~n@GTo;d$?rm|987_(&pvMIiBF z@qgZu7C1&LYT&c{><4%Y+{W{q2%oO7|NH>($cQ&U2(uJ5_W$?>%sUzFfpDHn)^7hn zg5PBdFvGFYXSo`E@6u0Y^&}XrXcsdo2KxGmC^wjasBxKO@<00lNvmE%vnKrL1KrO> zr2?Y1JxF`>pS1NuR%tl4VE#_`$olV+|EDLl0ei`_at2=csor-efZpBfp2+=F)Zb)* zsC=p%?|$;JK=0*1?=`yuVm}v^4~Y8qwfv`_>%9ioMt|`mY>f1$qW*G`f9RL-|3ViD zb*u}a8mC>_?bxix#-hYIpY!$ItX{2)C=3IGH7e5}qA~pOFmf zxliGDj*@kdY{4rCU6F5;8k&c$vGSpgX&N)S#l^&X%Poh_tXBs)Oqwna6SH+CkQx@w z1*26w6_X1ZX60zf>zupX*I?BfF_k8u`pe^UnV0caf)*3AB z%Bh0?xquxUAOB==RQA+Z`n{nm3=>Ci_i40A5S{xa-kPm@qrM{sjVl=+#mjIj^vrQ; zgz^;!O$GY`2`FEJmKFQSrhE7cz>Rq!RAW+m%dv8?dHs~RGBPwLGBb2WU?~ALwiVao zm%qq0VrZSWWn^@EPup_5BxXM0Mz7+`oI)M-laD^S^Ch7<7XmM)lJ)AP;_U5|VSD9r zM`AIP6r56HeTW6|Fu4O;Qo7gtQLHtmvHB;D(5nU{9&@kR8tJ_^X#7wU7gr(0jzhQ_ zvDdU3yys1HXlXw+oS~gMhD z^rIEj&+pW^?z=Ze$}tR73~)gV1VE3H!UPN@nPqdIB>mo9%W+d@r+;M#V#KZQydQ1S z|M_9)Ha*GmgBh+^AMQ@k#X(u#Aw$#o?5iTCiAmn%xkn?OsDEl-LHccmpCQg(B556r4~Jj~>&eb$&F78JdGI~#CuJ04v(Jjt z#Smq39_xiI@m722v^a;xZ3Y4qqFQC(w)w{b$05@rsk5UVlc=t;Tp{@lt+hPV@m7*i z1tYjrw9;{jE5C-5)|*(UGx^-PD~=Bz+|`(T^9Z$c)yjyiTbO6Pyayh-OHcBYWvfN% z^mc;7T<$GodVCOJv7^9?uL0QDUODGtJ~3bEHD!Lhn?i(>TQ4fj_X0#>35qSOXY}W* zeeO4;-vi>(O!>gF4(+Uw~bloiVu_-2k(hT3${`9UePVn@43f^=CKBX z34W_>CL;!JRyC(>8Hw3vtSddx+b};H-RXKlWD`T@rTLa{`!^h@fY2OzHiyf-|6rNy)mkAFqy6=E7$Y@ecZJr zD-=a3Iz+q9Mt@)Ubtt^*;rw*u$)RP&iz&CM$`v~I2~(Iu%SZR29)`VBWMDYG>w|$p zWfI}7Mm3&3^5|s_@Z8?IIG~7OZV|qwf0)-lR0o8WyYTi91mh}8SHv5dA{*lz) zcOkU(;qgda|Cvh`@S6RIv%(ezVj47xHB`(8m2Lmhb=cEj{%GbRTbC${&tgvOFtL5v z*hEv{Qj(AdsESf!monIuPUnyNmK!u(JQfs%7-{HLuux~6b2*4f5JVMe9>5b=zRJ<4qN?Ht2<0CKb6CX*BT6J(Y@`041 zEPA9t1CiLu-(jg00{1S~#-q$*q5QP&jj#7<22aiUi0u;x_MViUmDeCn5qU`nlpy8z zDPM@TU1hzksNYQ$u&h2EfT=Hh>jm>Xp<zpcblou=i7+g%F;Sp+vR*6l`ei|Av%r!TOFjhJ8T@_~iq@(?Vf zDx4KQC0rZMJ86z73fL;#+9aD*YZfL^q0@ph!Gif096b7Qu@Irv{>xYHE>jinHJlvnu0iXbuI$=F*MbYW*9@!oEVIr))#d)_#2Ko^1m=4H zn>LxOaGb64hW72)l}d4Xb+#yHhU;uZ=e&$xg7-SrMB!WjV43>noM$=Co>ut{gN!(T zdTZ8s4^`k%DUX{m8#t$RZm7pU&>Fiq-4;mxa17U8M7QiYDU9 zE$}%!GLW+MEJx@&+X|n&N?kKO-9)ekB~AKScWf(Pxps3VXu_DZrSC1-NWhkoHc8H|Zv>GUbsBD+5} z)*?@{B~kNX=%*eCEL8csQJ)UmMlkbCgMr`r`ynbhWBLmoeO-Srra2!98)H`4Oa-^LQAm9w=Z*48Lt@!v=1MTR;f5 zaMHv$$54g?tZw>q)n@8g@%T!X3CnN&>DR7&?kFJxc#0)FiVn}F8eQE8^YbLx4=Kq|RGuejaPKCiTb~n4d@Ei%YW*Q+ntp-+ocp+j?X5JXj`#dt13E5D!r4`NA5&sGnHF$gVEeJG!2GQ*=5Af~Akh*K#hl4u%yBH+k z04A#m(XHVG%;Er@VUQo*a-JP~l`I#~nS4tn6VRDV$s3H$keK)bWEhR}R|@P-ctc(3 zPft_%5#q)(Q|q{-B}>Fxuttv{a)%!kAGf83iHpDiE=Na@v4VZhuMV zhe2lXLWjs^x;po+A(M^L5i4 zt^R`8sCs0BLkD;Hu-uT}MD~FmB(H8*2N613xs;egd^9JML>zB(Ql{0^vYr6)uzJ1c z^YRyLiSLc-J2F7p7&Sp{e1JP5C6Gi?we#J_M@>>LPleZe?|%q$eb(TB?N@O*V@_KL z1QH=KgVbmcNYdu@|1FSsV*-hU0)&$lfYbM}ecyoL9r8)I@!d zL=Vk2k4@9?Jy{8u@N@AVwWvS8s&e+-p7ll2^!@;5Zq4LJQ7FtMs zhf@dI_PzJ~dO?4Q<^4^sQ(VfIfH|4rce2O})v4IO=-jl^!7F8!a2`kZ(%~$|5&M8& z_APtbvH@wYvY3jJ7o4tYvExtA|dqTjI&2YQ~^}Am&w-bB%M)mBrxkMQTHD@IG ziQ3ex#LNOpTJE$ZCgo8=k3vkwOR_@6pi3XDo4`(h#?WW`+i~H2B1v}Iqex<*Zg1&i zb>OO^(R}%t{%}stCqAlJ5?UIahg!f>L01(M5fPY`glyitr2#VeqpNaNT*)m}Yb#bw z1RnO{H6f|ra0KBlAzQ7?;loBHXMU&`R4q`OR$QwyY<=6wlOx^@J=(r+8Zv;mPP+*Oa~($TYw8E*X&|N%4R2W#?&axpiy-+!FK5r%iCOmJ&lV~0UV&_jIAb ze0jbV?}SZpdC=t%BdL=W6)67n21*88b)6JM0})$oZEE^*v9^9&{N+W#{N`JM@lXea zOmu|z;q3I~$~D0W8@e#bIp$eSn67WD$VEIC&I02vja$t^Foxp;`8A_6-wAH88RYm_ zHz|y*guADuPR&*Y01yW3+y@(@ml49CAQy0(6r}6hCT>xFAYC7uc#K{RP**v7aM&Nq zn{R~rqmy6EhIH(+0^Xp%aZ)XU!t9`ZW+Ivz?frHqVq&Mj4fRb_3{rWE@A;HLqx&v8 z3zwj=#uNDhOrsUgtsA#8=@Li};!wBYc}Ehc_eXJ!oV4IH`?ucohyKzoV0n`m+!&)U zQ@=j(ROt<-awf}O@U$-lvtx0XTBm6&?vWIm0ViMXaMPZCYHH*WLy$Fx>bW&kUP~OU z2)>Rh@b~g#z#HJwjPnjkp_pgkk-XA1{%^biIlc1GoTsU(*Zxyc@J9_USr=5~vZKq# zeqI^`Gyq3(+dKF_uXAcBfYM;;j-Vb!r2kmAlP&?TNePuT`PmQ71z24gt;p7bKLIt6 zpGf;k3%sVJkNt-p|Kp1uaf4#%Q2T_<&#Sh5_&~3M)PX;*FJ`kC&u8m;#&iEf3{XDS z1+VFoO~ovXpL}mAC?9Kb*%$x3jtv^6^PJ;P$z*@}y_qqfo@%vdTlTZJoC|mgs--eC zp^ZNg188#SN`a$hUQJib&$P-&k_TS%%SrxSKmVsW$tlCRb7yBvgmeRc4x(J2@*Jg= zDLvf2`j$Q5q~ZOG-*5;g*(z}ElA1YRdg1G6A{Qe~@>u&$QR|g^c*%z59pz8nn})y ziHVYR18A+ildGrKF}L9`{`3!Hon(eUt`1UTkAL1c^ta3F0;ojYw6}^f%R+u&Ej;Z8A9E0Ov0lt&c{dYS( zk&T*u{P2K(=vn%{Klc6S&qA-@w&q;9Eu!(jKfZ>P$WY^kbfP9shlwe;dFIX6kPG+_ z!xxb<|1i+#mE;Cv1vtX7jjMj%+Szq-p)`x3dvrlZxUj5N&8f=`Cz~p%QBxqFmi+G@ z%t(TTPZ)qRzQxzZ)ii^3xkU-?|IF4gYaveNq~Rs&$O)lvAeYp9d-mU~i-kjY>5=g* z9JpYR_#0%t9+oxI7}(2RtX zG0z|lCl~gG%6RhLh&yvo`}G9s@AB7?<)6Ia%K4`s+>j3VLgHfF6afjqot$y1Y_ld2 zoB7mQ?El=}V`brkiNpOS)e1hGu3P_b13&yn##{XPWe^#|u`vJodFQB+>CvhZzMamr zr-u@hPF+2RY85;D`MLOi*GxmiIou2Pdjl@tH^ilIc;2zd3cI`RAH>vyO;k6V7G?eN z%jL^*v+X2zn*L#nLk=KmPsO+)xu>}p_Gws;k|ES|t-rmMKQ?6+soyFfHLoz+-cwP; z`HvNJAE<`#?nOaDPjc;s%RI61H5Urc(+7(a2p_(TRnDinAasW|kn4Ug;q$+H&P)c7 zRBGPJTXP|L1Mg5wQpgh>ny0|U+yk6(+WGp($s68ZM*L;OUn}wdYb)^)TfyNF1asn< z34Po~U%kP3{vwe^`32VX^oE_qj>WO1#3)<>iuV2yquB5;D(1Dk^8ENHb1gi^WHo>6 z=j{a|QkFaIMft*Lq_^r$sR>c&+f8s4M{Q>3gI4W1b}V|kH$AM9oTgAw{_oZojLnxIsN zp=9G!f&eN?!<&=_C$(jAqYisdkLnrF(!?I1QqGM4o%|3komIRdDWYuPP?Ha9W!5^)1b!yK*8C;1By$Pna;&t z(A45MUL>DkwKu$d3@T7P!I|5MOd$D_3LvL}jM8s_jORoOu7iV+tVz?(44%g;^>?)D znhxg829%`W>aAX?n-%lQo|{KYG^q5Ck}^ah%MH!ef+W9PWi0PEdkVWZ6G&+oF`%5p z!6cq%U+KNUB2dB_UP6aJ%csG$UJ*sHTa<5hmBrS`M_HEb4t!S%5!ahs=*s_g#8s_1 zow%T56uA!bJau-<(N%Hcj*l(tQN)Lg&FNN93Mu0cY&Q#HOVvI}SNteg3pb6{)QYtK z=$pP?j7$u5AC#OSig$Q%GF#ZPX4~X_I=zU5^UGZzywQhR?IjEz3AQIm-vlnU2MCd)oSJPqzW(-6Stey~w=FpdbRMa?06jd?KJ9CQKXWX6zlxG!B;{P?7%(g)~wI1OGU396L06$QoD=)8L%3^jL_ zUz15pYjd$%I_mits_PwLokzWGo0k+vmOoc`vow%~EzQZPfIeXSY{Ftt+Wz&|88-N>;kEnKN_AHvnul{=6=P!-%Dy}ck9EwbGxV23GFm%GE zHhR+i%${0_ET5XphKxjb^*yX@qj)p3zW87af+AErE_Yc`8?yyj^v%N8>cP7k2FHt`cPzaoWUtsPFCVDKewZ3FE}@NV6NdQlqJ)w_wVSLES6yGc<7 zwUoY-m=xv+jC@{#cXHID(w6V-^Qn(-tt@`AUT`#dyUKOGdMS|? z^rD`74SbLHz2|o@kfZBf94h_5e=^u%E9G7QGpq7j5ogG$_)PNM=Vs%B97X7ZiMA(6 zlU27l19L9m(%|Bho$ie`^E1|?yNb=gaA;J8=*6a~*Up(kRA0!9m~3$PELq zECD#0;{#tZdBdK-lbmusqidd3Mz^AE!Z36f;+>T1-Bz5d*5xODR%sb&5u&d!+XA3AFemiC7?%4oPCK4;#(UU!UmbW1W%ul`ocU4Ojj%J-d_Vbiw_O8N>f zLJzZzV1LA=Yb)$kLdYPQdmI0U0SxfPx4$whIvY(^JH88II1a6`=n|lTq3i}v`6>@6 z+e@LPH8uM&G$^-O0RSF)Rlx@3-K(U|a4#}n8AF-HL(APvIU!g@TYP@Y5!Vzef_^8r z_*xHi)8<{;#Yzgu&Mbdaqoz2pfWr?93^F-Vt$g}&y=EY+Q1TArBM_}x&&Okv<=d>H1P;#E`#vHPKkPkDIYuIQRV0qICvZ>a zs@4`it1IUqb(YY~i(q=f#DN7HkTe2p7OrPEs(hD|2(Dv-r8u3Gcn+qg`_0h5&%0xYE7*BsJq;(hgUEuoE)K~& zE&(uLluox=5#u}?>GAfFAiZiMcHu~($RPR(m@V{2f_eyiJB1VY_F(EV*A6FVi%Ptl zM3v_^CAf=3x6z8ACm1{b@ten~vqkDniPqAJx5Pg}jU#s+Ce)}pB~t`UN!4eFA1x%U za%Uu-To&>?qm zcm2l2SNpoS>~>h!98cxlIL74@U1R1k5wU2Gab!+j(&vd2lg$ucoZ0ux6xxnE~X}inGL${1VKv%EHKY2PkkLWr7WlD2b{sa<=^G6;1e{+~Q4t?^3&`uK(1i}N z$4RV>*rJNTO}`|+flYa@#_WI97CJWZU91nd3>)GaqmhWgYWsH;1 z^*45x&g$S!joVS?{a=|eE~uB}C@_EGY!*J{9^#&Y8$gfc6mqA4qv2bnl5c&p-vTnc z9gY%&QXu<|h}!|cP^a`fB8RlQcZ1yVVs9^QVjW#n```v3yjI1L^1Q1_e<67j(qgRB8bq#x;Pz>=IppBO(GuG$OWrminl+?YPJH`hslmPH1&m!_zHEu_lwcr zkFs9vny^LbRL&JC{Cnt$%G{5Y^B6WBNNc6=B-gY?2jck&N?AoA$%Qy6w zdV<@wr-bWiDk+3^|A+8%D{tw-#1LZAc)~M-ZsBdnX@I1KnNueD%I2Xn|XVvZK}w|Kn$|V6Pi67JIPdnW5N&x2t(^?CDGzs ztS#>ICw2?ElbwG$1HQ$Xlv{|cPL|1%Odn1)O6 z7>!y_zx-BHz49ZVC*NAXw<{$j=n=T{n$ybsfn+;rKi(X~W#hC2hAazhy*& zt)DRQ2Cj3YKD%}Du=sO=W5rb)Iq<#DqV;%nqs{F zlF)L`;yegzt<0F@`t83a*BFS6Ikb*u$(?y*?#Z8tU=NcBl&Md!V!_TuY_rIF9+q## zINxl`rDt0hSaY(|v9p#K?+Cb!Qq;<9v{E{(O5#P^A1>qcgM@I0YCMNxX0FC+b}Ov@ z@i+V|@_7q=57kuZ=+C!2wpRIeKjbXlXE-tLw;RXkR}qs^75{rm_57xFu=LO9YY(FD z%4gaFIndAy+=)&Ni>^OegxN}r0}jas%@|egxk_>yK&3eW=g(U~M!zmm`trDb8ZM>s z@-mH;t1{tcP{S0mGm5`kT<>%{+~P68xa-Kr#jo>qJYe^3XTxwAgUjgwE?4CSJB(G; zJ#tU-*uT(he17vENa`kRwEdJUe+T$%+mmq&C}(LYeXC`cpwURZclQj9fOZU84lEw% z6fXi!tIF5Md8IEq7GU&T-iXqSJw&~{83QlLGO)PomB&)pcu%i-?3a!#Y_}vuP#SqX z1UziIF=MnUp9}jpRa-~1I=l)_U{-3X|8<%AF*3E&EPRROHR6GyCa{m@qg2{4m>;d0 zYBrcj-0F{Y{@I>!-{PeRy+s|T8-J8Nw;&)!ikAT!{Z~le=SP;GLa$>8)FA(d8ltuS zcm!tW{G%|<2g=c}__w2u9HVNu7c`5mN!cc@zs-n_uh}RShL$4Rs$#`EILSBUW;s_Q z7s)GQ@;@J8u&I~+*guM?{?c;5HY*Q+SXD|H5(}DDB;Z+gQRc)#p2h619ZuW7zZ(t_ zSBSEl?%qwBK;7728F{Pm!B!VzApz4?3J^sBBKg-Jl>qX)u+FpXiqY(E+%?=Me_j6_ zvv<(}dzW~btg)b7$N*Chg=dUhNZk}(g!R~7i7x<7?GzBNf3{*G*nx>61Dkn3hkysm z(>wc|kf*xksA|eNPc0_aAS*8E{L)3$>Zr!(@!s2x|IiU7sDf0G;GTU41End|AzELR z3?WRjNby$w`uVl~)mDMn6jiuByMDAqTjW2A{n%v54J5|Bmv6?^@cGj&lT0pLzO(f* zRwYJ>dE?eTuKL4NhJe)Y2cf7p;zz&`Vw(Nojf_w1| zrWM-}V7l~WfvQwju#h01RWLAz^51~nkyUC*sBFt&Rvx!_m}nWEoOlE-B!3)jk)B4G z@5P(Dqxh^2Btn1gfQ#v8L&Lpq*0R73TIKxOR?&}sJaLBXYL#=JO3s+}2V~ z*A2SrqDFF|=Nq^~Es>SR$lKX&BM+3v_K}`0_z+3Ck*-qJ3MYP^y6)h{Xjr7V!4$rO z?N}ZoLgfl0?5)OAuKVDj=Il;yl(83d*sdSMvPkDgv#bm|0!jio@slW~23&7^!mdEv z)~rUCn!@MO(~U#P+`Ow>L~hKF6#ezNzBgCzT-su}l|)(FL_RalH#rKablS<5pDGBS zLhee~T-FLdhh2AR3tG0zoB~?nuTqgYGtZ__Bs4~hBIXI=@3A;oajsge5wMKp1~I<6 zv{zgBEw+KNv73niZ_iMV!h_2ma|_5D0>GH?oj2uU1enBF-XC!@{c{doP@`sP9c}H6 z066cn6CCr0$+WVq9B-33v4SsQ6jcY>4MwDfkn7U3+4!1aE2+|m(zI}EQzbmcnIvGs zv&ZehVBf_7{@U`BXGml8_hsBWU_$LPvV3fOuWt%08Jri04!6jz{?#i#PZ!pxnH*p- zR*73t*7@%pqGZI9_owGutN^YwsAAzm!Y;5bm9XnC;-ps7VeyP^RG`E;MHZc1Hu6Is zKQlOskYyXW7hG0bdVu*}Y41W~vvTlA7cog)3pqo}&;-=(_uVP>4@`&*6(*;MCgPHV#;mwW}l9)!dzn0>YIP8WnlmF}wl8%T(HN=SE`M zvD3|}7NXxub0n}PA@HB4JG3vvH70X>r8ovU|udw_pYy2Obb03XWV~Sus zlE?&bving?9jLaubY9c3uXXL9Z?2wq`~sK!tPpcE5|@CooxcarPlAY|l?2DMFXUBO zp@eYjViQ&q&LzM^X;}7?-$#6Yn`gV718YwZah5sWkCJek(7ZrI`+g%d;DBkQ=wjlo zj$2Nh#L<;eKt;j3LEvB;w|>vs9WY4T{c6Mv{CkitGzah4q!TeEopC_D+3+pd1dZ!k zPQ{z=xt9{W>rV1Ao(>(`j~09?8j8_tr5Z?Y_a4?ScBPy^0HBnZfPZ#8(&04wEw;7i z$*Dfv549niaf(KD$Vr}Dk8>FHIGUud78)OWiXWk_6!Mw78}g8IY@D6d%vpX_;Hcv2 zLV7&ZVA}PprV>p2e)ZX|q?TDa-&_H=+hQ!C-)o!YmeNZ%oD^(*Jy{74&9HNxnqkax zuL-t}=!HI|`2ei$qaODDrgT0_^;3HwHv2Pvo*HeQszYyExrx8geCkQuoxaeAAA>sR zv-MKM>CRjT?>G0lf&N`N0;lnJ>I=R1iIg|4t`a$MO6(-S`fZEWKfRBT;eao-K+Ybd zCmnS)6X8QH2M=C$;*L%)e7>vmJZ0;G5jFwfr8MAFlo8&Xc^RW%NcD`!;hN<1dBUnd zmM9B~-t%;C!4`iD&|JUn#|pu3v?O_`nSTBclph|Q!pDo7t|JC=c6HlcRN@{EsZumd z`UP^u#$!e1J4X`8$c&^@1=ALyiSQ^TA+(3e^);Ew`7p7?%B3Xx^?0{qGLePk^E9wA z#*BU^|6R=wiU)4Nm&WqEybb^09|=hkSZ|Q!d%5*oj+80hlQ8xuvh&L-`Gb!jX4luG9Vv%ZW&9bsw~s^TzX@1ZYihYVI;uKV?%}> zv$!G~dnGV@3uAM;64ew-uyrk8@3$7dGDY>@k9x-PtR&h>Z4AdTEg$m`>siCnltCfo zL^UXMSuGWMTxI|>#Joom zrC+S3~_MTf5!X&wD;9fS#C|=f+$FcL5Oq<5+YK9 zfG8p@A|S1TqI7qP2-4jt0(#Tkpdy_jodP!@-AI3PTSv}wo_L@4Ti;sWTF1Xw$aP(N z&z?Oqd*(O4?V`T4G~o=YCWX)4dRD6NOP+g~1o5a%>lbe2^~KFtQSoOhO57=V8c5|x zsY%P&{ej-s`IyCBh?B!zTi>7yjki^OFHh*1Zm022*QOET=~lbGa*_;V3u!LsxiMtF z(!4dF>a=sM7h2o{Nr|45nY2KR|86} zW+b&^P3EGYEMHHBD|zoFz_~es%qEsAd^RvYq)Z|dW>wE-qXOiWY1NylxpFBKaDYxg z?gHwiH%a|G!gMvqFZ2$j7~7FJ>yM^nf1-Y#|3v*X$2b%a zv8vqJm#i3?(A-_V4EQ7bjSAeYO5~kOJJFdhDF(}4!fItI79j|`Hu|k7Hziv4<+MI{ zoXmMWsUyv#W>KIwcQqql_fjEW92aXt@*5>GN(473c^M7arNS2@3znRTf}WUY3- zD4f#D6?H&cl}Ha=K`L8v#O_BAGQVLg4t+(lrdjf4cT{?A_<#Y3(QCcU|Azqp(8heZ zjxX++3-KRoCyu(MVz0$nkNPbav(FEn85wbRq+L)3k_iA%<;R()?&hh^4L?s5YfLX3 z=qZ%U$}GNT^nA}FlZ@VMVnD%&7y0?{j1#nCk`AB!2_UjkGyRC$3$^{R7<7H=l$Tdw zb=RgQ2&RCcs>x}xPq;;IS6Ct{J%8zrV2A(sc3VlU29aicxNPF7{)HmGfWfY z$DchkS-wC{gMY87rCMaz>&~LnFvY(TBsrH?Mu@#_Dd*DJ30AN(_W)A4K-5;Uj7aC>0uXn?!)$v znjmyAk+qZ#MRVCkr4FHF4zozxI2N~z0?ZYCM&j9K=lOzKVx+8-BVx#SS)8%%q`U0n zd8wYhhlQ<;^0Gqe!$C=HA;wtjQFU(~-{sR31?ZJ1M?yG-TPg~dkwY?>s~z?--ToL0 zbM3as>Cb&RBqp(3JwLGqWs@ij+*fY=+EG;Kj(#ktHFT)y+)BJrKdW46*e~=dMlFjcvAlIpGjMaoNz;gTAdqT(8~m#L6>@nEiNM z3IX1=uVI=dN%oV`E7RLNds8<|t1P;c*YON6VevgEe_)g*<2wHpM(Ikp1IV}IH~D(4 z{CCU$7l@v&W#~7rn^1K`n3Tai6>{7I#^z%d!#N$Vl52%YH}2jH2203iYQB z&ET6?KiMuLr>&N?Cu1!ACE2#(CRzklfjm7B+epz%uZix}uvF0ok%j(^vNc9kn=Z3o@Tp$=*bTD$`fb>2 z+8jS&a{nmtH>^=c#Xe=r4KKGi*m)O9my54h!lfIIm}GR7cGiv#`v5wit)(!#qx-`N zTcco08lAsjODHcjzu$b=bn)x4wJxi2y?B(B5uejJzsV>fQ=JO|?ZB&>IMvT+bZOM0 zQJ9hTX5P4@e&k?P*xRxPtN04edX0~eszy7@X_Lv40f6vBblINvoxCDuuv`IgpR)JA zK>0L=`9;$K(7n{LseEJWrTt|8u#~_aTxiG^_Z8W-JP~EowXwet64t0AIJl#i{(Gkj^DM-iK8`;9lTBGEQG_`#888-$wl@wJC^6ysOA}zY- zcVjQNe~#*V*xI&)+1SC9a-Dy*3_*BJZx=!awPC9tuIJ1QvF>3$LO+3@p}1(rIWAhHuE0A>uigQF>|8*Hv83`uOBu zV4M<+{Np09^g2h_u&R;9nX^!XW4=9rjW4iuwf&R?Ud8Nss1U z^R6-J*4TE)>1X3_tlRKQ6Z$mW)o&O^*r?R8;ddrGbYMA^RJ+cf+GkIHQQ&0-UzUFF zMbt%Hq)rwJ{X&KV1v#BWs&$R*l`NI>^=~TocPV`eV~lsSBQ7n~L7PV1n>@15_8|;G zp%%@cUQ=k@4u z@s;Vh=CHRK$M(F0?ND)(;ICjc41!hEnbW=^1x_9kh4rQG0*&Vja)f>aF%j!1#B;q# zQYQx#)yQ!?Fh5bJ2w=TTl#CDm{P>*Yak1r1Z-dFTz6)U6pV+LQ zuP;;@+vyx)oY7cjNxhRt=?0D`R0*P_!2i_;LRe~6VuRF|^Wd@t4X;1?IsO2DeUXU# z-k1_{<@hnjf+!}s~xSzz;qq`5?sdxrRAQSucxN&3WxjVLS8A^{kaZa za=&@sHH{=3IGdSAvDkgJZ+%Jke)D{kybAj=i*&LBf2)(>LQr0qn&j;#1y6PX@ zt$G{>K4NSfEaMY>`z-H~Ps!o&R5xR#0@POM{C(M7*9#&&G9%yeUKjFeTYpCLB>V-j~|l{5zlh3?UF@BLt`^rn&*S3IC5B8$B`;$ zObW^+Dlqzd4~^-a{M>h2@|AgWP+2=6yL9gOin@H>YDvt$eNhF z{11lu_wfFf-ru_Sm%I4yt?~EP_u7sN?FUy`%3KLYUzx z?QVs_&_6mt5x%FCd-!7H2DFow;b-UKyfPlwe_R%M#_fFO`}zkG0C2yBLeK+k0UkED z1QDPQ>*LAThjKeyX? zyLIpAYtA_9WOvP*>4aq-K6ojQhQ=0-9lsPR0+2px?xA3LXMx6JH#Y78W)7EoHH0m? z3=zyT<+`zJkAK#+n%3Fb3VkPTZU>7A7-L4KcA1OrZ3up-A-*X?!ifLqZG|R!@jYyY z)f!@n4ETkq@G?tXR_+u!dUE*4Q=EhJ8$B3euO#f)H3lq>ko^J705Srm2o8J;2OqXaH#;bfcol zUu}gx&@j_gz>Ht8>G%OMqeVIA_aT0AYsS(9Bm%gIaryxH(8HgX7J+<;x5$^(N6n0d zDptl_VC7O43(kQjjqk#fRqyWWO2bE`aS9qvQl&JQAkUeg87|jIKYnw=SuGVR$~TVG z<-W$u{8Qfuf;iq-p`3#@m0kwkuzpg-S0he=M(~U3TWScJs@LYYfzZ? zUd0WB^4hmZxKkLVW%$S`I)la-GN%{cL<$rqGpp$`O2)pyBR?(nvxDf{$2)-D>o#dg z7K2Oxb((e5T~@w_B7998MfIeQ1`N_7)p8RkhQg7`)*L$32fpZR0Kiq$I3h64UDSqM zcO1=>8Iwre?3i&74>55}=?SXtlDA{&5g?|fJLcC9eDuUQap(66;{IgGDj?&|t>@O} zrpzB+M=5ji*fjHUdSVsd_*tw62D0CELO2z+gCbr*3}JlTXZ^<=GTza*NiR<_wn%GC zUPCrx)N>h$d|4H#<4mclLLQVZJE*V?iQ+zyXu!M5@IH-`e7|v3^)-MEr5T;HujBkj z>aXvlYvdDMC*tecfPIAy%@jd*^Z4o0U^Bg+J@>?@%lEv;r+?j9z{_~?PxNYUodG<2 zxDNMY`61Eg^LTtBcbua=Z5I&&piQB_Kq@_|fCW(mEC>p}{M)eW*n~%zO9`*AV&Brv z@>uxNh73+|vACxU`cH-BBITlnL)R7>CLXJN{7}`w4T}crihW_~Y?xHQRjrPJSWdoi zOZ!W$zENe7i79&X$jA)qCo!xx$y}yQqz66;4XPs&Mzc>N`9z<`zcM6 z3(d^Ju@6IDQvPXOl|g|U0+GBSFw@t;Jaw)?@>ib^*1ZJMvu6=kp&6a4{q3_uHjhLi zIDV54%Fe04ccDLZF71%$QJrgvmJg7@eQkU~CWgzGDQS!tZf4k=mPjEMiG>Zp;QqT! z!?Ff6cSB>=R^d5M+`a0Kbd!U$P}Y4*OZJ8`%i+hgnieWKJ`S-nZ{Mr zUe=uW4C#=~SRx7QkUcvYa{a#VpX?24gH#^6#(kVR)?~!^Q+8eYN_K-p;u&JhK;}XVh@OG-YG^U?0sZ*w>QH4?7v>SIFhx5Dhe6p<$fffN{J*ASB-`i ziJW|Bz>bo?o%xeeYAfRhr4*e-;v6}eDXS{8v0&qmcFF|u1JV+PUIc6ZD!aMT%CfJcl1niQd8<1gpGI?! z6Y#D2yUIgt#x+_3Roy@(|4=QL{|5GDqZsbXgQAW4OXI2jC^7Clg|b?sCu2ps0stcGkkc)!v<9QHD*lo&zvi6INCSs*fcK$m^gl=VjYHc#XFm+%2Q!CziHY#F7%qmprV%%sUuX5u&`?DN8S+t z@XzRXdZhmds#TW@byl%ME{bSSoAPDm1oozAbEXjs^PkQ)g~9me{}}(A$BQ8C zmVpoHY7jQsTX=Y@747?XpNgb)RYV2Pv zl`Pbdd}<9$bu^VOw;3oh7+;oT|I$z2(+yKe5L(N7a&e_EuA8)=-!M&WX?KAO=Ax4K zSZBU!t#L-XNlb8H`{LAop!`P^W)6jCi7Ja(({)Q#x$jWvun~~CxpEL;4I z#_8BPm+13HQ+{6?=DX%yyaKxKbBnpDvKZsIpY+ynq-BRszYP?pnxTkjf`K4{Px%birUE5!;) zY_%E3{I!rS;%Kq^`nUO`v+Zq~Z~^vZw(c@4cn*`o{;|U|6rNaKR1(cuxeS)BClR4V^)% z3e%>uk%#zhP=phF-fU&auOev-`?gUp=;-_)auR$$otnwuWR0{k5G(yMp{l)X!q~N4 zwo!f!nSeR3hXTida(o=xU9oEjlHGeVWISCz>|e!5)(6P0{9WJDhNo^gGj_?cQOua+ z*1{s0i;;jfYWj{g0-~n}wm+#JqFV#iJqrSLM8~Zu(eL9xZ7FL^b9}l!o!NrVQrek} z7GDZ`aYrYpZ^V1NQR@)^cf)g0cYtBo1RKU?tfjfuP@j%);}hh&aXg#|sO?h29YUx6{!A-GiGX=ZX`osegNah^Y_XC^a_P1@Tj@8PBil6q=2e6nf zAfdchS_7_F4znJ_VvRBw{TY*2p9{x-d>7**P(Llo&a@pzDt5jnizB1OR6FsxG#f{* z?Fy#m5Bp>PgRm)%adm13^Woy>cW-Dl9IHc?W6WAo7lywklGfvOt4IAbq(ZBUwAw>u zA+18GyZH)pnHhb%q`6DU%Qd7%9i?hE)f*3Ib%Z`;*j?BL^?LoAdVL4h{CN`)!X_B0 zshAFdO@L!&Z|Y5EeARiOhVA;*4Kfv{bjg+P3g(_!w(O~2F`jakcEEPUCuih&B8nz1 znq!xxc$%@hBdV}}J=e7QVc7cIsaZWxv^Lq9`k>U|`XI0)SJ{fEoFe(R^;uQ&ZgTfO zh`KT3)4i|8-S=2(%%YAIP*+>uQCHt2$<~5m>8XEoU>l5J=j~~qZ?!$ngO9k&SFGU1 zT&qt=Rjb0)Q$YXLN=tQl&%0lxsD0;~J)A^Ns2b8{mgT$_Z1_dhL_2Tw_Udw}`(*cq z?A|no=`4p>5(*&(=J11_XsXH*V%-QuRT7hHXfQvUYq4)c;qO{2`?|2=7t4~6YQ4}& zQ|8zsKV6gRb?Il{L1HC<5kw)Lf4b2w(n^7u2>WyL&I8QyL0WJi(h_IRiy(rK z{U^!NjjDf5vgB3KC756c!0o#4z->6T{u!F|(_aec`IAAP^Z-I4bZi}bW%;R{?jLk# z-gDp0OtfG3@S-H&(kuCy#I)bpnG!W@d&f=ZZ8)dr^wO60krj3m4Z5l6L?~d9=<~-& zq0+(Q%d@$youv5WPFYehrV@GAT2oax^8SHeDS;c{JO7sk3)uHLCW_f}Uc{L!6#77X zxbsy^sbO)X>MZTB`3fs4if`;Us#G`PN2C-P+sg*HIDN};dG&SChiNcOYGy6>Dneuu zEok9M2Hbf*GN{I#V`5Ul-@uQm4r`s-LxX18&0JlNSC2WkMtlD3W-wePl1nsJxbCAS zsWfIE`i*Tc6!L;tRBv;S*1I5p%?P2*XP9}2uM5~d4Inp>^Jby8rvepQg}B(4J(|cj z?d#w?OPgN4z70{SWoW-)<;;d{HuEX`oY55zXA z`RmBhG6mXx?&7YY7c0s?`7~Fr{nME6)uCY@2+a9H+5I9Cj2}`7DW%<&+sBCjF5ZrF zx9IUy?TqJ|^fE&69Tr{1OI;1eGPOoWG_#Bo?8jeg!PQ2adiFY!lBGJS`Q|u=LD3S& z`6g4f!vxZSG&Zqwwz1mg6U_`!ahC>!7ytQa_(So(jpl;TLWNFjw8=#8vY(T{X;SFD zu?juyw_TD}I8>7DaA~od;|bs5g44cgvP=|PVQVBSTnp+%GuWk~S0uGJot*=BtV!(e zrCwiOdKx_)d>C4?jwLNj0!`pdTUqzM*rQUeMs}0d}1CORj!_l+s+N+aw`C^vTHA*dm2L#1ZNFNe|rpvgMy{Q}-~hU5j|;gsF_=*fE@b(rgR$xPsYOy{0lr6&K-&-u>F=;KxK22P?85yHwAilnz`55Pg2H>bQ_`6B0U6Ql_QV>qs&Aq z0aYuaW4z~24+C{*2Cz|>$v^_kj9N~J+El^;D@Gk;8-wR#b(*%j4ChS{4ozz`E>6(F z8x_ik;*G~Gtap{kM2|wV!`PvkJ?g4p_EO{OJEiUQE@EAe#8fg|_T1fXYbzmY}=c z@pZR6e0cJq9?3c$+EgO$_(hQ__C%{?gBBlR4wVZ!p$F#W25ARRomYLNzn^4 z!~5=10U<)C>~^yo0HzM}&&*kZN(pbmVO_cXQhlO57EL;E>w_+ zJ#zBVuGg!&c%kPR>CVxntTcN~KzhCRp?xjHUoS(f&Tlh7$MHje!f#WBNk_tyPdpXh znkChpFkU>ba+y!zB#S$t;c_5GGNh{I+wc2bi*+M+LJ^w$CZ(Pez(9K~hQkc!mNtqr z{xYP<$(?)D@4`&ozF2F?K!y;-8Gp=Q2PouE|Nbasi-d*P2iUCzI--1Nry0?C1Asjy(SSDz{G(=c6} z@=MS=PnDwPJq1<{%@XUKk-@lgw~O zir|1HTf6}#kSAf)j+%gE$2ZfbGeDlZqv}jhRN4Ixy>1GDdTiIl3YANN+@wQ zLdEY^2BX+%>Xf>t2viL{gr#;4`2W@jM=S_IMgTuRQ4s(3aC{8N$nx^6*$r?NoC%AM zXpq4?3Fd~>4o1tDd9E^`L~2f*)tB_sSu$5xmlQBVl_cTAl6-oI* z#~ytS0YisEPyic{AG{x&>Yt07>R`-(Q1b*D#wD0~I{_=XS(0%QtxVG?Gz?Gp4KolS z{XR~ZZVpbcMp1*{r7Pd9+oCK8+lk|$C{U0?BEB>4-oYBRaQs=&xy~ZfI|nBGo7}!h z!X+BEgXzCgUt*U!cHTV6la>2IC*TPJ?Aq~9#Y|6C`q#P9u+(k|W$=lp|S z;-^b>z6zG@Xtv%pRyg~`I?VGaXWdI+aoDxkoC@d2ftHxFu}7*l8H7#V6?*h(wpQ+~ z<)~RN(J$vl2!$06JC<@J`~_Wya6GO{b!G*#*+diJmu}hh9s?y3UgLWt?&D{$jCVzk zQ!VcImo6BeZ{S4xoXMJmLHsV)DE7 zyUu!)dtuQO+|8;j(N!ZA^c!U+qQJ3h&59kcn~WVu0JN=A@Pp z8cVZIXMNJSm!gzet>x3H^3( zY5J_7OoWVQH2h3Xe|(_9ofEI`-20l~UJI#|0CT&?4X>s?rN|~-dn`*ue{Vm8Mo!rI zkV`Ul5k5~yX%fR}Ro480Vzsn0jc$Xl4A5hJ+^&{mOiWnSo>E%#e9Gs|IT5`w3LSxU z`uXW`STVYx(b>ePhx>r+AkRoCPzbON0@pSiPAaJ?(9 zXfoDrY|d(ksmtfGRzn;z zXRk1GnU8FY9zRngXTSPUOni_}tHrySdyuYE2F-=@ki0Z~#%(%m z<`Y@_h(nU{aCPh@;kOP&Xs@43VSES`ew^ogMlUaGsr1yM{y>OljtWLeRjJmCR27n@@m1@<~JNZxB3>_h^?$v4$ZwOO0>@Awi=$AJjIB^c^CYy)r zjbml2?Ty)Ah*SyPDV@3vmRcKGl?05Oj8*zK*3|9mABulOr0&q{nKy^brIMenBM9$Y z=NJ?6At&B<>?7gOs!35V2q{7-LInD{=0lMua7(Sr(PN;ySY27v1sGQoK|d1Re1oFPYc#%kLv6Q|)m8wl6esSg;&i;1FZmWu3#!0uLt#z@{Y1Ly+inO58K9Pbbm5u|I z-evLWkQ3IoST$C3LgP?$lBW$NTGUtTyCJ=XJ~)oD0c#w$6kEBvDNewaj?3HKWn!#8 z-fyIuGklzX?v$*Q!^Jn0C9N7J$PxEY{nVEhU0 zm&7B3VZX};&JA-HjVI4&xy9|w6sGLa`7>p0wB6@0X`j`^FKQFPseT7Z&; zAA*h8c>=?1`tscFhE}sC-Z}2l@tTdMzquL$v=l~(f8q(*u770oO# zJki~nZALyR@Xu#C%=WKSa&4`CIsK`>f>U}FaT6JT6t>^lMRT~|SeP7RzJEkc4CBBjl6}GYg6Bd%+z||#PWc2`-+*0^r1C198S*yUN^@Imps9=XH zwCeGyd82Zelfn-9u4$cFRUYgXS9dvyQh6_tYPA=8d9;+ps+@c6kllO$-yB1f0SSBM zvP64w^mV0)dmy>D6J_Jq;tdb2Yg!~;IstcIBTgAp0?a+-A}Aus&BzWqsv6zVPsK9e zt7b5I-&dK3p_~;S?nl*j#T%HXD3Uzaywo6?vSl+II7Zd39KJdu}qdEV?o$e<#O zrk~AVp14b};0Br5o!RW|&rOx`+p=mg_M@+RfL4XGKb6j({+?NEQews_&@G9)Jd|$j z!lKO>>3--%e;`SBNk!P3OQq-QIF>axo0xbMi_7}L#>B*aINNvW#pMxqJiq(bHtM63 zcCFNW_-0mn9;`H9{I7;HzdV0;lvyuCFU{`rJNE~R^LF%!ELm^Smqu4)b$omF_%lN1 zy4e}LD`|7f8@dSm)gCun7}Y4?_nIw)UwpWpd5+b-58;2Nc}w|zQplJWd&SL2py?6i zxEG_T!=)rfCI5CpAV}=t5m0Kvdru@#Mi~o?@}W-u7tTGWuzZM4X!#IvJMzIAHOjR! zNXD0z@rM>QsEnVTiM5~p(qrfzc;=P^*o<(OTbDv z{x(|FibQoDI|Mok5;yojdm?E+3l5M?Dn^Uy=Z_+IHX^I5b-tOQK;=pPO0gnGs9&ivKejdZ{M1OAsmr$|L@eiLzOF^2W)f05@?QC3 zwjPmEZB)=xroB&YHN-{X^g#Ev&`$i}(YJ@!&-W^d&S2kU%bV}x*=mS$STF9;?I-vA zBvrgHG}UiaKWek>3Kw?pvz2{qe>J5ev|U)_I4~=#n{PB0E=-TkJsI-&2|pt!Jm0Z5 zjG*vZpzx$K{SAp;>53Y=6KbVr^n7!bC2&CF4HA=anJP9|jfJ&gS#xQPtv(OO90u$Yz???o9wc?MbUY9jT#o*Fb4T@3w}RJl(n!C+dM zNXAiv^@YKjMXQ<+Wp{d}4h`rLX*I8LtEzy}@4GHOjy^bo3IfJwH01n9I3MNFlW=?c z2}bVLKSOz<^Ly4dtMh}Yye$yZQ@E3xnA?Nn7VmX5h*RTDn>&r`h!uRwU+o-yVwvK% zaQu0czQ#_6!u>Lr!`(hyaEp-O*Uzp+V;QAmMoxCQyv;vM4O1*X)i2eAJ<}QDc@Y&5 z%0fVB)0NI0)T5hEXtcNHnLQB|m7NHC#+RZ6aeC@FD#k*nZhP9Q^INKs@hm@k5Jw-j zb5*~fzUHIVn~HiXmBHS18tX2e+`uhChft4xqhb!*^;u>81<10Y)w@BwJj1lOMQZe+ zVw?O-X2sTUMAf6+txw=PkC{{7GaEYM`7#n?wh|0|1nd}zaTX^2(=PkkTI?M9XTr^>mHM5!D3CZf%}jv+E0efg*raK>&~LSZEsJA~uh`FXz0JtmX)FBog1jP_&^3&~N2WMX8tH+L4@ z8(&RBkW5cid`senO*uxz=0ueBTz>ahCVSZl9M-&BEd809t1}yk;ZA#-GhA*aSaj%= zPCMdhWz)JJ*PX5e##IVjqPJaBi9YTUc?1N-a0%pup^NgBFJvci(XvBa5)o_=TCjN^ zeRB)6%x;?Z!gs@4Vbmo=4}l7Jq*>j9I9HN$x=}iX6EzJ&_|A* zSVb#FogUtab%!0SX?aX6DwcHzExtnF^DzXDXA+{yS0Mbp!sR0hC0BH_G1NIhfTlVc z{*Vd|nW$&~`~wr(i&TOa=zsA)7+Bs|CMt*Ens4#zSMPj#&P4!&E@Sx?5943G>HE8d zC4@(rMPL5)$G-gu6+V1Yprcv*pZ|?N1VR!4=l H_w@e&&uRUj literal 0 HcmV?d00001 From 814aeadcbb77f6b19eca81599c12d81ee113499c Mon Sep 17 00:00:00 2001 From: iABn0rma1 Date: Fri, 31 May 2024 02:32:02 +0530 Subject: [PATCH 244/405] added formulas --- contrib/machine-learning/IntroToCNNs.md | 55 +++++++++---------------- 1 file changed, 20 insertions(+), 35 deletions(-) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/IntroToCNNs.md index f832980..fb9027a 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/IntroToCNNs.md @@ -26,25 +26,15 @@ ## Introduction - Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. ### Why CNNs are Superior to Traditional Neural Networks - -1. **Localized Receptive Fields**: - - CNNs use convolutional layers that apply filters to local regions of the input image. This localized connectivity ensures that the network learns spatial hierarchies and patterns, such as edges and textures, which are essential for image recognition tasks. - -2. **Parameter Sharing**: - - In CNNs, the same filter (set of weights) is used across different parts of the input, significantly reducing the number of parameters compared to fully connected layers in traditional neural networks. This not only lowers the computational cost but also mitigates the risk of overfitting. - -3. **Translation Invariance**: - - Due to the shared weights and pooling operations, CNNs are inherently invariant to translations of the input image. This means that they can recognize objects even when they appear in different locations within the image. - -4. **Hierarchical Feature Learning**: - - CNNs automatically learn a hierarchy of features from low-level features like edges to high-level features like shapes and objects. Traditional neural networks, on the other hand, require manual feature extraction which is less effective and more time-consuming. +1. **Localized Receptive Fields**: CNNs use convolutional layers that apply filters to local regions of the input image. This localized connectivity ensures that the network learns spatial hierarchies and patterns, such as edges and textures, which are essential for image recognition tasks. +2. **Parameter Sharing**: In CNNs, the same filter (set of weights) is used across different parts of the input, significantly reducing the number of parameters compared to fully connected layers in traditional neural networks. This not only lowers the computational cost but also mitigates the risk of overfitting. +3. **Translation Invariance**: Due to the shared weights and pooling operations, CNNs are inherently invariant to translations of the input image. This means that they can recognize objects even when they appear in different locations within the image. +4. **Hierarchical Feature Learning**: CNNs automatically learn a hierarchy of features from low-level features like edges to high-level features like shapes and objects. Traditional neural networks, on the other hand, require manual feature extraction which is less effective and more time-consuming. ### Use Cases of CNNs - - **Image Classification**: Identifying objects within an image (e.g., classifying a picture as containing a cat or a dog). - **Object Detection**: Detecting and locating objects within an image (e.g., finding faces in a photo). - **Image Segmentation**: Partitioning an image into segments or regions (e.g., dividing an image into different objects and background). @@ -55,7 +45,6 @@ Convolutional Neural Networks (CNNs) are a specialized type of artificial neural ### Let's start by understanding the basic architecture of CNNs. ## CNN Architecture - Convolution layers, pooling layers, and fully connected layers are just a few of the many building blocks that CNNs use to automatically and adaptively learn spatial hierarchies of information through backpropagation. ### Convolutional Layer @@ -67,31 +56,22 @@ The dimensions of the input image, including the number of channels (e.g., 3 for

-- The input matrix represents a simplified binary image of handwritten digits, -where '1' denotes the presence of ink and '0' represents the absence of ink. - +- The input matrix is a binary image of handwritten digits, +where '1' marks the pixels containing the digit (ink/grayscale area) and '0' marks the background pixels (empty space). - The first matrix shows the represnetation of 1 and 0, which can be depicted as a vertical line and a closed loop. - - The second matrix represents 9, combining the loop and line. -
- #### Strides The step size with which the filter moves across the input image.
-- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of 3 and 2. - +- This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of (3,3) and (2,2). - A stride of 1 means the filter moves one step at a time, ensuring it covers the entire input matrix. - - However, with larger strides (like 3 or 2 in this example), the filter may not cover all elements, potentially missing some information. - - While this might seem like a drawback, higher strides are often used to reduce computational cost and decrease the output size, which can be beneficial in speeding up the training process and preventing overfitting. -
- #### Padding Determines whether the output size is the same as the input size ('same') or reduced ('valid').
@@ -99,10 +79,8 @@ Determines whether the output size is the same as the input size ('same') or red
- `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. - - Choose `valid` padding when focusing on the central input region or requiring specific output dimensions. - -
+- Padding value can be determined by $ ( f - 1 ) \over 2 $, where f isfilter size #### Filters Small matrices that slide over the input data to extract features. @@ -111,9 +89,7 @@ Small matrices that slide over the input data to extract features.
- The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. - - The next filter helps in detecting vertical lines, crucial for identifying digits like '1', '4', '7', and parts of other digits that contain vertical strokes. - - The last filter shows how to detect diagonal lines in the input image, useful for identifying the slashes present in digits like '1', '7', or parts of '4' and '9'.
@@ -125,12 +101,21 @@ A set of feature maps that represent the presence of different features in the i
- With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. - - By adding zero padding to the input matrix, it is expanded to 9x7, allowing the 3x3 filter to "fit" fully on the edges and corners. With a stride of 1, the filter still moves one step at a time, but now the output matrix is the same size (7x5) as the original input. Same padding is often preferred in early layers of a CNN to preserve spatial information and avoid rapid feature map shrinkage. - - Without padding, the 3x3 filter operates within the original input matrix boundaries, but now it moves two steps at a time (stride 2). This significantly reduces the output matrix size to 3x2. Larger strides are employed to decrease computational cost and the output size, which can be beneficial in speeding up the training process and preventing overfitting. However, they might miss some finer details due to the larger jumps. +- The output dimension of a CNN model is given by, $$ n_{out} = { n_{in} + (2 \cdot p) - k \over s } $$ +where,
+ nin = number of input features
+ p = padding
+ k = kernel size
+ s = stride -
+- Also, the number of trainable parameters for each layer is given by, $ (n_c \cdot [k \cdot k] \cdot f) + f $ +
where,
+ nc = number of input channels
+ k x k = kernel size
+ f = number of filters
+ an additional f is added for bias ### Pooling Layer Pooling layers reduce the dimensionality of each feature map while retaining the most critical information. The most common form of pooling is max pooling. From ac4cca21bd61066338d7ee1d424b8c29ed6f04ef Mon Sep 17 00:00:00 2001 From: piyush-poddar Date: Fri, 31 May 2024 03:21:01 +0530 Subject: [PATCH 245/405] 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 zcmd6O^;cA1xcAU7gv5~2-6ajuFd$L`N_Ps2E_$afI%P-uCkIm3Bu zU`JOAAcEzrq~`_#Jv00FK`N6feFp*w-Yd(?XnSQHEqnTX+FqA@JP_SwWEmP-A(BOA zjKjZFeA|sfZ%$m<@k%Pet_Jo{XXn6mIcH}8{i@xGgh%PFZNSBjC;cVH>RE8uq0HsV z5c$Ma;@VA=?4Zc*(nRCRH&PyfZf|b7A@}3mfaAMVOTAPXd3n@MS}_m-0UL%&a8y*5 zE?8cEs~1K~PtTHyOh6!71Br?nj4qazmsjINqo;Q@XTv8*Ci*|H^tR~xcS5PV`H7^D zA5m-PqN-8R$vvz%vGyzfW z2fygV#SP%{^sWTTsaAS$Ojy0uNb36a+2-KTP;j5Q=t+m5kPy9yi0*4%dRNgE$pYiq zxjBp7@oe1&$K@+95(qn3$wC)A^R=~AV(@$1%#8MwX4D`GaD`*Vi18#D8;gkvqj+1y;Z4)@ule1%WJWBc6(mf)NZQ{ljk`8(yt00> z_~v-QX;UNdPo(lW12Edzy=wQovM-q7s^P4*?9$3^So>lJSxl3^XEDF_>?d=Q@TjOO zXK}>ast6FG5G6xChMCFq;P294D5prIgbxynluF0EnbX|8?>G6ajkwpGdW%H9e_i*N z@7C0IO~Xdn?}CAkmB6}C4=zz~V#bz451(&wZru^VdqdT|Ufv_}CJ?M@q*`Fn6feV1 zyCOxsN3fR;5yT=YWH#5GArC>-n^KiJ8$oeVlSSif*?&ls?{+Z89(W zok(bQxcHgo8I;wLn}iCgvvT+cYBx(x>mtN!P0YLR+R390=Y;X4BI7El`r@vP`#(P+ zZJ!_rracRox?bCQypXaLK>0Efgf)kvj159zDgP2EVz2Pvns*K|9tps0QSt2Asg6!4 zwEw(9u=ujmAKNHtNqH>VYO%(% zcJwUniH`R{i1s7Lm%XQI2qwtX?f0qLin!O#^$S)f4pOQ}?sYU@ROU~V6!+N5=(JYk zy!J1Xc->FGLCXhVlcFs>2~=p}r+>~$H5Xv)Vt9XL(nV2Q+|)YP_WOc{u!C?@O7QoI<{BJLBm$TB|1b`mx$6&a{U+F}1r zVP^7l5`!2RSEJe!|8grQV#vZ?o{{#5opuw6mUTsLjxpKmP6XF1I>(~EsU*{*-(pa6HmKN|b0Ox*Ivb@L z;boZmRNM%X!FpL3QTMgiinhU=&2|POoMtTKlCXs-w1{I8u;yePQOKu78E#-;;Pr>%`>sN3}*U-^ak|~057V#jI z3FORDl%`zF`0tiOgxcELc?AXkd~wK-rR>|csgtkm`e2hm6B7XmZ%!(@rw4Ks8|3It z7>A1eRNK?vz%}4;*!Jvb#(KD|4@7xw#!CM@Is#!U4~1IXU!OHzt@vu{>&IkJB&6QO z7U!7*4zAJWO)Eyo356r)^f#L`;An$7Is(Vm)XPpt<4-u0 zTR8C1kMgAt1e!?Q_xNyE<8@}vY19nq>yx0a@6ZLa!gFXD>+V`hHhoDPI9ElDb+doUKX^hIeWH<`{Mvzra&7-z@qiA@DC*3@u zpcjr9`v8$LDmoeogo=tvD=0|p)PBRfGnTpg-5!C~(4`-GGq?RON$ric63k)*f1%C(V=XgOy0__c8PLUX~`mx%!(IvJ3n2P?y9>M$@s? z;6d#vWrTsqR0XX^Bvs(`{xh%Z&K^$G?yXMCBNAlL3@OOqg-`u9bDt?2t9<4U+yjqq zJqM!SViRP+$!61CX*QnNrwh-5)t@-Uu(Ep=prPkD z1cO5+lsoVm{TNLD5N6BI!B5}H&$m}SP|URjQeg*=zmR0rGXZeofH9i!4bo(B^|GmZ zL^16oOJDBVfOufsLW2I3rji-|;YtBRlx8)CR{-0jK9^Xu^tBQOaMW$Y zd(`@GmV93LDqV8Am@}jd50R!y4*3YO;coL&*3=M;YW%Wq{5Zh?5u(^G0OmMe9-i6g zVb0jZvY*RCHMmJaq1BKj#Qf%j`DSuF@W@vF+0~*G^10ocI=||mEK5WUf6@hWYXkmFT&j)eZR8t3UY}o| zC`}Q}d^rT2?&xw?GFb6lwYyvr2d%n@QlqHI6`AmRL!cD3pJ*KCSUshEGXCaF<$W6l2- zN`174%o#4T;0niH;aFp#$2C;+4@Y29(4jazp_c8eXohyd$ijd~Rekf@8o0Nwdz3C+ z*Hs>lbA)h2GHxM3*y3l)|Ih`a!0T>Vh5Tw{;5e|R@PISkLA)uxy5e@w^+0@354Tt} zdkq9VucnruAIH4%-?cyQTPYyC))kkBPUUK*q0F^1iiH=r6ggvk z>S%ik0cA$$5J8Pg@nE8AkqE%5dn$mP3~6Eet5ikU`GX2-|w;tIb3ypueTH~rvH&i zkTfc*5n>UD;VMOtEt{+hCY@|`W6_tS{>>6+s2Tnv^WtovHJVq})rB9{GO8x|F^^0< z01y5nMlD~Y)&CFGWxwKiVYH8e9DzA zDr)O@LBs8@+Ejxzk|P$OI>6j%a_O;W|Do9uezAnwmrT_;?)#5wYIlS7%RkW0Zr%W1rO8Rk;N#rUl5WLi&i`J(FY ze77Ep&5gl~kr?j3TDErnPfL$iW zCKj&I%#CKRfJU+Erv=9W1)b^QJ)XW7e=K#ZK(KC^f3_->hvrFs2!8o28jtQ{l}i5Q zmr^=Uj@>^TO<%}Waztasp#5&Dp^9->lo7up2&eeUq`rG1d}J~mRq_ElpjZts05B7H z)f<1JjUf1QHdaC5B&}5^y%;iXZ)qSTTbgV+RrV-#Ea**F<_BWP<~SE|8 z|AcjHf;5VYHH(Ia5*$ni*8?vzG1>a;8cp$WD<2>B_8wuJZWvd+(9$Nah9bc(>1_uLbS$#G>{IvB14 z{#9-#&~}xBAbVied9!)TWpjE;4p5C9jgbJBR=0b}!jTiFmp#)W(oEi78p=8ydN8*C zpy6o~#wn~MD45pZA>?u)GycQ?Jpb3{XF>Y@pIWM3bxo}#LFk`C_J7`j{YY48bmG_|*38 z3cJjhrBh&*(luScS{wO`bEnP`E6wY>fCoGEg0`R~J95m9yFVvVN_k12wsSI7I^ zVQJ4c`X&?^`l+4wR;3+3Xd18sdM;-9diiN<38F)s7MI`8|zox!NKkmtt3Hx9I- z3yJ@&WOyEMv&%lF6c<={#X*RJbpr8&1JSbxs1!Wu{kzYG_85}#Zg@D}d|*N;HzzT- z7%*?uCs-_9eepsR=i7?J^4L)Cbe~fG8JE?u%NDom8{DeptazwvV@cOEzn_I3CYagR zz?pwtzk<)H|4#_bRTDnQ)I^5r)d8Ag?Fn7RQv%)M5ui*|Q+yH=>z$JgSDV{cgnT99 zFgV5XVA=El7y6GHv|clv?xXbiHmnghowbhm;D-QQJ@gfcqK6Oj0)cmBRuj}8moK%Z z_`*_K zeTN=v_MuhRUYKCxxD8PW@%=Mn_C&W4_Z5+{qtX!pBe3d8`_~o!ge7@y_CBi2;nM?H z&h*+VnU&yl{fdc)D}~y-0aNvEb-u-0#?&3-1bz{Y5C;us%7Hw4DRrqs})iz zndGfw$D$5D(4rJoyom1;%M#*lM-K?x8WSFe`jgZ-5l4I-{l6n3&o-ClMHcry9~n10 z;Q7J74>QaW%G4H{a`8ZSqXAgRnlaJ7>2;5W^0uKUDxtvVvnnnSWkWd0HKXOQlD^uzjP3Z0>WY$I6;sMJSdvmH zyZ?g#p9291p!%WhK8dIeIj}4SyceC{&XFGDn$yJ4eM8X%9=mpDq+6UK3M)#P6BHMOFno;%* zEoc?3oUFs4-}^oNxZQE~K#uFSCPCYi`mPBBgH=UAQJC#b)CE>3@%@i&Ypqu53cKHh_|4;L+8G zzSU}ihYXexhgW6V4w>JIeSsy_sXy`|-Owwx1ib#-q|qz1)&K6Y%T~br=6svmf4TkV z%&+-h=dN2^x~yUm+#-t420~R9UAhf?i5&dR_|s3{dA|%1qfmfq0(wDsC#$nAY&ESh zlixa^Z1nDU5VQ4KO3UcdM|c@dbpP;Bx6Va@>!;OU zzuvY!-X4f}ozeo?@L4xD&szK4v75|r`}E8zg-TcL)-R#aMIW+>Lz+n1$of^>03Bvh zUUB~yCZ`(LG|Bn_Qpa3Ma+yY2tNK2(W%TMq!c0I5yd17jJvSGdkZ<5Rq_R-06aj~6T7;r6A*z&dF#50Rrxgar}5tB!@IQ4~U{n~Ig<{wgOci}G-_gJ#ay zmkZQs$-kaqU)5Fbu!#P!@R0vmG(4dYssN?^N^D{BGU!NaU}NrrUDNzMBzusH|1jg` z`(9erB&2oI4J|;2pTyy>-|gXILYiRLagrHj@BG+ey+i1jwYZbHUaD34n6(68m6+i3 zQR|=#a<*#7$DYYw+8@ z_Sg;V#q1zG1!Rsz94$6%)(lYhOcg@2r4p#bBYywZy?;0f^fX&odAGx*KH%c-pU<9M zSWm6v;Mf^A!m_!dIWSe6>_*X##!UC!IT1nT$dc)&f!~G`XlEFd7%QtVpc&4?o zm!5>YRR+&@1uTab0)~gzNfZ3Bge{U=v9K?yx(9x6hP8_s3!QSA0$h!Vi;Kfvq1SKo z5yYdGh}xv~+58&aXMYr#n0MWLAU}|2tn^6Y=c5W1QYiP8Z>YtJ`pQE<)wA6!tGKb+ z{_+BiOK5CK`m}5Y0Xn?Du_~~@$zXoG6z_P{hod&5HvPbLYoO}CMk8{$`e-OXHq+38 zKm^J65+4&&^%PSS*qD9w7Zv)%47f3$rrAnF-NO22@v$hW>XPLC=r{>g@GYzDm6^na z9W6;6OH9H~r_U)J2uyCe=VPpK9moyWQqfon2fCQt=AMJ08SmeMRX@sl2DBqEXP&w4 z=`A%kkv)Tau~(H-Y-;w5bia<+>;TxnCu9+@GJ73$fySMtv&=5mo%e3zQd7q)AGpor zEr;UM1IRezXKhLT?-^Dx&2JHREVMPJ*i(GyMdFsI9@j>}xP9+z-%a+WwVH3w)kP=p z+Lk}z)XdIwPE|b8Wg2_aTvH^Hgl$yX!_M@RT%Az3`O#w&CY|D^UYuoFkUzc^!}(s3 zEob^MjsXn~v7z>mp?U%}&yMg8PlSnt70CVWKm z-T?)hh_}lAEhF_)Bnp3vJCj4|mF906zs-cS+5bFi7_=zZ1cCTlfj&WF+3}iXtCL8Vp_4`pf8WLWi3I)d4jG6&v)L7hyA%Ba+#Qsm?2*X-x(@n zC-iy1eixIGK)S^#F@A&GH}uufiY;o!zy37+N&9$icu_oE!p^K;&&b|jtm z?|SPhh8k@~vEZ+S8jS4o)j1g{Jr)lFGvA-ezB?q8_?ZKEd|xBTZafuV(zxD&Og@kv;Q zd)4;U_>1Q(mk}o#0p%D_7D#KNUWQ8!KO71uwl zJp!AYSrW*zua{TrSNRE+c$)%fT($)pW_L33UqwgT-r>>=UWXgYrI+os87Xy~Q2vbA7~>VoB|q*%$Hhy)$kM69oKisNOB_&#i>p)qzX z2J8{7S-R0CK&yHq%0)#oCKl!3?Z4DgL-4a~OC-g$qI~PGH%0*Sn@f+Cvdi#}o?tUr z!}p_X1b1+Kj-sgI$&0l;g01WY`xh_30O;hZlZGHGqIZR2ShqT3zH?()JKjSp6U>tO z`A6{9)MF~#iRy=wIt$im3wS+L%^<}P1_I>*}WcEfcN`USXMfavnDBiewew#Ni0|C8casU)sXu&F{v>yWaav-HrHpa zsjL}-LvpO9{9yAeUbbFP0eCWR0t9tE3mI3wub^dezG}sYQ~5?0971+43d?)kQ_Bu% zwL7+vKi;-jKVqO0nR@;3hIf6Sd?hVnrfV^c0gdi;z8PRvF?HiDc-zFBsIF2gl7zjG zz85ZEoGhJaEF(vO5;VL!Qk^E+EG7m*6|7w#bf6|6tP51Gf zit=f~QDL-^-=x&;UK0aUScBZa=H4t!Kye4Go&6WPPSA~1`&sGUW}*35Hz>CHHO z+xLF7d?AJR@=!8?*|dP5Rlw&`effr}~rwG8F2}WA_;Nmpzr>1QG+l7=#Vf6C$rekLZfByXWKd|hKbF55|%V%NqF=eJq+?#TICM+sJMyxd4 z02&kt1*@cT$^b(WF)=ZxT^KZ`kM}pa9RV-DfB$Y;i+gXBqod9EI$6R%=37k311g@l zun2uk9SlrObpXIndFa*Q8we?BWHb?r`R$)Q-9~3RW3P3zCHS-|N`OPI%RAc#%e1cr zDX;3rjN`w%PO(MRX@R?UAtao-L4W?hTOTeLLw%?^&NhvRqO^O=&K1>WfKpJD5A$a| zaMcF@^cNHq$h1W``83;iC)o*DE(iCEQP(JMpoQOcR|G3tOVbt8j_@-oQ_R?37ZoEJ z@4w{Cyd9t>2|cV@FR;Kz0&OS)AZCp}hBbV;RNdltbr+ZPi|gx7Ps&`ax!7|B&w{U^ zHcUzUy@_CAsxGUrwC>~O7MG1)tP0~cAD}+`S+oZ&T4}EtstPs!1Q<>MH6ea(c{a4* zr9Rlm$f&HMqIbU5#^w6dOybX^oNkjV6Tr9ALYfEL$!|`d`KHm>l=sdDRzaUL^HOBP z2JU+1Rt?}dX=jMh!SQTy0wN-m4?|%|N%%#jr52n0@r~;d&rNx8+H?H|io4cMo*YRKS_M8Ia{L$cO28Wc^BU~GEh6Yz1dV}RUGy?y zbZuEd0Bj3nx;sT?r>~R%#Wt*fKT=hDxNrx5RItCm3PM*w0wMFi01S(CpRxmlM!ewN z99m~#tDg>F+tMKzreQB^GG*!GS0vS!cryC<6!tQ@6&(n&f4`k7t4Ff2zk=hq2AA|T z>1Rz{(Glo=FKC!`8RgaB<{qD}*)a-AQC+;xH%QL3<< zYOlaBd3(37#AB%;t6M|75s|S8GANeMQ(|7=F8Hx1?hBiL_mC16Gytb`1qH>07g$V! zh$kM|4&MT9WLUs2#bcKf_z{HPY6k!&0T7i|T4AH10d|OzIDI5KEo(QBNH$Et*{(}U zdn7_IYRaPD^U~WOwgEjd(*CZ_VZihR4hyutxPYX_ol7l+l z7o)C^nQPTbl2W{)h|;TX9Co3-t}LGkcaO=b`f*K_=f8^BPCKHwgrkFBNr) zP1PvSpGLTW2rw?1>CMtC?)4U#ZSgw%R%}H_rx*mvmonxMLq-59NI`7;ol417UXjeLF<}ue4gn zEvwjaV1U)HU-3&!XaJUc~#4AVeL6QCYTk z!jY6pF3qm?SXPCBMuy1>8|O-9Sis>V!iTS!6Ckf!4FX(jOhP_K{clD~Vch*mGZGm#32LdGE6b`6^EJX z`h+3Kx@#blwJb1%`y9YNHhO(sr%tM zXSfsAW7iwr(h`74SVu3op~|9CZAv#KRZ1b>IvNmUF!;RBrWqooK3smf~ThRZZo&Tl3=}>44P^WXA z=SSrRS`85eqOD_tSpPad|55kqVNGxK`j3KSRKOZiy7}L>Y)7a4v?of{zY^vjK61UZ zz%2OSwTOV}g8fZ#aO9VApK!>o2mTse4$=)ClQI7z)V;x(?jb6reiyR3eLLth3<+Dk zC7R-cl)hj0fqO0hc&eGziH0F{DW!i=(Z3glh&**aSQGXJ%ra(5)DaKN?hinY{n-$j zcvP!3x>cLvXwuyNbDvfq!){!-%5O>vy^m}2dB34A`KBSC=6&2r^-rsD=5%i zu1C5{bxda6SZKdFuP0#BdF_gCZ9K$PbEmSpI*&dWIR0LK#k~|zJrTc$?V-waj>#qq0-)&^z!m7S-M9|TFTAap#sF>m7NJ>Vn{$Y$WGXv^-uZOG}dVY;D z2q}M#P*3OuEWE&?j6%gMsny&Z|EYH~C@l@a>Nv;e%@;Ea%thiGX&gqGS}yTY5UQ(D zLV)RoYt@{%bPS=Wg!Q-I8R>-gUICbco0W0lnTnHY=v3_LPxRQp5N^U&AHo03HDXbK zs}1+ZEC9{6&#?a}{yN$_t+5TPJI3NfBL#OH356MYRsvye7ZX#Vp6(wLPWV2@>$W>m zBKPU)DqUkU`Z&0Ho_YBRA4ZBOIZ-D}*}Q@l zV!8+@;-`Nl1FRLT!Iy|EUZb;PkEo43k=GHQ0JddH=S8B@723{*exbD8j(tKch_rH|56T&iGO&0{5{|Ld2ZrB z)R1ODAtDtRf;b_@e0w*eRpxz@i99pqBO+e@Xbou5)U>ZTE z22Kj2p@H}w8i`zXtlt+!v{_sLU|{-p`2*0w>x5}Ut<8Sr`*X7!MtP)H@BFgDC`*Nw zFQO!TJ*I`Zn`hDh4nbCt(Y$9?@2?JQ#R34ggvVIbA8*z&Uf)9>`PEb*De4i&=NLS- znsA6%WN{v^F&`hd-54O4paJN`9;-EV=moaA9zO8O{ zSk!pS<;$zelj=z^g6D@efUS2j*mG+<5=?cY2`$1Zi<$=$HkH@%xs4Civ@ZmVz5ndhO( z-G^TlX&tC(eBX+thP)cY!`QEPlpE`h4{~re&^L%IGBp{VFsnU}W^k2y(s+@&loe5C zCZVE-3qZDMmqW7g#}gi4nBe)T{g%lUYRrf#_iF{XnKBVQ?^EQL(=*aq^vK)9;yl^Q zUvIS?y+C6pZF489i+t|nmp5FVa_j|9n-*u?R&xnk9>nauFpZj>t5xWB=(8?kow-sI zp678Q?LIH|?Ys&on$&-WVUD&5g~v{5#}wze)<>ZKo2U?Yx?4@V|ADL5u&H#w`mBil zCBMPz#`j}Naan|1z`!XWBL;n`I~?L?_jvU&G1!luP*bu;@m)H2oy$k*Dq+r-lotW% z!&AZN)ewQ+m4%3XD2>eKffH!;#-7XMg7!N{Xdf!W*m;eY+2t%l5`TOlN~I~At;Stf zXxaS(&E%&KD4=TQ!~xRihEB6x6Tzkk%OqZFHO>;F98?fGd@g4iaT7{GLzxDK_Eah|Hm}rYEmk|u zHMM@yi-Fm)x>)Jlt#L{!l{T~##JXXVUkWyVh@2YJmB;Gg!6gCNmyz?OH(IhH_xLFc z&^@zYLl~Y7iBbO6j4JQ82Ild23x|THYJG+~rFwzZ7hzbjG|0!1gUYJ|pV(WqpfD-& zb1M$nOBNC$QrvK+bZG59l}hlqR_b(6=n3)0;b%o)>T>M0HADY+bYGZ)oT!a7a6+Ov zFXJbP-^09KmZ%1rL7EXTB%2Qe@VM;fku&6cymzkH?qW15!9KIIW^$M9;H)KI65LNm z1)Gx~avVa!=^j20M@mANQDEyqLnSbW%hP_naV6Of43Qo#HBDE}m2_FKY2<#gn%g{R zv(fabOT}K-?k3!dpQ^Rs^YNg(my>v5Qtff1ul?rD`ps^x)XAoGEjb+>9rchj%0Lan zUp+rN)(tJWsb9atwM;%T?0$VEFbj`LP*^qNRf?h^4$*vJkt`rdiC);XNj_@*qM)$p zTrVCt(%_V8`l5uBCW37wGQXq<%{#I@$+wz<%RRfGa4*#|3166>tcOK`-dmP2v7-nH z7y!?c$H9^YQ1qy-Amy9zvB8(x;Xp~m)&W6CrFy}L6-6FUg~_bQzK>NvCGOF=y86_b zxa_&=-+0n~hsspYzLAC8l*Ktx#%Zg#(!~zRE>m#hg5p=1^S+8w1Iq%Yf|E=3WzZeX zey*wy$XRQEqZ=2J)D#pklNwiQuG4G4xe0C-WkLX1`PA#STQg?ZiD{%7CH|cL%R2H- znp8dTAZ=0?n-C^PAjOVa!w|B5RCv#05Zf2B-t%7~mUlnF4Qm6yII2Rg*=Ux?ARf73 zF&FF0eIckrn+H92KgqSSE}y36o^oI9LJ$-5BgCwD5c_eX#wq5}BIawvT7 zlLC>7F1n94;#RsHMa%PN21d5^Wo?7kxbQ~SAPA9 z{pr)EUH?%_emV&WLk;?Uj#OkUt8*cGNhZ`Ywx_FmADu|tA52^TDVeb*n)unHavt!9 z`KTzbr<|di{Fg+3=%z@>a8eMq+zoEKYQPM0)>RGAaJ00s!G0z0-xqBS3qMwSo>4A7 zX}B0%vVbQr=TWe|B-JqE*=?rPUs^Li5!UH!f*Ns`bvI8cv)+y=a&@B53HnKriu@(# zFllPxclb^QUY!uUpmsT;%Hw(SLM6hnA^Xnrpegb1eeKwOiZX 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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

Model Architecture

-## Architecture +### Encoder +The encoder is composed of a stack of identical layers. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, positionwise fully connected feed-forward network. Each encoder consists of two major components: a self-attention mechanism and a feed-forward neural network. The self-attention mechanism accepts input encodings from the previous encoder and weights their relevance to each other to generate output encodings. The feed-forward neural network further processes each output encoding individually. These output encodings are then passed to the next encoder as its input, as well as to the decoders. + +### Decoder +The decoder is also composed of a stack of identical layers. In addition to the two sub-layers in each encoder layer, the decoder inserts a third sub-layer, which performs multi-head attention over the output of the encoder stack. The decoder functions in a similar fashion to the encoder, but an additional attention mechanism is inserted which instead draws relevant information from the encodings generated by the encoders. This mechanism can also be called the encoder-decoder attention. + +### Attention +#### Scaled Dot-Product Attention +The input consists of queries and keys of dimension dk, and values of dimension dv. We compute the dot products of the query with all keys, divide each by √dk, and apply a softmax function to obtain the weights on the values. + +> Attention(Q, K, V) = softmax(QKT / √dk) * V + +#### Multi-Head Attention +Instead of performing a single attention function with dmodel-dimensional keys, values and queries, it is beneficial to linearly project the queries, keys and values h times with different, learned linear projections to dk, dk and dv dimensions, respectively. + +Multi-head attention allows the model to jointly attend to information from different representation +subspaces at different positions. With a single attention head, averaging inhibits this. + +> MultiHead(Q, K, V) = Concat(head1, ..., headh) * WO + +where, + +> headi = Attention(Q * WiQ, K * WiK, V * WiV) + +where the projections are parameter matrices. + +#### Masked Attention +It may be necessary to cut out attention links between some word-pairs. For example, the decoder for token position +𝑡 should not have access to token position 𝑡+1. + +> MaskedAttention(Q, K, V) = softmax(M + (QKT / √dk)) * V + +### Feed-Forward Network +Each of the layers in the encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This +consists of two linear transformations with a ReLU activation in between. +> FFN(x) = (max(0, (x * W1) + b1) * W2) + b2 + +### Positional Encoding +A positional encoding is a fixed-size vector representation that encapsulates the relative positions of tokens within a target sequence: it provides the transformer model with information about where the words are in the input sequence. + +The sine and cosine functions of different frequencies: +> PE(pos,2i) = sin(pos/100002i/dmodel) + +> PE(pos,2i+1) = cos(pos/100002i/dmodel) ## Implementation ### Theory @@ -19,3 +63,14 @@ allowing the signal for key tokens to be amplified and less important tokens to ### Tensorflow and Keras ### PyTorch + +## Application +The transformer has had great success in natural language processing (NLP). Many large language models such as GPT-2, GPT-3, GPT-4, Claude, BERT, XLNet, RoBERTa and ChatGPT demonstrate the ability of transformers to perform a wide variety of such NLP-related tasks, and have the potential to find real-world applications. + +These may include: +- Machine translation +- Document summarization +- Text generation +- Biological sequence analysis +- Computer code generation +- Video analysis From 35357d2fe3f6650faca3d0f19327fe4fa7e8629d Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 17:04:07 +0530 Subject: [PATCH 301/405] Update Transformers.md Added Tensorflow implementation --- contrib/machine-learning/Transformers.md | 136 ++++++++++++++++++++++- 1 file changed, 134 insertions(+), 2 deletions(-) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index 49a1b97..a5a56ec 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -58,12 +58,144 @@ Text is converted to numerical representations called tokens, and each token is At each layer, each token is then contextualized within the scope of the context window with other tokens via a parallel multi-head attention mechanism allowing the signal for key tokens to be amplified and less important tokens to be diminished. -### HuggingFace +### Tensorflow +Tensorflow provides the transformer encoder and decoder block that can be implemented by the specification of the user. Although, the transformer is not provided as a standalone to be imported and executed, the user has to create the model first. They also have a tutorial on how to implement the transformer from scratch for machine translation and can be found [here](https://www.tensorflow.org/text/tutorials/transformer). -### Tensorflow and Keras +More information on [encoder](https://www.tensorflow.org/api_docs/python/tfm/nlp/layers/TransformerEncoderBlock) and [decoder](https://www.tensorflow.org/api_docs/python/tfm/nlp/layers/TransformerDecoderBlock) block mentioned in the code. + +Imports: +``` +import tensorflow as tf +import tensorflow_models as tfm +``` + +Adding word embeddings and positional encoding: +``` +class PositionalEmbedding(tf.keras.layers.Layer): + def __init__(self, vocab_size, d_model): + super().__init__() + self.d_model = d_model + self.embedding = tf.keras.layers.Embedding(vocab_size, d_model, mask_zero=True) + self.pos_encoding = tfm.nlp.layers.RelativePositionEmbedding(hidden_size=d_model) + + def compute_mask(self, *args, **kwargs): + return self.embedding.compute_mask(*args, **kwargs) + + def call(self, x): + length = tf.shape(x)[1] + x = self.embedding(x) + x = x + self.pos_encoding[tf.newaxis, :length, :] + return x +``` + +Creating the encoder for the transformer: +``` +class Encoder(tf.keras.layers.Layer): + def __init__(self, num_layers, d_model, num_heads, + dff, vocab_size, dropout_rate=0.1): + super().__init__() + + self.d_model = d_model + self.num_layers = num_layers + + self.pos_embedding = PositionalEmbedding( + vocab_size=vocab_size, d_model=d_model) + + self.enc_layers = [ + tfm.nlp.layers.TransformerEncoderBlock(output_last_dim=d_model, + num_attention_heads=num_heads, + inner_dim=dff, + inner_activation="relu", + inner_dropout=dropout_rate) + for _ in range(num_layers)] + self.dropout = tf.keras.layers.Dropout(dropout_rate) + + def call(self, x): + x = self.pos_embedding(x, length=2048) + x = self.dropout(x) + + for i in range(self.num_layers): + x = self.enc_layers[i](x) + + return x +``` + +Creating the decoder for the transformer: +``` +class Decoder(tf.keras.layers.Layer): + def __init__(self, num_layers, d_model, num_heads, dff, vocab_size, + dropout_rate=0.1): + super(Decoder, self).__init__() + + self.d_model = d_model + self.num_layers = num_layers + + self.pos_embedding = PositionalEmbedding(vocab_size=vocab_size, + d_model=d_model) + self.dropout = tf.keras.layers.Dropout(dropout_rate) + self.dec_layers = [ + tfm.nlp.layers.TransformerDecoderBlock(num_attention_heads=num_heads, + intermediate_size=dff, + intermediate_activation="relu", + dropout_rate=dropout_rate) + for _ in range(num_layers)] + + def call(self, x, context): + x = self.pos_embedding(x) + x = self.dropout(x) + + for i in range(self.num_layers): + x = self.dec_layers[i](x, context) + + return x +``` + +Combining the encoder and decoder to create the transformer: +``` +class Transformer(tf.keras.Model): + def __init__(self, num_layers, d_model, num_heads, dff, + input_vocab_size, target_vocab_size, dropout_rate=0.1): + super().__init__() + self.encoder = Encoder(num_layers=num_layers, d_model=d_model, + num_heads=num_heads, dff=dff, + vocab_size=input_vocab_size, + dropout_rate=dropout_rate) + + self.decoder = Decoder(num_layers=num_layers, d_model=d_model, + num_heads=num_heads, dff=dff, + vocab_size=target_vocab_size, + dropout_rate=dropout_rate) + + self.final_layer = tf.keras.layers.Dense(target_vocab_size) + + def call(self, inputs): + context, x = inputs + + context = self.encoder(context) + x = self.decoder(x, context) + logits = self.final_layer(x) + + return logits +``` + +Model initialization that be used for training and inference: +``` +transformer = Transformer( + num_layers=num_layers, + d_model=d_model, + num_heads=num_heads, + dff=dff, + input_vocab_size=tokenizers.pt.get_vocab_size().numpy(), + target_vocab_size=tokenizers.en.get_vocab_size().numpy(), + dropout_rate=dropout_rate +) +``` ### PyTorch + +### HuggingFace + ## Application The transformer has had great success in natural language processing (NLP). Many large language models such as GPT-2, GPT-3, GPT-4, Claude, BERT, XLNet, RoBERTa and ChatGPT demonstrate the ability of transformers to perform a wide variety of such NLP-related tasks, and have the potential to find real-world applications. From f56131349d1ad0e6e27209ea3d9217c13e695e8e Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 17:13:19 +0530 Subject: [PATCH 302/405] Update Transformers.md Added python tag to code blocks --- contrib/machine-learning/Transformers.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index a5a56ec..ffdea05 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -64,13 +64,13 @@ Tensorflow provides the transformer encoder and decoder block that can be implem More information on [encoder](https://www.tensorflow.org/api_docs/python/tfm/nlp/layers/TransformerEncoderBlock) and [decoder](https://www.tensorflow.org/api_docs/python/tfm/nlp/layers/TransformerDecoderBlock) block mentioned in the code. Imports: -``` +```python import tensorflow as tf import tensorflow_models as tfm ``` Adding word embeddings and positional encoding: -``` +```python class PositionalEmbedding(tf.keras.layers.Layer): def __init__(self, vocab_size, d_model): super().__init__() @@ -89,7 +89,7 @@ class PositionalEmbedding(tf.keras.layers.Layer): ``` Creating the encoder for the transformer: -``` +```python class Encoder(tf.keras.layers.Layer): def __init__(self, num_layers, d_model, num_heads, dff, vocab_size, dropout_rate=0.1): @@ -121,7 +121,7 @@ class Encoder(tf.keras.layers.Layer): ``` Creating the decoder for the transformer: -``` +```python class Decoder(tf.keras.layers.Layer): def __init__(self, num_layers, d_model, num_heads, dff, vocab_size, dropout_rate=0.1): @@ -151,7 +151,7 @@ class Decoder(tf.keras.layers.Layer): ``` Combining the encoder and decoder to create the transformer: -``` +```python class Transformer(tf.keras.Model): def __init__(self, num_layers, d_model, num_heads, dff, input_vocab_size, target_vocab_size, dropout_rate=0.1): @@ -179,7 +179,7 @@ class Transformer(tf.keras.Model): ``` Model initialization that be used for training and inference: -``` +```python transformer = Transformer( num_layers=num_layers, d_model=d_model, From ca9c6a9a1f23d1e6b5901954c8a5c5c772bd80a7 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 17:44:28 +0530 Subject: [PATCH 303/405] Update Transformers.md Added PyTorch implementation --- contrib/machine-learning/Transformers.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index ffdea05..cb90cf1 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -56,7 +56,9 @@ The sine and cosine functions of different frequencies: ### Theory Text is converted to numerical representations called tokens, and each token is converted into a vector via looking up from a word embedding table. At each layer, each token is then contextualized within the scope of the context window with other tokens via a parallel multi-head attention mechanism -allowing the signal for key tokens to be amplified and less important tokens to be diminished. +allowing the signal for key tokens to be amplified and less important tokens to be diminished. + +The transformer uses an encoder-decoder architecture. The encoder extracts features from an input sentence, and the decoder uses the features to produce an output sentence. Some architectures use full encoders and decoders, autoregressive encoders and decoders, or combination of both. This depends on the usage and context of the input. ### Tensorflow Tensorflow provides the transformer encoder and decoder block that can be implemented by the specification of the user. Although, the transformer is not provided as a standalone to be imported and executed, the user has to create the model first. They also have a tutorial on how to implement the transformer from scratch for machine translation and can be found [here](https://www.tensorflow.org/text/tutorials/transformer). @@ -192,10 +194,30 @@ transformer = Transformer( ``` ### PyTorch +Unlike Tensorflow, PyTorch provides the full implementation of the transformer model that can be executed on the go. More information can be found [here](https://pytorch.org/docs/stable/_modules/torch/nn/modules/transformer.html#Transformer). A full implementation of the model can be found [here](https://github.com/pytorch/examples/tree/master/word_language_model). +Imports: +```python +import torch +import torch.nn as nn +``` + +Initializing the model: +```python +transformer = nn.Transformer(nhead=16, num_encoder_layers=8) +``` + +Sample Implementation: +```python +src = torch.rand((10, 32, 512)) +tgt = torch.rand((20, 32, 512)) + +output = transformer(src, tgt) +``` ### HuggingFace + ## Application The transformer has had great success in natural language processing (NLP). Many large language models such as GPT-2, GPT-3, GPT-4, Claude, BERT, XLNet, RoBERTa and ChatGPT demonstrate the ability of transformers to perform a wide variety of such NLP-related tasks, and have the potential to find real-world applications. From 27dcfba508722dc35a96544e259cd49c9e3a7f9a Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:03:35 +0530 Subject: [PATCH 304/405] 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..3f27246 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) +- [Introduction to Seaborn and Installation](seaborn-intro.md) From 273515a8c22a17fc9af4eefcab30f42d6065a31c Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:04:45 +0530 Subject: [PATCH 305/405] Create seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/plotting-visualization/seaborn-intro.md diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -0,0 +1 @@ + From 01552110695fc0d9b39797d983946483d2620a3c Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:12:32 +0530 Subject: [PATCH 306/405] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 8b13789..4e28b6a 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -1 +1,4 @@ +Seaborn is a Python data visualization library based on Matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics. +# Seaborn Installation +Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). From b81223f8e8e19c67078d835d7679e66036356fb4 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:12:50 +0530 Subject: [PATCH 307/405] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 4e28b6a..8b0d869 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -1,4 +1,4 @@ Seaborn is a Python data visualization library based on Matplotlib. It provides a high-level interface for drawing attractive and informative statistical graphics. -# Seaborn Installation +## Seaborn Installation Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). From 32fcb9484e26f9ae38e5d6b82a338190b8e83358 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:15:06 +0530 Subject: [PATCH 308/405] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 8b0d869..bbbfec8 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -2,3 +2,10 @@ Seaborn is a Python data visualization library based on Matplotlib. It provides ## Seaborn Installation Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). +Below are the steps to install and setup seaborn + +1. **Install Seaborn**: Open your terminal or command prompt and run the following command to install Seaborn using `pip`: + +```bash +pip install seaborn +``` From 56467e57bb3ac0b91bde6d504813e44e983a80ab Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:19:06 +0530 Subject: [PATCH 309/405] Update seaborn-intro.md --- .../plotting-visualization/seaborn-intro.md | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index bbbfec8..0375db2 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -2,10 +2,26 @@ Seaborn is a Python data visualization library based on Matplotlib. It provides ## Seaborn Installation Before installing Matplotlib, ensure you have Python installed on your system. You can download and install Python from the [official Python website](https://www.python.org/). -Below are the steps to install and setup seaborn -1. **Install Seaborn**: Open your terminal or command prompt and run the following command to install Seaborn using `pip`: +Below are the steps to install and setup Seaborn: + +1. Open your terminal or command prompt and run the following command to install Seaborn using `pip`: ```bash pip install seaborn ``` + +2. The basic invocation of `pip` will install seaborn and, if necessary, its mandatory dependencies. It is possible to include optional dependencies that give access to a few advanced features: +```bash +pip install seaborn[stats] +``` + +3. The library is also included as part of the Anaconda distribution, and it can be installed with `conda`: +```bash +conda install seaborn +``` + +4. As the main Anaconda repository can be slow to add new releases, you may prefer using the conda-forge channel: +```bash +conda install seaborn -c conda-forge +``` From bdab7d9bb5154dc23e2b9b350900a5b148b6d3e1 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 18:29:50 +0530 Subject: [PATCH 310/405] Update seaborn-intro.md --- contrib/plotting-visualization/seaborn-intro.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-intro.md b/contrib/plotting-visualization/seaborn-intro.md index 0375db2..6e0a7d8 100644 --- a/contrib/plotting-visualization/seaborn-intro.md +++ b/contrib/plotting-visualization/seaborn-intro.md @@ -25,3 +25,17 @@ conda install seaborn ```bash conda install seaborn -c conda-forge ``` + +## Dependencies +### Supported Python versions +- Python 3.8+ + +### Mandatory Dependencies + - [numpy](https://numpy.org/) + - [pandas](https://pandas.pydata.org/) + - [matplotlib](https://matplotlib.org/) + +### Optional Dependencies + - [statsmodels](https://www.statsmodels.org/stable/index.html) for advanced regression plots + - [scipy](https://scipy.org/) for clustering matrices and some advanced options + - [fastcluster](https://pypi.org/project/fastcluster/) for faster clustering of large matrices From d81e875a3235d7c9f50f9a42bb359bf80d3146a1 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 18:32:47 +0530 Subject: [PATCH 311/405] Update Transformers.md Added outputs for PyTorch and HuggingFace implementation --- contrib/machine-learning/Transformers.md | 114 ++++++++++++++++++++++- 1 file changed, 112 insertions(+), 2 deletions(-) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index cb90cf1..e9e50e8 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -61,6 +61,8 @@ allowing the signal for key tokens to be amplified and less important tokens to The transformer uses an encoder-decoder architecture. The encoder extracts features from an input sentence, and the decoder uses the features to produce an output sentence. Some architectures use full encoders and decoders, autoregressive encoders and decoders, or combination of both. This depends on the usage and context of the input. ### Tensorflow +TensorFlow is a free and open-source software library for machine learning and artificial intelligence. It can be used across a range of tasks but has a particular focus on training and inference of deep neural networks. It was developed by the Google Brain team for Google's internal use in research and production. + Tensorflow provides the transformer encoder and decoder block that can be implemented by the specification of the user. Although, the transformer is not provided as a standalone to be imported and executed, the user has to create the model first. They also have a tutorial on how to implement the transformer from scratch for machine translation and can be found [here](https://www.tensorflow.org/text/tutorials/transformer). More information on [encoder](https://www.tensorflow.org/api_docs/python/tfm/nlp/layers/TransformerEncoderBlock) and [decoder](https://www.tensorflow.org/api_docs/python/tfm/nlp/layers/TransformerDecoderBlock) block mentioned in the code. @@ -193,7 +195,22 @@ transformer = Transformer( ) ``` +Sample: +```python +src = tf.random.uniform((64, 40)) +tgt = tf.random.uniform((64, 50)) + +output = transformer((src, tgt)) +``` + +O/P: +``` + +``` + ### PyTorch +PyTorch is a machine learning library based on the Torch library, used for applications such as computer vision and natural language processing, originally developed by Meta AI and now part of the Linux Foundation umbrella. + Unlike Tensorflow, PyTorch provides the full implementation of the transformer model that can be executed on the go. More information can be found [here](https://pytorch.org/docs/stable/_modules/torch/nn/modules/transformer.html#Transformer). A full implementation of the model can be found [here](https://github.com/pytorch/examples/tree/master/word_language_model). Imports: @@ -207,7 +224,7 @@ Initializing the model: transformer = nn.Transformer(nhead=16, num_encoder_layers=8) ``` -Sample Implementation: +Sample: ```python src = torch.rand((10, 32, 512)) tgt = torch.rand((20, 32, 512)) @@ -215,8 +232,101 @@ tgt = torch.rand((20, 32, 512)) output = transformer(src, tgt) ``` -### HuggingFace +O/P: +``` +tensor([[[ 0.2938, -0.4824, -0.7816, ..., 0.0742, 0.5162, 0.3632], + [-0.0786, -0.5241, 0.6384, ..., 0.3462, -0.0618, 0.9943], + [ 0.7827, 0.1067, -0.1637, ..., -1.7730, -0.3322, -0.0029], + ..., + [-0.3202, 0.2341, -0.0896, ..., -0.9714, -0.1251, -0.0711], + [-0.1663, -0.5047, -0.0404, ..., -0.9339, 0.3963, 0.1018], + [ 1.2834, -0.4400, 0.0486, ..., -0.6876, -0.4752, 0.0180]], + [[ 0.9869, -0.7384, -1.0704, ..., -0.9417, 1.3279, -0.1665], + [ 0.3445, -0.2454, -0.3644, ..., -0.4856, -1.1004, -0.6819], + [ 0.7568, -0.3151, -0.5034, ..., -1.2081, -0.7119, 0.3775], + ..., + [-0.0451, -0.7596, 0.0168, ..., -0.8267, -0.3272, 1.0457], + [ 0.3150, -0.6588, -0.1840, ..., 0.1822, -0.0653, 0.9053], + [ 0.8692, -0.3519, 0.3128, ..., -1.8446, -0.2325, -0.8662]], + + [[ 0.9719, -0.3113, 0.4637, ..., -0.4422, 1.2348, 0.8274], + [ 0.3876, -0.9529, -0.7810, ..., -0.5843, -1.1439, -0.3366], + [-0.5774, 0.3789, -0.2819, ..., -1.4057, 0.4352, 0.1474], + ..., + [ 0.6899, -0.1146, -0.3297, ..., -1.7059, -0.1750, 0.4203], + [ 0.3689, -0.5174, -0.1253, ..., 0.1417, 0.4159, 0.7560], + [ 0.5024, -0.7996, 0.1592, ..., -0.8344, -1.1125, 0.4736]], + + ..., + + [[ 0.0704, -0.3971, -0.2768, ..., -1.9929, 0.8608, 1.2264], + [ 0.4013, -0.0962, -0.0965, ..., -0.4452, -0.8682, -0.4593], + [ 0.1656, 0.5224, -0.1723, ..., -1.5785, 0.3219, 1.1507], + ..., + [-0.9443, 0.4653, 0.2936, ..., -0.9840, -0.0142, -0.1595], + [-0.6544, -0.3294, -0.0803, ..., 0.1623, -0.5061, 0.9824], + [-0.0978, -1.0023, -0.6915, ..., -0.2296, -0.0594, -0.4715]], + + [[ 0.6531, -0.9285, -0.0331, ..., -1.1481, 0.7768, -0.7321], + [ 0.3325, -0.6683, -0.6083, ..., -0.4501, 0.2289, 0.3573], + [-0.6750, 0.4600, -0.8512, ..., -2.0097, -0.5159, 0.2773], + ..., + [-1.4356, -1.0135, 0.0081, ..., -1.2985, -0.3715, -0.2678], + [ 0.0546, -0.2111, -0.0965, ..., -0.3822, -0.4612, 1.6217], + [ 0.7700, -0.5309, -0.1754, ..., -2.2807, -0.0320, -1.5551]], + + [[ 0.2399, -0.9659, 0.1086, ..., -1.1756, 0.4063, 0.0615], + [-0.2202, -0.7972, -0.5024, ..., -0.9126, -1.5248, 0.2418], + [ 0.5215, 0.4540, 0.0036, ..., -0.2135, 0.2145, 0.6638], + ..., + [-0.2190, -0.4967, 0.7149, ..., -0.3324, 0.3502, 1.0624], + [-0.0108, -0.9205, -0.1315, ..., -1.0153, 0.2989, 1.1415], + [ 1.1284, -0.6560, 0.6755, ..., -1.2157, 0.8580, -0.5022]]], + grad_fn=) +``` +``` +>> output.shape +torch.Size([20, 32, 512]) +``` + +### HuggingFace +Hugging Face, Inc. is a French-American company incorporated under the Delaware General Corporation Law and based in New York City that develops computation tools for building applications using machine learning. + +It has a wide-range of models that can implemented in Tensorflow, PyTorch and other development backends as well. The models are already trained on a dataset and can be pretrained on custom dataset for customized use, according to the user. The information for training the model and loading the pretrained model can be found [here](https://huggingface.co/docs/transformers/en/training). + +In HuggingFace, `pipeline` is used to run inference from the trained model available in the Hub. This is very beginner friendly. The model is downloaded to the local system on running the script before running the inference. It has to be made sure that the model downloaded does not exceed your available data plan. + +Imports: +```python +from transformers import pipeline +``` + +Initialization: + +The model used here is BART (large) which was trained on MultiNLI dataset, which consist of sentence paired with its textual entailment. +```python +classifier = pipeline(model="facebook/bart-large-mnli") +``` + +Sample: + +The first argument is the sentence which needs to be analyzed. The second argument, `candidate_labels`, is the list of labels which most likely the first argument sentence belongs to. The output dictionary will have a key as `score`, where the highest index is the textual entailment of the sentence with the index of the label in the list. + +```python +output = classifier( + "I need to leave but later", + candidate_labels=["urgent", "not urgent", "sleep"], +) +``` + +O/P: + +``` +{'sequence': 'I need to leave but later', + 'labels': ['not urgent', 'urgent', 'sleep'], + 'scores': [0.8889380097389221, 0.10631518065929413, 0.00474683940410614]} +``` ## Application The transformer has had great success in natural language processing (NLP). Many large language models such as GPT-2, GPT-3, GPT-4, Claude, BERT, XLNet, RoBERTa and ChatGPT demonstrate the ability of transformers to perform a wide variety of such NLP-related tasks, and have the potential to find real-world applications. From 251c4d86894b26e113b1b4426aeaf412c0b4c977 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 18:43:19 +0530 Subject: [PATCH 312/405] Update Transformers.md Added Tensorflow output and fixed wrong mentions --- contrib/machine-learning/Transformers.md | 93 +++++++++++++++++++++++- 1 file changed, 91 insertions(+), 2 deletions(-) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index e9e50e8..d30bd63 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -189,8 +189,8 @@ transformer = Transformer( d_model=d_model, num_heads=num_heads, dff=dff, - input_vocab_size=tokenizers.pt.get_vocab_size().numpy(), - target_vocab_size=tokenizers.en.get_vocab_size().numpy(), + input_vocab_size=64, + target_vocab_size=64, dropout_rate=dropout_rate ) ``` @@ -205,7 +205,96 @@ output = transformer((src, tgt)) O/P: ``` + +``` +``` +>>> output.shape +TensorShape([64, 50, 64]) ``` ### PyTorch From 44303ff8e04e496e0f545d92a60e9758b971e314 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 18:45:07 +0530 Subject: [PATCH 313/405] Update Transformers.md Extended Introduction --- contrib/machine-learning/Transformers.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index d30bd63..97346bd 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -1,8 +1,9 @@ # Transformers ## Introduction A transformer is a deep learning architecture developed by Google and based on the multi-head attention mechanism. It is based on the softmax-based attention -mechanism. Before transformers, predecessors of attention mechanism were added to gated recurrent neural networks, such as LSTMs and gated recurrent units (GRUs), which -processed datasets sequentially. Dependency on previous token computations prevented them from being able to parallelize the attention mechanism. +mechanism. Before transformers, predecessors of attention mechanism were added to gated recurrent neural networks, such as LSTMs and gated recurrent units (GRUs), which processed datasets sequentially. Dependency on previous token computations prevented them from being able to parallelize the attention mechanism. + +Transformers are a revolutionary approach to natural language processing (NLP). Unlike older models, they excel at understanding long-range connections between words. This "attention" mechanism lets them grasp the context of a sentence, making them powerful for tasks like machine translation, text summarization, and question answering. Introduced in 2017, transformers are now the backbone of many large language models, including tools you might use every day. Their ability to handle complex relationships in language is fueling advancements in AI across various fields. ## Model Architecture

Model Architecture

From a8e60cf4b1121311363846e4ca06d0967e4652fb Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:29:42 +0530 Subject: [PATCH 314/405] 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 3f27246..96615db 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -4,3 +4,4 @@ - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) - [Introduction to Seaborn and Installation](seaborn-intro.md) +- [Getting started with Seaborn](seaborn-basics.md) From 4446a85d1f81f8a18d75f5a29cc9a1733bd800ab Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:30:11 +0530 Subject: [PATCH 315/405] Create seaborn-basics.md --- contrib/plotting-visualization/seaborn-basics.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 contrib/plotting-visualization/seaborn-basics.md diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -0,0 +1 @@ + From 6aecf49fd04b8777365b7173fa47d59c86e5e0aa Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:47:43 +0530 Subject: [PATCH 316/405] Update seaborn-basics.md --- .../plotting-visualization/seaborn-basics.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 8b13789..603f074 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -1 +1,19 @@ +Seaborn helps you explore and understand your data. Its plotting functions operate on dataframes and arrays containing whole datasets and internally perform the necessary semantic mapping and statistical aggregation to produce informative plots. Its dataset-oriented, declarative API lets you focus on what the different elements of your plots mean, rather than on the details of how to draw them. +Here’s an example of what seaborn can do: +```Python +# Import seaborn +import seaborn as sns + +# Apply the default theme +sns.set_theme() + +# Load an example dataset +tips = sns.load_dataset("tips") + +# Create a visualization +sns.relplot( + data=tips, + x="total_bill", y="tip", col="time", + hue="smoker", style="smoker", size="size", +) From 03920cd7501a05316e9a143f0dc7d0406e6117c1 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:48:58 +0530 Subject: [PATCH 317/405] Add files via upload --- .../images/seaborn-basics1.png | Bin 0 -> 53821 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/plotting-visualization/images/seaborn-basics1.png diff --git a/contrib/plotting-visualization/images/seaborn-basics1.png b/contrib/plotting-visualization/images/seaborn-basics1.png new file mode 100644 index 0000000000000000000000000000000000000000..bedcee91b8855491cbc3c50ac7af23bf330dca99 GIT binary patch literal 53821 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
4;gz7aU{XPL0=T|cAUgk!XKT9QnA3dw>U}#EJ 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 z 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 Ss(20qenEt#g-Qi6$ literal 0 HcmV?d00001 From ef42e881851eb20f9a9c8c28a9afdcff89c7fb67 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Fri, 31 May 2024 20:49:03 +0530 Subject: [PATCH 318/405] 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 319/405] 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 5ffcbf21346cc0a56b873c5b11d97e349fa379fc Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:57:53 +0530 Subject: [PATCH 320/405] Update seaborn-basics.md --- .../plotting-visualization/seaborn-basics.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 603f074..41d76a4 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -17,3 +17,23 @@ sns.relplot( x="total_bill", y="tip", col="time", hue="smoker", style="smoker", size="size", ) +``` +Below is the output for the above code snippet: + +![Seaborn intro image](images/seaborn-basics.png) + +```Python +# Load an example dataset +tips = sns.load_dataset("tips") +``` +Most code in the docs will use the `load_dataset()` function to get quick access to an example dataset. There’s nothing special about these datasets: they are just pandas data frames, and we could have loaded them with `pandas.read_csv()` or build them by hand. Most of the examples in the documentation will specify data using pandas data frames, but Seaborn is very flexible about the data structures that it accepts. + +```Python +# Create a visualization +sns.relplot( + data=tips, + x="total_bill", y="tip", col="time", + hue="smoker", style="smoker", size="size", +) +``` +This plot shows the relationship between five variables in the tips dataset using a single call to the seaborn function `relplot()`. Notice how we provided only the names of the variables and their roles in the plot. Unlike when using matplotlib directly, it wasn’t necessary to specify attributes of the plot elements in terms of the color values or marker codes. Behind the scenes, seaborn handled the translation from values in the dataframe to arguments that Matplotlib understands. This declarative approach lets you stay focused on the questions that you want to answer, rather than on the details of how to control matplotlib. From 4a7e00b61aa225b133fc702d23d70b3a74b70adf Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 20:58:54 +0530 Subject: [PATCH 321/405] Update seaborn-basics.md --- contrib/plotting-visualization/seaborn-basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 41d76a4..147083b 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -20,7 +20,7 @@ sns.relplot( ``` Below is the output for the above code snippet: -![Seaborn intro image](images/seaborn-basics.png) +![Seaborn intro image](images/seaborn-basics1.png) ```Python # Load an example dataset From ccaa3770e7b308fe25410124dedcdea772ebe504 Mon Sep 17 00:00:00 2001 From: Rishi Goswami <92781956+rishig2003@users.noreply.github.com> Date: Fri, 31 May 2024 21:04:10 +0530 Subject: [PATCH 322/405] Update seaborn-basics.md --- contrib/plotting-visualization/seaborn-basics.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/plotting-visualization/seaborn-basics.md b/contrib/plotting-visualization/seaborn-basics.md index 147083b..42df552 100644 --- a/contrib/plotting-visualization/seaborn-basics.md +++ b/contrib/plotting-visualization/seaborn-basics.md @@ -26,7 +26,7 @@ Below is the output for the above code snippet: # Load an example dataset tips = sns.load_dataset("tips") ``` -Most code in the docs will use the `load_dataset()` function to get quick access to an example dataset. There’s nothing special about these datasets: they are just pandas data frames, and we could have loaded them with `pandas.read_csv()` or build them by hand. Most of the examples in the documentation will specify data using pandas data frames, but Seaborn is very flexible about the data structures that it accepts. +Most code in the docs will use the `load_dataset()` function to get quick access to an example dataset. There’s nothing special about these datasets: they are just pandas data frames, and we could have loaded them with `pandas.read_csv()` or build them by hand. Many users specify data using pandas data frames, but Seaborn is very flexible about the data structures that it accepts. ```Python # Create a visualization @@ -36,4 +36,4 @@ sns.relplot( hue="smoker", style="smoker", size="size", ) ``` -This plot shows the relationship between five variables in the tips dataset using a single call to the seaborn function `relplot()`. Notice how we provided only the names of the variables and their roles in the plot. Unlike when using matplotlib directly, it wasn’t necessary to specify attributes of the plot elements in terms of the color values or marker codes. Behind the scenes, seaborn handled the translation from values in the dataframe to arguments that Matplotlib understands. This declarative approach lets you stay focused on the questions that you want to answer, rather than on the details of how to control matplotlib. +This plot shows the relationship between five variables in the tips dataset using a single call to the seaborn function `relplot()`. Notice how only the names of the variables and their roles in the plot are provided. Unlike when using matplotlib directly, it wasn’t necessary to specify attributes of the plot elements in terms of the color values or marker codes. Behind the scenes, seaborn handled the translation from values in the dataframe to arguments that Matplotlib understands. This declarative approach lets you stay focused on the questions that you want to answer, rather than on the details of how to control matplotlib. From d20b8efca6cb73ef7543c0db41c34aede656e88f Mon Sep 17 00:00:00 2001 From: Jaya-Prakash-17 Date: Sat, 1 Jun 2024 00:41:56 +0530 Subject: [PATCH 323/405] Content Added: Protocols --- contrib/advanced-python/index.md | 1 + contrib/advanced-python/protocols.md | 243 +++++++++++++++++++++++++++ 2 files changed, 244 insertions(+) create mode 100644 contrib/advanced-python/protocols.md diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index b95e4b9..3945721 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) +- [Protocols](protocols.md) diff --git a/contrib/advanced-python/protocols.md b/contrib/advanced-python/protocols.md new file mode 100644 index 0000000..9b5e74a --- /dev/null +++ b/contrib/advanced-python/protocols.md @@ -0,0 +1,243 @@ +# Protocols in Python +Python can establish informal interfaces using protocols In order to improve code structure, reusability, and type checking. Protocols allow for progressive adoption and are more flexible than standard interfaces in other programming languages like JAVA, which are tight contracts that specify the methods and attributes a class must implement. + +>Before going into depth of this topic let's understand another topic which is pre-requisite od this topic \#TypingModule + +## Typing Module +This is a module in python which provides +1. Provides classes, functions, and type aliases. +2. Allows adding type annotations to our code. +3. Enhances code readability. +4. Helps in catching errors early. + +### Type Hints in Python: +Type hints allow you to specify the expected data types of variables, function parameters, and return values. This can improve code readability and help with debugging. + +Here is a simple function that adds two numbers: +```python +def add(a,b): + return a + b +add(10,20) +``` +>Output: 30 + +While this works fine, adding type hints makes the code more understandable and serves as documentation: + +```python +def add(a:int, b:int)->int: + return a + b +print(add(1,10)) +``` +>Output: 11 + +In this version, `a` and `b` are expected to be integers, and the function is expected to return an integer. This makes the function's purpose and usage clearer. + +#### let's see another example + +The function given below takes an iterable (it can be any off list, tuple, dict, set, frozeset, String... etc) and print it's content in a single line along with it's type. + +```python +from typing import Iterable +# type alias + +def print_all(l: Iterable)->None: + print(type(l),end=' ') + for i in l: + print(i,end=' ') + print() + +l = [1,2,3,4,5] # type: List[int] +s = {1,2,3,4,5} # type: Set[int] +t = (1,2,3,4,5) # type: Tuple[int] + +for iter_obj in [l,s,t]: + print_all(iter_obj) + +``` +Output: +> 1 2 3 4 5 +> 1 2 3 4 5 +> 1 2 3 4 5 + +and now lets try calling the function `print_all` using a non-iterable object `int` as argument. + +```python +a = 10 +print_all(a) # This will raise an error +``` +Output: +>TypeError: 'int' object is not iterable + +This error occurs because `a` is an `integer`, and the `integer` class does not have any methods or attributes that make it work like an iterable. In other words, the integer class does not conform to the `Iterable` protocol. + +**Benefits of Type Hints** +Using type hints helps in several ways: + +1. **Error Detection**: Tools like mypy can catch type-related problems during development, decreasing runtime errors. +2. **Code Readability**: Type hints serve as documentation, making it easy to comprehend what data types are anticipated and returned. +3. **Improved Maintenance**: With unambiguous type expectations, maintaining and updating code becomes easier, especially in huge codebases. + +Now that we have understood about type hints and typing module let's dive deep into protocols. + +## Understanding Protocols + +In Python, protocols define interfaces similar to Java interfaces. They let you specify methods and attributes that an object must implement without requiring inheritance from a base class. Protocols are part of the `typing` module and provide a way to enforce certain structures in your classes, enhancing type safety and code clarity. + +### What is a Protocol? + +A protocol specifies one or more method signatures that a class must implement to be considered as conforming to the protocol. + This concept is often referred to as "structural subtyping" or "duck typing," meaning that if an object implements the required methods and attributes, it can be treated as an instance of the protocol. + +Let's write our own protocol: + +```python +from typing import Protocol + +# Define a Printable protocol +class Printable(Protocol): + def print(self) -> None: + """Print the object""" + pass + +# Book class implements the Printable protocol +class Book: + def __init__(self, title: str): + self.title = title + + def print(self) -> None: + print(f"Book Title: {self.title}") + +# print_object function takes a Printable object and calls its print method +def print_object(obj: Printable) -> None: + obj.print() + +book = Book("Python Programming") +print_object(book) +``` +Output: +> Book Title: Python Programming + +In this example: + +1. **Printable Protocol:** Defines an interface with a single method print. +2. **Book Class:** Implements the Printable protocol by providing a print method. +3. **print_object Function:** Accepts any object that conforms to the Printable protocol and calls its print method. + +we got our output because the class `Book` confirms to the protocols `printable`. +similarly When you pass an object to `print_object` that does not conform to the Printable protocol, an error will occur. This is because the object does not implement the required `print` method. +Let's see an example: +```python +class Team: + def huddle(self) -> None: + print("Team Huddle") + +c = Team() +print_object(c) # This will raise an error +``` +Output: +>AttributeError: 'Team' object has no attribute 'print' + +In this case: +- The `Team` class has a `huddle` method but does not have a `print` method. +- When `print_object` tries to call the `print` method on a `Team` instance, it raises an `AttributeError`. + +> This is an important aspect of using protocols: they ensure that objects provide the necessary methods, leading to more predictable and reliable code. + +**Ensuring Protocol Conformance** +To avoid such errors, you need to ensure that any object passed to `print_object` implements the `Printable` protocol. Here's how you can modify the `Team` class to conform to the protocol: +```python +class Team: + def __init__(self, name: str): + self.name = name + + def huddle(self) -> None: + print("Team Huddle") + + def print(self) -> None: + print(f"Team Name: {self.name}") + +c = Team("Dream Team") +print_object(c) +``` +Output: +>Team Name: Dream Team + +The `Team` class now implements the `print` method, conforming to the `Printable` protocol. and hence, no longer raises an error. + +### Protocols and Inheritance: +Protocols can also be used in combination with inheritance to create more complex interfaces. +we can do that by following these steps: +**Step 1 - Base protocol**: Define a base protocol that specifies a common set of methods and attributes. +**Step 2 - Derived Protocols**: Create derives protocols that extends the base protocol with addition requirements +**Step 3 - Polymorphism**: Objects can then conform to multiple protocols, allowing for Polymorphic behavior. + +Let's see an example on this as well: + +```python +from typing import Protocol + +# Base Protocols +class Printable(Protocol): + def print(self) -> None: + """Print the object""" + pass + +# Base Protocols-2 +class Serializable(Protocol): + def serialize(self) -> str: + pass + +# Derived Protocol +class PrintableAndSerializable(Printable, Serializable): + pass + +# class with implementation of both Printable and Serializable +class Book_serialize: + def __init__(self, title: str): + self.title = title + + def print(self) -> None: + print(f"Book Title: {self.title}") + + def serialize(self) -> None: + print(f"serialize: {self.title}") + +# function accepts the object which implements PrintableAndSerializable +def test(obj: PrintableAndSerializable): + obj.print() + obj.serialize() + +book = Book_serialize("lean-in") +test(book) +``` +Output: +> Book Title: lean-in +serialize: lean-in + +In this example: + +**Printable Protocol:** Specifies a `print` method. +**Serializable Protocol:** Specifies a `serialize` method. +**PrintableAndSerializable Protocol:** Combines both `Printable` and `Serializable`. +**Book Class**: Implements both `print` and `serialize` methods, conforming to `PrintableAndSerializable`. +**test Function:** Accepts any object that implements the `PrintableAndSerializable` protocol. + +If you try to pass an object that does not conform to the `PrintableAndSerializable` protocol to the test function, it will raise an `error`. Let's see an example: + +```python +class Team: + def huddle(self) -> None: + print("Team Huddle") + +c = Team() +test(c) # This will raise an error +``` +output: +> AttributeError: 'Team' object has no attribute 'print' + +In this case: +The `Team` class has a `huddle` method but does not implement `print` or `serialize` methods. +When test tries to call `print` and `serialize` on a `Team` instance, it raises an `AttributeError`. + +**In Conclusion:** +>Python protocols offer a versatile and powerful means of defining interfaces, encouraging the decoupling of code, improving readability, and facilitating static type checking. They are particularly handy for scenarios involving file-like objects, bespoke containers, and any case where you wish to enforce certain behaviors without requiring inheritance from a specific base class. Ensuring that classes conform to protocols reduces runtime problems and makes your code more robust and maintainable. \ No newline at end of file From 9a504138c2b4f1ccb412e4e05cd0d2f76f864448 Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Sat, 1 Jun 2024 10:12:12 +0530 Subject: [PATCH 324/405] Delete contrib/ds-algorithms/stacks.md --- contrib/ds-algorithms/stacks.md | 131 -------------------------------- 1 file changed, 131 deletions(-) delete mode 100644 contrib/ds-algorithms/stacks.md diff --git a/contrib/ds-algorithms/stacks.md b/contrib/ds-algorithms/stacks.md deleted file mode 100644 index f9f662b..0000000 --- a/contrib/ds-algorithms/stacks.md +++ /dev/null @@ -1,131 +0,0 @@ -# STACKS IN PYTHON -In Data Structures and Algorithms, a stack is a linear data structure that complies with the Last In, First Out (LIFO) rule. It works by use of two fundamental techniques: *PUSH* which inserts an element on top of the stack and *POP* which takes out the topmost element.This concept is similar to a stack of plates in a cafeteria. Stacks are usually used for handling function calls, expression evaluation, and parsing in programming. Indeed, they are efficient in managing memory as well as tracking program state. - -**POINTS TO BE REMEMBERED :-** -- A stack is a collection of data items that can be accessed at only one end, called *TOP*. -- Items can be inserted and deleted in a stack only at the *TOP*. -- The last item inserted in a stack is the first one to be deleted. -- Therefore, a stack is called a **Last-In-First-Out (LIFO)** data structure. - -## REAL LIFE EXAMPLES OF STACKS - -**PILE OF BOOKS** - Suppose a set of books are placed one over the other in a pile. When you remove books from the pile, the topmost book will be removed first. Similarly, when you have to add a book to the pile, the book will be placed at the top of the file. - -**PILE OF PLATES** - The first plate begins the pile. The second plate is placed on the top of the first plate and the third plate is placed on the top of the second plate, and so on. In general, if you want to add a plate to the pile, you can keep it on the top of the pile. Similarly, if you want to remove a plate, you can remove the plate from the top of the pile. - -**BANGLES IN A HAND** - When a person wears bangles, the last bangle worn is the first one to be removed. - -## APPLICATIONS OF STACKS - -Stacks are widely used in Computer Science: -- *Function call* management -- Maintaining the *UNDO* list for the application -- Web browser *history management* -- Evaluating expressions -- Checking the nesting of parentheses in an expression -- *Backtracking* algorithms (Recursion) - -Understanding these applications is essential for Software Development. - -## OPERATIONS ON A STACK - -Key operations on a stack include: -- **PUSH** - It is the process of inserting a new element on the top of a stack. -- **OVERFLOW** - A situation when we are pushing an item in a stack that is full. -- **POP** - It is the process of deleting an element from the top of a stack. -- **UNDERFLOW** - A situation when we are popping item from an empty stack. -- **PEEK** - It is the process of getting the most recent value of stack *(i.e. the value at the top of the stack)* -- **ISEMPTY** - It is the function which return true if stack is empty else false. -- **SHOW** -Displaying stack items. - -## IMPLEMENTING STACKS IN PYTHON - -```python -def isEmpty(S): - - if len(S) == 0: - return True - - else: - - return False - -def Push(S, item): - S.append(item) - -def Pop(S): - - if isEmpty(S): - return "Underflow" - - else: - val = S.pop() - return val - -def Peek(S): - - if isEmpty(S): - return "Underflow" - - else: - top = len(S) - 1 - return S[top] - -def Show(S): - - if isEmpty(S): - print("Sorry, No items in Stack") - - else: - print("(Top)", end=' ') - t = len(S) - 1 - while t >= 0: - print(S[t], "<", end=' ') - t -= 1 - print() -``` - -This code defines a stack data structure along with functions to manipulate it. To provide output, we would need to use these functions to interact with the stack. - -Here's an example: -```python -stack = [] - -Push(stack, 5) -Push(stack, 10) -Push(stack, 15) - -print("Stack after Push operations:") -Show(stack) - -print("Peek operation:", Peek(stack)) - -print("Pop operation:", Pop(stack)) - -print("Stack after Pop operation:") -Show(stack) -``` - -This would output: - -``` -Stack after Push operations: - -(Top) 15 < 10 < 5 < - -Peek operation: 15 - -Pop operation: 15 - -Stack after Pop operation: - -(Top) 10 < 5 < -``` - -## Complexity Analysis - -- **Worst case**: `O(n)` This occurs when the stack is full, it is dominated by the usage of Show operation. -- **Best case**: `O(1)` When the operations like isEmpty, Push, Pop and Peek are used, they have a constant time complexity of O(1). -- **Average case**: `O(n)` The average complexity is likely to be lower than O(n), as the stack is not always full. - - From 1f54c5a7ccb5ba49d5f49728837521796f2b4de7 Mon Sep 17 00:00:00 2001 From: somyasaxena01 <140182178+somyasaxena01@users.noreply.github.com> Date: Sat, 1 Jun 2024 10:12:55 +0530 Subject: [PATCH 325/405] Add files via upload --- contrib/ds-algorithms/stacks.md | 116 ++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 contrib/ds-algorithms/stacks.md diff --git a/contrib/ds-algorithms/stacks.md b/contrib/ds-algorithms/stacks.md new file mode 100644 index 0000000..428a193 --- /dev/null +++ b/contrib/ds-algorithms/stacks.md @@ -0,0 +1,116 @@ +# Stacks in Python + +In Data Structures and Algorithms, a stack is a linear data structure that complies with the Last In, First Out (LIFO) rule. It works by use of two fundamental techniques: **PUSH** which inserts an element on top of the stack and **POP** which takes out the topmost element.This concept is similar to a stack of plates in a cafeteria. Stacks are usually used for handling function calls, expression evaluation, and parsing in programming. Indeed, they are efficient in managing memory as well as tracking program state. + +## Points to be Remebered + +- A stack is a collection of data items that can be accessed at only one end, called **TOP**. +- Items can be inserted and deleted in a stack only at the TOP. +- The last item inserted in a stack is the first one to be deleted. +- Therefore, a stack is called a **Last-In-First-Out (LIFO)** data structure. + +## Real Life Examples of Stacks + +- **PILE OF BOOKS** - Suppose a set of books are placed one over the other in a pile. When you remove books from the pile, the topmost book will be removed first. Similarly, when you have to add a book to the pile, the book will be placed at the top of the file. + +- **PILE OF PLATES** - The first plate begins the pile. The second plate is placed on the top of the first plate and the third plate is placed on the top of the second plate, and so on. In general, if you want to add a plate to the pile, you can keep it on the top of the pile. Similarly, if you want to remove a plate, you can remove the plate from the top of the pile. + +- **BANGLES IN A HAND** - When a person wears bangles, the last bangle worn is the first one to be removed. + +## Applications of Stacks + +Stacks are widely used in Computer Science: + +- Function call management +- Maintaining the UNDO list for the application +- Web browser *history management* +- Evaluating expressions +- Checking the nesting of parentheses in an expression +- Backtracking algorithms (Recursion) + +Understanding these applications is essential for Software Development. + +## Operations on a Stack + +Key operations on a stack include: + +- **PUSH** - It is the process of inserting a new element on the top of a stack. +- **OVERFLOW** - A situation when we are pushing an item in a stack that is full. +- **POP** - It is the process of deleting an element from the top of a stack. +- **UNDERFLOW** - A situation when we are popping item from an empty stack. +- **PEEK** - It is the process of getting the most recent value of stack *(i.e. the value at the top of the stack)* +- **isEMPTY** - It is the function which return true if stack is empty else false. +- **SHOW** -Displaying stack items. + +## Implementing Stacks in Python + +```python +def isEmpty(S): + if len(S) == 0: + return True + else: + return False + +def Push(S, item): + S.append(item) + +def Pop(S): + if isEmpty(S): + return "Underflow" + else: + val = S.pop() + return val + +def Peek(S): + if isEmpty(S): + return "Underflow" + else: + top = len(S) - 1 + return S[top] + +def Show(S): + if isEmpty(S): + print("Sorry, No items in Stack") + else: + print("(Top)", end=' ') + t = len(S) - 1 + while t >= 0: + print(S[t], "<", end=' ') + t -= 1 + print() + +stack = [] # initially stack is empty + +Push(stack, 5) +Push(stack, 10) +Push(stack, 15) + +print("Stack after Push operations:") +Show(stack) +print("Peek operation:", Peek(stack)) +print("Pop operation:", Pop(stack)) +print("Stack after Pop operation:") +Show(stack) +``` + +## Output + +```markdown +Stack after Push operations: + +(Top) 15 < 10 < 5 < + +Peek operation: 15 + +Pop operation: 15 + +Stack after Pop operation: + +(Top) 10 < 5 < +``` + +## Complexity Analysis + +- **Worst case**: `O(n)` This occurs when the stack is full, it is dominated by the usage of Show operation. +- **Best case**: `O(1)` When the operations like isEmpty, Push, Pop and Peek are used, they have a constant time complexity of O(1). +- **Average case**: `O(n)` The average complexity is likely to be lower than O(n), as the stack is not always full. From d83b6e1deaa84b2d0d2411c7a5eb8b4284ab5351 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sat, 1 Jun 2024 20:56:34 +0530 Subject: [PATCH 326/405] 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 327/405] 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 328/405] 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 329/405] 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) From 03a168d202babc9839e00b9b9563dc49f39bed39 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:11:03 +0530 Subject: [PATCH 330/405] Update and rename IntroToCNNs.md to intro-to-cnn.md --- .../{IntroToCNNs.md => intro-to-cnn.md} | 75 +++++-------------- 1 file changed, 17 insertions(+), 58 deletions(-) rename contrib/machine-learning/{IntroToCNNs.md => intro-to-cnn.md} (89%) diff --git a/contrib/machine-learning/IntroToCNNs.md b/contrib/machine-learning/intro-to-cnn.md similarity index 89% rename from contrib/machine-learning/IntroToCNNs.md rename to contrib/machine-learning/intro-to-cnn.md index fb9027a..0221ca1 100644 --- a/contrib/machine-learning/IntroToCNNs.md +++ b/contrib/machine-learning/intro-to-cnn.md @@ -1,30 +1,5 @@ # Understanding Convolutional Neural Networks (CNN) -## Table of Contents -
-Click to expand - -- [Introduction](#introduction) -- [CNN Architecture](#cnn-architecture) - -
- Convolutional Layer - - - [Input Shape](#input-shape) - - [Stride](#strides) - - [Padding](#padding) - - [Filter](#filters) - - [Output](#output) - -
- -- [Pooling Layer](#pooling-layer) -- [Flatten Layer](#flatten-layer) -- [Dropout Layer](#dropout-layer) - -- [Implementation](#implementation) - -
- ## Introduction Convolutional Neural Networks (CNNs) are a specialized type of artificial neural network designed primarily for processing structured grid data like images. CNNs are particularly powerful for tasks involving image recognition, classification, and computer vision. They have revolutionized these fields, outperforming traditional neural networks by leveraging their unique architecture to capture spatial hierarchies in images. @@ -52,9 +27,7 @@ The convolutional layer is the core building block of a CNN. The layer's paramet #### Input Shape The dimensions of the input image, including the number of channels (e.g., 3 for RGB images & 1 for Grayscale images). -
- -
+![image](assets/cnn-input_shape.png) - The input matrix is a binary image of handwritten digits, where '1' marks the pixels containing the digit (ink/grayscale area) and '0' marks the background pixels (empty space). @@ -63,9 +36,7 @@ where '1' marks the pixels containing the digit (ink/grayscale area) and '0' mar #### Strides The step size with which the filter moves across the input image. -
- -
+![image](assets/cnn-strides.png) - This visualization will help you understand how the filter (kernel) moves acroos the input matrix with stride values of (3,3) and (2,2). - A stride of 1 means the filter moves one step at a time, ensuring it covers the entire input matrix. @@ -74,9 +45,7 @@ The step size with which the filter moves across the input image. #### Padding Determines whether the output size is the same as the input size ('same') or reduced ('valid'). -
- -
+![image](assets/cnn-padding.png) - `Same` padding is preferred in earlier layers to preserve spatial and edge information, as it can help the network learn more detailed features. - Choose `valid` padding when focusing on the central input region or requiring specific output dimensions. @@ -84,37 +53,31 @@ Determines whether the output size is the same as the input size ('same') or red #### Filters Small matrices that slide over the input data to extract features. -
- -
+![image](assets/cnn-filters.png) - The first filter aims to detect closed loops within the input image, being highly relevant for recognizing digits with circular or oval shapes, such as '0', '6', '8', or '9'. - The next filter helps in detecting vertical lines, crucial for identifying digits like '1', '4', '7', and parts of other digits that contain vertical strokes. - The last filter shows how to detect diagonal lines in the input image, useful for identifying the slashes present in digits like '1', '7', or parts of '4' and '9'. -
- #### Output A set of feature maps that represent the presence of different features in the input. -
- -
+![image](assets/cnn-ouputs.png) - With no padding and a stride of 1, the 3x3 filter moves one step at a time across the 7x5 input matrix. The filter can only move within the original boundaries of the input, resulting in a smaller 5x3 output matrix. This configuration is useful when you want to reduce the spatial dimensions of the feature map while preserving the exact spatial relationships between features. - By adding zero padding to the input matrix, it is expanded to 9x7, allowing the 3x3 filter to "fit" fully on the edges and corners. With a stride of 1, the filter still moves one step at a time, but now the output matrix is the same size (7x5) as the original input. Same padding is often preferred in early layers of a CNN to preserve spatial information and avoid rapid feature map shrinkage. - Without padding, the 3x3 filter operates within the original input matrix boundaries, but now it moves two steps at a time (stride 2). This significantly reduces the output matrix size to 3x2. Larger strides are employed to decrease computational cost and the output size, which can be beneficial in speeding up the training process and preventing overfitting. However, they might miss some finer details due to the larger jumps. - The output dimension of a CNN model is given by, $$ n_{out} = { n_{in} + (2 \cdot p) - k \over s } $$ -where,
- nin = number of input features
- p = padding
- k = kernel size
+where, + nin = number of input features + p = padding + k = kernel size s = stride -- Also, the number of trainable parameters for each layer is given by, $ (n_c \cdot [k \cdot k] \cdot f) + f $ -
where,
- nc = number of input channels
- k x k = kernel size
- f = number of filters
+- Also, the number of trainable parameters for each layer is given by, $ (n_c \cdot [k \cdot k] \cdot f) + f $ +where, + nc = number of input channels + k x k = kernel size + f = number of filters an additional f is added for bias ### Pooling Layer @@ -135,18 +98,14 @@ Pooling layers reduce the dimensionality of each feature map while retaining the The flatten layer converts the 2D matrix data to a 1D vector, which can be fed into a fully connected (dense) layer. - **Input Shape:** The 2D feature maps from the previous layer. - **Output:** A 1D vector that represents the same data in a flattened format. -
- -
+![image](assets/cnn-flattened.png) ### Dropout Layer Dropout is a regularization technique to prevent overfitting in neural networks by randomly setting a fraction of input units to zero at each update during training time. - **Input Shape:** The data from the previous layer. - **Dropout Rate:** The fraction of units to drop (e.g., 0.5 for 50% dropout). - **Output:** The same shape as the input, with some units set to zero. -
- -
+![image](assets/cnn-dropout.png) - The updated 0 values represents the dropped units. @@ -263,4 +222,4 @@ dropout_output = cnn_model.dropout(flattened_output, dropout_rate=0.3) print("\nDropout Output:\n", dropout_output) ``` -Feel free to play around with the parameters! \ No newline at end of file +Feel free to play around with the parameters! From e4dd80f1ce9e18679d00ba97bbe99a337a15b73e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:11:26 +0530 Subject: [PATCH 331/405] 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 ea8b5cb..988a27f 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) -- [Introduction To Convolutional Neural Networks (CNNs)](IntroToCNNs.md) +- [Introduction To Convolutional Neural Networks (CNNs)](intro-to-cnn.md) From 33543fd13c21329a4656f360a96d29c6483e8c71 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:15:14 +0530 Subject: [PATCH 332/405] Delete .vscode/settings.json --- .vscode/settings.json | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 7a73a41..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -} \ No newline at end of file From 3c95166575d6e25c2544a0be7d8d8cae4ab9b45e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:15:39 +0530 Subject: [PATCH 333/405] Rename Random_Forest.md to random-forest.md --- contrib/machine-learning/{Random_Forest.md => random-forest.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{Random_Forest.md => random-forest.md} (99%) diff --git a/contrib/machine-learning/Random_Forest.md b/contrib/machine-learning/random-forest.md similarity index 99% rename from contrib/machine-learning/Random_Forest.md rename to contrib/machine-learning/random-forest.md index 59c44ef..0abd1ab 100644 --- a/contrib/machine-learning/Random_Forest.md +++ b/contrib/machine-learning/random-forest.md @@ -193,4 +193,4 @@ Scikit-learn Random Forest Documentation Wikipedia: Random Forest Machine Learning Mastery: Introduction to Random Forest Kaggle: Random Forest Guide -Towards Data Science: Understanding Random Forests \ No newline at end of file +Towards Data Science: Understanding Random Forests From 86e7c0d80613c236d05b4cd0895f0ee6df7601cb Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:16:18 +0530 Subject: [PATCH 334/405] 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 073bca9..3b8c95b 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) -- [Random Forest](Random_Forest.md) \ No newline at end of file +- [Random Forest](random-forest.md) From 0189c285cc983d2a19e306967bfe4d1f0dda43da Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:18:23 +0530 Subject: [PATCH 335/405] Update random-forest.md --- contrib/machine-learning/random-forest.md | 37 ++++------------------- 1 file changed, 6 insertions(+), 31 deletions(-) diff --git a/contrib/machine-learning/random-forest.md b/contrib/machine-learning/random-forest.md index 0abd1ab..feaaa7a 100644 --- a/contrib/machine-learning/random-forest.md +++ b/contrib/machine-learning/random-forest.md @@ -2,31 +2,6 @@ Random Forest is a versatile machine learning algorithm capable of performing both regression and classification tasks. It is an ensemble method that operates by constructing a multitude of decision trees during training and outputting the average prediction of the individual trees (for regression) or the mode of the classes (for classification). - -- [Random Forest](#random-forest) - - [Introduction](#introduction) - - [How Random Forest Works](#how-random-forest-works) - - [1. Bootstrap Sampling:](#1-bootstrap-sampling) - - [2. Decision Trees:](#2-decision-trees) - - [3. Feature Selection:](#3-feature-selection) - - [4. Voting/Averaging:](#4-votingaveraging) - - [Detailed Working Mechanism](#detailed-working-mechanism) - - [Step 3: Aggregation:](#step-3-aggregation) - - [Advantages and Disadvantages](#advantages-and-disadvantages) - - [Advantages](#advantages) - - [Disadvantages](#disadvantages) - - [Hyperparameters](#hyperparameters) - - [Key Hyperparameters](#key-hyperparameters) - - [Tuning Hyperparameters](#tuning-hyperparameters) - - [Code Examples](#code-examples) - - [Classification Example](#classification-example) - - [Feature Importance](#feature-importance) - - [Hyperparameter Tuning](#hyperparameter-tuning) - - [Regression Example](#regression-example) - - [Conclusion](#conclusion) - - [References](#references) - - ## Introduction Random Forest is an ensemble learning method used for classification and regression tasks. It is built from multiple decision trees and combines their outputs to improve the model's accuracy and control over-fitting. @@ -41,9 +16,9 @@ Random Forest is an ensemble learning method used for classification and regress For classification, the mode of the classes predicted by individual trees is taken (majority vote). For regression, the average of the outputs of the individual trees is taken. ### Detailed Working Mechanism -* #### Step 1: Bootstrap Sampling: +#### Step 1: Bootstrap Sampling: Each tree is trained on a random sample of the original data, drawn with replacement (bootstrap sample). This means some data points may appear multiple times in a sample while others may not appear at all. -* #### Step 2: Tree Construction: +#### Step 2: Tree Construction: Each node in the tree is split using the best split among a random subset of the features. This process adds an additional layer of randomness, contributing to the robustness of the model. #### Step 3: Aggregation: For classification tasks, the final prediction is based on the majority vote from all the trees. For regression tasks, the final prediction is the average of all the tree predictions. @@ -73,7 +48,7 @@ Hyperparameter tuning can significantly improve the performance of a Random Fore #### Classification Example Below is a simple example of using Random Forest for a classification task with the Iris dataset. -``` +```python import numpy as np import pandas as pd from sklearn.datasets import load_iris @@ -109,7 +84,7 @@ print("Classification Report:\n", classification_report(y_test, y_pred)) Random Forest provides a way to measure the importance of each feature in making predictions. -``` +```python import matplotlib.pyplot as plt # Get feature importances @@ -132,7 +107,7 @@ plt.show() #### Hyperparameter Tuning Using Grid Search for hyperparameter tuning. -``` +```python from sklearn.model_selection import GridSearchCV # Define the parameter grid @@ -155,7 +130,7 @@ print("Best parameters found: ", grid_search.best_params_) #### Regression Example Below is a simple example of using Random Forest for a regression task with the Boston housing dataset. -``` +```python import numpy as np import pandas as pd from sklearn.datasets import load_boston From 56e7774648e3dbccd68dbdc1d8e61521524b83aa Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:20:23 +0530 Subject: [PATCH 336/405] Update index.md --- contrib/ds-algorithms/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index d3c3c27..e3fc378 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,4 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) -- [Sliding Window Technique](Sliding_Window.md) +- [Sliding Window Technique](sliding-window.md) From 234df0ee0b4b4d29a799eac61b942cea57a785a9 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:20:46 +0530 Subject: [PATCH 337/405] Rename Sliding_Window.md to sliding-window.md --- contrib/ds-algorithms/{Sliding_Window.md => sliding-window.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/ds-algorithms/{Sliding_Window.md => sliding-window.md} (100%) diff --git a/contrib/ds-algorithms/Sliding_Window.md b/contrib/ds-algorithms/sliding-window.md similarity index 100% rename from contrib/ds-algorithms/Sliding_Window.md rename to contrib/ds-algorithms/sliding-window.md From be0b5b69324ee8e4cb997d327e4ac753e1499093 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:22:13 +0530 Subject: [PATCH 338/405] Update index.md --- contrib/ds-algorithms/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 653cc98..a07dc23 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,4 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) -- [Trie](Trie.md) +- [Trie](trie.md) From 1b0bd26cbe9aebbdfbf9135384f4928371a61a19 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:22:32 +0530 Subject: [PATCH 339/405] Rename Trie.md to trie.md --- contrib/ds-algorithms/{Trie.md => trie.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/ds-algorithms/{Trie.md => trie.md} (100%) diff --git a/contrib/ds-algorithms/Trie.md b/contrib/ds-algorithms/trie.md similarity index 100% rename from contrib/ds-algorithms/Trie.md rename to contrib/ds-algorithms/trie.md From 04bc0893a2c596c042dd6dae1fe401714310b582 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:23:47 +0530 Subject: [PATCH 340/405] Update trie.md --- contrib/ds-algorithms/trie.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/ds-algorithms/trie.md b/contrib/ds-algorithms/trie.md index 43f0415..0ccfbaa 100644 --- a/contrib/ds-algorithms/trie.md +++ b/contrib/ds-algorithms/trie.md @@ -27,7 +27,7 @@ Node Class have mainly two components Code Block of Node Class : -``` +```python class Node: def __init__(self): self.alphabets = [None] * 26 @@ -40,7 +40,7 @@ Now we need to implement Trie. We create another class named Trie with some meth Code Implementation of Initialization: -``` +```python class Trie: def __init__(self): self.root = Node() @@ -51,7 +51,7 @@ class Trie: 1. **Insertion**: Inserts the word into the Trie. This method takes `word` as parameter. For each character in the word, it checks if there is a corresponding child node. If not, it creates a new `Node`. After processing all the characters in word, it increments the `end_of_word` value of the last node. Code Implementation of Insertion: -``` +```python def insert(self, word): node = self.root for char in word: @@ -69,7 +69,7 @@ There are two cases in Searching: - *Word found*: It happens when the search word is present in the Trie. This case will occur, when the `end_of_word` value is greater than `0` of the node after traversing the whole word. Code Implementation of Searching: -``` +```python def Search(self, word): node = self.root for char in word: @@ -84,7 +84,7 @@ Code Implementation of Searching: Code Implementation of Deletion: -``` +```python def delete(self, word): node = self.root for char in word: @@ -96,7 +96,7 @@ def delete(self, word): Python Code to implement Trie: -``` +```python class Node: def __init__(self): self.alphabets = [None] * 26 From f20baa60d2614be595098b5a2d0fe4497dbfdf7e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:28:14 +0530 Subject: [PATCH 341/405] Update and rename matplotlib.md to matplotlib-introduction.md --- .../{matplotlib.md => matplotlib-introduction.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/plotting-visualization/{matplotlib.md => matplotlib-introduction.md} (100%) diff --git a/contrib/plotting-visualization/matplotlib.md b/contrib/plotting-visualization/matplotlib-introduction.md similarity index 100% rename from contrib/plotting-visualization/matplotlib.md rename to contrib/plotting-visualization/matplotlib-introduction.md From 0d420ef4a6914d35a986e65db90b6329d0c30d88 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:28:42 +0530 Subject: [PATCH 342/405] 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 84d07f9..d20340b 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -1,6 +1,6 @@ # List of sections - [Installing Matplotlib](matplotlib-installation.md) +- [Introducing Matplotlib](matplotlib-introduction.md) - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) -- [Introducing Matplotlib](matplotlib.md) From 31eaf9948dc9f4f2417b0b91b69a852bc5618fea Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:29:56 +0530 Subject: [PATCH 343/405] Rename bar-plots.md to matplotlib-bar-plots.md --- .../{bar-plots.md => matplotlib-bar-plots.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/plotting-visualization/{bar-plots.md => matplotlib-bar-plots.md} (100%) 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 358d8b05e4792ff9e819c36e14df3a3d2459c41f Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:32:56 +0530 Subject: [PATCH 344/405] Update matplotlib-introduction.md --- .../matplotlib-introduction.md | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib-introduction.md b/contrib/plotting-visualization/matplotlib-introduction.md index 02f17f5..691d1f8 100644 --- a/contrib/plotting-visualization/matplotlib-introduction.md +++ b/contrib/plotting-visualization/matplotlib-introduction.md @@ -12,8 +12,9 @@ To make this process of data visualization easier and clearer, matplotlib librar ## Starting with Matplotlib -### 1.] Install and import the neccasary libraries - mayplotlib.pylplot -```python +### 1. Install and import the neccasary libraries - mayplotlib.pylplot + +```bash pip install matplotlib ``` @@ -22,9 +23,7 @@ import maptplotlib.pyplot as plt import numpy as np ``` - - -### 2.] Scatter plot +### 2. Scatter plot Scatter plot is a type of plot that uses the cartesian coordinates between x and y to describe the relation between them. It uses dots to represent relation between the data variables of the data set. ```python @@ -41,12 +40,9 @@ plt.tight_layout() plt.show() ``` +![scatterplot](images/scatterplot.png) - -![scatterplot](https://github.com/Harshita297/learn-python/assets/122027571/aa57eb31-4377-4f75-9a97-e4fa7a54a938) - - -### 3.] Bar plot +### 3. Bar plot Bar plot is a type of plot that plots the frequency distrubution of the categorical variables. Each entity of the categoric variable is represented as a bar. The size of the bar represents its numeric value. ```python @@ -61,11 +57,10 @@ plt.ylabel("Y values") plt.show() ``` -![barplot](https://github.com/Harshita297/learn-python/assets/122027571/00cea3cd-a962-4bfe-b158-921389ee564c) +![barplot](images/barplot.png) - -### 4.] Histogram +### 4. Histogram Histogram is the representation of frequency distribution of qualitative data. The height of each rectangle defines the amount, or how often that variable appears. ```python @@ -79,14 +74,7 @@ plt.ylabel("Frequency Distribution") plt.show() ``` -![histogram](https://github.com/Harshita297/learn-python/assets/122027571/32470819-bac5-4bb2-9f36-79521fa40bf3) - - - - - - - - + +![histogram](images/histogram.png) From 4468dd6e91b4481fd15249bed93988ea82acfe89 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:35:40 +0530 Subject: [PATCH 345/405] Rename Descriptive_Statistics.md to descriptive-statistics.md --- .../{Descriptive_Statistics.md => descriptive-statistics.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{Descriptive_Statistics.md => descriptive-statistics.md} (100%) diff --git a/contrib/pandas/Descriptive_Statistics.md b/contrib/pandas/descriptive-statistics.md similarity index 100% rename from contrib/pandas/Descriptive_Statistics.md rename to contrib/pandas/descriptive-statistics.md From 06935da991e2412c60f3b750b3dfe2955e2c4f5e Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:36:05 +0530 Subject: [PATCH 346/405] Rename GroupBy_Functions_Pandas.md to groupby-functions.md --- .../pandas/{GroupBy_Functions_Pandas.md => groupby-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{GroupBy_Functions_Pandas.md => groupby-functions.md} (100%) diff --git a/contrib/pandas/GroupBy_Functions_Pandas.md b/contrib/pandas/groupby-functions.md similarity index 100% rename from contrib/pandas/GroupBy_Functions_Pandas.md rename to contrib/pandas/groupby-functions.md From df9ed4453f022c338fdfc4b588ac6fee861ece0b Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:36:22 +0530 Subject: [PATCH 347/405] Rename excel_with_pandas.md to excel-with-pandas.md --- contrib/pandas/{excel_with_pandas.md => excel-with-pandas.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{excel_with_pandas.md => excel-with-pandas.md} (100%) diff --git a/contrib/pandas/excel_with_pandas.md b/contrib/pandas/excel-with-pandas.md similarity index 100% rename from contrib/pandas/excel_with_pandas.md rename to contrib/pandas/excel-with-pandas.md From 6df31671efe29800d369ec7c9d74dcb297a18b6a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:36:42 +0530 Subject: [PATCH 348/405] Rename pandas_series_vs_numpy_ndarray.md to pandas-series-vs-numpy-ndarray.md --- ...ries_vs_numpy_ndarray.md => pandas-series-vs-numpy-ndarray.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/pandas/{pandas_series_vs_numpy_ndarray.md => pandas-series-vs-numpy-ndarray.md} (100%) diff --git a/contrib/pandas/pandas_series_vs_numpy_ndarray.md b/contrib/pandas/pandas-series-vs-numpy-ndarray.md similarity index 100% rename from contrib/pandas/pandas_series_vs_numpy_ndarray.md rename to contrib/pandas/pandas-series-vs-numpy-ndarray.md From ccd5dea51ebf9da139f85762c98f42ec3f26f9cc Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:37:36 +0530 Subject: [PATCH 349/405] Update index.md --- contrib/pandas/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index c17d839..33c7347 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,10 +1,10 @@ # List of sections - [Pandas Introduction and Dataframes in Pandas](introduction.md) -- [Pandas Series Vs NumPy ndarray](pandas_series_vs_numpy_ndarray.md) -- [Pandas Descriptive Statistics](Descriptive_Statistics.md) -- [Group By Functions with Pandas](GroupBy_Functions_Pandas.md) -- [Excel using Pandas DataFrame](excel_with_pandas.md) +- [Pandas Series Vs NumPy ndarray](pandas-series-vs-numpy-ndarray.md) +- [Pandas Descriptive Statistics](descriptive-statistics.md) +- [Group By Functions with Pandas](groupby-functions.md) +- [Excel using Pandas DataFrame](excel-with-pandas.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 59773b20eed7cff5a85b5785f96edfe4e90a7139 Mon Sep 17 00:00:00 2001 From: "Kaza.Sunitha" <133480054+Kazasunitha@users.noreply.github.com> Date: Sun, 2 Jun 2024 03:49:19 +0530 Subject: [PATCH 350/405] Added viewing_data_in_pandas.md file (#660) * Add files via upload * Update classes.md * Update classes.md * Update classes.md * Update index.md * Update classes.md * Update index.md * Add files via upload * Update viewing_data_in_pandas.md * Delete contrib/advanced-python/classes.md * Delete contrib/advanced-python/index.md * Revert "Delete contrib/advanced-python/index.md" This reverts commit 55fe958c1c57daf431b3dce1d5d103bb8361612a. * Update index.md * Update viewing_data_in_pandas.md Updated the heading format * Update index.md * Update and rename viewing_data_in_pandas.md to viewing-data.md * Update viewing-data.md --------- Co-authored-by: Ankit Mahato --- contrib/pandas/index.md | 1 + contrib/pandas/viewing-data.md | 67 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 contrib/pandas/viewing-data.md diff --git a/contrib/pandas/index.md b/contrib/pandas/index.md index 33c7347..e5a8353 100644 --- a/contrib/pandas/index.md +++ b/contrib/pandas/index.md @@ -1,6 +1,7 @@ # List of sections - [Pandas Introduction and Dataframes in Pandas](introduction.md) +- [Viewing data in pandas](viewing-data.md) - [Pandas Series Vs NumPy ndarray](pandas-series-vs-numpy-ndarray.md) - [Pandas Descriptive Statistics](descriptive-statistics.md) - [Group By Functions with Pandas](groupby-functions.md) diff --git a/contrib/pandas/viewing-data.md b/contrib/pandas/viewing-data.md new file mode 100644 index 0000000..8aaa4ae --- /dev/null +++ b/contrib/pandas/viewing-data.md @@ -0,0 +1,67 @@ +# Viewing rows of the frame + +## `head()` method + +The pandas library in Python provides a convenient method called `head()` that allows you to view the first few rows of a DataFrame. Let me explain how it works: +- The `head()` function returns the first n rows of a DataFrame or Series. +- By default, it displays the first 5 rows, but you can specify a different number of rows using the n parameter. + +### Syntax + +```python +dataframe.head(n) +``` + +`n` is the Optional value. The number of rows to return. Default value is `5`. + +### Example + +```python +import pandas as pd +df = pd.DataFrame({'animal': ['alligator', 'bee', 'falcon', 'lion','tiger','rabit','dog','fox','monkey','elephant']}) +df.head(n=5) +``` + +#### Output + +``` + animal +0 alligator +1 bee +2 falcon +3 lion +4 tiger +``` + +## `tail()` method + +The `tail()` function in Python displays the last five rows of the dataframe by default. It takes in a single parameter: the number of rows. We can use this parameter to display the number of rows of our choice. +- The `tail()` function returns the last n rows of a DataFrame or Series. +- By default, it displays the last 5 rows, but you can specify a different number of rows using the n parameter. + +### Syntax + +```python +dataframe.tail(n) +``` + +`n` is the Optional value. The number of rows to return. Default value is `5`. + +### Example + +```python +import pandas as pd +df = pd.DataFrame({'fruits': ['mongo', 'orange', 'apple', 'lemon','banana','water melon','papaya','grapes','cherry','coconut']}) +df.tail(n=5) +``` + +#### Output + +``` + fruits +5 water melon +6 papaya +7 grapes +8 cherry +9 coconut +``` From 839211767809e4c7d53f38dd21dafd90ccd9bd5a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:56:26 +0530 Subject: [PATCH 351/405] Update matplotlib-line-plot.md --- .../matplotlib-line-plot.md | 56 +++++++++++-------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plot.md index 566fdbb..b7488e6 100644 --- a/contrib/plotting-visualization/matplotlib-line-plot.md +++ b/contrib/plotting-visualization/matplotlib-line-plot.md @@ -1,24 +1,27 @@ # Line Chart in Matplotlib A line chart is a simple way to visualize data where we connect individual data points. It helps us to see trends and patterns over time or across categories. -
This type of chart is particularly useful for:
-* Comparing Data: Comparing multiple datasets on the same axes. -* Highlighting Changes: Illustrating changes and patterns in data. -* Visualizing Trends: Showing trends over time or other continuous variables. + +This type of chart is particularly useful for: +- Comparing Data: Comparing multiple datasets on the same axes. +- Highlighting Changes: Illustrating changes and patterns in data. +- Visualizing Trends: Showing trends over time or other continuous variables. ## Prerequisites -Line plots can be created in Python with Matplotlib's ``pyplot`` library. To build a line plot, first import ``Matplotlib``. It is a standard convention to import Matplotlib's pyplot library as ``plt``. -``` -import matplotlib.pyplot as plt +Line plots can be created in Python with Matplotlib's `pyplot` library. To build a line plot, first import `matplotlib`. It is a standard convention to import Matplotlib's pyplot library as `plt`. + +```python +import matplotlib.pyplot as plt ``` ## Creating a simple Line Plot First import matplotlib and numpy, these are useful for charting. -
You can use the ``plot(x,y)`` method to create a line chart.
-``` +You can use the `plot(x,y)` method to create a line chart. + +```python import matplotlib.pyplot as plt import numpy as np @@ -29,6 +32,7 @@ y = 2*x + 1 plt.plot(x, y) plt.show() ``` + When executed, this will show the following line plot: ![Basic line Chart](images/simple_line.png) @@ -36,8 +40,9 @@ When executed, this will show the following line plot: ## Curved line -The ``plot()`` method also works for other types of line charts. It doesn’t need to be a straight line, y can have any type of values. -``` +The `plot()` method also works for other types of line charts. It doesn’t need to be a straight line, y can have any type of values. + +```python import matplotlib.pyplot as plt import numpy as np @@ -47,6 +52,7 @@ y = 2**x + 1 plt.plot(x, y) plt.show() ``` + When executed, this will show the following Curved line plot: ![Curved line](images/line-curve.png) @@ -54,8 +60,9 @@ When executed, this will show the following Curved line plot: ## Line with Labels -To know what you are looking at, you need meta data. Labels are a type of meta data. They show what the chart is about. The chart has an ``x label``, ``y label`` and ``title``. -``` +To know what you are looking at, you need meta data. Labels are a type of meta data. They show what the chart is about. The chart has an `x label`, `y label` and `title`. + +```python import matplotlib.pyplot as plt import numpy as np @@ -72,15 +79,16 @@ plt.title("With Labels") plt.show() ``` + When executed, this will show the following line with labels plot: ![line with labels](images/line-labels.png) ## Multiple lines -More than one line can be in the plot. To add another line, just call the ``plot(x,y)`` function again. In the example below we have two different values for ``y(y1,y2)`` that are plotted onto the chart. +More than one line can be in the plot. To add another line, just call the `plot(x,y)` function again. In the example below we have two different values for `y(y1,y2)` that are plotted onto the chart. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -98,6 +106,7 @@ plt.plot(x, y1, plt.show() ``` + When executed, this will show the following Multiple lines plot: ![multiple lines](images/two-lines.png) @@ -105,9 +114,9 @@ When executed, this will show the following Multiple lines plot: ## Dotted line -Lines can be in the form of dots like the image below. Instead of calling ``plot(x,y)`` call the ``scatter(x,y)`` method. The ``scatter(x,y)`` method can also be used to (randomly) plot points onto the chart. +Lines can be in the form of dots like the image below. Instead of calling `plot(x,y)` call the `scatter(x,y)` method. The `scatter(x,y)` method can also be used to (randomly) plot points onto the chart. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -130,9 +139,9 @@ When executed, this will show the following Dotted line plot: ## Line ticks -You can change the ticks on the plot. Set them on the ``x-axis``, ``y-axis`` or even change their color. The line can be more thick and have an alpha value. +You can change the ticks on the plot. Set them on the `x-axis`, `y-axis` or even change their color. The line can be more thick and have an alpha value. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -166,9 +175,9 @@ When executed, this will show the following line ticks plot: ## Line with asymptote -An asymptote can be added to the plot. To do that, use ``plt.annotate()``. There’s lso a dotted line in the plot below. You can play around with the code to see how it works. +An asymptote can be added to the plot. To do that, use `plt.annotate()`. There’s lso a dotted line in the plot below. You can play around with the code to see how it works. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -222,9 +231,9 @@ When executed, this will show the following Line with asymptote plot: ## Line with text scale -It doesn’t have to be a numeric scale. The scale can also contain textual words like the example below. In ``plt.yticks()`` we just pass a list with text values. These values are then show against the ``y axis``. +It doesn’t have to be a numeric scale. The scale can also contain textual words like the example below. In `plt.yticks()` we just pass a list with text values. These values are then show against the `y axis`. -``` +```python import matplotlib.pyplot as plt import numpy as np @@ -261,6 +270,7 @@ ax.spines['left'].set_position(('data', 0)) plt.show() ``` + When executed, this will show the following Line with text scale plot: ![Line with text scale](images/line-with-text-scale.png) From aeb947bb1a0c3a44ff3b2ece398649bae6a9e5df Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:59:12 +0530 Subject: [PATCH 352/405] Rename ArtificialNeuralNetwork.md to ann.md --- contrib/machine-learning/{ArtificialNeuralNetwork.md => ann.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{ArtificialNeuralNetwork.md => ann.md} (100%) diff --git a/contrib/machine-learning/ArtificialNeuralNetwork.md b/contrib/machine-learning/ann.md similarity index 100% rename from contrib/machine-learning/ArtificialNeuralNetwork.md rename to contrib/machine-learning/ann.md From e3c2799e6f8a4e58ba00778d7d0cedc76b1495b3 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:59:31 +0530 Subject: [PATCH 353/405] Rename Decision-Tree.md to decision-tree.md --- contrib/machine-learning/{Decision-Tree.md => decision-tree.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{Decision-Tree.md => decision-tree.md} (99%) diff --git a/contrib/machine-learning/Decision-Tree.md b/contrib/machine-learning/decision-tree.md similarity index 99% rename from contrib/machine-learning/Decision-Tree.md rename to contrib/machine-learning/decision-tree.md index 6563a22..8159bcf 100644 --- a/contrib/machine-learning/Decision-Tree.md +++ b/contrib/machine-learning/decision-tree.md @@ -254,4 +254,4 @@ The final decision tree classifies instances based on the following rules: - If Outlook is Rain and Wind is Weak, PlayTennis is Yes - If Outlook is Rain and Wind is Strong, PlayTennis is No -> Note that the calculated entropies and information gains may vary slightly depending on the specific implementation and rounding methods used. \ No newline at end of file +> Note that the calculated entropies and information gains may vary slightly depending on the specific implementation and rounding methods used. From 038bc20a2805baf4165129ebdda4dc059cdcb223 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 03:59:44 +0530 Subject: [PATCH 354/405] Rename Regression.md to regression.md --- contrib/machine-learning/{Regression.md => regression.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Regression.md => regression.md} (100%) diff --git a/contrib/machine-learning/Regression.md b/contrib/machine-learning/regression.md similarity index 100% rename from contrib/machine-learning/Regression.md rename to contrib/machine-learning/regression.md From b19af0241afc2e239dfe31039d743ff888ec59ec Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:00:07 +0530 Subject: [PATCH 355/405] Rename tensorFlow.md to tensorflow.md --- contrib/machine-learning/{tensorFlow.md => tensorflow.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{tensorFlow.md => tensorflow.md} (99%) diff --git a/contrib/machine-learning/tensorFlow.md b/contrib/machine-learning/tensorflow.md similarity index 99% rename from contrib/machine-learning/tensorFlow.md rename to contrib/machine-learning/tensorflow.md index 1d9357d..b2c847c 100644 --- a/contrib/machine-learning/tensorFlow.md +++ b/contrib/machine-learning/tensorflow.md @@ -61,4 +61,4 @@ TensorFlow is a great choice if you: ## Example Use Cases - Building and deploying complex neural networks for image recognition, natural language processing, or recommendation systems. -- Developing models that need to be run on mobile or embedded devices. \ No newline at end of file +- Developing models that need to be run on mobile or embedded devices. From f909c3a2b92d6e1379b9ee276edf78b06592c6a5 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:00:31 +0530 Subject: [PATCH 356/405] Rename binomial_distribution.md to binomial-distribution.md --- .../{binomial_distribution.md => binomial-distribution.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{binomial_distribution.md => binomial-distribution.md} (100%) diff --git a/contrib/machine-learning/binomial_distribution.md b/contrib/machine-learning/binomial-distribution.md similarity index 100% rename from contrib/machine-learning/binomial_distribution.md rename to contrib/machine-learning/binomial-distribution.md From 3b161f57fabb3c1665ccec773578dfcd3377dbe5 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:00:53 +0530 Subject: [PATCH 357/405] Rename Types_of_optimizers.md to types-of-optimizers.md --- .../{Types_of_optimizers.md => types-of-optimizers.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Types_of_optimizers.md => types-of-optimizers.md} (100%) diff --git a/contrib/machine-learning/Types_of_optimizers.md b/contrib/machine-learning/types-of-optimizers.md similarity index 100% rename from contrib/machine-learning/Types_of_optimizers.md rename to contrib/machine-learning/types-of-optimizers.md From 87b2d056531182f69dea33798807b895214c731c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:01:46 +0530 Subject: [PATCH 358/405] Update index.md --- contrib/machine-learning/index.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index e56691d..a0dd999 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -1,16 +1,16 @@ # List of sections -- [Binomial Distribution](binomial_distribution.md) -- [Regression in Machine Learning](Regression.md) +- [Binomial Distribution](binomial-distribution.md) +- [Regression in Machine Learning](regression.md) - [Confusion Matrix](confusion-matrix.md) -- [Decision Tree Learning](Decision-Tree.md) +- [Decision Tree Learning](decision-tree.md) - [Random Forest](random-forest.md) - [Support Vector Machine Algorithm](support-vector-machine.md) -- [Artificial Neural Network from the Ground Up](ArtificialNeuralNetwork.md) +- [Artificial Neural Network from the Ground Up](ann.md) - [Introduction To Convolutional Neural Networks (CNNs)](intro-to-cnn.md) -- [TensorFlow.md](tensorFlow.md) +- [TensorFlow.md](tensorflow.md) - [PyTorch.md](pytorch.md) -- [Types of optimizers](Types_of_optimizers.md) +- [Types of optimizers](types-of-optimizers.md) - [Logistic Regression](logistic-regression.md) - [Clustering](clustering.md) - [Grid Search](grid-search.md) From d6e610d8cc3505c806687db1d4dfb9ad0f4f5e66 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:03:36 +0530 Subject: [PATCH 359/405] Rename sklearn.md to sklearn-introduction.md --- .../machine-learning/{sklearn.md => sklearn-introduction.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{sklearn.md => sklearn-introduction.md} (99%) diff --git a/contrib/machine-learning/sklearn.md b/contrib/machine-learning/sklearn-introduction.md similarity index 99% rename from contrib/machine-learning/sklearn.md rename to contrib/machine-learning/sklearn-introduction.md index 8174d93..7bb5aa8 100644 --- a/contrib/machine-learning/sklearn.md +++ b/contrib/machine-learning/sklearn-introduction.md @@ -141,4 +141,4 @@ print(f"Accuracy: {accuracy * 100:.2f}%") ## Conclusion -scikit-learn is a powerful and versatile library that can be used for a wide range of machine learning tasks. It is particularly well-suited for beginners due to its easy-to-use interface and extensive documentation. Whether you are working on a simple classification task or a more complex clustering problem, scikit-learn provides the tools you need to build and evaluate your models effectively. \ No newline at end of file +scikit-learn is a powerful and versatile library that can be used for a wide range of machine learning tasks. It is particularly well-suited for beginners due to its easy-to-use interface and extensive documentation. Whether you are working on a simple classification task or a more complex clustering problem, scikit-learn provides the tools you need to build and evaluate your models effectively. From f671f4d3e9229ba6c622bad87a3972d4e74fea39 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:10:58 +0530 Subject: [PATCH 360/405] Rename matplotlib-line-plot.md to matplotlib-line-plots.md --- .../{matplotlib-line-plot.md => matplotlib-line-plots.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/plotting-visualization/{matplotlib-line-plot.md => matplotlib-line-plots.md} (100%) diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plots.md similarity index 100% rename from contrib/plotting-visualization/matplotlib-line-plot.md rename to contrib/plotting-visualization/matplotlib-line-plots.md From c7746086b91d44369aa6f8e7f3c4a863cd655da2 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:18:14 +0530 Subject: [PATCH 361/405] Rename Types_of_Cost_Functions.md to cost-functions.md --- .../{Types_of_Cost_Functions.md => cost-functions.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Types_of_Cost_Functions.md => cost-functions.md} (100%) diff --git a/contrib/machine-learning/Types_of_Cost_Functions.md b/contrib/machine-learning/cost-functions.md similarity index 100% rename from contrib/machine-learning/Types_of_Cost_Functions.md rename to contrib/machine-learning/cost-functions.md From f125cf4a33de46d7f8fee1066a347551f71ea13a Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:26:45 +0530 Subject: [PATCH 362/405] Update cost-functions.md --- contrib/machine-learning/cost-functions.md | 41 ++++++++++------------ 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/contrib/machine-learning/cost-functions.md b/contrib/machine-learning/cost-functions.md index f650726..c1fe217 100644 --- a/contrib/machine-learning/cost-functions.md +++ b/contrib/machine-learning/cost-functions.md @@ -14,9 +14,9 @@ MSE is one of the most commonly used cost functions, particularly in regression The MSE is defined as: $$MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual value. -- \( y^i\) is the predicted value. +- `n` is the number of samples. +- $y_i$ is the actual value. +- $\hat{y}_i$ is the predicted value. **Advantages:** - Sensitive to large errors due to squaring. @@ -43,9 +43,9 @@ MAE is another commonly used cost function for regression tasks. It measures the The MAE is defined as: $$MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual value. -- \( y^i\) is the predicted value. +- `n` is the number of samples. +- $y_i$ is the actual value. +- $\hat{y}_i$ is the predicted value. **Advantages:** - Less sensitive to outliers compared to MSE. @@ -76,9 +76,9 @@ For binary classification, the cross-entropy loss is defined as: $$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual class label (0 or 1). -- \( y^i\) is the predicted probability of the positive class. +- `n` is the number of samples. +- $y_i$ is the actual class label (0 or 1). +- $\hat{y}_i$ is the predicted probability of the positive class. **Advantages:** @@ -109,11 +109,10 @@ The multiclass cross-entropy loss is defined as: $$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c})$$ Where: -- \( n \) is the number of samples. -- \( C \) is the number of classes. -- \( y_{i,c} \) is the indicator function for the true class of sample \( i \). - -- (y^i,c) is the predicted probability of sample \( i \) belonging to class \( c \). +- `n` is the number of samples. +- `C` is the number of classes. +- $y_{i,c}$ is the indicator function for the true class of sample `i`. +- $\hat{y}_{i,c}$ is the predicted probability of sample `i` belonging to class `c`. **Advantages:** - Handles multiple classes effectively. @@ -143,9 +142,9 @@ For binary classification, the hinge loss is defined as: $$\text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i)$$ Where: -- \( n \) is the number of samples. -- \( y_i \) is the actual class label (-1 or 1). -- \( \hat{y}_i \) is the predicted score for sample \( i \). +- `n` is the number of samples. +- $y_i$ is the actual class label (-1 or 1). +- $\hat{y}_i$ is the predicted score for sample \( i \). **Advantages:** - Encourages margin maximization in SVMs. @@ -182,8 +181,8 @@ $$\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ \right.$$ Where: -- \( n \) is the number of samples. -- \(delta\) is a threshold parameter. +- `n` is the number of samples. +- $\delta$ is a threshold parameter. **Advantages:** - Provides a smooth loss function. @@ -214,7 +213,7 @@ The Log-Cosh loss is defined as: $$\text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i))$$ Where: -- \( n \) is the number of samples. +- `n` is the number of samples. **Advantages:** - Smooth and differentiable everywhere. @@ -234,5 +233,3 @@ def logcosh_loss(y_true, y_pred): ``` These implementations provide various options for cost functions suitable for different machine learning tasks. Each function has its advantages and disadvantages, making them suitable for different scenarios and problem domains. - ---- From 15fed7ee6e448637b27ecdc23ef5157ed2ef5ce4 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 04:31:21 +0530 Subject: [PATCH 363/405] Update index.md --- contrib/api-development/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/api-development/index.md b/contrib/api-development/index.md index 7278907..8d4dc59 100644 --- a/contrib/api-development/index.md +++ b/contrib/api-development/index.md @@ -1,4 +1,4 @@ # List of sections - [API Methods](api-methods.md) -- [FastAPI](fast-api.md) \ No newline at end of file +- [FastAPI](fast-api.md) From f65c949564f003591c746088bf8c25be44a65853 Mon Sep 17 00:00:00 2001 From: Ritesh Date: Sun, 2 Jun 2024 09:17:22 +0530 Subject: [PATCH 364/405] Create hierarchical-clustering.md --- .../hierarchical-clustering.md | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 contrib/machine-learning/hierarchical-clustering.md diff --git a/contrib/machine-learning/hierarchical-clustering.md b/contrib/machine-learning/hierarchical-clustering.md new file mode 100644 index 0000000..3f9e606 --- /dev/null +++ b/contrib/machine-learning/hierarchical-clustering.md @@ -0,0 +1,119 @@ +# Hierarchical Clustering + +Hierarchical Clustering is a method of cluster analysis that seeks to build a hierarchy of clusters. This README provides an overview of the hierarchical clustering algorithm, including its fundamental concepts, types, steps, and how to implement it using Python. + +## Table of Contents + +1. [Introduction](#introduction) +2. [Concepts](#concepts) +3. [Types of Hierarchical Clustering](#types-of-hierarchical-clustering) +4. [Steps in Hierarchical Clustering](#steps-in-hierarchical-clustering) +5. [Linkage Criteria](#linkage-criteria) +6. [Implementation](#implementation) + - [Using Scikit-learn](#using-scikit-learn) + - [Code Example](#code-example) +7. [Evaluation Metrics](#evaluation-metrics) +8. [Conclusion](#conclusion) +9. [References](#references) + +## Introduction + +Hierarchical Clustering is an unsupervised learning method used to group similar objects into clusters. Unlike other clustering techniques, hierarchical clustering does not require the number of clusters to be specified beforehand. It produces a tree-like structure called a dendrogram, which displays the arrangement of the clusters and their sub-clusters. + +## Concepts + +### Dendrogram + +A dendrogram is a tree-like diagram that records the sequences of merges or splits. It is a useful tool for visualizing the process of hierarchical clustering. + +### 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. + +### Linkage Criteria + +Linkage criteria determine how the distance between clusters is calculated. Different linkage criteria include single linkage, complete linkage, average linkage, and Ward's linkage. + +## Types of Hierarchical Clustering + +1. **Agglomerative Clustering (Bottom-Up Approach)**: + - Starts with each data point as a separate cluster. + - Repeatedly merges the closest pairs of clusters until only one cluster remains or a stopping criterion is met. + +2. **Divisive Clustering (Top-Down Approach)**: + - Starts with all data points in a single cluster. + - Repeatedly splits clusters into smaller clusters until each data point is its own cluster or a stopping criterion is met. + +## Steps in Hierarchical Clustering + +1. **Calculate Distance Matrix**: Compute the distance between each pair of data points. +2. **Create Clusters**: Treat each data point as a single cluster. +3. **Merge Closest Clusters**: Find the two clusters that are closest to each other and merge them into a single cluster. +4. **Update Distance Matrix**: Update the distance matrix to reflect the distance between the new cluster and the remaining clusters. +5. **Repeat**: Repeat steps 3 and 4 until all data points are merged into a single cluster or the desired number of clusters is achieved. + +## Linkage Criteria + +1. **Single Linkage (Minimum Linkage)**: The distance between two clusters is defined as the minimum distance between any single data point in the first cluster and any single data point in the second cluster. +2. **Complete Linkage (Maximum Linkage)**: The distance between two clusters is defined as the maximum distance between any single data point in the first cluster and any single data point in the second cluster. +3. **Average Linkage**: The distance between two clusters is defined as the average distance between all pairs of data points, one from each cluster. +4. **Ward's Linkage**: The distance between two clusters is defined as the increase in the sum of squared deviations from the mean when the two clusters are merged. + +## Implementation + +### Using Scikit-learn + +Scikit-learn is a popular machine learning library in Python that provides tools for hierarchical clustering. + +### Code Example + +```python +import numpy as np +import pandas as pd +import matplotlib.pyplot as plt +from scipy.cluster.hierarchy import dendrogram, linkage +from sklearn.cluster import AgglomerativeClustering +from sklearn.preprocessing import StandardScaler + +# Load dataset +data = pd.read_csv('path/to/your/dataset.csv') + +# Preprocess the data +scaler = StandardScaler() +data_scaled = scaler.fit_transform(data) + +# Perform hierarchical clustering +Z = linkage(data_scaled, method='ward') + +# Plot the dendrogram +plt.figure(figsize=(10, 7)) +dendrogram(Z) +plt.title('Dendrogram') +plt.xlabel('Data Points') +plt.ylabel('Distance') +plt.show() + +# Perform Agglomerative Clustering +agg_clustering = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='ward') +labels = agg_clustering.fit_predict(data_scaled) + +# 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. +- **Cophenetic Correlation Coefficient**: Measures how faithfully a dendrogram preserves the pairwise distances between the original data points. +- **Dunn Index**: Ratio of the minimum inter-cluster distance to the maximum intra-cluster distance. + +## Conclusion + +Hierarchical clustering is a versatile and intuitive method for clustering data. It is particularly useful when the number of clusters is not known beforehand. By understanding the different linkage criteria and evaluation metrics, one can effectively apply hierarchical clustering to various types of data. + +## References + +- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering) +- [Wikipedia: Hierarchical Clustering](https://en.wikipedia.org/wiki/Hierarchical_clustering) +- [Towards Data Science: Hierarchical Clustering Explained](https://towardsdatascience.com/hierarchical-clustering-explained-925d9e1600c1) From 5b6cd66f79e2cc0341f94bd0ec3ee935ccf8a20c Mon Sep 17 00:00:00 2001 From: Ritesh Date: Sun, 2 Jun 2024 09:21:45 +0530 Subject: [PATCH 365/405] 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 b6945cd..20305dc 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -15,4 +15,5 @@ - [Logistic Regression](logistic-regression.md) - [Types_of_Cost_Functions](cost-functions.md) - [Clustering](clustering.md) +- [Hierarchical Clustering](hierarchical-clustering.md) - [Grid Search](grid-search.md) From 8ef6a2febc2ec303ffdc0702d838e2caa1462b17 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Sun, 2 Jun 2024 09:27:46 +0530 Subject: [PATCH 366/405] added ensemble learning --- contrib/machine-learning/ensemble_learning.md | 140 ++++++++++++++++++ contrib/machine-learning/index.md | 3 +- 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 contrib/machine-learning/ensemble_learning.md diff --git a/contrib/machine-learning/ensemble_learning.md b/contrib/machine-learning/ensemble_learning.md new file mode 100644 index 0000000..940bd09 --- /dev/null +++ b/contrib/machine-learning/ensemble_learning.md @@ -0,0 +1,140 @@ +# Ensemble Learning + +Ensemble Learning is a powerful machine learning paradigm that combines multiple models to achieve better performance than any individual model. The idea is to leverage the strengths of different models to improve overall accuracy, robustness, and generalization. + + + +## Introduction + +Ensemble Learning is a technique that combines the predictions from multiple machine learning models to make more accurate and robust predictions than a single model. It leverages the diversity of different models to reduce errors and improve performance. + +## Types of Ensemble Learning + +### Bagging + +Bagging, or Bootstrap Aggregating, involves training multiple versions of the same model on different subsets of the training data and averaging their predictions. The most common example of bagging is the `RandomForest` algorithm. + +### Boosting + +Boosting focuses on training models sequentially, where each new model corrects the errors made by the previous ones. This way, the ensemble learns from its mistakes, leading to improved performance. `AdaBoost` and `Gradient Boosting` are popular examples of boosting algorithms. + +### Stacking + +Stacking involves training multiple models (the base learners) and a meta-model that combines their predictions. The base learners are trained on the original dataset, while the meta-model is trained on the outputs of the base learners. This approach allows leveraging the strengths of different models. + +## Advantages and Disadvantages + +### Advantages + +- **Improved Accuracy**: Combines the strengths of multiple models. +- **Robustness**: Reduces the risk of overfitting and model bias. +- **Versatility**: Can be applied to various machine learning tasks, including classification and regression. + +### Disadvantages + +- **Complexity**: More complex than individual models, making interpretation harder. +- **Computational Cost**: Requires more computational resources and training time. +- **Implementation**: Can be challenging to implement and tune effectively. + +## Key Concepts + +- **Diversity**: The models in the ensemble should be diverse to benefit from their different strengths. +- **Voting/Averaging**: For classification, majority voting is used to combine predictions. For regression, averaging is used. +- **Weighting**: In some ensembles, models are weighted based on their accuracy or other metrics. + +## Code Examples + +### Bagging with Random Forest + +Below is an example of using Random Forest for classification on the Iris dataset. + +```python +import numpy as np +import pandas as pd +from sklearn.datasets import load_iris +from sklearn.ensemble import RandomForestClassifier +from sklearn.model_selection import train_test_split +from sklearn.metrics import accuracy_score, classification_report + +# Load dataset +iris = load_iris() +X, y = iris.data, iris.target + +# Split dataset +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Initialize Random Forest model +clf = RandomForestClassifier(n_estimators=100, random_state=42) + +# Train the model +clf.fit(X_train, y_train) + +# Make predictions +y_pred = clf.predict(X_test) + +# Evaluate the model +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +print("Classification Report:\n", classification_report(y_test, y_pred)) +``` + +### Boosting with AdaBoost +Below is an example of using AdaBoost for classification on the Iris dataset. + +``` +from sklearn.ensemble import AdaBoostClassifier +from sklearn.tree import DecisionTreeClassifier + +# Initialize base model +base_model = DecisionTreeClassifier(max_depth=1) + +# Initialize AdaBoost model +ada_clf = AdaBoostClassifier(base_estimator=base_model, n_estimators=50, random_state=42) + +# Train the model +ada_clf.fit(X_train, y_train) + +# Make predictions +y_pred = ada_clf.predict(X_test) + +# Evaluate the model +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +print("Classification Report:\n", classification_report(y_test, y_pred)) +``` + +### Stacking with Multiple Models +Below is an example of using stacking with multiple models for classification on the Iris dataset. + +``` +from sklearn.linear_model import LogisticRegression +from sklearn.neighbors import KNeighborsClassifier +from sklearn.svm import SVC +from sklearn.ensemble import StackingClassifier + +# Define base models +base_models = [ + ('knn', KNeighborsClassifier(n_neighbors=5)), + ('svc', SVC(kernel='linear', probability=True)) +] + +# Define meta-model +meta_model = LogisticRegression() + +# Initialize Stacking model +stacking_clf = StackingClassifier(estimators=base_models, final_estimator=meta_model, cv=5) + +# Train the model +stacking_clf.fit(X_train, y_train) + +# Make predictions +y_pred = stacking_clf.predict(X_test) + +# Evaluate the model +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +print("Classification Report:\n", classification_report(y_test, y_pred)) +``` + +## Conclusion +Ensemble Learning is a powerful technique that combines multiple models to improve overall performance. By leveraging the strengths of different models, it provides better accuracy, robustness, and generalization. However, it comes with increased complexity and computational cost. Understanding and implementing ensemble methods can significantly enhance machine learning solutions. \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 073bca9..a46cd7a 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -9,4 +9,5 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) -- [Random Forest](Random_Forest.md) \ No newline at end of file +- [Random Forest](Random_Forest.md) +- [Ensemble Learning](ensemble_learning.md) \ No newline at end of file From 402289d3ceae6add26458f41d33364eff322f8e2 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Sun, 2 Jun 2024 10:23:09 +0530 Subject: [PATCH 367/405] Rename Transformers.md to transformers.md --- contrib/machine-learning/{Transformers.md => transformers.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/machine-learning/{Transformers.md => transformers.md} (100%) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/transformers.md similarity index 100% rename from contrib/machine-learning/Transformers.md rename to contrib/machine-learning/transformers.md From e13fb234f2829a1b918aac3c044e4feef5066d34 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Sun, 2 Jun 2024 10:23:56 +0530 Subject: [PATCH 368/405] Add transformers.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 b6945cd..13d9440 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -16,3 +16,4 @@ - [Types_of_Cost_Functions](cost-functions.md) - [Clustering](clustering.md) - [Grid Search](grid-search.md) +- [Transformers](transformers.md) From 229458043245de432c96f05457dd79330d568a92 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Sun, 2 Jun 2024 10:39:37 +0530 Subject: [PATCH 369/405] Update transformers.md Added source for the image --- contrib/machine-learning/transformers.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contrib/machine-learning/transformers.md b/contrib/machine-learning/transformers.md index 97346bd..9fbfa6d 100644 --- a/contrib/machine-learning/transformers.md +++ b/contrib/machine-learning/transformers.md @@ -6,7 +6,10 @@ mechanism. Before transformers, predecessors of attention mechanism were added t Transformers are a revolutionary approach to natural language processing (NLP). Unlike older models, they excel at understanding long-range connections between words. This "attention" mechanism lets them grasp the context of a sentence, making them powerful for tasks like machine translation, text summarization, and question answering. Introduced in 2017, transformers are now the backbone of many large language models, including tools you might use every day. Their ability to handle complex relationships in language is fueling advancements in AI across various fields. ## Model Architecture -

Model Architecture

+

+ Model Architecture
+Source: Attention Is All You Need - Figure 1 +

### Encoder The encoder is composed of a stack of identical layers. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, positionwise fully connected feed-forward network. Each encoder consists of two major components: a self-attention mechanism and a feed-forward neural network. The self-attention mechanism accepts input encodings from the previous encoder and weights their relevance to each other to generate output encodings. The feed-forward neural network further processes each output encoding individually. These output encodings are then passed to the next encoder as its input, as well as to the decoders. From 07a1e737606d10d7e96e2291cec21003309bfbf0 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Sun, 2 Jun 2024 10:46:21 +0530 Subject: [PATCH 370/405] Update transformers.md Added bibliography --- contrib/machine-learning/transformers.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/contrib/machine-learning/transformers.md b/contrib/machine-learning/transformers.md index 9fbfa6d..0799b7f 100644 --- a/contrib/machine-learning/transformers.md +++ b/contrib/machine-learning/transformers.md @@ -430,4 +430,11 @@ These may include: - Text generation - Biological sequence analysis - Computer code generation -- Video analysis + +## Bibliography +- [Attention Is All You Need](https://arxiv.org/pdf/1706.03762) +- [Tensorflow Tutorial](https://www.tensorflow.org/text/tutorials/transformer) +- [Tensorflow Models Docs](https://www.tensorflow.org/api_docs/python/tfm/nlp/layers) +- [Wikipedia](https://en.wikipedia.org/wiki/Transformer_(deep_learning_architecture)) +- [HuggingFace](https://huggingface.co/docs/transformers/en/index) +- [PyTorch](https://pytorch.org/docs/stable/generated/torch.nn.Transformer.html) From 643cadfa330d4fa5443ba1f4044ecc5942e2b7f3 Mon Sep 17 00:00:00 2001 From: manishh12 Date: Sun, 2 Jun 2024 11:54:06 +0530 Subject: [PATCH 371/405] Added Generators under Advance python --- contrib/advanced-python/Generators.md | 87 +++++++++++++++++++++++++++ contrib/advanced-python/index.md | 1 + 2 files changed, 88 insertions(+) create mode 100644 contrib/advanced-python/Generators.md diff --git a/contrib/advanced-python/Generators.md b/contrib/advanced-python/Generators.md new file mode 100644 index 0000000..ff5226e --- /dev/null +++ b/contrib/advanced-python/Generators.md @@ -0,0 +1,87 @@ +# Generators Under Advanced Python + +## Introduction + +Generators in Python are a sophisticated feature that enables the creation of iterators without the need to construct a full list in memory. They allow you to generate values on-the-fly, which is particularly beneficial for working with large datasets or infinite sequences. In this README, we'll explore generators in depth, covering their types, mathematical formulation, advantages, disadvantages, and implementation examples. + +## Function Generators + +Function generators are created using the `yield` keyword within a function. When invoked, a function generator returns a generator iterator, allowing you to iterate over the values generated by the function. + +### Mathematical Formulation + +Function generators can be represented mathematically using set-builder notation. The general form is: + +``` +{expression | variable in iterable, condition} +``` + +Where: +- `expression` is the expression to generate values. +- `variable` is the variable used in the expression. +- `iterable` is the sequence of values to iterate over. +- `condition` is an optional condition that filters the values. + +### Advantages of Function Generators + +1. **Memory Efficiency**: Function generators produce values lazily, meaning they generate values only when needed, saving memory compared to constructing an entire sequence upfront. + +2. **Lazy Evaluation**: Values are generated on-the-fly as they are consumed, leading to improved performance and reduced overhead, especially when dealing with large datasets. + +3. **Infinite Sequences**: Function generators can represent infinite sequences, such as the Fibonacci sequence, allowing you to work with data streams of arbitrary length without consuming excessive memory. + +### Disadvantages of Function Generators + +1. **Single Iteration**: Once a function generator is exhausted, it cannot be reused. If you need to iterate over the sequence again, you'll have to create a new generator. + +2. **Limited Random Access**: Function generators do not support random access like lists. They only allow sequential access, which might be a limitation depending on the use case. + +### Implementation Example + +```python +def fibonacci(): + a, b = 0, 1 + while True: + yield a + a, b = b, a + b + +# Usage +fib_gen = fibonacci() +for _ in range(10): + print(next(fib_gen)) +``` + +## Generator Expressions + +Generator expressions are similar to list comprehensions but return a generator object instead of a list. They offer a concise way to create generators without the need for a separate function. + +### Mathematical Formulation + +Generator expressions can also be represented mathematically using set-builder notation. The general form is the same as for function generators. + +### Advantages of Generator Expressions + +1. **Memory Efficiency**: Generator expressions produce values lazily, similar to function generators, resulting in memory savings. + +2. **Lazy Evaluation**: Values are generated on-the-fly as they are consumed, providing improved performance and reduced overhead. + +### Disadvantages of Generator Expressions + +1. **Single Iteration**: Like function generators, once a generator expression is exhausted, it cannot be reused. + +2. **Limited Random Access**: Generator expressions, similar to function generators, do not support random access. + +### Implementation Example + +```python +# Generate squares of numbers from 0 to 9 +square_gen = (x**2 for x in range(10)) + +# Usage +for num in square_gen: + print(num) +``` + +## Conclusion + +Generators offer a powerful mechanism for creating iterators efficiently in Python. By understanding the differences between function generators and generator expressions, along with their mathematical formulation, advantages, and disadvantages, you can leverage them effectively in various scenarios. Whether you're dealing with large datasets or need to work with infinite sequences, generators provide a memory-efficient solution with lazy evaluation capabilities, contributing to more elegant and scalable code. \ No newline at end of file diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index fa2fd7b..df4b545 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -9,3 +9,4 @@ - [Map Function](map-function.md) - [Protocols](protocols.md) - [Exception Handling in Python](exception-handling.md) +- [Generators](Generators.md) From 3e35783d59919de603e6d11e81df54fdf47662b2 Mon Sep 17 00:00:00 2001 From: SAM <8dmasters@gmail.com> Date: Sun, 2 Jun 2024 16:19:11 +0530 Subject: [PATCH 372/405] Create transformer-architecture.png --- .../assets/transformer-architecture.png | Bin 0 -> 57018 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/machine-learning/assets/transformer-architecture.png diff --git a/contrib/machine-learning/assets/transformer-architecture.png b/contrib/machine-learning/assets/transformer-architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..2854ab0a8d3e6f0ba0c53735afb57e81eb825a3f GIT binary patch literal 57018 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 Date: Sun, 2 Jun 2024 16:22:50 +0530 Subject: [PATCH 373/405] Update transformers.md Added image location --- contrib/machine-learning/transformers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/machine-learning/transformers.md b/contrib/machine-learning/transformers.md index 0799b7f..0dcf697 100644 --- a/contrib/machine-learning/transformers.md +++ b/contrib/machine-learning/transformers.md @@ -7,7 +7,7 @@ Transformers are a revolutionary approach to natural language processing (NLP). ## Model Architecture

- Model Architecture
+ Model Architecture
Source:
Attention Is All You Need - Figure 1

From f84da4252f1a80405a98451389d70c0ec2d1d3e0 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 21:39:17 +0530 Subject: [PATCH 374/405] Rename OOPs.md to oops.md --- contrib/advanced-python/{OOPs.md => oops.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/advanced-python/{OOPs.md => oops.md} (100%) diff --git a/contrib/advanced-python/OOPs.md b/contrib/advanced-python/oops.md similarity index 100% rename from contrib/advanced-python/OOPs.md rename to contrib/advanced-python/oops.md From 18003e05e2d9c9f019601c0bddd89e7eab456d90 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 21:39:35 +0530 Subject: [PATCH 375/405] Update index.md --- contrib/advanced-python/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index fa2fd7b..16210c2 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,6 +1,6 @@ # List of sections -- [OOPs](OOPs.md) +- [OOPs](oops.md) - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) - [Lambda Function](lambda-function.md) - [Working with Dates & Times in Python](dates_and_times.md) From 20494f222f48f91209a112475961cde7d1f01175 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 21:47:03 +0530 Subject: [PATCH 376/405] Update index.md --- contrib/advanced-python/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index df4b545..0ce294f 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -9,4 +9,4 @@ - [Map Function](map-function.md) - [Protocols](protocols.md) - [Exception Handling in Python](exception-handling.md) -- [Generators](Generators.md) +- [Generators](generators.md) From bb245f09792e9853a7545503d56bcb027754ac19 Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Sun, 2 Jun 2024 21:48:10 +0530 Subject: [PATCH 377/405] Update and rename Generators.md to generators.md --- contrib/advanced-python/{Generators.md => generators.md} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename contrib/advanced-python/{Generators.md => generators.md} (94%) diff --git a/contrib/advanced-python/Generators.md b/contrib/advanced-python/generators.md similarity index 94% rename from contrib/advanced-python/Generators.md rename to contrib/advanced-python/generators.md index ff5226e..96287ef 100644 --- a/contrib/advanced-python/Generators.md +++ b/contrib/advanced-python/generators.md @@ -1,8 +1,8 @@ -# Generators Under Advanced Python +# Generators ## Introduction -Generators in Python are a sophisticated feature that enables the creation of iterators without the need to construct a full list in memory. They allow you to generate values on-the-fly, which is particularly beneficial for working with large datasets or infinite sequences. In this README, we'll explore generators in depth, covering their types, mathematical formulation, advantages, disadvantages, and implementation examples. +Generators in Python are a sophisticated feature that enables the creation of iterators without the need to construct a full list in memory. They allow you to generate values on-the-fly, which is particularly beneficial for working with large datasets or infinite sequences. We will explore generators in depth, covering their types, mathematical formulation, advantages, disadvantages, and implementation examples. ## Function Generators @@ -84,4 +84,4 @@ for num in square_gen: ## Conclusion -Generators offer a powerful mechanism for creating iterators efficiently in Python. By understanding the differences between function generators and generator expressions, along with their mathematical formulation, advantages, and disadvantages, you can leverage them effectively in various scenarios. Whether you're dealing with large datasets or need to work with infinite sequences, generators provide a memory-efficient solution with lazy evaluation capabilities, contributing to more elegant and scalable code. \ No newline at end of file +Generators offer a powerful mechanism for creating iterators efficiently in Python. By understanding the differences between function generators and generator expressions, along with their mathematical formulation, advantages, and disadvantages, you can leverage them effectively in various scenarios. Whether you're dealing with large datasets or need to work with infinite sequences, generators provide a memory-efficient solution with lazy evaluation capabilities, contributing to more elegant and scalable code. From 843eb9b01959f199b6bba37ac3839356c3023f6d Mon Sep 17 00:00:00 2001 From: anamika123 Date: Sun, 2 Jun 2024 22:04:58 +0530 Subject: [PATCH 378/405] eval function --- contrib/advanced-python/eval_function.md | 75 ++++++++++++++++++++++++ contrib/advanced-python/index.md | 1 + 2 files changed, 76 insertions(+) create mode 100644 contrib/advanced-python/eval_function.md diff --git a/contrib/advanced-python/eval_function.md b/contrib/advanced-python/eval_function.md new file mode 100644 index 0000000..9e3ec54 --- /dev/null +++ b/contrib/advanced-python/eval_function.md @@ -0,0 +1,75 @@ +# Understanding the `eval` Function in Python +## Introduction + +The `eval` function in Python allows you to execute a string-based Python expression dynamically. This can be useful in various scenarios where you need to evaluate expressions that are not known until runtime. + +## Syntax +```python +eval(expression, globals=None, locals=None) +``` + +### Parameters: + +* expression: String is parsed and evaluated as a Python expression +* globals [optional]: Dictionary to specify the available global methods and variables. +* locals [optional]: Another dictionary to specify the available local methods and variables. + +## Examples +Example 1: +```python +result = eval('2 + 3 * 4') +print(result) # Output: 14 +``` +Example 2: + +```python +x = 10 +expression = 'x * 2' +result = eval(expression, {'x': x}) +print(result) # Output: 20 +``` +Example 3: +```python +x = 10 +def multiply(a, b): + return a * b +expression = 'multiply(x, 5) + 2' +result = eval(expression) +print("Result:",result) # Output: Result:52 +``` +Example 4: +```python +expression = input("Enter a Python expression: ") +result = eval(expression) +print("Result:", result) +#input= "3+2" +#Output: Result:5 +``` + +Example 5: +```python +import numpy as np +a=np.random.randint(1,9) +b=np.random.randint(1,9) +operations=["*","-","+"] +op=np.random.choice(operations) + +expression=str(a)+op+str(b) +correct_answer=eval(expression) +given_answer=int(input(str(a)+" "+op+" "+str(b)+" = ")) + +if given_answer==correct_answer: + print("Correct") +else: + print("Incorrect") + print("correct answer is :" ,correct_answer) + +#2 * 1 = 8 +#Incorrect +#correct answer is : 2 +#or +#3 * 2 = 6 +#Correct +``` +## Conclusion +The eval function is a powerful tool in Python that allows for dynamic evaluation of expressions. \ No newline at end of file diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index b31544e..9419480 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -10,3 +10,4 @@ - [Protocols](protocols.md) - [Exception Handling in Python](exception-handling.md) - [Generators](generators.md) +- [Eval Function](eval_function.md) From ea37cbb25457eaf0c650cd6822ff62fdb63da3a9 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sun, 2 Jun 2024 22:07:01 +0530 Subject: [PATCH 379/405] Create list_comprehension.md Added Introduction Added Syntax Added Examples Added Conclusion --- contrib/advanced-python/list_comprehension.md | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 contrib/advanced-python/list_comprehension.md diff --git a/contrib/advanced-python/list_comprehension.md b/contrib/advanced-python/list_comprehension.md new file mode 100644 index 0000000..d9ab589 --- /dev/null +++ b/contrib/advanced-python/list_comprehension.md @@ -0,0 +1,73 @@ +# List Comprehension + +Creating lists concisely and expressively is what list comprehension in Python does. You can generate lists from already existing iterables like lists, tuples or strings with a short form. +This boosts the readability of code and reduces necessity of using explicit looping constructs. + +## Syntax : + +### Basic syntax + +```python +new_list = [expression for item in iterable] +``` +- **new_list**: This is the name given to the list that will be created using the list comprehension. +- **expression**: This is the expression that defines how each element of the new list will be generated or transformed. +- **item**: This variable represents each individual element from the iterable. It takes on the value of each element in the iterable during each iteration. +- **iterable**: This is the sequence-like object over which the iteration will take place. It provides the elements that will be processed by the expression. + +This list comprehension syntax `[expression for item in iterable]` allows you to generate a new list by applying a specific expression to each element in an iterable. + +### Syntax including condition + +```python +new_list = [expression for item in iterable if condition] +``` +- **new_list**: This is the name given to the list that will be created using the list comprehension. +- **expression**: This is the expression that defines how each element of the new list will be generated or transformed. +- **item**: This variable represents each individual element from the iterable. It takes on the value of each element in the iterable during each iteration. +- **iterable**: This is the sequence-like object over which the iteration will take place. It provides the elements that will be processed by the expression. +- **if condition**: This is an optional part of the syntax. It allows for conditional filtering of elements from the iterable. Only items that satisfy the condition + will be included in the new list. + + +## Examples: + +1. Generating a list of squares of numbers from 1 to 5: + +```python +squares = [x ** 2 for x in range(1, 6)] +print(squares) +``` + +- **Output** : +```python +[1, 4, 9, 16, 25] +``` + +2. Filtering even numbers from a list: + +```python +nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] +even = [x for x in nums if x % 2 == 0] +print(even) +``` + +- **Output** : +```python +[2, 4, 6, 8, 10] +``` + +3. Flattening a list of lists: +```python +matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] +flat = [x for sublist in matrix for x in sublist] +print(flat) +``` + +- **Output** : +```python +[1, 2, 3, 4, 5, 6, 7, 8, 9] +``` + +List comprehension is a powerful feature in Python for creating lists based on existing iterables with a concise syntax. +By mastering list comprehension, developers can write cleaner, more expressive code and leverage Python's functional programming capabilities effectively. From b1f8d147a2abd103e4029c4e366011c1831fe784 Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sun, 2 Jun 2024 22:08:52 +0530 Subject: [PATCH 380/405] Update index.md Added List Comprehension section --- contrib/advanced-python/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index b31544e..7ae2ede 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -10,3 +10,4 @@ - [Protocols](protocols.md) - [Exception Handling in Python](exception-handling.md) - [Generators](generators.md) +- [List Comprehension](#list_comprehension.md) From 53efed98073fba08e3c2867676273f654882c9cb Mon Sep 17 00:00:00 2001 From: Lingamuneni Santhosh Siddhardha <103999924+Santhosh-Siddhardha@users.noreply.github.com> Date: Sun, 2 Jun 2024 22:11:33 +0530 Subject: [PATCH 381/405] Update index.md made a small change --- contrib/advanced-python/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 7ae2ede..631423a 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -10,4 +10,4 @@ - [Protocols](protocols.md) - [Exception Handling in Python](exception-handling.md) - [Generators](generators.md) -- [List Comprehension](#list_comprehension.md) +- [List Comprehension](list_comprehension.md) From 0f0d58ce2dc3b013c9e0a12561e7208ff58cf93a Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:18:27 +0530 Subject: [PATCH 382/405] Added Content: Scatter Chart in Matplotlib --- .../images/img_colorbar.png | Bin 0 -> 2386 bytes .../images/scatter_color.png | Bin 0 -> 12534 bytes .../images/scatter_coloreachdot.png | Bin 0 -> 12330 bytes .../images/scatter_colormap1.png | Bin 0 -> 12824 bytes .../images/scatter_colormap2.png | Bin 0 -> 17457 bytes .../images/scatter_compare.png | Bin 0 -> 12762 bytes .../images/simple_scatter.png | Bin 0 -> 11079 bytes 7 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/plotting-visualization/images/img_colorbar.png create mode 100644 contrib/plotting-visualization/images/scatter_color.png create mode 100644 contrib/plotting-visualization/images/scatter_coloreachdot.png create mode 100644 contrib/plotting-visualization/images/scatter_colormap1.png create mode 100644 contrib/plotting-visualization/images/scatter_colormap2.png create mode 100644 contrib/plotting-visualization/images/scatter_compare.png create mode 100644 contrib/plotting-visualization/images/simple_scatter.png diff --git a/contrib/plotting-visualization/images/img_colorbar.png b/contrib/plotting-visualization/images/img_colorbar.png new file mode 100644 index 0000000000000000000000000000000000000000..acc1ec5bd84d52a0f8bb3a9a4fc88405ca6e8edd GIT binary patch literal 2386 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/scatter_colormap1.png b/contrib/plotting-visualization/images/scatter_colormap1.png new file mode 100644 index 0000000000000000000000000000000000000000..212b368023d9babfbd95dc3e92106512ecb0ef55 GIT binary patch literal 12824 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

wwW_X%#MffrR3xV; zC!2kKdia%)eG+W>(3eiF=z126w$X2bm6Q!THW7N;>gKOx2QBaBY8Za&3Ve{7=dSEh zo)OTq4KT`7Ah%Vs3ksd##!)FS455wXO3GT~veI3r?@{ivjm3^ru$gB;_v_YH(%SCr z-;Q*e?KzoaxiZ~}TIuMwNVbA*OJ&1(Td25mHtk-70|nftKIz%uR9aSgq4wL>rHLaoVN-r0vu{gsgPI_Dbx2~1+YKKZdr8D;`Ud2C9+RDngJ7ORBU>6Z z5;!h-kfQ%Xn|wFfC(<^L0=>s#9US3iw3Y*uhSM8vK_MZD1Vno~RGqTu=63rV@8x^% z?kuc(6c5}#a723&Bh)u91}U*(pskJ-$J9->*5)C3)l%t8gQll8pH=$gte?NjydTrs z=e610-=(b?ZL36cq9!{X3fD9tC{cq{8oxyc_Y`dHJAlRgk1n@C0h%#P?sN5*FK@qz zt!hm{;aoQ8-ZPvt3GY|B%zJlAL6d+!WZ7OmIzXi<9$gPqy&$u2kQCMASB`rU0<=RR zmsnXJ+TJOwkF9ER*Ev_koT&Nr&}N;rmw_jYCZC6gCmo7u8#M7=rJj3+5(=R-WkcKu w3V0YbYz{*O&;RD4p1)*f{_TZBqq{_``+NF|9zJLRaTvi|QIO8OtatxE0MK}v%m4rY literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/simple_scatter.png b/contrib/plotting-visualization/images/simple_scatter.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa5b408811a67c88c7a42c396be6a327a3a971e GIT binary patch literal 11079 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 Date: Tue, 4 Jun 2024 00:22:12 +0530 Subject: [PATCH 383/405] Create matplotlib-scatter-plot.md --- .../matplotlib-scatter-plot.md | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 contrib/plotting-visualization/matplotlib-scatter-plot.md diff --git a/contrib/plotting-visualization/matplotlib-scatter-plot.md b/contrib/plotting-visualization/matplotlib-scatter-plot.md new file mode 100644 index 0000000..a9fa500 --- /dev/null +++ b/contrib/plotting-visualization/matplotlib-scatter-plot.md @@ -0,0 +1,155 @@ +# Scatter() plot in matplotlib +* A scatter plot is a type of data visualization that uses dots to show values for two variables, with one variable on the x-axis and the other on the y-axis. It's useful for identifying relationships, trends, and correlations, as well as spotting clusters and outliers. +* The dots on the plot shows how the variables are related. A scatter plot is made with the matplotlib library's `scatter() method`. +## Syntax +**Here's how to write code for the scatter() method:** +``` +matplotlib.pyplot.scatter (x_axis_value, y_axis_value, s = None, c = None, vmin = None, vmax = None, marker = None, cmap = None, alpha = None, linewidths = None, edgecolors = None) + +``` +## Prerequisites +Scatter plots can be created in Python with Matplotlib's pyplot library. To build a Scatter plot, first import matplotlib. It is a standard convention to import Matplotlib's pyplot library as plt. +``` +import matplotlib.pyplot as plt + +``` +## Creating a simple Scatter Plot +With Pyplot, you can use the `scatter()` function to draw a scatter plot. + +The `scatter()` function plots one dot for each observation. It needs two arrays of the same length, one for the values of the x-axis, and one for values on the y-axis: +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) +y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) + +plt.scatter(x, y) +plt.show() +``` + +When executed, this will show the following Scatter plot: + + + +## Compare Plots + +In a scatter plot, comparing plots involves examining multiple sets of points to identify differences or similarities in patterns, trends, or correlations between the data sets. + +``` +import matplotlib.pyplot as plt +import numpy as np + +#day one, the age and speed of 13 cars: +x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) +y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) +plt.scatter(x, y) + +#day two, the age and speed of 15 cars: +x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12]) +y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85]) +plt.scatter(x, y) + +plt.show() +``` + +When executed, this will show the following Compare Scatter plot: + +## Colors in Scatter plot +You can set your own color for each scatter plot with the `color` or the `c` argument: + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) +y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) +plt.scatter(x, y, color = 'hotpink') + +x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12]) +y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85]) +plt.scatter(x, y, color = '#88c999') + +plt.show() +``` + +When executed, this will show the following Colors Scatter plot: + +## Color Each Dot +You can even set a specific color for each dot by using an array of colors as value for the `c` argument: + +``**Note:** You cannot use the `color` argument for this, only the `c` argument.`` + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) +y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) +colors = np.array(["red","green","blue","yellow","pink","black","orange","purple","beige","brown","gray","cyan","magenta"]) + +plt.scatter(x, y, c=colors) + +plt.show() +``` + +When executed, this will show the following Color Each Dot: + +## ColorMap +The Matplotlib module has a number of available colormaps. + +A colormap is like a list of colors, where each color has a value that ranges from 0 to 100. + +Here is an example of a colormap: + + + + +This colormap is called 'viridis' and as you can see it ranges from 0, which is a purple color, up to 100, which is a yellow color. + +## How to Use the ColorMap +You can specify the colormap with the keyword argument `cmap` with the value of the colormap, in this case `'viridis'` which is one of the built-in colormaps available in Matplotlib. + +In addition you have to create an array with values (from 0 to 100), one value for each point in the scatter plot: + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) +y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) +colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100]) + +plt.scatter(x, y, c=colors, cmap='viridis') + +plt.show() +``` + +When executed, this will show the following Scatter ColorMap: + + + +You can include the colormap in the drawing by including the `plt.colorbar()` statement: + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6]) +y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86]) +colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100]) + +plt.scatter(x, y, c=colors, cmap='viridis') + +plt.colorbar() + +plt.show() +``` + +When executed, this will show the following Scatter ColorMap using `plt.colorbar()`: + + + + + + From edd8aec3a2b1f9855e7456d0065520d9a43243e2 Mon Sep 17 00:00:00 2001 From: rohit Date: Tue, 4 Jun 2024 00:28:41 +0530 Subject: [PATCH 384/405] Added K-Nearest Neighbors (KNN).md file --- .../K-nearest neighbor (KNN).md | 122 ++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 123 insertions(+) create mode 100644 contrib/machine-learning/K-nearest neighbor (KNN).md diff --git a/contrib/machine-learning/K-nearest neighbor (KNN).md b/contrib/machine-learning/K-nearest neighbor (KNN).md new file mode 100644 index 0000000..748f808 --- /dev/null +++ b/contrib/machine-learning/K-nearest neighbor (KNN).md @@ -0,0 +1,122 @@ +# K-Nearest Neighbors (KNN) Machine Learning Algorithm in Python + +## Introduction +K-Nearest Neighbors (KNN) is a simple, yet powerful, supervised machine learning algorithm used for both classification and regression tasks. It assumes that similar things exist in close proximity. In other words, similar data points are near to each other. + +## How KNN Works +KNN works by finding the distances between a query and all the examples in the data, selecting the specified number of examples (K) closest to the query, then voting for the most frequent label (in classification) or averaging the labels (in regression). + +### Steps: +1. **Choose the number K of neighbors** +2. **Calculate the distance** between the query-instance and all the training samples +3. **Sort the distances** and determine the nearest neighbors based on the K-th minimum distance +4. **Gather the labels** of the nearest neighbors +5. **Vote for the most frequent label** (in case of classification) or **average the labels** (in case of regression) + +## When to Use KNN +### Advantages: +- **Simple and easy to understand:** KNN is intuitive and easy to implement. +- **No training phase:** KNN is a lazy learner, meaning there is no explicit training phase. +- **Effective with a small dataset:** KNN performs well with a small number of input variables. + +### Disadvantages: +- **Computationally expensive:** The algorithm becomes significantly slower as the number of examples and/or predictors/independent variables increase. +- **Sensitive to irrelevant features:** All features contribute to the distance equally. +- **Memory-intensive:** Storing all the training data can be costly. + +### Use Cases: +- **Recommender Systems:** Suggest items based on similarity to user preferences. +- **Image Recognition:** Classify images by comparing new images to the training set. +- **Finance:** Predict credit risk or fraud detection based on historical data. + +## KNN in Python + +### Required Libraries +To implement KNN, we need the following Python libraries: +- `numpy` +- `pandas` +- `scikit-learn` +- `matplotlib` (for visualization) + +### Installation +```bash +pip install numpy pandas scikit-learn matplotlib +``` + +### Example Code +Let's implement a simple KNN classifier using the Iris dataset. + +#### Step 1: Import Libraries +```python +import numpy as np +import pandas as pd +from sklearn.model_selection import train_test_split +from sklearn.neighbors import KNeighborsClassifier +from sklearn.metrics import accuracy_score +import matplotlib.pyplot as plt +``` + +#### Step 2: Load Dataset +```python +from sklearn.datasets import load_iris +iris = load_iris() +X = iris.data +y = iris.target +``` + +#### Step 3: Split Dataset +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) +``` + +#### Step 4: Train KNN Model +```python +knn = KNeighborsClassifier(n_neighbors=3) +knn.fit(X_train, y_train) +``` + +#### Step 5: Make Predictions +```python +y_pred = knn.predict(X_test) +``` + +#### Step 6: Evaluate the Model +```python +accuracy = accuracy_score(y_test, y_pred) +print(f'Accuracy: {accuracy}') +``` + +### Visualization (Optional) +```python +# Plotting the decision boundary for visualization (for 2D data) +h = .02 # step size in the mesh +# Create color maps +cmap_light = plt.cm.RdYlBu +cmap_bold = plt.cm.RdYlBu + +# For simplicity, we take only the first two features of the dataset +X_plot = X[:, :2] +x_min, x_max = X_plot[:, 0].min() - 1, X_plot[:, 0].max() + 1 +y_min, y_max = X_plot[:, 1].min() - 1, y_plot[:, 1].max() + 1 +xx, yy = np.meshgrid(np.arange(x_min, x_max, h), + np.arange(y_min, y_max, h)) + +Z = knn.predict(np.c_[xx.ravel(), yy.ravel()]) +Z = Z.reshape(xx.shape) +plt.figure() +plt.pcolormesh(xx, yy, Z, cmap=cmap_light) + +# Plot also the training points +plt.scatter(X_plot[:, 0], X_plot[:, 1], c=y, edgecolor='k', cmap=cmap_bold) +plt.xlim(xx.min(), xx.max()) +plt.ylim(yy.min(), yy.max()) +plt.title("3-Class classification (k = 3)") +plt.show() +``` + +## Generalization and Considerations +- **Choosing K:** The choice of K is critical. Smaller values of K can lead to noisy models, while larger values make the algorithm computationally expensive and might oversimplify the model. +- **Feature Scaling:** Since KNN relies on distance calculations, features should be scaled (standardized or normalized) to ensure that all features contribute equally to the distance computation. +- **Distance Metrics:** The choice of distance metric (Euclidean, Manhattan, etc.) can affect the performance of the algorithm. + +In conclusion, KNN is a versatile and easy-to-implement algorithm suitable for various classification and regression tasks, particularly when working with small datasets and well-defined features. However, careful consideration should be given to the choice of K, feature scaling, and distance metrics to optimize its performance. \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index b6945cd..e5f5371 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -16,3 +16,4 @@ - [Types_of_Cost_Functions](cost-functions.md) - [Clustering](clustering.md) - [Grid Search](grid-search.md) +- [K-nearest neighbor (KNN)](K-nearest neighbor (KNN).md) \ No newline at end of file From c812fa29ac87b29857bb3c95ffbaeb766c5b5f8e Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:35:40 +0530 Subject: [PATCH 385/405] Update matplotlib-scatter-plot.md --- .../matplotlib-scatter-plot.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib-scatter-plot.md b/contrib/plotting-visualization/matplotlib-scatter-plot.md index a9fa500..535a3a3 100644 --- a/contrib/plotting-visualization/matplotlib-scatter-plot.md +++ b/contrib/plotting-visualization/matplotlib-scatter-plot.md @@ -2,7 +2,7 @@ * A scatter plot is a type of data visualization that uses dots to show values for two variables, with one variable on the x-axis and the other on the y-axis. It's useful for identifying relationships, trends, and correlations, as well as spotting clusters and outliers. * The dots on the plot shows how the variables are related. A scatter plot is made with the matplotlib library's `scatter() method`. ## Syntax -**Here's how to write code for the scatter() method:** +**Here's how to write code for the `scatter() method`:** ``` matplotlib.pyplot.scatter (x_axis_value, y_axis_value, s = None, c = None, vmin = None, vmax = None, marker = None, cmap = None, alpha = None, linewidths = None, edgecolors = None) @@ -30,7 +30,7 @@ plt.show() When executed, this will show the following Scatter plot: - +![Basic line Chart](images/simple_scatter.png) ## Compare Plots @@ -55,6 +55,8 @@ plt.show() When executed, this will show the following Compare Scatter plot: +![Compare Plots](images/scatter_compare.png) + ## Colors in Scatter plot You can set your own color for each scatter plot with the `color` or the `c` argument: @@ -75,10 +77,12 @@ plt.show() When executed, this will show the following Colors Scatter plot: +![Colors in Scatter plot](images/scatter_color.png) + ## Color Each Dot You can even set a specific color for each dot by using an array of colors as value for the `c` argument: -``**Note:** You cannot use the `color` argument for this, only the `c` argument.`` +``Note: You cannot use the `color` argument for this, only the `c` argument.`` ``` import matplotlib.pyplot as plt @@ -95,6 +99,8 @@ plt.show() When executed, this will show the following Color Each Dot: +![Color Each Dot](images/scatter_coloreachdot.png) + ## ColorMap The Matplotlib module has a number of available colormaps. @@ -102,8 +108,7 @@ A colormap is like a list of colors, where each color has a value that ranges fr Here is an example of a colormap: - - +![ColorMap](images/img_colorbar.png) This colormap is called 'viridis' and as you can see it ranges from 0, which is a purple color, up to 100, which is a yellow color. @@ -127,7 +132,7 @@ plt.show() When executed, this will show the following Scatter ColorMap: - +![Scatter ColorMap](images/scatter_colormap1.png) You can include the colormap in the drawing by including the `plt.colorbar()` statement: @@ -148,7 +153,7 @@ plt.show() When executed, this will show the following Scatter ColorMap using `plt.colorbar()`: - +![Scatter ColorMap1](images/scatter_colormap2.png) From 93eae0c0c908f7563c096c4563e9ac37a96a9b5e Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Tue, 4 Jun 2024 00:38:23 +0530 Subject: [PATCH 386/405] 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 3192f03..7e43d9b 100644 --- a/contrib/plotting-visualization/index.md +++ b/contrib/plotting-visualization/index.md @@ -5,5 +5,6 @@ - [Bar Plots in Matplotlib](matplotlib-bar-plots.md) - [Pie Charts in Matplotlib](matplotlib-pie-charts.md) - [Line Charts in Matplotlib](matplotlib-line-plots.md) +- [Scatter Plots in Matplotlib](matplotlib-scatter-plot.md) - [Introduction to Seaborn and Installation](seaborn-intro.md) - [Getting started with Seaborn](seaborn-basics.md) From 5678bc9cf3bfb93c1d938d56b06c11a36e3f94b1 Mon Sep 17 00:00:00 2001 From: Kosuri Indu Date: Tue, 4 Jun 2024 08:19:32 +0530 Subject: [PATCH 387/405] Added Hashing through linear probing --- .../ds-algorithms/hashing-linear-probing.md | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 contrib/ds-algorithms/hashing-linear-probing.md diff --git a/contrib/ds-algorithms/hashing-linear-probing.md b/contrib/ds-algorithms/hashing-linear-probing.md new file mode 100644 index 0000000..0d27db4 --- /dev/null +++ b/contrib/ds-algorithms/hashing-linear-probing.md @@ -0,0 +1,139 @@ +# Hashing with Linear Probing + +In Data Structures and Algorithms, hashing is used to map data of arbitrary size to fixed-size values. A common approach to handle collisions in hashing is **linear probing**. In linear probing, if a collision occurs (i.e., the hash value points to an already occupied slot), we linearly probe through the table to find the next available slot. This method ensures that every element can be inserted or found in the hash table. + +## Points to be Remembered + +- **Hash Function**: A function that converts an input (or 'key') into an index in a hash table. +- **Collision**: When two keys hash to the same index. +- **Linear Probing**: A method to resolve collisions by checking the next slot (i.e., index + 1) until an empty slot is found. + +## Real Life Examples of Hashing with Linear Probing + +- **Student Record System**: Each student record is stored in a table where the student's ID number is hashed to an index. If two students have the same hash index, linear probing finds the next available slot. +- **Library System**: Books are indexed by their ISBN numbers. If two books hash to the same slot, linear probing helps find another spot for the book in the catalog. + +## Applications of Hashing + +Hashing is widely used in Computer Science: + +- **Database Indexing** +- **Caches** (like CPU caches, web caches) +- **Associative Arrays** (or dictionaries in Python) +- **Sets** (unordered collections of unique elements) + +Understanding these applications is essential for Software Development. + +## Operations in Hash Table with Linear Probing + +Key operations include: + +- **INSERT**: Insert a new element into the hash table. +- **SEARCH**: Find the position of an element in the hash table. +- **DELETE**: Remove an element from the hash table. + +## Implementing Hash Table with Linear Probing in Python + +```python +class HashTable: + def __init__(self, size): + self.size = size + self.table = [None] * size + + def hash_function(self, key): + return key % self.size + + def insert(self, key, value): + hash_index = self.hash_function(key) + + if self.table[hash_index] is None: + self.table[hash_index] = (key, value) + else: + while self.table[hash_index] is not None: + hash_index = (hash_index + 1) % self.size + self.table[hash_index] = (key, value) + + def search(self, key): + hash_index = self.hash_function(key) + + while self.table[hash_index] is not None: + if self.table[hash_index][0] == key: + return self.table[hash_index][1] + hash_index = (hash_index + 1) % self.size + + return None + + def delete(self, key): + hash_index = self.hash_function(key) + + while self.table[hash_index] is not None: + if self.table[hash_index][0] == key: + self.table[hash_index] = None + return True + hash_index = (hash_index + 1) % self.size + + return False + + def display(self): + for index, item in enumerate(self.table): + print(f"Index {index}: {item}") + +# Example usage +hash_table = HashTable(10) + +hash_table.insert(1, 'A') +hash_table.insert(11, 'B') +hash_table.insert(21, 'C') + +print("Hash Table after Insert operations:") +hash_table.display() + +print("Search operation for key 11:", hash_table.search(11)) + +hash_table.delete(11) + +print("Hash Table after Delete operation:") +hash_table.display() +``` + +## Output + +```markdown +Hash Table after Insert operations: +Index 0: None +Index 1: (1, 'A') +Index 2: None +Index 3: None +Index 4: None +Index 5: None +Index 6: None +Index 7: None +Index 8: None +Index 9: None +Index 10: None +Index 11: (11, 'B') +Index 12: (21, 'C') + +Search operation for key 11: B + +Hash Table after Delete operation: +Index 0: None +Index 1: (1, 'A') +Index 2: None +Index 3: None +Index 4: None +Index 5: None +Index 6: None +Index 7: None +Index 8: None +Index 9: None +Index 10: None +Index 11: None +Index 12: (21, 'C') +``` + +## Complexity Analysis + +- **Insertion**: Average case O(1), Worst case O(n) when many collisions occur. +- **Search**: Average case O(1), Worst case O(n) when many collisions occur. +- **Deletion**: Average case O(1), Worst case O(n) when many collisions occur. \ No newline at end of file From 0699376c4b30dbe5c767c58f184a58e2ecdb6674 Mon Sep 17 00:00:00 2001 From: Mangalya Phaye <141892171+mdphaye@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:07:11 +0530 Subject: [PATCH 388/405] Rename Queues.md to queues.md --- contrib/ds-algorithms/{Queues.md => queues.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/ds-algorithms/{Queues.md => queues.md} (100%) diff --git a/contrib/ds-algorithms/Queues.md b/contrib/ds-algorithms/queues.md similarity index 100% rename from contrib/ds-algorithms/Queues.md rename to contrib/ds-algorithms/queues.md From f7dc61226c88c3f877d473cb71ca4142a5e7cad5 Mon Sep 17 00:00:00 2001 From: Pradnya Gaitonde <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:33:22 +0530 Subject: [PATCH 389/405] Create Type_Hinting.md Added Content on Type hinting in python --- contrib/advanced-python/Type_Hinting.md | 106 ++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 contrib/advanced-python/Type_Hinting.md diff --git a/contrib/advanced-python/Type_Hinting.md b/contrib/advanced-python/Type_Hinting.md new file mode 100644 index 0000000..fcf1e1c --- /dev/null +++ b/contrib/advanced-python/Type_Hinting.md @@ -0,0 +1,106 @@ +# Introduction to Type Hinting in Python +Type hinting is a feature in Python that allows you to specify the expected data types of variables, function arguments, and return values. It was introduced +in Python 3.5 via PEP 484 and has since become a standard practice to improve code readability and facilitate static analysis tools. + +**Benefits of Type Hinting** + +1. Improved Readability: Type hints make it clear what type of data is expected, making the code easier to understand for others and your future self. +2. Error Detection: Static analysis tools like MyPy can use type hints to detect type errors before runtime, reducing bugs and improving code quality. +3.Better Tooling Support: Modern IDEs and editors can leverage type hints to provide better autocompletion, refactoring, and error checking features. +4. Documentation: Type hints serve as a form of documentation, indicating the intended usage of functions and classes. + +**Syntax of Type Hinting**
+Type hints can be added to variables, function arguments, and return values using annotations. + +1. Variable Annotations: + +```bash +age: int = 25 +name: str = "Alice" +is_student: bool = True +``` + +2. Function Annotations: + +```bash +def greet(name: str) -> str: + return f"Hello, {name}!" +``` + +3. Multiple Arguments and Return Types: + +```bash +def add(a: int, b: int) -> int: + return a + b +``` + +4. Optional Types: Use the Optional type from the typing module for values that could be None. + +```bash +from typing import Optional + +def get_user_name(user_id: int) -> Optional[str]: + # Function logic here + return None # Example return value +``` + +5. Union Types: Use the Union type when a variable can be of multiple types. + +```bash +from typing import Union + +def get_value(key: str) -> Union[int, str]: + # Function logic here + return "value" # Example return value +``` + +6. List and Dictionary Types: Use the List and Dict types from the typing module for collections. + +```bash +from typing import List, Dict + +def process_data(data: List[int]) -> Dict[str, int]: + # Function logic here + return {"sum": sum(data)} # Example return value +``` + +7. Type Aliases: Create type aliases for complex types to make the code more readable. + +```bash +from typing import List, Tuple + +Coordinates = List[Tuple[int, int]] + +def draw_shape(points: Coordinates) -> None: + # Function logic here + pass +``` + +**Example of Type Hinting in a Class**
+Here is a more comprehensive example using type hints in a class: + +```bash +from typing import List + +class Student: + def __init__(self, name: str, age: int, grades: List[int]) -> None: + self.name = name + self.age = age + self.grades = grades + + def average_grade(self) -> float: + return sum(self.grades) / len(self.grades) + + def add_grade(self, grade: int) -> None: + self.grades.append(grade) + +# Example usage +student = Student("Alice", 20, [90, 85, 88]) +print(student.average_grade()) # Output: 87.66666666666667 +student.add_grade(92) +print(student.average_grade()) # Output: 88.75 +``` + +### Conclusion +Type hinting in Python enhances code readability, facilitates error detection through static analysis, and improves tooling support. By adopting +type hinting, you can write clearer and more maintainable code, reducing the likelihood of bugs and making your codebase easier to navigate for yourself and others. From 23a7577e92f4d1d618ef6784feec46a4294640f2 Mon Sep 17 00:00:00 2001 From: Pradnya Gaitonde <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:35:53 +0530 Subject: [PATCH 390/405] Update index.md Updated index for Type hinting content --- contrib/advanced-python/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 5ea5081..e2179e7 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,3 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) +- [Type Hinting/\*args/**kwargs](Type_Hinting.md) From a3961ff390a95c24b33bca10b047f89ec63a7201 Mon Sep 17 00:00:00 2001 From: Pradnya Gaitonde <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:44:22 +0530 Subject: [PATCH 391/405] Create Itertools_module.md Added content for itertools module in python. --- contrib/advanced-python/Itertools_module.md | 144 ++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 contrib/advanced-python/Itertools_module.md diff --git a/contrib/advanced-python/Itertools_module.md b/contrib/advanced-python/Itertools_module.md new file mode 100644 index 0000000..501a127 --- /dev/null +++ b/contrib/advanced-python/Itertools_module.md @@ -0,0 +1,144 @@ +# The 'itertools' Module in Python +The itertools module in Python provides a collection of fast, memory-efficient tools that are useful for creating and working with iterators. These functions +allow you to iterate over data in various ways, often combining, filtering, or extending iterators to generate complex sequences efficiently. + +## Benefits of itertools +1. Efficiency: Functions in itertools are designed to be memory-efficient, often generating elements on the fly and avoiding the need to store large intermediate results. +2. Conciseness: Using itertools can lead to more readable and concise code, reducing the need for complex loops and temporary variables. +3. Composability: Functions from itertools can be easily combined, allowing you to build complex iterator pipelines from simple building blocks. + +## Useful Functions in itertools
+Here are some of the most useful functions in the itertools module, along with examples of how to use them: + +1. 'count': Generates an infinite sequence of numbers, starting from a specified value. + +```bash +import itertools + +counter = itertools.count(start=10, step=2) +for _ in range(5): + print(next(counter)) +# Output: 10, 12, 14, 16, 18 +``` + +2. 'cycle': Cycles through an iterable indefinitely. + +```bash +import itertools + +cycler = itertools.cycle(['A', 'B', 'C']) +for _ in range(6): + print(next(cycler)) +# Output: A, B, C, A, B, C +``` + +3.'repeat': Repeats an object a specified number of times or indefinitely. + +```bash +import itertools + +repeater = itertools.repeat('Hello', 3) +for item in repeater: + print(item) +# Output: Hello, Hello, Hello +``` + +4. 'chain': Combines multiple iterables into a single iterable. + +```bash +import itertools + +combined = itertools.chain([1, 2, 3], ['a', 'b', 'c']) +for item in combined: + print(item) +# Output: 1, 2, 3, a, b, c +``` + +5. 'islice': Slices an iterator, similar to slicing a list. + +```bash +import itertools + +sliced = itertools.islice(range(10), 2, 8, 2) +for item in sliced: + print(item) +# Output: 2, 4, 6 +``` + +6. 'compress': Filters elements in an iterable based on a corresponding selector iterable. + +```bash +import itertools + +data = ['A', 'B', 'C', 'D'] +selectors = [1, 0, 1, 0] +result = itertools.compress(data, selectors) +for item in result: + print(item) +# Output: A, C +``` + +7. 'permutations': Generates all possible permutations of an iterable. + +```bash +import itertools + +perms = itertools.permutations('ABC', 2) +for item in perms: + print(item) +# Output: ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B') +``` + +8. 'combinations': Generates all possible combinations of a specified length from an iterable. + +```bash +import itertools + +combs = itertools.combinations('ABC', 2) +for item in combs: + print(item) +# Output: ('A', 'B'), ('A', 'C'), ('B', 'C') +``` + +9. 'product': Computes the Cartesian product of input iterables. + +```bash +import itertools + +prod = itertools.product('AB', '12') +for item in prod: + print(item) +# Output: ('A', '1'), ('A', '2'), ('B', '1'), ('B', '2') +``` + +10. 'groupby': Groups elements of an iterable by a specified key function. + +```bash +import itertools + +data = [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 25}, {'name': 'Charlie', 'age': 30}] +sorted_data = sorted(data, key=lambda x: x['age']) +grouped = itertools.groupby(sorted_data, key=lambda x: x['age']) +for key, group in grouped: + print(key, list(group)) +# Output: +# 25 [{'name': 'Alice', 'age': 25}, {'name': 'Bob', 'age': 25}] +# 30 [{'name': 'Charlie', 'age': 30}] +``` + +11. 'accumulate': Makes an iterator that returns accumulated sums, or accumulated results of other binary functions specified via the optional func argument. + +```bash +import itertools +import operator + +data = [1, 2, 3, 4, 5] +acc = itertools.accumulate(data, operator.mul) +for item in acc: + print(item) +# Output: 1, 2, 6, 24, 120 +``` + +## Conclusion +The itertools module is a powerful toolkit for working with iterators in Python. Its functions enable efficient and concise handling of iterable data, allowing you to create complex data processing pipelines with minimal memory overhead. +By leveraging itertools, you can improve the readability and performance of your code, making it a valuable addition to your Python programming arsenal. From 7a83f1524a4c4e5a1c6b27401d98b53fcc5492c4 Mon Sep 17 00:00:00 2001 From: Pradnya Gaitonde <116059908+PradnyaGaitonde@users.noreply.github.com> Date: Wed, 5 Jun 2024 00:48:20 +0530 Subject: [PATCH 392/405] Update index.md --- contrib/advanced-python/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index e2179e7..36bd103 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -1,4 +1,4 @@ # List of sections - [Decorators/\*args/**kwargs](decorator-kwargs-args.md) -- [Type Hinting/\*args/**kwargs](Type_Hinting.md) +- [Type Hinting](Type_Hinting.md) From bccf4eacf8e1364ac1a4229f08c7c9d8d0327f1f Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 6 Jun 2024 05:55:26 +0530 Subject: [PATCH 393/405] Update hierarchical-clustering.md --- .../hierarchical-clustering.md | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/contrib/machine-learning/hierarchical-clustering.md b/contrib/machine-learning/hierarchical-clustering.md index 3f9e606..9382270 100644 --- a/contrib/machine-learning/hierarchical-clustering.md +++ b/contrib/machine-learning/hierarchical-clustering.md @@ -2,20 +2,6 @@ Hierarchical Clustering is a method of cluster analysis that seeks to build a hierarchy of clusters. This README provides an overview of the hierarchical clustering algorithm, including its fundamental concepts, types, steps, and how to implement it using Python. -## Table of Contents - -1. [Introduction](#introduction) -2. [Concepts](#concepts) -3. [Types of Hierarchical Clustering](#types-of-hierarchical-clustering) -4. [Steps in Hierarchical Clustering](#steps-in-hierarchical-clustering) -5. [Linkage Criteria](#linkage-criteria) -6. [Implementation](#implementation) - - [Using Scikit-learn](#using-scikit-learn) - - [Code Example](#code-example) -7. [Evaluation Metrics](#evaluation-metrics) -8. [Conclusion](#conclusion) -9. [References](#references) - ## Introduction Hierarchical Clustering is an unsupervised learning method used to group similar objects into clusters. Unlike other clustering techniques, hierarchical clustering does not require the number of clusters to be specified beforehand. It produces a tree-like structure called a dendrogram, which displays the arrangement of the clusters and their sub-clusters. @@ -111,9 +97,3 @@ print(data.head()) ## Conclusion Hierarchical clustering is a versatile and intuitive method for clustering data. It is particularly useful when the number of clusters is not known beforehand. By understanding the different linkage criteria and evaluation metrics, one can effectively apply hierarchical clustering to various types of data. - -## References - -- [Scikit-learn Documentation](https://scikit-learn.org/stable/modules/clustering.html#hierarchical-clustering) -- [Wikipedia: Hierarchical Clustering](https://en.wikipedia.org/wiki/Hierarchical_clustering) -- [Towards Data Science: Hierarchical Clustering Explained](https://towardsdatascience.com/hierarchical-clustering-explained-925d9e1600c1) From c6c8ffe1f694f2795c468afac8655059146a2d1c Mon Sep 17 00:00:00 2001 From: Ankit Mahato Date: Thu, 6 Jun 2024 06:01:22 +0530 Subject: [PATCH 394/405] Update transformers.md --- contrib/machine-learning/transformers.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/contrib/machine-learning/transformers.md b/contrib/machine-learning/transformers.md index 0dcf697..7d4fa38 100644 --- a/contrib/machine-learning/transformers.md +++ b/contrib/machine-learning/transformers.md @@ -6,10 +6,12 @@ mechanism. Before transformers, predecessors of attention mechanism were added t Transformers are a revolutionary approach to natural language processing (NLP). Unlike older models, they excel at understanding long-range connections between words. This "attention" mechanism lets them grasp the context of a sentence, making them powerful for tasks like machine translation, text summarization, and question answering. Introduced in 2017, transformers are now the backbone of many large language models, including tools you might use every day. Their ability to handle complex relationships in language is fueling advancements in AI across various fields. ## Model Architecture -

- Model Architecture
-Source: Attention Is All You Need - Figure 1 -

+ +![Model Architecture](assets/transformer-architecture.png) + + +Source: [Attention Is All You Need](https://arxiv.org/pdf/1706.03762) + ### Encoder The encoder is composed of a stack of identical layers. Each layer has two sub-layers. The first is a multi-head self-attention mechanism, and the second is a simple, positionwise fully connected feed-forward network. Each encoder consists of two major components: a self-attention mechanism and a feed-forward neural network. The self-attention mechanism accepts input encodings from the previous encoder and weights their relevance to each other to generate output encodings. The feed-forward neural network further processes each output encoding individually. These output encodings are then passed to the next encoder as its input, as well as to the decoders. From 3d52c978c52da5c0120cb73b4be8ee77d9810613 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Thu, 6 Jun 2024 13:56:27 +0530 Subject: [PATCH 395/405] Update transformers.md Replaced html with latex equation outside the blockquotes --- contrib/machine-learning/transformers.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/contrib/machine-learning/transformers.md b/contrib/machine-learning/transformers.md index 7d4fa38..95ccada 100644 --- a/contrib/machine-learning/transformers.md +++ b/contrib/machine-learning/transformers.md @@ -9,7 +9,6 @@ Transformers are a revolutionary approach to natural language processing (NLP). ![Model Architecture](assets/transformer-architecture.png) - Source: [Attention Is All You Need](https://arxiv.org/pdf/1706.03762) @@ -21,12 +20,12 @@ The decoder is also composed of a stack of identical layers. In addition to the ### Attention #### Scaled Dot-Product Attention -The input consists of queries and keys of dimension dk, and values of dimension dv. We compute the dot products of the query with all keys, divide each by √dk, and apply a softmax function to obtain the weights on the values. +The input consists of queries and keys of dimension $d_k$ , and values of dimension $d_v$. We compute the dot products of the query with all keys, divide each by $\sqrt d_k$ , and apply a softmax function to obtain the weights on the values. > Attention(Q, K, V) = softmax(QKT / √dk) * V #### Multi-Head Attention -Instead of performing a single attention function with dmodel-dimensional keys, values and queries, it is beneficial to linearly project the queries, keys and values h times with different, learned linear projections to dk, dk and dv dimensions, respectively. +Instead of performing a single attention function with $d_{model}$-dimensional keys, values and queries, it is beneficial to linearly project the queries, keys and values h times with different, learned linear projections to $d_k$ , $d_k$ and $d_v$ dimensions, respectively. Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this. @@ -41,7 +40,7 @@ where the projections are parameter matrices. #### Masked Attention It may be necessary to cut out attention links between some word-pairs. For example, the decoder for token position -𝑡 should not have access to token position 𝑡+1. +$t$ should not have access to token position $t+1$. > MaskedAttention(Q, K, V) = softmax(M + (QKT / √dk)) * V From b230028124bcc03f56ed8f87ebeb437a38bce21c Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Thu, 6 Jun 2024 14:17:40 +0530 Subject: [PATCH 396/405] Update transformers.md Mathematical equations are converted to LaTex mathematical equations. --- contrib/machine-learning/transformers.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/contrib/machine-learning/transformers.md b/contrib/machine-learning/transformers.md index 95ccada..5a27688 100644 --- a/contrib/machine-learning/transformers.md +++ b/contrib/machine-learning/transformers.md @@ -20,9 +20,9 @@ The decoder is also composed of a stack of identical layers. In addition to the ### Attention #### Scaled Dot-Product Attention -The input consists of queries and keys of dimension $d_k$ , and values of dimension $d_v$. We compute the dot products of the query with all keys, divide each by $\sqrt d_k$ , and apply a softmax function to obtain the weights on the values. +The input consists of queries and keys of dimension $d_k$ , and values of dimension $d_v$. We compute the dot products of the query with all keys, divide each by $\sqrt {d_k}$ , and apply a softmax function to obtain the weights on the values. -> Attention(Q, K, V) = softmax(QKT / √dk) * V +$$Attention(Q, K, V) = softmax(\dfrac{QK^T}{\sqrt{d_k}}) \times V$$ #### Multi-Head Attention Instead of performing a single attention function with $d_{model}$-dimensional keys, values and queries, it is beneficial to linearly project the queries, keys and values h times with different, learned linear projections to $d_k$ , $d_k$ and $d_v$ dimensions, respectively. @@ -30,11 +30,11 @@ Instead of performing a single attention function with $d_{model}$-dimensional k Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this. -> MultiHead(Q, K, V) = Concat(head1, ..., headh) * WO +$$MultiHead(Q, K, V) = Concat(head_1, _{...}, head_h) \times W^O$$ where, -> headi = Attention(Q * WiQ, K * WiK, V * WiV) +$$head_i = Attention(QW_i^Q, KW_i^K, VW_i^V)$$ where the projections are parameter matrices. @@ -42,20 +42,22 @@ where the projections are parameter matrices. It may be necessary to cut out attention links between some word-pairs. For example, the decoder for token position $t$ should not have access to token position $t+1$. -> MaskedAttention(Q, K, V) = softmax(M + (QKT / √dk)) * V +$$MaskedAttention(Q, K, V) = softmax(M + \dfrac{QK^T}{\sqrt{d_k}}) \times V$$ ### Feed-Forward Network Each of the layers in the encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This consists of two linear transformations with a ReLU activation in between. -> FFN(x) = (max(0, (x * W1) + b1) * W2) + b2 + +$$FFN(x) = max(0, xW_1 + b_1)W_2 + b_2$$ ### Positional Encoding A positional encoding is a fixed-size vector representation that encapsulates the relative positions of tokens within a target sequence: it provides the transformer model with information about where the words are in the input sequence. The sine and cosine functions of different frequencies: -> PE(pos,2i) = sin(pos/100002i/dmodel) -> PE(pos,2i+1) = cos(pos/100002i/dmodel) +$$PE(pos,2i) = \sin({\dfrac{pos}{10000^{\dfrac{2i}{d_{model}}}}})$$ + +$$PE(pos,2i) = \cos({\dfrac{pos}{10000^{\dfrac{2i}{d_{model}}}}})$$ ## Implementation ### Theory From 35c8620187ea011e49025d414c0e82fa33d31f62 Mon Sep 17 00:00:00 2001 From: Kosuri Indu Date: Thu, 6 Jun 2024 23:56:03 +0530 Subject: [PATCH 397/405] Added in index.md --- contrib/ds-algorithms/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 1d7293b..30881ac 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -13,3 +13,4 @@ - [Stacks in Python](stacks.md) - [Sliding Window Technique](sliding-window.md) - [Trie](trie.md) +- [Hashing through Linear Probing](hashing-linear-probing.md) From 8bafaaa091b06d8cbcd49b607633276ea70d3b01 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 10:20:05 +0530 Subject: [PATCH 398/405] Rename K-nearest neighbor (KNN).md to knn.md --- .../machine-learning/{K-nearest neighbor (KNN).md => knn.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{K-nearest neighbor (KNN).md => knn.md} (99%) diff --git a/contrib/machine-learning/K-nearest neighbor (KNN).md b/contrib/machine-learning/knn.md similarity index 99% rename from contrib/machine-learning/K-nearest neighbor (KNN).md rename to contrib/machine-learning/knn.md index 748f808..85578f3 100644 --- a/contrib/machine-learning/K-nearest neighbor (KNN).md +++ b/contrib/machine-learning/knn.md @@ -119,4 +119,4 @@ plt.show() - **Feature Scaling:** Since KNN relies on distance calculations, features should be scaled (standardized or normalized) to ensure that all features contribute equally to the distance computation. - **Distance Metrics:** The choice of distance metric (Euclidean, Manhattan, etc.) can affect the performance of the algorithm. -In conclusion, KNN is a versatile and easy-to-implement algorithm suitable for various classification and regression tasks, particularly when working with small datasets and well-defined features. However, careful consideration should be given to the choice of K, feature scaling, and distance metrics to optimize its performance. \ No newline at end of file +In conclusion, KNN is a versatile and easy-to-implement algorithm suitable for various classification and regression tasks, particularly when working with small datasets and well-defined features. However, careful consideration should be given to the choice of K, feature scaling, and distance metrics to optimize its performance. From 906333954390d915e4c85b92e6ccc95919a878d8 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 10:20:27 +0530 Subject: [PATCH 399/405] 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 e5f5371..deafdda 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -16,4 +16,4 @@ - [Types_of_Cost_Functions](cost-functions.md) - [Clustering](clustering.md) - [Grid Search](grid-search.md) -- [K-nearest neighbor (KNN)](K-nearest neighbor (KNN).md) \ No newline at end of file +- [K-nearest neighbor (KNN)](knn.md) From c7adf3b7c6154849e621124963a7810edcd0c6c0 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 10:28:51 +0530 Subject: [PATCH 400/405] Rename ensemble_learning.md to ensemble-learning.md --- .../{ensemble_learning.md => ensemble-learning.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename contrib/machine-learning/{ensemble_learning.md => ensemble-learning.md} (98%) diff --git a/contrib/machine-learning/ensemble_learning.md b/contrib/machine-learning/ensemble-learning.md similarity index 98% rename from contrib/machine-learning/ensemble_learning.md rename to contrib/machine-learning/ensemble-learning.md index 940bd09..508f45e 100644 --- a/contrib/machine-learning/ensemble_learning.md +++ b/contrib/machine-learning/ensemble-learning.md @@ -137,4 +137,4 @@ print("Classification Report:\n", classification_report(y_test, y_pred)) ``` ## Conclusion -Ensemble Learning is a powerful technique that combines multiple models to improve overall performance. By leveraging the strengths of different models, it provides better accuracy, robustness, and generalization. However, it comes with increased complexity and computational cost. Understanding and implementing ensemble methods can significantly enhance machine learning solutions. \ No newline at end of file +Ensemble Learning is a powerful technique that combines multiple models to improve overall performance. By leveraging the strengths of different models, it provides better accuracy, robustness, and generalization. However, it comes with increased complexity and computational cost. Understanding and implementing ensemble methods can significantly enhance machine learning solutions. From 26b6691bf4de1f29fcf7475f1368a4571a0226ac Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 10:29:21 +0530 Subject: [PATCH 401/405] Update index.md --- contrib/machine-learning/index.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index e64c95d..8e2d84e 100644 --- a/contrib/machine-learning/index.md +++ b/contrib/machine-learning/index.md @@ -11,8 +11,7 @@ - [TensorFlow.md](tensorFlow.md) - [PyTorch.md](pytorch.md) - [Types of optimizers](Types_of_optimizers.md) -- [Random Forest](Random_Forest.md) -- [Ensemble Learning](ensemble_learning.md) +- [Ensemble Learning](ensemble-learning.md) - [Logistic Regression](logistic-regression.md) - [Clustering](clustering.md) - [Grid Search](grid-search.md) From f637a28ba1c2326adedeea7fdf633f48e2199e2f Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 11:00:46 +0530 Subject: [PATCH 402/405] Update index.md --- contrib/advanced-python/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/advanced-python/index.md b/contrib/advanced-python/index.md index 631423a..f61fdf0 100644 --- a/contrib/advanced-python/index.md +++ b/contrib/advanced-python/index.md @@ -10,4 +10,4 @@ - [Protocols](protocols.md) - [Exception Handling in Python](exception-handling.md) - [Generators](generators.md) -- [List Comprehension](list_comprehension.md) +- [List Comprehension](list-comprehension.md) From c2740251604764cb12945841c828dc0033fbb151 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 11:01:08 +0530 Subject: [PATCH 403/405] Rename list_comprehension.md to list-comprehension.md --- .../{list_comprehension.md => list-comprehension.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/advanced-python/{list_comprehension.md => list-comprehension.md} (100%) diff --git a/contrib/advanced-python/list_comprehension.md b/contrib/advanced-python/list-comprehension.md similarity index 100% rename from contrib/advanced-python/list_comprehension.md rename to contrib/advanced-python/list-comprehension.md From 98ad137d915cdb5039045aa0ee7f0c696c02ade5 Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 11:34:42 +0530 Subject: [PATCH 404/405] Rename Type_Hinting.md to type-hinting.md --- contrib/advanced-python/{Type_Hinting.md => type-hinting.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/advanced-python/{Type_Hinting.md => type-hinting.md} (100%) diff --git a/contrib/advanced-python/Type_Hinting.md b/contrib/advanced-python/type-hinting.md similarity index 100% rename from contrib/advanced-python/Type_Hinting.md rename to contrib/advanced-python/type-hinting.md From 3e346a29a6bcddd25fe0c7af7b8b2dbffe74a3da Mon Sep 17 00:00:00 2001 From: Ashita Prasad Date: Sat, 8 Jun 2024 11:37:03 +0530 Subject: [PATCH 405/405] Rename Itertools_module.md to itertools.md --- contrib/advanced-python/{Itertools_module.md => itertools.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename contrib/advanced-python/{Itertools_module.md => itertools.md} (100%) diff --git a/contrib/advanced-python/Itertools_module.md b/contrib/advanced-python/itertools.md similarity index 100% rename from contrib/advanced-python/Itertools_module.md rename to contrib/advanced-python/itertools.md

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 246/405] 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 247/405] 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 248/405] 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 249/405] 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 250/405] 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 251/405] 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 252/405] 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 253/405] 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 254/405] 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 255/405] 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 256/405] 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 257/405] 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 258/405] 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 259/405] 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 260/405] 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 261/405] 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 262/405] 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 263/405] 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 264/405] 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 265/405] 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 266/405] 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 267/405] 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 268/405] 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 269/405] 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 270/405] 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 271/405] 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 272/405] 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 273/405] 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 274/405] 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 275/405] 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 276/405] 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 bdbe355c485de10dfea943108434b756e624a889 Mon Sep 17 00:00:00 2001 From: Soubeer Koley Date: Fri, 31 May 2024 08:23:22 +0530 Subject: [PATCH 277/405] updated index --- 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..073bca9 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) +- [Random Forest](Random_Forest.md) \ No newline at end of file From 4888094a059aad26f1eba062b4765b70b9b19ee8 Mon Sep 17 00:00:00 2001 From: saiumasankar Date: Fri, 31 May 2024 09:26:56 +0530 Subject: [PATCH 278/405] Create Trie.md --- contrib/ds-algorithms/Trie.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/ds-algorithms/Trie.md diff --git a/contrib/ds-algorithms/Trie.md b/contrib/ds-algorithms/Trie.md new file mode 100644 index 0000000..e69de29 From 3f51f48ee55690c7f64e591a729d9cb034264ca4 Mon Sep 17 00:00:00 2001 From: SAM <8dmasters@gmail.com> Date: Fri, 31 May 2024 10:00:10 +0530 Subject: [PATCH 279/405] Create Transformers.md Added a empty .md file to be served as a guide for Transformers --- contrib/machine-learning/Transformers.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/machine-learning/Transformers.md diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md new file mode 100644 index 0000000..e69de29 From cd74a77397850249e8910638f41149a86476f37b Mon Sep 17 00:00:00 2001 From: Ritesh Date: Fri, 31 May 2024 10:17:29 +0530 Subject: [PATCH 280/405] 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 281/405] 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 97f852c99616cab741e8c06469f239bd34b74dd6 Mon Sep 17 00:00:00 2001 From: rohit Date: Fri, 31 May 2024 10:26:09 +0530 Subject: [PATCH 282/405] Added sklearn.md file --- contrib/machine-learning/index.md | 1 + contrib/machine-learning/sklearn.md | 144 ++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 contrib/machine-learning/sklearn.md diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..68bd24d 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) +- [sklearn.md](sklearn.md) diff --git a/contrib/machine-learning/sklearn.md b/contrib/machine-learning/sklearn.md new file mode 100644 index 0000000..8174d93 --- /dev/null +++ b/contrib/machine-learning/sklearn.md @@ -0,0 +1,144 @@ +# scikit-learn (sklearn) Python Library + +## Overview + +scikit-learn, also known as sklearn, is a popular open-source Python library that provides simple and efficient tools for data mining and data analysis. It is built on NumPy, SciPy, and matplotlib. The library is designed to interoperate with the Python numerical and scientific libraries. + +## Key Features + +- **Classification**: Identifying which category an object belongs to. Example algorithms include SVM, nearest neighbors, random forest. +- **Regression**: Predicting a continuous-valued attribute associated with an object. Example algorithms include support vector regression (SVR), ridge regression, Lasso. +- **Clustering**: Automatic grouping of similar objects into sets. Example algorithms include k-means, spectral clustering, mean-shift. +- **Dimensionality Reduction**: Reducing the number of random variables to consider. Example algorithms include PCA, feature selection, non-negative matrix factorization. +- **Model Selection**: Comparing, validating, and choosing parameters and models. Example methods include grid search, cross-validation, metrics. +- **Preprocessing**: Feature extraction and normalization. + +## When to Use scikit-learn + +- **Use scikit-learn if**: + - You are working on machine learning tasks such as classification, regression, clustering, dimensionality reduction, model selection, and preprocessing. + - You need an easy-to-use, well-documented library. + - You require tools that are compatible with NumPy and SciPy. + +- **Do not use scikit-learn if**: + - You need to perform deep learning tasks. In such cases, consider using TensorFlow or PyTorch. + - You need out-of-the-box support for large-scale data. scikit-learn is designed to work with in-memory data, so for very large datasets, you might want to consider libraries like Dask-ML. + +## Installation + +You can install scikit-learn using pip: + +```bash +pip install scikit-learn +``` + +Or via conda: + +```bash +conda install scikit-learn +``` + +## Basic Usage with Code Snippets + +### Importing the Library + +```python +import numpy as np +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import accuracy_score +``` + +### Loading Data + +For illustration, let's create a simple synthetic dataset: + +```python +from sklearn.datasets import make_classification + +X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42) +``` + +### Splitting Data + +Split the dataset into training and testing sets: + +```python +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) +``` + +### Preprocessing + +Standardizing the features: + +```python +scaler = StandardScaler() +X_train = scaler.fit_transform(X_train) +X_test = scaler.transform(X_test) +``` + +### Training a Model + +Train a Logistic Regression model: + +```python +model = LogisticRegression() +model.fit(X_train, y_train) +``` + +### Making Predictions + +Make predictions on the test set: + +```python +y_pred = model.predict(X_test) +``` + +### Evaluating the Model + +Evaluate the accuracy of the model: + +```python +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +``` + +### Putting it All Together + +Here is a complete example from data loading to model evaluation: + +```python +import numpy as np +from sklearn.datasets import make_classification +from sklearn.model_selection import train_test_split +from sklearn.preprocessing import StandardScaler +from sklearn.linear_model import LogisticRegression +from sklearn.metrics import accuracy_score + +# Load data +X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42) + +# Split data +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) + +# Preprocess data +scaler = StandardScaler() +X_train = scaler.fit_transform(X_train) +X_test = scaler.transform(X_test) + +# Train model +model = LogisticRegression() +model.fit(X_train, y_train) + +# Make predictions +y_pred = model.predict(X_test) + +# Evaluate model +accuracy = accuracy_score(y_test, y_pred) +print(f"Accuracy: {accuracy * 100:.2f}%") +``` + +## Conclusion + +scikit-learn is a powerful and versatile library that can be used for a wide range of machine learning tasks. It is particularly well-suited for beginners due to its easy-to-use interface and extensive documentation. Whether you are working on a simple classification task or a more complex clustering problem, scikit-learn provides the tools you need to build and evaluate your models effectively. \ No newline at end of file From b72cf4ad5a778264701ce634df9d7a6c6f5c5d49 Mon Sep 17 00:00:00 2001 From: saiumasankar Date: Fri, 31 May 2024 11:12:37 +0530 Subject: [PATCH 283/405] adding Trie Data structure --- contrib/ds-algorithms/Trie.md | 152 ++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/contrib/ds-algorithms/Trie.md b/contrib/ds-algorithms/Trie.md index e69de29..43f0415 100644 --- a/contrib/ds-algorithms/Trie.md +++ b/contrib/ds-algorithms/Trie.md @@ -0,0 +1,152 @@ +# Trie + +A Trie is a tree-like data structure used for storing a dynamic set of strings where the keys are usually strings. It is also known as prefix tree or digital tree. + +>Trie is a type of search tree, where each node represents a single character of a string. + +>Nodes are linked in such a way that they form a tree, where each path from the root to a leaf node represents a unique string stored in the Trie. + +## Characteristics of Trie +- **Prefix Matching**: Tries are particularly useful for prefix matching operations. Any node in the Trie represents a common prefix of all strings below it. +- **Space Efficiency**: Tries can be more space-efficient than other data structures like hash tables for storing large sets of strings with common prefixes. +- **Time Complexity**: Insertion, deletion, and search operations in a Trie have a time complexity of +𝑂(𝑚), where m is the length of the string. This makes Tries very efficient for these operations. + +## Structure of Trie + +Trie mainly consists of three parts: +- **Root**: The root of a Trie is an empty node that does not contain any character. +- **Edges**: Each edge in the Trie represents a character in the alphabet of the stored strings. +- **Nodes**: Each node contains a character and possibly additional information, such as a boolean flag indicating if the node represents the end of a valid string. + +To implement the nodes of trie. We use Classes in Python. Each node is an object of the Node Class. + +Node Class have mainly two components +- *Array of size 26*: It is used to represent the 26 alphabets. Initially all are None. While inserting the words, then array will be filled with object of child nodes. +- *End of word*: It is used to represent the end of word while inserting. + +Code Block of Node Class : + +``` +class Node: + def __init__(self): + self.alphabets = [None] * 26 + self.end_of_word = 0 +``` + +Now we need to implement Trie. We create another class named Trie with some methods like Insertion, Searching and Deletion. + +**Initialization:** In this, we initializes the Trie with a `root` node. + +Code Implementation of Initialization: + +``` +class Trie: + def __init__(self): + self.root = Node() +``` + +## Operations on Trie + +1. **Insertion**: Inserts the word into the Trie. This method takes `word` as parameter. For each character in the word, it checks if there is a corresponding child node. If not, it creates a new `Node`. After processing all the characters in word, it increments the `end_of_word` value of the last node. + +Code Implementation of Insertion: +``` +def insert(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + node.alphabets[index] = Node() + node = node.alphabets[index] + node.end_of_word += 1 +``` + +2. **Searching**: Search the `word` in trie. Searching process starts from the `root` node. Each character of the `word` is processed. After traversing the whole word in trie, it return the count of words. + +There are two cases in Searching: +- *Word Not found*: It happens when the word we search not present in the trie. This case will occur, if the value of `alphabets` array at that character is `None` or if the value of `end_of_word` of the node, reached after traversing the whole word is `0`. +- *Word found*: It happens when the search word is present in the Trie. This case will occur, when the `end_of_word` value is greater than `0` of the node after traversing the whole word. + +Code Implementation of Searching: +``` + def Search(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + return 0 + node = node.alphabets[index] + return node.end_of_word +``` + +3. **Deletion**: To delete a string, follow the path of the string. If the end node is reached and `end_of_word` is greater than `0` then decrement the value. + +Code Implementation of Deletion: + +``` +def delete(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + node = node.alphabets[index] + if node.end_of_word: + node.end_of_word-=1 +``` + +Python Code to implement Trie: + +``` +class Node: + def __init__(self): + self.alphabets = [None] * 26 + self.end_of_word = 0 + +class Trie: + def __init__(self): + self.root = Node() + + def insert(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + node.alphabets[index] = Node() + node = node.alphabets[index] + node.end_of_word += 1 + + def Search(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + if not node.alphabets[index]: + return 0 + node = node.alphabets[index] + return node.end_of_word + + def delete(self, word): + node = self.root + for char in word: + index = ord(char) - ord('a') + node = node.alphabets[index] + if node.end_of_word: + node.end_of_word-=1 + +if __name__ == "__main__": + trie = Trie() + + word1 = "apple" + word2 = "app" + word3 = "bat" + + trie.insert(word1) + trie.insert(word2) + trie.insert(word3) + + print(trie.Search(word1)) + print(trie.Search(word2)) + print(trie.Search(word3)) + + trie.delete(word2) + print(trie.Search(word2)) +``` From 0a6d9cd1bfedd86cd85a0414e92f43014e9e8c19 Mon Sep 17 00:00:00 2001 From: saiumasankar Date: Fri, 31 May 2024 11:25:29 +0530 Subject: [PATCH 284/405] update index.md --- contrib/ds-algorithms/index.md | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 31cff39..653cc98 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,3 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) +- [Trie](Trie.md) From d00f146401afba7514f183291d40a62de92866ba Mon Sep 17 00:00:00 2001 From: Yogesh Vishwakarma Date: Fri, 31 May 2024 11:34:39 +0530 Subject: [PATCH 285/405] created Sliding_Window.md and updated index.md --- contrib/ds-algorithms/Sliding_Window.md | 249 ++++++++++++++++++++++++ contrib/ds-algorithms/index.md | 1 + 2 files changed, 250 insertions(+) create mode 100644 contrib/ds-algorithms/Sliding_Window.md diff --git a/contrib/ds-algorithms/Sliding_Window.md b/contrib/ds-algorithms/Sliding_Window.md new file mode 100644 index 0000000..72aa191 --- /dev/null +++ b/contrib/ds-algorithms/Sliding_Window.md @@ -0,0 +1,249 @@ +# Sliding Window Technique + +The sliding window technique is a fundamental approach used to solve problems involving arrays, lists, or sequences. It's particularly useful when you need to calculate something over a subarray or sublist of fixed size that slides over the entire array. + +In easy words, It is the transformation of the nested loops into the single loop +## Concept + +The sliding window technique involves creating a window (a subarray or sublist) that moves or "slides" across the entire array. This window can either be fixed in size or dynamically resized. By maintaining and updating this window as it moves, you can optimize certain computations, reducing time complexity. + +## Types of Sliding Windows + +1. **Fixed Size Window**: The window size remains constant as it slides from the start to the end of the array. +2. **Variable Size Window**: The window size can change based on certain conditions, such as the sum of elements within the window meeting a specified target. + +## Steps to Implement a Sliding Window + +1. **Initialize the Window**: Set the initial position of the window and any required variables (like sum, count, etc.). +2. **Expand the Window**: Add the next element to the window and update the relevant variables. +3. **Shrink the Window**: If needed, remove elements from the start of the window and update the variables. +4. **Slide the Window**: Move the window one position to the right by including the next element and possibly excluding the first element. +5. **Repeat**: Continue expanding, shrinking, and sliding the window until you reach the end of the array. + +## Example Problems + +### 1. Maximum Sum Subarray of Fixed Size K + +Given an array of integers and an integer k, find the maximum sum of a subarray of size k. + +**Steps:** + +1. Initialize the sum of the first k elements. +2. Slide the window from the start of the array to the end, updating the sum by subtracting the element that is left behind and adding the new element. +3. Track the maximum sum encountered. + +**Python Code:** + +```python +def max_sum_subarray(arr, k): + n = len(arr) + if n < k: + return None + + # Compute the sum of the first window + window_sum = sum(arr[:k]) + max_sum = window_sum + + # Slide the window from start to end + for i in range(n - k): + window_sum = window_sum - arr[i] + arr[i + k] + max_sum = max(max_sum, window_sum) + + return max_sum + +# Example usage: +arr = [1, 3, 2, 5, 1, 1, 6, 2, 8, 5] +k = 3 +print(max_sum_subarray(arr, k)) # Output: 16 +``` + +### 2. Longest Substring Without Repeating Characters + +Given a string, find the length of the longest substring without repeating characters. + +**Steps:** + +1. Use two pointers to represent the current window. +2. Use a set to track characters in the current window. +3. Expand the window by moving the right pointer. +4. If a duplicate character is found, shrink the window by moving the left pointer until the duplicate is removed. + +**Python Code:** + +```python +def longest_unique_substring(s): + n = len(s) + char_set = set() + left = 0 + max_length = 0 + + for right in range(n): + while s[right] in char_set: + char_set.remove(s[left]) + left += 1 + char_set.add(s[right]) + max_length = max(max_length, right - left + 1) + + return max_length + +# Example usage: +s = "abcabcbb" +print(longest_unique_substring(s)) # Output: 3 +``` +## 3. Minimum Size Subarray Sum + +Given an array of positive integers and a positive integer `s`, find the minimal length of a contiguous subarray of which the sum is at least `s`. If there isn't one, return 0 instead. + +### Steps: +1. Use two pointers, `left` and `right`, to define the current window. +2. Expand the window by moving `right` and adding `arr[right]` to `current_sum`. +3. If `current_sum` is greater than or equal to `s`, update `min_length` and shrink the window from the left by moving `left` and subtracting `arr[left]` from `current_sum`. +4. Repeat until `right` has traversed the array. + +### Python Code: +```python +def min_subarray_len(s, arr): + n = len(arr) + left = 0 + current_sum = 0 + min_length = float('inf') + + for right in range(n): + current_sum += arr[right] + + while current_sum >= s: + min_length = min(min_length, right - left + 1) + current_sum -= arr[left] + left += 1 + + return min_length if min_length != float('inf') else 0 + +# Example usage: +arr = [2, 3, 1, 2, 4, 3] +s = 7 +print(min_subarray_len(s, arr)) # Output: 2 (subarray [4, 3]) +``` + +## 4. Longest Substring with At Most K Distinct Characters + +Given a string `s` and an integer `k`, find the length of the longest substring that contains at most `k` distinct characters. + +### Steps: +1. Use two pointers, `left` and `right`, to define the current window. +2. Use a dictionary `char_count` to count characters in the window. +3. Expand the window by moving `right` and updating `char_count`. +4. If `char_count` has more than `k` distinct characters, shrink the window from the left by moving `left` and updating `char_count`. +5. Keep track of the maximum length of the window with at most `k` distinct characters. + +### Python Code: +```python +def longest_substring_k_distinct(s, k): + n = len(s) + char_count = {} + left = 0 + max_length = 0 + + for right in range(n): + char_count[s[right]] = char_count.get(s[right], 0) + 1 + + while len(char_count) > k: + char_count[s[left]] -= 1 + if char_count[s[left]] == 0: + del char_count[s[left]] + left += 1 + + max_length = max(max_length, right - left + 1) + + return max_length + +# Example usage: +s = "eceba" +k = 2 +print(longest_substring_k_distinct(s, k)) # Output: 3 (substring "ece") +``` + +## 5. Maximum Number of Vowels in a Substring of Given Length + +Given a string `s` and an integer `k`, return the maximum number of vowel letters in any substring of `s` with length `k`. + +### Steps: +1. Use a sliding window of size `k`. +2. Keep track of the number of vowels in the current window. +3. Expand the window by adding the next character and update the count if it's a vowel. +4. If the window size exceeds `k`, remove the leftmost character and update the count if it's a vowel. +5. Track the maximum number of vowels found in any window of size `k`. + +### Python Code: +```python +def max_vowels(s, k): + vowels = set('aeiou') + max_vowel_count = 0 + current_vowel_count = 0 + + for i in range(len(s)): + if s[i] in vowels: + current_vowel_count += 1 + if i >= k: + if s[i - k] in vowels: + current_vowel_count -= 1 + max_vowel_count = max(max_vowel_count, current_vowel_count) + + return max_vowel_count + +# Example usage: +s = "abciiidef" +k = 3 +print(max_vowels(s, k)) # Output: 3 (substring "iii") +``` + +## 6. Subarray Product Less Than K + +Given an array of positive integers `nums` and an integer `k`, return the number of contiguous subarrays where the product of all the elements in the subarray is less than `k`. + +### Steps: +1. Use two pointers, `left` and `right`, to define the current window. +2. Expand the window by moving `right` and multiplying `product` by `nums[right]`. +3. If `product` is greater than or equal to `k`, shrink the window from the left by moving `left` and dividing `product` by `nums[left]`. +4. For each position of `right`, the number of valid subarray ending at `right` is `right - left + 1`. +5. Sum these counts to get the total number of subarray with product less than `k`. + +### Python Code: +```python +def num_subarray_product_less_than_k(nums, k): + if k <= 1: + return 0 + + product = 1 + left = 0 + count = 0 + + for right in range(len(nums)): + product *= nums[right] + + while product >= k: + product /= nums[left] + left += 1 + + count += right - left + 1 + + return count + +# Example usage: +nums = [10, 5, 2, 6] +k = 100 +print(num_subarray_product_less_than_k(nums, k)) # Output: 8 +``` + +## Advantages + +- **Efficiency**: Reduces the time complexity from O(n^2) to O(n) for many problems. +- **Simplicity**: Provides a straightforward way to manage subarrays/substrings with overlapping elements. + +## Applications + +- Finding the maximum or minimum sum of subarrays of fixed size. +- Detecting unique elements in a sequence. +- Solving problems related to dynamic programming with fixed constraints. +- Efficiently managing and processing streaming data or real-time analytics. + +By using the sliding window technique, you can tackle a wide range of problems in a more efficient manner. diff --git a/contrib/ds-algorithms/index.md b/contrib/ds-algorithms/index.md index 31cff39..d3c3c27 100644 --- a/contrib/ds-algorithms/index.md +++ b/contrib/ds-algorithms/index.md @@ -10,3 +10,4 @@ - [Greedy Algorithms](greedy-algorithms.md) - [Dynamic Programming](dynamic-programming.md) - [Linked list](linked-list.md) +- [Sliding Window Technique](Sliding_Window.md) From 56e972133ff33ca0532c6d0637fb465425b41c09 Mon Sep 17 00:00:00 2001 From: manishh12 Date: Fri, 31 May 2024 12:02:09 +0530 Subject: [PATCH 286/405] added types of cost functions issue#625 --- .../Types_of_Cost_Functions.md | 227 ++++++++++++++++++ contrib/machine-learning/index.md | 1 + 2 files changed, 228 insertions(+) create mode 100644 contrib/machine-learning/Types_of_Cost_Functions.md diff --git a/contrib/machine-learning/Types_of_Cost_Functions.md b/contrib/machine-learning/Types_of_Cost_Functions.md new file mode 100644 index 0000000..547a05e --- /dev/null +++ b/contrib/machine-learning/Types_of_Cost_Functions.md @@ -0,0 +1,227 @@ + +# Cost Functions in Machine Learning + +Cost functions, also known as loss functions, play a crucial role in training machine learning models. They measure how well the model performs on the training data by quantifying the difference between predicted and actual values. Different types of cost functions are used depending on the problem domain and the nature of the data. + +## Types of Cost Functions + +### 1. Mean Squared Error (MSE) + +**Explanation:** +MSE is one of the most commonly used cost functions, particularly in regression problems. It calculates the average squared difference between the predicted and actual values. + +**Mathematical Formulation:** +The MSE is defined as: +$$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual value. +- \( y^i\) is the predicted value. + +**Advantages:** +- Sensitive to large errors due to squaring. +- Differentiable and convex, facilitating optimization. + +**Disadvantages:** +- Sensitive to outliers, as the squared term amplifies their impact. + +**Python Implementation:** +```python +import numpy as np + +def mean_squared_error(y_true, y_pred): + n = len(y_true) + return np.mean((y_true - y_pred) ** 2) +``` + +### 2. Mean Absolute Error (MAE) + +**Explanation:** +MAE is another commonly used cost function for regression tasks. It measures the average absolute difference between predicted and actual values. + +**Mathematical Formulation:** +The MAE is defined as: +$$ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual value. +- \( y^i\) is the predicted value. + +**Advantages:** +- Less sensitive to outliers compared to MSE. +- Provides a linear error term, which can be easier to interpret. + + +**Disadvantages:** +- Not differentiable at zero, which can complicate optimization. + +**Python Implementation:** +```python +import numpy as np + +def mean_absolute_error(y_true, y_pred): + n = len(y_true) + return np.mean(np.abs(y_true - y_pred)) +``` + +### 3. Cross-Entropy Loss (Binary) + +**Explanation:** +Cross-entropy loss is commonly used in binary classification problems. It measures the dissimilarity between the true and predicted probability distributions. + +**Mathematical Formulation:** +For binary classification, the cross-entropy loss is defined as: +$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual class label (0 or 1). +- \( y^i\) is the predicted probability of the positive class. + + +**Advantages:** +- Penalizes confident wrong predictions heavily. +- Suitable for probabilistic outputs. + +**Disadvantages:** +- Sensitive to class imbalance. + +**Python Implementation:** +```python +import numpy as np + +def binary_cross_entropy(y_true, y_pred): + n = len(y_true) + return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) +``` + +### 4. Cross-Entropy Loss (Multiclass) + +**Explanation:** +For multiclass classification problems, the cross-entropy loss is adapted to handle multiple classes. + +**Mathematical Formulation:** +The multiclass cross-entropy loss is defined as: +$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) $$ +Where: +- \( n \) is the number of samples. +- \( C \) is the number of classes. +- \( y_{i,c} \) is the indicator function for the true class of sample \( i \). + +- (y^i,c) is the predicted probability of sample \( i \) belonging to class \( c \). + +**Advantages:** +- Handles multiple classes effectively. +- Encourages the model to assign high probabilities to the correct classes. + +**Disadvantages:** +- Requires one-hot encoding for class labels, which can increase computational complexity. + +**Python Implementation:** +```python +import numpy as np + +def categorical_cross_entropy(y_true, y_pred): + n = len(y_true) + return -np.mean(np.sum(y_true * np.log(y_pred), axis=1)) +``` + +### 5. Hinge Loss (SVM) + +**Explanation:** +Hinge loss is commonly used in support vector machines (SVMs) for binary classification tasks. It penalizes misclassifications by a linear margin. + +**Mathematical Formulation:** +For binary classification, the hinge loss is defined as: +$$ \text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i) $$ +Where: +- \( n \) is the number of samples. +- \( y_i \) is the actual class label (-1 or 1). +- \( \hat{y}_i \) is the predicted score for sample \( i \). + +**Advantages:** +- Encourages margin maximization in SVMs. +- Robust to outliers due to the linear penalty. + +**Disadvantages:** +- Not differentiable at the margin, which can complicate optimization. + +**Python Implementation:** +```python +import numpy as np + +def hinge_loss(y_true, y_pred): + n = len(y_true) + loss = np.maximum(0, 1 - y_true * y_pred) + return np.mean(loss) +``` + +### 6. Huber Loss + +**Explanation:** +Huber loss is a combination of MSE and MAE, providing a compromise between the two. It is less sensitive to outliers than MSE and provides a smooth transition to MAE for large errors. + +**Mathematical Formulation:** + +The Huber loss is defined as: + + +$$ +\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ +\begin{array}{ll} +\frac{1}{2} (y_i - \hat{y}_i)^2 & \text{if } |y_i - \hat{y}_i| \leq \delta \\ +\delta(|y_i - \hat{y}_i| - \frac{1}{2} \delta) & \text{otherwise} +\end{array} +\right. +$$ +Where: +- \( n \) is the number of samples. +- \( \delta \) is a threshold parameter. + +**Advantages:** +- Provides a smooth loss function. +- Less sensitive to outliers than MSE. + +**Disadvantages:** +- Requires tuning of the threshold parameter. + +**Python Implementation:** +```python +import numpy as np + +def huber_loss(y_true, y_pred, delta): + error = y_true - y_pred + loss = np.where(np.abs(error) <= delta, 0.5 * error ** 2, delta * (np.abs(error) - 0.5 * delta)) + return np.mean(loss) +``` + +### 7. Log-Cosh Loss + +**Explanation:** +Log-Cosh loss is a smooth approximation of the MAE and is less sensitive to outliers than MSE. It provides a smooth transition from quadratic for small errors to linear for large errors. + +**Mathematical Formulation:** +The Log-Cosh loss is defined as: +$$ \text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i)) $$ +Where: +- \( n \) is the number of samples. + +**Advantages:** +- Smooth and differentiable everywhere. +- Less sensitive to outliers. + +**Disadvantages:** +- Computationally more expensive than simple losses like MSE. + +**Python Implementation:** +```python +import numpy as np + +def logcosh_loss(y_true, y_pred): + error = y_true - y_pred + loss = np.log(np.cosh(error)) + return np.mean(loss) +``` + +These implementations provide various options for cost functions suitable for different machine learning tasks. Each function has its advantages and disadvantages, making them suitable for different scenarios and problem domains. + +--- \ No newline at end of file diff --git a/contrib/machine-learning/index.md b/contrib/machine-learning/index.md index 46100df..cfe9a67 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) +-[Types_of_Cost_Functions](Types_of_Cost_Functions.md) From d23389a8ea17ca0d16b96b14b710ac41606e8383 Mon Sep 17 00:00:00 2001 From: Manish kumar gupta <97523900+manishh12@users.noreply.github.com> Date: Fri, 31 May 2024 12:07:34 +0530 Subject: [PATCH 287/405] Updated maths formulas --- .../Types_of_Cost_Functions.md | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/contrib/machine-learning/Types_of_Cost_Functions.md b/contrib/machine-learning/Types_of_Cost_Functions.md index 547a05e..f650726 100644 --- a/contrib/machine-learning/Types_of_Cost_Functions.md +++ b/contrib/machine-learning/Types_of_Cost_Functions.md @@ -12,7 +12,7 @@ MSE is one of the most commonly used cost functions, particularly in regression **Mathematical Formulation:** The MSE is defined as: -$$ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 $$ +$$MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2$$ Where: - \( n \) is the number of samples. - \( y_i \) is the actual value. @@ -41,7 +41,7 @@ MAE is another commonly used cost function for regression tasks. It measures the **Mathematical Formulation:** The MAE is defined as: -$$ MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| $$ +$$MAE = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|$$ Where: - \( n \) is the number of samples. - \( y_i \) is the actual value. @@ -70,8 +70,11 @@ def mean_absolute_error(y_true, y_pred): Cross-entropy loss is commonly used in binary classification problems. It measures the dissimilarity between the true and predicted probability distributions. **Mathematical Formulation:** + For binary classification, the cross-entropy loss is defined as: -$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)] $$ + +$$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} [y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i)]$$ + Where: - \( n \) is the number of samples. - \( y_i \) is the actual class label (0 or 1). @@ -100,8 +103,11 @@ def binary_cross_entropy(y_true, y_pred): For multiclass classification problems, the cross-entropy loss is adapted to handle multiple classes. **Mathematical Formulation:** + The multiclass cross-entropy loss is defined as: -$$ \text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c}) $$ + +$$\text{Cross-Entropy} = -\frac{1}{n} \sum_{i=1}^{n} \sum_{c=1}^{C} y_{i,c} \log(\hat{y}_{i,c})$$ + Where: - \( n \) is the number of samples. - \( C \) is the number of classes. @@ -131,8 +137,11 @@ def categorical_cross_entropy(y_true, y_pred): Hinge loss is commonly used in support vector machines (SVMs) for binary classification tasks. It penalizes misclassifications by a linear margin. **Mathematical Formulation:** + For binary classification, the hinge loss is defined as: -$$ \text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i) $$ + +$$\text{Hinge Loss} = \frac{1}{n} \sum_{i=1}^{n} \max(0, 1 - y_i \cdot \hat{y}_i)$$ + Where: - \( n \) is the number of samples. - \( y_i \) is the actual class label (-1 or 1). @@ -165,17 +174,16 @@ Huber loss is a combination of MSE and MAE, providing a compromise between the t The Huber loss is defined as: -$$ -\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ +$$\text{Huber Loss} = \frac{1}{n} \sum_{i=1}^{n} \left\{ \begin{array}{ll} \frac{1}{2} (y_i - \hat{y}_i)^2 & \text{if } |y_i - \hat{y}_i| \leq \delta \\ \delta(|y_i - \hat{y}_i| - \frac{1}{2} \delta) & \text{otherwise} \end{array} -\right. -$$ +\right.$$ + Where: - \( n \) is the number of samples. -- \( \delta \) is a threshold parameter. +- \(delta\) is a threshold parameter. **Advantages:** - Provides a smooth loss function. @@ -200,8 +208,11 @@ def huber_loss(y_true, y_pred, delta): Log-Cosh loss is a smooth approximation of the MAE and is less sensitive to outliers than MSE. It provides a smooth transition from quadratic for small errors to linear for large errors. **Mathematical Formulation:** + The Log-Cosh loss is defined as: -$$ \text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i)) $$ + +$$\text{Log-Cosh Loss} = \frac{1}{n} \sum_{i=1}^{n} \log(\cosh(y_i - \hat{y}_i))$$ + Where: - \( n \) is the number of samples. @@ -224,4 +235,4 @@ def logcosh_loss(y_true, y_pred): These implementations provide various options for cost functions suitable for different machine learning tasks. Each function has its advantages and disadvantages, making them suitable for different scenarios and problem domains. ---- \ No newline at end of file +--- From 81f173780eecd167205477e69a5e145462fd4803 Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:31:32 +0530 Subject: [PATCH 288/405] Add files via upload --- contrib/plotting-visualization/barplot.png | Bin 0 -> 10644 bytes contrib/plotting-visualization/histogram.png | Bin 0 -> 14636 bytes contrib/plotting-visualization/matplotlib.md | 87 ++++++++++++++++++ .../plotting-visualization/scatterplot.png | Bin 0 -> 13739 bytes 4 files changed, 87 insertions(+) create mode 100644 contrib/plotting-visualization/barplot.png create mode 100644 contrib/plotting-visualization/histogram.png create mode 100644 contrib/plotting-visualization/matplotlib.md create mode 100644 contrib/plotting-visualization/scatterplot.png diff --git a/contrib/plotting-visualization/barplot.png b/contrib/plotting-visualization/barplot.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c9446ef38540209af0719b53286293a69058f2 GIT binary patch literal 10644 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/matplotlib.md b/contrib/plotting-visualization/matplotlib.md new file mode 100644 index 0000000..720dff8 --- /dev/null +++ b/contrib/plotting-visualization/matplotlib.md @@ -0,0 +1,87 @@ +# Introducing MatplotLib + +Data visualisation is the analysing and understanding the data via graphical representation of the data by the means of pie charts, histograms, scatterplots and line graphs. + +To make this process of data visualization easier and clearer, matplotlib library is used. + +## Features of MatplotLib library +- MatplotLib library is one of the most popular python packages for 2D representation of data +- Combination of matplotlib and numpy is used for easier computations and visualization of large arrays and data. Matplotlib along with NumPy can be considered as the open source equivalent of MATLAB. + +- Matplotlib has a procedural interface named the Pylab, which is designed to resemble MATLAB. However, it is completely independent of Matlab. + +## Starting with Matplotlib + +### 1.] Install and import the neccasary libraries - mayplotlib.pylplot +```python +pip install matplotlib +``` + +```python +import maptplotlib.pyplot as plt +import numpy as np +``` + + + +### 2.] Scatter plot +Scatter plot is a type of plot that uses the cartesian coordinates between x and y to describe the relation between them. It uses dots to represent relation between the data variables of the data set. + +```python +x = [5,4,5,8,9,8,6,7,3,2] +y = [9,1,7,3,5,7,6,1,2,8] + +plt.scatter(x,y, color = "red") + +plt.title("Scatter plot") +plt.xlabel("X values") +plt.ylabel("Y values") + +plt.tight_layout() +plt.show() +``` + +![img](scatterplot.png) + + + +### 3.] Bar plot +Bar plot is a type of plot that plots the frequency distrubution of the categorical variables. Each entity of the categoric variable is represented as a bar. The size of the bar represents its numeric value. + +```python +x = np.array(['A','B','C','D']) +y = np.array([42,50,15,35]) + +plt.bar(x,y,color = "red") + +plt.title("Bar plot") +plt.xlabel("X values") +plt.ylabel("Y values") + +plt.show() +``` +![img](barplot.png) + + +### 4.] Histogram +Histogram is the representation of frequency distribution of qualitative data. The height of each rectangle defines the amount, or how often that variable appears. + +```python +x = [9,1,7,3,5,7,6,1,2,8] + +plt.hist(x, color = "red", edgecolor= "white", bins =5) + +plt.title("Histogram") +plt.xlabel("X values") +plt.ylabel("Frequency Distribution") + +plt.show() +``` + +![img](histogram.png) + + + + + + diff --git a/contrib/plotting-visualization/scatterplot.png b/contrib/plotting-visualization/scatterplot.png new file mode 100644 index 0000000000000000000000000000000000000000..94c91484f54e9dc6e492862c036bab2a804add3b GIT binary patch literal 13739 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 A>Hq)$ literal 0 HcmV?d00001 From 4c4c4ff6bd75495d3f50c944163491d93838b916 Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:33:06 +0530 Subject: [PATCH 289/405] Add files via upload --- .../plotting-visualization/images/barplot.png | Bin 0 -> 10644 bytes .../plotting-visualization/images/histogram.png | Bin 0 -> 14636 bytes .../images/scatterplot.png | Bin 0 -> 13739 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/plotting-visualization/images/barplot.png create mode 100644 contrib/plotting-visualization/images/histogram.png create mode 100644 contrib/plotting-visualization/images/scatterplot.png diff --git a/contrib/plotting-visualization/images/barplot.png b/contrib/plotting-visualization/images/barplot.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c9446ef38540209af0719b53286293a69058f2 GIT binary patch literal 10644 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/scatterplot.png b/contrib/plotting-visualization/images/scatterplot.png new file mode 100644 index 0000000000000000000000000000000000000000..94c91484f54e9dc6e492862c036bab2a804add3b GIT binary patch literal 13739 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 A>Hq)$ literal 0 HcmV?d00001 From 2698983bd1437adf3e53c31cfad00181fc15a19e Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:47:58 +0530 Subject: [PATCH 290/405] Delete contrib/plotting-visualization/scatterplot.png --- contrib/plotting-visualization/scatterplot.png | Bin 13739 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/plotting-visualization/scatterplot.png diff --git a/contrib/plotting-visualization/scatterplot.png b/contrib/plotting-visualization/scatterplot.png deleted file mode 100644 index 94c91484f54e9dc6e492862c036bab2a804add3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13739 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 A>Hq)$ From 9d9bed8f924fddff9db83271bb9632cd59d5ae19 Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 12:48:39 +0530 Subject: [PATCH 291/405] Delete contrib/plotting-visualization/barplot.png --- contrib/plotting-visualization/barplot.png | Bin 10644 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/plotting-visualization/barplot.png diff --git a/contrib/plotting-visualization/barplot.png b/contrib/plotting-visualization/barplot.png deleted file mode 100644 index b6c9446ef38540209af0719b53286293a69058f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10644 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 tQ04*t=5T^L1`zLmWnA#zx;uliKP>p!ZH Date: Fri, 31 May 2024 12:50:04 +0530 Subject: [PATCH 292/405] Delete contrib/plotting-visualization/histogram.png --- contrib/plotting-visualization/histogram.png | Bin 14636 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 contrib/plotting-visualization/histogram.png diff --git a/contrib/plotting-visualization/histogram.png b/contrib/plotting-visualization/histogram.png deleted file mode 100644 index af35141bd0d8f95c0d6ebf411aff45d875b4be3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14636 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 From 57c369bd0ec3d02e283224f903e760abb368b51f Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 13:00:40 +0530 Subject: [PATCH 293/405] Update matplotlib.md --- contrib/plotting-visualization/matplotlib.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib.md b/contrib/plotting-visualization/matplotlib.md index 720dff8..02f17f5 100644 --- a/contrib/plotting-visualization/matplotlib.md +++ b/contrib/plotting-visualization/matplotlib.md @@ -41,9 +41,10 @@ plt.tight_layout() plt.show() ``` -![img](scatterplot.png) +![scatterplot](https://github.com/Harshita297/learn-python/assets/122027571/aa57eb31-4377-4f75-9a97-e4fa7a54a938) + ### 3.] Bar plot Bar plot is a type of plot that plots the frequency distrubution of the categorical variables. Each entity of the categoric variable is represented as a bar. The size of the bar represents its numeric value. @@ -60,7 +61,8 @@ plt.ylabel("Y values") plt.show() ``` -![img](barplot.png) +![barplot](https://github.com/Harshita297/learn-python/assets/122027571/00cea3cd-a962-4bfe-b158-921389ee564c) + ### 4.] Histogram @@ -77,8 +79,11 @@ plt.ylabel("Frequency Distribution") plt.show() ``` - -![img](histogram.png) +![histogram](https://github.com/Harshita297/learn-python/assets/122027571/32470819-bac5-4bb2-9f36-79521fa40bf3) + + + + From 9470b8c1a255f8e36c51ae1db4b263a8ca05297f Mon Sep 17 00:00:00 2001 From: Harshita Jain <122027571+Harshita297@users.noreply.github.com> Date: Fri, 31 May 2024 13:02:02 +0530 Subject: [PATCH 294/405] 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..84d07f9 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) +- [Introducing Matplotlib](matplotlib.md) From b832f8f0c90673462ecc990f45595761565b027d Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 13:40:20 +0530 Subject: [PATCH 295/405] Update Transformers.md Added topics --- contrib/machine-learning/Transformers.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index e69de29..7bcc102 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -0,0 +1,21 @@ +# Transformers +## Introduction +A transformer is a deep learning architecture developed by Google and based on the multi-head attention mechanism. It is based on the softmax-based attention +mechanism. Before transformers, predecessors of attention mechanism were added to gated recurrent neural networks, such as LSTMs and gated recurrent units (GRUs), which +processed datasets sequentially. Dependency on previous token computations prevented them from being able to parallelize the attention mechanism. + +## Key Concepts + +## Architecture + +## Implementation +### Theory +Text is converted to numerical representations called tokens, and each token is converted into a vector via looking up from a word embedding table. +At each layer, each token is then contextualized within the scope of the context window with other tokens via a parallel multi-head attention mechanism +allowing the signal for key tokens to be amplified and less important tokens to be diminished. + +### HuggingFace + +### Tensorflow and Keras + +### PyTorch From 540163c863037f28afa4b9b7463198bf57e41866 Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:09:16 +0530 Subject: [PATCH 296/405] Added Content: Line Charts in Matplotlib --- .../plotting-visualization/images/dot-line.png | Bin 0 -> 1180 bytes .../images/line-asymptote.png | Bin 0 -> 29209 bytes .../images/line-curve.png | Bin 0 -> 13975 bytes .../images/line-labels.png | Bin 0 -> 16851 bytes .../images/line-ticks.png | Bin 0 -> 22354 bytes .../images/line-with-text-scale.png | Bin 0 -> 19249 bytes .../images/simple_line.png | Bin 0 -> 14451 bytes .../plotting-visualization/images/two-lines.png | Bin 0 -> 18440 bytes 8 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 contrib/plotting-visualization/images/dot-line.png create mode 100644 contrib/plotting-visualization/images/line-asymptote.png create mode 100644 contrib/plotting-visualization/images/line-curve.png create mode 100644 contrib/plotting-visualization/images/line-labels.png create mode 100644 contrib/plotting-visualization/images/line-ticks.png create mode 100644 contrib/plotting-visualization/images/line-with-text-scale.png create mode 100644 contrib/plotting-visualization/images/simple_line.png create mode 100644 contrib/plotting-visualization/images/two-lines.png diff --git a/contrib/plotting-visualization/images/dot-line.png b/contrib/plotting-visualization/images/dot-line.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9e67f536cc625fa97ed59095d5442f646ebcfb GIT binary patch literal 1180 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV0^&B3=}#3|KN2X#a!&<8N$KAar>eF10a{P zz$3Dlfq_2}gc(=ZFV6%DT9mj(lmzFem6RtIr849umK5aVm*iw7DU_ua6=&w>8S5G9 z8R{rxl#~=$>FXop_413-^##(zC4pwB2l#}z0%`g3EehpZEZX*LIR9k(+!tCp-&KZT ziOI{1pupBLX%(#_j1w$40+g5DN={*pELt%~!D-XpO(u2sq|Ydy{&v4dygu|Q6Qe@| z10$CLkYp7Al1v;xl97c&U;zUY3r7G0BNK}TPyv$&sxlPC7TyQG|9-AmU6sM|W0%C1 zROJKPpU%+!@NtFUgZci+d4=+I<{;fb^FTH*Fq&o77jth|wpu2iVcPcDo2*zP?s-p| ztb5?my2(%Y5(>pVi#RWEz1ha@_wB&0;EJ~*W&9?cGg=Y);RaEkVH04#Kc6vdi}mU7 z2GPGB*Q6VczCAzbs(HiFzkZYS8M=Q@RhiEi)p+;Yf#T|frZANy-Pv+Jd4HeCINRo}u|dM@<+W^VIiEM2I?#|i@7qQuMzQye&%Yfw6i8F)+$;YiOidG=v||l;AR7qBta{;wKLwie}`!evg}x?+%kYA|=2{73MDcH@QD;Qu^I{8REs8x8<<> usIz~@RRc`$STlzp1HlXg$!9sY?5k$UY`w)e(GQsY89ZJ6T-G@yGywo1V^$&n literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-asymptote.png b/contrib/plotting-visualization/images/line-asymptote.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d21da0627f3f44f301cfef247e3ca4018edb62 GIT binary patch literal 29209 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-labels.png b/contrib/plotting-visualization/images/line-labels.png new file mode 100644 index 0000000000000000000000000000000000000000..26505b1560a19627a47cc0156693f758adecfa67 GIT binary patch literal 16851 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-ticks.png b/contrib/plotting-visualization/images/line-ticks.png new file mode 100644 index 0000000000000000000000000000000000000000..3a6ed78a9cf36240301a6af7480127eb39f0648d GIT binary patch literal 22354 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 WZ(;p)9Po=>m(HvHD^2mX_x}fm*rQ7T literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/line-with-text-scale.png b/contrib/plotting-visualization/images/line-with-text-scale.png new file mode 100644 index 0000000000000000000000000000000000000000..e402a3e527ea9938cc4b8f9ea4ddd2f18d372a9e GIT binary patch literal 19249 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 literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/simple_line.png b/contrib/plotting-visualization/images/simple_line.png new file mode 100644 index 0000000000000000000000000000000000000000..3097f469b35e6e8c82b4a6ce62ed07672e335280 GIT binary patch literal 14451 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 Ln;HLTJp2Cuehd}s literal 0 HcmV?d00001 diff --git a/contrib/plotting-visualization/images/two-lines.png b/contrib/plotting-visualization/images/two-lines.png new file mode 100644 index 0000000000000000000000000000000000000000..db2c88584d80d9fdd99c6bd55569abdb49e2449d GIT binary patch literal 18440 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 F{{R8nbqxRj literal 0 HcmV?d00001 From 0c7f4fa07608d91fcd2ef6a6bf47decd5269ebef Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:26:51 +0530 Subject: [PATCH 297/405] Created matplotlib-line-plot.md --- .../matplotlib-line-plot.md | 268 ++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 contrib/plotting-visualization/matplotlib-line-plot.md diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plot.md new file mode 100644 index 0000000..00ddc90 --- /dev/null +++ b/contrib/plotting-visualization/matplotlib-line-plot.md @@ -0,0 +1,268 @@ +# Line Chart in Matplotlib + +A line chart is a simple way to visualize data where we connect individual data points. It helps us to see trends and patterns over time or across categories. +
This type of chart is particularly useful for:
+* Comparing Data: Comparing multiple datasets on the same axes. +* Highlighting Changes: Illustrating changes and patterns in data. +* Visualizing Trends: Showing trends over time or other continuous variables. + +## Prerequisites +Line plots can be created in Python with Matplotlib's ``pyplot`` library. To build a line plot, first import ``Matplotlib``. It is a standard convention to import Matplotlib's pyplot library as ``plt``. +``` +import matplotlib.pyplot as plt + +``` + +## Creating a simple Line Plot + +First import matplotlib and numpy, these are useful for charting. +
You can use the ``plot(x,y)`` method to create a line chart.
+ +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +print(x) +y = 2*x + 1 + +plt.plot(x, y) +plt.show() +``` +When executed, this will show the following line plot: + +![Basic line Chart](contrib/plotting-visualization/images/simple_line.png) + + +## Curved line + +The ``plot()`` method also works for other types of line charts. It doesn’t need to be a straight line, y can have any type of values. +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y = 2**x + 1 + +plt.plot(x, y) +plt.show() +``` +When executed, this will show the following Curved line plot: + +![Curved line](contrib/plotting-visualization/images/line-curve.png) + + +## Line with Labels + +To know what you are looking at, you need meta data. Labels are a type of meta data. They show what the chart is about. The chart has an ``x label``, ``y label`` and ``title``. +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure() +plt.plot(x, y1) + +plt.xlabel("I am x") +plt.ylabel("I am y") +plt.title("With Labels") + +plt.show() +``` +When executed, this will show the following line with labels plot: + +![line with labels](contrib/plotting-visualization/images/line-labels.png) + +## Multiple lines + +More than one line can be in the plot. To add another line, just call the ``plot(x,y)`` function again. In the example below we have two different values for ``y(y1,y2)`` that are plotted onto the chart. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure(num = 3, figsize=(8, 5)) +plt.plot(x, y2) +plt.plot(x, y1, + color='red', + linewidth=1.0, + linestyle='--' + ) + +plt.show() +``` +When executed, this will show the following Multiple lines plot: + +![multiple lines](contrib/plotting-visualization/images/two-lines.png) + + +## Dotted line + +Lines can be in the form of dots like the image below. Instead of calling ``plot(x,y)`` call the ``scatter(x,y)`` method. The ``scatter(x,y)`` method can also be used to (randomly) plot points onto the chart. + +``` +import matplotlib.pyplot as plt +import numpy as np + +n = 1024 +X = np.random.normal(0, 1, n) +Y = np.random.normal(0, 1, n) +T = np.arctan2(X, Y) + +plt.scatter(np.arange(5), np.arange(5)) + +plt.xticks(()) +plt.yticks(()) + +plt.show() +``` + +When executed, this will show the following Dotted line plot: + +![dotted lines](contrib/plotting-visualization/images/dot-line.png) + +## Line ticks + +You can change the ticks on the plot. Set them on the ``x-axis``, ``y-axis`` or even change their color. The line can be more thick and have an alpha value. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y = 2*x - 1 + +plt.figure(figsize=(12, 8)) +plt.plot(x, y, color='r', linewidth=10.0, alpha=0.5) + +ax = plt.gca() + +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') + +ax.xaxis.set_ticks_position('bottom') +ax.yaxis.set_ticks_position('left') + +ax.spines['bottom'].set_position(('data', 0)) +ax.spines['left'].set_position(('data', 0)) + +for label in ax.get_xticklabels() + ax.get_yticklabels(): + label.set_fontsize(12) + label.set_bbox(dict(facecolor='y', edgecolor='None', alpha=0.7)) + +plt.show() +``` + +When executed, this will show the following line ticks plot: + +![line ticks](contrib/plotting-visualization/images/line-ticks.png) + +## Line with asymptote + +An asymptote can be added to the plot. To do that, use ``plt.annotate()``. There’s lso a dotted line in the plot below. You can play around with the code to see how it works. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure(figsize=(12, 8)) +plt.plot(x, y2) +plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--') + +ax = plt.gca() + +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') + +ax.xaxis.set_ticks_position('bottom') +ax.yaxis.set_ticks_position('left') + +ax.spines['bottom'].set_position(('data', 0)) +ax.spines['left'].set_position(('data', 0)) + + +x0 = 1 +y0 = 2*x0 + 1 + +plt.scatter(x0, y0, s = 66, color = 'b') +plt.plot([x0, x0], [y0, 0], 'k-.', lw= 2.5) + +plt.annotate(r'$2x+1=%s$' % + y0, + xy=(x0, y0), + xycoords='data', + + xytext=(+30, -30), + textcoords='offset points', + fontsize=16, + arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2') + ) + +plt.text(0, 3, + r'$This\ is\ a\ good\ idea.\ \mu\ \sigma_i\ \alpha_t$', + fontdict={'size':16,'color':'r'}) + +plt.show() +``` + +When executed, this will show the following Line with asymptote plot: + +![Line with asymptote](contrib/plotting-visualization/images/line-asymptote.png) + +## Line with text scale + +It doesn’t have to be a numeric scale. The scale can also contain textual words like the example below. In ``plt.yticks()`` we just pass a list with text values. These values are then show against the ``y axis``. + +``` +import matplotlib.pyplot as plt +import numpy as np + +x = np.linspace(-1, 1, 50) +y1 = 2*x + 1 +y2 = 2**x + 1 + +plt.figure(num = 3, figsize=(8, 5)) +plt.plot(x, y2) + +plt.plot(x, y1, + color='red', + linewidth=1.0, + linestyle='--' + ) + +plt.xlim((-1, 2)) +plt.ylim((1, 3)) + +new_ticks = np.linspace(-1, 2, 5) +plt.xticks(new_ticks) +plt.yticks([-2, -1.8, -1, 1.22, 3], + [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$readly\ good$']) + +ax = plt.gca() +ax.spines['right'].set_color('none') +ax.spines['top'].set_color('none') + +ax.xaxis.set_ticks_position('bottom') +ax.yaxis.set_ticks_position('left') + +ax.spines['bottom'].set_position(('data', 0)) +ax.spines['left'].set_position(('data', 0)) + +plt.show() +``` +When executed, this will show the following Line with text scale plot: + +![Line with text scale](contrib/plotting-visualization/images/line-with-text-scale.png) + + From 310ff8f340c15e0eef66b8b5acc383c586846662 Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:29:39 +0530 Subject: [PATCH 298/405] 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..61dd537 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) +- [Line Charts in Matplotlib](matplotlib-line-plot.md) From 34d7bc39c9aa7ed30565cded96c14566ed7e9f80 Mon Sep 17 00:00:00 2001 From: Dishika Vaishkiyar <152963337+Dishika18@users.noreply.github.com> Date: Fri, 31 May 2024 14:32:11 +0530 Subject: [PATCH 299/405] Update matplotlib-line-plot.md --- .../matplotlib-line-plot.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/plotting-visualization/matplotlib-line-plot.md b/contrib/plotting-visualization/matplotlib-line-plot.md index 00ddc90..566fdbb 100644 --- a/contrib/plotting-visualization/matplotlib-line-plot.md +++ b/contrib/plotting-visualization/matplotlib-line-plot.md @@ -31,7 +31,7 @@ plt.show() ``` When executed, this will show the following line plot: -![Basic line Chart](contrib/plotting-visualization/images/simple_line.png) +![Basic line Chart](images/simple_line.png) ## Curved line @@ -49,7 +49,7 @@ plt.show() ``` When executed, this will show the following Curved line plot: -![Curved line](contrib/plotting-visualization/images/line-curve.png) +![Curved line](images/line-curve.png) ## Line with Labels @@ -74,7 +74,7 @@ plt.show() ``` When executed, this will show the following line with labels plot: -![line with labels](contrib/plotting-visualization/images/line-labels.png) +![line with labels](images/line-labels.png) ## Multiple lines @@ -100,7 +100,7 @@ plt.show() ``` When executed, this will show the following Multiple lines plot: -![multiple lines](contrib/plotting-visualization/images/two-lines.png) +![multiple lines](images/two-lines.png) ## Dotted line @@ -126,7 +126,7 @@ plt.show() When executed, this will show the following Dotted line plot: -![dotted lines](contrib/plotting-visualization/images/dot-line.png) +![dotted lines](images/dot-line.png) ## Line ticks @@ -162,7 +162,7 @@ plt.show() When executed, this will show the following line ticks plot: -![line ticks](contrib/plotting-visualization/images/line-ticks.png) +![line ticks](images/line-ticks.png) ## Line with asymptote @@ -218,7 +218,7 @@ plt.show() When executed, this will show the following Line with asymptote plot: -![Line with asymptote](contrib/plotting-visualization/images/line-asymptote.png) +![Line with asymptote](images/line-asymptote.png) ## Line with text scale @@ -263,6 +263,6 @@ plt.show() ``` When executed, this will show the following Line with text scale plot: -![Line with text scale](contrib/plotting-visualization/images/line-with-text-scale.png) +![Line with text scale](images/line-with-text-scale.png) From 5b3c8d7ad108d4a65b4a946d719d242fe9eae308 Mon Sep 17 00:00:00 2001 From: SAM <60264918+SAM-DEV007@users.noreply.github.com> Date: Fri, 31 May 2024 15:14:09 +0530 Subject: [PATCH 300/405] Update Transformers.md Added information about Model Architecture --- contrib/machine-learning/Transformers.md | 59 +++++++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/contrib/machine-learning/Transformers.md b/contrib/machine-learning/Transformers.md index 7bcc102..49a1b97 100644 --- a/contrib/machine-learning/Transformers.md +++ b/contrib/machine-learning/Transformers.md @@ -4,9 +4,53 @@ A transformer is a deep learning architecture developed by Google and based on t mechanism. Before transformers, predecessors of attention mechanism were added to gated recurrent neural networks, such as LSTMs and gated recurrent units (GRUs), which processed datasets sequentially. Dependency on previous token computations prevented them from being able to parallelize the attention mechanism. -## Key Concepts +## Model Architecture +