# -*- coding: utf-8 -*-
"""
Created on Thu Mar 24 18:12:29 2022

@author: Sayali
"""

"""ASSIGNAMENT -1"""

# Q1 - .

"""ANSWER"""

transition_matrix = [[0.75,0.15,0.1],[0.45,0.45,0.1],[0.3,0.1,0.6]]
distribution = [1,0,0]

for i in range(0,60):
    distribution = [distribution[0]*transition_matrix[0][0]+distribution[1]*transition_matrix[1][0]+
                    distribution[2]*transition_matrix[2][0],distribution[0]*transition_matrix[0][1]+
                    distribution[1]*transition_matrix[1][1]+distribution[2]*transition_matrix[2][1],
                    distribution[0]*transition_matrix[0][2]+distribution[1]*transition_matrix[1][2]+
                    distribution[2]*transition_matrix[2][2]]

distribution = [round(distribution[0],2),round(distribution[1],2),round(distribution[2],2)]
print (distribution)


#Q.2 :_

x_values = [3.44, 3.44, 4.07, 3.73, 3.78, 5.25, 5.424, 5.345, 2.20]
y_values = [19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7, 32.4]

def regressor(X,b0,b1):
    list = []
    for u in X:
        list.append((u*b1)+b0)
    return list


def SSE(yhat,y):
    sqr = []
    n = len(y)
    for t in range(0,n):
        sqr.append((yhat[t]-y[t])**2)
    sums = 0
    for r in sqr:
        sums = sums + r
    return sums

# Building function for predicted {fitted} values from first principles
def float_range(A, L=None, D=None):
    if L == None:
        L = A + 0.0
        A = 0.0
    if D == None:
        D = 1.0
    while True:
        if D > 0 and A>=L:
            break
        elif D<0 and A<=L:
            break
        yield ("%g" % A)
        A = A + D

pred = []
v1 = 0
v2 = 0
ms = 1000000
for i in float_range(37,39,0.01):
    for j in float_range(-5,2,0.01):
        a = regressor(x_values,float(i),float(j))
        b = SSE(a, y_values)
        if (b<ms):
            ms = b
            v1,v2 = float(i),float(j)
            
print(v1,v2)



#Q.3


data_1 = [2.76,1.8,2.5,10.64,12.01]
data_2 = [7.4,4.81,6.69,28.52,32.18]

sum_x = 0
sum_y = 0

# Using loops for each set of data given

for i in data_1:
    sum_x = sum_x + i
meanx = sum_x/5

for j in data_2:
    sum_y = sum_y + j
meany = sum_y/5  
sqdevx = 0

for k in data_1:
    sqdevx = sqdevx + ((k - meanx)**2)
sqdevy = 0

for l in data_2:
    sqdevy = sqdevy + ((l - meany)**2)

standard_deviation_X = ((sqdevx)/5)**0.5
standard_deviation_Y = ((sqdevy)/5)**0.5
semidevx = 0
semidevy = 0

for d in data_1:
    
    if (d<meanx):
        semidevx = semidevx + ((d-meanx)**2)

for e in data_2:
    
    if (e<meany):
        semidevy = semidevy + ((e-meany)**2)

semi_variance_x = semidevx/5
semi_variance_y = semidevy/5

d3 = []

for x in range(0,5):
    d3.append(data_2[x]/data_1[x])
ss = 0

for s in d3:
    
    ss = ss + s
scale = ss/5

print("std of X :-",standard_deviation_X)
print("std of y :-", standard_deviation_Y)
print("semivariance of x:- ", semi_variance_x)



# Q4 - 
import numpy as np
values = [2.29, 19.98, 0.06, 12.01, 7.04, 2.44]
L = 0
lamda = 0
#Looping for the exponential fn:
    
for y in float_range(0.34,0.36,0.0001):
    
    q = 1
    for i in values:
        q = q*((float(y))*(np.exp(-(float(y))*i)))
    if (q>L):
        L = q
        lamda = y