Последовательности Python

def prepare_data(btc_data, sequence_length=50):
    volatility = calculate_volatility(btc_data)
    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_volatility = scaler.fit_transform(volatility.values.reshape(-1, 1))
    dropped_elements = len(volatility) - len(scaled_volatility)
    print(f"Scaled volatility. Shape: {scaled_volatility.shape}. Dropped elements: {dropped_elements}. Last element: {scaled_volatility[-1]}\n")
    
    remainder = len(scaled_volatility) % sequence_length
    if remainder != 0:
       scaled_volatility = scaled_volatility[remainder:] 

    sequences = [scaled_volatility[i-sequence_length:i] for i in range(len(scaled_volatility))]
    print('len0', len(sequences))

    sequences = np.array(sequences)

    print('len2', len(sequences))

    dropped_elements = len(scaled_volatility) - len(sequences)
    print(f"Created sequences. Shape: {sequences.shape}. Dropped elements: {dropped_elements}. Last sequence: {sequences[-1]}\n")

    X, y = [], []
    for i, seq in enumerate(sequences):
       if len(seq) > 1: 
           X.append(seq[:-1])
           y.append(seq[-1])
       else:
           print(f"Warning: Skipping sequence at index {i}.")


    X = np.array(X)
    print('X=', len(X))
    y = np.array(y)
    print('Y=', len(y))

    X = X.reshape((X.shape[0], X.shape[1], 1))
    print(f"Created features and targets. X: {X.shape}, y: {y.shape}. Last target: {y[-1]}")
    
    return X, y, scaler

Вывод:

Scaled volatility. Shape: (3600, 1). Dropped elements: 0. Last element: [0.13564132]

len0 3600
len2 3600
Created sequences. Shape: (3600,). Dropped elements: 0. Last sequence: [[0.14603776]
X= 3550
Y= 3550
Created features and targets. X: (3550, 49, 1), y: (3550, 1). Last target: [0.1486066]

Ошибки:

Warning: Skipping sequence at index 0. ...
Warning: Skipping sequence at index 49.

Пример последовательности:

[[0.14603776]
 [0.1320326 ]
 [0.14490624]
 [0.14292869]
 [0.14427698]
 [0.13009581]
 [0.12874013]
 [0.13173826]
 [0.13373892]
 [0.13228329]
 [0.13028233]
 [0.13685486]
 [0.1331477 ]
 [0.13320048]
 [0.16883058]
 [0.17050599]
 [0.15916104]
 [0.15926529]
 [0.16016734]
 [0.14752804]
 [0.16454389]
 [0.14372734]
 [0.15487648]
 [0.15316725]
 [0.15545876]
 [0.1441532 ]
 [0.13711675]
 [0.13947398]
 [0.1090847 ]
 [0.11225742]
 [0.11426539]
 [0.1138071 ]
 [0.10624432]
 [0.12040211]
 [0.13672486]
 [0.1393177 ]
 [0.13365899]
 [0.13769882]
 [0.13645093]
 [0.13295063]
 [0.13164155]
 [0.135437  ]
 [0.14984011]
 [0.14566126]
 [0.16358656]
 [0.1637303 ]
 [0.17560139]
 [0.16353703]
 [0.14609725]
 [0.1486066 ]]

Добавленное пояснение:

КОРОТКО: Получение и нормализация данных. Удаление лишних данных для кратности. Создание последовательностей длиной sequence_length. Разделение на входные данные (X) и целевые значения (y). Преобразование данных для использования в модели.

    volatility = calculate_volatility(btc_data)

Вызывается функция calculate_volatility(), которая вычисляет волатильность на основе данных.

    scaler = MinMaxScaler(feature_range=(0, 1))
    scaled_volatility = scaler.fit_transform(volatility.values.reshape(-1, 1))

MinMaxScaler — масштабирует данные в диапазоне от 0 до 1, чтобы улучшить обучение модели. volatility.values.reshape(-1, 1) — преобразует данные в столбец (2D массив), что требуется для скалера.

    dropped_elements = len(volatility) - len(scaled_volatility)
    print(f"Scaled volatility. Shape: {scaled_volatility.shape}. Dropped elements: {dropped_elements}. Last element: {scaled_volatility[-1]}\n")

Считает, сколько элементов могло быть потеряно при обработке данных. Выводит информацию о форме массива и последнем элементе.

    remainder = len(scaled_volatility) % sequence_length
    if remainder != 0:
       scaled_volatility = scaled_volatility[remainder:] 

Чтобы при разбиении данных на последовательности длиной sequence_length не оставалось неполных последовательностей. Если остаток (remainder) не равен нулю, первые элементы удаляются, чтобы длина массива была кратной 50.

sequences = [scaled_volatility[i-sequence_length:i] for i in range(len(scaled_volatility))]
    print('len0', len(sequences))

Цикл создает списки длиной sequence_length, беря 50 элементов подряд.

 sequences = np.array(sequences)
    print('len2', len(sequences))

Преобразует список последовательностей в массив NumPy для работы с машинным обучением.

X, y = [], []
    for i, seq in enumerate(sequences):
       if len(seq) > 1: 
           X.append(seq[:-1])  # Все элементы кроме последнего
           y.append(seq[-1])   # Последний элемент как целевое значение
       else:
           print(f"Warning: Skipping sequence at index {i}.")

Разделяет последовательность: В X кладутся все элементы, кроме последнего ([:-1]), В y — последний элемент последовательности ([-1]).

X = np.array(X)
    print('X=', len(X))
    y = np.array(y)
    print('Y=', len(y))

Преобразует списки X и y в массивы NumPy. Выводит количество сформированных выборок.

  X = X.reshape((X.shape[0], X.shape[1], 1))
    print(f"Created features and targets. X: {X.shape}, y: {y.shape}. Last target: {y[-1]}")

Преобразует X в 3D-форму [samples, timesteps, features], так как это формат, ожидаемый рекур нейронными сетями (LSTM/GRU).


Ответы (0 шт):