From 710f64ec12890c4a955d63ae676a30712e02275c Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 14:41:17 +0530 Subject: [PATCH 01/32] Create joint_probability_distribution.py --- maths/joint_probability_distribution.py | 84 +++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 maths/joint_probability_distribution.py diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py new file mode 100644 index 000000000000..bec3fe548845 --- /dev/null +++ b/maths/joint_probability_distribution.py @@ -0,0 +1,84 @@ +# Function to calculate the joint probability distribution +def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities): + joint_distribution = {} + + # Calculate the joint probability for all combinations of (X, Y) + for x, x_prob in zip(x_values, x_probabilities): + for y, y_prob in zip(y_values, y_probabilities): + joint_prob = x_prob * y_prob + joint_distribution[(x, y)] = joint_prob + + return joint_distribution + +# Function to calculate the expectation (mean) +def expectation(values, probabilities): + return sum(x * p for x, p in zip(values, probabilities)) + +# Function to calculate the variance +def variance(values, probabilities): + mean = expectation(values, probabilities) + return sum((x - mean)**2 * p for x, p in zip(values, probabilities)) + +# Function to calculate the covariance +def covariance(x_values, y_values, x_probabilities, y_probabilities): + mean_x = expectation(x_values, x_probabilities) + mean_y = expectation(y_values, y_probabilities) + return sum((x - mean_x) * (y - mean_y) * px * py for x, px in zip(x_values, x_probabilities) for y, py in zip(y_values, y_probabilities)) + +# Function to calculate the standard deviation +def standard_deviation(variance): + return variance**0.5 + + +# Input values for X and Y +x_values = input("Enter values of X separated by spaces: ").split() +y_values = input("Enter values of Y separated by spaces: ").split() + +# Convert input values to integers +x_values = [int(x) for x in x_values] +y_values = [int(y) for y in y_values] + +# Input probabilities for X and Y +x_probabilities = input("Enter probabilities for X separated by spaces: ").split() +y_probabilities = input("Enter probabilities for Y separated by spaces: ").split() + +# Convert input probabilities to floats +x_probabilities = [float(p) for p in x_probabilities] +y_probabilities = [float(p) for p in y_probabilities] + +# Calculate the joint probability distribution +joint_distribution = calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) + +# Print the joint probability distribution +for (x, y), probability in joint_distribution.items(): + print(f'P(X={x}, Y={y}) = {probability}') + + + + +# Calculate the joint probability distribution +joint_distribution = calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) + +# Print the joint probability distribution +for (x, y), probability in joint_distribution.items(): + print(f'P(X={x}, Y={y}) = {probability}') + +# Calculate the statistics +mean_x = expectation(x_values, x_probabilities) +mean_y = expectation(y_values, y_probabilities) +mean_xy = expectation([x * y for x in x_values for y in y_values], [px * py for px in x_probabilities for py in y_probabilities]) +variance_x = variance(x_values, x_probabilities) +variance_y = variance(y_values, y_probabilities) +cov_xy = covariance(x_values, y_values, x_probabilities, y_probabilities) +stddev_x = standard_deviation(variance_x) +stddev_y = standard_deviation(variance_y) + +# Print the results +print(f"Expectation (mean) of X: {mean_x}") +print(f"Expectation (mean) of Y: {mean_y}") +print(f"Expectation (mean) of XY: {mean_xy}") +print(f"Variance of X: {variance_x}") +print(f"Variance of Y: {variance_y}") +print(f"Covariance between X and Y: {cov_xy}") +print(f"Standard Deviation of X: {stddev_x}") +print(f"Standard Deviation of Y: {stddev_y}") From 32279e0b94c089d25af96229c7e4e1f81c723955 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 14:55:46 +0530 Subject: [PATCH 02/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 1 + 1 file changed, 1 insertion(+) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index bec3fe548845..693423fd651e 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,3 +1,4 @@ +# https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities): joint_distribution = {} From 8fb17b58ffc14fa85fc3a7024d60dc0559bc708b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 09:28:23 +0000 Subject: [PATCH 03/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 31 ++++++++++++++++++------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 693423fd651e..42ac87d51ddb 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -11,20 +11,28 @@ def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabili return joint_distribution + # Function to calculate the expectation (mean) def expectation(values, probabilities): return sum(x * p for x, p in zip(values, probabilities)) + # Function to calculate the variance def variance(values, probabilities): mean = expectation(values, probabilities) - return sum((x - mean)**2 * p for x, p in zip(values, probabilities)) + return sum((x - mean) ** 2 * p for x, p in zip(values, probabilities)) + # Function to calculate the covariance def covariance(x_values, y_values, x_probabilities, y_probabilities): mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) - return sum((x - mean_x) * (y - mean_y) * px * py for x, px in zip(x_values, x_probabilities) for y, py in zip(y_values, y_probabilities)) + return sum( + (x - mean_x) * (y - mean_y) * px * py + for x, px in zip(x_values, x_probabilities) + for y, py in zip(y_values, y_probabilities) + ) + # Function to calculate the standard deviation def standard_deviation(variance): @@ -48,26 +56,31 @@ def standard_deviation(variance): y_probabilities = [float(p) for p in y_probabilities] # Calculate the joint probability distribution -joint_distribution = calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) +joint_distribution = calculate_joint_probability( + x_values, y_values, x_probabilities, y_probabilities +) # Print the joint probability distribution for (x, y), probability in joint_distribution.items(): - print(f'P(X={x}, Y={y}) = {probability}') - - + print(f"P(X={x}, Y={y}) = {probability}") # Calculate the joint probability distribution -joint_distribution = calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) +joint_distribution = calculate_joint_probability( + x_values, y_values, x_probabilities, y_probabilities +) # Print the joint probability distribution for (x, y), probability in joint_distribution.items(): - print(f'P(X={x}, Y={y}) = {probability}') + print(f"P(X={x}, Y={y}) = {probability}") # Calculate the statistics mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) -mean_xy = expectation([x * y for x in x_values for y in y_values], [px * py for px in x_probabilities for py in y_probabilities]) +mean_xy = expectation( + [x * y for x in x_values for y in y_values], + [px * py for px in x_probabilities for py in y_probabilities], +) variance_x = variance(x_values, x_probabilities) variance_y = variance(y_values, y_probabilities) cov_xy = covariance(x_values, y_values, x_probabilities, y_probabilities) From 0f872bfa8b7aca4236e7d31403418819dfa1a50e Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 15:00:19 +0530 Subject: [PATCH 04/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 693423fd651e..0ca96a2d6afe 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,6 +1,6 @@ # https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution -def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities): +def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) -> dict: joint_distribution = {} # Calculate the joint probability for all combinations of (X, Y) @@ -12,22 +12,22 @@ def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabili return joint_distribution # Function to calculate the expectation (mean) -def expectation(values, probabilities): +def expectation(values, probabilities) -> float: return sum(x * p for x, p in zip(values, probabilities)) # Function to calculate the variance -def variance(values, probabilities): +def variance(values, probabilities) -> float: mean = expectation(values, probabilities) return sum((x - mean)**2 * p for x, p in zip(values, probabilities)) # Function to calculate the covariance -def covariance(x_values, y_values, x_probabilities, y_probabilities): +def covariance(x_values, y_values, x_probabilities, y_probabilities) -> float: mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) return sum((x - mean_x) * (y - mean_y) * px * py for x, px in zip(x_values, x_probabilities) for y, py in zip(y_values, y_probabilities)) # Function to calculate the standard deviation -def standard_deviation(variance): +def standard_deviation(variance) -> float: return variance**0.5 From 77c3a913483cd47578c0b503050f4076ddfcc1f9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 09:31:21 +0000 Subject: [PATCH 05/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index b1714046ab92..76960d978042 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,6 +1,8 @@ # https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution -def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) -> dict: +def calculate_joint_probability( + x_values, y_values, x_probabilities, y_probabilities +) -> dict: joint_distribution = {} # Calculate the joint probability for all combinations of (X, Y) From c9e1d6928f815b3a415102e962897d3a844f87b6 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 15:14:18 +0530 Subject: [PATCH 06/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 27 ++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index b1714046ab92..29aef527155c 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,6 +1,22 @@ # https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) -> dict: + """ + >>>calculate_joint_probability([1,2],[-2,5,8],[0.7,0.3],[0.3,0.5,0.2]) + P(X=1, Y=-2) = 0.21 + P(X=1, Y=5) = 0.35 + P(X=1, Y=8) = 0.13999999999999999 + P(X=2, Y=-2) = 0.09 + P(X=2, Y=5) = 0.15 + P(X=2, Y=8) = 0.06 + P(X=1, Y=-2) = 0.21 + P(X=1, Y=5) = 0.35 + P(X=1, Y=8) = 0.13999999999999999 + P(X=2, Y=-2) = 0.09 + P(X=2, Y=5) = 0.15 + P(X=2, Y=8) = 0.06 + + """ joint_distribution = {} # Calculate the joint probability for all combinations of (X, Y) @@ -8,17 +24,26 @@ def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabili for y, y_prob in zip(y_values, y_probabilities): joint_prob = x_prob * y_prob joint_distribution[(x, y)] = joint_prob - + print(joint_distribution) return joint_distribution # Function to calculate the expectation (mean) def expectation(values, probabilities) -> float: + """ + >>>expectation([1,2],[0.7,0.3]) + 1.2999999999999999999999 + + """ return sum(x * p for x, p in zip(values, probabilities)) # Function to calculate the variance def variance(values, probabilities) -> float: + """ + >>>variance([1,2],[0.7,0.3]) + 0.21000 + """ mean = expectation(values, probabilities) return sum((x - mean) ** 2 * p for x, p in zip(values, probabilities)) From a6d6ad8e30a8138522aeb169614855095a3ee414 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 09:45:50 +0000 Subject: [PATCH 07/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 29aef527155c..9a08d70c046e 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,6 +1,8 @@ # https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution -def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) -> dict: +def calculate_joint_probability( + x_values, y_values, x_probabilities, y_probabilities +) -> dict: """ >>>calculate_joint_probability([1,2],[-2,5,8],[0.7,0.3],[0.3,0.5,0.2]) P(X=1, Y=-2) = 0.21 @@ -15,7 +17,7 @@ def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabili P(X=2, Y=-2) = 0.09 P(X=2, Y=5) = 0.15 P(X=2, Y=8) = 0.06 - + """ joint_distribution = {} @@ -33,7 +35,7 @@ def expectation(values, probabilities) -> float: """ >>>expectation([1,2],[0.7,0.3]) 1.2999999999999999999999 - + """ return sum(x * p for x, p in zip(values, probabilities)) From 6a2618249dddeecbc4e53d2ea3782b4555216180 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 15:17:15 +0530 Subject: [PATCH 08/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 29aef527155c..7d206e7fa85c 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,6 +1,6 @@ # https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution -def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabilities) -> dict: +def calculate_joint_probability(x_values : list, y_values : list, x_probabilities: list, y_probabilities: list) -> dict: """ >>>calculate_joint_probability([1,2],[-2,5,8],[0.7,0.3],[0.3,0.5,0.2]) P(X=1, Y=-2) = 0.21 @@ -29,7 +29,7 @@ def calculate_joint_probability(x_values, y_values, x_probabilities, y_probabili # Function to calculate the expectation (mean) -def expectation(values, probabilities) -> float: +def expectation(values: list, probabilities: list) -> float: """ >>>expectation([1,2],[0.7,0.3]) 1.2999999999999999999999 @@ -39,7 +39,7 @@ def expectation(values, probabilities) -> float: # Function to calculate the variance -def variance(values, probabilities) -> float: +def variance(values: list, probabilities: list) -> float: """ >>>variance([1,2],[0.7,0.3]) 0.21000 @@ -49,7 +49,7 @@ def variance(values, probabilities) -> float: # Function to calculate the covariance -def covariance(x_values, y_values, x_probabilities, y_probabilities) -> float: +def covariance(x_values: list, y_values: list, x_probabilities: list, y_probabilities: list) -> float: mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) return sum( @@ -60,7 +60,7 @@ def covariance(x_values, y_values, x_probabilities, y_probabilities) -> float: # Function to calculate the standard deviation -def standard_deviation(variance) -> float: +def standard_deviation(variance: list) -> float: return variance**0.5 From acebaa0edbfbb65dbf648103189de74565d6b215 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 09:48:29 +0000 Subject: [PATCH 09/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 05a58156efcb..363efc0df928 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,6 +1,8 @@ # https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution -def calculate_joint_probability(x_values : list, y_values : list, x_probabilities: list, y_probabilities: list) -> dict: +def calculate_joint_probability( + x_values: list, y_values: list, x_probabilities: list, y_probabilities: list +) -> dict: """ >>>calculate_joint_probability([1,2],[-2,5,8],[0.7,0.3],[0.3,0.5,0.2]) P(X=1, Y=-2) = 0.21 @@ -49,7 +51,9 @@ def variance(values: list, probabilities: list) -> float: # Function to calculate the covariance -def covariance(x_values: list, y_values: list, x_probabilities: list, y_probabilities: list) -> float: +def covariance( + x_values: list, y_values: list, x_probabilities: list, y_probabilities: list +) -> float: mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) return sum( From 53f630b4e8e56eedad8801fc200f62c7cad7029b Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:26:39 +0530 Subject: [PATCH 10/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 363efc0df928..df885c32e742 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -4,19 +4,8 @@ def calculate_joint_probability( x_values: list, y_values: list, x_probabilities: list, y_probabilities: list ) -> dict: """ - >>>calculate_joint_probability([1,2],[-2,5,8],[0.7,0.3],[0.3,0.5,0.2]) - P(X=1, Y=-2) = 0.21 - P(X=1, Y=5) = 0.35 - P(X=1, Y=8) = 0.13999999999999999 - P(X=2, Y=-2) = 0.09 - P(X=2, Y=5) = 0.15 - P(X=2, Y=8) = 0.06 - P(X=1, Y=-2) = 0.21 - P(X=1, Y=5) = 0.35 - P(X=1, Y=8) = 0.13999999999999999 - P(X=2, Y=-2) = 0.09 - P(X=2, Y=5) = 0.15 - P(X=2, Y=8) = 0.06 + >>>calculate_joint_probability([1],[1],[1],[1]) + {(1,1):1} """ joint_distribution = {} @@ -26,7 +15,6 @@ def calculate_joint_probability( for y, y_prob in zip(y_values, y_probabilities): joint_prob = x_prob * y_prob joint_distribution[(x, y)] = joint_prob - print(joint_distribution) return joint_distribution @@ -54,6 +42,10 @@ def variance(values: list, probabilities: list) -> float: def covariance( x_values: list, y_values: list, x_probabilities: list, y_probabilities: list ) -> float: + """ + >>>covariance([],[],[],[]) + + """ mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) return sum( @@ -65,6 +57,11 @@ def covariance( # Function to calculate the standard deviation def standard_deviation(variance: list) -> float: + """ + >>>variance(4) + 2 + + """ return variance**0.5 From 8ce6629a859498037c18a03f45d765f573ff2296 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 11:57:18 +0000 Subject: [PATCH 11/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index df885c32e742..89b7c09ae323 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -44,7 +44,7 @@ def covariance( ) -> float: """ >>>covariance([],[],[],[]) - + """ mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) @@ -60,7 +60,7 @@ def standard_deviation(variance: list) -> float: """ >>>variance(4) 2 - + """ return variance**0.5 From 257ea791185881b2c8efcd4b5e45866ec959026b Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:36:48 +0530 Subject: [PATCH 12/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 39 ++++++++++++++++++------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index df885c32e742..b4b125370e16 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -4,8 +4,11 @@ def calculate_joint_probability( x_values: list, y_values: list, x_probabilities: list, y_probabilities: list ) -> dict: """ + Examples: >>>calculate_joint_probability([1],[1],[1],[1]) {(1,1):1} + >>>calculate_joint_probability([1][1,2][0.5][0.1,0.5]) + {(1,1):0.05 , (1,2):0.25} """ joint_distribution = {} @@ -21,8 +24,11 @@ def calculate_joint_probability( # Function to calculate the expectation (mean) def expectation(values: list, probabilities: list) -> float: """ + Examples: >>>expectation([1,2],[0.7,0.3]) 1.2999999999999999999999 + >>>expectation([-2,5,8],[0.3,0.5,0.2]) + 3.5 """ return sum(x * p for x, p in zip(values, probabilities)) @@ -31,8 +37,11 @@ def expectation(values: list, probabilities: list) -> float: # Function to calculate the variance def variance(values: list, probabilities: list) -> float: """ + Examples: >>>variance([1,2],[0.7,0.3]) 0.21000 + >>>variance([-2.5.8],[0.3,0.5,0.2]) + 14.25 """ mean = expectation(values, probabilities) return sum((x - mean) ** 2 * p for x, p in zip(values, probabilities)) @@ -43,7 +52,11 @@ def covariance( x_values: list, y_values: list, x_probabilities: list, y_probabilities: list ) -> float: """ - >>>covariance([],[],[],[]) + Examples: + >>>covariance([1,2],[-2,5 ,8],[0.7, 0.3],[0.3, 0.5, 0.2]) + 0 + >>>covariance([1],[1],[1],[1]) + 0 """ mean_x = expectation(x_values, x_probabilities) @@ -58,8 +71,11 @@ def covariance( # Function to calculate the standard deviation def standard_deviation(variance: list) -> float: """ - >>>variance(4) + Examples + >>>standard_deviation(4) 2 + >>>standard_deviation(9) + 3 """ return variance**0.5 @@ -114,11 +130,14 @@ def standard_deviation(variance: list) -> float: stddev_y = standard_deviation(variance_y) # Print the results -print(f"Expectation (mean) of X: {mean_x}") -print(f"Expectation (mean) of Y: {mean_y}") -print(f"Expectation (mean) of XY: {mean_xy}") -print(f"Variance of X: {variance_x}") -print(f"Variance of Y: {variance_y}") -print(f"Covariance between X and Y: {cov_xy}") -print(f"Standard Deviation of X: {stddev_x}") -print(f"Standard Deviation of Y: {stddev_y}") +print(f"Expectation (mean) of X: {expectation(x_values, x_probabilities)}") +print(f"Expectation (mean) of Y: {expectation(y_values, y_probabilities)}") +print(f"Expectation (mean) of XY: {expectation( + [x * y for x in x_values for y in y_values], + [px * py for px in x_probabilities for py in y_probabilities], +)}") +print(f"Variance of X: {variance(x_values, x_probabilities)}") +print(f"Variance of Y: {variance(y_values, y_probabilities)}") +print(f"Covariance between X and Y: {covariance(x_values, y_values, x_probabilities, y_probabilities)}") +print(f"Standard Deviation of X: {standard_deviation(variance_x)}") +print(f"Standard Deviation of Y: {standard_deviation(variance_y)}") From 232b7b8b506820cc745dd43575f5ca6cff428900 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:07:56 +0000 Subject: [PATCH 13/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index b4b125370e16..674a4bb2619c 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -57,7 +57,7 @@ def covariance( 0 >>>covariance([1],[1],[1],[1]) 0 - + """ mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) @@ -76,7 +76,7 @@ def standard_deviation(variance: list) -> float: 2 >>>standard_deviation(9) 3 - + """ return variance**0.5 From b301636f2d931eb3b5829a539fb9f7814961d5ce Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:41:50 +0530 Subject: [PATCH 14/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 135 +++--------------------- 1 file changed, 16 insertions(+), 119 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index b4b125370e16..a446fc259c2a 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -4,6 +4,19 @@ def calculate_joint_probability( x_values: list, y_values: list, x_probabilities: list, y_probabilities: list ) -> dict: """ + Given two random variables that are defined on the same probability space, + [1] the joint probability distribution is the corresponding probability distribution on all possible pairs of outputs. + The joint distribution can just as well be considered for any given number of random variables. + + Args: + lst (List[int]): The X values. + 2nd (List[int]): The y values. + 3rd (List[int]): The x probability. + 4th (List[int]): The y probability. + + Returns: + List[int]: The Joint probability. + Examples: >>>calculate_joint_probability([1],[1],[1],[1]) {(1,1):1} @@ -21,123 +34,7 @@ def calculate_joint_probability( return joint_distribution -# Function to calculate the expectation (mean) -def expectation(values: list, probabilities: list) -> float: - """ - Examples: - >>>expectation([1,2],[0.7,0.3]) - 1.2999999999999999999999 - >>>expectation([-2,5,8],[0.3,0.5,0.2]) - 3.5 - - """ - return sum(x * p for x, p in zip(values, probabilities)) - - -# Function to calculate the variance -def variance(values: list, probabilities: list) -> float: - """ - Examples: - >>>variance([1,2],[0.7,0.3]) - 0.21000 - >>>variance([-2.5.8],[0.3,0.5,0.2]) - 14.25 - """ - mean = expectation(values, probabilities) - return sum((x - mean) ** 2 * p for x, p in zip(values, probabilities)) - - -# Function to calculate the covariance -def covariance( - x_values: list, y_values: list, x_probabilities: list, y_probabilities: list -) -> float: - """ - Examples: - >>>covariance([1,2],[-2,5 ,8],[0.7, 0.3],[0.3, 0.5, 0.2]) - 0 - >>>covariance([1],[1],[1],[1]) - 0 - - """ - mean_x = expectation(x_values, x_probabilities) - mean_y = expectation(y_values, y_probabilities) - return sum( - (x - mean_x) * (y - mean_y) * px * py - for x, px in zip(x_values, x_probabilities) - for y, py in zip(y_values, y_probabilities) - ) - - -# Function to calculate the standard deviation -def standard_deviation(variance: list) -> float: - """ - Examples - >>>standard_deviation(4) - 2 - >>>standard_deviation(9) - 3 - - """ - return variance**0.5 - - -# Input values for X and Y -x_values = input("Enter values of X separated by spaces: ").split() -y_values = input("Enter values of Y separated by spaces: ").split() - -# Convert input values to integers -x_values = [int(x) for x in x_values] -y_values = [int(y) for y in y_values] - -# Input probabilities for X and Y -x_probabilities = input("Enter probabilities for X separated by spaces: ").split() -y_probabilities = input("Enter probabilities for Y separated by spaces: ").split() - -# Convert input probabilities to floats -x_probabilities = [float(p) for p in x_probabilities] -y_probabilities = [float(p) for p in y_probabilities] - -# Calculate the joint probability distribution -joint_distribution = calculate_joint_probability( - x_values, y_values, x_probabilities, y_probabilities -) - -# Print the joint probability distribution -for (x, y), probability in joint_distribution.items(): - print(f"P(X={x}, Y={y}) = {probability}") - - -# Calculate the joint probability distribution -joint_distribution = calculate_joint_probability( - x_values, y_values, x_probabilities, y_probabilities -) - -# Print the joint probability distribution -for (x, y), probability in joint_distribution.items(): - print(f"P(X={x}, Y={y}) = {probability}") - -# Calculate the statistics -mean_x = expectation(x_values, x_probabilities) -mean_y = expectation(y_values, y_probabilities) -mean_xy = expectation( - [x * y for x in x_values for y in y_values], - [px * py for px in x_probabilities for py in y_probabilities], -) -variance_x = variance(x_values, x_probabilities) -variance_y = variance(y_values, y_probabilities) -cov_xy = covariance(x_values, y_values, x_probabilities, y_probabilities) -stddev_x = standard_deviation(variance_x) -stddev_y = standard_deviation(variance_y) +if __name__ == "__main__": + import doctest -# Print the results -print(f"Expectation (mean) of X: {expectation(x_values, x_probabilities)}") -print(f"Expectation (mean) of Y: {expectation(y_values, y_probabilities)}") -print(f"Expectation (mean) of XY: {expectation( - [x * y for x in x_values for y in y_values], - [px * py for px in x_probabilities for py in y_probabilities], -)}") -print(f"Variance of X: {variance(x_values, x_probabilities)}") -print(f"Variance of Y: {variance(y_values, y_probabilities)}") -print(f"Covariance between X and Y: {covariance(x_values, y_values, x_probabilities, y_probabilities)}") -print(f"Standard Deviation of X: {standard_deviation(variance_x)}") -print(f"Standard Deviation of Y: {standard_deviation(variance_y)}") + doctest.testmod() \ No newline at end of file From a3d1b12e7ef3e0b6fdc28ac6432d0a3eca5c7022 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:13:10 +0000 Subject: [PATCH 15/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 80de117773a2..f183a29c02a7 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -5,15 +5,15 @@ def calculate_joint_probability( ) -> dict: """ Given two random variables that are defined on the same probability space, - [1] the joint probability distribution is the corresponding probability distribution on all possible pairs of outputs. + [1] the joint probability distribution is the corresponding probability distribution on all possible pairs of outputs. The joint distribution can just as well be considered for any given number of random variables. - + Args: lst (List[int]): The X values. 2nd (List[int]): The y values. 3rd (List[int]): The x probability. 4th (List[int]): The y probability. - + Returns: List[int]: The Joint probability. From 5a86c99289cf6c9ffa0c1e17c2f66b15d3c89b61 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:47:17 +0530 Subject: [PATCH 16/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 80de117773a2..f05cdaa974be 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -18,9 +18,9 @@ def calculate_joint_probability( List[int]: The Joint probability. Examples: - >>>calculate_joint_probability([1],[1],[1],[1]) + >>> calculate_joint_probability([1],[1],[1],[1]) {(1,1):1} - >>>calculate_joint_probability([1][1,2][0.5][0.1,0.5]) + >>> calculate_joint_probability([1][1,2][0.5][0.1,0.5]) {(1,1):0.05 , (1,2):0.25} """ @@ -34,7 +34,11 @@ def calculate_joint_probability( return joint_distribution +def main(): + print(calculate_joint_probability([1],[1,2],[0.5],[0.1,0,5])) + if __name__ == "__main__": import doctest - + ans = main() doctest.testmod() + From d80e54608c2dce9c94f51a0354098fe114e256bf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:18:09 +0000 Subject: [PATCH 17/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 3c28541ade74..ffed172c086f 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -35,10 +35,11 @@ def calculate_joint_probability( def main(): - print(calculate_joint_probability([1],[1,2],[0.5],[0.1,0,5])) - + print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0, 5])) + + if __name__ == "__main__": import doctest + ans = main() doctest.testmod() - From 6a4b223fd691242769d6f54d6d1b3e19b7701ce1 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:48:24 +0530 Subject: [PATCH 18/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 3c28541ade74..d6d03f80b0c6 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -34,9 +34,9 @@ def calculate_joint_probability( return joint_distribution -def main(): +def main() -> None: print(calculate_joint_probability([1],[1,2],[0.5],[0.1,0,5])) - + if __name__ == "__main__": import doctest ans = main() From 198558b88b2a5a47397de6b8403bfef69b95bf2f Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:49:35 +0530 Subject: [PATCH 19/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index ee75e25461bf..d3d71c359c4a 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -33,12 +33,8 @@ def calculate_joint_probability( joint_distribution[(x, y)] = joint_prob return joint_distribution - -def main() -> None: - print(calculate_joint_probability([1],[1,2],[0.5],[0.1,0,5])) - if __name__ == "__main__": import doctest - ans = main() + print(calculate_joint_probability([1],[1,2],[0.5],[0.1,0,5])) doctest.testmod() From cc3db5460a6c746663ea5aaf22910fe1e87e69c4 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:21:14 +0000 Subject: [PATCH 20/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index d3d71c359c4a..67774a8c3143 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -33,8 +33,9 @@ def calculate_joint_probability( joint_distribution[(x, y)] = joint_prob return joint_distribution + if __name__ == "__main__": import doctest - print(calculate_joint_probability([1],[1,2],[0.5],[0.1,0,5])) + print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0, 5])) doctest.testmod() From 848077e89ca996c0e5ac9f005a1ac900f4a9e060 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 17:53:52 +0530 Subject: [PATCH 21/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index d3d71c359c4a..b8e2cb1c1e2d 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -5,8 +5,10 @@ def calculate_joint_probability( ) -> dict: """ Given two random variables that are defined on the same probability space, - [1] the joint probability distribution is the corresponding probability distribution on all possible pairs of outputs. - The joint distribution can just as well be considered for any given number of random variables. + [1] the joint probability distribution is the corresponding + probability distribution on all possible pairs of outputs. + The joint distribution can just as well be considered for any given + number of random variables. Args: lst (List[int]): The X values. From 7a94fe2d12d5674fd5fe32e39254805b8a837cd2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:25:37 +0000 Subject: [PATCH 22/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 179b974fc32f..6498482cfe20 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -5,7 +5,7 @@ def calculate_joint_probability( ) -> dict: """ Given two random variables that are defined on the same probability space, - [1] the joint probability distribution is the corresponding + [1] the joint probability distribution is the corresponding probability distribution on all possible pairs of outputs. The joint distribution can just as well be considered for any given number of random variables. From e5e5a910bc9b7116936d2cb6e54d15156c5074b4 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:02:06 +0530 Subject: [PATCH 23/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 179b974fc32f..881e9216a7bf 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -39,5 +39,5 @@ def calculate_joint_probability( if __name__ == "__main__": import doctest - print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0, 5])) + # print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0, 5])) doctest.testmod() From 463c0679ae6a0a4ff06a6d1422d35d0f0383ede0 Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:13:41 +0530 Subject: [PATCH 24/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 16715efe5624..43ddfe19c061 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -23,7 +23,7 @@ def calculate_joint_probability( >>> calculate_joint_probability([1],[1],[1],[1]) {(1,1):1} >>> calculate_joint_probability([1][1,2][0.5][0.1,0.5]) - {(1,1):0.05 , (1,2):0.25} + {(1,1):0.05 , (1,2): 0.25} """ joint_distribution = {} @@ -38,6 +38,6 @@ def calculate_joint_probability( if __name__ == "__main__": import doctest - - # print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0, 5])) doctest.testmod() + print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0.5])) + From a9b592f1144577d6b0e4247321492a7c2c97581a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:44:22 +0000 Subject: [PATCH 25/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/joint_probability_distribution.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 43ddfe19c061..1f1985a3ffe9 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -38,6 +38,6 @@ def calculate_joint_probability( if __name__ == "__main__": import doctest + doctest.testmod() print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0.5])) - From bb64341e6492c377640f9f6574cd2bf8f3eb3ffe Mon Sep 17 00:00:00 2001 From: Rahul Jangra <106389897+leonado10000@users.noreply.github.com> Date: Sun, 15 Oct 2023 18:18:14 +0530 Subject: [PATCH 26/32] Update maclaurin_series.py --- maths/maclaurin_series.py | 139 ++++++++------------------------------ 1 file changed, 28 insertions(+), 111 deletions(-) diff --git a/maths/maclaurin_series.py b/maths/maclaurin_series.py index d5c3c3ab958b..c27b2a30df20 100644 --- a/maths/maclaurin_series.py +++ b/maths/maclaurin_series.py @@ -1,122 +1,39 @@ -""" -https://en.wikipedia.org/wiki/Taylor_series#Trigonometric_functions -""" -from math import factorial, pi +from __future__ import annotations +from .double_ended_queue import Deque -def maclaurin_sin(theta: float, accuracy: int = 30) -> float: - """ - Finds the maclaurin approximation of sin - - :param theta: the angle to which sin is found - :param accuracy: the degree of accuracy wanted minimum - :return: the value of sine in radians - - - >>> from math import isclose, sin - >>> all(isclose(maclaurin_sin(x, 50), sin(x)) for x in range(-25, 25)) - True - >>> maclaurin_sin(10) - -0.5440211108893691 - >>> maclaurin_sin(-10) - 0.5440211108893704 - >>> maclaurin_sin(10, 15) - -0.544021110889369 - >>> maclaurin_sin(-10, 15) - 0.5440211108893704 - >>> maclaurin_sin("10") - Traceback (most recent call last): - ... - ValueError: maclaurin_sin() requires either an int or float for theta - >>> maclaurin_sin(10, -30) - Traceback (most recent call last): - ... - ValueError: maclaurin_sin() requires a positive int for accuracy - >>> maclaurin_sin(10, 30.5) - Traceback (most recent call last): - ... - ValueError: maclaurin_sin() requires a positive int for accuracy - >>> maclaurin_sin(10, "30") - Traceback (most recent call last): - ... - ValueError: maclaurin_sin() requires a positive int for accuracy - """ - - if not isinstance(theta, (int, float)): - raise ValueError("maclaurin_sin() requires either an int or float for theta") - - if not isinstance(accuracy, int) or accuracy <= 0: - raise ValueError("maclaurin_sin() requires a positive int for accuracy") - - theta = float(theta) - div = theta // (2 * pi) - theta -= 2 * div * pi - return sum( - (-1) ** r * theta ** (2 * r + 1) / factorial(2 * r + 1) for r in range(accuracy) - ) +arr = [1, 3, -1, -3, 5, 3, 6, 7] +window_size = 3 +expect = [3, 3, 5, 5, 6, 7] -def maclaurin_cos(theta: float, accuracy: int = 30) -> float: +def max_sliding_window(arr: list[float], window_size: int) -> list[float]: """ - Finds the maclaurin approximation of cos - - :param theta: the angle to which cos is found - :param accuracy: the degree of accuracy wanted - :return: the value of cosine in radians - - - >>> from math import isclose, cos - >>> all(isclose(maclaurin_cos(x, 50), cos(x)) for x in range(-25, 25)) + Given an array of integers nums, there is a sliding window of size k which is moving + from the very left of the array to the very right. + Each time the sliding window of length window_size moves right by one position. + Return the max sliding window. + >>> max_sliding_window(arr, window_size) == expect True - >>> maclaurin_cos(5) - 0.2836621854632268 - >>> maclaurin_cos(-5) - 0.2836621854632265 - >>> maclaurin_cos(10, 15) - -0.8390715290764524 - >>> maclaurin_cos(-10, 15) - -0.8390715290764521 - >>> maclaurin_cos("10") - Traceback (most recent call last): - ... - ValueError: maclaurin_cos() requires either an int or float for theta - >>> maclaurin_cos(10, -30) - Traceback (most recent call last): - ... - ValueError: maclaurin_cos() requires a positive int for accuracy - >>> maclaurin_cos(10, 30.5) - Traceback (most recent call last): - ... - ValueError: maclaurin_cos() requires a positive int for accuracy - >>> maclaurin_cos(10, "30") - Traceback (most recent call last): - ... - ValueError: maclaurin_cos() requires a positive int for accuracy """ - - if not isinstance(theta, (int, float)): - raise ValueError("maclaurin_cos() requires either an int or float for theta") - - if not isinstance(accuracy, int) or accuracy <= 0: - raise ValueError("maclaurin_cos() requires a positive int for accuracy") - - theta = float(theta) - div = theta // (2 * pi) - theta -= 2 * div * pi - return sum((-1) ** r * theta ** (2 * r) / factorial(2 * r) for r in range(accuracy)) + max_val = [] + queue = Deque() + for i in range(len(arr)): + # pop the element if the index is outside the window size k + if queue and i - queue._front.val >= window_size: + queue.popleft() + # keep the queue monotonically decreasing + # so that the max value is always on the top + while queue and arr[i] >= arr[queue._back.val]: + queue.pop() + queue.append(i) + # the maximum value is the first element in queue + if i >= window_size - 1: + max_val.append(arr[queue._front.val]) + return max_val if __name__ == "__main__": - import doctest - - doctest.testmod() - - print(maclaurin_sin(10)) - print(maclaurin_sin(-10)) - print(maclaurin_sin(10, 15)) - print(maclaurin_sin(-10, 15)) + from doctest import testmod - print(maclaurin_cos(5)) - print(maclaurin_cos(-5)) - print(maclaurin_cos(10, 15)) - print(maclaurin_cos(-10, 15)) + testmod() \ No newline at end of file From d853110fb80b155097dadf676e0dfb917e75891b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 15 Oct 2023 12:49:11 +0000 Subject: [PATCH 27/32] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- maths/maclaurin_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/maclaurin_series.py b/maths/maclaurin_series.py index c27b2a30df20..b5b574dda995 100644 --- a/maths/maclaurin_series.py +++ b/maths/maclaurin_series.py @@ -36,4 +36,4 @@ def max_sliding_window(arr: list[float], window_size: int) -> list[float]: if __name__ == "__main__": from doctest import testmod - testmod() \ No newline at end of file + testmod() From c5bcbb178106cb2a778b16cab15b82021a769e25 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 16:14:38 +0200 Subject: [PATCH 28/32] Revert changes to maclaurin_series.py --- maths/maclaurin_series.py | 131 ++++++++++++++++++++++++++++++-------- 1 file changed, 103 insertions(+), 28 deletions(-) diff --git a/maths/maclaurin_series.py b/maths/maclaurin_series.py index b5b574dda995..a4fa4deea8ac 100644 --- a/maths/maclaurin_series.py +++ b/maths/maclaurin_series.py @@ -1,39 +1,114 @@ -from __future__ import annotations +""" +https://en.wikipedia.org/wiki/Taylor_series#Trigonometric_functions +""" +from math import factorial, pi -from .double_ended_queue import Deque -arr = [1, 3, -1, -3, 5, 3, 6, 7] -window_size = 3 -expect = [3, 3, 5, 5, 6, 7] +def maclaurin_sin(theta: float, accuracy: int = 30) -> float: + """ + Finds the maclaurin approximation of sin + + :param theta: the angle to which sin is found + :param accuracy: the degree of accuracy wanted minimum + :return: the value of sine in radians -def max_sliding_window(arr: list[float], window_size: int) -> list[float]: + >>> from math import isclose, sin + >>> all(isclose(maclaurin_sin(x, 50), sin(x)) for x in range(-25, 25)) + True + >>> maclaurin_sin(10) + -0.5440211108893691 + >>> maclaurin_sin(-10) + 0.5440211108893704 + >>> maclaurin_sin(10, 15) + -0.544021110889369 + >>> maclaurin_sin(-10, 15) + 0.5440211108893704 + >>> maclaurin_sin("10") + Traceback (most recent call last): + ... + ValueError: maclaurin_sin() requires either an int or float for theta + >>> maclaurin_sin(10, -30) + Traceback (most recent call last): + ... + ValueError: maclaurin_sin() requires a positive int for accuracy + >>> maclaurin_sin(10, 30.5) + Traceback (most recent call last): + ... + ValueError: maclaurin_sin() requires a positive int for accuracy + >>> maclaurin_sin(10, "30") + Traceback (most recent call last): + ... + ValueError: maclaurin_sin() requires a positive int for accuracy """ - Given an array of integers nums, there is a sliding window of size k which is moving - from the very left of the array to the very right. - Each time the sliding window of length window_size moves right by one position. - Return the max sliding window. - >>> max_sliding_window(arr, window_size) == expect + + if not isinstance(theta, (int, float)): + raise ValueError("maclaurin_sin() requires either an int or float for theta") + + if not isinstance(accuracy, int) or accuracy <= 0: + raise ValueError("maclaurin_sin() requires a positive int for accuracy") + + theta = float(theta) + div = theta // (2 * pi) + theta -= 2 * div * pi + return sum( + (-1) ** r * theta ** (2 * r + 1) / factorial(2 * r + 1) for r in range(accuracy) + ) + + +def maclaurin_cos(theta: float, accuracy: int = 30) -> float: + """ + Finds the maclaurin approximation of cos + :param theta: the angle to which cos is found + :param accuracy: the degree of accuracy wanted + :return: the value of cosine in radians + >>> from math import isclose, cos + >>> all(isclose(maclaurin_cos(x, 50), cos(x)) for x in range(-25, 25)) True + >>> maclaurin_cos(5) + 0.2836621854632268 + >>> maclaurin_cos(-5) + 0.2836621854632265 + >>> maclaurin_cos(10, 15) + -0.8390715290764524 + >>> maclaurin_cos(-10, 15) + -0.8390715290764521 + >>> maclaurin_cos("10") + Traceback (most recent call last): + ... + ValueError: maclaurin_cos() requires either an int or float for theta + >>> maclaurin_cos(10, -30) + Traceback (most recent call last): + ... + ValueError: maclaurin_cos() requires a positive int for accuracy + >>> maclaurin_cos(10, 30.5) + Traceback (most recent call last): + ... + ValueError: maclaurin_cos() requires a positive int for accuracy + >>> maclaurin_cos(10, "30") + Traceback (most recent call last): + ... + ValueError: maclaurin_cos() requires a positive int for accuracy """ - max_val = [] - queue = Deque() - for i in range(len(arr)): - # pop the element if the index is outside the window size k - if queue and i - queue._front.val >= window_size: - queue.popleft() - # keep the queue monotonically decreasing - # so that the max value is always on the top - while queue and arr[i] >= arr[queue._back.val]: - queue.pop() - queue.append(i) - # the maximum value is the first element in queue - if i >= window_size - 1: - max_val.append(arr[queue._front.val]) - return max_val + + if not isinstance(theta, (int, float)): + raise ValueError("maclaurin_cos() requires either an int or float for theta") + + if not isinstance(accuracy, int) or accuracy <= 0: + raise ValueError("maclaurin_cos() requires a positive int for accuracy") + + theta = float(theta) + div = theta // (2 * pi) + theta -= 2 * div * pi + return sum((-1) ** r * theta ** (2 * r) / factorial(2 * r) for r in range(accuracy)) if __name__ == "__main__": - from doctest import testmod + import doctest + + doctest.testmod() - testmod() + print(maclaurin_sin(10)) + print(maclaurin_sin(-10)) + print(maclaurin_sin(10, 15)) + print(maclaurin_sin(-10, 15)) From 66c5acb8c5797d89ffb5fc3a16e8a755df010cff Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 16:17:21 +0200 Subject: [PATCH 29/32] Revert changes to maclaurin_series.py --- maths/maclaurin_series.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/maths/maclaurin_series.py b/maths/maclaurin_series.py index a4fa4deea8ac..d5c3c3ab958b 100644 --- a/maths/maclaurin_series.py +++ b/maths/maclaurin_series.py @@ -8,11 +8,11 @@ def maclaurin_sin(theta: float, accuracy: int = 30) -> float: """ Finds the maclaurin approximation of sin - :param theta: the angle to which sin is found :param accuracy: the degree of accuracy wanted minimum :return: the value of sine in radians + >>> from math import isclose, sin >>> all(isclose(maclaurin_sin(x, 50), sin(x)) for x in range(-25, 25)) True @@ -59,9 +59,12 @@ def maclaurin_sin(theta: float, accuracy: int = 30) -> float: def maclaurin_cos(theta: float, accuracy: int = 30) -> float: """ Finds the maclaurin approximation of cos + :param theta: the angle to which cos is found :param accuracy: the degree of accuracy wanted :return: the value of cosine in radians + + >>> from math import isclose, cos >>> all(isclose(maclaurin_cos(x, 50), cos(x)) for x in range(-25, 25)) True @@ -112,3 +115,8 @@ def maclaurin_cos(theta: float, accuracy: int = 30) -> float: print(maclaurin_sin(-10)) print(maclaurin_sin(10, 15)) print(maclaurin_sin(-10, 15)) + + print(maclaurin_cos(5)) + print(maclaurin_cos(-5)) + print(maclaurin_cos(10, 15)) + print(maclaurin_cos(-10, 15)) From 9168bebb0a3d0e20ad98d26d05ce08370c8bd442 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 16:17:59 +0200 Subject: [PATCH 30/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 132 ++++++++++++++++++------ 1 file changed, 100 insertions(+), 32 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 1f1985a3ffe9..d14716bd3c28 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,43 +1,111 @@ # https://en.wikipedia.org/wiki/Joint_probability_distribution # Function to calculate the joint probability distribution -def calculate_joint_probability( - x_values: list, y_values: list, x_probabilities: list, y_probabilities: list + + +def joint_probability_distribution( + x_values: list[int], + y_values: list[int], + x_probabilities: list[float], + y_probabilities: list[float], ) -> dict: """ - Given two random variables that are defined on the same probability space, - [1] the joint probability distribution is the corresponding - probability distribution on all possible pairs of outputs. - The joint distribution can just as well be considered for any given - number of random variables. - - Args: - lst (List[int]): The X values. - 2nd (List[int]): The y values. - 3rd (List[int]): The x probability. - 4th (List[int]): The y probability. - - Returns: - List[int]: The Joint probability. - - Examples: - >>> calculate_joint_probability([1],[1],[1],[1]) - {(1,1):1} - >>> calculate_joint_probability([1][1,2][0.5][0.1,0.5]) - {(1,1):0.05 , (1,2): 0.25} + >>> joint_distribution = joint_probability_distribution( + ... [1, 2], [-2, 5, 8], [0.7, 0.3], [0.3, 0.5, 0.2] + ... ) + >>> from math import isclose + >>> isclose(joint_distribution.pop((1, 8)), 0.14) + True + >>> joint_distribution + {(1, -2): 0.21, (1, 5): 0.35, (2, -2): 0.09, (2, 5): 0.15, (2, 8): 0.06} + """ + return { + (x, y): x_prob * y_prob + for x, x_prob in zip(x_values, x_probabilities) + for y, y_prob in zip(y_values, y_probabilities) + } + +# Function to calculate the expectation (mean) +def expectation(values: list, probabilities: list) -> float: """ - joint_distribution = {} + >>> from math import isclose + >>> isclose(expectation([1, 2], [0.7, 0.3]), 1.3) + True + """ + return sum(x * p for x, p in zip(values, probabilities)) - # Calculate the joint probability for all combinations of (X, Y) - for x, x_prob in zip(x_values, x_probabilities): - for y, y_prob in zip(y_values, y_probabilities): - joint_prob = x_prob * y_prob - joint_distribution[(x, y)] = joint_prob - return joint_distribution + +# Function to calculate the variance +def variance(values: list, probabilities: list) -> float: + """ + >>> from math import isclose + >>> isclose(variance([1,2],[0.7,0.3]), 0.21) + True + """ + mean = expectation(values, probabilities) + return sum((x - mean) ** 2 * p for x, p in zip(values, probabilities)) + + +# Function to calculate the covariance +def covariance( + x_values: list, y_values: list, x_probabilities: list, y_probabilities: list +) -> float: + mean_x = expectation(x_values, x_probabilities) + mean_y = expectation(y_values, y_probabilities) + return sum( + (x - mean_x) * (y - mean_y) * px * py + for x, px in zip(x_values, x_probabilities) + for y, py in zip(y_values, y_probabilities) + ) + + +# Function to calculate the standard deviation +def standard_deviation(variance: list) -> float: + return variance**0.5 if __name__ == "__main__": - import doctest + from doctest import testmod + + testmod() + # Input values for X and Y + x_values = input("Enter values of X separated by spaces: ").split() + y_values = input("Enter values of Y separated by spaces: ").split() + + # Convert input values to integers + x_values = [int(x) for x in x_values] + y_values = [int(y) for y in y_values] + + # Input probabilities for X and Y + x_probabilities = input("Enter probabilities for X separated by spaces: ").split() + y_probabilities = input("Enter probabilities for Y separated by spaces: ").split() + assert len(x_values) == len(x_probabilities) + assert len(y_values) == len(y_probabilities) + + # Convert input probabilities to floats + x_probabilities = [float(p) for p in x_probabilities] + y_probabilities = [float(p) for p in y_probabilities] + + # Calculate the joint probability distribution + jpd = joint_probability_distribution( + x_values, y_values, x_probabilities, y_probabilities + ) - doctest.testmod() - print(calculate_joint_probability([1], [1, 2], [0.5], [0.1, 0.5])) + # Print the joint probability distribution + print( + "\n".join( + f"P(X={x}, Y={y}) = {probability}" for (x, y), probability in jpd.items() + ) + ) + mean_xy = expectation( + [x * y for x in x_values for y in y_values], + [px * py for px in x_probabilities for py in y_probabilities], + ) + print(f"x mean: {expectation(x_values, x_probabilities) = }") + print(f"y mean: {expectation(y_values, y_probabilities) = }") + print(f"xy mean: {mean_xy}") + print(f"x: {variance(x_values, x_probabilities) = }") + print(f"y: {variance(y_values, y_probabilities) = }") + print(f"{covariance(x_values, y_values, x_probabilities, y_probabilities) = }") + print(f"x: {standard_deviation(variance(x_values, x_probabilities)) = }") + print(f"y: {standard_deviation(variance(y_values, y_probabilities)) = }") From 26cf878e27a57f9795234c12676fe48ca39e7af7 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 16:31:16 +0200 Subject: [PATCH 31/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 35 ++++++++++++++----------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index d14716bd3c28..92138687a475 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -1,5 +1,7 @@ -# https://en.wikipedia.org/wiki/Joint_probability_distribution -# Function to calculate the joint probability distribution +""" +Calculate joint probability distribution +https://en.wikipedia.org/wiki/Joint_probability_distribution +""" def joint_probability_distribution( @@ -36,7 +38,7 @@ def expectation(values: list, probabilities: list) -> float: # Function to calculate the variance -def variance(values: list, probabilities: list) -> float: +def variance(values: list[int], probabilities: list[float]) -> float: """ >>> from math import isclose >>> isclose(variance([1,2],[0.7,0.3]), 0.21) @@ -48,7 +50,10 @@ def variance(values: list, probabilities: list) -> float: # Function to calculate the covariance def covariance( - x_values: list, y_values: list, x_probabilities: list, y_probabilities: list + x_values: list[int], + y_values: list[int], + x_probabilities: list[float], + y_probabilities: list[float], ) -> float: mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) @@ -60,7 +65,7 @@ def covariance( # Function to calculate the standard deviation -def standard_deviation(variance: list) -> float: +def standard_deviation(variance: float) -> float: return variance**0.5 @@ -69,22 +74,22 @@ def standard_deviation(variance: list) -> float: testmod() # Input values for X and Y - x_values = input("Enter values of X separated by spaces: ").split() - y_values = input("Enter values of Y separated by spaces: ").split() + x_vals = input("Enter values of X separated by spaces: ").split() + y_vals = input("Enter values of Y separated by spaces: ").split() # Convert input values to integers - x_values = [int(x) for x in x_values] - y_values = [int(y) for y in y_values] + x_values = [int(x) for x in x_vals] + y_values = [int(y) for y in y_vals] # Input probabilities for X and Y - x_probabilities = input("Enter probabilities for X separated by spaces: ").split() - y_probabilities = input("Enter probabilities for Y separated by spaces: ").split() - assert len(x_values) == len(x_probabilities) - assert len(y_values) == len(y_probabilities) + x_probs = input("Enter probabilities for X separated by spaces: ").split() + y_probs = input("Enter probabilities for Y separated by spaces: ").split() + assert len(x_values) == len(x_probs) + assert len(y_values) == len(y_probs) # Convert input probabilities to floats - x_probabilities = [float(p) for p in x_probabilities] - y_probabilities = [float(p) for p in y_probabilities] + x_probabilities = [float(p) for p in x_probs] + y_probabilities = [float(p) for p in y_probs] # Calculate the joint probability distribution jpd = joint_probability_distribution( From c1009e552fa1565ec01d7c2871a0e7b1a753997c Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Sun, 15 Oct 2023 16:35:21 +0200 Subject: [PATCH 32/32] Update joint_probability_distribution.py --- maths/joint_probability_distribution.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/maths/joint_probability_distribution.py b/maths/joint_probability_distribution.py index 92138687a475..6fbcea40c358 100644 --- a/maths/joint_probability_distribution.py +++ b/maths/joint_probability_distribution.py @@ -55,6 +55,10 @@ def covariance( x_probabilities: list[float], y_probabilities: list[float], ) -> float: + """ + >>> covariance([1, 2], [-2, 5, 8], [0.7, 0.3], [0.3, 0.5, 0.2]) + -2.7755575615628914e-17 + """ mean_x = expectation(x_values, x_probabilities) mean_y = expectation(y_values, y_probabilities) return sum( @@ -66,6 +70,10 @@ def covariance( # Function to calculate the standard deviation def standard_deviation(variance: float) -> float: + """ + >>> standard_deviation(0.21) + 0.458257569495584 + """ return variance**0.5