File size: 5,826 Bytes
b9cf696 687d3dc b8aa6cf b9cf696 b8aa6cf b9cf696 b8aa6cf b9cf696 2bdbf95 b9cf696 b8aa6cf b9cf696 8130080 b9cf696 b8aa6cf b9cf696 b8aa6cf b9cf696 b8aa6cf b9cf696 b8aa6cf b9cf696 b8aa6cf b9cf696 e9fe77c b8aa6cf b9cf696 b8aa6cf b9cf696 ac80e92 b9cf696 97a16e9 b9cf696 97a16e9 e9fe77c 97a16e9 b9cf696 97a16e9 b9cf696 97a16e9 b9cf696 97a16e9 b9cf696 b8aa6cf 97a16e9 b8aa6cf b9cf696 aee3e85 97a16e9 b9cf696 97a16e9 b9cf696 97a16e9 467f517 97a16e9 b9cf696 97a16e9 c17ae48 b8aa6cf c17ae48 8d3265b 97a16e9 b9cf696 97a16e9 b9cf696 aee3e85 97a16e9 2bdbf95 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
# νμν λΌμ΄λΈλ¬λ¦¬ μ€μΉ λ° μ
λ°μ΄νΈ
import subprocess
subprocess.run(["pip", "install", "--upgrade", "pip"])
subprocess.run(["pip", "install", "--upgrade", "yfinance", "gradio", "matplotlib", "Pillow"])
# λΌμ΄λΈλ¬λ¦¬ μν¬νΈ
import yfinance as yf
import gradio as gr
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import numpy as np
import pandas as pd
import re
import io
from PIL import Image
from datetime import datetime, timedelta
# λλκ³ λ ν°νΈ μ€μΉ λ° μ μ©
def install_nanum_font():
try:
subprocess.run(["apt-get", "update"], check=True)
subprocess.run(["apt-get", "install", "-y", "fonts-nanum"], check=True)
subprocess.run(["fc-cache", "-fv"], check=True)
plt.rcParams['font.family'] = 'NanumGothic'
except Exception as e:
print(f"ν°νΈ μ€μΉ μ€ μ€λ₯κ° λ°μνμ΅λλ€: {e}")
install_nanum_font()
# λ΄μ€ μμ½ ν¨μ (μ¬κΈ°μλ κ°λ¨ν μμλ‘ μ²λ¦¬)
def get_real_news_summary(company, date):
# μ€μ APIλ₯Ό μ¬μ©ν μ μλ νκ²½μ΄λ―λ‘, κ°λ¨ν λ¬Έμμ΄λ‘ λ체ν©λλ€.
return f"{company}μ {date} μ£Όλ³ λ΄μ€ μμ½μ
λλ€."
def handle_click(company_name, date_clicked):
return get_real_news_summary(company_name, date_clicked)
def update_news(input_value, selected_date):
if not selected_date:
return "λ μ§λ₯Ό μ νν΄μ£ΌμΈμ."
else:
ticker = name_to_ticker.get(input_value, input_value)
company_name = ticker_to_name.get(ticker, input_value)
return handle_click(company_name, selected_date)
# μ’
λͺ©λͺ
κ³Ό ν°μ»€ λ§€ν λμ
λ리
name_to_ticker = {
"SKλ°μ΄μ€ν": "326030.KS",
"λμ€λ₯ μμ΄ 1μ": "AAPL",
"λμ€λ₯ λ°μ΄μ€ν
μμ΄ 1μ": "AMGN",
"λμ€λ₯ ν¬μ€μΌμ΄ μμ΄ 1μ": "JNJ",
"μ½μ€νΌ μμ΄ 1μ": "005930.KS",
"μ½μ€λ₯ μμ΄ 1μ": "247540.KQ", # μμ½νλ‘λΉμ
}
ticker_to_name = {v: k for k, v in name_to_ticker.items()}
# μ£Όκ° λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ κ·Έλνλ₯Ό 그리λ ν¨μ
def display_stock_with_highlight(input_value, change_type, percent_change):
try:
ticker = name_to_ticker.get(input_value, input_value)
stock = yf.Ticker(ticker)
stock_data = stock.history(period="5y")
if stock_data.empty:
return "μ£Όκ° λ°μ΄ν°λ₯Ό μ°Ύμ μ μμ΅λλ€.", gr.Dropdown.update(choices=[])
stock_data['Change'] = stock_data['Close'].pct_change() * 100
percent_change = float(percent_change)
if change_type == "μμΉ":
highlight_data = stock_data[stock_data['Change'] >= percent_change]
color = "darkorange"
elif change_type == "νλ½":
highlight_data = stock_data[stock_data['Change'] <= -percent_change]
color = "purple"
else:
return "Invalid change type", gr.Dropdown.update(choices=[])
dates = stock_data.index
closing_prices = stock_data['Close']
plt.figure(figsize=(10, 6))
plt.plot(dates, closing_prices, color='gray', label=input_value)
plt.scatter(highlight_data.index, highlight_data['Close'], color=color, label=f'{change_type} ν¬μΈνΈ')
for index, row in highlight_data.iterrows():
plt.text(index, row['Close'], index.strftime('%Y-%m-%d'), fontsize=8, color=color, ha='right')
plt.axvline(x=index, color=color, linestyle='--', linewidth=1)
company_name = ticker_to_name.get(ticker, input_value)
plt.title(f'{company_name} μ£Όκ° μΆμ΄')
plt.xlabel('λ μ§')
plt.ylabel('μ’
κ°')
plt.legend()
buf = io.BytesIO()
plt.savefig(buf, format='png')
plt.close()
buf.seek(0)
img = Image.open(buf)
highlight_dates = highlight_data.index.strftime('%Y-%m-%d').tolist()
return img, gr.Dropdown.update(choices=highlight_dates)
except Exception as e:
print(f"Error: {e}")
return f"λ°μ΄ν° μ²λ¦¬ μ€ μ€λ₯κ° λ°μνμ΅λλ€: {e}", gr.Dropdown.update(choices=[])
# Gradio μΈν°νμ΄μ€ μμ± (3μ΄ λ μ΄μμ)
with gr.Blocks() as demo:
gr.Markdown("## μ£Όκ° κ·Έλνμ λ΄μ€ μμ½")
with gr.Row():
with gr.Column():
input_value = gr.Textbox(label="μ’
λͺ©λͺ
λλ ν°μ»€ μ
λ ₯", placeholder="μ: SKλ°μ΄μ€ν, AAPL")
change_type = gr.Dropdown(choices=["μμΉ", "νλ½"], label="μμΉ λλ νλ½ μ ν", value="μμΉ")
percent_change = gr.Textbox(label="λ³λ νΌμΌνΈ (%)", placeholder="μ: 10", value="10")
submit_btn = gr.Button("Submit")
examples = [["SKλ°μ΄μ€ν"],
["λμ€λ₯ μμ΄ 1μ"],
["λμ€λ₯ λ°μ΄μ€ν
μμ΄ 1μ"],
["λμ€λ₯ ν¬μ€μΌμ΄ μμ΄ 1μ"],
["μ½μ€νΌ μμ΄ 1μ"],
["μ½μ€λ₯ μμ΄ 1μ"]]
gr.Examples(examples=examples, inputs=[input_value])
with gr.Column():
plot = gr.Image(label="μ£Όκ° κ·Έλν")
date_dropdown = gr.Dropdown(label="쑰건μ ν΄λΉνλ λ μ§ μ ν", choices=[])
with gr.Column():
news_output = gr.Markdown(label="λ΄μ€ μμ½", value="") # λΉ μΉΈμΌλ‘ κΈ°λ³Έ νμ
# Submit λ²νΌ ν΄λ¦ μ κ·Έλν λ° λ μ§ λλ‘λ€μ΄ μ
λ°μ΄νΈ
submit_btn.click(
fn=display_stock_with_highlight,
inputs=[input_value, change_type, percent_change],
outputs=[plot, date_dropdown]
)
# λ μ§ μ ν μ λ΄μ€ μμ½ μ
λ°μ΄νΈ
date_dropdown.change(
fn=update_news,
inputs=[input_value, date_dropdown],
outputs=[news_output]
)
demo.launch()
|