def test_itervalues(): """Test the itervalues function.""" table = (('foo', 'bar', 'baz'), ('a', 1, True), ('b', 2), ('b', 7, False)) actual = itervalues(table, 'foo') expect = ('a', 'b', 'b') ieq(expect, actual) actual = itervalues(table, 'bar') expect = (1, 2, 7) ieq(expect, actual) actual = itervalues(table, ('foo', 'bar')) expect = (('a', 1), ('b', 2), ('b', 7)) ieq(expect, actual) actual = itervalues(table, 'baz') expect = (True, None, False) ieq(expect, actual) actual = itervalues(table, ('foo', 'baz')) expect = (('a', True), ('b', None), ('b', False)) ieq(expect, actual)
def iterpivot(source, f1, f2, f3, aggfun, missing): # first pass - collect fields f2vals = set(itervalues(source, f2)) # TODO sampling f2vals = list(f2vals) f2vals.sort() outflds = [f1] outflds.extend(f2vals) yield tuple(outflds) # second pass - generate output it = iter(source) srcflds = it.next() f1i = srcflds.index(f1) f2i = srcflds.index(f2) f3i = srcflds.index(f3) for v1, v1rows in itertools.groupby(it, key=operator.itemgetter(f1i)): outrow = [v1] + [missing] * len(f2vals) for v2, v12rows in itertools.groupby(v1rows, key=operator.itemgetter(f2i)): aggval = aggfun([row[f3i] for row in v12rows]) outrow[1 + f2vals.index(v2)] = aggval yield tuple(outrow)
def rangefacet(table, field, width, minv=None, maxv=None, presorted=False, buffersize=None, tempdir=None, cache=True): """ Return a dictionary mapping ranges to tables. E.g.:: >>> from petl import rangefacet, look >>> look(table1) +-------+-------+ | 'foo' | 'bar' | +=======+=======+ | 'a' | 3 | +-------+-------+ | 'a' | 7 | +-------+-------+ | 'b' | 2 | +-------+-------+ | 'b' | 1 | +-------+-------+ | 'b' | 9 | +-------+-------+ | 'c' | 4 | +-------+-------+ | 'd' | 3 | +-------+-------+ >>> rf = rangefacet(table1, 'bar', 2) >>> rf.keys() [(1, 3), (3, 5), (5, 7), (7, 9)] >>> look(rf[(1, 3)]) +-------+-------+ | 'foo' | 'bar' | +=======+=======+ | 'b' | 2 | +-------+-------+ | 'b' | 1 | +-------+-------+ >>> look(rf[(7, 9)]) +-------+-------+ | 'foo' | 'bar' | +=======+=======+ | 'a' | 7 | +-------+-------+ | 'b' | 9 | +-------+-------+ Note that the last bin includes both edges. """ # determine minimum and maximum values if minv is None and maxv is None: minv, maxv = limits(table, field) elif minv is None: minv = min(itervalues(table, field)) elif max is None: maxv = max(itervalues(table, field)) fct = OrderedDict() for binminv in xrange(minv, maxv, width): binmaxv = binminv + width if binmaxv >= maxv: # final bin binmaxv = maxv # final bin includes right edge fct[(binminv, binmaxv)] = selectrangeopen(table, field, binminv, binmaxv) else: fct[(binminv, binmaxv)] = selectrangeopenleft(table, field, binminv, binmaxv) return fct