Kims12 commited on
Commit
b6454ba
·
verified ·
1 Parent(s): ec888be

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -68
app.py CHANGED
@@ -1,87 +1,64 @@
1
  import gradio as gr
2
  import pandas as pd
 
3
  import logging
4
- from io import BytesIO
5
- import tempfile
6
- import os
7
 
8
  # 로그 설정
9
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
 
10
 
11
- def analyze_reviews(file):
12
- logging.info("파일 업로드 시작")
13
  try:
14
- # 바이너리 데이터를 BytesIO로 변환
15
- file_bytes = BytesIO(file)
16
  # 엑셀 파일 읽기
17
- df = pd.read_excel(file_bytes, engine='openpyxl')
18
- logging.info("엑셀 파일 읽기 완료")
19
- except Exception as e:
20
- logging.error(f"엑셀 파일 읽기 오류: {e}")
21
- return f"엑셀 파일을 읽는 중 오류가 발생했습니다: {e}"
22
 
23
- try:
24
- # 현재 기준 연도 설정 (2025년 기준)
25
  current_year = 2025
26
  start_year = current_year - 3 # 최근 3년
27
 
28
- logging.info("리뷰 날짜 처리 시작")
29
- # B열에 있는 리뷰 날짜를 datetime 형식으로 변환
30
- df['리뷰날짜'] = pd.to_datetime(df.iloc[:, 1], errors='coerce')
31
- # 연도 및 월 필터링
32
- df_filtered = df[(df['리뷰날짜'].dt.year >= start_year) & (df['리뷰날짜'].dt.year < current_year)]
33
- logging.info("리뷰 날짜 필터링 완료")
34
-
35
- # 년월별 리뷰 건수 집계
36
- logging.info("년월별 리뷰 건수 집계 시작")
37
- df_filtered['년월'] = df_filtered['리뷰날짜'].dt.strftime('%Y-%m')
38
- review_counts = df_filtered.groupby('년월').size().reset_index(name='리뷰건수')
39
- logging.info("년월별 리뷰 건수 집계 완료")
40
 
41
- # 새로운 시트에 데이터 작성
42
- logging.info("새로운 시트 생성 데이터 작성 시작")
43
- # 기존 시트를 유지하면서 새로운 시트를 추가하기 위해 전체 시트를 읽고 다시 씁니다
44
- file_bytes.seek(0)
45
- with pd.ExcelWriter(file_bytes, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
46
- review_counts.to_excel(writer, sheet_name='월별 리뷰건수', index=False, columns=['년월', '리뷰건수'])
47
- logging.info("새로운 시트에 데이터 작성 완료")
48
 
49
- # 결과 파일 저장
50
- logging.info("결과 파일 저장 시작")
51
- output = BytesIO()
52
- file_bytes.seek(0) # 원본 파일 포인터 초기화
53
- with pd.ExcelWriter(output, engine='openpyxl') as writer:
54
- # 모든 시트 복사
55
- with pd.ExcelFile(file_bytes) as xls:
56
- for sheet_name in xls.sheet_names:
57
- df_sheet = pd.read_excel(xls, sheet_name=sheet_name, engine='openpyxl')
58
- df_sheet.to_excel(writer, sheet_name=sheet_name, index=False)
59
- output.seek(0)
60
- logging.info("결과 파일 저장 완료")
61
 
62
- # 임시 파일 생성
63
- with tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx", prefix="분석된_리뷰_") as tmp_file:
64
- tmp_file.write(output.getvalue())
65
- temp_file_path = tmp_file.name
66
-
67
- logging.info(f"임시 파일 생성 완료: {temp_file_path}")
68
- return temp_file_path # 파일 경로 반환
69
  except Exception as e:
70
- logging.error(f"분석 과정 오류: {e}")
71
- return f"분석 과정에서 오류가 발생했습니다: {e}"
72
-
73
- # Gradio 인터페이스 구성
74
- with gr.Blocks() as demo:
75
- gr.Markdown("## 리뷰 분석 스페이스")
76
 
77
- with gr.Row():
78
- file_input = gr.File(label="원본 엑셀 파일 업로드", type="binary")
79
-
80
- analyze_button = gr.Button("분석")
81
- output_download = gr.File(label="분석된 엑셀 파일 다운로드", type="filepath") # type을 'filepath'로 설정
82
-
83
- analyze_button.click(fn=analyze_reviews, inputs=file_input, outputs=output_download)
 
 
 
 
 
 
84
 
85
- # 스페이스 실행
86
  if __name__ == "__main__":
87
- demo.launch()
 
1
  import gradio as gr
2
  import pandas as pd
3
+ from datetime import datetime
4
  import logging
 
 
 
5
 
6
  # 로그 설정
7
+ logging.basicConfig(level=logging.INFO)
8
+ logger = logging.getLogger(__name__)
9
 
10
+ def analyze_reviews(file_path):
 
11
  try:
12
+ logger.info("엑셀 파일 업로드 시작")
 
13
  # 엑셀 파일 읽기
14
+ df = pd.read_excel(file_path)
15
+ logger.info("엑셀 파일 읽기 완료")
 
 
 
16
 
17
+ # 현재 연도
 
18
  current_year = 2025
19
  start_year = current_year - 3 # 최근 3년
20
 
21
+ logger.info(f"데이터 필터링: {start_year}년부터 {current_year}년까지")
22
+ # B열이 리뷰 날짜라고 가정하고, 'B' 열의 이름을 '리뷰날짜'로 변경
23
+ if '리뷰날짜' not in df.columns:
24
+ df.rename(columns={df.columns[1]: '리뷰날짜'}, inplace=True)
25
+
26
+ # 리뷰 날짜를 datetime으로 변환
27
+ df['리뷰날짜'] = pd.to_datetime(df['리뷰날짜'], errors='coerce')
28
+ # 최근 3년 데이터 필터링
29
+ df_recent = df[df['리뷰날짜'].dt.year >= start_year]
30
+ logger.info("최근 3년 데이터 필터링 완료")
 
 
31
 
32
+ # 년월별 리뷰 건수 계산
33
+ logger.info("월별 리뷰 건수 집계 시작")
34
+ df_recent['년월'] = df_recent['리뷰날짜'].dt.strftime('%Y-%m')
35
+ review_counts = df_recent.groupby('년월').size().reset_index(name='리뷰건수')
36
+ logger.info("월별 리뷰 건수 집계 완료")
 
 
37
 
38
+ # 새로운 시트에 저장
39
+ logger.info("새로운 시트 '월별 리뷰건수' 생성 시작")
40
+ with pd.ExcelWriter(file_path, engine='openpyxl', mode='a') as writer:
41
+ review_counts.to_excel(writer, sheet_name='월별 리뷰건수', index=False)
42
+ logger.info("새로운 시트 '월별 리뷰건수' 생성 완료")
 
 
 
 
 
 
 
43
 
44
+ return file_path
 
 
 
 
 
 
45
  except Exception as e:
46
+ logger.error(f"분석 중 오류 발생: {e}")
47
+ return None
 
 
 
 
48
 
49
+ # 그라디오 인터페이스 구성
50
+ def main():
51
+ logger.info("그라디오 인터페이스 시작")
52
+ with gr.Blocks() as demo:
53
+ gr.Markdown("### 리뷰 분석 스페이스")
54
+ with gr.Row():
55
+ file_input = gr.File(label="원본 엑셀 파일 업로드", file_types=[".xlsx"])
56
+ file_output = gr.File(label="분석된 엑셀 파일 다운로드", type="filepath")
57
+ analyze_button = gr.Button("분석")
58
+
59
+ analyze_button.click(fn=analyze_reviews, inputs=file_input, outputs=file_output)
60
+
61
+ demo.launch()
62
 
 
63
  if __name__ == "__main__":
64
+ main()