|
@@ -65,6 +65,27 @@ class TaskMySQLClient(object):
|
|
await coon.commit()
|
|
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):
|
|
class ArticleDBTools(object):
|
|
"""
|
|
"""
|
|
长文数据库相关功能
|
|
长文数据库相关功能
|
|
@@ -103,22 +124,29 @@ class ArticleDBTools(object):
|
|
WHERE account_name = '{account_name}'
|
|
WHERE account_name = '{account_name}'
|
|
and position = 1;"""
|
|
and position = 1;"""
|
|
result = await self.mysql_client.async_select(sql=sql)
|
|
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()
|
|
target_date = datetime.fromtimestamp(timestamp).date()
|
|
- # 获取所有可用日期并排序
|
|
|
|
- available_dates = sorted(account_avg_info_map.keys())
|
|
|
|
# 尝试获取指定日期
|
|
# 尝试获取指定日期
|
|
info = account_avg_info_map.get(target_date.isoformat())
|
|
info = account_avg_info_map.get(target_date.isoformat())
|
|
if info is not None:
|
|
if info is not None:
|
|
return info
|
|
return info
|
|
# 如果指定日期不存在,寻找最近日期
|
|
# 如果指定日期不存在,寻找最近日期
|
|
closest_date = None
|
|
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
|
|
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
|
|
return account_avg_info_map.get(closest_date) if closest_date else None
|
|
|
|
|
|
async def getSingleAccountArticles(self, account_name):
|
|
async def getSingleAccountArticles(self, account_name):
|
|
@@ -222,12 +250,15 @@ class ArticleDBTools(object):
|
|
account_read_avg_list = await self.getAccountAvgInfo(
|
|
account_read_avg_list = await self.getAccountAvgInfo(
|
|
account_name=account_name
|
|
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 = []
|
|
view_count_avg_list = []
|
|
for index, row in article_data_frame.iterrows():
|
|
for index, row in article_data_frame.iterrows():
|
|
update_time = row['updateTime']
|
|
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
|
|
article_data_frame['view_count_avg'] = view_count_avg_list
|
|
good_df = article_data_frame[(article_data_frame['show_view_count']) >
|
|
good_df = article_data_frame[(article_data_frame['show_view_count']) >
|
|
(article_data_frame['view_count_avg']) * (1.0 + rate)]
|
|
(article_data_frame['view_count_avg']) * (1.0 + rate)]
|