Update app.py
Browse files
app.py
CHANGED
|
@@ -415,15 +415,6 @@ if 'sell_confirm' not in st.session_state:
|
|
| 415 |
st.session_state['sell_confirm'] = False
|
| 416 |
if 'difficulty_level' not in st.session_state:
|
| 417 |
st.session_state['difficulty_level'] = "초등학생" # 기본 난이도 설정
|
| 418 |
-
if 'selected_stock_info' not in st.session_state:
|
| 419 |
-
st.session_state['selected_stock_info'] = None
|
| 420 |
-
if 'selected_stock_sector_info' not in st.session_state:
|
| 421 |
-
st.session_state['selected_stock_sector_info'] = None
|
| 422 |
-
if 'selected_stock_chart' not in st.session_state:
|
| 423 |
-
st.session_state['selected_stock_chart'] = None
|
| 424 |
-
if 'selected_stock_sector_chart' not in st.session_state:
|
| 425 |
-
st.session_state['selected_stock_sector_chart'] = None
|
| 426 |
-
|
| 427 |
|
| 428 |
# --- 뉴스 생성 함수 ---
|
| 429 |
def generate_news():
|
|
@@ -433,27 +424,21 @@ def generate_news():
|
|
| 433 |
difficulty_prompt_map = {
|
| 434 |
"초등학생": {
|
| 435 |
"level_desc": "초등학생 5~6학년 수준",
|
| 436 |
-
"sentence_count": "
|
| 437 |
-
"vocabulary_level": "
|
| 438 |
-
"inference_level": "
|
| 439 |
-
"news_prompt_instructions": "단순한 경제 상황, 쉬운 단어, 짧은 문장, 명확한 정보 위주로 작성. 복잡한 경제 용어, 전문 용어, 추상적인 개념 사용 금지.", # 초등학생용 뉴스 생성 지침 추가
|
| 440 |
-
"explanation_prompt_instructions": "핵심 용어, 쉬운 비유 사용, 짧고 명확한 설명, 3문장 이내 요약", # 초등학생용 해설 지침 추가
|
| 441 |
},
|
| 442 |
"중학생": {
|
| 443 |
"level_desc": "중학생 1~3학년 수준",
|
| 444 |
-
"sentence_count": "12~15",
|
| 445 |
-
"vocabulary_level": "일상적인 어휘와
|
| 446 |
-
"inference_level": "일반적인 경제 흐름과 관련된 추론",
|
| 447 |
-
"news_prompt_instructions": "일상적인 경제 뉴스, 쉬운 경제 용어, 적절한 문장 길이, 일반적인 경제 흐름과 관련, 약간의 추론 필요", # 중학생용 뉴스 생성 지침
|
| 448 |
-
"explanation_prompt_instructions": "기본 경제 용어 설명, 경제 개념 쉬운 풀이, 3~4문장 요약", # 중학생용 해설 지침
|
| 449 |
},
|
| 450 |
"고등학생": {
|
| 451 |
"level_desc": "고등학생 1~3학년 수준",
|
| 452 |
"sentence_count": "15~20", # 고등학생 수준 문장 수 증가
|
| 453 |
-
"vocabulary_level": "다양한 어휘와 경제 전문 용어
|
| 454 |
-
"inference_level": "심층적인 경제 분석 및 다각적인 추론
|
| 455 |
-
"news_prompt_instructions": "심층 경제 뉴스, 경제 전문 용어 적극 사용, 긴 문장, 복잡한 구문, 산업 동향, 경제 정책, 국제 경제, 다각적인 분석과 심층 추론 필요", # 고등학생용 뉴스 생성 지침
|
| 456 |
-
"explanation_prompt_instructions": "전문 경제 용어 해설 포함, 심층적인 경제 분석, 5문장 내외 요약, 다양한 관점 제시", # 고등학생용 해설 지침
|
| 457 |
},
|
| 458 |
}
|
| 459 |
|
|
@@ -463,7 +448,6 @@ def generate_news():
|
|
| 463 |
sentence_count = level_config["sentence_count"]
|
| 464 |
vocabulary_level = level_config["vocabulary_level"]
|
| 465 |
inference_level = level_config["inference_level"]
|
| 466 |
-
news_prompt_instructions = level_config["news_prompt_instructions"] # 난이도별 뉴스 생성 지침 추가
|
| 467 |
|
| 468 |
prompt = f"""
|
| 469 |
지시:
|
|
@@ -473,7 +457,6 @@ def generate_news():
|
|
| 473 |
특정 회사 이름이나 주식 종목을 직접적으로 언급하지 마세요.
|
| 474 |
긍정적 뉴스, 부정적 뉴스, 중립적 뉴스 다양하게 생성하세요.(긍정, 부정, 중립 이라는 말은 표시하지 마세요.)
|
| 475 |
뉴스에 따라 주식이 상승하기도 하고 하락하기도 할 수 있습니다.
|
| 476 |
-
{news_prompt_instructions} # 난이도별 뉴스 생성 지침 추가
|
| 477 |
각 뉴스 기사는 "## 뉴스 [번호]" 로 시작해주세요. (예: ## 뉴스 1, ## 뉴스 2 ...)
|
| 478 |
|
| 479 |
**생성된 뉴스 기사:**
|
|
@@ -510,35 +493,11 @@ def explain_daily_news_meanings(daily_news):
|
|
| 510 |
|
| 511 |
difficulty_level = st.session_state['difficulty_level']
|
| 512 |
difficulty_prompt_map = {
|
| 513 |
-
"초등학생":
|
| 514 |
-
|
| 515 |
-
|
| 516 |
-
"vocabulary_level": "아주 쉬운 어휘와 짧고 명확한 문장 사용", # 더 쉬운 어휘 강조
|
| 517 |
-
"inference_level": "매우 단순하고 직관적인 정보", # 더 단순한 추론
|
| 518 |
-
"news_prompt_instructions": "단순한 경제 상황, 쉬운 단어, 짧은 문장, 명확한 정보 위주로 작성. 복잡한 경제 용어, 전문 용어, 추상적인 개념 사용 금지.", # 초등학생용 뉴스 생성 지침 추가
|
| 519 |
-
"explanation_prompt_instructions": "핵심 용어, 쉬운 비유 사용, 짧고 명확한 설명, 3문장 이내 요약", # 초등학생용 해설 지침 추가
|
| 520 |
-
},
|
| 521 |
-
"중학생": {
|
| 522 |
-
"level_desc": "중학생 1~3학년 수준",
|
| 523 |
-
"sentence_count": "12~15",
|
| 524 |
-
"vocabulary_level": "일상적인 어휘와 기본적인 경제 용어 포함", # 중학생 수준 어휘
|
| 525 |
-
"inference_level": "일반적인 경제 흐름과 관련된 추론",
|
| 526 |
-
"news_prompt_instructions": "일상적인 경제 뉴스, 쉬운 경제 용어, 적절한 문장 길이, 일반적인 경제 흐름과 관련, 약간의 추론 필요", # 중학생용 뉴스 생성 지침
|
| 527 |
-
"explanation_prompt_instructions": "기본 경제 용어 설명, 경제 개념 쉬운 풀이, 3~4문장 요약", # 중학생용 해설 지침
|
| 528 |
-
},
|
| 529 |
-
"고등학생": {
|
| 530 |
-
"level_desc": "고등학생 1~3학년 수준",
|
| 531 |
-
"sentence_count": "15~20", # 고등학생 수준 문장 수 증가
|
| 532 |
-
"vocabulary_level": "다양한 어휘와 경제 전문 용어 적극 사용", # 고등학생 수준 어휘
|
| 533 |
-
"inference_level": "심층적인 경제 분석 및 다각적인 추론 요구", # 고등학생 수준 심층 추론
|
| 534 |
-
"news_prompt_instructions": "심층 경제 뉴스, 경제 전문 용어 적극 사용, 긴 문장, 복잡한 구문, 산업 동향, 경제 정책, 국제 경제, 다각적인 분석과 심층 추론 필요", # 고등학생용 뉴스 생성 지침
|
| 535 |
-
"explanation_prompt_instructions": "전문 경제 용어 해설 포함, 심층적인 경제 분석, 5문장 내외 요약, 다양한 관점 제시", # 고등학생용 해설 지침
|
| 536 |
-
},
|
| 537 |
}
|
| 538 |
-
|
| 539 |
-
level_prompt = level_config["level_desc"]
|
| 540 |
-
explanation_prompt_instructions = level_config["explanation_prompt_instructions"] # 난이도별 해설 지침 추가
|
| 541 |
-
|
| 542 |
|
| 543 |
meanings = {}
|
| 544 |
for i, news_article in enumerate(daily_news):
|
|
@@ -547,8 +506,7 @@ def explain_daily_news_meanings(daily_news):
|
|
| 547 |
{news_article}
|
| 548 |
|
| 549 |
**지시:**
|
| 550 |
-
위 신문 기사의 핵심 의미를 {level_prompt}
|
| 551 |
-
{explanation_prompt_instructions} # 난이도별 해설 지침 추가
|
| 552 |
그리고 이 뉴스와 관련된 주식 섹터 1~2개를 쉼표로 구분해서 "관련 섹터: " 다음에 알려주세요. 관련 섹터가 없다면 "관련 섹터: 없음" 이라고 해주세요.
|
| 553 |
|
| 554 |
뉴스 의미 해설:
|
|
@@ -810,89 +768,67 @@ def display_stock_prices():
|
|
| 810 |
for stock_name, stock_info in sector_stocks.items():
|
| 811 |
price_history = stock_info["price_history"]
|
| 812 |
daily_change_rate_str = " - " # 기본값
|
| 813 |
-
daily_change_color = "gray" # 기본 색상 회색
|
| 814 |
if len(price_history) >= 2:
|
| 815 |
previous_day_price = price_history[-2]
|
| 816 |
current_price = price_history[-1]
|
| 817 |
daily_change_rate = (current_price - previous_day_price) / previous_day_price * 100
|
| 818 |
daily_change_rate_str = f"{daily_change_rate:.2f}%"
|
| 819 |
-
if daily_change_rate > 0:
|
| 820 |
-
daily_change_color = "red" # 상승 시 빨간색
|
| 821 |
-
elif daily_change_rate < 0:
|
| 822 |
-
daily_change_color = "blue" # 하락 시 파란색
|
| 823 |
-
else:
|
| 824 |
-
daily_change_color = "gray" # 보합 시 회색
|
| 825 |
|
| 826 |
stocks_data.append(
|
| 827 |
{
|
| 828 |
-
"섹터": sector,
|
| 829 |
"종목": stock_name,
|
|
|
|
| 830 |
"현재 주가": f"{stock_info['current_price']:,} 원",
|
| 831 |
-
"전일 대비":
|
| 832 |
"price_history": stock_info["price_history"],
|
| 833 |
"description": stock_info["description"],
|
| 834 |
}
|
| 835 |
)
|
| 836 |
stocks_df = pd.DataFrame(stocks_data)
|
|
|
|
| 837 |
|
| 838 |
-
|
| 839 |
-
|
| 840 |
-
|
| 841 |
-
|
| 842 |
-
|
| 843 |
-
|
| 844 |
-
|
| 845 |
-
|
| 846 |
-
|
| 847 |
-
|
| 848 |
-
|
| 849 |
-
|
| 850 |
-
|
| 851 |
-
|
| 852 |
-
|
| 853 |
-
|
| 854 |
-
|
| 855 |
-
|
| 856 |
-
|
| 857 |
-
|
| 858 |
-
|
| 859 |
-
|
| 860 |
-
|
| 861 |
-
|
| 862 |
-
|
| 863 |
-
|
| 864 |
-
|
| 865 |
-
|
| 866 |
-
|
| 867 |
-
|
| 868 |
-
|
| 869 |
-
|
| 870 |
-
|
| 871 |
-
|
| 872 |
-
|
| 873 |
-
"날짜"
|
| 874 |
-
|
| 875 |
-
|
| 876 |
-
|
| 877 |
-
|
| 878 |
-
|
| 879 |
-
|
| 880 |
-
+ 1,
|
| 881 |
-
),
|
| 882 |
-
"주가": st.session_state["stocks"][selected_stock_sector_chart][
|
| 883 |
-
selected_stock_chart
|
| 884 |
-
]["price_history"],
|
| 885 |
-
}
|
| 886 |
-
)
|
| 887 |
-
fig = px.line(
|
| 888 |
-
price_history_df,
|
| 889 |
-
x="날짜",
|
| 890 |
-
y="주가",
|
| 891 |
-
title=f"[{selected_stock_sector_chart}] {selected_stock_chart} 주가 변동",
|
| 892 |
-
)
|
| 893 |
-
st.plotly_chart(fig)
|
| 894 |
-
del st.session_state['selected_stock_chart'] # 세션 상태 삭제
|
| 895 |
-
del st.session_state['selected_stock_sector_chart'] # 세션 상태 삭제
|
| 896 |
|
| 897 |
|
| 898 |
def display_portfolio_table():
|
|
@@ -1025,13 +961,13 @@ def main():
|
|
| 1025 |
|
| 1026 |
with col_main_ui:
|
| 1027 |
menu = st.tabs(
|
| 1028 |
-
['현재 주가
|
| 1029 |
)
|
| 1030 |
|
| 1031 |
with menu[0]:
|
| 1032 |
-
st.subheader("📈 현재 주가 및 기업 정보")
|
| 1033 |
st.markdown("주식 시장의 현재 가격과 기업 정보를 확인하세요.")
|
| 1034 |
-
display_stock_prices()
|
| 1035 |
|
| 1036 |
with menu[1]:
|
| 1037 |
st.subheader("📊 내 포트폴리오")
|
|
|
|
| 415 |
st.session_state['sell_confirm'] = False
|
| 416 |
if 'difficulty_level' not in st.session_state:
|
| 417 |
st.session_state['difficulty_level'] = "초등학생" # 기본 난이도 설정
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 418 |
|
| 419 |
# --- 뉴스 생성 함수 ---
|
| 420 |
def generate_news():
|
|
|
|
| 424 |
difficulty_prompt_map = {
|
| 425 |
"초등학생": {
|
| 426 |
"level_desc": "초등학생 5~6학년 수준",
|
| 427 |
+
"sentence_count": "10~12", # 초등학생 수준 문장 수 조정
|
| 428 |
+
"vocabulary_level": "쉬운 어휘와 짧은 문장", # 초등학생 수준 어휘 강조
|
| 429 |
+
"inference_level": "단순하고 명확한 정보", # 초등학생 수준 추론 정보 강조
|
|
|
|
|
|
|
| 430 |
},
|
| 431 |
"중학생": {
|
| 432 |
"level_desc": "중학생 1~3학년 수준",
|
| 433 |
+
"sentence_count": "12~15", # 중학생 수준 문장 수
|
| 434 |
+
"vocabulary_level": "일상적인 어휘와 약간의 전문 용어", # 중학생 수준 어휘
|
| 435 |
+
"inference_level": "일반적인 경제 흐름과 관련된 추론", # 중학생 수준 추론
|
|
|
|
|
|
|
| 436 |
},
|
| 437 |
"고등학생": {
|
| 438 |
"level_desc": "고등학생 1~3학년 수준",
|
| 439 |
"sentence_count": "15~20", # 고등학생 수준 문장 수 증가
|
| 440 |
+
"vocabulary_level": "다양한 어휘와 경제 전문 용어 포함", # 고등학생 수준 어휘
|
| 441 |
+
"inference_level": "심층적인 경제 분석 및 다각적인 추론", # 고등학생 수준 심층 추론
|
|
|
|
|
|
|
| 442 |
},
|
| 443 |
}
|
| 444 |
|
|
|
|
| 448 |
sentence_count = level_config["sentence_count"]
|
| 449 |
vocabulary_level = level_config["vocabulary_level"]
|
| 450 |
inference_level = level_config["inference_level"]
|
|
|
|
| 451 |
|
| 452 |
prompt = f"""
|
| 453 |
지시:
|
|
|
|
| 457 |
특정 회사 이름이나 주식 종목을 직접적으로 언급하지 마세요.
|
| 458 |
긍정적 뉴스, 부정적 뉴스, 중립적 뉴스 다양하게 생성하세요.(긍정, 부정, 중립 이라는 말은 표시하지 마세요.)
|
| 459 |
뉴스에 따라 주식이 상승하기도 하고 하락하기도 할 수 있습니다.
|
|
|
|
| 460 |
각 뉴스 기사는 "## 뉴스 [번호]" 로 시작해주세요. (예: ## 뉴스 1, ## 뉴스 2 ...)
|
| 461 |
|
| 462 |
**생성된 뉴스 기사:**
|
|
|
|
| 493 |
|
| 494 |
difficulty_level = st.session_state['difficulty_level']
|
| 495 |
difficulty_prompt_map = {
|
| 496 |
+
"초등학생": "초등학생 5~6학년",
|
| 497 |
+
"중학생": "중학생 1~3학년",
|
| 498 |
+
"고등학생": "고등학생 1~3학년",
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 499 |
}
|
| 500 |
+
level_prompt = difficulty_prompt_map.get(difficulty_level, "초등학생 5~6학년") # 기본값 초등학생
|
|
|
|
|
|
|
|
|
|
| 501 |
|
| 502 |
meanings = {}
|
| 503 |
for i, news_article in enumerate(daily_news):
|
|
|
|
| 506 |
{news_article}
|
| 507 |
|
| 508 |
**지시:**
|
| 509 |
+
위 신문 기사의 핵심 의미를 {level_prompt}이 이해하기 쉽게 3문장 이내로 요약해서 "해설: " 다음에 설명해주세요.
|
|
|
|
| 510 |
그리고 이 뉴스와 관련된 주식 섹터 1~2개를 쉼표로 구분해서 "관련 섹터: " 다음에 알려주세요. 관련 섹터가 없다면 "관련 섹터: 없음" 이라고 해주세요.
|
| 511 |
|
| 512 |
뉴스 의미 해설:
|
|
|
|
| 768 |
for stock_name, stock_info in sector_stocks.items():
|
| 769 |
price_history = stock_info["price_history"]
|
| 770 |
daily_change_rate_str = " - " # 기본값
|
|
|
|
| 771 |
if len(price_history) >= 2:
|
| 772 |
previous_day_price = price_history[-2]
|
| 773 |
current_price = price_history[-1]
|
| 774 |
daily_change_rate = (current_price - previous_day_price) / previous_day_price * 100
|
| 775 |
daily_change_rate_str = f"{daily_change_rate:.2f}%"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 776 |
|
| 777 |
stocks_data.append(
|
| 778 |
{
|
|
|
|
| 779 |
"종목": stock_name,
|
| 780 |
+
"섹터": sector,
|
| 781 |
"현재 주가": f"{stock_info['current_price']:,} 원",
|
| 782 |
+
"전일 대비": daily_change_rate_str, # 전일 대비 등락률 추가
|
| 783 |
"price_history": stock_info["price_history"],
|
| 784 |
"description": stock_info["description"],
|
| 785 |
}
|
| 786 |
)
|
| 787 |
stocks_df = pd.DataFrame(stocks_data)
|
| 788 |
+
st.dataframe(stocks_df[["섹터", "종목", "현재 주가", "전일 대비"]], hide_index=True) # "전일 대비" 컬럼 추가
|
| 789 |
|
| 790 |
+
selected_stock_all_info = st.selectbox(
|
| 791 |
+
"종목 선택 (기업 정보 및 주가 그래프)", stocks_df["종목"].tolist()
|
| 792 |
+
)
|
| 793 |
+
if selected_stock_all_info:
|
| 794 |
+
selected_stock_sector = stocks_df[
|
| 795 |
+
stocks_df["종목"] == selected_stock_all_info
|
| 796 |
+
]["섹터"].iloc[0]
|
| 797 |
+
col1_info, col2_graph = st.columns([1, 2])
|
| 798 |
+
|
| 799 |
+
with col1_info:
|
| 800 |
+
st.subheader("기업 정보")
|
| 801 |
+
st.info(
|
| 802 |
+
f"**{selected_stock_all_info} ({selected_stock_sector})**\n\n{st.session_state['stocks'][selected_stock_sector][selected_stock_all_info]['description']}"
|
| 803 |
+
)
|
| 804 |
+
|
| 805 |
+
with col2_graph:
|
| 806 |
+
st.subheader("주가 그래프")
|
| 807 |
+
price_history_df = pd.DataFrame(
|
| 808 |
+
{
|
| 809 |
+
"날짜": range(
|
| 810 |
+
1,
|
| 811 |
+
len(
|
| 812 |
+
st.session_state["stocks"][selected_stock_sector][
|
| 813 |
+
selected_stock_all_info
|
| 814 |
+
]["price_history"]
|
| 815 |
+
)
|
| 816 |
+
+ 1,
|
| 817 |
+
),
|
| 818 |
+
"주가": st.session_state["stocks"][selected_stock_sector][
|
| 819 |
+
selected_stock_all_info
|
| 820 |
+
]["price_history"],
|
| 821 |
+
}
|
| 822 |
+
)
|
| 823 |
+
fig = px.line(
|
| 824 |
+
price_history_df,
|
| 825 |
+
x="날짜",
|
| 826 |
+
y="주가",
|
| 827 |
+
title=f"{selected_stock_all_info} ({selected_stock_sector}) 주가 변동",
|
| 828 |
+
)
|
| 829 |
+
st.plotly_chart(fig)
|
| 830 |
+
else:
|
| 831 |
+
st.info("종목을 선택하여 기업 정보와 주가 그래프를 확인하세요.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 832 |
|
| 833 |
|
| 834 |
def display_portfolio_table():
|
|
|
|
| 961 |
|
| 962 |
with col_main_ui:
|
| 963 |
menu = st.tabs(
|
| 964 |
+
['현재 주가', '내 포트폴리오', '주식 매수', '주식 매도', '어제 뉴스 해설']
|
| 965 |
)
|
| 966 |
|
| 967 |
with menu[0]:
|
| 968 |
+
st.subheader("📈 현재 주가 및 기업 정보")
|
| 969 |
st.markdown("주식 시장의 현재 가격과 기업 정보를 확인하세요.")
|
| 970 |
+
display_stock_prices()
|
| 971 |
|
| 972 |
with menu[1]:
|
| 973 |
st.subheader("📊 내 포트폴리오")
|