|  | @@ -65,6 +65,27 @@ class TaskMySQLClient(object):
 | 
	
		
			
				|  |  |                  await coon.commit()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +class AccountAvgInfo:
 | 
	
		
			
				|  |  | +    def __init__(self, gh_id, position, update_time, account_name, fans, read_avg, like_avg, status,
 | 
	
		
			
				|  |  | +                 account_type, account_mode, account_source, account_status, business_type, read_rate_avg):
 | 
	
		
			
				|  |  | +        self.gh_id = gh_id
 | 
	
		
			
				|  |  | +        self.position = position
 | 
	
		
			
				|  |  | +        self.update_time = update_time
 | 
	
		
			
				|  |  | +        self.account_name = account_name
 | 
	
		
			
				|  |  | +        self.fans = fans
 | 
	
		
			
				|  |  | +        self.read_avg = read_avg
 | 
	
		
			
				|  |  | +        self.like_avg = like_avg
 | 
	
		
			
				|  |  | +        self.status = status
 | 
	
		
			
				|  |  | +        self.account_type = account_type
 | 
	
		
			
				|  |  | +        self.account_mode = account_mode
 | 
	
		
			
				|  |  | +        self.account_source = account_source
 | 
	
		
			
				|  |  | +        self.account_status = account_status
 | 
	
		
			
				|  |  | +        self.business_type = business_type
 | 
	
		
			
				|  |  | +        self.read_rate_avg = read_rate_avg
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def __repr__(self):
 | 
	
		
			
				|  |  | +        return f"<AccountAvgInfo {self.account_name}>"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  class ArticleDBTools(object):
 | 
	
		
			
				|  |  |      """
 | 
	
		
			
				|  |  |      长文数据库相关功能
 | 
	
	
		
			
				|  | @@ -103,22 +124,29 @@ class ArticleDBTools(object):
 | 
	
		
			
				|  |  |              WHERE account_name = '{account_name}'
 | 
	
		
			
				|  |  |              and position = 1;"""
 | 
	
		
			
				|  |  |          result = await self.mysql_client.async_select(sql=sql)
 | 
	
		
			
				|  |  | -        return result
 | 
	
		
			
				|  |  | +        account_avg_info_list = [AccountAvgInfo(*row) for row in result] if result else []
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return account_avg_info_list
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    async def get_account_avg_info(self, account_avg_info_map, timestamp):
 | 
	
		
			
				|  |  | +    async def get_account_avg_info(self, account_avg_info_map, available_dates, timestamp):
 | 
	
		
			
				|  |  |          target_date = datetime.fromtimestamp(timestamp).date()
 | 
	
		
			
				|  |  | -        # 获取所有可用日期并排序
 | 
	
		
			
				|  |  | -        available_dates = sorted(account_avg_info_map.keys())
 | 
	
		
			
				|  |  |          # 尝试获取指定日期
 | 
	
		
			
				|  |  |          info = account_avg_info_map.get(target_date.isoformat())
 | 
	
		
			
				|  |  |          if info is not None:
 | 
	
		
			
				|  |  |              return info
 | 
	
		
			
				|  |  |          # 如果指定日期不存在,寻找最近日期
 | 
	
		
			
				|  |  |          closest_date = None
 | 
	
		
			
				|  |  | -        for date in reversed(available_dates):
 | 
	
		
			
				|  |  | -            if (closest_date is None or abs((datetime.fromisoformat(date).date() - target_date).days) <
 | 
	
		
			
				|  |  | -                    abs((datetime.fromisoformat(closest_date).date() - target_date).days)):
 | 
	
		
			
				|  |  | +        for date in available_dates:
 | 
	
		
			
				|  |  | +            if closest_date is None:
 | 
	
		
			
				|  |  |                  closest_date = date
 | 
	
		
			
				|  |  | +                continue
 | 
	
		
			
				|  |  | +            days = abs((datetime.fromisoformat(date).date() - target_date).days)
 | 
	
		
			
				|  |  | +            closest_days = abs((datetime.fromisoformat(closest_date).date() - target_date).days)
 | 
	
		
			
				|  |  | +            if days < closest_days:
 | 
	
		
			
				|  |  | +                closest_date = date
 | 
	
		
			
				|  |  | +            elif days > closest_days:
 | 
	
		
			
				|  |  | +                break
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          return account_avg_info_map.get(closest_date) if closest_date else None
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      async def getSingleAccountArticles(self, account_name):
 | 
	
	
		
			
				|  | @@ -222,12 +250,15 @@ class ArticleDBTools(object):
 | 
	
		
			
				|  |  |                      account_read_avg_list = await self.getAccountAvgInfo(
 | 
	
		
			
				|  |  |                          account_name=account_name
 | 
	
		
			
				|  |  |                      )
 | 
	
		
			
				|  |  | -                    account_avg_info_map = {info[2]: info for info in account_read_avg_list}
 | 
	
		
			
				|  |  | +                    account_avg_info_map = {info.update_time: info for info in account_read_avg_list}
 | 
	
		
			
				|  |  | +                    # 获取所有可用日期并排序
 | 
	
		
			
				|  |  | +                    available_dates = sorted(account_avg_info_map.keys())
 | 
	
		
			
				|  |  |                      view_count_avg_list = []
 | 
	
		
			
				|  |  |                      for index, row in article_data_frame.iterrows():
 | 
	
		
			
				|  |  |                          update_time = row['updateTime']
 | 
	
		
			
				|  |  | -                        info = await self.get_account_avg_info(account_avg_info_map, update_time)
 | 
	
		
			
				|  |  | -                        view_count_avg_list.append(info[5])
 | 
	
		
			
				|  |  | +                        info = await self.get_account_avg_info(account_avg_info_map, available_dates, update_time)
 | 
	
		
			
				|  |  | +                        view_count_avg_list.append(info.read_avg)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                      article_data_frame['view_count_avg'] = view_count_avg_list
 | 
	
		
			
				|  |  |                      good_df = article_data_frame[(article_data_frame['show_view_count']) >
 | 
	
		
			
				|  |  |                                                   (article_data_frame['view_count_avg']) * (1.0 + rate)]
 |