63 lines
2.0 KiB
Python
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
|