Skip to content

news

news

News and injury signal processing.

NewsParser

Parse and interpret FPL news text into structured signals.

parse_availability

parse_availability(news_text: str) -> float

Parse availability from news text.

PARAMETER DESCRIPTION
news_text

News text

TYPE: str

RETURNS DESCRIPTION
float

Availability score (0-1)

Source code in fplx/signals/news.py
def parse_availability(self, news_text: str) -> float:
    """
    Parse availability from news text.

    Parameters
    ----------
    news_text : str
        News text

    Returns
    -------
    float
        Availability score (0-1)
    """
    if not news_text or news_text.strip() == "":
        return 1.0

    text_lower = news_text.lower()

    # Check unavailable patterns
    for pattern in self.UNAVAILABLE_PATTERNS:
        if re.search(pattern, text_lower):
            return 0.0

    # Check doubtful patterns
    for pattern in self.DOUBTFUL_PATTERNS:
        if re.search(pattern, text_lower):
            return 0.5

    # Check positive patterns
    for pattern in self.POSITIVE_PATTERNS:
        if re.search(pattern, text_lower):
            return 0.9

    # Default: assume available if no negative signals
    return 1.0

parse_minutes_risk

parse_minutes_risk(news_text: str) -> float

Parse minutes risk from news text.

PARAMETER DESCRIPTION
news_text

News text

TYPE: str

RETURNS DESCRIPTION
float

Minutes risk score (0-1, higher = more risk)

Source code in fplx/signals/news.py
def parse_minutes_risk(self, news_text: str) -> float:
    """
    Parse minutes risk from news text.

    Parameters
    ----------
    news_text : str
        News text

    Returns
    -------
    float
        Minutes risk score (0-1, higher = more risk)
    """
    if not news_text or news_text.strip() == "":
        return 0.0

    text_lower = news_text.lower()

    # Check rotation patterns
    for pattern in self.ROTATION_PATTERNS:
        if re.search(pattern, text_lower):
            return 0.7

    # Check if doubtful (moderate risk)
    for pattern in self.DOUBTFUL_PATTERNS:
        if re.search(pattern, text_lower):
            return 0.3

    return 0.0

parse_confidence

parse_confidence(news_text: str) -> float

Estimate confidence in the parsed signal.

PARAMETER DESCRIPTION
news_text

News text

TYPE: str

RETURNS DESCRIPTION
float

Confidence score (0-1)

Source code in fplx/signals/news.py
def parse_confidence(self, news_text: str) -> float:
    """
    Estimate confidence in the parsed signal.

    Parameters
    ----------
    news_text : str
        News text

    Returns
    -------
    float
        Confidence score (0-1)
    """
    if not news_text or news_text.strip() == "":
        return 1.0  # High confidence when no news

    # Confidence based on clarity of news
    text_lower = news_text.lower()

    # High confidence patterns
    if any(
        re.search(p, text_lower) for p in ["ruled out", "confirmed", "definitely"]
    ):
        return 0.9

    # Medium confidence patterns
    if any(re.search(p, text_lower) for p in ["likely", "expected", "should"]):
        return 0.7

    # Low confidence patterns
    if any(re.search(p, text_lower) for p in ["maybe", "possible", "unclear"]):
        return 0.4

    return 0.6  # Default medium confidence

NewsSignal

NewsSignal()

Bases: BaseSignal

Generate structured news signals for players.

Source code in fplx/signals/news.py
def __init__(self):
    self.parser = NewsParser()

generate_signal

generate_signal(news_text: str) -> dict[str, float]

Generate signal from news text.

PARAMETER DESCRIPTION
news_text

News text

TYPE: str

RETURNS DESCRIPTION
dict[str, float]

Dictionary with availability, minutes_risk, confidence

Source code in fplx/signals/news.py
def generate_signal(self, news_text: str) -> dict[str, float]:
    """Generate signal from news text.

    Parameters
    ----------
    news_text : str
        News text

    Returns
    -------
    dict[str, float]
        Dictionary with availability, minutes_risk, confidence
    """
    availability = self.parser.parse_availability(news_text)
    minutes_risk = self.parser.parse_minutes_risk(news_text)
    confidence = self.parser.parse_confidence(news_text)

    return {
        "availability": availability,
        "minutes_risk": minutes_risk,
        "confidence": confidence,
        "adjustment_factor": availability * (1 - minutes_risk),
    }

batch_generate

batch_generate(
    news_dict: dict[str, str],
) -> dict[str, dict[str, float]]

Generate signals for multiple players.

PARAMETER DESCRIPTION
news_dict

Dictionary mapping player ID to news text

TYPE: dict[str, str]

RETURNS DESCRIPTION
dict[str, dict[str, float]]

Dictionary of player signals

Source code in fplx/signals/news.py
def batch_generate(self, news_dict: dict[str, str]) -> dict[str, dict[str, float]]:
    """
    Generate signals for multiple players.

    Parameters
    ----------
    news_dict : dict[str, str]
        Dictionary mapping player ID to news text

    Returns
    -------
    dict[str, dict[str, float]]
        Dictionary of player signals
    """
    signals = {}
    for player_id, news_text in news_dict.items():
        signals[player_id] = self.generate_signal(news_text)

    return signals