본문 바로가기
Python

[Python] FastAPI를 사용해서 서버 만들기

by teamnova 2024. 3. 3.

https://stickode.tistory.com/1051

https://stickode.tistory.com/1062

저번 시간에 이어서, 오늘은 DB에 저장해둔 데이터를 시각화해보겠습니다. 코드에서 user와 password는 본인의 DB 설정에 맞게 변경하셔야합니다. 

 

MariaDB에는 다음과 같은 테이블을 추가하시면 됩니다.

CREATE TABLE trades (
    type VARCHAR(50),
    code VARCHAR(20),
    timestamp BIGINT,
    trade_date DATE,
    trade_time TIME,
    trade_timestamp BIGINT,
    trade_price DECIMAL(20, 4),
    trade_volume DECIMAL(20, 8),
    ask_bid VARCHAR(10),
    prev_closing_price DECIMAL(20, 8),
    `change` VARCHAR(10),
    change_price DECIMAL(20, 4),
    sequential_id BIGINT,
    stream_type VARCHAR(20)
);

 

main.py

# 아래 명령어로 패키지 다운로드 받은 후 실행해야합니다.
# pip install fastapi uvicorn pymysql matplotlib pandas
# uvicorn main:app --reload

from fastapi import FastAPI
from fastapi.responses import HTMLResponse
import pandas as pd
import pymysql
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from io import BytesIO
import base64

app = FastAPI()

@app.get("/btc-price-plot", response_class=HTMLResponse)
async def read_item():
    # 데이터베이스 연결
    db = pymysql.connect(host='localhost', user='root', password='root', db='stickode_231204_upbit', charset='utf8mb4')
    cursor = db.cursor()
    query = "SELECT trade_date, trade_price FROM trades WHERE code = 'KRW-BTC' ORDER BY trade_date"
    df = pd.read_sql(query, db)

    # 그래프 생성
    plt.figure(figsize=(10, 6))
    ax = plt.gca()
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
    ax.xaxis.set_major_locator(mdates.AutoDateLocator())
    plt.xticks(rotation=45)
    plt.plot(df['trade_date'], df['trade_price'])
    plt.title('Trade Price Over Time')
    plt.xlabel('Trade Date')
    plt.ylabel('Trade Price')
    plt.tight_layout()

    # 그래프를 HTML로 변환
    buf = BytesIO()
    plt.savefig(buf, format='png')
    buf.seek(0)
    img_base64 = base64.b64encode(buf.getvalue()).decode('utf-8')
    db.close()
    return f'<img src="data:image/png;base64,{img_base64}"/>'

 

실행 영상