diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2016-08-29 11:15:32 -0400 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2016-08-29 11:15:32 -0400 |
commit | 6ac3eeb8d0fd3ae3736a7766f99a8bcd4749c235 (patch) | |
tree | 2068ea3da34b6007130be99b363a72d60c910267 | |
parent | 533198b1624ae74316694da073e4894a52d8efc7 (diff) |
Add --percentiles option to ft-compute-stats
Print a table of percentiles
-rwxr-xr-x | ft-compute-stats | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/ft-compute-stats b/ft-compute-stats index 2f0ed9a..a380305 100755 --- a/ft-compute-stats +++ b/ft-compute-stats | |||
@@ -102,9 +102,13 @@ opts = [ | |||
102 | help='give relative frequency, not absolute sample counts'), | 102 | help='give relative frequency, not absolute sample counts'), |
103 | o('-c', '--cumulative', action='store_true', dest='cumulative', | 103 | o('-c', '--cumulative', action='store_true', dest='cumulative', |
104 | help='report cumulative counts (i.e., CDF)'), | 104 | help='report cumulative counts (i.e., CDF)'), |
105 | o(None, '--percentiles', action='store_true', dest='want_percentiles', | ||
106 | help='produce table of percentiles'), | ||
107 | o('-r', '--resolution', action='store', dest='resolution', type='float', | ||
108 | help='set resolution of percentiles table'), | ||
105 | o(None, '--percent', action='store_true', dest='want_percent', | 109 | o(None, '--percent', action='store_true', dest='want_percent', |
106 | help='give relative frequency as a percentage'), | 110 | help='give relative frequency as a percentage'), |
107 | ] | 111 | ] |
108 | 112 | ||
109 | defaults = { | 113 | defaults = { |
110 | 'cycles' : None, | 114 | 'cycles' : None, |
@@ -113,7 +117,9 @@ defaults = { | |||
113 | 'normalize' : False, | 117 | 'normalize' : False, |
114 | 'want_percent' : False, | 118 | 'want_percent' : False, |
115 | 'cumulative' : False, | 119 | 'cumulative' : False, |
116 | } | 120 | 'want_percentiles' : False, |
121 | 'resolution' : 0.1, | ||
122 | } | ||
117 | 123 | ||
118 | options = None | 124 | options = None |
119 | 125 | ||
@@ -169,6 +175,16 @@ def make_bins(max_val): | |||
169 | num_bins = int(ceil(max_val / options.bin_size)) + 1 | 175 | num_bins = int(ceil(max_val / options.bin_size)) + 1 |
170 | return [x * options.bin_size for x in range(0, num_bins)] | 176 | return [x * options.bin_size for x in range(0, num_bins)] |
171 | 177 | ||
178 | def iter_percentiles(resolution): | ||
179 | percentile = 0.0 | ||
180 | while percentile < 100: | ||
181 | yield percentile | ||
182 | percentile += resolution | ||
183 | yield 100.0 | ||
184 | |||
185 | def make_percentiles(resolution): | ||
186 | return list(iter_percentiles(resolution)) | ||
187 | |||
172 | def hist_file(fname, scale): | 188 | def hist_file(fname, scale): |
173 | max_val = 0 | 189 | max_val = 0 |
174 | hist = [] | 190 | hist = [] |
@@ -191,6 +207,20 @@ def hist_file(fname, scale): | |||
191 | return (max_val, hist) | 207 | return (max_val, hist) |
192 | 208 | ||
193 | 209 | ||
210 | def percentiles_file(fname, percentiles): | ||
211 | percs = [] | ||
212 | |||
213 | size = os.stat(fname).st_size | ||
214 | if size: | ||
215 | samples = numpy.memmap(fname, dtype='float32', mode='c') | ||
216 | |||
217 | n = len(samples) | ||
218 | if n > 0: | ||
219 | percs = numpy.percentile(samples, percentiles) | ||
220 | |||
221 | return percs | ||
222 | |||
223 | |||
194 | if __name__ == '__main__': | 224 | if __name__ == '__main__': |
195 | # FIXME: would be nicer with argparse | 225 | # FIXME: would be nicer with argparse |
196 | parser = optparse.OptionParser(option_list=opts) | 226 | parser = optparse.OptionParser(option_list=opts) |
@@ -215,6 +245,22 @@ if __name__ == '__main__': | |||
215 | print '# Columns:' | 245 | print '# Columns:' |
216 | for i, f in enumerate(col_names): | 246 | for i, f in enumerate(col_names): |
217 | print '# (%d) %s' % (i + 1, f) | 247 | print '# (%d) %s' % (i + 1, f) |
248 | elif options.want_percentiles: | ||
249 | cols = [] | ||
250 | percentiles = make_percentiles(options.resolution) | ||
251 | col_names = [] | ||
252 | for i, f in enumerate(files): | ||
253 | try: | ||
254 | percs = percentiles_file(f, percentiles) | ||
255 | cols.append([i + 1] + [to_str(x) for x in percs]) | ||
256 | col_names.append(f) | ||
257 | except IOError, msg: | ||
258 | print >> sys.stderr, msg | ||
259 | perc = ['Percentile'] + [to_str(x) for x in percentiles] | ||
260 | print_cols([perc] + cols) | ||
261 | print '# Columns:' | ||
262 | for i, f in enumerate(col_names): | ||
263 | print '# (%d) %s' % (i + 1, f) | ||
218 | else: | 264 | else: |
219 | rows = [] | 265 | rows = [] |
220 | rows.append(STATS_HEADERS) | 266 | rows.append(STATS_HEADERS) |