From 2522c3d7baac0491de77318a0ab0deb0569988e6 Mon Sep 17 00:00:00 2001 From: boilpy Date: Sun, 18 Sep 2022 09:21:19 -0500 Subject: [PATCH 1/7] feat: add gene info to repr html --- src/cobra/core/model.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cobra/core/model.py b/src/cobra/core/model.py index 597c3802b..156744ead 100644 --- a/src/cobra/core/model.py +++ b/src/cobra/core/model.py @@ -1500,6 +1500,9 @@ def _repr_html_(self) -> str: Number of reactions {len(self.reactions)} + + Number of genes + {len(self.genes)} Number of groups {len(self.groups)} From 7a161c03bd7f3dfcca8040318c9d3e2bd9c0f283 Mon Sep 17 00:00:00 2001 From: boilpy Date: Sun, 18 Sep 2022 23:07:58 -0500 Subject: [PATCH 2/7] feat: add to_dataframe to dictlist --- src/cobra/core/dictlist.py | 27 +++++++++++++++++++++++++++ src/cobra/core/formula.py | 2 ++ src/cobra/core/gene.py | 2 ++ src/cobra/core/group.py | 2 ++ src/cobra/core/metabolite.py | 2 ++ src/cobra/core/reaction.py | 2 ++ src/cobra/core/species.py | 4 +++- 7 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/cobra/core/dictlist.py b/src/cobra/core/dictlist.py index dad2c71b4..ef59519d4 100644 --- a/src/cobra/core/dictlist.py +++ b/src/cobra/core/dictlist.py @@ -16,6 +16,7 @@ ) import numpy as np +import pandas as pd from .object import Object @@ -542,3 +543,29 @@ def __dir__(self) -> list: attributes.append("_dict") attributes.extend(self._dict.keys()) return attributes + + def to_dataframe(self): + """Convert to a pandas dataframe.""" + + item = None + columns = [] + + if self: + item = self[0] + columns = [col for col in item._DF_ATTRS if col != "id"] + + data = [] + ids = [] + + for item in self: + ids.append(item.id) + data.append([getattr(item, attr) for attr in columns]) + + df = pd.DataFrame(columns = columns, data = data, index = ids) + + return df + + def _repr_html_(self): + """Display as HTML.""" + df = self.to_dataframe() + return df._repr_html_() \ No newline at end of file diff --git a/src/cobra/core/formula.py b/src/cobra/core/formula.py index 8aeab23bf..fbbb33d58 100644 --- a/src/cobra/core/formula.py +++ b/src/cobra/core/formula.py @@ -22,6 +22,8 @@ class Formula(Object): A legal formula string contains only letters and numbers. """ + _DF_ATTRS = ["formula"] + def __init__(self, formula: Optional[str] = None, **kwargs) -> None: """Initialize a formula. diff --git a/src/cobra/core/gene.py b/src/cobra/core/gene.py index 4d8a13576..4b812c4aa 100644 --- a/src/cobra/core/gene.py +++ b/src/cobra/core/gene.py @@ -204,6 +204,8 @@ class Gene(Species): used. """ + _DF_ATTRS = Species._DF_ATTRS + ["gene_reaction_rule"] + # noinspection PyShadowingBuiltins def __init__(self, id: str = None, name: str = "", functional: bool = True) -> None: """Initialize a gene. diff --git a/src/cobra/core/group.py b/src/cobra/core/group.py index ac2e508b3..39651ff49 100644 --- a/src/cobra/core/group.py +++ b/src/cobra/core/group.py @@ -38,6 +38,8 @@ class Group(Object): or member is involved in a disease phenotype). """ + _DF_ATTRS = ["id", "name", "kind"] + KIND_TYPES = ("collection", "classification", "partonomy") def __init__( diff --git a/src/cobra/core/metabolite.py b/src/cobra/core/metabolite.py index 6b3d31dc9..131a94e57 100644 --- a/src/cobra/core/metabolite.py +++ b/src/cobra/core/metabolite.py @@ -44,6 +44,8 @@ class Metabolite(Species): Compartment of the metabolite. """ + _DF_ATTRS = Species._DF_ATTRS + ["formula", "compartment", "charge"] + # noinspection PyShadowingBuiltins def __init__( self, diff --git a/src/cobra/core/reaction.py b/src/cobra/core/reaction.py index 0623ae170..f4f0ac23b 100644 --- a/src/cobra/core/reaction.py +++ b/src/cobra/core/reaction.py @@ -84,6 +84,8 @@ class Reaction(Object): **kwargs: Further keyword arguments are passed on to the parent class. """ + + _DF_ATTRS = ["id", "name", "subsystem", "gene_reaction_rule", "lower_bound", "upper_bound"] # noinspection PyShadowingBuiltins def __init__( diff --git a/src/cobra/core/species.py b/src/cobra/core/species.py index 39749fcd0..13dd015b6 100644 --- a/src/cobra/core/species.py +++ b/src/cobra/core/species.py @@ -25,6 +25,8 @@ class Species(Object): A human readable name. """ + _DF_ATTRS = ["id", "name"] + # noinspection PyShadowingBuiltins def __init__( self, id: Optional[str] = None, name: Optional[str] = None, **kwargs @@ -100,4 +102,4 @@ def model(self) -> Optional["Model"]: Returns the cobra model that the species is associated with. None if there is no model associated with this species. """ - return self._model + return self._model \ No newline at end of file From c4d8f3289255ff1300a54f60cc3365766d22e94e Mon Sep 17 00:00:00 2001 From: boilpy Date: Sun, 18 Sep 2022 23:09:02 -0500 Subject: [PATCH 3/7] fix: fix gene df attrs --- src/cobra/core/gene.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cobra/core/gene.py b/src/cobra/core/gene.py index 4b812c4aa..e6e1a1543 100644 --- a/src/cobra/core/gene.py +++ b/src/cobra/core/gene.py @@ -204,7 +204,7 @@ class Gene(Species): used. """ - _DF_ATTRS = Species._DF_ATTRS + ["gene_reaction_rule"] + _DF_ATTRS = Species._DF_ATTRS # noinspection PyShadowingBuiltins def __init__(self, id: str = None, name: str = "", functional: bool = True) -> None: From 6ce1de61dd38ff1f808c6a7df09c135dd75685a4 Mon Sep 17 00:00:00 2001 From: boilpy Date: Sun, 18 Sep 2022 23:11:45 -0500 Subject: [PATCH 4/7] chore: add genes model notebook repr --- release-notes/next-release.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/release-notes/next-release.md b/release-notes/next-release.md index a38777b5a..8bb9bbe10 100644 --- a/release-notes/next-release.md +++ b/release-notes/next-release.md @@ -2,6 +2,8 @@ ## New features +* View number of genes in model notebook representation. + ## Fixes * serializes GPRs to strings to avoid massive storage usage From 28376e60ae68c57961dea0b7c357a90342e599e7 Mon Sep 17 00:00:00 2001 From: boilpy Date: Mon, 19 Sep 2022 15:02:22 -0500 Subject: [PATCH 5/7] fix: fix linting issue --- src/cobra/core/dictlist.py | 9 ++++----- src/cobra/core/reaction.py | 11 +++++++++-- src/cobra/core/species.py | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/cobra/core/dictlist.py b/src/cobra/core/dictlist.py index ef59519d4..32d45ea85 100644 --- a/src/cobra/core/dictlist.py +++ b/src/cobra/core/dictlist.py @@ -544,9 +544,8 @@ def __dir__(self) -> list: attributes.extend(self._dict.keys()) return attributes - def to_dataframe(self): + def to_df(self): """Convert to a pandas dataframe.""" - item = None columns = [] @@ -561,11 +560,11 @@ def to_dataframe(self): ids.append(item.id) data.append([getattr(item, attr) for attr in columns]) - df = pd.DataFrame(columns = columns, data = data, index = ids) + df = pd.DataFrame(columns=columns, data=data, index=ids) return df def _repr_html_(self): """Display as HTML.""" - df = self.to_dataframe() - return df._repr_html_() \ No newline at end of file + df = self.to_df() + return df._repr_html_() diff --git a/src/cobra/core/reaction.py b/src/cobra/core/reaction.py index f4f0ac23b..4508096ec 100644 --- a/src/cobra/core/reaction.py +++ b/src/cobra/core/reaction.py @@ -84,8 +84,15 @@ class Reaction(Object): **kwargs: Further keyword arguments are passed on to the parent class. """ - - _DF_ATTRS = ["id", "name", "subsystem", "gene_reaction_rule", "lower_bound", "upper_bound"] + + _DF_ATTRS = [ + "id", + "name", + "subsystem", + "gene_reaction_rule", + "lower_bound", + "upper_bound", + ] # noinspection PyShadowingBuiltins def __init__( diff --git a/src/cobra/core/species.py b/src/cobra/core/species.py index 13dd015b6..413c038ec 100644 --- a/src/cobra/core/species.py +++ b/src/cobra/core/species.py @@ -102,4 +102,4 @@ def model(self) -> Optional["Model"]: Returns the cobra model that the species is associated with. None if there is no model associated with this species. """ - return self._model \ No newline at end of file + return self._model From d885b6303da4405cc4808a48392a992d1a36ff03 Mon Sep 17 00:00:00 2001 From: boilpy Date: Mon, 19 Sep 2022 15:06:37 -0500 Subject: [PATCH 6/7] test: add test cases for dict list --- tests/test_core/test_dictlist.py | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_core/test_dictlist.py b/tests/test_core/test_dictlist.py index 5b2d35586..3ec28bf07 100644 --- a/tests/test_core/test_dictlist.py +++ b/tests/test_core/test_dictlist.py @@ -6,6 +6,7 @@ from typing import Tuple import pytest +import pandas as pd from cobra.core import DictList, Object @@ -468,3 +469,38 @@ def test_union(dict_list: Tuple[Object, DictList]) -> None: # Add only 1 element assert len(test_list) == 2 assert test_list.index("test2") == 1 + +def test_to_df(dict_list: Tuple[Object, DictList]) -> None: + """Test to_df for dictlist. + + Parameters + ---------- + dict_list : tuple + The fixture for filled dictlist. + + """ + _, test_list = dict_list + test_list.name = "foo" + df = test_list.to_df() + assert isinstance(df, pd.DataFrame) + assert len(df) == 1 + assert "id" in df.columns + assert "test1" in df["id"].values + assert "name" in df.columns + assert "foo" in df["name"].values + +def test__repr_html(dict_list: Tuple[Object, DictList]) -> None: + """Test _repr_html_ for dictlist. + + Parameters + ---------- + dict_list : tuple + The fixture for filled dictlist. + + """ + _, test_list = dict_list + test_list.name = "foo" + html = test_list._repr_html_() + assert isinstance(html, str) + assert "test1" in html + assert "foo" in html \ No newline at end of file From 5b45b1f8e75c08af40ea9f9e6b233cfa788a98c7 Mon Sep 17 00:00:00 2001 From: boilpy Date: Mon, 19 Sep 2022 15:08:14 -0500 Subject: [PATCH 7/7] test: add test cases for dict list --- tests/test_core/test_dictlist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_core/test_dictlist.py b/tests/test_core/test_dictlist.py index 3ec28bf07..b5630f542 100644 --- a/tests/test_core/test_dictlist.py +++ b/tests/test_core/test_dictlist.py @@ -5,8 +5,8 @@ from pickle import HIGHEST_PROTOCOL, dumps, loads from typing import Tuple -import pytest import pandas as pd +import pytest from cobra.core import DictList, Object