cengal.statistics.normal_distribution.versions.v_0.normal_distribution
1#!/usr/bin/env python 2# coding=utf-8 3 4# Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space> 5# 6# Licensed under the Apache License, Version 2.0 (the "License"); 7# you may not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17 18 19__all__ = ['count_99_95_68', 'guess_99_95_68', 'standard_deviation', 'variance', 'statistics', 'average', 'Number'] 20 21 22from typing import Tuple, Sequence, Iterable, Union, Callable 23from collections import deque 24from math import sqrt 25from cengal.math.numbers import * 26 27 28""" 29Module Docstring 30Docstrings: http://www.python.org/dev/peps/pep-0257/ 31""" 32 33__author__ = "ButenkoMS <gtalk@butenkoms.space>" 34__copyright__ = "Copyright © 2012-2024 ButenkoMS. All rights reserved. Contacts: <gtalk@butenkoms.space>" 35__credits__ = ["ButenkoMS <gtalk@butenkoms.space>", ] 36__license__ = "Apache License, Version 2.0" 37__version__ = "4.4.1" 38__maintainer__ = "ButenkoMS <gtalk@butenkoms.space>" 39__email__ = "gtalk@butenkoms.space" 40# __status__ = "Prototype" 41__status__ = "Development" 42# __status__ = "Production" 43 44 45def statistics(iterable_readings: Iterable[Number]) -> Tuple[float, Sequence[Number]]: 46 """Example 47 48 ``` 49 diff_mean, readings = statistics(iterable_readings) 50 ``` 51 52 Args: 53 iterable_readings (Iterable[Number]): _description_ 54 55 Returns: 56 Tuple[float, Sequence[Number]]: _description_ 57 """ 58 readings = deque() 59 data_sum = 0 60 for reading in iterable_readings: 61 readings.append(reading) 62 data_sum += reading 63 64 try: 65 diff_mean = data_sum / len(readings) 66 except ZeroDivisionError: 67 diff_mean = 0 68 69 return diff_mean, readings 70 71 72def variance(diff_mean: float, readings: Sequence[Number]) -> Tuple[float, float, float, float]: 73 """Example: 74 75 ``` 76 diff_mean, readings = statistics(iterable_readings) 77 diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings) 78 ``` 79 80 Alternative example: 81 82 ``` 83 diff_mean, variance, max_deviation, min_deviation = variance(*statistics(iterable_readings)) 84 ``` 85 86 Args: 87 diff_mean (float): _description_ 88 readings (Sequence[Number]): _description_ 89 90 Returns: 91 Tuple[float, float, float, float]: _description_ 92 """ 93 max_deviation = None 94 min_deviation = None 95 deviation_square_sum = 0 96 for reading in readings: 97 deviation = reading - diff_mean 98 deviation_square_sum += deviation ** 2 99 if max_deviation is None: 100 max_deviation = deviation 101 max_deviation = max(max_deviation, deviation) 102 if min_deviation is None: 103 min_deviation = deviation 104 min_deviation = min(min_deviation, deviation) 105 106 try: 107 variance = deviation_square_sum / len(readings) 108 except ZeroDivisionError: 109 variance = 0 110 111 return diff_mean, variance, max_deviation, min_deviation 112 113 114def standard_deviation(diff_mean, variance, max_deviation, min_deviation) -> Tuple[float, float, float, float]: 115 """Example: 116 117 ``` 118 diff_mean, readings = statistics(iterable_readings) 119 diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings) 120 diff_mean, sd, max_deviation, min_deviation = standard_deviation(diff_mean, variance, max_deviation, min_deviation) 121 ``` 122 123 Alternative example: 124 125 ``` 126 diff_mean, sd, max_deviation, min_deviation = standard_deviation(*variance(*statistics(iterable_readings))) 127 ``` 128 129 Args: 130 diff_mean (_type_): _description_ 131 variance (_type_): _description_ 132 max_deviation (_type_): _description_ 133 min_deviation (_type_): _description_ 134 135 Returns: 136 Tuple[float, float, float, float]: _description_ 137 """ 138 return diff_mean, sqrt(variance), max_deviation, min_deviation 139 140 141def guess_99_95_68(mean, sd, max_deviation, min_deviation) -> Tuple[float, float, float, float, float]: 142 """Example: 143 144 ``` 145 diff_mean, readings = statistics(iterable_readings) 146 diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings) 147 diff_mean, sd, max_deviation, min_deviation = standard_deviation(diff_mean, variance, max_deviation, min_deviation) 148 val_99, val_95, val_68, max_deviation, min_deviation = guess_99_95_68(diff_mean, sd, max_deviation, min_deviation) 149 ``` 150 151 Alternative example: 152 153 ``` 154 val_99, val_95, val_68, max_deviation, min_deviation = guess_99_95_68(*standard_deviation(*variance(*statistics(iterable_readings))) 155 ``` 156 157 Args: 158 mean (_type_): _description_ 159 sd (_type_): _description_ 160 max_deviation (_type_): _description_ 161 min_deviation (_type_): _description_ 162 163 Returns: 164 Tuple[float, float, float, float, float]: _description_ 165 """ 166 # See: https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule 167 val_68 = mean + sd 168 val_95 = mean + 2 * sd 169 val_99 = mean + 3 * sd 170 return val_99, val_95, val_68, max_deviation, min_deviation 171 172 173def average(data: Sequence[Number]) -> Number: 174 data_len = len(data) 175 data_sum = sum(data) 176 try: 177 return data_sum / data_len 178 except ZeroDivisionError: 179 return 0 180 181 182def count_99_95_68(iterable_readings: Iterable[Number], operation: Callable=average) -> Tuple[float, float, float, float, float]: 183 """_summary_ 184 185 Args: 186 iterable_readings (Iterable[Number]): _description_ 187 operation (Callable, optional): _description_. Defaults to average. You can use other functions like min, max, median, etc. 188 189 Returns: 190 Tuple[float, float, float, float, float]: _description_ 191 """ 192 diff_mean, readings = statistics(iterable_readings) 193 _, _, max_deviation, min_deviation = variance(diff_mean, readings) 194 sorted_readings = sorted(readings) 195 readings_qnt = len(sorted_readings) 196 197 def get_slice(data: Sequence, divider: int) -> Sequence: 198 data_slice = data[:divider] 199 if len(data_slice) == len(data): 200 data_slice = data[:len(data)-1] 201 return data_slice 202 203 div_68 = round(readings_qnt * 0.68) 204 val_68 = operation(get_slice(sorted_readings, div_68)) 205 206 div_95 = round(readings_qnt * 0.95) 207 val_95 = operation(get_slice(sorted_readings, div_95)) 208 209 div_99 = round(readings_qnt * 0.99) 210 val_99 = operation(get_slice(sorted_readings, div_99)) 211 212 return val_99, val_95, val_68, max_deviation, min_deviation
183def count_99_95_68(iterable_readings: Iterable[Number], operation: Callable=average) -> Tuple[float, float, float, float, float]: 184 """_summary_ 185 186 Args: 187 iterable_readings (Iterable[Number]): _description_ 188 operation (Callable, optional): _description_. Defaults to average. You can use other functions like min, max, median, etc. 189 190 Returns: 191 Tuple[float, float, float, float, float]: _description_ 192 """ 193 diff_mean, readings = statistics(iterable_readings) 194 _, _, max_deviation, min_deviation = variance(diff_mean, readings) 195 sorted_readings = sorted(readings) 196 readings_qnt = len(sorted_readings) 197 198 def get_slice(data: Sequence, divider: int) -> Sequence: 199 data_slice = data[:divider] 200 if len(data_slice) == len(data): 201 data_slice = data[:len(data)-1] 202 return data_slice 203 204 div_68 = round(readings_qnt * 0.68) 205 val_68 = operation(get_slice(sorted_readings, div_68)) 206 207 div_95 = round(readings_qnt * 0.95) 208 val_95 = operation(get_slice(sorted_readings, div_95)) 209 210 div_99 = round(readings_qnt * 0.99) 211 val_99 = operation(get_slice(sorted_readings, div_99)) 212 213 return val_99, val_95, val_68, max_deviation, min_deviation
_summary_
Args: iterable_readings (Iterable[Number]): _description_ operation (Callable, optional): _description_. Defaults to average. You can use other functions like min, max, median, etc.
Returns: Tuple[float, float, float, float, float]: _description_
142def guess_99_95_68(mean, sd, max_deviation, min_deviation) -> Tuple[float, float, float, float, float]: 143 """Example: 144 145 ``` 146 diff_mean, readings = statistics(iterable_readings) 147 diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings) 148 diff_mean, sd, max_deviation, min_deviation = standard_deviation(diff_mean, variance, max_deviation, min_deviation) 149 val_99, val_95, val_68, max_deviation, min_deviation = guess_99_95_68(diff_mean, sd, max_deviation, min_deviation) 150 ``` 151 152 Alternative example: 153 154 ``` 155 val_99, val_95, val_68, max_deviation, min_deviation = guess_99_95_68(*standard_deviation(*variance(*statistics(iterable_readings))) 156 ``` 157 158 Args: 159 mean (_type_): _description_ 160 sd (_type_): _description_ 161 max_deviation (_type_): _description_ 162 min_deviation (_type_): _description_ 163 164 Returns: 165 Tuple[float, float, float, float, float]: _description_ 166 """ 167 # See: https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule 168 val_68 = mean + sd 169 val_95 = mean + 2 * sd 170 val_99 = mean + 3 * sd 171 return val_99, val_95, val_68, max_deviation, min_deviation
Example:
diff_mean, readings = statistics(iterable_readings)
diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings)
diff_mean, sd, max_deviation, min_deviation = standard_deviation(diff_mean, variance, max_deviation, min_deviation)
val_99, val_95, val_68, max_deviation, min_deviation = guess_99_95_68(diff_mean, sd, max_deviation, min_deviation)
Alternative example:
val_99, val_95, val_68, max_deviation, min_deviation = guess_99_95_68(*standard_deviation(*variance(*statistics(iterable_readings)))
Args: mean (_type_): _description_ sd (_type_): _description_ max_deviation (_type_): _description_ min_deviation (_type_): _description_
Returns: Tuple[float, float, float, float, float]: _description_
115def standard_deviation(diff_mean, variance, max_deviation, min_deviation) -> Tuple[float, float, float, float]: 116 """Example: 117 118 ``` 119 diff_mean, readings = statistics(iterable_readings) 120 diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings) 121 diff_mean, sd, max_deviation, min_deviation = standard_deviation(diff_mean, variance, max_deviation, min_deviation) 122 ``` 123 124 Alternative example: 125 126 ``` 127 diff_mean, sd, max_deviation, min_deviation = standard_deviation(*variance(*statistics(iterable_readings))) 128 ``` 129 130 Args: 131 diff_mean (_type_): _description_ 132 variance (_type_): _description_ 133 max_deviation (_type_): _description_ 134 min_deviation (_type_): _description_ 135 136 Returns: 137 Tuple[float, float, float, float]: _description_ 138 """ 139 return diff_mean, sqrt(variance), max_deviation, min_deviation
Example:
diff_mean, readings = statistics(iterable_readings)
diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings)
diff_mean, sd, max_deviation, min_deviation = standard_deviation(diff_mean, variance, max_deviation, min_deviation)
Alternative example:
diff_mean, sd, max_deviation, min_deviation = standard_deviation(*variance(*statistics(iterable_readings)))
Args: diff_mean (_type_): _description_ variance (_type_): _description_ max_deviation (_type_): _description_ min_deviation (_type_): _description_
Returns: Tuple[float, float, float, float]: _description_
73def variance(diff_mean: float, readings: Sequence[Number]) -> Tuple[float, float, float, float]: 74 """Example: 75 76 ``` 77 diff_mean, readings = statistics(iterable_readings) 78 diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings) 79 ``` 80 81 Alternative example: 82 83 ``` 84 diff_mean, variance, max_deviation, min_deviation = variance(*statistics(iterable_readings)) 85 ``` 86 87 Args: 88 diff_mean (float): _description_ 89 readings (Sequence[Number]): _description_ 90 91 Returns: 92 Tuple[float, float, float, float]: _description_ 93 """ 94 max_deviation = None 95 min_deviation = None 96 deviation_square_sum = 0 97 for reading in readings: 98 deviation = reading - diff_mean 99 deviation_square_sum += deviation ** 2 100 if max_deviation is None: 101 max_deviation = deviation 102 max_deviation = max(max_deviation, deviation) 103 if min_deviation is None: 104 min_deviation = deviation 105 min_deviation = min(min_deviation, deviation) 106 107 try: 108 variance = deviation_square_sum / len(readings) 109 except ZeroDivisionError: 110 variance = 0 111 112 return diff_mean, variance, max_deviation, min_deviation
Example:
diff_mean, readings = statistics(iterable_readings)
diff_mean, variance, max_deviation, min_deviation = variance(diff_mean, readings)
Alternative example:
diff_mean, variance, max_deviation, min_deviation = variance(*statistics(iterable_readings))
Args: diff_mean (float): _description_ readings (Sequence[Number]): _description_
Returns: Tuple[float, float, float, float]: _description_
46def statistics(iterable_readings: Iterable[Number]) -> Tuple[float, Sequence[Number]]: 47 """Example 48 49 ``` 50 diff_mean, readings = statistics(iterable_readings) 51 ``` 52 53 Args: 54 iterable_readings (Iterable[Number]): _description_ 55 56 Returns: 57 Tuple[float, Sequence[Number]]: _description_ 58 """ 59 readings = deque() 60 data_sum = 0 61 for reading in iterable_readings: 62 readings.append(reading) 63 data_sum += reading 64 65 try: 66 diff_mean = data_sum / len(readings) 67 except ZeroDivisionError: 68 diff_mean = 0 69 70 return diff_mean, readings
Example
diff_mean, readings = statistics(iterable_readings)
Args: iterable_readings (Iterable[Number]): _description_
Returns: Tuple[float, Sequence[Number]]: _description_