frankfurter/lib/tasks/consensus.rake

48 lines
1.1 KiB
Ruby
Raw Permalink Normal View History

2026-05-21 01:38:14 -06:00
# frozen_string_literal: true
desc "Show outliers rates for last 365 days"
task "consensus:recent" do
require "rate"
require "blender"
require "log"
scan_dates(Date.today - 365, Date.today)
end
desc "Show outliers rates (all history or a given year)"
task :consensus, [:year] do |_t, args|
require "rate"
require "blender"
require "log"
if args[:year]
year = Integer(args[:year])
scan_dates(Date.new(year, 1, 1), Date.new(year, 12, 31))
else
scan_dates(Rate.min(:date), Rate.max(:date))
end
end
def scan_dates(from, to)
counts = Hash.new(0)
total = 0
dates = Rate.select(:date).distinct.where(date: from..to).order(:date).select_map(:date)
dates.each do |date|
rows = Rate.where(date:).all
blender = Blender.new(rows, base: "EUR")
blender.blend
blender.outliers.each do |provider, quote|
counts["#{provider} #{quote}"] += 1
total += 1
end
end
counts.sort_by(&:last).reverse_each do |combo, count|
Log.info(format("%-25s %d", combo, count))
end
Log.info("Total: #{total} outliers across #{dates.size} dates")
end