| 78 | |
| 79 | |
| 80 | class Category: |
| 81 | def __init__(self, key, histogram, csv, percentiles): |
| 82 | self.key = key |
| 83 | self.values = [] |
| 84 | self.histogram = histogram |
| 85 | self.csv = csv |
| 86 | self.percentiles = percentiles |
| 87 | |
| 88 | def process_entry(self, entry): |
| 89 | if self.key in entry: |
| 90 | self.values.append(float(entry[self.key])) |
| 91 | if self.histogram: |
| 92 | self.histogram.add(float(entry[self.key])) |
| 93 | |
| 94 | def min(self): |
| 95 | return min(self.values) |
| 96 | |
| 97 | def max(self): |
| 98 | return max(self.values) |
| 99 | |
| 100 | def avg(self): |
| 101 | if len(self.values) == 0: |
| 102 | return 0.0 |
| 103 | return sum(self.values) / len(self.values) |
| 104 | |
| 105 | def empty(self): |
| 106 | return len(self.values) == 0 |
| 107 | |
| 108 | def _compute_percentiles(self): |
| 109 | ret = [] |
| 110 | if len(self.values) == 0: |
| 111 | return ret |
| 112 | sorted_values = sorted(self.values) |
| 113 | for percentile in self.percentiles: |
| 114 | index = int(ceil((len(self.values) - 1) * percentile / 100)) |
| 115 | ret.append(" {0}%: {1}".format(percentile, sorted_values[index])) |
| 116 | return ret |
| 117 | |
| 118 | def __str__(self): |
| 119 | if self.csv: |
| 120 | ret = [self.key] |
| 121 | ret.append(len(self.values)) |
| 122 | ret.append(self.min()) |
| 123 | ret.append(self.max()) |
| 124 | ret.append(self.avg()) |
| 125 | ret = [str(x) for x in ret] |
| 126 | return ",".join(ret) |
| 127 | else: |
| 128 | ret = [self.key] |
| 129 | ret.append(" len: {0}".format(len(self.values))) |
| 130 | if len(self.values) > 0: |
| 131 | ret.append(" min: {0}".format(self.min())) |
| 132 | ret.append(" max: {0}".format(self.max())) |
| 133 | ret.append(" avg: {0}".format(self.avg())) |
| 134 | if self.histogram: |
| 135 | ret.append(str(self.histogram)) |
| 136 | if self.percentiles: |
| 137 | ret.append("\n".join(self._compute_percentiles())) |