ak9im/p1/p1/funcs.py
2022-11-03 21:18:55 +01:00

170 lines
3.8 KiB
Python

import pandas as pd
import numpy as np
import matplotlib.pyplot as pyplt
def plt_ticks_size() -> int:
return 10
def load_d(path: str) -> pd.DataFrame():
return pd.read_csv(path, float_precision='round_trip', dtype='float64')
def plot_d(dat: pd.Series, fname: str = 'plot_input_data', colour: str = ''):
if colour == '':
colour = 'blue'
pyplt.plot(dat, color=colour)
pyplt.xlim(0, len(dat))
pyplt.ylim(min(dat) - 0.3, max(dat) + 0.3)
pyplt.xticks(size=plt_ticks_size())
pyplt.yticks(size=plt_ticks_size())
pyplt.savefig(fname + '.jpg')
# pplt.show(block=0)
# rework this
# ref: https://stackoverflow.com/a/46418284
pyplt.close()
def mean(dat: pd.Series) -> float:
return dat.sum() / len(dat)
def variance(dat: pd.Series) -> float:
return sum(pow(dat - mean(dat), 2)) / len(dat)
def histogram(dat: pd.Series, bins: int = 10, fname: str = 'hist', colour: str = 'blue'):
pyplt.hist(dat, color=colour, bins=bins)
pyplt.xticks(size=plt_ticks_size())
pyplt.yticks(size=plt_ticks_size())
pyplt.savefig(fname + '.jpg')
pyplt.close()
def distr_func(dat: pd.Series, fname: str = 'dist', colour: str = 'blue'):
dat.plot.density(color=colour)
pyplt.savefig(fname + '.jpg')
pyplt.close()
def std_dev(dat: pd.Series) -> float:
return np.sqrt(variance(dat))
def mean_diff(dat: pd.DataFrame) -> pd.Series:
return dat - dat.mean()
def covar(dat: pd.DataFrame) -> float:
dat = dat.apply(mean_diff)
return dat['u'].dot(dat['y']) / len(dat)
def covar_coeff(cov: float, std_dev_u: float, std_dev_y: float) -> float:
return cov / (std_dev_u * std_dev_y)
# m is the max permissible shift value.
def auto_corellation(dat: list, max_shift_n: int = .1) -> float:
v = []
m = len(dat) * max_shift_n
cur_shift = 0
while m >= cur_shift:
r = 0
for i in range(len(dat) - cur_shift):
r += dat[i] * dat[i + cur_shift]
r = r / len(dat) - cur_shift
v.append(r)
cur_shift += 1
return v
def mutual_corellation(dx: list, dy: list, max_shift_n: int = .1) -> float:
v = []
m = len(dx) * max_shift_n
cur_shift = 0
while m >= cur_shift:
r = 0
for i in range(len(dx) - cur_shift):
r += dx[i] * dy[i + cur_shift]
r = r / (len(dx) - cur_shift)
v.append(r)
cur_shift += 1
return v
def auto_covar(dat: list, max_shift_n: int = .1) -> float:
v = []
mean = np.mean(dat)
m = len(dat) * max_shift_n
cur_shift = 0
while m >= cur_shift:
r = 0
for i in range(len(dat) - cur_shift):
r += (dat[i] - mean) * (dat[i + cur_shift] - mean)
r = r / (len(dat) - cur_shift)
v.append(r)
cur_shift += 1
return v
def mutual_covar(dx: list, dy: list, max_shift_n: int = .1) -> float:
v = []
mean_x, mean_y = np.mean(dx), np.mean(dy)
m = len(dx) * max_shift_n
cur_shift = 0
while m >= cur_shift:
r = 0
for i in range(len(dx) - cur_shift):
r += (dx[i] - mean_x) * (dy[i + cur_shift] - mean_y)
r = r / (len(dx) - cur_shift)
v.append(r)
cur_shift += 1
return v
def plot_autocorellation(dat: pd.DataFrame, fname: str = 'autocorellation', colour: str = 'blue'):
d = auto_corellation(dat.tolist())
pyplt.scatter(range(0, len(d)), d, color=colour)
pyplt.savefig(fname + '.jpg')
pyplt.close()
def plot_mutual_corellation(d1: pd.DataFrame, d2: pd.DataFrame, fname: str = 'mutcorellation', colour: str = 'blue'):
d = mutual_corellation(d1.tolist(), d2.tolist())
pyplt.scatter(range(0, len(d)), d, color=colour)
pyplt.savefig(fname + '.jpg')
pyplt.close()
def plot_autocovariance(dat: pd.DataFrame, fname: str = 'autocovariance', colour: str = 'blue'):
d = auto_covar(dat.tolist())
pyplt.scatter(range(0, len(d)), d, color=colour)
pyplt.savefig(fname + '.jpg')
pyplt.close()
def plot_mutual_covariance(d1: pd.DataFrame, d2: pd.DataFrame, fname: str = 'mutcovariance', colour: str = 'blue'):
d = mutual_covar(d1.tolist(), d2.tolist())
pyplt.scatter(range(0, len(d)), d, color=colour)
pyplt.savefig(fname + '.jpg')
pyplt.close()