This fork is an implementation attempt (under development) of the FEAT method described in the paper Fuel Estimation in Air Transportation: Modeling global fuel consumption for commercial aviation.
The Jupyter Notebooks and csv files of the original repository have been moved to the folder named paper.
The paper algorithms are coded in Python and built on top of the OpenAP and traffic libraries.
Flight profiles can be generated by using the OpenAP trajectory generation facilities.
import matplotlib.pyplot as plt
from feat import FlightProfileGenerator
fpg = FlightProfileGenerator(ac_type="A320")
flight_profiles = fpg.gen_profiles(step=100)
fp_df = flight_profiles.to_df()
fig, ax = plt.subplots(figsize=(15, 7))
for (_, fp) in fp_df.assign(h=fp_df.h / aero.ft, s=fp_df.s / 1e3).groupby("id"):
fp.plot(x="s", y="h", ax=ax, legend=False)
Once flight profiles are generated, we can estimate thrust, fuel flow and fuel consomption as follows:
from feat import FlightProfiles, FuelEstimator
fe = FuelEstimator(ac_type=ac_type)
flight_profiles = fe(FlightProfiles.from_df(fp_df))
fp_df = flight_profiles.to_df()
t h s v vs seg fp id thr ff fc m
0 0 0.0 0.0 0.0 0.00 None TO 5 0.000000 0.000000 0.000000 61933.456888
1 30 0.0 0.0 57.9 0.00 TO TO 5 196847.925718 2.713689 81.410655 61852.046233
2 60 0.0 1737.0 115.8 0.00 TO TO 5 167342.557563 2.185533 146.976654 61786.480234
3 90 0.0 5211.0 130.8 12.59 IC CL 5 109309.923013 1.354792 187.620401 61745.836487
4 120 377.7 9135.0 145.8 12.59 IC CL 5 101653.894487 1.278205 225.966546 61707.490342
Initial take-off weight mass (TOW) is estimated based on the fuel load calculation procedure described in the FEAT paper (Appendix G for details). Please noticed fc column in the dataframe is the cumulative fuel consomption.
Alternatively, flight profiles can be built from ADS-B trajectories contained in a Traffic data structure (see traffic library).
from traffic.core import Traffic
from feat import FlightProfiles
t = Traffic.from_file("data/adsb_sample.parquet")
fp_df = FlightProfiles.from_traffic(t).to_df()
fp_df.head()
t h s v vs fp id
0 0 381.000 0.000000e+00 88.998812 13.655040 CLIMB AFR1044_003
1 1 393.192 6.150660e+01 88.998812 13.720064 CLIMB AFR1044_003
2 2 405.384 1.230133e+02 88.998812 13.785088 CLIMB AFR1044_003
3 3 417.576 1.845200e+02 88.998812 13.850112 CLIMB AFR1044_003
4 4 429.768 2.460268e+02 88.998812 13.915136 CLIMB AFR1044_003
from feat import FlightProfiles, FuelEstimator
ac_types = ["A332", "E190", "A20N", "A21N", "A319", "A20N", "B772", "B789", "A359"]
fps = FlightProfiles.from_traffic(t)
cumul = []
for ac_type, fp in zip(ac_types, fps):
fe = FuelEstimator(ac_type=ac_type)
cumul.append(fe([fp]).to_df())
flight_profiles = FlightProfiles(cumul, len(cumul))
fp_df = flight_profiles.to_df()
fig, axes = plt.subplots(5, 2, figsize=(15, 25))
for ax, (id, fp) in zip(axes.flat, fp_df.groupby("id")):
fp.query("ff==ff").plot(
x="t",
y=["thr", "ff"],
secondary_y="thr",
ax=ax,
legend=False,
)
- create a conda environment with the traffic library and its dependencies installed in it (see traffic installation instructions).
In the same conda environment:
- install OpenAP (version with some bug corrections)
pip install -U git+https://github.com/lbasora/openap.git@bugs
- install FEAT
git clone https://github.com/lbasora/feat
cd feat
python setup.py install
The algorithms are described in the following paper (see supplementary material Appendix A to K for algorithm details):
@article{seymour_fuel_2020,
title = {Fuel {Estimation} in {Air} {Transportation}: {Modeling} global fuel consumption for commercial aviation},
author = {Seymour, K. and Held, M. and Georges, G. and Boulouchos, K.},
journal = {Transportation Research Part D: Transport and Environment},
volume = {88},
year = {2020},
pages = {102528},
issn = {13619209},
doi = {10.1016/j.trd.2020.102528},
}