Skip to content

Commit c86f7ea

Browse files
authored
Merge pull request #209 from tornede/207-get_table-with-condition
207 get table with condition
2 parents 06d0884 + 147377a commit c86f7ea

File tree

9 files changed

+634
-454
lines changed

9 files changed

+634
-454
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ output/
150150
# codecarbon
151151
.codecarbon.config
152152
emissions.csv
153+
powermetrics_log.txt
153154

154155
# development folder
155156
development/
157+

CHANGELOG.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
=========
22
Changelog
33
=========
4+
v1.4.3 (**.**.2025)
5+
===================
6+
7+
Fix
8+
===
49

10+
- Fix bug, where the logtable_name was not overwritten by `table_name` updates in the `PyExperimenter` class.
11+
- Allow condition for experimenter.get_table() and experimenter.get_logtable()
512

613
v1.4.2 (12.06.2024)
714
===================

docs/source/examples/example_logtables.ipynb

Lines changed: 272 additions & 286 deletions
Large diffs are not rendered by default.

poetry.lock

Lines changed: 329 additions & 154 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

py_experimenter/config.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
import logging
22
from abc import ABC, abstractclassmethod
33
from logging import Logger
4-
from typing import Any, Dict, List, Tuple, Union
4+
from typing import Any, Dict, List, Optional, Tuple, Union
55

66
import numpy as np
77
import omegaconf
88
from attr import dataclass
99
from omegaconf import DictConfig, ListConfig, OmegaConf
1010

1111
from py_experimenter import utils
12-
from py_experimenter.exceptions import InvalidColumnError, InvalidConfigError, InvalidLogtableError
12+
from py_experimenter.exceptions import (
13+
InvalidColumnError,
14+
InvalidLogtableError,
15+
)
1316

1417

1518
class Cfg(ABC):
@@ -362,8 +365,10 @@ def __init__(
362365
self.codecarbon_configuration = codecarbon_configuration
363366

364367
@staticmethod
365-
def extract_config(config_path: str, logger: logging.Logger) -> "PyExperimenterCfg":
368+
def extract_config(config_path: str, logger: logging.Logger, overwritten_table_name: Optional[str] = None) -> "PyExperimenterCfg":
366369
config = omegaconf.OmegaConf.load(config_path)
370+
if overwritten_table_name is not None:
371+
config["PY_EXPERIMENTER"]["Database"]["table"]["name"] = overwritten_table_name
367372

368373
if "n_jobs" not in config["PY_EXPERIMENTER"]:
369374
config["PY_EXPERIMENTER"]["n_jobs"] = 1

py_experimenter/database_connector.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -390,15 +390,17 @@ def delete_table(self) -> None:
390390
self.commit(connection)
391391
self.close_connection(connection)
392392

393-
def get_logtable(self, logtable_name: str) -> pd.DataFrame:
394-
return self.get_table(f"{self.database_configuration.table_name}__{logtable_name}")
393+
def get_logtable(self, logtable_name: str, condition = Optional[str]) -> pd.DataFrame:
394+
return self.get_table(f"{self.database_configuration.table_name}__{logtable_name}", condition)
395395

396396
def get_codecarbon_table(self) -> pd.DataFrame:
397397
return self.get_table(f"{self.database_configuration.table_name}_codecarbon")
398398

399-
def get_table(self, table_name: Optional[str] = None) -> pd.DataFrame:
399+
def get_table(self, table_name: Optional[str] = None, condition:Optional[str] = None) -> pd.DataFrame:
400400
connection = self.connect()
401401
query = f"SELECT * FROM {self.database_configuration.table_name}" if table_name is None else f"SELECT * FROM {table_name}"
402+
if condition:
403+
query += f" WHERE {condition}"
402404
# suppress warning for pandas
403405
import warnings
404406

py_experimenter/experimenter.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def __init__(
9696
handler.setFormatter(formatter)
9797
self.logger.addHandler(handler)
9898

99-
self.config = PyExperimenterCfg.extract_config(experiment_configuration_file_path, logger=self.logger)
99+
self.config = PyExperimenterCfg.extract_config(experiment_configuration_file_path, logger=self.logger, overwritten_table_name=table_name)
100100

101101
self.use_codecarbon = use_codecarbon
102102

@@ -109,8 +109,6 @@ def __init__(
109109
if use_ssh_tunnel is not None:
110110
self.config.database_configuration.use_ssh_tunnel = use_ssh_tunnel
111111

112-
if table_name is not None:
113-
self.config.database_configuration.table_name = table_name
114112
if database_name is not None:
115113
self.config.database_configuration.database_name = database_name
116114
self.name = name
@@ -494,16 +492,20 @@ def delete_table(self) -> None:
494492
"""
495493
self.db_connector.delete_table()
496494

497-
def get_table(self) -> pd.DataFrame:
495+
def get_table(self, condition:Optional[str] = None) -> pd.DataFrame:
498496
"""
499497
Returns the database table as `Pandas.DataFrame`.
500498
499+
:param condition: The condition to filter the table in sql syntax. The condition is added as a where clause.
500+
If None, the whole table is returned.
501+
:type condition: str
502+
501503
:return: The database table as `Pandas.DataFrame`.
502504
:rtype: pd.DataFrame
503505
"""
504506
return self.db_connector.get_table()
505507

506-
def get_logtable(self, logtable_name: str) -> pd.DataFrame:
508+
def get_logtable(self, logtable_name: str, condition:Optional[str] = None) -> pd.DataFrame:
507509
"""
508510
Returns the log table as `Pandas.DataFrame`.
509511
@@ -512,7 +514,7 @@ def get_logtable(self, logtable_name: str) -> pd.DataFrame:
512514
:return: The log table as `Pandas.DataFrame`.
513515
:rtype: pd.DataFrame
514516
"""
515-
return self.db_connector.get_logtable(logtable_name)
517+
return self.db_connector.get_logtable(logtable_name, condition)
516518

517519
def get_codecarbon_table(self) -> pd.DataFrame:
518520
"""

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ codecarbon = ">=2.2.1"
3737
pymysql = "^1.0.3"
3838
omegaconf = "^2.3.0"
3939
sshtunnel = "^0.4.0"
40+
setuptools = "^69.5.1"
4041

4142
[tool.poetry.group.dev.dependencies]
4243
pytest = ">=7.0"

test/test_codecarbon/test_integration_mysql.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010

1111
@pytest.fixture
1212
def experimenter():
13-
configuration_path = os.path.join("test", "test_codecarbon", "configs", "integration_test_sqlite.yml")
13+
configuration_path = os.path.join("test", "test_codecarbon", "configs", "integration_test_mysql.yml")
1414

15-
return PyExperimenter(configuration_path)
15+
return PyExperimenter(configuration_path, use_ssh_tunnel=True)
1616

1717

1818
def run_ml(parameters: dict, result_processor: ResultProcessor, custom_config: dict):

0 commit comments

Comments
 (0)