import numpy as np
a = np.array([[1,2,3,4,5],[10,20,30,40,50]])
print("Shape :", a.shape)
print("Dimension :", a.ndim)
a = np.array([
    [[1,2,3,4,5],[10,20,30,40,50]],
    [[1,2,3,4,5],[10,20,30,40,50]]
])
print("Shape :", a.shape)
print("Dimension :", a.ndim)
b = np.arange(1,13)
print(b)
print(b.reshape(3,4))
print(np.zeros((3,3)))
print(np.ones((3,3)))
print(np.random.rand(2,3))
arr = np.array([10,20,30,40,50])
print("Min :", np.min(arr))
print("Max :", np.max(arr))
print("Mean :", np.mean(arr))
print("Median :", np.median(arr))
print("Standard Deviation :", np.std(arr))
print("Variance :", np.var(arr))
A = np.array([[4,2],[3,4]])
print("Transpose:\n", A.T)
print("Inverse :", np.linalg.inv(A))
print("Determinant :", np.linalg.det(A))
eigen_values, eigen_vectors = np.linalg.eig(A)
print("Eigen Values :", eigen_values)
print("Eigen Vectors :", eigen_vectors)
a = np.array([5,15,25,35,45])
result = np.clip(a,10,30)
print(result)
a = np.array([10,20,30,40])
conditions = [a < 40, a < 30]
choices = ['Low','Medium']
result = np.select(conditions, choices, default='High')
print(result)
a = np.array([-10,0,10])
print(np.sign(a))
a = np.array([10,20,30,40,50,60])
result = np.isin(a,[20,40,30])
print(result)
a = np.array([10,20,30,40])
result = np.where((a > 15) & (a < 35), "Yes", "No")
print(result)
from scipy import stats
from scipy import optimize
data = [10,20,30,40,50,10,20,30]
print("Mean :", stats.tmean(data))
print("Mode :", stats.mode(data))
print("Skewness :", stats.skew(data))
print("Kurtosis :", stats.kurtosis(data))
x = [1,2,3,4,5]
y = [2,4,5,4,5]
corr, p = stats.pearsonr(x,y)
print("Pearson Correlation :", corr)
result = stats.linregress(x,y)
print("Slope :", result.slope)
print("Intercept :", result.intercept)
print("R-value :", result.rvalue)
print("P-value :", result.pvalue)
f = lambda x: x**2 + 5*x + 6
minimum = optimize.minimize_scalar(f)
print(minimum)
a = np.array([10,20,30,40,50])
b = np.array([15,25,35,45,55])
t_stat, p_val = stats.ttest_ind(a,b)
print("T-stat :", t_stat)
print("P-value :", p_val)
obs = np.array([10,20,30])
exp = np.array([15,15,30])
chi, p = stats.chisquare(obs, exp)
print("Chi-square :", chi)
print("P-value :", p)
data = np.array([10,20,30,40,50])
print(stats.zscore(data))
data = np.array([10,20,30,40,50,60,70])
print(stats.percentileofscore(data,30))
print(stats.sem(data))
#ols model
import pandas as pd
import statsmodels.api as sm
df = pd.DataFrame({
    'x1':[1,2,3,4,5],
    'x2':[2,1,4,3,5],
    'y':[3,5,7,9,11]
})
X = df[['x1','x2']]
X = sm.add_constant(X)
y = df['y']
model = sm.OLS(y, X)
result = model.fit()
print(result.summary())
print(result.params)
pred = result.predict(X)
print(pred)
import statsmodels.formula.api as smf
model = smf.ols('y ~ x1 + x2', data=df)
results = model.fit()
print(results.summary())
