Kims12's picture
Update app.py
c9feecd verified
raw
history blame
3.54 kB
import gradio as gr
import pandas as pd
import logging
from datetime import datetime
from io import BytesIO
# 로그 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def analyze_reviews(file):
logging.info("파일 업로드 시작")
try:
# 바이너리 데이터를 BytesIO로 변환
file_bytes = BytesIO(file)
# 엑셀 파일 읽기
df = pd.read_excel(file_bytes, engine='openpyxl')
logging.info("엑셀 파일 읽기 완료")
except Exception as e:
logging.error(f"엑셀 파일 읽기 오류: {e}")
return f"엑셀 파일을 읽는 중 오류가 발생했습니다: {e}"
try:
# 현재 기준 연도 설정 (2025년 기준)
current_year = 2025
start_year = current_year - 3 # 최근 3년
logging.info("리뷰 날짜 처리 시작")
# B열에 있는 리뷰 날짜를 datetime 형식으로 변환
df['리뷰날짜'] = pd.to_datetime(df.iloc[:, 1], errors='coerce')
# 연도 및 월 필터링
df_filtered = df[(df['리뷰날짜'].dt.year >= start_year) & (df['리뷰날짜'].dt.year < current_year)]
logging.info("리뷰 날짜 필터링 완료")
# 년월별 리뷰 건수 집계
logging.info("년월별 리뷰 건수 집계 시작")
df_filtered['년월'] = df_filtered['리뷰날짜'].dt.strftime('%Y-%m')
review_counts = df_filtered.groupby('년월').size().reset_index(name='리뷰건수')
logging.info("년월별 리뷰 건수 집계 완료")
# 새로운 시트에 데이터 작성
logging.info("새로운 시트 생성 및 데이터 작성 시작")
with pd.ExcelWriter(file_bytes, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
review_counts.to_excel(writer, sheet_name='월별 리뷰건수', index=False, columns=['년월', '리뷰건수'])
logging.info("새로운 시트에 데이터 작성 완료")
# 결과 파일 저장
logging.info("결과 파일 저장 시작")
output = BytesIO()
file_bytes.seek(0) # 원본 파일 포인터 초기화
with pd.ExcelWriter(output, engine='openpyxl') as writer:
# 모든 시트 복사
with pd.ExcelFile(file_bytes) as xls:
for sheet_name in xls.sheet_names:
df_sheet = pd.read_excel(xls, sheet_name=sheet_name, engine='openpyxl')
df_sheet.to_excel(writer, sheet_name=sheet_name, index=False)
# 이미 '월별 리뷰건수' 시트가 추가되었으므로 추가로 작성할 필요 없음
output.seek(0)
logging.info("결과 파일 저장 완료")
# BytesIO 데이터를 바이트로 변환하고 파일 이름과 함께 반환
return (output.getvalue(), "분석된_리뷰.xlsx")
except Exception as e:
logging.error(f"분석 과정 중 오류: {e}")
return f"분석 과정에서 오류가 발생했습니다: {e}"
# Gradio 인터페이스 구성
with gr.Blocks() as demo:
gr.Markdown("## 리뷰 분석 스페이스")
with gr.Row():
file_input = gr.File(label="원본 엑셀 파일 업로드", type="binary")
analyze_button = gr.Button("분석")
output_download = gr.File(label="분석된 엑셀 파일 다운로드")
analyze_button.click(fn=analyze_reviews, inputs=file_input, outputs=output_download)
# 스페이스 실행
if __name__ == "__main__":
demo.launch()