Example #1
0
 def test_simple(self):
    self.assertEqual([2], Util.parseNumbers("2"))
    with self.assertRaises(SystemExit):
       Util.parseNumbers("test")
Example #2
0
def run(argv):
    ############
    # Defaults #
    ############
    ifiles = list()
    ofile = None
    metric = None
    locations = None
    latlonRange = None
    training = 0
    thresholds = None
    dates = None
    climFile = None
    climType = "subtract"
    leg = None
    ylabel = None
    xlabel = None
    title = None
    offsets = None
    xdim = None
    sdim = None
    figSize = None
    dpi = 100
    showText = False
    showMap = False
    noMargin = False
    binType = None
    markerSize = None
    lineWidth = None
    tickFontSize = None
    labFontSize = None
    legFontSize = None
    type = "plot"
    XRotation = None
    MajorLength = None
    MinorLength = None
    MajorWidth = None
    Bottom = None
    Top = None
    Right = None
    Left = None
    Pad = None
    showPerfect = None
    cType = "mean"
    doHist = False
    doSort = False
    doAcc = False
    xlim = None
    ylim = None
    clim = None
    version = None
    listThresholds = False
    listQuantiles = False
    listLocations = False
    listDates = False

    # Read command line arguments
    i = 1
    while (i < len(argv)):
        arg = argv[i]
        if (arg[0] == '-'):
            # Process option
            if (arg == "-nomargin"):
                noMargin = True
            elif (arg == "--version"):
                version = True
            elif (arg == "--list-thresholds"):
                listThresholds = True
            elif (arg == "--list-quantiles"):
                listQuantiles = True
            elif (arg == "--list-locations"):
                listLocations = True
            elif (arg == "--list-dates"):
                listDates = True
            elif (arg == "-sp"):
                showPerfect = True
            elif (arg == "-hist"):
                doHist = True
            elif (arg == "-acc"):
                doAcc = True
            elif (arg == "-sort"):
                doSort = True
            else:
                if (arg == "-f"):
                    ofile = argv[i + 1]
                elif (arg == "-l"):
                    locations = Util.parseNumbers(argv[i + 1])
                elif (arg == "-llrange"):
                    latlonRange = Util.parseNumbers(argv[i + 1])
                elif (arg == "-t"):
                    training = int(argv[i + 1])
                elif (arg == "-x"):
                    xdim = argv[i + 1]
                elif (arg == "-o"):
                    offsets = Util.parseNumbers(argv[i + 1])
                elif (arg == "-leg"):
                    leg = unicode(argv[i + 1], 'utf8')
                elif (arg == "-ylabel"):
                    ylabel = unicode(argv[i + 1], 'utf8')
                elif (arg == "-xlabel"):
                    xlabel = unicode(argv[i + 1], 'utf8')
                elif (arg == "-title"):
                    title = unicode(argv[i + 1], 'utf8')
                elif (arg == "-b"):
                    binType = argv[i + 1]
                elif (arg == "-type"):
                    type = argv[i + 1]
                elif (arg == "-fs"):
                    figSize = argv[i + 1]
                elif (arg == "-dpi"):
                    dpi = int(argv[i + 1])
                elif (arg == "-d"):
                    # Either format is ok:
                    # -d 20150101 20150103
                    # -d 20150101:20150103
                    if (i + 2 < len(argv) and argv[i + 2].isdigit()):
                        dates = Util.parseNumbers(
                            "%s:%s" % (argv[i + 1], argv[i + 2]), True)
                        i = i + 1
                    else:
                        dates = Util.parseNumbers(argv[i + 1], True)
                elif (arg == "-c"):
                    climFile = argv[i + 1]
                    climType = "subtract"
                elif (arg == "-C"):
                    climFile = argv[i + 1]
                    climType = "divide"
                elif (arg == "-xlim"):
                    xlim = Util.parseNumbers(argv[i + 1])
                elif (arg == "-ylim"):
                    ylim = Util.parseNumbers(argv[i + 1])
                elif (arg == "-clim"):
                    clim = Util.parseNumbers(argv[i + 1])
                elif (arg == "-s"):
                    sdim = argv[i + 1]
                elif (arg == "-ct"):
                    cType = argv[i + 1]
                elif (arg == "-r"):
                    thresholds = Util.parseNumbers(argv[i + 1])
                elif (arg == "-ms"):
                    markerSize = float(argv[i + 1])
                elif (arg == "-lw"):
                    lineWidth = float(argv[i + 1])
                elif (arg == "-tickfs"):
                    tickFontSize = float(argv[i + 1])
                elif (arg == "-labfs"):
                    labFontSize = float(argv[i + 1])
                elif (arg == "-legfs"):
                    legFontSize = float(argv[i + 1])
                elif (arg == "-xrot"):
                    XRotation = float(argv[i + 1])
                elif (arg == "-majlth"):
                    MajorLength = float(argv[i + 1])
                elif (arg == "-minlth"):
                    MinorLength = float(argv[i + 1])
                elif (arg == "-majwid"):
                    MajorWidth = float(argv[i + 1])
                elif (arg == "-bot"):
                    Bottom = float(argv[i + 1])
                elif (arg == "-top"):
                    Top = float(argv[i + 1])
                elif (arg == "-right"):
                    Right = float(argv[i + 1])
                elif (arg == "-left"):
                    Left = float(argv[i + 1])
                elif (arg == "-pad"):
                    Pad = argv[i + 1]
                elif (arg == "-m"):
                    metric = argv[i + 1]
                else:
                    Util.error("Flag '" + argv[i] + "' not recognized")
                i = i + 1
        else:
            ifiles.append(argv[i])
        i = i + 1

    if (version):
        print "Version: " + Version.__version__
        return

    # Deal with legend entries
    if (leg is not None):
        leg = leg.split(',')
        for i in range(0, len(leg)):
            leg[i] = leg[i].replace('_', ' ')

    if (latlonRange is not None and len(latlonRange) != 4):
        Util.error("-llRange <values> must have exactly 4 values")

    if (len(ifiles) > 0):
        data = Data.Data(ifiles,
                         clim=climFile,
                         climType=climType,
                         dates=dates,
                         offsets=offsets,
                         locations=locations,
                         latlonRange=latlonRange,
                         training=training)
    else:
        data = None

    if (listThresholds or listQuantiles or listLocations or listDates):
        if (len(ifiles) == 0):
            Util.error(
                "Files are required in order to list thresholds or quantiles")
        if (listThresholds):
            print "Thresholds:",
            for threshold in data.getThresholds():
                print "%g" % threshold,
            print ""
        if (listQuantiles):
            print "Quantiles:",
            for quantile in data.getQuantiles():
                print "%g" % quantile,
            print ""
        if (listLocations):
            print "    id     lat     lon    elev"
            for station in data.getStations():
                print "%6d %7.2f %7.2f %7.1f" % (station.id(), station.lat(),
                                                 station.lon(), station.elev())
            print ""
        if (listDates):
            dates = data.getAxisValues("date")
            dates = Util.convertToYYYYMMDD(dates)
            for date in dates:
                print "%d" % date
            print ""
        return
    elif (len(argv) == 1 or len(ifiles) == 0 or metric is None):
        showDescription(data)
        return

    if (figSize is not None):
        figSize = figSize.split(',')
        if (len(figSize) != 2):
            print "-fs figSize must be in the form: width,height"
            sys.exit(1)

    m = None

    # Handle special plots
    if (doHist):
        pl = Output.Hist(metric)
    elif (doSort):
        pl = Output.Sort(metric)
    elif (metric == "pithist"):
        m = Metric.Pit("pit")
        pl = Output.PitHist(m)
    elif (metric == "obsfcst"):
        pl = Output.ObsFcst()
    elif (metric == "timeseries"):
        pl = Output.TimeSeries()
    elif (metric == "meteo"):
        pl = Output.Meteo()
    elif (metric == "qq"):
        pl = Output.QQ()
    elif (metric == "cond"):
        pl = Output.Cond()
    elif (metric == "against"):
        pl = Output.Against()
    elif (metric == "count"):
        pl = Output.Count()
    elif (metric == "scatter"):
        pl = Output.Scatter()
    elif (metric == "change"):
        pl = Output.Change()
    elif (metric == "spreadskill"):
        pl = Output.SpreadSkill()
    elif (metric == "taylor"):
        pl = Output.Taylor()
    elif (metric == "error"):
        pl = Output.Error()
    elif (metric == "freq"):
        pl = Output.Freq()
    elif (metric == "roc"):
        pl = Output.Roc()
    elif (metric == "droc"):
        pl = Output.DRoc()
    elif (metric == "droc0"):
        pl = Output.DRoc0()
    elif (metric == "drocnorm"):
        pl = Output.DRocNorm()
    elif (metric == "reliability"):
        pl = Output.Reliability()
    elif (metric == "invreliability"):
        pl = Output.InvReliability()
    elif (metric == "igncontrib"):
        pl = Output.IgnContrib()
    elif (metric == "economicvalue"):
        pl = Output.EconomicValue()
    elif (metric == "marginal"):
        pl = Output.Marginal()
    else:
        # Standard plots
        # Attempt at automating
        metrics = Metric.getAllMetrics()
        m = None
        for mm in metrics:
            if (metric == mm[0].lower() and mm[1].isValid()):
                m = mm[1]()
                break
        if (m is None):
            m = Metric.Default(metric)

        m.setAggregator(cType)

        # Output type
        if (type == "plot" or type == "text" or type == "map"
                or type == "maprank"):
            pl = Output.Default(m)
            pl.setShowAcc(doAcc)
        else:
            Util.error("Type not understood")

    # Rest dimension of '-x' is not allowed
    if (xdim is not None and not pl.supportsX()):
        Util.warning(metric + " does not support -x. Ignoring it.")
        xdim = None

    # Reset dimension if 'threshold' is not allowed
    if (xdim == "threshold"
            and ((not pl.supportsThreshold()) or (not m.supportsThreshold()))):
        Util.warning(metric + " does not support '-x threshold'. Ignoring it.")
        thresholds = None
        xdim = None

    # Create thresholds if needed
    if ((thresholds is None) and (pl.requiresThresholds() or
                                  (m is not None and m.requiresThresholds()))):
        data.setAxis("none")
        obs = data.getScores("obs")[0]
        fcst = data.getScores("fcst")[0]
        smin = min(min(obs), min(fcst))
        smax = max(max(obs), max(fcst))
        thresholds = np.linspace(smin, smax, 10)
        Util.warning("Missing '-r <thresholds>'. Automatically setting\
            thresholds.")

    # Set plot parameters
    if (markerSize is not None):
        pl.setMarkerSize(markerSize)
    if (lineWidth is not None):
        pl.setLineWidth(lineWidth)
    if (labFontSize is not None):
        pl.setLabFontSize(labFontSize)
    if (legFontSize is not None):
        pl.setLegFontSize(legFontSize)
    if (tickFontSize is not None):
        pl.setTickFontSize(tickFontSize)
    if (XRotation is not None):
        pl.setXRotation(XRotation)
    if (MajorLength is not None):
        pl.setMajorLength(MajorLength)
    if (MinorLength is not None):
        pl.setMinorLength(MinorLength)
    if (MajorWidth is not None):
        pl.setMajorWidth(MajorWidth)
    if (Bottom is not None):
        pl.setBottom(Bottom)
    if (Top is not None):
        pl.setTop(Top)
    if (Right is not None):
        pl.setRight(Right)
    if (Left is not None):
        pl.setLeft(Left)
    if (Pad is not None):
        pl.setPad(None)
    if (binType is not None):
        pl.setBinType(binType)
    if (showPerfect is not None):
        pl.setShowPerfect(showPerfect)
    if (xlim is not None):
        pl.setXLim(xlim)
    if (ylim is not None):
        pl.setYLim(ylim)
    if (clim is not None):
        pl.setCLim(clim)
    pl.setFilename(ofile)
    pl.setThresholds(thresholds)
    pl.setLegend(leg)
    pl.setFigsize(figSize)
    pl.setDpi(dpi)
    pl.setAxis(xdim)
    pl.setShowMargin(not noMargin)
    pl.setYlabel(ylabel)
    pl.setXlabel(xlabel)
    pl.setTitle(title)

    if (type == "text"):
        pl.text(data)
    elif (type == "map"):
        pl.map(data)
    elif (type == "maprank"):
        pl.setShowRank(True)
        pl.map(data)
    else:
        pl.plot(data)
Example #3
0
 def test_date(self):
    self.assertEqual([20141230, 20141231, 20150101, 20150102, 20150103], Util.parseNumbers("20141230:20150103", True))
    self.assertEqual([20141230, 20150101, 20150103], Util.parseNumbers("20141230:2:20150104", True))
Example #4
0
 def test_mix(self):
    self.assertEqual([3, 4, 3, 2, 3, 4, 5], Util.parseNumbers("3:4,3,2:5"))
    with self.assertRaises(SystemExit):
       Util.parseNumbers("2,5:8,3,test")
       Util.parseNumbers("2,5:8,test,5")
       Util.parseNumbers("2,5:test,3,5")
       Util.parseNumbers("2,5:test,3,5")
       Util.parseNumbers("2,test:8,3,5")
       Util.parseNumbers("test,5:8,3,5")
Example #5
0
 def test_comma(self):
    self.assertEqual([2, 5], Util.parseNumbers("2,5"))
    self.assertEqual([3, 3], Util.parseNumbers("3,3"))
    with self.assertRaises(SystemExit):
       Util.parseNumbers("test")
Example #6
0
 def test_vectorInc(self):
    self.assertEqual([2, 5, 8], Util.parseNumbers("2:3:8"))
    self.assertEqual([2, 5], Util.parseNumbers("2:3:7"))
    self.assertEqual([], Util.parseNumbers("2:-1:7"))
    self.assertEqual([2, 1, 0], Util.parseNumbers("2:-1:0"))
    self.assertEqual([8, 5, 2], Util.parseNumbers("8:-3:0"))
    with self.assertRaises(SystemExit):
       Util.parseNumbers("2:3:test")
       Util.parseNumbers("test:3:5")
       Util.parseNumbers("2:test:5")
Example #7
0
 def test_vector(self):
    self.assertEqual([2, 3, 4, 5], Util.parseNumbers("2:5"))
    self.assertEqual([], Util.parseNumbers("2:1"))
    with self.assertRaises(SystemExit):
       self.assertEqual([2], Util.parseNumbers("2:test"))