Spaces:
Sleeping
Sleeping
Update app.py
Browse files
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['
|
| 1501 |
if not film_counts.empty:
|
| 1502 |
-
|
| 1503 |
-
|
| 1504 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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['
|
| 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(
|
| 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. 找出
|
| 1667 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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"
|
| 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 |
|