For Stats:

import numpy as np
from scipy import stats
data = [10, 20, 20, 40, 50]
# Mean, Median, Mode
mean = np.mean(data)
median = np.median(data)
mode = stats.mode(data, keepdims=True)[0][0]
# Weighted Mean
weights = [1, 2, 3, 4, 5]
weighted_mean = np.average(data, weights=weights)
# Trimmed Mean (remove 10% from each tail)
trimmed_mean = stats.trim_mean(data, 0.1)
# Dispersion
range_ = np.max(data) - np.min(data)
variance = np.var(data, ddof=0)  # population
sample_variance = np.var(data, ddof=1)
std_dev = np.std(data, ddof=1)
mad = np.mean(np.abs(data - mean))
cv = (std_dev / mean) * 100
q1 = np.percentile(data, 25)
q2 = np.percentile(data, 50)  # median
q3 = np.percentile(data, 75)
# Percentile of a value
value = 40
percentile_rank = stats.percentileofscore(data, value)
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
cov_matrix = np.cov(x, y, ddof=1)
correlation = np.corrcoef(x, y)[0, 1]
# probability distributions
PMF - Binomial (n=10, p=0.5)