battery-data-standard 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- battery_data_standard-0.1.0/CHANGELOG.md +21 -0
- battery_data_standard-0.1.0/LICENSE +21 -0
- battery_data_standard-0.1.0/MANIFEST.in +18 -0
- battery_data_standard-0.1.0/NOTICE.md +6 -0
- battery_data_standard-0.1.0/PKG-INFO +291 -0
- battery_data_standard-0.1.0/README.md +241 -0
- battery_data_standard-0.1.0/SECURITY.md +22 -0
- battery_data_standard-0.1.0/docs/api-reference.md +295 -0
- battery_data_standard-0.1.0/docs/export-template.md +91 -0
- battery_data_standard-0.1.0/docs/index.md +10 -0
- battery_data_standard-0.1.0/docs/schema-compatibility.md +55 -0
- battery_data_standard-0.1.0/docs/supported-formats.md +71 -0
- battery_data_standard-0.1.0/pyproject.toml +93 -0
- battery_data_standard-0.1.0/setup.cfg +4 -0
- battery_data_standard-0.1.0/src/battery_data_standard/__init__.py +62 -0
- battery_data_standard-0.1.0/src/battery_data_standard/__main__.py +5 -0
- battery_data_standard-0.1.0/src/battery_data_standard/_version.py +3 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/__init__.py +5 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/arbin.py +77 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/base.py +122 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/basytec.py +87 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/biologic.py +254 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/generic.py +39 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/landt.py +35 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/maccor.py +107 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/neware.py +1739 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/normalization.py +668 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/novonix.py +28 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/registry.py +143 -0
- battery_data_standard-0.1.0/src/battery_data_standard/adapters/simple.py +23 -0
- battery_data_standard-0.1.0/src/battery_data_standard/api.py +706 -0
- battery_data_standard-0.1.0/src/battery_data_standard/archive.py +224 -0
- battery_data_standard-0.1.0/src/battery_data_standard/cli.py +244 -0
- battery_data_standard-0.1.0/src/battery_data_standard/eis.py +330 -0
- battery_data_standard-0.1.0/src/battery_data_standard/exceptions.py +45 -0
- battery_data_standard-0.1.0/src/battery_data_standard/export.py +203 -0
- battery_data_standard-0.1.0/src/battery_data_standard/io.py +885 -0
- battery_data_standard-0.1.0/src/battery_data_standard/kind.py +262 -0
- battery_data_standard-0.1.0/src/battery_data_standard/profiles.py +83 -0
- battery_data_standard-0.1.0/src/battery_data_standard/py.typed +1 -0
- battery_data_standard-0.1.0/src/battery_data_standard/reports.py +124 -0
- battery_data_standard-0.1.0/src/battery_data_standard/schema.py +418 -0
- battery_data_standard-0.1.0/src/battery_data_standard/summary.py +69 -0
- battery_data_standard-0.1.0/src/battery_data_standard/validation.py +111 -0
- battery_data_standard-0.1.0/src/battery_data_standard.egg-info/PKG-INFO +291 -0
- battery_data_standard-0.1.0/src/battery_data_standard.egg-info/SOURCES.txt +50 -0
- battery_data_standard-0.1.0/src/battery_data_standard.egg-info/dependency_links.txt +1 -0
- battery_data_standard-0.1.0/src/battery_data_standard.egg-info/entry_points.txt +2 -0
- battery_data_standard-0.1.0/src/battery_data_standard.egg-info/requires.txt +30 -0
- battery_data_standard-0.1.0/src/battery_data_standard.egg-info/top_level.txt +2 -0
- battery_data_standard-0.1.0/src/bds/__init__.py +5 -0
- battery_data_standard-0.1.0/src/bds/py.typed +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.0 - 2026-05-01
|
|
4
|
+
|
|
5
|
+
- Published the initial public package for BDF-oriented battery cycler data conversion.
|
|
6
|
+
- Added the `battery_data_standard` Python package and the `bds` import alias.
|
|
7
|
+
- Added the `bds` command-line interface for format detection, conversion, validation,
|
|
8
|
+
schema inspection, and batch processing.
|
|
9
|
+
- Added adapters for NEWARE, Arbin, Maccor, BioLogic, Novonix, BaSyTec, LANDT,
|
|
10
|
+
and generic tabular exports.
|
|
11
|
+
- Added support for CSV, text, Excel, MATLAB, and Parquet input families where
|
|
12
|
+
time, voltage, and current data can be mapped to the standard schema.
|
|
13
|
+
- Added standardized BDF-style time-series outputs with validation reports,
|
|
14
|
+
column provenance, source metadata, and optional sidecar reports.
|
|
15
|
+
- Added EIS detection, reading, conversion, and validation entry points.
|
|
16
|
+
- Added archive-aware batch conversion with JSONL manifests for directories and
|
|
17
|
+
supported archive files.
|
|
18
|
+
- Added step-level and cycle-level summary helpers for normalized time-series
|
|
19
|
+
data.
|
|
20
|
+
- Set the normalized current convention to charge-positive and discharge-negative
|
|
21
|
+
by default.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Battery Data Standard contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
include README.md
|
|
2
|
+
include LICENSE
|
|
3
|
+
include NOTICE.md
|
|
4
|
+
include CHANGELOG.md
|
|
5
|
+
include SECURITY.md
|
|
6
|
+
exclude CONTRIBUTING.md
|
|
7
|
+
include docs/index.md
|
|
8
|
+
include docs/api-reference.md
|
|
9
|
+
include docs/supported-formats.md
|
|
10
|
+
include docs/export-template.md
|
|
11
|
+
include docs/schema-compatibility.md
|
|
12
|
+
recursive-include src/battery_data_standard py.typed
|
|
13
|
+
recursive-include src/bds py.typed
|
|
14
|
+
prune tests
|
|
15
|
+
prune tools
|
|
16
|
+
global-exclude __pycache__
|
|
17
|
+
global-exclude *.py[cod]
|
|
18
|
+
global-exclude .DS_Store
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Notices
|
|
2
|
+
|
|
3
|
+
Battery Data Standard targets a BDF-oriented tabular output schema inspired by
|
|
4
|
+
the Battery Data Format project from the Battery Data Alliance. This project is
|
|
5
|
+
not an official Battery Data Alliance project and is not certified by the
|
|
6
|
+
Battery Data Alliance.
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: battery-data-standard
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: BDF-first converters for battery cycler data.
|
|
5
|
+
Author: Battery Data Standard contributors
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Repository, https://github.com/shiyunliu-battery/battery-data-standard
|
|
8
|
+
Project-URL: Issues, https://github.com/shiyunliu-battery/battery-data-standard/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/shiyunliu-battery/battery-data-standard/blob/main/CHANGELOG.md
|
|
10
|
+
Project-URL: Documentation, https://github.com/shiyunliu-battery/battery-data-standard#readme
|
|
11
|
+
Keywords: battery,cycler,BDF,data-conversion,neware,arbin
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Scientific/Engineering
|
|
19
|
+
Classifier: Typing :: Typed
|
|
20
|
+
Requires-Python: >=3.12
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: polars>=0.20
|
|
24
|
+
Requires-Dist: pandas>=2.0
|
|
25
|
+
Requires-Dist: openpyxl>=3.1
|
|
26
|
+
Requires-Dist: xlrd>=2.0
|
|
27
|
+
Provides-Extra: yaml
|
|
28
|
+
Requires-Dist: PyYAML>=6.0; extra == "yaml"
|
|
29
|
+
Provides-Extra: matlab
|
|
30
|
+
Requires-Dist: scipy>=1.10; extra == "matlab"
|
|
31
|
+
Requires-Dist: h5py>=3.8; extra == "matlab"
|
|
32
|
+
Provides-Extra: test
|
|
33
|
+
Requires-Dist: pytest>=8.0; extra == "test"
|
|
34
|
+
Requires-Dist: pytest-cov>=5.0; extra == "test"
|
|
35
|
+
Requires-Dist: PyYAML>=6.0; extra == "test"
|
|
36
|
+
Requires-Dist: scipy>=1.10; extra == "test"
|
|
37
|
+
Requires-Dist: h5py>=3.8; extra == "test"
|
|
38
|
+
Provides-Extra: dev
|
|
39
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
40
|
+
Requires-Dist: twine>=5.0; extra == "dev"
|
|
41
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
42
|
+
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
43
|
+
Requires-Dist: PyYAML>=6.0; extra == "dev"
|
|
44
|
+
Requires-Dist: scipy>=1.10; extra == "dev"
|
|
45
|
+
Requires-Dist: h5py>=3.8; extra == "dev"
|
|
46
|
+
Requires-Dist: ruff>=0.8; extra == "dev"
|
|
47
|
+
Requires-Dist: mypy>=1.0; extra == "dev"
|
|
48
|
+
Requires-Dist: pip-audit>=2.7; extra == "dev"
|
|
49
|
+
Dynamic: license-file
|
|
50
|
+
|
|
51
|
+
# Battery Data Standard
|
|
52
|
+
|
|
53
|
+
`battery-data-standard` is a Python library and command-line tool for converting
|
|
54
|
+
battery cycler exports into a consistent BDF-style tabular representation. It is
|
|
55
|
+
intended for laboratories, battery test teams, and data pipelines that need a
|
|
56
|
+
repeatable path from vendor files to analysis-ready CSV or Parquet outputs.
|
|
57
|
+
|
|
58
|
+
The package is vendor-neutral. It is not certified by any cycler vendor or by
|
|
59
|
+
the Battery Data Alliance. Adapter support describes behavior implemented and
|
|
60
|
+
validated by this project; users should verify representative exports from their
|
|
61
|
+
own cycler software before using the package in automated production workflows.
|
|
62
|
+
|
|
63
|
+
## Installation
|
|
64
|
+
|
|
65
|
+
Python 3.12 or newer is required.
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
pip install battery-data-standard
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Optional extras are available for additional input formats:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install "battery-data-standard[yaml]"
|
|
75
|
+
pip install "battery-data-standard[matlab]"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The package installs the `bds` command and exposes both the full package name
|
|
79
|
+
and a short import alias:
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
import battery_data_standard as bds
|
|
83
|
+
# or
|
|
84
|
+
import bds
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Scope
|
|
88
|
+
|
|
89
|
+
The package provides:
|
|
90
|
+
|
|
91
|
+
- conversion of supported battery cycler time-series exports to BDF-style CSV or
|
|
92
|
+
Parquet files;
|
|
93
|
+
- conversion of supported EIS tables to a standardized EIS table;
|
|
94
|
+
- cycler detection, data-kind detection, validation, conversion reports, and
|
|
95
|
+
batch manifests;
|
|
96
|
+
- archive-aware batch conversion for directories, zip archives, and tar
|
|
97
|
+
archives;
|
|
98
|
+
- optional profile files for lab-specific column naming.
|
|
99
|
+
|
|
100
|
+
The package does not upload source data to an external service. It reads local
|
|
101
|
+
files and writes local outputs.
|
|
102
|
+
|
|
103
|
+
## Command-Line Usage
|
|
104
|
+
|
|
105
|
+
Inspect the installed version:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
bds --version
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Detect a cycler export:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
bds detect raw_export.csv
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Convert a time-series file:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
bds convert raw_export.csv normalized.bdf.csv --cycler auto --report report.json
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Validate a converted file:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
bds validate normalized.bdf.csv
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Convert a directory or archive and write a JSONL manifest:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
bds batch raw_exports normalized_exports --recursive --manifest manifest.jsonl
|
|
133
|
+
bds batch raw_exports.zip normalized_exports --manifest manifest.jsonl
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Inspect runtime adapter metadata and the pinned schema:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
bds formats
|
|
140
|
+
bds inspect-schema
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Python API
|
|
144
|
+
|
|
145
|
+
Read a supported time-series export into a Polars dataframe:
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
import bds
|
|
149
|
+
|
|
150
|
+
df = bds.read("raw_export.csv", cycler="auto")
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Use an explicit cycler when the source format is known:
|
|
154
|
+
|
|
155
|
+
```python
|
|
156
|
+
df = bds.read("arbin_export.csv", cycler="arbin")
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Convert a file and keep the conversion report:
|
|
160
|
+
|
|
161
|
+
```python
|
|
162
|
+
report = bds.convert(
|
|
163
|
+
"raw_export.csv",
|
|
164
|
+
"normalized.bdf.csv",
|
|
165
|
+
cycler="auto",
|
|
166
|
+
report_path="report.json",
|
|
167
|
+
)
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Read data and report information in memory:
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
df, report = bds.read_with_report("raw_export.csv", cycler="auto", strict=False)
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Create step-level or cycle-level summaries from a normalized dataframe:
|
|
177
|
+
|
|
178
|
+
```python
|
|
179
|
+
steps = bds.summarize_steps(df)
|
|
180
|
+
cycles = bds.summarize_cycles(df)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Output Model
|
|
184
|
+
|
|
185
|
+
The converter standardizes supported cycler exports into a time-series table.
|
|
186
|
+
Every successful BDF time-series conversion must contain three required fields:
|
|
187
|
+
|
|
188
|
+
| Field | Unit | Description |
|
|
189
|
+
| --- | --- | --- |
|
|
190
|
+
| `Test Time / s` | s | Elapsed time from the start of the test. |
|
|
191
|
+
| `Voltage / V` | V | Measured cell or channel voltage. |
|
|
192
|
+
| `Current / A` | A | Measured current. |
|
|
193
|
+
|
|
194
|
+
Additional fields, such as cycle number, step number, capacity, energy,
|
|
195
|
+
temperature, power, and internal resistance, are included when they are available
|
|
196
|
+
in the source file.
|
|
197
|
+
|
|
198
|
+
The internal dataframe uses canonical BDF-style labels. Exported CSV and Parquet
|
|
199
|
+
files use easier-to-read labels, for example `Test Time (s)`, `Voltage (V)`, and
|
|
200
|
+
`Current (A)`.
|
|
201
|
+
|
|
202
|
+
## Supported Format Families
|
|
203
|
+
|
|
204
|
+
The package includes adapters for NEWARE, Arbin, Maccor, BioLogic, Novonix,
|
|
205
|
+
BaSyTec, LANDT, and generic tabular exports. Generic readers support delimited
|
|
206
|
+
text, Excel, MATLAB, and Parquet inputs where the file contains or can be mapped
|
|
207
|
+
to time, voltage, and current columns.
|
|
208
|
+
|
|
209
|
+
BioLogic `.mpt` text exports are supported. Binary BioLogic `.mpr` files are not
|
|
210
|
+
supported; export `.mpt` text files from EC-Lab before conversion.
|
|
211
|
+
|
|
212
|
+
See [docs/supported-formats.md](docs/supported-formats.md) for adapter scope and
|
|
213
|
+
support-tier definitions.
|
|
214
|
+
|
|
215
|
+
## EIS Data
|
|
216
|
+
|
|
217
|
+
EIS files use a separate standardized table from row-wise BDF time-series data.
|
|
218
|
+
Use EIS-specific commands or API functions for known impedance files:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
bds detect-kind impedance.csv
|
|
222
|
+
bds convert-eis impedance.csv normalized.eis.csv
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
```python
|
|
226
|
+
eis = bds.read_eis("impedance.csv")
|
|
227
|
+
report = bds.convert_eis("impedance.csv", "normalized.eis.csv")
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`read()` and `convert()` are time-series entry points. `batch` and
|
|
231
|
+
`batch_convert()` can route mixed directories and archives that contain
|
|
232
|
+
time-series files, EIS files, and unsupported helper files.
|
|
233
|
+
|
|
234
|
+
## Profiles
|
|
235
|
+
|
|
236
|
+
Profiles map lab-specific column names to canonical column names. JSON profiles
|
|
237
|
+
are supported by the base installation. YAML profiles require the `yaml` extra.
|
|
238
|
+
|
|
239
|
+
```json
|
|
240
|
+
{
|
|
241
|
+
"columns": {
|
|
242
|
+
"Test Time / s": "time_seconds",
|
|
243
|
+
"Voltage / V": "cell_voltage",
|
|
244
|
+
"Current / A": "cell_current"
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Use a profile from the CLI:
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
bds convert lab_export.csv normalized.bdf.csv --cycler generic --profile profile.json
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## Current Sign Convention
|
|
256
|
+
|
|
257
|
+
The default current convention is charge-positive and discharge-negative.
|
|
258
|
+
|
|
259
|
+
Use `--current-sign preserve` to retain the source sign convention, or
|
|
260
|
+
`--current-sign discharge-positive` when a downstream workflow requires
|
|
261
|
+
discharge-positive current. When a source file contains a recognizable
|
|
262
|
+
charge/discharge status column, adapters use it to normalize current sign more
|
|
263
|
+
explicitly.
|
|
264
|
+
|
|
265
|
+
## Validation and Reports
|
|
266
|
+
|
|
267
|
+
Every conversion returns or writes a machine-readable report with schema version,
|
|
268
|
+
row count, columns, validation status, warnings, provenance, adapter metadata,
|
|
269
|
+
and repair operations.
|
|
270
|
+
|
|
271
|
+
Strict validation is enabled by default. Repairable issues are reported with the
|
|
272
|
+
default `repair_policy="warn"`. Use `repair_policy="repair"` or
|
|
273
|
+
`--repair-policy repair` only when the pipeline explicitly accepts the documented
|
|
274
|
+
normalizations.
|
|
275
|
+
|
|
276
|
+
## Documentation
|
|
277
|
+
|
|
278
|
+
Public documentation is in the `docs` directory:
|
|
279
|
+
|
|
280
|
+
- [Python API reference](docs/api-reference.md)
|
|
281
|
+
- [Supported formats](docs/supported-formats.md)
|
|
282
|
+
- [Export template](docs/export-template.md)
|
|
283
|
+
- [Schema compatibility](docs/schema-compatibility.md)
|
|
284
|
+
|
|
285
|
+
## License and Attribution
|
|
286
|
+
|
|
287
|
+
This project is distributed under the MIT License.
|
|
288
|
+
|
|
289
|
+
The package targets a BDF-oriented output schema inspired by the Battery Data
|
|
290
|
+
Format project from the Battery Data Alliance. This project is not an official
|
|
291
|
+
Battery Data Alliance project and is not certified by the Battery Data Alliance.
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# Battery Data Standard
|
|
2
|
+
|
|
3
|
+
`battery-data-standard` is a Python library and command-line tool for converting
|
|
4
|
+
battery cycler exports into a consistent BDF-style tabular representation. It is
|
|
5
|
+
intended for laboratories, battery test teams, and data pipelines that need a
|
|
6
|
+
repeatable path from vendor files to analysis-ready CSV or Parquet outputs.
|
|
7
|
+
|
|
8
|
+
The package is vendor-neutral. It is not certified by any cycler vendor or by
|
|
9
|
+
the Battery Data Alliance. Adapter support describes behavior implemented and
|
|
10
|
+
validated by this project; users should verify representative exports from their
|
|
11
|
+
own cycler software before using the package in automated production workflows.
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
Python 3.12 or newer is required.
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
pip install battery-data-standard
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Optional extras are available for additional input formats:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pip install "battery-data-standard[yaml]"
|
|
25
|
+
pip install "battery-data-standard[matlab]"
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The package installs the `bds` command and exposes both the full package name
|
|
29
|
+
and a short import alias:
|
|
30
|
+
|
|
31
|
+
```python
|
|
32
|
+
import battery_data_standard as bds
|
|
33
|
+
# or
|
|
34
|
+
import bds
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Scope
|
|
38
|
+
|
|
39
|
+
The package provides:
|
|
40
|
+
|
|
41
|
+
- conversion of supported battery cycler time-series exports to BDF-style CSV or
|
|
42
|
+
Parquet files;
|
|
43
|
+
- conversion of supported EIS tables to a standardized EIS table;
|
|
44
|
+
- cycler detection, data-kind detection, validation, conversion reports, and
|
|
45
|
+
batch manifests;
|
|
46
|
+
- archive-aware batch conversion for directories, zip archives, and tar
|
|
47
|
+
archives;
|
|
48
|
+
- optional profile files for lab-specific column naming.
|
|
49
|
+
|
|
50
|
+
The package does not upload source data to an external service. It reads local
|
|
51
|
+
files and writes local outputs.
|
|
52
|
+
|
|
53
|
+
## Command-Line Usage
|
|
54
|
+
|
|
55
|
+
Inspect the installed version:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
bds --version
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Detect a cycler export:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
bds detect raw_export.csv
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Convert a time-series file:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
bds convert raw_export.csv normalized.bdf.csv --cycler auto --report report.json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Validate a converted file:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
bds validate normalized.bdf.csv
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Convert a directory or archive and write a JSONL manifest:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
bds batch raw_exports normalized_exports --recursive --manifest manifest.jsonl
|
|
83
|
+
bds batch raw_exports.zip normalized_exports --manifest manifest.jsonl
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Inspect runtime adapter metadata and the pinned schema:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
bds formats
|
|
90
|
+
bds inspect-schema
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Python API
|
|
94
|
+
|
|
95
|
+
Read a supported time-series export into a Polars dataframe:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
import bds
|
|
99
|
+
|
|
100
|
+
df = bds.read("raw_export.csv", cycler="auto")
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use an explicit cycler when the source format is known:
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
df = bds.read("arbin_export.csv", cycler="arbin")
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Convert a file and keep the conversion report:
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
report = bds.convert(
|
|
113
|
+
"raw_export.csv",
|
|
114
|
+
"normalized.bdf.csv",
|
|
115
|
+
cycler="auto",
|
|
116
|
+
report_path="report.json",
|
|
117
|
+
)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Read data and report information in memory:
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
df, report = bds.read_with_report("raw_export.csv", cycler="auto", strict=False)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Create step-level or cycle-level summaries from a normalized dataframe:
|
|
127
|
+
|
|
128
|
+
```python
|
|
129
|
+
steps = bds.summarize_steps(df)
|
|
130
|
+
cycles = bds.summarize_cycles(df)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Output Model
|
|
134
|
+
|
|
135
|
+
The converter standardizes supported cycler exports into a time-series table.
|
|
136
|
+
Every successful BDF time-series conversion must contain three required fields:
|
|
137
|
+
|
|
138
|
+
| Field | Unit | Description |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| `Test Time / s` | s | Elapsed time from the start of the test. |
|
|
141
|
+
| `Voltage / V` | V | Measured cell or channel voltage. |
|
|
142
|
+
| `Current / A` | A | Measured current. |
|
|
143
|
+
|
|
144
|
+
Additional fields, such as cycle number, step number, capacity, energy,
|
|
145
|
+
temperature, power, and internal resistance, are included when they are available
|
|
146
|
+
in the source file.
|
|
147
|
+
|
|
148
|
+
The internal dataframe uses canonical BDF-style labels. Exported CSV and Parquet
|
|
149
|
+
files use easier-to-read labels, for example `Test Time (s)`, `Voltage (V)`, and
|
|
150
|
+
`Current (A)`.
|
|
151
|
+
|
|
152
|
+
## Supported Format Families
|
|
153
|
+
|
|
154
|
+
The package includes adapters for NEWARE, Arbin, Maccor, BioLogic, Novonix,
|
|
155
|
+
BaSyTec, LANDT, and generic tabular exports. Generic readers support delimited
|
|
156
|
+
text, Excel, MATLAB, and Parquet inputs where the file contains or can be mapped
|
|
157
|
+
to time, voltage, and current columns.
|
|
158
|
+
|
|
159
|
+
BioLogic `.mpt` text exports are supported. Binary BioLogic `.mpr` files are not
|
|
160
|
+
supported; export `.mpt` text files from EC-Lab before conversion.
|
|
161
|
+
|
|
162
|
+
See [docs/supported-formats.md](docs/supported-formats.md) for adapter scope and
|
|
163
|
+
support-tier definitions.
|
|
164
|
+
|
|
165
|
+
## EIS Data
|
|
166
|
+
|
|
167
|
+
EIS files use a separate standardized table from row-wise BDF time-series data.
|
|
168
|
+
Use EIS-specific commands or API functions for known impedance files:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
bds detect-kind impedance.csv
|
|
172
|
+
bds convert-eis impedance.csv normalized.eis.csv
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
eis = bds.read_eis("impedance.csv")
|
|
177
|
+
report = bds.convert_eis("impedance.csv", "normalized.eis.csv")
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
`read()` and `convert()` are time-series entry points. `batch` and
|
|
181
|
+
`batch_convert()` can route mixed directories and archives that contain
|
|
182
|
+
time-series files, EIS files, and unsupported helper files.
|
|
183
|
+
|
|
184
|
+
## Profiles
|
|
185
|
+
|
|
186
|
+
Profiles map lab-specific column names to canonical column names. JSON profiles
|
|
187
|
+
are supported by the base installation. YAML profiles require the `yaml` extra.
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"columns": {
|
|
192
|
+
"Test Time / s": "time_seconds",
|
|
193
|
+
"Voltage / V": "cell_voltage",
|
|
194
|
+
"Current / A": "cell_current"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Use a profile from the CLI:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
bds convert lab_export.csv normalized.bdf.csv --cycler generic --profile profile.json
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Current Sign Convention
|
|
206
|
+
|
|
207
|
+
The default current convention is charge-positive and discharge-negative.
|
|
208
|
+
|
|
209
|
+
Use `--current-sign preserve` to retain the source sign convention, or
|
|
210
|
+
`--current-sign discharge-positive` when a downstream workflow requires
|
|
211
|
+
discharge-positive current. When a source file contains a recognizable
|
|
212
|
+
charge/discharge status column, adapters use it to normalize current sign more
|
|
213
|
+
explicitly.
|
|
214
|
+
|
|
215
|
+
## Validation and Reports
|
|
216
|
+
|
|
217
|
+
Every conversion returns or writes a machine-readable report with schema version,
|
|
218
|
+
row count, columns, validation status, warnings, provenance, adapter metadata,
|
|
219
|
+
and repair operations.
|
|
220
|
+
|
|
221
|
+
Strict validation is enabled by default. Repairable issues are reported with the
|
|
222
|
+
default `repair_policy="warn"`. Use `repair_policy="repair"` or
|
|
223
|
+
`--repair-policy repair` only when the pipeline explicitly accepts the documented
|
|
224
|
+
normalizations.
|
|
225
|
+
|
|
226
|
+
## Documentation
|
|
227
|
+
|
|
228
|
+
Public documentation is in the `docs` directory:
|
|
229
|
+
|
|
230
|
+
- [Python API reference](docs/api-reference.md)
|
|
231
|
+
- [Supported formats](docs/supported-formats.md)
|
|
232
|
+
- [Export template](docs/export-template.md)
|
|
233
|
+
- [Schema compatibility](docs/schema-compatibility.md)
|
|
234
|
+
|
|
235
|
+
## License and Attribution
|
|
236
|
+
|
|
237
|
+
This project is distributed under the MIT License.
|
|
238
|
+
|
|
239
|
+
The package targets a BDF-oriented output schema inspired by the Battery Data
|
|
240
|
+
Format project from the Battery Data Alliance. This project is not an official
|
|
241
|
+
Battery Data Alliance project and is not certified by the Battery Data Alliance.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
Security fixes are applied to the latest released version of `battery-data-standard`.
|
|
6
|
+
This project is currently pre-1.0 beta software, so users deploying it in automated
|
|
7
|
+
pipelines should pin versions and test upgrades before rollout.
|
|
8
|
+
|
|
9
|
+
## Reporting a Vulnerability
|
|
10
|
+
|
|
11
|
+
Please report suspected vulnerabilities privately by opening a GitHub security
|
|
12
|
+
advisory in the project repository. Do not include sensitive data, proprietary
|
|
13
|
+
cycler exports, credentials, or personally identifiable information in public
|
|
14
|
+
issues.
|
|
15
|
+
|
|
16
|
+
Include:
|
|
17
|
+
|
|
18
|
+
- affected package version;
|
|
19
|
+
- Python version and operating system;
|
|
20
|
+
- input format involved;
|
|
21
|
+
- minimal reproduction steps using synthetic or anonymized data;
|
|
22
|
+
- expected and observed impact.
|