Exemple #1
0
def extract_trend(inp, cells):
    import trend

    records = iter(gio.SubboxReader(inp))
    meta = records.next()
    base_year = meta.yrbeg

    name = inp.name
    csv_name = name + '.csv'

    with open(csv_name, 'w') as csv_out:
        csv_file = csv.writer(csv_out)

        for record,box in itertools.izip(records, cells):
            assert record.first_year == base_year

            series = record.series[-360:]
            data = [(i//12, v) for i, v in enumerate(series) if v != MISSING]
            (a, b, r2) = trend.lm1(data)
            csv_file.writerow([id11(box), b])
            if b is None:
                b = MISSING
            else:
                b *= 100
            yield b, box
def trendlines(data):
    """
    Return a a triple of (url,slopelong,slopeshort) for
    the full and 30-year trend lines (url is a fragment).
    """

    result = Struct()
    # full trend
    (a,b,r2) = trend.lm1(data)
    if a is not None:
        yearmin = data[0][0]
        yearmax = data[-1][0]
        full_left_y = int(round(a + yearmin * b))
        full_right_y = int(round(a + yearmax * b))
        # thirty-year trend
        # Find most recent 30 years of _valid_ data
        valid_count = 0
        last_valid = -9999 # largest index with valid data
        for i,(x,y) in reversed(list(enumerate(data))):
            if y is None:
                continue
            last_valid = max(last_valid, i)
            valid_count += 1
            if valid_count >= 30:
                break
        (a_30,b_30,r2_30) = trend.lm1(data[i:])
        left_y = int(round(a_30 + (yearmin+i) * b_30))
        left_x = -100 + 200*float(i)/(yearmax-yearmin)
        right_y = int(round(a_30 + (yearmin+last_valid) * b_30))
        right_x = -100 + 200*float(last_valid)/(yearmax-yearmin)
        result.urlfrag = ("-100,100|%d,%d|%.0f,%.0f|%d,%d" %
            (full_left_y, full_right_y,
            left_x, right_x,
            left_y, right_y))
        result.b_full = b
        result.b_short = b_30
        result.r2_full = r2
        result.r2_short = r2_30
    else:
        result.b_full = None
        result.b_short = None
        result.r2_full = None
        result.r2_short = None
        result.urlfrag = "-999|-999|-999|-999"
    return result
Exemple #3
0
def trendlines(data):
    """
    Return a a triple of (url,slopelong,slopeshort) for
    the full and 30-year trend lines (url is a fragment).
    """

    result = Struct()
    # full trend
    (a, b, r2) = trend.lm1(data)
    if a is not None:
        yearmin = data[0][0]
        yearmax = data[-1][0]
        full_left_y = int(round(a + yearmin * b))
        full_right_y = int(round(a + yearmax * b))
        # thirty-year trend
        # Find most recent 30 years of _valid_ data
        valid_count = 0
        last_valid = -9999  # largest index with valid data
        for i, (x, y) in reversed(list(enumerate(data))):
            if y is None:
                continue
            last_valid = max(last_valid, i)
            valid_count += 1
            if valid_count >= 30:
                break
        (a_30, b_30, r2_30) = trend.lm1(data[i:])
        left_y = int(round(a_30 + (yearmin + i) * b_30))
        left_x = -100 + 200 * float(i) / (yearmax - yearmin)
        right_y = int(round(a_30 + (yearmin + last_valid) * b_30))
        right_x = -100 + 200 * float(last_valid) / (yearmax - yearmin)
        result.urlfrag = (
            "-100,100|%d,%d|%.0f,%.0f|%d,%d" %
            (full_left_y, full_right_y, left_x, right_x, left_y, right_y))
        result.b_full = b
        result.b_short = b_30
        result.r2_full = r2
        result.r2_short = r2_30
    else:
        result.b_full = None
        result.b_short = None
        result.r2_full = None
        result.r2_short = None
        result.urlfrag = "-999|-999|-999|-999"
    return result