PLANCK
Overview
The PLANCK function computes values related to the Planck discrete exponential distribution, which describes the probability of a non-negative integer outcome with exponential decay. This function can return the probability mass function (PMF), cumulative distribution function (CDF), survival function (SF), inverse CDF (quantile/ICDF), inverse SF (ISF), mean, variance, standard deviation, or median for a given value.
For more details, see the scipy.stats.planck documentation .
This example function is provided as-is without any representation of accuracy.
Usage
To use the function in Excel:
=PLANCK(k, lambda, [mode], [loc])k(float or 2D list, required): Value(s) at which to evaluate the distribution. For PMF, CDF, SF, ICDF, and ISF, this is the event count. For statistics modes, this is ignored and can be set to 0.lambda(float, required): Shape parameter (>0).mode(str, optional, default=“pmf”): Output type. One of"pmf","cdf","sf","icdf","isf","mean","var","std", or"median".loc(float, optional, default=0): Location parameter (shifts the distribution).
The function returns a scalar or 2D list of floats (for array input), or an error message (string) if the input is invalid. The output depends on the selected mode:
pmf: Probability mass function at k.cdf: Cumulative distribution function at k.sf: Survival function (1 - CDF) at k.icdf: Inverse CDF (quantile) for probability k.isf: Inverse survival function for probability k.mean: Mean of the distribution.var: Variance of the distribution.std: Standard deviation of the distribution.median: Median of the distribution.
Examples
Example 1: PMF at k=2, lambda=0.5
Inputs:
| k | lambda | mode | loc |
|---|---|---|---|
| 2 | 0.5 | pmf | 0 |
Excel formula:
=PLANCK(2, 0.5, "pmf", 0)Expected output:
| Result |
|---|
| 0.1455 |
Example 2: CDF at k=2, lambda=0.5
Inputs:
| k | lambda | mode | loc |
|---|---|---|---|
| 2 | 0.5 | cdf | 0 |
Excel formula:
=PLANCK(2, 0.5, "cdf", 0)Expected output:
| Result |
|---|
| 0.7769 |
Example 3: Survival Function at k=2, lambda=0.5
Inputs:
| k | lambda | mode | loc |
|---|---|---|---|
| 2 | 0.5 | sf | 0 |
Excel formula:
=PLANCK(2, 0.5, "sf", 0)Expected output:
| Result |
|---|
| 0.2231 |
Example 4: Inverse CDF (ICDF) for probability k=0.5, lambda=0.5
Inputs:
| k | lambda | mode | loc |
|---|---|---|---|
| 0.5 | 0.5 | icdf | 0 |
Excel formula:
=PLANCK(0.5, 0.5, "icdf", 0)Expected output:
| Result |
|---|
| 1 |
Example 5: Mean, Variance, Std, Median
Inputs:
| k | lambda | mode | loc |
|---|---|---|---|
| 0 | 0.5 | mean | 0 |
| 0 | 0.5 | var | 0 |
| 0 | 0.5 | std | 0 |
| 0 | 0.5 | median | 0 |
Excel formulas:
=PLANCK(0, 0.5, "mean", 0)
=PLANCK(0, 0.5, "var", 0)
=PLANCK(0, 0.5, "std", 0)
=PLANCK(0, 0.5, "median", 0)Expected outputs:
| Result |
|---|
| 1.5415 |
| 3.9177 |
| 1.9793 |
| 1 |
Python Code
from scipy.stats import planck as scipy_planck
def planck(k, lambda_, mode="pmf", loc=0):
"""
Compute Planck distribution values: PMF, CDF, SF, ICDF, ISF, mean, variance, std, or median.
Args:
k: Value(s) at which to evaluate (float or 2D list).
lambda_: Shape parameter (float, >0).
mode: Output type: 'pmf', 'cdf', 'sf', 'icdf', 'isf', 'mean', 'var', 'std', or 'median'.
loc: Location parameter (float, default 0).
Returns:
Scalar or 2D list of floats, or error message (str) if invalid.
"""
# Validate lambda_
try:
lam_val = float(lambda_)
if lam_val <= 0:
return "Invalid input: lambda must be > 0."
except Exception:
return "Invalid input: lambda must be a number."
# Validate loc
try:
loc_val = float(loc)
except Exception:
return "Invalid input: loc must be a number."
# Validate mode
valid_modes = ["pmf", "cdf", "sf", "icdf", "isf", "mean", "var", "std", "median"]
if not isinstance(mode, str) or mode not in valid_modes:
return f"Invalid input: mode must be one of {valid_modes}."
# Helper to process k (scalar or 2D list)
def process_k(val):
try:
return float(val)
except Exception:
return None
# Handle statistics
if mode == "mean":
return scipy_planck.mean(lam_val, loc=loc_val)
if mode == "var":
return scipy_planck.var(lam_val, loc=loc_val)
if mode == "std":
return scipy_planck.std(lam_val, loc=loc_val)
if mode == "median":
return scipy_planck.median(lam_val, loc=loc_val)
# PMF, CDF, SF, ICDF, ISF
def compute(val):
kval = process_k(val)
if kval is None:
return "Invalid input: k must be a number."
if mode == "pmf":
return float(scipy_planck.pmf(kval, lam_val, loc=loc_val))
elif mode == "cdf":
return float(scipy_planck.cdf(kval, lam_val, loc=loc_val))
elif mode == "sf":
return float(scipy_planck.sf(kval, lam_val, loc=loc_val))
elif mode == "icdf":
return float(scipy_planck.ppf(kval, lam_val, loc=loc_val))
elif mode == "isf":
return float(scipy_planck.isf(kval, lam_val, loc=loc_val))
# 2D list or scalar
if isinstance(k, list):
# 2D list
if not all(isinstance(row, list) for row in k):
return "Invalid input: k must be a scalar or 2D list."
result = []
for row in k:
result_row = []
for val in row:
out = compute(val)
if isinstance(out, str):
return out
result_row.append(out)
result.append(result_row)
return result
else:
return compute(k)