minor fixes to endpoint names
[lazar-public-data] / compare_validation_reports.rb
1 #!/usr/bin/env ruby
2 require 'optparse'
3 require 'json'
4
5
6 options = {}
7 OptionParser.new do |opts|
8   opts.banner = "Usage: compare_validation_reports.rb [options]"
9   
10   opts.on("-d d", "--dir=dir", "Path to the validation reports dir.") do |dir|
11     options[:dir] = (dir[-1,1] == "/" ? dir : dir + "/")
12   end
13
14   opts.on("-c", "--classification", "Select only classification reports from dir.") do |c|
15     if options[:regression]
16       puts "Don't use optional parameters -c and -r at the same time. Mixed by default."
17       exit
18     end
19     options[:classification] = c
20   end
21
22   opts.on("-r", "--regression", "Select only regression reports from dir.") do |r|
23     if options[:classification]
24       puts "Don't use optional parameters -c and -r at the same time. Mixed by default."
25       exit
26     end
27     options[:regression] = r
28   end
29
30   opts.on("-v", "--verbose", "Display verbose report. Standard for -d mode without -c or -r parameters.") do |v|
31     options[:verbose] = v
32   end
33
34   opts.on("-f f", "--file=files", "Select two or more comma seperated reports.") do |files|
35     list = files.split(",")
36     unless list.size == 2
37       puts "You have to pass at least two files as argument with full path."
38       exit
39     end
40     options[:files] = list
41   end
42   
43   opts.on("-h", "--help", "Displays help") do
44     puts opts
45     exit
46   end
47
48 end.parse!
49
50 if options.empty? || (!options[:files] && !options[:dir])
51   puts "Usage: compare_validation_reports.rb -h"
52   exit
53 end
54
55 if options[:dir]
56   if options[:verbose]
57     if !options[:classification] && !options[:regression]
58       json = Dir[options[:dir]+'*.json'].sort.map { |f| JSON.parse File.read(f) }.flatten
59       puts JSON.pretty_generate json
60     end
61     if options[:classification]
62       json = Dir[options[:dir]+'*_classification_*.json'].sort.map { |f| JSON.parse File.read(f) }.flatten
63       puts JSON.pretty_generate json
64     end
65     if options[:regression]
66       json = Dir[options[:dir]+'*_regression_*.json'].sort.map { |f| JSON.parse File.read(f) }.flatten
67       puts JSON.pretty_generate json
68     end
69   else
70
71     main = {}
72
73     if !options[:classification] && !options[:regression] && !options[:verbose]
74       json = Dir[options[:dir]+'*.json'].sort.map { |f| JSON.parse File.read(f) }.flatten
75       puts JSON.pretty_generate json
76     end
77     if options[:classification]
78       json = Dir[options[:dir]+'*_classification_*.json'].sort.map { |f| JSON.parse File.read(f) }.flatten
79       json.each do |report|
80         main[report["endpoint"]] ||= []
81         main[report["endpoint"]] << [report["species"], report["created_at"], report["crossvalidations"].map{|cv| {"accuracy": cv[1]["statistics"]["accuracy"], "weighted_accuracy": cv[1]["statistics"]["weighted_accuracy"], "true_rate": cv[1]["statistics"]["true_rate"], "predictivity": cv[1]["statistics"]["predictivity"]}}.flatten]
82       end
83       puts JSON.pretty_generate main
84     end
85     if options[:regression]
86       json = Dir[options[:dir]+'*_regression_*.json'].sort.map { |f| JSON.parse File.read(f) }.flatten
87       json.each do |report|
88         main[report["endpoint"]] ||= []
89         main[report["endpoint"]] << [report["species"], report["created_at"], report["crossvalidations"].map{|cv| {"rmse": cv[1]["statistics"]["rmse"], "r_squared": cv[1]["statistics"]["r_squared"]}}.flatten]
90       end
91       puts JSON.pretty_generate main
92     end
93   end
94 end
95
96 if options[:files]
97   json = []
98   options[:files].each do |file|
99     json << JSON.parse(File.read(file))
100   end
101   puts JSON.pretty_generate json.flatten
102
103 end
104