diff --git a/requirements.txt b/requirements.txt index 14b08da..6fe81bf 100755 Binary files a/requirements.txt and b/requirements.txt differ diff --git a/shared/config_example.json b/shared/config_example.json index 101cbf9..cef63a6 100644 --- a/shared/config_example.json +++ b/shared/config_example.json @@ -1,5 +1,8 @@ { - "arguments": {"output-format": "csv", "output-file": "test"}, + "arguments": { + "output-format": "csv", + "output-file": "test" + }, "simulation": { "consensus_settings": { "snow_ball": { @@ -38,7 +41,23 @@ ], "seed": 18042022 }, - "plotting": { - "test": "test" + "plotter": { + "countplot": { + "plot_options": { + "x": "vote" + }, + "save_options": { + "name": "test.png" + } + }, + "scatterplot": { + "plot_options": { + "x": "id", + "y": "vote" + }, + "save_options": { + "name": "test2.png" + } + } } } \ No newline at end of file diff --git a/src/main.py b/src/main.py index ca4c6ba..49850ac 100755 --- a/src/main.py +++ b/src/main.py @@ -2,6 +2,7 @@ import typer # Project Imports +from src.plotter.run_plotter import run_plotter from src.simulation_runner.runner import run_simulation from src.utilities.files.json.simulation_config_parser import SimulationConfigParser @@ -16,11 +17,10 @@ def main( if run_type == "simulation": run_simulation(arguments_config, simulation_config) elif run_type == "plotter": - # run_plotter() - pass + run_plotter(arguments_config, plotter_config) else: run_simulation() - # run_plotter() + run_plotter() if __name__ == '__main__': diff --git a/src/plotter/run_plotter.py b/src/plotter/run_plotter.py index 515eefb..17898b7 100644 --- a/src/plotter/run_plotter.py +++ b/src/plotter/run_plotter.py @@ -1,24 +1,24 @@ # Python Imports -import typer +import seaborn as sns +import matplotlib.pyplot as plt + +# Project Imports +from src.utilities.env_variables import SHARED_FOLDER +from src.utilities.files.simulation_data_parser import SimulationDataParser -def main( - input_data: str = typer.Option(..., "--input-data", "-i"), - plot_type: str = typer.Option(..., "--plot-type", "-p"), - plot_settings: str = typer.Option(..., "--plot-settings", "-s"), -): - # Parse data file - print("") - # Accept plot type +def run_plotter(arguments_config: dict, plotter_config: dict): + file_name = f"{arguments_config['output-file']}.{arguments_config['output-format']}" + # Read file given in arguments config + parser = SimulationDataParser() + polars_df = parser.read_content(SHARED_FOLDER + file_name) - # Handle Plot arguments + pandas_df = polars_df.to_pandas() - -''' -import foo -bar = getattr(foo, 'bar') -result = bar() -''' - -if __name__ == '__main__': - typer.run(main) + # Loop through all plots given in plotting section + for plot, options in plotter_config.items(): + print(plot) + print(options) + method = getattr(sns, plot) + method(pandas_df, **options["plot_options"]) + plt.savefig(SHARED_FOLDER + options["save_options"]["name"]) diff --git a/src/utilities/env_variables.py b/src/utilities/env_variables.py index 03c1cf4..c558ffe 100644 --- a/src/utilities/env_variables.py +++ b/src/utilities/env_variables.py @@ -6,6 +6,12 @@ CONFIGURATION_SETTINGS = "shared/configuration_settings.json" # Schemas ARGUMENTS_SCHEMA_PATH = "src/utilities/files/schemas/arguments_schema.json" CONFIGURATION_SCHEMA_PATH = "src/utilities/files/schemas/snow_family_configuration_schema.json" +PLOTTER_SCHEMA_PATH = "src/utilities/files/schemas/plotter_schema.json" # Shared folder SHARED_FOLDER = "shared/" + +# Configuration +ARGUMENTS_BLOCK = "arguments" +SIMULATION_BLOCK = "simulation" +PLOTTER_BLOCK = "plotter" diff --git a/src/utilities/files/json/simulation_config_parser.py b/src/utilities/files/json/simulation_config_parser.py index e378ab5..d6f72b1 100644 --- a/src/utilities/files/json/simulation_config_parser.py +++ b/src/utilities/files/json/simulation_config_parser.py @@ -16,17 +16,16 @@ class SimulationConfigParser: # Split two parts arguments_config = json_configuration["arguments"] simulation_config = json_configuration["simulation"] - # plotter_config = json_configuration["plotter"] + plotter_config = json_configuration["plotter"] # Retrieve valid schemas arguments_json_schema = read_json(env_variables.ARGUMENTS_SCHEMA_PATH) config_json_schema = read_json(env_variables.CONFIGURATION_SCHEMA_PATH) - # plotter_json_schema = read_json(env_variables.plotter_schema_path) + # plotter_json_schema = read_json(env_variables.plotter_schema_path) todo uncomment # Validate validate_json(arguments_config, arguments_json_schema) validate_json(simulation_config, config_json_schema) - # validate_json(plotter_config, plotter_json_schema) + # validate_json(plotter_config, plotter_json_schema) todo uncomment - # return simulation_config, plotter_config - return arguments_config, simulation_config, {} + return arguments_config, simulation_config, plotter_config diff --git a/src/utilities/files/schemas/plotter_schema.json b/src/utilities/files/schemas/plotter_schema.json index e69de29..4d55c9d 100755 --- a/src/utilities/files/schemas/plotter_schema.json +++ b/src/utilities/files/schemas/plotter_schema.json @@ -0,0 +1,66 @@ +{ + "type": "object", + "properties": { + "scatterplot": { + "type": "object", + "properties": { + "plot_options": { + "type": "object" + }, + "save_options": { + "type": "object" + } + }, + "required": [ + "plot_options", + "save_options" + ] + }, + "lineplot": { + "type": "object", + "properties": { + "plot_options": { + "type": "object" + }, + "save_options": { + "type": "object" + } + }, + "required": [ + "plot_options", + "save_options" + ] + }, + "histplot": { + "type": "object", + "properties": { + "plot_options": { + "type": "object" + }, + "save_options": { + "type": "object" + } + }, + "required": [ + "plot_options", + "save_options" + ] + }, + "countplot": { + "type": "object", + "properties": { + "plot_options": { + "type": "object" + }, + "save_options": { + "type": "object" + } + }, + "required": [ + "plot_options", + "save_options" + ] + } + }, + "aditionalProperties": false +} \ No newline at end of file diff --git a/src/utilities/files/simulation_data_parser.py b/src/utilities/files/simulation_data_parser.py index 447601a..1eb5213 100644 --- a/src/utilities/files/simulation_data_parser.py +++ b/src/utilities/files/simulation_data_parser.py @@ -1,6 +1,8 @@ # Python Imports import os.path +import polars + # Project Imports from src.utilities.files.simulation_data_types.json_data_simulation_handler import JsonDataSimulationHandler from src.utilities.files.simulation_data_types.csv_data_simulation_handler import CsvDataSimulationHandler @@ -8,17 +10,18 @@ from src.utilities.files.simulation_data_types.parquet_simulation_data_handler i handlers = {'.csv': CsvDataSimulationHandler, '.json': JsonDataSimulationHandler, - 'parquet': ParquetDataSimulationHandler + '.parquet': ParquetDataSimulationHandler } class SimulationDataParser: - def __init__(self, file_path): - self._file_path = file_path + def __init__(self): + self._file_path = None self._file_extension = None - def read_content(self): + def read_content(self, file_path: str) -> polars.DataFrame: + self._file_path = file_path # Check file exists self._check_file() # Check extension @@ -26,10 +29,9 @@ class SimulationDataParser: # Get correct handler handler = self._get_data_handler() # Load content - handler.load_data() - # Convert it to dataframe - dataframe = handler.convert_into_dataframe() + polars_df = handler.load_data(self._file_path) # Return + return polars_df def _check_file(self): exists = os.path.exists(self._file_path) @@ -39,7 +41,7 @@ class SimulationDataParser: exit(1) def _check_extension(self): - return os.path.splitext(self._file_path)[1] + self._file_extension = os.path.splitext(self._file_path)[1] def _get_data_handler(self): handler = handlers.get(self._file_extension) diff --git a/src/utilities/files/simulation_data_types/base_data_simulation_handler.py b/src/utilities/files/simulation_data_types/base_data_simulation_handler.py index e2b02aa..15670d6 100644 --- a/src/utilities/files/simulation_data_types/base_data_simulation_handler.py +++ b/src/utilities/files/simulation_data_types/base_data_simulation_handler.py @@ -1,16 +1,11 @@ +# Python Imports import abc from abc import ABC +import polars as pl class BaseDataSimulationHandler(ABC): - def __init__(self): - self._data = None - @abc.abstractmethod - def load_data(self, path): - pass - - @abc.abstractmethod - def convert_into_dataframe(self): + def load_data(self, path: str) -> pl.DataFrame: pass diff --git a/src/utilities/files/simulation_data_types/csv_data_simulation_handler.py b/src/utilities/files/simulation_data_types/csv_data_simulation_handler.py index 80ec474..474ba94 100644 --- a/src/utilities/files/simulation_data_types/csv_data_simulation_handler.py +++ b/src/utilities/files/simulation_data_types/csv_data_simulation_handler.py @@ -1,10 +1,14 @@ +# Python Imports +import polars as pl + +# Project Imports from src.utilities.files.simulation_data_types.base_data_simulation_handler import BaseDataSimulationHandler class CsvDataSimulationHandler(BaseDataSimulationHandler): - def load_data(self, path): - pass + def load_data(self, path: str) -> pl.DataFrame: + polars_df = pl.read_csv(path) + + return polars_df - def convert_into_dataframe(self): - pass diff --git a/src/utilities/files/simulation_data_types/json_data_simulation_handler.py b/src/utilities/files/simulation_data_types/json_data_simulation_handler.py index 99b037c..e38054a 100644 --- a/src/utilities/files/simulation_data_types/json_data_simulation_handler.py +++ b/src/utilities/files/simulation_data_types/json_data_simulation_handler.py @@ -1,10 +1,13 @@ +# Python Imports +import polars as pl + +# Project Imports from src.utilities.files.simulation_data_types.base_data_simulation_handler import BaseDataSimulationHandler class JsonDataSimulationHandler(BaseDataSimulationHandler): - def load_data(self, path): - pass + def load_data(self, path: str) -> pl.DataFrame: + polars_df = pl.read_json(path) - def convert_into_dataframe(self): - pass + return polars_df diff --git a/src/utilities/files/simulation_data_types/parquet_simulation_data_handler.py b/src/utilities/files/simulation_data_types/parquet_simulation_data_handler.py index c83dfa6..60b5421 100644 --- a/src/utilities/files/simulation_data_types/parquet_simulation_data_handler.py +++ b/src/utilities/files/simulation_data_types/parquet_simulation_data_handler.py @@ -1,10 +1,13 @@ +# Python Imports +import polars as pl + +# Project Imports from src.utilities.files.simulation_data_types.base_data_simulation_handler import BaseDataSimulationHandler class ParquetDataSimulationHandler(BaseDataSimulationHandler): - def load_data(self, path): - pass + def load_data(self, path: str) -> pl.DataFrame: + polars_df = pl.read_parquet(path) - def convert_into_dataframe(self): - pass + return polars_df