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
def count_99_95_68( iterable_readings: Iterable[Union[int, float, complex]], operation: Callable = <function average>) -> Tuple[float, float, float, float, float]:
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_

def guess_99_95_68( mean, sd, max_deviation, min_deviation) -> Tuple[float, float, float, float, float]:
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_

def standard_deviation( diff_mean, variance, max_deviation, min_deviation) -> Tuple[float, float, float, float]:
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_

def variance( diff_mean: float, readings: Sequence[Union[int, float, complex]]) -> Tuple[float, float, float, float]:
 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_

def statistics( iterable_readings: Iterable[Union[int, float, complex]]) -> Tuple[float, Sequence[Union[int, float, complex]]]:
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_

def average(data: Sequence[Union[int, float, complex]]) -> Union[int, float, complex]:
174def average(data: Sequence[Number]) -> Number:
175    data_len = len(data)
176    data_sum = sum(data)
177    try:
178        return data_sum / data_len
179    except ZeroDivisionError:
180        return 0
Number = typing.Union[int, float, complex]