Add bitcoin price predictor for external tool server
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
from fastapi import FastAPI, HTTPException
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
app = FastAPI(
|
||||
title="Bitcoin Price Predictor",
|
||||
description="Bitcoin Price Predictor",
|
||||
version="1.0.0",
|
||||
)
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
bitcoin_price_data = pd.read_csv("btcusd_1-min_data.csv")
|
||||
bitcoin_price_data["Timestamp"] = pd.to_datetime(
|
||||
bitcoin_price_data["Timestamp"], unit='s')
|
||||
|
||||
|
||||
class BitcoinPriceQueryForm(BaseModel):
|
||||
date: str = Field(
|
||||
..., description="This is desired date time for bitcoin price and time format is YYYY-MM-DD (e.g., 2024-01-01)"
|
||||
)
|
||||
|
||||
|
||||
class BitcoinPriceTrendQueryForm(BaseModel):
|
||||
start_date: str = Field(
|
||||
..., description="This is desired start date time for bitcoin price trend and time format is YYYY-MM-DD (e.g., 2023-01-01)"
|
||||
)
|
||||
end_date: str = Field(
|
||||
..., description="This is desired end date time for bitcoin price trend and time format is YYYY-MM-DD (e.g., 2024-01-01)"
|
||||
)
|
||||
|
||||
|
||||
class BitcoinPriceStatQueryForm(BaseModel):
|
||||
start_date: str = Field(
|
||||
..., description="This is desired start date time for bitcoin price state and time format is YYYY-MM-DD (e.g., 2023-01-01)"
|
||||
)
|
||||
end_date: str = Field(
|
||||
..., description="This is desired end date time for bitcoin price state and time format is YYYY-MM-DD (e.g., 2024-01-01)"
|
||||
)
|
||||
|
||||
|
||||
@app.post("/get_price_by_date", summary="Get Bitcoin price by date")
|
||||
async def get_price_by_date(form_data: BitcoinPriceQueryForm):
|
||||
print(form_data)
|
||||
start_date = pd.to_datetime(form_data.date)
|
||||
end_date = start_date + pd.Timedelta(days=1)
|
||||
|
||||
date_query_result = bitcoin_price_data[(
|
||||
bitcoin_price_data["Timestamp"] >= start_date) & (bitcoin_price_data["Timestamp"] < end_date)]
|
||||
|
||||
if date_query_result.empty:
|
||||
raise HTTPException(
|
||||
status_code=404, detail="No data found for the specified date")
|
||||
|
||||
date_query_result_mean = date_query_result.mean(
|
||||
numeric_only=True)
|
||||
return date_query_result_mean.to_dict()
|
||||
|
||||
|
||||
@app.post("/get_stat_by_date_range", summary="Get Bitcoin price status by date range")
|
||||
async def get_stat_by_date_range(form_data: BitcoinPriceStatQueryForm):
|
||||
start_date = pd.to_datetime(form_data.start_date)
|
||||
end_date = pd.to_datetime(form_data.end_date)
|
||||
date_query_result = bitcoin_price_data[(
|
||||
bitcoin_price_data["Timestamp"] >= start_date) & (bitcoin_price_data["Timestamp"] < end_date)]
|
||||
|
||||
if date_query_result.empty:
|
||||
raise HTTPException(
|
||||
status_code=404, detail="No data found for the specified date range")
|
||||
|
||||
highest_price = date_query_result["High"].max()
|
||||
lowest_price = date_query_result["Low"].min()
|
||||
average_price = date_query_result["Close"].mean()
|
||||
|
||||
return {
|
||||
"highest_price": highest_price,
|
||||
"lowest_price": lowest_price,
|
||||
"average_price": average_price
|
||||
}
|
||||
|
||||
|
||||
@app.post("/get_trend_by_date_range", summary="Get Bitcoin price status by date range")
|
||||
async def get_trend_by_date_range(form_data: BitcoinPriceTrendQueryForm):
|
||||
start_date = pd.to_datetime(form_data.start_date)
|
||||
end_date = pd.to_datetime(form_data.end_date)
|
||||
date_difference = (end_date - start_date).days
|
||||
|
||||
if date_difference > 30:
|
||||
raise HTTPException(
|
||||
status_code=400, detail="Date range ovred 30 days")
|
||||
|
||||
date_query_result = bitcoin_price_data[(
|
||||
bitcoin_price_data["Timestamp"] >= start_date) & (bitcoin_price_data["Timestamp"] < end_date)]
|
||||
|
||||
if date_query_result.empty:
|
||||
raise HTTPException(
|
||||
status_code=404, detail="No data found for the specified date range")
|
||||
|
||||
daily_data = date_query_result.resample('D', on='Timestamp').agg({
|
||||
'Open': 'first',
|
||||
'High': 'max',
|
||||
'Low': 'min',
|
||||
'Close': 'last',
|
||||
'Volume': 'sum'
|
||||
})
|
||||
|
||||
daily_data = daily_data.dropna()
|
||||
|
||||
result = {
|
||||
'Open': daily_data['Open'].tolist(),
|
||||
'High': daily_data['High'].tolist(),
|
||||
'Low': daily_data['Low'].tolist(),
|
||||
'Close': daily_data['Close'].tolist(),
|
||||
'Volume': daily_data['Volume'].tolist()
|
||||
}
|
||||
|
||||
return result
|
||||
|
||||
|
||||
@app.get("/get_current_date", summary="Get current date")
|
||||
async def get_current_date():
|
||||
return datetime.now().strftime("%Y-%m-%d")
|
||||
Reference in New Issue
Block a user