def preprocess(location, px, py, freq, image_pattern='L*stack'): """ Read and preprocess Landsat data before analysis """ dates, files = find_stack_images(location, image_pattern=image_pattern) x = np.array(dates) Y = read_pixel_timeseries(files, px, py) # Filter out time series and remove Fmask clear = np.logical_and(Y[fmask, :] <= 1, np.all(Y <= 10000, axis=0)) Y = Y[:, clear][:fmask, :] x = x[clear] # Ordinal date ord_x = np.array(map(dt.toordinal, x)) # Make X matrix X = make_X(ord_x, freq).T return X, Y, clear
def pixel(ctx, config, px, py, band, plot, ylim, style, cmap, embed, seed, algo_kw): # Set seed np.random.seed(seed) # Convert band to index band -= 1 # Get colormap if hasattr(palettable.colorbrewer, cmap): mpl_cmap = getattr(palettable.colorbrewer, cmap).mpl_colormap elif hasattr(palettable.cubehelix, cmap): mpl_cmap = getattr(palettable.cubehelix, cmap).mpl_colormap elif hasattr(palettable.wesanderson, cmap): mpl_cmap = getattr(palettable.wesanderson, cmap).mpl_colormap else: raise click.Abort('Cannot find specified colormap in `palettable`') # Parse config cfg = parse_config_file(config) # Apply algorithm overrides revalidate = False for kw in algo_kw: for cfg_key in cfg: if kw in cfg[cfg_key]: # Parse as YAML for type conversions used in config parser value = yaml.load(algo_kw[kw]) print('Overriding cfg[%s][%s]=%s with %s' % (cfg_key, kw, cfg[cfg_key][kw], value)) cfg[cfg_key][kw] = value revalidate = True if revalidate: cfg = convert_config(cfg) # Locate and fetch attributes from data df = csvfile_to_dataframe(cfg['dataset']['input_file'], date_format=cfg['dataset']['date_format']) df['image_ID'] = get_image_IDs(df['filename']) # Setup X/Y kws = {'x': df['date']} kws.update(df.to_dict()) X = patsy.dmatrix(cfg['YATSM']['design_matrix'], kws) design_info = X.design_info Y = read_pixel_timeseries(df['filename'], px, py) fit_indices = np.arange(cfg['dataset']['n_bands']) if cfg['dataset']['mask_band'] is not None: fit_indices = fit_indices[:-1] # Mask out of range data idx_mask = cfg['dataset']['mask_band'] - 1 valid = cyprep.get_valid_mask(Y, cfg['dataset']['min_values'], cfg['dataset']['max_values']).astype(np.bool) valid *= np.in1d(Y[idx_mask, :], cfg['dataset']['mask_values'], invert=True).astype(np.bool) # Apply mask Y = np.delete(Y, idx_mask, axis=0)[:, valid] X = X[valid, :] dates = np.array([dt.datetime.fromordinal(d) for d in df['date'][valid]]) # Plot before fitting with plt.xkcd() if style == 'xkcd' else mpl.style.context(style): for _plot in plot: if _plot == 'TS': plot_TS(dates, Y[band, :]) elif _plot == 'DOY': plot_DOY(dates, Y[band, :], mpl_cmap) elif _plot == 'VAL': plot_VAL(dates, Y[band, :], mpl_cmap) if ylim: plt.ylim(ylim) plt.title('Timeseries: px={px} py={py}'.format(px=px, py=py)) plt.ylabel('Band {b}'.format(b=band + 1)) if embed and has_embed: IPython_embed() plt.tight_layout() plt.show() # Eliminate config parameters not algorithm and fit model yatsm = cfg['YATSM']['algorithm_cls'](lm=cfg['YATSM']['prediction_object'], **cfg[cfg['YATSM']['algorithm']]) yatsm.px = px yatsm.py = py yatsm.fit(X, Y, np.asarray(df['date'][valid])) # Plot after predictions with plt.xkcd() if style == 'xkcd' else mpl.style.context(style): for _plot in plot: if _plot == 'TS': plot_TS(dates, Y[band, :]) elif _plot == 'DOY': plot_DOY(dates, Y[band, :], mpl_cmap) elif _plot == 'VAL': plot_VAL(dates, Y[band, :], mpl_cmap) if ylim: plt.ylim(ylim) plt.title('Timeseries: px={px} py={py}'.format(px=px, py=py)) plt.ylabel('Band {b}'.format(b=band + 1)) plot_results(band, cfg['YATSM'], yatsm, plot_type=_plot) if embed and has_embed: IPython_embed() plt.tight_layout() plt.show()