if NUM_SURR != 0: surr_completed = 0 diffs = np.zeros((NUM_SURR, )) mean_vars = np.zeros_like(diffs) g_surrs.data = g.data[start_idx:end_idx].copy() g_surrs.time = g.time[start_idx:end_idx].copy() if np.all(np.isnan(g_surrs.data) == False): # construct the job queue jobQ = Queue() resQ = Queue() for i in range(NUM_SURR): jobQ.put(1) for i in range(WORKERS): jobQ.put(None) a = g_surrs.get_seasonality(DETREND=True) sg = SurrogateField() sg.copy_field(g_surrs) if SURR_TYPE == 'AR': sg.prepare_AR_surrogates() workers = [ Process(target=_cond_difference_surrogates, args=(sg, g_surrs, a, start_cut, jobQ, resQ)) for iota in range(WORKERS) ] for w in workers: w.start() while surr_completed < NUM_SURR: # get result diff, meanVar = resQ.get() diffs[surr_completed] = diff mean_vars[surr_completed] = meanVar
WINDOW_LENGTH = 16384 WINDOW_SHIFT = 1 # years, delta in the sliding window analysis MEANS = True # if True, compute conditional means, if False, compute conditional variance WORKERS = 16 NUM_SURR = 100 # how many surrs will be used to evaluate SURR_TYPE = 'AR' # MF, FT, AR diff_ax = (0, 2) # means -> 0, 2, var -> 1, 8 mean_ax = (18, 22) # means -> -1, 1.5, var -> 9, 18 PLOT_PHASE = False PHASE_ANALYSIS_YEAR = None # year of detailed analysis - phase and bins, or None AMPLITUDE = True ## loading data g = load_station_data('TG_STAID000027.txt', date(1834, 7, 28), date(2014, 1, 1), ANOMALISE) sg = SurrogateField() if AMPLITUDE: g_amp = load_station_data('TG_STAID000027.txt', date(1834, 7, 28), date(2014, 1, 1), False) sg_amp = SurrogateField() print( "[%s] Wavelet analysis in progress with %d year window shifted by %d year(s)..." % (str(datetime.now()), WINDOW_LENGTH, WINDOW_SHIFT)) k0 = 6. # wavenumber of Morlet wavelet used in analysis y = 365.25 # year in days fourier_factor = (4 * np.pi) / (k0 + np.sqrt(2 + np.power(k0, 2))) period = PERIOD * y # frequency of interest s0 = period / fourier_factor # get scale cond_means = np.zeros((8, ))
if MEANS: cond_means[iota] = np.mean(g.data[ndx]) else: cond_means[iota] = np.var(g.data[ndx], ddof=1) difference[i, j] = cond_means.max() - cond_means.min( ) # append difference to list mean_var[i, j] = np.mean(cond_means) print( "[%s] Wavelet analysis done. Now computing wavelet for MF surrogates in parallel..." % str(datetime.now())) surrogates_difference = np.zeros([num_surr] + list(difference.shape)) surrogates_mean_var = np.zeros_like(surrogates_difference) surr_completed = 0 sg = SurrogateField() sg.copy_field(g) mean, var, trend = g.get_seasonality(DETREND=True) def _cond_difference_surrogates(sg, jobq, resq): while jobq.get() is not None: difference = np.zeros((sg.lats.shape[0], sg.lons.shape[0])) mean_var = np.zeros_like(difference) sg.construct_multifractal_surrogates() sg.add_seasonality(mean, var, trend) for i in range(sg.lats.shape[0]): for j in range(sg.lons.shape[0]): wave, _, _, _ = wavelet_analysis.continous_wavelet( sg.surr_data[:, i, j], 1,
plt.savefig(fname) else: plt.show() cond_means_surr = np.zeros((NUM_SURR, BINS)) surr_mom = [] mean, var, trend = g.get_seasonality(True) if AMPLITUDE: mean2, var2, trend2 = g_amp.get_seasonality(True) su = 0 tot = 0 while su < NUM_SURR: if AMPLITUDE: sg_amp = SurrogateField() sg_amp.copy_field(g_amp) sg = SurrogateField() sg.copy_field(g) if SURR_TYPE == 'MF': if AMPLITUDE: sg_amp.construct_multifractal_surrogates() sg_amp.add_seasonality(mean2, var2, trend2) sg.construct_multifractal_surrogates() sg.add_seasonality(mean, var, trend) elif SURR_TYPE == 'FT': if AMPLITUDE: sg_amp.construct_fourier_surrogates_spatial() sg_amp.add_seasonality(mean2, var2, trend2) sg.construct_fourier_surrogates_spatial() sg.add_seasonality(mean, var, trend)
WINDOW_LENGTH = 16384 WINDOW_SHIFT = 1 # years, delta in the sliding window analysis MEANS = True # if True, compute conditional means, if False, compute conditional variance WORKERS = 16 NUM_SURR = 100 # how many surrs will be used to evaluate SURR_TYPE = 'AR' # MF, FT, AR diff_ax = (0, 2) # means -> 0, 2, var -> 1, 8 mean_ax = (18, 22) # means -> -1, 1.5, var -> 9, 18 PLOT_PHASE = False PHASE_ANALYSIS_YEAR = None # year of detailed analysis - phase and bins, or None AMPLITUDE = True ## loading data g = load_station_data('TG_STAID000027.txt', date(1834,7,28), date(2014,1,1), ANOMALISE) sg = SurrogateField() if AMPLITUDE: g_amp = load_station_data('TG_STAID000027.txt', date(1834,7,28), date(2014, 1, 1), False) sg_amp = SurrogateField() print("[%s] Wavelet analysis in progress with %d year window shifted by %d year(s)..." % (str(datetime.now()), WINDOW_LENGTH, WINDOW_SHIFT)) k0 = 6. # wavenumber of Morlet wavelet used in analysis y = 365.25 # year in days fourier_factor = (4 * np.pi) / (k0 + np.sqrt(2 + np.power(k0,2))) period = PERIOD * y # frequency of interest s0 = period / fourier_factor # get scale cond_means = np.zeros((8,))
data_diff = cond_means[:, 1].max() - cond_means[:, 1].min() if SURR: cond_means_surr = np.zeros((NUM_SURR, BINS, 2)) amp_diff_surr = np.zeros((NUM_SURR, )) surr_diff_surr = np.zeros((NUM_SURR, )) amp_surr = np.zeros((NUM_SURR, )) surr_completed = 0 jobQ = Queue() resQ = Queue() for i in range(NUM_SURR): jobQ.put(1) for i in range(WORKERS): jobQ.put(None) a = g_amp.get_seasonality(True) sg = SurrogateField() sg.copy_field(g_amp) phase_bins = get_equidistant_bins(BINS) workers = [ Process(target=_reconstruction_surrs, args=(sg, a, jobQ, resQ, idx)) for iota in range(WORKERS) ] for w in workers: w.start() while surr_completed < NUM_SURR: surr_means = resQ.get() cond_means_surr[surr_completed, :, 0] = surr_means[0][:, 0] cond_means_surr[surr_completed, :, 1] = surr_means[0][:, 1] amp_diff_surr[surr_completed] = surr_means[1] surr_diff_surr[surr_completed] = surr_means[2]
if SURR: cond_means_surr = np.zeros((NUM_SURR, BINS, 2)) amp_diff_surr = np.zeros((NUM_SURR,)) surr_diff_surr = np.zeros((NUM_SURR,)) amp_surr = np.zeros((NUM_SURR,)) surr_completed = 0 jobQ = Queue() resQ = Queue() for i in range(NUM_SURR): jobQ.put(1) for i in range(WORKERS): jobQ.put(None) a = g_amp.get_seasonality(True) sg = SurrogateField() sg.copy_field(g_amp) phase_bins = get_equidistant_bins(BINS) workers = [Process(target = _reconstruction_surrs, args = (sg, a, jobQ, resQ, idx)) for iota in range(WORKERS)] for w in workers: w.start() while surr_completed < NUM_SURR: surr_means = resQ.get() cond_means_surr[surr_completed, :, 0] = surr_means[0][:, 0] cond_means_surr[surr_completed, :, 1] = surr_means[0][:, 1] amp_diff_surr[surr_completed] = surr_means[1] surr_diff_surr[surr_completed] = surr_means[2] amp_surr[surr_completed] = surr_means[3]
phase_bins = get_equidistant_bins() # equidistant bins ndx = ((phase[0,:] >= phase_bins[iota]) & (phase[0,:] <= phase_bins[iota+1])) if MEANS: cond_means[iota] = np.mean(g.data[ndx]) else: cond_means[iota] = np.var(g.data[ndx], ddof = 1) difference[i, j] = cond_means.max() - cond_means.min() # append difference to list mean_var[i, j] = np.mean(cond_means) print("[%s] Wavelet analysis done. Now computing wavelet for MF surrogates in parallel..." % str(datetime.now())) surrogates_difference = np.zeros([num_surr] + list(difference.shape)) surrogates_mean_var = np.zeros_like(surrogates_difference) surr_completed = 0 sg = SurrogateField() sg.copy_field(g) mean, var, trend = g.get_seasonality(DETREND = True) def _cond_difference_surrogates(sg, jobq, resq): while jobq.get() is not None: difference = np.zeros((sg.lats.shape[0], sg.lons.shape[0])) mean_var = np.zeros_like(difference) sg.construct_multifractal_surrogates() sg.add_seasonality(mean, var, trend) for i in range(sg.lats.shape[0]): for j in range(sg.lons.shape[0]): wave, _, _, _ = wavelet_analysis.continous_wavelet(sg.surr_data[:, i, j], 1, False, wavelet_analysis.morlet, dj = 0, s0 = s0, j1 = 0, k0 = k0) # perform wavelet phase = np.arctan2(np.imag(wave), np.real(wave)) # get phases from oscillatory modes for iota in range(cond_means.shape[0]): # get conditional means for current phase range #phase_bins = get_equiquantal_bins(phase_temp) # equiquantal bins
if NUM_SURR != 0: surr_completed = 0 diffs = np.zeros((NUM_SURR,)) mean_vars = np.zeros_like(diffs) g_surrs.data = g.data[start_idx : end_idx].copy() g_surrs.time = g.time[start_idx : end_idx].copy() if np.all(np.isnan(g_surrs.data) == False): # construct the job queue jobQ = Queue() resQ = Queue() for i in range(NUM_SURR): jobQ.put(1) for i in range(WORKERS): jobQ.put(None) a = g_surrs.get_seasonality(DETREND = True) sg = SurrogateField() sg.copy_field(g_surrs) if SURR_TYPE == 'AR': sg.prepare_AR_surrogates() workers = [Process(target = _cond_difference_surrogates, args = (sg, g_surrs, a, start_cut, jobQ, resQ)) for iota in range(WORKERS)] for w in workers: w.start() while surr_completed < NUM_SURR: # get result diff, meanVar = resQ.get() diffs[surr_completed] = diff mean_vars[surr_completed] = meanVar surr_completed += 1 for w in workers: w.join()
created on May 6, 2014 @author: Nikola Jajcay """ from src.oscillatory_time_series import OscillatoryTimeSeries from src.data_class import DataField from datetime import date, timedelta import matplotlib.pyplot as plt import numpy as np from surrogates.surrogates import SurrogateField import calendar ts = OscillatoryTimeSeries('TG_STAID000027.txt', date(1834,7,28), date(2014,1,1), False) sg = SurrogateField() g = DataField() daily_var = np.zeros((365,3)) mean, var_data, trend = ts.g.get_seasonality(True) sg.copy_field(ts.g) #MF sg.construct_multifractal_surrogates() sg.add_seasonality(mean, var_data, trend) g.data = sg.surr_data.copy() g.time = sg.time.copy() _, var_surr_MF, _ = g.get_seasonality(True)
else: plt.show() cond_means_surr = np.zeros((NUM_SURR, BINS)) surr_mom = [] mean, var, trend = g.get_seasonality(True) if AMPLITUDE: mean2, var2, trend2 = g_amp.get_seasonality(True) su = 0 tot = 0 while su < NUM_SURR: if AMPLITUDE: sg_amp = SurrogateField() sg_amp.copy_field(g_amp) sg = SurrogateField() sg.copy_field(g) if SURR_TYPE == 'MF': if AMPLITUDE: sg_amp.construct_multifractal_surrogates() sg_amp.add_seasonality(mean2, var2, trend2) sg.construct_multifractal_surrogates() sg.add_seasonality(mean, var, trend) elif SURR_TYPE == 'FT': if AMPLITUDE: sg_amp.construct_fourier_surrogates_spatial() sg_amp.add_seasonality(mean2, var2, trend2) sg.construct_fourier_surrogates_spatial() sg.add_seasonality(mean, var, trend)
phase_bins = get_equidistant_bins(BINS) cond_means = np.zeros((BINS, 2)) # :,0 - SATA, :,1 - SATamp for i in range(cond_means.shape[0]): ndx = ((phase >= phase_bins[i]) & (phase <= phase_bins[i+1])) cond_means[i, 1] = np.mean(amplitude[ndx]) cond_means[i, 0] = np.mean(g_data.data[ndx]) cond_means_surr = np.zeros((NUM_SURR, BINS, 2)) mean, var, trend = g.get_seasonality(True) mean2, var2, trend2 = g_amp.get_seasonality(True) for su in range(NUM_SURR): sg_amp = SurrogateField() sg_amp.copy_field(g_amp) sg = SurrogateField() sg.copy_field(g) # MF sg_amp.construct_multifractal_surrogates() sg_amp.add_seasonality(mean2, var2, trend2) sg.construct_multifractal_surrogates() sg.add_seasonality(mean, var, trend) # AR # sg_amp.prepare_AR_surrogates() # sg_amp.construct_surrogates_with_residuals() # sg_amp.add_seasonality(mean2[:-1], var2[:-1], trend2[:-1]) # sg.prepare_AR_surrogates()
created on May 6, 2014 @author: Nikola Jajcay """ from src.oscillatory_time_series import OscillatoryTimeSeries from src.data_class import DataField from datetime import date, timedelta import matplotlib.pyplot as plt import numpy as np from surrogates.surrogates import SurrogateField import calendar ts = OscillatoryTimeSeries('TG_STAID000027.txt', date(1834, 7, 28), date(2014, 1, 1), False) sg = SurrogateField() g = DataField() daily_var = np.zeros((365, 3)) mean, var_data, trend = ts.g.get_seasonality(True) sg.copy_field(ts.g) #MF sg.construct_multifractal_surrogates() sg.add_seasonality(mean, var_data, trend) g.data = sg.surr_data.copy() g.time = sg.time.copy() _, var_surr_MF, _ = g.get_seasonality(True)