/
score.rb
53 lines (41 loc) · 1.05 KB
/
score.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# frozen_string_literal: true
# Calculate results from a Gender-Balance API data file
class GenderScore
# a single result from the CSV file
class Result
MIN_SELECTIONS = 5 # accept gender if at least this many votes
VOTE_THRESHOLD = 0.8 # and at least this ratio of votes were for it
attr_reader :row
def initialize(row)
@row = row
end
def uuid
row[:uuid]
end
def gender
return if total < MIN_SELECTIONS
%w(male female other).find { |g| percent(g) >= VOTE_THRESHOLD }
end
private
def total
row[:total].to_i - row[:skip].to_i
end
def percent(gender)
row[gender.to_sym].to_f / total.to_f
end
end
# Results for an entire CSV file (e.g. from the GenderBalance API)
def initialize(rawcsv)
@rawcsv = rawcsv
end
def results
csv.map do |r|
r.to_h.merge(gender: Result.new(r).gender)
end
end
private
attr_reader :rawcsv
def csv
@csv ||= CSV.parse(rawcsv, headers: true, converters: :numeric, header_converters: :symbol)
end
end