Source code for maldiamrkit.io.mic

"""Minimum Inhibitory Concentration (MIC) parsing utilities."""

from __future__ import annotations

import re

import numpy as np
import pandas as pd

_MIC_PATTERN = re.compile(r"^\s*([<>]=?|=)?\s*([\d]+[,.]?\d*)\s*$")


[docs] def parse_mic_column(series: pd.Series) -> pd.DataFrame: """ Parse a column of MIC strings into numeric values and qualifiers. Handles European comma decimals (e.g. ``"0,5"`` becomes ``0.5``), qualifier prefixes (``"<=8"``, ``">16"``), and missing values. Parameters ---------- series : pd.Series Column of MIC strings. Returns ------- pd.DataFrame DataFrame with columns ``'value'`` (float) and ``'qualifier'`` (str: ``"<="``, ``">="``, ``">"``, ``"<"``, ``"="``, or ``""`` for missing). Examples -------- >>> import pandas as pd >>> from maldiamrkit.io import parse_mic_column >>> s = pd.Series(["<=8", ">16", "0,5", None]) >>> parse_mic_column(s) value qualifier 0 8.0 <= 1 16.0 > 2 0.5 = 3 NaN """ values = np.full(len(series), np.nan) qualifiers = np.full(len(series), "", dtype=object) for i, raw in enumerate(series): if pd.isna(raw): continue text = str(raw).strip() if not text: continue match = _MIC_PATTERN.match(text) if match is None: continue qualifier = match.group(1) or "=" num_str = match.group(2).replace(",", ".") values[i] = float(num_str) qualifiers[i] = qualifier return pd.DataFrame({"value": values, "qualifier": qualifiers}, index=series.index)