earth 0.0.18
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/.document +5 -0
- data/.gitignore +22 -0
- data/.rvmrc +8 -0
- data/Gemfile +5 -0
- data/LICENSE +20 -0
- data/README.markdown +38 -0
- data/Rakefile +71 -0
- data/VERSION +1 -0
- data/earth.gemspec +265 -0
- data/lib/earth.rb +169 -0
- data/lib/earth/air.rb +13 -0
- data/lib/earth/air/aircraft.rb +32 -0
- data/lib/earth/air/aircraft/data_miner.rb +171 -0
- data/lib/earth/air/aircraft_class.rb +10 -0
- data/lib/earth/air/aircraft_class/data_miner.rb +42 -0
- data/lib/earth/air/aircraft_manufacturer.rb +9 -0
- data/lib/earth/air/aircraft_manufacturer/data_miner.rb +20 -0
- data/lib/earth/air/airline.rb +16 -0
- data/lib/earth/air/airline/data_miner.rb +57 -0
- data/lib/earth/air/airport.rb +44 -0
- data/lib/earth/air/airport/data_miner.rb +80 -0
- data/lib/earth/air/data_miner.rb +15 -0
- data/lib/earth/air/flight_configuration.rb +18 -0
- data/lib/earth/air/flight_configuration/data_miner.rb +4 -0
- data/lib/earth/air/flight_distance_class.rb +7 -0
- data/lib/earth/air/flight_distance_class/data_miner.rb +16 -0
- data/lib/earth/air/flight_domesticity.rb +6 -0
- data/lib/earth/air/flight_domesticity/data_miner.rb +57 -0
- data/lib/earth/air/flight_fuel_type.rb +17 -0
- data/lib/earth/air/flight_fuel_type/data_miner.rb +4 -0
- data/lib/earth/air/flight_propulsion.rb +18 -0
- data/lib/earth/air/flight_propulsion/data_miner.rb +4 -0
- data/lib/earth/air/flight_seat_class.rb +12 -0
- data/lib/earth/air/flight_seat_class/data_miner.rb +36 -0
- data/lib/earth/air/flight_segment.rb +38 -0
- data/lib/earth/air/flight_segment/data_miner.rb +334 -0
- data/lib/earth/air/flight_service.rb +18 -0
- data/lib/earth/air/flight_service/data_miner.rb +4 -0
- data/lib/earth/all.rb +10 -0
- data/lib/earth/automobile.rb +8 -0
- data/lib/earth/automobile/automobile_fuel_type.rb +18 -0
- data/lib/earth/automobile/automobile_fuel_type/data_miner.rb +45 -0
- data/lib/earth/automobile/automobile_make.rb +14 -0
- data/lib/earth/automobile/automobile_make/data_miner.rb +68 -0
- data/lib/earth/automobile/automobile_make_fleet_year.rb +15 -0
- data/lib/earth/automobile/automobile_make_fleet_year/data_miner.rb +29 -0
- data/lib/earth/automobile/automobile_make_year.rb +14 -0
- data/lib/earth/automobile/automobile_make_year/data_miner.rb +45 -0
- data/lib/earth/automobile/automobile_model.rb +14 -0
- data/lib/earth/automobile/automobile_model/data_miner.rb +38 -0
- data/lib/earth/automobile/automobile_model_year.rb +15 -0
- data/lib/earth/automobile/automobile_model_year/data_miner.rb +51 -0
- data/lib/earth/automobile/automobile_size_class.rb +14 -0
- data/lib/earth/automobile/automobile_size_class/data_miner.rb +43 -0
- data/lib/earth/automobile/automobile_variant.rb +17 -0
- data/lib/earth/automobile/automobile_variant/data_miner.rb +464 -0
- data/lib/earth/automobile/data_miner.rb +8 -0
- data/lib/earth/bus.rb +1 -0
- data/lib/earth/bus/bus_class.rb +19 -0
- data/lib/earth/bus/bus_class/data_miner.rb +41 -0
- data/lib/earth/bus/data_miner.rb +1 -0
- data/lib/earth/conversions_ext.rb +45 -0
- data/lib/earth/data_miner.rb +10 -0
- data/lib/earth/diet.rb +2 -0
- data/lib/earth/diet/data_miner.rb +2 -0
- data/lib/earth/diet/diet_class.rb +15 -0
- data/lib/earth/diet/diet_class/data_miner.rb +36 -0
- data/lib/earth/diet/food_group.rb +17 -0
- data/lib/earth/diet/food_group/data_miner.rb +26 -0
- data/lib/earth/fuel.rb +2 -0
- data/lib/earth/fuel/data_miner.rb +2 -0
- data/lib/earth/fuel/fuel_price.rb +13 -0
- data/lib/earth/fuel/fuel_price/data_miner.rb +20 -0
- data/lib/earth/fuel/fuel_type.rb +18 -0
- data/lib/earth/fuel/fuel_type/data_miner.rb +37 -0
- data/lib/earth/industry.rb +10 -0
- data/lib/earth/industry/data_miner.rb +2 -0
- data/lib/earth/industry/industries_product_lines.rb +6 -0
- data/lib/earth/industry/industries_sectors.rb +6 -0
- data/lib/earth/industry/industry.rb +12 -0
- data/lib/earth/industry/industry/data_miner.rb +21 -0
- data/lib/earth/industry/merchant.rb +5 -0
- data/lib/earth/industry/merchant_categories_industries.rb +8 -0
- data/lib/earth/industry/merchant_category.rb +6 -0
- data/lib/earth/industry/product_line.rb +10 -0
- data/lib/earth/industry/product_line/data_miner.rb +18 -0
- data/lib/earth/industry/product_lines_sectors.rb +6 -0
- data/lib/earth/industry/sector.rb +3 -0
- data/lib/earth/inflectors.rb +9 -0
- data/lib/earth/locality.rb +10 -0
- data/lib/earth/locality/census_division.rb +17 -0
- data/lib/earth/locality/census_division/data_miner.rb +21 -0
- data/lib/earth/locality/census_region.rb +13 -0
- data/lib/earth/locality/census_region/data_miner.rb +17 -0
- data/lib/earth/locality/climate_division.rb +17 -0
- data/lib/earth/locality/climate_division/data_miner.rb +20 -0
- data/lib/earth/locality/country.rb +13 -0
- data/lib/earth/locality/country/data_miner.rb +19 -0
- data/lib/earth/locality/data_miner.rb +10 -0
- data/lib/earth/locality/egrid_region.rb +15 -0
- data/lib/earth/locality/egrid_region/data_miner.rb +19 -0
- data/lib/earth/locality/egrid_subregion.rb +16 -0
- data/lib/earth/locality/egrid_subregion/data_miner.rb +26 -0
- data/lib/earth/locality/petroleum_administration_for_defense_district.rb +13 -0
- data/lib/earth/locality/petroleum_administration_for_defense_district/data_miner.rb +21 -0
- data/lib/earth/locality/state.rb +22 -0
- data/lib/earth/locality/state/data_miner.rb +37 -0
- data/lib/earth/locality/urbanity.rb +20 -0
- data/lib/earth/locality/urbanity/data_miner.rb +4 -0
- data/lib/earth/locality/zip_code.rb +29 -0
- data/lib/earth/locality/zip_code/data_miner.rb +36 -0
- data/lib/earth/pet.rb +4 -0
- data/lib/earth/pet/breed.rb +15 -0
- data/lib/earth/pet/breed/data_miner.rb +25 -0
- data/lib/earth/pet/breed_gender.rb +14 -0
- data/lib/earth/pet/breed_gender/data_miner.rb +21 -0
- data/lib/earth/pet/data_miner.rb +4 -0
- data/lib/earth/pet/gender.rb +10 -0
- data/lib/earth/pet/gender/data_miner.rb +13 -0
- data/lib/earth/pet/species.rb +40 -0
- data/lib/earth/pet/species/data_miner.rb +42 -0
- data/lib/earth/rail.rb +1 -0
- data/lib/earth/rail/data_miner.rb +1 -0
- data/lib/earth/rail/rail_class.rb +16 -0
- data/lib/earth/rail/rail_class/data_miner.rb +36 -0
- data/lib/earth/residence.rb +8 -0
- data/lib/earth/residence/air_conditioner_use.rb +30 -0
- data/lib/earth/residence/air_conditioner_use/data_miner.rb +4 -0
- data/lib/earth/residence/clothes_machine_use.rb +33 -0
- data/lib/earth/residence/clothes_machine_use/data_miner.rb +4 -0
- data/lib/earth/residence/data_miner.rb +8 -0
- data/lib/earth/residence/dishwasher_use.rb +33 -0
- data/lib/earth/residence/dishwasher_use/data_miner.rb +4 -0
- data/lib/earth/residence/residence_appliance.rb +7 -0
- data/lib/earth/residence/residence_appliance/data_miner.rb +19 -0
- data/lib/earth/residence/residence_class.rb +26 -0
- data/lib/earth/residence/residence_class/data_miner.rb +4 -0
- data/lib/earth/residence/residence_fuel_price.rb +18 -0
- data/lib/earth/residence/residence_fuel_price/data_miner.rb +200 -0
- data/lib/earth/residence/residence_fuel_type.rb +33 -0
- data/lib/earth/residence/residence_fuel_type/data_miner.rb +18 -0
- data/lib/earth/residence/residential_energy_consumption_survey_response.rb +67 -0
- data/lib/earth/residence/residential_energy_consumption_survey_response/data_miner.rb +264 -0
- data/lib/earth/schema.rb +8 -0
- data/spec/lib/earth_spec.rb +25 -0
- data/spec/spec_helper.rb +11 -0
- data/vendor/geokit-rails/CHANGELOG.rdoc +46 -0
- data/vendor/geokit-rails/MIT-LICENSE +20 -0
- data/vendor/geokit-rails/README.markdown +561 -0
- data/vendor/geokit-rails/Rakefile +18 -0
- data/vendor/geokit-rails/about.yml +9 -0
- data/vendor/geokit-rails/assets/api_keys_template +61 -0
- data/vendor/geokit-rails/init.rb +1 -0
- data/vendor/geokit-rails/install.rb +14 -0
- data/vendor/geokit-rails/lib/geokit-rails.rb +24 -0
- data/vendor/geokit-rails/lib/geokit-rails/acts_as_mappable.rb +456 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/abstract.rb +31 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/mysql.rb +22 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/postgresql.rb +22 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/sqlserver.rb +43 -0
- data/vendor/geokit-rails/lib/geokit-rails/defaults.rb +22 -0
- data/vendor/geokit-rails/lib/geokit-rails/geocoder_control.rb +16 -0
- data/vendor/geokit-rails/lib/geokit-rails/ip_geocode_lookup.rb +46 -0
- data/vendor/geokit-rails/test/acts_as_mappable_test.rb +474 -0
- data/vendor/geokit-rails/test/boot.rb +25 -0
- data/vendor/geokit-rails/test/database.yml +20 -0
- data/vendor/geokit-rails/test/fixtures/companies.yml +7 -0
- data/vendor/geokit-rails/test/fixtures/custom_locations.yml +54 -0
- data/vendor/geokit-rails/test/fixtures/locations.yml +54 -0
- data/vendor/geokit-rails/test/fixtures/mock_addresses.yml +17 -0
- data/vendor/geokit-rails/test/fixtures/mock_families.yml +2 -0
- data/vendor/geokit-rails/test/fixtures/mock_houses.yml +9 -0
- data/vendor/geokit-rails/test/fixtures/mock_organizations.yml +5 -0
- data/vendor/geokit-rails/test/fixtures/mock_people.yml +5 -0
- data/vendor/geokit-rails/test/fixtures/stores.yml +0 -0
- data/vendor/geokit-rails/test/ip_geocode_lookup_test.rb +77 -0
- data/vendor/geokit-rails/test/models/company.rb +3 -0
- data/vendor/geokit-rails/test/models/custom_location.rb +12 -0
- data/vendor/geokit-rails/test/models/location.rb +4 -0
- data/vendor/geokit-rails/test/models/mock_address.rb +4 -0
- data/vendor/geokit-rails/test/models/mock_family.rb +3 -0
- data/vendor/geokit-rails/test/models/mock_house.rb +3 -0
- data/vendor/geokit-rails/test/models/mock_organization.rb +4 -0
- data/vendor/geokit-rails/test/models/mock_person.rb +4 -0
- data/vendor/geokit-rails/test/models/store.rb +3 -0
- data/vendor/geokit-rails/test/schema.rb +60 -0
- data/vendor/geokit-rails/test/tasks.rake +31 -0
- data/vendor/geokit-rails/test/test_helper.rb +23 -0
- metadata +444 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
ResidenceAppliance.class_eval do
|
|
2
|
+
data_miner do
|
|
3
|
+
schema Earth.database_options do
|
|
4
|
+
string 'name'
|
|
5
|
+
float 'annual_energy_from_electricity'
|
|
6
|
+
string 'annual_energy_from_electricity_units'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
process "Derive from residential energy consumption survey responses" do
|
|
10
|
+
ResidentialEnergyConsumptionSurveyResponse.run_data_miner!
|
|
11
|
+
ResidentialEnergyConsumptionSurveyResponse.column_names.select { |column| column.match(/annual.*_count/) }.map { |column| column.gsub '_count', '' }.each do |appliance_name|
|
|
12
|
+
appliance = find_or_create_by_name appliance_name
|
|
13
|
+
appliance.annual_energy_from_electricity = ResidentialEnergyConsumptionSurveyResponse.weighted_average "annual_energy_from_electricity_for_#{appliance_name.pluralize}"
|
|
14
|
+
appliance.save!
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class ResidenceClass < ActiveRecord::Base
|
|
2
|
+
set_primary_key :name
|
|
3
|
+
|
|
4
|
+
has_many :residences
|
|
5
|
+
has_many :residential_energy_consumption_survey_responses
|
|
6
|
+
|
|
7
|
+
CLASSIFICATIONS = ['mobile home', 'house', 'apartment']
|
|
8
|
+
|
|
9
|
+
def classification
|
|
10
|
+
CLASSIFICATIONS.detect { |c| name.downcase.include? c }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
data_miner do
|
|
14
|
+
schema do
|
|
15
|
+
string :name
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
process "derive from ResidentialEnergyConsumptionSurveyResponse" do
|
|
19
|
+
ResidentialEnergyConsumptionSurveyResponse.run_data_miner!
|
|
20
|
+
connection.execute %{
|
|
21
|
+
INSERT IGNORE INTO residence_classes(name)
|
|
22
|
+
SELECT DISTINCT residential_energy_consumption_survey_responses.residence_class_id FROM residential_energy_consumption_survey_responses WHERE LENGTH(residential_energy_consumption_survey_responses.residence_class_id) > 0
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
class ResidenceFuelPrice < ActiveRecord::Base
|
|
2
|
+
set_primary_key :row_hash
|
|
3
|
+
|
|
4
|
+
extend CohortScope
|
|
5
|
+
self.minimum_cohort_size = 5 # ? FIXME
|
|
6
|
+
|
|
7
|
+
belongs_to :fuel, :class_name => 'ResidenceFuelType', :foreign_key => 'residence_fuel_type_name'
|
|
8
|
+
belongs_to :locatable, :polymorphic => true
|
|
9
|
+
|
|
10
|
+
data_miner do
|
|
11
|
+
tap "Brighter Planet's residence fuel price data", Earth.taps_server
|
|
12
|
+
|
|
13
|
+
process "pull dependencies" do
|
|
14
|
+
run_data_miner_on_belongs_to_associations
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
end
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
ResidenceFuelPrice.class_eval do
|
|
2
|
+
class FuelOilParser
|
|
3
|
+
def initialize(options = {})
|
|
4
|
+
# nothing
|
|
5
|
+
end
|
|
6
|
+
def add_hints!(bus)
|
|
7
|
+
bus[:sheet] = 'Data 1'
|
|
8
|
+
bus[:skip] = 2
|
|
9
|
+
bus[:select] = lambda { |row| row['year'].to_i > 1989 }
|
|
10
|
+
end
|
|
11
|
+
def apply(row)
|
|
12
|
+
virtual_rows = []
|
|
13
|
+
row.keys.grep(/(.*) Residual Fuel Oil/) do |location_column_name|
|
|
14
|
+
match_1 = $1
|
|
15
|
+
next if (price = row[location_column_name]).blank? or (date = row['Date']).blank?
|
|
16
|
+
if match_1.starts_with?('U.S.')
|
|
17
|
+
locatable_id = 'US'
|
|
18
|
+
locatable_type = 'Country'
|
|
19
|
+
elsif match_1.include?('PADD')
|
|
20
|
+
/\(PADD (.*)\)/.match match_1
|
|
21
|
+
match_2 = $1
|
|
22
|
+
next if match_2 == '1' # skip PADD 1 because we always prefer subdistricts
|
|
23
|
+
locatable_id = match_2
|
|
24
|
+
locatable_type = 'PetroleumAdministrationForDefenseDistrict'
|
|
25
|
+
else
|
|
26
|
+
locatable_id = match_1
|
|
27
|
+
locatable_type = 'State'
|
|
28
|
+
end
|
|
29
|
+
date = Time.parse(date)
|
|
30
|
+
new_row = ActiveSupport::OrderedHash.new
|
|
31
|
+
new_row['locatable_id'] = locatable_id
|
|
32
|
+
new_row['locatable_type'] = locatable_type
|
|
33
|
+
new_row['price'] = price.to_f.cents.to(:dollars)
|
|
34
|
+
new_row['year'] = date.year
|
|
35
|
+
new_row['month'] = date.month
|
|
36
|
+
row_hash = RemoteTable::Transform.row_hash new_row
|
|
37
|
+
new_row['row_hash'] = row_hash
|
|
38
|
+
virtual_rows << new_row
|
|
39
|
+
end
|
|
40
|
+
virtual_rows
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
class PropaneParser
|
|
45
|
+
def initialize(options = {})
|
|
46
|
+
# nothing
|
|
47
|
+
end
|
|
48
|
+
def add_hints!(bus)
|
|
49
|
+
bus[:sheet] = 'Data 1'
|
|
50
|
+
bus[:skip] = 2
|
|
51
|
+
bus[:select] = lambda { |row| row['year'].to_i > 1989 }
|
|
52
|
+
end
|
|
53
|
+
def apply(row)
|
|
54
|
+
virtual_rows = []
|
|
55
|
+
row.keys.grep(/(.*) Propane Residential Price/) do |location_column_name|
|
|
56
|
+
match_1 = $1
|
|
57
|
+
next if (price = row[location_column_name]).blank? or (date = row['Date']).blank?
|
|
58
|
+
if match_1.starts_with?('U.S.')
|
|
59
|
+
locatable_id = 'US'
|
|
60
|
+
locatable_type = 'Country'
|
|
61
|
+
else
|
|
62
|
+
/\(PADD (.*)\)/.match match_1
|
|
63
|
+
match_2 = $1
|
|
64
|
+
next if match_2 == '1' # skip PADD 1 because we always prefer subdistricts
|
|
65
|
+
locatable_id = match_2
|
|
66
|
+
locatable_type = 'PetroleumAdministrationForDefenseDistrict'
|
|
67
|
+
end
|
|
68
|
+
date = Time.parse(date)
|
|
69
|
+
new_row = ActiveSupport::OrderedHash.new
|
|
70
|
+
new_row['locatable_id'] = locatable_id
|
|
71
|
+
new_row['locatable_type'] = locatable_type
|
|
72
|
+
new_row['price'] = price.to_f.cents.to(:dollars)
|
|
73
|
+
new_row['year'] = date.year
|
|
74
|
+
new_row['month'] = date.month
|
|
75
|
+
row_hash = RemoteTable::Transform.row_hash new_row
|
|
76
|
+
new_row['row_hash'] = row_hash
|
|
77
|
+
virtual_rows << new_row
|
|
78
|
+
end
|
|
79
|
+
virtual_rows
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
class NaturalGasParser
|
|
84
|
+
def initialize(options = {})
|
|
85
|
+
# nothing
|
|
86
|
+
end
|
|
87
|
+
def add_hints!(bus)
|
|
88
|
+
bus[:sheet] = 'Data 1'
|
|
89
|
+
bus[:skip] = 2
|
|
90
|
+
bus[:select] = lambda { |row| row['year'].to_i > 1989 }
|
|
91
|
+
end
|
|
92
|
+
def apply(row)
|
|
93
|
+
virtual_rows = []
|
|
94
|
+
row.keys.grep(/\A(.*) Natural Gas/) do |location_column_name|
|
|
95
|
+
match_1 = $1
|
|
96
|
+
next if (price = row[location_column_name]).blank? or (date = row['Date']).blank?
|
|
97
|
+
if match_1 == 'U.S.'
|
|
98
|
+
locatable_id = 'US'
|
|
99
|
+
locatable_type = 'Country'
|
|
100
|
+
else
|
|
101
|
+
locatable_id = match_1 # name
|
|
102
|
+
locatable_type = 'State'
|
|
103
|
+
end
|
|
104
|
+
date = Time.parse(date)
|
|
105
|
+
new_row = ActiveSupport::OrderedHash.new
|
|
106
|
+
new_row['locatable_id'] = locatable_id
|
|
107
|
+
new_row['locatable_type'] = locatable_type
|
|
108
|
+
new_row['price'] = price
|
|
109
|
+
new_row['year'] = date.year
|
|
110
|
+
new_row['month'] = date.month
|
|
111
|
+
row_hash = RemoteTable::Transform.row_hash new_row
|
|
112
|
+
new_row['row_hash'] = row_hash
|
|
113
|
+
virtual_rows << new_row
|
|
114
|
+
end
|
|
115
|
+
virtual_rows
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
data_miner do
|
|
120
|
+
schema Earth.database_options do
|
|
121
|
+
string 'row_hash'
|
|
122
|
+
string 'residence_fuel_type_name'
|
|
123
|
+
integer 'year'
|
|
124
|
+
integer 'month'
|
|
125
|
+
float 'price'
|
|
126
|
+
string 'price_units'
|
|
127
|
+
string 'price_description'
|
|
128
|
+
string 'locatable_id'
|
|
129
|
+
string 'locatable_type'
|
|
130
|
+
index ['price', 'residence_fuel_type_name', 'month', 'year', 'locatable_type', 'locatable_id']
|
|
131
|
+
index ['price', 'residence_fuel_type_name']
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
process "Define some unit conversions" do
|
|
135
|
+
Conversions.register :dollars, :cents, 100
|
|
136
|
+
Conversions.register :cubic_feet, :cubic_metres, 0.0283168466 # TODO conversions gem has 'cubic_metres'
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# electricity in dollars per kWh
|
|
140
|
+
import 'residential electricity prices from the EIA',
|
|
141
|
+
:url => 'http://www.eia.doe.gov/cneaf/electricity/page/sales_revenue.xls',
|
|
142
|
+
:select => lambda { |row| row['Year'].to_s.first(4).to_i > 1989 } do
|
|
143
|
+
key 'row_hash'
|
|
144
|
+
store 'residence_fuel_type_name', :static => 'electricity'
|
|
145
|
+
store 'locatable_id', :field_name => 'State' # postal abbrev
|
|
146
|
+
store 'locatable_type', :static => 'State'
|
|
147
|
+
store 'price', :field_name => 'Average Retail Price Residential (c/kWh)', :from_units => :cents, :to_units => :dollars
|
|
148
|
+
store 'price_description', :static => 'dollars_per_kilowatt_hour'
|
|
149
|
+
store 'year', :field_name => 'Year'
|
|
150
|
+
store 'month', :field_name => 'Month'
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# natural gas in dollars per cubic metre
|
|
154
|
+
# breaks if date-performance is enabled because DateTime.parse(...1899...) dies
|
|
155
|
+
import 'residential natural gas prices from the EIA',
|
|
156
|
+
:url => 'http://tonto.eia.doe.gov/dnav/ng/xls/ng_pri_sum_a_EPG0_FWA_DMcf_a.xls',
|
|
157
|
+
:transform => { :class => NaturalGasParser } do
|
|
158
|
+
key 'row_hash'
|
|
159
|
+
store 'residence_fuel_type_name', :static => 'natural gas'
|
|
160
|
+
store 'locatable_id'
|
|
161
|
+
store 'locatable_type'
|
|
162
|
+
store 'price', :from_units => :cubic_metres, :to_units => :cubic_feet # denominator
|
|
163
|
+
store 'price_description', :static => 'dollars_per_cubic_metre'
|
|
164
|
+
store 'year'
|
|
165
|
+
store 'month'
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# dollars per litre
|
|
169
|
+
import "residential fuel oil prices from the EIA",
|
|
170
|
+
:url => 'http://tonto.eia.doe.gov/dnav/pet/xls/PET_PRI_RESID_A_EPPR_PTA_CPGAL_M.xls',
|
|
171
|
+
:transform => { :class => FuelOilParser } do
|
|
172
|
+
key 'row_hash'
|
|
173
|
+
store 'residence_fuel_type_name', :static => 'fuel oil'
|
|
174
|
+
store 'locatable_id'
|
|
175
|
+
store 'locatable_type'
|
|
176
|
+
store 'price', :from_units => :litres, :to_units => :gallons # denominator
|
|
177
|
+
store 'price_description', :static => 'dollars_per_litre'
|
|
178
|
+
store 'year'
|
|
179
|
+
store 'month'
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# dollars per litre
|
|
183
|
+
import "residential propane prices from the EIA",
|
|
184
|
+
:url => 'http://tonto.eia.doe.gov/dnav/pet/xls/PET_PRI_PROP_A_EPLLPA_PRT_CPGAL_M.xls',
|
|
185
|
+
:transform => { :class => PropaneParser } do
|
|
186
|
+
key 'row_hash'
|
|
187
|
+
store 'residence_fuel_type_name', :static => 'propane'
|
|
188
|
+
store 'locatable_id'
|
|
189
|
+
store 'locatable_type'
|
|
190
|
+
store 'price', :from_units => :litres, :to_units => :gallons # denominator
|
|
191
|
+
store 'price_description', :static => 'dollars_per_litre'
|
|
192
|
+
store 'year'
|
|
193
|
+
store 'month'
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# per Matt in https://brighterplanet.sifterapp.com/projects/30/issues/410/comments
|
|
197
|
+
# "For coal and kerosene, there isn't good residential price data available, because hardly anybody actually uses them residentially."
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
class ResidenceFuelType < ActiveRecord::Base
|
|
2
|
+
set_primary_key :name
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
has_many :prices, :class_name => 'ResidenceFuelPrice', :foreign_key => 'residence_fuel_type_name'
|
|
6
|
+
|
|
7
|
+
data_miner do
|
|
8
|
+
tap "Brighter Planet's residence fuel types data", Earth.taps_server
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def price_per_unit(relaxations = [])
|
|
12
|
+
conditions = { :residence_fuel_type_name => self }
|
|
13
|
+
relaxations.push Hash.new
|
|
14
|
+
relaxations.grab do |relaxation|
|
|
15
|
+
relaxation_conditions = Hash.new
|
|
16
|
+
if timeframe = relaxation[:timeframe]
|
|
17
|
+
relaxation_conditions[:year] = timeframe.from.year
|
|
18
|
+
relaxation_conditions[:month] = timeframe.from.month..timeframe.to.yesterday.month
|
|
19
|
+
end
|
|
20
|
+
if location = relaxation[:location]
|
|
21
|
+
relaxation_conditions[:locatable_type] = location.class.to_s
|
|
22
|
+
relaxation_conditions[:locatable_id] = location.id
|
|
23
|
+
end
|
|
24
|
+
ResidenceFuelPrice.average :price, :conditions => conditions.merge(relaxation_conditions)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class << self
|
|
29
|
+
def [](fuel)
|
|
30
|
+
find_by_name fuel.to_s.humanize.downcase
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
ResidenceFuelType.class_eval do
|
|
2
|
+
data_miner do
|
|
3
|
+
schema Earth.database_options do
|
|
4
|
+
string 'name'
|
|
5
|
+
float 'emission_factor'
|
|
6
|
+
string 'emission_factor_units'
|
|
7
|
+
# float 'energy_content'
|
|
8
|
+
# string 'energy_content_units'
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
import "a list of residential fuels and their emissions factors",
|
|
12
|
+
:url => 'http://spreadsheets.google.com/pub?key=rukxnmuhhsOsrztTrUaFCXQ' do
|
|
13
|
+
key 'name'
|
|
14
|
+
store 'emission_factor', :field_name => 'emission_factor', :units_field_name => 'units'
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
class ResidentialEnergyConsumptionSurveyResponse < ActiveRecord::Base
|
|
2
|
+
set_primary_key :department_of_energy_identifier
|
|
3
|
+
|
|
4
|
+
belongs_to :census_division, :foreign_key => 'census_division_number'
|
|
5
|
+
belongs_to :census_region, :foreign_key => 'census_region_number'
|
|
6
|
+
# what follows are entirely derived here
|
|
7
|
+
belongs_to :residence_class
|
|
8
|
+
belongs_to :urbanity
|
|
9
|
+
belongs_to :dishwasher_use
|
|
10
|
+
belongs_to :air_conditioner_use
|
|
11
|
+
belongs_to :clothes_machine_use
|
|
12
|
+
|
|
13
|
+
extend CohortScope
|
|
14
|
+
self.minimum_cohort_size = 5
|
|
15
|
+
SUBCOHORT_THRESHOLD = 5 # per Matt
|
|
16
|
+
|
|
17
|
+
INPUT_CHARACTERISTICS = [
|
|
18
|
+
:census_region,
|
|
19
|
+
:heating_degree_days,
|
|
20
|
+
:cooling_degree_days,
|
|
21
|
+
:residence_class,
|
|
22
|
+
:rooms,
|
|
23
|
+
:bedrooms,
|
|
24
|
+
:bathrooms,
|
|
25
|
+
:floorspace,
|
|
26
|
+
:residents,
|
|
27
|
+
:urbanity,
|
|
28
|
+
:construction_year,
|
|
29
|
+
:ownership,
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
data_miner do
|
|
33
|
+
tap "Brighter Planet's sanitized RECS 2005", Earth.taps_server
|
|
34
|
+
|
|
35
|
+
process "rename certain columns so that we can use them as association names" do
|
|
36
|
+
connection.rename_column :residential_energy_consumption_survey_responses, :dishwasher_use, :dishwasher_use_id
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
process "synthesize air conditioner use from central AC and window AC use" do
|
|
40
|
+
connection.add_column :residential_energy_consumption_survey_responses, :air_conditioner_use_id, :string
|
|
41
|
+
update_all "air_conditioner_use_id = 'Turned on just about all summer'", " central_ac_use = 'Turned on just about all summer' OR window_ac_use = 'Turned on just about all summer'"
|
|
42
|
+
update_all "air_conditioner_use_id = 'Turned on quite a bit'", "(central_ac_use = 'Turned on quite a bit' OR window_ac_use = 'Turned on quite a bit') AND air_conditioner_use_id IS NULL"
|
|
43
|
+
update_all "air_conditioner_use_id = 'Turned on only a few days or nights when really needed'", "(central_ac_use = 'Turned on only a few days or nights when really needed' OR window_ac_use = 'Turned on only a few days or nights when really needed') AND air_conditioner_use_id IS NULL"
|
|
44
|
+
update_all "air_conditioner_use_id = 'Not used at all'", "(central_ac_use = 'Not used at all' OR window_ac_use = 'Not used at all') AND air_conditioner_use_id IS NULL"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
process "synthesize clothes machine use from washer and dryer use" do
|
|
48
|
+
connection.add_column :residential_energy_consumption_survey_responses, :clothes_machine_use_id, :string
|
|
49
|
+
update_all "clothes_machine_use_id = clothes_washer_use", " clothes_dryer_use = 'Use it every time you wash clothes'"
|
|
50
|
+
update_all "clothes_machine_use_id = NULL", "clothes_washer_use IS NULL AND clothes_dryer_use = 'Use it for some, but not all, loads of wash'"
|
|
51
|
+
update_all "clothes_machine_use_id = '1 load or less each week'", "clothes_washer_use = '1 load or less each week' AND clothes_dryer_use = 'Use it for some, but not all, loads of wash'"
|
|
52
|
+
update_all "clothes_machine_use_id = '1 load or less each week'", "clothes_washer_use = '2 to 4 loads' AND clothes_dryer_use = 'Use it for some, but not all, loads of wash'"
|
|
53
|
+
update_all "clothes_machine_use_id = '2 to 4 loads'", "clothes_washer_use = '5 to 9 loads' AND clothes_dryer_use = 'Use it for some, but not all, loads of wash'"
|
|
54
|
+
update_all "clothes_machine_use_id = '5 to 9 loads'", "clothes_washer_use = '10 to 15 loads' AND clothes_dryer_use = 'Use it for some, but not all, loads of wash'"
|
|
55
|
+
update_all "clothes_machine_use_id = '10 to 15 loads'", "clothes_washer_use = 'More than 15 loads' AND clothes_dryer_use = 'Use it for some, but not all, loads of wash'"
|
|
56
|
+
update_all "clothes_machine_use_id = NULL", "clothes_washer_use IS NULL AND clothes_dryer_use = 'Use it infrequently'"
|
|
57
|
+
update_all "clothes_machine_use_id = '1 load or less each week'", "clothes_washer_use = '1 load or less each week' AND clothes_dryer_use = 'Use it infrequently'"
|
|
58
|
+
update_all "clothes_machine_use_id = '1 load or less each week'", "clothes_washer_use = '5 to 9 loads' AND clothes_dryer_use = 'Use it infrequently'"
|
|
59
|
+
update_all "clothes_machine_use_id = '2 to 4 loads'", "clothes_washer_use = '10 to 15 loads' AND clothes_dryer_use = 'Use it infrequently'"
|
|
60
|
+
update_all "clothes_machine_use_id = '5 to 9 loads'", "clothes_washer_use = 'More than 15 loads' AND clothes_dryer_use = 'Use it infrequently'"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
process "pull dependencies" do
|
|
64
|
+
run_data_miner_on_belongs_to_associations
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
ResidentialEnergyConsumptionSurveyResponse.class_eval do
|
|
2
|
+
data_miner do
|
|
3
|
+
process "Don't re-import too often" do
|
|
4
|
+
raise DataMiner::Skip unless DataMiner::Run.allowed? ResidentialEnergyConsumptionSurveyResponse
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
schema Earth.database_options do
|
|
8
|
+
integer 'department_of_energy_identifier'
|
|
9
|
+
string 'residence_class_id'
|
|
10
|
+
date 'construction_year'
|
|
11
|
+
string 'construction_period'
|
|
12
|
+
string 'urbanity_id'
|
|
13
|
+
string 'dishwasher_use_id'
|
|
14
|
+
string 'central_ac_use'
|
|
15
|
+
string 'window_ac_use'
|
|
16
|
+
string 'clothes_washer_use'
|
|
17
|
+
string 'clothes_dryer_use'
|
|
18
|
+
integer 'census_division_number'
|
|
19
|
+
string 'census_division_name'
|
|
20
|
+
integer 'census_region_number'
|
|
21
|
+
string 'census_region_name'
|
|
22
|
+
float 'rooms'
|
|
23
|
+
float 'floorspace'
|
|
24
|
+
string 'floorspace_units'
|
|
25
|
+
integer 'residents'
|
|
26
|
+
boolean 'ownership'
|
|
27
|
+
boolean 'thermostat_programmability'
|
|
28
|
+
integer 'refrigerator_count'
|
|
29
|
+
integer 'freezer_count'
|
|
30
|
+
float 'annual_energy_from_fuel_oil_for_heating_space'
|
|
31
|
+
string 'annual_energy_from_fuel_oil_for_heating_space_units'
|
|
32
|
+
float 'annual_energy_from_fuel_oil_for_heating_water'
|
|
33
|
+
string 'annual_energy_from_fuel_oil_for_heating_water_units'
|
|
34
|
+
float 'annual_energy_from_fuel_oil_for_appliances'
|
|
35
|
+
string 'annual_energy_from_fuel_oil_for_appliances_units'
|
|
36
|
+
float 'annual_energy_from_natural_gas_for_heating_space'
|
|
37
|
+
string 'annual_energy_from_natural_gas_for_heating_space_units'
|
|
38
|
+
float 'annual_energy_from_natural_gas_for_heating_water'
|
|
39
|
+
string 'annual_energy_from_natural_gas_for_heating_water_units'
|
|
40
|
+
float 'annual_energy_from_natural_gas_for_appliances'
|
|
41
|
+
string 'annual_energy_from_natural_gas_for_appliances_units'
|
|
42
|
+
float 'annual_energy_from_propane_for_heating_space'
|
|
43
|
+
string 'annual_energy_from_propane_for_heating_space_units'
|
|
44
|
+
float 'annual_energy_from_propane_for_heating_water'
|
|
45
|
+
string 'annual_energy_from_propane_for_heating_water_units'
|
|
46
|
+
float 'annual_energy_from_propane_for_appliances'
|
|
47
|
+
string 'annual_energy_from_propane_for_appliances_units'
|
|
48
|
+
float 'annual_energy_from_wood'
|
|
49
|
+
string 'annual_energy_from_wood_units'
|
|
50
|
+
float 'annual_energy_from_kerosene'
|
|
51
|
+
string 'annual_energy_from_kerosene_units'
|
|
52
|
+
float 'annual_energy_from_electricity_for_clothes_driers'
|
|
53
|
+
string 'annual_energy_from_electricity_for_clothes_driers_units'
|
|
54
|
+
float 'annual_energy_from_electricity_for_dishwashers'
|
|
55
|
+
string 'annual_energy_from_electricity_for_dishwashers_units'
|
|
56
|
+
float 'annual_energy_from_electricity_for_freezers'
|
|
57
|
+
string 'annual_energy_from_electricity_for_freezers_units'
|
|
58
|
+
float 'annual_energy_from_electricity_for_refrigerators'
|
|
59
|
+
string 'annual_energy_from_electricity_for_refrigerators_units'
|
|
60
|
+
float 'annual_energy_from_electricity_for_air_conditioners'
|
|
61
|
+
string 'annual_energy_from_electricity_for_air_conditioners_units'
|
|
62
|
+
float 'annual_energy_from_electricity_for_heating_space'
|
|
63
|
+
string 'annual_energy_from_electricity_for_heating_space_units'
|
|
64
|
+
float 'annual_energy_from_electricity_for_heating_water'
|
|
65
|
+
string 'annual_energy_from_electricity_for_heating_water_units'
|
|
66
|
+
float 'annual_energy_from_electricity_for_other_appliances'
|
|
67
|
+
string 'annual_energy_from_electricity_for_other_appliances_units'
|
|
68
|
+
float 'weighting'
|
|
69
|
+
float 'lighting_use'
|
|
70
|
+
string 'lighting_use_units'
|
|
71
|
+
float 'lighting_efficiency'
|
|
72
|
+
integer 'heating_degree_days'
|
|
73
|
+
string 'heating_degree_days_units'
|
|
74
|
+
integer 'cooling_degree_days'
|
|
75
|
+
string 'cooling_degree_days_units'
|
|
76
|
+
integer 'total_rooms'
|
|
77
|
+
integer 'full_bathrooms'
|
|
78
|
+
integer 'bedrooms'
|
|
79
|
+
integer 'half_bathrooms'
|
|
80
|
+
float 'bathrooms'
|
|
81
|
+
boolean 'heated_garage'
|
|
82
|
+
boolean 'attached_1car_garage'
|
|
83
|
+
boolean 'detached_1car_garage'
|
|
84
|
+
boolean 'attached_2car_garage'
|
|
85
|
+
boolean 'detached_2car_garage'
|
|
86
|
+
boolean 'attached_3car_garage'
|
|
87
|
+
boolean 'detached_3car_garage'
|
|
88
|
+
integer 'lights_on_1_to_4_hours'
|
|
89
|
+
integer 'efficient_lights_on_1_to_4_hours'
|
|
90
|
+
integer 'lights_on_4_to_12_hours'
|
|
91
|
+
integer 'efficient_lights_on_4_to_12_hours'
|
|
92
|
+
integer 'lights_on_over_12_hours'
|
|
93
|
+
integer 'efficient_lights_on_over_12_hours'
|
|
94
|
+
integer 'outdoor_all_night_lights'
|
|
95
|
+
integer 'outdoor_all_night_gas_lights'
|
|
96
|
+
integer 'air_conditioner_use_id'
|
|
97
|
+
integer 'clothes_machine_use_id'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
process "Define some unit conversions" do
|
|
101
|
+
Conversions.register :kbtus, :joules, 1_000.0 * 1_055.05585
|
|
102
|
+
Conversions.register :square_feet, :square_metres, 0.09290304
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# conversions are NOT performed here, since we first have to zero out legitimate skips
|
|
106
|
+
# otherwise you will get values like "999 pounds = 453.138778 kilograms" (where 999 is really a legit skip)
|
|
107
|
+
import 'the 2005 EIA Residential Energy Consumption Survey microdata',
|
|
108
|
+
:url => 'http://www.eia.doe.gov/emeu/recs/recspubuse05/datafiles/RECS05alldata.csv',
|
|
109
|
+
:headers => :upcase do
|
|
110
|
+
key 'department_of_energy_identifier', :field_name => 'DOEID'
|
|
111
|
+
|
|
112
|
+
store 'residence_class_id', :field_name => 'TYPEHUQ', :dictionary => { :input => 'Code', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/typehuq/typehuq.csv' }
|
|
113
|
+
store 'construction_year', :field_name => 'YEARMADE', :dictionary => { :input => 'Code', :sprintf => '%02d', :output => 'Date in the middle (synthetic)', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/yearmade/yearmade.csv' }
|
|
114
|
+
store 'construction_period', :field_name => 'YEARMADE', :dictionary => { :input => 'Code', :sprintf => '%02d', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/yearmade/yearmade.csv' }
|
|
115
|
+
store 'urbanity_id', :field_name => 'URBRUR', :dictionary => { :input => 'Code', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/urbrur/urbrur.csv' }
|
|
116
|
+
store 'dishwasher_use_id', :field_name => 'DWASHUSE', :dictionary => { :input => 'Code', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/dwashuse/dwashuse.csv' }
|
|
117
|
+
store 'central_ac_use', :field_name => 'USECENAC', :dictionary => { :input => 'Code', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/usecenac/usecenac.csv' }
|
|
118
|
+
store 'window_ac_use', :field_name => 'USEWWAC', :dictionary => { :input => 'Code', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/usewwac/usewwac.csv' }
|
|
119
|
+
store 'clothes_washer_use', :field_name => 'WASHLOAD', :dictionary => { :input => 'Code', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/washload/washload.csv' }
|
|
120
|
+
store 'clothes_dryer_use', :field_name => 'DRYRUSE', :dictionary => { :input => 'Code', :output => 'Description', :url => 'http://github.com/brighterplanet/manually_curated_data/raw/master/dryruse/dryruse.csv' }
|
|
121
|
+
|
|
122
|
+
store 'census_division_number', :field_name => 'DIVISION'
|
|
123
|
+
store 'census_division_name', :field_name => 'DIVISION', :dictionary => { :input => 'number', :output => 'name', :url => 'http://data.brighterplanet.com/census_divisions.csv' }
|
|
124
|
+
store 'census_region_number', :field_name => 'DIVISION', :dictionary => { :input => 'number', :output => 'census_region_number', :url => 'http://data.brighterplanet.com/census_divisions.csv' }
|
|
125
|
+
store 'census_region_name', :field_name => 'DIVISION', :dictionary => { :input => 'number', :output => 'census_region_name', :url => 'http://data.brighterplanet.com/census_divisions.csv' }
|
|
126
|
+
|
|
127
|
+
store 'floorspace', :field_name => 'TOTSQFT', :units => :square_metres
|
|
128
|
+
store 'residents', :field_name => 'NHSLDMEM'
|
|
129
|
+
store 'refrigerator_count', :field_name => 'NUMFRIG'
|
|
130
|
+
store 'freezer_count', :field_name => 'NUMFREEZ'
|
|
131
|
+
store 'heating_degree_days', :field_name => 'HD65', :units => :degrees_fahrenheit_days # FIXME imperial
|
|
132
|
+
store 'cooling_degree_days', :field_name => 'CD65', :units => :degrees_fahrenheit_days # FIXME imperial
|
|
133
|
+
store 'annual_energy_from_fuel_oil_for_heating_space', :field_name => 'BTUFOSPH', :units => :joules
|
|
134
|
+
store 'annual_energy_from_fuel_oil_for_heating_water', :field_name => 'BTUFOWTH', :units => :joules
|
|
135
|
+
store 'annual_energy_from_fuel_oil_for_appliances', :field_name => 'BTUFOAPL', :units => :joules
|
|
136
|
+
store 'annual_energy_from_natural_gas_for_heating_space', :field_name => 'BTUNGSPH', :units => :joules
|
|
137
|
+
store 'annual_energy_from_natural_gas_for_heating_water', :field_name => 'BTUNGWTH', :units => :joules
|
|
138
|
+
store 'annual_energy_from_natural_gas_for_appliances', :field_name => 'BTUNGAPL', :units => :joules
|
|
139
|
+
store 'annual_energy_from_propane_for_heating_space', :field_name => 'BTULPSPH', :units => :joules
|
|
140
|
+
store 'annual_energy_from_propane_for_heating_water', :field_name => 'BTULPWTH', :units => :joules
|
|
141
|
+
store 'annual_energy_from_propane_for_appliances', :field_name => 'BTULPAPL', :units => :joules
|
|
142
|
+
store 'annual_energy_from_wood', :field_name => 'BTUWOOD', :units => :joules
|
|
143
|
+
store 'annual_energy_from_kerosene', :field_name => 'BTUKER', :units => :joules
|
|
144
|
+
store 'annual_energy_from_electricity_for_clothes_driers', :field_name => 'BTUELCDR', :units => :joules
|
|
145
|
+
store 'annual_energy_from_electricity_for_dishwashers', :field_name => 'BTUELDWH', :units => :joules
|
|
146
|
+
store 'annual_energy_from_electricity_for_freezers', :field_name => 'BTUELFZZ', :units => :joules
|
|
147
|
+
store 'annual_energy_from_electricity_for_refrigerators', :field_name => 'BTUELRFG', :units => :joules
|
|
148
|
+
store 'annual_energy_from_electricity_for_air_conditioners', :field_name => 'BTUELCOL', :units => :joules
|
|
149
|
+
store 'annual_energy_from_electricity_for_heating_space', :field_name => 'BTUELSPH', :units => :joules
|
|
150
|
+
store 'annual_energy_from_electricity_for_heating_water', :field_name => 'BTUELWTH', :units => :joules
|
|
151
|
+
store 'annual_energy_from_electricity_for_other_appliances', :field_name => 'BTUELAPL', :units => :joules
|
|
152
|
+
store 'weighting', :field_name => 'NWEIGHT'
|
|
153
|
+
store 'lighting_use', :static => nil, :units => :hours
|
|
154
|
+
store 'total_rooms', :field_name => 'TOTROOMS'
|
|
155
|
+
store 'full_bathrooms', :field_name => 'NCOMBATH'
|
|
156
|
+
store 'half_bathrooms', :field_name => 'NHAFBATH'
|
|
157
|
+
store 'bedrooms', :field_name => 'BEDROOMS'
|
|
158
|
+
store 'lights_on_1_to_4_hours', :field_name => 'LGT1'
|
|
159
|
+
store 'efficient_lights_on_1_to_4_hours', :field_name => 'LGT1EE'
|
|
160
|
+
store 'lights_on_4_to_12_hours', :field_name => 'LGT4'
|
|
161
|
+
store 'efficient_lights_on_4_to_12_hours', :field_name => 'LGT4EE'
|
|
162
|
+
store 'lights_on_over_12_hours', :field_name => 'LGT12'
|
|
163
|
+
store 'efficient_lights_on_over_12_hours', :field_name => 'LGT12EE'
|
|
164
|
+
store 'outdoor_all_night_lights', :field_name => 'NOUTLGTNT'
|
|
165
|
+
store 'outdoor_all_night_gas_lights', :field_name => 'NGASLIGHT'
|
|
166
|
+
# booleans where we treat anything other than true (for example legitimate skip or "occupied without paying rent") as false
|
|
167
|
+
store 'ownership', :synthesize => lambda { |row| row['KOWNRENT'] == '1' }
|
|
168
|
+
store 'thermostat_programmability', :synthesize => lambda { |row| row['PROTHERM'] == '1' }
|
|
169
|
+
store 'heated_garage', :synthesize => lambda { |row| row['GARGHEAT'] == '1' }
|
|
170
|
+
store 'attached_1car_garage', :synthesize => lambda { |row| row['GARAGE1C'] == '1' }
|
|
171
|
+
store 'detached_1car_garage', :synthesize => lambda { |row| row['DGARG1C'] == '1' }
|
|
172
|
+
store 'attached_2car_garage', :synthesize => lambda { |row| row['GARAGE2C'] == '1' }
|
|
173
|
+
store 'detached_2car_garage', :synthesize => lambda { |row| row['DGARG2C'] == '1' }
|
|
174
|
+
store 'attached_3car_garage', :synthesize => lambda { |row| row['GARAGE3C'] == '1' }
|
|
175
|
+
store 'detached_3car_garage', :synthesize => lambda { |row| row['DGARG3C'] == '1' }
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Rather than nullify the continuous variables that EIA identifies as LEGITIMATE SKIPS, we convert them to zero
|
|
179
|
+
# This makes it easier to derive useful information like "how many rooms does the house have?"
|
|
180
|
+
process "Zero out what the EIA calls LEGITIMATE SKIPS" do
|
|
181
|
+
%w{
|
|
182
|
+
annual_energy_from_electricity_for_air_conditioners
|
|
183
|
+
annual_energy_from_electricity_for_clothes_driers
|
|
184
|
+
annual_energy_from_electricity_for_dishwashers
|
|
185
|
+
annual_energy_from_electricity_for_freezers
|
|
186
|
+
annual_energy_from_electricity_for_heating_space
|
|
187
|
+
annual_energy_from_electricity_for_heating_water
|
|
188
|
+
annual_energy_from_electricity_for_other_appliances
|
|
189
|
+
annual_energy_from_electricity_for_refrigerators
|
|
190
|
+
annual_energy_from_fuel_oil_for_appliances
|
|
191
|
+
annual_energy_from_fuel_oil_for_heating_space
|
|
192
|
+
annual_energy_from_fuel_oil_for_heating_water
|
|
193
|
+
annual_energy_from_kerosene
|
|
194
|
+
annual_energy_from_propane_for_appliances
|
|
195
|
+
annual_energy_from_propane_for_heating_space
|
|
196
|
+
annual_energy_from_propane_for_heating_water
|
|
197
|
+
annual_energy_from_natural_gas_for_appliances
|
|
198
|
+
annual_energy_from_natural_gas_for_heating_space
|
|
199
|
+
annual_energy_from_natural_gas_for_heating_water
|
|
200
|
+
annual_energy_from_wood
|
|
201
|
+
lights_on_1_to_4_hours
|
|
202
|
+
lights_on_over_12_hours
|
|
203
|
+
efficient_lights_on_over_12_hours
|
|
204
|
+
efficient_lights_on_1_to_4_hours
|
|
205
|
+
lights_on_4_to_12_hours
|
|
206
|
+
efficient_lights_on_4_to_12_hours
|
|
207
|
+
outdoor_all_night_gas_lights
|
|
208
|
+
outdoor_all_night_lights
|
|
209
|
+
}.each do |attr_name|
|
|
210
|
+
max = maximum attr_name, :select => "CONVERT(#{attr_name}, UNSIGNED INTEGER)"
|
|
211
|
+
# if the maximum value of a row is all 999's, then it's a LEGITIMATE SKIP and we should set it to zero
|
|
212
|
+
if /^9+$/.match(max.to_i.to_s)
|
|
213
|
+
update_all "#{attr_name} = 0", "#{attr_name} = #{max}"
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
process "Convert units to metric" do
|
|
219
|
+
[
|
|
220
|
+
[ 'floorspace', :square_feet, :square_metres ],
|
|
221
|
+
[ 'annual_energy_from_fuel_oil_for_heating_space', :kbtus, :joules ],
|
|
222
|
+
[ 'annual_energy_from_fuel_oil_for_heating_water', :kbtus, :joules ],
|
|
223
|
+
[ 'annual_energy_from_fuel_oil_for_appliances', :kbtus, :joules ],
|
|
224
|
+
[ 'annual_energy_from_natural_gas_for_heating_space', :kbtus, :joules ],
|
|
225
|
+
[ 'annual_energy_from_natural_gas_for_heating_water', :kbtus, :joules ],
|
|
226
|
+
[ 'annual_energy_from_natural_gas_for_appliances', :kbtus, :joules ],
|
|
227
|
+
[ 'annual_energy_from_propane_for_heating_space', :kbtus, :joules ],
|
|
228
|
+
[ 'annual_energy_from_propane_for_heating_water', :kbtus, :joules ],
|
|
229
|
+
[ 'annual_energy_from_propane_for_appliances', :kbtus, :joules ],
|
|
230
|
+
[ 'annual_energy_from_wood', :kbtus, :joules ],
|
|
231
|
+
[ 'annual_energy_from_kerosene', :kbtus, :joules ],
|
|
232
|
+
[ 'annual_energy_from_electricity_for_clothes_driers', :kbtus, :joules ],
|
|
233
|
+
[ 'annual_energy_from_electricity_for_dishwashers', :kbtus, :joules ],
|
|
234
|
+
[ 'annual_energy_from_electricity_for_freezers', :kbtus, :joules ],
|
|
235
|
+
[ 'annual_energy_from_electricity_for_refrigerators', :kbtus, :joules ],
|
|
236
|
+
[ 'annual_energy_from_electricity_for_air_conditioners', :kbtus, :joules ],
|
|
237
|
+
[ 'annual_energy_from_electricity_for_heating_space', :kbtus, :joules ],
|
|
238
|
+
[ 'annual_energy_from_electricity_for_heating_water', :kbtus, :joules ],
|
|
239
|
+
[ 'annual_energy_from_electricity_for_other_appliances', :kbtus, :joules ],
|
|
240
|
+
].each do |attr_name, from_units, to_units|
|
|
241
|
+
update_all "#{attr_name} = #{attr_name} * #{Conversions::Unit.exchange_rate from_units, to_units}"
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
process 'Add a new field "rooms" that estimates how many rooms are in the house' do
|
|
246
|
+
update_all 'rooms = total_rooms + full_bathrooms/2 + half_bathrooms/4 + heated_garage*(attached_1car_garage + detached_1car_garage + 2*(attached_2car_garage + detached_2car_garage) + 3*(attached_3car_garage + detached_3car_garage))'
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
process 'Add a new field "bathrooms" that synthesizes half and full bathrooms into one number' do
|
|
250
|
+
update_all 'bathrooms = full_bathrooms + 0.5 * half_bathrooms'
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
process 'Add a new field "lighting_use" that estimates how many hours light bulbs are turned on in the house' do
|
|
254
|
+
update_all 'lighting_use = 2*(lights_on_1_to_4_hours + efficient_lights_on_1_to_4_hours) + 8*(lights_on_4_to_12_hours + efficient_lights_on_4_to_12_hours) + 16*(lights_on_over_12_hours + efficient_lights_on_over_12_hours) + 12*(outdoor_all_night_lights + outdoor_all_night_gas_lights)'
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
process 'Add a new field "lighting_efficiency" that estimates what percentage of light bulbs in a house are energy-efficient' do
|
|
258
|
+
update_all 'lighting_efficiency = (2*efficient_lights_on_1_to_4_hours + 8*efficient_lights_on_4_to_12_hours + 16*efficient_lights_on_over_12_hours) / lighting_use'
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# FIXME add precalc bathrooms per https://github.com/brighterplanet/cm1/commit/77df97c50311f3c59aad891f018bf3d487afeb98
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|