Module: CrossTable

Defined in:
lib/cross_table.rb,
lib/cross_table/version.rb,
lib/cross_table/grouping.rb

Overview

cross tabulation (pivot table) utility

Defined Under Namespace

Modules: Grouping

Constant Summary collapse

VERSION =
'0.1.1'

Class Method Summary collapse

Class Method Details

.avgs_from(recs:, field:, group_rules:, y_keys:, x_keys:, ret_type: nil) ⇒ Object



28
29
30
31
32
# File 'lib/cross_table.rb', line 28

def avgs_from(recs:, field:, group_rules:, y_keys:, x_keys:, ret_type: nil)
  of(Grouping.avgs(recs, field, group_rules),
     y_keys: y_keys, x_keys: x_keys,
     ret_type: ret_type)
end

.counts_from(recs:, group_rules:, y_keys:, x_keys:, ret_type: nil) ⇒ Object



16
17
18
19
20
# File 'lib/cross_table.rb', line 16

def counts_from(recs:, group_rules:, y_keys:, x_keys:, ret_type: nil)
  of(Grouping.counts(recs, group_rules),
     y_keys: y_keys, x_keys: x_keys,
     ret_type: ret_type)
end

.from(recs:, group_rules:, y_keys:, x_keys:, ret_type: nil, &aggr_proc) ⇒ Object



10
11
12
13
14
# File 'lib/cross_table.rb', line 10

def from(recs:, group_rules:, y_keys:, x_keys:, ret_type: nil, &aggr_proc)
  of(Grouping.group(recs, group_rules, &aggr_proc),
     y_keys: y_keys, x_keys: x_keys,
     ret_type: ret_type)
end

.of(grouped_hash, y_keys:, x_keys:, ret_type: nil) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/cross_table.rb', line 34

def of(grouped_hash, y_keys:, x_keys:, ret_type: nil)
  vals = y_keys.map do |y_dig_keys|
    x_keys.map do |x_dig_keys|
      grouped_hash.dig(*y_dig_keys).dig(*x_dig_keys)
    end
  end

  case ret_type
  when :data_only
    return vals

  when :xy_titles
    return ([nil] + y_keys).zip([x_keys] + vals).map do |row_title, value_row|
      [row_title] + value_row
    end
  end

  y_keys.map.zip(
    vals.map do |row|
      x_keys.zip(row).to_h
    end
  ).to_h
end

.sums_from(recs:, field:, group_rules:, y_keys:, x_keys:, ret_type: nil) ⇒ Object



22
23
24
25
26
# File 'lib/cross_table.rb', line 22

def sums_from(recs:, field:, group_rules:, y_keys:, x_keys:, ret_type: nil)
  of(Grouping.sums(recs, field, group_rules),
     y_keys: y_keys, x_keys: x_keys,
     ret_type: ret_type)
end