Spaces:
Sleeping
Sleeping
File size: 3,474 Bytes
d3f9826 de1cc66 d3f9826 e4febc9 d3f9826 e4febc9 d3f9826 de1cc66 e4febc9 de1cc66 d3f9826 de1cc66 d3f9826 de1cc66 d3f9826 de1cc66 d3f9826 de1cc66 d3f9826 de1cc66 e4febc9 c9feecd de1cc66 d3f9826 de1cc66 d3f9826 e4febc9 d3f9826 e4febc9 d3f9826 de1cc66 d3f9826 c9feecd d3f9826 de1cc66 d3f9826 de1cc66 e4febc9 d3f9826 e4febc9 de1cc66 3c7e96b e4febc9 de1cc66 d3f9826 de1cc66 d3f9826 |
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 |
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="분석된 엑셀 파일 다운로드", type="binary") # type을 'binary'로 설정
analyze_button.click(fn=analyze_reviews, inputs=file_input, outputs=output_download)
# 스페이스 실행
if __name__ == "__main__":
demo.launch()
|