Последовательности 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).