Skip to main content

Battery Feature Lab

Version Python License

Battery Feature Lab (BFL) is a Python framework for the analysis of battery time-series measurements and electrochemical impedance spectroscopy (EIS) data. It represents measurement conditions (Operation), observed and model-derived responses (Response), and changes across observations that meet explicit comparability criteria (Evolution).

The framework produces machine-readable analysis records with traceable source references, processing provenance, method configurations, quality diagnostics, and interpretation limits. Time-series and EIS measurements are processed through distinct analysis interfaces and output schemas. For EIS, the framework retains measured spectra, evaluates linear Kramers–Kronig consistency, and estimates equivalent-circuit parameters with explicit convergence diagnostics. Parameter uncertainty, stability, and identifiability remain unassessed in the current release; numerical fit quality alone does not establish a physical interpretation.

Outputs are provided as JSON and Parquet for downstream analytical workflows and evidence-informed data reuse.

How BFL is organised

BFL analyses measurements along three complementary, capability-gated dimensions. This diagram shows conceptual and data dependencies, not the compiler's execution order or a requirement that every dimension produce an applicable result. Metadata provides context, while evidence and validation make each result traceable and define its interpretation limits.

Battery Feature Lab organisation diagram

The editable Mermaid source is retained alongside the static SVG.

Raw files are standardized by Battery Data Standard (BDS). Existing formal Battery Data Format (BDF) artifacts may instead use the optional batterydf adapter. Both routes produce the same internal quantity names and retain their provider-native report; neither route silently falls back to the other after a provider error.

Quick start

Battery Feature Lab 0.6.0 supports Python 3.11 and 3.12.

python -m pip install "battery-feature-lab==0.6.0"

For EIS analysis, install the optional providers:

python -m pip install "battery-feature-lab[eis]==0.6.0"

Analyze a raw cycler export:

import bfl

result = bfl.analyze(
    "cell.xlsx",
    output_dir="bfl_outputs/cell",
    input_adapter="bds",
    nominal_capacity_ah=None,
    temperature_column=None,
)

for path in result.files:
    print(path)

Equivalent CLI:

bfl analyze cell.xlsx --output-dir bfl_outputs/cell --input-adapter bds

For native formal-BDF input, install "battery-feature-lab[bdf]==0.6.0" and use input_adapter="bdf". The optional OpenAI notebook client is available through "battery-feature-lab[ai]==0.6.0".

Output contract

Every successful run writes exactly six artifacts. The provider report filename depends on the selected input adapter.

normalized_data.bdf.parquet
bds_conversion_report.json       # BDS input
# or bdf_validation_report.json  # formal-BDF input
analysis_metadata.json
analysis_results.json
analysis_evidence.json
analysis_validation.json

Start with analysis_results.json. It is a compact index over Operation, Response, and Evolution. Resolve a record_id in analysis_evidence.json only when source intervals, full series, method parameters, references, or detailed quality evidence are needed.

Serialized provenance uses portable artifact filenames plus SHA-256 digests. Host-local absolute paths are never written to the public JSON contract; configuration.output_dir is represented as .. The AnalysisResult Python object still returns the actual runtime paths.

import json
from pathlib import Path

root = Path("bfl_outputs/cell")
summary = json.loads((root / "analysis_results.json").read_text(encoding="utf-8"))
evidence = json.loads((root / "analysis_evidence.json").read_text(encoding="utf-8"))

record_id = summary["dimensions"]["operation"][0]["record_id"]
record = next(item for item in evidence["records"] if item["record_id"] == record_id)

Progressive capability

BFL does not require every dataset to contain every battery channel.

Available measurements Analysis that can be added
time + current phase, current-shape mode, duration-weighted current exposure, Ah throughput, current-squared exposure
+ voltage power and energy, current-step response, paired capacity profiles, eligible pulse/ICA/DVA and cycle analyses
+ temperature thermal envelope, rest temperature response, temperature comparability gates
+ trustworthy cycle identity structurally gated cycle summaries and comparable-capacity evolution
+ nominal/reference capacity C-rate and grounded SOC-dependent provider paths where other gates also pass

Missing optional channels produce explicit not_computable metrics and not_invoked provider calls. BFL never creates a voltage channel, assumes a sampling rate, or promotes a filename token into cell metadata.

Scientific boundaries

  • Operation labels are limited to constant_current_like, constant_voltage_like, pulse_like, dynamic_current, and unmatched. BFL does not infer a named protocol.
  • Current-step delta-V/delta-I is an apparent terminal response, not intrinsic resistance or SOH.
  • Relaxation checkpoints are terminal-voltage recovery, not equilibrium OCV.
  • A capacity-aligned coordinate is not SOC unless an explicit reference establishes it.
  • Capacity evolution requires source or joined cycle identity, structural completeness, and a comparable operation signature. A short test does not support ageing or lifetime claims.
  • Metadata fields remain unknown when neither the preprocessing provider nor the caller supplies them.

Documentation

EIS

Install battery-feature-lab[eis]==0.6.0 and use bfl.analyze_eis() or bfl analyze-eis. The independent EIS path combines BDS-backed intake, explicit spectrum grouping, measurement conditions, Lin-KK consistency checks, eisfit 0.1.1 circuit fitting and condition-gated comparisons. It retains source rows, conversion operations, provider failures and interpretation limits in a modality-specific six-artifact contract.

See EIS analysis and evidence for the input declarations, comparison policy, dependency compatibility and output schemas.

Two worked examples are indexed in examples/README.md:

Source data comes from the cited CC BY 4.0 datasets and is intentionally not tracked here, nor are normalized time-series or spectrum arrays.

Development

git clone https://github.com/shiyunliu-battery/Battery-Feature-Lab.git
cd Battery-Feature-Lab
uv sync --python 3.12 --extra dev --extra ai --extra eis
uv run ruff check .
uv run pytest -q

Real-data validation instructions are kept in tests/data/real/README.md.

Citation

If Battery Feature Lab supports your work, please cite the software:

@software{liu_2026_battery_feature_lab,
  author  = {Liu, Shiyun},
  title   = {Battery Feature Lab},
  year    = {2026},
  version = {0.6.0},
  url     = {https://github.com/shiyunliu-battery/Battery-Feature-Lab},
  license = {MPL-2.0}
}

GitHub can also generate citation formats from CITATION.cff. The example datasets remain separately licensed under CC BY 4.0 and must retain their original citation and attribution: Catenaro–Onori and Zhang et al..

Metadata

Release files for battery-feature-lab 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for battery-feature-lab 0.6.0
File Size Uploaded
battery_feature_lab-0.6.0.tar.gz 141.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for battery-feature-lab 0.6.0
File Interpreter ABI Platform
battery_feature_lab-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 250.0 kB

Release files / battery_feature_lab-0.6.0.tar.gz

Download URL battery_feature_lab-0.6.0.tar.gz
Size 141.3 kB
Tags Source
SHA-256 checksum
How to use checksums
01c0c6e3adb71fd15916c965f6ecf65fdb0dfbffce3973fb30e0d1272a06919a
BLAKE2b-256 checksum
How to use checksums
003928ec5b08cdfd0ae9504ddab7e3b634ebc44fee0803217c01bbf45a903603
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / battery_feature_lab-0.6.0-py3-none-any.whl

Download URL battery_feature_lab-0.6.0-py3-none-any.whl
Size 108.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fe3cd9484fc45f739f154d208e603c105ecd6bec5450fef192f2ff2838fc6163
BLAKE2b-256 checksum
How to use checksums
5090e9e734f29eea2def8a96cc73df0d2b4053be18f8521461c12d7fb384a3e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release history Release notifications | RSS feed

0.7.1

2 release files

0.7.0

2 release files

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page