File size: 1,689 Bytes
536ba3d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from __future__ import annotations

import numpy as np
import pandas as pd

from src.data import features as feat


def test_compute_soc_and_soh():
    df = pd.DataFrame({"Current_measured": [-1.0, -1.0], "Time": [0.0, 3600.0]})
    soc = feat.compute_soc(df, nominal_capacity_ah=2.0)
    assert soc.iloc[0] == 100.0
    assert soc.iloc[-1] <= 100.0
    assert feat.compute_soh(1.0, nominal_capacity_ah=2.0) == 50.0


def test_compute_rul_and_degradation_state():
    cap = pd.Series([2.0, 1.8, 1.5, 1.3])
    rul = feat.compute_rul_series(cap, eol_threshold=1.4)
    assert rul.iloc[-1] == 0
    labels = feat.classify_degradation_state(np.array([95.0, 85.0, 75.0, 60.0]))
    assert labels.tolist() == [0, 1, 2, 3]


def test_extract_cycle_features():
    df = pd.DataFrame(
        {
            "Voltage_measured": [4.2, 3.7],
            "Current_measured": [-2.0, -1.0],
            "Temperature_measured": [25.0, 30.0],
            "Time": [0.0, 100.0],
        }
    )
    out = feat.extract_cycle_features(df)
    assert out["peak_voltage"] == 4.2
    assert out["cycle_duration"] == 100.0


def test_add_v3_features_and_impute():
    df = pd.DataFrame(
        {
            "battery_id": ["B1", "B1", "B2"],
            "Capacity": [2.0, 1.9, 1.8],
            "Re": [0.05, np.nan, 0.06],
            "Rct": [0.08, 0.09, np.nan],
            "SoH": [100.0, 95.0, 90.0],
            "peak_voltage": [4.2, 4.1, 4.0],
            "min_voltage": [2.5, 2.5, 2.5],
        }
    )
    out = feat.add_v3_features(df)
    assert "capacity_retention" in out.columns
    fixed = feat.impute_features(out)
    assert fixed["Re"].isna().sum() == 0
    assert fixed["Rct"].isna().sum() == 0