1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import gevent
- import datetime
- import numpy as np
- from my_config import set_config
- from log import Log
- from my_utils import RedisHelper
- config_, _ = set_config()
- log_ = Log()
- redis_helper = RedisHelper()
- def update_limit_video_score(initial_videos):
- """
- 调整限流视频的分数: 将视频移至所在列表的中位数之后,多个视频时,按照原本的顺序进行排列
- :param initial_videos: 视频列表及score type-dict, {videoId: score, ...}
- :return:
- """
- if not initial_videos:
- return
- # 获取当前限流视频
- data = redis_helper.get_data_from_redis(key_name=config_.KEY_NAME_PREFIX_LIMIT_VIDEOS)
- if data is None:
- return initial_videos
- # 获取限流视频对应的score
- limit_video_initial_score = []
- for video in eval(data):
- video_id = int(video[0])
- initial_score = initial_videos.get(video_id, None)
- if initial_score is not None:
- limit_video_initial_score.append((video_id, initial_score))
- log_.info(f"limit_video_initial_score = {limit_video_initial_score}")
- if len(limit_video_initial_score) == 0:
- return initial_videos
- # 获取原始列表的分数的中位数
- initial_video_score_list = sorted([val for key, val in initial_videos.items()], reverse=False)
- media_score = np.median(initial_video_score_list)
- # 取中位数后一位
- if len(initial_video_score_list) % 2 == 0:
- temp_index = len(initial_video_score_list)//2
- else:
- temp_index = len(initial_video_score_list) // 2 + 1
- if len(initial_video_score_list) > 1:
- temp_score = initial_video_score_list[temp_index]
- else:
- temp_score = 0
- # 对限流视频score进行调整
- limit_video_final_score = {}
- limit_video_initial_score.sort(key=lambda x: x[1], reverse=True)
- limit_video_id_list = []
- for video_id, initial_score in limit_video_initial_score:
- if initial_score > media_score:
- limit_video_id_list.append(video_id)
- if len(limit_video_id_list) > 0:
- limit_score_step = (temp_score - media_score) / (len(limit_video_id_list) + 1)
- for i, video_id in enumerate(limit_video_id_list):
- final_score = media_score - limit_score_step * (i + 1)
- limit_video_final_score[int(video_id)] = final_score
- initial_videos[int(video_id)] = final_score
- log_.info(f"media_score = {media_score}, temp_score = {temp_score}, "
- f"limit_video_final_score = {limit_video_final_score}")
- return initial_videos
|