Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
AVA-Score-Plot

http://me2tor.blogspot.com/2017/05/ava.html

  • これは動かない
    • 試合データを添付していないため(mysqlのdumpやcsvなど
    • 実行当時とディレクトリ構成が変わっているため
  • 動かすときに必要だったもの
    • ruby 2.4
    • gnuplot
    • mysql (ActiveRecordの接続先)
  • ファイルの説明
    • 数字連番
      • *.rb データの加工や画像の出力をしたrubyスクリプト
      • *.png 出力された画像
    • Gemfile, Gemfile.lock
      • rubyが使うライブラリ(gem)の定義
      • bundlerが使う
    • erd.png
      • データベースの定義
  • 心残り
    • Jupyter Notebookで残そうとしたけど途中で力尽きた
require 'bundler'
Bundler.require
ActiveRecord::Base.establish_connection YAML.load_file 'config/database.yml'
class Match < ActiveRecord::Base
has_many :clan_results
has_many :player_results, through: :clan_results
OFFICIAL_RULE_ID = 3
ROUND_MISSION_ID = 1
DEMOLITION_MAP_IDS = [1,2,4,5,6,7,17,19,33,36,40,41,45,48,57,62,74]
ROUND = 7
CLAN_SIZE = 2
PLAYER_SIZE = 5
def valid_match?
return false unless rule_id == OFFICIAL_RULE_ID
return false unless mission_id == ROUND_MISSION_ID
return false unless map_id.in? DEMOLITION_MAP_IDS
return false unless clan_results.size == CLAN_SIZE
return false unless clan_results.map(&:score).max == ROUND
return false unless player_results.size == PLAYER_SIZE * CLAN_SIZE
return false unless player_results.group_by(&:clan_result_id).select {|_, x| x.size == PLAYER_SIZE}.size == CLAN_SIZE
true
end
end
class ClanResult < ActiveRecord::Base
has_many :player_results
end
class PlayerResult < ActiveRecord::Base
end
open "data/#{File.basename __FILE__, '.rb'}.csv", ?w do |f|
Match.preload(:player_results).find_each do |match|
next unless match.date.year.in? 2011..2016
f.puts [match.id, match.valid_match?].join ?,
end
end
require 'bundler'
Bundler.require
ActiveRecord::Base.establish_connection YAML.load_file 'config/database.yml'
class Match < ActiveRecord::Base
end
open 'data/match_id.csv', ?r do |input|
def input.lazy_each_slice &block
lines = []
while line = gets
lines << line.chomp
next if lines.size < 1_000
yield lines
lines.clear
end
yield lines
end
open 'data/match_time.csv', ?w do |output|
def output.puts_time match_ids
Match.select(:id, :date).where(id: match_ids).each do |i|
puts [i.id, i.date.year, i.date.month, i.date.wday, i.date.hour].join ?,
end
end
output.puts 'match_id,year,month,weekday,hour'
input.lazy_each_slice do |lines|
output.puts_time lines.map &:to_i
end
end
end
require 'bundler'
Bundler.require
module CountBy
# can not use `group_by` on large data
def count_by &block
Hash.new {|h,k| h[k] = 0}.tap do |h|
each do |i|
k = yield i
h[k] += 1
end
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call(self)
map {|i| yield i, memo}
end
end
class MatchTimeIO
include Enumerable
Row = Struct.new :match_id, :year, :month, :weekday, :hour
def each &block
open 'data/match_time.csv', ?r do |f|
f.gets # ignore header
while f.gets
row = Row.new *$_.chomp.split(?,).map(&:to_i)
yield row
end
end
end
end
table = MatchTimeIO.new
.extend(CountBy)
.count_by(&:hour)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
File.write "data/#{File.basename __FILE__, '.rb'}.csv",
table.sort_by(&:first)
.map {|k,v| [k, v.round(2)].join ?,}
.unshift('hour,percent')
.join(?\n)
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}.png")
p.title '時間帯別試合数比'
p.xlabel '時間帯'
p.ylabel '試合数比(%)'
p.set 'yr[0:25]'
p.set 'xrange[-0.5:23.5]'
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'boxes'
d.using = '0:2:xtic(1)'
end
end
end
require 'bundler'
Bundler.require
module CountBy
# can not use `group_by` on large data
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class MatchTimeIO
include Enumerable
Row = Struct.new :match_id, :year, :month, :weekday, :hour
def each &block
open 'data/match_time.csv', ?r do |f|
f.gets # ignore header
while f.gets
row = Row.new *$_.chomp.split(?,).map(&:to_i)
yield row
end
end
end
end
table = MatchTimeIO.new
.extend(CountBy)
.count_by(&:weekday)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
File.write "data/#{File.basename __FILE__, '.rb'}.csv",
table.sort_by(&:first)
.map {|k,v| [k, v.round(2)].join ?,}
.unshift('weekday,percent')
.join(?\n)
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}.png")
p.title '曜日別試合数比'
p.xlabel '曜日'
p.ylabel '試合数比(%)'
p.set 'yr[0:25]'
p.set "xtics ('日' 0, '月' 1, '火' 2, '水' 3, '木' 4, '金' 5, '土' 6)"
p.set 'xr[-0.5:6.5]'
x = [*0..6]
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'boxes'
end
end
end
require 'bundler'
Bundler.require
module CountBy
# can not use `group_by` on large data
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class MatchTimeIO
include Enumerable
Row = Struct.new :match_id, :year, :month, :weekday, :hour
def each &block
open 'data/match_time.csv', ?r do |f|
f.gets # ignore header
while f.gets
row = Row.new *$_.chomp.split(?,).map(&:to_i)
yield row
end
end
end
end
Key = Struct.new :weekday, :hour do
def weekday_name
%w(日 月 火 水 木 金 土)[weekday]
end
def name
"#{weekday_name}#{hour}"
end
end
table = MatchTimeIO.new
.extend(CountBy)
.count_by {|x| Key.new x.weekday, x.hour}
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
File.write "data/#{File.basename __FILE__, '.rb'}.csv",
table.sort_by(&:last)
.reverse
.map {|k,v| [k.name, v].join ?,}
.unshift('weekday-hour,percent')
.join(?\n)
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png size 4000,600 font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}.png")
p.title '曜日時間帯別試合数比'
p.xlabel '曜日x時間帯'
p.ylabel '試合数比(%)'
series = table
.select {|k, v| v > 0.1}
.sort_by {|k, v| -v}
p.set 'yr[0:3.25]'
p.set 'ytics 0.25'
tics = series.map(&:first).map.with_index {|k,i| "'#{k.name}' #{i}"}.join ?,
p.set "xtics (#{tics})"
p.set "xr[-0.5:#{series.size + 0.5}]"
y = series.map(&:last).map {|x| x.round 2}
x = [*0..series.size]
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'boxes'
end
end
end
require 'bundler'
Bundler.require
module CountBy
# can not use `group_by` on large data
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class MatchTimeIO
include Enumerable
Row = Struct.new :match_id, :year, :month, :weekday, :hour
def each &block
open 'data/match_time.csv', ?r do |f|
f.gets # ignore header
while f.gets
row = Row.new *$_.chomp.split(?,).map(&:to_i)
yield row
end
end
end
end
SEASONS = [*2011..2016]
HOURS = [0,1,2,3,20,21,22,23]
seasons = SEASONS.map do |season|
table = MatchTimeIO.new
.select {|x| x.year == season && x.hour.in?(HOURS)}
.extend(CountBy)
.count_by(&:hour)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
[season, table]
end.to_h
seasons.each do |season, table|
File.write "data/#{File.basename __FILE__, '.rb'}_#{season}.csv",
table.sort_by(&:last)
.reverse
.map {|k,v| [k, v].join ?,}
.unshift('hour,percent')
.join(?\n)
end
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}.png")
p.title '年度別時間帯別試合数比'
p.set 'yrange [0:100]'
p.set 'ylabel "時間帯別の試合数比(100%)"'
p.set 'xlabel "年度"'
p.unset 'ytics'
p.set 'grid y'
p.set 'border 3'
p.set 'style data histograms'
p.set 'style histogram rowstacked'
p.set 'style fill solid border -1'
p.set 'boxwidth 0.75'
# memo
# outside : 凡例の位置をプロットの外に
# left top : 凡例の位置を図の左上に
# vertical Left : 凡例の並びを左縦書き方向に並べる
# reverse : 色を左に、名前を右に
# noenhanced : 拡張文字は使わない(default value?)
# nobox : 凡例の枠を表示しない
# autotitle : (使わない)入力データの列の先頭をタイトルにする
# columnhead : (使わない)先頭行をタイトルにする
p.set 'key outside left top vertical Left reverse nobox'
# memo
# invert : 凡例の並び順を逆に
# samplen : 凡例の横幅
# spacing : 凡例の高さ
# spacing : 凡例の高さ
# width : 凡例の全体枠の横幅
# height : 凡例の全体枠の縦幅
p.set 'key invert samplen 1 spacing 1 width 3 height 0 '
(SEASONS.size + 1).times do |i|
p.unset "paxis #{i + 1} tics"
end
xtics = SEASONS.map.with_index {|x, i| %("#{x}" #{i})}.join ?,
p.set "xtics (#{xtics})"
# {'season' => {'hour' => percent}} -> {'hour' => [percent]}
seasons
.sort_by(&:first)
.map {|_, table| table.sort_by &:first}
.flatten(1)
.reduce(Hash.new {|h,k| h[k] = []}) {|prev, (hour, percent)| prev[hour].push(percent) && prev}
.sort_by {|hour, _| hour < 4 ? hour + 24 : hour}
.each do |hour, percent_list|
p.data << Gnuplot::DataSet.new(percent_list) do |d|
d.title = "#{hour}"
end
end
end
end
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class MatchIO
include Enumerable
COLUMNS = %i(match_id map_id date winner loser
winner_1_score winner_2_score winner_3_score winner_4_score winner_5_score
winner_1_death winner_2_death winner_3_death winner_4_death winner_5_death
loser_1_score loser_2_score loser_3_score loser_4_score loser_5_score
loser_1_death loser_2_death loser_3_death loser_4_death loser_5_death
)
Row = Struct.new *COLUMNS
def each &block
open 'data/match_score.csv', ?r do |f|
f.gets # ignore header
while f.gets
typed_cells = $_.chomp.split(?,).map.with_index do |cell, i|
case COLUMNS[i]
when :date then Time.parse cell
when :match_id, :map_id, :winner, :loser then Integer cell
else; Rational cell
end
end
yield Row.new *typed_cells
end
end
end
end
table = MatchIO.new
.extend(CountBy)
.count_by(&:loser)
.reject {|round, count| round == 7}
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
File.write "data/#{File.basename __FILE__, '.rb'}.csv",
table.sort_by(&:first)
.reverse
.map {|k,v| [k, v].join ?,}
.unshift('round,percent')
.join(?\n)
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}.png")
p.title 'ラウンド数分布'
p.set 'yrange [0:21]'
p.set 'xrange [-0.5:6.5]'
p.ylabel '出現率(%)'
p.xlabel 'ラウンド'
p.set 'style fill solid border -1'
p.set 'boxwidth 1'
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.notitle
d.with = 'boxes'
end
end
end
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class MatchIO
include Enumerable
COLUMNS = %i(match_id map_id date winner loser
winner_1_score winner_2_score winner_3_score winner_4_score winner_5_score
winner_1_death winner_2_death winner_3_death winner_4_death winner_5_death
loser_1_score loser_2_score loser_3_score loser_4_score loser_5_score
loser_1_death loser_2_death loser_3_death loser_4_death loser_5_death
)
Row = Struct.new *COLUMNS do
def winner_total_death
[winner_1_death, winner_2_death, winner_3_death, winner_4_death, winner_5_death].sum.to_i
end
end
def each &block
open 'data/match_score.csv', ?r do |f|
f.gets # ignore header
while f.gets
typed_cells = $_.chomp.split(?,).map.with_index do |cell, i|
case COLUMNS[i]
when :date then Time.parse cell
when :match_id, :map_id, :winner, :loser then Integer cell
else; Rational cell
end
end
yield Row.new *typed_cells
end
end
end
end
table = MatchIO.new
.extend(CountBy)
.count_by(&:winner_total_death)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
File.write "data/#{File.basename __FILE__, '.rb'}.csv",
table.sort_by(&:first)
.reverse
.map {|k,v| [k, v.round(3)].join ?,}
.unshift('total_death,percent')
.join(?\n)
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}.png")
p.title 'デス数分布'
p.set 'yrange [0:3.5]'
p.set 'xrange [-0.5:62.5]'
p.ylabel '出現率(%)'
p.xlabel 'デス数'
p.set 'style fill solid border -1'
p.set 'boxwidth 1'
x = table.keys.sort
y = x.map(&table.method(:fetch)).map {|i| i.round 3}
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.notitle
d.with = 'boxes'
end
end
end
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class MatchIO
include Enumerable
COLUMNS = %i(match_id map_id date winner loser
winner_1_score winner_2_score winner_3_score winner_4_score winner_5_score
winner_1_death winner_2_death winner_3_death winner_4_death winner_5_death
loser_1_score loser_2_score loser_3_score loser_4_score loser_5_score
loser_1_death loser_2_death loser_3_death loser_4_death loser_5_death
)
Team = Struct.new :round, *%w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
AT_ASSIST_SISTEM = Time.parse '2015-01-19 11:00:00 UTC'
Row = Struct.new *COLUMNS do
def teams
%w(winner loser).map do |side|
round = send side
scores = %w(score death)
.map {|indicator| (1..5).map {|i| "#{side}_#{i}_#{indicator}"}}
.flatten
.map(&method(:send))
.map(&:ceil)
Team.new round, *scores
end
end
def after_assist_system?
date > AT_ASSIST_SISTEM
end
end
def each &block
open 'data/match_score.csv', ?r do |f|
f.gets # ignore header
while f.gets
typed_cells = $_.chomp.split(?,).map.with_index do |cell, i|
case COLUMNS[i]
when :date then Time.parse cell
when :match_id, :map_id, :winner, :loser then Integer cell
else; Rational cell
end
end
yield Row.new *typed_cells
end
end
end
end
open 'data/match_score_after_assist.csv', ?w do |f|
f.puts MatchIO::Team.members.join ?,
MatchIO.new.each do |row|
next unless row.after_assist_system?
row.teams.each do |team|
f.puts team.values.join ?,
end
end
end
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
teams = TeamIO.new.map &:itself
# plot
dump = TeamIO::SCORES.reduce({}) do |prev, indicator|
table = teams
.extend(CountBy)
.count_by(&indicator)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_#{indicator}.png")
prefix, suffix = indicator.to_s.split ?_
name =
case prefix
when 'score' then 'スコア'
when 'death' then 'デス'
end
rank = "#{suffix.to_i}"
p.title "#{rank}#{name}の分布"
p.set 'yrange [0:25]'
p.set "xrange [-0.5:#{prefix == 'score' ? 25 : 13}.5]"
p.ylabel '出現率(%)'
p.xlabel name
p.set 'style fill solid border -1'
p.set 'boxwidth 1'
x = table.keys.sort
y = x.map(&table.method(:fetch)).map {|i| i.round 3}
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.notitle
d.with = 'boxes'
end
end
end
prev[indicator] = table
prev
end
# dump data
File.write "data/#{File.basename __FILE__, '.rb'}.yml", dump.to_yaml
# join png
# Require imagemagic
%w(score death).each do |side|
out = "data/#{File.basename __FILE__, '.rb'}_#{side}.png"
files = TeamIO::SCORES.select {|x| /#{side}/ =~ x.to_s}.map do |indicator|
"data/#{File.basename __FILE__, '.rb'}_#{indicator}.png"
end
`convert +append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
end
out = "data/#{File.basename __FILE__, '.rb'}.png"
files = %w(score death).map {|side| "data/#{File.basename __FILE__, '.rb'}_#{side}.png"}
`convert -append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
table = TeamIO.new
.reject {|x| x.round == 7}
.extend(CountBy)
.count_by(&:round)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
File.write "data/#{File.basename __FILE__, '.rb'}.csv",
table.sort_by(&:first)
.reverse
.map {|k,v| [k, v].join ?,}
.unshift('round,percent')
.join(?\n)
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png font "azukifontP"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}.png")
p.title 'ラウンド数分布'
p.set 'yrange [0:21]'
p.set 'xrange [-0.5:6.5]'
p.ylabel '出現率(%)'
p.xlabel 'ラウンド'
p.set 'style fill solid border -1'
p.set 'boxwidth 1'
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.notitle
d.with = 'boxes'
end
end
end
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def total_score
[score_1, score_2, score_3, score_4, score_5].sum
end
def total_death
[death_1, death_2, death_3, death_4, death_5].sum
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
teams = TeamIO.new.map &:itself
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "azukifontP"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_score.png")
p.title 'チーム合計スコア分布'
p.set 'yrange [0:5]'
p.set 'xrange [-0.5:90]'
p.ylabel '出現率(%)'
p.xlabel 'スコア'
p.set 'style fill transparent solid 0.75 noborder'
p.set 'boxwidth 1'
# winner
table = teams
.select {|x| x.round == 7}
.extend(CountBy)
.count_by(&:total_score)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '勝利チーム'
d.with = 'boxes'
end
# loser
table = teams
.reject {|x| x.round == 7}
.extend(CountBy)
.count_by(&:total_score)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '敗北チーム'
d.with = 'boxes'
end
end
end
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "azukifontP"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_death.png")
p.title 'チーム合計デス分布'
# p.set 'yrange [0:5]'
# p.set 'xrange [-0.5:90]'
p.ylabel '出現率(%)'
p.xlabel 'デス'
p.set 'style fill transparent solid 0.75 noborder'
p.set 'boxwidth 1'
# winner
table = teams
.select {|x| x.round == 7}
.extend(CountBy)
.count_by(&:total_death)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '勝利チーム'
d.with = 'boxes'
end
# loser
table = teams
.reject {|x| x.round == 7}
.extend(CountBy)
.count_by(&:total_death)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
puts table
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '敗北チーム'
d.with = 'boxes'
end
end
end
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def win?
round == 7
end
def total_score
[score_1, score_2, score_3, score_4, score_5].sum
end
def total_death
[death_1, death_2, death_3, death_4, death_5].sum
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
scores = Hash.new {|h,k| h[k] = [0,0]}
deaths = Hash.new {|h,k| h[k] = [0,0]}
TeamIO.new.each do |team|
i = team.win? ? 0 : 1
scores[team.total_score][i] += 1
deaths[team.total_death][i] += 1
end
[
[scores, 'score'],
[deaths, 'death'],
].each do |table, indicator|
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "azukifontP"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_#{indicator}.png")
name = indicator == 'score' ? 'スコア' : 'デス'
p.title "合計#{name}別の勝率"
p.xlabel "合計#{name}"
p.ylabel '勝率(%)'
p.set 'yr[0:100]'
if indicator == 'score'
p.set 'xrange[30:90]'
else
p.set 'xrange[35:60]'
end
p.set 'xtics 5'
p.set 'mxtics 1'
p.set 'ytics 10'
p.set 'mytics 5'
x = table.keys.sort
y = x.map(&table.method(:fetch))
.map {|win, lose| (win * 100) / (win + lose).to_f }
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'linespoints'
end
end
end
end
File.write "data/#{File.basename __FILE__, '.rb'}.yml", [scores, deaths].to_yaml
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
module Stats
def mean
sum.to_f / size
end
def var
m = mean
map {|x| (x - m) ** 2}.sum / size
end
def sd
Math.sqrt var
end
end
module MRound
refine Numeric do
def m_round n
x = n * div(n)
return x if self == x
return [x, x + n].max_by(&:abs) if self + self == x + x + n
[x, x + n].min_by {|i| (i - self).abs}
end
end
end
using MRound
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def win?
round == 7
end
def sd_score
[score_1, score_2, score_3, score_4, score_5].extend(Stats).sd.m_round(0.25)
end
def sd_death
[death_1, death_2, death_3, death_4, death_5].extend(Stats).sd.m_round(0.25)
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
teams = TeamIO.new.map &:itself
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_score.png")
p.title 'スコア標準偏差の分布'
p.ylabel '出現率(%)'
p.xlabel 'スコア標準偏差'
p.set 'style fill transparent solid 0.75 noborder'
p.set 'xrange [0:10]'
# winner
table = teams
.select(&:win?)
.extend(CountBy)
.count_by(&:sd_score)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '勝利チーム'
d.with = 'boxes'
end
# loser
table = teams
.reject(&:win?)
.extend(CountBy)
.count_by(&:sd_score)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '敗北チーム'
d.with = 'boxes'
end
end
end
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_death.png")
p.title 'デス標準偏差の分布'
p.ylabel '出現率(%)'
p.xlabel 'デス標準偏差'
p.set 'style fill transparent solid 0.75 noborder'
p.set 'xrange [0:4]'
# winner
table = teams
.select(&:win?)
.extend(CountBy)
.count_by(&:sd_death)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '勝利チーム'
d.with = 'boxes'
end
# loser
table = teams
.reject(&:win?)
.extend(CountBy)
.count_by(&:sd_death)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '敗北チーム'
d.with = 'boxes'
end
end
end
# join png
# Require imagemagic
out = "data/#{File.basename __FILE__, '.rb'}.png"
files = ['score', 'death'].map do |i|
"data/#{File.basename __FILE__, '.rb'}_#{i}.png"
end
`convert +append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
module Stats
def mean
sum.to_f / size
end
def var
m = mean
map {|x| (x - m) ** 2}.sum / size
end
def sd
Math.sqrt var
end
end
module MRound
refine Numeric do
def m_round n
x = n * div(n)
return x if self == x
return [x, x + n].max_by(&:abs) if self + self == x + x + n
[x, x + n].min_by {|i| (i - self).abs}
end
end
end
using MRound
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def win?
round == 7
end
def sd_score
[score_1, score_2, score_3, score_4, score_5].extend(Stats).sd.m_round(0.25)
end
def sd_death
[death_1, death_2, death_3, death_4, death_5].extend(Stats).sd.m_round(0.25)
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
scores = Hash.new {|h,k| h[k] = [0,0]}
deaths = Hash.new {|h,k| h[k] = [0,0]}
TeamIO.new.each do |team|
i = team.win? ? 0 : 1
scores[team.sd_score][i] += 1
deaths[team.sd_death][i] += 1
end
[
[scores, 'score'],
[deaths, 'death'],
].each do |table, indicator|
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_#{indicator}.png")
name = indicator == 'score' ? 'スコア' : 'デス'
p.title "#{name}標準偏差毎の勝率"
p.xlabel "#{name}標準偏差"
p.ylabel '勝率(%)'
p.set 'yr[0:100]'
if indicator == 'score'
p.set 'xrange[0:10]'
else
p.set 'xrange[0:4]'
end
x = table.keys.sort
y = x.map(&table.method(:fetch))
.map {|win, lose| (win * 100) / (win + lose).to_f }
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'linespoints'
end
end
end
end
# join png
# Require imagemagic
out = "data/#{File.basename __FILE__, '.rb'}.png"
files = ['score', 'death'].map do |i|
"data/#{File.basename __FILE__, '.rb'}_#{i}.png"
end
`convert +append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
File.write "data/#{File.basename __FILE__, '.rb'}.yml", [scores, deaths].to_yaml
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
module MRound
refine Numeric do
def m_round n
x = n * div(n)
return x if self == x
return [x, x + n].max_by(&:abs) if self + self == x + x + n
[x, x + n].min_by {|i| (i - self).abs}
end
end
end
using MRound
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def win?
round == 7
end
def total_score
[score_1, score_2, score_3, score_4, score_5].sum
end
def top1_rate
return 100 if total_score == 0
(score_1 * 100 / total_score).to_i
end
def top2_rate
return 100 if total_score == 0
((score_1 + score_2) * 100 / total_score).to_i
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
teams = TeamIO.new.map &:itself
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_top1_rate.png")
p.title '(1位のスコア/チームスコア)%の分布'
p.ylabel '出現率(%)'
p.xlabel '(1位のスコア/チームスコア)%'
p.set 'style fill transparent solid 0.75 noborder'
p.set 'xrange [0:100]'
# winner
table = teams
.select(&:win?)
.extend(CountBy)
.count_by(&:top1_rate)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '勝利チーム'
d.with = 'boxes'
end
# loser
table = teams
.reject(&:win?)
.extend(CountBy)
.count_by(&:top1_rate)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '敗北チーム'
d.with = 'boxes'
end
end
end
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_top2_rate.png")
p.title '(1位+2位のスコア/チームスコア)%の分布'
p.ylabel '出現率(%)'
p.xlabel '(1位+2位のスコア/チームスコア)%'
p.set 'style fill transparent solid 0.75 noborder'
p.set 'xrange [0:100]'
# winner
table = teams
.select(&:win?)
.extend(CountBy)
.count_by(&:top2_rate)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '勝利チーム'
d.with = 'boxes'
end
# loser
table = teams
.reject(&:win?)
.extend(CountBy)
.count_by(&:top2_rate)
.extend(MapWith)
.map_with(->(x){x.values.sum}) {|(k, v), total| [k, v * 100 / total.to_f]}
.to_h
x = table.keys.sort
y = x.map &table.method(:fetch)
p.data << Gnuplot::DataSet.new([x,y]) do |d|
d.title = '敗北チーム'
d.with = 'boxes'
end
end
end
out = "data/#{File.basename __FILE__, '.rb'}.png"
files = ['top1_rate', 'top2_rate'].map do |rank|
"data/#{File.basename __FILE__, '.rb'}_#{rank}.png"
end
`convert +append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
module Stats
def mean
sum.to_f / size
end
def var
m = mean
map {|x| (x - m) ** 2}.sum / size
end
def sd
Math.sqrt var
end
end
module MRound
refine Numeric do
def m_round n
x = n * div(n)
return x if self == x
return [x, x + n].max_by(&:abs) if self + self == x + x + n
[x, x + n].min_by {|i| (i - self).abs}
end
end
end
using MRound
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def win?
round == 7
end
def total_score
[score_1, score_2, score_3, score_4, score_5].sum
end
def top1_rate
return 100 if total_score == 0
(score_1 * 100 / total_score).to_i
end
def top2_rate
return 100 if total_score == 0
((score_1 + score_2) * 100 / total_score).to_i
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
top1 = Hash.new {|h,k| h[k] = [0,0]}
top2 = Hash.new {|h,k| h[k] = [0,0]}
TeamIO.new.each do |team|
i = team.win? ? 0 : 1
top1[team.top1_rate][i] += 1
top2[team.top2_rate][i] += 1
end
[
[top1, 'top1'],
[top2, 'top2'],
].each do |table, indicator|
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_#{indicator}.png")
name = indicator == 'top1' ? '1位' : '1位+2位'
p.title "(#{name}のスコア/チームスコア)%毎の勝率"
p.xlabel "(#{name}のスコア/チームスコア)%"
p.ylabel '勝率(%)'
p.set 'yr[0:100]'
if indicator == 'score'
# p.set 'xrange[0:10]'
else
# p.set 'xrange[0:4]'
end
# p.set 'xtics 5'
# p.set 'mxtics 1'
# p.set 'ytics 10'
# p.set 'mytics 5'
x = table.keys.sort
y = x.map(&table.method(:fetch))
.map {|win, lose| (win * 100) / (win + lose).to_f }
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'linespoints'
end
end
end
end
# join png
# Require imagemagic
out = "data/#{File.basename __FILE__, '.rb'}.png"
files = ['top1', 'top2'].map do |rank|
"data/#{File.basename __FILE__, '.rb'}_#{rank}.png"
end
`convert +append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
File.write "data/#{File.basename __FILE__, '.rb'}.yml", [top1, top2].to_yaml
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
module Stats
def mean
sum.to_f / size
end
def var
m = mean
map {|x| (x - m) ** 2}.sum / size
end
def sd
Math.sqrt var
end
end
module MRound
refine Numeric do
def m_round n
x = n * div(n)
return x if self == x
return [x, x + n].max_by(&:abs) if self + self == x + x + n
[x, x + n].min_by {|i| (i - self).abs}
end
end
end
using MRound
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def win?
round == 7
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
scores = [*1..5].map do
Hash.new {|h,k| h[k] = [0,0]}
end
TeamIO.new.each do |team|
i = team.win? ? 0 : 1
scores.each.with_index(1) do |score, rank|
score[team.send("score_#{rank}")][i] += 1
end
end
scores.each.with_index(1) do |table, rank|
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_#{rank}.png")
p.title "#{rank}位のスコア毎の勝率"
p.xlabel "#{rank}位のスコア"
p.ylabel '勝率(%)'
p.set 'yr[0:100]'
x = table.keys.sort
y = x.map(&table.method(:fetch))
.map {|win, lose| (win * 100) / (win + lose).to_f }
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'linespoints'
end
end
end
end
# join png
# Require imagemagic
out = "data/#{File.basename __FILE__, '.rb'}.png"
files = [1,2,3,4,5].map do |rank|
"data/#{File.basename __FILE__, '.rb'}_#{rank}.png"
end
`convert +append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
File.write "data/#{File.basename __FILE__, '.rb'}.yml", scores.to_yaml
require 'bundler'
Bundler.require
module CountBy
def count_by &block
reduce(Hash.new {|h,k| h[k] = 0}) do |prev, i|
key = yield i
prev[key] += 1
prev
end
end
end
module MapWith
def map_with with, &block
memo = with.to_proc.call self
map {|i| yield i, memo}
end
end
module Stats
def mean
sum.to_f / size
end
def var
m = mean
map {|x| (x - m) ** 2}.sum / size
end
def sd
Math.sqrt var
end
end
class TeamIO
include Enumerable
SCORES = %w(score death).map {|indicator| (1..5).map {|i| :"#{indicator}_#{i}"}}.flatten
Team = Struct.new :round, *SCORES do
def win?
round == 7
end
def total_score
[score_1, score_2, score_3, score_4, score_5].sum
end
end
def each &block
open 'data/match_score_after_assist.csv', ?r do |f|
f.gets # ignore header
while f.gets
yield Team.new *$_.chomp.split(?,).map(&:to_i)
end
end
end
end
scores_by_total_score = Hash.new do |h, k|
scores = [*1..5].map do
Hash.new {|h,k| h[k] = [0,0]}
end
h[k] = scores
end
TeamIO.new.each do |team|
total_score = team.total_score
next unless total_score.in? [50, 60, 70]
i = team.win? ? 0 : 1
scores_by_total_score[total_score].each.with_index(1) do |score, rank|
score[team.send("score_#{rank}")][i] += 1
end
end
scores_by_total_score.each do |total_score, scores|
scores.each.with_index(1) do |table, rank|
Gnuplot.open do |g|
Gnuplot::Plot.new g do |p|
p.set 'term png truecolor font "Mikachan"'
p.set %(out "data/#{File.basename __FILE__, '.rb'}_#{total_score}_#{rank}.png")
p.title "合計スコアが#{total_score}のときの#{rank}位のスコア毎の勝率"
p.xlabel "#{rank}位のスコア"
p.ylabel '勝率(%)'
p.set 'yr[0:100]'
x = table.keys.sort
y = x.map(&table.method(:fetch))
.map {|win, lose| (win * 100) / (win + lose).to_f }
p.data << Gnuplot::DataSet.new([x, y]) do |d|
d.notitle
d.with = 'linespoints'
end
end
end
end
end
File.write "data/#{File.basename __FILE__, '.rb'}.yml", scores_by_total_score.to_yaml
# join png
# Require imagemagic
[50, 60, 70].each do |total_score|
out = "data/#{File.basename __FILE__, '.rb'}_#{total_score}.png"
files = [1,2,3,4,5].map do |rank|
"data/#{File.basename __FILE__, '.rb'}_#{total_score}_#{rank}.png"
end
`convert +append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
end
out = "data/#{File.basename __FILE__, '.rb'}.png"
files = [50, 60, 70].map {|total_score| "data/#{File.basename __FILE__, '.rb'}_#{total_score}.png"}
`convert -append #{files.join(' ')} #{out}`
files.each &FileUtils.method(:rm)
# frozen_string_literal: true
source 'https://rubygems.org'
gem 'activerecord', require: ['active_record', 'active_support', 'active_support/core_ext']
gem 'mysql2'
gem 'gnuplot'
gem 'pry'
gem 'bundler', require: ['yaml', 'stringio', 'fileutils']
GEM
remote: https://rubygems.org/
specs:
activemodel (5.0.1)
activesupport (= 5.0.1)
activerecord (5.0.1)
activemodel (= 5.0.1)
activesupport (= 5.0.1)
arel (~> 7.0)
activesupport (5.0.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (~> 0.7)
minitest (~> 5.1)
tzinfo (~> 1.1)
arel (7.1.4)
coderay (1.1.1)
concurrent-ruby (1.0.4)
gnuplot (2.6.2)
i18n (0.8.0)
method_source (0.8.2)
minitest (5.10.1)
mysql2 (0.4.5)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
slop (3.6.0)
thread_safe (0.3.5)
tzinfo (1.2.2)
thread_safe (~> 0.1)
PLATFORMS
ruby
DEPENDENCIES
activerecord
bundler
gnuplot
mysql2
pry
BUNDLED WITH
1.14.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment