def get_dtw_wrapping_path(data, col1, col2): ''' input: data: dataframe 源数据 col1: 列名 col2:列名 output: 输出图像,上方是col1,下方是col2 ''' indicators = [i for i in data.columns if i not in 'date'] array_subset = data[indicators].values array_subset_zscore = stats.zscore(array_subset) array_subset_zscore_T = array_subset_zscore.T x_idx = indicators.index(col1) y_idx = indicators.index(col2) # x = array_for_dtw_zscore_T[col1,:] # y = array_for_dtw_zscore_T[col2,:] x = array_subset_zscore_T[x_idx, :] y = array_subset_zscore_T[y_idx, :] path = dtw.warping_path(x, y) outname = col1 + 'vs' + col2 ds_xy = dtw.distance(x, y) dtwvis.plot_warping( x, y, path, filename= "D:/Pythoncode/JD_mart/operation_flow_distribution/DTW_for_business/results/%s.png" % outname) print("%s 和 %s 的DTW距离: %2.4f" % (col1, col2, ds_xy))
def print_dtw(series_1, series_2, output_path): """ Function to draw the DTW for two different time series :param series_1: First time serie to compare :param series_2: Second time serie to compare :param output_path: Path where the pictures will be stored """ len1 = roundup(series_1.__len__()) len2 = roundup(series_2.__len__()) contador = 0 series_1 = series_1 series_2 = series_2 series_1 = series_1[:len1] series_1 = np.split(series_1, int(len1 / 100)) series_2 = series_2[:len2] series_2 = np.split(series_2, int(len2 / 100)) for i in range(series_1.__len__()): path = dtw.warping_path(series_1[i], series_2[i]) print(path) dtwvis.plot_warping(series_1[i], series_2[i], path, filename=output_path % contador) contador += 1
def test_twoleadecg_1(directory=None): with util_numpy.test_uses_numpy() as np: s1 = np.array([1.8896,-0.23712,-0.23712,-0.20134,-0.16556,-0.20134,-0.16556,-0.12978,-0.058224,0.013335,0.031225,0.10278,0.013335,-0.094004,-0.058224,-0.11189,-0.14767,-0.16556,-0.14767,-0.094004,-0.14767,-0.16556,-0.16556,-0.21923,-0.21923,-0.25501,-0.20134,-0.20134,-0.18345,-0.23712,-0.20134,-0.23712,-0.12978,-0.11189,-0.46969,-1.2747,-2.3481,-2.8133,-2.7775,-2.5986,-2.3839,-2.0082,-1.8651,-1.6146,-1.3463,-1.1495,-0.88115,-0.55914,-0.34446,-0.16556,-0.0045548,0.2459,0.53214,0.65737,0.71104,0.74682,0.76471,0.76471,0.80049,0.81838,0.87204,0.88993,0.97938,0.97938,1.0152,1.0867,1.1583,1.1762,1.212,1.2656,1.2656,1.2477,1.2656,1.1762,1.0867,0.99727,0.88993,0.74682,0.63948,0.58581,0.47847,0.38902]) s2 = np.array([1,0.93163,0.094486,0.094486,0.038006,0.080366,0.080366,0.052126,0.080366,0.12273,0.22157,0.29217,0.41925,0.48985,0.39101,0.39101,0.30629,0.24981,0.19333,0.080366,-0.0043544,-0.018474,-0.089075,-0.11731,-0.14555,-0.17379,-0.21615,-0.27263,-0.20203,-0.315,-0.25851,-0.17379,-0.28675,-0.24439,0.16509,-0.11731,-1.0069,-1.9812,-2.4895,-2.786,-2.9272,-2.4612,-2.0518,-1.8964,-1.8258,-1.7411,-1.6705,-1.2893,-0.99276,-0.65388,-0.37148,-0.30087,-0.046714,0.30629,0.53221,0.65929,0.65929,0.72989,0.74401,0.87109,0.89933,0.95581,0.96993,1.0546,1.1394,1.2523,1.2523,1.2947,1.3088,1.3512,1.2806,1.2806,1.1394,1.097,0.89933,0.72989,0.67341,0.54633,0.37689,0.23569,0.10861,0.080366,-0.074955]) d, paths = dtw.warping_paths(s1, s2, psi=2, window=5) path = dtw.warping_path(s1, s2, psi=2) if directory: dtwvis.plot_warping(s1, s2, path, filename=str(directory / "warping.png")) path = dtw.best_path(paths) dtwvis.plot_warpingpaths(s1, s2, paths, path, filename=str(directory / "warpingpaths.png"))
def dtw_visual(x, y): # shape X, Y np.array([0., 0, 1, 2, 1, 0, 2, 1, 0, 0]) """ Plot to show how dtw works :param x: time series :param y: time series :return: """ from dtaidistance import dtw from dtaidistance import dtw_visualisation as dtwvis path = dtw.warping_path(x, y) dtwvis.plot_warping(x, y, path, filename="tmp.png")
def main(): all_calculations = [] for pattern in patterns: len_template = len(pattern.get_pattern()) window_size = len_template while window_size < len_list_of_closes: start_window: int = 0 end_window: int = window_size # not -1 because thts not how array[x:y] works while end_window < len_list_of_closes: window = list_of_closes[start_window:end_window] minimum_close, maximum_close = _get_min_max_close(window) window_calculations = _calculate_dtw_over_time_window( window=window, minimum_close=minimum_close, maximum_close=maximum_close, pattern=pattern, start_window=start_window, end_window=end_window, threshold=5) if window_calculations: all_calculations = all_calculations + window_calculations start_window = start_window + 1 end_window = end_window + 1 window_size = window_size + len_template all_calculations_df = pd.DataFrame(all_calculations).sort_values( by=['distance']) csv = all_calculations_df.to_csv('data/output.csv', index=False) for i, row in all_calculations_df.iterrows(): window = history_price_btc[ (history_price_btc['date'] >= row['start_date']) & (history_price_btc['date'] <= row['end_date'])] plot_fig = window.plot(x='date', y='close').get_figure() plot_fig.savefig( f'data/imgs/{row["start_date"]}-{row["end_date"]}-{row["pattern_name"]}.png' ) plt.close(plot_fig) dtwvis.plot_warping( row['normalized_data'], row['pattern'], row['path'], filename= f'data/imgs/{row["start_date"]}-{row["end_date"]}-{row["pattern_name"]}-dtw.png' )
def test_normalize(): with util_numpy.test_uses_numpy() as np: s1 = np.array([0., 0, 1, 2, 1, 0, 1, 0, 0, 2, 1, 0, 0]) s2 = np.array([0., 1, 2, 3, 1, 0, 0, 0, 2, 1, 0, 0, 0]) r, path = dtw.warp(s1, s2) if directory: dtwvis.plot_warp(s1, s2, r, path, filename=str(directory / "test_normalize1.png")) r_c = np.array([0., 1., 2., 2., 1., 0.5, 0., 0., 2., 1., 0., 0., 0.]) if directory: path = dtw.warping_path(s1, s2, psi=2) dtwvis.plot_warping(s1, s2, path, filename=str(directory / "test_normalize2.png")) np.testing.assert_almost_equal(r, r_c, decimal=4)
def test_bug4(): with util_numpy.test_uses_numpy() as np: s1 = np.array([0., 0, 1, 2, 1, 0, 1, 0, 0, 2, 1, 0, 0]) s2 = np.array([0., 1, 2, 3, 1, 0, 0, 0, 2, 1, 0, 0, 0]) path = dtw.warping_path(s1, s2) if directory: fn = directory / "bug4.png" else: file = tempfile.NamedTemporaryFile() fn = Path(file.name + "_bug4.png") dtwvis.plot_warping(s1, s2, path, filename=str(fn))
def compare_34dim(self, new_video_coordinates, reference_coordinates, i, j, weights): # new_video_coordinates = self.normalize(new_video_coordinates) new_video_coordinates = new_video_coordinates.reshape(i, 34) reference_coordinates = reference_coordinates.reshape(j, 34) best_path = dtw.best_path( dtw_ndim.warping_paths(new_video_coordinates, reference_coordinates)[1]) for body_part in range(17): dtw_visualisation.plot_warping( new_video_coordinates[:, 2 * body_part], reference_coordinates[:, 2 * body_part], best_path, "warp" + str(2 * body_part) + ".png") dtw_visualisation.plot_warping( new_video_coordinates[:, 2 * body_part + 1], reference_coordinates[:, 2 * body_part + 1], best_path, "warp" + str(2 * body_part + 1) + ".png") # Calculating euclidean distance per body part to apply weights # max_frames = max(i, j) body_part_scores = [] for body_part_i in range(17): v1_part, v2_part = [False] * len(best_path) * 2, [ False ] * len(best_path) * 2 print(len(v1_part), len(v2_part), len(best_path)) print(best_path) for k, t in enumerate(best_path): new_frame, reference_frame = t v1_part[k * 2] = new_video_coordinates[new_frame][body_part_i * 2] v1_part[k * 2 + 1] = new_video_coordinates[new_frame][body_part_i * 2 + 1] v2_part[k * 2] = reference_coordinates[reference_frame][body_part_i * 2] v2_part[k * 2 + 1] = reference_coordinates[reference_frame][ body_part_i * 2 + 1] v1_part = v1_part / np.linalg.norm(v1_part) v2_part = v2_part / np.linalg.norm(v2_part) score = self.percentage_score(ed.distance(v1_part, v2_part)) print(score) body_part_scores.append(score) return self.apply_weights(weights, body_part_scores), body_part_scores
def dtw_(self, length_min, length_max): path = dtw.warping_path(self.new_real_normal[length_min:length_max], self.ncsimul_y_normal[length_min:length_max]) distance, paths = dtw.warping_paths( self.new_real_normal[length_min:length_max], self.ncsimul_y_normal[length_min:length_max]) dtwvis.plot_warping(self.new_real_normal[length_min:length_max], self.ncsimul_y_normal[length_min:length_max], path, filename="warp" + str(self.test) + ".png") best_path = dtw.best_path(paths) dtwvis.plot_warpingpaths(self.new_real_normal[length_min:length_max], self.ncsimul_y_normal[length_min:length_max], paths, best_path, filename="best_path" + str(self.test) + ".png")
def prep_dtw(y, y_, min, max, file_): try: len(y) >= max and len(y_) >= max except: raise NameError('the maximum lengh not respects lenght of inputs') else: path = dtw.warping_path(y[min:max], y_[min:max]) distance, paths = dtw.warping_paths(y[min:max], y_[min:max]) dtwvis.plot_warping(y[min:max], y_[min:max], path, filename=file_ + "warp_results.png") best_path = dtw.best_path(paths) dtwvis.plot_warpingpaths(y[min:max], y_[min:max], paths, best_path, filename=file_ + "best_path_results.png") return path, distance
def main(): s1 = np.array([0., 0, 1, 2, 1, 0, 1, 0, 0, 0, 2, 1, 0, 0]) s2 = np.array([0., 1, 2, 3, 1, 0, 0, 0, 2, 1, 0, 0, 0]) path = dtw.warping_path(s1, s2) dtwvis.plot_warping(s1, s2, path) plt.figure(1) plt.subplot(211) plt.title('Timeseries: s1 & s2') plt.plot(s1) plt.subplot(212) plt.plot(s2) plt.show() dist = dtw.distance(s1, s2) print(dist) plt.figure(2) d, paths = dtw.warping_paths(s1, s2, window=3, psi=2) best_path = dtw.best_path(paths) dtwvis.plot_warpingpaths(s1, s2, paths, best_path)
def test_twoleadecg_1(): """Example from http://www.timeseriesclassification.com/description.php?Dataset=TwoLeadECG""" with util_numpy.test_uses_numpy() as np: s1 = np.array([1.8896,-0.23712,-0.23712,-0.20134,-0.16556,-0.20134,-0.16556,-0.12978,-0.058224,0.013335,0.031225,0.10278,0.013335,-0.094004,-0.058224,-0.11189,-0.14767,-0.16556,-0.14767,-0.094004,-0.14767,-0.16556,-0.16556,-0.21923,-0.21923,-0.25501,-0.20134,-0.20134,-0.18345,-0.23712,-0.20134,-0.23712,-0.12978,-0.11189,-0.46969,-1.2747,-2.3481,-2.8133,-2.7775,-2.5986,-2.3839,-2.0082,-1.8651,-1.6146,-1.3463,-1.1495,-0.88115,-0.55914,-0.34446,-0.16556,-0.0045548,0.2459,0.53214,0.65737,0.71104,0.74682,0.76471,0.76471,0.80049,0.81838,0.87204,0.88993,0.97938,0.97938,1.0152,1.0867,1.1583,1.1762,1.212,1.2656,1.2656,1.2477,1.2656,1.1762,1.0867,0.99727,0.88993,0.74682,0.63948,0.58581,0.47847,0.38902]) s2 = np.array([1,0.93163,0.094486,0.094486,0.038006,0.080366,0.080366,0.052126,0.080366,0.12273,0.22157,0.29217,0.41925,0.48985,0.39101,0.39101,0.30629,0.24981,0.19333,0.080366,-0.0043544,-0.018474,-0.089075,-0.11731,-0.14555,-0.17379,-0.21615,-0.27263,-0.20203,-0.315,-0.25851,-0.17379,-0.28675,-0.24439,0.16509,-0.11731,-1.0069,-1.9812,-2.4895,-2.786,-2.9272,-2.4612,-2.0518,-1.8964,-1.8258,-1.7411,-1.6705,-1.2893,-0.99276,-0.65388,-0.37148,-0.30087,-0.046714,0.30629,0.53221,0.65929,0.65929,0.72989,0.74401,0.87109,0.89933,0.95581,0.96993,1.0546,1.1394,1.2523,1.2523,1.2947,1.3088,1.3512,1.2806,1.2806,1.1394,1.097,0.89933,0.72989,0.67341,0.54633,0.37689,0.23569,0.10861,0.080366,-0.074955]) d, paths = dtw.warping_paths(s1, s2, psi=2, window=5) path = dtw.warping_path(s1, s2, psi=2) if not dtwvis.test_without_visualization(): if directory: import matplotlib.pyplot as plt fig, axs = dtwvis.plot_warping(s1, s2, path) # type: plt.Figure, plt.axes.Axes fig.set_size_inches(12, 10) fig.set_dpi(100) fig.savefig(str(directory / "warping.png")) plt.close(fig) path = dtw.best_path(paths) dtwvis.plot_warpingpaths(s1, s2, paths, path, filename=str(directory / "warpingpaths.png"))
#dynamic time warping import stampProcessor import numpy as np mode = 'propagationDelayCorrection' coarseTau = 10000 shift = -51318536.0 # We define two sequences x, y as numpy array # where y is actually a sub-sequence from x timeStampAlice = np.load('../data/aliceBobtimeStampAlice.npy') timeStampBob = np.load('../data/aliceBobtimeStampBob.npy') coarseTimebinAlice = stampProcessor.timebin(coarseTau, timeStampAlice) coarseTimebinBob = stampProcessor.timebin(coarseTau, timeStampBob) s1 = coarseTimebinAlice[500000:505000] s2 = coarseTimebinAlice[500000:505000] print('len(x)', len(s1)) print('len(y)', len(s2)) from dtaidistance import dtw from dtaidistance import dtw_visualisation as dtwvis path = dtw.warping_path(s1, s2) dtwvis.plot_warping(s1, s2, path, filename="warp.png") d, paths = dtw.warping_paths(s1, s2, window=25, psi=2) best_path = dtw.best_path(paths) dtwvis.plot_warpingpaths(s1, s2, paths, best_path, filename="path.png")
from dtaidistance import dtw from dtaidistance import dtw_visualisation as dtwvis import numpy as np s1 = np.array([0., 0, 1, 2, 1, 0, 1, 0, 0, 2, 1, 0, 0]) s2 = np.array([0., 1, 2, 3, 1, 0, 0, 0, 2, 1, 0, 0, 0]) path = dtw.warping_path(s1, s2) dtwvis.plot_warping(s1, s2, path, filename="img/dynamicwarping.png")
#Using point DTW distanceRshoulX = dtw.distance(rshoul_bX[:250], rshoul_eX[:250]) distanceRshoulY = dtw.distance(rshoul_bY[:250], rshoul_eY[:250]) distanceRelbowX = dtw.distance(relbow_bX[:250], relbow_eX[:250]) distanceRelbowY = dtw.distance(relbow_bY[:250], relbow_eY[:250]) distanceRwristX = dtw.distance(rwrist_bX[:250], rwrist_eX[:250]) distanceRwristY = dtw.distance(rwrist_bY[:250], rwrist_eY[:250]) distance = distanceRshoulX + distanceRshoulY + distanceRelbowX + distanceRelbowY + distanceRwristX + distanceRwristY distX = distanceRshoulX + distanceRelbowX + distanceRwristX distY = distanceRshoulY + distanceRelbowY + distanceRwristY print(distance) print(dtw.distance(bdxy, exy)) d, paths = dtw.warping_paths(bdxy, exy) best_path = dtw.best_path(paths) dtwvis.plot_warping(bdxy, exy, best_path, filename="Graphs/test_point_badX.png") #print(paths) dtwvis.plot_warpingpaths(bdxy, exy, paths, path=best_path, filename="Graphs/testXX.png")
from dtaidistance import dtw from dtaidistance import dtw_visualisation as dtwvis import pandas as pd # 计算股票间的对数收益时间序列间的动态时间规整距离 path1,path2 = "000001.XSHE.csv","000063.XSHE.csv", feature = "rclose" length = 20 window,psi = 10,5 rc1,rc2 = pd.read_csv(path1)[feature][:length],pd.read_csv(path2)[feature][:length] dis, paths = dtw.warping_paths(rc1, rc2, window=window, psi=psi) # 动态时间规整距离 print(dis) # 绘图(输出形式) best_path = dtw.best_path(paths) dtwvis.plot_warpingpaths(rc1, rc2, paths, best_path,shownumbers=True) # 绘图(保存) path = dtw.warping_path(rc1, rc2) dtwvis.plot_warping(rc1, rc2, path, filename="wrapping.png")