|
"""Mathematical utility functions.""" |
|
|
|
from typing import List, Union |
|
|
|
Number = Union[int, float] |
|
|
|
|
|
def calculate_mean(numbers: List[Number]) -> float: |
|
"""Calculate the arithmetic mean of a list of numbers. |
|
|
|
Args: |
|
numbers: A list of integers or floating point numbers |
|
|
|
Returns: |
|
float: The arithmetic mean of the input numbers |
|
|
|
Raises: |
|
ValueError: If the input list is empty |
|
TypeError: If any element is not a number |
|
""" |
|
if not numbers: |
|
raise ValueError("Cannot calculate mean of empty list") |
|
|
|
if not all(isinstance(x, (int, float)) for x in numbers): |
|
raise TypeError("All elements must be numbers") |
|
|
|
return sum(numbers) / len(numbers) |
|
|
|
|
|
def calculate_median(numbers: List[Number]) -> float: |
|
"""Calculate the median value from a list of numbers. |
|
|
|
Args: |
|
numbers: A list of integers or floating point numbers |
|
|
|
Returns: |
|
float: The median value of the input numbers |
|
|
|
Raises: |
|
ValueError: If the input list is empty |
|
TypeError: If any element is not a number |
|
""" |
|
if not numbers: |
|
raise ValueError("Cannot calculate median of empty list") |
|
|
|
if not all(isinstance(x, (int, float)) for x in numbers): |
|
raise TypeError("All elements must be numbers") |
|
|
|
sorted_numbers = sorted(numbers) |
|
length = len(sorted_numbers) |
|
|
|
if length % 2 == 0: |
|
mid = length // 2 |
|
return (sorted_numbers[mid - 1] + sorted_numbers[mid]) / 2 |
|
else: |
|
return sorted_numbers[length // 2] |
|
|