38 lines
1.5 KiB
Python
38 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
|
|
class PopularityRepositoryMixin:
|
|
def upsert_popularity_factors(self, rows: list[dict[str, Any]]) -> int:
|
|
values = [
|
|
(
|
|
str(row.get("trade_date") or ""),
|
|
str(row.get("ts_code") or ""),
|
|
int(row["ths_rank"]) if row.get("ths_rank") not in (None, "") else None,
|
|
int(row["dc_rank"]) if row.get("dc_rank") not in (None, "") else None,
|
|
float(row.get("combined_score") or 0),
|
|
int(row["rank_change"]) if row.get("rank_change") not in (None, "") else None,
|
|
int(bool(row.get("dual_source"))),
|
|
)
|
|
for row in rows
|
|
if row.get("trade_date") and row.get("ts_code")
|
|
]
|
|
with self.connect() as connection:
|
|
connection.executemany(
|
|
"""
|
|
INSERT INTO popularity_factors
|
|
(trade_date, ts_code, ths_rank, dc_rank, combined_score,
|
|
rank_change, dual_source)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
ON CONFLICT(trade_date, ts_code) DO UPDATE SET
|
|
ths_rank=excluded.ths_rank,
|
|
dc_rank=excluded.dc_rank,
|
|
combined_score=excluded.combined_score,
|
|
rank_change=excluded.rank_change,
|
|
dual_source=excluded.dual_source
|
|
""",
|
|
values,
|
|
)
|
|
return len(values)
|