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