Skip to content

Instantly share code, notes, and snippets.

@jbodah
Created June 4, 2024 05:35
Show Gist options
  • Save jbodah/3c16d49807243526434389555023b646 to your computer and use it in GitHub Desktop.
Save jbodah/3c16d49807243526434389555023b646 to your computer and use it in GitHub Desktop.
[1] pry(#<Context>)> u = User.new(user_id: "disobedientlib")
=> #<BggTools::User:0x0000000106557fb0 @user_id="disobedientlib">
[2] pry(#<Context>)> u.owned.map(&:rating).select { |r| r.to_i > 0 }.flat_map { |r| r.item.mechanics.map { |m| [m, r.to_i]}}.group_by {|k,v|k}.select { |k,v| v.size > 4 }.map {|k,v| [k, v.map(&:last).mean.round(2), v.size]}.sort_by {|k,v,p| -v}.first(15)
=> [["Deck Construction", 8.67, 6],
["Simulation", 8.42, 12],
["Turn Order: Progressive", 8.36, 11],
["Card Play Conflict Resolution", 8.36, 14],
["Hexagon Grid", 8.33, 15],
["Campaign / Battle Card Driven", 8.3, 10],
["Tags", 8.29, 7],
["Player Elimination", 8.29, 7],
["Movement Points", 8.29, 7],
["Action Points", 8.27, 15],
["Scenario / Mission / Campaign Game", 8.24, 21],
["Closed Drafting", 8.22, 9],
["Multi-Use Cards", 8.2, 10],
["Increase Value of Unchosen Resources", 8.2, 5],
["Critical Hits and Failures", 8.2, 5]]
[3] pry(#<Context>)> u.owned.map(&:rating).select { |r| r.to_i > 0 }.flat_map { |r| r.item.mechanics.map { |m| [m, r.to_i]}}.group_by {|k,v|k}.select { |k,v| v.size > 4 }.map {|k,v| [k, v.map(&:last).mean.round(2), v.size]}.sort_by {|k,v,p| -v}.last(15)
=> [["Grid Coverage", 7.83, 6],
["Follow", 7.8, 5],
["Sudden Death Ending", 7.8, 5],
["Network and Route Building", 7.8, 5],
["Bingo", 7.78, 9],
["Layering", 7.67, 6],
["Narrative Choice / Paragraph", 7.67, 6],
["Set Collection", 7.67, 48],
["Re-rolling and Locking", 7.64, 11],
["Area Movement", 7.64, 11],
["Worker Placement with Dice Workers", 7.63, 8],
["Square Grid", 7.63, 8],
["Secret Unit Deployment", 7.6, 5],
["Auction/Bidding", 7.56, 9],
["Ladder Climbing", 7.2, 5]]
[4] pry(#<Context>)> u.owned.map(&:rating).select { |r| r.to_i > 0 }.flat_map { |r| r.item.categories.map { |m| [m, r.to_i]}}.group_by {|k,v|k}.select { |k,v| v.size > 4 }.map {|k,v| [k, v.map(&:last).mean.round(2), v.size]}.sort_by {|k,v,p| -v}.first(15)
=> [["World War II", 8.42, 12],
["Political", 8.4, 5],
["Movies / TV / Radio theme", 8.29, 7],
["Space Exploration", 8.25, 8],
["Industry / Manufacturing", 8.2, 5],
["Fighting", 8.17, 29],
["Wargame", 8.15, 20],
["Mythology", 8.14, 7],
["Adventure", 8.11, 35],
["Horror", 8.09, 11],
["Territory Building", 8.08, 13],
["Ancient", 8.07, 14],
["Miniatures", 8.06, 16],
["Science Fiction", 8.03, 31],
["Economic", 8.0, 19]]
[5] pry(#<Context>)> u.owned.map(&:rating).select { |r| r.to_i > 0 }.flat_map { |r| r.item.categories.map { |m| [m, r.to_i]}}.group_by {|k,v|k}.select { |k,v| v.size > 4 }.map {|k,v| [k, v.map(&:last).mean.round(2), v.size]}.sort_by {|k,v,p| -v}.last(15)
=> [["Civilization", 7.9, 10],
["Dice", 7.89, 37],
["Puzzle", 7.88, 8],
["Fantasy", 7.88, 59],
["Nautical", 7.87, 15],
["Novel-based", 7.86, 7],
["Animals", 7.84, 19],
["Deduction", 7.8, 5],
["Card Game", 7.74, 102],
["Zombies", 7.67, 6],
["Print & Play", 7.65, 17],
["Humor", 7.4, 5],
["Abstract Strategy", 7.17, 6],
["Party Game", 7.0, 6],
["Video Game Theme", 7.0, 5]]
[6] pry(#<Context>)> u.owned.map(&:rating).select { |r| r.to_i > 0 }.map(&:to_i).mean.round(2)
=> 7.84
[7] pry(#<Context>)> u.owned.select(&:played?).map { |n| n.plays.size }.mean
=> 2.4301075268817205
[8] pry(#<Context>)> u.rated.flat_map { |g| g.item.description.split.map { |word| [word.downcase.gsub(/[^\w\d]/, ''), g.rating.to_i] }.uniq }.group_by { |word, rating| word }.transform_values {|vs| [vs.map(&:last).mean.round(2), vs.size]}.select { |k, (a,b)| b > 5 }.sort_by { |k, (a,b)| -a }.first(20)
=> [["bosses", [8.29, 7]],
["playable", [8.17, 6]],
["harbor", [8.17, 6]],
["narrative", [8.14, 7]],
["hostile", [8.13, 8]],
["changing", [8.13, 8]],
["period", [8.1, 10]],
["swords", [8.09, 11]],
["behind", [8.0, 11]],
["depths", [8.0, 7]],
["interesting", [8.0, 7]],
["occurs", [8.0, 7]],
["eg", [8.0, 8]],
["targets", [8.0, 7]],
["rome", [8.0, 8]],
["alliance", [8.0, 6]],
["snow", [8.0, 6]],
["navigate", [8.0, 7]],
["shared", [8.0, 8]],
["normandy", [8.0, 6]]]
[9] pry(#<Context>)> u.owned.select(&:rated?).flat_map { |g| g.item.description.split.map { |word| [word.downcase.gsub(/[^\w\d]/, ''), g.rating.to_i] }.uniq }.group_by { |word, rating| word }.transform_values {|vs| [vs.map(&:last).mean.round(2), vs.size]}.select { |k, (a,b)| b > 2 }.sort_by { |k, (a,b)| -a }.first(20)
=> [["famous", [8.75, 4]],
["tackle", [8.75, 4]],
["monstrous", [8.67, 3]],
["manipulate", [8.67, 3]],
["unfolds", [8.67, 3]],
["becoming", [8.67, 3]],
["courage", [8.67, 3]],
["purchasing", [8.67, 3]],
["valor", [8.67, 3]],
["invites", [8.67, 3]],
["driven", [8.67, 3]],
["almost", [8.67, 3]],
["division", [8.67, 3]],
["desert", [8.67, 3]],
["streets", [8.67, 3]],
["broken", [8.67, 3]],
["currently", [8.67, 3]],
["surprises", [8.67, 3]],
["ai", [8.67, 3]],
["adapt", [8.67, 3]]]
[10] pry(#<Context>)> u.owned.select(&:rated?).map { |g| [g.rating.to_i, g.plays.size] }.group_by {|a,b| a}.map { |k,v| [k, v.map(&:last)] }.map {|k,v| [k, v.mean.round(2)]}.sort_by {|a,b| a}
=> [[5.0, 1.0], [6.0, 0.25], [7.0, 1.03], [8.0, 1.81], [9.0, 3.58]]
[11] pry(#<Context>)> u.owned.select(&:rated?).select(&:played?).map { |g| [g.rating.to_i, g.plays.size] }.group_by {|a,b| a}.map { |k,v| [k, v.map(&:last)] }.map {|k,v| [k, v.mean.round(2)]}.sort_by {|a,b| a}
=> [[5.0, 1.0], [6.0, 1.0], [7.0, 1.69], [8.0, 2.38], [9.0, 4.21]]
[12] pry(#<Context>)> u.rated.map { |g| [g.rating.to_i, g.plays.size] }.group_by {|a,b| a}.map { |k,v| [k, v.map(&:last)] }.map {|k,v| [k, v.mean.round(2)]}.sort_by {|a,b| a}
=> [[2.0, 0.0], [3.0, 0.25], [4.0, 0.14], [5.0, 0.03], [6.0, 0.11], [7.0, 0.69], [8.0, 1.59], [9.0, 3.5]]
[13] pry(#<Context>)> u.rated.select(&:played?).map { |g| [g.rating.to_i, g.plays.size] }.group_by {|a,b| a}.map { |k,v| [k, v.map(&:last)] }.map {|k,v| [k, v.mean.round(2)]}.sort_by {|a,b| a}
=> [[3.0, 1.0], [4.0, 1.0], [5.0, 1.0], [6.0, 1.0], [7.0, 1.67], [8.0, 2.32], [9.0, 4.1]]
[14] pry(#<Context>)> u.owned.sort_by { |g| g.item.rank }.map { |g| [g.rating.to_i, g.item.rank, g.item.name] }.group_by_and_repack { |a,b,c| [a, [b,c]] }.transform_values(&:last).sort_by(&:first).reverse
=> [[9.0, [11010, "Genshin Tarot: The Fan Made Genshin Impact Board Game"]],
[8.0, [13393, "Dungeon Date"]],
[7.0, [11460, "The Lucky Seven"]],
[6.0, [15768, "Bermuda Triangle"]],
[5.0, [16233, "Counter Warfare: The Surprisingly Strategic Party Royale"]],
[0.0, [20410, "APBA Soccer"]]]
[15] pry(#<Context>)> u.owned.sort_by { |g| -g.item.avg_rating }.map { |g| [g.rating.to_i, g.item.avg_rating, g.item.name] }.group_by_and_repack { |a,b,c| [a, [b,c]] }.transform_values(&:last).sort_by(&:first).reverse
=> [[9.0, [6.83594, "Incan Gold"]],
[8.0, [6.17382, "Unbroken"]],
[7.0, [5.63639, "Mastermind"]],
[6.0, [5.63135, "Bermuda Triangle"]],
[5.0, [7.20732, "Counter Warfare: The Surprisingly Strategic Party Royale"]],
[0.0, [5.14286, "Pestilence"]]]
[16] pry(#<Context>)> u.owned.sort_by { |g| -g.item.num_ratings }.map { |g| [g.rating.to_i, g.item.num_ratings, g.item.name] }.group_by_and_repack { |a,b,c| [a, [b,c]] }.transform_values(&:last).sort_by(&:first).reverse
=> [[9.0, [57, "Genshin Tarot: The Fan Made Genshin Impact Board Game"]],
[8.0, [3, "Tetralchemia"]],
[7.0, [7, "Scribbly Gum: Print at Home Edition"]],
[6.0, [755, "Beacon Patrol"]],
[5.0, [41, "Counter Warfare: The Surprisingly Strategic Party Royale"]],
[0.0, [1, "Outbreak on Hypatia"]]]
[17] pry(#<Context>)> u.owned.sort_by { |g| g.item.num_want - g.item.num_for_trade }.map { |g| [g.rating.to_i, g.item.num_want - g.item.num_for_trade, g.item.name] }.group_by_and_repack { |a,b,c| [a, [b,c]] }.transform_values(&:last).sort_by(&:first).reverse
=> [[9.0, [1166, "Terraforming Mars"]],
[8.0, [1357, "Heat: Pedal to the Metal"]],
[7.0, [534, "Clank! Legacy: Acquisitions Incorporated"]],
[6.0, [50, "Beacon Patrol"]],
[5.0, [-3, "Counter Warfare: The Surprisingly Strategic Party Royale"]],
[0.0, [709, "Ark Nova"]]]
[18] pry(#<Context>)> u.owned.sort_by { |g| - (g.item.num_want - g.item.num_for_trade) }.map { |g| [g.rating.to_i, - (g.item.num_want - g.item.num_for_trade), g.item.name] }.group_by_and_repack { |a,b,c| [a, [b,c]] }.transform_values(&:last).sort_by(&:first).reverse
=> [[9.0, [456, "Gloomhaven: Jaws of the Lion"]],
[8.0, [854, "A Game of Thrones: The Board Game (Second Edition)"]],
[7.0, [1434, "Dominion"]],
[6.0, [1430, "The Resistance"]],
[5.0, [3, "Counter Warfare: The Surprisingly Strategic Party Royale"]],
[0.0, [435, "Cry Havoc"]]]
[19] pry(#<Context>)> u.owned.flat_map { |g| g.item.families.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 1}.sort_by {|_, (m, c)| -m}.select { |k, _| k =~ /Country: / }
=> [["Country: Norway", [8.5, 2]],
["Country: Soviet Union", [8.5, 2]],
["Country: Italy", [8.33, 3]],
["Country: China", [8.0, 2]],
["Country: France", [5.44, 9]],
["Country: Great Britain", [5.33, 3]],
["Country: Greece", [5.33, 3]],
["Country: United Kingdom", [4.5, 2]],
["Country: Belgium", [4.5, 2]],
["Country: USA", [4.0, 6]],
["Country: Japan", [3.45, 11]],
["Country: Germany", [3.3, 10]],
["Country: Spain", [2.67, 3]],
["Country: England", [0.0, 2]]]
[20] pry(#<Context>)> u.rated.flat_map { |g| g.item.families.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 1}.sort_by {|_, (m, c)| -m}.select { |k, _| k =~ /Animals: / }
=> [["Animals: Owls", [8.0, 2]],
["Animals: Birds", [8.0, 3]],
["Animals: Eagles", [8.0, 2]],
["Animals: Squirrels", [8.0, 2]],
["Animals: Raccoons", [8.0, 2]],
["Animals: Rabbits", [8.0, 2]],
["Animals: Hedgehogs / Porcupines", [8.0, 2]],
["Animals: Foxes", [7.8, 5]],
["Animals: Cattle / Cows", [7.5, 2]],
["Animals: Fish / Fishes", [7.38, 8]],
["Animals: Mice", [7.33, 3]],
["Animals: Sheep", [7.0, 2]],
["Animals: Sharks", [7.0, 2]],
["Animals: Crabs", [7.0, 2]],
["Animals: Dogs", [7.0, 2]],
["Animals: Cats", [6.8, 5]],
["Animals: Insects", [6.5, 2]]]
[21] pry(#<Context>)> u.rated.flat_map { |g| g.item.families.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 2}.sort_by {|_, (m, c)| -m}.select { |k, _| k =~ /Country: / }
=> [["Country: Egypt", [8.0, 3]],
["Country: Soviet Union", [8.0, 3]],
["Country: Germany", [7.56, 9]],
["Country: Greece", [7.5, 4]],
["Country: Italy", [7.5, 6]],
["Country: France", [7.46, 13]],
["Country: USA", [7.18, 11]],
["Country: Japan", [7.1, 10]],
["Country: Portugal", [7.0, 3]],
["Country: China", [7.0, 4]],
["Country: England", [6.67, 3]]]
[22] pry(#<Context>)> u.rated.flat_map { |g| g.item.families.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 2}.sort_by {|_, (m, c)| -m}.select { |k, _| k =~ /Creatures: / }
=> [["Creatures: Goblins", [8.0, 5]],
["Creatures: Aliens / Extraterrestrials", [7.86, 7]],
["Creatures: Dragons", [7.45, 11]],
["Creatures: Monsters", [7.25, 20]],
["Creatures: Zombies", [7.0, 8]],
["Creatures: Fairies / Elves / Pixies", [6.33, 3]],
["Creatures: Werewolves", [5.67, 3]]]
[23] pry(#<Context>)> u.rated.flat_map { |g| g.item.families.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 4}.sort_by {|_, (m, c)| -m}.select { |k, _| k =~ /Series: / }
=> [["Series: Bookshelf (Gryphon Games)", [7.8, 5]]]
[24] pry(#<Context>)> u.rated.flat_map { |g| g.item.families.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 3}.sort_by {|_, (m, c)| -m}.select { |k, _| k =~ /Theme: / }
=> [["Theme: Under the Sea", [7.8, 5]],
["Theme: Vikings", [7.75, 4]],
["Theme: City", [7.75, 4]],
["Theme: Post-Apocalyptic", [7.65, 20]],
["Theme: Anthropomorphic Animals", [7.64, 11]],
["Theme: Construction", [7.5, 6]],
["Theme: Superheroes", [7.43, 7]],
["Theme: Nature", [7.4, 15]],
["Theme: Boss Battle", [7.33, 9]],
["Theme: Trees and Forests", [7.25, 4]],
["Theme: Gardening", [7.25, 4]],
["Theme: Art", [7.2, 5]],
["Theme: Colonial", [7.17, 6]],
["Theme: Pirates", [7.17, 6]],
["Theme: Anime / Manga", [7.14, 7]],
["Theme: Food / Cooking", [7.0, 8]],
["Theme: Chibis", [7.0, 4]],
["Theme: Witches", [7.0, 4]],
["Theme: Villainy", [6.86, 7]],
["Theme: Science", [6.83, 6]],
["Theme: Books / Libraries", [6.83, 6]],
["Theme: Retro", [6.5, 8]]]
[25] pry(#<Context>)> u.owned.flat_map { |g| g.item.families.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 1}.sort_by {|_, (m, c)| -c}.select { |k, _| k =~ /Theme: / }
=> [["Theme: Post-Apocalyptic", [6.06, 17]],
["Theme: Anthropomorphic Animals", [5.25, 12]],
["Theme: Nature", [4.91, 11]],
["Theme: Boss Battle", [5.67, 9]],
["Theme: Books / Libraries", [4.14, 7]],
["Theme: Food / Cooking", [6.33, 6]],
["Theme: Pirates", [4.8, 5]],
["Theme: Superheroes", [5.0, 5]],
["Theme: Anime / Manga", [5.0, 5]],
["Theme: Trees and Forests", [3.0, 5]],
["Theme: Retro", [1.75, 4]],
["Theme: Construction", [6.0, 4]],
["Theme: Survival", [4.0, 4]],
["Theme: Gardening", [5.5, 4]],
["Theme: Under the Sea", [6.0, 4]],
["Theme: Siege", [4.25, 4]],
["Theme: Flowers", [2.33, 3]],
["Theme: Tropical", [7.67, 3]],
["Theme: Villainy", [8.0, 3]],
["Theme: Tropical Islands", [5.33, 3]],
["Theme: Fishing / Angling", [5.33, 3]],
["Theme: Science", [5.67, 3]],
["Theme: Witches", [7.33, 3]],
["Theme: Love / Romance", [2.67, 3]],
["Theme: Colonial", [7.67, 3]],
["Theme: City", [8.0, 3]],
["Theme: Time Travel", [4.0, 2]],
["Theme: Zoos, Aquaria, Safari Parks", [0.0, 2]],
["Theme: Alchemy", [3.5, 2]],
["Theme: Art", [7.5, 2]],
["Theme: Submarines", [4.5, 2]],
["Theme: Vikings", [8.0, 2]],
["Video Game Theme: Bloodborne", [3.5, 2]],
["Theme: Circus", [4.0, 2]],
["Theme: Cacti and Succulents", [3.5, 2]],
["Theme: Archaeology / Paleontology", [8.5, 2]],
["Theme: Chibis", [8.0, 2]],
["Theme: Camping", [7.5, 2]]]
[26] pry(#<Context>)> u.rated.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 4}.sort_by {|_, (m, c)| -m}
=> [[2022, [7.97, 39]],
[2020, [7.71, 31]],
[2021, [7.65, 37]],
[2023, [7.59, 34]],
[2019, [7.3, 47]],
[2016, [7.06, 32]],
[2018, [7.04, 47]],
[2017, [7.02, 51]],
[2013, [6.88, 16]],
[2011, [6.8, 10]],
[2012, [6.77, 13]],
[2014, [6.35, 17]],
[2015, [6.25, 20]],
[2004, [6.2, 5]],
[2008, [5.0, 5]]]
[27] pry(#<Context>)> u.owned.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 3}.sort_by {|_, (m, c)| -m}
=> [[2017, [6.5, 24]],
[2018, [6.16, 25]],
[2016, [5.87, 15]],
[2020, [5.33, 33]],
[2015, [5.13, 8]],
[2019, [5.05, 41]],
[2011, [5.0, 5]],
[2014, [4.44, 9]],
[2022, [4.24, 70]],
[2023, [4.1, 62]],
[2021, [4.06, 51]],
[2012, [4.0, 4]],
[2024, [3.56, 9]],
[2013, [3.33, 12]]]
[28] pry(#<Context>)> u.owned.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 2}.sort_by {|_, (m, c)| -c}
=> [[2022, [4.24, 70]],
[2023, [4.1, 62]],
[2021, [4.06, 51]],
[2019, [5.05, 41]],
[2020, [5.33, 33]],
[2018, [6.16, 25]],
[2017, [6.5, 24]],
[2016, [5.87, 15]],
[2013, [3.33, 12]],
[2014, [4.44, 9]],
[2024, [3.56, 9]],
[2015, [5.13, 8]],
[2011, [5.0, 5]],
[2012, [4.0, 4]],
[1981, [0.0, 3]]]
[29] pry(#<Context>)> u.rated.select { |g| g.rating.to_i > 5 }.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 3}.sort_by {|_, (m, c)| -c}
=> [[2019, [7.4, 45]],
[2017, [7.31, 45]],
[2018, [7.23, 43]],
[2022, [7.97, 39]],
[2021, [7.65, 37]],
[2023, [7.78, 32]],
[2020, [7.71, 31]],
[2016, [7.31, 29]],
[2015, [7.0, 14]],
[2013, [7.31, 13]],
[2012, [6.77, 13]],
[2014, [7.18, 11]],
[2011, [7.0, 9]],
[2004, [6.75, 4]],
[2024, [8.0, 4]]]
[30] pry(#<Context>)> u.rated.select { |g| g.rating.to_i > 6 }.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 3}.sort_by {|_, (m, c)| -c}
=> [[2019, [7.54, 41]],
[2022, [7.97, 39]],
[2017, [7.59, 37]],
[2021, [7.74, 35]],
[2018, [7.56, 34]],
[2023, [7.84, 31]],
[2020, [7.77, 30]],
[2016, [7.58, 24]],
[2013, [7.55, 11]],
[2012, [7.25, 8]],
[2015, [7.75, 8]],
[2014, [7.86, 7]],
[2011, [7.8, 5]],
[2024, [8.0, 4]]]
[31] pry(#<Context>)> u.rated.select { |g| g.rating.to_i > 7 }.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 3}.sort_by {|_, (m, c)| -c}
=> [[2022, [8.19, 32]], [2021, [8.18, 22]], [2023, [8.18, 22]], [2019, [8.05, 21]], [2017, [8.1, 20]], [2020, [8.28, 18]], [2018, [8.12, 17]], [2016, [8.4, 10]], [2013, [8.0, 6]], [2014, [8.2, 5]], [2015, [8.2, 5]]]
[32] pry(#<Context>)> u.rated.select { |g| g.rating.to_i > 8 }.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 3}.sort_by {|_, (m, c)| -c}
=> [[2022, [9.0, 6]], [2020, [9.0, 5]], [2023, [9.0, 4]], [2021, [9.0, 4]], [2016, [9.0, 4]]]
[33] pry(#<Context>)> u.rated.select { |g| g.rating.to_i > 8 }.map { |g| [g.item.yearpublished, g.rating.to_i] }.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 2}.sort_by {|_, (m, c)| -c}
=> [[2022, [9.0, 6]], [2020, [9.0, 5]], [2023, [9.0, 4]], [2021, [9.0, 4]], [2016, [9.0, 4]]]
[34] pry(#<Context>)> u.rated.flat_map { |g| g.item.designers.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 5}.sort_by {|_, (m, c)| -m}.first(10)
=> [["David Thompson (I)", [8.38, 8]],
["Trevor Benjamin", [8.17, 6]],
["Jamey Stegmaier", [7.5, 6]],
["Bruno Cathala", [7.29, 7]],
["Ben Pinchback", [7.17, 6]],
["Matt Riddle", [7.17, 6]],
["(Uncredited)", [7.09, 11]],
["Eric M. Lang", [7.0, 7]],
["Antoine Bauza", [6.71, 7]]]
[35] pry(#<Context>)> u.rated.flat_map { |g| g.item.designers.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 5}.sort_by {|_, (m, c)| -c}.first(10)
=> [["(Uncredited)", [7.09, 11]],
["David Thompson (I)", [8.38, 8]],
["Eric M. Lang", [7.0, 7]],
["Antoine Bauza", [6.71, 7]],
["Bruno Cathala", [7.29, 7]],
["Ben Pinchback", [7.17, 6]],
["Matt Riddle", [7.17, 6]],
["Jamey Stegmaier", [7.5, 6]],
["Trevor Benjamin", [8.17, 6]]]
[36] pry(#<Context>)> u.owned.flat_map { |g| g.item.designers.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 2}.sort_by {|_, (m, c)| -m}.first(10)
=> [["Paul Dennen", [8.5, 4]],
["Jacob Fryxelius", [8.33, 3]],
["Stefan Feld", [8.33, 3]],
["Isaac Childres", [8.33, 3]],
["Geoff Engelstein", [8.25, 4]],
["Jamey Stegmaier", [8.0, 4]],
["Shem Phillips", [8.0, 3]],
["Jason Glover", [7.75, 4]],
["Steven Aramini", [7.25, 4]],
["Phil Walker-Harding", [7.25, 4]]]
[37] pry(#<Context>)> u.rated.flat_map { |g| g.item.publishers.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 5}.sort_by {|_, (m, c)| -m}.first(10)
=> [["Fox in the Box", [8.14, 7]],
["Giant Roc", [8.13, 8]],
["Don't Panic Games", [8.0, 6]],
["Dan Verssen Games (DVG)", [8.0, 7]],
["MeepleBR", [7.85, 13]],
["株式会社ケンビル (KenBill)", [7.83, 6]],
["Surfin' Meeple China", [7.82, 11]],
["YOKA Games", [7.78, 9]],
["Feuerland Spiele", [7.75, 12]],
["Lucrum Games", [7.75, 8]]]
[38] pry(#<Context>)> u.rated.flat_map { |g| g.item.publishers.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 5}.sort_by {|_, (m, c)| -m}.last(10)
=> [["Lifestyle Boardgames Ltd", [6.39, 23]],
["(Web published)", [6.36, 11]],
["Smart Ltd", [6.29, 7]],
["Bureau de Juegos", [6.22, 9]],
["uplay.it edizioni", [6.09, 11]],
["Enigma (Bergsala Enigma)", [6.0, 13]],
["Nordic Games GmbH", [5.83, 6]],
["Wargames Club Publishing", [5.71, 7]],
["Boardgame Space", [5.63, 8]],
["Buró", [5.5, 6]]]
[39] pry(#<Context>)> u.owned.flat_map { |g| g.item.publishers.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 5}.sort_by {|_, (m, c)| -m}.first(10)
=> [["Surfin' Meeple China", [8.33, 6]],
["Stronghold Games", [7.86, 7]],
["Lex Games", [7.71, 7]],
["Arclight Games", [7.58, 26]],
["CrowD Games", [7.36, 11]],
["Lord of Boards", [7.36, 11]],
["MIPL", [7.33, 15]],
["Renegade Game Studios", [7.31, 16]],
["Schwerkraft-Verlag", [7.14, 21]],
["Swan Panasia Co., Ltd.", [7.07, 14]]]
[40] pry(#<Context>)> u.owned.flat_map { |g| g.item.publishers.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 5}.sort_by {|_, (m, c)| -m}.last(10)
=> [["Parker Brothers", [3.83, 6]],
["AMIGO", [3.5, 8]],
["Pandasaurus Games", [3.5, 6]],
["(Web published)", [3.45, 11]],
["Zvezda", [3.43, 7]],
["Board Game Rookie", [3.43, 7]],
["Eagle-Gryphon Games", [3.1, 10]],
["GMT Games", [3.0, 6]],
["Fractal Juegos", [3.0, 7]],
["New Mill Industries", [1.33, 6]]]
[41] pry(#<Context>)> u.owned.flat_map { |g| g.item.artists.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 2}.sort_by {|_, (m, c)| -c}.first(10)
=> [["Beth Sobel", [5.57, 7]],
["Mihajlo Dimitrievski", [6.5, 6]],
["Dennis Lohausen", [6.33, 6]],
["Franz Vohwinkel", [3.67, 6]],
["Henning Ludvigsen", [4.8, 5]],
["別府さい (Sai Beppu)", [3.4, 5]],
["Lina Cossette", [8.0, 5]],
["Chris Quilliams", [5.5, 4]],
["Kwanchai Moriya", [3.75, 4]],
["Oliver Freudenreich", [3.5, 4]]]
[42] pry(#<Context>)> u.owned.flat_map { |g| g.item.artists.map { |f| [f, g.rating.to_i] }}.group_by_and_repack { |f, r| [f, r] }.transform_values { |rs| [rs.mean.round(2), rs.count] }.select { |_, (m, c)| c > 2}.sort_by {|_, (m, c)| -m}.first(10)
=> [["Nate Storm", [8.5, 4]],
["Anthony Cournoyer", [8.33, 3]],
["Raul Ramos", [8.33, 3]],
["Clay Brooks", [8.33, 3]],
["Damien Mammoliti", [8.25, 4]],
["Jason D. Kingsley", [8.0, 3]],
["Sam Phillips", [8.0, 3]],
["Claus Stephan", [8.0, 3]],
["Lina Cossette", [8.0, 5]],
["David Forest", [8.0, 3]]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment