ll7098ll commited on
Commit
4da43c5
·
verified ·
1 Parent(s): 83ee45b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +61 -125
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": "8~10", # 짧은 문장
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
- "level_desc": "초등학생 5~6학년",
515
- "sentence_count": "8~10", # 더 짧은 문장
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
- level_config = difficulty_prompt_map.get(difficulty_level, difficulty_prompt_map["초등학생"]) # 기본값 초등학생
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
- "전일 대비": f'<span style="color:{daily_change_color};">{daily_change_rate_str}</span>', # 색상 적용
832
  "price_history": stock_info["price_history"],
833
  "description": stock_info["description"],
834
  }
835
  )
836
  stocks_df = pd.DataFrame(stocks_data)
 
837
 
838
- sector_list = stocks_df['섹터'].unique() # 섹터 목록 추출
839
-
840
- for sector in sector_list: # 섹터별로 정보 표시
841
- st.subheader(f"[{sector}]")
842
- sector_df = stocks_df[stocks_df['섹터'] == sector].reset_index(drop=True) # 섹터별 데이터프레임 생성
843
- for index, row in sector_df.iterrows(): # 섹터별 데이터프레임 순회
844
- col1, col2, col3, col4, col5 = st.columns([2, 2, 1.5, 1.5, 1]) # 컬럼 너비 조정
845
- with col1:
846
- st.markdown(f"**{row['종목']}**") # 종목명 굵게 표시
847
- with col2:
848
- st.metric(label="현재 주가", value=row['현재 주가']) # 현재 주가 metric 스타일 적용
849
- with col3:
850
- st.markdown(f"전일 대비: {row['전일 대비']}", unsafe_allow_html=True) # 전일 대비 등락률 및 색상 적용
851
- with col4:
852
- if st.button("기업 정보", key=f"info_{index}_{sector}", use_container_width=True): # 기업 정보 버튼
853
- st.session_state['selected_stock_info'] = row['종목'] # 선택 종목 저장
854
- st.session_state['selected_stock_sector_info'] = row['섹터'] # 선택 섹터 저장
855
- with col5:
856
- if st.button("주가 그래프", key=f"chart_{index}_{sector}", use_container_width=True): # 주가 그래프 버튼
857
- st.session_state['selected_stock_chart'] = row['종목'] # 선택 종목 저장
858
- st.session_state['selected_stock_sector_chart'] = row['섹터'] # 선택 섹터 저장
859
- st.markdown("---") # 섹터 구분선
860
-
861
- if 'selected_stock_info' in st.session_state: # 기업 정보 표시
862
- selected_stock_info = st.session_state['selected_stock_info']
863
- selected_stock_sector_info = st.session_state['selected_stock_sector_info']
864
- st.info(f"**[{selected_stock_sector_info}] {selected_stock_info}**\n\n{st.session_state['stocks'][selected_stock_sector_info][selected_stock_info]['description']}")
865
- del st.session_state['selected_stock_info'] # 세션 상태 삭제
866
- del st.session_state['selected_stock_sector_info'] # 세션 상태 삭제
867
-
868
- if 'selected_stock_chart' in st.session_state: # 주가 그래프 표시
869
- selected_stock_chart = st.session_state['selected_stock_chart']
870
- selected_stock_sector_chart = st.session_state['selected_stock_sector_chart']
871
- price_history_df = pd.DataFrame(
872
- {
873
- "날짜": range(
874
- 1,
875
- len(
876
- st.session_state["stocks"][selected_stock_sector_chart][
877
- selected_stock_chart
878
- ]["price_history"]
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("📊 내 포트폴리오")