Module: PredictabilityEngine::PdfVisualizer

Defined in:
lib/predictability_engine/pdf_visualizer.rb,
lib/predictability_engine/pdf_visualizer/primitives.rb

Defined Under Namespace

Modules: Primitives

Class Method Summary collapse

Class Method Details

.draw_aging(pdf, work_items, **_opts) ⇒ Object



17
18
19
20
# File 'lib/predictability_engine/pdf_visualizer.rb', line 17

def self.draw_aging(pdf, work_items, **_opts)
  data = Calculators::Aging.item_age_data(work_items)
  Primitives.draw_bar_chart(pdf, data.map { |d| d[:id].to_s }, data.map { |d| d[:age] })
end

.draw_cfd(pdf, work_items) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/predictability_engine/pdf_visualizer.rb', line 22

def self.draw_cfd(pdf, work_items)
  cfd_data = Calculators::Cfd.calculate(work_items).last(30)
  series = [
    { label: 'Arrivals', values: cfd_data.map { |d| d[:arrived] }, color: '0000FF' },
    { label: 'Departures', values: cfd_data.map { |d| d[:departed] }, color: '00FF00' }
  ]
  Primitives.draw_line_chart(pdf, cfd_data.map { |d| d[:date].to_s }, series)
end

.draw_chart(pdf, chart_id, work_items, percentiles: PredictabilityEngine::DEFAULT_PERCENTILES) ⇒ Object



7
8
9
10
11
12
13
14
15
# File 'lib/predictability_engine/pdf_visualizer.rb', line 7

def self.draw_chart(pdf, chart_id, work_items, percentiles: PredictabilityEngine::DEFAULT_PERCENTILES)
  case chart_id
  when :cfd_plot then draw_cfd(pdf, work_items)
  when :forecasted_cfd_plot then draw_forecasted_cfd(pdf, work_items, percentiles: percentiles)
  when :throughput_histogram then draw_throughput(pdf, work_items)
  when :cycle_time_scatter then draw_scatter(pdf, work_items, percentiles: percentiles)
  when :aging_wip then draw_aging(pdf, work_items, percentiles: percentiles)
  end
end

.draw_forecasted_cfd(pdf, work_items, percentiles: PredictabilityEngine::DEFAULT_PERCENTILES) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/predictability_engine/pdf_visualizer.rb', line 47

def self.draw_forecasted_cfd(pdf, work_items, percentiles: PredictabilityEngine::DEFAULT_PERCENTILES)
  forecast = Calculators::Cfd.forecast_series(work_items, percentiles: percentiles)
  return draw_cfd(pdf, work_items) unless forecast

  series = [
    { label: 'Arrivals', values: forecast[:arrivals], color: '0000FF' },
    { label: 'Departures', values: forecast[:departed], color: '00FF00' }
  ]

  f_colors = %w[E6B800 CC0000 800080 008080 333333] # Darker versions of yellow, red, magenta, cyan, gray
  percentiles.sort.each_with_index do |p, i|
    series << { label: "#{p}% Conf.", values: forecast[:forecasts][p], color: f_colors[i % f_colors.size] }
  end

  Primitives.draw_line_chart(pdf, forecast[:dates].map(&:to_s), series)
end

.draw_scatter(pdf, work_items, percentiles: PredictabilityEngine::DEFAULT_PERCENTILES) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/predictability_engine/pdf_visualizer.rb', line 36

def self.draw_scatter(pdf, work_items, percentiles: PredictabilityEngine::DEFAULT_PERCENTILES)
  data = Calculators::CycleTime.completed_sorted(work_items)
                               .map { |i| [i.end_date.to_s, i.cycle_time] }

  Primitives.draw_scatter_plot(pdf, data.map(&:first), data.map { |d| d[1] })

  pcts = PredictabilityEngine.mapped_percentiles(work_items, percentiles)
  pdf.move_down 10
  pdf.text "Percentiles: #{pcts.map { |p| "#{p[:label]}: #{p[:val]}" }.join(', ')}", size: 8
end

.draw_throughput(pdf, work_items) ⇒ Object



31
32
33
34
# File 'lib/predictability_engine/pdf_visualizer.rb', line 31

def self.draw_throughput(pdf, work_items)
  counts = Calculators::Throughput.histogram_data(work_items)
  Primitives.draw_bar_chart(pdf, counts.map { |k, _v| k.to_s }, counts.map { |_k, v| v })
end