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 from __future__ import annotations
import os import os
from typing import Optional from typing import Optional, Union
import pandas as pd
from PyQt5.QtCore import QThread from PyQt5.QtCore import QThread
class BaseMediator: class BaseMediator:
def __init__(self, monitor: BaseDirectoryMonitor): def __init__(self,
monitor: BaseDirectoryMonitor,
converter: BaseDataConverter):
self._monitor = monitor self._monitor = monitor
self._monitor.mediator = self 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): def _init_state(self):
files = os.listdir(self._directory_path) files = os.listdir(self._directory_path)
self._files = files 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 loguru import logger
from controller.base import BaseMediator, BaseDirectoryMonitor, BaseDataConverter
class Mediator(BaseMediator): class Mediator(BaseMediator):
def notify(self, files: list[str]): def notify(self,
for file in files: source: Union[BaseDirectoryMonitor, BaseDataConverter],
# TODO: create dataframe data: Union[list[str], list[pd.DataFrame]]):
# TODO: create plot widget if issubclass(source.__class__, BaseDirectoryMonitor):
# TODO: send plot widget to controller self._converter.convert_data(data)
logger.info(f"File handled: {file}")
if issubclass(source.__class__, BaseDataConverter):
# TODO: отправить датафреймы в конструктор графиков
logger.info(data)

View File

@ -14,10 +14,11 @@ class DirectoryMonitor(BaseDirectoryMonitor):
while True: while True:
files = os.listdir(self._directory_path) 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: if new_files:
logger.info(f"New files detected: {new_files}") logger.info(f"New files detected: {new_files}")
self._mediator.notify(new_files) self._mediator.notify(self, new_files)
self._files = files self._files = files
if not files: if not files:
self._files = [] self._files = []

View File

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