From 7d268fc74db727fd931619e5e5bc089e6fedf6fb Mon Sep 17 00:00:00 2001 From: Ingmar Schoegl Date: Fri, 10 Jul 2020 14:46:32 -0500 Subject: [PATCH 1/5] [thermo] Enable import of previously exported str column from CSV files Implementation based on a suggestion by Bryan W. Weber --- interfaces/cython/cantera/composite.py | 27 +++++++++++++------ .../cython/cantera/test/test_composite.py | 10 +++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/interfaces/cython/cantera/composite.py b/interfaces/cython/cantera/composite.py index f1172f9180a..6724fb3a2ed 100644 --- a/interfaces/cython/cantera/composite.py +++ b/interfaces/cython/cantera/composite.py @@ -4,6 +4,7 @@ from ._cantera import * import numpy as np from collections import OrderedDict +from distutils import version import csv as _csv import pkg_resources @@ -955,14 +956,24 @@ def read_csv(self, filename): using `restore_data`. This method allows for recreation of data previously exported by `write_csv`. """ - # read data block and header separately - data = np.genfromtxt(filename, skip_header=1, delimiter=',') - labels = np.genfromtxt(filename, max_rows=1, delimiter=',', dtype=str) - - data_dict = OrderedDict() - for i, label in enumerate(labels): - data_dict[label] = data[:, i] - + if version.LooseVersion(np.__version__) < version.LooseVersion("1.14"): + # bytestring needs to be converted for columns containing strings + data = np.genfromtxt(filename, delimiter=',', + dtype=None, names=True) + data_dict = OrderedDict() + for label in data.dtype.names: + if data[label].dtype.type == np.bytes_: + dtype = '{}'.format(data[label].dtype) + dtype = dtype.replace('S', 'U').replace('|', '<') + data_dict[label] = data[label].astype(dtype) + else: + data_dict[label] = data[label] + else: + # the 'encoding' parameter introduced with NumPy 1.14 simplifies import + data = np.genfromtxt(filename, delimiter=',', + dtype=None, names=True, encoding=None) + data_dict = OrderedDict({label: data[label] + for label in data.dtype.names}) self.restore_data(data_dict) def to_pandas(self, cols=None, *args, **kwargs): diff --git a/interfaces/cython/cantera/test/test_composite.py b/interfaces/cython/cantera/test/test_composite.py index fa75296afef..3c53f7c5586 100644 --- a/interfaces/cython/cantera/test/test_composite.py +++ b/interfaces/cython/cantera/test/test_composite.py @@ -160,6 +160,16 @@ def test_write_csv(self): self.assertTrue(np.allclose(states.P, b.P)) self.assertTrue(np.allclose(states.X, b.X)) + def test_write_csv_str_column(self): + states = ct.SolutionArray(self.gas, 3, extra={'spam': 'eggs'}) + + outfile = pjoin(self.test_work_dir, 'solutionarray.csv') + states.write_csv(outfile) + + b = ct.SolutionArray(self.gas, extra={'spam'}) + b.read_csv(outfile) + self.assertTrue((states.spam == b.spam).all) + @utilities.unittest.skipIf(isinstance(_pandas, ImportError), "pandas is not installed") def test_to_pandas(self): From d00a821ff81b32f6e9fa479fa99099d78c3408e1 Mon Sep 17 00:00:00 2001 From: Ingmar Schoegl Date: Fri, 10 Jul 2020 16:06:52 -0500 Subject: [PATCH 2/5] [thermo] Enable export/import of str columns to/from HDF files --- interfaces/cython/cantera/composite.py | 21 +++++++++++++------ .../cython/cantera/test/test_composite.py | 13 +++++++++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/interfaces/cython/cantera/composite.py b/interfaces/cython/cantera/composite.py index 6724fb3a2ed..a74f75f257c 100644 --- a/interfaces/cython/cantera/composite.py +++ b/interfaces/cython/cantera/composite.py @@ -963,8 +963,7 @@ def read_csv(self, filename): data_dict = OrderedDict() for label in data.dtype.names: if data[label].dtype.type == np.bytes_: - dtype = '{}'.format(data[label].dtype) - dtype = dtype.replace('S', 'U').replace('|', '<') + dtype = ' Date: Fri, 10 Jul 2020 16:39:16 -0500 Subject: [PATCH 3/5] [thermo] Enable phase_of_matter output for SolutionArray --- interfaces/cython/cantera/composite.py | 7 +++++++ interfaces/cython/cantera/test/test_thermo.py | 10 ++++++++++ 2 files changed, 17 insertions(+) diff --git a/interfaces/cython/cantera/composite.py b/interfaces/cython/cantera/composite.py index a74f75f257c..c6325d98d2a 100644 --- a/interfaces/cython/cantera/composite.py +++ b/interfaces/cython/cantera/composite.py @@ -448,6 +448,7 @@ class SolutionArray: # From Transport 'viscosity', 'electrical_conductivity', 'thermal_conductivity', ] + _strings = ['phase_of_matter'] _n_species = [ # from ThermoPhase 'Y', 'X', 'concentrations', 'partial_molar_enthalpies', @@ -1326,6 +1327,9 @@ def _make_functions(): def empty_scalar(self): return np.empty(self._shape) + def empty_strings(self): + return np.empty(self._shape, dtype=' Date: Tue, 4 Aug 2020 10:08:46 -0500 Subject: [PATCH 4/5] [thermo] Streamline I/O support of string columns Address review comments --- interfaces/cython/cantera/composite.py | 13 ++++++------- interfaces/cython/cantera/test/test_thermo.py | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/interfaces/cython/cantera/composite.py b/interfaces/cython/cantera/composite.py index c6325d98d2a..6cb0f2c1072 100644 --- a/interfaces/cython/cantera/composite.py +++ b/interfaces/cython/cantera/composite.py @@ -4,7 +4,6 @@ from ._cantera import * import numpy as np from collections import OrderedDict -from distutils import version import csv as _csv import pkg_resources @@ -957,14 +956,14 @@ def read_csv(self, filename): using `restore_data`. This method allows for recreation of data previously exported by `write_csv`. """ - if version.LooseVersion(np.__version__) < version.LooseVersion("1.14"): + if np.lib.NumpyVersion(np.__version__) < "1.14.0": # bytestring needs to be converted for columns containing strings data = np.genfromtxt(filename, delimiter=',', dtype=None, names=True) data_dict = OrderedDict() for label in data.dtype.names: if data[label].dtype.type == np.bytes_: - dtype = ' Date: Thu, 6 Aug 2020 18:06:14 -0500 Subject: [PATCH 5/5] [thermo] Add comment for maximum length of strings in SolutionArray The length of strings assigned by built-in SolutionArray methods is limited to 50 characters. --- interfaces/cython/cantera/composite.py | 14 +++++++------- interfaces/cython/cantera/test/test_composite.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/interfaces/cython/cantera/composite.py b/interfaces/cython/cantera/composite.py index 6cb0f2c1072..b614bf67cc9 100644 --- a/interfaces/cython/cantera/composite.py +++ b/interfaces/cython/cantera/composite.py @@ -963,8 +963,7 @@ def read_csv(self, filename): data_dict = OrderedDict() for label in data.dtype.names: if data[label].dtype.type == np.bytes_: - dtype = '