earth 0.11.2 → 0.11.3

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 CHANGED
@@ -5,7 +5,7 @@ require "earth/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "earth"
7
7
  s.version = Earth::VERSION
8
- s.date = "2011-12-06"
8
+ s.date = "2011-12-16"
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.authors = ["Seamus Abshere", "Derek Kastner", "Andy Rossmeissl"]
11
11
  s.email = %q{andy@rossmeissl.net}
data/lib/earth/eia.rb ADDED
@@ -0,0 +1,24 @@
1
+ module Earth
2
+ module EIA
3
+ extend self
4
+
5
+ def normalize(model, fields)
6
+ model.all.each do |record|
7
+ fields.each do |field|
8
+ value = record.send field
9
+ normalized_value = if value == 'Q'
10
+ 0
11
+ elsif value == 'W'
12
+ 0
13
+ elsif value == '*'
14
+ 0
15
+ else
16
+ value
17
+ end
18
+ record.send "#{field}=", normalized_value
19
+ end
20
+ record.save
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,3 +1,4 @@
1
1
  require 'earth/hospitality/census_region_lodging_class'
2
+ require 'earth/hospitality/commercial_building_energy_consumption_survey_response'
2
3
  require 'earth/hospitality/country_lodging_class'
3
4
  require 'earth/hospitality/lodging_class'
@@ -0,0 +1,39 @@
1
+ class CommercialBuildingEnergyConsumptionSurveyResponse < ActiveRecord::Base
2
+ set_primary_key :id
3
+ set_table_name :cbecs_responses
4
+
5
+ extend CohortScope
6
+ self.minimum_cohort_size = 8 # CBECS doesn't report averages based on fewer than 20 samples
7
+
8
+ col :id, :type => :integer
9
+ col :census_region_number, :type => :integer
10
+ col :census_division_number, :type => :integer
11
+ col :heating_degree_days, :type => :integer
12
+ col :cooling_degree_days, :type => :integer
13
+ col :construction_year, :type => :integer
14
+ col :area, :type => :float
15
+ col :area_units
16
+ col :floors, :type => :integer
17
+ col :lodging_rooms, :type => :integer
18
+ col :principal_activity
19
+ col :detailed_activity
20
+ col :first_activity
21
+ col :second_activity
22
+ col :third_activity
23
+ col :first_activity_share, :type => :float
24
+ col :second_activity_share, :type => :float
25
+ col :third_activity_share, :type => :float
26
+ col :months_used, :type => :integer
27
+ col :weekly_hours, :type => :integer
28
+ col :electricity_use, :type => :float
29
+ col :electricity_use_units
30
+ col :natural_gas_use, :type => :float
31
+ col :natural_gas_use_units
32
+ col :fuel_oil_use, :type => :float
33
+ col :fuel_oil_use_units
34
+ col :district_heat_use, :type => :float
35
+ col :district_heat_use_units
36
+ col :stratum, :type => :integer
37
+ col :pair, :type => :integer
38
+ col :weighting, :type => :float
39
+ end
@@ -0,0 +1,56 @@
1
+ CommercialBuildingEnergyConsumptionSurveyResponse.class_eval do
2
+ data_miner do
3
+ import 'building characteristics from the 2003 EIA Commercial Building Energy Consumption Survey',
4
+ :url => 'http://www.eia.gov/emeu/cbecs/cbecs2003/public_use_2003/data/FILE01.csv',
5
+ :skip => 1,
6
+ :headers => ["PUBID8", "REGION8", "CENDIV8", "SQFT8", "SQFTC8", "YRCONC8", "PBA8", "ELUSED8", "NGUSED8", "FKUSED8", "PRUSED8", "STUSED8", "HWUSED8", "CLIMATE8", "FREESTN8", "WLCNS8", "RFCNS8", "GLSSPC8", "EQGLSS8", "SUNGLS8", "BLDSHP8", "NFLOOR8", "ELEVTR8", "NELVTR8", "ESCLTR8", "NESLTR8", "YRCON8", "MONCON8", "RENOV8", "RENADD8", "RENRDC8", "RENCOS8", "RENEXT8", "RENINT8", "RENHVC8", "RENLGT8", "RENWIN8", "RENPLB8", "RENINS8", "RENOTH8", "GOVOWN8", "GOVTYP8", "OWNER8", "OWNOCC8", "NOCC8", "NOCCAT8", "MONUSE8", "PORVAC8", "OPEN248", "OPNMF8", "OPNWE8", "WKHRS8", "WKHRSC8", "NWKER8", "NWKERC8", "HT18", "HT28", "COOL8", "WATR8", "COOK8", "MANU8", "GENR8", "ADJWT8", "STRATUM8", "PAIR8"] do
7
+ key 'id', :field_name => 'PUBID8'
8
+ store 'census_region_number', :field_name => 'REGION8'
9
+ store 'census_division_number', :field_name => 'CENDIV8'
10
+ store 'area', :field_name => 'SQFT8', :from_units => :square_feet, :to_units => :square_metres
11
+ store 'principal_activity', :field_name => 'PBA8', :dictionary => { :input => 'principal_activity_code', :output => 'principal_activity', :url => 'https://docs.google.com/spreadsheet/pub?key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=2&output=csv' }
12
+ store 'floors', :field_name => 'NFLOOR8', :dictionary => { :input => 'floors_code', :output => 'floors', :url => 'https://docs.google.com/spreadsheet/pub?key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=0&output=csv' }
13
+ store 'construction_year', :field_name => 'YRCON8'
14
+ store 'months_used', :field_name => 'MONUSE8'
15
+ store 'weekly_hours', :field_name => 'WKHRS8'
16
+ store 'stratum', :field_name => 'STRATUM8'
17
+ store 'pair', :field_name => 'PAIR8'
18
+ store 'weighting', :field_name => 'ADJWT8'
19
+ end
20
+
21
+ import 'building characteristics from the 2003 EIA Commercial Building Energy Consumption Survey',
22
+ :url => 'http://www.eia.gov/emeu/cbecs/cbecs2003/public_use_2003/data/FILE02.csv',
23
+ :skip => 1,
24
+ :headers => ["PUBID8","REGION8","CENDIV8","SQFT8","SQFTC8","YRCONC8","PBA8","ELUSED8","NGUSED8","FKUSED8","PRUSED8","STUSED8","HWUSED8","ONEACT8","ACT18","ACT28","ACT38","ACT1PCT8","ACT2PCT8","ACT3PCT8","PBAPLUS8","VACANT8","RWSEAT8","PBSEAT8","EDSEAT8","FDSEAT8","HCBED8","NRSBED8","LODGRM8","FACIL8","FEDFAC8","FACACT8","MANIND8","PLANT8","FACDST8","FACDHW8","FACDCW8","FACELC8","BLDPLT8","ADJWT8","STRATUM8","PAIR8"] do
25
+ key 'id', :field_name => 'PUBID8'
26
+ store 'detailed_activity', :field_name => 'PBAPLUS8', :dictionary => { :input => 'detailed_activity_code', :output => 'detailed_activity', :url => 'https://docs.google.com/spreadsheet/pub?&key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=3&output=csv' }
27
+ store 'first_activity', :field_name => 'ACT18', :dictionary => { :input => 'activity_code', :output => 'activity', :url => 'https://docs.google.com/spreadsheet/pub?&key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=4&output=csv' }
28
+ store 'second_activity', :field_name => 'ACT28', :dictionary => { :input => 'activity_code', :output => 'activity', :url => 'https://docs.google.com/spreadsheet/pub?&key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=4&output=csv' }
29
+ store 'third_activity', :field_name => 'ACT38', :dictionary => { :input => 'activity_code', :output => 'activity', :url => 'https://docs.google.com/spreadsheet/pub?&key=0AoQJbWqPrREqdHRGVHczYXRoU2dFLV90aDdET0dQLUE&single=true&gid=4&output=csv' }
30
+ store 'first_activity_share', :synthesize => lambda { |row| row['ACT1PCT8'].blank? ? nil : row['ACT1PCT8'].to_f / 100.0 }
31
+ store 'second_activity_share', :synthesize => lambda { |row| row['ACT2PCT8'].blank? ? nil : row['ACT2PCT8'].to_f / 100.0 }
32
+ store 'third_activity_share', :synthesize => lambda { |row| row['ACT3PCT8'].blank? ? nil : row['ACT3PCT8'].to_f / 100.0 }
33
+ store 'lodging_rooms', :field_name => 'LODGRM8'
34
+ end
35
+
36
+ import 'electricity use from the 2003 EIA Commercial Building Energy Consumption Survey',
37
+ :url => 'http://www.eia.gov/emeu/cbecs/cbecs2003/public_use_2003/data/FILE15.csv',
38
+ :skip => 1,
39
+ :headers => ["PUBID8", "REGION8", "CENDIV8", "SQFT8", "SQFTC8", "YRCONC8", "PBA8", "ELUSED8", "NGUSED8", "FKUSED8", "PRUSED8", "STUSED8", "HWUSED8", "ADJWT8", "STRATUM8", "PAIR8", "HDD658", "CDD658", "MFUSED8", "MFBTU8", "MFEXP8", "ELCNS8", "ELBTU8", "ELEXP8", "ZELCNS8", "ZELEXP8"] do
40
+ key 'id', :field_name => 'PUBID8'
41
+ store 'heating_degree_days', :field_name => 'HDD658'
42
+ store 'cooling_degree_days', :field_name => 'CDD658'
43
+ store 'electricity_use', :field_name => 'ELCNS8', :units => :kilowatt_hours
44
+ end
45
+
46
+ import 'fuel use characteristics from the 2003 EIA Commercial Building Energy Consumption Survey',
47
+ :url => 'http://www.eia.gov/emeu/cbecs/cbecs2003/public_use_2003/data/FILE16.csv',
48
+ :skip => 1,
49
+ :headers => ["PUBID8", "REGION8", "CENDIV8", "SQFT8", "SQFTC8", "YRCONC8", "PBA8", "ELUSED8", "NGUSED8", "FKUSED8", "PRUSED8", "STUSED8", "HWUSED8", "ADJWT8", "STRATUM8", "PAIR8", "NGCNS8", "NGBTU8", "NGEXP8", "ZNGCNS8", "ZNGEXP8", "FKCNS8", "FKBTU8", "FKEXP8", "ZFKCNS8", "ZFKEXP8", "DHUSED8", "DHHT18", "DHHT28", "DHCOOL8", "DHWATR8", "DHCOOK8", "DHMANU8", "DHOTH8", "DHCNS8", "DHBTU8", "DHEXP8", "ZDHCNS8", "ZDHEXP8"] do
50
+ key 'id', :field_name => 'PUBID8'
51
+ store 'natural_gas_use', :field_name => 'NGBTU8', :units => :kbtus
52
+ store 'fuel_oil_use', :field_name => 'FKBTU8', :units => :kbtus
53
+ store 'district_heat_use', :field_name => 'DHBTU8', :units => :kbtus
54
+ end
55
+ end
56
+ end
@@ -1,3 +1,4 @@
1
1
  require 'earth/hospitality/census_region_lodging_class/data_miner'
2
+ require 'earth/hospitality/commercial_building_energy_consumption_survey_response/data_miner'
2
3
  require 'earth/hospitality/country_lodging_class/data_miner'
3
4
  require 'earth/hospitality/lodging_class/data_miner'
@@ -1,7 +1,10 @@
1
+ require 'earth/industry/cbecs_energy_intensity'
1
2
  require 'earth/industry/industry_product_line'
2
3
  require 'earth/industry/industry_sector'
3
4
  require 'earth/industry/industry'
4
5
  require 'earth/industry/industry_product'
6
+ require 'earth/industry/mecs_energy'
7
+ require 'earth/industry/mecs_ratio'
5
8
  require 'earth/industry/merchant'
6
9
  require 'earth/industry/merchant_category_industry'
7
10
  require 'earth/industry/merchant_category'
@@ -0,0 +1,55 @@
1
+ class CbecsEnergyIntensity < ActiveRecord::Base
2
+ col :naics_code, :type => :string
3
+ col :census_division_number, :type => :integer
4
+ col :total_electricity_consumption, :type => :float
5
+ col :total_floorspace, :type => :float
6
+ col :electricity_intensity, :type => :float
7
+
8
+ CENSUS_DIVISIONS = {
9
+ 'New England Division' => {
10
+ :column => 0,
11
+ :code => 1,
12
+ :table => 'c17'
13
+ },
14
+ 'Middle Atlantic Division' => {
15
+ :column => 1,
16
+ :code => 2,
17
+ :table => 'c17'
18
+ },
19
+ 'East North Central Division' => {
20
+ :column => 2,
21
+ :code => 3,
22
+ :table => 'c17'
23
+ },
24
+ 'West North Central Division' => {
25
+ :column => 0,
26
+ :code => 4,
27
+ :table => 'c18'
28
+ },
29
+ 'South Atlantic Division' => {
30
+ :column => 1,
31
+ :code => 5,
32
+ :table => 'c18'
33
+ },
34
+ 'East South Central Division' => {
35
+ :column => 2,
36
+ :code => 6,
37
+ :table => 'c18'
38
+ },
39
+ 'West South Central Division' => {
40
+ :column => 0,
41
+ :code => 7,
42
+ :table => 'c19'
43
+ },
44
+ 'Mountain Division' => {
45
+ :column => 1,
46
+ :code => 8,
47
+ :table => 'c19'
48
+ },
49
+ 'Pacific Division' => {
50
+ :column => 2,
51
+ :code => 9,
52
+ :table => 'c19'
53
+ }
54
+ }
55
+ end
@@ -0,0 +1,54 @@
1
+ CbecsEnergyIntensity.class_eval do
2
+ data_miner do
3
+ CENSUS_DIVISIONS.each do |division, data|
4
+ import "2003 CBECS #{data[:table].capitalize} - Electricity Consumption and Intensity - #{division}",
5
+ :url => "http://www.eia.gov/emeu/cbecs/cbecs2003/detailed_tables_2003/2003set10/2003excel/#{data[:table]}.xls"
6
+ :crop => (21..36)) do
7
+ key :name, :synthesize => Proc.new { |row| "#{Industry.format_naics_code(row[0])}-#{data[:code]}" }
8
+ store :naics_code, :synthesize => Proc.new do |row|
9
+ case row[0].gsub(/\./, '')
10
+ when 'Education' then
11
+ 611110
12
+ when 'Food Sales' then
13
+ 445
14
+ when 'Food Service' then
15
+ 722
16
+ when 'Health Care' then
17
+ 622110
18
+ when 'Inpatient' then
19
+ 622110
20
+ when 'Outpatient' then
21
+ 622111
22
+ when 'Lodging' then
23
+ 721
24
+ when 'Retail (Other Than Mall)' then
25
+ 44
26
+ when 'Office' then
27
+ #TODO
28
+ when 'Public Assembly' then
29
+ #TODO
30
+ when 'Public Order and Safety' then
31
+ 922120
32
+ when 'Religious Worship' then
33
+ 813110
34
+ when 'Service' then
35
+ #TODO
36
+ when 'Warehouse and Storage' then
37
+ 493110
38
+ when 'Other' then
39
+ #TODO
40
+ when 'Vacant' then
41
+ #TODO
42
+ end
43
+ end
44
+ store :census_division_number, :static => data[:code]
45
+ store :total_electricity_consumption, :field_number => data[:column] + 1
46
+ store :total_floorspace, :field_number => data[:column] + 4
47
+ store :electricity_intensity, :field_number => data[:column] + 7
48
+ end
49
+ end
50
+
51
+ process :normalize_fuels do
52
+ EIA.normalize(CbecsEnergyIntensity, [:total_electricity_consumption, :total_floorspace, :electricity_intensity])
53
+ end
54
+ end
@@ -1 +1,4 @@
1
+ require 'earth/industry/cbecs_energy_intensity/data_miner'
1
2
  require 'earth/industry/industry/data_miner'
3
+ require 'earth/industry/mecs_energy/data_miner'
4
+ require 'earth/industry/mecs_ratio/data_miner'
@@ -12,8 +12,14 @@ class Industry < ActiveRecord::Base
12
12
  col :naics_code
13
13
  col :description
14
14
 
15
+ class << self
16
+ def format_naics_code(input)
17
+ "%d" % input.to_i
18
+ end
19
+ end
20
+
15
21
  def trade_industry?
16
22
  prefix = naics_code.to_s[0,2]
17
23
  %w{42 44 45}.include?(prefix)
18
24
  end
19
- end
25
+ end
@@ -0,0 +1,60 @@
1
+ require 'earth/industry/industry'
2
+
3
+ class MecsEnergy < ActiveRecord::Base
4
+ col :name
5
+ col :census_region
6
+ col :naics_code
7
+ col :total, :type => :float
8
+ col :net_electricity, :type => :float
9
+ col :residual_fuel_oil, :type => :float
10
+ col :distillate_fuel_oil, :type => :float
11
+ col :natural_gas, :type => :float
12
+ col :lpg_and_ngl, :type => :float
13
+ col :coal, :type => :float
14
+ col :coke_and_breeze, :type => :float
15
+ col :other, :type => :float
16
+
17
+ CENSUS_REGIONS = {
18
+ 'Total US' => {
19
+ :crop => (13..81),
20
+ :code => nil
21
+ },
22
+ 'Northeast' => {
23
+ :crop => (88..156),
24
+ :code => 1
25
+ },
26
+ 'Midwest' => {
27
+ :crop => (163..231),
28
+ :code => 2
29
+ },
30
+ 'South' => {
31
+ :crop => (238..306),
32
+ :code => 3
33
+ },
34
+ 'West' => {
35
+ :crop => (313..382),
36
+ :code => 4
37
+ }
38
+ }
39
+
40
+ FUELS = [:net_electricity, :residual_fuel_oil, :distillate_fuel_oil,
41
+ :natural_gas, :lpg_and_ngl, :coal, :coke_and_breeze, :other]
42
+
43
+ def self.find_by_naics_code_and_census_region(code, census_region)
44
+ if code.blank?
45
+ record = nil
46
+ else
47
+ code = Industry.format_naics_code code
48
+ record = where('census_region = ? AND naics_code LIKE ?', census_region, "#{code}%").first
49
+ record ||= find_by_naics_code_and_census_region(code[0..-2], census_region)
50
+ end
51
+ record
52
+ end
53
+
54
+ def fuel_ratios
55
+ FUELS.inject({}) do |ratios, fuel|
56
+ ratios[fuel] = send(fuel).to_f / total.to_f
57
+ ratios
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,28 @@
1
+ require 'earth/eia'
2
+
3
+ MecsEnergy.class_eval do
4
+ data_miner do
5
+ CENSUS_REGIONS.each do |region, data|
6
+ import("MECS table 3.2 #{region}",
7
+ :url => "http://205.254.135.24/emeu/mecs/mecs2006/excel/Table3_2.xls",
8
+ :crop => data[:crop]) do
9
+ key 'name', :synthesize => Proc.new { |row| "#{Industry.format_naics_code(row[0])}-#{data[:code]}" }
10
+ store 'naics_code', :field_number => 0
11
+ store :total, :field_number => 2
12
+ store :net_electricity, :field_number => 3
13
+ store :residual_fuel_oil, :field_number => 4
14
+ store :distillate_fuel_oil, :field_number => 5
15
+ store :natural_gas, :field_number => 6
16
+ store :lpg_and_ngl, :field_number => 7
17
+ store :coal, :field_number => 8
18
+ store :coke_and_breeze, :field_number => 9
19
+ store :other, :field_number => 10
20
+ store 'census_region', :static => data[:code]
21
+ end
22
+ end
23
+
24
+ process :normalize_fuels do
25
+ Earth::EIA.normalize(MecsEnergy, FUELS)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,42 @@
1
+ class MecsRatio < ActiveRecord::Base
2
+ belongs_to :industry
3
+
4
+ col :name
5
+ col :census_region
6
+ col :naics_code
7
+ col :consumption_per_dollar_of_shipments, :type => :float
8
+
9
+ CENSUS_REGIONS = {
10
+ 'Total US' => {
11
+ :crop => (16..94),
12
+ :code => nil
13
+ },
14
+ 'Northeast' => {
15
+ :crop => (100..178),
16
+ :code => 1
17
+ },
18
+ 'Midwest' => {
19
+ :crop => (184..262),
20
+ :code => 2
21
+ },
22
+ 'South' => {
23
+ :crop => (268..346),
24
+ :code => 3
25
+ },
26
+ 'West' => {
27
+ :crop => (352..430),
28
+ :code => 4
29
+ }
30
+ }
31
+
32
+ def self.find_by_naics_code_and_census_region(code, census_region)
33
+ if code.blank?
34
+ record = nil
35
+ else
36
+ code = Industry.format_naics_code code
37
+ record = where('census_region = ? AND naics_code LIKE ?', census_region, "#{code}%").first
38
+ record ||= find_by_naics_code_and_census_region(code[0..-2], census_region)
39
+ end
40
+ record
41
+ end
42
+ end
@@ -0,0 +1,20 @@
1
+ require 'earth/eia'
2
+
3
+ MecsRatio.class_eval do
4
+ data_miner do
5
+ CENSUS_REGIONS.each do |region, data|
6
+ import( "MECS table 6.1 #{region}",
7
+ :url => "http://205.254.135.24/emeu/mecs/mecs2006/excel/Table6_1.xls",
8
+ :crop => data[:crop]) do
9
+ key 'name', :synthesize => Proc.new { |row| "#{Industry.format_naics_code(row[0])}-#{data[:code]}" }
10
+ store 'naics_code', :synthesize => Proc.new { |row| Industry.format_naics_code row[0] }
11
+ store 'consumption_per_dollar_of_shipments', :field_number => 4
12
+ store 'census_region', :static => data[:code]
13
+ end
14
+ end
15
+
16
+ process :normalize_fuels do
17
+ Earth::EIA.normalize(MecsRatio, [:consumption_per_dollar_of_shipments])
18
+ end
19
+ end
20
+ end
data/lib/earth/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Earth
2
- VERSION = "0.11.2"
2
+ VERSION = "0.11.3"
3
3
  end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+ require 'earth/industry/mecs_energy'
3
+
4
+ describe MecsEnergy do
5
+ before(:all) do
6
+ MecsEnergy.auto_upgrade!
7
+ MecsEnergy.run_data_miner!
8
+ end
9
+
10
+ describe '.find_by_naics_code_and_census_region' do
11
+ before do
12
+ MecsEnergy.create! :naics_code => '312', :census_region => '1'
13
+ MecsEnergy.create! :naics_code => '3121', :census_region => '1'
14
+ MecsEnergy.create! :naics_code => '3122', :census_region => '1'
15
+ MecsEnergy.create! :naics_code => '312', :census_region => '2'
16
+ MecsEnergy.create! :naics_code => '3121', :census_region => '2'
17
+ MecsEnergy.create! :naics_code => '3122', :census_region => '2'
18
+ MecsEnergy.create! :naics_code => '312211', :census_region => '2'
19
+ end
20
+ it 'finds an exact match' do
21
+ MecsEnergy.find_by_naics_code_and_census_region('312211', '2').
22
+ naics_code.should == '312211'
23
+ end
24
+ it 'finds a parent category by prefix' do
25
+ MecsEnergy.find_by_naics_code_and_census_region('312199', '2').
26
+ naics_code.should == '3121'
27
+ end
28
+ it 'returns nil if no match found' do
29
+ MecsEnergy.find_by_naics_code_and_census_region('543211', '2').
30
+ should be_nil
31
+ end
32
+ end
33
+
34
+ describe '#fuel_ratios' do
35
+ it 'returns a list of fuel ratios for a given NAICS' do
36
+ energy = MecsEnergy.new :total => 100, :net_electricity => 20,
37
+ :residual_fuel_oil => 1, :distillate_fuel_oil => 2,
38
+ :natural_gas => 30, :lpg_and_ngl => 22, :coal => 22,
39
+ :coke_and_breeze => 1, :other => 1
40
+ energy.fuel_ratios.should == {
41
+ :net_electricity => 0.20,
42
+ :residual_fuel_oil => 0.01, :distillate_fuel_oil => 0.02,
43
+ :natural_gas => 0.3, :lpg_and_ngl => 0.22, :coal => 0.22,
44
+ :coke_and_breeze => 0.01, :other => 0.01
45
+ }
46
+ end
47
+ end
48
+
49
+ describe '.normalize_fuels' do
50
+ it 'transforms Q (witheld due to stddev error) into 0' do
51
+ MecsEnergy.all.each do |energy|
52
+ MecsEnergy::FUELS.each do |fuel|
53
+ %w{W Q *}.should_not include(energy.send(fuel))
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+ require 'earth/industry/mecs_ratio'
3
+
4
+ describe MecsRatio do
5
+ before :all do
6
+ MecsRatio.auto_upgrade!
7
+ end
8
+
9
+ describe '.find_by_naics_code_and_census_region' do
10
+ before do
11
+ MecsRatio.create! :naics_code => '312', :census_region => '1', :consumption_per_dollar_of_shipments => 11
12
+ MecsRatio.create! :naics_code => '3121', :census_region => '1', :consumption_per_dollar_of_shipments => 12
13
+ MecsRatio.create! :naics_code => '3122', :census_region => '1', :consumption_per_dollar_of_shipments => 13
14
+ MecsRatio.create! :naics_code => '312', :census_region => '2', :consumption_per_dollar_of_shipments => 17
15
+ MecsRatio.create! :naics_code => '3121', :census_region => '2', :consumption_per_dollar_of_shipments => 18
16
+ MecsRatio.create! :naics_code => '3122', :census_region => '2', :consumption_per_dollar_of_shipments => 19
17
+ MecsRatio.create! :naics_code => '312211', :census_region => '2', :consumption_per_dollar_of_shipments => 20
18
+ end
19
+ it 'finds an exact match' do
20
+ MecsRatio.find_by_naics_code_and_census_region('312211', '2').
21
+ naics_code.should == '312211'
22
+ end
23
+ it 'finds a parent category by prefix' do
24
+ MecsRatio.find_by_naics_code_and_census_region('312199', '2').
25
+ naics_code.should == '3121'
26
+ end
27
+ it 'returns nil if no match found' do
28
+ MecsRatio.find_by_naics_code_and_census_region('543211', '2').
29
+ should be_nil
30
+ end
31
+ end
32
+ end
33
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: earth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.2
4
+ version: 0.11.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-12-06 00:00:00.000000000Z
14
+ date: 2011-12-16 00:00:00.000000000Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: data_miner
18
- requirement: &2153077720 !ruby/object:Gem::Requirement
18
+ requirement: &2154813320 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ! '>='
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '1.3'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *2153077720
26
+ version_requirements: *2154813320
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: to_regexp
29
- requirement: &2153076620 !ruby/object:Gem::Requirement
29
+ requirement: &2154812900 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '0'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *2153076620
37
+ version_requirements: *2154812900
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: cohort_scope
40
- requirement: &2153075500 !ruby/object:Gem::Requirement
40
+ requirement: &2154812420 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ! '>='
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: '0'
46
46
  type: :runtime
47
47
  prerelease: false
48
- version_requirements: *2153075500
48
+ version_requirements: *2154812420
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: table_warnings
51
- requirement: &2153072520 !ruby/object:Gem::Requirement
51
+ requirement: &2154811720 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ! '>='
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: 0.0.6
57
57
  type: :runtime
58
58
  prerelease: false
59
- version_requirements: *2153072520
59
+ version_requirements: *2154811720
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: remote_table
62
- requirement: &2153071380 !ruby/object:Gem::Requirement
62
+ requirement: &2154800400 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ! '>='
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: 1.2.3
68
68
  type: :runtime
69
69
  prerelease: false
70
- version_requirements: *2153071380
70
+ version_requirements: *2154800400
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: falls_back_on
73
- requirement: &2153069960 !ruby/object:Gem::Requirement
73
+ requirement: &2154799440 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -78,10 +78,10 @@ dependencies:
78
78
  version: '0'
79
79
  type: :runtime
80
80
  prerelease: false
81
- version_requirements: *2153069960
81
+ version_requirements: *2154799440
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: fixed_width-multibyte
84
- requirement: &2153067300 !ruby/object:Gem::Requirement
84
+ requirement: &2154798640 !ruby/object:Gem::Requirement
85
85
  none: false
86
86
  requirements:
87
87
  - - ! '>='
@@ -89,10 +89,10 @@ dependencies:
89
89
  version: '0'
90
90
  type: :runtime
91
91
  prerelease: false
92
- version_requirements: *2153067300
92
+ version_requirements: *2154798640
93
93
  - !ruby/object:Gem::Dependency
94
94
  name: geokit-rails
95
- requirement: &2153060740 !ruby/object:Gem::Requirement
95
+ requirement: &2154797720 !ruby/object:Gem::Requirement
96
96
  none: false
97
97
  requirements:
98
98
  - - ! '>='
@@ -100,10 +100,10 @@ dependencies:
100
100
  version: '0'
101
101
  type: :runtime
102
102
  prerelease: false
103
- version_requirements: *2153060740
103
+ version_requirements: *2154797720
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: loose_tight_dictionary
106
- requirement: &2153056680 !ruby/object:Gem::Requirement
106
+ requirement: &2154795920 !ruby/object:Gem::Requirement
107
107
  none: false
108
108
  requirements:
109
109
  - - ! '>='
@@ -111,10 +111,10 @@ dependencies:
111
111
  version: 0.2.3
112
112
  type: :runtime
113
113
  prerelease: false
114
- version_requirements: *2153056680
114
+ version_requirements: *2154795920
115
115
  - !ruby/object:Gem::Dependency
116
116
  name: weighted_average
117
- requirement: &2153050720 !ruby/object:Gem::Requirement
117
+ requirement: &2154793780 !ruby/object:Gem::Requirement
118
118
  none: false
119
119
  requirements:
120
120
  - - ! '>='
@@ -122,10 +122,10 @@ dependencies:
122
122
  version: 1.0.2
123
123
  type: :runtime
124
124
  prerelease: false
125
- version_requirements: *2153050720
125
+ version_requirements: *2154793780
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: mini_record-compat
128
- requirement: &2153032660 !ruby/object:Gem::Requirement
128
+ requirement: &2154792680 !ruby/object:Gem::Requirement
129
129
  none: false
130
130
  requirements:
131
131
  - - ! '>='
@@ -133,10 +133,10 @@ dependencies:
133
133
  version: '0'
134
134
  type: :runtime
135
135
  prerelease: false
136
- version_requirements: *2153032660
136
+ version_requirements: *2154792680
137
137
  - !ruby/object:Gem::Dependency
138
138
  name: activesupport
139
- requirement: &2153024960 !ruby/object:Gem::Requirement
139
+ requirement: &2154790860 !ruby/object:Gem::Requirement
140
140
  none: false
141
141
  requirements:
142
142
  - - ! '>='
@@ -144,10 +144,10 @@ dependencies:
144
144
  version: '0'
145
145
  type: :runtime
146
146
  prerelease: false
147
- version_requirements: *2153024960
147
+ version_requirements: *2154790860
148
148
  - !ruby/object:Gem::Dependency
149
149
  name: activerecord
150
- requirement: &2153023060 !ruby/object:Gem::Requirement
150
+ requirement: &2154789920 !ruby/object:Gem::Requirement
151
151
  none: false
152
152
  requirements:
153
153
  - - ! '>='
@@ -155,10 +155,10 @@ dependencies:
155
155
  version: '0'
156
156
  type: :runtime
157
157
  prerelease: false
158
- version_requirements: *2153023060
158
+ version_requirements: *2154789920
159
159
  - !ruby/object:Gem::Dependency
160
160
  name: bundler
161
- requirement: &2153020000 !ruby/object:Gem::Requirement
161
+ requirement: &2154789280 !ruby/object:Gem::Requirement
162
162
  none: false
163
163
  requirements:
164
164
  - - ! '>='
@@ -166,10 +166,10 @@ dependencies:
166
166
  version: '0'
167
167
  type: :development
168
168
  prerelease: false
169
- version_requirements: *2153020000
169
+ version_requirements: *2154789280
170
170
  - !ruby/object:Gem::Dependency
171
171
  name: bueller
172
- requirement: &2153011220 !ruby/object:Gem::Requirement
172
+ requirement: &2154788780 !ruby/object:Gem::Requirement
173
173
  none: false
174
174
  requirements:
175
175
  - - ! '>='
@@ -177,10 +177,10 @@ dependencies:
177
177
  version: '0'
178
178
  type: :development
179
179
  prerelease: false
180
- version_requirements: *2153011220
180
+ version_requirements: *2154788780
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: cucumber
183
- requirement: &2152992880 !ruby/object:Gem::Requirement
183
+ requirement: &2154788100 !ruby/object:Gem::Requirement
184
184
  none: false
185
185
  requirements:
186
186
  - - ! '>='
@@ -188,10 +188,10 @@ dependencies:
188
188
  version: '0'
189
189
  type: :development
190
190
  prerelease: false
191
- version_requirements: *2152992880
191
+ version_requirements: *2154788100
192
192
  - !ruby/object:Gem::Dependency
193
193
  name: rake
194
- requirement: &2152988340 !ruby/object:Gem::Requirement
194
+ requirement: &2154787440 !ruby/object:Gem::Requirement
195
195
  none: false
196
196
  requirements:
197
197
  - - ! '>='
@@ -199,10 +199,10 @@ dependencies:
199
199
  version: '0'
200
200
  type: :development
201
201
  prerelease: false
202
- version_requirements: *2152988340
202
+ version_requirements: *2154787440
203
203
  - !ruby/object:Gem::Dependency
204
204
  name: rdoc
205
- requirement: &2152982840 !ruby/object:Gem::Requirement
205
+ requirement: &2154786780 !ruby/object:Gem::Requirement
206
206
  none: false
207
207
  requirements:
208
208
  - - ! '>='
@@ -210,10 +210,10 @@ dependencies:
210
210
  version: '0'
211
211
  type: :development
212
212
  prerelease: false
213
- version_requirements: *2152982840
213
+ version_requirements: *2154786780
214
214
  - !ruby/object:Gem::Dependency
215
215
  name: rspec
216
- requirement: &2152955760 !ruby/object:Gem::Requirement
216
+ requirement: &2154786100 !ruby/object:Gem::Requirement
217
217
  none: false
218
218
  requirements:
219
219
  - - ! '>='
@@ -221,10 +221,10 @@ dependencies:
221
221
  version: '0'
222
222
  type: :development
223
223
  prerelease: false
224
- version_requirements: *2152955760
224
+ version_requirements: *2154786100
225
225
  - !ruby/object:Gem::Dependency
226
226
  name: sqlite3-ruby
227
- requirement: &2152946580 !ruby/object:Gem::Requirement
227
+ requirement: &2154785400 !ruby/object:Gem::Requirement
228
228
  none: false
229
229
  requirements:
230
230
  - - ! '>='
@@ -232,10 +232,10 @@ dependencies:
232
232
  version: '0'
233
233
  type: :development
234
234
  prerelease: false
235
- version_requirements: *2152946580
235
+ version_requirements: *2154785400
236
236
  - !ruby/object:Gem::Dependency
237
237
  name: mysql
238
- requirement: &2152944220 !ruby/object:Gem::Requirement
238
+ requirement: &2154784660 !ruby/object:Gem::Requirement
239
239
  none: false
240
240
  requirements:
241
241
  - - ! '>='
@@ -243,10 +243,10 @@ dependencies:
243
243
  version: '0'
244
244
  type: :development
245
245
  prerelease: false
246
- version_requirements: *2152944220
246
+ version_requirements: *2154784660
247
247
  - !ruby/object:Gem::Dependency
248
248
  name: pg
249
- requirement: &2152934720 !ruby/object:Gem::Requirement
249
+ requirement: &2154770840 !ruby/object:Gem::Requirement
250
250
  none: false
251
251
  requirements:
252
252
  - - ! '>='
@@ -254,7 +254,7 @@ dependencies:
254
254
  version: '0'
255
255
  type: :development
256
256
  prerelease: false
257
- version_requirements: *2152934720
257
+ version_requirements: *2154770840
258
258
  description: An earth-simulation environment with ActiveRecord models and data
259
259
  email: andy@rossmeissl.net
260
260
  executables:
@@ -441,6 +441,7 @@ files:
441
441
  - lib/earth/diet/diet_class/data_miner.rb
442
442
  - lib/earth/diet/food_group.rb
443
443
  - lib/earth/diet/food_group/data_miner.rb
444
+ - lib/earth/eia.rb
444
445
  - lib/earth/fuel.rb
445
446
  - lib/earth/fuel/data_miner.rb
446
447
  - lib/earth/fuel/fuel.rb
@@ -456,18 +457,26 @@ files:
456
457
  - lib/earth/hospitality.rb
457
458
  - lib/earth/hospitality/census_region_lodging_class.rb
458
459
  - lib/earth/hospitality/census_region_lodging_class/data_miner.rb
460
+ - lib/earth/hospitality/commercial_building_energy_consumption_survey_response.rb
461
+ - lib/earth/hospitality/commercial_building_energy_consumption_survey_response/data_miner.rb
459
462
  - lib/earth/hospitality/country_lodging_class.rb
460
463
  - lib/earth/hospitality/country_lodging_class/data_miner.rb
461
464
  - lib/earth/hospitality/data_miner.rb
462
465
  - lib/earth/hospitality/lodging_class.rb
463
466
  - lib/earth/hospitality/lodging_class/data_miner.rb
464
467
  - lib/earth/industry.rb
468
+ - lib/earth/industry/cbecs_energy_intensity.rb
469
+ - lib/earth/industry/cbecs_energy_intensity/data_miner.rb
465
470
  - lib/earth/industry/data_miner.rb
466
471
  - lib/earth/industry/industry.rb
467
472
  - lib/earth/industry/industry/data_miner.rb
468
473
  - lib/earth/industry/industry_product.rb
469
474
  - lib/earth/industry/industry_product_line.rb
470
475
  - lib/earth/industry/industry_sector.rb
476
+ - lib/earth/industry/mecs_energy.rb
477
+ - lib/earth/industry/mecs_energy/data_miner.rb
478
+ - lib/earth/industry/mecs_ratio.rb
479
+ - lib/earth/industry/mecs_ratio/data_miner.rb
471
480
  - lib/earth/industry/merchant.rb
472
481
  - lib/earth/industry/merchant_category.rb
473
482
  - lib/earth/industry/merchant_category_industry.rb
@@ -569,6 +578,8 @@ files:
569
578
  - spec/earth/bus/bus_class_spec.rb
570
579
  - spec/earth/bus/bus_fuel_control_spec.rb
571
580
  - spec/earth/bus/bus_fuel_year_control_spec.rb
581
+ - spec/earth/industry/mecs_energy_spec.rb
582
+ - spec/earth/industry/mecs_ratio_spec.rb
572
583
  - spec/earth/pet/species_spec.rb
573
584
  - spec/earth_spec.rb
574
585
  - spec/spec_helper.rb
@@ -637,7 +648,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
637
648
  version: '0'
638
649
  requirements: []
639
650
  rubyforge_project:
640
- rubygems_version: 1.8.10
651
+ rubygems_version: 1.8.11
641
652
  signing_key:
642
653
  specification_version: 3
643
654
  summary: Land, sky, and sea
@@ -730,6 +741,8 @@ test_files:
730
741
  - spec/earth/bus/bus_class_spec.rb
731
742
  - spec/earth/bus/bus_fuel_control_spec.rb
732
743
  - spec/earth/bus/bus_fuel_year_control_spec.rb
744
+ - spec/earth/industry/mecs_energy_spec.rb
745
+ - spec/earth/industry/mecs_ratio_spec.rb
733
746
  - spec/earth/pet/species_spec.rb
734
747
  - spec/earth_spec.rb
735
748
  - spec/spec_helper.rb