cek / src /pycek_public /statistics_lab.py
praiteri's picture
lab template added
aa4aab0
import pycek_public as cek
import numpy as np
class stats_lab(cek.cek_labs):
def setup_lab(self):
"""
Define base information for the lab
"""
self.add_metadata(
laboratory = 'Basic Statistics Lab',
columns = ["X","Y"]
)
self.number_of_values = 10
self.available_samples = [
'Averages',
'Propagation of uncertainty',
'Comparison of averages',
'Linear fit',
'Non linear fit',
'Detection of outliers',
]
self.sample_parameters['Averages'] = {
"gen_values" : [
(1.0, 0.1),
(12., 2.0)
],
'expected_value' : (1.0,10.0),
"precision" : 3,
}
self.sample_parameters['Propagation of uncertainty'] = {
"gen_values" : [
(15.0, 1.0),
(133., 2.0)
],
"precision" : 3,
}
self.sample_parameters['Comparison of averages'] = {
"gen_values" : [
(15.0, 1.0),
(13.2, 2.0)
],
"precision" : 3,
}
self.sample_parameters['Linear fit'] = {
"function" : lambda x,m,q: m*x + q,
"gen_values" : {'m':12.3 , 'q':1.0},
"xrange" : [0.0 , 10.0],
"expected_value" : (11.3,0.9),
"precision" : 3,
}
self.sample_parameters['Non linear fit'] = {
"nval" : 10,
"function" : lambda x,E0,K0,Kp,V0: E0 + K0 * x / Kp * ( (V0/x)**Kp / (Kp-1)+1) - K0*V0/(Kp-1),
"gen_values" : {"E0":-634.2, "K0":12.43, "Kp":4.28, "V0":99.11},
"xrange" : [50 , 140],
"precision" : 3,
}
self.sample_parameters['Detection of outliers'] = {
"function" : lambda x,m,q: m*x + q,
"gen_values" : {'m':2.3 , 'q':0.1},
"xrange" : [10.0 , 20.0],
"shift" : 2,
"precision" : 3,
}
def create_data(self):
"""
Generate the data
"""
if self.sample is None:
raise Exception("Sample not defined")
prm = self.sample_parameters[ self.sample ]
self.set_parameters(
number_of_values = self.number_of_values,
)
if "precision" in prm:
self.set_parameters( precision = prm["precision"] )
if "noise" in prm:
self.set_parameters( noise_level = prm["noise"] )
self.add_metadata(
number_of_values = self.number_of_values,
sample = self.sample,
)
if "expected_value" in prm:
self.add_metadata( **{"expected_value": prm["expected_value"]} )
if self.sample in ["Averages", 'Propagation of uncertainty', 'Comparison of averages']:
data = self._generate_normal_random(self.number_of_values, prm['gen_values'])
elif self.sample in ["Linear fit"]:
self.noise_level = 5
data = self.generate_data_from_function(
prm["function"],
prm['gen_values'],
self.number_of_values,
prm['xrange'],
noise_level = self.noise_level,
)
elif self.sample in ["Non linear fit"]:
self.noise_level = 5
data = self.generate_data_from_function(
prm["function"],
prm['gen_values'],
self.number_of_values,
prm['xrange'],
noise_level = self.noise_level,
)
elif self.sample in ["Detection of outliers"]:
data = self.generate_data_from_function(
prm["function"],
prm['gen_values'],
self.number_of_values,
prm['xrange'],
noise_level = self.noise_level,
)
i = np.random.randint(self.number_of_values)
data[i,1] += prm['shift']
self.data = data
return data