earth 0.4.0 → 0.4.1
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/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
|