40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from backend.bootstrap.config import normalize_date
|
|
from backend.features.sentiment.engine import (
|
|
COMPONENT_WEIGHTS,
|
|
apply_sentiment_to_dashboard,
|
|
build_sentiment_history,
|
|
latest_contiguous_history,
|
|
)
|
|
|
|
|
|
class SentimentServiceMixin:
|
|
def _enrich_dashboard_sentiment(
|
|
self,
|
|
dashboard: dict[str, Any],
|
|
end_date: str,
|
|
) -> dict[str, Any]:
|
|
history = self.database.list_snapshot_payloads(end_date, 260)
|
|
return apply_sentiment_to_dashboard(dashboard, history)
|
|
|
|
def sentiment_history(self, trade_date: str, limit: int = 20) -> dict[str, Any]:
|
|
normalized_date = normalize_date(trade_date)
|
|
limit = max(10, min(120, int(limit)))
|
|
full_series = build_sentiment_history(
|
|
self.database.list_snapshot_payloads(normalized_date, 240)
|
|
)
|
|
series = latest_contiguous_history(full_series)
|
|
rows = series[-limit:]
|
|
return {
|
|
"trade_date": rows[-1]["trade_date"] if rows else normalized_date,
|
|
"available_days": len(series),
|
|
"stored_days": len(full_series),
|
|
"requested_days": limit,
|
|
"rows": rows,
|
|
"weights": COMPONENT_WEIGHTS,
|
|
"normalization": rows[-1]["normalization"] if rows else "固定锚点",
|
|
}
|