view numerics/histogram.py @ 76:7faa0112ef9f

much of CLI
author Jeff Hammel <k0scist@gmail.com>
date Sun, 01 Mar 2015 08:51:45 -0800
parents 2337abc4ebfe
children dcfce20597a6
line wrap: on
line source

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Histograms

Unicode is awesome; see http://www.alanwood.net/unicode/block_elements.html
"""

blocks = """








"""

# imports
import argparse
import os
import sys
import time
from .data import transpose
from .read import CSVParser
from collections import OrderedDict

# module globals
__all__ = ['Histogram', 'HistogramParser', 'main']

class Histogram(object):
    """historgram"""

    def __init__(self, bins):
        self.bins = sorted(bins)
        assert len(bins) > 1
        self.data = OrderedDict([(bin, [])
                                 for bin in zip(bins[:-1],
                                                bins[1:])])

    def add(self, *values):
        """add values to the histogram"""
        for value in values:
            for vmin, vmax in self.data.keys():
                if vmin <= value < vmax:
                    self.data[(vmin, vmax)].append(value)
                    break
            else:
                if value == vmax:
                    # handle rightmost endpoint
                    self.data[(vmin, vmax)].append(value

    def __iadd__(self, value):
        self.add(value)
        return self

    def __call__(self, *values):
        """
        add values to the histogram and return
        OrderedDict of counts
        """
        self.add(*values)
        return OrderedDict([(bin, len(value))
                            for bin, value in self.data.items()])

    def keys(self):
        return self.data.keys()

    def max(self):
        """return max length"""
        return max([len(value) for value in self.data.values()])


class HistogramParser(CSVParser):
    """histogram CLI option parser"""

    def __init__(self, **kwargs):
        kwargs.setdefault('formatter_class', argparse.RawTextHelpFormatter)
        kwargs.setdefault('description', __doc__)
        CSVParser.__init__(self, **kwargs)
        self.add_argument('-n', '--bins', dest='n_bins', type=int,
                          help="number of bins")
        self.add_argument('--min', dest='min', type=float,
                          help="minimum value; else taken from data")
        self.add_argument('--max', dest='max', type=float,
                          help="maximum value, else taken from data")
        self.options = None


def main(args=sys.argv[1:]):
    """CLI"""

    # parse command line options
    parser = HistogramParser()
    options = parser.parse_args(args)

    # read data
    data = parser.read()
    if not data:
        parser.error("No data given")

    # transpose to columns
    columns = transpose(data)


if __name__ == '__main__':
    main()