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()