
"""
Created on Sat Feb 5 11:32:49 2022

@author: Admin
"""

# Q.1

import numpy as np
# Transition probability matrix
tpm = np.array([0.75,0.15,0.10,0.45,0.45,0.10,0.30,0.10,0.60]).reshape(3,3)
tpm

product_matrix = np.array([0,1,0,1,0,0,0,0,1]).reshape(3,3)
dummy_matrix = tpm
i = 0

# While loop for calculating the stationary distribution 
while ((product_matrix[i,0] != product_matrix[i+1,0]) & (product_matrix[i+1,0] != product_matrix[i+2,0])):
        product_matrix = np.dot(dummy_matrix,tpm)
        dummy_matrix = product_matrix
product_matrix

# Printing the output rounded off to 2 decimal places
print("The stationary distribution for the given TPM is:\n","(",
      round(product_matrix[0,0],2),",",round(product_matrix[0,1],2),",",
      round(product_matrix[0,2],2),")")
 
# Q.2
x_actual = [3.44,3.44,4.07,3.73,3.78,5.25,5.424,5.345,2.20]
y_actual = [19.2,17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4]
y_predicted = []
sse_list = np.array([])
b0_list = np.array([])
b1_list = np.array([])
sum1 = 0
store = 0
# Nested For Loop
for b0 in np.arange(37,39.01,0.01):
    for b1 in np.arange(-5,2.01,0.01):
        for x_counter in x_actual:
            y_predicted.append(b0 + b1*x_counter) 
        for i in range(0,9,1):
            store = (y_actual[i] - y_predicted[i])**2
            sum1 = sum1 + store
        sse_list = np.append(sse_list,sum1)
        b0_list = np.append(b0_list,b0)
        b1_list = np.append(b1_list,b1)
        y_predicted = []
        sum1 = 0
        store = 0

# Finding the position of the minimum value of sse
minimum_position = sse_list.argmin()      
b0_final = round(b0_list[minimum_position],2)          
b1_final = round(b1_list[minimum_position],2)            
print("The value of B0 is:",b0_final,"and the value of B1 is:",b1_final,"as per minimising the SSE")

# Q.3
x_q3 = [2.76,1.80,2.50,10.64,12.01]
y_q3 = [7.40,4.81,6.69,28.52,32.18]

x_avg = (2.76+1.80+2.50+10.64+12.01)/5
y_avg = (7.40+4.81+6.69+28.52+32.18)/5

x_q3_sum = 0
for x_q3_counter in x_q3:
    x_q3_diffsq = (x_q3_counter - x_avg)**2
    x_q3_sum = x_q3_sum + x_q3_diffsq
x_q3_var = x_q3_sum/4
x_q3_var
x_q3_sd = x_q3_var**(1/2)
print("The sample standard deviation of the original x values is:",x_q3_sd)

y_q3_sum = 0
for y_q3_counter in y_q3:
    y_q3_diffsq = (y_q3_counter - y_avg)**2
    y_q3_sum = y_q3_sum + y_q3_diffsq
y_q3_var = y_q3_sum/4
y_q3_var
y_q3_sd = y_q3_var**(1/2)
print("The sample standard deviation of the original y values is:",y_q3_sd)

x_q3_new = []
for x_q3_traverse in x_q3:
    x_q3_new.append(x_q3_traverse*2)
x_q3_new
y_q3_new = []
for y_q3_traverse in y_q3:
    y_q3_new.append(y_q3_traverse*2)
y_q3_new

x_avg2 = (5.52+3.6+5.0+21.28+24.02)/5
y_avg2 = (14.8+9.62+13.38+57.04+64.36)/5

x_q3_sum2 = 0
for x_q3_counter2 in x_q3_new:
    x_q3_diffsq2 = (x_q3_counter2 - x_avg2)**2
    x_q3_sum2 = x_q3_sum2 + x_q3_diffsq2
x_q3_var2 = x_q3_sum2/4
x_q3_var2
x_q3_sd2 = x_q3_var2**(1/2)
print("The sample standard deviation of the new x values is:",x_q3_sd2)

y_q3_sum2 = 0
for y_q3_counter2 in y_q3_new:
    y_q3_diffsq2 = (y_q3_counter2 - y_avg2)**2
    y_q3_sum2 = y_q3_sum2 + y_q3_diffsq2
y_q3_var2 = y_q3_sum2/4
y_q3_var2
y_q3_sd2 = y_q3_var2**(1/2)
print("The sample standard deviation of the new y values is:",y_q3_sd2)

x_below_avg_data = []
for x_avg_check in x_q3:
    if (x_avg_check < x_avg) :
        x_below_avg_data.append(x_avg_check)
x_below_avg_data
x_q3_semi = 0
x_q3_semidiffsq = 0
for x_q3_semicounter in x_below_avg_data:
    x_q3_semidiffsq = (x_avg - x_q3_semicounter)**2
    x_q3_semi = x_q3_semi + x_q3_semidiffsq
x_q3_semivar = x_q3_semi/3
x_q3_semivar
print("The sample semi-variance of the x - values is:",x_q3_semivar)

y_below_avg_data = []
for y_avg_check in y_q3:
    if (y_avg_check < y_avg) :
        y_below_avg_data.append(y_avg_check)
y_below_avg_data
y_q3_semi = 0
y_q3_semidiffsq = 0
for y_q3_semicounter in y_below_avg_data:
    y_q3_semidiffsq = (y_avg - y_q3_semicounter)**2
    y_q3_semi = y_q3_semi + y_q3_semidiffsq
y_q3_semivar = y_q3_semi/3
y_q3_semivar
print("The sample semi-variance of the y - values is:",y_q3_semivar)

# Q.4
# Initialising the given x values
q4 = np.array([2.29, 19.98, 0.06, 12.01, 7.04, 2.44])
for z in np.arange(0.34, 0.36, 0.0001):
    