Ethscriptions commited on
Commit
2ee4242
·
verified ·
1 Parent(s): 87d5456

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +59 -15
app.py CHANGED
@@ -1278,6 +1278,22 @@ def generate_schedule_check_logs(schedule_list, date_str, today_analysis_df=None
1278
 
1279
  df_check = df_original.sort_values(by='startTime').reset_index(drop=True)
1280
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1281
  # 提取绝对核心片名(去除所有括号及制式/语言后缀),用于同影片判断
1282
  import re
1283
  df_check['coreFilmName'] = df_check['filmName'].apply(lambda x: re.sub(r'[(\(].*?[)\)]', '', str(x)).strip())
@@ -1497,17 +1513,22 @@ def generate_schedule_check_logs(schedule_list, date_str, today_analysis_df=None
1497
  [(dt_time(14, 0), dt_time(17, 0)), (dt_time(19, 0), dt_time(21, 30))]
1498
  ][weekday]
1499
 
1500
- film_counts = df_check['filmName'].value_counts()
1501
  if not film_counts.empty:
1502
- max_count = film_counts.iloc[0]
1503
- # 定义热门影片:片量接近第一名(95%以上)的影片
1504
- hot_films = film_counts[film_counts >= max_count * 0.95].index.tolist()
 
 
 
 
 
1505
 
1506
  golden_hour_schedules = df_check[
1507
  df_check['startTime'].apply(lambda dt: any(start <= dt.time() < end for start, end in golden_hours_r9))]
1508
 
1509
  for film in hot_films:
1510
- hot_film_total_in_golden = len(golden_hour_schedules[golden_hour_schedules['filmName'] == film])
1511
  golden_total = len(golden_hour_schedules)
1512
  if golden_total > 0:
1513
  ratio = hot_film_total_in_golden / golden_total
@@ -1527,12 +1548,6 @@ def generate_schedule_check_logs(schedule_list, date_str, today_analysis_df=None
1527
  final_log_parts.append("\n规则十:次日排片效率匹配度检查")
1528
 
1529
  if today_analysis_df is not None and not today_analysis_df.empty:
1530
- # 清洗明天的电影名称以匹配今天的电影名称
1531
- def clean_tomorrow_movie_name(name):
1532
- return clean_movie_title(name)
1533
-
1534
- df_check['clean_filmName'] = df_check['filmName'].apply(clean_tomorrow_movie_name)
1535
-
1536
  # 计算明天每部电影的总场次和黄金场次
1537
  tomorrow_stats = {}
1538
  for film in df_check['clean_filmName'].unique():
@@ -1548,7 +1563,7 @@ def generate_schedule_check_logs(schedule_list, date_str, today_analysis_df=None
1548
  if today_prime_df is not None and not today_prime_df.empty:
1549
  today_prime_map = today_prime_df.set_index('影片')['场次效率'].to_dict()
1550
 
1551
- today_analysis_df['clean_filmName'] = today_analysis_df['影片'].apply(clean_tomorrow_movie_name)
1552
 
1553
  for _, row in today_analysis_df.iterrows():
1554
  film = row['clean_filmName']
@@ -1663,8 +1678,13 @@ def generate_schedule_check_logs(schedule_list, date_str, today_analysis_df=None
1663
  final_log_parts.append("\n规则十一:22:00 后热门影片排片检查")
1664
 
1665
  if today_analysis_df is not None and not today_analysis_df.empty:
1666
- # 1. 找出排片最多的前3部影片
1667
- top_movies = df_check['clean_filmName'].value_counts().head(3).index.tolist()
 
 
 
 
 
1668
 
1669
  if not top_movies:
1670
  logs_r11.append("次日无排片数据,无法检查。")
@@ -1688,7 +1708,7 @@ def generate_schedule_check_logs(schedule_list, date_str, today_analysis_df=None
1688
 
1689
  if not has_top_movie_at_night:
1690
  top_movies_str = "、".join([f"《{m}》" for m in top_movies])
1691
- logs_r11.append(f"排片量前三的影片 {top_movies_str} 在 22:00 后均无场次,建议增加热门影片晚场。")
1692
 
1693
  if logs_r11:
1694
  for i, log in enumerate(logs_r11, 1):
@@ -1696,6 +1716,30 @@ def generate_schedule_check_logs(schedule_list, date_str, today_analysis_df=None
1696
  else:
1697
  final_log_parts.append("(无)")
1698
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1699
  return "\n".join(final_log_parts)
1700
 
1701
 
 
1278
 
1279
  df_check = df_original.sort_values(by='startTime').reset_index(drop=True)
1280
 
1281
+ # 提前清洗电影名称
1282
+ df_check['clean_filmName'] = df_check['filmName'].apply(clean_movie_title)
1283
+
1284
+ # 获取次日大盘预售票房数据
1285
+ next_day_bo_data = fetch_realtime_box_office(date_str)
1286
+ movie_box_office = {}
1287
+ bo_sorted_movies = []
1288
+ if next_day_bo_data and 'movieDatalist' in next_day_bo_data:
1289
+ bo_df = process_box_office_data(next_day_bo_data['movieDatalist'], include_fee=True)
1290
+ if not bo_df.empty:
1291
+ bo_df['clean_filmName'] = bo_df['影片名称'].apply(clean_movie_title)
1292
+ for _, row in bo_df.iterrows():
1293
+ if row['clean_filmName'] not in movie_box_office:
1294
+ movie_box_office[row['clean_filmName']] = row['今日票房']
1295
+ bo_sorted_movies.append(row['clean_filmName'])
1296
+
1297
  # 提取绝对核心片名(去除所有括号及制式/语言后缀),用于同影片判断
1298
  import re
1299
  df_check['coreFilmName'] = df_check['filmName'].apply(lambda x: re.sub(r'[(\(].*?[)\)]', '', str(x)).strip())
 
1513
  [(dt_time(14, 0), dt_time(17, 0)), (dt_time(19, 0), dt_time(21, 30))]
1514
  ][weekday]
1515
 
1516
+ film_counts = df_check['clean_filmName'].value_counts()
1517
  if not film_counts.empty:
1518
+ if bo_sorted_movies:
1519
+ # 预售票房
1520
+ max_bo = movie_box_office.get(bo_sorted_movies[0], 0)
1521
+ hot_films = [m for m, bo in movie_box_office.items() if bo >= max_bo * 0.95]
1522
+ else:
1523
+ max_count = film_counts.iloc[0]
1524
+ # 定义热门影片:排片量接近第一名(95%以上)的影片
1525
+ hot_films = film_counts[film_counts >= max_count * 0.95].index.tolist()
1526
 
1527
  golden_hour_schedules = df_check[
1528
  df_check['startTime'].apply(lambda dt: any(start <= dt.time() < end for start, end in golden_hours_r9))]
1529
 
1530
  for film in hot_films:
1531
+ hot_film_total_in_golden = len(golden_hour_schedules[golden_hour_schedules['clean_filmName'] == film])
1532
  golden_total = len(golden_hour_schedules)
1533
  if golden_total > 0:
1534
  ratio = hot_film_total_in_golden / golden_total
 
1548
  final_log_parts.append("\n规则十:次日排片效率匹配度检查")
1549
 
1550
  if today_analysis_df is not None and not today_analysis_df.empty:
 
 
 
 
 
 
1551
  # 计算明天每部电影的总场次和黄金场次
1552
  tomorrow_stats = {}
1553
  for film in df_check['clean_filmName'].unique():
 
1563
  if today_prime_df is not None and not today_prime_df.empty:
1564
  today_prime_map = today_prime_df.set_index('影片')['场次效率'].to_dict()
1565
 
1566
+ today_analysis_df['clean_filmName'] = today_analysis_df['影片'].apply(clean_movie_title)
1567
 
1568
  for _, row in today_analysis_df.iterrows():
1569
  film = row['clean_filmName']
 
1678
  final_log_parts.append("\n规则十一:22:00 后热门影片排片检查")
1679
 
1680
  if today_analysis_df is not None and not today_analysis_df.empty:
1681
+ # 1. 找出热门前3部影片(优先票房,其次排片量)
1682
+ if bo_sorted_movies:
1683
+ top_movies = bo_sorted_movies[:3]
1684
+ top_movies_type = "票房排行前三"
1685
+ else:
1686
+ top_movies = df_check['clean_filmName'].value_counts().head(3).index.tolist()
1687
+ top_movies_type = "排片量前三"
1688
 
1689
  if not top_movies:
1690
  logs_r11.append("次日无排片数据,无法检查。")
 
1708
 
1709
  if not has_top_movie_at_night:
1710
  top_movies_str = "、".join([f"《{m}》" for m in top_movies])
1711
+ logs_r11.append(f"{top_movies_type}的影片 {top_movies_str} 在 22:00 后均无场次,建议增加热门影片晚场。")
1712
 
1713
  if logs_r11:
1714
  for i, log in enumerate(logs_r11, 1):
 
1716
  else:
1717
  final_log_parts.append("(无)")
1718
 
1719
+ # --- Rule 12: 次日票房排行前五的影片必须有一场黄金场 ---
1720
+ logs_r12 = []
1721
+ final_log_parts.append("\n规则十二:次日票房前五的影片必须有一场黄金场")
1722
+ if bo_sorted_movies:
1723
+ top_5_movies = bo_sorted_movies[:5]
1724
+ for movie in top_5_movies:
1725
+ movie_df = df_check[df_check['clean_filmName'] == movie]
1726
+ if not movie_df.empty:
1727
+ golden_sessions = movie_df[movie_df['startTime'].apply(
1728
+ lambda dt: dt_time(14, 0) <= dt.time() <= dt_time(21, 0)
1729
+ )]
1730
+ if golden_sessions.empty:
1731
+ logs_r12.append(f"《{movie}》为次日票房排行前五的影片,但没有安排黄金场(14:00-21:00)。")
1732
+ else:
1733
+ logs_r12.append(f"《{movie}》为次日票房排行前五的影片,但目前未排片。")
1734
+ else:
1735
+ logs_r12.append("未获取到次日票房数据,无法检查规则十二。")
1736
+
1737
+ if logs_r12:
1738
+ for i, log in enumerate(logs_r12, 1):
1739
+ final_log_parts.append(f"{i}. {log}")
1740
+ else:
1741
+ final_log_parts.append("(无)")
1742
+
1743
  return "\n".join(final_log_parts)
1744
 
1745