earth 0.7.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
data/lib/earth/automobile.rb
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
require 'earth/automobile/automobile_fuel'
|
2
2
|
require 'earth/automobile/automobile_make'
|
3
|
-
require 'earth/automobile/automobile_make_fleet_year'
|
4
3
|
require 'earth/automobile/automobile_make_year'
|
4
|
+
require 'earth/automobile/automobile_make_year_fleet'
|
5
5
|
require 'earth/automobile/automobile_make_model'
|
6
6
|
require 'earth/automobile/automobile_make_model_year'
|
7
|
+
require 'earth/automobile/automobile_make_model_year_variant'
|
8
|
+
require 'earth/automobile/automobile_model'
|
7
9
|
require 'earth/automobile/automobile_size_class'
|
8
10
|
require 'earth/automobile/automobile_size_class_year'
|
9
|
-
require 'earth/automobile/automobile_make_model_year_variant'
|
10
11
|
require 'earth/automobile/automobile_type_year'
|
11
|
-
require 'earth/automobile/automobile_type_fuel_age'
|
12
12
|
require 'earth/automobile/automobile_type_fuel_control'
|
13
13
|
require 'earth/automobile/automobile_type_fuel_year'
|
14
14
|
require 'earth/automobile/automobile_type_fuel_year_age'
|
15
15
|
require 'earth/automobile/automobile_type_fuel_year_control'
|
16
|
+
require 'earth/automobile/automobile_year'
|
16
17
|
|
17
18
|
require 'earth/fuel'
|
@@ -33,150 +33,87 @@ class AutomobileFuel < ActiveRecord::Base
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
# FIXME TODO verify that base_fuel_name and blend_fuel_name are found in Fuel if present
|
37
|
-
# FIXME TODO verify that distance_key is found in AutomobileTypeFuelYearAge
|
38
|
-
# FIXME TODO verify that ef_key is found in AutomobileTypeFuelYear
|
39
|
-
|
40
|
-
# TODO convert these to warn blocks
|
41
|
-
# ["ch4_emission_factor", "n2o_emission_factor", "hfc_emission_factor"].each do |attribute|
|
42
|
-
# verify "#{attribute.humanize} should be > 0" do
|
43
|
-
# find_each do |fuel|
|
44
|
-
# value = fuel.send(attribute)
|
45
|
-
# unless value > 0
|
46
|
-
# raise "Invalid #{attribute.humanize.downcase} for AutomobileFuel #{fuel.name}: #{value} (should be > 0)"
|
47
|
-
# end
|
48
|
-
# end
|
49
|
-
# end
|
50
|
-
# end
|
51
|
-
#
|
52
|
-
# [["co2_emission_factor_units", "kilograms_per_litre"],
|
53
|
-
# ["co2_biogenic_emission_factor_units", "kilograms_per_litre"],
|
54
|
-
# ["ch4_emission_factor_units", "kilograms_co2e_per_litre"],
|
55
|
-
# ["n2o_emission_factor_units", "kilograms_co2e_per_litre"],
|
56
|
-
# ["hfc_emission_factor_units", "kilograms_co2e_per_litre"]].each do |pair|
|
57
|
-
# attribute = pair[0]
|
58
|
-
# proper_units = pair[1]
|
59
|
-
# verify "#{attribute.humanize} should be #{proper_units.humanize.downcase}" do
|
60
|
-
# find_each do |fuel|
|
61
|
-
# units = fuel.send(attribute)
|
62
|
-
# unless units == proper_units
|
63
|
-
# raise "Invalid #{attribute.humanize.downcase} for AutomobileFuel #{fuel.name}: #{units} (should be #{proper_units})"
|
64
|
-
# end
|
65
|
-
# end
|
66
|
-
# end
|
67
|
-
# end
|
68
|
-
|
69
36
|
class << self
|
70
|
-
def
|
37
|
+
def fallback_type_fuel_year_ages
|
71
38
|
AutomobileTypeFuelYearAge.where(:year => AutomobileTypeFuelYearAge.maximum('year'))
|
72
39
|
end
|
73
40
|
|
74
|
-
def
|
75
|
-
fallback_latest_type_fuel_year_ages.weighted_average(:annual_distance, :weighted_by => :vehicles)
|
76
|
-
end
|
77
|
-
|
78
|
-
def fallback_annual_distance_units
|
79
|
-
fallback_latest_type_fuel_year_ages.first.annual_distance_units
|
80
|
-
end
|
81
|
-
|
82
|
-
def fallback_blend_portion
|
83
|
-
latest_year = AutomobileTypeFuelYear.maximum('year')
|
84
|
-
gas_use = AutomobileTypeFuelYear.where(:year => latest_year, :fuel_common_name => 'gasoline').sum('fuel_consumption')
|
85
|
-
diesel_use = AutomobileTypeFuelYear.where(:year => latest_year, :fuel_common_name => 'diesel').sum('fuel_consumption')
|
86
|
-
diesel_use.to_f / (gas_use + diesel_use)
|
87
|
-
end
|
88
|
-
|
89
|
-
def fallback_co2_emission_factor
|
90
|
-
(Fuel.find_by_name("Motor Gasoline").co2_emission_factor.to_f * (1 - AutomobileFuel.fallback_blend_portion)) +
|
91
|
-
(Fuel.find_by_name("Distillate Fuel Oil No. 2").co2_emission_factor.to_f * AutomobileFuel.fallback_blend_portion)
|
92
|
-
end
|
93
|
-
|
94
|
-
def fallback_co2_emission_factor_units
|
95
|
-
Fuel.find_by_name("Motor Gasoline").co2_emission_factor_units
|
96
|
-
end
|
97
|
-
|
98
|
-
def fallback_co2_biogenic_emission_factor
|
99
|
-
(Fuel.find_by_name("Motor Gasoline").co2_biogenic_emission_factor * (1 - AutomobileFuel.fallback_blend_portion)) +
|
100
|
-
(Fuel.find_by_name("Distillate Fuel Oil No. 2").co2_biogenic_emission_factor * AutomobileFuel.fallback_blend_portion)
|
101
|
-
end
|
102
|
-
|
103
|
-
def fallback_co2_biogenic_emission_factor_units
|
104
|
-
Fuel.find_by_name("Motor Gasoline").co2_biogenic_emission_factor_units
|
105
|
-
end
|
106
|
-
|
107
|
-
def fallback_latest_type_fuel_years
|
41
|
+
def fallback_type_fuel_years
|
108
42
|
AutomobileTypeFuelYear.where(:year => AutomobileTypeFuelYear.maximum('year'))
|
109
43
|
end
|
110
44
|
|
111
|
-
def
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
def fallback_ch4_emission_factor_units
|
116
|
-
prefix = fallback_latest_type_fuel_years.first.ch4_emission_factor_units.split("_per_")[0]
|
117
|
-
suffix = fallback_latest_type_fuel_years.first.ch4_emission_factor_units.split("_per_")[1]
|
118
|
-
prefix + "_co2e_per_" + suffix
|
119
|
-
end
|
120
|
-
|
121
|
-
def fallback_n2o_emission_factor
|
122
|
-
fallback_latest_type_fuel_years.weighted_average(:n2o_emission_factor, :weighted_by => :total_travel).to_f * GreenhouseGas[:n2o].global_warming_potential
|
123
|
-
end
|
124
|
-
|
125
|
-
def fallback_n2o_emission_factor_units
|
126
|
-
prefix = fallback_latest_type_fuel_years.first.n2o_emission_factor_units.split("_per_")[0]
|
127
|
-
suffix = fallback_latest_type_fuel_years.first.n2o_emission_factor_units.split("_per_")[1]
|
128
|
-
prefix + "_co2e_per_" + suffix
|
45
|
+
def fallback_type_years
|
46
|
+
AutomobileTypeYear.where(:year => AutomobileTypeYear.maximum('year'))
|
129
47
|
end
|
130
48
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
def fallback_hfc_emission_factor_units
|
138
|
-
fallback_latest_type_fuel_years.first.type_year.hfc_emission_factor_units
|
49
|
+
# FIXME TODO for some reason this causes the fallbacks calculation to hang (infinite loop?) if it's defined as a fallback
|
50
|
+
def fallback_blend_portion
|
51
|
+
gas_use = fallback_type_fuel_years.where(:fuel_common_name => 'gasoline').sum('fuel_consumption').to_f
|
52
|
+
diesel_use = fallback_type_fuel_years.where(:fuel_common_name => 'diesel').sum('fuel_consumption').to_f
|
53
|
+
diesel_use / (gas_use + diesel_use)
|
139
54
|
end
|
140
55
|
end
|
141
56
|
|
142
57
|
falls_back_on :name => 'fallback',
|
143
|
-
:annual_distance => lambda {
|
144
|
-
:annual_distance_units => lambda {
|
145
|
-
:
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
:
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
:
|
154
|
-
:
|
155
|
-
|
58
|
+
:annual_distance => lambda { fallback_type_fuel_year_ages.weighted_average(:annual_distance, :weighted_by => :vehicles) },
|
59
|
+
:annual_distance_units => lambda { fallback_type_fuel_year_ages.first.annual_distance_units },
|
60
|
+
:energy_content => lambda {
|
61
|
+
(Fuel.find_by_name('Motor Gasoline').energy_content * (1 - fallback_blend_portion)) +
|
62
|
+
(Fuel.find_by_name('Distillate Fuel Oil No. 2').energy_content * fallback_blend_portion)
|
63
|
+
},
|
64
|
+
:co2_emission_factor => lambda {
|
65
|
+
(Fuel.find_by_name("Motor Gasoline").co2_emission_factor * (1 - fallback_blend_portion)) +
|
66
|
+
(Fuel.find_by_name("Distillate Fuel Oil No. 2").co2_emission_factor * fallback_blend_portion)
|
67
|
+
},
|
68
|
+
:co2_emission_factor_units => lambda { Fuel.find_by_name("Motor Gasoline").co2_emission_factor_units },
|
69
|
+
:co2_biogenic_emission_factor => lambda {
|
70
|
+
(Fuel.find_by_name("Motor Gasoline").co2_biogenic_emission_factor * (1 - AutomobileFuel.fallback_blend_portion)) +
|
71
|
+
(Fuel.find_by_name("Distillate Fuel Oil No. 2").co2_biogenic_emission_factor * AutomobileFuel.fallback_blend_portion)
|
72
|
+
},
|
73
|
+
:co2_biogenic_emission_factor_units => lambda { Fuel.find_by_name("Motor Gasoline").co2_biogenic_emission_factor_units },
|
74
|
+
:ch4_emission_factor => lambda { fallback_type_fuel_years.weighted_average(:ch4_emission_factor, :weighted_by => :total_travel) * GreenhouseGas[:ch4].global_warming_potential },
|
75
|
+
:ch4_emission_factor_units => lambda {
|
76
|
+
prefix = fallback_type_fuel_years.first.ch4_emission_factor_units.split("_per_")[0]
|
77
|
+
suffix = fallback_type_fuel_years.first.ch4_emission_factor_units.split("_per_")[1]
|
78
|
+
prefix + "_co2e_per_" + suffix
|
79
|
+
},
|
80
|
+
:n2o_emission_factor => lambda {
|
81
|
+
fallback_type_fuel_years.weighted_average(:n2o_emission_factor, :weighted_by => :total_travel) * GreenhouseGas[:n2o].global_warming_potential
|
82
|
+
},
|
83
|
+
:n2o_emission_factor_units => lambda {
|
84
|
+
prefix = fallback_type_fuel_years.first.n2o_emission_factor_units.split("_per_")[0]
|
85
|
+
suffix = fallback_type_fuel_years.first.n2o_emission_factor_units.split("_per_")[1]
|
86
|
+
prefix + "_co2e_per_" + suffix
|
87
|
+
},
|
88
|
+
:hfc_emission_factor => lambda { fallback_type_years.weighted_average(:hfc_emission_factor, :weighted_by => [:type_fuel_years, :total_travel]) },
|
89
|
+
:hfc_emission_factor_units => lambda { fallback_type_years.first.hfc_emission_factor_units }
|
90
|
+
|
156
91
|
col :name
|
157
92
|
col :code
|
158
93
|
col :base_fuel_name
|
159
94
|
col :blend_fuel_name
|
160
|
-
col :blend_portion,
|
161
|
-
col :distance_key
|
162
|
-
col :ef_key
|
163
|
-
col :annual_distance,
|
95
|
+
col :blend_portion, :type => :float # the portion of the blend that is the blend fuel
|
96
|
+
col :distance_key # used to look up annual distance from AutomobileTypeFuelYear
|
97
|
+
col :ef_key # used to look up ch4 n2o and hfc emission factors from AutomobileTypeFuelYear
|
98
|
+
col :annual_distance, :type => :float
|
164
99
|
col :annual_distance_units
|
165
|
-
col :
|
100
|
+
col :energy_content, :type => :float
|
101
|
+
col :energy_content_units
|
102
|
+
col :co2_emission_factor, :type => :float
|
166
103
|
col :co2_emission_factor_units
|
167
104
|
col :co2_biogenic_emission_factor, :type => :float
|
168
105
|
col :co2_biogenic_emission_factor_units
|
169
|
-
col :ch4_emission_factor,
|
106
|
+
col :ch4_emission_factor, :type => :float
|
170
107
|
col :ch4_emission_factor_units
|
171
|
-
col :n2o_emission_factor,
|
108
|
+
col :n2o_emission_factor, :type => :float
|
172
109
|
col :n2o_emission_factor_units
|
173
|
-
col :hfc_emission_factor,
|
110
|
+
col :hfc_emission_factor, :type => :float
|
174
111
|
col :hfc_emission_factor_units
|
175
|
-
col :emission_factor,
|
176
|
-
col :emission_factor_units # DEPRECATED but motorcycle needs this
|
177
|
-
|
112
|
+
col :emission_factor, :type => :float # DEPRECATED but motorcycle needs this
|
113
|
+
col :emission_factor_units # FIXME TODO DEPRECATED but motorcycle needs this
|
114
|
+
|
178
115
|
CODES = {
|
179
116
|
:electricity => 'El',
|
180
117
|
:diesel => 'D'
|
181
118
|
}
|
182
|
-
end
|
119
|
+
end
|
@@ -36,6 +36,18 @@ AutomobileFuel.class_eval do
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
process "Derive energy content" do
|
40
|
+
find_each do |record|
|
41
|
+
if record.blend_fuel.present?
|
42
|
+
record.energy_content = (record.base_fuel.energy_content * (1 - record.blend_portion)) + (record.blend_fuel.energy_content * record.blend_portion)
|
43
|
+
else
|
44
|
+
record.energy_content = record.base_fuel.energy_content
|
45
|
+
end
|
46
|
+
record.energy_content_units = record.base_fuel.energy_content_units
|
47
|
+
record.save!
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
39
51
|
process "Derive co2 emission factor and co2 biogenic emission factors" do
|
40
52
|
find_each do |record|
|
41
53
|
if record.blend_fuel.present?
|
@@ -74,13 +86,14 @@ AutomobileFuel.class_eval do
|
|
74
86
|
end
|
75
87
|
end
|
76
88
|
|
89
|
+
# FIXME TODO DEPRECATED motorcycle needs this
|
77
90
|
process "Derive emission factor" do
|
78
|
-
update_all
|
79
|
-
|
91
|
+
update_all(%{
|
92
|
+
emission_factor = 1.0 * co2_emission_factor + ch4_emission_factor + n2o_emission_factor + hfc_emission_factor,
|
93
|
+
emission_factor_units = 'kilograms_co2e_per_litre'
|
94
|
+
})
|
80
95
|
end
|
81
96
|
|
82
97
|
# FIXME TODO verify code somehow
|
83
|
-
|
84
|
-
|
85
98
|
end
|
86
99
|
end
|
@@ -1,22 +1,7 @@
|
|
1
1
|
class AutomobileMake < ActiveRecord::Base
|
2
2
|
set_primary_key :name
|
3
3
|
|
4
|
-
has_many :make_years, :class_name => 'AutomobileMakeYear', :foreign_key => 'make_name'
|
5
|
-
has_many :models, :class_name => 'AutomobileMakeModel', :foreign_key => 'make_name'
|
6
|
-
has_many :fleet_years, :class_name => 'AutomobileMakeFleetYear', :foreign_key => 'make_name'
|
7
|
-
has_many :make_model_year_variants, :class_name => 'AutomobileMakeModelYearVariant', :foreign_key => 'make_name'
|
8
|
-
|
9
4
|
col :name
|
10
5
|
col :fuel_efficiency, :type => :float
|
11
6
|
col :fuel_efficiency_units
|
12
|
-
|
13
|
-
# TODO convert to table_warnings
|
14
|
-
# verify "Fuel efficiency should be greater than zero" do
|
15
|
-
# AutomobileMake.all.each do |make|
|
16
|
-
# unless make.fuel_efficiency > 0
|
17
|
-
# raise "Invalid fuel efficiency for AutomobileMake #{make.name}: #{make.fuel_efficiency} (should be > 0)"
|
18
|
-
# end
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
|
22
|
-
end
|
7
|
+
end
|
@@ -4,50 +4,50 @@ AutomobileMake.class_eval do
|
|
4
4
|
delete_all
|
5
5
|
end
|
6
6
|
|
7
|
-
process "Ensure AutomobileMakeModelYearVariant and
|
7
|
+
process "Ensure AutomobileMakeModelYearVariant and AutomobileMakeYearFleet are populated" do
|
8
8
|
AutomobileMakeModelYearVariant.run_data_miner!
|
9
|
-
|
9
|
+
AutomobileMakeYearFleet.run_data_miner!
|
10
10
|
end
|
11
11
|
|
12
12
|
process "Derive manufacturer names from automobile make model year variants" do
|
13
13
|
::Earth::Utils.insert_ignore(
|
14
14
|
:src => AutomobileMakeModelYearVariant,
|
15
15
|
:dest => AutomobileMake,
|
16
|
-
:cols => {
|
17
|
-
:make_name => :name,
|
18
|
-
}
|
16
|
+
:cols => { :make_name => :name }
|
19
17
|
)
|
20
18
|
end
|
21
19
|
|
22
20
|
# sabshere 1/31/11 add Avanti, DaimlerChrysler, IHC, Tesla, etc.
|
23
21
|
process "Derive extra manufacturer names from CAFE data" do
|
24
22
|
::Earth::Utils.insert_ignore(
|
25
|
-
:src =>
|
23
|
+
:src => AutomobileMakeYearFleet,
|
26
24
|
:dest => AutomobileMake,
|
27
|
-
:cols => {
|
28
|
-
:make_name => :name,
|
29
|
-
}
|
25
|
+
:cols => { :make_name => :name }
|
30
26
|
)
|
31
27
|
end
|
32
28
|
|
33
|
-
# FIXME TODO
|
34
|
-
process "Calculate fuel efficiency from
|
35
|
-
|
36
|
-
|
37
|
-
conditional_relation = makes[:name].eq(
|
38
|
-
relation =
|
39
|
-
update_all
|
29
|
+
# FIXME TODO derive units here
|
30
|
+
process "Calculate fuel efficiency from CAFE data" do
|
31
|
+
makes = arel_table
|
32
|
+
year_fleets = AutomobileMakeYearFleet.arel_table
|
33
|
+
conditional_relation = makes[:name].eq(year_fleets[:make_name])
|
34
|
+
relation = AutomobileMakeYearFleet.weighted_average_relation(:fuel_efficiency, :weighted_by => :volume).where(conditional_relation)
|
35
|
+
update_all(%{
|
36
|
+
fuel_efficiency = (#{relation.to_sql}),
|
37
|
+
fuel_efficiency_units = 'kilometres_per_litre'
|
38
|
+
})
|
40
39
|
end
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
)
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
41
|
+
# FIXME TODO derive units here
|
42
|
+
process "Calculate any missing fuel effeciencies from automobile make model year variants" do
|
43
|
+
makes = arel_table
|
44
|
+
variants = AutomobileMakeModelYearVariant.arel_table
|
45
|
+
conditional_relation = variants[:make_name].eq(makes[:name])
|
46
|
+
relation = variants.project(variants[:fuel_efficiency].average).where(conditional_relation)
|
47
|
+
where(:fuel_efficiency => nil).update_all(%{
|
48
|
+
fuel_efficiency = (#{relation.to_sql}),
|
49
|
+
fuel_efficiency_units = 'kilometres_per_litre'
|
50
|
+
})
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -1,9 +1,6 @@
|
|
1
1
|
class AutomobileMakeModel < ActiveRecord::Base
|
2
2
|
set_primary_key :name
|
3
3
|
|
4
|
-
belongs_to :make, :class_name => 'AutomobileMake', :foreign_key => 'make_name'
|
5
|
-
has_many :make_model_year_variants, :class_name => 'AutomobileMakeModelYearVariant', :foreign_key => 'make_model_name'
|
6
|
-
|
7
4
|
col :name # make + model
|
8
5
|
col :make_name
|
9
6
|
col :model_name # model only
|
@@ -11,27 +8,4 @@ class AutomobileMakeModel < ActiveRecord::Base
|
|
11
8
|
col :fuel_efficiency_city_units
|
12
9
|
col :fuel_efficiency_highway, :type => :float
|
13
10
|
col :fuel_efficiency_highway_units
|
14
|
-
|
15
|
-
# TODO convert to table_warnings
|
16
|
-
# verify "Fuel efficiencies should be greater than zero" do
|
17
|
-
# AutomobileMakeModel.all.each do |model|
|
18
|
-
# %w{ city highway }.each do |type|
|
19
|
-
# fuel_efficiency = model.send(:"fuel_efficiency_#{type}")
|
20
|
-
# unless fuel_efficiency > 0
|
21
|
-
# raise "Invalid fuel efficiency #{type} for AutomobileMakeModel #{model.name}: #{fuel_efficiency} (should be > 0)"
|
22
|
-
# end
|
23
|
-
# end
|
24
|
-
# end
|
25
|
-
# end
|
26
|
-
#
|
27
|
-
# verify "Fuel efficiency units should be kilometres per litre" do
|
28
|
-
# AutomobileMakeModel.all.each do |model|
|
29
|
-
# %w{ city highway }.each do |type|
|
30
|
-
# units = model.send(:"fuel_efficiency_#{type}_units")
|
31
|
-
# unless units == "kilometres_per_litre"
|
32
|
-
# raise "Invalid fuel efficiency #{type} units for AutomobileMakeModel #{model.name}: #{units} (should be kilometres_per_litre)"
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
# end
|
36
|
-
# end
|
37
11
|
end
|
@@ -13,26 +13,25 @@ AutomobileMakeModel.class_eval do
|
|
13
13
|
:src => AutomobileMakeModelYearVariant,
|
14
14
|
:dest => AutomobileMakeModel,
|
15
15
|
:cols => {
|
16
|
-
:
|
16
|
+
[:make_name, :model_name] => :name,
|
17
17
|
:make_name => :make_name,
|
18
|
-
:
|
18
|
+
:model_name => :model_name
|
19
19
|
}
|
20
|
-
# :where => 'LENGTH(src.make_name) > 0 AND LENGTH(src.make_model_name) > 0'
|
21
20
|
)
|
22
21
|
end
|
23
22
|
|
24
|
-
# FIXME TODO
|
25
|
-
# TODO not weighted until we get weightings on auto variants
|
23
|
+
# FIXME TODO not weighted until we get weightings on auto variants
|
26
24
|
process "Derive average fuel economy from automobile make model year variants" do
|
27
|
-
models =
|
25
|
+
models = arel_table
|
28
26
|
variants = AutomobileMakeModelYearVariant.arel_table
|
29
|
-
conditional_relation = models[:
|
30
|
-
%w{ city highway }.each do |
|
31
|
-
null_check = variants[:"fuel_efficiency_#{
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
conditional_relation = models[:make_name].eq(variants[:make_name]).and(models[:model_name].eq(variants[:model_name]))
|
28
|
+
%w{ city highway }.each do |type|
|
29
|
+
null_check = variants[:"fuel_efficiency_#{type}"].not_eq(nil)
|
30
|
+
relation = variants.project(variants[:"fuel_efficiency_#{type}"].average).where(conditional_relation).where(null_check)
|
31
|
+
update_all(%{
|
32
|
+
fuel_efficiency_#{type} = (#{relation.to_sql}),
|
33
|
+
fuel_efficiency_#{type}_units = 'kilometres_per_litre'
|
34
|
+
})
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
@@ -1,48 +1,17 @@
|
|
1
1
|
class AutomobileMakeModelYear < ActiveRecord::Base
|
2
2
|
set_primary_key :name
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
# Need this so Automobile and AutomobileTrip can do characteristics[:make_model_year].automobile_fuel
|
5
|
+
belongs_to :automobile_fuel, :foreign_key => 'fuel_code', :primary_key => 'code'
|
6
6
|
|
7
7
|
col :name # make + model + year
|
8
8
|
col :make_name
|
9
9
|
col :model_name
|
10
|
-
col :
|
11
|
-
col :
|
12
|
-
col :
|
13
|
-
col :fuel_efficiency_city,
|
10
|
+
col :year, :type => :integer
|
11
|
+
col :fuel_code
|
12
|
+
col :hybridity, :type => :boolean
|
13
|
+
col :fuel_efficiency_city, :type => :float
|
14
14
|
col :fuel_efficiency_city_units
|
15
15
|
col :fuel_efficiency_highway, :type => :float
|
16
16
|
col :fuel_efficiency_highway_units
|
17
|
-
|
18
|
-
# TODO convert to table_warnings
|
19
|
-
# verify "Year should be from 1985 to 2011" do
|
20
|
-
# AutomobileMakeModelYear.all.each do |model_year|
|
21
|
-
# unless model_year.year.to_i > 1984 and model_year.year.to_i < 2012
|
22
|
-
# raise "Invalid year for AutomobileMakeModelYear #{model_year.name}: #{model_year.year} (should be from 1985 to 2011)"
|
23
|
-
# end
|
24
|
-
# end
|
25
|
-
# end
|
26
|
-
#
|
27
|
-
# verify "Fuel efficiencies should be greater than zero" do
|
28
|
-
# AutomobileMakeModelYear.all.each do |model_year|
|
29
|
-
# %w{ city highway }.each do |type|
|
30
|
-
# fuel_efficiency = model_year.send(:"fuel_efficiency_#{type}")
|
31
|
-
# unless fuel_efficiency.to_f > 0
|
32
|
-
# raise "Invalid fuel efficiency #{type} for AutomobileMakeModelYear #{model_year.name}: #{fuel_efficiency} (should be > 0)"
|
33
|
-
# end
|
34
|
-
# end
|
35
|
-
# end
|
36
|
-
# end
|
37
|
-
#
|
38
|
-
# verify "Fuel efficiency units should be kilometres per litre" do
|
39
|
-
# AutomobileMakeModelYear.all.each do |model_year|
|
40
|
-
# %w{ city highway }.each do |type|
|
41
|
-
# units = model_year.send(:"fuel_efficiency_#{type}_units")
|
42
|
-
# unless units == "kilometres_per_litre"
|
43
|
-
# raise "Invalid fuel efficiency #{type} units for AutomobileMakeModelYear #{model_year.name}: #{units} (should be kilometres_per_litre)"
|
44
|
-
# end
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
# end
|
48
17
|
end
|