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
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
|