feat: добавил конвертер данных из csv в pandas.DataFrame
This commit is contained in:
parent
a38d949712
commit
ac8c128484
@ -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:
|
||||
...
|
||||
|
20
src/controller/converter.py
Normal file
20
src/controller/converter.py
Normal 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)
|
@ -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)
|
||||
|
@ -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 = []
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user