Repository: ROVI-org/battery-data-toolkit (language: python)

Issue:
Add Support for Storing EIS Data
Some of the dataset we are targeting from https://batterydata.energy.gov/ include EIS information


Discussion / hints:

Fix patch:
diff --git a/batdata/data.py b/batdata/data.py
index 55fef62..38b21e1 100644
--- a/batdata/data.py
+++ b/batdata/data.py
@@ -4,7 +4,7 @@
 import warnings
 from pathlib import Path
 from datetime import datetime
-from typing import Union, Optional, Collection, List, Dict
+from typing import Union, Optional, Collection, List, Dict, Type
 
 from pandas import HDFStore
 from pandas.io.common import stringify_path
@@ -16,8 +16,14 @@
 
 from batdata.schemas import BatteryMetadata
 from batdata.schemas.cycling import RawData, CycleLevelData, ColumnSchema
+from batdata.schemas.eis import EISData
 
-_subsets = ('raw_data', 'cycle_stats')
+_subsets: Dict[str, Type[ColumnSchema]] = {
+    'raw_data': RawData,
+    'cycle_stats': CycleLevelData,
+    'eis_data': EISData
+}
+"""Mapping between subset and schema"""
 
 logger = logging.getLogger(__name__)
 
@@ -53,12 +59,16 @@ class BatteryDataset:
     cycle_stats: Optional[pd.DataFrame] = None
     """Summary statistics of each cycle"""
 
+    eis_data: Optional[pd.DataFrame] = None
+    """Electrochemical Impedance Spectroscopy (EIS) data"""
+
     metadata: BatteryMetadata
     """Metadata for the battery construction and testing"""
 
     def __init__(self, metadata: Union[BatteryMetadata, dict] = None,
                  raw_data: Optional[pd.DataFrame] = None,
-                 cycle_stats: Optional[pd.DataFrame] = None):
+                 cycle_stats: Optional[pd.DataFrame] = None,
+                 eis_data: Optional[pd.DataFrame] = None):
         """
 
         Parameters
@@ -69,6 +79,8 @@ def __init__(self, metadata: Union[BatteryMetadata, dict] = None,
             Time-series data of the battery state
         cycle_stats: pd.DataFrame
             Summaries of each cycle
+        eis_data: pd.DataFrame
+            EIS data taken at multiple times
         """
         if metadata is None:
             metadata = {}
@@ -77,6 +89,7 @@ def __init__(self, metadata: Union[BatteryMetadata, dict] = None,
         self.metadata = BatteryMetadata(**metadata)
         self.raw_data = raw_data
         self.cycle_stats = cycle_stats
+        self.eis_data = eis_data
 
     def validate_columns(self, allow_extra_columns: bool = True):
         """Determine whether the column types are appropriate
@@ -91,10 +104,10 @@ def validate_columns(self, allow_extra_columns: bool = True):
         ValueError
             If the dataset fails validation
         """
-        if self.raw_data is not None:
-            RawData.validate_dataframe(self.raw_data, allow_extra_columns)
-        if self.cycle_stats is not None:
-            CycleLevelData.validate_dataframe(self.cycle_stats, allow_extra_columns)
+        for attr_name, schema in _subsets.items():
+            data = getattr(self, attr_name)
+            if data is not None:
+                schema.validate_dataframe(data, allow_extra_columns)
 
     def validate(self) -> List[str]:
         """Validate the data stored in this object
@@ -111,26 +124,20 @@ def validate(self) -> List[str]:
         self.validate_columns()
         output = []
 
-        # Mapping between subset and schema
-        _schemas = {
-            'raw_data': RawData,
-            'cycle_stats': CycleLevelData
-        }
-
         # Check whether there are undocumented columns
-        def _find_undefined_columns(data: pd.DataFrame, column_schema: ColumnSchema) -> List[str]:
+        def _find_undefined_columns(data: pd.DataFrame, column_schema: Type[ColumnSchema]) -> List[str]:
             """Get the list of columns which are not defined in the schema"""
 
-            cols = set(data.columns).difference(column_schema.__fields__)
+            cols = set(data.columns).difference(column_schema.model_fields)
             return list(cols)
 
-        for subset in _subsets:
-            data = getattr(self, subset)
-            defined_columns = getattr(self.metadata, f'{subset}_columns')
+        for attr_name, schema in _subsets.items():
+            data = getattr(self, attr_name)
+            defined_columns = getattr(self.metadata, f'{attr_name}_columns')
             if data is not None:
-                new_cols = _find_undefined_columns(data, _schemas[subset])
+                new_cols = _find_undefined_columns(data, schema)
                 undefined = set(new_cols).difference(defined_columns.keys())
-                output.extend([f'Undefined column, {u}, in {subset}. Add a description into metadata.{subset}_columns'
+                output.extend([f'Undefined column, {u}, in {attr_name}. Add a description into metadata.{attr_name}_columns'
                                for u in undefined])
 
         return output
@@ -164,12 +171,11 @@ def to_batdata_hdf(self, path_or_buf: Union[str, Path, HDFStore], complevel=0, c
 
         # Store the various datasets
         #  Note that we use the "table" format to allow for partial reads / querying
-        if self.raw_data is not None:
-            self.raw_data.to_hdf(path_or_buf, 'raw_data', complevel=complevel, complib=complib,
-                                 append=False, format='table', index=False)
-        if self.cycle_stats is not None:
-            self.cycle_stats.to_hdf(path_or_buf, 'cycle_stats', complevel=complevel, complib=complib,
-                                    append=False, format='table', index=False)
+        for subset in _subsets:
+            data = getattr(self, subset)
+            if data is not None:
+                self.raw_data.to_hdf(path_or_buf, subset, complevel=complevel, complib=complib,
+                                     append=False, format='table', index=False)
 
         # Create logic for adding metadata
         def add_metadata(f: HDFStore):
@@ -247,7 +253,12 @@ def to_batdata_dict(self) -> dict:
     def from_batdata_dict(cls, d):
         """Read battery data and metadata from a dictionary format"""
 
-        return cls(raw_data=pd.DataFrame(d['raw_data']), cycle_stats=pd.DataFrame(d['cycle_stats']), metadata=d['metadata'])
+        # Convert the keys to a dataframe
+        inputs = d.copy()
+        for k in _subsets:
+            if k in inputs:
+                inputs[k] = pd.DataFrame(d[k])
+        return cls(**inputs)
 
     def to_batdata_parquet(self, path: Union[Path, str], overwrite: bool = True) -> Dict[str, Path]:
         """Write battery data to a directory of Parquet files
diff --git a/batdata/extractors/batterydata.py b/batdata/extractors/batterydata.py
index 1e9f23a..f4c4320 100644
--- a/batdata/extractors/batterydata.py
+++ b/batdata/extractors/batterydata.py
@@ -109,6 +109,30 @@ def convert_summary_to_batdata(input_df: pd.DataFrame, store_all: bool) -> pd.Da
     return output
 
 
+def convert_eis_data_to_batdata(input_df: pd.DataFrame) -> pd.DataFrame:
+    """Rename the columns from an NREL-standard set of EIS data to our names and conventions
+
+    Args:
+        input_df: NREL-format raw data
+    Returns:
+        EIS data in batdata format
+    """
+
+    # Filter out the non-EIS data
+    input_df = input_df[~input_df['Frequency_Hz'].isnull()]
+
+    # Use the cycle index as a test index
+    output = pd.DataFrame()
+    output['test_id'] = input_df['Cycle_Index']
+
+    # Drop units off and make lower case
+    cols = ['Frequency_Hz', 'Z_Imag_Ohm', 'Z_Real_Ohm', 'Z_Mag_Ohm', 'Z_Phase_Degree']
+    for col in cols:
+        my_name = "_".join(col.lower().split("_")[:-1])
+        output[my_name] = input_df[col]
+    return output
+
+
 @dataclass
 class BDExtractor(BatteryDataExtractor):
     """Read data from the batterydata.energy.gov CSV format
@@ -139,7 +163,7 @@ def parse_to_dataframe(self, group: List[str],
             metadata = BatteryMetadata()
 
         # Process each file
-        raw_data = cycle_stats = None
+        raw_data = cycle_stats = eis_data = None
         for path in group:
             match = _fname_match.match(Path(path).name)
             if match is None:
@@ -154,11 +178,18 @@ def parse_to_dataframe(self, group: List[str],
             if data_type == 'summary':
                 cycle_stats = convert_summary_to_batdata(pd.read_csv(path), self.store_all)
             elif data_type == 'raw':
-                raw_data = convert_raw_signal_to_batdata(pd.read_csv(path), self.store_all)
+                nrel_data = pd.read_csv(path)
+                raw_data = convert_raw_signal_to_batdata(nrel_data, self.store_all)
+
+                # Get EIS data, if available
+                if not (nrel_data['Z_Imag_Ohm'].isna()).all():
+                    eis_data = convert_eis_data_to_batdata(nrel_data)
             else:
                 raise ValueError(f'Data type unrecognized: {data_type}')
 
-        return BatteryDataset(raw_data=raw_data, cycle_stats=cycle_stats, metadata=metadata)
+        # Separate out the EIS data, if possible
+
+        return BatteryDataset(raw_data=raw_data, cycle_stats=cycle_stats, eis_data=eis_data, metadata=metadata)
 
     def implementors(self) -> List[str]:
         return ['Logan Ward <lward@anl.gov>']
diff --git a/batdata/schemas/__init__.py b/batdata/schemas/__init__.py
index 2e82120..eb34ccd 100644
--- a/batdata/schemas/__init__.py
+++ b/batdata/schemas/__init__.py
@@ -42,3 +42,4 @@ class BatteryMetadata(BaseModel, extra=Extra.allow):
     # Description of additional columns
     raw_data_columns: Dict[str, str] = Field(default_factory=dict, description='Descriptions of non-standard columns in the raw data')
     cycle_stats_columns: Dict[str, str] = Field(default_factory=dict, description='Descriptions of non-standard columns in the cycle stats')
+    eis_data_columns: Dict[str, str] = Field(default_factory=dict, description='Descriptions of non-standard columns in the EIS data')
diff --git a/batdata/schemas/eis.py b/batdata/schemas/eis.py
index 97e5851..7577805 100644
--- a/batdata/schemas/eis.py
+++ b/batdata/schemas/eis.py
@@ -12,6 +12,7 @@
 class EISData(ColumnSchema):
     """Measurements for a specific EIS test"""
 
+    test_id: List[int] = Field(..., description='Integer used to identify rows belonging to the same experiment.')
     test_time: List[float] = Field(None, description="Time from the beginning of the cycling test. Times must be "
                                                      "nonnegative and monotonically increasing. Units: s",
                                    monotonic=True)
@@ -28,9 +29,11 @@ def validate_dataframe(cls, data: DataFrame, allow_extra_columns: bool = True):
         super().validate_dataframe(data, allow_extra_columns)
 
         # Ensure that the cartesian coordinates for the impedance agree with the magnitude
-        z_real_from_polar = np.multiply(data['z_mag'], np.cos(np.deg2rad(data['z_phase'])))
-        z_imag_from_polar = np.multiply(data['z_mag'], np.sin(np.deg2rad(data['z_phase'])))
-        if not np.isclose(z_real_from_polar, data['z_real'], rtol=0.01).all():
-            raise ValueError('Polar and cartesian forms of impedance disagree for real component')
-        if not np.isclose(z_imag_from_polar, data['z_imag'], rtol=0.01).all():
-            raise ValueError('Polar and cartesian forms of impedance disagree for imaginary component')
+        cart = {
+            'real': np.multiply(data['z_mag'], np.cos(np.deg2rad(data['z_phase']))),
+            'imag': np.multiply(data['z_mag'], np.sin(np.deg2rad(data['z_phase'])))
+        }
+        for k, values in cart.items():
+            largest_diff = (np.abs(values - data[f'z_{k}']) / np.clip(values, a_min=1e-6, a_max=None)).max()
+            if largest_diff > 0.01:
+                raise ValueError(f'Polar and cartesian forms of impedance disagree for {k} component. Largest difference: {largest_diff * 100:.1f}%')
diff --git a/notebooks/extract-from-batterydata.ipynb b/notebooks/extract-from-batterydata.ipynb
index 46a5cc3..ca53a7c 100644
--- a/notebooks/extract-from-batterydata.ipynb
+++ b/notebooks/extract-from-batterydata.ipynb
@@ -18,6 +18,8 @@
    "metadata": {},
    "outputs": [],
    "source": [
+    "%matplotlib inline\n",
+    "from matplotlib import pyplot as plt\n",
     "from batdata.extractors.batterydata import BDExtractor\n",
     "from pathlib import Path\n",
     "import pandas as pd"
@@ -567,16 +569,7 @@
    "execution_count": 7,
    "id": "2cfc6beb-3ab5-4560-b378-fa7c736c202b",
    "metadata": {},
-   "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/home/lward/Work/ROVI/battery-data-toolkit/batdata/extractors/batterydata.py:111: UserWarning: We do not yet support parsing cycle summary statistics\n",
-      "  warn('We do not yet support parsing cycle summary statistics')\n"
-     ]
-    }
-   ],
+   "outputs": [],
    "source": [
     "data = extractor.parse_to_dataframe(groups[0])"
    ]
@@ -616,7 +609,7 @@
        "  <thead>\n",
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
-       "      <th>cycle_index</th>\n",
+       "      <th>cycle_number</th>\n",
        "      <th>step_index</th>\n",
        "      <th>test_time</th>\n",
        "      <th>current</th>\n",
@@ -742,18 +735,18 @@
        "</div>"
       ],
       "text/plain": [
-       "      cycle_index  step_index  test_time  current   voltage  temperature  \\\n",
-       "0               0           0     0.0000     -0.0  3.276036      29.7005   \n",
-       "1               0           0     0.0167     -0.0  3.271916      29.7005   \n",
-       "2               0           0     0.0833     -0.0  3.272068      29.7005   \n",
-       "3               0           1     0.0835     -0.0  3.271458      29.7005   \n",
-       "4               0           1     0.1823     -0.0  3.271916      29.7166   \n",
-       "...           ...         ...        ...      ...       ...          ...   \n",
-       "1534            7         207  4873.8056     -0.0  3.298314      29.8776   \n",
-       "1535            7         207  4877.1390     -0.0  3.310979      29.9098   \n",
-       "1536            7         207  4880.4723     -0.0  3.319066      29.9259   \n",
-       "1537            7         207  4883.8056     -0.0  3.323949      29.8937   \n",
-       "1538            7         207  4885.1388     -0.0  3.326085      29.8615   \n",
+       "      cycle_number  step_index  test_time  current   voltage  temperature  \\\n",
+       "0                0           0     0.0000     -0.0  3.276036      29.7005   \n",
+       "1                0           0     0.0167     -0.0  3.271916      29.7005   \n",
+       "2                0           0     0.0833     -0.0  3.272068      29.7005   \n",
+       "3                0           1     0.0835     -0.0  3.271458      29.7005   \n",
+       "4                0           1     0.1823     -0.0  3.271916      29.7166   \n",
+       "...            ...         ...        ...      ...       ...          ...   \n",
+       "1534             7         207  4873.8056     -0.0  3.298314      29.8776   \n",
+       "1535             7         207  4877.1390     -0.0  3.310979      29.9098   \n",
+       "1536             7         207  4880.4723     -0.0  3.319066      29.9259   \n",
+       "1537             7         207  4883.8056     -0.0  3.323949      29.8937   \n",
+       "1538             7         207  4885.1388     -0.0  3.326085      29.8615   \n",
        "\n",
        "              time  \n",
        "0     1.578066e+09  \n",
@@ -804,14 +797,6 @@
    "id": "67cc9560-9c27-4e6c-a904-204dc6457243",
    "metadata": {},
    "outputs": [
-    {
-     "name": "stderr",
-     "output_type": "stream",
-     "text": [
-      "/home/lward/Work/ROVI/battery-data-toolkit/batdata/extractors/batterydata.py:111: UserWarning: We do not yet support parsing cycle summary statistics\n",
-      "  warn('We do not yet support parsing cycle summary statistics')\n"
-     ]
-    },
     {
      "data": {
       "text/html": [
@@ -833,7 +818,7 @@
        "  <thead>\n",
        "    <tr style=\"text-align: right;\">\n",
        "      <th></th>\n",
-       "      <th>cycle_index</th>\n",
+       "      <th>cycle_number</th>\n",
        "      <th>step_index</th>\n",
        "      <th>test_time</th>\n",
        "      <th>current</th>\n",
@@ -1127,18 +1112,18 @@
        "</div>"
       ],
       "text/plain": [
-       "      cycle_index  step_index  test_time  current   voltage  temperature  \\\n",
-       "0               0           0     0.0000     -0.0  3.276036      29.7005   \n",
-       "1               0           0     0.0167     -0.0  3.271916      29.7005   \n",
-       "2               0           0     0.0833     -0.0  3.272068      29.7005   \n",
-       "3               0           1     0.0835     -0.0  3.271458      29.7005   \n",
-       "4               0           1     0.1823     -0.0  3.271916      29.7166   \n",
-       "...           ...         ...        ...      ...       ...          ...   \n",
-       "1534            7         207  4873.8056     -0.0  3.298314      29.8776   \n",
-       "1535            7         207  4877.1390     -0.0  3.310979      29.9098   \n",
-       "1536            7         207  4880.4723     -0.0  3.319066      29.9259   \n",
-       "1537            7         207  4883.8056     -0.0  3.323949      29.8937   \n",
-       "1538            7         207  4885.1388     -0.0  3.326085      29.8615   \n",
+       "      cycle_number  step_index  test_time  current   voltage  temperature  \\\n",
+       "0                0           0     0.0000     -0.0  3.276036      29.7005   \n",
+       "1                0           0     0.0167     -0.0  3.271916      29.7005   \n",
+       "2                0           0     0.0833     -0.0  3.272068      29.7005   \n",
+       "3                0           1     0.0835     -0.0  3.271458      29.7005   \n",
+       "4                0           1     0.1823     -0.0  3.271916      29.7166   \n",
+       "...            ...         ...        ...      ...       ...          ...   \n",
+       "1534             7         207  4873.8056     -0.0  3.298314      29.8776   \n",
+       "1535             7         207  4877.1390     -0.0  3.310979      29.9098   \n",
+       "1536             7         207  4880.4723     -0.0  3.319066      29.9259   \n",
+       "1537             7         207  4883.8056     -0.0  3.323949      29.8937   \n",
+       "1538             7         207  4885.1388     -0.0  3.326085      29.8615   \n",
        "\n",
        "              time  Amphr  Watthr    Temp2  ...  Z_Phase_Degree  Z_Real_Ohm  \\\n",
        "0     1.578066e+09    0.0     0.0  29.5556  ...             NaN         NaN   \n",
@@ -1201,13 +1186,718 @@
     }
    ],
    "source": [
-    "extractor.parse_to_dataframe(groups[0]).raw_data"
+    "dataset = extractor.parse_to_dataframe(groups[0])\n",
+    "dataset.raw_data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8871e377-2d26-4766-8ded-721197f5738a",
+   "metadata": {},
+   "source": [
+    "## Available Data\n",
+    "The BatteryData datasets hold many types of data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "9dc5d1e7-59b7-4ef5-9a52-52d7084b634a",
+   "metadata": {},
+   "source": [
+    "### Time Series Data\n",
+    "The time-series measurements from equipment are stored in the `raw_data` subset of a BatteryDataset."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "eecdb799-0f72-4f50-9116-fa7964ae01dc",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Text(0, 0.5, 'Current (A)')"
+      ]
+     },
+     "execution_count": 11,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 350x250 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fig, ax = plt.subplots(figsize=(3.5, 2.5))\n",
+    "\n",
+    "ax.plot(dataset.raw_data['test_time'] / 3600, dataset.raw_data['current'])\n",
+    "\n",
+    "ax.set_xlabel('Time (hr)')\n",
+    "ax.set_ylabel('Current (A)')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "82751b3c-c926-4125-83f7-4c95da8e29d8",
+   "metadata": {},
+   "source": [
+    "### Cycle-Level Summaries\n",
+    "The summaries of individual cycles are held within the `cycle_stats` subset."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "2a90cd2f-bcc9-4b7c-a6be-b605f7d9b85c",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>cycle_number</th>\n",
+       "      <th>charge_capacity</th>\n",
+       "      <th>charge_energy</th>\n",
+       "      <th>discharge_capacity</th>\n",
+       "      <th>discharge_energy</th>\n",
+       "      <th>coulomb_efficiency</th>\n",
+       "      <th>energy_efficiency</th>\n",
+       "      <th>cycle_start</th>\n",
+       "      <th>cycle_duration</th>\n",
+       "      <th>temperature_minimum</th>\n",
+       "      <th>...</th>\n",
+       "      <th>deltaV</th>\n",
+       "      <th>V_min</th>\n",
+       "      <th>V_max</th>\n",
+       "      <th>V_avg</th>\n",
+       "      <th>I_min</th>\n",
+       "      <th>I_max</th>\n",
+       "      <th>I_avg</th>\n",
+       "      <th>P_min</th>\n",
+       "      <th>P_max</th>\n",
+       "      <th>P_avg</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>1</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>0.000720</td>\n",
+       "      <td>6.288250e-07</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>0.0000</td>\n",
+       "      <td>105.9975</td>\n",
+       "      <td>29.7005</td>\n",
+       "      <td>...</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>3.000000</td>\n",
+       "      <td>3.276036</td>\n",
+       "      <td>3.087111</td>\n",
+       "      <td>-0.000950</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>-0.000406</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.003100</td>\n",
+       "      <td>0.001277</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>2</td>\n",
+       "      <td>0.021870</td>\n",
+       "      <td>2.244311e-05</td>\n",
+       "      <td>0.021738</td>\n",
+       "      <td>2.213862e-05</td>\n",
+       "      <td>0.993967</td>\n",
+       "      <td>0.986433</td>\n",
+       "      <td>105.9990</td>\n",
+       "      <td>2814.2438</td>\n",
+       "      <td>29.5877</td>\n",
+       "      <td>...</td>\n",
+       "      <td>1.000000</td>\n",
+       "      <td>3.000000</td>\n",
+       "      <td>4.100023</td>\n",
+       "      <td>3.689191</td>\n",
+       "      <td>-0.000950</td>\n",
+       "      <td>0.000950</td>\n",
+       "      <td>0.000003</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.003895</td>\n",
+       "      <td>0.003421</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>3</td>\n",
+       "      <td>0.010646</td>\n",
+       "      <td>1.058890e-05</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>2920.2430</td>\n",
+       "      <td>153.6278</td>\n",
+       "      <td>29.7166</td>\n",
+       "      <td>...</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>3.001373</td>\n",
+       "      <td>3.699931</td>\n",
+       "      <td>3.399835</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0.019007</td>\n",
+       "      <td>0.004138</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.070289</td>\n",
+       "      <td>0.014826</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>4</td>\n",
+       "      <td>0.019642</td>\n",
+       "      <td>2.055925e-05</td>\n",
+       "      <td>0.019621</td>\n",
+       "      <td>1.994205e-05</td>\n",
+       "      <td>0.998904</td>\n",
+       "      <td>0.969979</td>\n",
+       "      <td>3073.8708</td>\n",
+       "      <td>352.7943</td>\n",
+       "      <td>29.6522</td>\n",
+       "      <td>...</td>\n",
+       "      <td>4.464986</td>\n",
+       "      <td>3.000000</td>\n",
+       "      <td>4.102312</td>\n",
+       "      <td>3.827341</td>\n",
+       "      <td>-0.019009</td>\n",
+       "      <td>0.019071</td>\n",
+       "      <td>0.001882</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.078182</td>\n",
+       "      <td>0.031994</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>5</td>\n",
+       "      <td>0.000252</td>\n",
+       "      <td>2.719361e-07</td>\n",
+       "      <td>0.001900</td>\n",
+       "      <td>2.108697e-06</td>\n",
+       "      <td>7.526143</td>\n",
+       "      <td>7.754385</td>\n",
+       "      <td>3426.6666</td>\n",
+       "      <td>667.1559</td>\n",
+       "      <td>29.7005</td>\n",
+       "      <td>...</td>\n",
+       "      <td>7.569865</td>\n",
+       "      <td>3.305943</td>\n",
+       "      <td>4.091020</td>\n",
+       "      <td>3.688296</td>\n",
+       "      <td>-0.095132</td>\n",
+       "      <td>0.071259</td>\n",
+       "      <td>-0.001706</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.380704</td>\n",
+       "      <td>0.007371</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>...</th>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>262</th>\n",
+       "      <td>263</td>\n",
+       "      <td>0.009736</td>\n",
+       "      <td>9.671078e-06</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>69037.2753</td>\n",
+       "      <td>150.7518</td>\n",
+       "      <td>29.7166</td>\n",
+       "      <td>...</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>3.001526</td>\n",
+       "      <td>3.699931</td>\n",
+       "      <td>3.397119</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0.019009</td>\n",
+       "      <td>0.003854</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.070332</td>\n",
+       "      <td>0.013793</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>263</th>\n",
+       "      <td>264</td>\n",
+       "      <td>0.019131</td>\n",
+       "      <td>2.002848e-05</td>\n",
+       "      <td>0.019136</td>\n",
+       "      <td>1.930878e-05</td>\n",
+       "      <td>1.000247</td>\n",
+       "      <td>0.964066</td>\n",
+       "      <td>69188.0271</td>\n",
+       "      <td>354.4178</td>\n",
+       "      <td>29.6522</td>\n",
+       "      <td>...</td>\n",
+       "      <td>10.844046</td>\n",
+       "      <td>3.000000</td>\n",
+       "      <td>4.102007</td>\n",
+       "      <td>3.818107</td>\n",
+       "      <td>-0.019009</td>\n",
+       "      <td>0.019066</td>\n",
+       "      <td>0.001852</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.078163</td>\n",
+       "      <td>0.031082</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>264</th>\n",
+       "      <td>265</td>\n",
+       "      <td>0.000252</td>\n",
+       "      <td>2.691667e-07</td>\n",
+       "      <td>0.001900</td>\n",
+       "      <td>2.098678e-06</td>\n",
+       "      <td>7.534161</td>\n",
+       "      <td>7.796945</td>\n",
+       "      <td>69542.4464</td>\n",
+       "      <td>667.1817</td>\n",
+       "      <td>29.6038</td>\n",
+       "      <td>...</td>\n",
+       "      <td>5.478893</td>\n",
+       "      <td>3.147402</td>\n",
+       "      <td>4.084611</td>\n",
+       "      <td>3.664467</td>\n",
+       "      <td>-0.095006</td>\n",
+       "      <td>0.071257</td>\n",
+       "      <td>-0.001706</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.378002</td>\n",
+       "      <td>0.007313</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>265</th>\n",
+       "      <td>266</td>\n",
+       "      <td>0.008734</td>\n",
+       "      <td>8.746306e-06</td>\n",
+       "      <td>0.000640</td>\n",
+       "      <td>5.692556e-07</td>\n",
+       "      <td>0.073314</td>\n",
+       "      <td>0.065085</td>\n",
+       "      <td>70209.6289</td>\n",
+       "      <td>149.6217</td>\n",
+       "      <td>29.7166</td>\n",
+       "      <td>...</td>\n",
+       "      <td>16.566845</td>\n",
+       "      <td>3.000000</td>\n",
+       "      <td>3.699931</td>\n",
+       "      <td>3.504700</td>\n",
+       "      <td>-0.019007</td>\n",
+       "      <td>0.019002</td>\n",
+       "      <td>0.003193</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.070298</td>\n",
+       "      <td>0.013204</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>266</th>\n",
+       "      <td>267</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>70363.6606</td>\n",
+       "      <td>569.7500</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>...</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>-3.790300</td>\n",
+       "      <td>-3.790300</td>\n",
+       "      <td>-3.790300</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>0.000000</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>267 rows × 39 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "     cycle_number  charge_capacity  charge_energy  discharge_capacity  \\\n",
+       "0               1              NaN            NaN            0.000720   \n",
+       "1               2         0.021870   2.244311e-05            0.021738   \n",
+       "2               3         0.010646   1.058890e-05                 NaN   \n",
+       "3               4         0.019642   2.055925e-05            0.019621   \n",
+       "4               5         0.000252   2.719361e-07            0.001900   \n",
+       "..            ...              ...            ...                 ...   \n",
+       "262           263         0.009736   9.671078e-06                 NaN   \n",
+       "263           264         0.019131   2.002848e-05            0.019136   \n",
+       "264           265         0.000252   2.691667e-07            0.001900   \n",
+       "265           266         0.008734   8.746306e-06            0.000640   \n",
+       "266           267              NaN            NaN                 NaN   \n",
+       "\n",
+       "     discharge_energy  coulomb_efficiency  energy_efficiency  cycle_start  \\\n",
+       "0        6.288250e-07                 NaN                NaN       0.0000   \n",
+       "1        2.213862e-05            0.993967           0.986433     105.9990   \n",
+       "2                 NaN                 NaN                NaN    2920.2430   \n",
+       "3        1.994205e-05            0.998904           0.969979    3073.8708   \n",
+       "4        2.108697e-06            7.526143           7.754385    3426.6666   \n",
+       "..                ...                 ...                ...          ...   \n",
+       "262               NaN                 NaN                NaN   69037.2753   \n",
+       "263      1.930878e-05            1.000247           0.964066   69188.0271   \n",
+       "264      2.098678e-06            7.534161           7.796945   69542.4464   \n",
+       "265      5.692556e-07            0.073314           0.065085   70209.6289   \n",
+       "266               NaN                 NaN                NaN   70363.6606   \n",
+       "\n",
+       "     cycle_duration  temperature_minimum  ...     deltaV     V_min     V_max  \\\n",
+       "0          105.9975              29.7005  ...        NaN  3.000000  3.276036   \n",
+       "1         2814.2438              29.5877  ...   1.000000  3.000000  4.100023   \n",
+       "2          153.6278              29.7166  ...        NaN  3.001373  3.699931   \n",
+       "3          352.7943              29.6522  ...   4.464986  3.000000  4.102312   \n",
+       "4          667.1559              29.7005  ...   7.569865  3.305943  4.091020   \n",
+       "..              ...                  ...  ...        ...       ...       ...   \n",
+       "262        150.7518              29.7166  ...        NaN  3.001526  3.699931   \n",
+       "263        354.4178              29.6522  ...  10.844046  3.000000  4.102007   \n",
+       "264        667.1817              29.6038  ...   5.478893  3.147402  4.084611   \n",
+       "265        149.6217              29.7166  ...  16.566845  3.000000  3.699931   \n",
+       "266        569.7500                  NaN  ...        NaN -3.790300 -3.790300   \n",
+       "\n",
+       "        V_avg     I_min     I_max     I_avg  P_min     P_max     P_avg  \n",
+       "0    3.087111 -0.000950  0.000000 -0.000406      0  0.003100  0.001277  \n",
+       "1    3.689191 -0.000950  0.000950  0.000003      0  0.003895  0.003421  \n",
+       "2    3.399835  0.000000  0.019007  0.004138      0  0.070289  0.014826  \n",
+       "3    3.827341 -0.019009  0.019071  0.001882      0  0.078182  0.031994  \n",
+       "4    3.688296 -0.095132  0.071259 -0.001706      0  0.380704  0.007371  \n",
+       "..        ...       ...       ...       ...    ...       ...       ...  \n",
+       "262  3.397119  0.000000  0.019009  0.003854      0  0.070332  0.013793  \n",
+       "263  3.818107 -0.019009  0.019066  0.001852      0  0.078163  0.031082  \n",
+       "264  3.664467 -0.095006  0.071257 -0.001706      0  0.378002  0.007313  \n",
+       "265  3.504700 -0.019007  0.019002  0.003193      0  0.070298  0.013204  \n",
+       "266 -3.790300  0.000000  0.000000  0.000000      0  0.000000  0.000000  \n",
+       "\n",
+       "[267 rows x 39 columns]"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "dataset.cycle_stats"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "1c3d76e7-acab-4a0f-b9d9-d0f54b7acd14",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Text(0, 0.5, 'Discharge Cap (A)')"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 350x250 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fig, ax = plt.subplots(figsize=(3.5, 2.5))\n",
+    "\n",
+    "# BatteryData denotes cycle types, such \"Aging Cycles\"\n",
+    "#  `Cycle_Label` is not standardized under the battery-data-toolkit schemas, but you can still use it\n",
+    "aging_cycles = dataset.cycle_stats.query('Cycle_Label==\"Aging cycle\"')\n",
+    "\n",
+    "ax.plot(aging_cycles['cycle_number'], aging_cycles['discharge_capacity'], '--o')\n",
+    "\n",
+    "ax.set_xlabel('Cycle')\n",
+    "ax.set_ylabel('Discharge Cap (A)')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "0f9cddc2-ffe5-4382-be23-a2212a246548",
+   "metadata": {},
+   "source": [
+    "### EIS Data\n",
+    "Data from EIS are stored within the `raw_data` signal in the BatteryData files. Battery Data Toolkit separates that data into a separate dataframe.\n",
+    "\n",
+    "Each EIS measurement series is dentoed with a different `test_id`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "48c90d40-7dc0-4442-97ce-842fc777adcf",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>test_id</th>\n",
+       "      <th>frequency</th>\n",
+       "      <th>z_imag</th>\n",
+       "      <th>z_real</th>\n",
+       "      <th>z_mag</th>\n",
+       "      <th>z_phase</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>1262</th>\n",
+       "      <td>7</td>\n",
+       "      <td>500000.00000</td>\n",
+       "      <td>0.43070</td>\n",
+       "      <td>0.24102</td>\n",
+       "      <td>0.493552</td>\n",
+       "      <td>60.768595</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1263</th>\n",
+       "      <td>7</td>\n",
+       "      <td>397164.10000</td>\n",
+       "      <td>0.32711</td>\n",
+       "      <td>0.23778</td>\n",
+       "      <td>0.404401</td>\n",
+       "      <td>53.986168</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1264</th>\n",
+       "      <td>7</td>\n",
+       "      <td>315478.70000</td>\n",
+       "      <td>0.24811</td>\n",
+       "      <td>0.23707</td>\n",
+       "      <td>0.343163</td>\n",
+       "      <td>46.303509</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1265</th>\n",
+       "      <td>7</td>\n",
+       "      <td>250593.60000</td>\n",
+       "      <td>0.18190</td>\n",
+       "      <td>0.23611</td>\n",
+       "      <td>0.298053</td>\n",
+       "      <td>37.610787</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1266</th>\n",
+       "      <td>7</td>\n",
+       "      <td>199053.60000</td>\n",
+       "      <td>0.12598</td>\n",
+       "      <td>0.23687</td>\n",
+       "      <td>0.268288</td>\n",
+       "      <td>28.006409</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>...</th>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1335</th>\n",
+       "      <td>7</td>\n",
+       "      <td>0.02506</td>\n",
+       "      <td>-0.40551</td>\n",
+       "      <td>1.08970</td>\n",
+       "      <td>1.162706</td>\n",
+       "      <td>-20.411741</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1336</th>\n",
+       "      <td>7</td>\n",
+       "      <td>0.01991</td>\n",
+       "      <td>-0.47431</td>\n",
+       "      <td>1.12080</td>\n",
+       "      <td>1.217030</td>\n",
+       "      <td>-22.937537</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1337</th>\n",
+       "      <td>7</td>\n",
+       "      <td>0.01581</td>\n",
+       "      <td>-0.55345</td>\n",
+       "      <td>1.16910</td>\n",
+       "      <td>1.293484</td>\n",
+       "      <td>-25.332797</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1338</th>\n",
+       "      <td>7</td>\n",
+       "      <td>0.01256</td>\n",
+       "      <td>-0.64018</td>\n",
+       "      <td>1.22860</td>\n",
+       "      <td>1.385384</td>\n",
+       "      <td>-27.522426</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1339</th>\n",
+       "      <td>7</td>\n",
+       "      <td>0.01000</td>\n",
+       "      <td>-0.73228</td>\n",
+       "      <td>1.29520</td>\n",
+       "      <td>1.487877</td>\n",
+       "      <td>-29.482944</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>78 rows × 6 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "      test_id     frequency   z_imag   z_real     z_mag    z_phase\n",
+       "1262        7  500000.00000  0.43070  0.24102  0.493552  60.768595\n",
+       "1263        7  397164.10000  0.32711  0.23778  0.404401  53.986168\n",
+       "1264        7  315478.70000  0.24811  0.23707  0.343163  46.303509\n",
+       "1265        7  250593.60000  0.18190  0.23611  0.298053  37.610787\n",
+       "1266        7  199053.60000  0.12598  0.23687  0.268288  28.006409\n",
+       "...       ...           ...      ...      ...       ...        ...\n",
+       "1335        7       0.02506 -0.40551  1.08970  1.162706 -20.411741\n",
+       "1336        7       0.01991 -0.47431  1.12080  1.217030 -22.937537\n",
+       "1337        7       0.01581 -0.55345  1.16910  1.293484 -25.332797\n",
+       "1338        7       0.01256 -0.64018  1.22860  1.385384 -27.522426\n",
+       "1339        7       0.01000 -0.73228  1.29520  1.487877 -29.482944\n",
+       "\n",
+       "[78 rows x 6 columns]"
+      ]
+     },
+     "execution_count": 14,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "dataset.eis_data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "id": "9dcfc689-3cef-4b33-ad9f-42a483bb4a5f",
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Text(0, 0.5, 'Z, imag (Ohm)')"
+      ]
+     },
+     "execution_count": 15,
+     "metadata": {},
+     "output_type": "execute_result"
+    },
+    {
+     "data": {
+      "image/png": "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",
+      "text/plain": [
+       "<Figure size 350x250 with 1 Axes>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fig, ax = plt.subplots(figsize=(3.5, 2.5))\n",
+    "\n",
+    "ax.plot(\n",
+    "    dataset.eis_data['z_real'],\n",
+    "    dataset.eis_data['z_imag']\n",
+    ")\n",
+    "\n",
+    "ax.set_xlabel('Z, real (Ohm)')\n",
+    "ax.set_ylabel('Z, imag (Ohm)')"
    ]
   },
   {
    "cell_type": "code",
    "execution_count": null,
-   "id": "ea4b0a28-5231-4238-b065-357ba2cf9e0c",
+   "id": "5e264f51-3024-4676-8fa8-90cb845f829c",
    "metadata": {},
    "outputs": [],
    "source": []


Test patch:
diff --git a/tests/schemas/test_eis.py b/tests/schemas/test_eis.py
index 11f5ffe..c372651 100644
--- a/tests/schemas/test_eis.py
+++ b/tests/schemas/test_eis.py
@@ -8,6 +8,7 @@
 @fixture()
 def example_df() -> pd.DataFrame:
     output = pd.DataFrame({
+        'test_id': [1, 1],
         'frequency': [5e5, 4e5],
         'z_real': [0.241, 0.237],
         'z_imag': [0.431, 0.327],
@@ -25,7 +26,7 @@ def test_consistency(example_df):
     example_df['z_imag'] *= 2
     with raises(ValueError) as e:
         EISData.validate_dataframe(example_df)
-    assert 'imaginary' in str(e.value)
+    assert 'imag' in str(e.value)
 
     example_df['z_real'] *= 2
     with raises(ValueError) as e: