37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
"""AI 뉴스 호재/악재 점수 노드.
|
|
|
|
ScreenContext.news_sentiment (DataFrame: ticker, score_raw, news_count) 를
|
|
min_news_count 로 필터한 뒤 percentile_rank 로 0~100 변환.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pandas as pd
|
|
|
|
from .base import ScoreNode, percentile_rank
|
|
|
|
|
|
class AiNewsSentiment(ScoreNode):
|
|
name = "ai_news"
|
|
label = "AI 뉴스 호재/악재"
|
|
default_params = {"min_news_count": 1}
|
|
param_schema = {
|
|
"type": "object",
|
|
"properties": {
|
|
"min_news_count": {
|
|
"type": "integer", "minimum": 0, "default": 1,
|
|
"description": "최소 분석 뉴스 수. 미만이면 점수 미산출.",
|
|
},
|
|
},
|
|
}
|
|
|
|
def compute(self, ctx, params: dict) -> pd.Series:
|
|
df = getattr(ctx, "news_sentiment", None)
|
|
if df is None or df.empty:
|
|
return pd.Series(dtype=float)
|
|
min_news = int(params.get("min_news_count", 1))
|
|
df = df[df["news_count"] >= min_news]
|
|
if df.empty:
|
|
return pd.Series(dtype=float)
|
|
return percentile_rank(df.set_index("ticker")["score_raw"])
|