Написал на питоне создание графиков. Без использования сторонних сервисов

This commit is contained in:
Данил 2024-10-06 20:55:06 +03:00
parent 67a9430d83
commit 6cf66cf5bf
9 changed files with 101 additions and 417 deletions

95
chart/chart.py Normal file
View file

@ -0,0 +1,95 @@
import os
import psycopg2
import uvicorn
import yaml
import matplotlib.pyplot as plt
from fastapi import FastAPI, Response, status
from psycopg2.extras import DictCursor
from starlette.staticfiles import StaticFiles
app = FastAPI()
config = yaml.safe_load(open('../config.yaml'))
con = psycopg2.connect(host=config['database']['host'],
user=config['database']['user'],
password=config['database']['password'],
database=config['database']['name'],
port=config['database']['port'])
cur = con.cursor(cursor_factory=DictCursor)
con.autocommit = True
app.mount('/static/charts', StaticFiles(directory='../charts/'))
@app.get("/api/getChart/")
async def get_chart(response: Response,
from_currency: str, conv_currency: str,
start_date: str, end_date: str):
"""
:param response:
:param from_currency: The currency to convert from
:type from_currency: str
:param conv_currency: The currency to be converted into
:type conv_currency: str
:param start_date: The start date of the schedule period
:type start_date: str
:param end_date: The last date of the schedule period
:type end_date: str
:return:
"""
cur.execute('SELECT date, rate FROM currency WHERE (date BETWEEN %s AND %s) '
'AND from_currency = %s AND conv_currency = %s ORDER BY date',
[
start_date, end_date,
from_currency.upper(), conv_currency.upper()
])
con.commit()
data = cur.fetchall()
if not data:
response.status_code = status.HTTP_404_NOT_FOUND
return {'message': 'No data found', 'status_code': status.HTTP_404_NOT_FOUND}
date, rate = [], []
for i in range(len(data)):
date.append(str(data[i][0]))
rate.append(data[i][1])
if rate[0] < rate[-1]:
plt.plot(date, rate, color='green')
elif rate[0] > rate[-1]:
plt.plot(date, rate, color='red')
else:
plt.plot(date, rate, color='grey')
plt.xlabel('Date')
plt.ylabel('Rate')
fig = plt.gcf()
fig.set_size_inches(18.5, 9.5)
if not os.path.exists('../charts'):
os.mkdir('../charts')
fig.savefig(f'../charts/{from_currency}-{conv_currency}.png')
fig.clear()
return {'message': f'./static/charts/{from_currency}-{conv_currency}.png',
'status_code': status.HTTP_201_CREATED,
}
if __name__ == '__main__':
uvicorn.run(app,
host=config['server']['host'],
port=3030,
ssl_keyfile=config['server']['ssl']['private_key']
if config['server']['ssl']['work']
else None,
ssl_certfile=config['server']['ssl']['cert']
if config['server']['ssl']['work']
else None
)