earth 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/earth.gemspec +2 -2
- data/features/automobile_fuel.feature +100 -0
- data/features/bus_class.feature +12 -42
- data/features/bus_fuel.feature +114 -0
- data/features/egrid_subregion.feature +113 -15
- data/features/support/imports/automobile_fuel_bad.csv +3 -3
- data/features/support/imports/automobile_fuel_good.csv +3 -3
- data/features/support/imports/bus_class_bad.csv +2 -3
- data/features/support/imports/bus_class_good.csv +2 -3
- data/features/support/imports/bus_fuel_bad.csv +3 -0
- data/features/support/imports/bus_fuel_good.csv +3 -0
- data/features/support/imports/egrid_subregion_bad.csv +2 -3
- data/features/support/imports/egrid_subregion_good.csv +2 -3
- data/lib/earth/automobile/automobile_fuel.rb +63 -58
- data/lib/earth/automobile/automobile_fuel/data_miner.rb +110 -0
- data/lib/earth/bus.rb +3 -0
- data/lib/earth/bus/bus_class.rb +21 -2
- data/lib/earth/bus/bus_class/data_miner.rb +79 -43
- data/lib/earth/bus/bus_fuel.rb +18 -0
- data/lib/earth/bus/bus_fuel/data_miner.rb +204 -0
- data/lib/earth/bus/bus_fuel_control.rb +7 -0
- data/lib/earth/bus/bus_fuel_control/data_miner.rb +41 -0
- data/lib/earth/bus/bus_fuel_year_control.rb +13 -0
- data/lib/earth/bus/bus_fuel_year_control/data_miner.rb +35 -0
- data/lib/earth/bus/data_miner.rb +3 -0
- data/lib/earth/fuel/fuel.rb +16 -0
- data/lib/earth/fuel/fuel/data_miner.rb +6 -1
- data/lib/earth/locality/egrid_region.rb +3 -2
- data/lib/earth/locality/egrid_region/data_miner.rb +8 -31
- data/lib/earth/locality/egrid_subregion.rb +18 -2
- data/lib/earth/locality/egrid_subregion/data_miner.rb +109 -56
- data/spec/earth/automobile/automobile_fuel_spec.rb +9 -12
- data/spec/earth/bus/bus_class_spec.rb +12 -0
- data/spec/earth/bus/bus_fuel_control_spec.rb +12 -0
- data/spec/earth/bus/bus_fuel_year_control_spec.rb +16 -0
- data/spec/earth/pet/species_spec.rb +0 -1
- data/spec/earth_spec.rb +2 -2
- metadata +46 -16
@@ -0,0 +1,18 @@
|
|
1
|
+
class BusFuel < ActiveRecord::Base
|
2
|
+
set_primary_key :name
|
3
|
+
|
4
|
+
belongs_to :fuel, :foreign_key => 'fuel_name'
|
5
|
+
has_many :fuel_year_controls, :class_name => 'BusFuelYearControl', :foreign_key => 'bus_fuel_name'
|
6
|
+
|
7
|
+
data_miner do
|
8
|
+
tap "Brighter Planet's sanitized bus fuel data", Earth.taps_server
|
9
|
+
|
10
|
+
process "Pull dependencies" do
|
11
|
+
run_data_miner_on_belongs_to_associations
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def latest_fuel_year_controls
|
16
|
+
fuel_year_controls.where(:year => fuel_year_controls.maximum('year'))
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
BusFuel.class_eval do
|
2
|
+
data_miner do
|
3
|
+
schema Earth.database_options do
|
4
|
+
string 'name'
|
5
|
+
string 'fuel_name'
|
6
|
+
float 'energy_content'
|
7
|
+
string 'energy_content_units'
|
8
|
+
float 'co2_emission_factor'
|
9
|
+
string 'co2_emission_factor_units'
|
10
|
+
float 'co2_biogenic_emission_factor'
|
11
|
+
string 'co2_biogenic_emission_factor_units'
|
12
|
+
float 'ch4_emission_factor'
|
13
|
+
string 'ch4_emission_factor_units'
|
14
|
+
float 'n2o_emission_factor'
|
15
|
+
string 'n2o_emission_factor_units'
|
16
|
+
end
|
17
|
+
|
18
|
+
process "Ensure necessary datasets are imported" do
|
19
|
+
Fuel.run_data_miner!
|
20
|
+
GreenhouseGas.run_data_miner!
|
21
|
+
BusFuelYearControl.run_data_miner!
|
22
|
+
end
|
23
|
+
|
24
|
+
import "a list of bus fuels without emission factors",
|
25
|
+
:url => 'https://spreadsheets.google.com/pub?hl=en&hl=en&key=0AoQJbWqPrREqdGNscUdpbkdBUmJkTlFxdEtfSEdJS2c&output=csv' do
|
26
|
+
key 'name'
|
27
|
+
store 'fuel_name'
|
28
|
+
end
|
29
|
+
|
30
|
+
import "a list of bus fuels and their emission factors",
|
31
|
+
:url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdHAtZ1YyWmxuS1JWUzZYSVhhdUViYmc&output=csv' do
|
32
|
+
key 'name'
|
33
|
+
store 'fuel_name'
|
34
|
+
store 'ch4_emission_factor', :units_field_name => 'ch4_emission_factor_units'
|
35
|
+
store 'n2o_emission_factor', :units_field_name => 'n2o_emission_factor_units'
|
36
|
+
end
|
37
|
+
|
38
|
+
import "energy contents for compressed/liquified natural gas fuels",
|
39
|
+
:url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdDFfdHMycVB6dTkyUFFNM0x4b19TQVE&output=csv' do
|
40
|
+
key 'name'
|
41
|
+
store 'energy_content', :units_field_name => 'energy_content_units'
|
42
|
+
end
|
43
|
+
|
44
|
+
process "Convert emission factors to metric units" do
|
45
|
+
conversion_factor = (1 / 1.609344) * (1.0 / 1_000.0 ) # Google: 1 mile / 1.609344 km * 1 kg / 1000 g
|
46
|
+
gwp_ch4 = GreenhouseGas[:ch4].global_warming_potential
|
47
|
+
connection.execute %{
|
48
|
+
UPDATE bus_fuels
|
49
|
+
SET ch4_emission_factor = ch4_emission_factor * #{conversion_factor} * #{gwp_ch4},
|
50
|
+
ch4_emission_factor_units = 'kilograms_co2e_per_kilometre'
|
51
|
+
WHERE ch4_emission_factor_units = 'grams_per_mile'
|
52
|
+
}
|
53
|
+
|
54
|
+
gwp_n2o = GreenhouseGas[:n2o].global_warming_potential
|
55
|
+
connection.execute %{
|
56
|
+
UPDATE bus_fuels
|
57
|
+
SET n2o_emission_factor = n2o_emission_factor * #{conversion_factor} * #{gwp_n2o},
|
58
|
+
n2o_emission_factor_units = 'kilograms_co2e_per_kilometre'
|
59
|
+
WHERE n2o_emission_factor_units = 'grams_per_mile'
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
process "Convert energy contents to metric units" do
|
64
|
+
conversion_factor = (1 / 947.81712) * (1 / 3.78541178) # Google: 1 MJ / 947.81712 btu * 1 gallon / 3.78541178 l
|
65
|
+
connection.execute %{
|
66
|
+
UPDATE bus_fuels
|
67
|
+
SET energy_content = energy_content * #{conversion_factor},
|
68
|
+
energy_content_units = 'megajoules_per_litre'
|
69
|
+
WHERE energy_content_units = 'btu_per_gallon'
|
70
|
+
}
|
71
|
+
end
|
72
|
+
|
73
|
+
process 'Calculate CO2 and CO2 biogenic emission factors and units' do
|
74
|
+
BusFuel.all.each do |bus_fuel|
|
75
|
+
fuel = bus_fuel.fuel
|
76
|
+
if bus_fuel.energy_content.present?
|
77
|
+
co2_factor = (bus_fuel.energy_content * fuel.carbon_content * fuel.oxidation_factor * (1 - fuel.biogenic_fraction))
|
78
|
+
bus_fuel.co2_emission_factor = co2_factor.grams.to(:kilograms).carbon.to(:co2)
|
79
|
+
|
80
|
+
co2_prefix = fuel.co2_emission_factor_units.split("_per_")[0]
|
81
|
+
co2_suffix = bus_fuel.energy_content_units.split("_per_")[1]
|
82
|
+
bus_fuel.co2_emission_factor_units = co2_prefix + "_per_" + co2_suffix
|
83
|
+
|
84
|
+
co2_biogenic_factor = (bus_fuel.energy_content * fuel.carbon_content * fuel.oxidation_factor * fuel.biogenic_fraction)
|
85
|
+
bus_fuel.co2_biogenic_emission_factor = co2_biogenic_factor.grams.to(:kilograms).carbon.to(:co2)
|
86
|
+
|
87
|
+
co2_biogenic_prefix = fuel.co2_biogenic_emission_factor_units.split("_per_")[0]
|
88
|
+
co2_biogenic_suffix = bus_fuel.energy_content_units.split("_per_")[1]
|
89
|
+
bus_fuel.co2_biogenic_emission_factor_units = co2_biogenic_prefix + "_per_" + co2_biogenic_suffix
|
90
|
+
else
|
91
|
+
bus_fuel.co2_emission_factor = fuel.co2_emission_factor
|
92
|
+
bus_fuel.co2_emission_factor_units = fuel.co2_emission_factor_units
|
93
|
+
|
94
|
+
bus_fuel.co2_biogenic_emission_factor = fuel.co2_biogenic_emission_factor
|
95
|
+
bus_fuel.co2_biogenic_emission_factor_units = fuel.co2_biogenic_emission_factor_units
|
96
|
+
end
|
97
|
+
|
98
|
+
bus_fuel.save!
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
process 'Calculate CH4 and N2O emission factor and units for BusFuels with BusFuelYearControls' do
|
103
|
+
BusFuel.all.each do |bus_fuel|
|
104
|
+
if bus_fuel.latest_fuel_year_controls.present?
|
105
|
+
ch4_factors_by_year = bus_fuel.latest_fuel_year_controls.map do |fyc|
|
106
|
+
fyc.total_travel_percent * fyc.fuel_control.ch4_emission_factor
|
107
|
+
end
|
108
|
+
bus_fuel.ch4_emission_factor = ch4_factors_by_year.sum * GreenhouseGas[:ch4].global_warming_potential
|
109
|
+
|
110
|
+
ch4_prefix = bus_fuel.latest_fuel_year_controls.first.fuel_control.ch4_emission_factor_units.split("_per_")[0]
|
111
|
+
ch4_suffix = bus_fuel.latest_fuel_year_controls.first.fuel_control.ch4_emission_factor_units.split("_per_")[1]
|
112
|
+
bus_fuel.ch4_emission_factor_units = ch4_prefix + "_co2e_per_" + ch4_suffix
|
113
|
+
|
114
|
+
n2o_factors_by_year = bus_fuel.latest_fuel_year_controls.map do |fyc|
|
115
|
+
fyc.total_travel_percent * fyc.fuel_control.n2o_emission_factor
|
116
|
+
end
|
117
|
+
bus_fuel.n2o_emission_factor = n2o_factors_by_year.sum * GreenhouseGas[:n2o].global_warming_potential
|
118
|
+
|
119
|
+
n2o_prefix = bus_fuel.latest_fuel_year_controls.first.fuel_control.n2o_emission_factor_units.split("_per_")[0]
|
120
|
+
n2o_suffix = bus_fuel.latest_fuel_year_controls.first.fuel_control.n2o_emission_factor_units.split("_per_")[1]
|
121
|
+
bus_fuel.n2o_emission_factor_units = n2o_prefix + "_co2e_per_" + n2o_suffix
|
122
|
+
end
|
123
|
+
|
124
|
+
bus_fuel.save!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# FIXME TODO verify fuel_name appears in fuels
|
129
|
+
verify "Fuel name should never be missing" do
|
130
|
+
BusFuel.all.each do |fuel|
|
131
|
+
value = fuel.send(:fuel_name)
|
132
|
+
unless value.present?
|
133
|
+
puts "Missing fuel name for BusFuel #{fuel.name}"
|
134
|
+
fail
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
verify "Energy content should be greater than zero if present" do
|
140
|
+
BusFuel.all.each do |fuel|
|
141
|
+
value = fuel.send(:energy_content)
|
142
|
+
if value.present?
|
143
|
+
unless value > 0
|
144
|
+
puts "Invalid energy content for BusFuel #{fuel.name}: #{value} (should be > 0)"
|
145
|
+
fail
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
%w{ co2_emission_factor co2_biogenic_emission_factor }.each do |attribute|
|
152
|
+
verify "#{attribute.humanize} should be 0 or more" do
|
153
|
+
BusFuel.all.each do |fuel|
|
154
|
+
value = fuel.send(attribute)
|
155
|
+
unless value >= 0
|
156
|
+
puts "Invalid #{attribute.humanize.downcase} for BusFuel #{fuel.name}: #{value} (should be 0 or more)"
|
157
|
+
fail
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
%w{ ch4_emission_factor n2o_emission_factor }.each do |attribute|
|
164
|
+
verify "#{attribute.humanize} should be > 0" do
|
165
|
+
BusFuel.all.each do |fuel|
|
166
|
+
value = fuel.send(attribute)
|
167
|
+
unless value > 0
|
168
|
+
puts "Invalid #{attribute.humanize.downcase} for BusFuel #{fuel.name}: #{value} (should be > 0)"
|
169
|
+
fail
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
verify "Energy content units should be megajoules per litre if present" do
|
176
|
+
BusFuel.all.each do |fuel|
|
177
|
+
units = fuel.send(:energy_content_units)
|
178
|
+
if units.present?
|
179
|
+
unless units == "megajoules_per_litre"
|
180
|
+
puts "Invalid energy content units for BusFuel #{fuel.name}: #{units} (should be megajoules_per_litre)"
|
181
|
+
fail
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
[["co2_emission_factor_units", "kilograms_per_litre"],
|
188
|
+
["co2_biogenic_emission_factor_units", "kilograms_per_litre"],
|
189
|
+
["ch4_emission_factor_units", "kilograms_co2e_per_kilometre"],
|
190
|
+
["n2o_emission_factor_units", "kilograms_co2e_per_kilometre"]].each do |pair|
|
191
|
+
attribute = pair[0]
|
192
|
+
proper_units = pair[1]
|
193
|
+
verify "#{attribute.humanize} should be #{proper_units.humanize.downcase}" do
|
194
|
+
BusFuel.all.each do |fuel|
|
195
|
+
units = fuel.send(:"#{attribute}")
|
196
|
+
unless units == proper_units
|
197
|
+
puts "Invalid #{attribute.humanize.downcase} for BusFuel #{fuel.name}: #{units} (should be #{proper_units})"
|
198
|
+
fail
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
BusFuelControl.class_eval do
|
2
|
+
data_miner do
|
3
|
+
schema Earth.database_options do
|
4
|
+
string 'name'
|
5
|
+
string 'bus_fuel_name'
|
6
|
+
string 'control'
|
7
|
+
float 'ch4_emission_factor'
|
8
|
+
string 'ch4_emission_factor_units'
|
9
|
+
float 'n2o_emission_factor'
|
10
|
+
string 'n2o_emission_factor_units'
|
11
|
+
end
|
12
|
+
|
13
|
+
import "a list of bus fuel controls",
|
14
|
+
:url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdEw1QW80VVJhaXRkUURQSFhHczNyVWc&output=csv' do
|
15
|
+
key 'name'
|
16
|
+
store 'bus_fuel_name'
|
17
|
+
store 'control'
|
18
|
+
store 'ch4_emission_factor', :units_field_name => 'ch4_emission_factor_units'
|
19
|
+
store 'n2o_emission_factor', :units_field_name => 'n2o_emission_factor_units'
|
20
|
+
end
|
21
|
+
|
22
|
+
process "Convert emission factors to metric units" do
|
23
|
+
conversion_factor = (1 / 1.609344) * (1.0 / 1_000.0 ) # Google: 1 mile / 1.609344 km * 1 kg / 1000 g
|
24
|
+
connection.execute %{
|
25
|
+
UPDATE bus_fuel_controls
|
26
|
+
SET ch4_emission_factor = ch4_emission_factor * #{conversion_factor},
|
27
|
+
ch4_emission_factor_units = 'kilograms_per_kilometre'
|
28
|
+
WHERE ch4_emission_factor_units = 'grams_per_mile'
|
29
|
+
}
|
30
|
+
|
31
|
+
connection.execute %{
|
32
|
+
UPDATE bus_fuel_controls
|
33
|
+
SET n2o_emission_factor = n2o_emission_factor * #{conversion_factor},
|
34
|
+
n2o_emission_factor_units = 'kilograms_per_kilometre'
|
35
|
+
WHERE n2o_emission_factor_units = 'grams_per_mile'
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# FIXME TODO verify this
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class BusFuelYearControl < ActiveRecord::Base
|
2
|
+
set_primary_key :name
|
3
|
+
|
4
|
+
belongs_to :fuel_control, :class_name => 'BusFuelControl', :foreign_key => 'bus_fuel_control_name'
|
5
|
+
|
6
|
+
data_miner do
|
7
|
+
tap "Brighter Planet's sanitized bus fuel data", Earth.taps_server
|
8
|
+
|
9
|
+
process "Pull dependencies" do
|
10
|
+
run_data_miner_on_belongs_to_associations
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
BusFuelYearControl.class_eval do
|
2
|
+
data_miner do
|
3
|
+
schema Earth.database_options do
|
4
|
+
string 'name'
|
5
|
+
string 'bus_fuel_name'
|
6
|
+
integer 'year'
|
7
|
+
string 'control'
|
8
|
+
string 'bus_fuel_control_name'
|
9
|
+
float 'total_travel_percent'
|
10
|
+
end
|
11
|
+
|
12
|
+
process "Ensure all BusFuelControls are imported" do
|
13
|
+
BusFuelControl.run_data_miner!
|
14
|
+
end
|
15
|
+
|
16
|
+
import "a list of bus fuel year controls",
|
17
|
+
:url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdGhHQkZPZW4zbXYzZ3NkYThBWnQ2QXc&output=csv' do
|
18
|
+
key 'name'
|
19
|
+
store 'bus_fuel_name'
|
20
|
+
store 'year'
|
21
|
+
store 'control'
|
22
|
+
store 'total_travel_percent'
|
23
|
+
end
|
24
|
+
|
25
|
+
process "Derive bus fuel control name for association with BusFuelControl" do
|
26
|
+
if ActiveRecord::Base.connection.adapter_name.downcase == 'sqlite'
|
27
|
+
update_all "bus_fuel_control_name = bus_fuel_name || ' ' || control"
|
28
|
+
else
|
29
|
+
update_all "bus_fuel_control_name = CONCAT(bus_fuel_name, ' ', control)"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# FIXME TODO verify that for any year the percentages sum to 1
|
34
|
+
end
|
35
|
+
end
|
data/lib/earth/bus/data_miner.rb
CHANGED
data/lib/earth/fuel/fuel.rb
CHANGED
@@ -43,6 +43,22 @@ class Fuel < ActiveRecord::Base
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
def oxidation_factor
|
47
|
+
if oxidation_factor = super
|
48
|
+
oxidation_factor
|
49
|
+
elsif fuel_years.present?
|
50
|
+
latest_year.oxidation_factor
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def biogenic_fraction
|
55
|
+
if biogenic_fraction = super
|
56
|
+
biogenic_fraction
|
57
|
+
elsif fuel_years.present?
|
58
|
+
latest_year.biogenic_fraction
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
46
62
|
def co2_emission_factor
|
47
63
|
if ef = super
|
48
64
|
ef
|
@@ -18,8 +18,13 @@ Fuel.class_eval do
|
|
18
18
|
|
19
19
|
process "Derive fuel names from FuelYear" do
|
20
20
|
FuelYear.run_data_miner!
|
21
|
+
if Fuel.connection.adapter_name.downcase == 'sqlite'
|
22
|
+
ignorance = ''
|
23
|
+
else
|
24
|
+
ignorance = 'IGNORE'
|
25
|
+
end
|
21
26
|
connection.execute %{
|
22
|
-
INSERT
|
27
|
+
INSERT #{ignorance} INTO fuels(name)
|
23
28
|
SELECT DISTINCT fuel_years.fuel_name FROM fuel_years
|
24
29
|
}
|
25
30
|
end
|
@@ -5,11 +5,12 @@ class EgridRegion < ActiveRecord::Base
|
|
5
5
|
|
6
6
|
data_miner do
|
7
7
|
tap "Brighter Planet's egrid region data", Earth.taps_server
|
8
|
-
|
8
|
+
|
9
9
|
process "pull dependencies" do
|
10
10
|
run_data_miner_on_belongs_to_associations
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
# FIXME TODO someday should calculate this from eGRID data: (USTNGN05 + USTNFI05 - USTCON05) / USTNGN05
|
15
|
+
falls_back_on :loss_factor => 0.061879 # calculated using above formula 2/21/2011
|
15
16
|
end
|
@@ -5,31 +5,14 @@ EgridRegion.class_eval do
|
|
5
5
|
float 'loss_factor'
|
6
6
|
end
|
7
7
|
|
8
|
-
# NOTE: the following import uses an 18 Mb zip - don't know if two imports will cause it to be downloaded twice...
|
9
|
-
#
|
10
|
-
# import "eGRID regions and loss factors derived from eGRID 2007 data",
|
11
|
-
# :url => 'http://www.epa.gov/cleanenergy/documents/egridzips/eGRID2007_Version1-1.zip',
|
12
|
-
# :filename => 'eGRID2007_Version1-1/eGRID2007V1_1_year0504_STIE_USGC.xls',
|
13
|
-
# :sheet => 'STIE05',
|
14
|
-
# :skip => 4,
|
15
|
-
# :select => lambda { |row| row['eGRID2007 2005 file State sequence number'].to_i.between?(1, 51) } do
|
16
|
-
# key 'name', :field_name => 'Grid region (E=Eastern grid, W=Western grid, AK=Alaska, HI=Hawaii, TX=Texas)'
|
17
|
-
# store 'loss_factor', :field_name => '2005 grid gross loss factor'
|
18
|
-
# end
|
19
|
-
#
|
20
|
-
# import "the US average grid loss factor derived eGRID 2007 data"
|
21
|
-
# :url => 'http://www.epa.gov/cleanenergy/documents/egridzips/eGRID2007_Version1-1.zip',
|
22
|
-
# :filename => 'eGRID2007_Version1-1/eGRID2007V1_1_year0504_STIE_USGC.xls',
|
23
|
-
# :sheet => 'USGC',
|
24
|
-
# :skip => 5 do
|
25
|
-
# key # the name should be 'US'
|
26
|
-
# store # store the result of (USTNGN05 + USTNFI05 - USTCON05) / USTNGN05
|
27
|
-
# end
|
28
|
-
|
29
8
|
import "eGRID regions and loss factors derived from eGRID 2007 data",
|
30
|
-
:url => '
|
31
|
-
|
32
|
-
|
9
|
+
:url => 'http://www.epa.gov/cleanenergy/documents/egridzips/eGRID2007_Version1-1.zip',
|
10
|
+
:filename => 'eGRID2007_Version1-1/eGRID2007V1_1_year0504_STIE_USGC.xls',
|
11
|
+
:sheet => 'STIE05',
|
12
|
+
:skip => 4,
|
13
|
+
:select => lambda { |row| row['eGRID2007 2005 file State sequence number'].to_i.between?(1, 51) } do
|
14
|
+
key 'name', :field_name => 'Grid region (E=Eastern grid, W=Western grid, AK=Alaska, HI=Hawaii, TX=Texas)'
|
15
|
+
store 'loss_factor', :field_name => '2005 grid gross loss factor'
|
33
16
|
end
|
34
17
|
|
35
18
|
verify "Loss factor should be greater than zero and less than one" do
|
@@ -40,12 +23,6 @@ EgridRegion.class_eval do
|
|
40
23
|
end
|
41
24
|
end
|
42
25
|
|
43
|
-
# FIXME TODO
|
44
|
-
# verify "Fallback loss factor should be greater than zero and less than one" do
|
45
|
-
# factor = EgridRegion.fallback.loss_factor
|
46
|
-
# unless factor > 0 and factor < 1
|
47
|
-
# raise "Invalid EgridRegion fallback loss factor: #{factor} (should be 0 < loss_factor < 1)"
|
48
|
-
# end
|
49
|
-
# end
|
26
|
+
# FIXME TODO verify fallback loss factor
|
50
27
|
end
|
51
28
|
end
|
@@ -4,11 +4,27 @@ class EgridSubregion < ActiveRecord::Base
|
|
4
4
|
has_many :zip_codes, :foreign_key => 'egrid_subregion_abbreviation'
|
5
5
|
belongs_to :egrid_region, :foreign_key => 'egrid_region_name'
|
6
6
|
|
7
|
-
|
7
|
+
class << self
|
8
|
+
def fallback_egrid_region
|
9
|
+
EgridRegion.fallback
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
falls_back_on :egrid_region => lambda { EgridSubregion.fallback_egrid_region },
|
14
|
+
:electricity_co2_emission_factor => lambda { weighted_average(:electricity_co2_emission_factor, :weighted_by => :net_generation) },
|
15
|
+
:electricity_co2_emission_factor_units => 'kilograms_per_kilowatt_hour',
|
16
|
+
:electricity_co2_biogenic_emission_factor => lambda { weighted_average(:electricity_co2_biogenic_emission_factor, :weighted_by => :net_generation) },
|
17
|
+
:electricity_co2_biogenic_emission_factor_units => 'kilograms_per_kilowatt_hour',
|
18
|
+
:electricity_ch4_emission_factor => lambda { weighted_average(:electricity_ch4_emission_factor, :weighted_by => :net_generation) },
|
19
|
+
:electricity_ch4_emission_factor_units => 'kilograms_co2e_per_kilowatt_hour',
|
20
|
+
:electricity_n2o_emission_factor => lambda { weighted_average(:electricity_n2o_emission_factor, :weighted_by => :net_generation) },
|
21
|
+
:electricity_n2o_emission_factor_units => 'kilograms_co2e_per_kilowatt_hour',
|
22
|
+
:electricity_emission_factor => lambda { weighted_average(:electricity_emission_factor, :weighted_by => :net_generation) }, # DEPRECATED
|
23
|
+
:electricity_emission_factor_units => 'kilograms_co2e_per_kilowatt_hour' # DEPRECATED
|
8
24
|
|
9
25
|
data_miner do
|
10
26
|
tap "Brighter Planet's egrid subregion data", Earth.taps_server
|
11
|
-
|
27
|
+
|
12
28
|
process "pull dependencies" do
|
13
29
|
run_data_miner_on_belongs_to_associations
|
14
30
|
end
|