Difference between revisions of "MAPREDUCE Elite"
Line 48: | Line 48: | ||
</div> | </div> | ||
− | <div class=q data-lang="mongo"> | + | <div class=q data-lang="mongo" data-switches='elite'> |
<p class="strong">What are the populations of the three main factions?</p> | <p class="strong">What are the populations of the three main factions?</p> | ||
<div class=hint title="Three main factions">["Alliance","Federation","Empire"]</div> | <div class=hint title="Three main factions">["Alliance","Federation","Empire"]</div> | ||
Line 59: | Line 59: | ||
==Harder Questions== | ==Harder Questions== | ||
− | <div class=q data-lang="mongo">How much Hydrogen Fuel is owned by stations in systems that are allied with the three main factions? Limit your query to the first 5000 stations. | + | <div class=q data-lang="mongo" data-switches='elite'>How much Hydrogen Fuel is owned by stations in systems that are allied with the three main factions? Limit your query to the first 5000 stations. |
<div class="hint" title="hint"> | <div class="hint" title="hint"> | ||
The amount of stations <b>and</b> the amount of listings aren't fixed, you'll need to <code>query</code> to ensure that they exist and find a way of iterating through them in your <code>map</code> stage. | The amount of stations <b>and</b> the amount of listings aren't fixed, you'll need to <code>query</code> to ensure that they exist and find a way of iterating through them in your <code>map</code> stage. | ||
Line 71: | Line 71: | ||
</div> | </div> | ||
− | <div class=q data-lang="mongo">A <code>power_control_faction</code> or <b>Power</b> is an individual or organisation who is in control of a system.<br/> | + | <div class=q data-lang="mongo" data-switches='elite'>A <code>power_control_faction</code> or <b>Power</b> is an individual or organisation who is in control of a system.<br/> |
These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do. | These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do. | ||
<div class="hint" title="Example"> At the time of writing <b>Zemina Torval</b> is allied with the <b>Empire</b> and controls <b>47</b> systems.<br/> | <div class="hint" title="Example"> At the time of writing <b>Zemina Torval</b> is allied with the <b>Empire</b> and controls <b>47</b> systems.<br/> | ||
Line 92: | Line 92: | ||
</div> | </div> | ||
− | <div class=q data-lang="mongo">Our dataset doesn't contain the allegiance of a power: | + | <div class=q data-lang="mongo" data-switches='elite'>Our dataset doesn't contain the allegiance of a power: |
<p class="strong">Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.</p> | <p class="strong">Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.</p> | ||
<div class="hint" title="Example"><code>Zemina Torval: Empire(39.0)</code></div> | <div class="hint" title="Example"><code>Zemina Torval: Empire(39.0)</code></div> |
Revision as of 15:14, 10 May 2017
Introducing the elite database **WORK IN PROGRESS
These questions will introduce the "elite" database, which contains data about the video game Elite Dangerous
from bson.code import Code
has been added to the setup so that you no longer need to include it in your answer.
There are two collections, commodities
and systems
. Inside systems
there is are nested documents called stations
A system has many stations, and a station has many trade listings
Keys used in this database.
commodities: _id, average_price, category, name systems: _id, allegiance, faction, government, name, population, primary_economy, security, state, stations, updated_at, x, y, z systems.stations: allegiance, distance_to_star, economies, export_commodities,has_blackmarket, has_commodities, has_rearm, has_repair, has_shipyard, has_outfitting, faction, government, listings, max_landing_pad, name, state, type, updated_at systems.stations.listings: buy_price, collected_at, demand, commodity, sell_price, supply, update_count
Read more about the structure here: Elite Document Structure
Questions
commodities
collection contains the name
and average_price
of each commodity.There are 99 unique commodities and 15 categories.
Find the average price of each category, round to the nearest whole number
db.commodities.findOne()
db.commodities.mapReduce(
function(){emit(this.category,this.average_price);}, function(k,v){return Math.round(Array.sum(v)/v.length);}, {out:{inline:1}}
)
allegiance
. There are three main factions: The Federation, The Empire, and The Alliance.Non-populated systems without stations do not have an allegiance, and should be ignored.
Show the amount of systems following each type of allegiance.
temp = db.systems.map_reduce( query={"allegiance": {"$ne":None}}, map=Code("function(){emit(this.allegiance, 1)}"), reduce=Code("""function(key,values){var total = 0;values.forEach(function(value){total += value;});return total;} """), out={"inline":1} );pp.pprint(temp['results'])
What are the populations of the three main factions?
temp = db.systems.map_reduce(query={"allegiance":{"$in":["Alliance","Empire","Federation"]}}, map=Code("function(){emit(this.allegiance,this.population)}"), reduce=Code("""function(key,values){var total = 0;values.forEach(function(value){total += value;});return total;} """), out={"inline":1} );pp.pprint(temp['results'])
Harder Questions
The amount of stations and the amount of listings aren't fixed, you'll need to query
to ensure that they exist and find a way of iterating through them in your map
stage.
temp = db.systems.map_reduce( limit=5000, query={"allegiance":{"$in":["Alliance","Empire","Federation"]},"stations.listings.commodity":"Hydrogen Fuel","stations.listings.supply":{"$exists":1}}, map=Code("""function(){ for(var i in this.stations) for(var j in this.stations[i].listings) emit(this.allegiance,this.stations[i].listings[j].supply) }"""), reduce=Code("""function(k,vs){var t = 0;vs.forEach(function(v){t += v});return t;} """), out={"inline":1} ); pp.pprint(temp['results']);
power_control_faction
or Power is an individual or organisation who is in control of a system.These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do.
{ '_id': 'Zemina Torval', 'value': { 'alliance': 0.0, 'anarchy': 0.0, 'empire': 39.0, 'federation': 3.0, 'independent': 5.0}}]
Show the allegiance of each of the power's systems
temp = db.systems.map_reduce(query={"power_control_faction":{"$exists":1}},map=Code("""function(){switch(this.allegiance){case "Alliance":emit(this.power_control_faction,{alliance:1,anarchy:0,empire:0,federation:0,independent:0});break;case "Anarchy":emit(this.power_control_faction,{alliance:0,anarchy:1,empire:0,federation:0,independent:0});break; case "Empire":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:1,federation:0,independent:0});break;case "Federation":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:1,independent:0});break;case "Independent":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:0,independent:1});break;}}"""),reduce=Code("""function(k,vs){var a=vs[0];for(var i=1;i<vs.length;i++){var b=vs[i];a.alliance+=b.alliance;a.anarchy+=b.anarchy;a.empire+=b.empire;a.federation+=b.federation;a.independent+=b.independent;}return a}"""),out={"inline":1}); pp.pprint(temp['results']);
Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.
Zemina Torval: Empire(39.0)
temp = db.systems.map_reduce(query={"power_control_faction":{"$exists":1}},map=Code("""function(){switch(this.allegiance){case "Alliance":emit(this.power_control_faction,{alliance:1,anarchy:0,empire:0,federation:0,independent:0});break;case "Anarchy":emit(this.power_control_faction,{alliance:0,anarchy:1,empire:0,federation:0,independent:0});break; case "Empire":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:1,federation:0,independent:0});break;case "Federation":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:1,independent:0});break;case "Independent":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:0,independent:1});break;}}"""),reduce=Code("""function(k,vs){var a=vs[0];for(var i=1;i<vs.length;i++){var b=vs[i];a.alliance+=b.alliance;a.anarchy+=b.anarchy;a.empire+=b.empire;a.federation+=b.federation;a.independent+=b.independent;}return a}"""),out={"inline":1}); for power in temp['results']:
max = 0; key = ""; #print(power['value']) for id in power['value']: if (power['value'][id] > max): max = power['value'][id] key = id print(power['_id']+": "+key+"("+str(max)+")")