feat: добавил конвертер данных из csv в pandas.DataFrame

This commit is contained in:
Андрей Скирченко 2024-11-14 09:37:54 +03:00
parent a38d949712
commit ac8c128484
5 changed files with 65 additions and 13 deletions

View File

@ -1,17 +1,24 @@
from __future__ import annotations
import os
from typing import Optional
from typing import Optional, Union
import pandas as pd
from PyQt5.QtCore import QThread
class BaseMediator:
def __init__(self, monitor: BaseDirectoryMonitor):
def __init__(self,
monitor: BaseDirectoryMonitor,
converter: BaseDataConverter):
self._monitor = monitor
self._monitor.mediator = self
self._converter = converter
self._converter.mediator = self
def notify(self, files: list[str]):
def notify(self,
source: Union[BaseDirectoryMonitor, BaseDataConverter],
data: Union[list[str], list[pd.DataFrame]]):
...
@ -51,3 +58,19 @@ class BaseDirectoryMonitor(QThread):
def _init_state(self):
files = os.listdir(self._directory_path)
self._files = files
class BaseDataConverter:
def __init__(self, mediator: Optional[BaseMediator] = None):
self._mediator = mediator
@property
def mediator(self) -> BaseMediator:
return self._mediator
@mediator.setter
def mediator(self, mediator: BaseMediator) -> None:
self._mediator = mediator
def convert_data(self, files: list[str]) -> None:
...

View File

@ -0,0 +1,20 @@
import pandas as pd
#FIXME: костыль для выключения предупреждения "replace deprecated". Потом надо поправить.
pd.set_option('future.no_silent_downcasting', True)
from controller.base import BaseDataConverter
class DataConverter(BaseDataConverter):
@staticmethod
def _replace_bool(dataframe: pd.DataFrame) -> pd.DataFrame:
bool_columns = dataframe.columns[dataframe.isin([True, False]).any()]
dataframe[bool_columns] = dataframe[bool_columns].replace({True: 1, False: 0})
return dataframe
def convert_data(self, files: list[str]) -> None:
dataframes = [pd.read_csv(file) for file in files]
converted_dataframes = list(map(self._replace_bool, dataframes))
self._mediator.notify(self, converted_dataframes)

View File

@ -1,13 +1,19 @@
from controller.base import BaseMediator
import pandas as pd
from typing import Union
from loguru import logger
from controller.base import BaseMediator, BaseDirectoryMonitor, BaseDataConverter
class Mediator(BaseMediator):
def notify(self, files: list[str]):
for file in files:
# TODO: create dataframe
# TODO: create plot widget
# TODO: send plot widget to controller
logger.info(f"File handled: {file}")
def notify(self,
source: Union[BaseDirectoryMonitor, BaseDataConverter],
data: Union[list[str], list[pd.DataFrame]]):
if issubclass(source.__class__, BaseDirectoryMonitor):
self._converter.convert_data(data)
if issubclass(source.__class__, BaseDataConverter):
# TODO: отправить датафреймы в конструктор графиков
logger.info(data)

View File

@ -14,10 +14,11 @@ class DirectoryMonitor(BaseDirectoryMonitor):
while True:
files = os.listdir(self._directory_path)
new_files = sorted(list(filter(lambda x: x not in self._files, files)))
new_files = sorted(list(map(lambda x: os.path.join(self._directory_path, x),
filter(lambda x: x not in self._files, files))))
if new_files:
logger.info(f"New files detected: {new_files}")
self._mediator.notify(new_files)
self._mediator.notify(self, new_files)
self._files = files
if not files:
self._files = []

View File

@ -7,6 +7,7 @@ from gui.mainGui import MainWindow
from cfg.schema import ConfigSchema
from controller.monitor import DirectoryMonitor
from controller.mediator import Mediator
from controller.converter import DataConverter
def read_json(filepath: str) -> dict:
@ -22,7 +23,8 @@ def main():
app = QtWidgets.QApplication(sys.argv)
config = ConfigSchema(**read_json("config/config.json"))
monitor = DirectoryMonitor(config.trace_storage_path, config.monitor_update_period)
mediator = Mediator(monitor)
data_converter = DataConverter()
mediator = Mediator(monitor, data_converter)
monitor.start()
window = MainWindow()