lenengro_parser/parser/preprocess.py

83 lines
2.2 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": "Долгота",
}
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