47 lines
1.1 KiB
Ruby
47 lines
1.1 KiB
Ruby
# 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
|