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