Jelajahi Sumber

代码优化

wangyunpeng 7 bulan lalu
induk
melakukan
a75a65edb2
1 mengubah file dengan 41 tambahan dan 10 penghapusan
  1. 41 10
      applications/articleTools.py

+ 41 - 10
applications/articleTools.py

@@ -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)]