bitcoin-data-analysis / prediction.py
josoroma's picture
Update prediction.py
1df06ba
Raw
History Blame Contribute Delete
3.41 kB
from datetime import timedelta
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import logging
logging.basicConfig(level=logging.INFO)
def convert_to_datetime(df):
"""Convert columns to datetime format to prevent errors during subtraction."""
datetime_columns = ["time_period_start", "time_period_end", "time_open", "time_close"]
for col in datetime_columns:
try:
df[col] = pd.to_datetime(df[col])
except Exception as e:
logging.error(f"Error converting column {col} to datetime: {e}")
return df
def prepare_data_for_regression(df):
"""Prepare data for the linear regression model by extracting date components."""
df["hour"] = df["time_period_start"].dt.hour
df["day"] = df["time_period_start"].dt.day
df["month"] = df["time_period_start"].dt.month
df["year"] = df["time_period_start"].dt.year
return df
def create_future_dataframe(greatest_date):
"""Create a future dataframe for forecasting the next one week."""
future_dates = pd.date_range(start=greatest_date, periods=7*24, freq='H')
future_df = pd.DataFrame({"time_period_start": future_dates})
future_df["time_period_end"] = future_df["time_period_start"] + timedelta(hours=1)
future_df = prepare_data_for_regression(future_df)
return future_df
def forecast_column(df, future_df, col):
"""Forecast a single column using a linear regression model."""
try:
X = df[["hour", "day", "month", "year"]]
y = df[col].fillna(df[col].mean()) # Filling NaN values with mean
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
model = LinearRegression()
model.fit(X_train, y_train)
future_X = future_df[["hour", "day", "month", "year"]]
future_df[col] = model.predict(future_X)
except Exception as e:
logging.error(f"Error forecasting column {col}: {e}")
def append_forecasted_data(df):
"""Append forecasted data to the original dataframe."""
df = convert_to_datetime(df)
df = prepare_data_for_regression(df)
greatest_date = df["time_period_start"].max()
future_df = create_future_dataframe(greatest_date)
forecast_columns = [
"price_open", "price_high", "price_low", "price_close",
"volume_traded", "trades_count", "volatility", "trade_velocity",
"rolling_mean", "rolling_std", "bollinger_upper", "bollinger_lower",
"ma50", "ma200", "vwap", "rsi", "ema12", "ema26", "macd", "macd_signal"
]
for col in forecast_columns:
forecast_column(df, future_df, col)
# Calculate forecasted time_open and time_close based on average time differences
avg_time_to_open = (df['time_open'] - df['time_period_start']).mean()
avg_time_to_close = (df['time_period_end'] - df['time_close']).mean()
future_df['time_open'] = future_df['time_period_start'] + avg_time_to_open
future_df['time_close'] = future_df['time_period_end'] - avg_time_to_close
# Create a reversed version of future_df
reversed_future_df = future_df.iloc[::-1].reset_index(drop=True)
reversed_future_df = reversed_future_df.iloc[1:-1].reset_index(drop=True)
# Prepend the reversed data to the existing data
df = pd.concat([reversed_future_df, df], ignore_index=True)
return df