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': 'Долгота' } 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) 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