Skip to content

Commit d5c7350

Browse files
authored
Merge pull request #493 from Kritika75/features
Adding the Probability Calculator
2 parents 3114121 + abdddcc commit d5c7350

File tree

3 files changed

+173
-1
lines changed

3 files changed

+173
-1
lines changed

DIRECTORY.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
/home/runner/work/_temp/6fdf1479-e363-4b48-b800-3caed6b26718.sh: line 1: scripts/build_directory_md.py: Permission denied
1+
/home/runner/work/_temp/0d348b40-ee10-4617-a82a-a9b8b7f1343f.sh: line 1: scripts/build_directory_md.py: Permission denied

pysnippets/Mathematics/probability.py

Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import numpy as np
2+
import scipy.stats as stats
3+
import matplotlib.pyplot as plt
4+
import argparse
5+
6+
def correlation_coefficient(x, y):
7+
return np.corrcoef(x, y)[0, 1]
8+
9+
def poisson_probability(lmbda, k):
10+
return stats.poisson.pmf(k, lmbda)
11+
12+
def normal_distribution_pdf(x, mean, std_dev):
13+
return stats.norm.pdf(x, mean, std_dev)
14+
15+
def normal_distribution_cdf(x, mean, std_dev):
16+
return stats.norm.cdf(x, mean, std_dev)
17+
18+
def log_normal_distribution_pdf(x, mean, std_dev):
19+
return stats.lognorm.pdf(x, std_dev, scale=np.exp(mean))
20+
21+
def gamma_distribution_pdf(x, alpha, beta):
22+
return stats.gamma.pdf(x, alpha, scale=1/beta)
23+
24+
def z_value(x, mean, std_dev):
25+
return (x - mean) / std_dev
26+
27+
def binomial_probability(n, p, k):
28+
return stats.binom.pmf(k, n, p)
29+
30+
def exponential_probability(lmbda, x):
31+
return stats.expon.pdf(x, scale=1/lmbda)
32+
33+
def plot_poisson(lmbda, max_k=15):
34+
k_values = np.arange(0, max_k+1)
35+
probabilities = [poisson_probability(lmbda, k) for k in k_values]
36+
plt.bar(k_values, probabilities, color='skyblue', alpha=0.7)
37+
plt.xlabel("Number of Events (k)")
38+
plt.ylabel("Probability")
39+
plt.title(f"Poisson Distribution (λ={lmbda})")
40+
plt.show()
41+
42+
def plot_normal(mean, std_dev):
43+
x = np.linspace(mean - 4*std_dev, mean + 4*std_dev, 100)
44+
y = normal_distribution_pdf(x, mean, std_dev)
45+
plt.plot(x, y, color='red', label='PDF')
46+
plt.fill_between(x, y, alpha=0.2, color='red')
47+
plt.xlabel("X Values")
48+
plt.ylabel("Probability Density")
49+
plt.title(f"Normal Distribution (μ={mean}, σ={std_dev})")
50+
plt.legend()
51+
plt.show()
52+
53+
def main():
54+
parser = argparse.ArgumentParser(description="Probability Calculator")
55+
parser.add_argument("--correlation", nargs=2, type=float, metavar=("x", "y"), help="Calculate Correlation Coefficient")
56+
parser.add_argument("--poisson", nargs=2, type=float, metavar=("lambda", "k"), help="Calculate Poisson probability P(X=k)")
57+
parser.add_argument("--normal", nargs=3, type=float, metavar=("x", "mean", "std_dev"), help="Calculate Normal PDF and CDF")
58+
parser.add_argument("--lognormal", nargs=3, type=float, metavar=("x", "mean", "std_dev"), help="Calculate Log-Normal PDF and CDF")
59+
parser.add_argument("--gamma", nargs=3, type=float, metavar=("x", "alpha", "beta"), help="Calculate Gamma PDF and CDF")
60+
parser.add_argument("--zvalue", nargs=3, type=float, metavar=("x", "mean", "std_dev"), help="Calculate Z-value")
61+
parser.add_argument("--binomial", nargs=3, type=float, metavar=("n", "p", "k"), help="Calculate Binomial probability P(X=k)")
62+
parser.add_argument("--exponential", nargs=2, type=float, metavar=("lambda", "x"), help="Calculate Exponential PDF and CDF")
63+
parser.add_argument("--plot_poisson", type=float, metavar="lambda", help="Plot Poisson distribution")
64+
parser.add_argument("--plot_normal", nargs=2, type=float, metavar=("mean", "std_dev"), help="Plot Normal distribution")
65+
args = parser.parse_args()
66+
67+
if args.correlation:
68+
x, y = args.correlation
69+
corr = correlation_coefficient(x, y)
70+
print(f"Correlation Coefficient: {corr:.4f}")
71+
72+
if args.poisson:
73+
lmbda, k = args.poisson
74+
prob = poisson_probability(lmbda, k)
75+
print(f"Poisson P(X={int(k)}) with λ={lmbda}: {prob:.4f}")
76+
77+
if args.normal:
78+
x, mean, std_dev = args.normal
79+
pdf_val = normal_distribution_pdf(x, mean, std_dev)
80+
cdf_val = normal_distribution_cdf(x, mean, std_dev)
81+
print(f"Normal Distribution at X={x} (μ={mean}, σ={std_dev}): PDF={pdf_val:.4f}, CDF={cdf_val:.4f}")
82+
83+
if args.lognormal:
84+
x, mean, std_dev = args.lognormal
85+
pdf_val = log_normal_distribution_pdf(x, mean, std_dev)
86+
print(f"Log-Normal Distribution at X={x} (μ={mean}, σ={std_dev}): PDF={pdf_val:.4f}")
87+
88+
if args.gamma:
89+
x, alpha, beta = args.gamma
90+
pdf_val = gamma_distribution_pdf(x, alpha, beta)
91+
print(f"Gamma Distribution at X={x} (α={alpha}, β={beta}): PDF={pdf_val:.4f}")
92+
93+
if args.zvalue:
94+
x, mean, std_dev = args.zvalue
95+
z = z_value(x, mean, std_dev)
96+
print(f"Z-value for X={x} (μ={mean}, σ={std_dev}): {z:.4f}")
97+
98+
if args.binomial:
99+
n, p, k = args.binomial
100+
prob = binomial_probability(n, p, k)
101+
print(f"Binomial P(X={int(k)}) with n={int(n)}, p={p}: {prob:.4f}")
102+
103+
if args.exponential:
104+
lmbda, x = args.exponential
105+
pdf_val = exponential_probability(lmbda, x)
106+
print(f"Exponential Distribution at X={x} (λ={lmbda}): PDF={pdf_val:.4f}")
107+
108+
if args.plot_poisson:
109+
plot_poisson(args.plot_poisson)
110+
111+
if args.plot_normal:
112+
mean, std_dev = args.plot_normal
113+
plot_normal(mean, std_dev)
114+
115+
if __name__ == "__main__":
116+
main()
117+
118+
# Example Usage:
119+
120+
#python probability.py --correlation 2 4
121+
#python probability.py --poisson 4 2
122+
#python probability.py --normal 2 0 1
123+
#python probability.py --lognormal 20 2 3
124+
#python probability.py --gamma 2 2 1
125+
#python probability.py --zvalue 20 2 4
126+
#python probability.py --binomial 10 0.5 3
127+
#python probability.py --exponential 2 3
128+
#python probability.py --plot_poisson 4
129+
#python probability.py --plot_normal 0 1
130+

pysnippets/Mathematics/test_prob.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import unittest
2+
import numpy as np
3+
import scipy.stats as stats
4+
from probability import (
5+
correlation_coefficient, poisson_probability, normal_distribution_pdf,
6+
normal_distribution_cdf, log_normal_distribution_pdf, gamma_distribution_pdf,
7+
z_value, binomial_probability, exponential_probability
8+
)
9+
10+
class TestProbabilityFunctions(unittest.TestCase):
11+
12+
def test_correlation_coefficient(self):
13+
x = np.array([1, 2, 3, 4, 5])
14+
y = np.array([2, 4, 6, 8, 10])
15+
self.assertAlmostEqual(correlation_coefficient(x, y), 1.0, places=4)
16+
17+
def test_poisson_probability(self):
18+
self.assertAlmostEqual(poisson_probability(3, 2), stats.poisson.pmf(2, 3), places=4)
19+
20+
def test_normal_distribution_pdf(self):
21+
self.assertAlmostEqual(normal_distribution_pdf(0, 0, 1), stats.norm.pdf(0, 0, 1), places=4)
22+
23+
def test_normal_distribution_cdf(self):
24+
self.assertAlmostEqual(normal_distribution_cdf(0, 0, 1), stats.norm.cdf(0, 0, 1), places=4)
25+
26+
def test_log_normal_distribution_pdf(self):
27+
self.assertAlmostEqual(log_normal_distribution_pdf(1, 0, 1), stats.lognorm.pdf(1, 1, scale=np.exp(0)), places=4)
28+
29+
def test_gamma_distribution_pdf(self):
30+
self.assertAlmostEqual(gamma_distribution_pdf(2, 3, 2), stats.gamma.pdf(2, 3, scale=1/2), places=4)
31+
32+
def test_z_value(self):
33+
self.assertAlmostEqual(z_value(5, 2, 1), 3.0, places=4)
34+
35+
def test_binomial_probability(self):
36+
self.assertAlmostEqual(binomial_probability(10, 0.5, 5), stats.binom.pmf(5, 10, 0.5), places=4)
37+
38+
def test_exponential_probability(self):
39+
self.assertAlmostEqual(exponential_probability(2, 3), stats.expon.pdf(3, scale=1/2), places=4)
40+
41+
if __name__ == "__main__":
42+
unittest.main()

0 commit comments

Comments
 (0)