Skip to content

contango.trading.analysis.data.data_prep

contango.trading.analysis.data.data_prep

get_param_columns

get_param_columns(df: DataFrame, exclude_constant: bool = True) -> list[str]

Returns the columns in df that represent swept strategy parameters.

Parameters:

Name Type Description Default
df DataFrame

DataFrame produced by results_to_dataframe.

required
exclude_constant bool

If True (default), drop parameters that only take a single unique value across all rows.

True

Returns:

Type Description
list[str]

List of parameter column names.

Source code in src\contango\trading\analysis\data\data_prep.py
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
def get_param_columns(df: pd.DataFrame, exclude_constant: bool = True) -> list[str]:
    """
    Returns the columns in `df` that represent swept strategy parameters.

    Args:
        df: DataFrame produced by `results_to_dataframe`.
        exclude_constant: If True (default), drop parameters that only take a
                          single unique value across all rows.

    Returns:
        List of parameter column names.
    """
    param_columns = [c for c in df.columns if c not in _METRIC_COLUMNS]
    param_columns = [
        c for c in param_columns
        if df[c].map(is_hashable).all()
    ]

    if exclude_constant:
        param_columns = [c for c in param_columns if df[c].nunique(dropna=False) > 1]

    return param_columns

results_to_dataframe

results_to_dataframe(experiments: list[GraphingExperiment]) -> pd.DataFrame

Flattens a list of GraphingExperiment instances into a DataFrame.

Parameters:

Name Type Description Default
experiments list[GraphingExperiment]

The list of GraphingExperiment instances.

required

Returns:

Type Description
DataFrame

pd.DataFrame: A pandas DataFrame with one row per experiment.

Source code in src\contango\trading\analysis\data\data_prep.py
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
57
58
59
60
61
62
63
64
65
def results_to_dataframe(experiments: list[GraphingExperiment]) -> pd.DataFrame:
    """
    Flattens a list of GraphingExperiment instances into a DataFrame.

    Args:
        experiments: The list of GraphingExperiment instances.

    Returns:
        pd.DataFrame: A pandas DataFrame with one row per experiment.
    """
    rows: list[dict[str, Any]] = []

    for experiment in experiments:
        metrics = experiment.metrics
        name = experiment.name

        row: dict[str, Any] = {}
        for key, value in experiment.parameters.items():
            row[key] = value

        row["total_return"] = metrics.returns.total_return
        row["monthly_returns"] = metrics.returns.monthly_returns
        row["equity_curve"] = metrics.returns.equity_curve

        row["annual_return"] = metrics.risk.annual_return
        row["monthly_volatility"] = metrics.risk.monthly_volatility
        row["sharpe_ratio"] = metrics.risk.sharpe_ratio
        row["calmar_ratio"] = metrics.risk.calmar_ratio

        row["max_drawdown"] = metrics.drawdowns.max_drawdown
        row["average_drawdown"] = metrics.drawdowns.average_drawdown

        row["trade_count"] = metrics.trades.trade_count
        row["win_rate"] = metrics.trades.win_rate
        row["profit_factor"] = metrics.trades.profit_factor
        row["expectancy"] = metrics.trades.expectancy
        row["average_win"] = metrics.trades.average_win
        row["average_loss"] = metrics.trades.average_loss
        row["average_holding_period"] = metrics.trades.average_holding_period

        row["name"] = name

        rows.append(row)

    return pd.DataFrame(rows)