Source code for gearshift.core.load.excel

# -*- coding: utf-8 -*-
#
# Copyright (c) 2021 European Union;
# Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission
# – subsequent versions of the EUPL (the "Licence");
#
# You may not use this work except in compliance with the Licence.
# You may obtain a copy of the Licence at: https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
"""
Functions to read inputs from excel.
"""

import pandas as pd


def _read_columns(input_data):
    col_names = ["case", "vehicle", "engine", "gearbox_ratios"]

    columns = [x.lower().strip() for x in input_data.sheet_names]

    return [x for x in columns if x in col_names]


def _read_dataframe(col, dataframe):

    dataframe = dataframe.drop([0], axis=0)

    dataframe.columns = dataframe.columns.str.replace(" ", "")

    dataframe = dataframe.fillna(0)

    if col == "case":
        dataframe["do_dsc"] = 1
        dataframe["calc_dsc"] = dataframe["f_dsc"].apply(lambda x: 1 if x == 0 else 0)
        dataframe["do_cmp"] = 1
        dataframe["do_cap"] = 0
        dataframe = dataframe.astype({"v_cap": "float64"})
        dataframe.loc[dataframe["v_cap"] != 0, ["do_cap"]] = 1

    if col == "vehicle":
        dataframe["SM"] = 0.100

    type_cols = {
        "case": {
            "case": "int32",
            "vehicle": "str",
            "do_dsc": "int32",
            "do_cap": "int32",
            "do_cmp": "int32",
            "calc_dsc": "int32",
            "f_dsc": "float64",
            "v_max": "float64",
            "v_cap": "float64",
            "class": "str",
            "n_min1": "float64",
            "n_min12": "float64",
            "n_min2d": "float64",
            "n_min2": "float64",
            "n_min3": "float64",
            "n_min3a": "float64",
            "n_min3d": "float64",
            "n_min3as": "float64",
            "n_min3ds": "float64",
            "t_start": "int32",
            "supp0": "int32",
            "excl1": "int32",
            "autom": "int32",
            "n_lim": "float64",
            "asm_0": "float64",
            "n_asm_s": "float64",
            "n_asm_e": "float64",
        },
        "vehicle": {
            "vehicle": "str",
            "p_rated": "float64",
            "n_rated": "float64",
            "n_idle": "float64",
            "n_max1": "float64",
            "#g": "int32",
            "m_test": "float64",
            "f0": "float64",
            "f1": "float64",
            "f2": "float64",
            "SM": "float64",
        },
        "engine": {"vehicle": "str", "n": "float64", "p": "float64", "ASM": "float64"},
        "gearbox_ratios": {"vehicle": "str", "gear": "int32", "ndv": "float64"},
    }

    caseDict = {
        "case": "int32",
        "vehicle": "str",
        "do_dsc": "bool",
        "do_cap": "bool",
        "do_cmp": "bool",
        "calc_dsc": "bool",
        "f_dsc": "float64",
        "v_cap": "float64",
        "class": "str",
        "n_min1": "float64",
        "n_min12": "float64",
        "n_min2d": "float64",
        "n_min2": "float64",
        "n_min3": "float64",
        "n_min3a": "float64",
        "n_min3d": "float64",
        "n_min3as": "float64",
        "n_min3ds": "float64",
        "t_start": "int32",
        "supp0": "bool",
        "excl1": "bool",
        "autom": "bool",
        "n_lim": "float64",
        "asm_0": "float64",
        "n_asm_s": "float64",
        "n_asm_e": "float64",
    }

    dataframe = dataframe.astype(type_cols[col])

    if col == "case":
        dataframe = dataframe.astype(caseDict)

    for string_column in dataframe.select_dtypes(include="object"):
        dataframe[string_column] = dataframe[string_column].str.replace(" ", "")

    return dataframe.reset_index(drop=True)


[docs]def parse_excel_file(input_file_name, input_file): """ Reads cycle's data and simulation plans. :param input_file_name: Input file name. :type input_file_name: str :param input_file: Input file. :type input_file: io.BytesIO :return: Raw input data. :rtype: dict """ raw_data = {} input_data = pd.ExcelFile(input_file, engine="openpyxl") columns = _read_columns(input_data) for col in columns: raw_data[col] = _read_dataframe(col, input_data.parse(col)) raw_data["input_file"] = input_file_name return raw_data