You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.1 KiB

import time
from datetime import datetime
from random import uniform
from flask import Flask, jsonify, request
from flask_cors import CORS
from utils import get_historical_data, load_data
app = Flask(__name__)
CORS(app)
start_time = time.time()
historical_data = load_data()
@app.route('/exchange_rate/<symbol>')
def get_stock_data(symbol):
if symbol not in list(historical_data.keys()):
response = jsonify({"error": "Invalid symbol"})
response.status_code = 404
return response
current_time = time.time()
last_value = historical_data[symbol].iloc[-1].Close
step = (int(current_time * 10) - int(start_time * 10)
) % len(historical_data[symbol])
return jsonify({
'currency': 'USD',
'rate': last_value * (1 + uniform(0.05, -0.05) + step * 0.0005),
'datetime': datetime.fromtimestamp(current_time)
})
@app.route('/hist/<symbol>')
def get_hist_data(symbol):
if symbol not in list(historical_data.keys()):
response = jsonify({"error": "Invalid symbol"})
response.status_code = 404
return response
df = historical_data[symbol]
args = request.args
start_date = args.get("start_date")
end_date = args.get("end_date")
if not start_date or not end_date:
response = jsonify({"error": "start_date and end_date required"})
response.status_code = 400
return response
try:
filtered = get_historical_data(df, start_date, end_date, start_time)
data = filtered[['datetime', 'Close']].to_dict(orient="list")
values = [
{"date": dt.date(), "close": close}
for dt, close in zip(data["datetime"], data["Close"])]
response = jsonify({
"currency": 'USD',
"values": values,
})
return response
except Exception as e:
response = jsonify({'error': str(e)})
response.status_code = 400
return response
@app.route('/stocks_list')
def list_symbols():
return jsonify(list(historical_data.keys()))
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5001)