diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..4114ab605f6e3ca56661901e0c2b7202253ac4c7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,35 +1,55 @@ *.7z filter=lfs diff=lfs merge=lfs -text *.arrow filter=lfs diff=lfs merge=lfs -text *.bin filter=lfs diff=lfs merge=lfs -text +*.bin.* filter=lfs diff=lfs merge=lfs -text *.bz2 filter=lfs diff=lfs merge=lfs -text -*.ckpt filter=lfs diff=lfs merge=lfs -text *.ftz filter=lfs diff=lfs merge=lfs -text *.gz filter=lfs diff=lfs merge=lfs -text *.h5 filter=lfs diff=lfs merge=lfs -text *.joblib filter=lfs diff=lfs merge=lfs -text *.lfs.* filter=lfs diff=lfs merge=lfs -text -*.mlmodel filter=lfs diff=lfs merge=lfs -text *.model filter=lfs diff=lfs merge=lfs -text *.msgpack filter=lfs diff=lfs merge=lfs -text -*.npy filter=lfs diff=lfs merge=lfs -text -*.npz filter=lfs diff=lfs merge=lfs -text *.onnx filter=lfs diff=lfs merge=lfs -text *.ot filter=lfs diff=lfs merge=lfs -text *.parquet filter=lfs diff=lfs merge=lfs -text *.pb filter=lfs diff=lfs merge=lfs -text -*.pickle filter=lfs diff=lfs merge=lfs -text -*.pkl filter=lfs diff=lfs merge=lfs -text *.pt filter=lfs diff=lfs merge=lfs -text *.pth filter=lfs diff=lfs merge=lfs -text *.rar filter=lfs diff=lfs merge=lfs -text -*.safetensors filter=lfs diff=lfs merge=lfs -text saved_model/**/* filter=lfs diff=lfs merge=lfs -text *.tar.* filter=lfs diff=lfs merge=lfs -text -*.tar filter=lfs diff=lfs merge=lfs -text *.tflite filter=lfs diff=lfs merge=lfs -text *.tgz filter=lfs diff=lfs merge=lfs -text -*.wasm filter=lfs diff=lfs merge=lfs -text *.xz filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text +*.zstandard filter=lfs diff=lfs merge=lfs -text +*.tfevents* filter=lfs diff=lfs merge=lfs -text +*.db* filter=lfs diff=lfs merge=lfs -text +*.ark* filter=lfs diff=lfs merge=lfs -text +**/*ckpt*data* filter=lfs diff=lfs merge=lfs -text +**/*ckpt*.meta filter=lfs diff=lfs merge=lfs -text +**/*ckpt*.index filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.gguf* filter=lfs diff=lfs merge=lfs -text +*.ggml filter=lfs diff=lfs merge=lfs -text +*.llamafile* filter=lfs diff=lfs merge=lfs -text +*.pt2 filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text *.zst filter=lfs diff=lfs merge=lfs -text *tfevents* filter=lfs diff=lfs merge=lfs -text + +figure/结果可视化图.png filter=lfs diff=lfs merge=lfs -text + +结果可视化图.png filter=lfs diff=lfs merge=lfs -text + +figure/global.png filter=lfs diff=lfs merge=lfs -text +figure/china.png filter=lfs diff=lfs merge=lfs -text +figure/MambaCliMateNet.png filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/configuration.json b/configuration.json new file mode 100644 index 0000000000000000000000000000000000000000..3fc809d275f08e4fbca6f5d2b7ff3fb1073aeef9 --- /dev/null +++ b/configuration.json @@ -0,0 +1 @@ +{"framework":"Pytorch","task":"other"} \ No newline at end of file diff --git a/data_provider/__init__.py b/data_provider/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/data_provider/data_factory.py b/data_provider/data_factory.py new file mode 100644 index 0000000000000000000000000000000000000000..51a5fc87ffe781c754f5954d64d1aeb9165bded5 --- /dev/null +++ b/data_provider/data_factory.py @@ -0,0 +1,54 @@ +from data_provider.data_loader import Dataset_ETT_hour, Dataset_ETT_minute, Dataset_Custom, Dataset_Solar, Dataset_PEMS, \ + Dataset_Pred +from torch.utils.data import DataLoader + +data_dict = { + 'ETTh1': Dataset_ETT_hour, + 'ETTh2': Dataset_ETT_hour, + 'ETTm1': Dataset_ETT_minute, + 'ETTm2': Dataset_ETT_minute, + 'Solar': Dataset_Solar, + 'PEMS': Dataset_PEMS, + 'custom': Dataset_Custom, +} + + +def data_provider(args, flag): + Data = data_dict[args.data] + timeenc = 0 if args.embed != 'timeF' else 1 + + if flag == 'test': + shuffle_flag = False + drop_last = True + batch_size = 1 # bsz=1 for evaluation + freq = args.freq + elif flag == 'pred': + shuffle_flag = False + drop_last = False + batch_size = 1 + freq = args.freq + Data = Dataset_Pred + else: + shuffle_flag = True + drop_last = True + batch_size = args.batch_size # bsz for train and valid + freq = args.freq + + data_set = Data( + root_path=args.root_path, + data_path=args.data_path, + flag=flag, + size=[args.seq_len, args.label_len, args.pred_len], + features=args.features, + target=args.target, + timeenc=timeenc, + freq=freq, + ) + print(flag, len(data_set)) + data_loader = DataLoader( + data_set, + batch_size=batch_size, + shuffle=shuffle_flag, + num_workers=args.num_workers, + drop_last=drop_last) + return data_set, data_loader diff --git a/data_provider/data_loader.py b/data_provider/data_loader.py new file mode 100644 index 0000000000000000000000000000000000000000..c86471da792816224c4f1e9a7f1248f074924a92 --- /dev/null +++ b/data_provider/data_loader.py @@ -0,0 +1,535 @@ +import os +import numpy as np +import pandas as pd +import torch +from torch.utils.data import Dataset, DataLoader +from sklearn.preprocessing import StandardScaler +from utils.timefeatures import time_features +import warnings + +warnings.filterwarnings('ignore') + + +class Dataset_ETT_hour(Dataset): + def __init__(self, root_path, flag='train', size=None, + features='S', data_path='ETTh1.csv', + target='OT', scale=True, timeenc=0, freq='h'): + # size [seq_len, label_len, pred_len] + # info + if size == None: + self.seq_len = 24 * 4 * 4 + self.label_len = 24 * 4 + self.pred_len = 24 * 4 + else: + self.seq_len = size[0] + self.label_len = size[1] + self.pred_len = size[2] + # init + assert flag in ['train', 'test', 'val'] + type_map = {'train': 0, 'val': 1, 'test': 2} + self.set_type = type_map[flag] + + self.features = features + self.target = target + self.scale = scale + self.timeenc = timeenc + self.freq = freq + + self.root_path = root_path + self.data_path = data_path + self.__read_data__() + + def __read_data__(self): + self.scaler = StandardScaler() + df_raw = pd.read_csv(os.path.join(self.root_path, + self.data_path)) + + border1s = [0, 12 * 30 * 24 - self.seq_len, 12 * 30 * 24 + 4 * 30 * 24 - self.seq_len] + border2s = [12 * 30 * 24, 12 * 30 * 24 + 4 * 30 * 24, 12 * 30 * 24 + 8 * 30 * 24] + border1 = border1s[self.set_type] + border2 = border2s[self.set_type] + + if self.features == 'M' or self.features == 'MS': + cols_data = df_raw.columns[1:] + df_data = df_raw[cols_data] + elif self.features == 'S': + df_data = df_raw[[self.target]] + + if self.scale: + train_data = df_data[border1s[0]:border2s[0]] + self.scaler.fit(train_data.values) + data = self.scaler.transform(df_data.values) + else: + data = df_data.values + + df_stamp = df_raw[['date']][border1:border2] + df_stamp['date'] = pd.to_datetime(df_stamp.date) + if self.timeenc == 0: + df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1) + df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1) + df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1) + df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1) + data_stamp = df_stamp.drop(['date'], 1).values + elif self.timeenc == 1: + data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq) + data_stamp = data_stamp.transpose(1, 0) + + self.data_x = data[border1:border2] + self.data_y = data[border1:border2] + self.data_stamp = data_stamp + + def __getitem__(self, index): + s_begin = index + s_end = s_begin + self.seq_len + r_begin = s_end - self.label_len + r_end = r_begin + self.label_len + self.pred_len + + seq_x = self.data_x[s_begin:s_end] + seq_y = self.data_y[r_begin:r_end] + seq_x_mark = self.data_stamp[s_begin:s_end] + seq_y_mark = self.data_stamp[r_begin:r_end] + + return seq_x, seq_y, seq_x_mark, seq_y_mark + + def __len__(self): + return len(self.data_x) - self.seq_len - self.pred_len + 1 + + def inverse_transform(self, data): + return self.scaler.inverse_transform(data) + + +class Dataset_ETT_minute(Dataset): + def __init__(self, root_path, flag='train', size=None, + features='S', data_path='ETTm1.csv', + target='OT', scale=True, timeenc=0, freq='t'): + # size [seq_len, label_len, pred_len] + # info + if size == None: + self.seq_len = 24 * 4 * 4 + self.label_len = 24 * 4 + self.pred_len = 24 * 4 + else: + self.seq_len = size[0] + self.label_len = size[1] + self.pred_len = size[2] + # init + assert flag in ['train', 'test', 'val'] + type_map = {'train': 0, 'val': 1, 'test': 2} + self.set_type = type_map[flag] + + self.features = features + self.target = target + self.scale = scale + self.timeenc = timeenc + self.freq = freq + + self.root_path = root_path + self.data_path = data_path + self.__read_data__() + + def __read_data__(self): + self.scaler = StandardScaler() + df_raw = pd.read_csv(os.path.join(self.root_path, + self.data_path)) + + border1s = [0, 12 * 30 * 24 * 4 - self.seq_len, 12 * 30 * 24 * 4 + 4 * 30 * 24 * 4 - self.seq_len] + border2s = [12 * 30 * 24 * 4, 12 * 30 * 24 * 4 + 4 * 30 * 24 * 4, 12 * 30 * 24 * 4 + 8 * 30 * 24 * 4] + border1 = border1s[self.set_type] + border2 = border2s[self.set_type] + + if self.features == 'M' or self.features == 'MS': + cols_data = df_raw.columns[1:] + df_data = df_raw[cols_data] + elif self.features == 'S': + df_data = df_raw[[self.target]] + + if self.scale: + train_data = df_data[border1s[0]:border2s[0]] + self.scaler.fit(train_data.values) + data = self.scaler.transform(df_data.values) + else: + data = df_data.values + + df_stamp = df_raw[['date']][border1:border2] + df_stamp['date'] = pd.to_datetime(df_stamp.date) + if self.timeenc == 0: + df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1) + df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1) + df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1) + df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1) + df_stamp['minute'] = df_stamp.date.apply(lambda row: row.minute, 1) + df_stamp['minute'] = df_stamp.minute.map(lambda x: x // 15) + data_stamp = df_stamp.drop(['date'], 1).values + elif self.timeenc == 1: + data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq) + data_stamp = data_stamp.transpose(1, 0) + + self.data_x = data[border1:border2] + self.data_y = data[border1:border2] + self.data_stamp = data_stamp + + def __getitem__(self, index): + s_begin = index + s_end = s_begin + self.seq_len + r_begin = s_end - self.label_len + r_end = r_begin + self.label_len + self.pred_len + + seq_x = self.data_x[s_begin:s_end] + seq_y = self.data_y[r_begin:r_end] + seq_x_mark = self.data_stamp[s_begin:s_end] + seq_y_mark = self.data_stamp[r_begin:r_end] + + return seq_x, seq_y, seq_x_mark, seq_y_mark + + def __len__(self): + return len(self.data_x) - self.seq_len - self.pred_len + 1 + + def inverse_transform(self, data): + return self.scaler.inverse_transform(data) + + +class Dataset_Custom(Dataset): + def __init__(self, root_path, flag='train', size=None, + features='S', data_path='ETTh1.csv', + target='OT', scale=True, timeenc=0, freq='h'): + # size [seq_len, label_len, pred_len] + # info + if size == None: + self.seq_len = 24 * 4 * 4 + self.label_len = 24 * 4 + self.pred_len = 24 * 4 + else: + self.seq_len = size[0] + self.label_len = size[1] + self.pred_len = size[2] + # init + assert flag in ['train', 'test', 'val'] + type_map = {'train': 0, 'val': 1, 'test': 2} + self.set_type = type_map[flag] + + self.features = features + self.target = target + self.scale = scale + self.timeenc = timeenc + self.freq = freq + + self.root_path = root_path + self.data_path = data_path + self.__read_data__() + + def __read_data__(self): + self.scaler = StandardScaler() + df_raw = pd.read_csv(os.path.join(self.root_path, + self.data_path)) + + ''' + df_raw.columns: ['date', ...(other features), target feature] + ''' + cols = list(df_raw.columns) + cols.remove(self.target) + cols.remove('date') + df_raw = df_raw[['date'] + cols + [self.target]] + num_train = int(len(df_raw) * 0.7) + num_test = int(len(df_raw) * 0.2) + num_vali = len(df_raw) - num_train - num_test + border1s = [0, num_train - self.seq_len, len(df_raw) - num_test - self.seq_len] + border2s = [num_train, num_train + num_vali, len(df_raw)] + border1 = border1s[self.set_type] + border2 = border2s[self.set_type] + + if self.features == 'M' or self.features == 'MS': + cols_data = df_raw.columns[1:] + df_data = df_raw[cols_data] + elif self.features == 'S': + df_data = df_raw[[self.target]] + + if self.scale: + train_data = df_data[border1s[0]:border2s[0]] + self.scaler.fit(train_data.values) + data = self.scaler.transform(df_data.values) + else: + data = df_data.values + + df_stamp = df_raw[['date']][border1:border2] + df_stamp['date'] = pd.to_datetime(df_stamp.date) + if self.timeenc == 0: + df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1) + df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1) + df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1) + df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1) + data_stamp = df_stamp.drop(['date'], 1).values + elif self.timeenc == 1: + data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq) + data_stamp = data_stamp.transpose(1, 0) + + self.data_x = data[border1:border2] + self.data_y = data[border1:border2] + self.data_stamp = data_stamp + + def __getitem__(self, index): + s_begin = index + s_end = s_begin + self.seq_len + r_begin = s_end - self.label_len + r_end = r_begin + self.label_len + self.pred_len + + seq_x = self.data_x[s_begin:s_end] + seq_y = self.data_y[r_begin:r_end] + seq_x_mark = self.data_stamp[s_begin:s_end] + seq_y_mark = self.data_stamp[r_begin:r_end] + + return seq_x, seq_y, seq_x_mark, seq_y_mark + + def __len__(self): + return len(self.data_x) - self.seq_len - self.pred_len + 1 + + def inverse_transform(self, data): + return self.scaler.inverse_transform(data) + + +class Dataset_PEMS(Dataset): + def __init__(self, root_path, flag='train', size=None, + features='S', data_path='ETTh1.csv', + target='OT', scale=True, timeenc=0, freq='h'): + # size [seq_len, label_len, pred_len] + # info + self.seq_len = size[0] + self.label_len = size[1] + self.pred_len = size[2] + # init + assert flag in ['train', 'test', 'val'] + type_map = {'train': 0, 'val': 1, 'test': 2} + self.set_type = type_map[flag] + + self.features = features + self.target = target + self.scale = scale + self.timeenc = timeenc + self.freq = freq + + self.root_path = root_path + self.data_path = data_path + self.__read_data__() + + def __read_data__(self): + self.scaler = StandardScaler() + data_file = os.path.join(self.root_path, self.data_path) + data = np.load(data_file, allow_pickle=True) + data = data['data'][:, :, 0] + + train_ratio = 0.6 + valid_ratio = 0.2 + train_data = data[:int(train_ratio * len(data))] + valid_data = data[int(train_ratio * len(data)): int((train_ratio + valid_ratio) * len(data))] + test_data = data[int((train_ratio + valid_ratio) * len(data)):] + total_data = [train_data, valid_data, test_data] + data = total_data[self.set_type] + + if self.scale: + self.scaler.fit(train_data) + data = self.scaler.transform(data) + + df = pd.DataFrame(data) + df = df.fillna(method='ffill', limit=len(df)).fillna(method='bfill', limit=len(df)).values + + self.data_x = df + self.data_y = df + + def __getitem__(self, index): + s_begin = index + s_end = s_begin + self.seq_len + r_begin = s_end - self.label_len + r_end = r_begin + self.label_len + self.pred_len + + seq_x = self.data_x[s_begin:s_end] + seq_y = self.data_y[r_begin:r_end] + seq_x_mark = torch.zeros((seq_x.shape[0], 1)) + seq_y_mark = torch.zeros((seq_x.shape[0], 1)) + + return seq_x, seq_y, seq_x_mark, seq_y_mark + + def __len__(self): + return len(self.data_x) - self.seq_len - self.pred_len + 1 + + def inverse_transform(self, data): + return self.scaler.inverse_transform(data) + + +class Dataset_Solar(Dataset): + def __init__(self, root_path, flag='train', size=None, + features='S', data_path='ETTh1.csv', + target='OT', scale=True, timeenc=0, freq='h'): + # size [seq_len, label_len, pred_len] + # info + self.seq_len = size[0] + self.label_len = size[1] + self.pred_len = size[2] + # init + assert flag in ['train', 'test', 'val'] + type_map = {'train': 0, 'val': 1, 'test': 2} + self.set_type = type_map[flag] + + self.features = features + self.target = target + self.scale = scale + self.timeenc = timeenc + self.freq = freq + + self.root_path = root_path + self.data_path = data_path + self.__read_data__() + + def __read_data__(self): + self.scaler = StandardScaler() + df_raw = [] + with open(os.path.join(self.root_path, self.data_path), "r", encoding='utf-8') as f: + for line in f.readlines(): + line = line.strip('\n').split(',') + data_line = np.stack([float(i) for i in line]) + df_raw.append(data_line) + df_raw = np.stack(df_raw, 0) + df_raw = pd.DataFrame(df_raw) + + num_train = int(len(df_raw) * 0.7) + num_test = int(len(df_raw) * 0.2) + num_valid = int(len(df_raw) * 0.1) + border1s = [0, num_train - self.seq_len, len(df_raw) - num_test - self.seq_len] + border2s = [num_train, num_train + num_valid, len(df_raw)] + border1 = border1s[self.set_type] + border2 = border2s[self.set_type] + + df_data = df_raw.values + + if self.scale: + train_data = df_data[border1s[0]:border2s[0]] + self.scaler.fit(train_data) + data = self.scaler.transform(df_data) + else: + data = df_data + + self.data_x = data[border1:border2] + self.data_y = data[border1:border2] + + def __getitem__(self, index): + s_begin = index + s_end = s_begin + self.seq_len + r_begin = s_end - self.label_len + r_end = r_begin + self.label_len + self.pred_len + + seq_x = self.data_x[s_begin:s_end] + seq_y = self.data_y[r_begin:r_end] + seq_x_mark = torch.zeros((seq_x.shape[0], 1)) + seq_y_mark = torch.zeros((seq_x.shape[0], 1)) + + return seq_x, seq_y, seq_x_mark, seq_y_mark + + def __len__(self): + return len(self.data_x) - self.seq_len - self.pred_len + 1 + + def inverse_transform(self, data): + return self.scaler.inverse_transform(data) + + +class Dataset_Pred(Dataset): + def __init__(self, root_path, flag='pred', size=None, + features='S', data_path='ETTh1.csv', + target='OT', scale=True, inverse=False, timeenc=0, freq='15min', cols=None): + # size [seq_len, label_len, pred_len] + # info + if size == None: + self.seq_len = 24 * 4 * 4 + self.label_len = 24 * 4 + self.pred_len = 24 * 4 + else: + self.seq_len = size[0] + self.label_len = size[1] + self.pred_len = size[2] + # init + assert flag in ['pred'] + + self.features = features + self.target = target + self.scale = scale + self.inverse = inverse + self.timeenc = timeenc + self.freq = freq + self.cols = cols + self.root_path = root_path + self.data_path = data_path + self.__read_data__() + + def __read_data__(self): + self.scaler = StandardScaler() + df_raw = pd.read_csv(os.path.join(self.root_path, + self.data_path)) + ''' + df_raw.columns: ['date', ...(other features), target feature] + ''' + if self.cols: + cols = self.cols.copy() + cols.remove(self.target) + else: + cols = list(df_raw.columns) + cols.remove(self.target) + cols.remove('date') + df_raw = df_raw[['date'] + cols + [self.target]] + border1 = len(df_raw) - self.seq_len + border2 = len(df_raw) + + if self.features == 'M' or self.features == 'MS': + cols_data = df_raw.columns[1:] + df_data = df_raw[cols_data] + elif self.features == 'S': + df_data = df_raw[[self.target]] + + if self.scale: + self.scaler.fit(df_data.values) + data = self.scaler.transform(df_data.values) + else: + data = df_data.values + + tmp_stamp = df_raw[['date']][border1:border2] + tmp_stamp['date'] = pd.to_datetime(tmp_stamp.date) + pred_dates = pd.date_range(tmp_stamp.date.values[-1], periods=self.pred_len + 1, freq=self.freq) + + df_stamp = pd.DataFrame(columns=['date']) + df_stamp.date = list(tmp_stamp.date.values) + list(pred_dates[1:]) + if self.timeenc == 0: + df_stamp['month'] = df_stamp.date.apply(lambda row: row.month, 1) + df_stamp['day'] = df_stamp.date.apply(lambda row: row.day, 1) + df_stamp['weekday'] = df_stamp.date.apply(lambda row: row.weekday(), 1) + df_stamp['hour'] = df_stamp.date.apply(lambda row: row.hour, 1) + df_stamp['minute'] = df_stamp.date.apply(lambda row: row.minute, 1) + df_stamp['minute'] = df_stamp.minute.map(lambda x: x // 15) + data_stamp = df_stamp.drop(['date'], 1).values + elif self.timeenc == 1: + data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq) + data_stamp = data_stamp.transpose(1, 0) + + self.data_x = data[border1:border2] + if self.inverse: + self.data_y = df_data.values[border1:border2] + else: + self.data_y = data[border1:border2] + self.data_stamp = data_stamp + + def __getitem__(self, index): + s_begin = index + s_end = s_begin + self.seq_len + r_begin = s_end - self.label_len + r_end = r_begin + self.label_len + self.pred_len + + seq_x = self.data_x[s_begin:s_end] + if self.inverse: + seq_y = self.data_x[r_begin:r_begin + self.label_len] + else: + seq_y = self.data_y[r_begin:r_begin + self.label_len] + seq_x_mark = self.data_stamp[s_begin:s_end] + seq_y_mark = self.data_stamp[r_begin:r_end] + + return seq_x, seq_y, seq_x_mark, seq_y_mark + + def __len__(self): + return len(self.data_x) - self.seq_len + 1 + + def inverse_transform(self, data): + return self.scaler.inverse_transform(data) diff --git a/dataset/China.csv b/dataset/China.csv new file mode 100644 index 0000000000000000000000000000000000000000..b58a885ef3f5712856f662d49df77e01f6015774 --- /dev/null +++ b/dataset/China.csv @@ -0,0 +1,1462 @@ +date,temp_max,temp_min,temp_mean,precip,windspeed_max,windgusts_max,sunshine_duration +2020/1/1,3,-5.8,-2.9,0,17.1,32,30751.11 +2020/1/2,1.9,-5.8,-2.9,0,8.3,20.9,30891.05 +2020/1/3,5.8,-4.6,-0.6,0,13.8,22,30755.21 +2020/1/4,6.8,-4.4,0.2,0,23,45,20522.73 +2020/1/5,2.8,-4.6,-1.6,1,11.4,28.1,19954.07 +2020/1/6,-1.2,-6.2,-4.3,0.7,11.8,25.6,29144.09 +2020/1/7,2.9,-8.9,-4,0.1,12.2,24.5,31422.17 +2020/1/8,1.9,-6.7,-2.3,0,12.8,28.8,30824.21 +2020/1/9,-1.3,-4.2,-2.9,1.6,10,20.5,3139.89 +2020/1/10,-1.8,-5.9,-4.1,2.3,12.2,26.6,14859.9 +2020/1/11,3.5,-10.7,-3.7,0,11.4,25.6,31923.85 +2020/1/12,1.2,-8.8,-4.4,0.2,16.9,33.5,31256.82 +2020/1/13,0.6,-9,-4.8,0,11.1,20.9,31315.5 +2020/1/14,2.5,-8.6,-3.6,0,18.8,37.4,31833.57 +2020/1/15,-3.1,-7.7,-4.7,0.5,18.1,36.4,9507.54 +2020/1/16,0.4,-10.3,-5.3,0,8.9,24.5,32148.85 +2020/1/17,4,-7.3,-2.9,0,13.7,29.2,28697.71 +2020/1/18,-1.9,-7.8,-4.7,1,15.7,29.5,21923.38 +2020/1/19,1,-9.3,-4.7,0,14.8,28.4,28800 +2020/1/20,2.8,-9.2,-4.1,0,9.7,23,31751.63 +2020/1/21,3.9,-7.1,-2.8,0,12,22,32700.09 +2020/1/22,1.7,-6.2,-3,0,10.9,23.8,32258.16 +2020/1/23,-1,-5.8,-3.1,1.9,7.6,15.1,1688.34 +2020/1/24,0.1,-6.4,-3.4,0.7,11.3,26.6,29907.78 +2020/1/25,3.2,-8.5,-3.5,0,17.9,37.4,33438.27 +2020/1/26,1,-7,-4.1,0,17.3,33.1,32637.32 +2020/1/27,1.7,-9.8,-4.7,0,10,24.1,33492.95 +2020/1/28,2.2,-8.3,-4,0,9.4,22.7,32544.99 +2020/1/29,4.3,-7.2,-2.5,0,11.8,21.2,33951.13 +2020/1/30,4.4,-8,-2.5,0,11.2,23.8,34038.12 +2020/1/31,4.2,-6.4,-1.8,0,10.3,23,31035.07 +2020/2/1,1.4,-4.6,-2.1,0,13,27.7,26123.54 +2020/2/2,2.4,-6.7,-3.1,0,18,35.6,34181.98 +2020/2/3,5.6,-8.7,-2.5,0,11,23.4,34237.72 +2020/2/4,3.9,-7.2,-2.6,0,13.4,24.1,34287.2 +2020/2/5,0.2,-5.7,-2.7,0,15,29.2,32085.33 +2020/2/6,6,-5.2,-0.7,0,17.2,33.1,33650.94 +2020/2/7,5.1,-6.8,-1.9,0,11.9,28.4,34453.9 +2020/2/8,4.3,-4.1,-0.3,0,10.9,20.5,31402.97 +2020/2/9,7.2,-5.1,0,0,11.1,26.3,33900.36 +2020/2/10,8.6,-5.8,-0.2,0,12.7,19.4,34638.13 +2020/2/11,10.7,-3.2,2.6,0,12.2,28.1,35083.75 +2020/2/12,13,-5.2,1.8,0,12.7,27.7,35239.73 +2020/2/13,7.7,-5.6,-0.4,0,16.9,36.4,34834.94 +2020/2/14,-3.7,-10.7,-6.9,0,17.4,35.3,34364.12 +2020/2/15,-3,-13.7,-8.8,0,13.2,32,35574.5 +2020/2/16,2.2,-11.9,-6.1,0,10.9,19.8,35750.23 +2020/2/17,7.1,-9.3,-2.2,0,21.5,42.5,35552.03 +2020/2/18,4.9,-5.7,-1.3,0,14.2,29.9,33500.7 +2020/2/19,10,-5.9,0.6,0,16.9,33.5,35255.77 +2020/2/20,1.3,-5.1,-2.3,0.5,17,34.9,33370.74 +2020/2/21,4,-6.8,-2.1,0,11.4,25.6,36494.48 +2020/2/22,10.2,-6.1,0.8,0,12.5,26.6,36804.02 +2020/2/23,11.4,-4.4,2,0,20.8,41,29970.26 +2020/2/24,10.7,-2.6,3.4,0,13.6,26.3,37105.42 +2020/2/25,10.8,-2.4,3.8,0,9.6,21.2,37200.44 +2020/2/26,10.4,-1,4.5,0,11.3,24.1,36787.96 +2020/2/27,4.7,0.3,2.2,2.1,15.3,30.6,12729.73 +2020/2/28,14.4,-3.2,4,0,15.5,22.3,37812.71 +2020/2/29,8.3,-2.9,2.6,0,14.8,31.3,37814.04 +2020/3/1,6.5,-3.9,1,0,17.8,37.8,32502.06 +2020/3/2,6.6,-3.1,1.7,0,12.6,30.2,37191.93 +2020/3/3,8.4,-2.8,2.7,0,11.3,28.4,35520.2 +2020/3/4,11.8,-4.3,3.4,0,18.9,42.1,38164.15 +2020/3/5,10.5,-2.6,3.1,0,18.4,36.7,38220.41 +2020/3/6,10,-0.6,4.1,0,13.2,26.6,38276.29 +2020/3/7,15.1,-0.9,6,0,26.1,49.3,38331.8 +2020/3/8,3.9,-0.9,2.2,0.3,20.4,43.9,6327.74 +2020/3/9,2.8,-5.5,-1.7,0,16.1,34.2,37435.82 +2020/3/10,8.5,-6,0.2,0,12,29.5,38507.5 +2020/3/11,10.3,-3.9,2.4,0,12.2,29.5,38550.22 +2020/3/12,7.9,-1.9,3,0,20,38.5,34475.22 +2020/3/13,6.9,-4,0.4,0,12.9,30.2,38657.34 +2020/3/14,11.3,-3.8,2.8,0,10.6,23.8,38321.91 +2020/3/15,7.6,0,2.8,6.2,20.4,41,2661.92 +2020/3/16,8.8,-1.1,4,1.3,12.9,26.6,33592.65 +2020/3/17,12,-0.1,5.9,0,7.9,21.2,39299.16 +2020/3/18,12.8,-0.6,6.1,0,14.9,33.1,39350.26 +2020/3/19,14.1,-2.9,6.1,0,10.9,23.8,39736.75 +2020/3/20,15.5,1.3,8.9,1.1,13.4,29.9,35030.59 +2020/3/21,14.2,2.7,8.6,5.5,10.5,28.1,38202.78 +2020/3/22,16.8,1.7,9.2,0,23.8,47.9,39126.21 +2020/3/23,14.6,2.3,8.9,0,21.3,41.4,40206.54 +2020/3/24,15.1,2.3,8.6,0.2,15.8,35.6,36249.86 +2020/3/25,15,1.4,7,0.4,19,40.7,39559.35 +2020/3/26,5.4,0.5,2.3,4.6,13.8,27.7,14477.31 +2020/3/27,8.4,-2.7,2.7,0,21,41,25843.17 +2020/3/28,7.2,-0.5,3.5,0.4,19,36.7,6860.94 +2020/3/29,13,1.5,6.8,0.1,18,36.7,26401.78 +2020/3/30,10.9,-1,5.6,0,17.8,38.9,21247.61 +2020/3/31,15.1,-0.4,7.5,0.6,17.6,38.2,33223.46 +2020/4/1,5.6,1.3,3.2,1.2,14.8,30.6,3492.81 +2020/4/2,4.6,0.9,2.3,2.4,17,35.3,0 +2020/4/3,7.1,0.4,3.1,2.1,14.3,29.9,3439.85 +2020/4/4,10.6,-1.1,4.7,0,15.4,32.4,16197.76 +2020/4/5,14,-1.3,7,0,11.5,23.4,38665.68 +2020/4/6,15,-0.4,7.8,1,12,28.1,32653.19 +2020/4/7,10.3,3.7,6.7,3.6,11,22.7,5193.91 +2020/4/8,16.4,0.9,8.3,0,11.2,29.5,42917.81 +2020/4/9,17.3,2.8,10.9,0.5,12.1,28.4,42999.25 +2020/4/10,11.5,3,7.3,0,18.1,36.7,42534.21 +2020/4/11,12.3,2,6.5,0,9.7,25.2,43161.14 +2020/4/12,14.6,-0.9,6.9,0,21.2,41.4,37774.27 +2020/4/13,16.6,3.6,9.3,0.6,22.7,43.6,28214.56 +2020/4/14,21.7,0.4,10.8,0,18.4,39.2,43200 +2020/4/15,22.7,4.1,13.7,0,12,27.7,43200 +2020/4/16,15.5,6.4,10.9,0,9.8,22.7,34319.41 +2020/4/17,14.6,3.1,8.9,0,31.4,61.2,41472.7 +2020/4/18,16.9,2.8,9.9,2.4,16.8,34.2,41804.72 +2020/4/19,18.2,3.9,11.1,0,17.5,37.1,32400 +2020/4/20,10,3,7.3,0,20.1,40.7,10656.52 +2020/4/21,9.5,2.9,6.5,0.4,13.3,27,10231.78 +2020/4/22,12.3,-0.3,6.7,0,18.2,37.4,20708.38 +2020/4/23,12.5,1.3,7.6,0.1,13.6,26.3,35178.27 +2020/4/24,13.3,1.2,7.8,0,9.2,25.6,39449.48 +2020/4/25,16.7,5.1,10.4,0,15.3,34.6,43200 +2020/4/26,19.6,4.7,11.7,0,12.4,31,43200 +2020/4/27,21.3,4.5,14.2,0,10.5,27.4,43200 +2020/4/28,23.4,5.7,14.8,0,28.2,52.2,41159.56 +2020/4/29,23.8,8.5,17,0,14.3,32.8,41126.61 +2020/4/30,24.5,6.5,16.2,0,10.8,27,43200 +2020/5/1,26.3,6.6,17.7,0,12.5,25.9,43200 +2020/5/2,27.7,7.9,19.2,0,14.7,30.6,43200 +2020/5/3,26.5,11.4,19.8,0.1,20.7,40.7,43200 +2020/5/4,22.5,12.2,17.3,0,16.4,31.3,39600 +2020/5/5,24.6,11.3,18,0.2,29.6,58.3,33320.61 +2020/5/6,20.1,11.2,15.3,14.7,25.6,52.9,26456.92 +2020/5/7,12.9,6.3,10.9,12.8,15.5,29.5,200.05 +2020/5/8,10.9,5.3,7.9,1.2,19.5,40.7,5418.74 +2020/5/9,16.3,2.9,9,3.2,14.6,38.2,39748.43 +2020/5/10,18.3,3.3,10.2,0,27.4,53.3,40333.72 +2020/5/11,16.2,1.1,8.7,0.1,12.2,26.6,43251.8 +2020/5/12,21.2,2.7,12.7,0,29.3,56.9,43368.56 +2020/5/13,22.3,9,14.4,1.3,27.8,55.1,37109.84 +2020/5/14,21.1,6.1,14.9,0,18.9,34.6,40443.42 +2020/5/15,22.3,6.7,14.6,0.1,23.9,46.1,36760.89 +2020/5/16,24.5,9.9,16.7,0,18.7,39.6,43476.64 +2020/5/17,25.9,10.6,18.2,0,22.8,43.9,43745.53 +2020/5/18,23.3,6,15,0,23,45.4,43605.15 +2020/5/19,24,9.7,16.3,2.1,21.1,41.4,34592.17 +2020/5/20,21.3,10.8,16.4,0.3,19.4,37.8,32865.36 +2020/5/21,25.8,14.5,19.1,0,14.5,33.1,24227.71 +2020/5/22,25.9,10.1,18.7,0,23.9,47.9,40101.2 +2020/5/23,16.8,9.5,13.1,7.9,17.4,34.2,2756.11 +2020/5/24,16.3,9.4,12.9,0,11.1,23.8,9074.32 +2020/5/25,18,8.4,13.6,0.6,13.4,30.2,41800.84 +2020/5/26,12.2,8.3,9.9,7.4,13.7,26.6,0 +2020/5/27,18,7.5,13,0,10.6,26.6,42769.44 +2020/5/28,20.5,4.9,13,0,10.1,25.9,42325.02 +2020/5/29,22.9,6.2,14.7,0,20,37.8,42454.97 +2020/5/30,21.4,6.4,14.1,0.2,14.3,31.3,43845.48 +2020/5/31,22.8,9.3,15.9,0.1,19.9,39.6,44978.48 +2020/6/1,20.5,11,16.2,0.8,15.1,30.2,11054.3 +2020/6/2,24.2,10.5,18,0,9.5,25.2,44474.52 +2020/6/3,26.2,11.6,19.5,0,14.9,31.3,44966.86 +2020/6/4,24.5,13.8,19.2,0,14.9,28.8,14942.76 +2020/6/5,27.4,13.5,20.6,0,17.3,33.8,44471.15 +2020/6/6,24.8,14.9,20.1,0,23.2,44.6,35287.43 +2020/6/7,24.2,12.1,18.1,0.5,19.9,44.6,26929.22 +2020/6/8,19.4,8.3,13.9,6.2,19.6,42.8,41554.41 +2020/6/9,25.9,7.8,17.5,0,14.2,29.2,44329.7 +2020/6/10,25.6,13.4,19.6,1.3,24.7,48.6,39506.64 +2020/6/11,24.6,14.2,19.1,0.2,16.2,36,27869.25 +2020/6/12,24.6,15.8,20,0.4,20.9,42.1,38436.43 +2020/6/13,18.6,11.8,15.1,5.4,16.3,35.3,17559.7 +2020/6/14,24.6,9.9,17.6,0.8,29.6,57.2,41740.29 +2020/6/15,21.7,13.9,17.5,9,17.5,40,6948.28 +2020/6/16,20.2,12.4,15.3,20,17.2,32.4,5256.04 +2020/6/17,23,10.3,16.8,0.8,19.4,40,46797.64 +2020/6/18,26.4,10.1,19.3,0,20.6,41,46928.41 +2020/6/19,25.1,15.4,20.1,0.6,19.3,37.4,30347.09 +2020/6/20,28.3,13.9,21,0,20.3,38.9,44491.18 +2020/6/21,23.8,14.9,18.8,8.8,18.3,38.2,13456.18 +2020/6/22,21.2,12.6,16.4,7.7,12.4,26.6,20104.3 +2020/6/23,25.3,13.1,18.5,0,10.7,26.3,47152.29 +2020/6/24,27.6,11.6,19.6,0,14.8,33.5,47118.07 +2020/6/25,25.1,13.1,19.1,6.4,14.5,31.3,30199.38 +2020/6/26,21.1,12.4,16.1,15.1,22.1,41.4,37037.76 +2020/6/27,23.8,9.7,17.5,0,11,23.4,46982.85 +2020/6/28,25.4,15,19.8,0,10.2,25.2,44715.52 +2020/6/29,24.4,14.4,19.3,0,15.3,28.8,38880.38 +2020/6/30,26.3,13.2,20.8,0.6,17.3,33.8,30592.12 +2020/7/1,22.2,14.2,17.2,3.8,10.8,32,26415.75 +2020/7/2,27.7,12.3,20.6,0,15.9,31.3,46050.13 +2020/7/3,19.5,13.8,17.3,10.1,15.9,31.3,3600 +2020/7/4,24,12.9,18.2,0,12,28.4,42793.12 +2020/7/5,27,11.3,19.9,0,11.9,26.3,47430.46 +2020/7/6,28.2,12.8,20.9,0,23,44.6,45693.19 +2020/7/7,28.4,15,22.2,0,23.4,46.8,47631.85 +2020/7/8,29.3,15.6,23.1,0,17.4,36.4,45554 +2020/7/9,25.3,18.7,21.7,2.6,17.7,36.7,29721.26 +2020/7/10,24,14.5,18.7,7,18.3,34.6,33318.57 +2020/7/11,18.6,14.3,16.5,18.4,16,33.1,0 +2020/7/12,24.6,12.1,17.7,0,9.9,23.8,46985.5 +2020/7/13,23.6,12.7,19,1.7,21.7,41.8,25499.59 +2020/7/14,21.8,16.4,18.5,4.8,15.3,28.8,16120.99 +2020/7/15,25.7,13.2,19.4,0,12.7,25.9,45105.43 +2020/7/16,23.9,13.6,19.2,0,14.5,31,31122.02 +2020/7/17,25.8,16,20.9,0.6,17.1,30.6,44985 +2020/7/18,18.7,14.1,16.1,22.9,14.1,31.3,17306.17 +2020/7/19,24.2,11.9,18.2,0,10.2,22,47058.84 +2020/7/20,24.2,13.2,18.7,0,25.3,49.3,29576.19 +2020/7/21,23.9,13.8,18.7,0,18.7,37.1,40396.84 +2020/7/22,26.5,13.9,20,0,21.6,41.8,45877.55 +2020/7/23,20,16.3,18.2,7.3,19.9,38.5,3019.04 +2020/7/24,24.7,16.5,19.7,7.7,11.8,24.1,33025.01 +2020/7/25,21.7,15.9,18.3,16,13.4,38.9,14665.74 +2020/7/26,27.4,14.9,21,0,11.8,26.6,46419.67 +2020/7/27,27.5,15.7,22.1,0,12.3,20.2,44366.54 +2020/7/28,27,15,20.8,0.1,21.3,41,45667.72 +2020/7/29,25.1,15.4,20.2,0.2,21.7,44.3,44441.04 +2020/7/30,24.9,14.6,19.3,0.1,16.8,36.7,42178.78 +2020/7/31,26.5,13.3,21.1,0,8.9,16.2,35407.61 +2020/8/1,26.2,16.8,21.2,1,8.4,21.2,31679.77 +2020/8/2,28.6,15.9,22.7,0,17.9,36.4,44620.63 +2020/8/3,28,16,21.6,0.3,21.6,43.2,39847.5 +2020/8/4,23.7,17.8,20.3,18.6,10.9,25.2,33075.69 +2020/8/5,25,18,21.2,11.5,12.8,27.4,35483.86 +2020/8/6,23.5,17.8,20.2,10.8,18.5,35.3,19767.46 +2020/8/7,26.4,19.1,22.4,0,12.8,28.4,37230.12 +2020/8/8,26.4,18.3,21.6,0.3,11.5,27.7,39026.14 +2020/8/9,25.8,14.2,19.8,0.2,16.3,33.8,44265.14 +2020/8/10,27.3,13.7,20.4,7.3,20.4,41.4,31485.37 +2020/8/11,21.6,17.2,19.2,30.8,25.2,60.8,6345.11 +2020/8/12,20.6,13.6,16.6,19.6,17.8,36.4,27387.42 +2020/8/13,25.3,10.8,18.5,0,16.3,32,41560.23 +2020/8/14,19.9,14,17,1.4,15.9,32.4,11550.08 +2020/8/15,21.2,10.8,16.3,0,11.5,23.4,26148.97 +2020/8/16,18.6,13.3,16.4,3.9,10.9,21.2,4116.74 +2020/8/17,16.2,12,13.8,19.4,15.1,28.8,218.76 +2020/8/18,23.3,9.5,15.2,0,18.6,36,25466.04 +2020/8/19,24.3,8.9,16.6,0,19.9,39.2,43231.39 +2020/8/20,24.1,12.1,17.5,0,26.7,51.8,43242.01 +2020/8/21,24.8,14,19,0,26.3,50,38854.08 +2020/8/22,24.1,15.3,19.4,0,16.8,35.3,31841.99 +2020/8/23,17.6,12.2,15.6,37.3,21.4,47.5,9185.89 +2020/8/24,23.8,9.7,17.4,0,8.7,19.1,43200 +2020/8/25,24.3,13.1,18.8,0,10.2,24.1,43200 +2020/8/26,25.8,11.5,18.8,0,10,20.9,43200 +2020/8/27,24.5,11.7,18.3,0,13.7,31.7,43200 +2020/8/28,25.2,12.1,18.7,0,22.4,43.9,43200 +2020/8/29,19.3,10.5,14.6,12.8,24.9,48.6,0 +2020/8/30,13,8.2,10.8,15,12.2,34.2,13881.12 +2020/8/31,21.9,6.2,13.5,0,16.9,34.6,43200 +2020/9/1,19.9,12.5,15.7,1.1,16.8,34.9,40141.7 +2020/9/2,21.7,12.9,16.6,0,14.2,31,43147.16 +2020/9/3,20.9,8.7,14.5,0,10.2,19.4,37641.72 +2020/9/4,23.2,8.6,15.5,0,10,20.9,43058.75 +2020/9/5,20.3,11,15.9,0.3,15.9,33.5,23696.63 +2020/9/6,21.6,12.4,16.1,0,11.4,24.1,36457.47 +2020/9/7,24,9.5,17.1,0,21,39.6,41918.67 +2020/9/8,23.4,13.4,18.2,0,27,51.5,34799.54 +2020/9/9,17.7,13,15.7,3.4,17.2,34.2,10464.59 +2020/9/10,21.7,11.8,16,0,11.8,26.6,32085.8 +2020/9/11,19.6,12.4,15.7,0.1,17.4,34.6,32098.12 +2020/9/12,19.7,9.5,14.7,0.4,9.6,22,25930.29 +2020/9/13,14.7,11.7,13.2,16.8,18.4,36,5132.86 +2020/9/14,18.1,10.1,14,1.2,15.1,31,28005.53 +2020/9/15,17.8,10,12.8,0.1,16.6,31.3,41456.15 +2020/9/16,17,7.5,11.8,7.3,10.2,20.9,20240.58 +2020/9/17,17.7,7.9,12.9,0,14.4,31.3,41442.77 +2020/9/18,21,5.4,13.1,0,22.2,42.8,41307.47 +2020/9/19,18.9,8.6,12.8,0,25.4,48.2,29334.63 +2020/9/20,18.7,12.3,14.6,2.9,19.6,38.2,23930.03 +2020/9/21,15.2,11.5,13.3,10.5,12.4,29.2,49.57 +2020/9/22,17.8,10.6,13.4,1,16.9,36,33704.9 +2020/9/23,18.4,6.6,12.8,0,9.7,20.9,40406.77 +2020/9/24,17,8.7,12.7,0.2,13.7,27.7,11021.17 +2020/9/25,16.8,10.4,13,1.2,11,22.3,22075.25 +2020/9/26,19.9,9.6,13.7,0,26.3,50.4,38441.5 +2020/9/27,18.5,11.4,14.2,0,24.7,47.9,31615.71 +2020/9/28,17.3,10.8,13.6,3.5,21,39.6,18536.83 +2020/9/29,20.2,9.6,14.5,0,19.2,38.2,39067.89 +2020/9/30,13.8,9.1,12.1,12.8,20.5,38.9,0 +2020/10/1,15.6,6.5,11,0.1,12.3,24.8,31377.16 +2020/10/2,15.1,9.2,11.6,0.5,9.7,21.6,18536.42 +2020/10/3,13.8,9.1,11.1,0.1,9.7,21.2,23998.93 +2020/10/4,14.7,5.7,10,0.4,23.7,46.1,26583.28 +2020/10/5,14.2,7,9.9,1.7,15.6,31,28234.29 +2020/10/6,12.5,6.9,9.7,0.6,14.7,28.4,3978.51 +2020/10/7,18.1,3.6,9.8,1.3,27.9,52.6,37668.49 +2020/10/8,14.9,7.7,11.1,3.2,16.6,40,24260.49 +2020/10/9,17.1,7.1,12,0,15.3,29.9,32556.68 +2020/10/10,18.2,6.4,12.1,1,17.3,33.5,36552.25 +2020/10/11,10.4,6.9,8.8,0,13.7,27.7,20102.75 +2020/10/12,12.5,4.4,8.7,1.4,14.1,27.7,23406.51 +2020/10/13,8.7,4,6.7,2.2,9.1,18,0 +2020/10/14,11.4,1.8,6.4,0.2,17.8,33.5,31514.71 +2020/10/15,12.9,0.7,6.8,0,15.9,31.3,34410.16 +2020/10/16,12.6,0.9,7,0,17.5,33.8,36866.33 +2020/10/17,13.6,-1.1,6.8,0,12.3,25.9,30697.73 +2020/10/18,8.7,1,6,0,12.5,24.5,31019.04 +2020/10/19,11.9,-1.8,5.3,0,9,18.7,35865.98 +2020/10/20,11.9,3.1,7,0,12,25.2,27689.07 +2020/10/21,14.4,-0.1,6.7,0,10.4,22,36187.52 +2020/10/22,16.1,1.2,8.7,0,15.2,30.2,36015.33 +2020/10/23,15.1,2.5,7.9,0,25.3,48.6,33969.25 +2020/10/24,16.1,5.5,9.4,0,17.5,36.4,35442.79 +2020/10/25,13.9,5.3,9.3,0,11.6,25.6,30277.59 +2020/10/26,9.8,3.4,5.9,2.4,14,27.4,18651.18 +2020/10/27,3.9,1.5,2.8,16.9,7.6,18.4,0 +2020/10/28,10.9,0.3,4.4,0,15.5,32.8,35154.99 +2020/10/29,14.8,-0.3,6,0,23,43.9,35117.92 +2020/10/30,10.3,3.4,6.1,0.9,23.5,45.4,27482.55 +2020/10/31,9.7,0.6,5.5,0,11.2,25.9,33684.42 +2020/11/1,10.1,2.8,6,0,12.6,23.8,34875.24 +2020/11/2,10.7,-1.1,4.7,0,11.8,25.6,32805.64 +2020/11/3,12.6,0.2,5.1,0,15,29.9,34754.77 +2020/11/4,8.6,-0.9,4.3,0.5,14.8,31.3,21748.04 +2020/11/5,10,2.1,5.3,0,15.9,33.5,29472.31 +2020/11/6,9.4,-3.3,2.9,0,11.3,27,34574.53 +2020/11/7,11,-2.1,3.6,0,9.7,20.2,34518.08 +2020/11/8,9.2,-1.8,3.3,0,12,24.1,29814.59 +2020/11/9,13,-1.9,4.6,0,14.1,20.9,34395 +2020/11/10,13.6,-1.3,5.1,0,13.4,26.3,34281.05 +2020/11/11,11.7,3,6.2,0,9,18.4,34167.86 +2020/11/12,14.1,0.4,7.5,0,18.5,35.3,32414.84 +2020/11/13,15.4,4.3,8.7,1.6,19.1,37.4,33346.04 +2020/11/14,13.8,3.3,7.1,0,15.6,30.6,33834.12 +2020/11/15,15.7,2.4,7.8,0,23.8,45.7,33725.28 +2020/11/16,15.1,3.7,8.4,0.6,21.2,43.6,28505.58 +2020/11/17,7.4,1.4,2.9,4.3,19.2,36.4,0 +2020/11/18,7.1,-2.3,1.7,0.2,10.9,26.3,33351.4 +2020/11/19,8.9,-2.5,1.8,0,21.1,40.7,30234.41 +2020/11/20,3.4,-3.6,0,8.2,15.9,31.3,4856.6 +2020/11/21,-2.2,-5.3,-4.1,0.7,14.2,30.6,16730.51 +2020/11/22,-1.9,-6.9,-4.6,1.1,13.9,29.2,7027.63 +2020/11/23,4.5,-6.9,-2.8,0,19.7,38.9,32719.04 +2020/11/24,4.3,-4.9,-1.6,0.2,18.7,36,32111.71 +2020/11/25,0.8,-6.6,-3.3,0.9,10.5,25.9,28176.42 +2020/11/26,3.9,-5.7,-1.8,0,13.7,28.8,32314.79 +2020/11/27,2.7,-5.3,-1.5,0.4,18.3,36,6068.82 +2020/11/28,9.9,-5.5,0.4,0,13.4,29.2,32184.15 +2020/11/29,5.5,-5.8,-1.4,0,12.1,24.8,32018.45 +2020/11/30,2.8,-4.9,-0.7,0,12.1,25.6,25296.78 +2020/12/1,-0.3,-3.7,-1.8,2,12.7,26.6,2120.48 +2020/12/2,-2.5,-6.1,-4.4,1.9,16.2,31.3,13426.73 +2020/12/3,-0.8,-6.7,-4.1,0.3,15,28.8,29191.74 +2020/12/4,1.1,-7.3,-4,0.1,13.8,27.7,30841.11 +2020/12/5,1.6,-6.4,-3.8,0,12.4,24.5,31320.11 +2020/12/6,-0.9,-6.8,-3.9,0,7.9,17.3,20850.53 +2020/12/7,3.7,-5.7,-2.8,0,16.4,32,28376.84 +2020/12/8,3.9,-7.1,-2.8,0,14,26.6,31110.4 +2020/12/9,0.8,-5.2,-3.1,0.3,9.3,20.5,29317.17 +2020/12/10,2.2,-5.9,-3.1,0.1,10,22.3,30083.12 +2020/12/11,3.2,-4.9,-1.7,0,10.1,20.2,30581.65 +2020/12/12,1.5,-6.1,-3.1,0.4,15.9,35.6,30919.88 +2020/12/13,-4.7,-8.7,-7,0.5,15.8,31,19726.2 +2020/12/14,-1.1,-10,-6.4,0,10.8,26.3,30834.96 +2020/12/15,-0.3,-8,-4.8,0,11.9,24.1,30828.1 +2020/12/16,0.3,-8.5,-4,0.2,14.6,29.2,28409.13 +2020/12/17,-3,-8.1,-5.2,1.5,11.9,27.4,21315.27 +2020/12/18,-1.4,-9.1,-5.8,0,13.8,28.8,29478.64 +2020/12/19,-1.5,-10,-6.4,0,10,24.5,30143.23 +2020/12/20,-0.9,-10.1,-6.2,0,10.7,23.4,31217.32 +2020/12/21,2.2,-10,-5.1,0,12.7,20.9,31371.89 +2020/12/22,-0.2,-9.1,-4.8,0,17.3,37.8,29548.09 +2020/12/23,1.2,-11.5,-5.2,0,11.6,25.9,31308.55 +2020/12/24,2.1,-9.3,-4.4,0,11.1,18.7,31233.42 +2020/12/25,2.9,-10.3,-3.6,0,10.5,22,29502.25 +2020/12/26,4.9,-8.3,-3.1,0,13.3,24.5,30040.5 +2020/12/27,2.5,-9,-3,0,11.5,27.4,30943.52 +2020/12/28,-1.3,-9.1,-5,0.1,14.2,29.2,29456.15 +2020/12/29,-4.4,-11.1,-8.1,0,16.9,34.6,27544.01 +2020/12/30,-5,-14.2,-10.4,0,12.3,24.1,30974.54 +2020/12/31,-0.7,-12,-7.6,0,11.2,25.6,30650.99 +2021/1/1,1.3,-11.9,-6.4,0,12.3,24.5,31337.61 +2021/1/2,-0.7,-11.2,-6.2,0,15,32.8,29814.24 +2021/1/3,2.1,-10.1,-4.4,0,15,32,31431.89 +2021/1/4,-1.5,-11.4,-7.3,0,11.9,28.8,31035.97 +2021/1/5,-3,-10.5,-7.6,0,19.7,37.8,31087.79 +2021/1/6,-7.2,-14.8,-11.1,0,13.1,25.9,30962.46 +2021/1/7,-7.4,-17.1,-12.7,0,11.1,26.6,31549.48 +2021/1/8,-3.1,-13.8,-9.2,0,9.4,23.8,31693.48 +2021/1/9,-3,-13.2,-7.7,0,9.2,20.9,24483.81 +2021/1/10,-7,-13.2,-9.9,0.2,19.7,39.2,21222.19 +2021/1/11,-0.7,-15.3,-7.4,0,18,39.2,31962.06 +2021/1/12,8.3,-10.2,-1.4,0,12,25.2,32117.69 +2021/1/13,5.5,-9.6,-3.7,0,11.9,27,32184.24 +2021/1/14,4.3,-8.7,-3.3,0,18.5,36,32346.13 +2021/1/15,0.7,-9.1,-4.8,0,15.9,32.8,32322.31 +2021/1/16,-3.9,-12.1,-7.9,0.1,17.8,36.4,29169.92 +2021/1/17,4,-14.2,-6.2,0,15.8,34.2,32465.74 +2021/1/18,8.6,-9.5,-1.4,0,12.5,24.5,32736.1 +2021/1/19,1.8,-8.5,-3.6,0,13.3,30.2,32913.02 +2021/1/20,2.4,-2.8,-0.6,0,9,16.2,9278.66 +2021/1/21,5.5,-5.1,-0.1,0,12.2,24.1,33071.95 +2021/1/22,6.2,-6.4,-1.8,0,13.2,24.1,33152.13 +2021/1/23,3.7,-7.5,-2.2,0,13.4,29.5,28280.71 +2021/1/24,0.7,-5.8,-2.7,4.6,19.3,37.4,0 +2021/1/25,3.1,-8.1,-3.2,0,17.7,35.3,32513.12 +2021/1/26,0.2,-7.2,-3.8,0,10.4,25.9,33025.57 +2021/1/27,0.8,-9.6,-4.8,0,12.6,28.1,33665.88 +2021/1/28,2.9,-9.8,-4.7,0,11.6,23.8,33915.71 +2021/1/29,3,-6.9,-3,0,10.4,24.8,33352.49 +2021/1/30,1.8,-6.8,-2.6,0,12.3,28.4,28152.06 +2021/1/31,2.9,-5.9,-2.8,0,12.4,28.4,34116.64 +2021/2/1,3.3,-9.6,-2.9,0,12.8,30.2,34167.09 +2021/2/2,6.4,-7.4,-1.9,0,14.3,21.6,34219.37 +2021/2/3,5.3,-5.6,-1.5,0,16.9,31.7,34276.56 +2021/2/4,4.9,-5.6,-0.4,0,12.2,27.7,32604.28 +2021/2/5,7.1,-7.1,-1.2,0,13.5,29.9,34472.91 +2021/2/6,6.7,-5.3,-0.7,0,15.1,32.8,32528.49 +2021/2/7,7,-4.5,1.1,0,11.2,25.6,33074.62 +2021/2/8,7.3,-6.1,-0.5,0,12.8,25.6,34661.28 +2021/2/9,9.3,-3.5,1.6,0,14.1,22,34856.77 +2021/2/10,12.6,-3.6,2.4,0,20.6,39.6,30446.48 +2021/2/11,9.9,-0.4,4,0.2,18.7,36.7,35073.74 +2021/2/12,10.3,-3.5,2.7,0,16,35.3,28246.56 +2021/2/13,10.8,-3.2,3.5,0.1,16.1,33.5,32986.89 +2021/2/14,7.7,-3.7,1.4,0,18.8,40,34955.46 +2021/2/15,5.6,-3.9,0.7,0,9.4,24.8,32570.99 +2021/2/16,6.6,-3.9,1.6,0,11.2,26.3,35245.25 +2021/2/17,5.3,-5.2,0.2,0,9.6,16.9,26536.25 +2021/2/18,8.7,-3.6,1.5,0,18.7,38.9,36280.59 +2021/2/19,10.5,-2.8,2.9,0,15.3,33.8,36476.06 +2021/2/20,14.1,-3.2,5.2,0,15.3,32.4,36783.44 +2021/2/21,12.2,-3.5,4.8,0,12.8,20.5,36773.84 +2021/2/22,10.1,-0.7,4,0,13.8,26.6,12705.99 +2021/2/23,16.2,-2.5,5.6,0,16.6,32,35706.9 +2021/2/24,10.7,0.3,4.5,3.1,12.4,28.8,36359.43 +2021/2/25,6,-0.2,2.4,1.5,15,29.2,9206.87 +2021/2/26,11.7,-0.5,3.7,0,25.6,46.8,32791.09 +2021/2/27,1.7,-3.1,-1.1,1.4,25.1,47.2,6608.2 +2021/2/28,-2.1,-4.5,-3.3,1.1,18.3,37.4,43.68 +2021/3/1,6.3,-6.6,-0.7,0.1,11.7,27.4,37978.73 +2021/3/2,6.1,-3.6,1.2,0,14,29.2,30214.62 +2021/3/3,11.1,-4.5,1.8,0,15.5,29.5,38093.62 +2021/3/4,9.9,-2.4,2.7,0,12,20.9,25735.62 +2021/3/5,9.6,0.2,4.6,0,12.9,27,36522.32 +2021/3/6,10,-3,3.3,0,18.8,37.4,36377.82 +2021/3/7,9.7,-2.9,2.8,0,25.5,49,32605.01 +2021/3/8,13.1,-2.5,4.7,0,15.5,32.4,38373.66 +2021/3/9,13.1,-0.7,5.3,0,24.3,46.8,36000 +2021/3/10,11.3,2.4,6,1.3,18.7,35.6,32481.86 +2021/3/11,17.1,-1.2,6.4,0,12.7,22.3,38541.19 +2021/3/12,13.2,-1.2,5.4,0,17.9,38.2,38590.52 +2021/3/13,22,-1,8.8,0,21.4,40.3,38795.82 +2021/3/14,16.5,4.6,9.4,0,12.7,29.5,38136.89 +2021/3/15,20.7,-0.5,9.9,0,27.8,53.3,39079.75 +2021/3/16,13.1,1.3,7,0,17.3,42.5,38801.84 +2021/3/17,10.4,1.7,6.5,1.3,20.9,43.6,26590.55 +2021/3/18,9.4,-2,3.8,0,11.9,24.8,13909.76 +2021/3/19,6.5,-1.4,1.6,4.2,21,46.1,23117.03 +2021/3/20,6.9,-4.2,0.9,0,21.7,43.9,39317.91 +2021/3/21,7.5,-4.6,0.7,0,14.1,32,39716.67 +2021/3/22,11.9,-4.5,2.7,0,13.2,22.7,40133.84 +2021/3/23,16.9,-3.6,6.2,0,13.4,24.1,40568.3 +2021/3/24,14.5,2.7,8.8,0,17.4,34.9,39219.39 +2021/3/25,15.4,2.2,8.5,0.1,16.2,35.6,31212.08 +2021/3/26,13.1,2.4,8,0.6,12.7,31.3,37772.94 +2021/3/27,18.5,0.2,8.8,0,14.1,32,41088.7 +2021/3/28,15.2,0.5,9.7,0,20.1,41,32279.84 +2021/3/29,19,1.5,10.3,0,22.8,44.3,32260.5 +2021/3/30,12,4.2,8.8,0.1,20.3,40.3,9650.27 +2021/3/31,5.3,1.8,3.3,10.1,20.6,39.2,744.72 +2021/4/1,8.8,1.6,4.4,5.5,14.4,31.3,20912.94 +2021/4/2,6.4,1.1,3.1,14.6,12.4,25.9,7918.99 +2021/4/3,7.9,0.9,4.2,5,20.4,40.3,29307.74 +2021/4/4,10.5,2.4,5.9,2.5,17.8,34.9,28070.14 +2021/4/5,18.2,-0.3,8.8,0,16.2,30.6,41379.06 +2021/4/6,11,5.1,7.8,0.6,15,28.1,7367.81 +2021/4/7,13.2,2.2,7.7,0.3,14,27.7,28275.19 +2021/4/8,16.3,2.7,8.7,0,19.8,38.5,40184.82 +2021/4/9,12.6,6,8.6,3.6,17.7,33.5,19528.71 +2021/4/10,11.8,5,7.7,6.7,15.3,31.7,9831.3 +2021/4/11,15,3.6,8.4,0.5,15,32,41361.38 +2021/4/12,15.1,1.6,8.4,0.6,17.4,34.9,42554.57 +2021/4/13,7,3.4,5.1,0.8,15.6,32.8,942.84 +2021/4/14,14.9,-1.3,6.3,0.2,14.3,27.7,33309.41 +2021/4/15,12.2,2.7,8.3,0,13,30.2,30469.25 +2021/4/16,14,-0.4,6.8,0,16.3,35.6,43200 +2021/4/17,14.8,1.8,8.2,0,14.1,31.3,38615.8 +2021/4/18,20.3,4.3,11.5,0,23.2,44.6,41466.7 +2021/4/19,11.7,6.5,8.8,5.6,21.7,41.8,6979.89 +2021/4/20,15.5,6.6,10.4,0.6,16.6,32.4,20866.59 +2021/4/21,20.6,4.5,12.4,0,15.4,30.2,32400 +2021/4/22,20.2,7.5,12.7,0.3,24.2,46.8,30538.23 +2021/4/23,17.8,8.1,12.7,2.2,16.1,33.1,15673.09 +2021/4/24,10.8,4.4,7.8,10.5,18.3,34.9,17611.38 +2021/4/25,9.3,2,6.1,1.2,11.6,24.8,1630.66 +2021/4/26,10.1,1,6.5,0,12.9,30.6,31993.89 +2021/4/27,11.9,-0.5,5.3,0.2,17.8,37.1,29168.88 +2021/4/28,15.7,-0.6,7.6,0.1,26.9,58.7,43200 +2021/4/29,21.1,2.7,12.6,0,26.1,53.6,43200 +2021/4/30,22,5,14.3,0,18.7,39.6,43200 +2021/5/1,24.8,5.6,15.2,0,21.4,40.3,41106.55 +2021/5/2,21.2,10.8,16.3,0.2,18.9,44.6,43200 +2021/5/3,16.1,6.6,12.1,0,19.6,40.7,43200 +2021/5/4,14.6,2.9,9.2,0,14.8,29.2,42685.79 +2021/5/5,19.3,3.3,11.3,0,20.1,42.8,43200 +2021/5/6,21.3,4.4,13.4,0,14.2,27.7,39600 +2021/5/7,23.2,4.6,14.2,0,20.5,42.8,43200 +2021/5/8,26.7,6,17.5,0,11.4,27.7,43200 +2021/5/9,26.6,10,18.6,0.5,16.6,35.6,43200 +2021/5/10,22.6,11.6,17.1,0,19.5,40.7,24370.8 +2021/5/11,23.1,10.1,16.5,0,11.5,25.2,42619.73 +2021/5/12,25.6,8.2,17.3,0,17.8,36,43241.51 +2021/5/13,26.1,11.8,18.4,0,25,49,42099.23 +2021/5/14,15,7,11.2,11.8,25,50,130.07 +2021/5/15,8.8,4.4,6.7,19.2,23.2,47.2,2523.89 +2021/5/16,17.3,3.3,10.3,0,13.7,27,43342.08 +2021/5/17,19.7,5.6,12.8,0.1,10.4,19.8,39210.17 +2021/5/18,19.7,6.7,12.8,7.1,12.1,27.4,20424.03 +2021/5/19,17,7.8,12.3,0,16.9,36,41181.2 +2021/5/20,21.1,3.9,13.4,0,15.3,32.4,35475.96 +2021/5/21,21.5,8.8,15.3,0,16,34.9,26000.31 +2021/5/22,12.9,5.5,9.1,7.2,21.1,40.7,7200 +2021/5/23,17.1,5,11,0,16.9,36.4,42795.17 +2021/5/24,19.3,6,12.9,0.1,11.2,24.1,44254.52 +2021/5/25,20.8,8.7,15.2,0.2,12.9,25.6,34618.7 +2021/5/26,23,10.8,17.1,0,20.9,44.6,44540.17 +2021/5/27,25,7.9,17.2,0,11.9,26.6,42849.11 +2021/5/28,23,11.3,16.8,0.6,17.6,35.3,29229.61 +2021/5/29,27,11.4,19.5,0,17,37.4,43776.93 +2021/5/30,26.8,11.7,19.6,0,10.8,23,44169.89 +2021/5/31,21.6,11.9,17.2,0,20.5,44.3,42480.5 +2021/6/1,23.2,11.4,17.3,0.2,11.2,28.4,41751.52 +2021/6/2,20.8,12.7,16.5,1.7,20.4,41,26273.12 +2021/6/3,22.1,9.5,15.9,0,11.8,29.5,44520.2 +2021/6/4,25,7.7,16.3,0,11.6,28.4,46080.93 +2021/6/5,29.6,9.2,19.9,0,16.6,35.6,46078.12 +2021/6/6,25.6,12.6,18.6,0.5,26.6,56.2,25458.6 +2021/6/7,27.1,12.5,19.9,0,22.2,43.6,44474.66 +2021/6/8,25.7,14,19.7,0,19.6,38.2,34363.25 +2021/6/9,24.7,13.5,18.6,0.1,18.1,34.9,42193.91 +2021/6/10,28,11.9,20.2,3.5,19,39.6,42522.16 +2021/6/11,23.5,13.9,18.6,2.7,17.6,33.5,41522.52 +2021/6/12,28.1,13.8,20.5,0,26,49.3,39068.39 +2021/6/13,28.4,15.4,21.6,8.6,17,38.5,36324.41 +2021/6/14,21.9,13.4,16.9,7.6,15.1,38.2,17252.29 +2021/6/15,20.1,11.5,16.5,7.3,14.1,29.9,10708.43 +2021/6/16,17.2,10.7,13.2,3.1,16.2,33.8,22027.06 +2021/6/17,17.8,9.4,13.3,0,12.6,27,30633.49 +2021/6/18,20.8,10.9,15.9,0,15.3,32,25863.42 +2021/6/19,21.4,12.3,17.2,0,20.4,41.4,26742.1 +2021/6/20,23,14.4,18.3,0,15.7,30.6,33436.56 +2021/6/21,26.6,13.6,20.1,0,10.1,23,44389.19 +2021/6/22,28.6,13.6,21.3,0,24.7,48.2,40968.23 +2021/6/23,28.3,16.3,21.7,0,20.2,38.9,43875.2 +2021/6/24,23,14.6,18.5,4.3,13.6,30.6,12646.44 +2021/6/25,25.5,12.9,19.2,0.6,14.3,28.4,40498.2 +2021/6/26,26.4,15.1,21.3,0,18,34.6,40466.75 +2021/6/27,29.5,14.4,22.5,0,16.4,32.4,42568.58 +2021/6/28,24.1,15.1,20.8,0.2,18.5,38.5,27672.48 +2021/6/29,26.2,15.8,20.5,3.7,16.5,33.5,43435.64 +2021/6/30,24.4,13.5,18.5,1.6,13,32.4,38474.43 +2021/7/1,26.2,14.2,19.5,0.7,14.2,31,38439.42 +2021/7/2,22.8,12.6,17.5,6.9,18.4,35.3,38382.2 +2021/7/3,26.8,10.3,19.3,0,23,43.9,47973.69 +2021/7/4,29,13,20.8,0,15.6,32,46729.31 +2021/7/5,27.1,12.5,20.9,0,18.9,34.9,40842.41 +2021/7/6,24,16.9,19.8,3.4,13.2,29.9,36023.76 +2021/7/7,27.3,13.4,20.4,0,13.4,41,46765.51 +2021/7/8,29.1,13.6,22.2,0,17.4,33.1,43975.21 +2021/7/9,30.5,17.3,23.6,0,18.7,38.2,36278.38 +2021/7/10,24.4,16.5,20.4,4.1,11,27.7,21569.67 +2021/7/11,27.1,16,21.5,0.2,13.5,31,45016.66 +2021/7/12,30.3,16.9,23.1,0,14.5,33.1,47400.58 +2021/7/13,32.1,16.8,25.3,0,19.7,40.3,45223.78 +2021/7/14,25,19,22.2,11.7,20.6,42.1,0 +2021/7/15,23.5,17.1,19.7,1.7,13.8,28.1,14107.42 +2021/7/16,27.7,13.6,21.2,0,15.4,34.2,47161.6 +2021/7/17,30.9,16.3,23.9,0,20.5,37.1,46331.82 +2021/7/18,30.3,15.6,23.3,0,16.2,34.6,47100 +2021/7/19,29.7,16.7,23.1,0,18.6,36.7,46772.25 +2021/7/20,29.4,15.9,22.6,0,26.4,51.1,46275.27 +2021/7/21,29.7,17.4,22.9,0,25,51.1,46168.81 +2021/7/22,31.1,17.3,23.6,0,23.2,45,46341.79 +2021/7/23,31.2,18.5,24.2,0,23.4,49.3,46028.66 +2021/7/24,31.4,19,24.5,0,25.5,47.9,45859.99 +2021/7/25,26.6,17.8,21.4,3.7,22.8,42.8,15140.99 +2021/7/26,23.5,16.2,19.1,3.8,11,23.4,23682.78 +2021/7/27,24,16.2,19.7,0.4,11,20.9,30571.88 +2021/7/28,26.6,15.1,20.4,0,13,31,46044.48 +2021/7/29,29,13.9,21.8,0,15.9,34.9,46033.57 +2021/7/30,31.2,17.5,24.8,0,11,27,46021.46 +2021/7/31,33,14.1,23.9,0,13.4,26.6,45712.57 +2021/8/1,33,16.1,24.5,0,19.6,38.5,45597.85 +2021/8/2,31.5,16.2,24.6,0,20.4,39.6,44186.59 +2021/8/3,20.8,15.3,17,9.8,17.7,33.1,0 +2021/8/4,25.4,14.6,19.4,0,9.9,24.5,41901.41 +2021/8/5,28.1,15.2,22.1,0,12,27,43727.71 +2021/8/6,29.2,15.7,21.9,0,20.2,42.1,35165.12 +2021/8/7,29.2,12.3,21.6,0,21.4,41.4,44006.68 +2021/8/8,26,17.1,21.8,0,15.9,33.1,43256.5 +2021/8/9,29.4,15.2,22.8,0,14.7,31.3,43200 +2021/8/10,27.6,18,22.2,1.2,24.6,49.3,29906.84 +2021/8/11,26.7,15.9,21.6,0,20,39.6,43416.54 +2021/8/12,23.9,13.7,18.8,0.7,11.8,27,12150.19 +2021/8/13,28.5,12.1,20.8,0,16.6,31.7,43753.13 +2021/8/14,29.5,14.9,21.6,0,26.7,52.2,43753.32 +2021/8/15,27,13.6,20,0,27.7,54.4,37483.52 +2021/8/16,25.4,16.6,20.4,0,29.3,57.2,23942.3 +2021/8/17,26.9,17.5,21.6,0.7,27.3,52.2,33034.75 +2021/8/18,22.5,16.5,19.5,11.9,11.8,24.5,1203.41 +2021/8/19,24.3,14.7,18,7.2,10.8,26.3,28059.82 +2021/8/20,27.9,13.3,20.9,0,15,30.6,43200 +2021/8/21,21.5,15.7,18.2,4.2,18.1,37.8,15569.05 +2021/8/22,24.9,14.6,18.8,2,10.2,20.2,33565.33 +2021/8/23,21.3,13,17.3,0.2,18.5,38.9,38595.96 +2021/8/24,22.6,13.5,17.6,0,10.4,24.1,43200 +2021/8/25,20.2,10.7,15.1,0.4,16.6,36.7,40949.71 +2021/8/26,23.5,9.8,16.5,0,17.2,33.8,39600 +2021/8/27,24,10.3,17,0,21.1,41,40654.54 +2021/8/28,23.3,12.4,17.2,2.3,11.9,27.4,41013.84 +2021/8/29,25.2,11.2,18.5,0,23.6,45.7,40776.25 +2021/8/30,18.6,13.1,15.5,5.8,24.5,47.9,4301.39 +2021/8/31,23.4,12.4,17.5,0,10.9,26.3,33793.24 +2021/9/1,26.5,11,18.9,0,17.7,34.6,43200 +2021/9/2,26.5,13.4,19.4,0,22.9,44.3,42706.95 +2021/9/3,20.4,14.1,17.2,17.9,23.8,54.4,7200 +2021/9/4,22.3,11.2,16.8,0,11.2,24.1,29286.71 +2021/9/5,16,11.4,13.7,13.1,16.5,32.4,6498.89 +2021/9/6,19.1,10.5,14.5,0,9.6,19.1,32706.1 +2021/9/7,23.5,8,15.4,0,11,24.1,42797.66 +2021/9/8,24.3,12,17.4,0.7,13.5,33.8,42667.97 +2021/9/9,23.7,10.9,17.2,0,13.6,32.4,42537.38 +2021/9/10,27.3,9.7,17.9,0,19.1,37.1,42405.96 +2021/9/11,26,12.7,18.6,0,22.2,43.2,42273.84 +2021/9/12,25.8,12.5,18.8,0,23.7,46.8,42141.05 +2021/9/13,24.3,15.8,19,0,31.9,62.3,32392.19 +2021/9/14,17.7,14.8,16.5,9.4,22.2,43.9,0 +2021/9/15,14.8,12.2,13.8,35,21.6,44.6,4772.42 +2021/9/16,20.6,10.4,15.1,0.2,12.1,24.1,35657.43 +2021/9/17,20.3,11.9,15.5,0,16.2,33.5,30533.68 +2021/9/18,15.7,12.5,13.8,2.5,13.7,25.9,1405.88 +2021/9/19,17.7,7.8,13,0.2,21.7,53.6,38723.11 +2021/9/20,21.3,9.5,15.1,0,20,40.3,41065.09 +2021/9/21,23.1,7.4,14.8,0,13.4,27.7,40930.09 +2021/9/22,19.2,11.5,14.5,2,14.5,29.5,17382.17 +2021/9/23,23,9,15.3,0,16.3,32.8,40005.26 +2021/9/24,21.3,13.1,16.3,0.9,19.1,38.5,28943.55 +2021/9/25,19.9,11.6,15.6,4.4,19.5,38.9,18404.65 +2021/9/26,18.2,9.9,13.6,2.2,13.5,25.9,18068.18 +2021/9/27,20.1,8.2,13.7,0,15.6,32.4,23423.1 +2021/9/28,22.4,11.2,15.7,0,10.3,22,39364.76 +2021/9/29,21.1,8.7,14,0,12.1,28.4,27523.45 +2021/9/30,21.6,7.7,14.2,0,15.1,32.8,38812.65 +2021/10/1,22.2,9.9,15.6,0,15.5,32,38757.83 +2021/10/2,23.1,9.6,16.2,2.9,15.8,31.7,35040.9 +2021/10/3,15.2,3.9,12.4,10.9,18.7,35.6,0 +2021/10/4,11.3,2.9,7.1,3.3,14.2,29.5,8998.02 +2021/10/5,12.6,5.2,8.6,8,14.6,29.5,26991.04 +2021/10/6,17.6,5.3,11.2,8.5,14.3,29.9,33014.04 +2021/10/7,21.2,6.2,12.7,0,21.8,41.8,36684.2 +2021/10/8,16.8,6,10.6,0,20.3,39.2,32424.32 +2021/10/9,10.2,2.7,5.2,3.2,18,48.6,1989.82 +2021/10/10,10.9,1,5.8,4.4,17.7,34.2,36000 +2021/10/11,15.1,1.6,7.7,0,26,49.3,37494.16 +2021/10/12,12,5,8.2,3.3,20.4,43.2,11813.6 +2021/10/13,11.6,6.7,8.9,0.6,9.2,17.6,5554.06 +2021/10/14,8.4,2.5,6.6,1.1,15.8,29.9,398.94 +2021/10/15,9.1,2.5,5.6,5,12.1,23.4,17542.6 +2021/10/16,13,1.4,6.7,0,20.4,37.8,29550.29 +2021/10/17,13.7,1.9,7,0,15.3,32.8,36028.86 +2021/10/18,13.9,2,7.1,0,11.3,22.3,35652.08 +2021/10/19,7.5,4.8,6.5,6.8,20.6,42.1,0 +2021/10/20,10.7,1.3,6.4,1.3,14.1,29.9,25533.13 +2021/10/21,12.6,-0.8,5.4,0,14.6,28.4,30246.67 +2021/10/22,14.3,0.5,6.1,0,21.4,39.6,35946.21 +2021/10/23,12.8,2.9,6.5,0,18.3,33.5,30592.9 +2021/10/24,13.5,0.2,6.4,0,20.3,38.5,35621.46 +2021/10/25,11.2,2.5,5.7,2.8,13,23,20105.66 +2021/10/26,9,2.4,5.2,1,12.8,26.6,18155.46 +2021/10/27,11,0.8,5.3,0,9.7,23,35237.28 +2021/10/28,12.1,-0.9,5.6,0,9.6,20.5,33387.64 +2021/10/29,13.8,2.4,7.7,0,13,21.2,35127.99 +2021/10/30,9.3,2.3,6,0.3,9.1,18.7,4564.4 +2021/10/31,12.9,1.4,6.7,0,20.9,39.2,34739.85 +2021/11/1,7.7,0.5,5.4,3.4,22.7,43.2,22568.91 +2021/11/2,10.4,-2.6,3.6,0,13.2,28.4,29528.56 +2021/11/3,11.1,-0.9,4.6,0,12.4,21.6,34770.45 +2021/11/4,12.7,-2,4.5,0,12.7,27.4,34710.66 +2021/11/5,14.7,1.1,6,0,13.4,26.6,34652.07 +2021/11/6,-1.1,-8.7,-6,4.2,18.4,40,0 +2021/11/7,1.9,-10.2,-5.4,0,17.7,37.8,34538.13 +2021/11/8,4.6,-6,-1.5,0,11.8,27,34482.91 +2021/11/9,4.5,-5.6,-1.3,0,11.3,26.6,34428.77 +2021/11/10,4.4,-3.8,0,0,10.2,24.8,34311.47 +2021/11/11,2.9,-5.9,-2,0,14.7,31.7,34195.26 +2021/11/12,7.8,-6,0.6,0,10.7,23,34080.31 +2021/11/13,6.7,-4.3,0.3,0,10.7,22.7,33966.73 +2021/11/14,5.8,-4.2,-0.4,0,11.5,21.6,31971.64 +2021/11/15,6.6,-4.7,0.3,0,10.6,24.8,33744.36 +2021/11/16,7.5,-2.3,1.9,0,9.8,20.9,31351.3 +2021/11/17,10.5,-4.5,0.7,0,11.5,24.5,33529.39 +2021/11/18,11,-4,2.3,0,12.8,25.9,33425.09 +2021/11/19,5,-3.1,0.8,0,11.9,23,27662.17 +2021/11/20,2.1,-4.7,-1.7,0,23.3,45.7,32291.82 +2021/11/21,0.9,-7.1,-3.6,0,15.7,33.1,32906.18 +2021/11/22,3.8,-8.1,-2.6,0,7.3,16.9,32833.23 +2021/11/23,6.2,-5.4,0,0,13.8,21.6,32761.47 +2021/11/24,7,-5.4,0.1,0,11.2,23.4,32582.44 +2021/11/25,6.2,-4.3,1.3,0,10.7,22.7,32406.72 +2021/11/26,7.9,-3,1.6,0,10.6,23.8,26890.52 +2021/11/27,8.9,-5.1,0.3,0,15.8,28.8,32168.25 +2021/11/28,0.6,-3.5,-0.9,1.9,14.6,28.1,3788.33 +2021/11/29,1.8,-5.9,-3.3,0.8,17.5,35.3,32039.26 +2021/11/30,4.2,-7.1,-2.1,0,8.8,17.3,31020.21 +2021/12/1,4.4,-6.7,-1.1,0,14.8,30.2,31709.56 +2021/12/2,5.2,-5.3,-1,0,10.7,24.8,31649.54 +2021/12/3,6.4,-3.8,0.1,0,13.4,19.8,31073.17 +2021/12/4,5.2,-5.6,-0.3,0,11.4,24.8,31633.81 +2021/12/5,7.5,-4.7,1.1,0,10,16.6,31577.4 +2021/12/6,6.9,-5.5,0,0,27.5,50.8,29245.3 +2021/12/7,1.3,-3.9,-0.7,0,15.4,32,15833.91 +2021/12/8,7.3,-4.6,-0.5,0,17.2,31.3,29585.19 +2021/12/9,5.6,-3,0.7,0,11.9,20.9,30966.34 +2021/12/10,3.1,-0.9,1.1,0.2,13.6,26.6,5882.31 +2021/12/11,0.1,-3.9,-1.9,0.2,10.1,19.1,5314.29 +2021/12/12,1.9,-8,-3.6,0,10.5,23,31306.85 +2021/12/13,3.5,-8.3,-3.6,0,11.8,20.5,30438.48 +2021/12/14,1.6,-7.3,-3.8,0,9.8,23.8,30689.47 +2021/12/15,1.8,-7.7,-3.1,0,11.8,26.3,30141.07 +2021/12/16,0.6,-7.5,-3.9,0,14,27.4,30454.51 +2021/12/17,-0.7,-8.5,-4.8,0,11.1,22,28560.56 +2021/12/18,1.4,-7.9,-3.7,0,10.5,23.8,29169.39 +2021/12/19,0.5,-6.3,-3,0,13.8,27.7,17684.65 +2021/12/20,6.6,-6.5,-0.3,0,13.3,28.4,31108.18 +2021/12/21,7.3,-5.1,0.4,0,10,20.9,31221.23 +2021/12/22,3.3,-6.6,-2.2,0,12.2,19.4,31121.79 +2021/12/23,3,-5.7,-2.1,0,13.1,28.1,30320.51 +2021/12/24,0.9,-6.6,-3.6,0.1,12.9,23,30916.44 +2021/12/25,-2.1,-9,-5.9,0.2,13,25.2,26200.35 +2021/12/26,-3.7,-13.2,-9,0,18.4,34.2,30785.61 +2021/12/27,-1.2,-12.5,-7.8,0,9,21.6,31033.55 +2021/12/28,-1.6,-10.8,-6.2,0,12.6,28.1,31164.04 +2021/12/29,1.7,-11.2,-5.6,0,12.6,20.9,30511.12 +2021/12/30,2.1,-8.2,-3.7,0,10.3,20.5,29318.97 +2021/12/31,0.3,-7.2,-4.4,0,10.9,23.4,20460.97 +2022/1/1,3.4,-9.8,-4.5,0,12.5,20.9,31232.69 +2022/1/2,4.5,-9.8,-3.8,0,11,24.5,31187.2 +2022/1/3,0.1,-8.3,-4.1,0,9,16.2,31054.41 +2022/1/4,3.4,-9.2,-4,0,11.8,23.4,30828.25 +2022/1/5,4,-9.2,-3.7,0,10.5,19.8,30975.73 +2022/1/6,4.2,-7.3,-3,0,17.3,32.4,31028.39 +2022/1/7,0.1,-6,-3.3,0.2,13.2,27,20804.5 +2022/1/8,2.5,-5.5,-2.9,0.7,10.2,21.6,29399.62 +2022/1/9,3.1,-7.3,-3,0,12.5,26.3,29883.25 +2022/1/10,0,-7.2,-4.5,0.1,12.1,21.2,31159.82 +2022/1/11,1.3,-8.6,-4.3,0,10,22.3,31858.02 +2022/1/12,-0.7,-9.5,-5.3,0.1,14.5,30.6,31646.71 +2022/1/13,2.9,-11.1,-4.9,0,11.4,23,31524.38 +2022/1/14,1.7,-9.1,-3.8,0,10,21.2,32053.83 +2022/1/15,3.3,-7.3,-2.8,0,11.9,23,32026.78 +2022/1/16,6.6,-7.6,-1.7,0,11.5,23.8,32285.31 +2022/1/17,5.1,-8.1,-1.7,0,10.9,23.4,32355.5 +2022/1/18,7,-6.5,-0.8,0,12.7,21.6,32524.44 +2022/1/19,9.8,-6.7,-0.5,0,24.5,45,32696.54 +2022/1/20,4,-4,-1.3,0,24.9,45.4,28554.38 +2022/1/21,3.6,-4.1,-1.9,0,13.3,26.6,32230 +2022/1/22,-0.5,-3.8,-2.5,0.6,13.4,26.6,6179.81 +2022/1/23,2.6,-6.6,-2.6,0,14.2,30.2,31589.96 +2022/1/24,0.7,-7,-3.8,0.2,10.9,24.1,30645.6 +2022/1/25,1.8,-8.2,-3.1,0,23.4,44.3,20381.42 +2022/1/26,0.6,-4.5,-2.7,1.4,11.9,22,14080.04 +2022/1/27,-1.9,-6.9,-4.5,1.2,8.7,19.1,5183.55 +2022/1/28,-0.7,-8.2,-5.3,0.4,11.2,22.3,32338.24 +2022/1/29,1.6,-11.1,-6.2,0,11.8,21.6,33996.8 +2022/1/30,-1.9,-9.8,-6.3,0,12.1,24.5,34060.98 +2022/1/31,-1.8,-12.4,-7.4,0,11.7,23.4,34110.03 +2022/2/1,-0.7,-9.6,-6.3,0,9.8,24.5,32012.66 +2022/2/2,2.9,-8.2,-4.1,0,18.8,34.9,30772.31 +2022/2/3,1.1,-8.8,-4.7,0,17.4,37.8,34266.41 +2022/2/4,1.2,-9.2,-4.8,0,18.8,36,34321.36 +2022/2/5,-3.2,-6.8,-5.1,2.7,23,43.9,1154.96 +2022/2/6,-6.4,-11.4,-8.9,4.8,15.4,29.5,30960.79 +2022/2/7,-3.2,-12.1,-8.4,0,12.4,23.8,32437.65 +2022/2/8,-2.3,-12,-7.7,0,15.6,28.4,29781.55 +2022/2/9,2.4,-11.6,-6,0,11,22.7,34527 +2022/2/10,0.6,-7.7,-3.9,0.7,16.1,31,16517.91 +2022/2/11,4.6,-5.9,-1.2,1.3,15.5,33.1,34737.91 +2022/2/12,6,-6.8,-1.3,1.5,12.6,26.6,29647.23 +2022/2/13,3.8,-5.4,-1.6,0,15.3,30.6,34949.55 +2022/2/14,4,-7.5,-2.1,0,15.3,28.4,35268.62 +2022/2/15,7,-7.2,-1.4,0,10.7,24.5,35610.02 +2022/2/16,1.9,-4.9,-1.3,2.9,13.3,26.3,0 +2022/2/17,5.3,-4.3,-0.8,1.1,18.9,36.7,31541.03 +2022/2/18,-3.2,-7.9,-5.1,3.1,17.9,33.8,16443.39 +2022/2/19,-0.7,-11.9,-6.8,0,14.7,28.4,35772.61 +2022/2/20,1.4,-9.3,-4.8,0,16.2,31.7,33857.51 +2022/2/21,2,-7.7,-3.6,0,14.1,28.4,36321.09 +2022/2/22,3.7,-8.4,-2.9,0.2,15.9,30.6,36630.17 +2022/2/23,4.6,-7.5,-2.9,0,17.8,36,36949.07 +2022/2/24,7.2,-7.7,-1.4,0,9.7,18.7,37277.2 +2022/2/25,5.2,-5.9,-1.5,0,14.2,31,36901.76 +2022/2/26,8.9,-6.5,0.4,0,20.7,38.5,37595.73 +2022/2/27,5.4,-3.6,0.2,0,19.4,41,36425.69 +2022/2/28,2.8,-3.7,-0.3,0,16.9,32,30997.81 +2022/3/1,6.6,-7.8,-1.4,0,11.3,23,32697.98 +2022/3/2,8.2,-4.5,0.8,0,11.6,22.7,38022.48 +2022/3/3,7.4,-2.7,2.4,1.1,13.3,27.7,30996.18 +2022/3/4,10,-3.9,3.5,0,15.2,30.2,38136.42 +2022/3/5,9.9,-1.5,3.4,0,10.6,22,32308.65 +2022/3/6,9.1,-2.1,4.1,0.2,13,31,38248.63 +2022/3/7,17.3,-4,4.8,0,16.1,30.6,38304.14 +2022/3/8,16.9,0.8,7.1,0,15.5,30.6,38359.28 +2022/3/9,16.2,3.7,9,0.7,12.1,20.5,35745.31 +2022/3/10,20.5,-0.1,9.4,0,14.7,29.9,38468.43 +2022/3/11,18.3,1.9,10.4,0.3,13.8,27.4,32406.92 +2022/3/12,20,0.4,10.7,0,12.8,25.2,38576.17 +2022/3/13,19.6,0.9,10.7,0,28.9,56.5,38782.39 +2022/3/14,20.5,-0.5,9.7,0,16,32.8,38735.29 +2022/3/15,16.9,2.9,10.2,0,19.1,38.9,31538.82 +2022/3/16,17.5,4.2,10.3,0.5,18.6,36,35187.76 +2022/3/17,18,1.2,9,2.3,18.6,37.1,36224.47 +2022/3/18,16.6,1.5,9.1,0,17.3,32.8,37957.78 +2022/3/19,15.5,3.3,8.6,0,19.5,37.8,38943.47 +2022/3/20,13.7,4.7,8.8,0.1,24.2,46.4,35982.36 +2022/3/21,10.1,3.2,6.3,0.6,20.9,38.9,14862.55 +2022/3/22,12.1,1.1,6.4,0.2,20.5,40.7,37963.2 +2022/3/23,18.6,-1,8.8,0,26.1,48.6,40177.21 +2022/3/24,13.5,2.6,8.6,0.2,24.6,45,32400 +2022/3/25,6.8,2.1,4.4,1.1,17.8,34.6,9194.73 +2022/3/26,11.6,0.8,5.8,0,15.9,30.2,37689.03 +2022/3/27,13.2,-2.3,5.6,0,17.2,36.4,40527.64 +2022/3/28,18.9,0.5,8.2,0,22.5,41,38677.5 +2022/3/29,13.6,3.9,8.1,2,24.7,47.5,35848.25 +2022/3/30,12.7,2.5,7.2,0,16.9,35.3,12252.83 +2022/3/31,12.4,4.3,8,0,10.8,23.4,26367.06 +2022/4/1,11.5,-1.7,6.3,0,18,39.2,37468.13 +2022/4/2,15,-2.8,6.3,0,11.8,25.2,41524.23 +2022/4/3,16.7,-0.1,8.5,0.7,14.5,27.7,34721.02 +2022/4/4,16.7,1.9,9.4,0,17.4,36.4,37789.05 +2022/4/5,17.9,4.3,10.9,0,11,21.2,42007.26 +2022/4/6,19.3,3.6,11.9,0,18.7,33.1,42014.68 +2022/4/7,22.1,2.3,12.4,0,11.2,24.8,42342.71 +2022/4/8,21,5.5,13.1,0,16.2,33.8,38000.9 +2022/4/9,23.5,2.4,13.2,0,15.5,28.8,42852.5 +2022/4/10,24.4,6.7,15.7,0,15,33.1,43030.29 +2022/4/11,12.4,6,8.9,2.5,17.6,33.5,1735.51 +2022/4/12,18,0.6,8.4,0,19.7,41.4,41992.11 +2022/4/13,17.9,3.2,9.8,0.1,25.1,50.8,38227.57 +2022/4/14,13.5,4.6,8.4,0.4,23,42.8,21690.75 +2022/4/15,8.5,2.5,5.3,1.2,30.6,56.2,2333.33 +2022/4/16,14,0.5,6.6,0.2,24,44.6,25706.82 +2022/4/17,13.6,2.5,7,1.2,19.1,43.9,34303.27 +2022/4/18,14.6,1.8,7.7,0,20.3,42.8,40882.13 +2022/4/19,12.5,2.1,6.5,3,19.6,39.2,34959.16 +2022/4/20,22.6,-1.2,11,0,16.3,32.4,42916.52 +2022/4/21,20.6,5.5,13.2,0,17.1,34.6,41773.21 +2022/4/22,20.7,8.2,14.3,0,22.3,42.5,32131.89 +2022/4/23,24.3,7.2,15,5.6,20.3,36.7,36000 +2022/4/24,20.2,9.2,14.2,1.6,20.8,38.9,36000 +2022/4/25,23.2,6,15,0,13.6,31,39912.16 +2022/4/26,24.7,10.1,17.7,0,26.5,51.1,37868.32 +2022/4/27,13.3,6.9,10.7,0,19.6,37.8,18201.37 +2022/4/28,20,2.5,11.5,0.2,22.7,43.2,43200 +2022/4/29,9.7,4,7.1,9.3,21.5,40,0 +2022/4/30,11.3,2.8,6.4,0.5,16.5,32.8,20000.48 +2022/5/1,12.9,-0.2,7.2,0.4,9.1,23,40572.96 +2022/5/2,16.2,3.6,9.3,0,11.4,29.5,43200 +2022/5/3,21.1,0.3,11.5,0,11.3,20.2,43200 +2022/5/4,27.2,4.1,16,0,13.6,25.9,43200 +2022/5/5,30.1,7.7,18.9,0,22,40.3,43200 +2022/5/6,27.5,10.4,18.8,0,26.9,50,43200 +2022/5/7,27.3,12.1,19.2,1.4,24.2,44.6,36000 +2022/5/8,16.5,7.2,11.4,1.5,18.6,34.6,0 +2022/5/9,23.1,3.6,13.2,0,14.1,29.2,43200 +2022/5/10,22.2,8.8,15.2,5.7,16,34.9,21897.05 +2022/5/11,22.3,9,15.3,1.3,15,29.2,38535.71 +2022/5/12,20.3,5.5,11.8,0.6,25.1,49.7,25241.6 +2022/5/13,11.2,5.5,8,1.1,21.4,41,1279.98 +2022/5/14,13.7,4.3,8.4,0.4,17.6,36.4,27223.09 +2022/5/15,15.5,3.7,9.4,0.8,14.1,25.6,18007.73 +2022/5/16,19.1,2.4,11.8,0,10.5,23.4,43490.64 +2022/5/17,23.6,4.4,14.3,0,29.1,54,41928.89 +2022/5/18,17.3,9.5,13.3,6.2,23.1,43.6,27456.92 +2022/5/19,24.8,7.8,16.3,0.3,16.9,29.5,42442.73 +2022/5/20,23.9,10,17.5,0.3,21.4,42.5,37259.32 +2022/5/21,21.8,12.3,16.5,0.1,14.6,31,11505.74 +2022/5/22,26.2,7.1,17,0,19.7,38.9,42149.33 +2022/5/23,26.4,10.8,18.3,0,22.7,41,41970.79 +2022/5/24,25.4,11.2,18.4,0,31.3,57.2,43961.82 +2022/5/25,21.3,12.2,16.5,1.1,21.3,42.8,14466.88 +2022/5/26,23.2,11.6,18,0,17.2,31,27286.42 +2022/5/27,23.7,12.2,17.9,0,19.8,35.3,16755.34 +2022/5/28,27.9,9,19.3,0,21.8,52.9,37711.04 +2022/5/29,22.3,12.8,17.2,2.5,16.5,41.8,25358.29 +2022/5/30,22.8,11.5,17.7,0,15.3,27.7,22350.09 +2022/5/31,26.5,11.8,19.5,0.1,12.5,25.6,44005.63 +2022/6/1,28.3,11,20.3,0,26.9,50.8,44977.51 +2022/6/2,27.3,12.9,20.3,0,21.3,39.2,40065.76 +2022/6/3,18.5,12.5,15.2,6,21.7,41,1625.74 +2022/6/4,23.3,10.1,16.7,0,12.7,27.7,35895.47 +2022/6/5,26.4,11.7,19.7,0,15.8,29.2,44016.84 +2022/6/6,21.7,15.3,18.2,1,14.5,30.2,2224.3 +2022/6/7,24.8,12.2,19.1,0,13.9,27,30855.99 +2022/6/8,27.4,10.2,19.7,0,18.7,39.2,37968.36 +2022/6/9,23.5,14.5,19.7,0,19.9,39.2,22399.65 +2022/6/10,26.6,13.5,19.9,0,18.7,35.3,44139.73 +2022/6/11,24.5,12.4,17.7,2.8,15.5,38.2,23430.27 +2022/6/12,25.5,12.5,18.4,0,11.3,41,40575.07 +2022/6/13,26.7,15,20.3,0,12,29.5,46289.46 +2022/6/14,29.2,9.6,21.1,0,20.9,40.3,46762.58 +2022/6/15,31.1,12.6,22.6,0,23.3,43.9,46596.95 +2022/6/16,31,13.1,22.5,0,25.1,47.9,46454.43 +2022/6/17,31.5,14.7,22.6,0,27.6,53.3,45258.94 +2022/6/18,30.2,15.2,22.5,0,23.3,43.6,40270.25 +2022/6/19,29.4,14.5,22.5,0,20.7,40.7,44119.14 +2022/6/20,27.7,16.7,22.1,2.6,25.2,49,26756.25 +2022/6/21,24.2,16,19.3,7.7,12.8,24.8,4552.05 +2022/6/22,24.8,15,18.8,13.1,13.7,25.9,24052.96 +2022/6/23,28.9,12.5,21.5,0,17.3,33.5,46792.14 +2022/6/24,30.9,15.8,23.9,0,28.1,52.9,44561.92 +2022/6/25,29.5,16.9,21.8,18.1,23.3,42.8,29632.07 +2022/6/26,22.2,14.7,18,4.7,13.2,26.3,29434.34 +2022/6/27,25.8,13.5,19.8,0.6,23,45,39441.66 +2022/6/28,28.2,13.3,21.3,0,24.4,53.3,46963.37 +2022/6/29,29.1,15,22.2,0,13.6,31.7,47285.07 +2022/6/30,30.4,13.4,21.6,0.1,23.2,45,45054.54 +2022/7/1,27.3,16,21.3,4.1,19.7,38.9,32863.34 +2022/7/2,27.9,15.9,21,9.4,12,24.5,43820.75 +2022/7/3,31.4,13.8,22.9,0,20.4,40,47296.16 +2022/7/4,29.2,15.7,21.5,3.5,19.6,39.6,44448.41 +2022/7/5,28.9,16,21.7,0,18.9,39.6,47116.99 +2022/7/6,33,13.7,24,0,17.2,35.6,47651.48 +2022/7/7,34.4,17.5,25.8,0,20,40.3,47277.56 +2022/7/8,32.9,18.3,26,0,18.3,36.7,42695.5 +2022/7/9,29,19.4,23.6,0.9,16,34.9,33604.17 +2022/7/10,29.3,16.9,23.5,2.6,21.1,49.3,37726.33 +2022/7/11,26,18.7,21.2,13.7,18,35.3,18682 +2022/7/12,25.3,15.7,20.3,0.2,12.7,24.5,32987.43 +2022/7/13,27.5,16.1,21.6,0,15.9,30.2,41457.53 +2022/7/14,28.2,18.2,22.1,4.9,11.8,25.9,34565.48 +2022/7/15,21.7,16.3,19.5,14.5,16.1,31.7,5083.16 +2022/7/16,23.7,13.9,18.3,0.1,12.6,25.6,27080.61 +2022/7/17,22.9,15.3,18.7,0,9.2,19.8,26403.08 +2022/7/18,22.1,15.1,17.8,5.1,11.2,21.2,0 +2022/7/19,23.3,13,17.6,0.9,14,33.8,46063.12 +2022/7/20,27.8,11.2,19.7,0,16,34.6,46791.57 +2022/7/21,19.5,11.6,15.8,30.9,23.8,48.2,10161.68 +2022/7/22,24,9,16.5,0.2,15.8,29.9,46722.72 +2022/7/23,28.2,11.4,19.3,0,15.1,29.9,46327.87 +2022/7/24,27.6,14.4,19.4,1.5,14.6,38.2,45644.62 +2022/7/25,28.9,13.5,21.3,0,21.4,41,46190.39 +2022/7/26,28.7,15.2,21.8,1.5,17,34.6,44286.55 +2022/7/27,25.4,14.5,18.9,2,18.7,34.2,45828.63 +2022/7/28,29.1,11.2,19.9,0,16.3,33.1,45589.09 +2022/7/29,28.6,12.8,20.7,0,13.3,26.6,44758.32 +2022/7/30,30.2,16.5,21.8,1.1,15.3,29.2,39941.96 +2022/7/31,29.5,17.7,22.9,0,27,51.8,42757.64 +2022/8/1,28,18.5,22.6,0.2,26,49.3,29890.08 +2022/8/2,29.8,17.1,22.8,0,23.5,44.3,44578.7 +2022/8/3,29.6,17.7,23.2,0,22.3,41.8,41776.77 +2022/8/4,28.9,18.7,22.9,1.3,15.5,31,42235.97 +2022/8/5,30.4,16.7,23.7,0,14.7,28.1,44423.03 +2022/8/6,31.9,18.5,25.3,0,13.9,26.3,43319.3 +2022/8/7,32.3,19,25.6,0,18,35.3,44141.89 +2022/8/8,31.7,18.7,25.5,0,21.7,40.3,44272.95 +2022/8/9,31.1,21.4,25.9,0.2,16.8,34.9,34814.42 +2022/8/10,31.2,20.1,24.6,0.8,16.7,32.4,32400 +2022/8/11,31.5,18.3,24.9,0,20.7,39.2,40863.06 +2022/8/12,30.8,19.1,24.8,0.3,16.5,32.8,32400 +2022/8/13,32.8,20,25.1,5.1,15.1,32.8,34136.89 +2022/8/14,22.5,16.5,19.6,9.7,14.7,27.4,2450.62 +2022/8/15,22.4,15.8,18.8,1.3,9.8,20.9,19751.36 +2022/8/16,29,14.8,21.4,0,15.5,29.9,43200 +2022/8/17,27.2,19.1,22.7,0.9,17.1,31.3,25154.88 +2022/8/18,22.5,17.1,19.6,34,24.8,47.2,13341.15 +2022/8/19,25.8,14.8,19.7,0,13.1,28.1,34376.96 +2022/8/20,30.2,13.7,21.2,0,19.5,37.1,38278.3 +2022/8/21,28.9,18.2,22.3,9.6,17.1,32,38162.66 +2022/8/22,23.4,15.5,19.1,8.5,20.8,39.2,8837.13 +2022/8/23,25.8,17.6,21.2,4.9,23.2,43.6,14231.13 +2022/8/24,19,14.3,16.6,7.3,10.3,21.2,0 +2022/8/25,23,12.2,17,0,18.1,33.8,41802.7 +2022/8/26,22.5,13.4,18.2,0,15,28.4,18380.34 +2022/8/27,23.6,15.4,19,11.2,20.4,38.9,16939.55 +2022/8/28,16.5,12.4,14.7,4.7,18.2,33.8,6078.85 +2022/8/29,17.3,9.5,13.4,0.3,10.5,22,0 +2022/8/30,19.5,8.4,13.5,0,9.2,22.7,39600 +2022/8/31,18.2,9.4,13.2,0,17.1,32.4,16024.72 +2022/9/1,23,8.7,15.6,0,24,46.8,35535.8 +2022/9/2,21.8,12.2,16,3.6,16.9,32,36725.48 +2022/9/3,17.8,11.9,14.4,10.7,13.4,24.5,23911.36 +2022/9/4,18.9,10,14.6,0,15.7,31.3,35447.71 +2022/9/5,21.2,9.4,14.9,0,10.2,23.8,43033.11 +2022/9/6,23.3,8.2,15.8,0,17.1,34.2,42957.43 +2022/9/7,21.1,10.1,15.4,1.1,11,22,27649.57 +2022/9/8,22.3,10.5,16.5,1.9,13,29.2,42696.2 +2022/9/9,23.8,10.1,16.7,0,13.4,30.2,42564.67 +2022/9/10,23.9,9.5,16.2,0,11.6,20.5,42432.66 +2022/9/11,24,9.5,15.8,0.2,17,33.8,41868.79 +2022/9/12,22.4,9,15.8,0.1,19.6,39.2,42167.45 +2022/9/13,21.7,12.8,16.8,0,30.7,57.6,25245.14 +2022/9/14,22.2,13.8,17.3,0,26.7,50,34062.95 +2022/9/15,24.3,11.3,17.1,0,16.8,32.4,41337.88 +2022/9/16,17.3,11.7,14.4,4.1,15.3,29.2,1859.74 +2022/9/17,22.3,13.4,17,1.6,12.8,24.8,32557.96 +2022/9/18,19.7,11.6,15.4,0.5,14.5,28.8,5320.34 +2022/9/19,15.8,10.8,13.7,1.3,19.1,36.7,1186.01 +2022/9/20,17.5,7.6,12.3,0,9.7,18,33670.16 +2022/9/21,21.2,6.9,13.8,0.1,10.2,25.2,40708.42 +2022/9/22,20.7,11.6,15.8,0,12.4,26.6,38666.61 +2022/9/23,17.9,9.4,13.5,0,21,40.3,20221.5 +2022/9/24,19.8,5.7,12.6,0,13.6,31.3,39583.78 +2022/9/25,20.3,6.8,14.1,0.4,15.5,29.2,38525.7 +2022/9/26,19.4,7,14,0,11.9,23,21084.57 +2022/9/27,19.4,9.8,14.6,0.2,13.1,28.1,28127.66 +2022/9/28,22.2,7.7,15,0,14.5,28.4,39378.64 +2022/9/29,21.7,9.2,14.4,0.7,14.8,30.2,34132.59 +2022/9/30,23.1,9,15.4,9.3,20.5,40.3,36683.92 +2022/10/1,23.9,10.9,16.9,0,13.2,27,36568.88 +2022/10/2,16.4,8.7,13.3,9,13.1,25.9,2052.02 +2022/10/3,13.7,6.8,9.7,1,13.4,23.4,18729.97 +2022/10/4,16.6,6.5,11,0,21.2,40.7,31256.52 +2022/10/5,11.7,8.1,9.5,10.8,20.8,38.2,0 +2022/10/6,14.2,7,9.9,1.6,12.2,23.8,14400 +2022/10/7,15.3,6.2,10.6,0,14,28.1,35625.28 +2022/10/8,9,3,7.6,2.4,19.2,36,5538.21 +2022/10/9,9,-1.5,3.7,0,12.3,24.1,29827.63 +2022/10/10,15.7,-2.8,6,0,16.6,31.3,35587.98 +2022/10/11,15.1,1.8,7.9,0,17.4,32.4,29718.61 +2022/10/12,14.4,4.9,9.6,0,12.2,26.6,30754.23 +2022/10/13,13.1,4.6,9.4,1.1,13.6,27,24949.88 +2022/10/14,13.1,3.9,8.8,0,9.4,16.6,24040.21 +2022/10/15,14.4,6.9,10.6,0,8.8,20.9,28916.84 +2022/10/16,15.4,2,9.1,0,12.6,25.2,36871.07 +2022/10/17,15.1,1.6,8,0,11.2,26.6,36756.36 +2022/10/18,19.1,3.6,10.1,0,20.2,37.8,36583.13 +2022/10/19,17.9,5.9,10.7,0.1,22.7,47.5,32257.43 +2022/10/20,14.2,7.8,10.6,2,12.4,31.3,12799.22 +2022/10/21,16.2,6.2,11.2,0,15,32,35111.13 +2022/10/22,15.4,4.9,10,0,10.7,24.5,35690.93 +2022/10/23,15.1,3.8,10,2.6,14.7,27.4,30021.76 +2022/10/24,17.2,5.7,11.4,0.3,16.8,32,35550.76 +2022/10/25,15.9,8.3,11.2,1,11.8,23,8122.19 +2022/10/26,14.6,8.3,10.7,12.4,9.4,19.4,20321.52 +2022/10/27,15.7,7.9,10.6,0.1,28.4,52.6,32400 +2022/10/28,14.1,6.5,9.8,2.6,22.7,45.7,34657.68 +2022/10/29,11.2,2.4,8.2,2.7,13,24.5,18637.13 +2022/10/30,12.4,1.6,6.5,0.2,12.6,26.6,32593.01 +2022/10/31,14.9,0.8,7,1.7,16.1,31,34983.01 +2022/11/1,15.9,1.2,7.8,0,14.2,31,34918.52 +2022/11/2,8.8,3.2,6.6,1.4,13.4,29.2,12375.17 +2022/11/3,10.4,1.6,5.1,0.2,13,24.8,17436.14 +2022/11/4,10.1,0,4.5,0,13.2,27.7,34730.53 +2022/11/5,13.2,-0.8,4.8,0,12.7,24.1,33916.86 +2022/11/6,11.5,1.2,5.3,0,14.5,28.4,34610.5 +2022/11/7,11.5,-0.5,5.9,0,18.7,34.9,16317.25 +2022/11/8,14.1,3.6,7.6,0,13,24.5,34495.41 +2022/11/9,13.6,2.8,7.6,0.5,16.4,31,32646.58 +2022/11/10,13.4,5.3,8.1,0.2,16.6,32,32945.81 +2022/11/11,5.2,0,1.5,7.1,16.3,31,0 +2022/11/12,7,-3.3,1.9,0.2,14.2,26.3,22213.85 +2022/11/13,8.4,-2.7,2.6,0.1,11.8,23.8,30433 +2022/11/14,9.3,-2.4,3.1,0,11.9,22.3,33822.54 +2022/11/15,7.7,-2.6,2.2,0,10,22.3,33249.55 +2022/11/16,11.8,1.1,4.8,0,13.7,23,33657.95 +2022/11/17,10.5,0.8,4.2,0.3,23.5,45,30696.03 +2022/11/18,7.6,-0.2,3.4,0.5,9.7,22.3,31528.28 +2022/11/19,10.4,-3.4,2.5,0,11.6,21.2,33194.27 +2022/11/20,7.1,-1.6,2,0,17.7,34.9,24297 +2022/11/21,6.2,-3.5,1.3,0,9.2,20.2,26927.01 +2022/11/22,9.5,-1,3.2,0,13.9,23,32746.88 +2022/11/23,11.4,-1.9,2.8,0,13,24.8,32675.25 +2022/11/24,12.9,-3.2,3,0,13.8,46.8,32603.86 +2022/11/25,8.5,-4,2.1,0,20.4,40.3,32425.01 +2022/11/26,12.3,-3.2,3,0,14.5,25.9,32249.08 +2022/11/27,8,-1.5,2.4,0.7,11.5,23,28158.86 +2022/11/28,-1.7,-6,-4.3,0,21.8,40.7,19517.91 +2022/11/29,-6.6,-11.1,-8.8,0,16.5,31.3,22978.99 +2022/11/30,-2.7,-12.4,-8.2,0.1,13.4,31,25215.15 +2022/12/1,2.1,-9.4,-5.4,0,14.3,29.2,29283.16 +2022/12/2,5.2,-10.2,-3.3,0,14.8,27.7,31759.19 +2022/12/3,0.6,-7.5,-3.7,0,13.1,26.3,27314.42 +2022/12/4,-1.8,-6.4,-3.8,0.5,10.6,20.9,12395.31 +2022/12/5,3.1,-8,-4.1,0,11.2,18,31586.47 +2022/12/6,2.4,-6.9,-3,0,10.7,21.6,31432.49 +2022/12/7,3.2,-6.3,-2.6,0,13.6,28.4,29266.18 +2022/12/8,1.4,-7.9,-3.6,0,9.4,20.2,31331.67 +2022/12/9,2.9,-7.5,-2.6,0,19.1,37.8,31284.68 +2022/12/10,1.2,-7.7,-3.8,0,18.1,37.1,28108.66 +2022/12/11,-1.4,-7.6,-5,0.1,17,31.7,24741.4 +2022/12/12,0.5,-10.6,-5.4,0,11.7,26.3,31051.12 +2022/12/13,0.4,-7.8,-4.4,0,14.5,29.2,31075.49 +2022/12/14,5.2,-10.1,-3.2,0,14,25.6,30658.55 +2022/12/15,0.7,-6.1,-2.8,0,15.3,31.3,26123.61 +2022/12/16,-6.4,-12.7,-8.7,0.2,18.9,37.8,28979.74 +2022/12/17,-4.1,-15.5,-10.7,0,9.4,23,31011.06 +2022/12/18,1.9,-12.9,-5.3,0,11.5,24.5,31222.78 +2022/12/19,-0.8,-10.9,-5.7,0,10.7,24.8,30135.49 +2022/12/20,0.5,-10.8,-5.5,0,14.2,30.6,30892.15 +2022/12/21,3.8,-10.1,-4.2,0,14,29.9,31109.03 +2022/12/22,2.6,-7.6,-3.5,0,9.5,21.6,30438.61 +2022/12/23,4.2,-5.7,-1.8,0,14.1,21.2,31125.47 +2022/12/24,3,-7.8,-3.8,0.4,21.4,40,29499.91 +2022/12/25,-2.3,-8.3,-5.5,0.3,16.9,31.3,18213.38 +2022/12/26,-0.5,-11.2,-6,0,11.6,26.6,29865.15 +2022/12/27,-2,-12.3,-7,0,10.3,24.5,31021.63 +2022/12/28,-1.4,-10.3,-6.9,0,13.7,29.5,31149.98 +2022/12/29,-0.1,-12.5,-7,0,10.2,20.9,31091.95 +2022/12/30,1,-10.8,-5.9,0,13.8,20.2,31130.43 +2022/12/31,1.7,-9.4,-4.7,0,11,19.8,30714 +2023/1/1,-0.8,-6.8,-3.9,0.4,11.8,25.6,22929.92 +2023/1/2,3,-10.3,-4.9,0,11.7,23.4,31079.91 +2023/1/3,1.3,-8.6,-4.3,0,11.3,25.9,30992.39 +2023/1/4,4,-8,-2.7,0,12.1,24.8,29130.78 +2023/1/5,2.4,-7.3,-3,0,23.2,45,30867.42 +2023/1/6,9.7,-8.1,-1.5,0,12.9,27.7,31464.55 +2023/1/7,10.3,-4.9,1.2,0,15,26.3,31609.62 +2023/1/8,7,-4.7,1.3,0,9.4,15.1,31577.48 +2023/1/9,5.7,-4.6,-0.1,0,12.1,17.3,31636.24 +2023/1/10,8,-7.9,-0.9,0,15.7,32,31425.49 +2023/1/11,5,-4.7,-0.8,0,15.5,31.3,31211.41 +2023/1/12,8.9,-6.6,-1.2,0.3,20,40,31545.67 +2023/1/13,-6.9,-12.4,-9.8,1.4,17.1,36,11004.49 +2023/1/14,-9.6,-14.1,-12,1.2,16.2,33.8,9757.58 +2023/1/15,-4.7,-12.9,-9.7,0,12.2,27,31455.73 +2023/1/16,-6.1,-12.4,-9.4,0.2,9.8,23.4,18271.51 +2023/1/17,-3.2,-11.7,-8.6,0,16.2,33.1,26753.74 +2023/1/18,-1.7,-14,-9.1,0,13.8,29.9,32500.65 +2023/1/19,-1.5,-13.3,-8.4,0,11.6,25.9,32571.36 +2023/1/20,-0.6,-13.1,-7.9,0,11.3,23.4,31939.6 +2023/1/21,-1.3,-10.8,-6.7,0,12.4,28.4,22490.39 +2023/1/22,1.1,-11.2,-5.7,0,13,29.5,32479.31 +2023/1/23,-7.6,-15.8,-10.9,1.1,24.2,46.1,25233.28 +2023/1/24,-1.6,-18.1,-10.8,0,12.7,26.6,33262.93 +2023/1/25,-0.8,-13.1,-7.8,0,13,29.2,32580.05 +2023/1/26,-2.8,-11.4,-7.2,0,16.6,35.3,33314.84 +2023/1/27,-0.9,-12.8,-7.8,0,9.7,21.2,33733.66 +2023/1/28,1.1,-11.4,-5.4,0,11.9,26.6,33589.35 +2023/1/29,5.7,-11.1,-2.8,0,13.9,23.4,33976.73 +2023/1/30,9.7,-4.7,0.9,0,11.8,22.7,34053.95 +2023/1/31,7,-3.5,1.4,0,9.4,22.7,34101.95 +2023/2/1,1.3,-6.5,-2.9,0,16.1,33.5,17418.49 +2023/2/2,8.9,-7.3,-0.8,0,17.4,34.2,32400 +2023/2/3,6.5,-4.8,0.1,0,15.9,30.6,31330.58 +2023/2/4,9.2,-5.2,-0.2,0,14.7,29.5,34307.46 +2023/2/5,8,-4.8,-0.1,0,13,27.7,34361.93 +2023/2/6,4.8,-6,-0.6,0,9.8,20.9,30049.45 +2023/2/7,9.2,-4.2,1.3,0.3,24.3,45,33253.48 +2023/2/8,0.4,-8,-2.7,9.3,20.5,38.5,10191.53 +2023/2/9,1.5,-11,-5.6,0,14.2,25.2,34752.05 +2023/2/10,5.1,-11.2,-3.8,0,16.5,29.5,33619.3 +2023/2/11,1.2,-3.8,-1.8,1.4,23.1,43.2,2722.36 +2023/2/12,-2.1,-5.8,-3.9,4.4,12.3,25.2,1695.24 +2023/2/13,-4.7,-10.9,-6.3,5.7,12.8,23.8,1476.85 +2023/2/14,-0.1,-15.1,-8.4,0,15.6,24.1,35423.29 +2023/2/15,0.1,-13.2,-6.5,0,12.7,19.8,35416.05 +2023/2/16,3,-9.7,-4.2,0.7,16.1,30.2,32261.13 +2023/2/17,1.6,-6.5,-1.8,0.1,14.8,37.1,23894.3 +2023/2/18,-2.3,-7.9,-4.3,2.5,10.6,22.7,17482.45 +2023/2/19,2.5,-10.1,-4.4,0,13.1,25.2,35275.88 +2023/2/20,6.6,-10.9,-2.4,0,18.5,35.3,26069 +2023/2/21,3.5,-3.1,-0.3,0.4,11.9,24.5,12778.35 +2023/2/22,8,-4.8,1.1,0,16.9,32,34340.76 +2023/2/23,8.2,-4.6,1.2,0,12.7,28.1,36703.11 +2023/2/24,8.7,-2.7,2.4,0,12.2,23.8,36907.89 +2023/2/25,10.6,-3.7,2.4,0,16,31.3,37116.36 +2023/2/26,11,-1.6,2.9,0,21.8,40.7,37448.73 +2023/2/27,4.7,-0.5,1.7,0.3,18.1,36.4,0 +2023/2/28,5,-3.6,0.4,0.1,14.8,29.5,25207.31 +2023/3/1,7.3,-4.8,0.6,0,17,32.4,36813.23 +2023/3/2,6.5,-3.4,1.5,0,15.2,32.4,31513.74 +2023/3/3,10.3,-4.7,1.8,0,13.6,25.6,38064.52 +2023/3/4,12.8,-4,4.3,0,10.7,19.4,38121.3 +2023/3/5,13.2,-2.4,5,0,12.1,26.3,36795.11 +2023/3/6,13.5,1,6.9,0,11.7,24.1,38233.72 +2023/3/7,11.3,-1.8,4.9,0,17.1,33.1,15315.65 +2023/3/8,13.9,-1.8,6.1,0,12,24.8,38344.62 +2023/3/9,17.1,-1.8,6.8,0,13.2,20.9,38399.54 +2023/3/10,14.8,0.9,7.9,0,14.2,24.8,37200.11 +2023/3/11,4.6,-4,1.2,0.4,19.5,37.8,13067.67 +2023/3/12,8.7,-6.4,0.4,0,12,27.7,38562.18 +2023/3/13,18.8,-3.6,6.1,0,11.5,25.9,38684.58 +2023/3/14,11.8,1.2,7.2,0,16.4,35.3,38817.59 +2023/3/15,11.2,-3.3,4.4,0,19,37.1,29819.8 +2023/3/16,13.4,-2.1,6.2,0.3,15.3,29.9,28835.13 +2023/3/17,13.9,-1.5,6.1,0,13.1,26.6,36000 +2023/3/18,15.4,0.1,7.5,0,21.3,40,36133.89 +2023/3/19,15.7,1,7.3,0,21.7,41.4,38930.82 +2023/3/20,18,2.7,9.5,1.8,21.2,39.2,35123.41 +2023/3/21,8.7,0.8,6.3,0.3,12.7,25.6,4597.49 +2023/3/22,10.2,-0.7,5.5,0,12.8,27,13361.03 +2023/3/23,9,0.8,4.7,0.5,16.6,32.4,26918.41 +2023/3/24,10.1,-1.9,3,3.2,16.4,30.6,22351.81 +2023/3/25,12.3,-2,5.6,0.4,11.8,26.6,40144.61 +2023/3/26,9,-0.8,4,0.5,14.5,27,24092.82 +2023/3/27,14.7,-4.2,4.9,0,15.1,31,40785.04 +2023/3/28,13.8,-0.2,7.1,0,14.8,29.2,37438.43 +2023/3/29,15.8,-1.9,7.8,0,21.5,41.8,41038.96 +2023/3/30,11.7,2.7,6.9,1,20,37.8,27157.63 +2023/3/31,16.8,0.7,8.7,0.1,14.7,30.2,41295.55 +2023/4/1,21.8,3.9,11.3,3.7,30.8,57.2,39721.71 +2023/4/2,10.1,1.5,4.1,9.9,23.8,49.3,0 +2023/4/3,6.5,-0.6,2.2,5,15.7,32,7005.5 +2023/4/4,9,-2.4,3.6,1.8,15.3,29.9,29267.77 +2023/4/5,1.2,-4.1,-0.5,0.2,23.3,42.8,0 +2023/4/6,11.6,-6.3,1.9,0,14,24.5,42488.95 +2023/4/7,11.2,-0.7,5.7,0,14.9,32.8,32608.17 +2023/4/8,17.7,-2.1,7.7,0,12.5,29.2,40173.45 +2023/4/9,17.4,-0.1,9.4,0,18.9,38.9,41700.53 +2023/4/10,17,5.6,10.7,0,19.1,41.4,42986.17 +2023/4/11,18.4,-0.2,9.4,0,12.5,27,43038.5 +2023/4/12,22.6,3.5,13,0,17,31.3,39267.61 +2023/4/13,16.4,7.9,12,0,19.5,37.8,22081.68 +2023/4/14,13.9,2,7.5,1,16.3,35.3,32089.01 +2023/4/15,23.4,0,11.2,0,31.6,60.8,41569.37 +2023/4/16,26.3,4.2,15.4,0,16.9,27.4,43200 +2023/4/17,23.6,10.1,17.1,0,18,39.2,43098.12 +2023/4/18,24.9,6,16.5,0,17.5,36.4,43200 +2023/4/19,21,9.1,15,0,20.6,42.5,41925.6 +2023/4/20,10.4,5.9,8.6,0,14.3,28.1,0 +2023/4/21,9.8,2.1,5.4,5.2,13.1,27,10630.18 +2023/4/22,11.7,2.4,6.2,5.8,18.5,36.4,22386.08 +2023/4/23,9.8,2.5,5.3,3,14.3,27,2775.66 +2023/4/24,10,2.2,6.7,0.1,14,29.2,12705.06 +2023/4/25,18.7,2,9.9,0.2,12.5,30.2,43200 +2023/4/26,21.4,3.3,12,0,20.4,39.6,43200 +2023/4/27,11.4,5.7,8.4,0.8,15.9,32.4,6554.58 +2023/4/28,11.7,1.7,6.1,0.1,22.5,43.9,32400 +2023/4/29,17.6,-0.8,8.3,0,13.8,32.8,43200 +2023/4/30,23.1,1.7,13.2,0,28.6,54,43200 +2023/5/1,18,6.9,13,1.3,29.9,54.4,24484.82 +2023/5/2,26.4,6.7,15.7,0,31.8,58.7,38558.56 +2023/5/3,25.5,10.4,16.7,1.5,27.1,51.1,36601.38 +2023/5/4,17.2,9.5,13.5,0.4,20.7,41.4,25200 +2023/5/5,13.7,7.6,10,4.2,13.3,28.4,1561.05 +2023/5/6,16.4,5.7,11.3,0,10.8,25.6,32826.84 +2023/5/7,14.1,7.1,9.8,2.7,17.1,32,2376.34 +2023/5/8,10.8,5.8,8.5,1,24.7,46.1,0 +2023/5/9,12.3,5.5,8.7,10.6,13.4,23.8,0 +2023/5/10,13.5,6.1,9.3,0.5,18.9,36.7,8756.71 +2023/5/11,17.3,6.4,12,0,18.4,37.4,32588.03 +2023/5/12,19.8,5.5,12.2,0,19.8,38.9,39563.09 +2023/5/13,23.3,3.4,14.1,0,24.7,49,43276.89 +2023/5/14,24.6,7.7,16.7,0,14.1,26.6,43227.2 +2023/5/15,27.8,8.3,18.2,0,15.3,32.4,42295.23 +2023/5/16,27,11.8,19.7,0,16.2,31.7,38415.95 +2023/5/17,17.6,11.1,15,2.4,14.8,30.6,501.05 +2023/5/18,26.6,7.3,17.5,0,15.8,30.6,43330.63 +2023/5/19,29.2,10.5,19.6,0,21.5,46.1,43463.73 +2023/5/20,22.1,11.9,16.5,0.2,18.7,38.9,18120.7 +2023/5/21,14.2,4.1,9.5,1.8,20.6,38.5,29662.85 +2023/5/22,20.4,4.7,12.5,0,25.1,48.2,38045.93 +2023/5/23,26.4,8.5,16.4,0,21,42.8,34658.84 +2023/5/24,23.3,7,15.2,0,20.5,41,42097.73 +2023/5/25,20.7,11.8,15.7,0.1,18.6,38.5,24175.71 +2023/5/26,20.1,10.9,15.2,2.8,19.9,38.5,14821.08 +2023/5/27,20.8,10.3,15.7,0,17.3,33.8,16064.2 +2023/5/28,22.7,11.9,17.5,0,10.6,27,32209.44 +2023/5/29,25.7,10.5,17.7,0,13.9,35.6,43123.47 +2023/5/30,24.9,13.3,18.8,1,29.8,55.8,38922.91 +2023/5/31,18.5,9.9,14.3,8.4,20.6,41.4,20469.58 +2023/6/1,20.4,8.7,15.1,2.7,12.7,31.7,29900.38 +2023/6/2,17.3,10.4,13.5,11.7,17.9,34.9,6825.04 +2023/6/3,18.1,9.3,13.5,0.1,16.6,33.1,15673.07 +2023/6/4,16.2,9.9,13.1,3.9,16.8,34.2,6602.53 +2023/6/5,21.4,8.9,15,0,13.9,27,38811.46 +2023/6/6,21.9,9.9,15.9,0.6,15.7,31.7,14893.8 +2023/6/7,22.3,10.3,16.8,0.1,13.8,28.4,38300.8 +2023/6/8,25.7,10.6,19.1,0,16,27,44564.96 +2023/6/9,25.8,12.8,19.4,0,10.5,26.3,45444.94 +2023/6/10,28.1,13.4,21.5,0,21.1,38.9,39324.71 +2023/6/11,27.5,15.3,21.6,0,22.7,43.6,35128.81 +2023/6/12,22.7,13.4,17.8,5.4,14.8,38.9,34061.62 +2023/6/13,24.3,10.8,18.8,0,14.4,25.6,46111.15 +2023/6/14,26.8,11.7,19.8,0,28.8,53.3,43956.2 +2023/6/15,26.3,12.2,18.9,0,29.1,53.6,36066.56 +2023/6/16,24.4,12.4,17.7,0,29,54.7,37884.16 +2023/6/17,25.6,12.6,18.6,2.3,23.5,47.2,36110.18 +2023/6/18,25.8,14.3,19.4,3.5,20.1,40.7,42739.94 +2023/6/19,28,12.5,20.2,0,23.3,51.8,43327.11 +2023/6/20,27.4,13.7,20.9,0,20.8,39.2,25110.96 +2023/6/21,27.2,10.7,19.8,0,27.5,51.1,46774.73 +2023/6/22,29,12.6,21.5,0,21.3,40.3,46946.44 +2023/6/23,26.6,15.1,20.7,0.2,20.2,41.8,27804.91 +2023/6/24,28.3,12.3,20,0.3,20.8,41.8,43722.92 +2023/6/25,29,12.4,21.3,0,14.2,37.4,41915.62 +2023/6/26,28.8,15.8,22.7,0,21,42.8,46621.07 +2023/6/27,28.1,16.7,21.7,0.5,22.6,43.2,26290.05 +2023/6/28,24.2,17,20.6,0,11.4,23.4,13574.31 +2023/6/29,28.6,11.8,20.7,0,16.9,30.6,46274.61 +2023/6/30,30.5,15.4,23,0,35.3,63.7,43702.59 +2023/7/1,27.3,18,22.3,5.2,25.5,46.1,38987.8 +2023/7/2,26.5,16.3,21.5,3.6,13.6,24.8,24160.51 +2023/7/3,21.3,12.2,16.8,28.3,17.3,32,34320.72 +2023/7/4,25.9,10.2,18.4,0,12.1,23.4,47672.53 +2023/7/5,24.7,14.2,18.2,0.8,12.4,27.7,17728.59 +2023/7/6,29.3,12.3,21,0,16,32.4,46927.66 +2023/7/7,28.3,14.6,21.8,0,13.3,25.6,39502.09 +2023/7/8,28.6,13.7,21.6,0,12.4,25.2,46537.84 +2023/7/9,32.4,14.6,24.1,0,26.1,47.2,47469.85 +2023/7/10,31.3,18,24.6,0.1,20.1,38.5,44554.25 +2023/7/11,26.3,19.3,22.3,8.8,12.6,24.1,30432.34 +2023/7/12,19.7,14,17.8,14,17.9,31.7,0 +2023/7/13,18.2,11.9,14.9,2.2,14.8,25.6,0 +2023/7/14,23.7,9.8,17.5,0,17.4,34.2,40661.64 +2023/7/15,27,15.6,20.7,0,13.8,29.5,47207.86 +2023/7/16,28.4,13.2,20.8,0,12.1,19.8,47181.01 +2023/7/17,27.7,15.6,20.8,0.1,21.4,38.9,45819.25 +2023/7/18,27.7,13.3,20.6,0,23.4,50.8,46861.36 +2023/7/19,30.2,14.6,21.3,0.5,14,27.4,44471.52 +2023/7/20,27.4,15.7,21.5,0,26.1,49.7,46028.2 +2023/7/21,29,13.8,21.3,0,11.6,27.4,46765.59 +2023/7/22,30.3,13.1,22.1,0,20.9,37.4,44860.67 +2023/7/23,29.5,16.9,21.8,1.1,27.1,49.7,42149.38 +2023/7/24,30.1,14.8,22.6,0,13.8,24.1,45884.47 +2023/7/25,31,15.7,23.2,0,17.1,32,44938.44 +2023/7/26,29.9,16.3,22.9,0.2,17.8,35.3,41349.11 +2023/7/27,22.3,17.1,19.6,4.7,7.1,15.5,12046.99 +2023/7/28,26.9,15.4,20.9,0.1,14.3,32.8,45742.89 +2023/7/29,27.9,13.4,20.7,0,19.9,35.6,45886.68 +2023/7/30,28,16.8,21.9,0,16.1,32.4,45040.31 +2023/7/31,29,15.4,22.4,0,18.1,32.4,44911.14 +2023/8/1,30.4,16.5,23.4,0,14.8,29.5,44583.82 +2023/8/2,30.8,16.8,24.4,0,18.7,34.6,44724.94 +2023/8/3,31.1,18,24.1,0.2,15.9,33.1,43570.83 +2023/8/4,28,17.6,23.1,0,11.8,26.3,44428.29 +2023/8/5,30.1,17.2,23.9,0.3,9.7,20.2,44004.68 +2023/8/6,25.2,17.8,22.1,1.6,27.7,49.7,13745.34 +2023/8/7,28.6,15,21.7,1.9,18.2,33.5,44006.45 +2023/8/8,30.2,17.5,23.5,0.2,27.5,49.7,44006.59 +2023/8/9,28.8,19.8,23.7,1.2,22.6,41,41943.42 +2023/8/10,30.4,19.2,24.1,1.4,10.9,24.8,43157.81 +2023/8/11,21.1,16.3,19,4.8,19.4,34.9,11742.89 +2023/8/12,27.8,16,21.1,0,9.4,17.3,44000.2 +2023/8/13,29.9,12.2,21.5,0,21.4,37.8,43874.56 +2023/8/14,29.3,15,22.1,0,21.7,40,43200 +2023/8/15,29.3,17,22.5,0,21.5,38.2,42178.62 +2023/8/16,24.5,16.3,20.5,0.9,22.8,44.3,23782.46 +2023/8/17,19.6,15.5,17.5,0.3,12.2,26.3,7200 +2023/8/18,26.3,15.4,20.3,0,12.2,23.4,43425.06 +2023/8/19,26.7,14.1,20,0,28.8,49.3,33339.83 +2023/8/20,28.5,15.5,20.9,0,18.9,37.8,43234.67 +2023/8/21,27,17.8,22,0,8.1,22.3,43200 +2023/8/22,26.7,14.7,20.7,0,13.9,27.4,43200 +2023/8/23,25.5,12.2,19.7,0,11.9,28.4,43200 +2023/8/24,27.3,11.8,19.7,0,29.7,52.9,43200 +2023/8/25,22.5,15.5,18,7.1,23.8,43.6,10767.42 +2023/8/26,22.2,13.3,17.1,1,13.8,30.6,30719.07 +2023/8/27,23.9,9.6,17,0,12.2,28.8,43200 +2023/8/28,25,10.1,17.9,0,17.9,32.4,43200 +2023/8/29,25.9,11.5,18.8,0,17.3,31.3,43200 +2023/8/30,28.4,11,19.9,0,24.4,44.3,43200 +2023/8/31,27.6,11.1,19.8,0,21.1,43.6,32400 +2023/9/1,27.1,15.6,21.2,0,12.9,34.9,43200 +2023/9/2,29.1,12.7,20.8,0,17.9,32,43177.14 +2023/9/3,29.6,13.6,21.5,0,22.4,46.8,43133.12 +2023/9/4,29.8,14.5,21.6,0,33.1,58.7,43089.05 +2023/9/5,28.3,16.3,21.3,0.6,31.9,57.6,37476.73 +2023/9/6,28.9,17,21.7,0,29,51.5,36111.7 +2023/9/7,19.5,13.9,17,7,17.6,31.7,15677.79 +2023/9/8,20.2,12.9,16.5,2.7,15.8,29.5,8403.31 +2023/9/9,25.8,10.6,18,0,7.5,20.5,42592.24 +2023/9/10,26.5,15.3,20.1,0,15.5,28.8,33048.5 +2023/9/11,21.3,14.4,17.6,5.5,14.3,29.5,23019.65 +2023/9/12,24.5,11.1,17.6,0,15.3,29.5,42198.7 +2023/9/13,26.9,10.1,18.1,0,24.2,43.2,42067.5 +2023/9/14,26.1,12.1,17.8,0,18.1,37.1,41299.61 +2023/9/15,25.7,11.4,18,0.4,12.2,25.6,41681.59 +2023/9/16,26.7,11.8,18.6,0,13.2,25.9,41119.32 +2023/9/17,24.1,14.4,18.9,0,11.3,21.6,38921.84 +2023/9/18,20.9,13.3,17.1,6,11.6,20.5,24755.89 +2023/9/19,19.2,12.8,15.8,6.3,13.1,25.6,15866.76 +2023/9/20,16.3,9.5,12.9,5.1,21.7,38.2,12040.87 +2023/9/21,21.7,5.7,13,0,16.1,29.9,41002.27 +2023/9/22,14.5,8.6,11.6,3.5,23.3,42.1,5205.01 +2023/9/23,18.6,8.8,13.6,3.1,15.8,29.2,23061.83 +2023/9/24,16.4,11.3,13.3,5.6,12.1,24.1,577.79 +2023/9/25,17.8,10.6,13.9,8.5,15.6,28.4,15310.25 +2023/9/26,17.8,10.2,13.2,6.8,17.3,31.3,17779.04 +2023/9/27,18,11.7,13.7,5,11.6,23.4,32069.27 +2023/9/28,20.6,11.7,14.9,7.2,14,25.9,33165.43 +2023/9/29,19.8,11,14.3,2,12.6,27.4,36762.51 +2023/9/30,19.5,9.8,14.4,0.6,18.7,35.3,30571.39 +2023/10/1,18.9,11.5,14.3,0,18.7,32.8,17165.99 +2023/10/2,17.8,10.5,13.5,2.3,8.7,18,19254.54 +2023/10/3,17.2,7.5,12.9,6.1,14.5,28.4,13263.24 +2023/10/4,13.4,10.6,12.3,12.8,15.6,28.4,0 +2023/10/5,10.7,8.8,9.8,21.9,17.1,32.4,0 +2023/10/6,15.3,6.5,11,0,10.6,23.4,31346.63 +2023/10/7,16.4,6.5,10.6,0,12.5,28.4,37551.57 +2023/10/8,17.7,5.4,11.2,0,14.1,27.4,33443.02 +2023/10/9,17.8,2.8,9.9,0,13.6,24.8,37651.24 +2023/10/10,16.6,3.8,9.8,0,22,40.3,37394.97 +2023/10/11,10.5,8.7,9.5,9.8,20.2,36,0 +2023/10/12,10.1,7.6,8.7,11,11.8,22.7,0 +2023/10/13,13,4.8,8.4,0,15.8,36,34484.28 +2023/10/14,14,4.1,8.1,0,10,22.3,37002.64 +2023/10/15,16.9,1.3,8.4,0,12,23,36992.3 +2023/10/16,16.6,2.9,9.2,0,16.3,28.8,36230.1 +2023/10/17,12,4.5,8.8,8.4,25.2,45.7,28800 +2023/10/18,8.1,3.8,6.7,2.5,11.3,22.7,0 +2023/10/19,10.8,1.8,6,1,14.1,29.5,36013.8 +2023/10/20,13.9,-1.3,5.8,0,10.5,19.8,36326.45 +2023/10/21,14.4,-0.3,6.6,0,11.8,17.3,36148.29 +2023/10/22,14,0.7,7.1,0,9.8,19.4,35637.87 +2023/10/23,15.5,3.6,9.5,0,9,17.6,35898.27 +2023/10/24,16.6,3.5,9.4,0,9.9,19.1,28289.76 +2023/10/25,13.5,6.4,10.1,0.5,12.5,23.8,21351.04 +2023/10/26,15.6,6.2,10.5,0.6,9.7,19.1,35346.98 +2023/10/27,16.1,2.5,8.5,0,9.4,17.6,35344.63 +2023/10/28,16.1,3.8,9.8,0,9.2,16.6,35299.79 +2023/10/29,16.2,3.6,9.5,0,9.6,19.1,35166.88 +2023/10/30,16.9,3,9.2,0,10.5,20.5,35102.81 +2023/10/31,18.4,4.3,10,0,9.9,19.4,35001.7 +2023/11/1,17.7,2.4,8.9,0,9.7,21.6,34935.2 +2023/11/2,13.1,2.9,8.1,0,16.1,29.2,33389.59 +2023/11/3,13.2,1.8,7.4,0,14.8,28.1,29410.12 +2023/11/4,12.3,2.8,6.9,0.3,15.7,31.7,33719.39 +2023/11/5,3.5,-3.9,0.4,0,16.6,34.6,22533.63 +2023/11/6,14,-4.3,2.8,0,11.1,20.5,34620.05 +2023/11/7,11.1,-2.8,3.2,0,19.2,33.8,34561.12 +2023/11/8,10,-3.6,2.5,0,10.1,18.7,34503.79 +2023/11/9,10.9,-1.7,4,0,9.2,18.7,34433.19 +2023/11/10,10.7,-0.2,3.9,0,13.3,27.7,34355.45 +2023/11/11,5.8,-2,1.8,0,12.5,24.8,24937.18 +2023/11/12,0.4,-5.2,-2.8,0.8,9.2,19.4,6896.05 +2023/11/13,6.6,-6.4,-0.8,0,9.7,17.3,33796.79 +2023/11/14,10,-3.3,2.3,0,11.6,21.6,33906.7 +2023/11/15,1.2,-2,-0.4,3.2,19.1,36.4,3523.04 +2023/11/16,8.5,-6.4,0,0,15,31.3,33693.47 +2023/11/17,9.9,-1.6,3.9,0,8.9,16.6,33588.6 +2023/11/18,10.6,-1.9,3.1,0,10.8,20.5,33485.07 +2023/11/19,12.7,-2.5,3.3,0,12.7,21.6,33383 +2023/11/20,9.8,-3.5,2.1,0,11,19.4,33139.13 +2023/11/21,8.9,-1.9,2.9,0,18.1,36.7,32109.37 +2023/11/22,7.2,-4.8,-0.7,0,11.3,20.9,32424.07 +2023/11/23,8.5,-6.7,-1.5,0,12.1,23,32798.99 +2023/11/24,9.4,-4.3,0.4,0,14.5,27.7,32604.57 +2023/11/25,4.3,-2.7,0.5,0,15.8,26.3,31419.66 +2023/11/26,10,-3.6,2.6,0,13.8,27.7,32365.74 +2023/11/27,6.8,-2,1.2,0,11.8,22.7,32191.25 +2023/11/28,9.3,-4.2,2.5,0,10.5,21.6,29739.22 +2023/11/29,3.1,-4,-0.9,0,18.6,34.2,31956.03 +2023/11/30,2.1,-6.6,-3.1,0,9.3,23,31996.33 +2023/12/1,4.3,-6,-1.3,0,9.4,14.8,31934.47 +2023/12/2,5.7,-3.7,0.6,0,9.5,18,31772.89 +2023/12/3,6,-4.4,0.4,0,9.5,19.1,31715.44 +2023/12/4,8.1,-2.7,1.8,0,12.4,23.8,31760.63 +2023/12/5,6,-3.9,0.6,0,17.6,41.4,27234.81 +2023/12/6,11.2,-5.3,0.9,0,14.5,29.5,31553.36 +2023/12/7,12.8,-3.4,2.2,0,12.4,25.6,31601.77 +2023/12/8,10.3,-3.5,2.9,0,12.5,23,31551.47 +2023/12/9,7.3,-3.7,0.8,0,11.9,19.1,30617.56 +2023/12/10,4.8,-1.7,0.7,0,14.3,28.8,20081.19 +2023/12/11,3.4,-4.8,-1.1,0,13,27.7,29316.88 +2023/12/12,9.1,-5.6,-0.7,0,13.8,24.8,31366.19 +2023/12/13,5.3,-2.5,0,1.1,16.3,28.8,30149.22 +2023/12/14,-3.2,-11.1,-6.5,1.2,17.6,33.5,56.65 +2023/12/15,-9.5,-14.1,-12,0.5,15.1,31.3,27901.26 +2023/12/16,-2.7,-15.3,-9.6,0,11.5,23,30110.15 +2023/12/17,-0.1,-11.4,-6.7,0,10.5,21.2,30142.47 +2023/12/18,0.8,-9.1,-5.1,0,19.9,36.7,28722.18 +2023/12/19,-2.1,-11.4,-7,0,14,26.6,30454.49 +2023/12/20,-2,-9.9,-6.8,0,11.6,21.6,30445.36 +2023/12/21,-1.7,-13.6,-8.4,0,10.8,19.4,30890.64 +2023/12/22,-0.4,-9.4,-5,0,15.6,29.2,30675.27 +2023/12/23,-1.8,-9,-5.8,0,12.1,26.6,30575.35 +2023/12/24,3.6,-10.7,-4.9,0,11.6,19.1,30927.55 +2023/12/25,4.2,-10.2,-3,0,11.3,23.4,31041.92 +2023/12/26,5,-6,-0.8,0,11.2,18.4,29988.08 +2023/12/27,5.9,-5.9,-1.1,0,9.9,14.8,31103.88 +2023/12/28,4.7,-8.2,-1.8,0,10.6,19.4,30665.14 +2023/12/29,5.6,-6.1,-0.4,0,13.3,24.5,31081.96 +2023/12/30,6.3,-4.6,-0.1,0,11.6,24.1,31214.93 +2023/12/31,3.2,-7.1,-2,0,15.6,30.6,31256.49 diff --git a/dataset/Global.csv b/dataset/Global.csv new file mode 100644 index 0000000000000000000000000000000000000000..1eec2c966c2e2181194154fc6bf8c046e5d322ce --- /dev/null +++ b/dataset/Global.csv @@ -0,0 +1,1699 @@ +country,date,temp_mean,wind_max,pressure,precip,humidity,cloud,feels_like,uv_index +0,2025/1/1 12:30,14.1,3.6,1032,0,63,0,14.8,2 +1,2025/1/1 11:30,9.2,4.3,1032,0,81,0,9.1,1.3 +2,2025/1/1 19:30,10,9,1016,0,37,25,8.8,0 +3,2025/1/1 10:45,8,11.9,1029,0,76,0,5.9,0.8 +4,2025/1/1 11:30,6.4,3.6,1031,0,70,0,6.3,0.9 +0,2025/1/2 11:45,15.2,9.7,1028,0,67,50,15.2,1.4 +1,2025/1/2 12:00,12,5.8,1027,0,65,10,11.8,1.5 +2,2025/1/2 18:45,10.1,7.2,1014,0,76,50,9.3,0 +3,2025/1/2 9:45,6.1,8.3,1029,0,100,25,4.4,0.3 +4,2025/1/2 12:00,7.1,4.3,1030,0,68,15,6.7,1.5 +0,2025/1/3 12:45,15.2,8.6,1022,0,59,25,15.2,1.8 +1,2025/1/3 11:45,14.4,23,1017,0.06,77,50,12.7,0.8 +2,2025/1/3 19:00,6.3,13,1013,0.19,87,75,3.7,0 +3,2025/1/3 10:30,9,6.8,1027,0.01,93,25,8.1,0.7 +4,2025/1/3 11:45,5.3,6.1,1027,0,87,0,4,0.6 +0,2025/1/4 12:15,15.2,5.8,1018,0,72,25,15.2,1.2 +1,2025/1/4 11:15,8,7.2,1020,0,81,0,6.9,1.1 +2,2025/1/4 19:15,7.1,5.4,1021,0,39,0,6.3,0 +3,2025/1/4 9:45,9.1,11.9,1023,0.01,100,75,7.2,0.3 +4,2025/1/4 11:15,5.3,3.6,1025,0,100,100,5,0.9 +0,2025/1/5 12:15,14.3,3.6,1021,0,67,25,15,1.8 +1,2025/1/5 11:15,12.1,9,1021,0,77,75,11.3,1.3 +2,2025/1/5 18:45,8.2,3.6,1022,0,71,0,8.3,0 +3,2025/1/5 10:15,15.1,36.4,1009,0.98,94,75,15.1,0.1 +4,2025/1/5 11:15,7.1,16.9,1015,0,93,75,4.1,0.4 +0,2025/1/6 12:30,16.3,4.7,1021,0,59,25,16.3,2 +1,2025/1/6 11:30,15.4,19.4,1015,0.01,77,0,15.4,0.6 +2,2025/1/6 18:45,6.1,8.3,1007,3.05,87,75,4.4,0 +3,2025/1/6 10:30,12.4,24.5,1014,0.01,82,25,10.1,0.7 +4,2025/1/6 10:45,8.2,17.6,1007,0.54,93,75,5.4,0.2 +0,2025/1/7 12:45,16.1,6.5,1021,0,77,25,16.1,4 +1,2025/1/7 11:45,16.1,16.6,1011,0.17,77,50,16.1,3 +2,2025/1/7 19:45,10,3.6,1001,0.06,29,25,10.3,1 +3,2025/1/7 10:45,11.3,24.5,1022,0,94,50,8.7,3 +4,2025/1/7 11:45,5.2,20.2,1022,0,81,0,1.3,2 +0,2025/1/8 12:30,18.1,7.9,1022,0,64,50,18.1,1.6 +1,2025/1/8 11:30,10.1,14.4,1019,0.1,100,25,8.1,0.5 +2,2025/1/8 19:30,7,28.1,1009,0,36,25,2.8,0 +3,2025/1/8 10:30,15.1,37.1,1017,0.03,94,75,15.1,0.4 +4,2025/1/8 11:30,7.2,18.7,1020,0,87,50,4,0.7 +0,2025/1/9 12:30,18.1,7.6,1020,0.02,68,25,18.1,2.1 +1,2025/1/9 11:30,16.3,22.3,1015,0.02,77,50,16.3,0.5 +2,2025/1/9 19:30,8.4,21.2,1005,0,29,25,5.2,0 +3,2025/1/9 10:30,14.1,3.6,1025,0,100,50,14.8,0.8 +4,2025/1/9 11:00,10.2,19.4,1023,0,94,100,7.7,0.7 +0,2025/1/10 13:00,18,9.4,1015,0,60,25,18,1.8 +1,2025/1/10 11:15,15.4,16.6,1014,0,77,25,15.4,1.3 +2,2025/1/10 20:00,6.2,18.7,1017,0,33,0,2.7,0 +3,2025/1/10 11:00,16.2,8.3,1028,0,100,75,16.2,0.7 +4,2025/1/10 12:00,7.3,6.5,1029,0,100,100,6.2,1.2 +0,2025/1/11 12:30,18.3,9.4,1014,0,64,25,18.3,2.1 +1,2025/1/11 10:45,12.2,9,1014,0,94,0,11.4,0.7 +2,2025/1/11 19:30,9.2,9,1022,0,43,25,7.9,0 +3,2025/1/11 10:30,17,6.8,1031,0,94,50,17,0.7 +4,2025/1/11 11:30,13.4,11.9,1027,0,88,0,12.5,1 +0,2025/1/12 13:15,16.4,7.2,1013,0,66,20,16.4,2.1 +1,2025/1/12 11:30,10.3,19.4,1014,0.07,40,0,7.8,0.4 +2,2025/1/12 19:30,8.3,8.3,1015,0,71,75,7,0 +3,2025/1/12 10:30,14.1,10.8,1030,0,88,25,13.4,0.8 +4,2025/1/12 11:30,7.3,6.1,1030,0,70,0,6.3,1 +0,2025/1/13 13:30,8.3,17.3,1020,0.46,84,100,5.6,0.2 +1,2025/1/13 11:45,9.1,19.8,1020,0.04,50,25,6.3,0.8 +2,2025/1/13 19:45,7.3,21.6,1020,0,39,25,3.8,0 +3,2025/1/13 10:00,11.1,10.8,1029,0,62,0,9.8,0.9 +4,2025/1/13 11:00,5.2,3.6,1028,0,52,0,4.9,1 +0,2025/1/14 12:45,8.4,27.4,1023,1.03,76,100,4.7,0.2 +1,2025/1/14 12:00,10.1,10.4,1023,0,40,0,8.7,1.5 +2,2025/1/14 20:00,9.1,3.6,1016,0,62,0,9.3,0 +3,2025/1/14 11:00,8.3,15.5,1030,0,53,0,5.8,1.7 +4,2025/1/14 11:15,5.1,9,1031,0,30,0,3,1.1 +0,2025/1/15 11:45,10.1,6.1,1021,0,62,25,9.6,1.5 +1,2025/1/15 11:30,6.3,8.3,1022,0,56,0,4.6,1.3 +2,2025/1/15 19:30,9.3,39.6,1012,0,37,75,5.1,0 +3,2025/1/15 10:30,7.2,9.4,1030,0,70,0,5.4,0.9 +4,2025/1/15 11:15,2.4,3.6,1029,0,51,0,1.8,1.1 +0,2025/1/16 11:45,11.2,16.6,1030,0,66,50,9.2,0.6 +1,2025/1/16 11:15,6.3,10.8,1025,0,65,50,4.1,1.2 +2,2025/1/16 18:15,6.4,14.8,1016,0,49,25,3.5,0 +3,2025/1/16 10:00,12.3,7.9,1024,0,67,25,11.7,1 +4,2025/1/16 11:15,7.1,7.9,1023,0,45,0,5.6,1.1 +0,2025/1/17 12:30,12.3,18.4,1035,0,58,25,10.4,2.3 +1,2025/1/17 11:30,11.2,14.8,1029,0,62,0,9.4,1.2 +2,2025/1/17 18:45,5.1,24.8,1019,0,38,25,0.7,0 +3,2025/1/17 10:30,8.1,23,1026,0,71,0,4.7,1 +4,2025/1/17 11:30,6.2,23.4,1029,0,61,0,2.2,1 +0,2025/1/18 13:15,13.3,10.4,1029,0,53,4,12.5,2.3 +1,2025/1/18 10:30,11,13.3,1023,0,76,75,9.4,0.4 +2,2025/1/18 19:15,7.4,4,1024,0,49,25,7.2,0 +3,2025/1/18 9:30,7.1,9.7,1027,0,81,0,5.2,0.4 +4,2025/1/18 11:30,4.2,3.6,1027,0,65,0,3.8,1 +0,2025/1/19 12:00,15.2,7.9,1026,0,48,0,15.2,2.5 +1,2025/1/19 10:15,10.1,8.6,1020,0,76,0,9,0.8 +2,2025/1/19 18:15,9.1,6.8,1017,0,62,75,8.2,0 +3,2025/1/19 10:00,6.1,15.8,1020,0.97,93,50,3,0.2 +4,2025/1/19 11:00,2,3.6,1021,0,69,0,1.4,1.2 +0,2025/1/20 12:15,16,11.5,1023,0,48,25,16,2.1 +1,2025/1/20 11:30,10.2,10.1,1021,1.06,94,0,8.9,0.6 +2,2025/1/20 19:30,11,11.9,1010,0,82,25,9.5,0 +3,2025/1/20 10:30,16.1,17.3,1012,0.11,100,75,16.1,0.3 +4,2025/1/20 10:45,5.4,4.7,1018,0.86,93,100,4.7,0.1 +0,2025/1/21 12:30,15.2,12.6,1020,0,63,50,15.2,1.9 +1,2025/1/21 11:30,10.1,7.9,1019,0.04,100,50,9.1,1.3 +2,2025/1/21 19:30,10.1,16.2,1016,0,66,25,7.9,0 +3,2025/1/21 10:30,15.2,16.9,1008,0.4,100,75,15.2,0.9 +4,2025/1/21 11:30,7.3,3.6,1014,1.54,100,100,7.3,0.1 +0,2025/1/22 12:15,16.1,6.8,1018,0,59,25,16.1,2.2 +1,2025/1/22 11:15,11.3,9.4,1019,0.03,87,75,10.3,1 +2,2025/1/22 19:15,10.1,7.2,1021,0,54,0,9.3,0 +3,2025/1/22 10:15,17,32,1002,1.48,88,75,17,0.6 +4,2025/1/22 11:15,10.1,29.2,1010,0.08,87,75,6.8,0.5 +0,2025/1/23 12:30,17,5.4,1021,0,48,25,17,2.5 +1,2025/1/23 11:30,14.1,15.8,1016,0,77,0,12.9,1.5 +2,2025/1/23 19:30,10.2,3.6,1019,0,82,25,10.5,0 +3,2025/1/23 10:30,14.1,11.9,1016,0,88,75,13.3,0.9 +4,2025/1/23 11:30,10.3,10.8,1017,0,100,100,8.9,0.9 +0,2025/1/24 12:30,16.3,5,1019,0,68,25,16.3,1.8 +1,2025/1/24 11:30,15.2,6.1,1019,0,72,0,15.2,1.7 +2,2025/1/24 19:30,11.1,15.1,1020,0.01,71,75,9.3,0 +3,2025/1/24 10:30,13.3,9.7,1021,0,82,75,12.6,1.1 +4,2025/1/24 11:30,10.1,9.4,1021,0,100,100,8.9,0.7 +0,2025/1/25 12:15,17.3,4.3,1020,0,68,0,17.3,2.4 +1,2025/1/25 11:15,13.1,3.6,1024,0,82,0,13.7,1.8 +2,2025/1/25 19:15,8.2,8.3,1019,0,57,0,6.8,0 +3,2025/1/25 10:15,15.4,21.2,1020,0,82,25,15.4,1 +4,2025/1/25 11:30,8.1,20.2,1017,0.58,100,75,5,0.6 +0,2025/1/26 12:15,15.4,3.6,1024,0,63,25,15.4,2.5 +1,2025/1/26 11:15,16.3,25.9,1018,0.01,72,75,16.3,1.5 +2,2025/1/26 19:15,8.4,16.9,1016,0,42,25,5.7,0 +3,2025/1/26 10:15,16.1,27.4,1016,0.05,88,75,16.1,0.2 +4,2025/1/26 11:15,8.3,18.7,1020,0.01,87,75,5.4,0.4 +0,2025/1/27 12:30,16.3,4.7,1022,0,72,25,16.3,2.4 +1,2025/1/27 11:30,16.2,24.8,1020,0,68,25,16.2,1.6 +2,2025/1/27 19:30,9.1,19.8,1012,0,62,50,6.3,0 +3,2025/1/27 10:30,15.3,19.8,1014,0.07,88,50,15.3,0.3 +4,2025/1/27 11:30,12.1,42.1,1010,1.97,94,75,8.7,0.2 +0,2025/1/28 13:00,16.4,10.4,1020,0,72,25,16.4,2.5 +1,2025/1/28 12:00,16.1,20.9,1009,0.47,82,75,16.1,1.6 +2,2025/1/28 20:00,10.2,14.8,1005,0,37,25,8.2,0 +3,2025/1/28 11:00,13.4,25.2,1027,0.02,72,25,11.3,1.7 +4,2025/1/28 12:00,6.3,29.5,1019,0,87,50,1.8,1.5 +0,2025/1/29 12:30,17.2,7.2,1021,0,72,25,17.2,2.7 +1,2025/1/29 11:30,13.1,15.5,1016,0.37,72,25,11.7,1.5 +2,2025/1/29 19:30,8.2,20.2,1011,0,34,25,5.1,0 +3,2025/1/29 10:30,14,40.3,1019,1.13,94,75,11.3,0.2 +4,2025/1/29 11:30,5.4,22.7,1019,0.06,93,75,1.3,0.3 +0,2025/1/30 12:15,13.1,25.9,1020,0.24,82,50,10.9,1.8 +1,2025/1/30 11:15,10.4,9,1020,0,87,0,9.3,1.2 +2,2025/1/30 19:15,9.4,25.9,1014,0,37,25,6.1,0 +3,2025/1/30 10:15,13.3,30.6,1029,0.02,58,50,10.9,0.7 +4,2025/1/30 11:15,7.3,30.2,1019,0,61,25,3,0.7 +0,2025/1/31 12:30,19.1,6.1,1025,0,46,25,19.1,2.7 +1,2025/1/31 11:30,14.1,6.8,1026,0,67,0,14,1.3 +2,2025/1/31 19:30,9.1,13,1021,0,40,0,7.1,0 +3,2025/1/31 10:30,12.1,13.7,1031,0,58,0,10.7,1.1 +4,2025/1/31 11:30,6.2,4.3,1029,0,56,0,5.7,1.3 +0,2025/2/1 12:30,18,3.6,1026,0,52,25,18,2.5 +1,2025/2/1 11:30,12.1,4.3,1024,0,67,0,12.3,1.3 +2,2025/2/1 19:30,9.1,7.9,1020,0,50,75,8,0 +3,2025/2/1 10:30,14.1,6.8,1027,0,82,75,14,1.2 +4,2025/2/1 11:30,5.1,3.6,1024,0,70,0,4.8,1.3 +0,2025/2/2 12:15,16.2,5.8,1023,0,59,25,16.2,2.8 +1,2025/2/2 11:15,11.2,6.5,1016,0,71,0,10.7,1.7 +2,2025/2/2 19:00,6.1,13.7,1014,0,81,75,3.3,0 +3,2025/2/2 10:15,13.2,10.8,1023,0.09,94,75,12.3,0.2 +4,2025/2/2 11:15,6.3,3.6,1020,0,65,0,6.2,1.3 +0,2025/2/3 12:30,17.2,4.7,1019,0.01,68,75,17.2,1.7 +1,2025/2/3 11:30,10,7.2,1018,0,94,50,9.2,1.8 +2,2025/2/3 19:30,7.3,5,1004,0,76,25,6.7,0 +3,2025/2/3 10:30,9.3,10.4,1024,0,66,0,7.7,1.2 +4,2025/2/3 11:30,6,18,1024,0,65,0,2.6,1.3 +0,2025/2/4 12:30,11.2,27.4,1022,1.04,71,50,8.3,0.7 +1,2025/2/4 11:30,10.4,6.8,1024,0,71,25,9.7,1.8 +2,2025/2/4 19:30,6.3,15.1,999,0.15,56,75,3.3,0 +3,2025/2/4 10:30,8.1,8.3,1029,0,93,25,6.7,1.1 +4,2025/2/4 11:30,7.2,3.6,1029,0,61,0,7.1,1.4 +0,2025/2/5 12:30,9.3,23,1027,0.01,57,75,6.2,2.7 +1,2025/2/5 11:30,9.3,6.5,1030,0,66,25,8.5,1.9 +2,2025/2/5 19:30,4.1,39.6,1001,0,30,25,-1.9,0 +3,2025/2/5 10:30,10.2,10.8,1034,0,76,0,8.7,1.3 +4,2025/2/5 11:30,7.1,7.6,1034,0,61,0,5.7,1.5 +0,2025/2/6 12:15,8.3,9,1031,0.13,71,75,6.8,1.2 +1,2025/2/6 11:15,9.1,3.6,1030,0,66,0,9.3,1.9 +2,2025/2/6 19:15,7.4,3.6,1009,0,36,25,7.4,0 +3,2025/2/6 10:15,9.1,9,1030,0,81,0,7.7,1.2 +4,2025/2/6 11:30,7.3,5.8,1030,0,57,0,6.4,1.5 +0,2025/2/7 12:30,9.3,25.9,1034,0.01,50,75,6,2.8 +1,2025/2/7 11:30,11,6.8,1027,0,62,50,10.4,1.9 +2,2025/2/7 19:30,6.2,32.4,1003,0,31,0,1.4,0 +3,2025/2/7 10:15,15.1,20.5,1020,0.13,94,75,15.1,0.7 +4,2025/2/7 11:15,5.1,15.5,1019,0,75,0,1.8,1.2 +0,2025/2/8 12:30,7.3,28.8,1032,0.01,61,75,3.2,2.4 +1,2025/2/8 11:30,11.3,9.4,1026,0,76,75,10.3,1.7 +2,2025/2/8 19:30,6.2,31.7,1010,0,28,25,1.5,0 +3,2025/2/8 10:30,13.2,6.5,1025,0,88,75,13.1,0.7 +4,2025/2/8 11:30,7.4,5,1022,0,70,25,6.8,1.6 +0,2025/2/9 12:30,8.4,26.6,1030,0,61,75,4.8,3 +1,2025/2/9 11:30,15,6.8,1025,0.38,67,25,15.1,0.2 +2,2025/2/9 19:30,6.3,23.8,1016,0,36,25,2.3,0 +3,2025/2/9 10:30,14.3,3.6,1026,0.01,94,50,15,0.8 +4,2025/2/9 11:30,6.3,4.3,1027,0,87,50,5.8,1.5 +0,2025/2/10 12:15,8.4,24.5,1028,0,57,75,4.9,2.6 +1,2025/2/10 11:30,11.2,3.6,1026,0,82,0,11.6,2 +2,2025/2/10 19:30,8.2,3.6,1015,0,29,25,8.3,0 +3,2025/2/10 10:30,12.4,7.6,1019,0.06,94,50,11.9,0.7 +4,2025/2/10 11:30,10.1,5.8,1022,0,76,75,9.7,1.4 +0,2025/2/11 12:15,8.4,20.9,1029,0.01,66,75,5.3,2.8 +1,2025/2/11 11:15,12.2,4.3,1026,0,82,0,12.5,2.2 +2,2025/2/11 19:15,6.3,25.6,1022,0,36,0,2.1,0 +3,2025/2/11 10:15,13.1,28.8,1010,1.71,100,75,10.7,0.2 +4,2025/2/11 11:15,8.4,9.4,1019,0,81,75,6.8,1.7 +0,2025/2/12 12:15,10.3,13.7,1030,0,43,50,8.5,2.9 +1,2025/2/12 11:15,15.2,15.5,1023,0,67,0,15.2,1.1 +2,2025/2/12 19:15,12,24.1,1009,0,58,25,9.6,0 +3,2025/2/12 10:15,14.1,6.8,1022,0,77,25,14,1.5 +4,2025/2/12 11:15,9.3,23,1016,0.01,76,0,6.2,1.7 +0,2025/2/13 12:15,12.3,5,1027,0,44,25,12.4,3 +1,2025/2/13 11:15,10.2,8.3,1020,0.02,94,100,9.2,1.5 +2,2025/2/13 19:15,6.2,32.8,1011,0,45,0,1.4,0 +3,2025/2/13 10:30,12.2,4.3,1023,0,100,50,12.5,1.4 +4,2025/2/13 11:30,9.4,3.6,1022,0,71,0,9.6,1.7 +0,2025/2/14 12:00,14.3,8.6,1020,0,77,50,14,2.6 +1,2025/2/14 11:00,12.3,14.8,1010,0.8,88,50,10.8,2.1 +2,2025/2/14 19:00,11.1,3.6,1014,0,54,75,11.5,0 +3,2025/2/14 10:00,10,7.6,1019,0,100,75,9.1,1.5 +4,2025/2/14 11:00,9,3.6,1021,0,76,0,9.1,1.9 +0,2025/2/15 12:15,16.4,6.8,1016,0,63,25,16.4,3.1 +1,2025/2/15 11:15,11,23.8,1008,0.02,62,50,8.3,1.5 +2,2025/2/15 19:15,12,20.5,1017,0.11,58,75,9.9,0 +3,2025/2/15 10:15,13.3,19.1,1011,0.01,88,50,11.6,1.3 +4,2025/2/15 11:15,9.1,6.1,1016,0,76,0,8.4,1.7 +0,2025/2/16 12:15,16.3,18.4,1012,0.2,63,75,16.3,1.2 +1,2025/2/16 11:15,10.1,5.8,1013,0,66,0,9.7,2.4 +2,2025/2/16 19:15,11.3,13.7,1009,0,82,25,9.7,0 +3,2025/2/16 10:15,13.4,5.4,1016,0.01,88,75,13.5,0.5 +4,2025/2/16 11:15,11,3.6,1016,0,58,0,11.4,1.3 +0,2025/2/17 12:15,15,3.6,1013,0.06,63,25,15.8,3.4 +1,2025/2/17 11:15,8.3,4,1016,0,87,75,8.2,2.1 +2,2025/2/17 19:15,7.2,45,1006,0,45,0,1.9,0 +3,2025/2/17 10:15,8.2,6.5,1017,0,100,75,7.3,1.5 +4,2025/2/17 11:15,8.3,5.8,1018,0,93,75,7.6,1.6 +0,2025/2/18 12:15,15.1,12.6,1018,0.05,59,50,15.1,1.5 +1,2025/2/18 11:15,9.3,3.6,1020,0.05,71,75,9.5,2.5 +2,2025/2/18 19:00,7.3,6.5,1010,0.07,29,75,6.2,0 +3,2025/2/18 10:15,13.4,23.8,1007,0,94,50,11.4,1.2 +4,2025/2/18 11:15,11,9.7,1014,0,66,0,9.9,1.3 +0,2025/2/19 12:15,9.2,18,1023,0.1,76,75,6.6,0.8 +1,2025/2/19 11:15,10.3,4,1025,0.01,76,50,10.4,0.6 +2,2025/2/19 19:15,5.1,34.2,1015,0,38,25,-0.2,0 +3,2025/2/19 10:15,14,10.4,1020,0,100,75,13.4,1.6 +4,2025/2/19 11:15,11.1,7.9,1021,0,76,50,10.3,1.6 +0,2025/2/20 12:00,7.3,23.8,1030,0.01,57,75,3.6,2.4 +1,2025/2/20 11:00,11.2,5.8,1027,0,87,0,10.9,1.7 +2,2025/2/20 19:00,7.4,3.6,1018,0.31,33,75,7.4,0 +3,2025/2/20 10:00,11.1,3.6,1027,0,100,60,11.5,1.7 +4,2025/2/20 11:00,9.1,4.7,1028,0,100,100,8.8,2 +0,2025/2/21 12:00,7.3,28.1,1032,0.01,61,75,3.2,2.5 +1,2025/2/21 11:00,12.1,4,1030,0,77,0,12.5,2.4 +2,2025/2/21 19:00,8,7.2,1020,0,21,75,6.9,0 +3,2025/2/21 10:00,15.1,19.4,1020,0.06,94,75,15.1,1.3 +4,2025/2/21 11:00,10,9.4,1023,0,82,50,8.7,1.4 +0,2025/2/22 12:00,6.3,22,1034,0,52,75,2.5,2.6 +1,2025/2/22 11:00,13.1,7.9,1029,0,67,25,12.7,2.3 +2,2025/2/22 19:00,5.4,29.2,1019,0,30,25,0.6,0 +3,2025/2/22 10:00,14,9.7,1024,0.16,88,25,13.5,1.4 +4,2025/2/22 11:15,10.3,6.1,1022,0,76,25,9.8,1.3 +0,2025/2/23 12:00,9.4,4.3,1033,0,46,25,9.3,3.1 +1,2025/2/23 11:00,12.2,3.6,1031,0,71,0,12.7,2.3 +2,2025/2/23 19:00,8.4,12.2,1018,0.03,21,75,6.3,0 +3,2025/2/23 10:15,13,4.7,1031,0,82,25,13.2,1.8 +4,2025/2/23 11:00,10.2,3.6,1031,0,66,0,10.5,2 +0,2025/2/24 12:00,9.1,4.3,1031,0,66,75,9,2.7 +1,2025/2/24 11:00,11.4,3.6,1031,0,87,25,11.8,1.7 +2,2025/2/24 19:00,7.2,25.6,1018,0,31,25,3.3,0 +3,2025/2/24 10:00,10.4,3.6,1031,0,100,50,10.7,1.7 +4,2025/2/24 11:00,8.3,8.6,1031,0,71,0,6.9,1.4 +0,2025/2/25 12:00,13.2,7.2,1024,0.07,67,75,12.9,1.9 +1,2025/2/25 11:00,13,12.6,1022,0.05,94,75,11.9,0.8 +2,2025/2/25 19:00,10.3,29.2,1021,0,62,25,7,0 +3,2025/2/25 10:00,15.1,12.2,1028,0,88,50,15.1,1.7 +4,2025/2/25 11:00,11.1,15.1,1024,0,82,50,9.3,0.9 +0,2025/2/26 12:00,16.1,9,1022,0.23,59,50,16.1,3 +1,2025/2/26 11:00,14,13,1014,0.04,88,75,13.1,0.7 +2,2025/2/26 19:00,12.1,19.8,1014,0,35,25,10,0 +3,2025/2/26 10:00,12.2,7.6,1028,0,77,0,11.7,1.7 +4,2025/2/26 11:00,7.2,3.6,1028,0,57,0,7.1,2 +0,2025/2/27 11:45,14,5.8,1020,0,77,50,14.1,2.1 +1,2025/2/27 10:45,11.3,7.2,1016,0,82,0,10.7,1.7 +2,2025/2/27 18:45,13.2,18,1020,0,47,0,11.6,0 +3,2025/2/27 9:45,12.1,10.1,1018,0,94,75,11.1,0.6 +4,2025/2/27 10:45,6.4,4,1020,0.03,81,25,6.1,0.6 +0,2025/2/28 12:00,13.3,10.4,1019,0.01,77,75,12.5,0.7 +1,2025/2/28 11:00,11.3,9.4,1020,0.02,82,25,10.3,1.8 +2,2025/2/28 19:00,12.3,8.6,1017,0,77,0,11.6,0 +3,2025/2/28 10:00,10.4,17.3,1013,0.21,100,75,8.2,0.8 +4,2025/2/28 11:00,10.2,13.7,1017,0,66,50,8.3,1.9 +0,2025/3/1 11:45,16.2,4,1024,0,63,50,16.2,3 +1,2025/3/1 10:45,9.1,7.9,1020,0,93,75,8,1.4 +2,2025/3/1 18:45,15.3,21.2,1017,0,77,25,15.3,0 +3,2025/3/1 9:45,11.3,8.3,1014,0,100,25,10.5,0.3 +4,2025/3/1 10:45,8.3,11.5,1016,0.14,87,75,6.3,0.2 +0,2025/3/2 12:00,15.3,9.4,1023,0.08,77,50,15.3,3 +1,2025/3/2 10:45,14.3,12.6,1021,0,72,0,13.5,2.1 +2,2025/3/2 19:00,14.2,4.3,1011,0,77,0,14.7,0 +3,2025/3/2 10:00,9.2,23,1015,0,93,75,6.1,1.2 +4,2025/3/2 11:00,3.2,19.4,1020,0.6,87,100,-1.1,0.3 +0,2025/3/3 12:00,12.2,33.1,1022,0.02,62,75,9.3,2.9 +1,2025/3/3 10:45,11.1,5,1025,0,58,0,11,2.3 +2,2025/3/3 18:45,3.3,13.7,1022,0.05,93,75,-0.1,0 +3,2025/3/3 9:45,10.3,17.6,1013,0.01,94,50,8,0.8 +4,2025/3/3 11:00,7.3,18,1018,2.72,87,100,4.2,0.3 +0,2025/3/4 11:30,11.3,33.1,1023,0,43,50,8.1,3.9 +1,2025/3/4 10:45,10.3,4,1025,0,71,0,10.4,2.9 +2,2025/3/4 18:30,3.4,22,1025,1.69,93,75,-1.2,0 +3,2025/3/4 9:45,12.4,11.5,1013,0.46,94,25,11.3,0.9 +4,2025/3/4 10:45,9.1,13.7,1017,0,87,75,7,0.7 +0,2025/3/5 11:45,13.1,32.8,1025,0,47,25,10.5,4.2 +1,2025/3/5 10:45,11.3,3.6,1027,0,76,0,11.7,2.6 +2,2025/3/5 18:45,9.2,15.8,1010,0.06,93,75,6.8,0 +3,2025/3/5 9:45,12.3,15.1,1013,0.65,100,25,10.7,0.1 +4,2025/3/5 11:00,10.2,16.9,1018,0.03,76,75,7.9,0.9 +0,2025/3/6 11:45,17.3,9.7,1027,0,32,0,17.3,3.8 +1,2025/3/6 10:45,11.3,3.6,1027,0,76,0,11.7,2.6 +2,2025/3/6 18:45,10.1,11.5,1011,0.06,43,75,8.5,0 +3,2025/3/6 9:45,13.2,9,1012,0.01,100,75,12.6,1 +4,2025/3/6 10:45,11.3,10.8,1014,0.42,87,100,10.1,0.3 +0,2025/3/7 11:45,18.2,7.6,1022,0,26,0,18.2,4.2 +1,2025/3/7 10:45,12,6.1,1021,0,71,0,11.7,2.5 +2,2025/3/7 18:45,7.4,26.3,1023,0,33,25,3.5,0 +3,2025/3/7 9:45,14.3,29.9,1006,0.1,88,75,12.2,0.6 +4,2025/3/7 10:45,10.1,16.9,1013,0.26,82,100,7.8,0.8 +0,2025/3/8 11:45,17.3,7.9,1015,0,29,0,17.3,4.5 +1,2025/3/8 10:45,12.3,4.7,1016,0,82,25,12.5,2.6 +2,2025/3/8 18:45,3.1,15.1,1027,2.26,93,75,-0.6,0 +3,2025/3/8 9:45,12,38.5,991,0.74,77,25,8.7,0.7 +4,2025/3/8 10:45,9.1,36,1000,0.33,93,100,5,1 +0,2025/3/9 11:45,17.1,6.5,1015,0,34,0,17.1,4.4 +1,2025/3/9 10:30,14.3,13.7,1013,0,82,0,13.3,2.3 +2,2025/3/9 18:45,11.1,15.5,1025,0,58,25,9.2,0 +3,2025/3/9 9:30,10.1,14.8,998,0.86,94,25,8.1,0.9 +4,2025/3/9 10:45,6.3,20.5,999,1.22,87,75,2.7,0.1 +0,2025/3/10 11:45,18.3,8.6,1018,0,52,0,18.3,4.5 +1,2025/3/10 10:45,16.2,17.3,1009,0.28,77,25,16.2,0.4 +2,2025/3/10 18:45,10.3,16.2,1028,0,62,0,8.1,0 +3,2025/3/10 9:45,13.1,26.3,995,1.24,88,50,10.8,0.9 +4,2025/3/10 10:45,7.2,10.1,1001,0.05,87,75,5.3,0.2 +0,2025/3/11 11:45,18.1,13.3,1018,0,68,50,18.1,4.5 +1,2025/3/11 10:45,16.1,6.8,1008,0.4,82,0,16.1,2.4 +2,2025/3/11 18:45,13.2,18,1022,0.2,72,75,11.6,0 +3,2025/3/11 9:45,13.1,28.1,1002,0.28,88,75,10.7,1.1 +4,2025/3/11 10:45,8.3,24.5,1001,0.57,93,100,4.8,0.1 +0,2025/3/12 11:30,19.4,14.4,1015,0,68,25,19.4,3.3 +1,2025/3/12 10:45,15.3,20.9,1004,0.15,77,0,15.3,0.9 +2,2025/3/12 18:30,14.1,11.5,1015,0.16,94,75,13.3,0 +3,2025/3/12 9:45,13.1,9.7,1008,0.01,82,25,12.4,0.8 +4,2025/3/12 10:45,8.2,15.5,1006,0,93,75,5.6,1.7 +0,2025/3/13 11:45,21.3,21.6,1011,0,56,25,21.3,4 +1,2025/3/13 10:45,15.4,17.3,1003,0.22,72,50,15.4,2.6 +2,2025/3/13 18:45,14.3,4,1014,0.03,82,75,14.9,0 +3,2025/3/13 9:45,11.1,6.1,995,0.13,100,75,10.7,0.7 +4,2025/3/13 10:45,7.3,7.2,997,0,87,75,6,1.2 +0,2025/3/14 11:45,20.3,7.9,1016,0,68,0,20.3,4.2 +1,2025/3/14 10:45,16.3,20.2,1004,0,77,50,16.3,1.4 +2,2025/3/14 18:45,15.1,23.4,1020,0,44,0,15.1,0 +3,2025/3/14 9:45,12,12.2,1002,0.01,71,25,10.7,1.1 +4,2025/3/14 10:45,6.4,25.6,1000,0.01,61,75,2.3,1.1 +0,2025/3/15 11:45,22.2,10.1,1019,0,57,0,24.4,4.8 +1,2025/3/15 10:30,18,5,1008,0.52,83,25,18,1.8 +2,2025/3/15 18:45,9.2,16.2,1024,0.25,71,75,6.8,0 +3,2025/3/15 9:45,12,3.6,1015,0.06,71,25,12.5,1.3 +4,2025/3/15 10:45,6.2,3.6,1013,0,61,0,6,1.7 +0,2025/3/16 11:45,24.1,6.5,1013,0,41,0,25.1,4.1 +1,2025/3/16 10:45,13.2,22.7,1015,0.08,62,75,11.2,2.7 +2,2025/3/16 18:45,8.3,24.1,998,0.05,93,75,4.8,0 +3,2025/3/16 9:45,13.1,7.9,1017,0,77,25,12.7,1.3 +4,2025/3/16 10:45,5.2,13,1014,0.05,93,100,2.3,0.4 +0,2025/3/17 11:45,18.3,19.4,1011,0,42,0,18.3,3.8 +1,2025/3/17 10:45,10.2,4,1019,0,82,0,10.3,2.6 +2,2025/3/17 18:45,10.2,35.6,1005,0,37,25,6.5,0 +3,2025/3/17 9:45,12.1,7.6,1008,0.32,100,50,11.6,1.4 +4,2025/3/17 10:45,4.4,12.6,1015,0.17,100,100,1.4,0.1 +0,2025/3/18 11:45,17.3,6.8,1016,0,42,25,17.3,4.6 +1,2025/3/18 10:45,12.3,12.2,1022,0,50,0,11.1,3.2 +2,2025/3/18 18:45,10.1,22,1012,0.25,71,75,7.3,0 +3,2025/3/18 9:45,14.1,6.8,1011,0.07,88,25,14,1.4 +4,2025/3/18 10:45,8.2,22.3,1012,1.15,93,100,4.9,0.2 +0,2025/3/19 11:30,9.3,36.4,1029,0,46,50,5.3,4.4 +1,2025/3/19 10:30,10.3,5,1031,0,54,0,10.1,3.1 +2,2025/3/19 18:30,9.1,28.4,1012,0,53,25,5.5,0 +3,2025/3/19 9:30,15.2,40.3,1008,0.13,82,75,15.2,1 +4,2025/3/19 10:45,8.4,18.7,1018,0,100,100,5.5,1.6 +0,2025/3/20 11:45,12.2,14.8,1032,0,47,50,10.7,4.5 +1,2025/3/20 10:45,13,4.7,1032,0,62,25,13.2,2.8 +2,2025/3/20 18:45,10.1,4.3,1015,0,71,25,10.1,0 +3,2025/3/20 9:45,14.2,20.2,1008,0.08,72,50,12.7,1.2 +4,2025/3/20 10:45,11.4,29.2,1016,0.02,76,75,8.5,1.1 +0,2025/3/21 11:30,14.4,5.8,1028,0,33,0,14.6,4.2 +1,2025/3/21 10:30,14.4,7.9,1028,0,63,0,14.2,2.9 +2,2025/3/21 18:30,16.1,3.6,1008,0,45,0,16.1,0 +3,2025/3/21 9:30,14.3,32,1008,0.82,94,50,12.1,0.2 +4,2025/3/21 10:30,8.2,36,1010,0.02,87,75,3.8,1.4 +0,2025/3/22 11:30,16.3,10.1,1023,0,55,0,16.3,4.1 +1,2025/3/22 10:30,10.1,10.8,1017,0.02,87,62,8.6,0.5 +2,2025/3/22 18:30,19.3,4.7,1003,0,43,25,19.3,0 +3,2025/3/22 9:30,11.3,38.2,1015,0.23,82,50,7.8,0.7 +4,2025/3/22 10:30,6.4,27,1008,0.09,93,100,2.1,0.2 +0,2025/3/23 11:45,17.2,11.9,1023,0,68,25,17.2,4.1 +1,2025/3/23 10:45,18.1,7.2,1010,0,73,50,18.1,1.6 +2,2025/3/23 18:45,15.1,30.2,1009,0,77,0,15.1,0 +3,2025/3/23 9:45,11.3,28.4,1014,0.04,76,50,8.4,1.3 +4,2025/3/23 10:45,7,7.6,1009,0,61,25,5.6,1.6 +0,2025/3/24 11:45,18,17.3,1025,0,64,25,18,3.9 +1,2025/3/24 10:30,18.1,6.8,1012,0.01,73,25,18.1,2.9 +2,2025/3/24 18:30,17.4,21.6,1006,0,72,25,17.4,0 +3,2025/3/24 9:45,12.2,16.9,1020,0,82,25,10.4,1.6 +4,2025/3/24 10:45,9.1,10.4,1015,0,66,0,7.5,1.8 +0,2025/3/25 11:15,18.3,6.8,1023,0,64,25,18.3,3.8 +1,2025/3/25 10:30,17.3,7.2,1016,0,59,25,17.3,2.7 +2,2025/3/25 18:15,19.1,24.5,1001,0,60,0,19.1,0 +3,2025/3/25 9:15,14.4,9,1023,0,82,25,14,1.8 +4,2025/3/25 10:30,11.1,8.6,1022,0,58,0,10.2,1.7 +0,2025/3/26 11:30,21.1,9.7,1015,0,43,25,21.1,4.7 +1,2025/3/26 10:30,15.3,7.9,1012,0,72,0,15.3,3 +2,2025/3/26 18:30,19.1,12.6,1005,0,46,0,19.1,0 +3,2025/3/26 9:30,13,4.3,1023,0,88,25,13.3,2 +4,2025/3/26 10:30,11.2,3.6,1022,0,58,0,11.6,3 +0,2025/3/27 11:15,22.2,5.4,1005,0,41,25,24.5,3.4 +1,2025/3/27 10:30,12.1,9.7,1005,0.35,94,75,11.2,1 +2,2025/3/27 18:15,20.3,39.2,1004,0,83,25,20.3,0 +3,2025/3/27 9:15,13.4,9.4,1019,0,67,75,12.8,1.5 +4,2025/3/27 10:30,9,8.3,1018,0,62,0,7.8,2.5 +0,2025/3/28 11:45,20.3,15.8,1003,0,46,25,20.3,4.7 +1,2025/3/28 10:45,13,11.9,1004,0.01,77,75,12,2.8 +2,2025/3/28 18:30,17.2,9,998,0,83,75,17.2,0 +3,2025/3/28 9:45,15.3,6.1,1020,0,77,0,15.3,1.7 +4,2025/3/28 10:30,11.4,4.3,1019,0,62,0,11.6,2.4 +0,2025/3/29 11:30,18.1,13.7,1003,0,60,25,18.1,4.5 +1,2025/3/29 10:30,13,7.2,1000,0.01,82,75,12.7,1.2 +2,2025/3/29 18:30,6.4,17.6,1018,0.33,87,75,3.1,0 +3,2025/3/29 9:15,15.3,4.3,1022,0,82,25,15.3,1.9 +4,2025/3/29 10:30,12,4.3,1021,0,54,0,12.2,2.5 +0,2025/3/30 12:15,18.1,13,1005,0.44,56,50,18.1,4.5 +1,2025/3/30 11:30,17.1,12.6,1007,0,59,0,17.1,3.4 +2,2025/3/30 18:30,12.2,11.5,1017,0,47,50,11,0 +3,2025/3/30 10:30,15.3,17.6,1019,0,63,0,15.3,2.1 +4,2025/3/30 11:30,9,8.3,1022,0,43,0,7.8,2.6 +0,2025/3/31 12:15,19.4,4.3,1005,0,60,50,19.4,4.4 +1,2025/3/31 11:15,15.1,13,1007,0.07,63,50,15.1,2.7 +2,2025/3/31 18:15,8.2,15.8,1027,0.04,66,75,5.6,0 +3,2025/3/31 10:15,14.2,13,1015,0,63,0,13.3,2 +4,2025/3/31 11:15,14.3,11.2,1020,0,47,0,13.6,2.6 +0,2025/4/1 12:30,18.1,5,1002,0,52,25,18.1,4.2 +1,2025/4/1 11:30,12.2,19.8,1006,0,62,75,10.2,2.2 +2,2025/4/1 18:30,6.1,35.3,1025,0,93,75,1.1,0 +3,2025/4/1 10:30,17,11.2,1011,0.02,77,50,17,1.4 +4,2025/4/1 11:30,15.1,3.6,1011,0,44,0,15.1,2.3 +0,2025/4/2 12:00,15.3,12.2,1007,0,72,75,15.3,2.8 +1,2025/4/2 11:00,16,3.6,1011,0,59,0,16,2.8 +2,2025/4/2 18:00,11.2,15.1,1014,0.05,94,75,9.4,0 +3,2025/4/2 10:00,15,19.1,999,0.79,88,75,13.8,0.9 +4,2025/4/2 11:00,12.3,13,1004,0,88,100,11,2.3 +0,2025/4/3 12:00,17.1,18,1017,0,59,50,17.1,4.4 +1,2025/4/3 11:00,15.1,6.8,1020,0,72,0,15.1,3.3 +2,2025/4/3 18:00,9.1,17.6,1012,0.08,87,75,6.5,0 +3,2025/4/3 10:00,12.2,19.1,1006,0.23,94,50,10.2,1.5 +4,2025/4/3 11:00,9.2,16.2,1012,0,100,100,6.8,0.4 +0,2025/4/4 12:15,18.2,6.1,1015,0.32,60,25,18.2,4.8 +1,2025/4/4 11:15,17.2,3.6,1019,0,52,0,17.2,3.6 +2,2025/4/4 18:15,15,19.4,1014,0.01,31,50,13.7,0 +3,2025/4/4 10:15,15.4,31.3,999,0.43,88,75,15.4,1.5 +4,2025/4/4 11:15,13.1,25.6,1009,0.32,82,50,10.9,1.9 +0,2025/4/5 12:00,16,10.8,1011,0.04,68,50,16,2.9 +1,2025/4/5 11:00,15.3,5.4,1014,0,77,25,15.3,3.6 +2,2025/4/5 18:00,15,23.4,1018,0.02,55,25,13.5,0 +3,2025/4/5 10:00,14.4,10.8,1015,0.19,88,25,13.8,1.8 +4,2025/4/5 11:00,10.2,10.4,1015,0.01,94,75,8.8,2.3 +0,2025/4/6 12:00,18.1,14,1007,0,56,25,18.1,5.1 +1,2025/4/6 11:00,15.3,6.8,1009,0,72,0,15.3,3.6 +2,2025/4/6 18:00,17.3,21.2,1012,0.01,63,25,17.3,0 +3,2025/4/6 10:00,14.3,21.2,1013,12.09,94,75,12.7,0.2 +4,2025/4/6 11:00,11.2,3.6,1016,0,87,0,11.6,2.2 +0,2025/4/7 12:15,12.2,20.9,1012,0.03,62,75,10.1,4.3 +1,2025/4/7 11:15,14.4,10.1,1018,0,38,0,13.9,3.3 +2,2025/4/7 18:15,18.4,9.4,1012,0,28,25,18.4,0 +3,2025/4/7 10:15,14.2,8.6,1018,0,88,25,13.8,1.9 +4,2025/4/7 11:15,14.3,4,1019,0,67,0,14.9,2.5 +0,2025/4/8 12:15,13.3,23,1020,0,47,50,11.3,4.9 +1,2025/4/8 11:15,13.1,5.8,1024,0.03,54,0,13.1,1.9 +2,2025/4/8 18:15,20,24.5,1007,0,37,0,20,0 +3,2025/4/8 10:15,16.3,10.8,1017,0,82,0,16.3,1.9 +4,2025/4/8 11:15,16,8.6,1022,0,55,0,16,2.7 +0,2025/4/9 12:15,10.3,20.9,1021,0,62,75,7.7,3.5 +1,2025/4/9 11:15,15.1,10.4,1023,0,59,0,15.1,3.5 +2,2025/4/9 18:15,20.2,13.3,1011,0,37,50,20.2,0 +3,2025/4/9 10:15,17.2,12.6,1014,0,68,25,17.2,1.8 +4,2025/4/9 11:00,18.2,8.3,1020,0,45,0,18.2,2.7 +0,2025/4/10 12:15,15.1,15.5,1019,0,51,25,15.1,5.4 +1,2025/4/10 11:15,15.3,6.1,1021,0.01,77,75,15.3,3.8 +2,2025/4/10 18:15,19.4,25.6,1007,0.06,64,50,19.4,0 +3,2025/4/10 10:15,19.1,13.7,1012,0,73,25,19.1,1.5 +4,2025/4/10 11:15,17,14,1018,0,52,0,17,2.3 +0,2025/4/11 12:15,16.1,19.1,1017,0,42,25,16.1,4.8 +1,2025/4/11 11:15,17.2,6.1,1022,0,68,0,17.2,4.1 +2,2025/4/11 18:15,16.1,11.5,1007,1.3,72,75,16.1,0 +3,2025/4/11 10:15,16.4,11.9,1010,0.7,94,25,16.4,0.6 +4,2025/4/11 11:30,12.2,15.5,1017,0.01,71,50,10.6,0.7 +0,2025/4/12 12:15,18.3,9.4,1013,0,45,25,18.3,3.7 +1,2025/4/12 11:15,17.3,4.7,1018,0,63,0,17.3,4.2 +2,2025/4/12 18:15,17,20.5,1014,0,59,75,17,0 +3,2025/4/12 10:15,15,10.4,1010,0.4,100,75,14.6,1.8 +4,2025/4/12 11:15,13.3,4,1013,0.07,82,100,13.8,1.9 +0,2025/4/13 12:00,17.1,5.4,1022,0,39,25,17.1,5.8 +1,2025/4/13 11:00,16.4,15.8,1016,0,82,0,16.4,1.8 +2,2025/4/13 18:00,14.3,22,1008,0.13,94,75,12.7,0 +3,2025/4/13 10:00,16,8.6,1013,0.01,88,50,16,1.9 +4,2025/4/13 11:00,13.2,3.6,1011,0,88,75,13.8,2.1 +0,2025/4/14 12:30,19.3,9,1021,0,60,0,19.3,5.5 +1,2025/4/14 11:30,21.3,8.3,1011,0,56,25,21.3,2.9 +2,2025/4/14 18:30,20.3,30.6,997,0.01,40,25,20.3,0 +3,2025/4/14 10:30,15.4,22.7,1010,0.04,72,75,15.4,2 +4,2025/4/14 11:30,13.3,22.7,1008,0.03,82,75,11.3,2.2 +0,2025/4/15 12:15,18.1,3.6,1023,0,56,25,18.1,4.1 +1,2025/4/15 11:15,18.1,21.2,1009,0.28,83,75,18.1,2.4 +2,2025/4/15 18:15,18.4,36.7,988,0,26,75,18.4,0 +3,2025/4/15 10:15,11.4,28.8,1012,0.32,82,50,8.5,1.9 +4,2025/4/15 11:15,9.2,16.2,1005,0.16,87,50,6.8,1.5 +0,2025/4/16 12:00,21.1,9.7,1023,0,49,25,21.1,6.5 +1,2025/4/16 11:00,17.3,6.5,1010,0,88,0,17.3,3 +2,2025/4/16 18:00,21.1,27.7,1005,0,25,0,21.1,0 +3,2025/4/16 10:00,14.2,20.9,1018,0.15,77,25,12.6,2.5 +4,2025/4/16 11:00,8.3,18.4,1014,0,61,0,5.4,2.6 +0,2025/4/17 11:45,22.1,5.8,1021,0,46,0,24,3.8 +1,2025/4/17 10:45,15.2,20.5,1007,0.51,82,75,15.2,2.4 +2,2025/4/17 17:45,24,31.3,1009,0,36,25,24.7,0.4 +3,2025/4/17 9:45,16.4,9.4,1019,0,88,25,16.4,1 +4,2025/4/17 10:45,10.1,11.5,1017,0,62,0,8.5,1.6 +0,2025/4/18 12:15,23,14.4,1014,0,41,0,24.3,6 +1,2025/4/18 11:15,16.3,19.1,1015,0.29,72,50,16.3,4.5 +2,2025/4/18 18:15,22.2,22,1010,0,61,25,24.6,0 +3,2025/4/18 10:15,14.2,26.3,1013,0.36,100,75,12.3,0.7 +4,2025/4/18 11:15,13,13.3,1015,0.02,77,100,11.8,2.3 +0,2025/4/19 12:00,23.1,5.4,1012,0,31,0,24.1,7.4 +1,2025/4/19 10:45,16,8.6,1016,0,68,25,16,2.7 +2,2025/4/19 18:00,23.2,22.3,1012,0,65,0,25,0 +3,2025/4/19 10:00,14.1,31,1015,0.06,63,25,11.9,2.3 +4,2025/4/19 11:00,9.2,25.2,1008,0.05,62,25,5.9,1.9 +0,2025/4/20 12:00,23.4,10.4,1013,0,41,0,24.6,6.6 +1,2025/4/20 10:45,19.3,8.3,1014,0,37,0,19.3,2.6 +2,2025/4/20 17:45,23.1,31.3,1008,0,57,0,25,0.3 +3,2025/4/20 10:00,15.3,30.2,1016,0.02,72,50,15.3,2.5 +4,2025/4/20 11:00,8.4,9.7,1010,0.01,81,75,6.8,1.9 +0,2025/4/21 12:15,24.4,10.8,1011,0,36,0,25,6.4 +1,2025/4/21 11:15,19,6.5,1011,0,73,0,19,4.1 +2,2025/4/21 18:15,21.3,27,1014,0,49,25,21.3,0 +3,2025/4/21 10:15,15.3,9.4,1019,0.61,94,75,15.3,0.7 +4,2025/4/21 11:00,13,8.6,1018,0,67,0,12.4,3.1 +0,2025/4/22 12:15,20.1,4.3,1014,0,53,25,20.1,2.8 +1,2025/4/22 11:15,22.4,8.3,1014,0.02,61,0,24.6,4.5 +2,2025/4/22 18:15,20,41.4,1011,0,56,25,20,0 +3,2025/4/22 10:15,15.3,18,1023,0,82,75,15.3,2.5 +4,2025/4/22 11:30,12.1,3.6,1020,0.09,82,100,12.6,1.9 +0,2025/4/23 12:00,23.4,9.7,1012,0,33,0,24.3,5.8 +1,2025/4/23 11:00,18.2,7.6,1015,0,83,25,18.2,4 +2,2025/4/23 18:00,18.1,14,1000,0,88,75,18.1,0 +3,2025/4/23 10:00,15,11.2,1023,0,82,0,14.5,2.7 +4,2025/4/23 11:00,14.1,3.6,1024,0,55,0,14.8,3.3 +0,2025/4/24 12:00,20.3,6.8,1009,0.2,46,50,20.3,3.9 +1,2025/4/24 11:00,18.3,12.2,1010,0.03,68,75,18.3,1.2 +2,2025/4/24 17:45,21.3,21.2,1003,0,73,75,21.3,0.5 +3,2025/4/24 10:00,18.2,9.4,1019,0,77,0,18.2,2.8 +4,2025/4/24 11:00,17.1,5,1022,0,63,0,17.1,3.5 +0,2025/4/25 11:45,18.1,6.8,1011,0.63,68,50,18.1,0.7 +1,2025/4/25 11:00,17.1,13,1012,0.16,83,50,17.1,4.5 +2,2025/4/25 17:45,19.1,8.3,1005,0.01,78,75,19.1,0.2 +3,2025/4/25 10:15,16.2,22,1018,0,77,25,16.2,2.8 +4,2025/4/25 11:00,18,5,1017,0,56,0,18,3.4 +0,2025/4/26 12:00,21.3,10.4,1010,0.35,60,25,21.3,6.4 +1,2025/4/26 11:00,16.4,7.9,1012,0.01,72,0,16.4,5.4 +2,2025/4/26 18:00,14,20.9,1013,0.01,82,75,12.4,0 +3,2025/4/26 10:00,16.3,27.4,1022,0,72,25,16.3,2.7 +4,2025/4/26 11:00,16.3,9.4,1019,0,55,0,16.3,3.5 +0,2025/4/27 11:45,18.1,16.6,1016,0.35,68,50,18.1,4.9 +1,2025/4/27 10:45,19.4,3.6,1017,0,73,0,19.4,1.6 +2,2025/4/27 17:45,22.2,21.2,1010,0,35,25,24.1,0.3 +3,2025/4/27 9:45,17.4,11.2,1020,0,63,0,17.4,1.3 +4,2025/4/27 10:45,13.4,10.8,1023,0,51,0,12.6,1.8 +0,2025/4/28 12:30,14,43.6,1021,0,51,25,11.2,4.4 +1,2025/4/28 11:30,20.3,3.6,1021,0.28,73,0,20.3,4.8 +2,2025/4/28 18:30,18.4,29.2,1006,0.59,73,75,18.4,0 +3,2025/4/28 10:30,18.4,11.2,1015,0,64,0,18.4,3.1 +4,2025/4/28 11:30,15.3,12.6,1022,0,59,0,15.3,3.9 +0,2025/4/29 11:45,15.3,35.6,1018,0,44,50,15.3,3.6 +1,2025/4/29 10:45,18.1,7.2,1022,0,88,0,18.1,3.4 +2,2025/4/29 17:45,22.2,3.6,1002,0,35,0,23.6,0.5 +3,2025/4/29 9:45,16.1,23,1009,0,68,75,16.1,1.2 +4,2025/4/29 10:45,14,18.7,1018,0,63,0,12.5,1.8 +0,2025/4/30 11:45,16.3,35.6,1016,0,39,25,16.3,3 +1,2025/4/30 10:45,19.2,3.6,1020,0,73,0,19.2,3.3 +2,2025/4/30 17:45,20.2,24.1,1016,0,49,25,20.2,0.5 +3,2025/4/30 9:45,14,14.8,1011,0.05,94,75,12.9,1 +4,2025/4/30 10:45,13.1,16.6,1016,0,72,75,11.6,1.9 +0,2025/5/1 11:45,18.2,37.8,1011,0,32,25,18.2,3.5 +1,2025/5/1 10:45,20.3,10.1,1019,0,73,0,20.3,3.3 +2,2025/5/1 18:00,20.3,31.3,1019,0,56,25,20.3,0.1 +3,2025/5/1 9:45,14.2,19.1,1013,0,82,25,12.8,1.2 +4,2025/5/1 11:00,14.2,13.3,1016,0.01,88,100,13.3,3 +0,2025/5/2 12:00,22.4,28.8,1016,0,38,25,24.2,4.9 +1,2025/5/2 11:00,22.1,4.7,1020,0,61,0,24.1,5.4 +2,2025/5/2 18:00,16,7.9,1000,14.57,94,75,16,0 +3,2025/5/2 10:00,15.1,23.8,1005,0.73,94,75,15.1,2.3 +4,2025/5/2 11:00,13.2,8.3,1015,1.45,82,25,12.7,0.3 +0,2025/5/3 11:45,24.1,18,1018,0,31,0,24.4,4.9 +1,2025/5/3 11:00,22.4,8.6,1020,0,65,0,24.1,5.1 +2,2025/5/3 18:00,21.3,24.5,1005,0,53,25,21.3,0.1 +3,2025/5/3 10:00,15.2,30.2,1011,0.52,88,75,15.2,2.5 +4,2025/5/3 11:00,15.2,11.9,1016,0.01,72,75,15.2,3.4 +0,2025/5/4 11:45,25.1,10.1,1012,0,36,50,25.4,5.2 +1,2025/5/4 10:45,20.1,20.5,1013,0,64,0,20.1,3.2 +2,2025/5/4 17:45,21.2,27.7,1002,0.02,56,25,21.2,0.5 +3,2025/5/4 9:45,15.3,20.5,1013,0.26,94,50,15.3,1 +4,2025/5/4 10:45,12.4,22,1013,0.16,88,100,10.3,0.7 +0,2025/5/5 12:00,22.2,12.6,1011,0,41,25,23,6.2 +1,2025/5/5 11:00,19.3,21.6,1007,0.54,88,50,19.3,4.1 +2,2025/5/5 18:00,20.2,23.4,1012,0,46,25,20.2,0.1 +3,2025/5/5 10:00,14,14,1016,0.01,100,75,12.9,2.7 +4,2025/5/5 11:00,13.1,6.8,1013,0.03,82,75,12.9,2.1 +0,2025/5/6 12:00,25.3,13,1014,0,39,25,25.1,7 +1,2025/5/6 11:00,20,11.2,1009,0.28,73,75,20,3.9 +2,2025/5/6 18:00,14.1,25.9,1003,0.49,94,75,12.2,0 +3,2025/5/6 10:00,15.4,13.7,1015,0,67,25,15.4,2.9 +4,2025/5/6 11:00,12.2,9.4,1015,0,54,50,11.4,3.5 +0,2025/5/7 11:45,26.2,13.3,1012,0,34,0,25.8,4.8 +1,2025/5/7 10:45,19,15.5,1013,0.5,73,75,19,3.1 +2,2025/5/7 17:45,20.1,22.3,1009,0,35,75,20.1,0.1 +3,2025/5/7 9:45,15.2,5.8,1012,0,77,75,15.2,1.1 +4,2025/5/7 10:45,12.2,10.1,1015,0,54,50,11.3,1.7 +0,2025/5/8 11:45,28,19.8,1010,0,25,0,26.3,5.5 +1,2025/5/8 10:45,17.1,10.4,1011,0.02,72,62,17.1,3.6 +2,2025/5/8 17:45,21.4,19.8,1021,0,38,50,21.4,0.6 +3,2025/5/8 9:45,15.2,10.8,1012,0.01,77,25,15.2,1.3 +4,2025/5/8 10:45,13.3,5.8,1011,0.17,82,75,13.3,1.2 +0,2025/5/9 12:15,28.1,12.2,1011,0,33,25,28,7 +1,2025/5/9 11:15,19.4,4.3,1013,0,68,0,19.4,5.2 +2,2025/5/9 18:15,20.3,23.4,1020,0.73,68,75,20.3,0 +3,2025/5/9 10:15,16.6,8.6,1012,0,53,40,16.6,2.6 +4,2025/5/9 11:15,13.1,16.6,1012,0.02,77,75,11.6,3.6 +0,2025/5/10 12:00,25.1,5.8,1012,0,44,25,25.8,6.8 +1,2025/5/10 11:00,19.2,4,1017,0,68,0,19.2,5.4 +2,2025/5/10 18:00,19.1,33.1,997,0,88,75,19.1,0.1 +3,2025/5/10 10:00,15,13.7,1012,0.02,82,50,14.2,2.7 +4,2025/5/10 11:00,14.4,16.9,1010,0.54,88,75,13.2,2.8 +0,2025/5/11 11:45,22.1,4,1015,0,46,25,24.3,5.3 +1,2025/5/11 10:45,18.4,5,1015,0,64,0,18.4,3 +2,2025/5/11 17:45,23.3,15.8,1003,0,47,75,24.9,0.5 +3,2025/5/11 9:45,16,10.4,1017,0,72,25,16,1.4 +4,2025/5/11 10:45,12.3,7.9,1014,0,58,0,11.7,1.9 +0,2025/5/12 12:00,22.2,16.9,1009,0,57,25,24.5,6.6 +1,2025/5/12 11:00,20.1,6.5,1011,0,68,0,20.1,5.6 +2,2025/5/12 18:00,18.2,16.6,1008,0.48,77,75,18.2,0 +3,2025/5/12 10:15,16.1,11.5,1018,0.01,72,25,16.1,2.9 +4,2025/5/12 11:15,13.2,10.4,1016,0,67,0,12.4,3.7 +0,2025/5/13 12:15,22.3,17.6,1011,0.01,53,50,24.3,6.9 +1,2025/5/13 11:15,22.2,6.8,1013,0.02,61,25,24.4,5.5 +2,2025/5/13 18:15,23.3,19.1,1017,0,50,25,25,0.1 +3,2025/5/13 10:15,17.1,8.3,1015,0.14,77,25,17.1,2.7 +4,2025/5/13 11:15,15.1,5,1015,0,63,25,15.1,3.7 +0,2025/5/14 12:15,19.1,6.1,1016,0.03,56,75,19.1,5.9 +1,2025/5/14 11:15,21.2,3.6,1015,0.3,64,25,21.2,5.5 +2,2025/5/14 18:15,24,15.1,1019,0,54,25,25.2,0.1 +3,2025/5/14 10:15,16,14.8,1018,0,68,50,16,3 +4,2025/5/14 11:15,16.2,6.5,1016,0,68,0,16.2,2.3 +0,2025/5/15 12:00,21.3,17.6,1015,0,49,25,21.3,7.6 +1,2025/5/15 11:00,20.1,3.6,1010,0,73,0,20.1,5.2 +2,2025/5/15 18:00,22.3,26.3,1019,0,61,25,24.6,0.1 +3,2025/5/15 10:00,16,23,1020,0,68,25,16,3.2 +4,2025/5/15 11:00,15.3,7.9,1018,0.17,63,25,15.3,3.6 +0,2025/5/16 12:00,21.3,20.9,1006,0,53,25,21.3,6.2 +1,2025/5/16 11:00,20.1,3.6,1005,0.06,43,0,20.1,5.4 +2,2025/5/16 18:00,22.2,23,1018,0,57,25,24.6,0.1 +3,2025/5/16 10:00,19.4,3.6,1018,0,73,25,19.4,3.1 +4,2025/5/16 11:00,16.2,3.6,1019,0,63,0,16.2,3.8 +0,2025/5/17 11:45,25.4,16.9,1010,0,32,25,25.8,6.1 +1,2025/5/17 10:45,18,3.6,1014,0,42,0,18,3.6 +2,2025/5/17 17:45,21.3,38.9,1005,0.07,94,75,21.3,0.1 +3,2025/5/17 9:45,18.2,5.8,1014,0,68,0,18.2,1.4 +4,2025/5/17 10:45,17.3,6.5,1017,0,52,0,17.3,2.3 +0,2025/5/18 11:45,24.2,12.6,1018,0,29,25,24.6,5.7 +1,2025/5/18 10:45,20.3,16.6,1018,0.02,60,0,20.3,3.8 +2,2025/5/18 17:45,25.1,20.5,1003,0,69,50,26.5,0.4 +3,2025/5/18 9:45,17.3,11.2,1014,0,72,50,17.3,1.3 +4,2025/5/18 10:45,19.1,10.4,1016,0,56,0,19.1,2.1 +0,2025/5/19 12:00,24.1,15.5,1020,0,36,0,24.2,8.2 +1,2025/5/19 11:00,20.3,10.8,1020,0,68,0,20.3,5.9 +2,2025/5/19 18:00,19.1,12.2,1011,0.01,68,75,19.1,0.1 +3,2025/5/19 10:00,18.4,14.4,1019,0.04,68,25,18.4,2.9 +4,2025/5/19 11:00,16.3,28.4,1017,0,59,0,16.3,3.6 +0,2025/5/20 12:00,26.2,5,1018,0,26,0,25.5,8.1 +1,2025/5/20 11:00,20.4,9.7,1017,0,68,50,20.4,4.1 +2,2025/5/20 18:00,26.4,16.2,1009,0,55,17,27.3,0.2 +3,2025/5/20 10:00,18.2,16.9,1024,0,73,25,18.2,3 +4,2025/5/20 11:00,18.4,3.6,1023,0,52,0,18.4,3.9 +0,2025/5/21 11:45,26.3,13,1017,0,34,0,26,5.8 +1,2025/5/21 10:45,19.4,9.4,1012,0.6,83,50,19.4,0.9 +2,2025/5/21 17:45,27,20.5,1006,0,66,25,28.8,0.5 +3,2025/5/21 9:45,19.4,15.8,1021,0,78,25,19.4,1.6 +4,2025/5/21 10:45,19.3,4.3,1022,0,40,0,19.3,2.2 +0,2025/5/22 11:45,26,14,1013,0,39,25,25.6,5.5 +1,2025/5/22 10:45,21.1,16.6,1012,0.06,73,75,21.1,2.5 +2,2025/5/22 17:45,23.1,20.5,1001,0,71,18,25,0.6 +3,2025/5/22 9:45,19.1,18.4,1019,0,73,25,19.1,1.7 +4,2025/5/22 10:45,17.3,18,1019,0,55,0,17.3,2.2 +0,2025/5/23 12:00,29.1,14.8,1011,0,29,25,27.5,7.5 +1,2025/5/23 11:00,18,11.9,1009,0.05,83,75,18,5 +2,2025/5/23 18:00,21.2,17.3,1013,0,40,75,21.2,0.1 +3,2025/5/23 10:00,19.2,18,1017,0,68,25,19.2,3.5 +4,2025/5/23 11:00,15.1,23,1018,0,41,0,15.1,3.9 +0,2025/5/24 11:45,28,26.6,1008,0,33,0,27,5.4 +1,2025/5/24 10:45,19.3,8.6,1012,0.06,64,0,19.3,3.7 +2,2025/5/24 17:45,19,17.3,1013,0.17,68,75,19,0.2 +3,2025/5/24 9:45,19.1,7.2,1020,0,68,0,19.1,1.7 +4,2025/5/24 10:45,16.1,3.6,1022,0,39,0,16.1,2.4 +0,2025/5/25 11:30,27.1,11.5,1004,0.55,45,25,27.4,4.4 +1,2025/5/25 10:30,20.1,7.9,1016,0,40,0,20.1,4 +2,2025/5/25 17:30,20.3,13.7,1003,0.12,78,75,20.3,0.6 +3,2025/5/25 9:30,18,13,1022,0,70,0,18,1.8 +4,2025/5/25 10:30,20.1,3.6,1022,0,43,0,20.1,2.4 +0,2025/5/26 12:00,21.3,17.3,1012,0,31,0,21.3,7.5 +1,2025/5/26 11:00,22.1,13,1017,0,46,0,24.4,5.8 +2,2025/5/26 18:00,21.1,13.7,1018,0,60,75,21.1,0.1 +3,2025/5/26 10:00,17.2,18.7,1022,0,72,25,17.2,3.4 +4,2025/5/26 11:00,23.3,3.6,1022,0,44,0,24,4.3 +0,2025/5/27 12:00,24.4,8.6,1014,0,41,0,24.5,7.9 +1,2025/5/27 11:00,22.1,10.8,1018,0,61,25,24.3,5.7 +2,2025/5/27 18:00,20.1,13.3,1021,0,64,75,20.1,0 +3,2025/5/27 10:00,18,10.8,1021,0,77,25,18,3.3 +4,2025/5/27 11:00,22,7.6,1023,0,53,0,23.6,4.4 +0,2025/5/28 11:45,28.2,15.1,1013,0,25,25,27.2,5.7 +1,2025/5/28 10:45,21,5.8,1019,0,64,0,21,4 +2,2025/5/28 17:45,23,20.9,1017,0,50,25,24.6,0.6 +3,2025/5/28 9:45,20.2,7.2,1023,0,68,0,20.2,1.8 +4,2025/5/28 10:45,24.2,8.6,1026,0,39,0,24.4,2.5 +0,2025/5/29 11:45,26.1,15.5,1011,0,30,25,25.6,5.7 +1,2025/5/29 10:45,23.3,10.8,1015,0,69,0,24.9,4 +2,2025/5/29 17:45,21.3,15.5,1015,0,64,75,21.3,0.3 +3,2025/5/29 9:45,24.3,8.6,1019,0,61,0,25.1,1.6 +4,2025/5/29 10:45,26.1,7.6,1025,0,42,0,25.6,2.5 +0,2025/5/30 11:45,22.2,28.1,1011,0,50,50,24.3,5.5 +1,2025/5/30 10:45,23.2,5,1021,0,47,0,24,4.4 +2,2025/5/30 17:45,15.2,30.6,1009,0.04,94,75,15.2,0.1 +3,2025/5/30 9:45,24.2,8.6,1019,0,61,0,25.4,1.6 +4,2025/5/30 11:00,26.3,6.5,1023,0,39,0,25.2,4.4 +0,2025/5/31 11:45,22.2,31.7,1016,0.03,61,75,24.6,5.3 +1,2025/5/31 10:45,25.2,3.6,1020,0,41,0,25.1,4.5 +2,2025/5/31 17:45,16.1,23.8,997,0.11,88,75,16.1,0.1 +3,2025/5/31 9:45,23.1,9,1018,0,57,0,24.7,1.7 +4,2025/5/31 10:45,26.3,4.7,1023,0,42,0,25.7,2.3 +0,2025/6/1 11:45,25.1,21.2,1019,0,36,25,25.5,5.7 +1,2025/6/1 10:45,25,9.7,1019,0,57,0,25.6,4.5 +2,2025/6/1 17:45,21.1,4.7,1003,0,73,75,21.1,0.5 +3,2025/6/1 9:45,22.3,12.6,1017,0,57,0,24.7,1.7 +4,2025/6/1 10:45,25.2,6.8,1021,0,44,0,25.3,2.2 +0,2025/6/2 12:00,27.3,7.2,1020,0,34,0,26.7,7.8 +1,2025/6/2 11:00,26,13.7,1021,0,48,0,25.9,6.7 +2,2025/6/2 18:00,23.1,22,1005,0,69,50,25,0.1 +3,2025/6/2 10:00,17.2,27,1016,0,77,25,17.2,3.1 +4,2025/6/2 11:00,22.4,5,1017,0,50,0,23.8,3.4 +0,2025/6/3 12:00,27.2,10.8,1019,0,39,0,26.5,8.5 +1,2025/6/3 11:00,25.2,14.8,1020,0,51,0,25.3,6.5 +2,2025/6/3 18:00,18.1,16.9,997,0.68,100,75,18.1,0 +3,2025/6/3 10:00,17.1,32,1018,0,68,50,17.1,3.1 +4,2025/6/3 11:00,20.3,15.8,1015,0,53,75,20.3,3.2 +1,2025/6/4 11:00,25,11.9,1019,0,51,0,24.9,5.9 +2,2025/6/4 18:00,27.1,12.2,998,1.01,62,50,28.9,0.1 +3,2025/6/4 10:00,18.3,11.2,1019,0.01,88,75,18.3,3.3 +4,2025/6/4 11:00,19.2,12.6,1017,0,56,0,19.2,4.1 +0,2025/6/5 11:45,30.1,10.1,1016,0,40,0,29.6,6.7 +1,2025/6/5 10:45,25.3,8.3,1018,0.2,51,0,25.3,4 +2,2025/6/5 17:45,26.1,24.5,1008,0,48,25,26.2,0.8 +3,2025/6/5 9:45,18.4,14,1020,0,73,25,18.4,1.8 +4,2025/6/5 10:45,21.3,3.6,1019,0,46,0,21.3,2.5 +0,2025/6/6 11:45,32.3,17.6,1015,0,32,0,32.3,6.5 +1,2025/6/6 10:45,25.4,10.4,1019,0,54,0,25.6,4.4 +2,2025/6/6 18:00,25.1,36.7,1010,0,57,50,26,0.2 +3,2025/6/6 9:45,19.2,20.2,1020,0,68,25,19.2,1.8 +4,2025/6/6 10:45,23,5.8,1019,0,47,0,24.1,2.5 +0,2025/6/7 11:45,33.2,12.6,1015,0,30,0,33.9,6.4 +1,2025/6/7 10:45,28.2,14.4,1018,0,45,0,27.5,4.4 +2,2025/6/7 17:45,24.2,28.1,1008,0,69,75,25.6,0.9 +3,2025/6/7 9:45,20.2,17.6,1020,0,64,0,20.2,1.7 +4,2025/6/7 10:45,23.3,3.6,1019,0,50,0,24.4,2.4 +0,2025/6/8 11:45,30.1,7.6,1015,0,38,0,29.7,6.8 +1,2025/6/8 10:45,27.2,11.9,1015,0,42,0,27.1,4.5 +2,2025/6/8 17:45,25.2,23.8,1009,0,61,75,26.5,0.3 +3,2025/6/8 9:45,22.3,11.5,1018,0,57,0,24.7,1.8 +4,2025/6/8 11:00,24.3,8.6,1021,0,39,0,24.1,4.7 +0,2025/6/9 12:00,32,7.2,1012,0,36,0,31.2,8.5 +1,2025/6/9 11:00,26.3,14.4,1017,0,65,25,26,6.6 +2,2025/6/9 18:00,21.4,16.2,1012,0.17,83,75,21.4,0.1 +3,2025/6/9 10:00,22.2,12.2,1014,0,69,25,24.3,3.6 +4,2025/6/9 11:00,25.3,5,1021,0,51,0,25.1,4.5 +0,2025/6/10 12:00,31.1,31.3,1015,0,29,0,30.2,8.5 +1,2025/6/10 10:45,25.4,7.2,1018,0,69,0,25.4,4.5 +2,2025/6/10 18:00,21.1,7.2,1008,0.16,94,75,21.1,0 +3,2025/6/10 10:00,19.1,14.8,1017,0.04,78,75,19.1,3.5 +4,2025/6/10 11:00,27.3,3.6,1022,0,45,0,26.7,4.2 +0,2025/6/11 12:00,31.2,22,1012,0,31,0,30.7,8.7 +1,2025/6/11 11:00,29.1,5.4,1015,0,43,0,27.9,6.5 +2,2025/6/11 17:45,21.2,14.8,1009,0.01,94,75,21.2,0.1 +3,2025/6/11 10:00,19.2,18.4,1016,0.01,78,75,19.2,3 +4,2025/6/11 11:00,24.3,15.1,1017,0.01,54,0,25.1,3 +0,2025/6/12 11:45,31.3,23,1014,0,29,0,30.6,6.5 +1,2025/6/12 10:45,30.3,3.6,1016,0,38,0,29.4,4.7 +2,2025/6/12 17:45,27.2,17.6,1014,0,48,50,28.5,0.5 +3,2025/6/12 9:45,20.1,11.5,1016,0,73,50,20.1,1.8 +4,2025/6/12 10:45,20.2,15.5,1017,0,68,0,20.2,2.5 +0,2025/6/13 12:00,32.3,19.8,1015,0,32,25,32.1,8.2 +1,2025/6/13 11:00,29,4,1018,0,48,0,27.5,6.8 +2,2025/6/13 18:00,24.4,20.2,1017,0.01,65,75,25.8,0.1 +3,2025/6/13 10:00,20.3,11.2,1018,0,73,50,20.3,3.5 +4,2025/6/13 11:00,24.3,5,1018,0,41,0,24.1,4.7 +0,2025/6/14 12:00,30.3,23,1016,0,31,0,29.7,8.2 +1,2025/6/14 11:00,31.4,6.5,1019,0,43,0,30.4,6.7 +2,2025/6/14 18:00,22.1,29.2,1011,0.12,83,75,24.6,0 +3,2025/6/14 10:00,19.3,23,1021,0,64,25,19.3,3.7 +4,2025/6/14 11:00,25.3,3.6,1020,0,39,0,25,4.7 +0,2025/6/15 11:45,30.2,15.8,1017,0,29,0,30,6.5 +1,2025/6/15 10:45,30.1,6.8,1018,0,52,0,30,4.3 +2,2025/6/15 17:30,30,11.5,997,0.46,75,50,35.3,1 +3,2025/6/15 9:45,20.2,16.9,1020,0,68,25,20.2,1.9 +4,2025/6/15 10:45,25.2,9.4,1021,0,51,0,25.6,2.6 +0,2025/6/16 12:00,30.2,12.2,1015,0,29,0,29.5,8.3 +1,2025/6/16 11:00,31.3,11.9,1017,0,36,0,30,6.8 +2,2025/6/16 18:00,29.4,11.2,1003,0,70,25,32.9,0.2 +3,2025/6/16 10:00,22.2,5.4,1018,0,65,0,24.4,3.9 +4,2025/6/16 11:00,26.1,9.4,1023,0,45,0,25.6,4.8 +0,2025/6/17 12:00,31,26.3,1015,0,26,0,29,8.6 +1,2025/6/17 11:00,28.4,3.6,1015,0,55,25,28.3,6.2 +2,2025/6/17 18:00,33.4,25.9,1006,0,56,25,39.2,0.2 +3,2025/6/17 10:00,28.3,9.7,1018,0,42,0,29.4,3.8 +4,2025/6/17 11:00,28.2,4.7,1023,0,40,0,27.1,4.8 +0,2025/6/18 12:15,32.3,28.8,1016,0,26,0,31.1,8.1 +1,2025/6/18 11:15,28,14.4,1016,0,48,0,27.6,6.2 +2,2025/6/18 18:00,33,20.2,1011,0,47,25,36.1,0.2 +3,2025/6/18 10:00,21.2,6.5,1020,0,78,25,21.2,3.4 +4,2025/6/18 11:15,28.1,6.8,1023,0,40,0,26.8,4.7 +0,2025/6/19 12:00,33.1,26.6,1015,0,28,0,33.1,8.4 +1,2025/6/19 11:00,30.2,4.7,1017,0,38,0,29,6.2 +2,2025/6/19 18:00,30.3,18,1013,0,66,25,33,0.2 +3,2025/6/19 10:15,21,7.2,1018,0,83,25,21,3.5 +4,2025/6/19 11:15,29.1,4,1023,0,35,0,27.5,4.1 +0,2025/6/20 12:00,33.3,13,1013,0,36,25,32.8,8.5 +1,2025/6/20 11:00,30.1,3.6,1016,0,43,0,29.3,6.7 +2,2025/6/20 17:45,29,21.6,1013,0,62,25,30.5,0.9 +3,2025/6/20 10:00,21.2,6.1,1018,0,73,0,21.2,3.3 +4,2025/6/20 10:45,28.3,6.8,1023,0,37,0,27.7,2.6 +0,2025/6/21 12:00,30.4,24.8,1015,0,43,25,30.7,8.1 +1,2025/6/21 11:00,32.3,6.5,1018,0,36,0,31.8,6.7 +2,2025/6/21 18:00,28.1,31.7,1009,0,62,25,30.4,0.2 +3,2025/6/21 9:45,21.2,12.6,1020,0,64,25,21.2,1.8 +4,2025/6/21 11:00,29.3,4,1021,0,33,0,27.5,4.8 +0,2025/6/22 11:30,29.2,28.1,1019,0,27,25,28.3,6.4 +1,2025/6/22 10:45,28.3,3.6,1020,0,48,0,28.1,4.5 +2,2025/6/22 17:30,32.2,37.8,1005,0,56,25,35.2,1 +3,2025/6/22 9:30,20,12.2,1019,0,68,25,20,2 +4,2025/6/22 10:30,28.2,11.2,1022,0,37,0,27.5,2.6 +0,2025/6/23 11:45,30.3,20.5,1016,0,25,0,28.8,6.3 +1,2025/6/23 10:45,28.3,4,1018,0,51,0,27.9,4.8 +2,2025/6/23 18:00,29.1,17.6,1009,0.26,66,75,33.2,0.2 +3,2025/6/23 10:00,21.3,6.1,1016,0,73,25,21.3,3.2 +4,2025/6/23 11:00,29.2,5,1021,0,33,0,27.7,4.7 +0,2025/6/24 11:45,33.2,10.1,1013,0,20,0,31.8,6.6 +1,2025/6/24 11:00,29.3,11.9,1017,0,45,0,28.6,7.1 +2,2025/6/24 17:45,29.3,12.2,1013,0,70,75,32.3,0.4 +3,2025/6/24 10:00,20,9,1015,0,73,50,20,2.8 +4,2025/6/24 11:00,28.4,14.4,1019,0,37,0,27.1,3.9 +0,2025/6/25 12:00,35.2,20.9,1012,0,18,0,33.4,9 +1,2025/6/25 11:00,29.2,10.8,1017,0,43,0,28.7,7.2 +2,2025/6/25 17:45,28.3,19.1,1012,0.01,84,75,30.4,0.9 +3,2025/6/25 10:00,21.3,11.2,1018,0.03,73,25,21.3,3.6 +4,2025/6/25 11:00,22.1,18.4,1018,0,61,0,23.8,4.5 +0,2025/6/26 12:00,37,27.4,1011,0,21,0,36,9.3 +1,2025/6/26 11:00,31.1,9.7,1016,0,46,0,29.9,7.2 +2,2025/6/26 18:00,30.1,28.8,1005,1.02,70,75,34.6,0.1 +3,2025/6/26 10:00,21.3,14,1021,0,73,25,21.3,3.7 +4,2025/6/26 11:00,24.1,3.6,1023,0,39,0,24.3,4.7 +0,2025/6/27 11:45,37.3,28.4,1012,0,21,0,36.7,7.1 +1,2025/6/27 11:00,30.2,3.6,1017,0,43,0,28.7,6.5 +2,2025/6/27 17:45,31.1,14.4,1003,0,59,75,33.6,0.3 +3,2025/6/27 9:45,23.2,10.8,1022,0,69,0,25.1,2 +4,2025/6/27 10:45,27.2,5.8,1026,0,42,0,26.3,2.6 +0,2025/6/28 11:45,34,27.4,1011,0,32,25,34.8,6.5 +1,2025/6/28 10:30,32.2,3.6,1018,0,34,0,31.1,4.9 +2,2025/6/28 17:45,31,23.8,1005,0,52,25,31.6,0.9 +3,2025/6/28 9:30,23.1,9.4,1021,0,69,0,24.8,1.8 +4,2025/6/28 10:30,28.2,5.4,1026,0,40,0,27,2.9 +0,2025/6/29 11:30,31,46.8,1012,0,38,50,32,6.8 +1,2025/6/29 10:30,31.1,13.7,1018,0,29,0,29.7,5.2 +2,2025/6/29 17:15,29,27,1008,0,58,25,30.5,0.8 +3,2025/6/29 9:30,27,3.6,1019,0,62,0,27.2,1.8 +4,2025/6/29 10:30,29.3,9.4,1024,0,37,0,27.9,2.7 +0,2025/6/30 12:00,31.2,32.4,1014,0,33,25,30.7,9.3 +1,2025/6/30 11:00,32.2,10.1,1016,0,38,0,31.1,7.6 +2,2025/6/30 17:45,31.3,27.7,1011,0,66,25,36.3,0.8 +3,2025/6/30 10:00,32.3,7.9,1016,0,30,0,32.1,3.8 +4,2025/6/30 10:45,31,5,1021,0,31,0,29.3,2.8 +0,2025/7/1 11:45,35,21.6,1010,0,25,0,34.7,7 +1,2025/7/1 11:00,32.4,10.4,1015,0,38,0,31.4,7.4 +2,2025/7/1 17:30,29.3,21.6,1012,0,75,50,32.5,0.5 +3,2025/7/1 10:00,23.4,9.4,1014,0,69,25,24.9,4.1 +4,2025/7/1 10:45,29.1,7.9,1019,0,35,0,27.3,2.8 +0,2025/7/2 11:30,32,27.4,1015,0,24,25,31,6.9 +1,2025/7/2 10:45,33.2,7.2,1015,0,39,0,32.9,4.8 +2,2025/7/2 17:45,29.3,10.8,1012,0.69,75,25,32.4,0.8 +3,2025/7/2 10:00,21.1,19.8,1016,0,78,25,21.1,4 +4,2025/7/2 11:00,29.1,7.9,1018,0,43,0,27.9,5 +0,2025/7/3 11:45,32.2,29.2,1017,0,23,0,30.5,7.1 +1,2025/7/3 10:30,32.3,7.6,1018,0,41,0,31.7,4.9 +2,2025/7/3 17:45,29.2,24.1,1011,0,70,25,30.9,0.9 +3,2025/7/3 9:30,21.3,7.2,1016,0,78,0,21.3,2 +4,2025/7/3 10:45,27.3,12.2,1022,0,48,0,26.6,2.8 +0,2025/7/4 11:45,33.2,30.6,1016,0,23,0,32.1,7.2 +1,2025/7/4 10:45,32,3.6,1019,0,41,0,31.3,4.8 +2,2025/7/4 18:00,29.1,22,1007,0.2,70,75,32.2,0.2 +3,2025/7/4 10:00,25.2,8.3,1019,0,69,0,26.6,4 +4,2025/7/4 10:45,26.3,10.4,1025,0,51,0,26.1,2.8 +0,2025/7/5 11:45,34.3,23.4,1014,0,23,0,33.1,7.1 +1,2025/7/5 11:00,34.9,9.7,1016,0,26,7,34.4,7.1 +2,2025/7/5 17:45,33,6.8,1003,0,59,25,38,0.5 +3,2025/7/5 10:00,23.2,3.6,1019,0,73,25,25.1,3.9 +4,2025/7/5 11:00,26.3,4.7,1022,0,45,0,25.7,4.9 +0,2025/7/6 12:45,36.3,18,1012,0,17,0,35.1,9.4 +1,2025/7/6 12:00,32.1,19.4,1013,0,43,0,31.6,8.7 +2,2025/7/6 19:00,30.7,18,1003,0,60,21,34.5,0 +3,2025/7/6 11:00,23.3,23.8,1017,0,57,0,24.9,6.5 +4,2025/7/6 11:45,28.3,3.6,1018,0,40,0,27.5,5 +0,2025/7/7 12:00,35.3,9,1009,0,17,0,33.9,9.1 +1,2025/7/7 11:00,29.3,18.4,1008,0.01,48,25,31.2,4.9 +2,2025/7/7 17:45,31.4,24.1,1005,0,71,75,34.5,0.6 +3,2025/7/7 9:30,22.1,18.4,1013,0,73,25,24.6,1.9 +4,2025/7/7 11:00,26.3,8.6,1015,0,48,0,25.7,5.1 +0,2025/7/8 12:00,37.3,15.1,1007,0,20,0,38,9.3 +1,2025/7/8 11:00,28.3,23,1006,0,51,50,28.4,6.2 +2,2025/7/8 17:30,32.3,24.8,1008,0,63,25,36.5,1 +3,2025/7/8 10:00,22,3.6,1012,0,69,0,24.5,4 +4,2025/7/8 10:30,21.3,15.5,1017,0,46,100,21.3,2.8 +0,2025/7/9 11:45,36.2,29.5,1006,0,25,0,36.4,6.9 +1,2025/7/9 10:45,24.1,11.2,1013,0,31,0,24,4.5 +2,2025/7/9 17:45,31.2,29.9,1009,0,66,25,34.2,1 +3,2025/7/9 9:45,19.2,9.7,1016,0,83,75,19.2,2 +4,2025/7/9 10:45,27.3,6.1,1019,0,58,0,27.9,2.7 +0,2025/7/10 11:45,29.3,19.8,1008,0,31,0,28.7,6.8 +1,2025/7/10 10:45,25.4,3.6,1016,0,41,0,25.2,4.5 +2,2025/7/10 17:45,30.4,23.4,1011,0.22,66,50,34,0.5 +3,2025/7/10 10:00,21.4,7.9,1019,0,64,75,21.4,4 +4,2025/7/10 11:00,27.4,15.1,1020,0,37,0,26,5 +0,2025/7/11 11:30,30.3,18.7,1009,0,33,25,30,6.5 +1,2025/7/11 10:30,26.1,7.2,1015,0,37,0,25.5,4.5 +2,2025/7/11 17:30,24.2,22.3,1014,0,78,75,25.6,0.5 +3,2025/7/11 9:30,20.1,13.3,1017,0,78,75,20.1,1.1 +4,2025/7/11 10:30,24.1,20.5,1016,0,44,0,24.6,2.7 +0,2025/7/12 11:45,30.2,13.3,1013,0,31,0,29.4,6.6 +1,2025/7/12 10:30,26.4,10.1,1015,0,45,0,25.5,4.6 +2,2025/7/12 17:30,26.1,16.2,1010,0,65,75,26.8,0.5 +3,2025/7/12 9:45,20.1,11.2,1015,0,78,75,20.1,1.1 +4,2025/7/12 10:30,20.1,15.1,1014,0,64,0,20.1,2.3 +0,2025/7/13 11:45,34.4,23.4,1015,0,25,0,33.8,6.7 +1,2025/7/13 10:45,26.3,15.8,1016,0.24,48,25,26.9,2.3 +2,2025/7/13 17:45,31.1,19.8,1005,0.02,59,50,35.9,0.8 +3,2025/7/13 9:45,22.1,10.1,1017,0,69,75,24.6,1.7 +4,2025/7/13 10:45,23.2,13.3,1017,0,53,0,24.4,2.6 +0,2025/7/14 12:00,35.2,26.3,1013,0,20,0,33.4,8.9 +1,2025/7/14 11:00,28.1,3.6,1018,0,62,0,28.2,7 +2,2025/7/14 18:00,27.8,37.4,999,0,71,12,30.6,0.2 +3,2025/7/14 10:00,20.1,16.6,1020,0,68,25,20.1,3.7 +4,2025/7/14 11:00,26.3,4.7,1021,0,45,0,25.2,4.6 +0,2025/7/15 12:00,35.2,32.8,1007,0,20,0,33.7,9.4 +1,2025/7/15 11:00,28.2,4.7,1016,0,55,0,27.1,7 +2,2025/7/15 18:00,26,33.5,1005,0.3,94,75,28.9,0.1 +3,2025/7/15 10:00,23.2,6.5,1020,0,65,0,25,3.9 +4,2025/7/15 11:00,28.4,3.6,1023,0,30,0,26.7,4.9 +0,2025/7/16 11:45,34.3,25.6,1007,0,25,0,33.7,6.7 +1,2025/7/16 10:45,30.4,8.3,1011,0,49,0,30.2,5 +2,2025/7/16 17:45,26.1,44.6,1015,0,84,75,28.3,0.1 +3,2025/7/16 9:45,23.4,4.3,1019,0,65,0,25.1,1.9 +4,2025/7/16 10:45,28.2,6.5,1023,0,42,0,27.3,2.8 +0,2025/7/17 11:30,35.3,6.8,1008,0,22,0,35,6.5 +1,2025/7/17 10:45,28.2,14.8,1009,0,70,0,29.3,4.8 +2,2025/7/17 17:30,30.2,33.1,1017,0,66,25,34,0.8 +3,2025/7/17 9:30,21.2,15.8,1019,0,69,25,21.2,1.9 +4,2025/7/17 10:45,29.3,7.9,1019,0,25,0,27.1,2.8 +0,2025/7/18 11:30,33.2,6.5,1009,0,36,0,33.9,6.3 +1,2025/7/18 10:30,29.2,3.6,1013,0,48,0,29,4.7 +2,2025/7/18 17:30,29.1,33.1,1015,0,66,25,32.5,0.8 +3,2025/7/18 9:30,20.3,24.1,1017,0,78,75,20.3,1.8 +4,2025/7/18 10:30,25.4,16.2,1015,0,32,0,24.1,2.5 +0,2025/7/19 11:45,33.1,7.6,1009,0,39,25,34.5,6.1 +1,2025/7/19 10:45,29.2,10.4,1013,0,52,0,28.7,4.7 +2,2025/7/19 17:45,30.1,28.8,1015,0,66,25,33.1,0.9 +3,2025/7/19 9:45,21.4,16.6,1018,0,64,25,21.4,1.8 +4,2025/7/19 10:45,23.3,9,1014,0,47,0,24.2,2.3 +0,2025/7/20 11:30,35,3.6,1010,0,27,0,35.2,6.6 +1,2025/7/20 10:30,31.2,24.5,1010,0,38,0,30.7,4.4 +2,2025/7/20 17:30,31.1,29.5,1015,0,66,25,35.7,0.9 +3,2025/7/20 9:30,21.1,15.1,1014,0.07,94,75,21.1,1.4 +4,2025/7/20 10:30,21.4,13,1013,0,49,0,21.4,2.4 +0,2025/7/21 11:30,35.3,8.6,1009,0,32,0,34.9,6.7 +1,2025/7/21 10:30,29.3,13.7,1010,0,58,0,29.4,4.5 +2,2025/7/21 17:30,32.1,29.2,1015,0,63,25,37.8,0.8 +3,2025/7/21 9:30,19.3,20.9,1017,0,73,25,19.3,1.8 +4,2025/7/21 10:30,21.1,3.6,1015,0,40,0,21.1,2.4 +0,2025/7/22 11:30,37.3,10.8,1009,0,26,0,37.7,6.8 +1,2025/7/22 10:30,30.3,10.1,1011,0,59,50,31.3,4.4 +2,2025/7/22 17:30,30.2,26.3,1014,0,70,25,33.4,0.7 +3,2025/7/22 9:30,20.1,16.2,1018,0,78,25,20.1,1.7 +4,2025/7/22 10:30,23.2,6.8,1018,0,47,0,23.7,2.3 +0,2025/7/23 11:30,35.1,8.3,1006,0,39,0,34.6,6.6 +1,2025/7/23 10:30,28.2,5.8,1013,0,58,0,27.7,4.6 +2,2025/7/23 17:30,31.3,27,1011,0,66,25,34.9,0.8 +3,2025/7/23 9:45,19.3,22.7,1019,0,73,25,19.3,0.9 +4,2025/7/23 10:45,25.3,3.6,1016,0,39,0,24.7,1.8 +0,2025/7/24 11:45,37.2,9,1006,0,31,0,37.7,6.8 +1,2025/7/24 10:45,28.1,9.4,1012,0,62,0,27.4,4.2 +2,2025/7/24 17:45,31.1,28.4,1011,0,66,25,35.1,0.7 +3,2025/7/24 9:45,20.1,15.8,1013,0,68,25,20.1,1.7 +4,2025/7/24 10:45,20.1,23,1016,0,46,0,20.1,2.2 +0,2025/7/25 11:30,38.2,25.9,1009,0,20,0,37.9,6.9 +1,2025/7/25 10:30,30.3,12.2,1011,0,35,0,28.9,4 +2,2025/7/25 17:30,32.2,31.3,1010,0,59,25,37.8,0.8 +3,2025/7/25 9:15,25.1,23.8,1014,0,34,0,25.5,1.7 +4,2025/7/25 10:30,18.2,21.2,1019,0,52,0,18.2,2.3 +0,2025/7/26 11:30,37.4,31.3,1009,0,18,0,36.9,6.9 +1,2025/7/26 10:30,26.2,10.1,1010,0,65,50,26.9,1.1 +2,2025/7/26 17:30,33.1,30.6,1009,0,59,25,40.2,0.8 +3,2025/7/26 9:30,25.2,6.5,1017,0,47,0,25.4,1.7 +4,2025/7/26 10:30,20.4,8.3,1022,0,49,0,20.4,2.5 +0,2025/7/27 11:45,38.1,6.5,1003,0,19,0,37.7,6.8 +1,2025/7/27 10:30,25.1,5.8,1011,0,57,25,25.5,4.4 +2,2025/7/27 17:30,30.2,32,1007,0,70,25,33.8,0.7 +3,2025/7/27 9:30,23.4,6.1,1019,0,65,0,25,1.7 +4,2025/7/27 10:45,24.2,3.6,1022,0,44,0,23.9,2.3 +0,2025/7/28 11:30,35.1,9.4,1001,0,25,0,35.3,6.3 +1,2025/7/28 10:30,25,23.8,1004,0.67,69,75,26.3,3.2 +2,2025/7/28 17:30,32.3,24.1,1003,0,63,25,36.7,0.8 +3,2025/7/28 9:30,20.3,17.3,1018,0,78,25,20.3,1.7 +4,2025/7/28 10:15,23.3,19.1,1019,0,44,0,23.8,2.4 +0,2025/7/29 11:45,33.2,14,1003,0,28,0,32.9,6.9 +1,2025/7/29 10:45,24.3,19.1,1008,0,61,0,25,4.3 +2,2025/7/29 17:45,33.1,22.3,1001,0,53,25,35.4,0.8 +3,2025/7/29 9:45,27.1,20.2,1015,0,30,0,26.8,1.7 +4,2025/7/29 10:45,20.1,22,1022,0,46,0,20.1,2.4 +0,2025/7/30 11:30,34.1,6.8,1007,0,30,25,35.9,6.7 +1,2025/7/30 10:30,25.1,3.6,1014,0,47,0,25.5,4.3 +2,2025/7/30 17:15,33.3,25.2,1003,0,49,25,35.8,0.8 +3,2025/7/30 9:15,23,6.1,1016,0,61,0,24.6,1.7 +4,2025/7/30 10:15,21.1,17.3,1022,0,35,0,21.1,2.4 +1,2025/7/31 10:30,26,5.8,1016,0,48,0,25.8,4.1 +2,2025/7/31 17:30,32,27.4,1004,0,49,0,34.7,0.8 +3,2025/7/31 9:30,25.1,6.5,1015,0,51,0,26.1,1.6 +4,2025/7/31 10:30,24.3,11.9,1021,0,57,0,25.2,2.3 +0,2025/8/1 11:15,27.4,21.2,1010,0,54,25,27.8,6.3 +1,2025/8/1 10:15,25.2,7.6,1014,0,65,0,25.5,4.2 +2,2025/8/1 17:15,28.2,31,999,0.29,89,75,29.9,0.6 +3,2025/8/1 9:15,21.3,5.8,1013,0,73,25,21.3,1.2 +4,2025/8/1 10:15,24.1,10.1,1017,0,54,25,24.7,1.4 +0,2025/8/2 11:30,31.2,28.4,1009,0,38,50,30.7,6.2 +1,2025/8/2 10:30,26.1,13.3,1011,0,65,50,26.6,3.8 +2,2025/8/2 17:30,31.2,31.7,999,0,66,50,36.7,0.7 +3,2025/8/2 9:30,19.1,3.6,1013,0,88,25,19.1,1.3 +4,2025/8/2 10:30,25.3,7.2,1017,0,47,0,25.1,0.9 +0,2025/8/3 11:15,32.3,6.8,1011,0,32,0,32.1,6.3 +1,2025/8/3 10:15,26.3,16.6,1012,0.02,65,50,26.9,3.8 +2,2025/8/3 17:15,33.2,21.2,1002,0,59,75,37.6,0.7 +3,2025/8/3 9:15,25.1,3.6,1013,0,47,0,25.5,1.4 +4,2025/8/3 10:15,26.1,9.4,1019,0,39,0,25.5,1.6 +0,2025/8/4 11:15,32.1,8.3,1012,0,34,25,31.6,6.4 +1,2025/8/4 10:15,24.3,13.7,1016,0,57,0,24.8,3.8 +2,2025/8/4 17:15,34.1,32.8,1003,0,53,25,38.5,0.7 +3,2025/8/4 9:30,22.2,8.3,1018,0,78,0,24.6,1.5 +4,2025/8/4 10:15,25.3,8.6,1023,0,54,0,25.8,1.8 +0,2025/8/5 11:30,31.1,10.8,1012,0,46,25,32.3,6.2 +1,2025/8/5 10:15,26.4,4,1017,0,39,0,25.8,4.2 +2,2025/8/5 17:30,37.1,21.6,1002,0,54,25,46.9,0.7 +3,2025/8/5 9:30,27.3,5.4,1018,0,48,0,29.2,1.4 +4,2025/8/5 10:30,28.4,6.1,1023,0,35,0,26.8,2.1 +0,2025/8/6 11:30,29,22.3,1010,0,45,25,29.7,5.4 +1,2025/8/6 10:30,27.2,5,1017,0,42,0,26.7,4 +2,2025/8/6 17:30,36.2,16.2,1000,0.3,50,50,46.2,0.6 +3,2025/8/6 9:30,20.4,7.6,1017,0,88,50,20.4,1.5 +4,2025/8/6 10:30,26.4,6.1,1020,0,39,0,25.5,2 +0,2025/8/7 11:30,32.3,39.6,1012,0,30,25,32.7,6.2 +1,2025/8/7 10:30,29.3,5.4,1019,0,40,0,28,3.9 +2,2025/8/7 17:30,33.3,4.3,996,0,56,25,37.3,0.6 +3,2025/8/7 9:30,19.3,5.8,1017,0,83,25,19.3,1.4 +4,2025/8/7 10:30,27.3,5.8,1020,0,25,0,25.5,2.1 +0,2025/8/8 11:15,31.2,44.6,1013,0,43,25,32,6 +1,2025/8/8 10:15,29.1,3.6,1020,0,48,0,28,4.1 +2,2025/8/8 17:15,34,16.6,1000,0.09,47,25,37.8,0.5 +3,2025/8/8 9:15,19.3,4,1017,0,88,75,19.3,1.4 +4,2025/8/8 10:15,27.3,9.4,1021,0,39,0,26.3,1.8 +0,2025/8/9 11:15,30.2,41,1016,0,31,0,28.1,6.2 +1,2025/8/9 10:15,31.3,4,1018,0,38,0,30.2,4.1 +2,2025/8/9 17:15,31.2,22,1005,0,59,25,34.2,0.6 +3,2025/8/9 9:15,20.1,3.6,1018,0,83,25,20.1,1.4 +4,2025/8/9 10:15,27.2,9,1022,0,39,0,26.1,2 +0,2025/8/10 11:30,31.4,32,1014,0,38,0,30.8,6.4 +1,2025/8/10 10:30,30.1,5.8,1017,0,43,0,29,4 +2,2025/8/10 17:30,26.1,34.2,1003,0,89,75,27.4,0.1 +3,2025/8/10 9:30,21.1,6.1,1018,0,78,25,21.1,1.4 +4,2025/8/10 10:30,28.2,8.6,1025,0,35,0,26.7,2 +0,2025/8/11 11:15,33.2,36.7,1012,0,26,0,32.1,6.5 +1,2025/8/11 10:15,31.3,5.4,1016,0,38,0,29.9,4 +2,2025/8/11 17:15,28.1,34.2,1006,0,84,75,30.4,0.1 +3,2025/8/11 9:15,25.2,4,1017,0,47,0,25.6,1.3 +4,2025/8/11 10:15,29.2,6.8,1023,0,35,0,27.9,2.1 +0,2025/8/12 11:15,30.1,28.8,1012,0,40,0,29.6,6.3 +1,2025/8/12 10:15,33.4,3.6,1014,0,32,0,32.2,3.9 +2,2025/8/12 17:15,29,10.4,1010,0,84,75,33.2,0.1 +3,2025/8/12 9:15,29.2,3.6,1014,0,31,0,28.9,1.2 +4,2025/8/12 10:15,29.2,6.1,1020,0,29,0,27.2,1.9 +0,2025/8/13 11:30,31.2,29.9,1014,0,36,0,31.5,5.9 +1,2025/8/13 10:15,31.3,3.6,1015,0,41,0,30.5,3.7 +2,2025/8/13 17:30,31.2,14.4,1016,0.02,59,75,35,0.2 +3,2025/8/13 9:30,24.4,9,1013,0,61,0,25.6,1.3 +4,2025/8/13 10:30,27.2,6.8,1019,0,42,0,26,1.7 +0,2025/8/14 11:15,27,15.8,1014,0,51,25,27.6,5.6 +1,2025/8/14 10:15,32.2,3.6,1014,0,30,0,30.9,3.2 +2,2025/8/14 17:15,31.1,23,1015,0,59,50,34.4,0.4 +3,2025/8/14 9:30,22.2,5,1013,0,69,0,24.6,1.3 +4,2025/8/14 10:30,27.2,8.6,1020,0,42,0,26.1,1.9 +0,2025/8/15 11:15,29.3,25.2,1013,0,45,25,30.1,5.8 +1,2025/8/15 10:15,27.4,3.6,1016,0,48,0,26.7,3.5 +2,2025/8/15 17:15,28.1,27.7,1012,0,74,75,29.8,0.6 +3,2025/8/15 9:15,20.3,5.4,1016,0,88,75,20.3,1.2 +4,2025/8/15 10:15,28.4,11.2,1022,0,35,0,26.9,1.9 +0,2025/8/16 11:15,29.2,31.3,1010,0,33,25,28.7,5.7 +1,2025/8/16 10:30,29.2,3.6,1013,0,43,0,28.4,3.5 +2,2025/8/16 17:30,30.4,29.5,1013,0,75,75,34.5,0.6 +3,2025/8/16 9:30,20.3,8.6,1019,0,78,0,20.3,1.2 +4,2025/8/16 10:30,31.2,6.5,1025,0,21,0,29,1.9 +0,2025/8/17 11:15,29.3,16.9,1008,0,40,0,27.9,5.6 +1,2025/8/17 10:15,28.2,4.7,1010,0,62,25,27.8,3.3 +2,2025/8/17 17:15,33.1,21.2,1011,0,63,25,39.3,0.5 +3,2025/8/17 9:15,21.1,9,1017,0,69,0,21.1,1.1 +4,2025/8/17 10:15,30,5,1022,0,21,0,27.8,1.2 +0,2025/8/18 11:15,30.1,7.9,1010,0,38,0,29,5.5 +1,2025/8/18 10:15,27.3,3.6,1012,0,58,0,26.9,3.4 +2,2025/8/18 17:15,35,20.9,1012,0.66,53,75,43.3,0.3 +3,2025/8/18 9:00,19.3,15.5,1017,0,88,25,19.3,1 +4,2025/8/18 10:15,28.4,6.5,1017,0,35,0,26.5,1.3 +0,2025/8/19 11:15,30.1,7.9,1012,0,35,25,29.6,5.3 +1,2025/8/19 10:15,27.1,5.8,1014,0,62,0,27.1,3.1 +2,2025/8/19 17:00,34.2,23.4,1010,0,56,25,41.4,0.5 +3,2025/8/19 9:00,19.2,26.3,1017,0,83,25,19.2,1.2 +4,2025/8/19 10:00,23.3,3.6,1015,0,33,0,23.1,0.5 +0,2025/8/20 12:15,30.2,9.7,1011,0,40,25,29.7,7.3 +1,2025/8/20 11:15,29.2,15.8,1011,0,55,25,29.4,4.5 +2,2025/8/20 18:15,32.2,20.5,1008,0,52,25,37,0 +3,2025/8/20 10:30,22.2,26.3,1017,0,69,50,24.6,2.9 +4,2025/8/20 11:30,24,3.6,1015,0,44,0,24.1,1.1 +0,2025/8/21 11:15,30.3,5.8,1012,0,46,0,30,5.5 +1,2025/8/21 10:00,26,16.6,1006,0.01,79,25,26.8,2.3 +2,2025/8/21 17:15,33.2,20.2,1009,0,56,75,36.1,0.4 +3,2025/8/21 9:00,19.1,19.8,1016,0,78,25,19.1,1.2 +4,2025/8/21 10:00,20.1,7.9,1016,0,53,0,20.1,0.9 +0,2025/8/22 11:15,30.1,13,1009,0,43,0,28.8,4.9 +1,2025/8/22 10:00,24.4,9,1010,0.01,65,0,25.6,2.7 +2,2025/8/22 16:45,34,14,1009,0,60,50,38,1.2 +3,2025/8/22 9:00,20.3,6.5,1015,0,83,25,20.3,0.5 +4,2025/8/22 10:15,20.4,11.9,1018,0,56,0,20.4,0.8 +0,2025/8/23 11:15,33.2,9.7,1009,0,30,0,33.5,4.5 +1,2025/8/23 10:00,24.4,3.6,1013,0,69,0,25.4,2.9 +2,2025/8/23 17:00,35.2,20.9,1009,0,53,25,43.3,0.4 +3,2025/8/23 9:15,19,7.2,1014,0,88,25,19,0.6 +4,2025/8/23 10:15,22.1,8.3,1018,0,46,0,24.4,1 +0,2025/8/24 11:00,29.3,19.4,1012,0,35,0,29.2,4.7 +1,2025/8/24 10:00,25.1,11.9,1015,0,65,25,25.9,2.4 +2,2025/8/24 17:00,35.3,22.3,1010,0,53,25,42,0.4 +3,2025/8/24 9:00,19.2,9,1014,0,83,25,19.2,0.7 +4,2025/8/24 10:00,23.3,5.4,1017,0,33,0,23,1.5 +0,2025/8/25 11:00,30.3,11.9,1015,0,25,0,29.2,5.1 +1,2025/8/25 10:00,25.2,5.8,1017,0,69,0,26.1,3.2 +2,2025/8/25 17:00,34.1,20.5,1012,0,56,75,40.1,0.4 +3,2025/8/25 9:00,19.3,6.8,1016,0,83,25,19.3,0.9 +4,2025/8/25 10:00,24.3,11.9,1018,0,44,0,24.1,0.5 +0,2025/8/26 11:15,29.1,20.5,1014,0,31,0,28.9,4.9 +1,2025/8/26 10:15,26.3,7.2,1015,0,70,25,26.9,2.5 +2,2025/8/26 17:15,33.2,26.3,1009,0,59,25,40,0.4 +3,2025/8/26 9:15,20.1,14.4,1015,0,78,25,20.1,1.1 +4,2025/8/26 10:15,25.1,10.4,1016,0,51,0,25.6,1.4 +0,2025/8/27 11:00,27.3,24.5,1015,0,45,25,26.7,4.9 +1,2025/8/27 10:00,26.3,7.9,1015,0,65,0,26.8,2.7 +2,2025/8/27 17:00,34,23.4,1006,0,56,25,40.9,0.4 +3,2025/8/27 9:00,19.3,23.4,1014,0,78,25,19.3,1.1 +4,2025/8/27 10:00,25.4,8.6,1012,0,51,0,25.4,1.3 +0,2025/8/28 11:15,28.1,26.6,1014,0,35,0,26.9,5.1 +1,2025/8/28 10:30,28.3,16.2,1011,0.06,58,0,27.8,2.5 +2,2025/8/28 17:30,31.1,23.4,1013,0,49,75,33.4,0.1 +3,2025/8/28 9:30,19.3,22.3,1018,0,78,50,19.3,1 +4,2025/8/28 10:15,19.2,11.9,1013,0,49,0,19.2,1.4 +0,2025/8/29 11:00,28.1,13.3,1013,0,37,0,27.2,5.2 +1,2025/8/29 10:00,23.2,19.4,1008,0.7,94,0,25.1,1.3 +2,2025/8/29 17:00,32.2,20.2,1013,0,59,25,36.3,0.4 +3,2025/8/29 9:00,20.2,10.8,1019,0,83,25,20.2,1.1 +4,2025/8/29 9:45,17.3,19.8,1017,0,55,0,17.3,0.3 +0,2025/8/30 11:00,28.4,11.9,1012,0,42,0,27.8,4.9 +1,2025/8/30 9:45,21.4,15.8,1009,2.6,88,25,21.4,1.3 +2,2025/8/30 17:00,36.2,15.1,1011,0,50,25,41.2,0.4 +3,2025/8/30 9:00,20.4,10.8,1018,0,83,25,20.4,1.1 +4,2025/8/30 9:45,21,5,1018,0,49,0,21,0.5 +0,2025/8/31 11:00,30.2,15.8,1010,0,49,0,29.6,4.7 +1,2025/8/31 10:00,22,6.5,1013,0,65,0,24.4,3.2 +2,2025/8/31 17:00,35,24.8,1012,0,44,25,41.9,0.4 +3,2025/8/31 9:00,20.2,17.3,1016,0.01,100,75,20.2,1 +4,2025/8/31 10:00,21.1,15.5,1014,0,43,0,21.1,1.5 +0,2025/9/1 11:00,29.3,6.5,1011,0,35,0,29.2,5.1 +1,2025/9/1 10:15,24.2,7.9,1014,0,57,0,25.1,3 +2,2025/9/1 17:15,34.1,28.4,1009,0,56,25,42.1,0.4 +3,2025/9/1 9:15,18.2,18.4,1020,0,77,25,18.2,1 +4,2025/9/1 10:15,16.2,14,1017,0,51,0,16.2,1.3 +0,2025/9/2 11:15,30.4,13.3,1011,0,31,0,29.2,5.1 +1,2025/9/2 10:15,25.4,16.6,1010,0.67,79,75,26.7,2.6 +2,2025/9/2 17:00,34.4,29.2,1007,0,56,25,41.3,0.4 +3,2025/9/2 9:15,18,7.6,1021,0,88,75,18,1 +4,2025/9/2 10:15,17,9.4,1020,0,52,0,17,1.4 +0,2025/9/3 11:00,33.3,18.4,1010,0,28,0,32.7,4.9 +1,2025/9/3 10:00,23,10.1,1015,0,53,0,24,3 +2,2025/9/3 16:45,32.2,27,1010,0.33,63,50,35.8,1.1 +3,2025/9/3 9:00,20.2,9.4,1018,0,83,75,20.2,1 +4,2025/9/3 10:00,18.4,7.6,1019,0,52,0,18.4,1.5 +0,2025/9/4 10:45,29.2,26.3,1009,0,43,25,28.8,2.7 +1,2025/9/4 9:45,21.3,6.5,1015,0,60,0,21.3,1.4 +2,2025/9/4 17:00,28,9,1013,0.15,79,75,32.7,0.1 +3,2025/9/4 9:00,18.4,23.4,1019,0,83,25,18.4,0.9 +4,2025/9/4 10:00,19.3,3.6,1017,0,68,0,19.3,1.4 +0,2025/9/5 11:00,28.3,26.3,1011,0,45,25,28.8,4.3 +1,2025/9/5 9:45,22.3,4,1017,0,65,0,24.5,1.3 +2,2025/9/5 17:00,24.1,25.6,1000,3.43,94,75,26.6,0 +3,2025/9/5 9:00,19.1,13.3,1017,0,68,0,19.1,0.8 +4,2025/9/5 10:00,19.1,13.3,1021,0,49,0,19.1,1.1 +0,2025/9/6 10:45,30,19.1,1014,0,35,0,29.2,2.6 +1,2025/9/6 9:45,23.1,3.6,1019,0,73,0,24.8,1.3 +2,2025/9/6 16:45,30.1,21.2,1009,0.01,62,25,33,1.1 +3,2025/9/6 8:45,17,3.6,1013,0,83,0,17,0.2 +4,2025/9/6 9:45,21.1,13.7,1019,0,69,25,21.1,0.4 +0,2025/9/7 10:45,28.2,11.2,1016,0,35,0,27.6,2.4 +1,2025/9/7 9:45,23.4,5,1019,0,73,25,25,1.2 +2,2025/9/7 16:45,31.3,24.1,1007,0,63,25,35.3,1.3 +3,2025/9/7 8:45,20.2,9.4,1015,0.54,100,75,20.2,0 +4,2025/9/7 9:45,23.1,15.5,1018,0,61,25,25,0.3 +0,2025/9/8 11:15,28,22,1014,0,35,0,27.6,4.2 +1,2025/9/8 10:15,24.3,4.7,1016,0,65,0,25,2.6 +2,2025/9/8 17:15,35.2,12.2,1007,0,44,50,41.6,0.3 +3,2025/9/8 9:15,17.1,25.2,1019,0,72,25,17.1,0.8 +4,2025/9/8 10:15,20.3,3.6,1018,0,68,0,20.3,1.2 +0,2025/9/9 11:30,29.1,3.6,1015,0,29,0,27.9,3.3 +1,2025/9/9 10:15,26.2,9.7,1014,0,58,25,26.3,2.6 +2,2025/9/9 17:30,32,19.1,1009,0,63,25,38.1,0.3 +3,2025/9/9 9:15,17.3,29.5,1021,0,72,0,17.3,0.8 +4,2025/9/9 10:30,18.1,8.3,1017,0,64,0,18.1,1.1 +0,2025/9/10 11:15,30.1,4,1016,0,35,0,28.8,4.5 +1,2025/9/10 10:15,20.3,19.8,1010,4.55,100,75,20.3,0.3 +2,2025/9/10 17:15,32.1,29.9,1011,0,63,50,39.1,0.3 +3,2025/9/10 9:15,20,15.8,1021,0.01,88,75,20,0.8 +4,2025/9/10 10:15,19.3,16.9,1018,0,56,0,19.3,1.2 +0,2025/9/11 11:00,30.4,5.8,1015,0,33,0,29.1,4.5 +1,2025/9/11 10:00,23,14.8,1014,0.1,83,50,24.9,2.4 +2,2025/9/11 17:00,25.1,18.4,1014,0.32,89,75,26.7,0.1 +3,2025/9/11 9:00,19.3,14.4,1023,0,83,50,19.3,0.8 +4,2025/9/11 10:00,19,7.2,1021,0,43,0,19,1.2 +0,2025/9/12 11:15,30.4,3.6,1014,0,38,25,29.6,4.1 +1,2025/9/12 10:15,22.1,14.4,1017,0,73,0,24.5,2.3 +2,2025/9/12 17:15,27.3,18,1018,0.27,74,75,29.7,0.1 +3,2025/9/12 9:15,20.1,13.7,1021,0,83,25,20.1,0.8 +4,2025/9/12 10:15,20.2,8.6,1022,0,56,0,20.2,1.2 +0,2025/9/13 11:00,29.3,21.2,1018,0,45,0,29.3,4.3 +1,2025/9/13 10:00,22.3,3.6,1020,0,73,0,24.6,2.5 +2,2025/9/13 17:00,28.1,26.3,1012,0,74,50,30.3,0.2 +3,2025/9/13 9:15,18.1,12.6,1021,0,73,0,18.1,0.7 +4,2025/9/13 10:15,20,3.6,1020,0,49,0,20,1 +0,2025/9/14 11:00,27.3,23.4,1017,0,48,0,27.1,4.4 +1,2025/9/14 10:00,23,5.4,1019,0,78,0,24.7,2.1 +2,2025/9/14 17:00,34,6.8,1009,0,56,50,42.1,0.2 +3,2025/9/14 9:00,19.2,15.8,1023,0,88,75,19.2,0.8 +4,2025/9/14 10:00,20.4,7.6,1024,0,40,0,20.4,1.1 +0,2025/9/15 11:15,27.1,10.8,1017,0,42,25,27.1,3.4 +1,2025/9/15 10:15,23,9.7,1020,0,73,0,24.9,2.5 +2,2025/9/15 17:15,30.4,9.4,1014,0.01,66,75,32.6,0.2 +3,2025/9/15 9:15,20.1,16.2,1021,0,78,25,20.1,0.7 +4,2025/9/15 10:15,22.3,7.2,1024,0,53,0,24.6,1.1 +0,2025/9/16 11:00,28.1,16.9,1018,0,40,0,27.8,4.4 +1,2025/9/16 10:00,24.3,7.2,1020,0,78,25,25.6,2.5 +2,2025/9/16 17:00,31.2,22,1013,0,66,25,36,0.2 +3,2025/9/16 9:15,18.3,6.8,1020,0,83,25,18.3,0.7 +4,2025/9/16 10:00,22.3,5,1023,0,50,0,23.7,1 +0,2025/9/17 11:00,28.3,4,1013,0,33,0,26.5,4.4 +1,2025/9/17 10:00,22.2,8.6,1017,0,83,0,24.6,1.7 +2,2025/9/17 17:00,34.3,18.4,1008,0,60,25,43.5,0.2 +3,2025/9/17 9:00,18,6.8,1021,0,52,0,18,0.7 +4,2025/9/17 9:45,22.4,6.5,1025,0,38,0,24,0.3 +0,2025/9/18 10:45,22,33.8,1020,0,53,75,24.3,2.3 +1,2025/9/18 10:00,24.1,3.6,1023,0,61,0,25.3,2.5 +2,2025/9/18 17:00,30.1,18,1007,6.13,59,50,34.7,0.2 +3,2025/9/18 9:00,19.4,7.2,1020,0,68,0,19.4,0.6 +4,2025/9/18 10:00,24.3,7.9,1026,0,29,0,24.4,1 +0,2025/9/19 11:00,25.2,33.5,1024,0,28,25,25.1,4.1 +1,2025/9/19 10:00,25.1,3.6,1025,0,65,0,25,2.5 +2,2025/9/19 17:00,25,7.9,1017,0.1,61,75,26.5,0.1 +3,2025/9/19 9:00,20.3,3.6,1019,0,73,0,20.3,0.5 +4,2025/9/19 10:00,23,10.1,1024,0,50,0,24.5,0.8 +0,2025/9/20 11:00,25.2,40,1024,0,39,25,25.4,4 +1,2025/9/20 9:45,24.3,3.6,1024,0,65,0,25.1,1 +2,2025/9/20 17:00,23.3,15.8,1011,0.04,94,75,25.2,0.1 +3,2025/9/20 9:00,18.3,7.6,1020,0,94,25,18.3,0.6 +4,2025/9/20 10:00,21.3,7.9,1022,0,78,0,21.3,0.8 +0,2025/9/21 10:45,26.2,27.4,1019,0,39,25,26.5,2.1 +1,2025/9/21 9:45,24.1,4.7,1019,0,54,0,25.2,0.9 +2,2025/9/21 16:45,27.2,16.2,1009,0.13,48,75,28.5,0.4 +3,2025/9/21 8:45,16.2,24.8,1021,0,72,25,16.2,0 +4,2025/9/21 10:00,20.2,11.2,1015,0,60,0,20.2,0.9 +0,2025/9/22 10:45,25.1,13.7,1016,0,51,0,25.5,2.1 +1,2025/9/22 10:00,24.3,14.8,1015,0,74,0,25.5,2.2 +2,2025/9/22 17:00,25.4,27,1020,0,47,75,25.8,0.2 +3,2025/9/22 9:00,13.3,18.7,1021,0,67,0,11.6,0.6 +4,2025/9/22 10:00,13.3,7.6,1020,0,47,0,13,0.9 +0,2025/9/23 11:15,26.2,3.6,1016,0,39,0,26,3.7 +1,2025/9/23 10:00,23.3,9.4,1013,0,73,50,25,0.6 +2,2025/9/23 17:00,25.2,19.1,1021,0,44,75,25.4,0.2 +3,2025/9/23 9:00,17.3,15.5,1018,0,42,0,17.3,0.5 +4,2025/9/23 10:00,12,14.4,1021,0,54,0,10.5,0.8 +0,2025/9/24 11:00,26.3,7.6,1015,0,51,0,26.4,3.6 +1,2025/9/24 10:00,20.4,15.8,1012,1.25,94,50,20.4,1.9 +2,2025/9/24 17:00,26.2,16.9,1021,0,48,75,26.3,0.2 +3,2025/9/24 9:00,18.2,13.3,1018,0,39,0,18.2,0.5 +4,2025/9/24 10:00,10.3,16.6,1023,0,54,0,8.1,0.7 +0,2025/9/25 10:45,28.1,4.3,1014,0,40,0,27.9,1.9 +1,2025/9/25 9:45,20.2,12.2,1017,0,56,25,20.2,0.3 +2,2025/9/25 16:30,27.4,25.2,1017,0,58,75,28.4,0.9 +3,2025/9/25 8:30,16.3,9.7,1018,0,42,0,16.3,0 +4,2025/9/25 9:45,12.3,12.2,1021,0,58,0,11.1,0.1 +0,2025/9/26 11:00,25.3,31.3,1018,0,44,25,26.1,3.5 +1,2025/9/26 9:45,19.1,6.1,1019,0,73,50,19.1,0.8 +2,2025/9/26 17:00,31,16.9,1012,0,52,50,32.8,0.2 +3,2025/9/26 9:00,19.1,4,1018,0,35,0,19.1,0.5 +4,2025/9/26 10:00,14,6.1,1021,0,28,0,14.1,0.7 +0,2025/9/27 10:30,23.2,24.5,1019,0,44,25,24.7,1.8 +1,2025/9/27 10:00,12.4,6.5,1019,0,100,0,12.1,1.8 +2,2025/9/27 17:00,27.3,14.8,1015,0,48,50,28.1,0.1 +3,2025/9/27 8:45,16.3,7.6,1018,0,88,25,16.3,0 +4,2025/9/27 9:45,14.3,5,1020,0,41,0,14.6,0.2 +0,2025/9/28 10:45,20.1,12.2,1017,0.01,49,25,20.1,0.4 +1,2025/9/28 10:15,19.1,11.5,1015,0,68,0,19.1,1.9 +2,2025/9/28 17:15,27.4,25.9,1013,0,66,50,28.7,0.1 +3,2025/9/28 9:00,18.2,33.8,1013,0.03,88,75,18.2,0.3 +4,2025/9/28 10:15,18.1,16.9,1016,0,37,25,18.1,0.7 +0,2025/9/29 10:45,16,10.1,1014,0.02,94,75,16,0.2 +1,2025/9/29 9:45,19.3,6.5,1015,0,60,0,19.3,0.6 +2,2025/9/29 16:45,32.3,13.3,1001,0.01,52,50,35.8,0.7 +3,2025/9/29 8:45,16.2,6.8,1016,0,94,25,16.2,0 +4,2025/9/29 9:45,17.2,23,1018,0,63,50,17.2,0 +0,2025/9/30 11:00,22.4,4,1018,0.01,65,50,24.6,3.3 +1,2025/9/30 9:45,18.3,3.6,1019,0.01,83,0,18.3,0.7 +2,2025/9/30 16:45,27.1,11.9,1011,0,48,50,27,0.2 +3,2025/9/30 9:00,17.3,9.4,1018,0,88,0,17.3,0.5 +4,2025/9/30 10:00,16.4,13,1021,0,63,75,16.4,0.7 +0,2025/10/1 10:30,23.3,5.4,1016,0,61,25,24.9,1.6 +1,2025/10/1 9:30,17.2,5,1015,0,77,0,17.2,0.7 +2,2025/10/1 16:30,20,12.2,1011,0.07,94,75,20,0.2 +3,2025/10/1 8:30,17.2,7.9,1020,0,72,0,17.2,0 +4,2025/10/1 9:30,15.3,3.6,1024,0,77,0,15.3,0.1 +0,2025/10/2 10:00,20.4,3.6,1009,2.88,64,75,20.4,0.2 +1,2025/10/2 9:15,15.1,24.5,1015,0,51,0,15.1,0.6 +2,2025/10/2 16:00,28.3,3.6,1015,0,42,25,28,0.6 +3,2025/10/2 8:00,19.1,5.4,1020,0,64,0,19.1,0 +4,2025/10/2 9:15,15.3,8.3,1024,0,31,0,15.3,0.1 +0,2025/10/3 9:45,19,18.4,1005,0,56,25,19,0.4 +1,2025/10/3 8:45,11.1,16.6,1018,0,54,0,9.1,0.1 +2,2025/10/3 15:45,25.4,11.2,1021,0,54,75,26.1,1.5 +3,2025/10/3 7:45,16.1,5.8,1021,0,82,0,16.1,0 +4,2025/10/3 8:45,15.3,4.3,1024,0,27,0,15.3,0 +0,2025/10/4 9:30,18.2,5,1014,0,56,25,18.2,0.5 +1,2025/10/4 8:30,10.2,7.2,1018,0,62,0,9.4,0.1 +2,2025/10/4 15:30,21,3.6,1019,0.23,94,75,21,0.3 +3,2025/10/4 7:30,16.1,13,1023,0,94,75,16.1,0 +4,2025/10/4 8:30,14,3.6,1022,0,59,0,14.7,0 +0,2025/10/5 9:30,19.3,9.4,1017,0,60,25,19.3,0.5 +1,2025/10/5 8:30,16.2,18.4,1010,0.02,88,100,16.2,0 +2,2025/10/5 15:30,28,14.8,1011,0,66,75,29.5,1.8 +3,2025/10/5 7:30,15.1,13.7,1021,0,88,25,15.1,0 +4,2025/10/5 8:30,17.2,15.8,1021,0,63,0,17.2,0 +0,2025/10/6 9:15,18,6.8,1011,0,68,25,18,0.5 +1,2025/10/6 8:15,10,14.8,1017,0,71,0,7.9,0 +2,2025/10/6 15:15,26.1,30.6,1012,0,74,75,28.3,0.6 +3,2025/10/6 7:15,17.1,7.6,1018,0,72,0,17.1,0 +4,2025/10/6 8:15,12.1,11.9,1025,0,50,50,10.9,0 +0,2025/10/7 11:00,17.1,16.9,1008,0.36,59,50,17.1,2.6 +1,2025/10/7 10:00,16.2,10.8,1020,0,36,0,16.2,1.5 +2,2025/10/7 17:00,24.2,19.1,1019,0,50,75,25.5,0 +3,2025/10/7 9:00,18.3,3.6,1022,0,88,75,18.3,0.3 +4,2025/10/7 10:00,15.2,4,1025,0,59,0,15.2,0.6 +0,2025/10/8 11:00,17.1,12.6,1009,0,45,25,17.1,2.5 +1,2025/10/8 10:15,11.2,6.1,1020,0,82,0,10.8,1.5 +2,2025/10/8 17:15,27.2,9.7,1011,0,51,25,28.2,0 +3,2025/10/8 9:15,17.2,17.6,1022,0,83,50,17.2,0.3 +4,2025/10/8 10:15,17,4,1022,0,55,0,17,0.5 +0,2025/10/9 11:00,19.2,5.8,1017,0,40,25,19.2,2.7 +1,2025/10/9 10:00,18.3,3.6,1019,0,68,0,18.3,1.4 +2,2025/10/9 17:00,22.4,29.5,1014,0,57,75,24.6,0 +3,2025/10/9 9:00,17.3,15.5,1020,0,88,75,17.3,0.3 +4,2025/10/9 10:00,16.3,15.8,1021,0.07,59,0,16.3,0.5 +0,2025/10/10 11:00,22.3,3.6,1023,0,50,0,24.3,2.7 +1,2025/10/10 10:00,18.4,3.6,1024,0,83,25,18.4,1.3 +2,2025/10/10 17:00,23.4,18.7,1019,0,47,75,24.9,0 +3,2025/10/10 9:15,19.3,13,1020,0,56,0,19.3,0.3 +4,2025/10/10 10:15,14.2,20.2,1025,0,63,0,12.7,0.5 +0,2025/10/11 11:00,22,12.2,1022,0,43,0,24.3,2.5 +1,2025/10/11 10:00,13,5,1026,0,94,0,13.2,1.4 +2,2025/10/11 17:00,17,24.5,1018,0.08,94,75,17,0 +3,2025/10/11 8:45,19,14.4,1020,0,64,0,19,0 +4,2025/10/11 9:45,15.1,18,1025,0,63,0,15.1,0 +0,2025/10/12 10:45,20.3,14.8,1024,0,43,25,20.3,1.3 +1,2025/10/12 10:00,19.3,3.6,1024,0,68,0,19.3,1.2 +2,2025/10/12 17:00,23.1,10.1,1010,0,73,75,25.1,0 +3,2025/10/12 8:45,19.2,16.2,1017,0,60,25,19.2,0 +4,2025/10/12 10:00,15.2,14,1022,0,72,75,15.2,0.2 +0,2025/10/13 11:15,19.4,3.6,1020,0,46,25,19.4,2.3 +1,2025/10/13 10:00,18.2,3.6,1020,0,68,0,18.2,1.3 +2,2025/10/13 17:00,24.3,22.7,1009,0,74,25,26.1,0 +3,2025/10/13 9:00,19.2,6.5,1015,0,64,0,19.2,0.3 +4,2025/10/13 10:15,16.4,9.7,1020,0.12,77,100,16.4,0.3 +0,2025/10/14 11:15,21.1,3.6,1020,0,53,25,21.1,2.5 +1,2025/10/14 10:15,18.3,5.4,1020,0,73,0,18.3,0.9 +2,2025/10/14 17:15,20.4,17.3,1019,0.01,64,75,20.4,0 +3,2025/10/14 9:15,18.2,6.5,1017,0,68,0,18.2,0.3 +4,2025/10/14 10:15,16.1,3.6,1020,0,68,0,16.1,0.5 +0,2025/10/15 11:00,20.2,7.9,1020,0,60,25,20.2,1.1 +1,2025/10/15 10:00,16.1,3.6,1017,0,82,0,16.1,1 +2,2025/10/15 17:00,19,21.2,1022,0,83,75,19,0 +3,2025/10/15 9:00,16.3,6.5,1017,0,72,0,16.3,0.3 +4,2025/10/15 10:00,15.2,3.6,1021,0,67,0,15.2,0.4 +0,2025/10/16 11:00,20.2,19.1,1020,0,56,25,20.2,2.2 +1,2025/10/16 9:45,14.4,11.5,1015,0,67,0,13.7,0.4 +2,2025/10/16 17:00,21.1,21.2,1014,0,83,75,21.1,0 +3,2025/10/16 8:45,21.1,3.6,1015,0,43,0,21.1,0 +4,2025/10/16 10:00,15,5.8,1019,0,59,0,15.3,0.4 +0,2025/10/17 11:00,20.4,5.4,1020,0,56,50,20.4,2.1 +1,2025/10/17 10:00,16.1,8.3,1015,0,59,0,16.1,1 +2,2025/10/17 17:00,24.2,20.2,1022,0,54,25,25.4,0 +3,2025/10/17 9:00,16.2,5.8,1014,0,77,0,16.2,0.2 +4,2025/10/17 10:00,15.3,9,1018,0,63,0,15.3,0.4 +0,2025/10/18 11:00,23.1,5,1020,0,61,25,25,2 +1,2025/10/18 10:00,14.4,3.6,1020,0.05,82,0,15.1,1.1 +2,2025/10/18 16:45,24.3,35.6,1015,0,69,50,25.5,0.4 +3,2025/10/18 9:00,15.3,4.3,1017,0,88,0,15.3,0.2 +4,2025/10/18 10:00,13.2,5,1021,0,72,0,13.4,0.4 +0,2025/10/19 10:45,17.4,3.6,1020,0.98,88,100,17.4,0.3 +1,2025/10/19 9:15,15.3,7.2,1020,0,72,0,15.3,0.4 +2,2025/10/19 16:15,20,21.6,1021,0.06,68,75,20,0.1 +3,2025/10/19 8:30,19.4,8.6,1015,0,94,75,19.4,0 +4,2025/10/19 9:30,12.3,8.3,1019,0,62,0,11.7,0 +0,2025/10/20 10:45,18.2,11.2,1016,0.07,83,75,18.2,0.3 +1,2025/10/20 10:00,17.2,6.1,1015,0.02,77,50,17.2,0.8 +2,2025/10/20 16:45,20.1,13.7,1017,0.05,78,75,20.1,0.1 +3,2025/10/20 9:00,17.2,4,1015,0,94,75,17.2,0.2 +4,2025/10/20 10:00,16.3,24.8,1013,0.01,88,50,16.3,0.3 +0,2025/10/21 11:00,19.2,3.6,1014,0.01,88,75,19.2,1.8 +1,2025/10/21 9:45,16.4,17.3,1009,0.06,77,75,16.4,0.1 +2,2025/10/21 16:45,16,15.8,1026,0.02,55,75,16,0.1 +3,2025/10/21 9:15,20,13.3,1014,0.14,100,75,20,0.2 +4,2025/10/21 10:00,14.2,22.3,1013,0,94,75,12.5,0.2 +0,2025/10/22 10:30,21.3,6.8,1014,0,73,25,21.3,0.8 +1,2025/10/22 9:30,16.2,8.3,1009,0.01,88,50,16.2,0.3 +2,2025/10/22 17:00,12.2,19.1,1028,0.98,88,75,10.2,0 +3,2025/10/22 9:00,20.2,10.4,1017,0.01,94,25,20.2,0.1 +4,2025/10/22 9:30,14.2,19.1,1016,0,94,25,12.8,0 +0,2025/10/23 11:00,19.3,8.3,1013,0,73,25,19.3,1.6 +1,2025/10/23 10:00,17.3,19.1,1008,0.05,94,75,17.3,0.7 +2,2025/10/23 17:00,17.3,17.3,1025,0,55,75,17.3,0 +3,2025/10/23 9:00,21.2,11.2,1020,0,88,50,21.2,0.2 +4,2025/10/23 9:30,17.3,31.3,1016,0.02,88,50,17.3,0 +0,2025/10/24 11:15,23.2,14.8,1009,0,65,25,25,2.1 +1,2025/10/24 10:00,17.3,8.6,1010,0,59,0,17.3,0.8 +2,2025/10/24 16:45,16.1,20.5,1025,0.05,68,75,16.1,0.2 +3,2025/10/24 9:15,20,11.5,1017,0.03,100,75,20,0.2 +4,2025/10/24 10:15,15,11.9,1018,0,82,25,14.4,0.2 +0,2025/10/25 10:30,23.1,3.6,1014,0,44,25,24.7,1 +1,2025/10/25 10:00,18.2,18,1014,0.92,73,50,18.2,0.7 +2,2025/10/25 16:45,13.4,20.9,1023,0.11,94,75,11.6,0.1 +3,2025/10/25 8:45,20.1,12.2,1014,0.34,94,75,20.1,0 +4,2025/10/25 9:45,15.4,18.4,1015,0,88,0,15.4,0 +0,2025/10/26 9:45,22.2,8.3,1013,0,61,0,24.6,1 +1,2025/10/26 8:45,18.2,11.9,1007,0,88,75,18.2,0.2 +2,2025/10/26 17:00,16.3,10.8,1009,0.06,100,75,16.3,0 +3,2025/10/26 7:45,15.2,7.9,1016,0,88,25,15.2,0 +4,2025/10/26 8:30,11.3,18.7,1018,0.1,87,75,9.1,0 +0,2025/10/27 10:00,24.3,11.5,1008,0,65,25,25.6,2 +1,2025/10/27 8:45,13.2,9.4,1011,0,88,0,12.6,0.3 +2,2025/10/27 17:15,21.1,15.8,1008,0.35,64,50,21.1,0 +3,2025/10/27 8:15,16.1,11.9,1020,0,68,0,16.1,0.1 +4,2025/10/27 9:00,6.3,4.7,1024,0,81,0,5.7,0.3 +0,2025/10/28 10:00,22,10.8,1012,0,35,0,24.4,1.8 +1,2025/10/28 8:30,13.1,8.6,1015,0,82,0,12.5,0.3 +2,2025/10/28 17:00,19,15.1,1018,0.01,43,75,19,0 +3,2025/10/28 8:00,18.4,11.9,1015,0.32,94,75,18.4,0.1 +4,2025/10/28 9:00,10.3,6.5,1021,0,66,0,9.7,0.3 +0,2025/10/29 9:45,20.1,9.4,1023,0,56,50,20.1,0.8 +1,2025/10/29 8:45,18.2,5,1020,0,68,25,18.2,0.1 +2,2025/10/29 17:00,16.3,17.6,1027,0,45,25,16.3,0 +3,2025/10/29 7:30,16.1,7.6,1007,0.03,100,75,16.1,0 +4,2025/10/29 9:00,11,11.2,1010,0.03,94,100,9.7,0.2 +0,2025/10/30 9:45,19.3,3.6,1021,0,60,0,19.3,0.8 +1,2025/10/30 8:45,18.1,15.8,1015,0,68,50,18.1,0.2 +2,2025/10/30 16:45,18.1,12.2,1026,0,49,25,18.1,0.3 +3,2025/10/30 7:30,15.3,7.6,1014,0,100,50,15.3,0 +4,2025/10/30 8:45,12.4,6.1,1015,0,94,100,12.2,0 +0,2025/10/31 10:15,18.1,3.6,1021,0,68,25,18.1,1.2 +1,2025/10/31 9:15,19,4,1016,0,73,75,19,0.8 +2,2025/10/31 17:00,15.1,19.4,1016,0.02,77,75,15.1,0 +3,2025/10/31 8:15,19.3,24.1,1012,0.01,88,75,19.3,0.1 +4,2025/10/31 9:00,10.1,9.4,1017,0,94,25,8.9,0.2 +0,2025/11/1 10:15,20.2,3.6,1021,0,73,25,20.2,1.4 +1,2025/11/1 9:15,16.1,5.4,1020,0,94,0,16.1,0.8 +2,2025/11/1 17:15,21.1,8.6,1002,0.12,56,75,21.1,0 +3,2025/11/1 8:15,18,23.4,1014,0.02,100,75,18,0.1 +4,2025/11/1 8:30,13.1,9,1019,0,82,75,12.5,0 +0,2025/11/2 10:00,20.4,3.6,1021,0,68,75,20.4,1.6 +1,2025/11/2 9:00,15.3,3.6,1020,0,100,0,15.3,0.7 +2,2025/11/2 16:45,19.2,6.5,1009,0,60,25,19.2,0.2 +3,2025/11/2 8:00,13.1,7.9,1025,0,88,25,12.7,0.1 +4,2025/11/2 8:15,12.1,9.7,1023,0,67,25,11.2,0 +0,2025/11/3 10:15,21.1,7.2,1020,0,73,50,21.1,1.3 +1,2025/11/3 9:15,15.4,15.5,1014,0,100,25,15.4,0.7 +2,2025/11/3 17:15,16.4,33.5,1018,0,42,25,16.4,0 +3,2025/11/3 8:15,10.4,7.6,1023,0,94,25,9.6,0.1 +4,2025/11/3 9:15,9.2,7.6,1026,0,62,0,8.2,0.2 +0,2025/11/4 10:00,20.1,4,1018,0,83,50,20.1,1.4 +1,2025/11/4 9:15,12.1,11.2,1023,0,77,0,11,0.8 +2,2025/11/4 16:30,16.3,6.1,1027,0,36,25,16.3,0.2 +3,2025/11/4 8:30,14.4,12.2,1017,0,88,0,13.6,0.1 +4,2025/11/4 8:45,7.3,6.5,1023,0,76,0,6.2,0 +0,2025/11/5 10:15,18.4,12.2,1019,0.52,68,75,18.4,0.3 +1,2025/11/5 9:00,11,6.1,1022,0,66,0,10.6,0.8 +2,2025/11/5 17:00,14.4,14.4,1024,0,59,100,13.4,0 +3,2025/11/5 8:00,20.2,24.8,1005,1,100,75,20.2,0 +4,2025/11/5 9:00,12.3,11.9,1017,0,82,50,11.1,0.2 +0,2025/11/6 10:00,17.1,13.7,1015,0.01,72,75,17.1,1.2 +1,2025/11/6 8:45,9.4,4.3,1017,0,87,0,9.3,0.2 +2,2025/11/6 16:45,18.4,13.3,1015,0,60,50,18.4,0.2 +3,2025/11/6 7:45,12.2,19.1,1017,0.18,88,25,10.2,0 +4,2025/11/6 8:15,7,20.2,1014,0,93,0,3.6,0 +0,2025/11/7 9:30,19.1,5.4,1015,0,60,25,19.1,0.7 +1,2025/11/7 9:00,13,5.8,1012,0,88,25,13,0.6 +2,2025/11/7 17:00,18.1,17.3,1019,0,32,25,18.1,0 +3,2025/11/7 8:30,18.1,20.5,1016,0.04,88,75,18.1,0 +4,2025/11/7 9:15,8.1,13.3,1016,0.01,93,50,5.8,0.2 +0,2025/11/8 10:15,20.3,27.4,1016,0.15,73,75,20.3,1.2 +1,2025/11/8 9:15,12.2,6.1,1010,0,82,0,12,0.6 +2,2025/11/8 17:00,16,15.5,1025,0,48,25,16,0 +3,2025/11/8 7:30,14.3,7.9,1021,0.01,88,25,14.1,0 +4,2025/11/8 9:00,8.2,10.1,1018,0,71,25,6.5,0.2 +0,2025/11/9 9:45,22.1,7.2,1018,0.01,73,50,24.6,0.6 +1,2025/11/9 8:45,12.4,9.4,1013,0,82,0,11.6,0.2 +2,2025/11/9 16:45,13.2,9,1012,0.67,88,75,12.6,0 +3,2025/11/9 7:45,10.4,5.4,1022,0,94,25,10.1,0 +4,2025/11/9 8:45,4.1,3.6,1022,0,87,0,3.7,0 +0,2025/11/10 9:45,23.1,14,1015,0.92,69,75,25.1,0.5 +1,2025/11/10 8:45,10.4,7.9,1014,0,87,0,9.5,0.2 +2,2025/11/10 16:45,16.2,41.8,1006,0,45,50,16.2,0.2 +3,2025/11/10 7:45,15.4,3.6,1019,0,100,25,15.4,0 +4,2025/11/10 8:45,4.4,3.6,1019,0,100,0,4,0 +0,2025/11/11 9:45,20.1,9,1014,0,56,25,20.1,0.6 +1,2025/11/11 8:45,8.2,8.3,1019,0,87,0,6.8,0.2 +2,2025/11/11 16:45,15.2,7.6,1016,0,39,75,15.2,0.2 +3,2025/11/11 7:45,14,14.4,1014,0.01,100,75,12.9,0 +4,2025/11/11 8:45,9.2,3.6,1018,0,100,100,9.4,0 +0,2025/11/12 9:30,19.3,9.4,1020,0,49,25,19.3,0.5 +1,2025/11/12 8:30,8.3,7.2,1023,0,87,0,7.2,0.2 +2,2025/11/12 16:30,13.1,11.9,1022,0,47,25,12.1,0.2 +3,2025/11/12 7:30,18.3,34.2,1004,0.11,88,75,18.3,0 +4,2025/11/12 8:30,9.3,9.7,1013,0,76,0,7.9,0 +0,2025/11/13 9:30,18.3,8.3,1023,0,49,25,18.3,0.6 +1,2025/11/13 8:30,9.3,6.5,1025,0,87,0,8.5,0.2 +2,2025/11/13 16:30,13,7.2,1012,0,54,75,12.7,0.1 +3,2025/11/13 7:30,16.2,38.9,1000,4.97,100,50,16.2,0 +4,2025/11/13 8:30,13,20.9,1012,0,82,0,11.1,0 +0,2025/11/14 9:30,16.1,5,1022,0,59,0,16.1,0.6 +1,2025/11/14 8:30,10.2,5,1024,0,100,50,10,0.1 +2,2025/11/14 16:30,18.4,12.6,1014,0.01,45,75,18.4,0.2 +3,2025/11/14 7:30,15.4,32.4,1003,2.07,82,25,15.4,0 +4,2025/11/14 8:30,11,24.5,1008,0.07,94,75,8.3,0 +0,2025/11/15 9:30,16.3,6.1,1019,0,72,0,16.3,0.6 +1,2025/11/15 8:30,11.2,6.8,1019,0,94,25,10.7,0.1 +2,2025/11/15 16:30,16.2,6.1,1024,0,48,50,16.2,0.2 +3,2025/11/15 7:30,16.4,25.2,1006,0.27,94,75,16.4,0 +4,2025/11/15 8:30,9.1,18,1011,0.13,93,75,6.5,0 +0,2025/11/16 9:15,15.1,4.3,1018,0,77,0,15.1,0.6 +1,2025/11/16 8:15,16.1,6.8,1015,0,77,50,16.1,0.1 +2,2025/11/16 16:15,17.3,11.9,1026,0,55,25,17.3,0.2 +3,2025/11/16 7:15,14.2,19.1,1011,0.05,100,25,12.8,0 +4,2025/11/16 8:15,9,12.2,1010,0.01,93,75,7.1,0 +0,2025/11/17 9:15,15.4,6.5,1021,0,82,75,15.4,0.5 +1,2025/11/17 8:15,16.4,8.6,1009,0.22,82,25,16.4,0.1 +2,2025/11/17 16:15,21,10.8,1008,0,40,0,21,0.2 +3,2025/11/17 7:15,12.2,14.4,1013,0,100,50,10.7,0 +4,2025/11/17 8:15,8.4,4.7,1013,0.06,100,100,8.1,0 +0,2025/11/18 9:30,20.1,10.8,1021,0,78,50,20.1,0.5 +1,2025/11/18 8:30,15.4,7.6,1010,0.39,88,50,15.4,0 +2,2025/11/18 16:30,13,3.6,1009,0.04,41,75,13.6,0.1 +3,2025/11/18 7:30,12,8.3,1019,0,77,0,11.3,0 +4,2025/11/18 8:30,4.1,4,1018,0,93,0,3.5,0 +0,2025/11/19 9:15,19.1,10.1,1017,0,78,75,19.1,0.4 +1,2025/11/19 8:15,10.2,7.6,1010,0.03,71,0,9.3,0.1 +2,2025/11/19 16:15,14.1,4.3,1020,0,33,50,14.6,0.2 +3,2025/11/19 7:15,13.2,6.1,1017,0,82,75,13.1,0 +4,2025/11/19 8:15,3.1,3.6,1016,0,87,0,2.6,0 +0,2025/11/20 9:15,17.4,22.3,1017,0,72,25,17.4,0.5 +1,2025/11/20 8:15,9.3,9,1009,0.35,100,50,8,0.1 +2,2025/11/20 16:15,15.2,7.6,1019,0,41,25,15.2,0.2 +3,2025/11/20 7:15,11.3,9,1019,0,82,25,10.4,0 +4,2025/11/20 8:15,2.3,6.5,1017,0,87,50,0.5,0 +0,2025/11/21 9:15,21.2,23.8,1017,0.01,60,50,21.2,0.5 +1,2025/11/21 8:15,11.4,11.9,1006,0,71,25,10,0 +2,2025/11/21 16:15,17.4,12.6,1012,0,45,25,17.4,0.2 +3,2025/11/21 7:15,10.1,18,1026,0,62,0,7.7,0 +4,2025/11/21 8:15,4.1,6.1,1022,0,65,25,2.7,0 +0,2025/11/22 9:15,21.1,26.6,1017,0.68,64,75,21.1,0.5 +1,2025/11/22 8:15,5.2,7.2,1010,0,93,50,3.6,0 +2,2025/11/22 16:15,15.1,6.5,1023,0,41,25,15.1,0.1 +3,2025/11/22 7:15,6,13,1030,0,81,0,3.3,0 +4,2025/11/22 8:15,-2.6,3.6,1029,0,93,0,-3.7,0 +0,2025/11/23 9:15,16.3,11.2,1015,0,72,50,16.3,0.5 +1,2025/11/23 8:15,3.3,9.4,1017,0,87,0,0.8,0 +2,2025/11/23 16:15,16,6.1,1021,0,55,50,16,0.1 +3,2025/11/23 7:15,9.2,3.6,1027,0,87,0,9.4,0 +4,2025/11/23 8:15,2.3,5.8,1024,0,80,0,0.7,0 +0,2025/11/24 9:15,15.3,8.6,1020,0,48,25,15.3,0.4 +1,2025/11/24 8:15,8.4,13,1015,0.5,87,75,6.2,0 +2,2025/11/24 16:15,16.2,3.6,1015,0,55,25,16.2,0.1 +3,2025/11/24 7:15,15,22.3,1020,0.05,94,75,13.5,0 +4,2025/11/24 8:15,9.1,21.6,1016,0,87,100,6.1,0 +0,2025/11/25 9:30,14.3,5,1018,0,72,25,14.6,0.5 +1,2025/11/25 8:30,14.1,20.2,1001,2.74,94,75,12.5,0 +2,2025/11/25 16:30,11.2,10.1,1010,0.06,94,75,10.1,0.1 +3,2025/11/25 7:30,10,17.3,1022,0,87,25,7.7,0 +4,2025/11/25 8:30,4.4,7.6,1016,0,75,0,2.6,0 +0,2025/11/26 9:00,17.4,19.8,1013,0,77,25,17.4,0.4 +1,2025/11/26 8:00,11,9,1004,0.55,71,75,10,0 +2,2025/11/26 16:00,18.3,28.4,1015,0,39,25,18.3,0.1 +3,2025/11/26 7:15,10.1,7.6,1025,0,76,0,9.2,0 +4,2025/11/26 8:15,1.2,6.5,1023,0,80,0,-0.8,0 +0,2025/11/27 9:15,16.3,34.6,1014,0.49,77,50,16.3,0.4 +1,2025/11/27 8:15,8.3,16.9,1007,0.05,81,50,5.6,0 +2,2025/11/27 16:15,15.3,22.3,1017,0.04,59,75,15.3,0.1 +3,2025/11/27 7:15,9.1,7.6,1024,0,71,0,8.1,0 +4,2025/11/27 8:15,0.2,3.6,1024,0,86,0,-0.6,0 +0,2025/11/28 9:30,12.2,32,1014,1.61,94,75,9.3,0.4 +1,2025/11/28 8:30,7.2,10.8,1013,0,81,50,5.1,0 +2,2025/11/28 16:30,17.2,20.9,1008,0,34,25,17.2,0.1 +3,2025/11/28 7:30,10.2,7.6,1023,0,87,0,9.3,0 +4,2025/11/28 8:45,4.3,4,1021,0,75,0,3.8,0 +0,2025/11/29 9:15,10.2,9.4,1009,0,87,25,9,0.4 +1,2025/11/29 8:15,3.1,9,1013,0,87,0,0.6,0 +2,2025/11/29 16:00,14.1,9,1016,0.02,36,75,13.7,0.1 +3,2025/11/29 7:15,12.1,9.7,1020,0,88,100,11.2,0 +4,2025/11/29 8:15,1.2,3.6,1018,0,100,0,0.5,0 +0,2025/11/30 8:45,9.2,6.5,1013,0,81,25,8.4,0 +1,2025/11/30 7:45,2.1,7.2,1015,0,93,0,0,0 +2,2025/11/30 15:45,16.1,5,1017,0,45,25,16.1,0.6 +3,2025/11/30 7:00,11.2,23.4,1018,0,76,25,8.6,0 +4,2025/11/30 7:45,6.4,4.3,1013,0.32,100,60,5.9,0 +0,2025/12/1 9:30,14.3,5.4,1018,0,63,0,14.5,0.4 +1,2025/12/1 8:30,6.2,5.8,1018,0,75,0,5.2,0 +2,2025/12/1 16:30,19,3.6,1012,0,46,25,19,0.1 +3,2025/12/1 7:30,7.4,8.6,1021,0,76,0,5.8,0 +4,2025/12/1 8:30,1.1,4.7,1021,0,93,0,-0.2,0 +0,2025/12/2 9:15,11.4,4.3,1022,0,82,25,11.6,0.4 +1,2025/12/2 8:15,10.2,7.9,1016,0.07,100,100,9.3,0 +2,2025/12/2 16:15,16.1,6.5,1012,0,68,50,16.1,0.1 +3,2025/12/2 7:15,10.3,19.1,1018,0.01,100,25,7.8,0 +4,2025/12/2 8:15,4.4,13,1015,0,87,75,1.4,0 +0,2025/12/3 9:00,15.1,7.2,1020,0.02,77,50,15.1,0.3 +1,2025/12/3 8:00,5,6.5,1013,0,93,0,3.6,0 +2,2025/12/3 16:00,13.2,4.7,1001,0,72,25,13.5,0.1 +3,2025/12/3 7:00,9.2,14.4,1022,0.02,81,25,7,0 +4,2025/12/3 8:15,4.2,8.3,1014,0,81,0,2.1,0 +0,2025/12/4 9:00,14.3,10.4,1014,0.72,100,75,13.7,0.1 +1,2025/12/4 8:00,6.2,7.9,1008,0,93,50,4.6,0 +2,2025/12/4 16:00,10.1,20.2,1015,0,23,25,7.5,0.1 +3,2025/12/4 7:00,14.3,22,1021,0.56,100,75,12.7,0 +4,2025/12/4 8:00,6,16.2,1016,0.03,100,100,2.8,0 +0,2025/12/5 9:15,12.1,5,1001,0.55,100,75,12.1,0.1 +1,2025/12/5 8:15,7.1,7.2,1004,0.08,100,75,5.8,0 +2,2025/12/5 16:15,10.3,8.6,1016,0,34,25,9.2,0.1 +3,2025/12/5 7:15,16,18.4,1020,0.19,100,75,16,0 +4,2025/12/5 8:15,6.2,16.6,1018,0,75,0,3,0 +0,2025/12/6 9:15,10.3,3.6,1004,0,94,25,10.6,0.3 +1,2025/12/6 8:15,6.1,9,1012,0,93,0,4.2,0 +2,2025/12/6 16:15,12.2,5.4,1021,0,44,25,12.2,0.1 +3,2025/12/6 7:15,15.4,9,1023,0,94,25,15.4,0 +4,2025/12/6 8:15,11.4,11.9,1022,0,94,75,10,0 diff --git a/dataset/s.csv b/dataset/s.csv new file mode 100644 index 0000000000000000000000000000000000000000..66dc9051da651c15d98d017a88658263cab28f02 --- /dev/null +++ b/dataset/s.csv @@ -0,0 +1 @@ +undefined \ No newline at end of file diff --git a/experiments/exp_basic.cpython-310.pyc b/experiments/exp_basic.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..00cfe351b249f352a55f19a6e0f9307494a3d5f1 Binary files /dev/null and b/experiments/exp_basic.cpython-310.pyc differ diff --git a/experiments/exp_basic.py b/experiments/exp_basic.py new file mode 100644 index 0000000000000000000000000000000000000000..1605608f46f60fcb8ecc9af7e9ab9da860bedd3f --- /dev/null +++ b/experiments/exp_basic.py @@ -0,0 +1,40 @@ +import os +import torch +from model import MambaClimateNet + + +class Exp_Basic(object): + def __init__(self, args): + self.args = args + self.model_dict = { + 'MambaClimateNet': MambaClimateNet, + } + self.device = self._acquire_device() + self.model = self._build_model().to(self.device) + + def _build_model(self): + raise NotImplementedError + return None + + def _acquire_device(self): + if self.args.use_gpu: + os.environ["CUDA_VISIBLE_DEVICES"] = str( + self.args.gpu) if not self.args.use_multi_gpu else self.args.devices + device = torch.device('cuda:{}'.format(self.args.gpu)) + print('Use GPU: cuda:{}'.format(self.args.gpu)) + else: + device = torch.device('cpu') + print('Use CPU') + return device + + def _get_data(self): + pass + + def vali(self): + pass + + def train(self): + pass + + def test(self): + pass diff --git a/experiments/exp_long_term_forecasting.cpython-310.pyc b/experiments/exp_long_term_forecasting.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02e65e402457b3dedf8f65a14af66e1e045c67ce Binary files /dev/null and b/experiments/exp_long_term_forecasting.cpython-310.pyc differ diff --git a/experiments/exp_long_term_forecasting.py b/experiments/exp_long_term_forecasting.py new file mode 100644 index 0000000000000000000000000000000000000000..43e08c3c4b7f331d00c15d3e7d7bf23ade7a4ac7 --- /dev/null +++ b/experiments/exp_long_term_forecasting.py @@ -0,0 +1,351 @@ +import random + +from data_provider.data_factory import data_provider +from experiments.exp_basic import Exp_Basic +from utils.tools import EarlyStopping, adjust_learning_rate, visual +from utils.metrics import metric +import torch +import torch.nn as nn +from torch import optim +import os +import time +import warnings +import numpy as np +import csv + +warnings.filterwarnings('ignore') + + +class Exp_Long_Term_Forecast(Exp_Basic): + def __init__(self, args): + super(Exp_Long_Term_Forecast, self).__init__(args) + + def _build_model(self): + model = self.model_dict[self.args.model].Model(self.args).float() + + if self.args.use_multi_gpu and self.args.use_gpu: + model = nn.DataParallel(model, device_ids=self.args.device_ids) + return model + + def _get_data(self, flag): + data_set, data_loader = data_provider(self.args, flag) + return data_set, data_loader + + def _select_optimizer(self): + model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate) + return model_optim + + def _select_criterion(self): + criterion = nn.MSELoss() + return criterion + + def vali(self, vali_data, vali_loader, criterion): + total_loss = [] + self.model.eval() + with torch.no_grad(): + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(vali_loader): + batch_x = batch_x.float().to(self.device) + batch_y = batch_y.float() + + if 'PEMS' in self.args.data or 'Solar' in self.args.data: + batch_x_mark = None + batch_y_mark = None + else: + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, f_dim:] + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + + pred = outputs.detach().cpu() + true = batch_y.detach().cpu() + + loss = criterion(pred, true) + + total_loss.append(loss) + total_loss = np.average(total_loss) + self.model.train() + return total_loss + + def train(self, setting): + train_data, train_loader = self._get_data(flag='train') + vali_data, vali_loader = self._get_data(flag='val') + test_data, test_loader = self._get_data(flag='test') + + path = os.path.join(self.args.checkpoints, setting) + if not os.path.exists(path): + os.makedirs(path) + + time_now = time.time() + + train_steps = len(train_loader) + early_stopping = EarlyStopping(patience=self.args.patience, verbose=True) + + model_optim = self._select_optimizer() + criterion = self._select_criterion() + + if self.args.use_amp: + scaler = torch.cuda.amp.GradScaler() + + for epoch in range(self.args.train_epochs): + iter_count = 0 + train_loss = [] + + self.model.train() + epoch_time = time.time() + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(train_loader): + iter_count += 1 + model_optim.zero_grad() + batch_x = batch_x.float().to(self.device) + batch_y = batch_y.float().to(self.device) + if 'PEMS' in self.args.data or 'Solar' in self.args.data: + batch_x_mark = None + batch_y_mark = None + else: + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, f_dim:] + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + loss = criterion(outputs, batch_y) + train_loss.append(loss.item()) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, f_dim:] + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + loss = criterion(outputs, batch_y) + train_loss.append(loss.item()) + + if (i + 1) % 100 == 0: + print("\titers: {0}, epoch: {1} | loss: {2:.7f}".format(i + 1, epoch + 1, loss.item())) + speed = (time.time() - time_now) / iter_count + # print(speed) + # allocated_memory = torch.cuda.memory_allocated() / (1024 * 1024 * 1024) + # cached_memory = torch.cuda.memory_cached() / (1024 * 1024 * 1024) + # total = allocated_memory + cached_memory + # print('allocated_memory:', allocated_memory) + # print('cached_memory:', cached_memory) + # print('total:', total) + left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i) + print('\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time)) + iter_count = 0 + time_now = time.time() + + if self.args.use_amp: + scaler.scale(loss).backward() + scaler.step(model_optim) + scaler.update() + else: + loss.backward() + model_optim.step() + + print("Epoch: {} cost time: {}".format(epoch + 1, time.time() - epoch_time)) + train_loss = np.average(train_loss) + vali_loss = self.vali(vali_data, vali_loader, criterion) + test_loss = self.vali(test_data, test_loader, criterion) + + print("Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}".format( + epoch + 1, train_steps, train_loss, vali_loss, test_loss)) + early_stopping(vali_loss, self.model, path) + if early_stopping.early_stop: + print("Early stopping") + break + + adjust_learning_rate(model_optim, epoch + 1, self.args) + + # get_cka(self.args, setting, self.model, train_loader, self.device, epoch) + + best_model_path = path + '/' + 'checkpoint.pth' + self.model.load_state_dict(torch.load(best_model_path)) + + return self.model + + def test(self, setting, test=0): + test_data, test_loader = self._get_data(flag='test') + if test: + print('loading model') + self.model.load_state_dict(torch.load(os.path.join('./checkpoints/' + setting, 'checkpoint.pth'))) + + preds = [] + trues = [] + folder_path = './test_results/' + setting + '/' + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + self.model.eval() + with torch.no_grad(): + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader): + batch_x = batch_x.float().to(self.device) + batch_y = batch_y.float().to(self.device) + if 'PEMS' in self.args.data or 'Solar' in self.args.data: + batch_x_mark = None + batch_y_mark = None + else: + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, :] + batch_y = batch_y[:, -self.args.pred_len:, :].to(self.device) + outputs = outputs.detach().cpu().numpy() + batch_y = batch_y.detach().cpu().numpy() + if test_data.scale and self.args.inverse: + shape = batch_y.shape + if self.args.features == 'MS': + outputs = np.tile(outputs, [1, 1, batch_y.shape[-1]]) + outputs = test_data.inverse_transform(outputs.reshape(shape[0] * shape[1], -1)).reshape(shape) + batch_y = test_data.inverse_transform(batch_y.reshape(shape[0] * shape[1], -1)).reshape(shape) + + outputs = outputs[:, :, f_dim:] + batch_y = batch_y[:, :, f_dim:] + + pred = outputs + true = batch_y + + preds.append(pred) + trues.append(true) + if i % 20 == 0: + input = batch_x.detach().cpu().numpy() + if test_data.scale and self.args.inverse: + shape = input.shape + input = test_data.inverse_transform(input.reshape(shape[0] * shape[1], -1)).reshape(shape) + gt = np.concatenate((input[0, :, -1], true[0, :, -1]), axis=0) + pd = np.concatenate((input[0, :, -1], pred[0, :, -1]), axis=0) + visual(gt, pd, os.path.join(folder_path, str(i) + '.pdf')) + + preds = np.array(preds) + trues = np.array(trues) + print('test shape:', preds.shape, trues.shape) + preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1]) + trues = trues.reshape(-1, trues.shape[-2], trues.shape[-1]) + print('test shape:', preds.shape, trues.shape) + + # result save + folder_path = './results/' + setting + '/' + if not os.path.exists(folder_path): + os.makedirs(folder_path) + mae, mse, rmse, mape, mspe,corr = metric(preds, trues) + + + print('mse:{}, mae:{}'.format(mse, mae)) + f = open("result_long_term_forecast.txt", 'a') + f.write(setting + " \n") + f.write('mse:{}, mae:{}'.format(mse, mae)) + f.write('\n') + f.write('\n') + f.close() + + np.save(folder_path + 'metrics.npy', np.array([mae, mse, rmse, mape, mspe])) + np.save(folder_path + 'pred.npy', preds) + np.save(folder_path + 'true.npy', trues) + + return + def get_input(self, setting): + test_data, test_loader = self._get_data(flag='test') + inputs = [] + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader): + input = batch_x.detach().cpu().numpy() + inputs.append((input)) + folder_path = './results/' + setting + '/' + np.save(folder_path + 'input.npy', inputs) + + def predict(self, setting, load=False): + pred_data, pred_loader = self._get_data(flag='pred') + + if load: + path = os.path.join(self.args.checkpoints, setting) + best_model_path = path + '/' + 'checkpoint.pth' + self.model.load_state_dict(torch.load(best_model_path)) + + preds = [] + + self.model.eval() + with torch.no_grad(): + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(pred_loader): + batch_x = batch_x.float().to(self.device) + batch_y = batch_y.float() + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + outputs = outputs.detach().cpu().numpy() + if pred_data.scale and self.args.inverse: + shape = outputs.shape + outputs = pred_data.inverse_transform(outputs.squeeze(0)).reshape(shape) + preds.append(outputs) + + preds = np.array(preds) + preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1]) + + # result save + folder_path = './results/' + setting + '/' + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + np.save(folder_path + 'real_prediction.npy', preds) + + return \ No newline at end of file diff --git a/experiments/exp_long_term_forecasting_partial.cpython-310.pyc b/experiments/exp_long_term_forecasting_partial.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8da7a134d7a8ce481bd34d7ef5a37c70f72bca6 Binary files /dev/null and b/experiments/exp_long_term_forecasting_partial.cpython-310.pyc differ diff --git a/experiments/exp_long_term_forecasting_partial.py b/experiments/exp_long_term_forecasting_partial.py new file mode 100644 index 0000000000000000000000000000000000000000..150b7733fcacbdd57c7e7e82fe2bb43b10601f16 --- /dev/null +++ b/experiments/exp_long_term_forecasting_partial.py @@ -0,0 +1,397 @@ +from data_provider.data_factory import data_provider +from experiments.exp_basic import Exp_Basic +from utils.tools import EarlyStopping, adjust_learning_rate, visual +from utils.metrics import metric +import torch +import torch.nn as nn +from torch import optim +import os +import time +import warnings +import pdb +import numpy as np +import random + +warnings.filterwarnings('ignore') + + +# train on partial variate data and test on the full variates, used for two types of experiments: +# (1) Generalize on unseen variate (Figure 5 of our paper) +# (2) Efficient training strategy (Figure 8 of our paper) +class Exp_Long_Term_Forecast_Partial(Exp_Basic): + def __init__(self, args): + super(Exp_Long_Term_Forecast_Partial, self).__init__(args) + + def _build_model(self): + model = self.model_dict[self.args.model].Model(self.args).float() + + if self.args.use_multi_gpu and self.args.use_gpu: + model = nn.DataParallel(model, device_ids=self.args.device_ids) + return model + + def _get_data(self, flag): + data_set, data_loader = data_provider(self.args, flag) + return data_set, data_loader + + def _select_optimizer(self): + model_optim = optim.Adam(self.model.parameters(), lr=self.args.learning_rate) + return model_optim + + def _select_criterion(self): + criterion = nn.MSELoss() + return criterion + + def vali(self, vali_data, vali_loader, criterion, partial_train=False): + total_loss = [] + self.model.eval() + with torch.no_grad(): + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(vali_loader): + batch_x = batch_x.float().to(self.device) + batch_y = batch_y.float() + + if 'PEMS' in self.args.data or 'Solar' in self.args.data: + batch_x_mark = None + batch_y_mark = None + else: + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + if partial_train: # we train models with only partial variates from the dataset + partial_start = self.args.partial_start_index + partial_end = min(self.args.enc_in + partial_start, batch_x.shape[-1]) + batch_x = batch_x[:, :, partial_start:partial_end] + batch_y = batch_y[:, :, partial_start:partial_end] + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + elif self.args.channel_independence: + B, Tx, N = batch_x.shape + _, Ty, _ = dec_inp.shape + if batch_x_mark == None: + outputs = self.model(batch_x.permute(0, 2, 1).reshape(B * N, Tx, 1), batch_x_mark, \ + dec_inp.permute(0, 2, 1).reshape(B * N, Ty, 1), batch_y_mark).reshape( + B, N, -1).permute(0, 2, 1) + else: + outputs = self.model(batch_x.permute(0, 2, 1).reshape(B * N, Tx, 1), + batch_x_mark.repeat(N, 1, 1), \ + dec_inp.permute(0, 2, 1).reshape(B * N, Ty, 1), + batch_y_mark.repeat(N, 1, 1)) \ + .reshape(B, N, -1).permute(0, 2, 1) + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, f_dim:] + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + + pred = outputs.detach().cpu() + true = batch_y.detach().cpu() + + loss = criterion(pred, true) + + total_loss.append(loss) + total_loss = np.average(total_loss) + self.model.train() + return total_loss + + def train(self, setting): + train_data, train_loader = self._get_data(flag='train') + vali_data, vali_loader = self._get_data(flag='val') + test_data, test_loader = self._get_data(flag='test') + + path = os.path.join(self.args.checkpoints, setting) + if not os.path.exists(path): + os.makedirs(path) + + time_now = time.time() + + train_steps = len(train_loader) + early_stopping = EarlyStopping(patience=self.args.patience, verbose=True) + + model_optim = self._select_optimizer() + criterion = self._select_criterion() + + if self.args.use_amp: + scaler = torch.cuda.amp.GradScaler() + + for epoch in range(self.args.train_epochs): + iter_count = 0 + train_loss = [] + + self.model.train() + epoch_time = time.time() + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(train_loader): + iter_count += 1 + model_optim.zero_grad() + batch_x = batch_x.float().to(self.device) + + batch_y = batch_y.float().to(self.device) + if 'PEMS' in self.args.data or 'Solar' in self.args.data: + batch_x_mark = None + batch_y_mark = None + else: + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + # Variate Generalization training: + # We train with partial variates (args.enc_in < number of dataset variates) + # and test the obtained model directly on all variates. + partial_start = self.args.partial_start_index + partial_end = min(self.args.enc_in + partial_start, batch_x.shape[-1]) + batch_x = batch_x[:, :, partial_start:partial_end] + batch_y = batch_y[:, :, partial_start:partial_end] + # Efficient training strategy: randomly choose part of the variates + # and only train the model with selected variates in each batch + if self.args.efficient_training: + _, _, N = batch_x.shape + index = np.stack(random.sample(range(N), N))[-self.args.enc_in:] + batch_x = batch_x[:, :, index] + batch_y = batch_y[:, :, index] + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, f_dim:] + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + loss = criterion(outputs, batch_y) + train_loss.append(loss.item()) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + elif self.args.channel_independence: + B, Tx, N = batch_x.shape + _, Ty, _ = dec_inp.shape + if batch_x_mark == None: + outputs = self.model(batch_x.permute(0, 2, 1).reshape(B * N, Tx, 1), batch_x_mark, \ + dec_inp.permute(0, 2, 1).reshape(B * N, Ty, 1), batch_y_mark).reshape( + B, N, -1).permute(0, 2, 1) + else: + a = batch_x.permute(0, 2, 1) + b = batch_x.permute(0, 2, 1).reshape(B * N, Tx, 1) + outputs = self.model(batch_x.permute(0, 2, 1).reshape(B * N, Tx, 1), + batch_x_mark.repeat(N, 1, 1), \ + dec_inp.permute(0, 2, 1).reshape(B * N, Ty, 1), + batch_y_mark.repeat(N, 1, 1)) \ + .reshape(B, N, -1).permute(0, 2, 1) + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, f_dim:] + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + loss = criterion(outputs, batch_y) + train_loss.append(loss.item()) + + if (i + 1) % 100 == 0: + print("\titers: {0}, epoch: {1} | loss: {2:.7f}".format(i + 1, epoch + 1, loss.item())) + speed = (time.time() - time_now) / iter_count + left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i) + print('\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time)) + iter_count = 0 + time_now = time.time() + + if self.args.use_amp: + scaler.scale(loss).backward() + scaler.step(model_optim) + scaler.update() + else: + loss.backward() + model_optim.step() + + print("Epoch: {} cost time: {}".format(epoch + 1, time.time() - epoch_time)) + train_loss = np.average(train_loss) + vali_loss = self.vali(vali_data, vali_loader, criterion, partial_train=True) + test_loss = self.vali(test_data, test_loader, criterion, partial_train=False) + + print("Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}".format( + epoch + 1, train_steps, train_loss, vali_loss, test_loss)) + early_stopping(vali_loss, self.model, path) + if early_stopping.early_stop: + print("Early stopping") + break + + adjust_learning_rate(model_optim, epoch + 1, self.args) + + best_model_path = path + '/' + 'checkpoint.pth' + self.model.load_state_dict(torch.load(best_model_path)) + + return self.model + + def test(self, setting, test=0): + + test_data, test_loader = self._get_data(flag='test') + if test: + print('loading model') + self.model.load_state_dict(torch.load(os.path.join('./checkpoints/' + setting, 'checkpoint.pth'))) + + preds = [] + trues = [] + folder_path = './test_results/' + setting + '/' + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + self.model.eval() + with torch.no_grad(): + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader): + # During model inference, test the obtained model directly on all variates. + batch_x = batch_x.float().to(self.device) + batch_y = batch_y.float().to(self.device) + + if 'PEMS' in self.args.data or 'Solar' in self.args.data: + batch_x_mark = None + batch_y_mark = None + else: + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + elif self.args.channel_independence: # compare the result with channel_independence + B, Tx, N = batch_x.shape + _, Ty, _ = dec_inp.shape + if batch_x_mark == None: + outputs = self.model(batch_x.permute(0, 2, 1).reshape(B * N, Tx, 1), batch_x_mark, \ + dec_inp.permute(0, 2, 1).reshape(B * N, Ty, 1), batch_y_mark).reshape( + B, N, -1).permute(0, 2, 1) + else: + outputs = self.model(batch_x.permute(0, 2, 1).reshape(B * N, Tx, 1), + batch_x_mark.repeat(N, 1, 1), \ + dec_inp.permute(0, 2, 1).reshape(B * N, Ty, 1), + batch_y_mark.repeat(N, 1, 1)) \ + .reshape(B, N, -1).permute(0, 2, 1) + else: + # directly test the trained model on all variates without fine-tuning. + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + + f_dim = -1 if self.args.features == 'MS' else 0 + outputs = outputs[:, -self.args.pred_len:, f_dim:] + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + outputs = outputs.detach().cpu().numpy() + batch_y = batch_y.detach().cpu().numpy() + if test_data.scale and self.args.inverse: + shape = outputs.shape + outputs = test_data.inverse_transform(outputs.squeeze(0)).reshape(shape) + batch_y = test_data.inverse_transform(batch_y.squeeze(0)).reshape(shape) + + pred = outputs + true = batch_y + + preds.append(pred) + trues.append(true) + if i % 20 == 0: + input = batch_x.detach().cpu().numpy() + if test_data.scale and self.args.inverse: + shape = input.shape + input = test_data.inverse_transform(input.squeeze(0)).reshape(shape) + gt = np.concatenate((input[0, :, -1], true[0, :, -1]), axis=0) + pd = np.concatenate((input[0, :, -1], pred[0, :, -1]), axis=0) + visual(gt, pd, os.path.join(folder_path, str(i) + '.pdf')) + + preds = np.array(preds) + trues = np.array(trues) + print('test shape:', preds.shape, trues.shape) + preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1]) + trues = trues.reshape(-1, trues.shape[-2], trues.shape[-1]) + print('test shape:', preds.shape, trues.shape) + + # result save + folder_path = './results/' + setting + '/' + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + mae, mse, rmse, mape, mspe = metric(preds, trues) + print('mse:{}, mae:{}'.format(mse, mae)) + f = open("result_long_term_forecast.txt", 'a') + f.write(setting + " \n") + f.write('mse:{}, mae:{}'.format(mse, mae)) + f.write('\n') + f.write('\n') + f.close() + + np.save(folder_path + 'metrics.npy', np.array([mae, mse, rmse, mape, mspe])) + np.save(folder_path + 'pred.npy', preds) + np.save(folder_path + 'true.npy', trues) + + return + + def predict(self, setting, load=False): + pred_data, pred_loader = self._get_data(flag='pred') + + if load: + path = os.path.join(self.args.checkpoints, setting) + best_model_path = path + '/' + 'checkpoint.pth' + self.model.load_state_dict(torch.load(best_model_path)) + + preds = [] + + self.model.eval() + with torch.no_grad(): + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(pred_loader): + batch_x = batch_x.float().to(self.device) + batch_y = batch_y.float() + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) + + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + # encoder - decoder + if self.args.use_amp: + with torch.cuda.amp.autocast(): + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + else: + if self.args.output_attention: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark)[0] + else: + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + outputs = outputs.detach().cpu().numpy() + if pred_data.scale and self.args.inverse: + shape = outputs.shape + outputs = pred_data.inverse_transform(outputs.squeeze(0)).reshape(shape) + preds.append(outputs) + + preds = np.array(preds) + preds = preds.reshape(-1, preds.shape[-2], preds.shape[-1]) + + # result save + folder_path = './results/' + setting + '/' + if not os.path.exists(folder_path): + os.makedirs(folder_path) + + np.save(folder_path + 'real_prediction.npy', preds) + + return diff --git a/figure/MambaCliMateNet.png b/figure/MambaCliMateNet.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bd8dcc9b2c02506ded3b05968597ed402ae088 --- /dev/null +++ b/figure/MambaCliMateNet.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8f1941efb4e443e4f9b7ff576056ab5d35af7d42df4d2c7b58a04888d4e00c1 +size 1390757 diff --git a/figure/china.png b/figure/china.png new file mode 100644 index 0000000000000000000000000000000000000000..66c2108a6ea211ce7dfc2544206af6e499deb7bb --- /dev/null +++ b/figure/china.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f5addff4154d4a0910ecc8eeecced2a882c5a2b518ae2b22a9e5542852aafee +size 1020137 diff --git a/figure/global.png b/figure/global.png new file mode 100644 index 0000000000000000000000000000000000000000..c801090316cf4604305bf3e9183823431aedcea0 --- /dev/null +++ b/figure/global.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1643a8d71836307db06778b0f6832c2aca1f6d902882636051952d2f5455b96 +size 1096618 diff --git "a/figure/\347\273\223\346\236\234\345\217\257\350\247\206\345\214\226\345\233\276.png" "b/figure/\347\273\223\346\236\234\345\217\257\350\247\206\345\214\226\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..22a1a28d325e5ec08cd3868cb42af3f2d976eef1 --- /dev/null +++ "b/figure/\347\273\223\346\236\234\345\217\257\350\247\206\345\214\226\345\233\276.png" @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a7bd9efcfd23c50f9f4870548863230f5b94c2a2983749e4c734b3e31e9efe6 +size 1101563 diff --git a/layers/Embed.py b/layers/Embed.py new file mode 100644 index 0000000000000000000000000000000000000000..63edb3ce0ffd443d82406f8158c9d61a3eaf62a3 --- /dev/null +++ b/layers/Embed.py @@ -0,0 +1,190 @@ +import torch +import torch.nn as nn +import math + +from mamba_ssm import Mamba +class PositionalEmbedding(nn.Module): + def __init__(self, d_model, max_len=5000): + super(PositionalEmbedding, self).__init__() + # Compute the positional encodings once in log space. + pe = torch.zeros(max_len, d_model).float() + pe.require_grad = False + + position = torch.arange(0, max_len).float().unsqueeze(1) + div_term = (torch.arange(0, d_model, 2).float() + * -(math.log(10000.0) / d_model)).exp() + + pe[:, 0::2] = torch.sin(position * div_term) + pe[:, 1::2] = torch.cos(position * div_term) + + pe = pe.unsqueeze(0) + self.register_buffer('pe', pe) + + def forward(self, x): + return self.pe[:, :x.size(1)] + + +class TokenEmbedding(nn.Module): + def __init__(self, c_in, d_model): + super(TokenEmbedding, self).__init__() + padding = 1 if torch.__version__ >= '1.5.0' else 2 + self.tokenConv = nn.Conv1d(in_channels=c_in, out_channels=d_model, + kernel_size=3, padding=padding, padding_mode='circular', bias=False) + for m in self.modules(): + if isinstance(m, nn.Conv1d): + nn.init.kaiming_normal_( + m.weight, mode='fan_in', nonlinearity='leaky_relu') + + def forward(self, x): + x = self.tokenConv(x.permute(0, 2, 1)).transpose(1, 2) + return x + + +class FixedEmbedding(nn.Module): + def __init__(self, c_in, d_model): + super(FixedEmbedding, self).__init__() + + w = torch.zeros(c_in, d_model).float() + w.require_grad = False + + position = torch.arange(0, c_in).float().unsqueeze(1) + div_term = (torch.arange(0, d_model, 2).float() + * -(math.log(10000.0) / d_model)).exp() + + w[:, 0::2] = torch.sin(position * div_term) + w[:, 1::2] = torch.cos(position * div_term) + + self.emb = nn.Embedding(c_in, d_model) + self.emb.weight = nn.Parameter(w, requires_grad=False) + + def forward(self, x): + return self.emb(x).detach() + + +class TemporalEmbedding(nn.Module): + def __init__(self, d_model, embed_type='fixed', freq='h'): + super(TemporalEmbedding, self).__init__() + + minute_size = 4 + hour_size = 24 + weekday_size = 7 + day_size = 32 + month_size = 13 + + Embed = FixedEmbedding if embed_type == 'fixed' else nn.Embedding + if freq == 't': + self.minute_embed = Embed(minute_size, d_model) + self.hour_embed = Embed(hour_size, d_model) + self.weekday_embed = Embed(weekday_size, d_model) + self.day_embed = Embed(day_size, d_model) + self.month_embed = Embed(month_size, d_model) + + def forward(self, x): + x = x.long() + minute_x = self.minute_embed(x[:, :, 4]) if hasattr( + self, 'minute_embed') else 0. + hour_x = self.hour_embed(x[:, :, 3]) + weekday_x = self.weekday_embed(x[:, :, 2]) + day_x = self.day_embed(x[:, :, 1]) + month_x = self.month_embed(x[:, :, 0]) + + return hour_x + weekday_x + day_x + month_x + minute_x + + +class TimeFeatureEmbedding(nn.Module): + def __init__(self, d_model, embed_type='timeF', freq='h'): + super(TimeFeatureEmbedding, self).__init__() + + freq_map = {'h': 4, 't': 5, 's': 6, + 'm': 1, 'a': 1, 'w': 2, 'd': 3, 'b': 3} + d_inp = freq_map[freq] + self.embed = nn.Linear(d_inp, d_model, bias=False) + + def forward(self, x): + return self.embed(x) + + +class DataEmbedding(nn.Module): + def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1): + super(DataEmbedding, self).__init__() + + self.value_embedding = TokenEmbedding(c_in=c_in, d_model=d_model) + self.position_embedding = PositionalEmbedding(d_model=d_model) + self.temporal_embedding = TemporalEmbedding(d_model=d_model, embed_type=embed_type, + freq=freq) if embed_type != 'timeF' else TimeFeatureEmbedding( + d_model=d_model, embed_type=embed_type, freq=freq) + self.dropout = nn.Dropout(p=dropout) + + def forward(self, x, x_mark): + if x_mark is None: + x = self.value_embedding(x) + self.position_embedding(x) + else: + x = self.value_embedding( + x) + self.temporal_embedding(x_mark) + self.position_embedding(x) + return self.dropout(x) + +class moving_avg(nn.Module): + """ + Moving average block to highlight the trend of time series + """ + def __init__(self, kernel_size, stride): + super(moving_avg, self).__init__() + self.kernel_size = kernel_size + self.avg = nn.AvgPool1d(kernel_size=kernel_size, stride=stride, padding=0) + + def forward(self, x): + # padding on the both ends of time series + front = x[:, 0:1, :].repeat(1, (self.kernel_size - 1) // 2, 1) + end = x[:, -1:, :].repeat(1, (self.kernel_size - 1) // 2, 1) + x = torch.cat([front, x, end], dim=1) + x = self.avg(x.permute(0, 2, 1)) + x = x.permute(0, 2, 1) + return x + + +class series_decomp(nn.Module): + """ + Series decomposition block + """ + def __init__(self, kernel_size): + super(series_decomp, self).__init__() + self.moving_avg = moving_avg(kernel_size, stride=1) + + def forward(self, x): + moving_mean = self.moving_avg(x) + res = x - moving_mean + return res, moving_mean +class DataEmbedding_wo_pos(nn.Module): + def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1): + super(DataEmbedding_wo_pos, self).__init__() + + self.value_embedding = TokenEmbedding(c_in=c_in, d_model=d_model) + self.position_embedding = PositionalEmbedding(d_model=d_model) + self.temporal_embedding = TemporalEmbedding(d_model=d_model, embed_type=embed_type, + freq=freq) if embed_type != 'timeF' else TimeFeatureEmbedding( + d_model=d_model, embed_type=embed_type, freq=freq) + self.dropout = nn.Dropout(p=dropout) + + def forward(self, x, x_mark): + if x_mark == None: + x = self.value_embedding(x) + else: + x = self.value_embedding(x) + self.temporal_embedding(x_mark) + return self.dropout(x) +class DataEmbedding_inverted(nn.Module): + def __init__(self, c_in, d_model, embed_type='fixed', freq='h', dropout=0.1): + super(DataEmbedding_inverted, self).__init__() + self.value_embedding = nn.Linear(c_in, d_model) + self.dropout = nn.Dropout(p=dropout) + + def forward(self, x, x_mark): + x = x.permute(0, 2, 1) + + # x: [Batch Variate Time] + if x_mark is None: + + x = self.value_embedding(x) + else: + x = self.value_embedding(torch.cat([x, x_mark.permute(0, 2, 1)], 1)) + return self.dropout(x) + diff --git a/layers/Mamba_EncDec.py b/layers/Mamba_EncDec.py new file mode 100644 index 0000000000000000000000000000000000000000..f7b820383a7e2b353cab04e3c6b0f7f6ad503436 --- /dev/null +++ b/layers/Mamba_EncDec.py @@ -0,0 +1,118 @@ +import concurrent.futures +import threading + +import torch.nn as nn +import torch.nn.functional as F +import torch +from mamba_ssm import Mamba +from layers.SelfAttention_Family import FullAttention, AttentionLayer + +import torch +import torch.nn as nn + +class FeedForwardNetwork(nn.Module): + def __init__(self, nvars, dmodel, dff, drop=0.1): + super(FeedForwardNetwork, self).__init__() + + + self.ffn1pw1 = nn.Conv1d(in_channels=nvars * dmodel, out_channels=nvars * dff, + kernel_size=1, stride=1, padding=0, dilation=1, groups=nvars) + + + self.ffn1act = nn.GELU() + + + self.ffn1pw2 = nn.Conv1d(in_channels=nvars * dff, out_channels=nvars * dmodel, + kernel_size=1, stride=1, padding=0, dilation=1, groups=nvars) + + self.ffn1drop1 = nn.Dropout(drop) + self.ffn1drop2 = nn.Dropout(drop) + + def forward(self, x): + x = self.ffn1drop1(self.ffn1pw1(x)) + x = self.ffn1act(x) + x = self.ffn1drop2(self.ffn1pw2(x)) + + return x + + +class EncoderLayer(nn.Module): + def __init__(self, attention, attention_r, d_model, d_ff=None, dropout=0.1, activation="relu"): + super(EncoderLayer, self).__init__() + d_ff = d_ff or 4 * d_model + self.attention = attention + self.attention_r = attention_r + + self.ffn1 = FeedForwardNetwork(nvars=1, dmodel=d_model, dff=d_ff) + self.ffn2 = FeedForwardNetwork(nvars=1, dmodel=d_ff, dff=d_model) + self.conv1 = nn.Conv1d(in_channels=d_model, out_channels=d_ff, kernel_size=1) + self.conv2 = nn.Conv1d(in_channels=d_ff, out_channels=d_model, kernel_size=1) + self.norm1 = nn.LayerNorm(d_model) + self.norm2 = nn.LayerNorm(d_model) + self.dropout = nn.Dropout(dropout) + self.activation = F.relu if activation == "relu" else F.gelu + self.man = Mamba( + d_model=11, # Model dimension d_model + d_state=16, # SSM state expansion factor + d_conv=2, # Local convolution width + expand=1, # Block expansion factor) + ) + self.man2 = Mamba( + d_model=11, # Model dimension d_model + d_state=16, # SSM state expansion factor + d_conv=2, # Local convolution width + expand=1, # Block expansion factor) + ) + self.a = AttentionLayer( + FullAttention(False, 2, attention_dropout=0.1, + output_attention=True), 11,1) + def forward(self, x, attn_mask=None, tau=None, delta=None): + + x = x.permute(0, 2, 1) + x = self.ffn1(x) + x = self.ffn2(x) + x = x.permute(0, 2, 1) + new_x = self.attention(x) + self.attention_r(x.flip(dims=[1])).flip(dims=[1]) + attn = 1 + + x = x + new_x #torch.Size([32, 11, 256]) + # print(x.shape) + y = x = self.norm1(x) + + # print(y.shape) + y = self.dropout(self.activation(self.conv1(y.transpose(-1, 1)))) + y = self.dropout(self.conv2(y).transpose(-1, 1)) + + return self.norm2(x + y), attn + + +class Encoder(nn.Module): + def __init__(self, attn_layers, conv_layers=None, norm_layer=None): + super(Encoder, self).__init__() + self.attn_layers = nn.ModuleList(attn_layers) + self.conv_layers = nn.ModuleList(conv_layers) if conv_layers is not None else None + self.norm = norm_layer + + def forward(self, x, attn_mask=None, tau=None, delta=None): + # x [B, L, D] + # print(x.shape) + attns = [] + if self.conv_layers is not None: + for i, (attn_layer, conv_layer) in enumerate(zip(self.attn_layers, self.conv_layers)): + delta = delta if i == 0 else None + x, attn = attn_layer(x, attn_mask=attn_mask, tau=tau, delta=delta) + x = conv_layer(x) + attns.append(attn) + x, attn = self.attn_layers[-1](x, tau=tau, delta=None) + attns.append(attn) + else: + for attn_layer in self.attn_layers: + x, attn = attn_layer(x, attn_mask=attn_mask, tau=tau, delta=delta) + + attns.append(attn) + + if self.norm is not None: + x = self.norm(x) + + return x, attns + diff --git a/layers/SelfAttention_Family.py b/layers/SelfAttention_Family.py new file mode 100644 index 0000000000000000000000000000000000000000..1dfcd84cb8d0e25b0b37da8a37600c295505321e --- /dev/null +++ b/layers/SelfAttention_Family.py @@ -0,0 +1,74 @@ +import torch +import torch.nn as nn +import numpy as np +from math import sqrt +from einops import rearrange + + +class FullAttention(nn.Module): + def __init__(self, mask_flag=True, factor=5, scale=None, attention_dropout=0.1, output_attention=False): + super(FullAttention, self).__init__() + self.scale = scale + self.mask_flag = mask_flag + self.output_attention = output_attention + self.dropout = nn.Dropout(attention_dropout) + + def forward(self, queries, keys, values, attn_mask, tau=None, delta=None): + B, L, H, E = queries.shape + _, S, _, D = values.shape + scale = self.scale or 1. / sqrt(E) + + scores = torch.einsum("blhe,bshe->bhls", queries, keys) + + if self.mask_flag: + if attn_mask is None: + attn_mask = TriangularCausalMask(B, L, device=queries.device) + + scores.masked_fill_(attn_mask.mask, -np.inf) + + A = self.dropout(torch.softmax(scale * scores, dim=-1)) + V = torch.einsum("bhls,bshd->blhd", A, values) + + if self.output_attention: + return (V.contiguous(), A) + else: + return (V.contiguous(), None) + + +class AttentionLayer(nn.Module): + def __init__(self, attention, d_model, n_heads, d_keys=None, + d_values=None): + super(AttentionLayer, self).__init__() + + d_keys = d_keys or (d_model // n_heads) + d_values = d_values or (d_model // n_heads) + + self.inner_attention = attention + self.query_projection = nn.Linear(d_model, d_keys * n_heads) + self.key_projection = nn.Linear(d_model, d_keys * n_heads) + self.value_projection = nn.Linear(d_model, d_values * n_heads) + self.out_projection = nn.Linear(d_values * n_heads, d_model) + self.n_heads = n_heads + + def forward(self, queries, keys, values, attn_mask, tau=None, delta=None): + B, L, _ = queries.shape + _, S, _ = keys.shape + H = self.n_heads + + queries = self.query_projection(queries).view(B, L, H, -1) + keys = self.key_projection(keys).view(B, S, H, -1) + values = self.value_projection(values).view(B, S, H, -1) + + out, attn = self.inner_attention( + queries, + keys, + values, + attn_mask, + tau=tau, + delta=delta + ) + out = out.view(B, L, -1) + + return self.out_projection(out), attn + + diff --git a/layers/__init__.py b/layers/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/layers/__pycache__/1.py b/layers/__pycache__/1.py new file mode 100644 index 0000000000000000000000000000000000000000..66dc9051da651c15d98d017a88658263cab28f02 --- /dev/null +++ b/layers/__pycache__/1.py @@ -0,0 +1 @@ +undefined \ No newline at end of file diff --git a/layers/__pycache__/AutoCorrelation.cpython-310.pyc b/layers/__pycache__/AutoCorrelation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9924dbf1c00d0df23b4e02ea3976da8259044d8f Binary files /dev/null and b/layers/__pycache__/AutoCorrelation.cpython-310.pyc differ diff --git a/layers/__pycache__/Autoformer_EncDec.cpython-310.pyc b/layers/__pycache__/Autoformer_EncDec.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..954bde3cf4be5fccc34f05da8fbbd25284211cfe Binary files /dev/null and b/layers/__pycache__/Autoformer_EncDec.cpython-310.pyc differ diff --git a/layers/__pycache__/Autoformer_EncDec_M.cpython-310.pyc b/layers/__pycache__/Autoformer_EncDec_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db8f4ff79831f3abf23684388c58f44f18591fb3 Binary files /dev/null and b/layers/__pycache__/Autoformer_EncDec_M.cpython-310.pyc differ diff --git a/layers/__pycache__/Embed.cpython-310.pyc b/layers/__pycache__/Embed.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..179c1decdedcfcfc562c1d597c7192ac5da65ac3 Binary files /dev/null and b/layers/__pycache__/Embed.cpython-310.pyc differ diff --git a/layers/__pycache__/Mamba_EncDec.cpython-310.pyc b/layers/__pycache__/Mamba_EncDec.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4c5c6aced456cabbbc2cf3cba4ecdbbdabbcd8db Binary files /dev/null and b/layers/__pycache__/Mamba_EncDec.cpython-310.pyc differ diff --git a/layers/__pycache__/SelfAttention_Family.cpython-310.pyc b/layers/__pycache__/SelfAttention_Family.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fc503498c4e81f75aeae2c0963d3b92b6998756 Binary files /dev/null and b/layers/__pycache__/SelfAttention_Family.cpython-310.pyc differ diff --git a/layers/__pycache__/Transformer_EncDec.cpython-310.pyc b/layers/__pycache__/Transformer_EncDec.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67237ae35280dcaa0b8d8d2adf8c9b451108c48e Binary files /dev/null and b/layers/__pycache__/Transformer_EncDec.cpython-310.pyc differ diff --git a/layers/__pycache__/Transformer_EncDec_M.cpython-310.pyc b/layers/__pycache__/Transformer_EncDec_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b4245632a6918f227196a46b482f408151b4ada Binary files /dev/null and b/layers/__pycache__/Transformer_EncDec_M.cpython-310.pyc differ diff --git a/layers/__pycache__/__init__.cpython-310.pyc b/layers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cd6991b211f94908bbcc7ac2bbb6af325a173ae6 Binary files /dev/null and b/layers/__pycache__/__init__.cpython-310.pyc differ diff --git a/layers/__pycache__/convffn.cpython-310.pyc b/layers/__pycache__/convffn.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d994303eb4aa44fe633fc06d9ab7ec72ce0d58f Binary files /dev/null and b/layers/__pycache__/convffn.cpython-310.pyc differ diff --git a/layers/__pycache__/dw.cpython-310.pyc b/layers/__pycache__/dw.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b2192c9735d83c295c616e143d6b546847a6eb1 Binary files /dev/null and b/layers/__pycache__/dw.cpython-310.pyc differ diff --git a/model/MambaClimateNet.py b/model/MambaClimateNet.py new file mode 100644 index 0000000000000000000000000000000000000000..5dc55fa76c1df68ae07b0bdc4c88130ecfd190bd --- /dev/null +++ b/model/MambaClimateNet.py @@ -0,0 +1,84 @@ +import torch +import torch.nn as nn +import sys +from layers.Mamba_EncDec import Encoder, EncoderLayer +from layers.Embed import DataEmbedding_inverted + +from mamba_ssm import Mamba + + + +class Model(nn.Module): + + def __init__(self, configs): + super(Model, self).__init__() + self.seq_len = configs.seq_len + self.pred_len = configs.pred_len + self.output_attention = configs.output_attention + self.use_norm = configs.use_norm + # Embedding + self.enc_embedding = DataEmbedding_inverted(configs.seq_len, configs.d_model, configs.embed, configs.freq, + configs.dropout) + self.class_strategy = configs.class_strategy + # Encoder-only architecture + self.encoder = Encoder( + [ + EncoderLayer( + Mamba( + d_model=configs.d_model, # Model dimension d_model + d_state=configs.d_state, # SSM state expansion factor + d_conv=2, # Local convolution width + expand=1, # Block expansion factor) + ), + Mamba( + d_model=configs.d_model, # Model dimension d_model + d_state=configs.d_state, # SSM state expansion factor + d_conv=2, # Local convolution width + expand=1, # Block expansion factor) + ), + configs.d_model, + configs.d_ff, + dropout=configs.dropout, + activation=configs.activation + ) for l in range(configs.e_layers) + ], + norm_layer=torch.nn.LayerNorm(configs.d_model) + ) + self.projector = nn.Linear(configs.d_model, configs.pred_len, bias=True) + + + def forecast(self, x_enc, x_mark_enc, x_dec, x_mark_dec): + if self.use_norm: + # Normalization from Non-stationary Transformer + means = x_enc.mean(1, keepdim=True).detach() + x_enc = x_enc - means + stdev = torch.sqrt(torch.var(x_enc, dim=1, keepdim=True, unbiased=False) + 1e-5) + x_enc /= stdev + + _, _, N = x_enc.shape # B L N + # B: batch_size; E: d_model; + # L: seq_len; S: pred_len; + # N: number of variate (tokens), can also includes covariates + + # Embedding + # B L N -> B N E (B L N -> B L E in the vanilla Transformer) + enc_out = self.enc_embedding(x_enc, x_mark_enc) # covariates (e.g timestamp) can be also embedded as tokens + + # B N E -> B N E (B L E -> B L E in the vanilla Transformer) + # the dimensions of embedded time series has been inverted, and then processed by native attn, layernorm and ffn modules + enc_out, attns = self.encoder(enc_out, attn_mask=None) + # B N E -> B N S -> B S N + dec_out = self.projector(enc_out).permute(0, 2, 1)[:, :, :N] # filter the covariates + + if self.use_norm: + # De-Normalization from Non-stationary Transformer + dec_out = dec_out * (stdev[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1)) + dec_out = dec_out + (means[:, 0, :].unsqueeze(1).repeat(1, self.pred_len, 1)) + + return dec_out + + + def forward(self, x_enc, x_mark_enc, x_dec, x_mark_dec, mask=None): + dec_out = self.forecast(x_enc, x_mark_enc, x_dec, x_mark_dec) + return dec_out[:, -self.pred_len:, :] # [B, L, D] + diff --git a/model/__init__.py b/model/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/model/__pycache__/1.py b/model/__pycache__/1.py new file mode 100644 index 0000000000000000000000000000000000000000..66dc9051da651c15d98d017a88658263cab28f02 --- /dev/null +++ b/model/__pycache__/1.py @@ -0,0 +1 @@ +undefined \ No newline at end of file diff --git a/model/__pycache__/Autoformer.cpython-310.pyc b/model/__pycache__/Autoformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d039a5fe61293b05ea2bcef10c618bfecfdac960 Binary files /dev/null and b/model/__pycache__/Autoformer.cpython-310.pyc differ diff --git a/model/__pycache__/Autoformer_M.cpython-310.pyc b/model/__pycache__/Autoformer_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3ffb6c147f5a57fec452fa355905c071327236b5 Binary files /dev/null and b/model/__pycache__/Autoformer_M.cpython-310.pyc differ diff --git a/model/__pycache__/Flashformer.cpython-310.pyc b/model/__pycache__/Flashformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cab78964b59851a351f1a0d1f7f52a2ddad92bb3 Binary files /dev/null and b/model/__pycache__/Flashformer.cpython-310.pyc differ diff --git a/model/__pycache__/Flashformer_M.cpython-310.pyc b/model/__pycache__/Flashformer_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c43e174344b98a1e3003e7e159e88dc92871df8c Binary files /dev/null and b/model/__pycache__/Flashformer_M.cpython-310.pyc differ diff --git a/model/__pycache__/Flowformer.cpython-310.pyc b/model/__pycache__/Flowformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5ce4a8dc298076ffa541ec8d498ff9f16fb515e0 Binary files /dev/null and b/model/__pycache__/Flowformer.cpython-310.pyc differ diff --git a/model/__pycache__/Flowformer_M.cpython-310.pyc b/model/__pycache__/Flowformer_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aa6927a371b93ba5d128fd086344a8d477140184 Binary files /dev/null and b/model/__pycache__/Flowformer_M.cpython-310.pyc differ diff --git a/model/__pycache__/Informer.cpython-310.pyc b/model/__pycache__/Informer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71e727ee6651246b13006eab83b5ea7a4678e85b Binary files /dev/null and b/model/__pycache__/Informer.cpython-310.pyc differ diff --git a/model/__pycache__/Informer_M.cpython-310.pyc b/model/__pycache__/Informer_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b35cdd47e44a630e9e04b7baaafab98ca66b729e Binary files /dev/null and b/model/__pycache__/Informer_M.cpython-310.pyc differ diff --git a/model/__pycache__/Reformer.cpython-310.pyc b/model/__pycache__/Reformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b8464452955cdec7be08bc0f4edf09af1f5b0799 Binary files /dev/null and b/model/__pycache__/Reformer.cpython-310.pyc differ diff --git a/model/__pycache__/Reformer_M.cpython-310.pyc b/model/__pycache__/Reformer_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e28d00f7c71d81b0ccb4f29857dc3beacf3c0a2 Binary files /dev/null and b/model/__pycache__/Reformer_M.cpython-310.pyc differ diff --git a/model/__pycache__/S_Mamba.cpython-310.pyc b/model/__pycache__/S_Mamba.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cc1109912b17dd1a45dfbfa936efb022c59db19 Binary files /dev/null and b/model/__pycache__/S_Mamba.cpython-310.pyc differ diff --git a/model/__pycache__/Transformer.cpython-310.pyc b/model/__pycache__/Transformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..580089f9120fb0dce9fcea78fbf331b3f7437eec Binary files /dev/null and b/model/__pycache__/Transformer.cpython-310.pyc differ diff --git a/model/__pycache__/Transformer_M.cpython-310.pyc b/model/__pycache__/Transformer_M.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5dccc84cfeca1ecc2dadb00c6e92613bcac39d73 Binary files /dev/null and b/model/__pycache__/Transformer_M.cpython-310.pyc differ diff --git a/model/__pycache__/__init__.cpython-310.pyc b/model/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3b8eda67ad95e99e818eda812e01c3b8e8f91b3 Binary files /dev/null and b/model/__pycache__/__init__.cpython-310.pyc differ diff --git a/model/__pycache__/iFlashformer.cpython-310.pyc b/model/__pycache__/iFlashformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6667189493711340627e01cffb452feb9695ce68 Binary files /dev/null and b/model/__pycache__/iFlashformer.cpython-310.pyc differ diff --git a/model/__pycache__/iFlowformer.cpython-310.pyc b/model/__pycache__/iFlowformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff295cad795c774c9c9127ca1ea42736c1c5ccaf Binary files /dev/null and b/model/__pycache__/iFlowformer.cpython-310.pyc differ diff --git a/model/__pycache__/iInformer.cpython-310.pyc b/model/__pycache__/iInformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d31b61d38d5a543f7d143e7a167fc98b8a42190 Binary files /dev/null and b/model/__pycache__/iInformer.cpython-310.pyc differ diff --git a/model/__pycache__/iReformer.cpython-310.pyc b/model/__pycache__/iReformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..610942bc28530a6bc3a81111c593e0579bd55fa2 Binary files /dev/null and b/model/__pycache__/iReformer.cpython-310.pyc differ diff --git a/model/__pycache__/iTransformer.cpython-310.pyc b/model/__pycache__/iTransformer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a23cc65df00d113c18ee03de1a903685530de963 Binary files /dev/null and b/model/__pycache__/iTransformer.cpython-310.pyc differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..1cd8b54d94f700caf2f6b8acc49e48f2c8923c7c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +torch==2.8.0 +mamba-ssm==2.2.6.post3 +numpy==2.0.2 +pandas==2.3.3 +scikit-learn==1.6.1 +matplotlib==3.9.4 +einops==0.8.1 +transformers==4.57.3 +tqdm==4.67.1 \ No newline at end of file diff --git a/run.py b/run.py new file mode 100644 index 0000000000000000000000000000000000000000..45aec2c4c625542dd772f1c282628241e9446cf2 --- /dev/null +++ b/run.py @@ -0,0 +1,192 @@ +import argparse +import torch +from experiments.exp_long_term_forecasting import Exp_Long_Term_Forecast +from experiments.exp_long_term_forecasting_partial import Exp_Long_Term_Forecast_Partial +import random +import numpy as np + +if __name__ == '__main__': + fix_seed = 2023 + random.seed(fix_seed) + torch.manual_seed(fix_seed) + np.random.seed(fix_seed) + + parser = argparse.ArgumentParser(description='MambaClimateNet') + + # basic config + parser.add_argument('--is_training', type=int, required=True, default=1, help='status') + parser.add_argument('--model_id', type=str, required=True, default='test', help='model id') + parser.add_argument('--model', type=str, required=True, default='MambaClimateNet', + help='model name, options: [MambaClimateNet]') + + # data loader + parser.add_argument('--data', type=str, required=True, default='custom', help='dataset type') + parser.add_argument('--root_path', type=str, default='./dataset/China/', help='root path of the data file') + parser.add_argument('--data_path', type=str, default='China.csv', help='data csv file') + parser.add_argument('--features', type=str, default='M', + help='forecasting task, options:[M, S, MS]; M:multivariate predict multivariate, S:univariate predict univariate, MS:multivariate predict univariate') + parser.add_argument('--target', type=str, default='temp_mean', help='target feature in S or MS task') + parser.add_argument('--freq', type=str, default='h', + help='freq for time features encoding, options:[s:secondly, t:minutely, h:hourly, d:daily, b:business days, w:weekly, m:monthly], you can also use more detailed freq like 15min or 3h') + parser.add_argument('--checkpoints', type=str, default='./checkpoints/', help='location of model checkpoints') + + # forecasting task + parser.add_argument('--seq_len', type=int, default=96, help='input sequence length') + parser.add_argument('--label_len', type=int, default=12, help='start token length') # no longer needed in inverted Transformers + parser.add_argument('--pred_len', type=int, default=96, help='prediction sequence length') + + # model define + parser.add_argument('--enc_in', type=int, default=7, help='encoder input size') + parser.add_argument('--dec_in', type=int, default=7, help='decoder input size') + parser.add_argument('--c_out', type=int, default=7, help='output size') # applicable on arbitrary number of variates in inverted Transformers + parser.add_argument('--d_model', type=int, default=512, help='dimension of model') + parser.add_argument('--n_heads', type=int, default=8, help='num of heads') + parser.add_argument('--e_layers', type=int, default=2, help='num of encoder layers') + parser.add_argument('--d_layers', type=int, default=1, help='num of decoder layers') + parser.add_argument('--d_ff', type=int, default=256, help='dimension of fcn') + parser.add_argument('--moving_avg', type=int, default=25, help='window size of moving average') + parser.add_argument('--factor', type=int, default=1, help='attn factor') + parser.add_argument('--distil', action='store_false', + help='whether to use distilling in encoder, using this argument means not using distilling', + default=True) + parser.add_argument('--dropout', type=float, default=0.1, help='dropout') + parser.add_argument('--embed', type=str, default='timeF', + help='time features encoding, options:[timeF, fixed, learned]') + parser.add_argument('--activation', type=str, default='gelu', help='activation') + parser.add_argument('--output_attention', action='store_true', help='whether to output attention in ecoder') + parser.add_argument('--do_predict', action='store_true', help='whether to predict unseen future data') + + # optimization + parser.add_argument('--num_workers', type=int, default=10, help='data loader num workers') + parser.add_argument('--itr', type=int, default=1, help='experiments times') + parser.add_argument('--train_epochs', type=int, default=10, help='train epochs') + parser.add_argument('--batch_size', type=int, default=8, help='batch size of train input data') + parser.add_argument('--patience', type=int, default=3, help='early stopping patience') + parser.add_argument('--learning_rate', type=float, default=0.0001, help='optimizer learning rate') + parser.add_argument('--des', type=str, default='test', help='exp description') + parser.add_argument('--loss', type=str, default='MSE', help='loss function') + parser.add_argument('--lradj', type=str, default='type1', help='adjust learning rate') + parser.add_argument('--use_amp', action='store_true', help='use automatic mixed precision training', default=False) + + # GPU + parser.add_argument('--use_gpu', type=bool, default=True, help='use gpu') + parser.add_argument('--gpu', type=int, default=0, help='gpu') + parser.add_argument('--use_multi_gpu', action='store_true', help='use multiple gpus', default=False) + parser.add_argument('--devices', type=str, default='0,1,2,3', help='device ids of multile gpus') + + parser.add_argument('--exp_name', type=str, required=False, default='MTSF', + help='experiemnt name, options:[MTSF, partial_train]') + parser.add_argument('--channel_independence', type=bool, default=False, help='whether to use channel_independence mechanism') + parser.add_argument('--inverse', action='store_true', help='inverse output data', default=False) + parser.add_argument('--class_strategy', type=str, default='projection', help='projection/average/cls_token') + parser.add_argument('--target_root_path', type=str, default='./data/electricity/', help='root path of the data file') + parser.add_argument('--target_data_path', type=str, default='electricity.csv', help='data file') + parser.add_argument('--efficient_training', type=bool, default=False, help='whether to use efficient_training (exp_name should be partial train)') # See Figure 8 of our paper for the detail + parser.add_argument('--use_norm', type=int, default=True, help='use norm and denorm') + parser.add_argument('--partial_start_index', type=int, default=0, help='the start index of variates for partial training, ' + 'you can select [partial_start_index, min(enc_in + partial_start_index, N)]') + parser.add_argument('--d_state', type=int, default=8, help='parameter of Mamba Block') + + args = parser.parse_args() + args.use_gpu = True if torch.cuda.is_available() and args.use_gpu else False + + if args.use_gpu and args.use_multi_gpu: + args.devices = args.devices.replace(' ', '') + device_ids = args.devices.split(',') + args.device_ids = [int(id_) for id_ in device_ids] + args.gpu = args.device_ids[0] + + print('Args in experiment:') + print(args) + + if args.exp_name == 'partial_train': # See Figure 8 of our paper, for the detail + Exp = Exp_Long_Term_Forecast_Partial + else: # MTSF: multivariate time series forecasting + Exp = Exp_Long_Term_Forecast + import torch.multiprocessing + + torch.multiprocessing.set_sharing_strategy('file_system') + + if args.is_training==1: + for ii in range(args.itr): + # setting record of experiments + setting = '{}_{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_fc{}_eb{}_dt{}_{}_{}'.format( + args.model_id, + args.model, + args.data, + args.features, + args.seq_len, + args.label_len, + args.pred_len, + args.d_model, + args.n_heads, + args.e_layers, + args.d_layers, + args.d_ff, + args.factor, + args.embed, + args.distil, + args.des, + args.class_strategy, ii) + + exp = Exp(args) # set experiments + print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting)) + exp.train(setting) + + print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting)) + exp.test(setting) + + if args.do_predict: + print('>>>>>>>predicting : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting)) + exp.predict(setting, True) + + torch.cuda.empty_cache() + elif args.is_training == 2: + print(11111) + for ii in range(args.itr): + # setting record of experiments + setting = '{}_{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_fc{}_eb{}_dt{}_{}_{}'.format( + args.model_id, + args.model, + args.data, + args.features, + args.seq_len, + args.label_len, + args.pred_len, + args.d_model, + args.n_heads, + args.e_layers, + args.d_layers, + args.d_ff, + args.factor, + args.embed, + args.distil, + args.des, + args.class_strategy, ii) + exp = Exp(args) + exp.get_input(setting) + else: + ii = 0 + setting = '{}_{}_{}_{}_ft{}_sl{}_ll{}_pl{}_dm{}_nh{}_el{}_dl{}_df{}_fc{}_eb{}_dt{}_{}_{}'.format( + args.model_id, + args.model, + args.data, + args.features, + args.seq_len, + args.label_len, + args.pred_len, + args.d_model, + args.n_heads, + args.e_layers, + args.d_layers, + args.d_ff, + args.factor, + args.embed, + args.distil, + args.des, + args.class_strategy, ii) + + exp = Exp(args) # set experiments + print('>>>>>>>testing : {}<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<'.format(setting)) + exp.test(setting, test=1) + torch.cuda.empty_cache() diff --git a/scripts/multivariate_forecasting/MambaClimateNet_mu.sh b/scripts/multivariate_forecasting/MambaClimateNet_mu.sh new file mode 100644 index 0000000000000000000000000000000000000000..051fe921547a72ddcfccdf899e7ea7d15c969e87 --- /dev/null +++ b/scripts/multivariate_forecasting/MambaClimateNet_mu.sh @@ -0,0 +1,163 @@ +export CUDA_VISIBLE_DEVICES=0 + +model_name=MambaClimateNet +# d state 2 +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path China.csv \ + --model_id China \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 12\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 4\ + --itr 1 \ + --learning_rate 0.00005 + +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path China.csv \ + --model_id China \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 24\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 2 \ + --itr 1 \ + --learning_rate 0.00005 + +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path China.csv \ + --model_id China \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 36\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 2 \ + --itr 1 \ + --learning_rate 0.00005 + +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path China.csv \ + --model_id China \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 48\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 2 \ + --itr 1 \ + --learning_rate 0.00005 + +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path Global.csv \ + --model_id Global \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 12\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 4\ + --itr 1 \ + --learning_rate 0.00005 + +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path Global.csv \ + --model_id Global \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 24\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 2 \ + --itr 1 \ + --learning_rate 0.00005 + +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path Global.csv \ + --model_id Global \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 36\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 2 \ + --itr 1 \ + --learning_rate 0.00005 + +python -u run.py \ + --is_training 1 \ + --root_path ./dataset/ \ + --data_path Global.csv \ + --model_id Global \ + --model $model_name \ + --data custom \ + --features M \ + --seq_len 96 \ + --pred_len 48\ + --e_layers 2 \ + --enc_in 7 \ + --dec_in 7 \ + --c_out 7 \ + --des 'Exp' \ + --d_model 256 \ + --d_state 2 \ + --itr 1 \ + --learning_rate 0.00005 \ No newline at end of file diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/utils/__pycache__/1.py b/utils/__pycache__/1.py new file mode 100644 index 0000000000000000000000000000000000000000..66dc9051da651c15d98d017a88658263cab28f02 --- /dev/null +++ b/utils/__pycache__/1.py @@ -0,0 +1 @@ +undefined \ No newline at end of file diff --git a/utils/__pycache__/__init__.cpython-310.pyc b/utils/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2cabc1d6b14bed1c9bb61ef31f3bd83dda51fe63 Binary files /dev/null and b/utils/__pycache__/__init__.cpython-310.pyc differ diff --git a/utils/__pycache__/masking.cpython-310.pyc b/utils/__pycache__/masking.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6359a7b04be2b11a0e20993bc74daed834bc7b91 Binary files /dev/null and b/utils/__pycache__/masking.cpython-310.pyc differ diff --git a/utils/__pycache__/metrics.cpython-310.pyc b/utils/__pycache__/metrics.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e777e25c416d219ca3753c00d3591ce9d0f511e2 Binary files /dev/null and b/utils/__pycache__/metrics.cpython-310.pyc differ diff --git a/utils/__pycache__/timefeatures.cpython-310.pyc b/utils/__pycache__/timefeatures.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c7bc0e01e18f21804de7cf4334aef797bdccdbc Binary files /dev/null and b/utils/__pycache__/timefeatures.cpython-310.pyc differ diff --git a/utils/__pycache__/tools.cpython-310.pyc b/utils/__pycache__/tools.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db74acbfc321e22efc9ff5482d5c2bcc0ec6e265 Binary files /dev/null and b/utils/__pycache__/tools.cpython-310.pyc differ diff --git a/utils/masking.py b/utils/masking.py new file mode 100644 index 0000000000000000000000000000000000000000..a19cbf63b8d1d1927eceabcbe4a1b5313238b75b --- /dev/null +++ b/utils/masking.py @@ -0,0 +1,26 @@ +import torch + + +class TriangularCausalMask(): + def __init__(self, B, L, device="cpu"): + mask_shape = [B, 1, L, L] + with torch.no_grad(): + self._mask = torch.triu(torch.ones(mask_shape, dtype=torch.bool), diagonal=1).to(device) + + @property + def mask(self): + return self._mask + + +class ProbMask(): + def __init__(self, B, H, L, index, scores, device="cpu"): + _mask = torch.ones(L, scores.shape[-1], dtype=torch.bool).to(device).triu(1) + _mask_ex = _mask[None, None, :].expand(B, H, L, scores.shape[-1]) + indicator = _mask_ex[torch.arange(B)[:, None, None], + torch.arange(H)[None, :, None], + index, :].to(device) + self._mask = indicator.view(scores.shape).to(device) + + @property + def mask(self): + return self._mask diff --git a/utils/metrics.py b/utils/metrics.py new file mode 100644 index 0000000000000000000000000000000000000000..3f50ca8c8fb9cbdc719747977cee9f07b3028939 --- /dev/null +++ b/utils/metrics.py @@ -0,0 +1,41 @@ +import numpy as np + + +def RSE(pred, true): + return np.sqrt(np.sum((true - pred) ** 2)) / np.sqrt(np.sum((true - true.mean()) ** 2)) + + +def CORR(pred, true): + u = ((true - true.mean(0)) * (pred - pred.mean(0))).sum(0) + d = np.sqrt(((true - true.mean(0)) ** 2 * (pred - pred.mean(0)) ** 2).sum(0)) + return (u / d).mean(-1) + + +def MAE(pred, true): + return np.mean(np.abs(pred - true)) + + +def MSE(pred, true): + return np.mean((pred - true) ** 2) + + +def RMSE(pred, true): + return np.sqrt(MSE(pred, true)) + + +def MAPE(pred, true): + return np.mean(np.abs((pred - true) / true)) + + +def MSPE(pred, true): + return np.mean(np.square((pred - true) / true)) + + +def metric(pred, true): + mae = MAE(pred, true) + mse = MSE(pred, true) + rmse = RMSE(pred, true) + mape = MAPE(pred, true) + mspe = MSPE(pred, true) + corr = CORR(pred, true) + return mae, mse, rmse, mape, mspe,corr diff --git a/utils/timefeatures.py b/utils/timefeatures.py new file mode 100644 index 0000000000000000000000000000000000000000..7c1297293891c1c86ec938edf95e5fa3f7e52261 --- /dev/null +++ b/utils/timefeatures.py @@ -0,0 +1,148 @@ +# From: gluonts/src/gluonts/time_feature/_base.py +# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"). +# You may not use this file except in compliance with the License. +# A copy of the License is located at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# or in the "license" file accompanying this file. This file is distributed +# on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either +# express or implied. See the License for the specific language governing +# permissions and limitations under the License. + +from typing import List + +import numpy as np +import pandas as pd +from pandas.tseries import offsets +from pandas.tseries.frequencies import to_offset + + +class TimeFeature: + def __init__(self): + pass + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + pass + + def __repr__(self): + return self.__class__.__name__ + "()" + + +class SecondOfMinute(TimeFeature): + """Minute of hour encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return index.second / 59.0 - 0.5 + + +class MinuteOfHour(TimeFeature): + """Minute of hour encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return index.minute / 59.0 - 0.5 + + +class HourOfDay(TimeFeature): + """Hour of day encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return index.hour / 23.0 - 0.5 + + +class DayOfWeek(TimeFeature): + """Hour of day encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return index.dayofweek / 6.0 - 0.5 + + +class DayOfMonth(TimeFeature): + """Day of month encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return (index.day - 1) / 30.0 - 0.5 + + +class DayOfYear(TimeFeature): + """Day of year encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return (index.dayofyear - 1) / 365.0 - 0.5 + + +class MonthOfYear(TimeFeature): + """Month of year encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return (index.month - 1) / 11.0 - 0.5 + + +class WeekOfYear(TimeFeature): + """Week of year encoded as value between [-0.5, 0.5]""" + + def __call__(self, index: pd.DatetimeIndex) -> np.ndarray: + return (index.isocalendar().week - 1) / 52.0 - 0.5 + + +def time_features_from_frequency_str(freq_str: str) -> List[TimeFeature]: + """ + Returns a list of time features that will be appropriate for the given frequency string. + Parameters + ---------- + freq_str + Frequency string of the form [multiple][granularity] such as "12H", "5min", "1D" etc. + """ + + features_by_offsets = { + offsets.YearEnd: [], + offsets.QuarterEnd: [MonthOfYear], + offsets.MonthEnd: [MonthOfYear], + offsets.Week: [DayOfMonth, WeekOfYear], + offsets.Day: [DayOfWeek, DayOfMonth, DayOfYear], + offsets.BusinessDay: [DayOfWeek, DayOfMonth, DayOfYear], + offsets.Hour: [HourOfDay, DayOfWeek, DayOfMonth, DayOfYear], + offsets.Minute: [ + MinuteOfHour, + HourOfDay, + DayOfWeek, + DayOfMonth, + DayOfYear, + ], + offsets.Second: [ + SecondOfMinute, + MinuteOfHour, + HourOfDay, + DayOfWeek, + DayOfMonth, + DayOfYear, + ], + } + + offset = to_offset(freq_str) + + for offset_type, feature_classes in features_by_offsets.items(): + if isinstance(offset, offset_type): + return [cls() for cls in feature_classes] + + supported_freq_msg = f""" + Unsupported frequency {freq_str} + The following frequencies are supported: + Y - yearly + alias: A + M - monthly + W - weekly + D - daily + B - business days + H - hourly + T - minutely + alias: min + S - secondly + """ + raise RuntimeError(supported_freq_msg) + + +def time_features(dates, freq='h'): + return np.vstack([feat(dates) for feat in time_features_from_frequency_str(freq)]) diff --git a/utils/tools.py b/utils/tools.py new file mode 100644 index 0000000000000000000000000000000000000000..a2af390d4cd26c34d48eebcd2e4ae0787de684c3 --- /dev/null +++ b/utils/tools.py @@ -0,0 +1,120 @@ +import os + +import numpy as np +import torch +import matplotlib.pyplot as plt +import pandas as pd +import matplotlib.ticker as ticker +plt.switch_backend('agg') + + +def adjust_learning_rate(optimizer, epoch, args): + # lr = args.learning_rate * (0.2 ** (epoch // 2)) + if args.lradj == 'type1': + lr_adjust = {epoch: args.learning_rate * (0.5 ** ((epoch - 1) // 1))} + elif args.lradj == 'type2': + lr_adjust = { + 2: 5e-5, 4: 1e-5, 6: 5e-6, 8: 1e-6, + 10: 5e-7, 15: 1e-7, 20: 5e-8 + } + if epoch in lr_adjust.keys(): + lr = lr_adjust[epoch] + for param_group in optimizer.param_groups: + param_group['lr'] = lr + print('Updating learning rate to {}'.format(lr)) + + +class EarlyStopping: + def __init__(self, patience=7, verbose=False, delta=0): + self.patience = patience + self.verbose = verbose + self.counter = 0 + self.best_score = None + self.early_stop = False + self.val_loss_min = np.inf + self.delta = delta + + def __call__(self, val_loss, model, path): + score = -val_loss + if self.best_score is None: + self.best_score = score + self.save_checkpoint(val_loss, model, path) + elif score < self.best_score + self.delta: + self.counter += 1 + print(f'EarlyStopping counter: {self.counter} out of {self.patience}') + if self.counter >= self.patience: + self.early_stop = True + else: + self.best_score = score + self.save_checkpoint(val_loss, model, path) + self.counter = 0 + + def save_checkpoint(self, val_loss, model, path): + if self.verbose: + print(f'Validation loss decreased ({self.val_loss_min:.6f} --> {val_loss:.6f}). Saving model ...') + torch.save(model.state_dict(), path + '/' + 'checkpoint.pth') + self.val_loss_min = val_loss + + +class dotdict(dict): + """dot.notation access to dictionary attributes""" + __getattr__ = dict.get + __setattr__ = dict.__setitem__ + __delattr__ = dict.__delitem__ + + +class StandardScaler(): + def __init__(self, mean, std): + self.mean = mean + self.std = std + + def transform(self, data): + return (data - self.mean) / self.std + + def inverse_transform(self, data): + return (data * self.std) + self.mean + + +def visual(true, preds=None, name='./pic/test.pdf'): + """ + Results visualization + """ + plt.figure() + plt.plot(true, label='GroundTruth', linewidth=2) + if preds is not None: + plt.plot(preds, label='Prediction', linewidth=2) + plt.legend() + + # 设置 y 轴刻度格式,保留两位小数 + ax = plt.gca() + ax.yaxis.set_major_formatter(ticker.FormatStrFormatter('%.2f')) + + plt.savefig(name, bbox_inches='tight') + + +def adjustment(gt, pred): + anomaly_state = False + for i in range(len(gt)): + if gt[i] == 1 and pred[i] == 1 and not anomaly_state: + anomaly_state = True + for j in range(i, 0, -1): + if gt[j] == 0: + break + else: + if pred[j] == 0: + pred[j] = 1 + for j in range(i, len(gt)): + if gt[j] == 0: + break + else: + if pred[j] == 0: + pred[j] = 1 + elif gt[i] == 0: + anomaly_state = False + if anomaly_state: + pred[i] = 1 + return gt, pred + + +def cal_accuracy(y_pred, y_true): + return np.mean(y_pred == y_true)