import os1import pandas as pd2import numpy as np3import argparse4import matplotlib.pyplot as plt5from scipy.optimize import curve_fit678def clean_name(name):9if "SelectOne" in name:10name = name.split(" ")[0].strip()11elif "Build Spec" in name:12name = name.split(" ")[0].strip()13elif "Block" in name:14name = name.split(" ")[0].strip()15elif "series" in name:16name = name.split(" ")[0].strip()17elif "(" in name:18name = name.split("(")[0].strip()19return name202122def clean_bpr(bpr):23try:24bpr = float(bpr)25except (ValueError, TypeError):26bpr = "-"27return bpr282930f = "input/edb-emissions-databank v27 (web).xlsx"3132xl = pd.ExcelFile(f)3334df0 = xl.parse(sheet_name=2)3536df0.dropna(subset=["UID"], inplace=True)3738df = df0.iloc[391:,40[410,421,433,444,455,466,4711,4812,4917,5019,5122,5223,5324,5425,5535,5636,5737,5838,5948,6049,6150,6251,6380,6481,6582,6683,6784,6894,69],70]71df.columns = [72"uid",73"name",74"type",75"bpr",76"pr",77"max_thrust",78"superseded",79"superseded_by",80"out_production",81"out_service",82"ei_hc_to",83"ei_hc_co",84"ei_hc_app",85"ei_hc_idl",86"ei_co_to",87"ei_co_co",88"ei_co_app",89"ei_co_idl",90"ei_nox_to",91"ei_nox_co",92"ei_nox_app",93"ei_nox_idl",94"ff_to",95"ff_co",96"ff_app",97"ff_idl",98"fuel_lto",99"manufacturer",100]101102df.dropna(subset=["name"], inplace=True)103104df.loc[:, "uid"] = df["uid"].str.strip()105df.loc[:, "name"] = df["name"].str.strip()106df.loc[:, "name"] = df["name"].apply(clean_name)107108df.loc[:, "bpr"] = df["bpr"].apply(clean_bpr)109110df.loc[:, "max_thrust"] = (df["max_thrust"] * 1000).astype(int)111112df = df[df["superseded"] != "x"]113df = df[df["uid"] != ""]114df = df[df["bpr"] != "-"]115df = df[df["ei_hc_to"] != "-"]116df = df[df["ei_hc_co"] != "-"]117df = df[df["ei_hc_app"] != "-"]118df = df[df["ei_hc_idl"] != "-"]119df = df[df["ei_hc_to"] != "*"]120df = df[df["ei_hc_co"] != "*"]121df = df[df["ei_hc_app"] != "*"]122df = df[df["ei_hc_idl"] != "*"]123df = df[df["ei_co_to"] != "-"]124df = df[df["ei_co_co"] != "-"]125df = df[df["ei_co_app"] != "-"]126df = df[df["ei_co_idl"] != "-"]127df = df[df["ei_co_to"] != "*"]128df = df[df["ei_co_co"] != "*"]129df = df[df["ei_co_app"] != "*"]130df = df[df["ei_co_idl"] != "*"]131df = df[df["ei_nox_to"] != "-"]132df = df[df["ei_nox_co"] != "-"]133df = df[df["ei_nox_app"] != "-"]134df = df[df["ei_nox_idl"] != "-"]135df = df[df["ei_nox_to"] != "*"]136df = df[df["ei_nox_co"] != "*"]137df = df[df["ei_nox_app"] != "*"]138df = df[df["ei_nox_idl"] != "*"]139df = df[df["ff_to"] != "-"]140df = df[df["ff_co"] != "-"]141df = df[df["ff_app"] != "-"]142df = df[df["ff_idl"] != "-"]143df = df[df["fuel_lto"] != "-"]144145df.drop_duplicates(subset=["name"], keep="last", inplace=True)146147# Die supersededs vinden we nu niet meer interessant148df = df.loc[149:,150[151"uid",152"name",153"manufacturer",154"type",155"bpr",156"pr",157"max_thrust",158"ei_hc_to",159"ei_hc_co",160"ei_hc_app",161"ei_hc_idl",162"ei_co_to",163"ei_co_co",164"ei_co_app",165"ei_co_idl",166"ei_nox_to",167"ei_nox_co",168"ei_nox_app",169"ei_nox_idl",170"ff_to",171"ff_co",172"ff_app",173"ff_idl",174"fuel_lto",175],176]177178179def func_fuel3(x, c3, c2, c1, c0):180return c3 * x ** 3 + c2 * x ** 2 + c1 * x + c0181182183def func_fuel2(x, a, b):184return a * (x + b) ** 2185186187# def func_fuel(x, c1, c2):188# return c1 * np.exp(c2 * x)189190191# compute fuel flow coefficient192x = [0.07, 0.3, 0.85, 1.0]193for i, r in df.iterrows():194y = [r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]195196# coef = np.polyfit(x, y, 2)197# df.loc[i, 'fuel_c2'] = coef[0]198# df.loc[i, 'fuel_c1'] = coef[1]199# df.loc[i, 'fuel_c0'] = coef[2]200201coef, cov = curve_fit(func_fuel3, x, y)202df.loc[i, "fuel_c3"] = coef[0]203df.loc[i, "fuel_c2"] = coef[1]204df.loc[i, "fuel_c1"] = coef[2]205206coef, cov = curve_fit(func_fuel2, x, y)207df.loc[i, "fuel_a"] = coef[0]208df.loc[i, "fuel_b"] = coef[1]209210# print(r["name"], coef)211# xx = np.linspace(-1, 1, 100)212# plt.plot(xx, func_fuel(xx, *coef))213# plt.scatter(x, y)214# plt.draw()215# plt.waitforbuttonpress(-1)216# plt.clf()217218219dfcr = pd.read_csv("input/engine_cruise_performance.csv")220df = df.merge(dfcr, how="left", left_on="name", right_on="engine")221df = df.drop("engine", axis=1)222223224# def func_co(x, beta, gamma):225# return beta * (x - 0.001) ** (-gamma) * np.exp(-2 * (x - 0.001) ** beta)226227228# def func_nox(x, c1, p1):229# return c1 * x ** p1230231232# def func_hc(x, beta, gamma):233# return beta * (x + 0.05) ** (-gamma) * np.exp(-4 * (x - 0.001) ** beta)234235236# for i, r in df.iterrows():237238# # process NOx239# x_nox = [0, r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]240# y_nox = [0, r["ei_nox_idl"], r["ei_nox_app"], r["ei_nox_co"], r["ei_nox_to"]]241242# guess = np.array([20, 0.75])243# coef_nox, cov = curve_fit(func_nox, x_nox, y_nox, guess)244245# df.loc[i, "nox_c"] = coef_nox[0]246# df.loc[i, "nox_p"] = coef_nox[1]247248# # process CO249# x_co = [r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]250# y_co = [r["ei_co_idl"], r["ei_co_app"], r["ei_co_co"], r["ei_co_to"]]251# y_co = np.maximum(y_co, [1e-7, 1e-7, 1e-7, 1e-7])252253# coef_co, covco = curve_fit(func_co, x_co[0:2], y_co[0:2])254# df.loc[i, "co_beta"] = coef_co[0]255# df.loc[i, "co_gamma"] = coef_co[1]256# df.loc[i, "co_max"] = 2 * y_co[0]257# df.loc[i, "co_min"] = (y_co[2] + y_co[3]) / 2258259# # process HC260# x_hc = [r["ff_idl"], r["ff_app"], r["ff_co"], r["ff_to"]]261# y_hc = [r["ei_hc_idl"], r["ei_hc_app"], r["ei_hc_co"], r["ei_hc_to"]]262263# if max(y_hc) == 0:264# df.loc[i, "hc_na"] = True265# else:266# df.loc[i, "hc_na"] = False267268# df.loc[i, "hc_max"] = 2 * max(y_hc[0], y_hc[1])269# df.loc[i, "hc_min"] = (y_hc[2] + y_hc[3]) / 2270271# y_hc = np.maximum(y_hc, [1e-7, 1e-7, 1e-7, 1e-7])272273# logX, logY = np.log10(x_hc), np.log10(y_hc) # current powers274# b2 = (logY[3] + logY[2]) / 2 # Average power275# a1 = (logY[1] - logY[0]) / (logX[1] - logX[0])276# b1 = logY[0] - a1 * logX[0]277278# x_intersect = 10 ** ((b2 - b1) / a1)279# if x_intersect > x_hc[2]:280# df.loc[i, "hc_ff85"] = x_hc[2]281# else:282# df.loc[i, "hc_ff85"] = 0283284# try:285# coef_hc, covhc = curve_fit(func_hc, x_hc, y_hc)286# df.loc[i, "hc_beta"] = coef_hc[0]287# df.loc[i, "hc_gamma"] = coef_hc[1]288# df.loc[i, "hc_a1"] = None289# df.loc[i, "hc_b1"] = None290# df.loc[i, "hc_b2"] = None291# except RuntimeError:292# df.loc[i, "hc_beta"] = None293# df.loc[i, "hc_gamma"] = None294# df.loc[i, "hc_a1"] = a1295# df.loc[i, "hc_b1"] = b1296# df.loc[i, "hc_b2"] = b2297298299df.to_csv("db/engines.csv", float_format="%g", index=False)300301302