From 22808a0c2e3cc4b3689f81889a4294193992962f Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Mon, 2 Mar 2020 23:53:51 +0100 Subject: [PATCH 01/18] HDFStore: Fix empty result of keys() method on non-pandas hdf5 file An additional kind parameter has been added that defaults to pandas original behavior, but with 'tables' value gives you the list of non-pandas tables in the file --- pandas/io/pytables.py | 21 +++++++++++++++++++-- pandas/tests/io/pytables/test_store.py | 23 +++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 497b25d73df3e..94dab8da9afbe 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -580,16 +580,33 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): self.close() - def keys(self) -> List[str]: + def keys(self, kind='pandas') -> List[str]: """ Return a list of keys corresponding to objects stored in HDFStore. + Parameters + ---------- + kind : str, default 'pandas' + When kind equals 'pandas' return pandas objects + When kind equals 'table' return Tables + Otherwise fail with a ValueError + + Raises + ------ + raises ValueError if kind has an illegal value + Returns ------- list List of ABSOLUTE path-names (e.g. have the leading '/'). """ - return [n._v_pathname for n in self.groups()] + if kind == 'pandas': + return [n._v_pathname for n in self.groups()] + + if kind == 'tables': + self._check_if_open() + return [n._v_pathname for n in self._handle.walk_nodes('/', classname='Table')] + raise ValueError(f"kind should be either pandas' or 'table' but is {kind}") def __iter__(self): return iter(self.keys()) diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index fe59b989bab7e..d3dbe41d46ecb 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -341,6 +341,29 @@ def create_h5_and_return_checksum(track_times): # checksums are NOT same if track_time = True assert checksum_0_tt_true != checksum_1_tt_true + def test_non_pandas_keys(self, setup_path): + + class Table1(tables.IsDescription): + value1 = tables.Float32Col() + + class Table2(tables.IsDescription): + value2 = tables.Float32Col() + + class Table3(tables.IsDescription): + value3 = tables.Float32Col() + + with ensure_clean_path(setup_path) as path: + with tables.open_file(path, mode="w") as h5file: + group = h5file.create_group("/", "group") + h5file.create_table(group, "table1", Table1, "Table 1") + h5file.create_table(group, "table2", Table2, "Table 2") + h5file.create_table(group, "table3", Table3, "Table 3") + with HDFStore(path) as store: + assert len(store.keys(kind="tables")) == 3 + expected = {"/group/table1", "/group/table2", "/group/table3"} + assert set(store.keys(kind="tables")) == expected + assert set(store) == set() + def test_keys_ignore_hdf_softlink(self, setup_path): # GH 20523 From e023d119f9ed41b54515ef7598e6b65475654307 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 3 Mar 2020 00:13:57 +0100 Subject: [PATCH 02/18] Flake8 fixes --- pandas/io/pytables.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 94dab8da9afbe..26a6b8342373f 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -605,7 +605,8 @@ def keys(self, kind='pandas') -> List[str]: if kind == 'tables': self._check_if_open() - return [n._v_pathname for n in self._handle.walk_nodes('/', classname='Table')] + return [n._v_pathname + for n in self._handle.walk_nodes('/', classname='Table')] raise ValueError(f"kind should be either pandas' or 'table' but is {kind}") def __iter__(self): From efe00f6738f75c9cf5d76ee0428d470d7edd5e7f Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 3 Mar 2020 00:20:17 +0100 Subject: [PATCH 03/18] black reformatter --- pandas/io/pytables.py | 11 ++++++----- pandas/tests/io/pytables/test_store.py | 1 - 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 26a6b8342373f..c237b4eb853ca 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -580,7 +580,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): self.close() - def keys(self, kind='pandas') -> List[str]: + def keys(self, kind="pandas") -> List[str]: """ Return a list of keys corresponding to objects stored in HDFStore. @@ -600,13 +600,14 @@ def keys(self, kind='pandas') -> List[str]: list List of ABSOLUTE path-names (e.g. have the leading '/'). """ - if kind == 'pandas': + if kind == "pandas": return [n._v_pathname for n in self.groups()] - if kind == 'tables': + if kind == "tables": self._check_if_open() - return [n._v_pathname - for n in self._handle.walk_nodes('/', classname='Table')] + return [ + n._v_pathname for n in self._handle.walk_nodes("/", classname="Table") + ] raise ValueError(f"kind should be either pandas' or 'table' but is {kind}") def __iter__(self): diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index d3dbe41d46ecb..fa641a509a4dc 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -342,7 +342,6 @@ def create_h5_and_return_checksum(track_times): assert checksum_0_tt_true != checksum_1_tt_true def test_non_pandas_keys(self, setup_path): - class Table1(tables.IsDescription): value1 = tables.Float32Col() From df9c5364ba8ed9e9d9fcd63204e84c6812cb5dfe Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 3 Mar 2020 00:25:06 +0100 Subject: [PATCH 04/18] Add whatsnew entry --- doc/source/whatsnew/v1.1.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index 2a02041244362..6397b6204adaa 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -962,6 +962,7 @@ I/O - Bug in :meth:`~DataFrame.to_excel` could not handle the column name `render` and was raising an ``KeyError`` (:issue:`34331`) - Bug in :meth:`~SQLDatabase.execute` was raising a ``ProgrammingError`` for some DB-API drivers when the SQL statement contained the `%` character and no parameters were present (:issue:`34211`) - Bug in :meth:`~pandas.io.stata.StataReader` which resulted in categorical variables with difference dtypes when reading data using an iterator. (:issue:`31544`) +- :meth:`HDFStore.keys` has now an optional `kind` parameter that allows the retrieval of all native HDF5 table names (:issue:`29916`) Plotting ^^^^^^^^ From f7c9c32561cd32be007585f221627523c8fa93ed Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 3 Mar 2020 00:41:49 +0100 Subject: [PATCH 05/18] Correct the order of the keywords in the docstring --- pandas/io/pytables.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index c237b4eb853ca..ae461419be518 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -591,14 +591,14 @@ def keys(self, kind="pandas") -> List[str]: When kind equals 'table' return Tables Otherwise fail with a ValueError - Raises - ------ - raises ValueError if kind has an illegal value - Returns ------- list List of ABSOLUTE path-names (e.g. have the leading '/'). + + Raises + ------ + raises ValueError if kind has an illegal value """ if kind == "pandas": return [n._v_pathname for n in self.groups()] From 4f1ccd675e5b15046b6a4d39fde8c06251106d09 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 3 Mar 2020 21:50:21 +0100 Subject: [PATCH 06/18] Minor cleanups - improve type annotation of the HDFStore.keys method - minor improvement in ValueError string - minor improvement in doc-string --- pandas/io/pytables.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index ae461419be518..432c3fbe141a2 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -580,7 +580,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): self.close() - def keys(self, kind="pandas") -> List[str]: + def keys(self, kind: Optional[str] = "pandas") -> List[str]: """ Return a list of keys corresponding to objects stored in HDFStore. @@ -588,7 +588,7 @@ def keys(self, kind="pandas") -> List[str]: ---------- kind : str, default 'pandas' When kind equals 'pandas' return pandas objects - When kind equals 'table' return Tables + When kind equals 'table' return Table objects Otherwise fail with a ValueError Returns @@ -608,7 +608,7 @@ def keys(self, kind="pandas") -> List[str]: return [ n._v_pathname for n in self._handle.walk_nodes("/", classname="Table") ] - raise ValueError(f"kind should be either pandas' or 'table' but is {kind}") + raise ValueError(f"`kind` should be either 'pandas' or 'table' but is [{kind}]") def __iter__(self): return iter(self.keys()) From 64bb567160faea6c1d2bab36e978dddd1f49333c Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Wed, 4 Mar 2020 11:15:11 +0100 Subject: [PATCH 07/18] Make test code for the non-pandas case a bit more explicit --- pandas/tests/io/pytables/test_store.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index fa641a509a4dc..a110c49d3eea6 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -361,7 +361,7 @@ class Table3(tables.IsDescription): assert len(store.keys(kind="tables")) == 3 expected = {"/group/table1", "/group/table2", "/group/table3"} assert set(store.keys(kind="tables")) == expected - assert set(store) == set() + assert set(store.keys(kind="pandas")) == set() def test_keys_ignore_hdf_softlink(self, setup_path): From 5dbaa4c0d484136aa6e0d4fb8b224d24d1036353 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Sun, 15 Mar 2020 11:40:04 +0100 Subject: [PATCH 08/18] Changed new keyword parameter 'kind' to 'include' --- doc/source/whatsnew/v1.1.0.rst | 2 +- pandas/io/pytables.py | 16 +++++++++------- pandas/tests/io/pytables/test_store.py | 6 +++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index 6397b6204adaa..169bf17aa5759 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -962,7 +962,7 @@ I/O - Bug in :meth:`~DataFrame.to_excel` could not handle the column name `render` and was raising an ``KeyError`` (:issue:`34331`) - Bug in :meth:`~SQLDatabase.execute` was raising a ``ProgrammingError`` for some DB-API drivers when the SQL statement contained the `%` character and no parameters were present (:issue:`34211`) - Bug in :meth:`~pandas.io.stata.StataReader` which resulted in categorical variables with difference dtypes when reading data using an iterator. (:issue:`31544`) -- :meth:`HDFStore.keys` has now an optional `kind` parameter that allows the retrieval of all native HDF5 table names (:issue:`29916`) +- :meth:`HDFStore.keys` has now an optional `include` parameter that allows the retrieval of all native HDF5 table names (:issue:`29916`) Plotting ^^^^^^^^ diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 432c3fbe141a2..17a7d3abba1e3 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -580,15 +580,15 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): self.close() - def keys(self, kind: Optional[str] = "pandas") -> List[str]: + def keys(self, include: Optional[str] = "pandas") -> List[str]: """ Return a list of keys corresponding to objects stored in HDFStore. Parameters ---------- - kind : str, default 'pandas' + include : str, default 'pandas' When kind equals 'pandas' return pandas objects - When kind equals 'table' return Table objects + When kind equals 'native' return native HDF5 Table objects Otherwise fail with a ValueError Returns @@ -600,15 +600,17 @@ def keys(self, kind: Optional[str] = "pandas") -> List[str]: ------ raises ValueError if kind has an illegal value """ - if kind == "pandas": + if include == "pandas": return [n._v_pathname for n in self.groups()] - if kind == "tables": - self._check_if_open() + if include == "native": + assert self._handle is not None # mypy return [ n._v_pathname for n in self._handle.walk_nodes("/", classname="Table") ] - raise ValueError(f"`kind` should be either 'pandas' or 'table' but is [{kind}]") + raise ValueError( + f"`include` should be either 'pandas' or 'native' but is [{include}]" + ) def __iter__(self): return iter(self.keys()) diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index a110c49d3eea6..193ec54d6809a 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -358,10 +358,10 @@ class Table3(tables.IsDescription): h5file.create_table(group, "table2", Table2, "Table 2") h5file.create_table(group, "table3", Table3, "Table 3") with HDFStore(path) as store: - assert len(store.keys(kind="tables")) == 3 + assert len(store.keys(include="native")) == 3 expected = {"/group/table1", "/group/table2", "/group/table3"} - assert set(store.keys(kind="tables")) == expected - assert set(store.keys(kind="pandas")) == set() + assert set(store.keys(include="native")) == expected + assert set(store.keys(include="pandas")) == set() def test_keys_ignore_hdf_softlink(self, setup_path): From 69bd5b6fa0184a2bea28c4a46010fdbf0c43487f Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Sun, 15 Mar 2020 11:52:25 +0100 Subject: [PATCH 09/18] Add test to check the error path for an illegal `include` keyword parameter value --- pandas/io/pytables.py | 2 +- pandas/tests/io/pytables/test_store.py | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 17a7d3abba1e3..b9cfc9a38fc70 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -609,7 +609,7 @@ def keys(self, include: Optional[str] = "pandas") -> List[str]: n._v_pathname for n in self._handle.walk_nodes("/", classname="Table") ] raise ValueError( - f"`include` should be either 'pandas' or 'native' but is [{include}]" + f"`include` should be either 'pandas' or 'native' but is '{include}'" ) def __iter__(self): diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index 193ec54d6809a..313f8e54ab20a 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -363,6 +363,14 @@ class Table3(tables.IsDescription): assert set(store.keys(include="native")) == expected assert set(store.keys(include="pandas")) == set() + def test_keys_illegal_include_keyword_value(self, setup_path): + with ensure_clean_store(setup_path) as store: + with pytest.raises( + ValueError, + match="`include` should be either 'pandas' or 'native' but is 'illegal'", + ): + store.keys(include="illegal") + def test_keys_ignore_hdf_softlink(self, setup_path): # GH 20523 From c39fc764bf8e96a019186adccf3c9774e3780225 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Sun, 15 Mar 2020 14:34:37 +0100 Subject: [PATCH 10/18] Fix pylint error --- pandas/tests/io/pytables/test_store.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index 313f8e54ab20a..7aab36706f803 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -367,7 +367,8 @@ def test_keys_illegal_include_keyword_value(self, setup_path): with ensure_clean_store(setup_path) as store: with pytest.raises( ValueError, - match="`include` should be either 'pandas' or 'native' but is 'illegal'", + match="`include` should be either 'pandas' or 'native'" + " but is 'illegal'", ): store.keys(include="illegal") From b590f535ca801e0f82d65a3c3b164df6a8cc99b8 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 17 Mar 2020 22:02:29 +0100 Subject: [PATCH 11/18] Remove Optional from include parameter --- pandas/io/pytables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index b9cfc9a38fc70..6c26b86232ba8 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -580,7 +580,7 @@ def __enter__(self): def __exit__(self, exc_type, exc_value, traceback): self.close() - def keys(self, include: Optional[str] = "pandas") -> List[str]: + def keys(self, include: str = "pandas") -> List[str]: """ Return a list of keys corresponding to objects stored in HDFStore. From 91c81af6697e7b20ba603b668e7f85163f6158b2 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 17 Mar 2020 22:04:31 +0100 Subject: [PATCH 12/18] Add versionadded tag --- pandas/io/pytables.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 6c26b86232ba8..0bd555049da47 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -586,6 +586,9 @@ def keys(self, include: str = "pandas") -> List[str]: Parameters ---------- + + .. versionadded:: 1.1.0 + include : str, default 'pandas' When kind equals 'pandas' return pandas objects When kind equals 'native' return native HDF5 Table objects From fab73a7f9d3faf60663864050fb3a485bc8144fa Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 17 Mar 2020 22:10:38 +0100 Subject: [PATCH 13/18] Added .get to test --- pandas/tests/io/pytables/test_store.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index 7aab36706f803..928656a67cb9a 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -362,6 +362,9 @@ class Table3(tables.IsDescription): expected = {"/group/table1", "/group/table2", "/group/table3"} assert set(store.keys(include="native")) == expected assert set(store.keys(include="pandas")) == set() + for name in expected: + df = store.get(name) + assert len(df.columns) == 1 def test_keys_illegal_include_keyword_value(self, setup_path): with ensure_clean_store(setup_path) as store: From f1ce70913aa9fe45362be77e73e24a497627aaf8 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Wed, 18 Mar 2020 20:50:35 +0100 Subject: [PATCH 14/18] Fix versionadded tag 3rd try --- pandas/io/pytables.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index 0bd555049da47..d7d2376e9bacb 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -587,13 +587,14 @@ def keys(self, include: str = "pandas") -> List[str]: Parameters ---------- - .. versionadded:: 1.1.0 include : str, default 'pandas' When kind equals 'pandas' return pandas objects When kind equals 'native' return native HDF5 Table objects Otherwise fail with a ValueError + .. versionadded:: 1.1.0 + Returns ------- list From 4ef7b87665adba16b3487a5ae5798cc4bc156660 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Wed, 18 Mar 2020 21:51:15 +0100 Subject: [PATCH 15/18] Fix docstring empty lines --- pandas/io/pytables.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index d7d2376e9bacb..c0d852ddb62d3 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -587,7 +587,6 @@ def keys(self, include: str = "pandas") -> List[str]: Parameters ---------- - include : str, default 'pandas' When kind equals 'pandas' return pandas objects When kind equals 'native' return native HDF5 Table objects From 896962342d7cc64d105bb0798ab7ed34467045be Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Tue, 24 Mar 2020 22:22:48 +0100 Subject: [PATCH 16/18] Linting: Fix space at the start at the string --- pandas/tests/io/pytables/test_store.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/io/pytables/test_store.py b/pandas/tests/io/pytables/test_store.py index 928656a67cb9a..30b64b1750aa9 100644 --- a/pandas/tests/io/pytables/test_store.py +++ b/pandas/tests/io/pytables/test_store.py @@ -370,8 +370,8 @@ def test_keys_illegal_include_keyword_value(self, setup_path): with ensure_clean_store(setup_path) as store: with pytest.raises( ValueError, - match="`include` should be either 'pandas' or 'native'" - " but is 'illegal'", + match="`include` should be either 'pandas' or 'native' " + "but is 'illegal'", ): store.keys(include="illegal") From 51d632dcd664534463d715f8b3b286f4ba688a8f Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Sun, 14 Jun 2020 22:21:33 +0200 Subject: [PATCH 17/18] More idiomatic python --- pandas/io/pytables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index c0d852ddb62d3..fad69d707a095 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -606,7 +606,7 @@ def keys(self, include: str = "pandas") -> List[str]: if include == "pandas": return [n._v_pathname for n in self.groups()] - if include == "native": + elif include == "native": assert self._handle is not None # mypy return [ n._v_pathname for n in self._handle.walk_nodes("/", classname="Table") From 0f5dd68d810673fb2ba2c19e964831169e573a37 Mon Sep 17 00:00:00 2001 From: Robert de Vries Date: Sun, 14 Jun 2020 23:01:31 +0200 Subject: [PATCH 18/18] Remove "Otherwise fail with a ValueError" as requested --- pandas/io/pytables.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/io/pytables.py b/pandas/io/pytables.py index fad69d707a095..8aac8f9531512 100644 --- a/pandas/io/pytables.py +++ b/pandas/io/pytables.py @@ -590,7 +590,6 @@ def keys(self, include: str = "pandas") -> List[str]: include : str, default 'pandas' When kind equals 'pandas' return pandas objects When kind equals 'native' return native HDF5 Table objects - Otherwise fail with a ValueError .. versionadded:: 1.1.0