Skip to content

update_custom_curves

update_custom_curves

Service for update custom curves operations.

Classes

UpdateCustomCurvesRunner

Bases: BaseRunner[Dict[str, Any]]

Runner for uploading custom curves to a scenario.

Functions
build_requests staticmethod
build_requests(scenario, custom_curves)

Build custom curve upload requests for concurrent batching.

Parameters:

Name Type Description Default
scenario Any

The scenario object (must have an 'id' attribute)

required
custom_curves Dict[str, Any]

Dict mapping curve keys to curve data (pandas Series/DataFrame, list, or string)

required

Returns:

Type Description
List[Dict[str, Any]]

List of request dicts ready for AsyncBatchRunner

Source code in src/pyetm/services/scenario_runners/update_custom_curves.py
@staticmethod
def build_requests(scenario: Any, custom_curves: Dict[str, Any]) -> List[Dict[str, Any]]:
    """
    Build custom curve upload requests for concurrent batching.

    Args:
        scenario: The scenario object (must have an 'id' attribute)
        custom_curves: Dict mapping curve keys to curve data (pandas Series/DataFrame, list, or string)

    Returns:
        List of request dicts ready for AsyncBatchRunner
    """
    import pandas as pd
    from pathlib import Path

    requests = []

    for curve_key, curve_data in custom_curves.items():
        # Format curve data based on type
        if isinstance(curve_data, (str, Path)):
            path = Path(curve_data)
            try:
                if path.exists():
                    with open(path, "r") as f:
                        content = f.read()
                else:
                    content = str(curve_data)
            except (OSError, ValueError):
                # Path is too long, invalid, or not a valid path
                content = str(curve_data)
        elif isinstance(curve_data, (pd.Series, pd.DataFrame)):
            content = curve_data.to_csv(header=False, index=False)
        elif isinstance(curve_data, (list, tuple)):
            content = "\n".join(str(value) for value in curve_data)
        else:
            content = str(curve_data)

        requests.append(
            {
                "method": "put",
                "path": f"/scenarios/{scenario.id}/custom_curves/{curve_key}",
                "payload": None,
                "kwargs": {
                    "files": {
                        "file": (
                            f"{curve_key}.csv",
                            content,
                            "application/octet-stream",
                        )
                    },
                    "headers": {"Content-Type": None},
                },
            }
        )

    return requests