This commit is contained in:
2025-12-16 01:51:05 +03:00
parent a1bc89c481
commit c963b1e5ac
123 changed files with 5644 additions and 3802 deletions

View File

@@ -1,5 +1,7 @@
from __future__ import annotations
"""Генерирует раздельные Altair-облака для активных/пассивных/всех показов по категориям."""
import sqlite3
import sys
from pathlib import Path
@@ -30,6 +32,7 @@ COMBINED_WINDOW_FACTOR = 1.0
def load_raw() -> pd.DataFrame:
# Читаем полные коммуникации из SQLite для дальнейших агрегаций
conn = sqlite3.connect(bmp.DB_PATH)
df = pd.read_sql_query("select * from communications", conn, parse_dates=["business_dt"])
conn.close()
@@ -37,6 +40,7 @@ def load_raw() -> pd.DataFrame:
def build_client(df: pd.DataFrame) -> pd.DataFrame:
# Агрегируем активные/пассивные показы и заказы по клиенту и считаем средние в день
agg_spec = {
**{f"active_imp_{c}": "sum" for c in CATEGORIES},
**{f"passive_imp_{c}": "sum" for c in CATEGORIES},
@@ -66,6 +70,7 @@ def build_client(df: pd.DataFrame) -> pd.DataFrame:
def compute_limits(df: pd.DataFrame, x_col: str, y_col: str) -> Tuple[float, float]:
# Автоматический подбор разумных лимитов осей по 99 перцентилю
x_q = df[x_col].quantile(0.99)
y_q = df[y_col].quantile(0.99)
x_max = float(max(0.1, x_q + 2.0))
@@ -81,6 +86,7 @@ def fit_quadratic(
y_col: str,
x_max: float,
) -> Tuple[Optional[sm.regression.linear_model.RegressionResultsWrapper], dict]:
# Строим квадратичную регрессию и считаем AUC/R2 по тренду
if len(df) < 3:
return None, {}
x = df[x_col].to_numpy()
@@ -119,6 +125,7 @@ def scatter_trend_quad(
y_override: float | None = None,
x_scale_factor: float | None = None,
) -> None:
# Пайплайн для одной комбинации x/y: фильтр, тренд, регрессия и сохранение HTML
# Авто-лимиты
x_max, y_max = compute_limits(df, x_col, y_col)
if x_override is not None: