Skip to content

Statistics

jetfuelburn.statistics

aeromaps

This class implements the the reduced-order fuel burn model of the AeroMaps software tool by Planès et al. (2023).

In this model, fuel burn calculations are based on statistical average values in MJ/ASK (megajoule per available seat-kilometer) for three representative aircraft types, with future efficiency improvements modelled over time:

The corresponding historical fleet was calibrated using mean fuel consumption per market and representative aircraft. - Planès et al. (2023), P.5

The future aircraft fleet can be modelled using two solutions: a top-down approach based on annual efficiency gains, and a bottom-up approach in which aircraft data (performance, entry-into-service...) are coupled with fleet renewal models. - Planès et al. (2023), P.5

Here, the drop_in (fuel) data is used, although the model also data on future hydrogen aircraft.

Warnings

It is unclear from the model documentation whether the fuel consumption values given in MJ/ASK for future years are based on the top-down or bottom-up approach.

References

Planès, T., Delbecq, S., & Salgas, A. (2023). AeroMAPS: a framework for performing multidisciplinary assessment of prospective scenarios for air transport. In Journal of Open Aviation Science. doi:10.59490/joas.2023.7147

Planès, T., Salgas, A., Pollet, F., & Delbecq, S. (2025). Simulation and analyses of ICAO transition scenarios using the AeroMAPS open-source framework. In Towards Sustainable Aviation Summit (TSAS 2025). doi:10.60711/TSAS25.20250216.7026241092200926

Pollet, F., Planès, T., & Delbecq, S. (2024). A Comprehensive Methodology for Performing Prospective Life Cycle Assessments of Future Air Transport Scenarios. In 34th Congress of the International Council of the Aeronautical Sciences. hal:hal-04703961

See Also

Excel in the AeroMAPS repository containing the statistical average energy use of aircraft types (short/medium/long-haul): aeromaps/resources/data/data.xlsx

Example

Editor (session: default)Run
import jetfuelburn
from jetfuelburn import ureg
from jetfuelburn.statistics import aeromaps
aeromaps.calculate_fuel_consumption(
    acft_type='long_range',
    year=2020,
    R=4000*ureg('km')
)
OutputClear

Source code in jetfuelburn/statistics.py
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 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
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
class aeromaps:
    r"""
    This class implements the the reduced-order fuel burn model of the AeroMaps software tool by Planès et al. (2023).

    In this model, fuel burn calculations are based on statistical average values in MJ/ASK (megajoule per available seat-kilometer) for three representative aircraft types,
    with future efficiency improvements modelled over time:

    > The corresponding historical fleet was calibrated using mean fuel consumption per market and representative aircraft.
    > - [Planès et al. (2023), P.5](https://doi.org/10.59490/joas.2023.7147)

    > The future aircraft fleet can be modelled using two solutions: a top-down approach  based on annual efficiency gains, and a bottom-up approach in which aircraft data (performance,  entry-into-service...) are coupled with fleet renewal models.
    > - [Planès et al. (2023), P.5](https://doi.org/10.59490/joas.2023.7147)

    Here, the `drop_in` (fuel) data is used, although the model also data on future `hydrogen` aircraft.

    Warnings
    --------
    It is unclear from the model documentation whether the fuel consumption values given in MJ/ASK for future years are based on the top-down or bottom-up approach.

    References
    ----------
    Planès, T., Delbecq, S., & Salgas, A. (2023).
    AeroMAPS: a framework for performing multidisciplinary assessment of prospective scenarios for air transport.
    In _Journal of Open Aviation Science_.
    doi:[10.59490/joas.2023.7147](https://doi.org/10.59490/joas.2023.7147)

    Planès, T., Salgas, A., Pollet, F., & Delbecq, S. (2025).
    Simulation and analyses of ICAO transition scenarios using the AeroMAPS open-source framework.
    In _Towards Sustainable Aviation Summit (TSAS 2025)_.
    doi:[10.60711/TSAS25.20250216.7026241092200926](https://doi.org/10.60711/TSAS25.20250216.7026241092200926)

    Pollet, F., Planès, T., & Delbecq, S. (2024).
    A Comprehensive Methodology for Performing Prospective Life Cycle Assessments of Future Air Transport Scenarios.
    In _34th Congress of the International Council of the Aeronautical Sciences_.
    hal:[hal-04703961](https://hal.science/hal-04703961v1)

    See Also
    --------
    Excel in the AeroMAPS repository containing the statistical average energy use of aircraft types (short/medium/long-haul): [`aeromaps/resources/data/data.xlsx`](https://github.com/AeroMAPS/AeroMAPS/blob/5febefe03cd69815a6949b67c43906c209ac14b1/aeromaps/resources/data/data.xlsx)

    Example
    -------
    ```pyodide install='jetfuelburn'
    import jetfuelburn
    from jetfuelburn import ureg
    from jetfuelburn.statistics import aeromaps
    aeromaps.calculate_fuel_consumption(
        acft_type='long_range',
        year=2020,
        R=4000*ureg('km')
    )
    ```
    """

    _statistical_data = {}
    with resources.open_text(
        "jetfuelburn.data.AeroMaps", "aeromaps_data.csv", encoding="utf-8-sig"
    ) as file:
        csv_reader = csv.DictReader(file)
        for row in csv_reader:
            year = int(row.pop("year"))
            _statistical_data[year] = {k: float(v) for k, v in row.items()}

    @staticmethod
    def available_years() -> list[int]:
        """
        Returns a sorted list of available years included in the model.
        """
        return sorted(aeromaps._statistical_data.keys())

    @staticmethod
    def available_aircraft(
        year: int,
    ) -> list[str]:
        """
        Given a year, returns a sorted list of available aircraft types
        (e.g., ['long_range', 'medium_range', 'short_range']).
        """
        if year not in aeromaps._statistical_data:
            return []
        return sorted(aeromaps._statistical_data[year].keys())

    @staticmethod
    @ureg.check(
        None,  # acft_type
        None,  # year
        "[length]",
    )
    def calculate_fuel_consumption(
        acft_type: str,
        year: int,
        R: float,
    ) -> float:
        r"""
        Given an aircraft type and range, calculates the fuel burned during flight **per passenger**.

        Data is based on averages of fuel consumption per weight-distance flown by specific aircraft types,
        in specific years, based on the assumptions of the AeroMaps software framework by Planès et al. (2023):

        $$
        F/pax = MJ/ASK * R / e
        $$

        where:

        | Symbol     | Dimension     | Description                              |
        | ---------- | ------------- | ---------------------------------------- |
        | $F$        | [weight]      | Fuel burned during flight                |
        | $pax$      | [1]           | Number of passengers                     |
        | $R$        | length        | Range of the flight                      |
        | $MJ/ASK$   | energy/length | Average energy use per available seat-km |
        | $e$        | energy/weight | Specific energy content of jet fuel      |

        Warnings
        --------
        This model does not

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft_type : str
            Aircraft type (short/medium/long-haul) to be used for the calculation.
        R : pint.Quantity
            Range of the flight.

        Returns
        -------
        pint.Quantity
            Fuel burned during flight per passenger.

        Raises
        ------
        ValueError
            If the range is negative.
            If the year is not available in the model.
            If the aircraft type (short/medium/long-haul) is not available in the model for the given year.

        """
        if R.magnitude < 0:
            raise ValueError(f"Range must not be negative.")
        else:
            R = R.to("km")
        if year not in aeromaps._statistical_data:
            raise ValueError(
                f"Year '{year}' not found in model data. Please select one of the following: {aeromaps.available_years()}"
            )
        if acft_type not in aeromaps._statistical_data[year]:
            raise ValueError(
                f"Aircraft type '{acft_type}' not found in model data for year '{year}'. Please select one of the following: {aeromaps.available_aircraft(year)}"
            )

        specific_energy = 43.15 * ureg(
            "MJ/kg"
        )  # https://en.wikipedia.org/wiki/Jet_fuel#Types
        fuel_burn_MJ = (
            aeromaps._statistical_data[year][acft_type] * R.magnitude
        )  # in MJ
        fuel_burn_kg = fuel_burn_MJ * ureg("MJ") / specific_energy  # in kg
        return fuel_burn_kg.to("kg")

available_aircraft staticmethod

available_aircraft(year)

Given a year, returns a sorted list of available aircraft types (e.g., ['long_range', 'medium_range', 'short_range']).

Source code in jetfuelburn/statistics.py
79
80
81
82
83
84
85
86
87
88
89
@staticmethod
def available_aircraft(
    year: int,
) -> list[str]:
    """
    Given a year, returns a sorted list of available aircraft types
    (e.g., ['long_range', 'medium_range', 'short_range']).
    """
    if year not in aeromaps._statistical_data:
        return []
    return sorted(aeromaps._statistical_data[year].keys())

available_years staticmethod

available_years()

Returns a sorted list of available years included in the model.

Source code in jetfuelburn/statistics.py
72
73
74
75
76
77
@staticmethod
def available_years() -> list[int]:
    """
    Returns a sorted list of available years included in the model.
    """
    return sorted(aeromaps._statistical_data.keys())

calculate_fuel_consumption staticmethod

calculate_fuel_consumption(acft_type, year, R)

Given an aircraft type and range, calculates the fuel burned during flight per passenger.

Data is based on averages of fuel consumption per weight-distance flown by specific aircraft types, in specific years, based on the assumptions of the AeroMaps software framework by Planès et al. (2023):

\[ F/pax = MJ/ASK * R / e \]

where:

Symbol Dimension Description
\(F\) [weight] Fuel burned during flight
\(pax\) [1] Number of passengers
\(R\) length Range of the flight
\(MJ/ASK\) energy/length Average energy use per available seat-km
\(e\) energy/weight Specific energy content of jet fuel
Warnings

This model does not

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft_type str

Aircraft type (short/medium/long-haul) to be used for the calculation.

required
R Quantity

Range of the flight.

required

Returns:

Type Description
Quantity

Fuel burned during flight per passenger.

Raises:

Type Description
ValueError

If the range is negative. If the year is not available in the model. If the aircraft type (short/medium/long-haul) is not available in the model for the given year.

Source code in jetfuelburn/statistics.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
@staticmethod
@ureg.check(
    None,  # acft_type
    None,  # year
    "[length]",
)
def calculate_fuel_consumption(
    acft_type: str,
    year: int,
    R: float,
) -> float:
    r"""
    Given an aircraft type and range, calculates the fuel burned during flight **per passenger**.

    Data is based on averages of fuel consumption per weight-distance flown by specific aircraft types,
    in specific years, based on the assumptions of the AeroMaps software framework by Planès et al. (2023):

    $$
    F/pax = MJ/ASK * R / e
    $$

    where:

    | Symbol     | Dimension     | Description                              |
    | ---------- | ------------- | ---------------------------------------- |
    | $F$        | [weight]      | Fuel burned during flight                |
    | $pax$      | [1]           | Number of passengers                     |
    | $R$        | length        | Range of the flight                      |
    | $MJ/ASK$   | energy/length | Average energy use per available seat-km |
    | $e$        | energy/weight | Specific energy content of jet fuel      |

    Warnings
    --------
    This model does not

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft_type : str
        Aircraft type (short/medium/long-haul) to be used for the calculation.
    R : pint.Quantity
        Range of the flight.

    Returns
    -------
    pint.Quantity
        Fuel burned during flight per passenger.

    Raises
    ------
    ValueError
        If the range is negative.
        If the year is not available in the model.
        If the aircraft type (short/medium/long-haul) is not available in the model for the given year.

    """
    if R.magnitude < 0:
        raise ValueError(f"Range must not be negative.")
    else:
        R = R.to("km")
    if year not in aeromaps._statistical_data:
        raise ValueError(
            f"Year '{year}' not found in model data. Please select one of the following: {aeromaps.available_years()}"
        )
    if acft_type not in aeromaps._statistical_data[year]:
        raise ValueError(
            f"Aircraft type '{acft_type}' not found in model data for year '{year}'. Please select one of the following: {aeromaps.available_aircraft(year)}"
        )

    specific_energy = 43.15 * ureg(
        "MJ/kg"
    )  # https://en.wikipedia.org/wiki/Jet_fuel#Types
    fuel_burn_MJ = (
        aeromaps._statistical_data[year][acft_type] * R.magnitude
    )  # in MJ
    fuel_burn_kg = fuel_burn_MJ * ureg("MJ") / specific_energy  # in kg
    return fuel_burn_kg.to("kg")

usdot

This class contains methods to access statistical data on aircraft fuel consumption reported by "large certified air carriers" to the US Department of Transport (US DOT).

Data is based on averages of fuel consumption per passenger mile and per ton mile, reported by the US DOT in table T2, summarizing Form 41 Schedule T-100.

Terminology
  • Form 41

    Form 41 is a report that the U.S. Department of Transportation (DOT) generates based on data which large certified air carriers are required to provide.

    The Financial Report part of this form includes balance sheet, cash flow, employment, income statement, fuel cost and consumption, aircraft operating expenses, and operating expenses. The Air Carrier Statistics part of this form includes data on passengers, freight and mail transported. It also includes aircraft type, service class, available capacity and seats, and aircraft hours ramp-to-ramp and airborne.

    The reporting requirements of Schedule T-100 of Form 41 are defined in federal law:

    Reglation Scope
    14 CFR 291.45 General
    Appendix A to Subpart E of Part 291, Title 14 US Air Carriers
    Appendix A to Part 217, Title 14 Foreign Air Carriers
  • Schedule (in the context of Form 41)

    A schedule is a specific section of the Form 41 that contains a particular type of data:

    "the Air Carrier Financial Reports (Form 41 Financial Data) (...) Each table in this database contains a different type of financial report or “schedule” (...)"

    Durso (2007) "An Introduction to DOT Form 41 web resources for airline financial analysis"

  • Schedule T100

    "Form 41 Schedule T-100(f) provides flight stage data covering both passenger/cargo and all cargo operations in scheduled and nonscheduled services. The schedule is used to report all flights which serve points in the United States or its territories as defined in this part."

    Appendix A to Part 217, Title 14

  • (table) T2

    This table summarizes the T-100 traffic data reported by U.S. air carriers. The quarterly summary (...)

  • (table) T1

    This table summarizes the T-100 traffic data reported by U.S. air carriers. The monthly summary (...)

Warning

Form 41 Schedule T-100 data can be downloaded from the US Department of Transportation website. Unfortunately, there are no permalinks to the data files, and even regular URLs are generated dynamically based on some JavaScript magic.

The best way to obtain the correct files is to search by name, according to the following hierarchy:

Database Name: Air Carrier Summary Data (Form 41 and 298C Summary Data)
T2: U.S. Air Carrier TRAFFIC And Capacity Statistics by Aircraft Type

On the T2: (...) page, click on the "Download" button in the "Data Tools" sidebar (left). The download should be an archive, containing the following file:

T_SCHEDULE_T2.csv

Aircraft types in this file are labeled using integer codes. These codes are defined in a separate file, which must also be downloaded. On the T2: (...) page, click on the AircraftType Field Name entry and on the following page, click on the "Download Lookup Table" button.

See Also

Working links to the relevant files (05-2025):

Example

Editor (session: default)Run
import jetfuelburn
from jetfuelburn import ureg
from jetfuelburn.statistics import usdot
usdot.available_years()
usdot.available_aircraft(usdot.available_years()[0])
usdot.calculate_fuel_consumption_per_weight(
    year=2024,
    acft='B787-800 Dreamliner',
    R=1000 * ureg.nmi,
    W=1000 * ureg.kg
)
OutputClear

Source code in jetfuelburn/statistics.py
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
class usdot:
    """
    This class contains methods to access statistical data on aircraft fuel consumption
    reported by "large certified air carriers" to the US Department of Transport (US DOT).

    Data is based on averages of fuel consumption per passenger mile and per ton mile,
    reported by the US DOT in table T2, summarizing Form 41 Schedule T-100.

    Terminology
    -----
    - **Form 41**

        Form 41 is a report that the U.S. Department of Transportation (DOT) generates
        based on data which large certified air carriers are required to provide.

        The _Financial Report_ part of this form includes balance sheet, cash flow, employment, income statement, fuel cost and consumption,
        aircraft operating expenses, and operating expenses.
        The _Air Carrier Statistics_ part of this form includes data on
        passengers, freight and mail transported.
        It also includes aircraft type, service class, available capacity and seats, and aircraft hours ramp-to-ramp and airborne.

        The reporting requirements of Schedule T-100 of Form 41 are defined in federal law:

        | Reglation | Scope |
        | --------- | ----- |
        | [14 CFR 291.45](https://www.ecfr.gov/current/title-14/section-291.45) | General |
        | [Appendix A to Subpart E of Part 291, Title 14](https://www.ecfr.gov/current/title-14/part-291/appendix-Appendix%20A%20to%20Subpart%20E%20of%20Part%20291) | US Air Carriers |
        | [Appendix A to Part 217, Title 14](https://www.ecfr.gov/current/title-14/part-217/appendix-Appendix A to Part 217) | Foreign Air Carriers |

    - **Schedule** (in the context of Form 41)

        A schedule is a specific section of the Form 41 that contains
        a particular type of data:

        > "the Air Carrier Financial Reports (Form 41 Financial Data) (...)
        > Each table in this database contains a different type of financial report or “schedule” (...)"

        [Durso (2007) "An Introduction to DOT Form 41 web resources for airline financial analysis"](https://rosap.ntl.bts.gov/view/dot/16264/dot_16264_DS1.pdf)

    - Schedule **T100**

        > "Form 41 Schedule T-100(f) provides flight stage data covering both passenger/cargo
        > and all cargo operations in scheduled and nonscheduled services.
        > The schedule is used to report all flights which serve points in the United States
        > or its territories as defined in this part."

        [Appendix A to Part 217, Title 14](https://www.ecfr.gov/current/title-14/part-217/appendix-Appendix A to Part 217)

    - (table) **T2**

        > This table summarizes the T-100 traffic data reported by U.S. air carriers. The quarterly summary (...)

    - (table) **T1**

        > This table summarizes the T-100 traffic data reported by U.S. air carriers. The monthly summary (...)

    Warning
    -------
    Form 41 Schedule T-100 data can be downloaded from the US Department of Transportation website.
    Unfortunately, there are no permalinks to the data files, and even regular URLs are
    generated dynamically based on some JavaScript magic.

    The best way to obtain the correct files is to search by name, according to the following hierarchy:

    ```
    Database Name: Air Carrier Summary Data (Form 41 and 298C Summary Data)
    T2: U.S. Air Carrier TRAFFIC And Capacity Statistics by Aircraft Type
    ```

    On the `T2: (...)` page, click on the "Download" button in the "Data Tools" sidebar (left).
    The download should be an archive, containing the following file:

    ```
    T_SCHEDULE_T2.csv
    ```

    Aircraft types in this file are labeled using integer codes. These codes are
    defined in a separate file, which must also be downloaded.
    On the `T2: (...)` page, click on the `AircraftType` Field Name entry
    and on the following page, click on the "Download Lookup Table" button.

    See Also
    --------
    Working links to the relevant files (05-2025):

    - [US DOT: BTS: Air Carrier Summary Data (Form 41 and 298C Summary Data)](https://www.transtats.bts.gov/Tables.asp?QO_VQ=EGD&QO)
    - [US DOT: BTS: Air Carrier Summary Data: T2 (U.S. Air Carrier Traffic And Capacity Statistics by Aircraft Type)](https://www.transtats.bts.gov/Fields.asp?gnoyr_VQ=FIH)

    Example
    --------
    ```pyodide install='jetfuelburn'
    import jetfuelburn
    from jetfuelburn import ureg
    from jetfuelburn.statistics import usdot
    usdot.available_years()
    usdot.available_aircraft(usdot.available_years()[0])
    usdot.calculate_fuel_consumption_per_weight(
        year=2024,
        acft='B787-800 Dreamliner',
        R=1000 * ureg.nmi,
        W=1000 * ureg.kg
    )
    ```
    """

    _years = [2013, 2018, 2019, 2023, 2024, 2025]
    _aircraft_data = {}
    for year in _years:
        with resources.open_text(
            "jetfuelburn.data.USDOT", f"USDOT_data_{year}.json"
        ) as file:
            _aircraft_data[year] = json.load(file)

    @staticmethod
    def available_years() -> list[int]:
        """
        Returns a sorted list of available years included in the model.
        """
        return sorted(usdot._years)

    @staticmethod
    def available_aircraft(
        year: int,
    ) -> list[str]:
        """
        Given a year, returns a sorted list of available ICAO aircraft designators included in the model.
        """
        return sorted(usdot._aircraft_data[year].keys())

    @staticmethod
    @ureg.check(
        None,
        None,
        "[length]",
        "[mass]",
    )
    def calculate_fuel_consumption_per_weight(
        year: int,
        acft: str,
        R: float,
        W: float,
    ) -> dict:
        r"""
        Given an aircraft name, range and payload weight, calculates the fuel burned during flight.

        Data is based on averages of fuel consumption per weight-distance flown by specific aircraft types,
        in specific years, reported by "large certified air carriers" to the US Department of Transport (US DOT):

        $$
        f = \frac{F(t=\text{year})}{WD(t=\text{year})} * R * W
        $$

        where:

        | Symbol | Units   | Description                                                                 |
        | ------ | ------- | --------------------------------------------------------------------------- |
        | $f$    | [kg]    | Fuel burned during flight                                                   |
        | $F$    | [kg]    | Total fuel consumption for a specific aircraft type in a specific year      |
        | $WD$   | [kg*km] | Total weight-distance flown on a specific aircraft type in a specific year  |
        | $R$    | [km]    | Range of the flight                                                         |
        | $W$    | [kg]    | Payload weight of the flight                                                |

        Warnings
        --------
        Aircraft types here are given as full-length strings, e.g. "Boeing 737-800", instead of the ususal ICAO designator "B738".
        These are taken directly from the `L_AIRCRAFT_TYPE.csv` US DOT lookup table file.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft : str
            Aircraft type to be used for the calculation.
        R : pint.Quantity
            Range of the flight.
        W : pint.Quantity
            Payload weight of the flight.

        Returns
        -------
        pint.Quantity
            Fuel burned during flight.

        Raises
        ------
        ValueError
            If the range or weight is negative.
            If the year is not available in the model.
            If the aircraft type is not available in the model for the given year.
        """
        if R.magnitude < 0 or W.magnitude < 0:
            raise ValueError(f"Range and/or weight must not be negative.")
        else:
            R = R.to("km")
            W = W.to("kg")

        if year not in usdot._years:
            raise ValueError(f"No data available for year '{year}'.")
        if acft not in usdot._aircraft_data[year]:
            raise ValueError(
                f"US DOT Aircraft Designator '{acft}' not found in model data."
            )
        else:
            aircraft_data = usdot._aircraft_data[year][acft]

        fuelburn = (
            (aircraft_data["Fuel/Revenue Weight Distance"] * ureg("1/km")) * R * W
        )
        fuelburn = fuelburn.to("kg")

        return fuelburn

    @staticmethod
    @ureg.check(
        None,
        None,
        "[length]",
    )
    def calculate_fuel_consumption_per_seat(
        year: int,
        acft: str,
        R: float,
    ) -> dict:
        r"""
        Given an aircraft name and range, calculates the fuel burned during flight per passenger.

        Data is based on averages of fuel consumption per passenger-distance flown by specific aircraft types,
        in specific years, reported by "large certified air carriers" to the US Department of Transport (US DOT):

        $$
        f = \frac{F(t=\text{year})}{paxD(t=\text{year})} * R
        $$

        where:

        | Symbol | Units   | Description                                                                   |
        | ------ | ------- | ----------------------------------------------------------------------------- |
        | $f$    | [kg]    | Fuel burned during flight                                                     |
        | $F$    | [kg]    | Total fuel consumption for a specific aircraft type in a specific year        |
        | $paxD$ | [kg*km] | Total passenger-distance flown on a specific aircraft type in a specific year |
        | $R$    | [km]    | Range of the flight                                                           |

        Warnings
        --------
        Aircraft types here are given as full-length strings, e.g. "Boeing 737-800", instead of the ususal ICAO designator "B738".
        These are taken directly from the `L_AIRCRAFT_TYPE.csv` US DOT lookup table file.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft : str
            Aircraft type to be used for the calculation.
        R : pint.Quantity
            Range of the flight.

        Returns
        -------
        pint.Quantity
            Fuel burned per passenger during flight.

        Raises
        ------
        ValueError
            If the range is negative.
            If the year is not available in the model.
            If the aircraft type is not available in the model for the given year.
        """
        if R.magnitude < 0:
            raise ValueError(f"Range must not be negative.")
        else:
            R = R.to("km")

        if year not in usdot._years:
            raise ValueError(f"No data available for year '{year}'.")
        if acft not in usdot._aircraft_data[year]:
            raise ValueError(
                f"US DOT Aircraft Designator '{acft}' not found in model data."
            )
        else:
            aircraft_data = usdot._aircraft_data[year][acft]

        fuelburn = (aircraft_data["Fuel/Revenue Seat Distance"] * ureg("kg/km")) * R
        fuelburn = fuelburn.to("kg")
        return fuelburn

    def calculate_movements(
        year: int,
        acft: str,
    ) -> dict:
        """
        Given a year and aircraft designator, returns the number of flights captured.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft : str
            US DOT aircraft designator string (e.g. ``'B739'``).

        Returns
        -------
        int or float
            Number of flights captured for the given aircraft type and year.

        Raises
        ------
        ValueError
            If the year is not available in the model.
        ValueError
            If the aircraft designator is not found in the model data for the given year.
        """
        if year not in usdot._years:
            raise ValueError(f"No data available for year '{year}'.")
        if acft not in usdot._aircraft_data[year]:
            raise ValueError(
                f"US DOT Aircraft Designator '{acft}' not found in model data."
            )
        else:
            aircraft_data = usdot._aircraft_data[year][acft]

        movements = aircraft_data["Number of flights captured"]
        return movements

    def calculate_average_time(
        year: int,
        acft: str,
    ) -> dict:
        """
        Given a year and aircraft designator, returns the average trip flight time.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft : str
            US DOT aircraft designator string (e.g. ``'B739'``).

        Returns
        -------
        pint.Quantity
            Average trip flight time for the given aircraft type and year, in hours.

        Raises
        ------
        ValueError
            If the year is not available in the model.
        ValueError
            If the aircraft designator is not found in the model data for the given year.
        """
        if year not in usdot._years:
            raise ValueError(f"No data available for year '{year}'.")
        if acft not in usdot._aircraft_data[year]:
            raise ValueError(
                f"US DOT Aircraft Designator '{acft}' not found in model data."
            )
        else:
            aircraft_data = usdot._aircraft_data[year][acft]

        time = aircraft_data["Average trip flight time"] * ureg("h")
        time = time.to("h")
        return time

    def calculate_average_distance(
        year: int,
        acft: str,
    ) -> dict:
        """
        Given a year and aircraft designator, returns the average trip distance.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft : str
            US DOT aircraft designator string (e.g. ``'B739'``).

        Returns
        -------
        pint.Quantity
            Average trip distance for the given aircraft type and year, in kilometres.

        Raises
        ------
        ValueError
            If the year is not available in the model.
        ValueError
            If the aircraft designator is not found in the model data for the given year.
        """

        if year not in usdot._years:
            raise ValueError(f"No data available for year '{year}'.")
        if acft not in usdot._aircraft_data[year]:
            raise ValueError(
                f"US DOT Aircraft Designator '{acft}' not found in model data."
            )
        else:
            aircraft_data = usdot._aircraft_data[year][acft]

        distance = aircraft_data["Average trip distance"] * ureg("km")
        distance = distance.to("km")
        return distance

    def calculate_average_cargo(
        year: int,
        acft: str,
    ) -> dict:
        """
        Given a year and aircraft designator, returns the average freight and mail transported.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft : str
            US DOT aircraft designator string (e.g. ``'B739'``).

        Returns
        -------
        pint.Quantity
            Average freight and mail transported per flight for the given aircraft
            type and year, in kilograms.

        Raises
        ------
        ValueError
            If the year is not available in the model.
        ValueError
            If the aircraft designator is not found in the model data for the given year.
        """
        if year not in usdot._years:
            raise ValueError(f"No data available for year '{year}'.")
        if acft not in usdot._aircraft_data[year]:
            raise ValueError(
                f"US DOT Aircraft Designator '{acft}' not found in model data."
            )
        else:
            aircraft_data = usdot._aircraft_data[year][acft]

        cargo = aircraft_data["Freight and mail transported"] * ureg("kg")
        cargo = cargo.to("kg")
        return cargo

    def calculate_average_pax(
        year: int,
        acft: str,
    ) -> dict:
        """
        Given a year and aircraft designator, returns the average number of passengers per flight.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.
        acft : str
            US DOT aircraft designator string (e.g. ``'B739'``).

        Returns
        -------
        int or float
            Average number of passengers per flight for the given aircraft type and year.

        Raises
        ------
        ValueError
            If the year is not available in the model.
        ValueError
            If the aircraft designator is not found in the model data for the given year.
        """
        if year not in usdot._years:
            raise ValueError(f"No data available for year '{year}'.")
        if acft not in usdot._aircraft_data[year]:
            raise ValueError(
                f"US DOT Aircraft Designator '{acft}' not found in model data."
            )
        else:
            aircraft_data = usdot._aircraft_data[year][acft]

        pax = aircraft_data["Average PAX per flight"]
        return pax

    @staticmethod
    def calculate_total_fuel_consumption(year: int) -> float:
        r"""
        Given a year, returns the total fuel burned by all aircraft types combined.

        Calculated as:

        $$
        F_{\text{total}} = \sum_{\text{acft}} \frac{F}{\text{paxD}} \cdot \text{paxD}
        $$

        where $F/\text{paxD}$ is the ``Fuel/Revenue Seat Distance`` field (kg per pax-km)
        and $\text{paxD}$ is the ``Revenue PAX km`` field (pax-km) for each aircraft type.

        Parameters
        ----------
        year : int
            Year of the data to be used for the calculation.

        Returns
        -------
        pint.Quantity
            Total fuel burned by all aircraft types combined, in kg.

        Raises
        ------
        ValueError
            If the year is not available in the model.
        """
        if year not in usdot._years:
            raise ValueError(
                f"No data available for year '{year}'. Please select one of the following: {usdot.available_years()}"
            )

        total_kg = sum(
            data["Fuel/Revenue Seat Distance"] * data["Revenue PAX km"]
            for data in usdot._aircraft_data[year].values()
            if data["Fuel/Revenue Seat Distance"] is not None
            and data["Revenue PAX km"] is not None
        )
        return (total_kg * ureg("kg")).to("kg")

available_aircraft staticmethod

available_aircraft(year)

Given a year, returns a sorted list of available ICAO aircraft designators included in the model.

Source code in jetfuelburn/statistics.py
291
292
293
294
295
296
297
298
@staticmethod
def available_aircraft(
    year: int,
) -> list[str]:
    """
    Given a year, returns a sorted list of available ICAO aircraft designators included in the model.
    """
    return sorted(usdot._aircraft_data[year].keys())

available_years staticmethod

available_years()

Returns a sorted list of available years included in the model.

Source code in jetfuelburn/statistics.py
284
285
286
287
288
289
@staticmethod
def available_years() -> list[int]:
    """
    Returns a sorted list of available years included in the model.
    """
    return sorted(usdot._years)

calculate_average_cargo

calculate_average_cargo(year, acft)

Given a year and aircraft designator, returns the average freight and mail transported.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft str

US DOT aircraft designator string (e.g. 'B739').

required

Returns:

Type Description
Quantity

Average freight and mail transported per flight for the given aircraft type and year, in kilograms.

Raises:

Type Description
ValueError

If the year is not available in the model.

ValueError

If the aircraft designator is not found in the model data for the given year.

Source code in jetfuelburn/statistics.py
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
def calculate_average_cargo(
    year: int,
    acft: str,
) -> dict:
    """
    Given a year and aircraft designator, returns the average freight and mail transported.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft : str
        US DOT aircraft designator string (e.g. ``'B739'``).

    Returns
    -------
    pint.Quantity
        Average freight and mail transported per flight for the given aircraft
        type and year, in kilograms.

    Raises
    ------
    ValueError
        If the year is not available in the model.
    ValueError
        If the aircraft designator is not found in the model data for the given year.
    """
    if year not in usdot._years:
        raise ValueError(f"No data available for year '{year}'.")
    if acft not in usdot._aircraft_data[year]:
        raise ValueError(
            f"US DOT Aircraft Designator '{acft}' not found in model data."
        )
    else:
        aircraft_data = usdot._aircraft_data[year][acft]

    cargo = aircraft_data["Freight and mail transported"] * ureg("kg")
    cargo = cargo.to("kg")
    return cargo

calculate_average_distance

calculate_average_distance(year, acft)

Given a year and aircraft designator, returns the average trip distance.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft str

US DOT aircraft designator string (e.g. 'B739').

required

Returns:

Type Description
Quantity

Average trip distance for the given aircraft type and year, in kilometres.

Raises:

Type Description
ValueError

If the year is not available in the model.

ValueError

If the aircraft designator is not found in the model data for the given year.

Source code in jetfuelburn/statistics.py
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
def calculate_average_distance(
    year: int,
    acft: str,
) -> dict:
    """
    Given a year and aircraft designator, returns the average trip distance.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft : str
        US DOT aircraft designator string (e.g. ``'B739'``).

    Returns
    -------
    pint.Quantity
        Average trip distance for the given aircraft type and year, in kilometres.

    Raises
    ------
    ValueError
        If the year is not available in the model.
    ValueError
        If the aircraft designator is not found in the model data for the given year.
    """

    if year not in usdot._years:
        raise ValueError(f"No data available for year '{year}'.")
    if acft not in usdot._aircraft_data[year]:
        raise ValueError(
            f"US DOT Aircraft Designator '{acft}' not found in model data."
        )
    else:
        aircraft_data = usdot._aircraft_data[year][acft]

    distance = aircraft_data["Average trip distance"] * ureg("km")
    distance = distance.to("km")
    return distance

calculate_average_pax

calculate_average_pax(year, acft)

Given a year and aircraft designator, returns the average number of passengers per flight.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft str

US DOT aircraft designator string (e.g. 'B739').

required

Returns:

Type Description
int or float

Average number of passengers per flight for the given aircraft type and year.

Raises:

Type Description
ValueError

If the year is not available in the model.

ValueError

If the aircraft designator is not found in the model data for the given year.

Source code in jetfuelburn/statistics.py
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
def calculate_average_pax(
    year: int,
    acft: str,
) -> dict:
    """
    Given a year and aircraft designator, returns the average number of passengers per flight.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft : str
        US DOT aircraft designator string (e.g. ``'B739'``).

    Returns
    -------
    int or float
        Average number of passengers per flight for the given aircraft type and year.

    Raises
    ------
    ValueError
        If the year is not available in the model.
    ValueError
        If the aircraft designator is not found in the model data for the given year.
    """
    if year not in usdot._years:
        raise ValueError(f"No data available for year '{year}'.")
    if acft not in usdot._aircraft_data[year]:
        raise ValueError(
            f"US DOT Aircraft Designator '{acft}' not found in model data."
        )
    else:
        aircraft_data = usdot._aircraft_data[year][acft]

    pax = aircraft_data["Average PAX per flight"]
    return pax

calculate_average_time

calculate_average_time(year, acft)

Given a year and aircraft designator, returns the average trip flight time.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft str

US DOT aircraft designator string (e.g. 'B739').

required

Returns:

Type Description
Quantity

Average trip flight time for the given aircraft type and year, in hours.

Raises:

Type Description
ValueError

If the year is not available in the model.

ValueError

If the aircraft designator is not found in the model data for the given year.

Source code in jetfuelburn/statistics.py
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
def calculate_average_time(
    year: int,
    acft: str,
) -> dict:
    """
    Given a year and aircraft designator, returns the average trip flight time.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft : str
        US DOT aircraft designator string (e.g. ``'B739'``).

    Returns
    -------
    pint.Quantity
        Average trip flight time for the given aircraft type and year, in hours.

    Raises
    ------
    ValueError
        If the year is not available in the model.
    ValueError
        If the aircraft designator is not found in the model data for the given year.
    """
    if year not in usdot._years:
        raise ValueError(f"No data available for year '{year}'.")
    if acft not in usdot._aircraft_data[year]:
        raise ValueError(
            f"US DOT Aircraft Designator '{acft}' not found in model data."
        )
    else:
        aircraft_data = usdot._aircraft_data[year][acft]

    time = aircraft_data["Average trip flight time"] * ureg("h")
    time = time.to("h")
    return time

calculate_fuel_consumption_per_seat staticmethod

calculate_fuel_consumption_per_seat(year, acft, R)

Given an aircraft name and range, calculates the fuel burned during flight per passenger.

Data is based on averages of fuel consumption per passenger-distance flown by specific aircraft types, in specific years, reported by "large certified air carriers" to the US Department of Transport (US DOT):

\[ f = \frac{F(t=\text{year})}{paxD(t=\text{year})} * R \]

where:

Symbol Units Description
\(f\) [kg] Fuel burned during flight
\(F\) [kg] Total fuel consumption for a specific aircraft type in a specific year
\(paxD\) [kg*km] Total passenger-distance flown on a specific aircraft type in a specific year
\(R\) [km] Range of the flight
Warnings

Aircraft types here are given as full-length strings, e.g. "Boeing 737-800", instead of the ususal ICAO designator "B738". These are taken directly from the L_AIRCRAFT_TYPE.csv US DOT lookup table file.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft str

Aircraft type to be used for the calculation.

required
R Quantity

Range of the flight.

required

Returns:

Type Description
Quantity

Fuel burned per passenger during flight.

Raises:

Type Description
ValueError

If the range is negative. If the year is not available in the model. If the aircraft type is not available in the model for the given year.

Source code in jetfuelburn/statistics.py
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
@staticmethod
@ureg.check(
    None,
    None,
    "[length]",
)
def calculate_fuel_consumption_per_seat(
    year: int,
    acft: str,
    R: float,
) -> dict:
    r"""
    Given an aircraft name and range, calculates the fuel burned during flight per passenger.

    Data is based on averages of fuel consumption per passenger-distance flown by specific aircraft types,
    in specific years, reported by "large certified air carriers" to the US Department of Transport (US DOT):

    $$
    f = \frac{F(t=\text{year})}{paxD(t=\text{year})} * R
    $$

    where:

    | Symbol | Units   | Description                                                                   |
    | ------ | ------- | ----------------------------------------------------------------------------- |
    | $f$    | [kg]    | Fuel burned during flight                                                     |
    | $F$    | [kg]    | Total fuel consumption for a specific aircraft type in a specific year        |
    | $paxD$ | [kg*km] | Total passenger-distance flown on a specific aircraft type in a specific year |
    | $R$    | [km]    | Range of the flight                                                           |

    Warnings
    --------
    Aircraft types here are given as full-length strings, e.g. "Boeing 737-800", instead of the ususal ICAO designator "B738".
    These are taken directly from the `L_AIRCRAFT_TYPE.csv` US DOT lookup table file.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft : str
        Aircraft type to be used for the calculation.
    R : pint.Quantity
        Range of the flight.

    Returns
    -------
    pint.Quantity
        Fuel burned per passenger during flight.

    Raises
    ------
    ValueError
        If the range is negative.
        If the year is not available in the model.
        If the aircraft type is not available in the model for the given year.
    """
    if R.magnitude < 0:
        raise ValueError(f"Range must not be negative.")
    else:
        R = R.to("km")

    if year not in usdot._years:
        raise ValueError(f"No data available for year '{year}'.")
    if acft not in usdot._aircraft_data[year]:
        raise ValueError(
            f"US DOT Aircraft Designator '{acft}' not found in model data."
        )
    else:
        aircraft_data = usdot._aircraft_data[year][acft]

    fuelburn = (aircraft_data["Fuel/Revenue Seat Distance"] * ureg("kg/km")) * R
    fuelburn = fuelburn.to("kg")
    return fuelburn

calculate_fuel_consumption_per_weight staticmethod

calculate_fuel_consumption_per_weight(year, acft, R, W)

Given an aircraft name, range and payload weight, calculates the fuel burned during flight.

Data is based on averages of fuel consumption per weight-distance flown by specific aircraft types, in specific years, reported by "large certified air carriers" to the US Department of Transport (US DOT):

\[ f = \frac{F(t=\text{year})}{WD(t=\text{year})} * R * W \]

where:

Symbol Units Description
\(f\) [kg] Fuel burned during flight
\(F\) [kg] Total fuel consumption for a specific aircraft type in a specific year
\(WD\) [kg*km] Total weight-distance flown on a specific aircraft type in a specific year
\(R\) [km] Range of the flight
\(W\) [kg] Payload weight of the flight
Warnings

Aircraft types here are given as full-length strings, e.g. "Boeing 737-800", instead of the ususal ICAO designator "B738". These are taken directly from the L_AIRCRAFT_TYPE.csv US DOT lookup table file.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft str

Aircraft type to be used for the calculation.

required
R Quantity

Range of the flight.

required
W Quantity

Payload weight of the flight.

required

Returns:

Type Description
Quantity

Fuel burned during flight.

Raises:

Type Description
ValueError

If the range or weight is negative. If the year is not available in the model. If the aircraft type is not available in the model for the given year.

Source code in jetfuelburn/statistics.py
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
@staticmethod
@ureg.check(
    None,
    None,
    "[length]",
    "[mass]",
)
def calculate_fuel_consumption_per_weight(
    year: int,
    acft: str,
    R: float,
    W: float,
) -> dict:
    r"""
    Given an aircraft name, range and payload weight, calculates the fuel burned during flight.

    Data is based on averages of fuel consumption per weight-distance flown by specific aircraft types,
    in specific years, reported by "large certified air carriers" to the US Department of Transport (US DOT):

    $$
    f = \frac{F(t=\text{year})}{WD(t=\text{year})} * R * W
    $$

    where:

    | Symbol | Units   | Description                                                                 |
    | ------ | ------- | --------------------------------------------------------------------------- |
    | $f$    | [kg]    | Fuel burned during flight                                                   |
    | $F$    | [kg]    | Total fuel consumption for a specific aircraft type in a specific year      |
    | $WD$   | [kg*km] | Total weight-distance flown on a specific aircraft type in a specific year  |
    | $R$    | [km]    | Range of the flight                                                         |
    | $W$    | [kg]    | Payload weight of the flight                                                |

    Warnings
    --------
    Aircraft types here are given as full-length strings, e.g. "Boeing 737-800", instead of the ususal ICAO designator "B738".
    These are taken directly from the `L_AIRCRAFT_TYPE.csv` US DOT lookup table file.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft : str
        Aircraft type to be used for the calculation.
    R : pint.Quantity
        Range of the flight.
    W : pint.Quantity
        Payload weight of the flight.

    Returns
    -------
    pint.Quantity
        Fuel burned during flight.

    Raises
    ------
    ValueError
        If the range or weight is negative.
        If the year is not available in the model.
        If the aircraft type is not available in the model for the given year.
    """
    if R.magnitude < 0 or W.magnitude < 0:
        raise ValueError(f"Range and/or weight must not be negative.")
    else:
        R = R.to("km")
        W = W.to("kg")

    if year not in usdot._years:
        raise ValueError(f"No data available for year '{year}'.")
    if acft not in usdot._aircraft_data[year]:
        raise ValueError(
            f"US DOT Aircraft Designator '{acft}' not found in model data."
        )
    else:
        aircraft_data = usdot._aircraft_data[year][acft]

    fuelburn = (
        (aircraft_data["Fuel/Revenue Weight Distance"] * ureg("1/km")) * R * W
    )
    fuelburn = fuelburn.to("kg")

    return fuelburn

calculate_movements

calculate_movements(year, acft)

Given a year and aircraft designator, returns the number of flights captured.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required
acft str

US DOT aircraft designator string (e.g. 'B739').

required

Returns:

Type Description
int or float

Number of flights captured for the given aircraft type and year.

Raises:

Type Description
ValueError

If the year is not available in the model.

ValueError

If the aircraft designator is not found in the model data for the given year.

Source code in jetfuelburn/statistics.py
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
def calculate_movements(
    year: int,
    acft: str,
) -> dict:
    """
    Given a year and aircraft designator, returns the number of flights captured.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.
    acft : str
        US DOT aircraft designator string (e.g. ``'B739'``).

    Returns
    -------
    int or float
        Number of flights captured for the given aircraft type and year.

    Raises
    ------
    ValueError
        If the year is not available in the model.
    ValueError
        If the aircraft designator is not found in the model data for the given year.
    """
    if year not in usdot._years:
        raise ValueError(f"No data available for year '{year}'.")
    if acft not in usdot._aircraft_data[year]:
        raise ValueError(
            f"US DOT Aircraft Designator '{acft}' not found in model data."
        )
    else:
        aircraft_data = usdot._aircraft_data[year][acft]

    movements = aircraft_data["Number of flights captured"]
    return movements

calculate_total_fuel_consumption staticmethod

calculate_total_fuel_consumption(year)

Given a year, returns the total fuel burned by all aircraft types combined.

Calculated as:

\[ F_{\text{total}} = \sum_{\text{acft}} \frac{F}{\text{paxD}} \cdot \text{paxD} \]

where \(F/\text{paxD}\) is the Fuel/Revenue Seat Distance field (kg per pax-km) and \(\text{paxD}\) is the Revenue PAX km field (pax-km) for each aircraft type.

Parameters:

Name Type Description Default
year int

Year of the data to be used for the calculation.

required

Returns:

Type Description
Quantity

Total fuel burned by all aircraft types combined, in kg.

Raises:

Type Description
ValueError

If the year is not available in the model.

Source code in jetfuelburn/statistics.py
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
@staticmethod
def calculate_total_fuel_consumption(year: int) -> float:
    r"""
    Given a year, returns the total fuel burned by all aircraft types combined.

    Calculated as:

    $$
    F_{\text{total}} = \sum_{\text{acft}} \frac{F}{\text{paxD}} \cdot \text{paxD}
    $$

    where $F/\text{paxD}$ is the ``Fuel/Revenue Seat Distance`` field (kg per pax-km)
    and $\text{paxD}$ is the ``Revenue PAX km`` field (pax-km) for each aircraft type.

    Parameters
    ----------
    year : int
        Year of the data to be used for the calculation.

    Returns
    -------
    pint.Quantity
        Total fuel burned by all aircraft types combined, in kg.

    Raises
    ------
    ValueError
        If the year is not available in the model.
    """
    if year not in usdot._years:
        raise ValueError(
            f"No data available for year '{year}'. Please select one of the following: {usdot.available_years()}"
        )

    total_kg = sum(
        data["Fuel/Revenue Seat Distance"] * data["Revenue PAX km"]
        for data in usdot._aircraft_data[year].values()
        if data["Fuel/Revenue Seat Distance"] is not None
        and data["Revenue PAX km"] is not None
    )
    return (total_kg * ureg("kg")).to("kg")