Ethscriptions commited on
Commit
15c01f8
·
verified ·
1 Parent(s): 1ce52fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +24 -22
app.py CHANGED
@@ -5,6 +5,7 @@ import numpy as np
5
  # 设置页面布局为宽屏模式,并设置页面标题
6
  st.set_page_config(layout="wide", page_title="影城效率分析 - 最终版")
7
 
 
8
  def clean_movie_title(title):
9
  """
10
  清理并规范化电影标题。
@@ -15,6 +16,7 @@ def clean_movie_title(title):
15
  # 将标题按第一个空格分割,并只取第一部分
16
  return title.split(' ', 1)[0]
17
 
 
18
  def style_efficiency(row):
19
  """
20
  根据效率值高亮特定行。
@@ -25,10 +27,11 @@ def style_efficiency(row):
25
  seat_efficiency = row.get('座次效率', 0)
26
  session_efficiency = row.get('场次效率', 0)
27
  if (seat_efficiency < 0.5 or seat_efficiency > 1.5 or
28
- session_efficiency < 0.5 or session_efficiency > 1.5):
29
  return [highlight] * len(row)
30
  return [default] * len(row)
31
 
 
32
  def process_and_analyze_data(df):
33
  """
34
  核心数据处理与分析函数。
@@ -43,7 +46,7 @@ def process_and_analyze_data(df):
43
  人次=('总人次', 'sum')
44
  ).reset_index()
45
  analysis_df.rename(columns={'影片名称_清理后': '影片'}, inplace=True)
46
-
47
  analysis_df = analysis_df.sort_values(by='票房', ascending=False).reset_index(drop=True)
48
 
49
  total_seats = analysis_df['座位数'].sum()
@@ -56,26 +59,27 @@ def process_and_analyze_data(df):
56
  analysis_df['票房比'] = np.divide(analysis_df['票房'], total_revenue).fillna(0)
57
  analysis_df['座次效率'] = np.divide(analysis_df['票房比'], analysis_df['座次比']).fillna(0)
58
  analysis_df['场次效率'] = np.divide(analysis_df['票房比'], analysis_df['场次比']).fillna(0)
59
-
60
  final_columns = [
61
- '影片', '座位数', '场次', '票房', '人次', '均价',
62
  '座次比', '场次比', '票房比', '座次效率', '场次效率'
63
  ]
64
  analysis_df = analysis_df[final_columns]
65
-
66
  return analysis_df
67
 
 
68
  # --- Streamlit 用户界面 ---
69
 
70
- st.title('自动化影城数据分析报告 (最终版)')
71
- st.write("上传 `影片映出日累计报表.xlsx` 文件。此版本已采纳您所有的优化建议。")
72
 
73
  uploaded_file = st.file_uploader("请在此处上传 Excel 文件", type=['xlsx', 'xls', 'csv'])
74
 
75
  if uploaded_file is not None:
76
  try:
77
  df = pd.read_excel(uploaded_file, skiprows=3, header=None)
78
-
79
  df.rename(columns={
80
  0: '影片名称', 2: '放映时间', 5: '总人次', 6: '总收入', 7: '座位数'
81
  }, inplace=True)
@@ -89,11 +93,11 @@ if uploaded_file is not None:
89
 
90
  df['放映时间'] = pd.to_datetime(df['放映时间'], format='%H:%M:%S', errors='coerce').dt.time
91
  df.dropna(subset=['放映时间'], inplace=True)
92
-
93
  df['影片名称_清理后'] = df['影片名称'].apply(clean_movie_title)
94
 
95
- st.success("文件上传成功,数据已按最终规则处理!")
96
-
97
  format_config = {
98
  '座位数': '{:,.0f}', '场次': '{:,.0f}', '人次': '{:,.0f}',
99
  '票房': '{:,.2f}', '均价': '{:.2f}', '座次比': '{:.2%}', '场次比': '{:.2%}',
@@ -101,11 +105,10 @@ if uploaded_file is not None:
101
  }
102
 
103
  # --- 1. 全天数据分析 ---
104
- st.header("全天场次效率分析 (按总收入排序)")
105
- st.write("系统会自动高亮 **座次效率** 或 **场次效率** 低于 0.5 或高于 1.5 的影片。")
106
-
107
  full_day_analysis = process_and_analyze_data(df.copy())
108
-
109
  if not full_day_analysis.empty:
110
  table_height = (len(full_day_analysis) + 1) * 35 + 3
111
  st.dataframe(
@@ -117,14 +120,14 @@ if uploaded_file is not None:
117
  st.warning("全天数据不足,无法生成分析报告。")
118
 
119
  # --- 2. 黄金时段数据分析 ---
120
- st.header("黄金时段 (14:00 - 21:00) 场次效率分析")
121
-
122
  start_time = pd.to_datetime('14:00:00').time()
123
  end_time = pd.to_datetime('21:00:00').time()
124
  prime_time_df = df[df['放映时间'].between(start_time, end_time)]
125
 
126
  prime_time_analysis = process_and_analyze_data(prime_time_df.copy())
127
-
128
  if not prime_time_analysis.empty:
129
  table_height_prime = (len(prime_time_analysis) + 1) * 35 + 3
130
  st.dataframe(
@@ -134,15 +137,14 @@ if uploaded_file is not None:
134
  )
135
  else:
136
  st.warning("黄金时段内没有有效场次数据,无法生成分析报告。")
137
-
138
  # --- 3. 一键复制影片列表 ---
139
  if not full_day_analysis.empty:
140
  st.header("复制当日影片列表")
141
- st.write("以下是根据全天数据生成的影片列���,已为您格式化,可直接复制使用。")
142
-
143
  movie_titles = full_day_analysis['影片'].tolist()
144
  formatted_titles = ''.join([f'《{title}》' for title in movie_titles])
145
-
146
  st.code(formatted_titles, language='text')
147
 
148
  except Exception as e:
 
5
  # 设置页面布局为宽屏模式,并设置页面标题
6
  st.set_page_config(layout="wide", page_title="影城效率分析 - 最终版")
7
 
8
+
9
  def clean_movie_title(title):
10
  """
11
  清理并规范化电影标题。
 
16
  # 将标题按第一个空格分割,并只取第一部分
17
  return title.split(' ', 1)[0]
18
 
19
+
20
  def style_efficiency(row):
21
  """
22
  根据效率值高亮特定行。
 
27
  seat_efficiency = row.get('座次效率', 0)
28
  session_efficiency = row.get('场次效率', 0)
29
  if (seat_efficiency < 0.5 or seat_efficiency > 1.5 or
30
+ session_efficiency < 0.5 or session_efficiency > 1.5):
31
  return [highlight] * len(row)
32
  return [default] * len(row)
33
 
34
+
35
  def process_and_analyze_data(df):
36
  """
37
  核心数据处理与分析函数。
 
46
  人次=('总人次', 'sum')
47
  ).reset_index()
48
  analysis_df.rename(columns={'影片名称_清理后': '影片'}, inplace=True)
49
+
50
  analysis_df = analysis_df.sort_values(by='票房', ascending=False).reset_index(drop=True)
51
 
52
  total_seats = analysis_df['座位数'].sum()
 
59
  analysis_df['票房比'] = np.divide(analysis_df['票房'], total_revenue).fillna(0)
60
  analysis_df['座次效率'] = np.divide(analysis_df['票房比'], analysis_df['座次比']).fillna(0)
61
  analysis_df['场次效率'] = np.divide(analysis_df['票房比'], analysis_df['场次比']).fillna(0)
62
+
63
  final_columns = [
64
+ '影片', '座位数', '场次', '票房', '人次', '均价',
65
  '座次比', '场次比', '票房比', '座次效率', '场次效率'
66
  ]
67
  analysis_df = analysis_df[final_columns]
68
+
69
  return analysis_df
70
 
71
+
72
  # --- Streamlit 用户界面 ---
73
 
74
+ st.title('排片效率分析工具')
75
+ st.write("上传 `影片映出日累计报表.xlsx` 文件。")
76
 
77
  uploaded_file = st.file_uploader("请在此处上传 Excel 文件", type=['xlsx', 'xls', 'csv'])
78
 
79
  if uploaded_file is not None:
80
  try:
81
  df = pd.read_excel(uploaded_file, skiprows=3, header=None)
82
+
83
  df.rename(columns={
84
  0: '影片名称', 2: '放映时间', 5: '总人次', 6: '总收入', 7: '座位数'
85
  }, inplace=True)
 
93
 
94
  df['放映时间'] = pd.to_datetime(df['放映时间'], format='%H:%M:%S', errors='coerce').dt.time
95
  df.dropna(subset=['放映时间'], inplace=True)
96
+
97
  df['影片名称_清理后'] = df['影片名称'].apply(clean_movie_title)
98
 
99
+ st.toast("文件上传成功,数据已按规则处理!", icon="🎉")
100
+
101
  format_config = {
102
  '座位数': '{:,.0f}', '场次': '{:,.0f}', '人次': '{:,.0f}',
103
  '票房': '{:,.2f}', '均价': '{:.2f}', '座次比': '{:.2%}', '场次比': '{:.2%}',
 
105
  }
106
 
107
  # --- 1. 全天数据分析 ---
108
+ st.header("全天排片效率分析")
109
+
 
110
  full_day_analysis = process_and_analyze_data(df.copy())
111
+
112
  if not full_day_analysis.empty:
113
  table_height = (len(full_day_analysis) + 1) * 35 + 3
114
  st.dataframe(
 
120
  st.warning("全天数据不足,无法生成分析报告。")
121
 
122
  # --- 2. 黄金时段数据分析 ---
123
+ st.header("黄金时段排片效率分析")
124
+
125
  start_time = pd.to_datetime('14:00:00').time()
126
  end_time = pd.to_datetime('21:00:00').time()
127
  prime_time_df = df[df['放映时间'].between(start_time, end_time)]
128
 
129
  prime_time_analysis = process_and_analyze_data(prime_time_df.copy())
130
+
131
  if not prime_time_analysis.empty:
132
  table_height_prime = (len(prime_time_analysis) + 1) * 35 + 3
133
  st.dataframe(
 
137
  )
138
  else:
139
  st.warning("黄金时段内没有有效场次数据,无法生成分析报告。")
140
+
141
  # --- 3. 一键复制影片列表 ---
142
  if not full_day_analysis.empty:
143
  st.header("复制当日影片列表")
144
+
 
145
  movie_titles = full_day_analysis['影片'].tolist()
146
  formatted_titles = ''.join([f'《{title}》' for title in movie_titles])
147
+
148
  st.code(formatted_titles, language='text')
149
 
150
  except Exception as e: