earth 0.5.0 → 0.5.2
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/Gemfile +4 -5
- data/README.markdown +0 -8
- data/Rakefile +14 -10
- data/bin/earth_tester.rb +12 -12
- data/earth.gemspec +2 -1
- data/features/automobile_make_fleet_year.feature +9 -19
- data/features/automobile_make_model_year.feature +4 -4
- data/features/support/env.rb +11 -7
- data/features/support/imports/automobile_make_fleet_year_bad.csv +1 -1
- data/features/support/imports/automobile_make_fleet_year_good.csv +1 -1
- data/features/support/imports/automobile_make_model_year_bad.csv +1 -1
- data/features/support/imports/automobile_make_model_year_good.csv +1 -1
- data/lib/earth/air/aircraft/data_miner.rb +63 -15
- data/lib/earth/air/aircraft.rb +0 -11
- data/lib/earth/air/aircraft_class/data_miner.rb +0 -13
- data/lib/earth/air/aircraft_class.rb +12 -3
- data/lib/earth/air/aircraft_fuel_use_equation/data_miner.rb +0 -13
- data/lib/earth/air/aircraft_fuel_use_equation.rb +12 -3
- data/lib/earth/air/airline/data_miner.rb +0 -7
- data/lib/earth/air/airline.rb +6 -3
- data/lib/earth/air/airport/data_miner.rb +5 -14
- data/lib/earth/air/airport.rb +9 -7
- data/lib/earth/air/bts_aircraft/data_miner.rb +0 -5
- data/lib/earth/air/bts_aircraft.rb +3 -3
- data/lib/earth/air/data_miner.rb +2 -3
- data/lib/earth/air/flight_distance_class/data_miner.rb +0 -6
- data/lib/earth/air/flight_distance_class.rb +4 -3
- data/lib/earth/air/flight_seat_class/data_miner.rb +0 -7
- data/lib/earth/air/flight_seat_class.rb +6 -3
- data/lib/earth/air/flight_segment/data_miner.rb +30 -112
- data/lib/earth/air/flight_segment.rb +47 -13
- data/lib/earth/air.rb +2 -1
- data/lib/earth/automobile/automobile_fuel/data_miner.rb +1 -25
- data/lib/earth/automobile/automobile_fuel.rb +24 -8
- data/lib/earth/automobile/automobile_make/data_miner.rb +3 -16
- data/lib/earth/automobile/automobile_make.rb +5 -3
- data/lib/earth/automobile/automobile_make_fleet_year/data_miner.rb +16 -30
- data/lib/earth/automobile/automobile_make_fleet_year.rb +10 -7
- data/lib/earth/automobile/automobile_make_model/data_miner.rb +1 -11
- data/lib/earth/automobile/automobile_make_model.rb +9 -7
- data/lib/earth/automobile/automobile_make_model_year/data_miner.rb +4 -17
- data/lib/earth/automobile/automobile_make_model_year.rb +11 -6
- data/lib/earth/automobile/automobile_make_model_year_variant/data_miner.rb +37 -65
- data/lib/earth/automobile/automobile_make_model_year_variant.rb +36 -6
- data/lib/earth/automobile/automobile_make_year/data_miner.rb +3 -15
- data/lib/earth/automobile/automobile_make_year.rb +8 -7
- data/lib/earth/automobile/automobile_size_class/data_miner.rb +0 -15
- data/lib/earth/automobile/automobile_size_class.rb +13 -2
- data/lib/earth/automobile/automobile_size_class_year/data_miner.rb +0 -11
- data/lib/earth/automobile/automobile_size_class_year.rb +10 -3
- data/lib/earth/automobile/automobile_type_fuel_age/data_miner.rb +0 -12
- data/lib/earth/automobile/automobile_type_fuel_age.rb +10 -2
- data/lib/earth/automobile/automobile_type_fuel_control/data_miner.rb +0 -11
- data/lib/earth/automobile/automobile_type_fuel_control.rb +9 -3
- data/lib/earth/automobile/automobile_type_fuel_year/data_miner.rb +1 -17
- data/lib/earth/automobile/automobile_type_fuel_year.rb +14 -6
- data/lib/earth/automobile/automobile_type_fuel_year_age/data_miner.rb +0 -13
- data/lib/earth/automobile/automobile_type_fuel_year_age.rb +12 -7
- data/lib/earth/automobile/automobile_type_fuel_year_control/data_miner.rb +0 -11
- data/lib/earth/automobile/automobile_type_fuel_year_control.rb +9 -6
- data/lib/earth/automobile/automobile_type_year/data_miner.rb +0 -10
- data/lib/earth/automobile/automobile_type_year.rb +9 -3
- data/lib/earth/bus/bus_class/data_miner.rb +0 -29
- data/lib/earth/bus/bus_class.rb +27 -2
- data/lib/earth/bus/bus_fuel/data_miner.rb +1 -16
- data/lib/earth/bus/bus_fuel.rb +15 -8
- data/lib/earth/bus/bus_fuel_control/data_miner.rb +0 -10
- data/lib/earth/bus/bus_fuel_control.rb +8 -3
- data/lib/earth/bus/bus_fuel_year_control/data_miner.rb +1 -10
- data/lib/earth/bus/bus_fuel_year_control.rb +8 -7
- data/lib/earth/bus/data_miner.rb +2 -0
- data/lib/earth/bus.rb +2 -0
- data/lib/earth/computation/computation_carrier/data_miner.rb +0 -5
- data/lib/earth/computation/computation_carrier.rb +3 -2
- data/lib/earth/computation/computation_carrier_instance_class/data_miner.rb +0 -8
- data/lib/earth/computation/computation_carrier_instance_class.rb +6 -6
- data/lib/earth/computation/computation_carrier_region/data_miner.rb +0 -7
- data/lib/earth/computation/computation_carrier_region.rb +6 -7
- data/lib/earth/computation/data_miner.rb +2 -0
- data/lib/earth/computation.rb +2 -0
- data/lib/earth/diet/diet_class/data_miner.rb +0 -16
- data/lib/earth/diet/diet_class.rb +16 -4
- data/lib/earth/diet/food_group/data_miner.rb +0 -9
- data/lib/earth/diet/food_group.rb +7 -2
- data/lib/earth/fuel/fuel/data_miner.rb +0 -16
- data/lib/earth/fuel/fuel.rb +14 -2
- data/lib/earth/fuel/fuel_price/data_miner.rb +0 -6
- data/lib/earth/fuel/fuel_price.rb +4 -6
- data/lib/earth/fuel/fuel_type/data_miner.rb +0 -14
- data/lib/earth/fuel/fuel_type.rb +14 -4
- data/lib/earth/fuel/fuel_year/data_miner.rb +0 -16
- data/lib/earth/fuel/fuel_year.rb +14 -2
- data/lib/earth/fuel/greenhouse_gas/data_miner.rb +0 -9
- data/lib/earth/fuel/greenhouse_gas.rb +10 -5
- data/lib/earth/hospitality/lodging_class/data_miner.rb +0 -12
- data/lib/earth/hospitality/lodging_class.rb +10 -2
- data/lib/earth/industry/data_miner.rb +0 -0
- data/lib/earth/industry/industry.rb +3 -10
- data/lib/earth/industry/industry_product.rb +6 -13
- data/lib/earth/industry/industry_product_line.rb +5 -12
- data/lib/earth/industry/industry_sector.rb +5 -12
- data/lib/earth/industry/merchant.rb +4 -11
- data/lib/earth/industry/merchant_category.rb +3 -10
- data/lib/earth/industry/merchant_category_industry.rb +5 -12
- data/lib/earth/industry/product_line.rb +5 -12
- data/lib/earth/industry/product_line_industry_product.rb +5 -12
- data/lib/earth/industry/sector.rb +5 -12
- data/lib/earth/locality/census_division/data_miner.rb +0 -23
- data/lib/earth/locality/census_division.rb +21 -6
- data/lib/earth/locality/census_region/data_miner.rb +0 -5
- data/lib/earth/locality/census_region.rb +3 -2
- data/lib/earth/locality/climate_division/data_miner.rb +0 -7
- data/lib/earth/locality/climate_division.rb +5 -7
- data/lib/earth/locality/country/data_miner.rb +16 -29
- data/lib/earth/locality/country.rb +15 -4
- data/lib/earth/locality/data_miner.rb +3 -0
- data/lib/earth/locality/egrid_region/data_miner.rb +0 -5
- data/lib/earth/locality/egrid_region.rb +5 -8
- data/lib/earth/locality/egrid_subregion/data_miner.rb +1 -20
- data/lib/earth/locality/egrid_subregion.rb +17 -6
- data/lib/earth/locality/petroleum_administration_for_defense_district/data_miner.rb +4 -13
- data/lib/earth/locality/petroleum_administration_for_defense_district.rb +8 -4
- data/lib/earth/locality/state/data_miner.rb +0 -8
- data/lib/earth/locality/state.rb +6 -7
- data/lib/earth/locality/urbanity/data_miner.rb +0 -4
- data/lib/earth/locality/urbanity.rb +2 -2
- data/lib/earth/locality/zip_code/data_miner.rb +0 -10
- data/lib/earth/locality/zip_code.rb +8 -6
- data/lib/earth/locality.rb +3 -0
- data/lib/earth/pet/breed/data_miner.rb +0 -7
- data/lib/earth/pet/breed.rb +5 -6
- data/lib/earth/pet/breed_gender/data_miner.rb +0 -8
- data/lib/earth/pet/breed_gender.rb +6 -6
- data/lib/earth/pet/gender/data_miner.rb +0 -3
- data/lib/earth/pet/gender.rb +2 -2
- data/lib/earth/pet/species/data_miner.rb +0 -17
- data/lib/earth/pet/species.rb +17 -4
- data/lib/earth/rail/rail_class/data_miner.rb +0 -14
- data/lib/earth/rail/rail_class.rb +12 -3
- data/lib/earth/residence/air_conditioner_use/data_miner.rb +0 -6
- data/lib/earth/residence/air_conditioner_use.rb +5 -3
- data/lib/earth/residence/clothes_machine_use/data_miner.rb +0 -6
- data/lib/earth/residence/clothes_machine_use.rb +4 -2
- data/lib/earth/residence/data_miner.rb +2 -0
- data/lib/earth/residence/dishwasher_use/data_miner.rb +0 -6
- data/lib/earth/residence/dishwasher_use.rb +5 -3
- data/lib/earth/residence/residence_appliance/data_miner.rb +0 -6
- data/lib/earth/residence/residence_appliance.rb +4 -2
- data/lib/earth/residence/residence_class/data_miner.rb +0 -4
- data/lib/earth/residence/residence_class.rb +2 -2
- data/lib/earth/residence/residence_fuel_price/data_miner.rb +0 -14
- data/lib/earth/residence/residence_fuel_price.rb +12 -7
- data/lib/earth/residence/residence_fuel_type/data_miner.rb +0 -8
- data/lib/earth/residence/residence_fuel_type.rb +6 -2
- data/lib/earth/residence/residential_energy_consumption_survey_response/data_miner.rb +0 -94
- data/lib/earth/residence/residential_energy_consumption_survey_response.rb +92 -6
- data/lib/earth/residence.rb +2 -0
- data/lib/earth/shipping/carrier/data_miner.rb +0 -10
- data/lib/earth/shipping/carrier.rb +8 -2
- data/lib/earth/shipping/carrier_mode/data_miner.rb +0 -10
- data/lib/earth/shipping/carrier_mode.rb +9 -3
- data/lib/earth/shipping/shipment_mode/data_miner.rb +0 -7
- data/lib/earth/shipping/shipment_mode.rb +5 -2
- data/lib/earth/version.rb +1 -1
- data/lib/earth.rb +92 -84
- data/spec/earth/air/aircraft_spec.rb +1 -1
- data/spec/earth_spec.rb +15 -15
- data/spec/spec_helper.rb +12 -9
- metadata +175 -171
- data/lib/earth/active_record_ext.rb +0 -9
- data/lib/earth/air/aircraft_manufacturer/data_miner.rb +0 -21
- data/lib/earth/air/aircraft_manufacturer.rb +0 -7
- data/lib/earth/base.rb +0 -7
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
# need this to run flight_segment.cache_aircraft!
|
|
2
|
-
require 'loose_tight_dictionary/cached_result'
|
|
3
|
-
|
|
4
1
|
FlightSegment.class_eval do
|
|
2
|
+
# For import errata
|
|
3
|
+
class FlightSegment::Guru
|
|
4
|
+
def in_may_2009?(row)
|
|
5
|
+
row ['MONTH'] == 5 and row['YEAR'] == 2009
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def in_july_2009?(row)
|
|
9
|
+
row ['MONTH'] == 7 and row['YEAR'] == 2009
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
5
13
|
URL = 'http://www.transtats.bts.gov/DownLoad_Table.asp?Table_ID=293&Has_Group=3&Is_Zipped=0'
|
|
6
14
|
FORM_DATA = %{
|
|
7
15
|
UserTableName=T_100_Segment__All_Carriers&
|
|
@@ -162,51 +170,8 @@ FlightSegment.class_eval do
|
|
|
162
170
|
}.gsub /[\s]+/,''
|
|
163
171
|
|
|
164
172
|
data_miner do
|
|
165
|
-
schema Earth.database_options do
|
|
166
|
-
string 'row_hash' # auto-generated primary key
|
|
167
|
-
string 'origin_airport_iata_code' # iata code
|
|
168
|
-
string 'origin_airport_city' # city
|
|
169
|
-
string 'origin_country_iso_3166_code' # iso code
|
|
170
|
-
string 'destination_airport_iata_code' # iata code
|
|
171
|
-
string 'destination_airport_city' # city
|
|
172
|
-
string 'destination_country_iso_3166_code' # iso code
|
|
173
|
-
string 'airline_bts_code' # bts code
|
|
174
|
-
string 'airline_icao_code' # icao code
|
|
175
|
-
string 'airline_name' # text description derived from bts or icao code
|
|
176
|
-
string 'aircraft_bts_code' # bts code
|
|
177
|
-
string 'aircraft_description' # text description derived from BTS T100 or ICAO TFS
|
|
178
|
-
integer 'flights' # number of flights over month or year
|
|
179
|
-
integer 'passengers' # total passengers on all flights
|
|
180
|
-
integer 'seats' # total seats on all flights
|
|
181
|
-
float 'seats_per_flight' # average seats per flight; make this a float
|
|
182
|
-
float 'load_factor' # passengers / seats
|
|
183
|
-
float 'freight_share' # (freight + mail) / (freight + mail + (passengers * average passenger weight))
|
|
184
|
-
float 'distance' # flight distance
|
|
185
|
-
string 'distance_units' # 'kilometres'
|
|
186
|
-
float 'payload_capacity' # aircraft maximum payload capacity rating; float b/c unit conversion
|
|
187
|
-
string 'payload_capacity_units' # 'kilograms'
|
|
188
|
-
float 'freight' # total freight on all flights performed; float b/c unit conversion
|
|
189
|
-
string 'freight_units' # 'kilograms'
|
|
190
|
-
float 'mail' # total mail on all flights performed; float b/c unit conversion
|
|
191
|
-
string 'mail_units' # 'kilograms'
|
|
192
|
-
integer 'month' # month of flight
|
|
193
|
-
integer 'year' # year of flight
|
|
194
|
-
date 'approximate_date' # assumed 14th day of month
|
|
195
|
-
string 'source' # 'BTS T100' or 'ICAO TFS'
|
|
196
|
-
index 'origin_airport_iata_code' # index for faster lookup by origin airport
|
|
197
|
-
index 'origin_airport_city' # index for faster lookup by origin city
|
|
198
|
-
index 'destination_airport_iata_code' # index for faster lookup by destination airport
|
|
199
|
-
index 'destination_airport_city' # index for faster lookup by destination city
|
|
200
|
-
index 'airline_bts_code' # index for faster lookup by airline bts code
|
|
201
|
-
index 'airline_icao_code' # index for faster lookup by airline icao code
|
|
202
|
-
index 'airline_name' # index for faster lookup by airline name
|
|
203
|
-
index 'aircraft_bts_code' # index for faster lookup by aircraft bts code
|
|
204
|
-
index 'aircraft_description' # index for faster lookup by aircraft
|
|
205
|
-
index 'year' # index for faster lookup by year
|
|
206
|
-
end
|
|
207
|
-
|
|
208
173
|
months = Hash.new
|
|
209
|
-
(2009..
|
|
174
|
+
(2009..2011).each do |year|
|
|
210
175
|
(1..12).each do |month|
|
|
211
176
|
time = Time.gm year, month
|
|
212
177
|
form_data = FORM_DATA.dup
|
|
@@ -223,6 +188,8 @@ FlightSegment.class_eval do
|
|
|
223
188
|
:form_data => form_data,
|
|
224
189
|
:compression => :zip,
|
|
225
190
|
:glob => '/*.csv',
|
|
191
|
+
# FIXME TODO 6/6/2011 the errata doesn't work - still doesn't fill in missing airline in May and July 2009
|
|
192
|
+
:errata => { :url => 'https://spreadsheets.google.com/spreadsheet/pub?key=0AoQJbWqPrREqdGxpYU1qWFR3d0syTVMyQVVOaDd0V3c&output=csv', :responder => FlightSegment::Guru.new },
|
|
226
193
|
:select => lambda { |record| record['DEPARTURES_PERFORMED'].to_i > 0 } do
|
|
227
194
|
key 'row_hash'
|
|
228
195
|
store 'origin_airport_iata_code', :field_name => 'ORIGIN'
|
|
@@ -244,33 +211,24 @@ FlightSegment.class_eval do
|
|
|
244
211
|
end
|
|
245
212
|
end
|
|
246
213
|
|
|
247
|
-
|
|
248
|
-
# verify destination_airport_iata_code is in airports
|
|
249
|
-
# verify origin_country_iso_3166_code is in countries
|
|
250
|
-
# verify destination_country_iso_3166_code is in countries
|
|
251
|
-
# verify airline_bts_code appears in airlines
|
|
252
|
-
# verify aircraft_description is never missing
|
|
253
|
-
# verify year is never missing
|
|
254
|
-
|
|
255
|
-
process "Ensure Airline is populated" do
|
|
214
|
+
process "Ensure Airline and BtsAircraft are populated" do
|
|
256
215
|
Airline.run_data_miner!
|
|
216
|
+
BtsAircraft.run_data_miner!
|
|
257
217
|
end
|
|
258
218
|
|
|
259
219
|
process "Look up airline name based on BTS code" do
|
|
260
220
|
connection.select_values("SELECT DISTINCT airline_bts_code FROM flight_segments WHERE airline_bts_code IS NOT NULL").each do |bts_code|
|
|
261
|
-
|
|
262
|
-
|
|
221
|
+
if airline = Airline.find_by_bts_code(bts_code)
|
|
222
|
+
update_all %{ airline_name = "#{airline.name}" }, %{ airline_bts_code = "#{bts_code}" }
|
|
223
|
+
end
|
|
263
224
|
end
|
|
264
225
|
end
|
|
265
226
|
|
|
266
|
-
process "Ensure BtsAircraft is populated" do
|
|
267
|
-
BtsAircraft.run_data_miner!
|
|
268
|
-
end
|
|
269
|
-
|
|
270
227
|
process "Look up aircraft description based on BTS code" do
|
|
271
228
|
connection.select_values("SELECT DISTINCT aircraft_bts_code FROM flight_segments WHERE aircraft_bts_code IS NOT NULL").each do |bts_code|
|
|
272
|
-
|
|
273
|
-
|
|
229
|
+
if aircraft = BtsAircraft.find_by_bts_code(bts_code)
|
|
230
|
+
update_all %{ aircraft_description = "#{aircraft.description.downcase}" }, %{ aircraft_bts_code = "#{bts_code}" }
|
|
231
|
+
end
|
|
274
232
|
end
|
|
275
233
|
end
|
|
276
234
|
|
|
@@ -316,56 +274,16 @@ FlightSegment.class_eval do
|
|
|
316
274
|
update_all 'approximate_date = DATE(CONCAT_WS("-", year, month, "14"))', 'month IS NOT NULL'
|
|
317
275
|
end
|
|
318
276
|
|
|
319
|
-
process "
|
|
277
|
+
process "Data mine Aircraft to cache fuzzy matches" do
|
|
320
278
|
Aircraft.run_data_miner!
|
|
321
279
|
end
|
|
322
280
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
# synthesized descriptions, and associate those Aircraft with the original aircraft_description.
|
|
331
|
-
# e.g. boeing 747-100/200
|
|
332
|
-
if original_description.include?("/")
|
|
333
|
-
# Pull out the complete first aircraft description
|
|
334
|
-
# e.g. 'boeing 747-100'
|
|
335
|
-
first_description = original_description.split('/')[0]
|
|
336
|
-
|
|
337
|
-
# Pull out the root of the description - the text up to and including the last ' ' or '-'
|
|
338
|
-
# e.g. 'boeing 747-'
|
|
339
|
-
root_length = first_description.rindex('-')
|
|
340
|
-
root = first_description.slice(0..root_length)
|
|
341
|
-
|
|
342
|
-
# Pull out the suffixes - the text separated by forward slashes
|
|
343
|
-
# e.g. ['100', '200']
|
|
344
|
-
suffixes = original_description.split(root)[1].split('/')
|
|
345
|
-
|
|
346
|
-
# Create an array of synthesized descriptions by appending each suffix to the root
|
|
347
|
-
# e.g. ['boeing 747-100', 'boeing 747-200']
|
|
348
|
-
suffixes.map{ |suffix| root + suffix }.each do |synthesized_description|
|
|
349
|
-
# Look up the Aircraft that match each synthesized description and associate
|
|
350
|
-
# them with the original flight segment aircraft_description
|
|
351
|
-
Aircraft.loose_tight_dictionary.find_all(synthesized_description).each do |aircraft|
|
|
352
|
-
attrs = {
|
|
353
|
-
:a_class => "Aircraft",
|
|
354
|
-
:a => aircraft.description,
|
|
355
|
-
:b_class => "FlightSegment",
|
|
356
|
-
:b => original_description
|
|
357
|
-
}
|
|
358
|
-
unless ::LooseTightDictionary::CachedResult.exists? attrs
|
|
359
|
-
::LooseTightDictionary::CachedResult.create! attrs
|
|
360
|
-
end
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
# If the flight segment's aircraft_description doesn't contain '/' we can use
|
|
364
|
-
# a method provided by loose_tight_dictionary to associate it with Aircraft
|
|
365
|
-
else
|
|
366
|
-
flight_segment.cache_aircraft!
|
|
367
|
-
end
|
|
368
|
-
end
|
|
369
|
-
end
|
|
281
|
+
# verify origin_airport_iata_code is in airports
|
|
282
|
+
# verify destination_airport_iata_code is in airports
|
|
283
|
+
# verify origin_country_iso_3166_code is in countries
|
|
284
|
+
# verify destination_country_iso_3166_code is in countries
|
|
285
|
+
# verify airline_name is never missing
|
|
286
|
+
# verify aircraft_description is never missing
|
|
287
|
+
# verify year is never missing
|
|
370
288
|
end
|
|
371
289
|
end
|
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
# need this for association with Aircraft through loose_tight_dictionary_cached_results
|
|
2
|
-
require 'loose_tight_dictionary/cached_result'
|
|
3
|
-
|
|
4
1
|
class FlightSegment < ActiveRecord::Base
|
|
5
2
|
set_primary_key :row_hash
|
|
6
3
|
|
|
7
4
|
extend CohortScope
|
|
8
5
|
self.minimum_cohort_size = 1
|
|
9
6
|
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
# Cutting this for now because if iata code is missing we have to look up airports using both city and country; don't know how to do this with ActiveRecord
|
|
8
|
+
# - Ian 6/12/2011
|
|
9
|
+
# # If airport iata code is missing, associate with all airports in a city
|
|
10
|
+
# # We need this to calculate distance when importing ICAO segments - see cm1 flight_segment.rb
|
|
11
|
+
# has_many :origin_city_airports, :foreign_key => 'city', :primary_key => 'origin_airport_city', :class_name => 'Airport'
|
|
12
|
+
# has_many :destination_city_airports, :foreign_key => 'city', :primary_key => 'destination_airport_city', :class_name => 'Airport'
|
|
14
13
|
|
|
15
14
|
# Enable flight_segment.aircraft
|
|
16
15
|
cache_loose_tight_dictionary_matches_with :aircraft, :primary_key => :aircraft_description, :foreign_key => :description
|
|
@@ -20,11 +19,46 @@ class FlightSegment < ActiveRecord::Base
|
|
|
20
19
|
:load_factor => lambda { weighted_average(:load_factor, :weighted_by => :passengers) }, # 0.78073233770097 data1 10-12-2010
|
|
21
20
|
:freight_share => lambda { weighted_average(:freight_share, :weighted_by => :passengers) } # 0.022567224170157 data1 10-12-2010
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
create_table do
|
|
23
|
+
string 'row_hash' # auto-generated primary key
|
|
24
|
+
string 'origin_airport_iata_code' # iata code
|
|
25
|
+
string 'origin_airport_city' # city
|
|
26
|
+
string 'origin_country_iso_3166_code' # iso code
|
|
27
|
+
string 'destination_airport_iata_code' # iata code
|
|
28
|
+
string 'destination_airport_city' # city
|
|
29
|
+
string 'destination_country_iso_3166_code' # iso code
|
|
30
|
+
string 'airline_bts_code' # bts code
|
|
31
|
+
string 'airline_icao_code' # icao code
|
|
32
|
+
string 'airline_name' # text description derived from bts or icao code
|
|
33
|
+
string 'aircraft_bts_code' # bts code
|
|
34
|
+
string 'aircraft_description' # text description derived from BTS T100 or ICAO TFS
|
|
35
|
+
integer 'flights' # number of flights over month or year
|
|
36
|
+
integer 'passengers' # total passengers on all flights
|
|
37
|
+
integer 'seats' # total seats on all flights
|
|
38
|
+
float 'seats_per_flight' # average seats per flight; make this a float
|
|
39
|
+
float 'load_factor' # passengers / seats
|
|
40
|
+
float 'freight_share' # (freight + mail) / (freight + mail + (passengers * average passenger weight))
|
|
41
|
+
float 'distance' # flight distance
|
|
42
|
+
string 'distance_units' # 'kilometres'
|
|
43
|
+
float 'payload_capacity' # aircraft maximum payload capacity rating; float b/c unit conversion
|
|
44
|
+
string 'payload_capacity_units' # 'kilograms'
|
|
45
|
+
float 'freight' # total freight on all flights performed; float b/c unit conversion
|
|
46
|
+
string 'freight_units' # 'kilograms'
|
|
47
|
+
float 'mail' # total mail on all flights performed; float b/c unit conversion
|
|
48
|
+
string 'mail_units' # 'kilograms'
|
|
49
|
+
integer 'month' # month of flight
|
|
50
|
+
integer 'year' # year of flight
|
|
51
|
+
date 'approximate_date' # assumed 14th day of month
|
|
52
|
+
string 'source' # 'BTS T100' or 'ICAO TFS'
|
|
53
|
+
index 'origin_airport_iata_code' # index for faster lookup by origin airport
|
|
54
|
+
index 'origin_airport_city' # index for faster lookup by origin city
|
|
55
|
+
index 'destination_airport_iata_code' # index for faster lookup by destination airport
|
|
56
|
+
index 'destination_airport_city' # index for faster lookup by destination city
|
|
57
|
+
index 'airline_bts_code' # index for faster lookup by airline bts code
|
|
58
|
+
index 'airline_icao_code' # index for faster lookup by airline icao code
|
|
59
|
+
index 'airline_name' # index for faster lookup by airline name
|
|
60
|
+
index 'aircraft_bts_code' # index for faster lookup by aircraft bts code
|
|
61
|
+
index 'aircraft_description' # index for faster lookup by aircraft
|
|
62
|
+
index 'year' # index for faster lookup by year
|
|
29
63
|
end
|
|
30
64
|
end
|
data/lib/earth/air.rb
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
require 'earth/air/aircraft'
|
|
2
2
|
require 'earth/air/aircraft_class'
|
|
3
3
|
require 'earth/air/aircraft_fuel_use_equation'
|
|
4
|
-
require 'earth/air/aircraft_manufacturer'
|
|
5
4
|
require 'earth/air/airline'
|
|
6
5
|
require 'earth/air/airport'
|
|
7
6
|
require 'earth/air/bts_aircraft'
|
|
8
7
|
require 'earth/air/flight_distance_class'
|
|
9
8
|
require 'earth/air/flight_seat_class'
|
|
10
9
|
require 'earth/air/flight_segment'
|
|
10
|
+
|
|
11
|
+
require 'earth/locality'
|
|
@@ -1,29 +1,5 @@
|
|
|
1
1
|
AutomobileFuel.class_eval do
|
|
2
2
|
data_miner do
|
|
3
|
-
schema Earth.database_options do
|
|
4
|
-
string 'name'
|
|
5
|
-
string 'code'
|
|
6
|
-
string 'base_fuel_name'
|
|
7
|
-
string 'blend_fuel_name'
|
|
8
|
-
float 'blend_portion' # the portion of the blend that is the blend fuel
|
|
9
|
-
string 'distance_key' # used to look up annual distance from AutomobileTypeFuelYear
|
|
10
|
-
string 'ef_key' # used to look up ch4 n2o and hfc emission factors from AutomobileTypeFuelYear
|
|
11
|
-
float 'annual_distance'
|
|
12
|
-
string 'annual_distance_units'
|
|
13
|
-
float 'co2_emission_factor'
|
|
14
|
-
string 'co2_emission_factor_units'
|
|
15
|
-
float 'co2_biogenic_emission_factor'
|
|
16
|
-
string 'co2_biogenic_emission_factor_units'
|
|
17
|
-
float 'ch4_emission_factor'
|
|
18
|
-
string 'ch4_emission_factor_units'
|
|
19
|
-
float 'n2o_emission_factor'
|
|
20
|
-
string 'n2o_emission_factor_units'
|
|
21
|
-
float 'hfc_emission_factor'
|
|
22
|
-
string 'hfc_emission_factor_units'
|
|
23
|
-
float 'emission_factor' # DEPRECATED but motorcycle needs this
|
|
24
|
-
string 'emission_factor_units' # DEPRECATED but motorcycle needs this
|
|
25
|
-
end
|
|
26
|
-
|
|
27
3
|
import "a list of pure automobile fuels",
|
|
28
4
|
:url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdE9xTEdueFM2R0diNTgxUlk1QXFSb2c&gid=0&output=html' do
|
|
29
5
|
key 'name'
|
|
@@ -44,7 +20,7 @@ AutomobileFuel.class_eval do
|
|
|
44
20
|
store 'ef_key'
|
|
45
21
|
end
|
|
46
22
|
|
|
47
|
-
process "Ensure
|
|
23
|
+
process "Ensure AutomobileTypeFuelYearAge, AutomobileTypeYear, Fuel, and GreenhouseGas are populated" do
|
|
48
24
|
AutomobileTypeFuelYearAge.run_data_miner!
|
|
49
25
|
AutomobileTypeYear.run_data_miner!
|
|
50
26
|
Fuel.run_data_miner!
|
|
@@ -97,15 +97,31 @@ class AutomobileFuel < ActiveRecord::Base
|
|
|
97
97
|
:n2o_emission_factor_units => lambda { AutomobileFuel.fallback_n2o_emission_factor_units },
|
|
98
98
|
:hfc_emission_factor => lambda { AutomobileFuel.fallback_hfc_emission_factor },
|
|
99
99
|
:hfc_emission_factor_units => lambda { AutomobileFuel.fallback_hfc_emission_factor_units }
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
100
|
+
|
|
101
|
+
create_table do
|
|
102
|
+
string 'name'
|
|
103
|
+
string 'code'
|
|
104
|
+
string 'base_fuel_name'
|
|
105
|
+
string 'blend_fuel_name'
|
|
106
|
+
float 'blend_portion' # the portion of the blend that is the blend fuel
|
|
107
|
+
string 'distance_key' # used to look up annual distance from AutomobileTypeFuelYear
|
|
108
|
+
string 'ef_key' # used to look up ch4 n2o and hfc emission factors from AutomobileTypeFuelYear
|
|
109
|
+
float 'annual_distance'
|
|
110
|
+
string 'annual_distance_units'
|
|
111
|
+
float 'co2_emission_factor'
|
|
112
|
+
string 'co2_emission_factor_units'
|
|
113
|
+
float 'co2_biogenic_emission_factor'
|
|
114
|
+
string 'co2_biogenic_emission_factor_units'
|
|
115
|
+
float 'ch4_emission_factor'
|
|
116
|
+
string 'ch4_emission_factor_units'
|
|
117
|
+
float 'n2o_emission_factor'
|
|
118
|
+
string 'n2o_emission_factor_units'
|
|
119
|
+
float 'hfc_emission_factor'
|
|
120
|
+
string 'hfc_emission_factor_units'
|
|
121
|
+
float 'emission_factor' # DEPRECATED but motorcycle needs this
|
|
122
|
+
string 'emission_factor_units' # DEPRECATED but motorcycle needs this
|
|
107
123
|
end
|
|
108
|
-
|
|
124
|
+
|
|
109
125
|
CODES = {
|
|
110
126
|
:electricity => 'El',
|
|
111
127
|
:diesel => 'D'
|
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
AutomobileMake.class_eval do
|
|
2
2
|
data_miner do
|
|
3
3
|
process "Start from scratch" do
|
|
4
|
-
|
|
4
|
+
delete_all
|
|
5
5
|
end
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
string 'name'
|
|
9
|
-
float 'fuel_efficiency'
|
|
10
|
-
string 'fuel_efficiency_units'
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
process "Ensure AutomobileMakeModelYearVariant is populated" do
|
|
7
|
+
process "Ensure AutomobileMakeModelYearVariant and AutomobileMakeFleetYear are populated" do
|
|
14
8
|
AutomobileMakeModelYearVariant.run_data_miner!
|
|
9
|
+
AutomobileMakeFleetYear.run_data_miner!
|
|
15
10
|
end
|
|
16
11
|
|
|
17
12
|
process "Derive manufacturer names from automobile make model year variants" do
|
|
@@ -23,10 +18,6 @@ AutomobileMake.class_eval do
|
|
|
23
18
|
}
|
|
24
19
|
end
|
|
25
20
|
|
|
26
|
-
process "Ensure AutomobileMakeFleetYear is populated" do
|
|
27
|
-
AutomobileMakeFleetYear.run_data_miner!
|
|
28
|
-
end
|
|
29
|
-
|
|
30
21
|
# sabshere 1/31/11 add Avanti, DaimlerChrysler, IHC, Tesla, etc.
|
|
31
22
|
process "Derive extra manufacturer names from CAFE data" do
|
|
32
23
|
INSERT_IGNORE %{INTO automobile_makes(name)
|
|
@@ -35,10 +26,6 @@ AutomobileMake.class_eval do
|
|
|
35
26
|
}
|
|
36
27
|
end
|
|
37
28
|
|
|
38
|
-
process "Ensure AutomobileMakeFleetYear is populated" do
|
|
39
|
-
AutomobileMakeFleetYear.run_data_miner!
|
|
40
|
-
end
|
|
41
|
-
|
|
42
29
|
# FIXME TODO make this a method on AutomobileMake?
|
|
43
30
|
process "Calculate fuel efficiency from automobile make fleet years for makes with CAFE data" do
|
|
44
31
|
make_fleet_years = AutomobileMakeFleetYear.arel_table
|
|
@@ -5,8 +5,10 @@ class AutomobileMake < ActiveRecord::Base
|
|
|
5
5
|
has_many :models, :class_name => 'AutomobileMakeModel', :foreign_key => 'make_name'
|
|
6
6
|
has_many :fleet_years, :class_name => 'AutomobileMakeFleetYear', :foreign_key => 'make_name'
|
|
7
7
|
has_many :make_model_year_variants, :class_name => 'AutomobileMakeModelYearVariant', :foreign_key => 'make_name'
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
|
|
9
|
+
create_table do
|
|
10
|
+
string 'name'
|
|
11
|
+
float 'fuel_efficiency'
|
|
12
|
+
string 'fuel_efficiency_units'
|
|
11
13
|
end
|
|
12
14
|
end
|
|
@@ -1,16 +1,5 @@
|
|
|
1
1
|
AutomobileMakeFleetYear.class_eval do
|
|
2
2
|
data_miner do
|
|
3
|
-
schema Earth.database_options do
|
|
4
|
-
string 'name'
|
|
5
|
-
string 'make_year_name'
|
|
6
|
-
string 'make_name'
|
|
7
|
-
string 'fleet'
|
|
8
|
-
integer 'year'
|
|
9
|
-
float 'fuel_efficiency'
|
|
10
|
-
string 'fuel_efficiency_units'
|
|
11
|
-
integer 'volume'
|
|
12
|
-
end
|
|
13
|
-
|
|
14
3
|
import "annual corporate average fuel economy data for domestic and imported vehicle fleets from the NHTSA",
|
|
15
4
|
:url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdEdXWXB6dkVLWkowLXhYSFVUT01sS2c&hl=en&gid=0&output=csv',
|
|
16
5
|
:errata => { 'url' => 'http://static.brighterplanet.com/science/data/transport/automobiles/make_fleet_years/errata.csv' },
|
|
@@ -24,34 +13,31 @@ AutomobileMakeFleetYear.class_eval do
|
|
|
24
13
|
store 'volume'
|
|
25
14
|
end
|
|
26
15
|
|
|
27
|
-
verify "Year should be from 1978 to
|
|
28
|
-
|
|
29
|
-
unless
|
|
30
|
-
raise "Invalid year
|
|
16
|
+
verify "Year should be from 1978 to 2010" do
|
|
17
|
+
connection.select_values("SELECT DISTINCT year FROM automobile_make_fleet_years").each do |year|
|
|
18
|
+
unless year > 1977 and year < 2011
|
|
19
|
+
raise "Invalid year in automobile_make_fleet_years: #{year} is not from 1978 to 2010"
|
|
31
20
|
end
|
|
32
21
|
end
|
|
33
22
|
end
|
|
34
23
|
|
|
35
|
-
verify "Fuel efficiency should be greater than zero" do
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
raise "Invalid
|
|
24
|
+
verify "Fuel efficiency and volume should be greater than zero" do
|
|
25
|
+
[:fuel_efficiency, :volume].each do |field|
|
|
26
|
+
if AutomobileMakeFleetYear.where(field => nil).any?
|
|
27
|
+
raise "Invalid #{field} in automobile_make_fleet_years: nil is not > 0"
|
|
28
|
+
else
|
|
29
|
+
min = AutomobileMakeFleetYear.minimum(field)
|
|
30
|
+
unless min > 0
|
|
31
|
+
raise "Invalid #{field} in automobile_make_fleet_years: #{min} is not > 0"
|
|
32
|
+
end
|
|
39
33
|
end
|
|
40
34
|
end
|
|
41
35
|
end
|
|
42
36
|
|
|
43
37
|
verify "Fuel efficiency units should be kilometres per litre" do
|
|
44
|
-
|
|
45
|
-
unless
|
|
46
|
-
raise "Invalid fuel efficiency units
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
verify "Volume should be greater than zero" do
|
|
52
|
-
AutomobileMakeFleetYear.all.each do |fleet_year|
|
|
53
|
-
unless fleet_year.volume > 0
|
|
54
|
-
raise "Invalid volume for AutomobileMakeFleetYear #{fleet_year.name}: #{fleet_year.volume} (should be > 0)"
|
|
38
|
+
connection.select_values("SELECT DISTINCT fuel_efficiency_units FROM automobile_make_fleet_years").each do |units|
|
|
39
|
+
unless units == "kilometres_per_litre"
|
|
40
|
+
raise "Invalid fuel efficiency units in automobile_make_fleet_years: #{units} is not 'kilometres_per_litre'"
|
|
55
41
|
end
|
|
56
42
|
end
|
|
57
43
|
end
|
|
@@ -3,12 +3,15 @@ class AutomobileMakeFleetYear < ActiveRecord::Base
|
|
|
3
3
|
|
|
4
4
|
belongs_to :make, :class_name => 'AutomobileMake', :foreign_key => 'make_name'
|
|
5
5
|
belongs_to :make_year, :class_name => 'AutomobileMakeYear', :foreign_key => 'make_year_name'
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
|
|
7
|
+
create_table do
|
|
8
|
+
string 'name'
|
|
9
|
+
string 'make_year_name'
|
|
10
|
+
string 'make_name'
|
|
11
|
+
string 'fleet'
|
|
12
|
+
integer 'year'
|
|
13
|
+
float 'fuel_efficiency'
|
|
14
|
+
string 'fuel_efficiency_units'
|
|
15
|
+
integer 'volume'
|
|
13
16
|
end
|
|
14
17
|
end
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
AutomobileMakeModel.class_eval do
|
|
2
2
|
data_miner do
|
|
3
3
|
process "Start from scratch" do
|
|
4
|
-
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
schema Earth.database_options do
|
|
8
|
-
string 'name' # make + model
|
|
9
|
-
string 'make_name'
|
|
10
|
-
string 'model_name' # model only
|
|
11
|
-
float 'fuel_efficiency_city'
|
|
12
|
-
string 'fuel_efficiency_city_units'
|
|
13
|
-
float 'fuel_efficiency_highway'
|
|
14
|
-
string 'fuel_efficiency_highway_units'
|
|
4
|
+
delete_all
|
|
15
5
|
end
|
|
16
6
|
|
|
17
7
|
process "Ensure AutomobileMakeModelYearVariant is populated" do
|
|
@@ -3,12 +3,14 @@ class AutomobileMakeModel < ActiveRecord::Base
|
|
|
3
3
|
|
|
4
4
|
belongs_to :make, :class_name => 'AutomobileMake', :foreign_key => 'make_name'
|
|
5
5
|
has_many :make_model_year_variants, :class_name => 'AutomobileMakeModelYearVariant', :foreign_key => 'make_model_name'
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
|
|
7
|
+
create_table do
|
|
8
|
+
string 'name' # make + model
|
|
9
|
+
string 'make_name'
|
|
10
|
+
string 'model_name' # model only
|
|
11
|
+
float 'fuel_efficiency_city'
|
|
12
|
+
string 'fuel_efficiency_city_units'
|
|
13
|
+
float 'fuel_efficiency_highway'
|
|
14
|
+
string 'fuel_efficiency_highway_units'
|
|
13
15
|
end
|
|
14
16
|
end
|
|
@@ -1,20 +1,7 @@
|
|
|
1
1
|
AutomobileMakeModelYear.class_eval do
|
|
2
2
|
data_miner do
|
|
3
3
|
process "Start from scratch" do
|
|
4
|
-
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
schema Earth.database_options do
|
|
8
|
-
string 'name' # make + model + year
|
|
9
|
-
string 'make_name'
|
|
10
|
-
string 'model_name'
|
|
11
|
-
string 'make_model_name'
|
|
12
|
-
integer 'year'
|
|
13
|
-
string 'make_year_name'
|
|
14
|
-
float 'fuel_efficiency_city'
|
|
15
|
-
string 'fuel_efficiency_city_units'
|
|
16
|
-
float 'fuel_efficiency_highway'
|
|
17
|
-
string 'fuel_efficiency_highway_units'
|
|
4
|
+
delete_all
|
|
18
5
|
end
|
|
19
6
|
|
|
20
7
|
process "Ensure AutomobileMakeModelYearVariant is populated" do
|
|
@@ -45,10 +32,10 @@ AutomobileMakeModelYear.class_eval do
|
|
|
45
32
|
end
|
|
46
33
|
end
|
|
47
34
|
|
|
48
|
-
verify "Year should be from 1985 to
|
|
35
|
+
verify "Year should be from 1985 to 2011" do
|
|
49
36
|
AutomobileMakeModelYear.all.each do |model_year|
|
|
50
|
-
unless model_year.year.to_i > 1984 and model_year.year.to_i <
|
|
51
|
-
raise "Invalid year for AutomobileMakeModelYear #{model_year.name}: #{model_year.year} (should be from 1985 to
|
|
37
|
+
unless model_year.year.to_i > 1984 and model_year.year.to_i < 2012
|
|
38
|
+
raise "Invalid year for AutomobileMakeModelYear #{model_year.name}: #{model_year.year} (should be from 1985 to 2011)"
|
|
52
39
|
end
|
|
53
40
|
end
|
|
54
41
|
end
|
|
@@ -4,11 +4,16 @@ class AutomobileMakeModelYear < ActiveRecord::Base
|
|
|
4
4
|
belongs_to :make_year, :class_name => 'AutomobileMakeYear', :foreign_key => 'make_year_name'
|
|
5
5
|
has_many :make_model_year_variants, :class_name => 'AutomobileMakeModelYearVariant', :foreign_key => 'make_model_year_name'
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
create_table do
|
|
8
|
+
string 'name' # make + model + year
|
|
9
|
+
string 'make_name'
|
|
10
|
+
string 'model_name'
|
|
11
|
+
string 'make_model_name'
|
|
12
|
+
integer 'year'
|
|
13
|
+
string 'make_year_name'
|
|
14
|
+
float 'fuel_efficiency_city'
|
|
15
|
+
string 'fuel_efficiency_city_units'
|
|
16
|
+
float 'fuel_efficiency_highway'
|
|
17
|
+
string 'fuel_efficiency_highway_units'
|
|
13
18
|
end
|
|
14
19
|
end
|