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
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