earth 0.7.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/certification_changelog.markdown +21 -0
- data/lib/earth/air.rb +0 -2
- data/lib/earth/air/aircraft.rb +77 -27
- data/lib/earth/air/aircraft/data_miner.rb +12 -19
- data/lib/earth/air/aircraft_instance.rb +2 -0
- data/lib/earth/air/aircraft_instance_seat_class.rb +1 -0
- data/lib/earth/air/airport/data_miner.rb +1 -1
- data/lib/earth/air/data_miner.rb +0 -2
- data/lib/earth/air/flight_distance_class.rb +2 -3
- data/lib/earth/air/flight_distance_class/data_miner.rb +0 -13
- data/lib/earth/air/flight_distance_class_seat_class.rb +3 -2
- data/lib/earth/air/flight_seat_class.rb +0 -6
- data/lib/earth/air/flight_seat_class/data_miner.rb +0 -7
- data/lib/earth/air/flight_segment.rb +47 -53
- data/lib/earth/air/flight_segment/data_miner.rb +2 -2
- data/lib/earth/automobile.rb +4 -3
- data/lib/earth/automobile/automobile_fuel.rb +56 -119
- data/lib/earth/automobile/automobile_fuel/data_miner.rb +17 -4
- data/lib/earth/automobile/automobile_make.rb +1 -16
- data/lib/earth/automobile/automobile_make/data_miner.rb +25 -25
- data/lib/earth/automobile/automobile_make_model.rb +0 -26
- data/lib/earth/automobile/automobile_make_model/data_miner.rb +12 -13
- data/lib/earth/automobile/automobile_make_model_year.rb +6 -37
- data/lib/earth/automobile/automobile_make_model_year/data_miner.rb +34 -18
- data/lib/earth/automobile/automobile_make_model_year_variant.rb +27 -49
- data/lib/earth/automobile/automobile_make_model_year_variant/data_miner.rb +111 -140
- data/lib/earth/automobile/automobile_make_year.rb +0 -12
- data/lib/earth/automobile/automobile_make_year/data_miner.rb +22 -23
- data/lib/earth/automobile/automobile_make_year_fleet.rb +11 -0
- data/lib/earth/automobile/{automobile_make_fleet_year → automobile_make_year_fleet}/data_miner.rb +1 -2
- data/lib/earth/automobile/automobile_model.rb +5 -0
- data/lib/earth/automobile/automobile_model/data_miner.rb +19 -0
- data/lib/earth/automobile/automobile_size_class.rb +1 -0
- data/lib/earth/automobile/automobile_size_class/data_miner.rb +30 -4
- data/lib/earth/automobile/automobile_type_fuel_year.rb +1 -1
- data/lib/earth/automobile/automobile_type_fuel_year/data_miner.rb +30 -19
- data/lib/earth/automobile/automobile_type_fuel_year_age.rb +0 -3
- data/lib/earth/automobile/automobile_type_fuel_year_age/data_miner.rb +13 -15
- data/lib/earth/automobile/automobile_type_fuel_year_control.rb +0 -4
- data/lib/earth/automobile/automobile_type_fuel_year_control/data_miner.rb +0 -8
- data/lib/earth/automobile/automobile_type_year.rb +2 -1
- data/lib/earth/automobile/automobile_type_year/data_miner.rb +12 -10
- data/lib/earth/automobile/automobile_year.rb +5 -0
- data/lib/earth/automobile/automobile_year/data_miner.rb +15 -0
- data/lib/earth/automobile/data_miner.rb +5 -3
- data/lib/earth/automobile/dependencies.txt +45 -0
- data/lib/earth/bus/bus_class.rb +1 -87
- data/lib/earth/bus/bus_class/data_miner.rb +0 -1
- data/lib/earth/bus/bus_fuel/data_miner.rb +12 -19
- data/lib/earth/bus/bus_fuel_control/data_miner.rb +8 -12
- data/lib/earth/conversions_ext.rb +1 -0
- data/lib/earth/fuel/fuel/data_miner.rb +28 -38
- data/lib/earth/fuel/fuel_year/data_miner.rb +36 -47
- data/lib/earth/hospitality/lodging_class/data_miner.rb +12 -6
- data/lib/earth/locality.rb +1 -0
- data/lib/earth/locality/country.rb +1 -1
- data/lib/earth/locality/country/data_miner.rb +36 -28
- data/lib/earth/locality/data_miner.rb +1 -0
- data/lib/earth/locality/egrid_subregion/data_miner.rb +19 -14
- data/lib/earth/locality/urbanity/data_miner.rb +1 -3
- data/lib/earth/locality/zip_code/data_miner.rb +1 -1
- data/lib/earth/rail/national_transit_database_record/data_miner.rb +10 -14
- data/lib/earth/rail/rail_fuel.rb +2 -6
- data/lib/earth/residence/air_conditioner_use/data_miner.rb +1 -3
- data/lib/earth/residence/clothes_machine_use/data_miner.rb +1 -3
- data/lib/earth/residence/dishwasher_use/data_miner.rb +1 -3
- data/lib/earth/residence/residence_class/data_miner.rb +1 -3
- data/lib/earth/residence/residential_energy_consumption_survey_response/data_miner.rb +3 -1
- data/lib/earth/utils.rb +15 -5
- data/lib/earth/version.rb +1 -1
- data/spec/earth_spec.rb +4 -4
- metadata +9 -11
- data/features/automobile_type_fuel_age.feature +0 -55
- data/lib/earth/air/aircraft_class.rb +0 -59
- data/lib/earth/air/aircraft_class/data_miner.rb +0 -14
- data/lib/earth/air/aircraft_fuel_use_equation.rb +0 -33
- data/lib/earth/air/aircraft_fuel_use_equation/data_miner.rb +0 -13
- data/lib/earth/automobile/automobile_make_fleet_year.rb +0 -46
- data/lib/earth/automobile/automobile_type_fuel_age.rb +0 -65
- data/lib/earth/automobile/automobile_type_fuel_age/data_miner.rb +0 -149
@@ -0,0 +1,21 @@
|
|
1
|
+
# Material changes
|
2
|
+
- Add energy content to AutomobileFuel (c0edd440e89bb201c37b449dbf0db8f3f5e69726)
|
3
|
+
- Add hybridity and fuel code to AutomobileMakeModelYear (8d619575bc399b26abef16d4a033abb94fb9b60b)
|
4
|
+
- Add European rail data (82d4a301f58012d38ca66a93a23703a41f5c2f94)
|
5
|
+
- New seat class data (3e1bd6f4b41961f420a17aac566244054b0a790b)
|
6
|
+
- Update curated airlines (4ded9ce3ce1485e1051da4b313b61e18d760229d)
|
7
|
+
- Add US average eGRID region loss factor (a6c0176d9bb1b51c695d101513d1c32940c86e89)
|
8
|
+
- Air improvements: ICAO data in CM1, fuzzy matching aircraft -> flight segment, fuel use data in AircraftFuelUseEquation, improve Airport and Aircraft import errata (6e2becd74c625905ae3ca40f0c0bd9b9fb652939)
|
9
|
+
|
10
|
+
# Immaterial changes
|
11
|
+
- New zipcode eGRID subregion data (ebbb08a5ffcc118f311d2fca61b7ce9e0c4d4c2d)
|
12
|
+
- Allow users to input automobile 'make', 'model', and 'year' (97d793ea3de14a4e7eef0b0b4ca883011f52038e)
|
13
|
+
- New 2010 FEG file (2c678d7d452da97b41bdf5311c399f7a84efe9cf)
|
14
|
+
- New zipcode eGRID subregion data (a64add803285c836c03ed3f66f70bf6d3e4affc5)
|
15
|
+
- Add 2011 FEG data (7c94ad50e53c6a064c862715c0afd5fdbd183873)
|
16
|
+
- Revise computation data (4ced1779d2e45948143a84b2fc1699ef8d298d63)
|
17
|
+
- New zipcode eGRID subregion data (af754e84468b47fa8fe7847072bd884a0c6a2b27)
|
18
|
+
- Move some automobile data and fallbacks to Country (253215c0f914bc8bab31f64acdbfd3d7cecdd644)
|
19
|
+
|
20
|
+
# Latest 3rd-party review
|
21
|
+
f08c4cad8f30542bda5d49d0a4bbafffc451edaa
|
data/lib/earth/air.rb
CHANGED
data/lib/earth/air/aircraft.rb
CHANGED
@@ -1,25 +1,9 @@
|
|
1
1
|
class Aircraft < ActiveRecord::Base
|
2
2
|
set_primary_key :icao_code
|
3
3
|
|
4
|
-
|
5
|
-
belongs_to :fuel_use_equation, :foreign_key => 'fuel_use_code', :primary_key => 'code', :class_name => 'AircraftFuelUseEquation'
|
6
|
-
|
7
|
-
col :icao_code
|
8
|
-
col :manufacturer_name
|
9
|
-
col :model_name
|
10
|
-
col :description
|
11
|
-
col :aircraft_type
|
12
|
-
col :engine_type
|
13
|
-
col :engines, :type => :integer
|
14
|
-
col :weight_class
|
15
|
-
col :class_code
|
16
|
-
col :fuel_use_code
|
17
|
-
col :seats, :type => :float
|
18
|
-
col :passengers, :type => :float
|
19
|
-
|
20
|
-
# Enable aircraft.flight_segments
|
4
|
+
# Fuzzy association with FlightSegment
|
21
5
|
cache_loose_tight_dictionary_matches_with :flight_segments, :primary_key => :description, :foreign_key => :aircraft_description
|
22
|
-
|
6
|
+
|
23
7
|
class << self
|
24
8
|
# set up a loose_tight_dictionary for matching Aircraft description with FlightSegment aircraft_description
|
25
9
|
def loose_tight_dictionary
|
@@ -31,18 +15,49 @@ class Aircraft < ActiveRecord::Base
|
|
31
15
|
:must_match_blocking => true,
|
32
16
|
:first_blocking_decides => true)
|
33
17
|
end
|
34
|
-
|
18
|
+
|
35
19
|
# FIXME TODO do we want to restrict this to certain years?
|
36
20
|
# Derive some average characteristics from flight segments
|
37
21
|
def update_averages!
|
22
|
+
# Setup fuzzy matches with FlightSegment
|
38
23
|
manually_cache_flight_segments!
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
24
|
+
|
25
|
+
# Calculate seats and passengers for each aircraft based on associated flight_segments
|
26
|
+
find_each do |a|
|
27
|
+
if a.seats = a.flight_segments.weighted_average(:seats_per_flight, :weighted_by => :passengers)
|
28
|
+
a.seats_specificity = 'aircraft'
|
29
|
+
end
|
30
|
+
if (passengers = a.flight_segments.sum(:passengers)) > 0
|
31
|
+
a.passengers = passengers
|
32
|
+
end
|
33
|
+
a.save!
|
34
|
+
end
|
35
|
+
|
36
|
+
# Calculate seats for any aircraft that don't have any flight_segments by averaging across all aircraft with flight segments in the aircraft class
|
37
|
+
where(:seats => nil).find_each do |a|
|
38
|
+
if a.seats = where(:class_code => a.class_code, :seats_specificity => 'aircraft').weighted_average(:seats, :weighted_by => :passengers)
|
39
|
+
a.seats_specificity = 'aircraft_class'
|
40
|
+
a.save!
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# Calculate any missing fuel use coefficients by averaging across all aircraft with fuel use coefficients in the same aircraft class
|
45
|
+
where(:m3 => nil).find_each do |a|
|
46
|
+
a.m3 = where(:class_code => a.class_code, :fuel_use_specificity => 'aircraft').weighted_average(:m3, :weighted_by => :passengers)
|
47
|
+
a.m2 = where(:class_code => a.class_code, :fuel_use_specificity => 'aircraft').weighted_average(:m2, :weighted_by => :passengers)
|
48
|
+
a.m1 = where(:class_code => a.class_code, :fuel_use_specificity => 'aircraft').weighted_average(:m1, :weighted_by => :passengers)
|
49
|
+
a.b = where(:class_code => a.class_code, :fuel_use_specificity => 'aircraft').weighted_average(:b, :weighted_by => :passengers)
|
50
|
+
if a.valid_fuel_use_equation?
|
51
|
+
a.m3_units = 'kilograms_per_cubic_nautical_mile'
|
52
|
+
a.m2_units = 'kilograms_per_square_nautical_mile'
|
53
|
+
a.m1_units = 'kilograms_per_nautical_mile'
|
54
|
+
a.b_units = 'kilograms'
|
55
|
+
a.fuel_use_specificity = 'aircraft_class'
|
56
|
+
a.save!
|
57
|
+
end
|
43
58
|
end
|
44
59
|
end
|
45
|
-
|
60
|
+
|
46
61
|
# Cache fuzzy matches between FlightSegment aircraft_description and Aircraft description
|
47
62
|
def manually_cache_flight_segments!
|
48
63
|
FlightSegment.run_data_miner!
|
@@ -56,16 +71,16 @@ class Aircraft < ActiveRecord::Base
|
|
56
71
|
# Pull out the complete first aircraft description
|
57
72
|
# e.g. 'boeing 747-100'
|
58
73
|
first_description = original_description.split('/')[0]
|
59
|
-
|
74
|
+
|
60
75
|
# Pull out the root of the description - the text up to and including the last ' ' or '-'
|
61
76
|
# e.g. 'boeing 747-'
|
62
77
|
root_length = first_description.rindex(/[ \-]/)
|
63
78
|
root = first_description.slice(0..root_length)
|
64
|
-
|
79
|
+
|
65
80
|
# Pull out the suffixes - the text separated by forward slashes
|
66
81
|
# e.g. ['100', '200']
|
67
82
|
suffixes = original_description.split(root)[1].split('/')
|
68
|
-
|
83
|
+
|
69
84
|
# Create an array of synthesized descriptions by appending each suffix to the root
|
70
85
|
# e.g. ['boeing 747-100', 'boeing 747-200']
|
71
86
|
suffixes.map{ |suffix| root + suffix }.each do |synthesized_description|
|
@@ -91,4 +106,39 @@ class Aircraft < ActiveRecord::Base
|
|
91
106
|
end
|
92
107
|
end
|
93
108
|
end
|
109
|
+
|
110
|
+
def valid_fuel_use_equation?
|
111
|
+
[m3, m2, m1, b].all?(&:present?) and [m3, m2, m1, b].any?(&:nonzero?)
|
112
|
+
end
|
113
|
+
|
114
|
+
falls_back_on :m3 => lambda { weighted_average(:m3, :weighted_by => :passengers) }, # 9.73423082858437e-08 r7110: 8.6540464368905e-8 r6972: 8.37e-8
|
115
|
+
:m2 => lambda { weighted_average(:m2, :weighted_by => :passengers) }, # -0.000134350543484608 r7110: -0.00015337661447817 r6972: -4.09e-5
|
116
|
+
:m1 => lambda { weighted_average(:m1, :weighted_by => :passengers) }, # 6.7728101555467 r7110: 4.7781966869412 r6972: 7.85
|
117
|
+
:b => lambda { weighted_average(:b, :weighted_by => :passengers) }, # 1527.81790006167 r7110: 1065.3476555284 r6972: 1.72e3
|
118
|
+
:m3_units => 'kilograms_per_cubic_nautical_mile',
|
119
|
+
:m2_units => 'kilograms_per_square_nautical_mile',
|
120
|
+
:m1_units => 'kilograms_per_nautical_mile',
|
121
|
+
:b_units => 'kilograms'
|
122
|
+
|
123
|
+
col :icao_code
|
124
|
+
col :manufacturer_name
|
125
|
+
col :model_name
|
126
|
+
col :description
|
127
|
+
col :aircraft_type
|
128
|
+
col :engine_type
|
129
|
+
col :engines, :type => :integer
|
130
|
+
col :weight_class
|
131
|
+
col :class_code
|
132
|
+
col :passengers, :type => :float
|
133
|
+
col :seats, :type => :float
|
134
|
+
col :seats_specificity
|
135
|
+
col :m3, :type => :float
|
136
|
+
col :m3_units
|
137
|
+
col :m2, :type => :float
|
138
|
+
col :m2_units
|
139
|
+
col :m1, :type => :float
|
140
|
+
col :m1_units
|
141
|
+
col :b, :type => :float
|
142
|
+
col :b_units
|
143
|
+
col :fuel_use_specificity
|
94
144
|
end
|
@@ -51,34 +51,27 @@ Aircraft.class_eval do
|
|
51
51
|
store 'weight_class'
|
52
52
|
end
|
53
53
|
|
54
|
-
import "
|
55
|
-
:url => 'https://
|
54
|
+
import "aircraft fuel use equations derived from EMEP/EEA and ICAO",
|
55
|
+
:url => 'https://docs.google.com/spreadsheet/pub?key=0AoQJbWqPrREqdEhYenF3dGt1T0Y1cTdneUNsNjV0dEE&output=csv' do
|
56
56
|
key 'icao_code'
|
57
|
-
store '
|
57
|
+
store 'm3', :units_field_name => 'm3_units'
|
58
|
+
store 'm2', :units_field_name => 'm2_units'
|
59
|
+
store 'm1', :units_field_name => 'm1_units'
|
60
|
+
store 'b', :units_field_name => 'b_units'
|
61
|
+
store 'fuel_use_specificity', :static => 'aircraft'
|
58
62
|
end
|
59
63
|
|
60
64
|
process "Synthesize description from manufacturer name and model name" do
|
61
|
-
|
62
|
-
aircraft.update_attribute :description, [aircraft.manufacturer_name, aircraft.model_name].join(' ').downcase
|
63
|
-
end
|
65
|
+
update_all "description = LOWER(manufacturer_name || ' ' || model_name)"
|
64
66
|
end
|
65
67
|
|
66
68
|
process "Synthesize class code from engine type and weight class" do
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
'Light'
|
71
|
-
when 'Large', 'Medium'
|
72
|
-
'Medium'
|
73
|
-
else
|
74
|
-
'Heavy'
|
75
|
-
end
|
76
|
-
aircraft.update_attribute :class_code, [size, aircraft.engines.to_s, 'engine', aircraft.engine_type].join(' ')
|
77
|
-
end
|
69
|
+
where(:weight_class => ['Small', 'Small+', 'Light']).update_all "class_code = 'Light ' || engines || ' engine ' || engine_type"
|
70
|
+
where(:weight_class => ['Medium', 'Large'] ).update_all "class_code = 'Medium ' || engines || ' engine ' || engine_type"
|
71
|
+
where(:weight_class => 'Heavy' ).update_all "class_code = 'Heavy ' || engines || ' engine ' || engine_type"
|
78
72
|
end
|
79
73
|
|
74
|
+
# Calculate seats and passengers from flight_segments
|
80
75
|
process :update_averages!
|
81
|
-
|
82
|
-
# FIXME TODO verify this
|
83
76
|
end
|
84
77
|
end
|
@@ -46,7 +46,7 @@ Airport.class_eval do
|
|
46
46
|
process "Fill in blank country codes" do
|
47
47
|
Country.find_each do |country|
|
48
48
|
next unless country.name.present? and country.iso_3166_code.present?
|
49
|
-
|
49
|
+
where(["country_name LIKE ?", country.name]).update_all :country_iso_3166_code => country.iso_3166_code
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
data/lib/earth/air/data_miner.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'earth/air/aircraft/data_miner'
|
2
|
-
require 'earth/air/aircraft_class/data_miner'
|
3
|
-
require 'earth/air/aircraft_fuel_use_equation/data_miner'
|
4
2
|
require 'earth/air/airline/data_miner'
|
5
3
|
require 'earth/air/airport/data_miner'
|
6
4
|
require 'earth/air/bts_aircraft/data_miner'
|
@@ -2,7 +2,7 @@ class FlightDistanceClass < ActiveRecord::Base
|
|
2
2
|
set_primary_key :name
|
3
3
|
|
4
4
|
def self.find_by_distance(distance)
|
5
|
-
first :conditions => arel_table[:min_distance].lteq(distance).and(arel_table[:max_distance].gt(distance))
|
5
|
+
first :conditions => arel_table[:min_distance].lteq(distance.to_f).and(arel_table[:max_distance].gt(distance.to_f))
|
6
6
|
end
|
7
7
|
|
8
8
|
col :name
|
@@ -12,5 +12,4 @@ class FlightDistanceClass < ActiveRecord::Base
|
|
12
12
|
col :min_distance_units
|
13
13
|
col :max_distance, :type => :float
|
14
14
|
col :max_distance_units
|
15
|
-
|
16
|
-
end
|
15
|
+
end
|
@@ -11,18 +11,5 @@ FlightDistanceClass.class_eval do
|
|
11
11
|
# FIXME TODO verify that min_distance >= 0
|
12
12
|
# FIXME TODO verify that max_distance > 0
|
13
13
|
# FIXME TODO verify that distance class distance bounds don't overlap
|
14
|
-
|
15
|
-
process "Ensure FlightSegment is populated" do
|
16
|
-
FlightSegment.run_data_miner!
|
17
|
-
end
|
18
|
-
|
19
|
-
process "Calculate passengers for each distance class" do
|
20
|
-
find_each do |distance_class|
|
21
|
-
distance_class.passengers = FlightSegment.distances_between(distance_class.min_distance, distance_class.max_distance).sum(:passengers)
|
22
|
-
distance_class.save!
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# FIXME TODO verify this
|
27
14
|
end
|
28
15
|
end
|
@@ -1,10 +1,11 @@
|
|
1
1
|
class FlightDistanceClassSeatClass < ActiveRecord::Base
|
2
2
|
set_primary_key :name
|
3
3
|
|
4
|
-
|
4
|
+
falls_back_on :name => 'fallback',
|
5
|
+
:multiplier => 1.0
|
5
6
|
|
6
7
|
col :name
|
7
8
|
col :distance_class_name
|
8
9
|
col :seat_class_name
|
9
10
|
col :multiplier, :type => :float
|
10
|
-
end
|
11
|
+
end
|
@@ -1,11 +1,5 @@
|
|
1
1
|
class FlightSeatClass < ActiveRecord::Base
|
2
2
|
set_primary_key :name
|
3
3
|
|
4
|
-
has_many :distance_class_seat_classes, :foreign_key => 'seat_class_name', :primary_key => 'name', :class_name => 'FlightDistanceClassSeatClass'
|
5
|
-
|
6
|
-
falls_back_on :name => 'fallback',
|
7
|
-
:multiplier => 1
|
8
|
-
|
9
4
|
col :name
|
10
|
-
col :multiplier, :type => :float
|
11
5
|
end
|
@@ -9,12 +9,5 @@ FlightSeatClass.class_eval do
|
|
9
9
|
find_or_create_by_name seat_class_name
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
13
|
-
process "Calculate multipliers from FlightDistanceClassSeatClass and FlightDistanceClass" do
|
14
|
-
find_each do |seat_class|
|
15
|
-
seat_class.multiplier = seat_class.distance_class_seat_classes.weighted_average(:multiplier, :weighted_by => [:distance_class, :passengers])
|
16
|
-
seat_class.save!
|
17
|
-
end
|
18
|
-
end
|
19
12
|
end
|
20
13
|
end
|
@@ -14,41 +14,57 @@ class FlightSegment < ActiveRecord::Base
|
|
14
14
|
# Enable flight_segment.aircraft
|
15
15
|
cache_loose_tight_dictionary_matches_with :aircraft, :primary_key => :aircraft_description, :foreign_key => :description
|
16
16
|
|
17
|
+
class << self
|
18
|
+
def update_averages!
|
19
|
+
# Derive load factor, which is passengers divided by available seats
|
20
|
+
where('seats > 0').update_all 'load_factor = 1.0 * passengers / seats'
|
21
|
+
|
22
|
+
# Assume a load factor of 1 where passengers > available seats
|
23
|
+
where('passengers > seats AND seats > 0').update_all 'load_factor = 1'
|
24
|
+
|
25
|
+
# FIXME TODO: what is 90.718474
|
26
|
+
# Derive freight share as a fraction of the total weight carried
|
27
|
+
where('(freight + mail + passengers) > 0').update_all 'freight_share = 1.0 * (freight + mail) / (freight + mail + (passengers * 90.718474))'
|
28
|
+
|
29
|
+
# Derive average seats per flight
|
30
|
+
where('flights > 0').update_all 'seats_per_flight = 1.0 * seats / flights'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
17
34
|
falls_back_on :distance => lambda { weighted_average(:distance, :weighted_by => :passengers) }, # 2077.1205 data1 10-12-2010
|
18
35
|
:seats_per_flight => lambda { weighted_average(:seats_per_flight, :weighted_by => :passengers) }, # 144.15653537046 data1 10-12-2010
|
19
36
|
:load_factor => lambda { weighted_average(:load_factor, :weighted_by => :passengers) }, # 0.78073233770097 data1 10-12-2010
|
20
37
|
:freight_share => lambda { weighted_average(:freight_share, :weighted_by => :passengers) } # 0.022567224170157 data1 10-12-2010
|
21
38
|
|
22
|
-
col :row_hash
|
23
|
-
col :origin_airport_iata_code
|
24
|
-
col :origin_airport_city
|
25
|
-
col :origin_country_iso_3166_code
|
26
|
-
col :destination_airport_iata_code
|
27
|
-
col :destination_airport_city
|
28
|
-
col :destination_country_iso_3166_code
|
29
|
-
col :airline_bts_code
|
30
|
-
col :airline_icao_code
|
31
|
-
col :airline_name
|
32
|
-
col :aircraft_bts_code
|
33
|
-
col :aircraft_description
|
34
|
-
col :flights,
|
35
|
-
col :passengers,
|
36
|
-
col :seats,
|
37
|
-
col :seats_per_flight, :type => :float
|
38
|
-
col :load_factor,
|
39
|
-
col :freight_share,
|
40
|
-
col :distance,
|
41
|
-
col :distance_units
|
42
|
-
col :payload_capacity, :type => :float
|
43
|
-
col :payload_capacity_units
|
44
|
-
col :freight,
|
45
|
-
col :freight_units
|
46
|
-
col :mail,
|
47
|
-
col :mail_units
|
48
|
-
col :month,
|
49
|
-
col :year,
|
50
|
-
col :
|
51
|
-
col :source # 'BTS T100' or 'ICAO TFS'
|
39
|
+
col :row_hash # auto-generated primary key
|
40
|
+
col :origin_airport_iata_code # iata code
|
41
|
+
col :origin_airport_city # city
|
42
|
+
col :origin_country_iso_3166_code # iso code
|
43
|
+
col :destination_airport_iata_code # iata code
|
44
|
+
col :destination_airport_city # city
|
45
|
+
col :destination_country_iso_3166_code # iso code
|
46
|
+
col :airline_bts_code # bts code
|
47
|
+
col :airline_icao_code # icao code
|
48
|
+
col :airline_name # text description derived from bts or icao code
|
49
|
+
col :aircraft_bts_code # bts code
|
50
|
+
col :aircraft_description # text description derived from BTS T100 or ICAO TFS
|
51
|
+
col :flights, :type => :integer # number of flights over month or year
|
52
|
+
col :passengers, :type => :integer # total passengers on all flights
|
53
|
+
col :seats, :type => :integer # total seats on all flights
|
54
|
+
col :seats_per_flight, :type => :float # average seats per flight; make this a float
|
55
|
+
col :load_factor, :type => :float # passengers / seats
|
56
|
+
col :freight_share, :type => :float # (freight + mail) / (freight + mail + (passengers * average passenger weight))
|
57
|
+
col :distance, :type => :float # flight distance
|
58
|
+
col :distance_units # 'kilometres'
|
59
|
+
col :payload_capacity, :type => :float # aircraft maximum payload capacity rating; float b/c unit conversion
|
60
|
+
col :payload_capacity_units # 'kilograms'
|
61
|
+
col :freight, :type => :float # total freight on all flights performed; float b/c unit conversion
|
62
|
+
col :freight_units # 'kilograms'
|
63
|
+
col :mail, :type => :float # total mail on all flights performed; float b/c unit conversion
|
64
|
+
col :mail_units # 'kilograms'
|
65
|
+
col :month, :type => :integer # month of flight
|
66
|
+
col :year, :type => :integer # year of flight
|
67
|
+
col :source # 'BTS T100' or 'ICAO TFS'
|
52
68
|
add_index :origin_airport_iata_code
|
53
69
|
add_index :origin_airport_city
|
54
70
|
add_index :destination_airport_iata_code
|
@@ -59,26 +75,4 @@ class FlightSegment < ActiveRecord::Base
|
|
59
75
|
add_index :aircraft_bts_code
|
60
76
|
add_index :aircraft_description
|
61
77
|
add_index :year
|
62
|
-
|
63
|
-
def self.distances_between(floor, ceiling)
|
64
|
-
where arel_table[:distance].gteq(floor).and(arel_table[:distance].lt(ceiling))
|
65
|
-
end
|
66
|
-
|
67
|
-
def self.update_averages!
|
68
|
-
# Derive load factor, which is passengers divided by available seats
|
69
|
-
update_all 'load_factor = 1.0 * passengers / seats', 'seats > 0'
|
70
|
-
|
71
|
-
# Assume a load factor of 1 where passengers > available seats
|
72
|
-
update_all 'load_factor = 1', 'passengers > seats AND seats > 0'
|
73
|
-
|
74
|
-
# TODO: what is 90.718474
|
75
|
-
# Derive freight share as a fraction of the total weight carried
|
76
|
-
update_all 'freight_share = 1.0 * (freight + mail) / (freight + mail + (passengers * 90.718474))', '(freight + mail + passengers) > 0'
|
77
|
-
|
78
|
-
# Derive average seats per flight
|
79
|
-
update_all 'seats_per_flight = 1.0 * seats / flights', 'flights > 0'
|
80
|
-
|
81
|
-
# Add a useful date field
|
82
|
-
update_all %{approximate_date = DATE(year || '-' || month || '-' || '14')}, 'month IS NOT NULL'
|
83
|
-
end
|
84
|
-
end
|
78
|
+
end
|
@@ -222,7 +222,7 @@ FlightSegment.class_eval do
|
|
222
222
|
process "Look up airline name based on BTS code" do
|
223
223
|
connection.select_values("SELECT DISTINCT airline_bts_code FROM flight_segments WHERE airline_bts_code IS NOT NULL").each do |bts_code|
|
224
224
|
if airline = Airline.find_by_bts_code(bts_code)
|
225
|
-
|
225
|
+
where(:airline_bts_code => bts_code).update_all :airline_name => airline.name
|
226
226
|
end
|
227
227
|
end
|
228
228
|
end
|
@@ -230,7 +230,7 @@ FlightSegment.class_eval do
|
|
230
230
|
process "Look up aircraft description based on BTS code" do
|
231
231
|
connection.select_values("SELECT DISTINCT aircraft_bts_code FROM flight_segments WHERE aircraft_bts_code IS NOT NULL").each do |bts_code|
|
232
232
|
if aircraft = BtsAircraft.find_by_bts_code(bts_code)
|
233
|
-
|
233
|
+
where(:aircraft_bts_code => bts_code).update_all :aircraft_description => aircraft.description.downcase
|
234
234
|
end
|
235
235
|
end
|
236
236
|
end
|