def run_pixel(X, Y, dataset_config, yatsm_config, px=0, py=0): """ Run a single pixel through YATSM Args: X (ndarray): 2D (nimage x nband) feature input from ordinal date Y (ndarray): 2D (nband x nimage) image input dataset_config (dict): dict of dataset configuration options yatsm_config (dict): dict of YATSM algorithm options px (int, optional): X (column) pixel reference py (int, optional): Y (row) pixel reference Returns: model_result (ndarray): NumPy array of model results from YATSM """ # Extract design info design_info = X.design_info # Continue if valid observations are less than 50% of dataset valid = cyprep.get_valid_mask(Y[:dataset_config['mask_band'] - 1, :], dataset_config['min_values'], dataset_config['max_values']) if valid.sum() < Y.shape[1] / 2.0: raise TSLengthException('Not enough valid observations') # Otherwise continue with masked values valid = (valid * np.in1d(Y[dataset_config['mask_band'] - 1, :], dataset_config['mask_values'], invert=True)).astype(np.bool) Y = Y[:dataset_config['mask_band'] - 1, valid] X = X[valid, :] if yatsm_config['reverse']: # TODO: do this earlier X = np.flipud(X) Y = np.fliplr(Y) yatsm = YATSM(X, Y, consecutive=yatsm_config['consecutive'], threshold=yatsm_config['threshold'], min_obs=yatsm_config['min_obs'], min_rmse=yatsm_config['min_rmse'], test_indices=yatsm_config['test_indices'], retrain_time=yatsm_config['retrain_time'], screening=yatsm_config['screening'], screening_crit=yatsm_config['screening_crit'], green_band=dataset_config['green_band'] - 1, swir1_band=dataset_config['swir1_band'] - 1, remove_noise=yatsm_config['remove_noise'], dynamic_rmse=yatsm_config['dynamic_rmse'], slope_test=yatsm_config['slope_test'], lassocv=yatsm_config['lassocv'], design_info=design_info, px=px, py=py, logger=logger) yatsm.run() if yatsm_config['commission_alpha']: yatsm.record = yatsm.commission_test(yatsm_config['commission_alpha']) if yatsm_config['robust']: yatsm.record = yatsm.robust_record if yatsm_config['calc_pheno']: ltm = pheno.LongTermMeanPhenology(yatsm, yatsm_config['red_index'], yatsm_config['nir_index'], yatsm_config['blue_index'], yatsm_config['scale'], yatsm_config['evi_index'], yatsm_config['evi_scale']) yatsm.record = ltm.fit(year_interval=yatsm_config['year_interval'], q_min=yatsm_config['q_min'], q_max=yatsm_config['q_max']) return yatsm.record
def run_pixel(X, Y, dataset_config, yatsm_config, px=0, py=0): """ Run a single pixel through YATSM Args: X (ndarray): 2D (nimage x nband) feature input from ordinal date Y (ndarray): 2D (nband x nimage) image input dataset_config (dict): dict of dataset configuration options yatsm_config (dict): dict of YATSM algorithm options px (int, optional): X (column) pixel reference py (int, optional): Y (row) pixel reference Returns: model_result (ndarray): NumPy array of model results from YATSM """ # Extract design info design_info = X.design_info # Continue if valid observations are less than 50% of dataset valid = cyprep.get_valid_mask( Y[:dataset_config['mask_band'] - 1, :], dataset_config['min_values'], dataset_config['max_values'] ) if valid.sum() < Y.shape[1] / 2.0: raise TSLengthException('Not enough valid observations') # Otherwise continue with masked values valid = (valid * np.in1d(Y[dataset_config['mask_band'] - 1, :], dataset_config['mask_values'], invert=True)).astype(np.bool) Y = Y[:dataset_config['mask_band'] - 1, valid] X = X[valid, :] if yatsm_config['reverse']: # TODO: do this earlier X = np.flipud(X) Y = np.fliplr(Y) yatsm = YATSM(X, Y, consecutive=yatsm_config['consecutive'], threshold=yatsm_config['threshold'], min_obs=yatsm_config['min_obs'], min_rmse=yatsm_config['min_rmse'], test_indices=yatsm_config['test_indices'], retrain_time=yatsm_config['retrain_time'], screening=yatsm_config['screening'], screening_crit=yatsm_config['screening_crit'], green_band=dataset_config['green_band'] - 1, swir1_band=dataset_config['swir1_band'] - 1, remove_noise=yatsm_config['remove_noise'], dynamic_rmse=yatsm_config['dynamic_rmse'], slope_test=yatsm_config['slope_test'], lassocv=yatsm_config['lassocv'], design_info=design_info, px=px, py=py, logger=logger) yatsm.run() if yatsm_config['commission_alpha']: yatsm.record = yatsm.commission_test(yatsm_config['commission_alpha']) if yatsm_config['robust']: yatsm.record = yatsm.robust_record if yatsm_config['calc_pheno']: ltm = pheno.LongTermMeanPhenology( yatsm, yatsm_config['red_index'], yatsm_config['nir_index'], yatsm_config['blue_index'], yatsm_config['scale'], yatsm_config['evi_index'], yatsm_config['evi_scale']) yatsm.record = ltm.fit(year_interval=yatsm_config['year_interval'], q_min=yatsm_config['q_min'], q_max=yatsm_config['q_max']) return yatsm.record
# Run model if reverse: _X = np.flipud(X) _Y = np.fliplr(Y) else: _X = X _Y = Y yatsm = YATSM(_X, _Y, consecutive=consecutive, threshold=threshold, min_obs=min_obs, min_rmse=min_rmse, test_indices=test_indices, retrain_time=retrain_time, screening=screening, screening_crit=screening_crit, remove_noise=remove_noise, dynamic_rmse=dynamic_rmse, lassocv=lassocv, logger=logger) yatsm.run() breakpoints = yatsm.record['break'][yatsm.record['break'] != 0] print('Found {n} breakpoints'.format(n=breakpoints.size)) if breakpoints.size > 0: for i, bp in enumerate(breakpoints): print('Break {0}: {1}'.format( i, dt.fromordinal(bp).strftime('%Y-%m-%d')))