dm1sh c40a1b4f92
FInished work
(Too lazy to split by commits)
2023-09-21 20:41:56 +03:00

63 lines
2.0 KiB
Python

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