79 lines
1.9 KiB
Python
79 lines
1.9 KiB
Python
|
|
def calc_variance_pct(actual, plan):
|
|
"""
|
|
Calculates the percentage variance between actual and plan values
|
|
for reporting purposes.
|
|
|
|
The percentage variance is only returned if it is economically
|
|
meaningful and interpretable:
|
|
- The plan value must not be zero
|
|
- Actual and plan must have the same sign (no sign change)
|
|
|
|
In cases where a percentage variance would be misleading
|
|
(e.g. sign change from loss to profit), the function returns None
|
|
and absolute variance should be used instead.
|
|
|
|
Parameters
|
|
----------
|
|
actual : float | int
|
|
Actual (realized) value.
|
|
plan : float | int
|
|
Planned or budgeted value.
|
|
|
|
Returns
|
|
-------
|
|
float | None
|
|
Percentage variance relative to the absolute plan value,
|
|
or None if the percentage variance is not meaningful.
|
|
"""
|
|
|
|
variance = actual - plan
|
|
if plan == 0:
|
|
return None
|
|
if actual * plan < 0:
|
|
return None
|
|
return variance / abs(plan)
|
|
|
|
|
|
|
|
|
|
def display_value(value, unit):
|
|
"""
|
|
Formats a numeric KPI value for reporting output based on the configured
|
|
display unit (e.g. €, T€, Mio. €).
|
|
|
|
- Scales the input value according to DISPLAY_UNIT
|
|
- Applies European number formatting (thousands separator, decimal comma)
|
|
- Returns 'n/a' if the input value is None
|
|
|
|
Parameters
|
|
----------
|
|
value : float | int | None
|
|
Raw KPI value in base currency (e.g. EUR).
|
|
|
|
Returns
|
|
-------
|
|
str
|
|
Formatted value including display unit, ready for dashboard display.
|
|
"""
|
|
|
|
if value is None:
|
|
return "n/a"
|
|
|
|
unit_factors = {
|
|
"Mio. €": 1_000_000,
|
|
"T€": 1_000,
|
|
"€": 1,
|
|
}
|
|
|
|
factor = unit_factors.get(unit, 1)
|
|
scaled = value / factor
|
|
formatted = f"{scaled:,.2f}"
|
|
formatted = (
|
|
formatted
|
|
.replace(",", "X")
|
|
.replace(".", ",")
|
|
.replace("X", ".")
|
|
)
|
|
|
|
return f"{formatted} {unit}" |