from __future__ import annotations from typing import Any, List import pandas as pd COL_NS = { "region": "Регион РФ (область, край, город фед. значения, округ)", "area": "Административный район", "town": "Населённый пункт", "street": "Улица", "start_date": "Плановая дата начала отключения электроснабжения", "start_time": "Плановое время начала отключения электроснабжения", "finish_date": "Плановая дата восстановления отключения электроснабжения", "finish_time": "Плановое время восстановления отключения электроснабжения", "branch": "Филиал", "res": "РЭС", "comment": "Комментарий", "building_id": "ID здания", "lat": "Широта", "lng": "Долгота", } PR_COL_NS = ( "index", "region", "area", "town", "street", "branch", "res", "comment", "building_id", "lat", "lng", "start", "finish", ) ICOL_NS = dict(map(reversed, COL_NS.items())) def preprocess_df(df: pd.DataFrame) -> pd.DataFrame: df.rename(columns=ICOL_NS, inplace=True) for a in ("start", "finish"): df[f"{a}"] = pd.to_datetime( df[f"{a}_date"].astype(str) + " " + df[f"{a}_time"].astype(str), dayfirst=True, ) df.drop(columns=[f"{a}_date", f"{a}_time"], inplace=True) df = df.convert_dtypes() return df def preprocess_read_df(df: pd.DataFrame) -> pd.DataFrame: for name in ("start", "finish"): df[name] = pd.to_datetime(df[name]) return df def join_columns(col: pd.Series[Any]) -> List[Any] | Any: first = col.iloc[0] if col.name in ("street", "building_id", "lat", "lng") and pd.notnull(first): return list(col) return first def group_by_index(df: pd.DataFrame) -> pd.DataFrame: groupped = df.groupby("index") res_df = groupped.apply(lambda index_df: index_df.apply(join_columns)).drop( columns="index" ) return res_df