mdbq 4.0.54__py3-none-any.whl → 4.0.55__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mdbq/__version__.py +1 -1
- {mdbq-4.0.54.dist-info → mdbq-4.0.55.dist-info}/METADATA +1 -1
- {mdbq-4.0.54.dist-info → mdbq-4.0.55.dist-info}/RECORD +5 -8
- mdbq/aggregation/__init__.py +0 -4
- mdbq/aggregation/query_data.py +0 -3455
- mdbq/aggregation/set_typ_dict.py +0 -620
- {mdbq-4.0.54.dist-info → mdbq-4.0.55.dist-info}/WHEEL +0 -0
- {mdbq-4.0.54.dist-info → mdbq-4.0.55.dist-info}/top_level.txt +0 -0
mdbq/aggregation/query_data.py
DELETED
@@ -1,3455 +0,0 @@
|
|
1
|
-
# -*- coding: UTF-8 –*-
|
2
|
-
import re
|
3
|
-
from mdbq.mysql import uploader
|
4
|
-
from mdbq.mysql import s_query
|
5
|
-
from mdbq.myconf import myconf
|
6
|
-
from mdbq.log import mylogger
|
7
|
-
from mdbq.other import error_handler
|
8
|
-
from mdbq.aggregation.set_typ_dict import SET_TYP_DICT
|
9
|
-
import datetime
|
10
|
-
from dateutil.relativedelta import relativedelta
|
11
|
-
import pandas as pd
|
12
|
-
import numpy as np
|
13
|
-
from functools import wraps
|
14
|
-
import platform
|
15
|
-
import os
|
16
|
-
import time
|
17
|
-
import calendar
|
18
|
-
from collections.abc import Mapping, Sequence
|
19
|
-
import inspect
|
20
|
-
|
21
|
-
dir_path = os.path.expanduser("~")
|
22
|
-
parser = myconf.ConfigParser()
|
23
|
-
host, port, username, password = parser.get_section_values(
|
24
|
-
file_path=os.path.join(dir_path, 'spd.txt'),
|
25
|
-
section='mysql',
|
26
|
-
keys=['host', 'port', 'username', 'password'],
|
27
|
-
)
|
28
|
-
# host = 'localhost'
|
29
|
-
uld = uploader.MySQLUploader(username=username, password=password, host=host, port=int(port), pool_size=10)
|
30
|
-
|
31
|
-
logger = mylogger.MyLogger(
|
32
|
-
logging_mode='file',
|
33
|
-
log_level='info',
|
34
|
-
log_format='json',
|
35
|
-
max_log_size=50,
|
36
|
-
backup_count=5,
|
37
|
-
enable_async=False, # 是否启用异步日志
|
38
|
-
sample_rate=1, # 采样DEBUG/INFO日志
|
39
|
-
sensitive_fields=[], # 敏感字段过滤
|
40
|
-
enable_metrics=False, # 是否启用性能指标
|
41
|
-
)
|
42
|
-
|
43
|
-
|
44
|
-
def reorder_columns(df: pd.DataFrame, set_type) -> pd.DataFrame:
|
45
|
-
"""
|
46
|
-
调整DataFrame的列顺序,按照set_type中的顺序排列,忽略大小写,set_type中不存在的列自动跳过。
|
47
|
-
set_type可以是列表或字典(此时用字典的键名作为顺序)。
|
48
|
-
不改变数据和数据类型。
|
49
|
-
如果 set_type 为 None、空列表或空字典,则直接返回原 df,不做任何调整。
|
50
|
-
"""
|
51
|
-
# 直接返回原 df 的情况
|
52
|
-
if set_type is None:
|
53
|
-
return df
|
54
|
-
if isinstance(set_type, Mapping) and len(set_type) == 0:
|
55
|
-
return df
|
56
|
-
if isinstance(set_type, Sequence) and not isinstance(set_type, str) and len(set_type) == 0:
|
57
|
-
return df
|
58
|
-
|
59
|
-
# 如果set_type是字典,提取其键名
|
60
|
-
if isinstance(set_type, Mapping):
|
61
|
-
col_order = list(set_type.keys())
|
62
|
-
elif isinstance(set_type, Sequence) and not isinstance(set_type, str):
|
63
|
-
col_order = list(set_type)
|
64
|
-
else:
|
65
|
-
raise ValueError("set_type must be a list or a dict (or other mapping type)")
|
66
|
-
|
67
|
-
# 构建原始列名的映射(小写->原始名)
|
68
|
-
col_map = {col.lower(): col for col in df.columns}
|
69
|
-
# 生成新顺序的列名(只保留df中存在的列,且顺序按set_type)
|
70
|
-
new_cols = []
|
71
|
-
used = set()
|
72
|
-
for col in col_order:
|
73
|
-
key = col.lower()
|
74
|
-
if key in col_map and key not in used:
|
75
|
-
new_cols.append(col_map[key])
|
76
|
-
used.add(key)
|
77
|
-
# 添加剩余未在set_type中出现的列,保持原顺序
|
78
|
-
for col in df.columns:
|
79
|
-
if col.lower() not in used:
|
80
|
-
new_cols.append(col)
|
81
|
-
# 返回新顺序的DataFrame
|
82
|
-
return df[new_cols]
|
83
|
-
|
84
|
-
|
85
|
-
def upload_data_decorator(**upload_kwargs):
|
86
|
-
"""
|
87
|
-
数据上传装饰器
|
88
|
-
:param upload_kwargs: 上传参数,支持所有 upload_data 方法的参数
|
89
|
-
:return: 装饰器函数
|
90
|
-
"""
|
91
|
-
def decorator(func):
|
92
|
-
@wraps(func)
|
93
|
-
def wrapper(*args, **kwargs):
|
94
|
-
db_name = None
|
95
|
-
table_name = None
|
96
|
-
try:
|
97
|
-
# 获取函数签名和参数
|
98
|
-
sig = inspect.signature(func)
|
99
|
-
bound_args = sig.bind(*args, **kwargs)
|
100
|
-
args_dict = bound_args.arguments
|
101
|
-
|
102
|
-
# 获取所需参数
|
103
|
-
def get_param_value(param_name, alternatives=None):
|
104
|
-
if alternatives is None:
|
105
|
-
alternatives = [param_name]
|
106
|
-
# 从 kwargs 或 args_dict 中获取参数值
|
107
|
-
for key in alternatives:
|
108
|
-
if key in kwargs:
|
109
|
-
return kwargs[key]
|
110
|
-
if key in args_dict:
|
111
|
-
return args_dict[key]
|
112
|
-
return None
|
113
|
-
|
114
|
-
# 获取参数值
|
115
|
-
set_type = get_param_value('set_type', ['set_type', 'set_typ'])
|
116
|
-
db_name = get_param_value('db_name')
|
117
|
-
table_name = get_param_value('table_name')
|
118
|
-
# 参数摘要处理
|
119
|
-
def summarize_value(val):
|
120
|
-
if isinstance(val, pd.DataFrame):
|
121
|
-
return f"DataFrame(shape={val.shape}, columns={list(val.columns)})"
|
122
|
-
elif isinstance(val, np.ndarray):
|
123
|
-
return f"ndarray(shape={val.shape}, dtype={val.dtype})"
|
124
|
-
elif isinstance(val, (list, tuple)):
|
125
|
-
return [summarize_value(v) for v in val]
|
126
|
-
elif isinstance(val, dict):
|
127
|
-
return {k: summarize_value(v) for k, v in val.items()}
|
128
|
-
elif hasattr(val, '__class__') and not isinstance(val, (str, int, float, bool, type(None))):
|
129
|
-
return f"{val.__class__.__name__}"
|
130
|
-
else:
|
131
|
-
return val
|
132
|
-
args_summary = {k: summarize_value(v) for k, v in args_dict.items()}
|
133
|
-
logger.info('更新', {'库': db_name, '表': table_name, 'func': func.__name__, 'args': args_summary, 'kwargs': kwargs})
|
134
|
-
|
135
|
-
# 执行原始函数
|
136
|
-
result = func(*args, **kwargs)
|
137
|
-
|
138
|
-
if result is None:
|
139
|
-
logger.info('函数返回None,直接返回原结果,不执行上传', {'库': db_name, '表': table_name, 'func': func.__name__})
|
140
|
-
return None
|
141
|
-
|
142
|
-
# 处理 DataFrame 结果
|
143
|
-
if isinstance(result, (pd.DataFrame, list, dict)):
|
144
|
-
if set_type is not None:
|
145
|
-
if isinstance(result, pd.DataFrame):
|
146
|
-
result = reorder_columns(result, set_type)
|
147
|
-
elif isinstance(result, list):
|
148
|
-
# 如果是list,转换为DataFrame以调整列顺序
|
149
|
-
result = reorder_columns(pd.DataFrame(result), set_type)
|
150
|
-
elif isinstance(result, dict):
|
151
|
-
# 如果是dict,转换为DataFrame以调整列顺序
|
152
|
-
result = reorder_columns(pd.DataFrame([result]), set_type)
|
153
|
-
|
154
|
-
# 合并参数
|
155
|
-
merged_kwargs = {
|
156
|
-
'check_duplicate': False,
|
157
|
-
'update_on_duplicate': True,
|
158
|
-
'allow_null': False,
|
159
|
-
'transaction_mode': 'batch',
|
160
|
-
**upload_kwargs
|
161
|
-
}
|
162
|
-
|
163
|
-
uld.upload_data(data=result, **merged_kwargs)
|
164
|
-
logger.info('上传完成', {'库': db_name, '表': table_name, 'func': func.__name__})
|
165
|
-
return True
|
166
|
-
|
167
|
-
# 处理元组结果
|
168
|
-
elif isinstance(result, tuple):
|
169
|
-
if len(result) < 2:
|
170
|
-
logger.warning('函数返回的元组长度小于2,直接返回原结果,不执行上传', {'库': db_name, '表': table_name, 'func': func.__name__})
|
171
|
-
return result
|
172
|
-
|
173
|
-
df, extra_kwargs = result[0], result[1]
|
174
|
-
|
175
|
-
if not isinstance(df, (pd.DataFrame, list, dict)):
|
176
|
-
logger.warning('函数返回的元组第一个元素不是DataFrame/list/dict,直接返回原结果,不执行上传', {'库': db_name, '表': table_name, 'func': func.__name__})
|
177
|
-
return result
|
178
|
-
|
179
|
-
if set_type is not None:
|
180
|
-
if isinstance(df, pd.DataFrame):
|
181
|
-
df = reorder_columns(df, set_type)
|
182
|
-
elif isinstance(df, list):
|
183
|
-
# 如果是list,转换为DataFrame以调整列顺序
|
184
|
-
df = reorder_columns(pd.DataFrame(df), set_type)
|
185
|
-
elif isinstance(df, dict):
|
186
|
-
# 如果是dict,转换为DataFrame以调整列顺序
|
187
|
-
df = reorder_columns(pd.DataFrame([df]), set_type)
|
188
|
-
result = (df, extra_kwargs) + result[2:]
|
189
|
-
|
190
|
-
# 合并参数
|
191
|
-
merged_kwargs = {
|
192
|
-
'check_duplicate': False,
|
193
|
-
'update_on_duplicate': True,
|
194
|
-
'allow_null': False,
|
195
|
-
'transaction_mode': 'batch',
|
196
|
-
**upload_kwargs,
|
197
|
-
**extra_kwargs
|
198
|
-
}
|
199
|
-
|
200
|
-
uld.upload_data(data=df, **merged_kwargs)
|
201
|
-
logger.info('上传完成', {'库': db_name, '表': table_name, 'func': func.__name__})
|
202
|
-
return result if len(result) > 2 else True
|
203
|
-
logger.info('上传完成', {'库': db_name, '表': table_name, 'func': func.__name__})
|
204
|
-
return result
|
205
|
-
|
206
|
-
except Exception as e:
|
207
|
-
logger.error('数据上传失败', {'库': db_name, '表': table_name, 'func': func.__name__, '错误': str(e)})
|
208
|
-
return False
|
209
|
-
|
210
|
-
return wrapper
|
211
|
-
return decorator
|
212
|
-
|
213
|
-
|
214
|
-
class ShopDataQuery:
|
215
|
-
"""
|
216
|
-
从数据库中下载数据
|
217
|
-
"""
|
218
|
-
def __init__(self, download_manager):
|
219
|
-
self.months = 0 # 下载几个月数据, 0 表示当月, 1 是上月 1 号至今
|
220
|
-
self.download_manager = download_manager
|
221
|
-
self.pf_datas = []
|
222
|
-
|
223
|
-
@upload_data_decorator()
|
224
|
-
def shops_concat(self, db_name='聚合数据', table_name='多店聚合_日报'):
|
225
|
-
shop_list = {
|
226
|
-
'DS-WLM天猫旗舰店': '天猫', # e3
|
227
|
-
'DS-WLM淘宝商城C店': 'c店',
|
228
|
-
'DS-SJ天猫旗舰店': '圣积',
|
229
|
-
'wanlima万里马箱包outlet店': '奥莱',
|
230
|
-
'DS-WLM京东旗舰店': '京东pop',
|
231
|
-
'拼多多万里马箱包官方旗舰店': '拼多多_丹宁',
|
232
|
-
'WLM-拼多多TOGO牛皮官方旗舰店': '拼多多_togo',
|
233
|
-
'万里马官方旗舰店': '天猫', # 平台
|
234
|
-
'万里马官方企业店': 'c店',
|
235
|
-
'saintjack旗舰店': '圣积',
|
236
|
-
'wanlima万里马箱包outlet店': '奥莱',
|
237
|
-
'万里马京东旗舰店': '京东pop',
|
238
|
-
'万里马箱包官方旗舰店': '拼多多_丹宁',
|
239
|
-
'万里马箱包皮具官方旗舰店': '拼多多_togo',
|
240
|
-
'万里马箱包outlet店': '奥莱', # 推广
|
241
|
-
'京东箱包旗舰店': '京东pop',
|
242
|
-
'京东自营旗舰店女包': '京东自营',
|
243
|
-
}
|
244
|
-
df_real_sales = self._get_real_sales(shop_list=shop_list)
|
245
|
-
df_shop_gmv = self._get_shop_gmv(shop_list=shop_list)
|
246
|
-
df_tg_data = self._get_tg_data(shop_list=shop_list)
|
247
|
-
df = df_shop_gmv.merge(df_real_sales, on=['日期', '店铺名称'], how='outer') # 平台数据合并销售数据
|
248
|
-
df = df.merge(df_tg_data, on=['日期', '店铺名称'], how='outer') # 合并推广数据
|
249
|
-
df.fillna(0, inplace=True)
|
250
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
251
|
-
return df, {
|
252
|
-
'db_name': db_name,
|
253
|
-
'table_name': table_name,
|
254
|
-
'set_typ': set_typ,
|
255
|
-
'primary_keys': [], # 创建唯一主键
|
256
|
-
'check_duplicate': False, # 检查重复数据
|
257
|
-
'duplicate_columns': [], # 指定排重的组合键
|
258
|
-
'update_on_duplicate': True, # 更新旧数据
|
259
|
-
'allow_null': False, # 允许插入空值
|
260
|
-
'partition_by': None, # 分表方式
|
261
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
262
|
-
'indexes': [], # 普通索引列
|
263
|
-
'transaction_mode': 'batch', # 事务模式
|
264
|
-
'unique_keys': [['日期', '店铺名称']], # 唯一约束列表
|
265
|
-
}
|
266
|
-
|
267
|
-
def _get_tg_data(self, db_name='聚合数据', table_name='多店推广场景_按日聚合', shop_list:dict=None):
|
268
|
-
"""获取推广数据"""
|
269
|
-
start_date, end_date = self.months_data(num=self.months)
|
270
|
-
projection = ['日期', '店铺名称', '营销场景', '花费']
|
271
|
-
df = self.download_manager.data_to_df(
|
272
|
-
db_name=db_name,
|
273
|
-
table_name=table_name,
|
274
|
-
start_date=start_date,
|
275
|
-
end_date=end_date,
|
276
|
-
projection=projection,
|
277
|
-
)
|
278
|
-
if df.empty:
|
279
|
-
return pd.DataFrame(columns=['日期', '店铺名称', '实际消耗'])
|
280
|
-
df = df[(df['店铺名称'].isin(shop_list.keys()))]
|
281
|
-
df = df.astype({
|
282
|
-
'日期': 'datetime64[ns]',
|
283
|
-
'花费': 'float64',
|
284
|
-
})
|
285
|
-
df = df.groupby(['日期', '店铺名称'], as_index=False).agg({'花费': 'sum'}).rename(columns={'花费': '实际消耗'})
|
286
|
-
df['店铺名称'] = df['店铺名称'].map(shop_list)
|
287
|
-
return df
|
288
|
-
|
289
|
-
def _get_shop_gmv(self, db_name='生意参谋3', table_name='取数_店铺_整体流量', shop_list:dict=None):
|
290
|
-
"""获取平台数据"""
|
291
|
-
start_date, end_date = self.months_data(num=self.months)
|
292
|
-
projection = ['日期', '店铺名称', '粒度', '维度', '数据周期', '访客数', '浏览量', '支付金额', '支付买家数', '支付件数']
|
293
|
-
df = self.download_manager.data_to_df(
|
294
|
-
db_name=db_name,
|
295
|
-
table_name=table_name,
|
296
|
-
start_date=start_date,
|
297
|
-
end_date=end_date,
|
298
|
-
projection=projection,
|
299
|
-
)
|
300
|
-
if len(df) == 0:
|
301
|
-
return pd.DataFrame(columns=['日期', '店铺名称', '访客数', '浏览量', '支付金额', '支付买家数', '支付件数'])
|
302
|
-
df = df[(df['店铺名称'].isin(shop_list.keys())) & (df['粒度'] == '店铺') & (df['维度'] == '整体流量') & (df['数据周期'] == '分日')]
|
303
|
-
df = df.astype({
|
304
|
-
'日期': 'datetime64[ns]',
|
305
|
-
'访客数': 'int64',
|
306
|
-
'浏览量': 'int64',
|
307
|
-
'支付金额': 'float64',
|
308
|
-
'支付买家数': 'int64',
|
309
|
-
'支付件数': 'int64'
|
310
|
-
})
|
311
|
-
df = df.groupby(['日期', '店铺名称'], as_index=False).agg({
|
312
|
-
'访客数': 'sum',
|
313
|
-
'浏览量': 'sum',
|
314
|
-
'支付金额': 'sum',
|
315
|
-
'支付买家数': 'sum',
|
316
|
-
'支付件数': 'sum'
|
317
|
-
})
|
318
|
-
df['店铺名称'] = df['店铺名称'].map(shop_list)
|
319
|
-
return df
|
320
|
-
|
321
|
-
def _get_real_sales(self, db_name='生意经3', table_name='零售明细统计', shop_list:dict=None):
|
322
|
-
"""获取e3销售"""
|
323
|
-
start_date, end_date = self.months_data(num=self.months)
|
324
|
-
projection = ['验收日期', '商店名称', '商品代码', '金额']
|
325
|
-
__res = []
|
326
|
-
for year in range(2025, datetime.datetime.today().year+1):
|
327
|
-
df = self.download_manager.data_to_df(
|
328
|
-
db_name=db_name,
|
329
|
-
table_name=f'{table_name}_{year}',
|
330
|
-
start_date=start_date,
|
331
|
-
end_date=end_date,
|
332
|
-
projection=projection,
|
333
|
-
)
|
334
|
-
__res.append(df)
|
335
|
-
df_default = pd.DataFrame(columns=['日期', '店铺名称', '实际营收'])
|
336
|
-
if len(__res) == 0:
|
337
|
-
return df_default
|
338
|
-
df = pd.concat(__res, ignore_index=True)
|
339
|
-
if df.empty:
|
340
|
-
return df_default
|
341
|
-
df = df[(df['商品代码'] != '20160222') & (df['商店名称'].isin(shop_list.keys()))] # 剔除补单数据
|
342
|
-
if df.empty:
|
343
|
-
return df_default
|
344
|
-
df['商店名称'] = df['商店名称'].map(shop_list)
|
345
|
-
df = df.astype({
|
346
|
-
'验收日期': 'datetime64[ns]', '金额': 'float64'
|
347
|
-
}).groupby(
|
348
|
-
['验收日期', '商店名称'], as_index=False
|
349
|
-
).agg({
|
350
|
-
'金额': 'sum'
|
351
|
-
}).rename(
|
352
|
-
columns={'商店名称': '店铺名称', '验收日期': '日期', '金额': '实际营收'}
|
353
|
-
)
|
354
|
-
df_ziying_sales = self._get_ziying_sales(shop_list=shop_list)
|
355
|
-
df = pd.concat([df, df_ziying_sales], ignore_index=True) # e3 合并京东自营业绩
|
356
|
-
return df
|
357
|
-
|
358
|
-
def _get_ziying_sales(self, db_name='京东数据3', table_name='京东自营_vc品牌业绩', shop_list:dict=None):
|
359
|
-
"""获取京东自营业绩"""
|
360
|
-
start_date, end_date = self.months_data(num=self.months)
|
361
|
-
projection = ['日期', '店铺名称', '收入']
|
362
|
-
df = self.download_manager.data_to_df(
|
363
|
-
db_name=db_name,
|
364
|
-
table_name=table_name,
|
365
|
-
start_date=start_date,
|
366
|
-
end_date=end_date,
|
367
|
-
projection=projection,
|
368
|
-
)
|
369
|
-
if df.empty:
|
370
|
-
return pd.DataFrame(columns=['日期', '店铺名称', '收入'])
|
371
|
-
df = df[(df['店铺名称'].isin(shop_list.keys()))]
|
372
|
-
df = df.astype({
|
373
|
-
'日期': 'datetime64[ns]',
|
374
|
-
'收入': 'float64'
|
375
|
-
})
|
376
|
-
df = df.groupby(['日期', '店铺名称'], as_index=False).agg({'收入': 'sum'}).rename(columns={'收入': '实际营收'})
|
377
|
-
df['店铺名称'] = df['店铺名称'].map(shop_list)
|
378
|
-
return df
|
379
|
-
|
380
|
-
|
381
|
-
class MysqlDatasQuery:
|
382
|
-
"""
|
383
|
-
从数据库中下载数据
|
384
|
-
"""
|
385
|
-
def __init__(self, download_manager):
|
386
|
-
self.months = 0 # 下载几个月数据, 0 表示当月, 1 是上月 1 号至今
|
387
|
-
self.download_manager = download_manager
|
388
|
-
self.pf_datas = []
|
389
|
-
|
390
|
-
# @error_handler.log_on_exception(logger=logger)
|
391
|
-
def tg_wxt(self, db_name='聚合数据', table_name='天猫_主体报表', is_maximize=True):
|
392
|
-
start_date, end_date = self.months_data(num=self.months)
|
393
|
-
projection = {
|
394
|
-
'日期': 1,
|
395
|
-
'场景名字': 1,
|
396
|
-
'主体id': 1,
|
397
|
-
'花费': 1,
|
398
|
-
'展现量': 1,
|
399
|
-
'点击量': 1,
|
400
|
-
'总购物车数': 1,
|
401
|
-
'总成交笔数': 1,
|
402
|
-
'总成交金额': 1,
|
403
|
-
'自然流量曝光量': 1,
|
404
|
-
'直接成交笔数': 1,
|
405
|
-
'直接成交金额': 1,
|
406
|
-
'店铺名称': 1,
|
407
|
-
}
|
408
|
-
__res = []
|
409
|
-
for year in range(2024, datetime.datetime.today().year+1):
|
410
|
-
df = self.download_manager.data_to_df(
|
411
|
-
db_name='推广数据2',
|
412
|
-
table_name=f'主体报表_{year}',
|
413
|
-
start_date=start_date,
|
414
|
-
end_date=end_date,
|
415
|
-
projection=projection,
|
416
|
-
)
|
417
|
-
__res.append(df)
|
418
|
-
df = pd.concat(__res, ignore_index=True)
|
419
|
-
df.rename(columns={
|
420
|
-
'场景名字': '营销场景',
|
421
|
-
'主体id': '商品id',
|
422
|
-
'总购物车数': '加购量',
|
423
|
-
'总成交笔数': '成交笔数',
|
424
|
-
'总成交金额': '成交金额'
|
425
|
-
}, inplace=True)
|
426
|
-
df = df.astype({
|
427
|
-
'商品id': str,
|
428
|
-
'花费': 'float64',
|
429
|
-
'展现量': 'int64',
|
430
|
-
'点击量': 'int64',
|
431
|
-
'加购量': 'int64',
|
432
|
-
'成交笔数': 'int64',
|
433
|
-
'成交金额': 'float64',
|
434
|
-
'自然流量曝光量': 'int64',
|
435
|
-
'直接成交笔数': 'int64',
|
436
|
-
'直接成交金额': 'float64',
|
437
|
-
}, errors='raise')
|
438
|
-
df = df[df['花费'] > 0]
|
439
|
-
if is_maximize:
|
440
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
441
|
-
**{
|
442
|
-
'展现量': ('展现量', np.max),
|
443
|
-
'加购量': ('加购量', np.max),
|
444
|
-
'成交笔数': ('成交笔数', np.max),
|
445
|
-
'成交金额': ('成交金额', np.max),
|
446
|
-
'自然流量曝光量': ('自然流量曝光量', np.max),
|
447
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
448
|
-
'直接成交金额': ('直接成交金额', np.max)
|
449
|
-
}
|
450
|
-
)
|
451
|
-
else:
|
452
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
453
|
-
**{
|
454
|
-
'展现量': ('展现量', np.min),
|
455
|
-
'加购量': ('加购量', np.min),
|
456
|
-
'成交笔数': ('成交笔数', np.min),
|
457
|
-
'成交金额': ('成交金额', np.min),
|
458
|
-
'自然流量曝光量': ('自然流量曝光量', np.min),
|
459
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
460
|
-
'直接成交金额': ('直接成交金额', np.max)
|
461
|
-
}
|
462
|
-
)
|
463
|
-
df.insert(loc=1, column='推广渠道', value='万相台无界版')
|
464
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
465
|
-
# 制作其他聚合表
|
466
|
-
self.pf_datas.append(
|
467
|
-
{
|
468
|
-
'集合名称': '天猫汇总表调用',
|
469
|
-
'数据主体': df[
|
470
|
-
['日期', '店铺名称', '推广渠道', '营销场景', '商品id', '花费', '展现量', '点击量', '加购量',
|
471
|
-
'成交笔数', '成交金额', '直接成交笔数', '直接成交金额', '自然流量曝光量']]
|
472
|
-
}
|
473
|
-
)
|
474
|
-
logger.info('更新', {'主机': f'{host}:{port}', '库': db_name, '表': table_name})
|
475
|
-
|
476
|
-
uld.upload_data(
|
477
|
-
db_name=db_name,
|
478
|
-
table_name=table_name,
|
479
|
-
data=df,
|
480
|
-
set_typ=set_typ, # 定义列和数据类型
|
481
|
-
primary_keys=[], # 创建唯一主键
|
482
|
-
check_duplicate=False, # 检查重复数据
|
483
|
-
duplicate_columns=[], # 指定排重的组合键
|
484
|
-
update_on_duplicate=True, # 更新旧数据
|
485
|
-
allow_null=False, # 允许插入空值
|
486
|
-
partition_by=None, # 分表方式
|
487
|
-
partition_date_column='日期', # 用于分表的日期列名,默认为'日期'
|
488
|
-
indexes=[], # 普通索引列
|
489
|
-
transaction_mode='batch', # 事务模式
|
490
|
-
unique_keys=[['日期', '推广渠道', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量', '自然流量曝光量']], # 唯一约束列表
|
491
|
-
)
|
492
|
-
|
493
|
-
# df_pic:商品排序索引表, 给 powerbi 中的主推款排序用的,(从上月1号到今天的总花费进行排序)
|
494
|
-
today = datetime.date.today()
|
495
|
-
last_month = today - datetime.timedelta(days=30)
|
496
|
-
if last_month.month == 12:
|
497
|
-
year_my = today.year - 1
|
498
|
-
else:
|
499
|
-
year_my = today.year
|
500
|
-
# 截取 从上月1日 至 今天的花费数据, 推广款式按此数据从高到低排序(商品图+排序)
|
501
|
-
# df_pic_lin = df[df['店铺名称'] == '万里马官方旗舰店']
|
502
|
-
df_pic = df.groupby(['日期', '店铺名称', '商品id'], as_index=False).agg({'花费': 'sum'})
|
503
|
-
if len(df_pic) == 0:
|
504
|
-
return True
|
505
|
-
df_pic = df_pic[~df_pic['商品id'].isin([''])] # 指定列中删除包含空值的行
|
506
|
-
date_obj = datetime.datetime.strptime(f'{year_my}-{last_month.month}-01', '%Y-%m-%d').date()
|
507
|
-
df_pic = df_pic[(df_pic['日期'] >= date_obj)]
|
508
|
-
df_pic = df_pic.groupby(['店铺名称', '商品id'], as_index=False).agg({'花费': 'sum'})
|
509
|
-
df_pic.sort_values('花费', ascending=False, ignore_index=True, inplace=True)
|
510
|
-
df_pic.reset_index(inplace=True)
|
511
|
-
df_pic['index'] = df_pic['index'] + 100
|
512
|
-
df_pic.rename(columns={'index': '商品索引'}, inplace=True)
|
513
|
-
df_pic['商品索引'].fillna(1000, inplace=True)
|
514
|
-
df_pic.pop('花费')
|
515
|
-
p= df_pic.pop('商品索引')
|
516
|
-
df_pic.insert(loc=2, column='商品索引', value=p) # df中插入新列
|
517
|
-
df_pic['更新时间'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
518
|
-
set_typ = SET_TYP_DICT['属性设置3_商品索引表_主推排序调用']
|
519
|
-
logger.info('更新', {'主机': f'{host}:{port}', '库': '属性设置3', '表': '商品索引表_主推排序调用'})
|
520
|
-
uld.upload_data(
|
521
|
-
db_name='属性设置3',
|
522
|
-
table_name='商品索引表_主推排序调用',
|
523
|
-
data=df_pic,
|
524
|
-
set_typ=set_typ, # 定义列和数据类型
|
525
|
-
primary_keys=[], # 创建唯一主键
|
526
|
-
check_duplicate=False, # 检查重复数据
|
527
|
-
duplicate_columns=[], # 指定排重的组合键
|
528
|
-
update_on_duplicate=True, # 更新旧数据
|
529
|
-
allow_null=False, # 允许插入空值
|
530
|
-
partition_by=None, # 分表方式
|
531
|
-
partition_date_column='日期', # 用于分表的日期列名,默认为'日期'
|
532
|
-
indexes=[], # 普通索引列
|
533
|
-
transaction_mode='batch', # 事务模式
|
534
|
-
unique_keys=[['商品id']], # 唯一约束列表
|
535
|
-
)
|
536
|
-
return True
|
537
|
-
|
538
|
-
@upload_data_decorator()
|
539
|
-
def _tb_wxt(self, db_name='聚合数据', table_name='淘宝_主体报表', is_maximize=True):
|
540
|
-
start_date, end_date = self.months_data(num=self.months)
|
541
|
-
projection = {
|
542
|
-
'日期': 1,
|
543
|
-
'场景名字': 1,
|
544
|
-
'主体id': 1,
|
545
|
-
'花费': 1,
|
546
|
-
'展现量': 1,
|
547
|
-
'点击量': 1,
|
548
|
-
'总购物车数': 1,
|
549
|
-
'总成交笔数': 1,
|
550
|
-
'总成交金额': 1,
|
551
|
-
'自然流量曝光量': 1,
|
552
|
-
'直接成交笔数': 1,
|
553
|
-
'直接成交金额': 1,
|
554
|
-
'店铺名称': 1,
|
555
|
-
}
|
556
|
-
__res = []
|
557
|
-
for year in range(2024, datetime.datetime.today().year+1):
|
558
|
-
df = self.download_manager.data_to_df(
|
559
|
-
db_name='推广数据_淘宝店',
|
560
|
-
table_name=f'主体报表_{year}',
|
561
|
-
start_date=start_date,
|
562
|
-
end_date=end_date,
|
563
|
-
projection=projection,
|
564
|
-
)
|
565
|
-
__res.append(df)
|
566
|
-
df = pd.concat(__res, ignore_index=True)
|
567
|
-
df.rename(columns={
|
568
|
-
'场景名字': '营销场景',
|
569
|
-
'主体id': '商品id',
|
570
|
-
'总购物车数': '加购量',
|
571
|
-
'总成交笔数': '成交笔数',
|
572
|
-
'总成交金额': '成交金额'
|
573
|
-
}, inplace=True)
|
574
|
-
df = df.astype({
|
575
|
-
'商品id': str,
|
576
|
-
'花费': 'float64',
|
577
|
-
'展现量': 'int64',
|
578
|
-
'点击量': 'int64',
|
579
|
-
'加购量': 'int64',
|
580
|
-
'成交笔数': 'int64',
|
581
|
-
'成交金额': 'float64',
|
582
|
-
'自然流量曝光量': 'int64',
|
583
|
-
'直接成交笔数': 'int64',
|
584
|
-
'直接成交金额': 'float64',
|
585
|
-
}, errors='raise')
|
586
|
-
df = df[df['花费'] > 0]
|
587
|
-
if is_maximize:
|
588
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
589
|
-
**{
|
590
|
-
'展现量': ('展现量', np.max),
|
591
|
-
'加购量': ('加购量', np.max),
|
592
|
-
'成交笔数': ('成交笔数', np.max),
|
593
|
-
'成交金额': ('成交金额', np.max),
|
594
|
-
'自然流量曝光量': ('自然流量曝光量', np.max),
|
595
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
596
|
-
'直接成交金额': ('直接成交金额', np.max)
|
597
|
-
}
|
598
|
-
)
|
599
|
-
else:
|
600
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
601
|
-
**{
|
602
|
-
'展现量': ('展现量', np.min),
|
603
|
-
'加购量': ('加购量', np.min),
|
604
|
-
'成交笔数': ('成交笔数', np.min),
|
605
|
-
'成交金额': ('成交金额', np.min),
|
606
|
-
'自然流量曝光量': ('自然流量曝光量', np.min),
|
607
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
608
|
-
'直接成交金额': ('直接成交金额', np.max)
|
609
|
-
}
|
610
|
-
)
|
611
|
-
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
612
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
613
|
-
return df, {
|
614
|
-
'db_name': db_name,
|
615
|
-
'table_name': table_name,
|
616
|
-
'set_typ': set_typ,
|
617
|
-
'primary_keys': [], # 创建唯一主键
|
618
|
-
'check_duplicate': False, # 检查重复数据
|
619
|
-
'duplicate_columns': [], # 指定排重的组合键
|
620
|
-
'update_on_duplicate': True, # 更新旧数据
|
621
|
-
'allow_null': False, # 允许插入空值
|
622
|
-
'partition_by': None, # 分表方式
|
623
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
624
|
-
'indexes': [], # 普通索引列
|
625
|
-
'transaction_mode': 'batch', # 事务模式
|
626
|
-
'unique_keys': [['日期', '推广渠道', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量', '自然流量曝光量']], # 唯一约束列表
|
627
|
-
}
|
628
|
-
|
629
|
-
@upload_data_decorator()
|
630
|
-
def _ald_wxt(self, db_name='聚合数据', table_name='奥莱店_主体报表', is_maximize=True):
|
631
|
-
start_date, end_date = self.months_data(num=self.months)
|
632
|
-
projection = {
|
633
|
-
'日期': 1,
|
634
|
-
'场景名字': 1,
|
635
|
-
'主体id': 1,
|
636
|
-
'花费': 1,
|
637
|
-
'展现量': 1,
|
638
|
-
'点击量': 1,
|
639
|
-
'总购物车数': 1,
|
640
|
-
'总成交笔数': 1,
|
641
|
-
'总成交金额': 1,
|
642
|
-
'自然流量曝光量': 1,
|
643
|
-
'直接成交笔数': 1,
|
644
|
-
'直接成交金额': 1,
|
645
|
-
'店铺名称': 1,
|
646
|
-
}
|
647
|
-
__res = []
|
648
|
-
for year in range(2024, datetime.datetime.today().year+1):
|
649
|
-
df = self.download_manager.data_to_df(
|
650
|
-
db_name='推广数据_奥莱店',
|
651
|
-
table_name=f'主体报表_{year}',
|
652
|
-
start_date=start_date,
|
653
|
-
end_date=end_date,
|
654
|
-
projection=projection,
|
655
|
-
)
|
656
|
-
__res.append(df)
|
657
|
-
df = pd.concat(__res, ignore_index=True)
|
658
|
-
df.rename(columns={
|
659
|
-
'场景名字': '营销场景',
|
660
|
-
'主体id': '商品id',
|
661
|
-
'总购物车数': '加购量',
|
662
|
-
'总成交笔数': '成交笔数',
|
663
|
-
'总成交金额': '成交金额'
|
664
|
-
}, inplace=True)
|
665
|
-
df = df.astype({
|
666
|
-
'商品id': str,
|
667
|
-
'花费': 'float64',
|
668
|
-
'展现量': 'int64',
|
669
|
-
'点击量': 'int64',
|
670
|
-
'加购量': 'int64',
|
671
|
-
'成交笔数': 'int64',
|
672
|
-
'成交金额': 'float64',
|
673
|
-
'自然流量曝光量': 'int64',
|
674
|
-
'直接成交笔数': 'int64',
|
675
|
-
'直接成交金额': 'float64',
|
676
|
-
}, errors='raise')
|
677
|
-
df = df[df['花费'] > 0]
|
678
|
-
if is_maximize:
|
679
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
680
|
-
**{
|
681
|
-
'展现量': ('展现量', np.max),
|
682
|
-
'加购量': ('加购量', np.max),
|
683
|
-
'成交笔数': ('成交笔数', np.max),
|
684
|
-
'成交金额': ('成交金额', np.max),
|
685
|
-
'自然流量曝光量': ('自然流量曝光量', np.max),
|
686
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
687
|
-
'直接成交金额': ('直接成交金额', np.max)
|
688
|
-
}
|
689
|
-
)
|
690
|
-
else:
|
691
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
692
|
-
**{
|
693
|
-
'展现量': ('展现量', np.min),
|
694
|
-
'加购量': ('加购量', np.min),
|
695
|
-
'成交笔数': ('成交笔数', np.min),
|
696
|
-
'成交金额': ('成交金额', np.min),
|
697
|
-
'自然流量曝光量': ('自然流量曝光量', np.min),
|
698
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
699
|
-
'直接成交金额': ('直接成交金额', np.max)
|
700
|
-
}
|
701
|
-
)
|
702
|
-
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
703
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
704
|
-
return df, {
|
705
|
-
'db_name': db_name,
|
706
|
-
'table_name': table_name,
|
707
|
-
'set_typ': set_typ,
|
708
|
-
'primary_keys': [], # 创建唯一主键
|
709
|
-
'check_duplicate': False, # 检查重复数据
|
710
|
-
'duplicate_columns': [], # 指定排重的组合键
|
711
|
-
'update_on_duplicate': True, # 更新旧数据
|
712
|
-
'allow_null': False, # 允许插入空值
|
713
|
-
'partition_by': None, # 分表方式
|
714
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
715
|
-
'indexes': [], # 普通索引列
|
716
|
-
'transaction_mode': 'batch', # 事务模式
|
717
|
-
'unique_keys': [['日期', '推广渠道', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量', '自然流量曝光量']], # 唯一约束列表
|
718
|
-
}
|
719
|
-
|
720
|
-
@upload_data_decorator()
|
721
|
-
def _sj_wxt(self, db_name='聚合数据', table_name='圣积天猫店_主体报表', is_maximize=True):
|
722
|
-
start_date, end_date = self.months_data(num=self.months)
|
723
|
-
projection = {
|
724
|
-
'日期': 1,
|
725
|
-
'场景名字': 1,
|
726
|
-
'主体id': 1,
|
727
|
-
'花费': 1,
|
728
|
-
'展现量': 1,
|
729
|
-
'点击量': 1,
|
730
|
-
'总购物车数': 1,
|
731
|
-
'总成交笔数': 1,
|
732
|
-
'总成交金额': 1,
|
733
|
-
'自然流量曝光量': 1,
|
734
|
-
'直接成交笔数': 1,
|
735
|
-
'直接成交金额': 1,
|
736
|
-
'店铺名称': 1,
|
737
|
-
}
|
738
|
-
__res = []
|
739
|
-
for year in range(2025, datetime.datetime.today().year+1):
|
740
|
-
df = self.download_manager.data_to_df(
|
741
|
-
db_name='推广数据_圣积天猫店',
|
742
|
-
table_name=f'主体报表_{year}',
|
743
|
-
start_date=start_date,
|
744
|
-
end_date=end_date,
|
745
|
-
projection=projection,
|
746
|
-
)
|
747
|
-
__res.append(df)
|
748
|
-
df = pd.concat(__res, ignore_index=True)
|
749
|
-
df.rename(columns={
|
750
|
-
'场景名字': '营销场景',
|
751
|
-
'主体id': '商品id',
|
752
|
-
'总购物车数': '加购量',
|
753
|
-
'总成交笔数': '成交笔数',
|
754
|
-
'总成交金额': '成交金额'
|
755
|
-
}, inplace=True)
|
756
|
-
df = df.astype({
|
757
|
-
'商品id': str,
|
758
|
-
'花费': 'float64',
|
759
|
-
'展现量': 'int64',
|
760
|
-
'点击量': 'int64',
|
761
|
-
'加购量': 'int64',
|
762
|
-
'成交笔数': 'int64',
|
763
|
-
'成交金额': 'float64',
|
764
|
-
'自然流量曝光量': 'int64',
|
765
|
-
'直接成交笔数': 'int64',
|
766
|
-
'直接成交金额': 'float64',
|
767
|
-
}, errors='raise')
|
768
|
-
df = df[df['花费'] > 0]
|
769
|
-
if is_maximize:
|
770
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
771
|
-
**{
|
772
|
-
'展现量': ('展现量', np.max),
|
773
|
-
'加购量': ('加购量', np.max),
|
774
|
-
'成交笔数': ('成交笔数', np.max),
|
775
|
-
'成交金额': ('成交金额', np.max),
|
776
|
-
'自然流量曝光量': ('自然流量曝光量', np.max),
|
777
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
778
|
-
'直接成交金额': ('直接成交金额', np.max)
|
779
|
-
}
|
780
|
-
)
|
781
|
-
else:
|
782
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
783
|
-
**{
|
784
|
-
'展现量': ('展现量', np.min),
|
785
|
-
'加购量': ('加购量', np.min),
|
786
|
-
'成交笔数': ('成交笔数', np.min),
|
787
|
-
'成交金额': ('成交金额', np.min),
|
788
|
-
'自然流量曝光量': ('自然流量曝光量', np.min),
|
789
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
790
|
-
'直接成交金额': ('直接成交金额', np.max)
|
791
|
-
}
|
792
|
-
)
|
793
|
-
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
794
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
795
|
-
return df, {
|
796
|
-
'db_name': db_name,
|
797
|
-
'table_name': table_name,
|
798
|
-
'set_typ': set_typ,
|
799
|
-
'primary_keys': [], # 创建唯一主键
|
800
|
-
'check_duplicate': False, # 检查重复数据
|
801
|
-
'duplicate_columns': [], # 指定排重的组合键
|
802
|
-
'update_on_duplicate': True, # 更新旧数据
|
803
|
-
'allow_null': False, # 允许插入空值
|
804
|
-
'partition_by': None, # 分表方式
|
805
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
806
|
-
'indexes': [], # 普通索引列
|
807
|
-
'transaction_mode': 'batch', # 事务模式
|
808
|
-
'unique_keys': [['日期', '推广渠道', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量', '自然流量曝光量']], # 唯一约束列表
|
809
|
-
}
|
810
|
-
|
811
|
-
@error_handler.log_on_exception(logger=logger)
|
812
|
-
@upload_data_decorator()
|
813
|
-
def syj(self, db_name='聚合数据', table_name='生意经_宝贝指标'):
|
814
|
-
start_date, end_date = self.months_data(num=self.months)
|
815
|
-
projection = {
|
816
|
-
'日期': 1,
|
817
|
-
'宝贝id': 1,
|
818
|
-
'商家编码': 1,
|
819
|
-
'行业类目': 1,
|
820
|
-
'销售额': 1,
|
821
|
-
'销售量': 1,
|
822
|
-
'订单数': 1,
|
823
|
-
'退货量': 1,
|
824
|
-
'退款额': 1,
|
825
|
-
'退款额_发货后': 1,
|
826
|
-
'退货量_发货后': 1,
|
827
|
-
'店铺名称': 1,
|
828
|
-
'更新时间': 1,
|
829
|
-
}
|
830
|
-
__res = []
|
831
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
832
|
-
df = self.download_manager.data_to_df(
|
833
|
-
db_name='生意经3',
|
834
|
-
table_name=f'宝贝指标_{year}',
|
835
|
-
start_date=start_date,
|
836
|
-
end_date=end_date,
|
837
|
-
projection=projection,
|
838
|
-
)
|
839
|
-
__res.append(df)
|
840
|
-
df = pd.concat(__res, ignore_index=True)
|
841
|
-
df['宝贝id'] = df['宝贝id'].astype(str)
|
842
|
-
# 仅保留最新日期的数据
|
843
|
-
idx = df.groupby(['日期', '店铺名称', '宝贝id'])['更新时间'].idxmax()
|
844
|
-
df = df.loc[idx]
|
845
|
-
df = df[['日期', '店铺名称', '宝贝id', '行业类目', '销售额', '销售量', '订单数', '退货量', '退款额', '退款额_发货后', '退货量_发货后']]
|
846
|
-
df['件均价'] = np.where(df['销售量'] > 0, df['销售额'] / df['销售量'], 0).round(0)
|
847
|
-
df['价格带'] = df['件均价'].apply(
|
848
|
-
lambda x: '2000+' if x >= 2000
|
849
|
-
else '1000+' if x >= 1000
|
850
|
-
else '500+' if x >= 500
|
851
|
-
else '300+' if x >= 300
|
852
|
-
else '300以下'
|
853
|
-
)
|
854
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
855
|
-
return df, {
|
856
|
-
'db_name': db_name,
|
857
|
-
'table_name': table_name,
|
858
|
-
'set_typ': set_typ,
|
859
|
-
'primary_keys': [], # 创建唯一主键
|
860
|
-
'check_duplicate': False, # 检查重复数据
|
861
|
-
'duplicate_columns': [], # 指定排重的组合键
|
862
|
-
'update_on_duplicate': True, # 更新旧数据
|
863
|
-
'allow_null': False, # 允许插入空值
|
864
|
-
'partition_by': None, # 分表方式
|
865
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
866
|
-
'indexes': [], # 普通索引列
|
867
|
-
'transaction_mode': 'batch', # 事务模式
|
868
|
-
'unique_keys': [['日期', '店铺名称', '宝贝id']], # 唯一约束列表
|
869
|
-
}
|
870
|
-
|
871
|
-
@error_handler.log_on_exception(logger=logger)
|
872
|
-
@upload_data_decorator()
|
873
|
-
def tg_rqbb(self, db_name='聚合数据', table_name='天猫_人群报表', is_maximize=True):
|
874
|
-
start_date, end_date = self.months_data(num=self.months)
|
875
|
-
projection = {
|
876
|
-
'日期': 1,
|
877
|
-
'场景名字': 1,
|
878
|
-
'主体id': 1,
|
879
|
-
'花费': 1,
|
880
|
-
'展现量': 1,
|
881
|
-
'点击量': 1,
|
882
|
-
'总购物车数': 1,
|
883
|
-
'总成交笔数': 1,
|
884
|
-
'总成交金额': 1,
|
885
|
-
'直接成交笔数': 1,
|
886
|
-
'直接成交金额': 1,
|
887
|
-
'人群名字': 1,
|
888
|
-
'店铺名称': 1,
|
889
|
-
}
|
890
|
-
__res = []
|
891
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
892
|
-
df = self.download_manager.data_to_df(
|
893
|
-
db_name='推广数据2',
|
894
|
-
table_name=f'人群报表_{year}',
|
895
|
-
start_date=start_date,
|
896
|
-
end_date=end_date,
|
897
|
-
projection=projection,
|
898
|
-
)
|
899
|
-
__res.append(df)
|
900
|
-
df = pd.concat(__res, ignore_index=True)
|
901
|
-
df.rename(columns={
|
902
|
-
'场景名字': '营销场景',
|
903
|
-
'主体id': '商品id',
|
904
|
-
'总购物车数': '加购量',
|
905
|
-
'总成交笔数': '成交笔数',
|
906
|
-
'总成交金额': '成交金额'
|
907
|
-
}, inplace=True)
|
908
|
-
df.fillna(0, inplace=True)
|
909
|
-
df = df.astype({
|
910
|
-
'商品id': str,
|
911
|
-
'花费': 'float64',
|
912
|
-
'展现量': 'int64',
|
913
|
-
'点击量': 'int64',
|
914
|
-
'加购量': 'int64',
|
915
|
-
'成交笔数': 'int64',
|
916
|
-
'成交金额': 'int64',
|
917
|
-
'直接成交笔数': 'int64',
|
918
|
-
'直接成交金额': 'float64',
|
919
|
-
}, errors='raise')
|
920
|
-
if is_maximize:
|
921
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量', '人群名字'],
|
922
|
-
as_index=False).agg(
|
923
|
-
**{
|
924
|
-
'展现量': ('展现量', np.max),
|
925
|
-
'加购量': ('加购量', np.max),
|
926
|
-
'成交笔数': ('成交笔数', np.max),
|
927
|
-
'成交金额': ('成交金额', np.max),
|
928
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
929
|
-
'直接成交金额': ('直接成交金额', np.max)
|
930
|
-
}
|
931
|
-
)
|
932
|
-
else:
|
933
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量', '人群名字'],
|
934
|
-
as_index=False).agg(
|
935
|
-
**{
|
936
|
-
'展现量': ('展现量', np.min),
|
937
|
-
'加购量': ('加购量', np.min),
|
938
|
-
'成交笔数': ('成交笔数', np.min),
|
939
|
-
'成交金额': ('成交金额', np.min),
|
940
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
941
|
-
'直接成交金额': ('直接成交金额', np.max)
|
942
|
-
}
|
943
|
-
)
|
944
|
-
df.insert(loc=1, column='推广渠道', value='万相台无界版')
|
945
|
-
# 开始处理用户特征
|
946
|
-
df_sx = self.download_manager.data_to_df(
|
947
|
-
db_name='达摩盘3',
|
948
|
-
table_name=f'我的人群属性',
|
949
|
-
start_date=start_date,
|
950
|
-
end_date=end_date,
|
951
|
-
projection={'人群名称': 1, '消费能力等级': 1, '用户年龄': 1},
|
952
|
-
)
|
953
|
-
df_sx['人群名称'] = '达摩盘:' + df_sx['人群名称']
|
954
|
-
df_sx.rename(columns={'消费能力等级': '消费力层级'}, inplace=True)
|
955
|
-
df = pd.merge(df, df_sx, left_on=['人群名字'], right_on=['人群名称'], how='left')
|
956
|
-
df.pop('人群名称')
|
957
|
-
df['消费力层级'] = df['消费力层级'].apply(
|
958
|
-
lambda x: f'L{"".join(re.findall(r'L(\d)', str(x)))}' if str(x) != 'nan' else x)
|
959
|
-
df['用户年龄'] = df['用户年龄'].apply(
|
960
|
-
lambda x: "~".join(re.findall(r'(\d{2})\D.*(\d{2})岁', str(x))[0])
|
961
|
-
if str(x) != 'nan' and re.findall(r'(\d{2})\D.*(\d{2})岁', str(x)) else x)
|
962
|
-
# 1. 匹配 L后面接 2 个或以上数字,不区分大小写,示例:L345
|
963
|
-
# 2. 其余情况,L 后面接多个数字的都会被第一条 if 命中,不区分大小写
|
964
|
-
df['消费力层级'] = df.apply(
|
965
|
-
lambda x:
|
966
|
-
''.join(re.findall(r'(l\d+)', x['人群名字'].upper(), re.IGNORECASE))
|
967
|
-
if re.findall(r'(l\d{2,})', x['人群名字'], re.IGNORECASE) and str(x['消费力层级']) == 'nan'
|
968
|
-
else 'L5' if re.findall(r'(l\d*5)', x['人群名字'], re.IGNORECASE) and str(x['消费力层级']) == 'nan'
|
969
|
-
else 'L4' if re.findall(r'(l\d*4)', x['人群名字'], re.IGNORECASE) and str(x['消费力层级']) == 'nan'
|
970
|
-
else 'L3' if re.findall(r'(l\d*3)', x['人群名字'], re.IGNORECASE) and str(x['消费力层级']) == 'nan'
|
971
|
-
else 'L2' if re.findall(r'(l\d*2)', x['人群名字'], re.IGNORECASE) and str(x['消费力层级']) == 'nan'
|
972
|
-
else 'L1' if re.findall(r'(l\d*1)', x['人群名字'], re.IGNORECASE) and str(x['消费力层级']) == 'nan'
|
973
|
-
else x['消费力层级'], axis=1)
|
974
|
-
# 1. 匹配连续的 4 个数字且后面不能接数字或"元"或汉字,筛掉的人群示例:月均消费6000元|受众20240729175213|xxx2024真皮公文包
|
975
|
-
# 2. 匹配 2数字_2数字且前面不能是数字,合法匹配:人群_30_50_促; 非法示例:L345_3040 避免识别出 35~20 岁用户的情况
|
976
|
-
# pattern = r'(\d{4})(?!\d|[\u4e00-\u9fa5])' # 匹配 4 个数字,后面不能接数字或汉字
|
977
|
-
# pattern = r'(?<![\d\u4e00-\u9fa5])(\d{4})' # 匹配前面不是数字或汉字的 4 个连续数字
|
978
|
-
# 匹配 4 个数字,前面和后面都不能是数字或汉字
|
979
|
-
pattern1 = r'(?<![\d\u4e00-\u9fa5])(\d{4})(?!\d|[\u4e00-\u9fa5])'
|
980
|
-
# 匹配指定字符,前面不能是数字或 l 或 L 开头
|
981
|
-
pattern2 = r'(?<![\dlL])(\d{2}_\d{2})'
|
982
|
-
df['用户年龄'] = df.apply(
|
983
|
-
lambda x:
|
984
|
-
''.join(re.findall(pattern1, x['人群名字'].upper()))
|
985
|
-
if re.findall(pattern1, x['人群名字']) and str(x['用户年龄']) == 'nan'
|
986
|
-
else ''.join(re.findall(pattern2, x['人群名字'].upper()))
|
987
|
-
if re.findall(pattern2, x['人群名字']) and str(x['用户年龄']) == 'nan'
|
988
|
-
else ''.join(re.findall(r'(\d{2}-\d{2})岁', x['人群名字'].upper()))
|
989
|
-
if re.findall(r'(\d{2}-\d{2})岁', x['人群名字']) and str(x['用户年龄']) == 'nan'
|
990
|
-
else x['用户年龄'], axis=1)
|
991
|
-
df['用户年龄'] = df['用户年龄'].apply(
|
992
|
-
lambda x: f'{x[:2]}~{x[2:4]}' if str(x).isdigit()
|
993
|
-
else str(x).replace('_', '~') if '_' in str(x)
|
994
|
-
else str(x).replace('-', '~') if '-' in str(x)
|
995
|
-
else x
|
996
|
-
)
|
997
|
-
# 年龄层不能是 0 开头
|
998
|
-
df['用户年龄'] = np.where(df['用户年龄'].astype(str).str.startswith('0'), '', df['用户年龄'])
|
999
|
-
df['用户年龄'] = df['用户年龄'].apply(
|
1000
|
-
lambda x:
|
1001
|
-
re.sub(f'~50', '~49' ,str(x)) if '~50' in str(x) else
|
1002
|
-
re.sub(f'~40', '~39', str(x)) if '~40' in str(x) else
|
1003
|
-
re.sub(f'~30', '~29' ,str(x)) if '~30' in str(x) else
|
1004
|
-
re.sub(r'\d{4}~', '', str(x)) if str(x) != 'nan' else
|
1005
|
-
x
|
1006
|
-
)
|
1007
|
-
# 下面是添加人群 AIPL 分类
|
1008
|
-
dir_file = f'\\\\192.168.1.198\\时尚事业部\\01.运营部\\0-电商周报-每周五更新\\分类配置文件.xlsx'
|
1009
|
-
dir_file2 = '/Volumes/时尚事业部/01.运营部/0-电商周报-每周五更新/分类配置文件.xlsx'
|
1010
|
-
if platform.system() == 'Windows':
|
1011
|
-
dir_file3 = 'C:\\同步空间\\BaiduSyncdisk\\原始文件3\\分类配置文件.xlsx'
|
1012
|
-
else:
|
1013
|
-
dir_file3 = '/Users/xigua/数据中心/原始文件3/分类配置文件.xlsx'
|
1014
|
-
if not os.path.isfile(dir_file):
|
1015
|
-
dir_file = dir_file2
|
1016
|
-
if not os.path.isfile(dir_file):
|
1017
|
-
dir_file = dir_file3
|
1018
|
-
if os.path.isfile(dir_file):
|
1019
|
-
df_fl = pd.read_excel(dir_file, sheet_name='人群分类', header=0)
|
1020
|
-
df_fl = df_fl[['人群名字', '人群分类']]
|
1021
|
-
# 合并并获取分类信息
|
1022
|
-
df = pd.merge(df, df_fl, left_on=['人群名字'], right_on=['人群名字'], how='left')
|
1023
|
-
df['人群分类'].fillna('', inplace=True)
|
1024
|
-
if '人群分类' in df.columns.tolist():
|
1025
|
-
# 这行决定了,从文件中读取的分类信息优先级高于内部函数的分类规则
|
1026
|
-
# 这个 lambda 适配人群名字中带有特定标识的分类,强匹配,自定义命名
|
1027
|
-
df['人群分类'] = df.apply(
|
1028
|
-
lambda x: self.set_crowd(keyword=str(x['人群名字']), as_file=False) if x['人群分类'] == ''
|
1029
|
-
else x['人群分类'], axis=1
|
1030
|
-
)
|
1031
|
-
# 这个 lambda 适配人群名字中聚类的特征字符,弱匹配
|
1032
|
-
df['人群分类'] = df.apply(
|
1033
|
-
lambda x: self.set_crowd2(keyword=str(x['人群名字']), as_file=False) if x['人群分类'] == ''
|
1034
|
-
else x['人群分类'], axis=1
|
1035
|
-
)
|
1036
|
-
else:
|
1037
|
-
df['人群分类'] = df['人群名字'].apply(lambda x: self.set_crowd(keyword=str(x), as_file=False))
|
1038
|
-
df['人群分类'] = df.apply(
|
1039
|
-
lambda x: self.set_crowd2(keyword=str(x['人群名字']), as_file=False) if x['人群分类'] == ''
|
1040
|
-
else x['人群分类'], axis=1
|
1041
|
-
)
|
1042
|
-
df['人群分类'] = df['人群分类'].apply(lambda x: str(x).upper() if x else x)
|
1043
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1044
|
-
df.fillna(0, inplace=True)
|
1045
|
-
return df, {
|
1046
|
-
'db_name': db_name,
|
1047
|
-
'table_name': table_name,
|
1048
|
-
'set_typ': set_typ,
|
1049
|
-
'primary_keys': [], # 创建唯一主键
|
1050
|
-
'check_duplicate': False, # 检查重复数据
|
1051
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1052
|
-
'update_on_duplicate': True, # 更新旧数据
|
1053
|
-
'allow_null': False, # 允许插入空值
|
1054
|
-
'partition_by': None, # 分表方式
|
1055
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1056
|
-
'indexes': [], # 普通索引列
|
1057
|
-
'transaction_mode': 'batch', # 事务模式
|
1058
|
-
'unique_keys': [['日期', '推广渠道', '店铺名称', '营销场景', '商品id', '人群名字']], # 唯一约束列表
|
1059
|
-
}
|
1060
|
-
|
1061
|
-
@error_handler.log_on_exception(logger=logger)
|
1062
|
-
@upload_data_decorator()
|
1063
|
-
def tg_gjc(self, db_name='聚合数据', table_name='天猫_关键词报表', is_maximize=True):
|
1064
|
-
start_date, end_date = self.months_data(num=self.months)
|
1065
|
-
projection = {
|
1066
|
-
'日期': 1,
|
1067
|
-
'场景名字': 1,
|
1068
|
-
'宝贝id': 1,
|
1069
|
-
'词类型': 1,
|
1070
|
-
'词名字_词包名字': 1,
|
1071
|
-
'花费': 1,
|
1072
|
-
'展现量': 1,
|
1073
|
-
'点击量': 1,
|
1074
|
-
'总购物车数': 1,
|
1075
|
-
'总成交笔数': 1,
|
1076
|
-
'总成交金额': 1,
|
1077
|
-
'直接成交笔数': 1,
|
1078
|
-
'直接成交金额': 1,
|
1079
|
-
'店铺名称': 1,
|
1080
|
-
}
|
1081
|
-
__res = []
|
1082
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
1083
|
-
df = self.download_manager.data_to_df(
|
1084
|
-
db_name='推广数据2',
|
1085
|
-
table_name=f'关键词报表_{year}',
|
1086
|
-
start_date=start_date,
|
1087
|
-
end_date=end_date,
|
1088
|
-
projection=projection,
|
1089
|
-
)
|
1090
|
-
__res.append(df)
|
1091
|
-
df = pd.concat(__res, ignore_index=True)
|
1092
|
-
df.rename(columns={
|
1093
|
-
'场景名字': '营销场景',
|
1094
|
-
'宝贝id': '商品id',
|
1095
|
-
'总购物车数': '加购量',
|
1096
|
-
'总成交笔数': '成交笔数',
|
1097
|
-
'总成交金额': '成交金额'
|
1098
|
-
}, inplace=True)
|
1099
|
-
df.fillna(0, inplace=True)
|
1100
|
-
df = df.astype({
|
1101
|
-
'商品id': str,
|
1102
|
-
'花费': 'float64',
|
1103
|
-
'展现量': 'int64',
|
1104
|
-
'点击量': 'int64',
|
1105
|
-
'加购量': 'int64',
|
1106
|
-
'成交笔数': 'int64',
|
1107
|
-
'成交金额': 'float64',
|
1108
|
-
'直接成交笔数': 'int64',
|
1109
|
-
'直接成交金额': 'float64',
|
1110
|
-
}, errors='raise')
|
1111
|
-
if is_maximize:
|
1112
|
-
df = df.groupby(
|
1113
|
-
['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '点击量'],
|
1114
|
-
as_index=False).agg(
|
1115
|
-
**{
|
1116
|
-
'展现量': ('展现量', np.max),
|
1117
|
-
'加购量': ('加购量', np.max),
|
1118
|
-
'成交笔数': ('成交笔数', np.max),
|
1119
|
-
'成交金额': ('成交金额', np.max),
|
1120
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
1121
|
-
'直接成交金额': ('直接成交金额', np.max)
|
1122
|
-
}
|
1123
|
-
)
|
1124
|
-
else:
|
1125
|
-
df = df.groupby(
|
1126
|
-
['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '点击量'],
|
1127
|
-
as_index=False).agg(
|
1128
|
-
**{
|
1129
|
-
'展现量': ('展现量', np.min),
|
1130
|
-
'加购量': ('加购量', np.min),
|
1131
|
-
'成交笔数': ('成交笔数', np.min),
|
1132
|
-
'成交金额': ('成交金额', np.min),
|
1133
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
1134
|
-
'直接成交金额': ('直接成交金额', np.max)
|
1135
|
-
}
|
1136
|
-
)
|
1137
|
-
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
1138
|
-
df['是否品牌词'] = df['词名字_词包名字'].str.contains('万里马|wanlima', regex=True)
|
1139
|
-
df['是否品牌词'] = df['是否品牌词'].apply(lambda x: '品牌词' if x else '-')
|
1140
|
-
dir_file = f'\\\\192.168.1.198\\时尚事业部\\01.运营部\\0-电商周报-每周五更新\\分类配置文件.xlsx'
|
1141
|
-
dir_file2 = '/Volumes/时尚事业部/01.运营部/0-电商周报-每周五更新/分类配置文件.xlsx'
|
1142
|
-
if not os.path.isfile(dir_file):
|
1143
|
-
dir_file = dir_file2
|
1144
|
-
if os.path.isfile(dir_file):
|
1145
|
-
df_fl = pd.read_excel(dir_file, sheet_name='关键词分类', header=0)
|
1146
|
-
df_fl = df_fl[['关键词', '词分类']]
|
1147
|
-
# 合并并获取词分类信息
|
1148
|
-
df = pd.merge(df, df_fl, left_on=['词名字_词包名字'], right_on=['关键词'], how='left')
|
1149
|
-
df.pop('关键词')
|
1150
|
-
df['词分类'].fillna('', inplace=True)
|
1151
|
-
if '词分类' in df.columns.tolist():
|
1152
|
-
# 这行决定了,从文件中读取的词分类信息优先级高于 ret_keyword 函数的词分类
|
1153
|
-
df['词分类'] = df.apply(
|
1154
|
-
lambda x: self.ret_keyword(keyword=str(x['词名字_词包名字']), as_file=False) if x['词分类'] == ''
|
1155
|
-
else x['词分类'], axis=1
|
1156
|
-
)
|
1157
|
-
else:
|
1158
|
-
df['词分类'] = df['词名字_词包名字'].apply(lambda x: self.ret_keyword(keyword=str(x), as_file=False))
|
1159
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1160
|
-
return df, {
|
1161
|
-
'db_name': db_name,
|
1162
|
-
'table_name': table_name,
|
1163
|
-
'set_typ': set_typ,
|
1164
|
-
'primary_keys': [], # 创建唯一主键
|
1165
|
-
'check_duplicate': False, # 检查重复数据
|
1166
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1167
|
-
'update_on_duplicate': True, # 更新旧数据
|
1168
|
-
'allow_null': False, # 允许插入空值
|
1169
|
-
'partition_by': None, # 分表方式
|
1170
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1171
|
-
'indexes': [], # 普通索引列
|
1172
|
-
'transaction_mode': 'batch', # 事务模式
|
1173
|
-
'unique_keys': [['日期', '推广渠道', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字']], # 唯一约束列表
|
1174
|
-
}
|
1175
|
-
|
1176
|
-
def tg_cjzb_qzt(self, projection=None, is_maximize=True):
|
1177
|
-
start_date, end_date = self.months_data(num=self.months)
|
1178
|
-
if not projection:
|
1179
|
-
projection = {
|
1180
|
-
'日期': 1,
|
1181
|
-
'场景名字': 1,
|
1182
|
-
'计划id': 1,
|
1183
|
-
'全站花费': 1,
|
1184
|
-
'全站观看次数': 1,
|
1185
|
-
'全站宝贝点击量': 1,
|
1186
|
-
'全站成交金额': 1,
|
1187
|
-
'全站成交笔数': 1,
|
1188
|
-
'店铺名称': 1,
|
1189
|
-
}
|
1190
|
-
__res = []
|
1191
|
-
for year in range(2025, datetime.datetime.today().year + 1):
|
1192
|
-
df = self.download_manager.data_to_df(
|
1193
|
-
db_name='推广数据2',
|
1194
|
-
table_name=f'超级直播_全站推广报表_{year}',
|
1195
|
-
start_date=start_date,
|
1196
|
-
end_date=end_date,
|
1197
|
-
projection=projection,
|
1198
|
-
)
|
1199
|
-
__res.append(df)
|
1200
|
-
df = pd.concat(__res, ignore_index=True)
|
1201
|
-
if len(df) == 0:
|
1202
|
-
return pd.DataFrame()
|
1203
|
-
return df
|
1204
|
-
|
1205
|
-
@error_handler.log_on_exception(logger=logger)
|
1206
|
-
@upload_data_decorator()
|
1207
|
-
def tg_cjzb(self, db_name='聚合数据', table_name='天猫_超级直播', is_maximize=True):
|
1208
|
-
start_date, end_date = self.months_data(num=self.months)
|
1209
|
-
projection = {
|
1210
|
-
'日期': 1,
|
1211
|
-
'场景名字': 1,
|
1212
|
-
'人群名字': 1,
|
1213
|
-
'计划名字': 1,
|
1214
|
-
'花费': 1,
|
1215
|
-
'展现量': 1,
|
1216
|
-
'进店量': 1,
|
1217
|
-
'粉丝关注量': 1,
|
1218
|
-
'观看次数': 1,
|
1219
|
-
'总购物车数': 1,
|
1220
|
-
'总成交笔数': 1,
|
1221
|
-
'总成交金额': 1,
|
1222
|
-
'直接成交笔数': 1,
|
1223
|
-
'直接成交金额': 1,
|
1224
|
-
'店铺名称': 1,
|
1225
|
-
}
|
1226
|
-
__res = []
|
1227
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
1228
|
-
df = self.download_manager.data_to_df(
|
1229
|
-
db_name='推广数据2',
|
1230
|
-
table_name=f'超级直播报表_人群_{year}',
|
1231
|
-
start_date=start_date,
|
1232
|
-
end_date=end_date,
|
1233
|
-
projection=projection,
|
1234
|
-
)
|
1235
|
-
__res.append(df)
|
1236
|
-
df = pd.concat(__res, ignore_index=True)
|
1237
|
-
# 直播全站推广不包含的超级直播报表,所以单独添加 2025-03-07
|
1238
|
-
cjzb_qzt = self.tg_cjzb_qzt(is_maximize=True)
|
1239
|
-
if len(cjzb_qzt) > 0:
|
1240
|
-
# 这里的重命名要注意,因为 tg_cjzb 函数还要重命名一次,注意改为 tg_cjzb 命名前的列名
|
1241
|
-
cjzb_qzt.rename(columns={
|
1242
|
-
'全站花费': '花费',
|
1243
|
-
'全站观看次数': '观看次数',
|
1244
|
-
'全站宝贝点击量': '点击量',
|
1245
|
-
'全站成交金额': '总成交金额',
|
1246
|
-
'全站成交笔数': '总成交笔数'
|
1247
|
-
}, inplace=True)
|
1248
|
-
for col in df.columns.tolist():
|
1249
|
-
if col not in cjzb_qzt.columns.tolist():
|
1250
|
-
cjzb_qzt[col] = 0
|
1251
|
-
df = pd.concat([df, cjzb_qzt], ignore_index=True)
|
1252
|
-
df.rename(columns={
|
1253
|
-
'观看次数': '观看次数',
|
1254
|
-
'总购物车数': '加购量',
|
1255
|
-
'总成交笔数': '成交笔数',
|
1256
|
-
'总成交金额': '成交金额',
|
1257
|
-
'场景名字': '营销场景',
|
1258
|
-
}, inplace=True)
|
1259
|
-
df['营销场景'] = '超级直播'
|
1260
|
-
df.fillna(0, inplace=True)
|
1261
|
-
df = df.astype({
|
1262
|
-
'花费': 'float64',
|
1263
|
-
# '点击量': 'int64',
|
1264
|
-
'加购量': 'int64',
|
1265
|
-
'成交笔数': 'int64',
|
1266
|
-
'成交金额': 'float64',
|
1267
|
-
'进店量': 'int64',
|
1268
|
-
'粉丝关注量': 'int64',
|
1269
|
-
'观看次数': 'int64',
|
1270
|
-
}, errors='raise')
|
1271
|
-
df = df[df['花费'] > 0]
|
1272
|
-
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore') # 转换日期列
|
1273
|
-
if is_maximize:
|
1274
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数'],
|
1275
|
-
as_index=False).agg(
|
1276
|
-
**{
|
1277
|
-
'展现量': ('展现量', np.max),
|
1278
|
-
'进店量': ('进店量', np.max),
|
1279
|
-
'粉丝关注量': ('粉丝关注量', np.max),
|
1280
|
-
'加购量': ('加购量', np.max),
|
1281
|
-
'成交笔数': ('成交笔数', np.max),
|
1282
|
-
'成交金额': ('成交金额', np.max),
|
1283
|
-
'直接成交笔数': ('直接成交笔数', np.max),
|
1284
|
-
'直接成交金额': ('直接成交金额', np.max),
|
1285
|
-
}
|
1286
|
-
)
|
1287
|
-
else:
|
1288
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数'],
|
1289
|
-
as_index=False).agg(
|
1290
|
-
**{
|
1291
|
-
'展现量': ('展现量', np.min),
|
1292
|
-
'进店量': ('进店量', np.min),
|
1293
|
-
'粉丝关注量': ('粉丝关注量', np.min),
|
1294
|
-
'加购量': ('加购量', np.min),
|
1295
|
-
'成交笔数': ('成交笔数', np.min),
|
1296
|
-
'成交金额': ('成交金额', np.min),
|
1297
|
-
'直接成交笔数': ('直接成交笔数', np.min),
|
1298
|
-
'直接成交金额': ('直接成交金额', np.min),
|
1299
|
-
}
|
1300
|
-
)
|
1301
|
-
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
1302
|
-
self.pf_datas.append(
|
1303
|
-
{
|
1304
|
-
'集合名称': table_name,
|
1305
|
-
'数据主体': df[['日期', '店铺名称', '推广渠道', '营销场景', '花费', '展现量', '观看次数', '加购量', '成交笔数', '成交金额', '直接成交笔数', '直接成交金额']]
|
1306
|
-
},
|
1307
|
-
) # 制作其他聚合表
|
1308
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1309
|
-
return df, {
|
1310
|
-
'db_name': db_name,
|
1311
|
-
'table_name': table_name,
|
1312
|
-
'set_typ': set_typ,
|
1313
|
-
'primary_keys': [], # 创建唯一主键
|
1314
|
-
'check_duplicate': False, # 检查重复数据
|
1315
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1316
|
-
'update_on_duplicate': True, # 更新旧数据
|
1317
|
-
'allow_null': False, # 允许插入空值
|
1318
|
-
'partition_by': None, # 分表方式
|
1319
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1320
|
-
'indexes': [], # 普通索引列
|
1321
|
-
'transaction_mode': 'batch', # 事务模式
|
1322
|
-
'unique_keys': [['日期', '推广渠道', '店铺名称', '营销场景', '人群名字', '计划名字']], # 唯一约束列表
|
1323
|
-
}
|
1324
|
-
|
1325
|
-
@error_handler.log_on_exception(logger=logger)
|
1326
|
-
def pxb_zh(self, db_name='聚合数据', table_name='天猫_品销宝账户报表', is_maximize=True):
|
1327
|
-
start_date, end_date = self.months_data(num=self.months)
|
1328
|
-
projection = {
|
1329
|
-
'日期': 1,
|
1330
|
-
'报表类型': 1,
|
1331
|
-
'搜索量': 1,
|
1332
|
-
'搜索访客数': 1,
|
1333
|
-
'展现量': 1,
|
1334
|
-
# '自然流量增量曝光': 1,
|
1335
|
-
'消耗': 1,
|
1336
|
-
'点击量': 1,
|
1337
|
-
'宝贝加购数': 1,
|
1338
|
-
'成交笔数': 1,
|
1339
|
-
'成交金额': 1,
|
1340
|
-
# '成交访客数': 1
|
1341
|
-
'店铺名称': 1,
|
1342
|
-
}
|
1343
|
-
__res = []
|
1344
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
1345
|
-
df = self.download_manager.data_to_df(
|
1346
|
-
db_name='推广数据2',
|
1347
|
-
table_name=f'品销宝_{year}',
|
1348
|
-
start_date=start_date,
|
1349
|
-
end_date=end_date,
|
1350
|
-
projection=projection,
|
1351
|
-
)
|
1352
|
-
__res.append(df)
|
1353
|
-
df = pd.concat(__res, ignore_index=True)
|
1354
|
-
df = df[df['报表类型'] == '账户']
|
1355
|
-
df.fillna(value=0, inplace=True)
|
1356
|
-
df.rename(columns={
|
1357
|
-
'消耗': '花费',
|
1358
|
-
'宝贝加购数': '加购量',
|
1359
|
-
'搜索量': '品牌搜索量',
|
1360
|
-
'搜索访客数': '品牌搜索人数'
|
1361
|
-
}, inplace=True)
|
1362
|
-
df = df.astype({
|
1363
|
-
'花费': 'float64',
|
1364
|
-
'展现量': 'int64',
|
1365
|
-
'点击量': 'int64',
|
1366
|
-
'加购量': 'int64',
|
1367
|
-
'成交笔数': 'int64',
|
1368
|
-
'成交金额': 'int64',
|
1369
|
-
'品牌搜索量': 'int64',
|
1370
|
-
'品牌搜索人数': 'int64',
|
1371
|
-
}, errors='raise')
|
1372
|
-
if is_maximize:
|
1373
|
-
df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '点击量'], as_index=False).agg(
|
1374
|
-
**{
|
1375
|
-
'展现量': ('展现量', np.max),
|
1376
|
-
'加购量': ('加购量', np.max),
|
1377
|
-
'成交笔数': ('成交笔数', np.max),
|
1378
|
-
'成交金额': ('成交金额', np.max),
|
1379
|
-
'品牌搜索量': ('品牌搜索量', np.max),
|
1380
|
-
'品牌搜索人数': ('品牌搜索人数', np.max),
|
1381
|
-
}
|
1382
|
-
)
|
1383
|
-
else:
|
1384
|
-
df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '点击量'], as_index=False).agg(
|
1385
|
-
**{
|
1386
|
-
'展现量': ('展现量', np.min),
|
1387
|
-
'加购量': ('加购量', np.min),
|
1388
|
-
'成交笔数': ('成交笔数', np.min),
|
1389
|
-
'成交金额': ('成交金额', np.min),
|
1390
|
-
'品牌搜索量': ('品牌搜索量', np.min),
|
1391
|
-
'品牌搜索人数': ('品牌搜索人数', np.min),
|
1392
|
-
}
|
1393
|
-
)
|
1394
|
-
df.insert(loc=1, column='推广渠道', value='品销宝') # df中插入新列
|
1395
|
-
df.insert(loc=2, column='营销场景', value='品销宝') # df中插入新列
|
1396
|
-
self.pf_datas.append(
|
1397
|
-
{
|
1398
|
-
'集合名称': table_name,
|
1399
|
-
'数据主体': df[['日期', '店铺名称', '推广渠道', '营销场景', '花费', '展现量', '点击量', '加购量', '成交笔数', '成交金额']]
|
1400
|
-
},
|
1401
|
-
) # 制作其他聚合表
|
1402
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1403
|
-
logger.info('更新', {'主机': f'{host}:{port}', '库': db_name, '表': table_name})
|
1404
|
-
return df, {
|
1405
|
-
'db_name': db_name,
|
1406
|
-
'table_name': table_name,
|
1407
|
-
'set_typ': set_typ,
|
1408
|
-
'primary_keys': [], # 创建唯一主键
|
1409
|
-
'check_duplicate': False, # 检查重复数据
|
1410
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1411
|
-
'update_on_duplicate': True, # 更新旧数据
|
1412
|
-
'allow_null': False, # 允许插入空值
|
1413
|
-
'partition_by': None, # 分表方式
|
1414
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1415
|
-
'indexes': [], # 普通索引列
|
1416
|
-
'transaction_mode': 'batch', # 事务模式
|
1417
|
-
'unique_keys': [['日期', '推广渠道', '店铺名称', '营销场景', '报表类型', '花费', '展现量']], # 唯一约束列表
|
1418
|
-
}
|
1419
|
-
|
1420
|
-
@error_handler.log_on_exception(logger=logger)
|
1421
|
-
def idbm(self, db_name='聚合数据', table_name='商品id编码表'):
|
1422
|
-
""" 用生意经日数据制作商品 id 和编码对照表 """
|
1423
|
-
projection = {
|
1424
|
-
'日期': 1,
|
1425
|
-
'商品id': 1,
|
1426
|
-
'商家编码': 1,
|
1427
|
-
'一级类目': 1,
|
1428
|
-
'二级类目': 1,
|
1429
|
-
'三级类目': 1,
|
1430
|
-
'更新时间': 1
|
1431
|
-
}
|
1432
|
-
df = self.download_manager.data_to_df(
|
1433
|
-
db_name='属性设置3',
|
1434
|
-
table_name='商品sku属性',
|
1435
|
-
start_date='2024-11-17',
|
1436
|
-
end_date='2049-12-31',
|
1437
|
-
projection=projection,
|
1438
|
-
)
|
1439
|
-
# 仅保留最新日期的数据
|
1440
|
-
idx = df.groupby(['日期', '商品id'])['更新时间'].idxmax()
|
1441
|
-
df = df.loc[idx]
|
1442
|
-
df.rename(columns={'商品id': '宝贝id'}, inplace=True)
|
1443
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1444
|
-
logger.info('更新', {'主机': f'{host}:{port}', '库': db_name, '表': table_name})
|
1445
|
-
return df, {
|
1446
|
-
'db_name': db_name,
|
1447
|
-
'table_name': table_name,
|
1448
|
-
'set_typ': set_typ,
|
1449
|
-
'primary_keys': [], # 创建唯一主键
|
1450
|
-
'check_duplicate': False, # 检查重复数据
|
1451
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1452
|
-
'update_on_duplicate': True, # 更新旧数据
|
1453
|
-
'allow_null': False, # 允许插入空值
|
1454
|
-
'partition_by': None, # 分表方式
|
1455
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1456
|
-
'indexes': [], # 普通索引列
|
1457
|
-
'transaction_mode': 'batch', # 事务模式
|
1458
|
-
'unique_keys': [['宝贝id']], # 唯一约束列表
|
1459
|
-
}
|
1460
|
-
|
1461
|
-
@error_handler.log_on_exception(logger=logger)
|
1462
|
-
@upload_data_decorator()
|
1463
|
-
def sp_picture(self, db_name='聚合数据', table_name='商品id图片对照表'):
|
1464
|
-
""" """
|
1465
|
-
projection = {
|
1466
|
-
'日期': 1,
|
1467
|
-
'商品id': 1,
|
1468
|
-
'白底图': 1,
|
1469
|
-
'商家编码': 1,
|
1470
|
-
'sku_id': 1,
|
1471
|
-
'sku地址': 1,
|
1472
|
-
'更新时间': 1
|
1473
|
-
}
|
1474
|
-
df = self.download_manager.data_to_df(
|
1475
|
-
db_name='属性设置3',
|
1476
|
-
table_name='商品sku属性',
|
1477
|
-
start_date='2024-11-17',
|
1478
|
-
end_date='2049-12-31',
|
1479
|
-
projection=projection,
|
1480
|
-
)
|
1481
|
-
# 仅保留最新日期的数据
|
1482
|
-
idx = df.groupby(['日期', 'sku_id'])['更新时间'].idxmax()
|
1483
|
-
df = df.loc[idx]
|
1484
|
-
df.rename(columns={'白底图': '商品图片'}, inplace=True)
|
1485
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1486
|
-
return df, {
|
1487
|
-
'db_name': db_name,
|
1488
|
-
'table_name': table_name,
|
1489
|
-
'set_typ': set_typ,
|
1490
|
-
'primary_keys': [], # 创建唯一主键
|
1491
|
-
'check_duplicate': False, # 检查重复数据
|
1492
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1493
|
-
'update_on_duplicate': True, # 更新旧数据
|
1494
|
-
'allow_null': False, # 允许插入空值
|
1495
|
-
'partition_by': None, # 分表方式
|
1496
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1497
|
-
'indexes': [], # 普通索引列
|
1498
|
-
'transaction_mode': 'batch', # 事务模式
|
1499
|
-
'unique_keys': [['sku_id']], # 唯一约束列表
|
1500
|
-
}
|
1501
|
-
|
1502
|
-
@upload_data_decorator()
|
1503
|
-
def item_up(self, db_name='聚合数据', table_name='淘宝店铺货品'):
|
1504
|
-
start_date, end_date = self.months_data(num=self.months)
|
1505
|
-
projection = {}
|
1506
|
-
df_set = self.download_manager.data_to_df(
|
1507
|
-
db_name='属性设置3',
|
1508
|
-
table_name=f'货品年份基准',
|
1509
|
-
start_date=start_date,
|
1510
|
-
end_date=end_date,
|
1511
|
-
projection={'商品id':1, '上市年份':1},
|
1512
|
-
)
|
1513
|
-
df = self.download_manager.data_to_df(
|
1514
|
-
db_name='市场数据3',
|
1515
|
-
table_name=f'淘宝店铺数据',
|
1516
|
-
start_date=start_date,
|
1517
|
-
end_date=end_date,
|
1518
|
-
projection=projection,
|
1519
|
-
)
|
1520
|
-
df.pop('data_sku')
|
1521
|
-
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore') # 转换日期列
|
1522
|
-
df_set['商品id'] = df_set['商品id'].astype('int64')
|
1523
|
-
df['商品id'] = df['商品id'].astype('int64')
|
1524
|
-
df_set.sort_values('商品id', ascending=False, ignore_index=True, inplace=True)
|
1525
|
-
|
1526
|
-
# 仅保留最新日期的数据
|
1527
|
-
idx = df.groupby(['商品id'])['更新时间'].idxmax()
|
1528
|
-
df = df.loc[idx]
|
1529
|
-
|
1530
|
-
def check_year(item_id):
|
1531
|
-
for item in df_set.to_dict(orient='records'):
|
1532
|
-
if item_id > item['商品id']:
|
1533
|
-
return item['上市年份']
|
1534
|
-
|
1535
|
-
df['上市年份'] = df['商品id'].apply(lambda x: check_year(x))
|
1536
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1537
|
-
return df, {
|
1538
|
-
'db_name': db_name,
|
1539
|
-
'table_name': table_name,
|
1540
|
-
'set_typ': set_typ,
|
1541
|
-
'primary_keys': [], # 创建唯一主键
|
1542
|
-
'check_duplicate': False, # 检查重复数据
|
1543
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1544
|
-
'update_on_duplicate': True, # 更新旧数据
|
1545
|
-
'allow_null': False, # 允许插入空值
|
1546
|
-
'partition_by': None, # 分表方式
|
1547
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1548
|
-
'indexes': [], # 普通索引列
|
1549
|
-
'transaction_mode': 'batch', # 事务模式
|
1550
|
-
'unique_keys': [['日期', '店铺id', '商品id']], # 唯一约束列表
|
1551
|
-
}
|
1552
|
-
|
1553
|
-
@upload_data_decorator()
|
1554
|
-
def spph(self, db_name='聚合数据', table_name='天猫_商品排行'):
|
1555
|
-
""" """
|
1556
|
-
start_date, end_date = self.months_data(num=self.months)
|
1557
|
-
projection = {}
|
1558
|
-
__res = []
|
1559
|
-
for year in range(2024, datetime.datetime.today().year+1):
|
1560
|
-
df = self.download_manager.data_to_df(
|
1561
|
-
db_name='生意参谋3',
|
1562
|
-
table_name=f'商品排行_{year}',
|
1563
|
-
start_date=start_date,
|
1564
|
-
end_date=end_date,
|
1565
|
-
projection=projection,
|
1566
|
-
)
|
1567
|
-
__res.append(df)
|
1568
|
-
df = pd.concat(__res, ignore_index=True)
|
1569
|
-
|
1570
|
-
projection = {}
|
1571
|
-
df_set = self.download_manager.data_to_df(
|
1572
|
-
db_name='属性设置3',
|
1573
|
-
table_name=f'货品年份基准',
|
1574
|
-
start_date=start_date,
|
1575
|
-
end_date=end_date,
|
1576
|
-
projection=projection,
|
1577
|
-
)
|
1578
|
-
# 保留最新日期的数据
|
1579
|
-
idx = df.groupby(['日期', '店铺名称', '商品id'])['更新时间'].idxmax()
|
1580
|
-
df = df.loc[idx]
|
1581
|
-
|
1582
|
-
df_set['商品id'] = df_set['商品id'].astype('int64')
|
1583
|
-
df_set = df_set[['商品id', '上市年份']]
|
1584
|
-
df['商品id'] = df['商品id'].astype('int64')
|
1585
|
-
df_set.sort_values('商品id', ascending=False, ignore_index=True, inplace=True)
|
1586
|
-
|
1587
|
-
def check_year(item_id):
|
1588
|
-
for item in df_set.to_dict(orient='records'):
|
1589
|
-
if item_id > item['商品id']:
|
1590
|
-
return item['上市年份']
|
1591
|
-
|
1592
|
-
df['上市年份'] = df['商品id'].apply(lambda x: check_year(x))
|
1593
|
-
p = df.pop('上市年份')
|
1594
|
-
df.insert(loc=7, column='上市年月', value=p)
|
1595
|
-
df['上市年份_f'] = df['上市年月'].apply(lambda x: '0' if x == '历史悠久' else re.findall(r'(\d+)年', x)[0])
|
1596
|
-
p = df.pop('上市年份_f')
|
1597
|
-
df.insert(loc=7, column='上市年份_f', value=p)
|
1598
|
-
|
1599
|
-
def check_jijie(string):
|
1600
|
-
pattern = re.findall(r'\d+年(\d+)月', string)
|
1601
|
-
if not pattern:
|
1602
|
-
return '-'
|
1603
|
-
pattern = pattern[0]
|
1604
|
-
if 0 < int(pattern) < 4:
|
1605
|
-
return '春'
|
1606
|
-
elif 4 < int(pattern) < 6:
|
1607
|
-
return '夏'
|
1608
|
-
elif 6 < int(pattern) < 9:
|
1609
|
-
return '秋'
|
1610
|
-
else:
|
1611
|
-
return '冬'
|
1612
|
-
|
1613
|
-
df['上市季节'] = df['上市年月'].apply(lambda x: check_jijie(x))
|
1614
|
-
p = df.pop('上市季节')
|
1615
|
-
df.insert(loc=9, column='上市季节', value=p)
|
1616
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1617
|
-
return df, {
|
1618
|
-
'db_name': db_name,
|
1619
|
-
'table_name': table_name,
|
1620
|
-
'set_typ': set_typ,
|
1621
|
-
'primary_keys': [], # 创建唯一主键
|
1622
|
-
'check_duplicate': False, # 检查重复数据
|
1623
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1624
|
-
'update_on_duplicate': True, # 更新旧数据
|
1625
|
-
'allow_null': False, # 允许插入空值
|
1626
|
-
'partition_by': None, # 分表方式
|
1627
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1628
|
-
'indexes': [], # 普通索引列
|
1629
|
-
'transaction_mode': 'batch', # 事务模式
|
1630
|
-
'unique_keys': [['日期', '店铺名称', '商品id']], # 唯一约束列表
|
1631
|
-
}
|
1632
|
-
|
1633
|
-
# @error_handler.log_on_exception(logger=logger)
|
1634
|
-
@upload_data_decorator()
|
1635
|
-
def dplyd(self, db_name='聚合数据', table_name='店铺流量来源构成'):
|
1636
|
-
""" 新旧版取的字段是一样的 """
|
1637
|
-
start_date, end_date = self.months_data(num=self.months)
|
1638
|
-
projection = {
|
1639
|
-
'日期': 1,
|
1640
|
-
'店铺名称': 1,
|
1641
|
-
'类别': 1,
|
1642
|
-
'来源构成': 1,
|
1643
|
-
'一级来源': 1,
|
1644
|
-
'二级来源': 1,
|
1645
|
-
'三级来源': 1,
|
1646
|
-
'访客数': 1,
|
1647
|
-
'支付金额': 1,
|
1648
|
-
'支付买家数': 1,
|
1649
|
-
'支付转化率': 1,
|
1650
|
-
'加购人数': 1,
|
1651
|
-
'加购件数': 1,
|
1652
|
-
'下单买家数': 1,
|
1653
|
-
'关注店铺人数': 1,
|
1654
|
-
}
|
1655
|
-
__res = []
|
1656
|
-
for year in range(2024, datetime.datetime.today().year+1):
|
1657
|
-
df = self.download_manager.data_to_df(
|
1658
|
-
db_name='生意参谋3',
|
1659
|
-
table_name=f'店铺流量来源构成_{year}',
|
1660
|
-
start_date=start_date,
|
1661
|
-
end_date=end_date,
|
1662
|
-
projection=projection,
|
1663
|
-
)
|
1664
|
-
__res.append(df)
|
1665
|
-
df = pd.concat(__res, ignore_index=True)
|
1666
|
-
df = df.astype({'访客数': 'int64'}, errors='ignore')
|
1667
|
-
df = df[df['访客数'] > 0]
|
1668
|
-
df.drop_duplicates(subset=['日期', '店铺名称', '类别', '来源构成', '一级来源', '二级来源', '三级来源', '访客数'], keep='last', inplace=True, ignore_index=True)
|
1669
|
-
# 包含三级来源名称和预设索引值列
|
1670
|
-
# 截取 从上月1日 至 今天的花费数据, 推广款式按此数据从高到低排序(商品图+排序)
|
1671
|
-
last_month, ii = get_day_of_month(1)
|
1672
|
-
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore') # 转换日期列
|
1673
|
-
df_visitor3 = df[df['日期'] >= pd.to_datetime(last_month)]
|
1674
|
-
df_visitor3 = df_visitor3[(df_visitor3['三级来源'] != '汇总') & (df_visitor3['三级来源'] != '0')]
|
1675
|
-
df_visitor3 = df_visitor3.groupby(['三级来源'], as_index=False).agg({'访客数': 'sum'})
|
1676
|
-
df_visitor3.sort_values('访客数', ascending=False, ignore_index=True, inplace=True)
|
1677
|
-
df_visitor3.reset_index(inplace=True)
|
1678
|
-
df_visitor3['index'] = df_visitor3['index'] + 100
|
1679
|
-
df_visitor3.rename(columns={'index': '三级来源索引'}, inplace=True)
|
1680
|
-
df_visitor3 = df_visitor3[['三级来源', '三级来源索引']]
|
1681
|
-
# 包含二级来源名称和预设索引值列
|
1682
|
-
df_visitor2 = df[df['日期'] >= pd.to_datetime(last_month)]
|
1683
|
-
df_visitor2 = df_visitor2[(df_visitor2['二级来源'] != '汇总') & (df_visitor2['二级来源'] != '0')]
|
1684
|
-
df_visitor2 = df_visitor2.groupby(['二级来源'], as_index=False).agg({'访客数': 'sum'})
|
1685
|
-
df_visitor2.sort_values('访客数', ascending=False, ignore_index=True, inplace=True)
|
1686
|
-
df_visitor2.reset_index(inplace=True)
|
1687
|
-
df_visitor2['index'] = df_visitor2['index'] + 100
|
1688
|
-
df_visitor2.rename(columns={'index': '二级来源索引'}, inplace=True)
|
1689
|
-
df_visitor2 = df_visitor2[['二级来源', '二级来源索引']]
|
1690
|
-
# 包含一级来源名称和预设索引值列
|
1691
|
-
df_visitor1 = df[df['日期'] >= pd.to_datetime(last_month)]
|
1692
|
-
df_visitor1 = df_visitor1[(df_visitor1['一级来源'] != '汇总') & (df_visitor1['一级来源'] != '0')]
|
1693
|
-
df_visitor1 = df_visitor1.groupby(['一级来源'], as_index=False).agg({'访客数': 'sum'})
|
1694
|
-
df_visitor1.sort_values('访客数', ascending=False, ignore_index=True, inplace=True)
|
1695
|
-
df_visitor1.reset_index(inplace=True)
|
1696
|
-
df_visitor1['index'] = df_visitor1['index'] + 100
|
1697
|
-
df_visitor1.rename(columns={'index': '一级来源索引'}, inplace=True)
|
1698
|
-
df_visitor1 = df_visitor1[['一级来源', '一级来源索引']]
|
1699
|
-
|
1700
|
-
df = pd.merge(df, df_visitor1, how='left', left_on='一级来源', right_on='一级来源')
|
1701
|
-
df = pd.merge(df, df_visitor2, how='left', left_on='二级来源', right_on='二级来源')
|
1702
|
-
df = pd.merge(df, df_visitor3, how='left', left_on='三级来源', right_on='三级来源')
|
1703
|
-
|
1704
|
-
for col in ['一级来源索引', '二级来源索引', '三级来源索引']:
|
1705
|
-
df[col] = df[col].apply(lambda x: 1000 if str(x) == 'nan' else x)
|
1706
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1707
|
-
return df, {
|
1708
|
-
'db_name': db_name,
|
1709
|
-
'table_name': table_name,
|
1710
|
-
'set_typ': set_typ,
|
1711
|
-
'primary_keys': [], # 创建唯一主键
|
1712
|
-
'check_duplicate': False, # 检查重复数据
|
1713
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1714
|
-
'update_on_duplicate': True, # 更新旧数据
|
1715
|
-
'allow_null': False, # 允许插入空值
|
1716
|
-
'partition_by': None, # 分表方式
|
1717
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1718
|
-
'indexes': [], # 普通索引列
|
1719
|
-
'transaction_mode': 'batch', # 事务模式
|
1720
|
-
'unique_keys': [['日期', '店铺名称', '类别', '来源构成', '一级来源', '二级来源', '三级来源']], # 唯一约束列表
|
1721
|
-
}
|
1722
|
-
|
1723
|
-
@error_handler.log_on_exception(logger=logger)
|
1724
|
-
@upload_data_decorator()
|
1725
|
-
def sp_cost(self, db_name='聚合数据', table_name='商品成本'):
|
1726
|
-
""" 电商定价 """
|
1727
|
-
data_values = self.download_manager.columns_to_list(
|
1728
|
-
db_name='属性设置3',
|
1729
|
-
table_name='电商定价',
|
1730
|
-
columns_name=['日期', '款号', '年份季节', '吊牌价', '商家平台', '成本价', '天猫页面价', '天猫中促价'],
|
1731
|
-
)
|
1732
|
-
df = pd.DataFrame(data=data_values)
|
1733
|
-
df.sort_values(by=['款号', '日期'], ascending=[False, True], ignore_index=True, inplace=True)
|
1734
|
-
df.drop_duplicates(subset=['款号'], keep='last', inplace=True, ignore_index=True)
|
1735
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1736
|
-
return df, {
|
1737
|
-
'db_name': db_name,
|
1738
|
-
'table_name': table_name,
|
1739
|
-
'set_typ': set_typ,
|
1740
|
-
'primary_keys': [], # 创建唯一主键
|
1741
|
-
'check_duplicate': False, # 检查重复数据
|
1742
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1743
|
-
'update_on_duplicate': True, # 更新旧数据
|
1744
|
-
'allow_null': False, # 允许插入空值
|
1745
|
-
'partition_by': None, # 分表方式
|
1746
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1747
|
-
'indexes': [], # 普通索引列
|
1748
|
-
'transaction_mode': 'batch', # 事务模式
|
1749
|
-
'unique_keys': [['款号']], # 唯一约束列表
|
1750
|
-
}
|
1751
|
-
|
1752
|
-
# @error_handler.log_on_exception(logger=logger)
|
1753
|
-
@upload_data_decorator()
|
1754
|
-
def jdjzt(self, db_name='聚合数据', table_name='京东_京准通'):
|
1755
|
-
start_date, end_date = self.months_data(num=self.months)
|
1756
|
-
projection = {
|
1757
|
-
'日期': 1,
|
1758
|
-
'产品线': 1,
|
1759
|
-
'触发sku_id': 1,
|
1760
|
-
'跟单sku_id': 1,
|
1761
|
-
'花费': 1,
|
1762
|
-
'展现数': 1,
|
1763
|
-
'点击数': 1,
|
1764
|
-
'直接订单行': 1,
|
1765
|
-
'直接订单金额': 1,
|
1766
|
-
'总订单行': 1,
|
1767
|
-
'总订单金额': 1,
|
1768
|
-
'直接加购数': 1,
|
1769
|
-
'总加购数': 1,
|
1770
|
-
'spu_id': 1,
|
1771
|
-
'店铺名称':1,
|
1772
|
-
}
|
1773
|
-
__res = []
|
1774
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
1775
|
-
df = self.download_manager.data_to_df(
|
1776
|
-
db_name='京东数据3',
|
1777
|
-
table_name=f'推广数据_京准通_{year}',
|
1778
|
-
start_date=start_date,
|
1779
|
-
end_date=end_date,
|
1780
|
-
projection=projection,
|
1781
|
-
)
|
1782
|
-
__res.append(df)
|
1783
|
-
# 新增加自营店数据 2025-03-19
|
1784
|
-
for year in range(2025, datetime.datetime.today().year + 1):
|
1785
|
-
df = self.download_manager.data_to_df(
|
1786
|
-
db_name='京东数据3',
|
1787
|
-
table_name=f'推广数据_京准通_自营店_{year}',
|
1788
|
-
start_date=start_date,
|
1789
|
-
end_date=end_date,
|
1790
|
-
projection=projection,
|
1791
|
-
)
|
1792
|
-
__res.append(df)
|
1793
|
-
df = pd.concat(__res, ignore_index=True)
|
1794
|
-
df = df.groupby(
|
1795
|
-
['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', 'spu_id', '花费', '展现数', '点击数'],
|
1796
|
-
as_index=False).agg(
|
1797
|
-
**{
|
1798
|
-
'直接订单行': ('直接订单行', np.max),
|
1799
|
-
'直接订单金额': ('直接订单金额', np.max),
|
1800
|
-
'总订单行': ('总订单行', np.max),
|
1801
|
-
'总订单金额': ('总订单金额', np.max),
|
1802
|
-
'直接加购数': ('直接加购数', np.max),
|
1803
|
-
'总加购数': ('总加购数', np.max),
|
1804
|
-
}
|
1805
|
-
)
|
1806
|
-
df = df[df['花费'] > 0]
|
1807
|
-
projection={
|
1808
|
-
'sku_id': 1,
|
1809
|
-
'spu_id': 1,
|
1810
|
-
}
|
1811
|
-
df_sku = self.download_manager.data_to_df(
|
1812
|
-
db_name='属性设置3',
|
1813
|
-
table_name='京东商品属性',
|
1814
|
-
start_date=start_date,
|
1815
|
-
end_date=end_date,
|
1816
|
-
projection=projection,
|
1817
|
-
)
|
1818
|
-
if 'spu_id' in df.columns:
|
1819
|
-
df = df.drop(columns=['spu_id']) # 删除原有 spu_id,避免冲突
|
1820
|
-
df = pd.merge(df, df_sku, how='left', left_on='跟单sku_id', right_on='sku_id')
|
1821
|
-
df = df.drop(columns=['sku_id']) # 删除 merge 进来的 sku_id
|
1822
|
-
df['spu_id'] = df['spu_id'].fillna(0) # 填充 spu_id 空值
|
1823
|
-
# 调整 spu_id 到第3列
|
1824
|
-
cols = list(df.columns)
|
1825
|
-
cols.insert(3, cols.pop(cols.index('spu_id')))
|
1826
|
-
df = df[cols]
|
1827
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1828
|
-
return df, {
|
1829
|
-
'db_name': db_name,
|
1830
|
-
'table_name': table_name,
|
1831
|
-
'set_typ': set_typ,
|
1832
|
-
'primary_keys': [], # 创建唯一主键
|
1833
|
-
'check_duplicate': False, # 检查重复数据
|
1834
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1835
|
-
'update_on_duplicate': True, # 更新旧数据
|
1836
|
-
'allow_null': False, # 允许插入空值
|
1837
|
-
'partition_by': None, # 分表方式
|
1838
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1839
|
-
'indexes': [], # 普通索引列
|
1840
|
-
'transaction_mode': 'batch', # 事务模式
|
1841
|
-
'unique_keys': [['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', '花费']], # 唯一约束列表
|
1842
|
-
}
|
1843
|
-
|
1844
|
-
@error_handler.log_on_exception(logger=logger)
|
1845
|
-
@upload_data_decorator()
|
1846
|
-
def jdqzyx(self, db_name='聚合数据', table_name='京东_京准通_全站营销'):
|
1847
|
-
start_date, end_date = self.months_data(num=self.months)
|
1848
|
-
projection = {
|
1849
|
-
'日期': 1,
|
1850
|
-
'店铺名称': 1,
|
1851
|
-
'产品线': 1,
|
1852
|
-
'花费': 1,
|
1853
|
-
'全站投产比': 1,
|
1854
|
-
'全站交易额': 1,
|
1855
|
-
'全站订单行': 1,
|
1856
|
-
'全站订单成本': 1,
|
1857
|
-
'全站费比': 1,
|
1858
|
-
'核心位置展现量': 1,
|
1859
|
-
'核心位置点击量': 1,
|
1860
|
-
}
|
1861
|
-
df = self.download_manager.data_to_df(
|
1862
|
-
db_name='京东数据3',
|
1863
|
-
table_name='推广数据_全站营销', # 暂缺
|
1864
|
-
start_date=start_date,
|
1865
|
-
end_date=end_date,
|
1866
|
-
projection=projection,
|
1867
|
-
)
|
1868
|
-
if len(df) == 0:
|
1869
|
-
return None, None
|
1870
|
-
df = df.groupby(['日期', '店铺名称', '产品线', '花费'], as_index=False).agg(
|
1871
|
-
**{
|
1872
|
-
'全站投产比': ('全站投产比', np.max),
|
1873
|
-
'全站交易额': ('全站交易额', np.max),
|
1874
|
-
'全站订单行': ('全站订单行', np.max),
|
1875
|
-
'全站订单成本': ('全站订单成本', np.max),
|
1876
|
-
'全站费比': ('全站费比', np.max),
|
1877
|
-
'核心位置展现量': ('核心位置展现量', np.max),
|
1878
|
-
'核心位置点击量': ('核心位置点击量', np.max),
|
1879
|
-
}
|
1880
|
-
)
|
1881
|
-
df = df[df['花费'] > 0]
|
1882
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1883
|
-
return df, {
|
1884
|
-
'db_name': db_name,
|
1885
|
-
'table_name': table_name,
|
1886
|
-
'set_typ': set_typ,
|
1887
|
-
'primary_keys': [], # 创建唯一主键
|
1888
|
-
'check_duplicate': False, # 检查重复数据
|
1889
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1890
|
-
'update_on_duplicate': True, # 更新旧数据
|
1891
|
-
'allow_null': False, # 允许插入空值
|
1892
|
-
'partition_by': None, # 分表方式
|
1893
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1894
|
-
'indexes': [], # 普通索引列
|
1895
|
-
'transaction_mode': 'batch', # 事务模式
|
1896
|
-
'unique_keys': [['日期', '店铺名称', '产品线']], # 唯一约束列表
|
1897
|
-
}
|
1898
|
-
|
1899
|
-
@error_handler.log_on_exception(logger=logger)
|
1900
|
-
@upload_data_decorator()
|
1901
|
-
def jd_gjc(self, db_name='聚合数据', table_name='京东_关键词报表'):
|
1902
|
-
start_date, end_date = self.months_data(num=self.months)
|
1903
|
-
projection = {
|
1904
|
-
'日期': 1,
|
1905
|
-
'产品线': 1,
|
1906
|
-
'计划类型': 1,
|
1907
|
-
'计划id': 1,
|
1908
|
-
'推广计划': 1,
|
1909
|
-
'搜索词': 1,
|
1910
|
-
'关键词': 1,
|
1911
|
-
'关键词购买类型': 1,
|
1912
|
-
'广告定向类型': 1,
|
1913
|
-
'花费': 1,
|
1914
|
-
'展现数': 1,
|
1915
|
-
'点击数': 1,
|
1916
|
-
'直接订单行': 1,
|
1917
|
-
'直接订单金额': 1,
|
1918
|
-
'总订单行': 1,
|
1919
|
-
'总订单金额': 1,
|
1920
|
-
'总加购数': 1,
|
1921
|
-
'领券数': 1,
|
1922
|
-
'商品关注数': 1,
|
1923
|
-
'店铺关注数': 1,
|
1924
|
-
}
|
1925
|
-
__res = []
|
1926
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
1927
|
-
df = self.download_manager.data_to_df(
|
1928
|
-
db_name='京东数据3',
|
1929
|
-
table_name=f'推广数据_关键词报表_{year}',
|
1930
|
-
start_date=start_date,
|
1931
|
-
end_date=end_date,
|
1932
|
-
projection=projection,
|
1933
|
-
)
|
1934
|
-
__res.append(df)
|
1935
|
-
df = pd.concat(__res, ignore_index=True)
|
1936
|
-
df_lin = df[['计划id', '推广计划']]
|
1937
|
-
df_lin.drop_duplicates(subset=['计划id'], keep='last', inplace=True, ignore_index=True)
|
1938
|
-
df = df.groupby(
|
1939
|
-
['日期', '产品线', '计划类型', '计划id', '搜索词', '关键词', '关键词购买类型', '广告定向类型', '展现数',
|
1940
|
-
'点击数', '花费'],
|
1941
|
-
as_index=False).agg(
|
1942
|
-
**{
|
1943
|
-
'直接订单行': ('直接订单行', np.max),
|
1944
|
-
'直接订单金额': ('直接订单金额', np.max),
|
1945
|
-
'总订单行': ('总订单行', np.max),
|
1946
|
-
'总订单金额': ('总订单金额', np.max),
|
1947
|
-
'总加购数': ('总加购数', np.max),
|
1948
|
-
'领券数': ('领券数', np.max),
|
1949
|
-
'商品关注数': ('商品关注数', np.max),
|
1950
|
-
'店铺关注数': ('店铺关注数', np.max)
|
1951
|
-
}
|
1952
|
-
)
|
1953
|
-
df = pd.merge(df, df_lin, how='left', left_on='计划id', right_on='计划id')
|
1954
|
-
df['k_是否品牌词'] = df['关键词'].str.contains('万里马|wanlima', regex=True)
|
1955
|
-
df['k_是否品牌词'] = df['k_是否品牌词'].apply(lambda x: '品牌词' if x else '-')
|
1956
|
-
df['s_是否品牌词'] = df['搜索词'].str.contains('万里马|wanlima', regex=True)
|
1957
|
-
df['s_是否品牌词'] = df['s_是否品牌词'].apply(lambda x: '品牌词' if x else '-')
|
1958
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
1959
|
-
return df, {
|
1960
|
-
'db_name': db_name,
|
1961
|
-
'table_name': table_name,
|
1962
|
-
'set_typ': set_typ,
|
1963
|
-
'primary_keys': [], # 创建唯一主键
|
1964
|
-
'check_duplicate': False, # 检查重复数据
|
1965
|
-
'duplicate_columns': [], # 指定排重的组合键
|
1966
|
-
'update_on_duplicate': True, # 更新旧数据
|
1967
|
-
'allow_null': False, # 允许插入空值
|
1968
|
-
'partition_by': None, # 分表方式
|
1969
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
1970
|
-
'indexes': [], # 普通索引列
|
1971
|
-
'transaction_mode': 'batch', # 事务模式
|
1972
|
-
'unique_keys': [['日期', '产品线', '计划id', '搜索词', '关键词']], # 唯一约束列表
|
1973
|
-
}
|
1974
|
-
|
1975
|
-
@error_handler.log_on_exception(logger=logger)
|
1976
|
-
@upload_data_decorator()
|
1977
|
-
def sku_sales(self, db_name='聚合数据', table_name='京东_sku_商品明细'):
|
1978
|
-
start_date, end_date = self.months_data(num=self.months)
|
1979
|
-
projection = {
|
1980
|
-
'日期': 1,
|
1981
|
-
'店铺名称': 1,
|
1982
|
-
'商品id': 1,
|
1983
|
-
'货号': 1,
|
1984
|
-
'成交单量': 1,
|
1985
|
-
'成交金额': 1,
|
1986
|
-
'访客数': 1,
|
1987
|
-
'成交客户数': 1,
|
1988
|
-
'加购商品件数': 1,
|
1989
|
-
'加购人数': 1,
|
1990
|
-
'更新时间': 1,
|
1991
|
-
}
|
1992
|
-
__res = []
|
1993
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
1994
|
-
df = self.download_manager.data_to_df(
|
1995
|
-
db_name='京东数据3',
|
1996
|
-
table_name=f'京东商智_sku_商品明细_{year}',
|
1997
|
-
start_date=start_date,
|
1998
|
-
end_date=end_date,
|
1999
|
-
projection=projection,
|
2000
|
-
)
|
2001
|
-
__res.append(df)
|
2002
|
-
df = pd.concat(__res, ignore_index=True)
|
2003
|
-
df = df[df['商品id'] != '合计']
|
2004
|
-
# 仅保留最新日期的数据
|
2005
|
-
idx = df.groupby(['日期', '店铺名称', '商品id', '货号', '访客数', '成交客户数', '加购商品件数', '加购人数'])['更新时间'].idxmax()
|
2006
|
-
df = df.loc[idx]
|
2007
|
-
df = df[['日期', '店铺名称', '商品id', '货号', '访客数', '成交客户数', '加购商品件数', '加购人数', '成交单量', '成交金额']]
|
2008
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2009
|
-
return df, {
|
2010
|
-
'db_name': db_name,
|
2011
|
-
'table_name': table_name,
|
2012
|
-
'set_typ': set_typ,
|
2013
|
-
'primary_keys': [], # 创建唯一主键
|
2014
|
-
'check_duplicate': False, # 检查重复数据
|
2015
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2016
|
-
'update_on_duplicate': True, # 更新旧数据
|
2017
|
-
'allow_null': False, # 允许插入空值
|
2018
|
-
'partition_by': None, # 分表方式
|
2019
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2020
|
-
'indexes': [], # 普通索引列
|
2021
|
-
'transaction_mode': 'batch', # 事务模式
|
2022
|
-
'unique_keys': [['日期', '店铺名称', '商品id']], # 唯一约束列表
|
2023
|
-
}
|
2024
|
-
|
2025
|
-
@error_handler.log_on_exception(logger=logger)
|
2026
|
-
@upload_data_decorator()
|
2027
|
-
def spu_sales(self, db_name='聚合数据', table_name='京东_spu_商品明细'):
|
2028
|
-
start_date, end_date = self.months_data(num=self.months)
|
2029
|
-
projection = {
|
2030
|
-
'日期': 1,
|
2031
|
-
'店铺名称': 1,
|
2032
|
-
'商品id': 1,
|
2033
|
-
'货号': 1,
|
2034
|
-
'成交单量': 1,
|
2035
|
-
'成交金额': 1,
|
2036
|
-
'访客数': 1,
|
2037
|
-
'成交客户数': 1,
|
2038
|
-
'加购商品件数': 1,
|
2039
|
-
'加购人数': 1,
|
2040
|
-
'更新时间': 1,
|
2041
|
-
}
|
2042
|
-
__res = []
|
2043
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2044
|
-
df = self.download_manager.data_to_df(
|
2045
|
-
db_name='京东数据3',
|
2046
|
-
table_name=f'京东商智_spu_商品明细_{year}',
|
2047
|
-
start_date=start_date,
|
2048
|
-
end_date=end_date,
|
2049
|
-
projection=projection,
|
2050
|
-
)
|
2051
|
-
__res.append(df)
|
2052
|
-
df = pd.concat(__res, ignore_index=True)
|
2053
|
-
df = df[df['商品id'] != '合计']
|
2054
|
-
# 仅保留最新日期的数据
|
2055
|
-
idx = df.groupby(['日期', '店铺名称', '商品id', '货号', '访客数', '成交客户数', '加购商品件数', '加购人数'])['更新时间'].idxmax()
|
2056
|
-
df = df.loc[idx]
|
2057
|
-
df = df[['日期', '店铺名称', '商品id', '货号', '访客数', '成交客户数', '加购商品件数', '加购人数', '成交单量', '成交金额']]
|
2058
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2059
|
-
return df, {
|
2060
|
-
'db_name': db_name,
|
2061
|
-
'table_name': table_name,
|
2062
|
-
'set_typ': set_typ,
|
2063
|
-
'primary_keys': [], # 创建唯一主键
|
2064
|
-
'check_duplicate': False, # 检查重复数据
|
2065
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2066
|
-
'update_on_duplicate': True, # 更新旧数据
|
2067
|
-
'allow_null': False, # 允许插入空值
|
2068
|
-
'partition_by': None, # 分表方式
|
2069
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2070
|
-
'indexes': [], # 普通索引列
|
2071
|
-
'transaction_mode': 'batch', # 事务模式
|
2072
|
-
'unique_keys': [['日期', '店铺名称', '商品id']], # 唯一约束列表
|
2073
|
-
}
|
2074
|
-
|
2075
|
-
@staticmethod
|
2076
|
-
def months_data(num=0, end_date=None):
|
2077
|
-
""" 读取近 num 个月的数据, 0 表示读取当月的数据 """
|
2078
|
-
if not end_date:
|
2079
|
-
end_date = datetime.datetime.now()
|
2080
|
-
start_date = end_date - relativedelta(months=num) # n 月以前的今天
|
2081
|
-
start_date = f'{start_date.year}-{start_date.month}-01' # 替换为 n 月以前的第一天
|
2082
|
-
return pd.to_datetime(start_date), pd.to_datetime(end_date)
|
2083
|
-
|
2084
|
-
@error_handler.log_on_exception(logger=logger)
|
2085
|
-
@upload_data_decorator()
|
2086
|
-
def se_search(self, db_name='聚合数据', table_name='天猫店铺来源_手淘搜索'):
|
2087
|
-
start_date, end_date = self.months_data(num=self.months)
|
2088
|
-
projection = {
|
2089
|
-
'日期': 1,
|
2090
|
-
'店铺名称': 1,
|
2091
|
-
'搜索词': 1,
|
2092
|
-
'词类型': 1,
|
2093
|
-
'访客数': 1,
|
2094
|
-
'加购人数': 1,
|
2095
|
-
'商品收藏人数': 1,
|
2096
|
-
'支付转化率': 1,
|
2097
|
-
'支付买家数': 1,
|
2098
|
-
'支付金额': 1,
|
2099
|
-
'新访客': 1,
|
2100
|
-
'客单价': 1,
|
2101
|
-
'uv价值': 1,
|
2102
|
-
'更新时间': 1,
|
2103
|
-
}
|
2104
|
-
__res = []
|
2105
|
-
for year in range(2024, datetime.datetime.today().year+1):
|
2106
|
-
df = self.download_manager.data_to_df(
|
2107
|
-
db_name='生意参谋3',
|
2108
|
-
table_name=f'手淘搜索_本店引流词_{year}',
|
2109
|
-
start_date=start_date,
|
2110
|
-
end_date=end_date,
|
2111
|
-
projection=projection,
|
2112
|
-
)
|
2113
|
-
__res.append(df)
|
2114
|
-
df = pd.concat(__res, ignore_index=True)
|
2115
|
-
idx = df.groupby(['日期', '店铺名称', '词类型', '搜索词'])['更新时间'].idxmax()
|
2116
|
-
df = df.loc[idx]
|
2117
|
-
df = df[['日期', '店铺名称', '词类型', '搜索词', '访客数', '加购人数', '支付金额', '支付转化率', '支付买家数', '客单价', 'uv价值']]
|
2118
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2119
|
-
return df, {
|
2120
|
-
'db_name': db_name,
|
2121
|
-
'table_name': table_name,
|
2122
|
-
'set_typ': set_typ,
|
2123
|
-
'primary_keys': [], # 创建唯一主键
|
2124
|
-
'check_duplicate': False, # 检查重复数据
|
2125
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2126
|
-
'update_on_duplicate': True, # 更新旧数据
|
2127
|
-
'allow_null': False, # 允许插入空值
|
2128
|
-
'partition_by': None, # 分表方式
|
2129
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2130
|
-
'indexes': [], # 普通索引列
|
2131
|
-
'transaction_mode': 'batch', # 事务模式
|
2132
|
-
'unique_keys': [['日期', '店铺名称', '词类型', '搜索词']], # 唯一约束列表
|
2133
|
-
}
|
2134
|
-
|
2135
|
-
def pdd_tg(self, db_name='聚合数据', table_name='拼多多_商品推广'):
|
2136
|
-
"""拼多多商品推广数据"""
|
2137
|
-
start_date, end_date = self.months_data(num=self.months)
|
2138
|
-
projection = ['日期', '店铺名称', '营销场景', '商品id', '总花费']
|
2139
|
-
df = self.download_manager.data_to_df(
|
2140
|
-
db_name='爱库存2',
|
2141
|
-
table_name='拼多多_商品推广',
|
2142
|
-
start_date=start_date,
|
2143
|
-
end_date=end_date,
|
2144
|
-
projection=projection,
|
2145
|
-
)
|
2146
|
-
if len(df) == 0:
|
2147
|
-
return None, None
|
2148
|
-
df = df.groupby(['日期', '店铺名称', '营销场景'], as_index=False).agg({'总花费': 'sum'}).rename(columns={'总花费': '花费'})
|
2149
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2150
|
-
return df, {
|
2151
|
-
'db_name': db_name,
|
2152
|
-
'table_name': table_name,
|
2153
|
-
'set_typ': set_typ,
|
2154
|
-
'primary_keys': [], # 创建唯一主键
|
2155
|
-
'check_duplicate': False, # 检查重复数据
|
2156
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2157
|
-
'update_on_duplicate': True, # 更新旧数据
|
2158
|
-
'allow_null': False, # 允许插入空值
|
2159
|
-
'partition_by': None, # 分表方式
|
2160
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2161
|
-
'indexes': [], # 普通索引列
|
2162
|
-
'transaction_mode': 'batch', # 事务模式
|
2163
|
-
'unique_keys': [['日期', '店铺名称', '营销场景']], # 唯一约束列表
|
2164
|
-
}
|
2165
|
-
|
2166
|
-
|
2167
|
-
|
2168
|
-
@error_handler.log_on_exception(logger=logger)
|
2169
|
-
@upload_data_decorator()
|
2170
|
-
def zb_ccfx(self, db_name='聚合数据', table_name='生意参谋_直播场次分析'):
|
2171
|
-
start_date, end_date = self.months_data(num=self.months)
|
2172
|
-
df = self.download_manager.data_to_df(
|
2173
|
-
db_name='生意参谋3',
|
2174
|
-
table_name='直播分场次效果',
|
2175
|
-
start_date=start_date,
|
2176
|
-
end_date=end_date,
|
2177
|
-
projection={},
|
2178
|
-
)
|
2179
|
-
df.drop_duplicates(subset=['场次id'], keep='first', inplace=True, ignore_index=True)
|
2180
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2181
|
-
ordered_columns = [
|
2182
|
-
'日期',
|
2183
|
-
'店铺名称',
|
2184
|
-
'场次信息',
|
2185
|
-
'场次id',
|
2186
|
-
'直播开播时间',
|
2187
|
-
'开播时长',
|
2188
|
-
'封面图点击率',
|
2189
|
-
'观看人数',
|
2190
|
-
'观看次数',
|
2191
|
-
'新增粉丝数',
|
2192
|
-
'流量券消耗',
|
2193
|
-
'观看总时长',
|
2194
|
-
'人均观看时长',
|
2195
|
-
'次均观看时长',
|
2196
|
-
'商品点击人数',
|
2197
|
-
'商品点击次数',
|
2198
|
-
'商品点击率',
|
2199
|
-
'加购人数',
|
2200
|
-
'加购件数',
|
2201
|
-
'加购次数',
|
2202
|
-
'成交金额',
|
2203
|
-
'成交人数',
|
2204
|
-
'成交件数',
|
2205
|
-
'成交笔数',
|
2206
|
-
'成交转化率',
|
2207
|
-
'退款人数',
|
2208
|
-
'退款笔数',
|
2209
|
-
'退款件数',
|
2210
|
-
'退款金额',
|
2211
|
-
'预售定金支付金额',
|
2212
|
-
'预售预估总金额',
|
2213
|
-
]
|
2214
|
-
# 使用reindex重排列顺序,未定义的列会自动放在最后
|
2215
|
-
df = df.reindex(columns=[col for col in ordered_columns if col in df.columns] +
|
2216
|
-
[col for col in df.columns if col not in ordered_columns])
|
2217
|
-
return df, {
|
2218
|
-
'db_name': db_name,
|
2219
|
-
'table_name': table_name,
|
2220
|
-
'set_typ': set_typ,
|
2221
|
-
'primary_keys': [], # 创建唯一主键
|
2222
|
-
'check_duplicate': False, # 检查重复数据
|
2223
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2224
|
-
'update_on_duplicate': True, # 更新旧数据
|
2225
|
-
'allow_null': False, # 允许插入空值
|
2226
|
-
'partition_by': None, # 分表方式
|
2227
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2228
|
-
'indexes': [], # 普通索引列
|
2229
|
-
'transaction_mode': 'batch', # 事务模式
|
2230
|
-
'unique_keys': [['场次id']], # 唯一约束列表
|
2231
|
-
}
|
2232
|
-
|
2233
|
-
# @error_handler.log_on_exception(logger=logger)
|
2234
|
-
@upload_data_decorator()
|
2235
|
-
def tg_by_day(self, db_name='聚合数据', table_name='多店推广场景_按日聚合'):
|
2236
|
-
"""
|
2237
|
-
汇总各个店铺的推广数据,按日汇总
|
2238
|
-
"""
|
2239
|
-
df_tm = pd.DataFrame() # 天猫营销场景
|
2240
|
-
df_tb = pd.DataFrame() # 淘宝营销场景
|
2241
|
-
df_al = pd.DataFrame() # 奥莱营销场景
|
2242
|
-
df_tb_qzt = pd.DataFrame() # 淘宝全站推广
|
2243
|
-
df_tm_pxb = pd.DataFrame() # 天猫品销宝
|
2244
|
-
df_tm_living = pd.DataFrame() # 天猫超级直播
|
2245
|
-
df_jd = pd.DataFrame() # 京东推广
|
2246
|
-
df_jd_qzyx = pd.DataFrame() # 京东全站推广
|
2247
|
-
df_jd_ziying = pd.DataFrame() # 京东推广
|
2248
|
-
df_pdd = pd.DataFrame() # 拼多多推广
|
2249
|
-
start_date, end_date = self.months_data(num=self.months)
|
2250
|
-
projection = {
|
2251
|
-
'日期': 1,
|
2252
|
-
'场景id': 1,
|
2253
|
-
'场景名字': 1,
|
2254
|
-
'花费': 1,
|
2255
|
-
'展现量': 1,
|
2256
|
-
'点击量': 1,
|
2257
|
-
'总购物车数': 1,
|
2258
|
-
'总成交笔数': 1,
|
2259
|
-
'总成交金额': 1,
|
2260
|
-
'店铺名称': 1,
|
2261
|
-
}
|
2262
|
-
__res = []
|
2263
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2264
|
-
df_tm = self.download_manager.data_to_df(
|
2265
|
-
db_name='推广数据2',
|
2266
|
-
table_name=f'营销场景报表_{year}',
|
2267
|
-
start_date=start_date,
|
2268
|
-
end_date=end_date,
|
2269
|
-
projection=projection,
|
2270
|
-
)
|
2271
|
-
__res.append(df_tm)
|
2272
|
-
df_tm = pd.concat(__res, ignore_index=True)
|
2273
|
-
if len(df_tm) > 0:
|
2274
|
-
df_tm.rename(columns={'场景名字': '营销场景'}, inplace=True)
|
2275
|
-
df_tm = df_tm.groupby(
|
2276
|
-
['日期', '店铺名称', '场景id', '营销场景', '花费', '展现量'],
|
2277
|
-
as_index=False).agg(
|
2278
|
-
**{
|
2279
|
-
# '展现量': ('展现量', np.max),
|
2280
|
-
'点击量': ('点击量', np.max),
|
2281
|
-
'加购量': ('总购物车数', np.max),
|
2282
|
-
'成交笔数': ('总成交笔数', np.max),
|
2283
|
-
'成交金额': ('总成交金额', np.max)
|
2284
|
-
}
|
2285
|
-
)
|
2286
|
-
# 奥莱店
|
2287
|
-
__res = []
|
2288
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2289
|
-
df_al = self.download_manager.data_to_df(
|
2290
|
-
db_name='推广数据_奥莱店',
|
2291
|
-
table_name=f'营销场景报表_{year}',
|
2292
|
-
start_date=start_date,
|
2293
|
-
end_date=end_date,
|
2294
|
-
projection=projection,
|
2295
|
-
)
|
2296
|
-
__res.append(df_al)
|
2297
|
-
df_al = pd.concat(__res, ignore_index=True)
|
2298
|
-
if len(df_al) > 0:
|
2299
|
-
df_al.rename(columns={'场景名字': '营销场景'}, inplace=True)
|
2300
|
-
df_al['店铺名称'] = df_al['店铺名称'].apply(lambda x: '万里马箱包outlet店' if x == 'Wanlima万里马箱包outlet店' else x)
|
2301
|
-
df_al = df_al.groupby(
|
2302
|
-
['日期', '店铺名称', '场景id', '营销场景', '花费', '展现量'],
|
2303
|
-
as_index=False).agg(
|
2304
|
-
**{
|
2305
|
-
# '展现量': ('展现量', np.max),
|
2306
|
-
'点击量': ('点击量', np.max),
|
2307
|
-
'加购量': ('总购物车数', np.max),
|
2308
|
-
'成交笔数': ('总成交笔数', np.max),
|
2309
|
-
'成交金额': ('总成交金额', np.max)
|
2310
|
-
}
|
2311
|
-
)
|
2312
|
-
# sj圣积
|
2313
|
-
__res = []
|
2314
|
-
for year in range(2025, datetime.datetime.today().year + 1):
|
2315
|
-
df_sj = self.download_manager.data_to_df(
|
2316
|
-
db_name='推广数据_圣积天猫店',
|
2317
|
-
table_name=f'营销场景报表_{year}',
|
2318
|
-
start_date=start_date,
|
2319
|
-
end_date=end_date,
|
2320
|
-
projection=projection,
|
2321
|
-
)
|
2322
|
-
__res.append(df_sj)
|
2323
|
-
df_sj = pd.concat(__res, ignore_index=True)
|
2324
|
-
if len(df_sj) > 0:
|
2325
|
-
df_sj.rename(columns={'场景名字': '营销场景'}, inplace=True)
|
2326
|
-
df_sj['店铺名称'] = df_sj['店铺名称'].apply(lambda x: 'saintJack旗舰店' if x == 'SAINTJACK旗舰店' else x)
|
2327
|
-
df_sj = df_sj.groupby(
|
2328
|
-
['日期', '店铺名称', '场景id', '营销场景', '花费', '展现量'],
|
2329
|
-
as_index=False).agg(
|
2330
|
-
**{
|
2331
|
-
# '展现量': ('展现量', np.max),
|
2332
|
-
'点击量': ('点击量', np.max),
|
2333
|
-
'加购量': ('总购物车数', np.max),
|
2334
|
-
'成交笔数': ('总成交笔数', np.max),
|
2335
|
-
'成交金额': ('总成交金额', np.max)
|
2336
|
-
}
|
2337
|
-
)
|
2338
|
-
# 淘宝店
|
2339
|
-
__res = []
|
2340
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2341
|
-
df_tb = self.download_manager.data_to_df(
|
2342
|
-
db_name='推广数据_淘宝店',
|
2343
|
-
table_name=f'营销场景报表_{year}',
|
2344
|
-
start_date=start_date,
|
2345
|
-
end_date=end_date,
|
2346
|
-
projection=projection,
|
2347
|
-
)
|
2348
|
-
__res.append(df_tb)
|
2349
|
-
df_tb = pd.concat(__res, ignore_index=True)
|
2350
|
-
if len(df_tb) > 0:
|
2351
|
-
df_tb.rename(columns={'场景名字': '营销场景'}, inplace=True)
|
2352
|
-
df_tb = df_tb.groupby(
|
2353
|
-
['日期', '店铺名称', '场景id', '营销场景', '花费', '展现量'],
|
2354
|
-
as_index=False).agg(
|
2355
|
-
**{
|
2356
|
-
# '展现量': ('展现量', np.max),
|
2357
|
-
'点击量': ('点击量', np.max),
|
2358
|
-
'加购量': ('总购物车数', np.max),
|
2359
|
-
'成交笔数': ('总成交笔数', np.max),
|
2360
|
-
'成交金额': ('总成交金额', np.max)
|
2361
|
-
}
|
2362
|
-
)
|
2363
|
-
# 天猫的全站推广包含在营销场景报表中,淘宝店不包含
|
2364
|
-
df_tb_qzt = pd.DataFrame()
|
2365
|
-
if '全站推广' not in df_tb['营销场景'].tolist():
|
2366
|
-
projection = {
|
2367
|
-
'日期': 1,
|
2368
|
-
'主体id': 1,
|
2369
|
-
'花费': 1,
|
2370
|
-
'展现量': 1,
|
2371
|
-
'点击量': 1,
|
2372
|
-
'总购物车数': 1,
|
2373
|
-
'总成交笔数': 1,
|
2374
|
-
'总成交金额': 1,
|
2375
|
-
'店铺名称': 1,
|
2376
|
-
}
|
2377
|
-
__res = []
|
2378
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2379
|
-
df_tb_qzt = self.download_manager.data_to_df(
|
2380
|
-
db_name='推广数据_淘宝店',
|
2381
|
-
table_name=f'全站推广报表_{year}',
|
2382
|
-
start_date=start_date,
|
2383
|
-
end_date=end_date,
|
2384
|
-
projection=projection,
|
2385
|
-
)
|
2386
|
-
__res.append(df_tb_qzt)
|
2387
|
-
df_tb_qzt = pd.concat(__res, ignore_index=True)
|
2388
|
-
if len(df_tb_qzt) > 0:
|
2389
|
-
# 这一步是排重
|
2390
|
-
df_tb_qzt = df_tb_qzt.groupby(
|
2391
|
-
['日期', '店铺名称', '主体id', '花费'],
|
2392
|
-
as_index=False).agg(
|
2393
|
-
**{
|
2394
|
-
'展现量': ('展现量', np.max),
|
2395
|
-
'点击量': ('点击量', np.max),
|
2396
|
-
'加购量': ('总购物车数', np.max),
|
2397
|
-
'成交笔数': ('总成交笔数', np.max),
|
2398
|
-
'成交金额': ('总成交金额', np.max)
|
2399
|
-
}
|
2400
|
-
)
|
2401
|
-
# 这一步是继续聚合,因为这个报表统计的是场景维度,不需要商品维度
|
2402
|
-
df_tb_qzt = df_tb_qzt.groupby(
|
2403
|
-
['日期', '店铺名称', '花费'],
|
2404
|
-
as_index=False).agg(
|
2405
|
-
**{
|
2406
|
-
'展现量': ('展现量', np.sum),
|
2407
|
-
'点击量': ('点击量', np.sum),
|
2408
|
-
'加购量': ('加购量', np.sum),
|
2409
|
-
'成交笔数': ('成交笔数', np.sum),
|
2410
|
-
'成交金额': ('成交金额', np.sum)
|
2411
|
-
}
|
2412
|
-
)
|
2413
|
-
df_tb_qzt['营销场景'] = '全站推广'
|
2414
|
-
# 品销宝报表
|
2415
|
-
projection = {
|
2416
|
-
'日期': 1,
|
2417
|
-
'报表类型': 1,
|
2418
|
-
'消耗': 1,
|
2419
|
-
'展现量': 1,
|
2420
|
-
'点击量': 1,
|
2421
|
-
'宝贝加购数': 1,
|
2422
|
-
'成交笔数': 1,
|
2423
|
-
'成交金额': 1,
|
2424
|
-
'店铺名称': 1,
|
2425
|
-
}
|
2426
|
-
__res = []
|
2427
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2428
|
-
df_tm_pxb = self.download_manager.data_to_df(
|
2429
|
-
db_name='推广数据2',
|
2430
|
-
table_name=f'品销宝_{year}',
|
2431
|
-
start_date=start_date,
|
2432
|
-
end_date=end_date,
|
2433
|
-
projection=projection,
|
2434
|
-
)
|
2435
|
-
__res.append(df_tm_pxb)
|
2436
|
-
df_tm_pxb = pd.concat(__res, ignore_index=True)
|
2437
|
-
if len(df_tm_pxb) > 0:
|
2438
|
-
df_tm_pxb = df_tm_pxb[df_tm_pxb['报表类型'] == '账户']
|
2439
|
-
df_tm_pxb = df_tm_pxb.groupby(
|
2440
|
-
['日期', '店铺名称', '报表类型', '消耗'],
|
2441
|
-
as_index=False).agg(
|
2442
|
-
**{
|
2443
|
-
'展现量': ('展现量', np.max),
|
2444
|
-
'点击量': ('点击量', np.max),
|
2445
|
-
'加购量': ('宝贝加购数', np.max),
|
2446
|
-
'成交笔数': ('成交笔数', np.max),
|
2447
|
-
'成交金额': ('成交金额', np.max)
|
2448
|
-
}
|
2449
|
-
)
|
2450
|
-
df_tm_pxb.rename(columns={'报表类型': '营销场景', '消耗': '花费'}, inplace=True)
|
2451
|
-
df_tm_pxb['营销场景'] = '品销宝'
|
2452
|
-
# 因为 2024.04.16及之前的营销场景报表不含超级直播,所以在此添加
|
2453
|
-
if start_date < pd.to_datetime('2024-04-17'):
|
2454
|
-
projection = {
|
2455
|
-
'日期': 1,
|
2456
|
-
'场景名字': 1,
|
2457
|
-
'花费': 1,
|
2458
|
-
'展现量': 1,
|
2459
|
-
'观看次数': 1,
|
2460
|
-
'总购物车数': 1,
|
2461
|
-
'总成交笔数': 1,
|
2462
|
-
'总成交金额': 1,
|
2463
|
-
'店铺名称': 1,
|
2464
|
-
}
|
2465
|
-
__res = []
|
2466
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2467
|
-
df_tm_living = self.download_manager.data_to_df(
|
2468
|
-
db_name='推广数据2',
|
2469
|
-
table_name=f'超级直播报表_人群_{year}',
|
2470
|
-
start_date=start_date,
|
2471
|
-
end_date=pd.to_datetime('2024-04-16'), # 只可以取此日期之前的数据
|
2472
|
-
projection=projection,
|
2473
|
-
)
|
2474
|
-
__res.append(df_tm_living)
|
2475
|
-
df_tm_living = pd.concat(__res, ignore_index=True)
|
2476
|
-
if len(df_tm_living) > 0:
|
2477
|
-
df_tm_living.rename(columns={'场景名字': '营销场景'}, inplace=True)
|
2478
|
-
df_tm_living = df_tm_living.groupby(
|
2479
|
-
['日期', '店铺名称', '营销场景', '花费'],
|
2480
|
-
as_index=False).agg(
|
2481
|
-
**{
|
2482
|
-
'展现量': ('展现量', np.max),
|
2483
|
-
'点击量': ('观看次数', np.max),
|
2484
|
-
'加购量': ('总购物车数', np.max),
|
2485
|
-
'成交笔数': ('总成交笔数', np.max),
|
2486
|
-
'成交金额': ('总成交金额', np.max)
|
2487
|
-
}
|
2488
|
-
)
|
2489
|
-
# 京东数据
|
2490
|
-
projection = {
|
2491
|
-
'日期': 1,
|
2492
|
-
'产品线': 1,
|
2493
|
-
'触发sku_id': 1,
|
2494
|
-
'跟单sku_id': 1,
|
2495
|
-
'花费': 1,
|
2496
|
-
'展现数': 1,
|
2497
|
-
'点击数': 1,
|
2498
|
-
'直接订单行': 1,
|
2499
|
-
'直接订单金额': 1,
|
2500
|
-
'总订单行': 1,
|
2501
|
-
'总订单金额': 1,
|
2502
|
-
'直接加购数': 1,
|
2503
|
-
'总加购数': 1,
|
2504
|
-
'spu_id': 1,
|
2505
|
-
'店铺名称': 1,
|
2506
|
-
}
|
2507
|
-
__res = []
|
2508
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2509
|
-
df_jd = self.download_manager.data_to_df(
|
2510
|
-
db_name='京东数据3',
|
2511
|
-
table_name=f'推广数据_京准通_{year}',
|
2512
|
-
start_date=start_date,
|
2513
|
-
end_date=end_date,
|
2514
|
-
projection=projection,
|
2515
|
-
)
|
2516
|
-
__res.append(df_jd)
|
2517
|
-
df_jd = pd.concat(__res, ignore_index=True)
|
2518
|
-
if len(df_jd) > 0:
|
2519
|
-
df_jd = df_jd.groupby(['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', 'spu_id', '花费', '展现数', '点击数'],
|
2520
|
-
as_index=False).agg(
|
2521
|
-
**{
|
2522
|
-
'直接订单行': ('直接订单行', np.max),
|
2523
|
-
'直接订单金额': ('直接订单金额', np.max),
|
2524
|
-
'成交笔数': ('总订单行', np.max),
|
2525
|
-
'成交金额': ('总订单金额', np.max),
|
2526
|
-
'直接加购数': ('直接加购数', np.max),
|
2527
|
-
'加购量': ('总加购数', np.max),
|
2528
|
-
}
|
2529
|
-
)
|
2530
|
-
df_jd = df_jd[['日期', '店铺名称', '产品线', '花费', '展现数', '点击数', '加购量', '成交笔数', '成交金额']]
|
2531
|
-
df_jd.rename(columns={'产品线': '营销场景', '展现数': '展现量', '点击数': '点击量'}, inplace=True)
|
2532
|
-
df_jd = df_jd[df_jd['花费'] > 0]
|
2533
|
-
projection = {
|
2534
|
-
'日期': 1,
|
2535
|
-
'产品线': 1,
|
2536
|
-
'花费': 1,
|
2537
|
-
'全站投产比': 1,
|
2538
|
-
'全站交易额': 1,
|
2539
|
-
'全站订单行': 1,
|
2540
|
-
'全站订单成本': 1,
|
2541
|
-
'全站费比': 1,
|
2542
|
-
'核心位置展现量': 1,
|
2543
|
-
'核心位置点击量': 1,
|
2544
|
-
'店铺名称': 1,
|
2545
|
-
}
|
2546
|
-
df_jd_qzyx = self.download_manager.data_to_df(
|
2547
|
-
db_name='京东数据3',
|
2548
|
-
table_name='推广数据_全站营销',
|
2549
|
-
start_date=start_date,
|
2550
|
-
end_date=end_date,
|
2551
|
-
projection=projection,
|
2552
|
-
)
|
2553
|
-
if len(df_jd_qzyx) > 0:
|
2554
|
-
df_jd_qzyx = df_jd_qzyx.groupby(['日期', '店铺名称', '产品线', '花费'], as_index=False).agg(
|
2555
|
-
**{'全站投产比': ('全站投产比', np.max),
|
2556
|
-
'成交金额': ('全站交易额', np.max),
|
2557
|
-
'成交笔数': ('全站订单行', np.max),
|
2558
|
-
'全站订单成本': ('全站订单成本', np.max),
|
2559
|
-
'全站费比': ('全站费比', np.max),
|
2560
|
-
'展现量': ('核心位置展现量', np.max),
|
2561
|
-
'点击量': ('核心位置点击量', np.max),
|
2562
|
-
}
|
2563
|
-
)
|
2564
|
-
df_jd_qzyx.rename(columns={'产品线': '营销场景'}, inplace=True)
|
2565
|
-
df_jd_qzyx = df_jd_qzyx[['日期', '店铺名称', '营销场景', '花费', '展现量', '点击量', '成交笔数', '成交金额']]
|
2566
|
-
df_jd_qzyx = df_jd_qzyx[df_jd_qzyx['花费'] > 0]
|
2567
|
-
# 京东自营店数据
|
2568
|
-
projection = {
|
2569
|
-
'日期': 1,
|
2570
|
-
'产品线': 1,
|
2571
|
-
'触发sku_id': 1,
|
2572
|
-
'跟单sku_id': 1,
|
2573
|
-
'花费': 1,
|
2574
|
-
'展现数': 1,
|
2575
|
-
'点击数': 1,
|
2576
|
-
'直接订单行': 1,
|
2577
|
-
'直接订单金额': 1,
|
2578
|
-
'总订单行': 1,
|
2579
|
-
'总订单金额': 1,
|
2580
|
-
'直接加购数': 1,
|
2581
|
-
'总加购数': 1,
|
2582
|
-
'spu_id': 1,
|
2583
|
-
'店铺名称': 1,
|
2584
|
-
}
|
2585
|
-
__res = []
|
2586
|
-
for year in range(2025, datetime.datetime.today().year + 1):
|
2587
|
-
df_jd_ziying = self.download_manager.data_to_df(
|
2588
|
-
db_name='京东数据3',
|
2589
|
-
table_name=f'推广数据_京准通_自营店_{year}',
|
2590
|
-
start_date=start_date,
|
2591
|
-
end_date=end_date,
|
2592
|
-
projection=projection,
|
2593
|
-
)
|
2594
|
-
__res.append(df_jd_ziying)
|
2595
|
-
df_jd_ziying = pd.concat(__res, ignore_index=True)
|
2596
|
-
if len(df_jd_ziying) > 0:
|
2597
|
-
df_jd_ziying = df_jd_ziying.groupby(
|
2598
|
-
['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', 'spu_id', '花费', '展现数', '点击数'],
|
2599
|
-
as_index=False).agg(
|
2600
|
-
**{
|
2601
|
-
'直接订单行': ('直接订单行', np.max),
|
2602
|
-
'直接订单金额': ('直接订单金额', np.max),
|
2603
|
-
'成交笔数': ('总订单行', np.max),
|
2604
|
-
'成交金额': ('总订单金额', np.max),
|
2605
|
-
'直接加购数': ('直接加购数', np.max),
|
2606
|
-
'加购量': ('总加购数', np.max),
|
2607
|
-
}
|
2608
|
-
)
|
2609
|
-
df_jd_ziying = df_jd_ziying[['日期', '店铺名称', '产品线', '花费', '展现数', '点击数', '加购量', '成交笔数', '成交金额']]
|
2610
|
-
df_jd_ziying.rename(columns={'产品线': '营销场景', '展现数': '展现量', '点击数': '点击量'}, inplace=True)
|
2611
|
-
df_jd_ziying = df_jd_ziying[df_jd_ziying['花费'] > 0]
|
2612
|
-
|
2613
|
-
# 拼多多推广
|
2614
|
-
df_pdd, _ = self.pdd_tg(db_name='聚合数据', table_name='拼多多_商品推广')
|
2615
|
-
df_pdd['店铺名称'] = df_pdd['店铺名称'].map({
|
2616
|
-
'万里马箱包官方旗舰店': '拼多多_丹宁',
|
2617
|
-
'万里马箱包皮具官方旗舰店': '拼多多_togo',
|
2618
|
-
}).fillna('-')
|
2619
|
-
|
2620
|
-
_datas = [item for item in [df_tm, df_tb, df_tb_qzt, df_al, df_sj, df_tm_pxb, df_tm_living, df_jd, df_jd_qzyx, df_jd_ziying, df_pdd] if len(item) > 0] # 阻止空的 dataframe
|
2621
|
-
df = pd.concat(_datas, axis=0, ignore_index=True)
|
2622
|
-
# 超级直播全站推广不包含在营销场景报表中,所以单独添加 2025-03-05
|
2623
|
-
projection = {
|
2624
|
-
'日期': 1,
|
2625
|
-
'店铺名称': 1,
|
2626
|
-
'场景id': 1,
|
2627
|
-
'场景名字': 1,
|
2628
|
-
'全站花费': 1,
|
2629
|
-
'全站观看次数': 1,
|
2630
|
-
'全站宝贝点击量': 1,
|
2631
|
-
'全站成交笔数': 1,
|
2632
|
-
'全站成交金额': 1,
|
2633
|
-
}
|
2634
|
-
cjzb_qzt = self.tg_cjzb_qzt(projection=projection, is_maximize=True)
|
2635
|
-
if len(cjzb_qzt) > 0:
|
2636
|
-
cjzb_qzt.rename(columns={
|
2637
|
-
'场景名字': '营销场景',
|
2638
|
-
'全站花费': '花费',
|
2639
|
-
'全站观看次数': '展现量',
|
2640
|
-
'全站宝贝点击量': '点击量',
|
2641
|
-
'全站成交笔数': '成交笔数',
|
2642
|
-
'全站成交金额': '成交金额',
|
2643
|
-
}, inplace=True)
|
2644
|
-
cjzb_qzt = cjzb_qzt.groupby(
|
2645
|
-
['日期', '店铺名称', '场景id', '营销场景'],
|
2646
|
-
as_index=False).agg(
|
2647
|
-
**{
|
2648
|
-
'花费': ('花费', np.max),
|
2649
|
-
'展现量': ('展现量', np.max),
|
2650
|
-
'点击量': ('点击量', np.max),
|
2651
|
-
'成交笔数': ('成交笔数', np.max),
|
2652
|
-
'成交金额': ('成交金额', np.max)
|
2653
|
-
}
|
2654
|
-
)
|
2655
|
-
for col in df.columns.tolist():
|
2656
|
-
if col not in cjzb_qzt.columns.tolist():
|
2657
|
-
cjzb_qzt[col] = 0
|
2658
|
-
df = pd.concat([df, cjzb_qzt], ignore_index=True)
|
2659
|
-
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore') # 转换日期列
|
2660
|
-
df = df.groupby(
|
2661
|
-
['日期', '店铺名称', '营销场景'],
|
2662
|
-
as_index=False).agg(
|
2663
|
-
**{
|
2664
|
-
'花费': ('花费', np.sum),
|
2665
|
-
'展现量': ('展现量', np.sum),
|
2666
|
-
'点击量': ('点击量', np.sum),
|
2667
|
-
'加购量': ('加购量', np.sum),
|
2668
|
-
'成交笔数': ('成交笔数', np.sum),
|
2669
|
-
'成交金额': ('成交金额', np.sum)
|
2670
|
-
}
|
2671
|
-
)
|
2672
|
-
df.sort_values(['日期', '店铺名称', '花费'], ascending=[False, False, False], ignore_index=True, inplace=True)
|
2673
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2674
|
-
return df, {
|
2675
|
-
'db_name': db_name,
|
2676
|
-
'table_name': table_name,
|
2677
|
-
'set_typ': set_typ,
|
2678
|
-
'primary_keys': [], # 创建唯一主键
|
2679
|
-
'check_duplicate': False, # 检查重复数据
|
2680
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2681
|
-
'update_on_duplicate': True, # 更新旧数据
|
2682
|
-
'allow_null': False, # 允许插入空值
|
2683
|
-
'partition_by': None, # 分表方式
|
2684
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2685
|
-
'indexes': [], # 普通索引列
|
2686
|
-
'transaction_mode': 'batch', # 事务模式
|
2687
|
-
'unique_keys': [['日期', '店铺名称', '营销场景']], # 唯一约束列表
|
2688
|
-
}
|
2689
|
-
|
2690
|
-
@error_handler.log_on_exception(logger=logger)
|
2691
|
-
@upload_data_decorator()
|
2692
|
-
def aikucun_bd_spu(self, db_name='聚合数据', table_name='爱库存_商品spu榜单'):
|
2693
|
-
start_date, end_date = self.months_data(num=self.months)
|
2694
|
-
projection = {
|
2695
|
-
'日期': 1,
|
2696
|
-
'平台': 1,
|
2697
|
-
'店铺名称': 1,
|
2698
|
-
'spuid': 1,
|
2699
|
-
'商品名称': 1,
|
2700
|
-
'品牌名': 1,
|
2701
|
-
'商品款号': 1,
|
2702
|
-
'一级类目名称': 1,
|
2703
|
-
'二级类目名称': 1,
|
2704
|
-
'三级类目名称': 1,
|
2705
|
-
'转发次数': 1,
|
2706
|
-
'转发爱豆人数': 1,
|
2707
|
-
'访客量': 1,
|
2708
|
-
'浏览量': 1,
|
2709
|
-
'下单gmv': 1,
|
2710
|
-
'成交gmv': 1,
|
2711
|
-
'供货额': 1,
|
2712
|
-
'供货价': 1,
|
2713
|
-
'销售爱豆人数': 1,
|
2714
|
-
'支付人数_交易': 1,
|
2715
|
-
'支付人数_成交': 1,
|
2716
|
-
'销售量_成交': 1,
|
2717
|
-
'销售量_交易': 1,
|
2718
|
-
'订单数_成交': 1,
|
2719
|
-
'订单数_交易': 1,
|
2720
|
-
'成交率_交易': 1,
|
2721
|
-
'成交率_成交': 1,
|
2722
|
-
'可售库存数': 1,
|
2723
|
-
'售罄率': 1,
|
2724
|
-
'在架sku数': 1,
|
2725
|
-
'可售sku数': 1,
|
2726
|
-
'下单sku数': 1,
|
2727
|
-
'成交sku数': 1,
|
2728
|
-
'图片': 1,
|
2729
|
-
'更新时间': 1,
|
2730
|
-
}
|
2731
|
-
projection = {}
|
2732
|
-
df = self.download_manager.data_to_df(
|
2733
|
-
db_name='爱库存2',
|
2734
|
-
table_name='爱库存_spu榜单',
|
2735
|
-
start_date=start_date,
|
2736
|
-
end_date=end_date,
|
2737
|
-
projection=projection,
|
2738
|
-
)
|
2739
|
-
idx = df.groupby(['日期', '店铺名称', 'spuid'])['更新时间'].idxmax()
|
2740
|
-
df = df.loc[idx]
|
2741
|
-
# 调整列顺序, 定义需要前置的列
|
2742
|
-
cols_to_move = ['日期','平台','店铺名称','品牌名','商品名称', '商品款号','spuid', '一级类目名称', '二级类目名称', '三级类目名称']
|
2743
|
-
# 生成新的列顺序:前置列 + 剩余列(保持原顺序)
|
2744
|
-
new_columns = cols_to_move + [col for col in df.columns if col not in cols_to_move]
|
2745
|
-
# 调整DataFrame列顺序
|
2746
|
-
df = df[new_columns]
|
2747
|
-
df['更新时间'] = df.pop('更新时间')
|
2748
|
-
df = df.astype({'日期': 'datetime64[ns]'}, errors='ignore')
|
2749
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2750
|
-
return df, {
|
2751
|
-
'db_name': db_name,
|
2752
|
-
'table_name': table_name,
|
2753
|
-
'set_typ': set_typ,
|
2754
|
-
'primary_keys': [], # 创建唯一主键
|
2755
|
-
'check_duplicate': False, # 检查重复数据
|
2756
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2757
|
-
'update_on_duplicate': True, # 更新旧数据
|
2758
|
-
'allow_null': False, # 允许插入空值
|
2759
|
-
'partition_by': None, # 分表方式
|
2760
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2761
|
-
'indexes': [], # 普通索引列
|
2762
|
-
'transaction_mode': 'batch', # 事务模式
|
2763
|
-
'unique_keys': [['日期', '店铺名称', '商品款号', 'spuid']], # 唯一约束列表
|
2764
|
-
}
|
2765
|
-
|
2766
|
-
@upload_data_decorator()
|
2767
|
-
def deeplink(self, db_name='聚合数据', table_name='达摩盘_deeplink人群洞察'):
|
2768
|
-
start_date, end_date = self.months_data(num=self.months)
|
2769
|
-
projection = {}
|
2770
|
-
df = self.download_manager.data_to_df(
|
2771
|
-
db_name='达摩盘3',
|
2772
|
-
table_name='店铺deeplink人群洞察',
|
2773
|
-
start_date=start_date,
|
2774
|
-
end_date=end_date,
|
2775
|
-
projection=projection,
|
2776
|
-
)
|
2777
|
-
df.drop_duplicates(subset=['日期', '人群类型', '店铺名称', '人群规模', '广告投入金额'], keep='last', inplace=True, ignore_index=True)
|
2778
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2779
|
-
return df, {
|
2780
|
-
'db_name': db_name,
|
2781
|
-
'table_name': table_name,
|
2782
|
-
'set_typ': set_typ,
|
2783
|
-
'primary_keys': [], # 创建唯一主键
|
2784
|
-
'check_duplicate': False, # 检查重复数据
|
2785
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2786
|
-
'update_on_duplicate': True, # 更新旧数据
|
2787
|
-
'allow_null': False, # 允许插入空值
|
2788
|
-
'partition_by': None, # 分表方式
|
2789
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2790
|
-
'indexes': [], # 普通索引列
|
2791
|
-
'transaction_mode': 'batch', # 事务模式
|
2792
|
-
'unique_keys': [['日期', '人群类型', '店铺名称', '人群规模']], # 唯一约束列表
|
2793
|
-
}
|
2794
|
-
|
2795
|
-
@upload_data_decorator()
|
2796
|
-
def global_insights(self, db_name='聚合数据', table_name='全域洞察'):
|
2797
|
-
start_date, end_date = self.months_data(num=self.months)
|
2798
|
-
exclude_projection = ['日期', '结束日期', '在投计划数', 'bizcode', 'channeltype', 'urlonebp', '渠道策略']
|
2799
|
-
__res = []
|
2800
|
-
for year in range(2025, datetime.datetime.today().year + 1):
|
2801
|
-
df_global = self.download_manager.data_to_df(
|
2802
|
-
db_name='达摩盘3',
|
2803
|
-
table_name=f'全域洞察_{year}',
|
2804
|
-
start_date=start_date,
|
2805
|
-
end_date=end_date,
|
2806
|
-
projection={},
|
2807
|
-
exclude_projection=exclude_projection,
|
2808
|
-
date_column='起始日期',
|
2809
|
-
)
|
2810
|
-
__res.append(df_global)
|
2811
|
-
df = pd.concat(__res, ignore_index=True)
|
2812
|
-
if len(df) == 0:
|
2813
|
-
return None, None
|
2814
|
-
df.rename(columns={'起始日期': '日期'}, inplace=True)
|
2815
|
-
|
2816
|
-
# df.drop_duplicates(subset=['日期', '店铺名称', '场景id', '父渠道id'], keep='last', inplace=True, ignore_index=True)
|
2817
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2818
|
-
return df, {
|
2819
|
-
'db_name': db_name,
|
2820
|
-
'table_name': table_name,
|
2821
|
-
'set_typ': set_typ,
|
2822
|
-
'primary_keys': [], # 创建唯一主键
|
2823
|
-
'check_duplicate': False, # 检查重复数据
|
2824
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2825
|
-
'update_on_duplicate': True, # 更新旧数据
|
2826
|
-
'allow_null': False, # 允许插入空值
|
2827
|
-
'partition_by': None, # 分表方式
|
2828
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2829
|
-
'indexes': [], # 普通索引列
|
2830
|
-
'transaction_mode': 'batch', # 事务模式
|
2831
|
-
'unique_keys': [['日期', '店铺名称', '场景id', '父渠道id']], # 唯一约束列表
|
2832
|
-
}
|
2833
|
-
|
2834
|
-
# @error_handler.log_on_exception(logger=logger)
|
2835
|
-
@upload_data_decorator()
|
2836
|
-
def dmp_crowd(self, db_name='聚合数据', table_name='达摩盘_人群报表'):
|
2837
|
-
start_date, end_date = self.months_data(num=self.months)
|
2838
|
-
projection = {
|
2839
|
-
'日期': 1,
|
2840
|
-
'人群id': 1,
|
2841
|
-
'人群规模': 1,
|
2842
|
-
'用户年龄': 1,
|
2843
|
-
'消费能力等级': 1,
|
2844
|
-
'用户性别': 1,
|
2845
|
-
}
|
2846
|
-
df_crowd = self.download_manager.data_to_df(
|
2847
|
-
db_name='达摩盘3',
|
2848
|
-
table_name='我的人群属性',
|
2849
|
-
start_date=start_date,
|
2850
|
-
end_date=end_date,
|
2851
|
-
projection=projection,
|
2852
|
-
)
|
2853
|
-
df_crowd.sort_values('日期', ascending=True, ignore_index=True, inplace=True)
|
2854
|
-
df_crowd.drop_duplicates(subset=['人群id',], keep='last', inplace=True, ignore_index=True)
|
2855
|
-
df_crowd.pop('日期')
|
2856
|
-
df_crowd = df_crowd.astype({'人群id': 'int64'}, errors='ignore')
|
2857
|
-
projection = {}
|
2858
|
-
__res = []
|
2859
|
-
for year in range(2024, datetime.datetime.today().year + 1):
|
2860
|
-
df_dmp = self.download_manager.data_to_df(
|
2861
|
-
db_name='达摩盘3',
|
2862
|
-
table_name=f'dmp人群报表_{year}',
|
2863
|
-
start_date=start_date,
|
2864
|
-
end_date=end_date,
|
2865
|
-
projection=projection,
|
2866
|
-
)
|
2867
|
-
__res.append(df_dmp)
|
2868
|
-
df_dmp = pd.concat(__res, ignore_index=True)
|
2869
|
-
df_dmp = df_dmp.astype({'人群id': 'int64'}, errors='ignore')
|
2870
|
-
df_dmp.sort_values('日期', ascending=True, ignore_index=True, inplace=True)
|
2871
|
-
df_dmp.drop_duplicates(subset=['日期', '人群id', '消耗_元'], keep='last', inplace=True, ignore_index=True)
|
2872
|
-
df = pd.merge(df_dmp, df_crowd, left_on=['人群id'], right_on=['人群id'], how='left')
|
2873
|
-
# 清除一些不必要的字符
|
2874
|
-
df['用户年龄'] = df['用户年龄'].apply(lambda x: '~'.join(re.findall(r'^(\d+).*-(\d+)岁$', str(x))[0]) if '岁' in str(x) else x)
|
2875
|
-
df['消费能力等级'] = df['消费能力等级'].apply(lambda x: f'L{''.join(re.findall(r'(\d)', str(x)))}' if '购买力' in str(x) else x)
|
2876
|
-
df.rename(columns={'消耗_元': '消耗'}, inplace=True)
|
2877
|
-
set_typ = SET_TYP_DICT.get(f'{db_name}_{table_name}', {})
|
2878
|
-
return df, {
|
2879
|
-
'db_name': db_name,
|
2880
|
-
'table_name': table_name,
|
2881
|
-
'set_typ': set_typ,
|
2882
|
-
'primary_keys': [], # 创建唯一主键
|
2883
|
-
'check_duplicate': False, # 检查重复数据
|
2884
|
-
'duplicate_columns': [], # 指定排重的组合键
|
2885
|
-
'update_on_duplicate': True, # 更新旧数据
|
2886
|
-
'allow_null': False, # 允许插入空值
|
2887
|
-
'partition_by': None, # 分表方式
|
2888
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
2889
|
-
'indexes': [], # 普通索引列
|
2890
|
-
'transaction_mode': 'batch', # 事务模式
|
2891
|
-
'unique_keys': [['日期', '店铺名称', '人群id', '营销渠道', '计划基础信息', '推广单元信息']], # 唯一约束列表
|
2892
|
-
}
|
2893
|
-
|
2894
|
-
@error_handler.log_on_exception(logger=logger)
|
2895
|
-
def ret_keyword(self, keyword, as_file=False):
|
2896
|
-
""" 推广关键词报表,关键词分类, """
|
2897
|
-
datas = [
|
2898
|
-
{
|
2899
|
-
'类别': '品牌词',
|
2900
|
-
'值': [
|
2901
|
-
'万里马',
|
2902
|
-
'wanlima',
|
2903
|
-
'fion',
|
2904
|
-
'菲安妮',
|
2905
|
-
'迪桑娜',
|
2906
|
-
'dissona',
|
2907
|
-
'hr',
|
2908
|
-
'vh',
|
2909
|
-
'songmont',
|
2910
|
-
'vanessahogan',
|
2911
|
-
'dilaks',
|
2912
|
-
'khdesign',
|
2913
|
-
'peco',
|
2914
|
-
'giimmii',
|
2915
|
-
'cassile',
|
2916
|
-
'grotto',
|
2917
|
-
'why',
|
2918
|
-
'roulis',
|
2919
|
-
'lesschic',
|
2920
|
-
'amazing song',
|
2921
|
-
'mytaste',
|
2922
|
-
'bagtree',
|
2923
|
-
'红谷',
|
2924
|
-
'hongu',
|
2925
|
-
]
|
2926
|
-
},
|
2927
|
-
{
|
2928
|
-
'类别': '智选',
|
2929
|
-
'值': [
|
2930
|
-
'智选',
|
2931
|
-
]
|
2932
|
-
},
|
2933
|
-
{
|
2934
|
-
'类别': '智能',
|
2935
|
-
'值': [
|
2936
|
-
'智能',
|
2937
|
-
]
|
2938
|
-
},
|
2939
|
-
{
|
2940
|
-
'类别': '年份',
|
2941
|
-
'值': [
|
2942
|
-
'20',
|
2943
|
-
]
|
2944
|
-
},
|
2945
|
-
{
|
2946
|
-
'类别': '材质',
|
2947
|
-
'值': [
|
2948
|
-
'皮',
|
2949
|
-
'牛仔',
|
2950
|
-
'丹宁',
|
2951
|
-
'帆布',
|
2952
|
-
]
|
2953
|
-
},
|
2954
|
-
{
|
2955
|
-
'类别': '季节',
|
2956
|
-
'值': [
|
2957
|
-
'春',
|
2958
|
-
'夏',
|
2959
|
-
'秋',
|
2960
|
-
'冬',
|
2961
|
-
]
|
2962
|
-
},
|
2963
|
-
{
|
2964
|
-
'类别': '一键起量',
|
2965
|
-
'值': [
|
2966
|
-
'一键起量',
|
2967
|
-
]
|
2968
|
-
},
|
2969
|
-
{
|
2970
|
-
'类别': '款式',
|
2971
|
-
'值': [
|
2972
|
-
'水桶',
|
2973
|
-
'托特',
|
2974
|
-
'腋下',
|
2975
|
-
'小方',
|
2976
|
-
'通用款',
|
2977
|
-
'手拿',
|
2978
|
-
'马鞍',
|
2979
|
-
'链条',
|
2980
|
-
'菜篮',
|
2981
|
-
'hobo',
|
2982
|
-
'波士顿',
|
2983
|
-
'凯莉',
|
2984
|
-
'饺子',
|
2985
|
-
'盒子',
|
2986
|
-
'牛角',
|
2987
|
-
'公文',
|
2988
|
-
'月牙',
|
2989
|
-
'单肩',
|
2990
|
-
'枕头',
|
2991
|
-
'斜挎',
|
2992
|
-
'手提',
|
2993
|
-
'手拎',
|
2994
|
-
'拎手',
|
2995
|
-
'斜肩',
|
2996
|
-
'棒球',
|
2997
|
-
'饺包',
|
2998
|
-
'保龄球',
|
2999
|
-
'戴妃',
|
3000
|
-
'半月',
|
3001
|
-
'弯月',
|
3002
|
-
'法棍',
|
3003
|
-
'流浪',
|
3004
|
-
'拎包',
|
3005
|
-
'中式',
|
3006
|
-
'手挽',
|
3007
|
-
'皮带',
|
3008
|
-
'眼镜',
|
3009
|
-
'斜跨',
|
3010
|
-
'律师',
|
3011
|
-
'斜背',
|
3012
|
-
]
|
3013
|
-
},
|
3014
|
-
{
|
3015
|
-
'类别': '品类词',
|
3016
|
-
'值': [
|
3017
|
-
'老花',
|
3018
|
-
'包包',
|
3019
|
-
'通勤',
|
3020
|
-
'轻奢',
|
3021
|
-
'包',
|
3022
|
-
'新款',
|
3023
|
-
'小众',
|
3024
|
-
'爆款',
|
3025
|
-
'工作',
|
3026
|
-
'精致',
|
3027
|
-
'奢侈',
|
3028
|
-
'袋',
|
3029
|
-
'腰带',
|
3030
|
-
'裤带',
|
3031
|
-
'女士',
|
3032
|
-
'复古',
|
3033
|
-
'高级',
|
3034
|
-
'容量',
|
3035
|
-
'时尚',
|
3036
|
-
'商务',
|
3037
|
-
],
|
3038
|
-
},
|
3039
|
-
]
|
3040
|
-
result = ''
|
3041
|
-
res = []
|
3042
|
-
is_continue = False
|
3043
|
-
for data in datas:
|
3044
|
-
for item in data['值']:
|
3045
|
-
if item == '20':
|
3046
|
-
pattern = r'\d\d'
|
3047
|
-
res = re.findall(f'{item}{pattern}', str(keyword), re.IGNORECASE)
|
3048
|
-
else:
|
3049
|
-
res = re.findall(item, str(keyword), re.IGNORECASE)
|
3050
|
-
if res:
|
3051
|
-
result = data['类别']
|
3052
|
-
is_continue = True
|
3053
|
-
break
|
3054
|
-
if is_continue:
|
3055
|
-
break
|
3056
|
-
return result
|
3057
|
-
|
3058
|
-
@error_handler.log_on_exception(logger=logger)
|
3059
|
-
def set_crowd(self, keyword, as_file=False):
|
3060
|
-
""" 推广人群报表,人群分类, """
|
3061
|
-
result_a = re.findall('_a$|_a_|_ai|^a_', str(keyword), re.IGNORECASE)
|
3062
|
-
result_i = re.findall('_i$|_i_|^i_', str(keyword), re.IGNORECASE)
|
3063
|
-
result_p = re.findall('_p$|_p_|_pl|^p_||^pl_', str(keyword), re.IGNORECASE)
|
3064
|
-
result_l = re.findall('_l$|_l_|^l_', str(keyword), re.IGNORECASE)
|
3065
|
-
datas = [
|
3066
|
-
{
|
3067
|
-
'类别': 'A',
|
3068
|
-
'值': result_a,
|
3069
|
-
},
|
3070
|
-
{
|
3071
|
-
'类别': 'I',
|
3072
|
-
'值': result_i,
|
3073
|
-
},
|
3074
|
-
{
|
3075
|
-
'类别': 'P',
|
3076
|
-
'值': result_p,
|
3077
|
-
},
|
3078
|
-
{
|
3079
|
-
'类别': 'L',
|
3080
|
-
'值': result_l,
|
3081
|
-
}
|
3082
|
-
]
|
3083
|
-
is_res = False
|
3084
|
-
for data in datas:
|
3085
|
-
if data['值']:
|
3086
|
-
data['值'] = [item for item in data['值'] if item != '']
|
3087
|
-
if data['值']:
|
3088
|
-
return data['类别']
|
3089
|
-
if not is_res:
|
3090
|
-
return ''
|
3091
|
-
|
3092
|
-
@error_handler.log_on_exception(logger=logger)
|
3093
|
-
def set_crowd2(self, keyword, as_file=False):
|
3094
|
-
""" 推广人群报表,人群分类, """
|
3095
|
-
datas = [
|
3096
|
-
{
|
3097
|
-
'类别': 'A',
|
3098
|
-
'值': [
|
3099
|
-
'相似宝贝',
|
3100
|
-
'相似店铺',
|
3101
|
-
'类目',
|
3102
|
-
'88VIP',
|
3103
|
-
'拉新',
|
3104
|
-
'潮流',
|
3105
|
-
'会场',
|
3106
|
-
'意向',
|
3107
|
-
'>>', # 系统推荐的搜索相关人群
|
3108
|
-
'关键词:', # 系统推荐的搜索相关人群
|
3109
|
-
'关键词_', # 自建的搜索相关人群
|
3110
|
-
'扩展',
|
3111
|
-
'敏感人群',
|
3112
|
-
'尝鲜',
|
3113
|
-
'小二推荐',
|
3114
|
-
'竞争',
|
3115
|
-
'资深',
|
3116
|
-
'女王节',
|
3117
|
-
'本行业',
|
3118
|
-
'618',
|
3119
|
-
'包包树',
|
3120
|
-
'迪桑娜',
|
3121
|
-
'菲安妮',
|
3122
|
-
'卡思乐',
|
3123
|
-
'场景词',
|
3124
|
-
'竞对',
|
3125
|
-
'精选',
|
3126
|
-
'发现',
|
3127
|
-
'行业mvp'
|
3128
|
-
'特征继承',
|
3129
|
-
'机会',
|
3130
|
-
'推荐',
|
3131
|
-
'智能定向',
|
3132
|
-
'AI',
|
3133
|
-
]
|
3134
|
-
},
|
3135
|
-
{
|
3136
|
-
'类别': 'I',
|
3137
|
-
'值': [
|
3138
|
-
'行动',
|
3139
|
-
'收加',
|
3140
|
-
'收藏',
|
3141
|
-
'加购',
|
3142
|
-
'促首购',
|
3143
|
-
'店铺优惠券',
|
3144
|
-
'高转化',
|
3145
|
-
'认知',
|
3146
|
-
'喜欢我', # 系统推荐宝贝/店铺访问相关人群
|
3147
|
-
'未购买',
|
3148
|
-
'种草',
|
3149
|
-
'兴趣',
|
3150
|
-
'本店',
|
3151
|
-
'领券',
|
3152
|
-
]
|
3153
|
-
},
|
3154
|
-
{
|
3155
|
-
'类别': 'P',
|
3156
|
-
'值': [
|
3157
|
-
'万里马',
|
3158
|
-
'购买',
|
3159
|
-
'已购',
|
3160
|
-
'促复购'
|
3161
|
-
'店铺会员',
|
3162
|
-
'店铺粉丝',
|
3163
|
-
'转化',
|
3164
|
-
]
|
3165
|
-
},
|
3166
|
-
{
|
3167
|
-
'类别': 'L',
|
3168
|
-
'值': [
|
3169
|
-
'L人群',
|
3170
|
-
]
|
3171
|
-
},
|
3172
|
-
]
|
3173
|
-
result = ''
|
3174
|
-
res = []
|
3175
|
-
is_continue = False
|
3176
|
-
for data in datas:
|
3177
|
-
for item in data['值']:
|
3178
|
-
res = re.findall(item, str(keyword), re.IGNORECASE)
|
3179
|
-
if res:
|
3180
|
-
result = data['类别']
|
3181
|
-
is_continue = True
|
3182
|
-
break
|
3183
|
-
if is_continue:
|
3184
|
-
break
|
3185
|
-
return result
|
3186
|
-
|
3187
|
-
# @error_handler.log_on_exception(logger=logger)
|
3188
|
-
@upload_data_decorator()
|
3189
|
-
def performance_concat(self, db_name, table_name, bb_tg=True):
|
3190
|
-
tg = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '天猫汇总表调用'][0]
|
3191
|
-
zb = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '天猫_超级直播'][0]
|
3192
|
-
pxb = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '天猫_品销宝账户报表'][0]
|
3193
|
-
zb = zb.groupby(['日期', '店铺名称', '推广渠道', '营销场景'], as_index=False).agg(
|
3194
|
-
**{
|
3195
|
-
'花费': ('花费', np.sum),
|
3196
|
-
'展现量': ('展现量', np.sum),
|
3197
|
-
'观看次数': ('观看次数', np.sum),
|
3198
|
-
'加购量': ('加购量', np.sum),
|
3199
|
-
'成交笔数': ('成交笔数', np.sum),
|
3200
|
-
'成交金额': ('成交金额', np.sum),
|
3201
|
-
'直接成交笔数': ('直接成交笔数', np.sum),
|
3202
|
-
'直接成交金额': ('直接成交金额', np.sum),
|
3203
|
-
}
|
3204
|
-
)
|
3205
|
-
pxb = pxb.groupby(['日期', '店铺名称', '推广渠道', '营销场景'], as_index=False).agg(
|
3206
|
-
**{
|
3207
|
-
'花费': ('花费', np.sum),
|
3208
|
-
'展现量': ('展现量', np.sum),
|
3209
|
-
'点击量': ('点击量', np.sum),
|
3210
|
-
'加购量': ('加购量', np.sum),
|
3211
|
-
'成交笔数': ('成交笔数', np.sum),
|
3212
|
-
'成交金额': ('成交金额', np.sum)
|
3213
|
-
}
|
3214
|
-
)
|
3215
|
-
zb.rename(columns={
|
3216
|
-
'观看次数': '点击量',
|
3217
|
-
}, inplace=True)
|
3218
|
-
zb.fillna(0, inplace=True) # astype 之前要填充空值
|
3219
|
-
tg.fillna(0, inplace=True)
|
3220
|
-
zb = zb.astype({
|
3221
|
-
'花费': 'float64',
|
3222
|
-
'展现量': 'int64',
|
3223
|
-
'点击量': 'int64',
|
3224
|
-
'加购量': 'int64',
|
3225
|
-
'成交笔数': 'int64',
|
3226
|
-
'成交金额': 'float64',
|
3227
|
-
'直接成交笔数': 'int64',
|
3228
|
-
'直接成交金额': 'float64',
|
3229
|
-
}, errors='raise')
|
3230
|
-
tg = tg.astype({
|
3231
|
-
'商品id': str,
|
3232
|
-
'花费': 'float64',
|
3233
|
-
'展现量': 'int64',
|
3234
|
-
'点击量': 'int64',
|
3235
|
-
'加购量': 'int64',
|
3236
|
-
'成交笔数': 'int64',
|
3237
|
-
'成交金额': 'float64',
|
3238
|
-
'直接成交笔数': 'int64',
|
3239
|
-
'直接成交金额': 'float64',
|
3240
|
-
'自然流量曝光量': 'int64',
|
3241
|
-
}, errors='raise')
|
3242
|
-
df = pd.concat([tg, zb, pxb], axis=0, ignore_index=True)
|
3243
|
-
df.fillna(0, inplace=True) # concat 之后要填充空值
|
3244
|
-
df = df.astype({
|
3245
|
-
'商品id': str,
|
3246
|
-
'自然流量曝光量': 'int64',
|
3247
|
-
})
|
3248
|
-
df.replace(to_replace='', value=0, inplace=True)
|
3249
|
-
set_typ = {
|
3250
|
-
'日期': 'date',
|
3251
|
-
'店铺名称': 'varchar(255)',
|
3252
|
-
'推广渠道': 'varchar(100)',
|
3253
|
-
'营销场景': 'varchar(100)',
|
3254
|
-
'商品id': 'bigint',
|
3255
|
-
'花费': 'decimal(12,2)',
|
3256
|
-
'展现量': 'int',
|
3257
|
-
'点击量': 'int',
|
3258
|
-
'加购量': 'int',
|
3259
|
-
'成交笔数': 'int',
|
3260
|
-
'成交金额': 'decimal(12,2)',
|
3261
|
-
'直接成交笔数': 'int',
|
3262
|
-
'直接成交金额': 'decimal(12,2)',
|
3263
|
-
'自然流量曝光量': 'int',
|
3264
|
-
}
|
3265
|
-
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore')
|
3266
|
-
return df, {
|
3267
|
-
'db_name': db_name,
|
3268
|
-
'table_name': table_name,
|
3269
|
-
'set_typ': set_typ,
|
3270
|
-
'primary_keys': [], # 创建唯一主键
|
3271
|
-
'check_duplicate': False, # 检查重复数据
|
3272
|
-
'duplicate_columns': [], # 指定排重的组合键
|
3273
|
-
'update_on_duplicate': True, # 更新旧数据
|
3274
|
-
'allow_null': False, # 允许插入空值
|
3275
|
-
'partition_by': None, # 分表方式
|
3276
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
3277
|
-
'indexes': [], # 普通索引列
|
3278
|
-
'transaction_mode': 'batch', # 事务模式
|
3279
|
-
'unique_keys': [['日期', '店铺名称', '推广渠道', '营销场景', '商品id']], # 唯一约束列表
|
3280
|
-
}
|
3281
|
-
|
3282
|
-
|
3283
|
-
def get_day_of_month(num):
|
3284
|
-
"""
|
3285
|
-
num: 获取n月以前的第一天和最后一天, num=0时, 返回当月第一天和最后一天
|
3286
|
-
"""
|
3287
|
-
_today = datetime.date.today()
|
3288
|
-
months_ago = _today - relativedelta(months=num) # n 月以前的今天
|
3289
|
-
_, _lastDay = calendar.monthrange(months_ago.year, months_ago.month) # 返回月的第一天的星期和当月总天数
|
3290
|
-
_firstDay = datetime.date(months_ago.year, months_ago.month, day=1).strftime('%Y-%m-%d')
|
3291
|
-
_lastDay = datetime.date(months_ago.year, months_ago.month, day=_lastDay).strftime('%Y-%m-%d')
|
3292
|
-
return _firstDay, _lastDay
|
3293
|
-
|
3294
|
-
|
3295
|
-
@upload_data_decorator()
|
3296
|
-
def date_table():
|
3297
|
-
"""
|
3298
|
-
生成 pbix 使用的日期表
|
3299
|
-
"""
|
3300
|
-
start_date = '2022-01-07' # 日期表的起始日期
|
3301
|
-
yesterday = time.strftime('%Y-%m-%d', time.localtime(time.time() - 86400))
|
3302
|
-
dic = pd.date_range(start=start_date, end=yesterday)
|
3303
|
-
df = pd.DataFrame(dic, columns=['日期'])
|
3304
|
-
df.sort_values('日期', ascending=True, ignore_index=True, inplace=True)
|
3305
|
-
df.reset_index(inplace=True)
|
3306
|
-
# inplace 添加索引到 df
|
3307
|
-
p = df.pop('index')
|
3308
|
-
df['月2'] = df['日期']
|
3309
|
-
df['月2'] = df['月2'].dt.month
|
3310
|
-
df['日期'] = df['日期'].dt.date # 日期格式保留年月日,去掉时分秒
|
3311
|
-
df['年'] = df['日期'].apply(lambda x: str(x).split('-')[0] + '年')
|
3312
|
-
df['月'] = df['月2'].apply(lambda x: str(x) + '月')
|
3313
|
-
# df.drop('月2', axis=1, inplace=True)
|
3314
|
-
mon = df.pop('月2')
|
3315
|
-
df['日'] = df['日期'].apply(lambda x: str(x).split('-')[2])
|
3316
|
-
df['年月'] = df.apply(lambda x: x['年'] + x['月'], axis=1)
|
3317
|
-
df['月日'] = df.apply(lambda x: x['月'] + x['日'] + '日', axis=1)
|
3318
|
-
df['第n周'] = df['日期'].apply(lambda x: x.strftime('第%W周'))
|
3319
|
-
|
3320
|
-
# 重构 df,添加 1 列,从周五~下周四作为 1 周 汇总
|
3321
|
-
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore') # 转换日期列
|
3322
|
-
grouped = df.groupby(pd.Grouper(key='日期', freq='7D'))
|
3323
|
-
__res = []
|
3324
|
-
num = 1
|
3325
|
-
for name, group in grouped:
|
3326
|
-
if num > 52:
|
3327
|
-
num = 1
|
3328
|
-
group['第n周_new'] = f'第{num}周'
|
3329
|
-
num += 1
|
3330
|
-
__res.append(group.copy())
|
3331
|
-
df = pd.concat(__res, ignore_index=True)
|
3332
|
-
df['weekname'] = df['日期'].dt.day_name()
|
3333
|
-
dict_dt = {
|
3334
|
-
'Monday': '星期一',
|
3335
|
-
'Tuesday': '星期二',
|
3336
|
-
'Wednesday': '星期三',
|
3337
|
-
'Thursday': '星期四',
|
3338
|
-
'Friday': '星期五',
|
3339
|
-
'Saturday': '星期六',
|
3340
|
-
'Sunday': '星期日',
|
3341
|
-
}
|
3342
|
-
df['星期'] = df['weekname'].apply(lambda x: dict_dt[x])
|
3343
|
-
df['索引'] = p
|
3344
|
-
df['月索引'] = mon
|
3345
|
-
df.sort_values('日期', ascending=False, ignore_index=True, inplace=True)
|
3346
|
-
df = df.reset_index(drop=True)
|
3347
|
-
df = df.reset_index(drop=False)
|
3348
|
-
df.rename(columns={'index': 'id'}, inplace=True)
|
3349
|
-
df['id'] = df['id'].apply(lambda x: x + 1)
|
3350
|
-
set_typ = SET_TYP_DICT['聚合数据_日期表']
|
3351
|
-
return df, {
|
3352
|
-
'db_name': '聚合数据',
|
3353
|
-
'table_name': '日期表',
|
3354
|
-
'set_typ': set_typ,
|
3355
|
-
'primary_keys': [], # 创建唯一主键
|
3356
|
-
'check_duplicate': False, # 检查重复数据
|
3357
|
-
'duplicate_columns': [], # 指定排重的组合键
|
3358
|
-
'update_on_duplicate': True, # 更新旧数据
|
3359
|
-
'allow_null': False, # 允许插入空值
|
3360
|
-
'partition_by': None, # 分表方式
|
3361
|
-
'partition_date_column': '日期', # 用于分表的日期列名,默认为'日期'
|
3362
|
-
'indexes': [], # 普通索引列
|
3363
|
-
'transaction_mode': 'batch', # 事务模式
|
3364
|
-
'unique_keys': [['日期']], # 唯一约束列表
|
3365
|
-
}
|
3366
|
-
|
3367
|
-
|
3368
|
-
def query1(months=1, download_manager=None):
|
3369
|
-
msdq = MysqlDatasQuery(download_manager=download_manager) # 实例化数据处理类
|
3370
|
-
msdq.months = months # 设置数据周期, 1 表示近 2 个月
|
3371
|
-
# 依赖表 -- >>
|
3372
|
-
msdq.tg_wxt(db_name='聚合数据', table_name='天猫_主体报表')
|
3373
|
-
msdq.tg_cjzb(db_name='聚合数据', table_name='天猫_超级直播')
|
3374
|
-
msdq.pxb_zh(db_name='聚合数据', table_name='天猫_品销宝账户报表')
|
3375
|
-
# 依赖表 << --
|
3376
|
-
|
3377
|
-
msdq.syj(db_name='聚合数据', table_name='生意经_宝贝指标')
|
3378
|
-
msdq.idbm(db_name='聚合数据', table_name='商品id编码表')
|
3379
|
-
msdq.sp_picture(db_name='聚合数据', table_name='商品id图片对照表')
|
3380
|
-
msdq.sp_cost(db_name='聚合数据', table_name='商品成本')
|
3381
|
-
msdq.jdjzt(db_name='聚合数据', table_name='京东_京准通')
|
3382
|
-
msdq.sku_sales(db_name='聚合数据', table_name='京东_sku_商品明细')
|
3383
|
-
|
3384
|
-
msdq._ald_wxt(db_name='聚合数据', table_name='奥莱店_主体报表')
|
3385
|
-
msdq._sj_wxt(db_name='聚合数据', table_name='圣积天猫店_主体报表')
|
3386
|
-
msdq._tb_wxt(db_name='聚合数据', table_name='淘宝_主体报表')
|
3387
|
-
msdq.jdqzyx(db_name='聚合数据', table_name='京东_京准通_全站营销')
|
3388
|
-
msdq.spu_sales(db_name='聚合数据', table_name='京东_spu_商品明细')
|
3389
|
-
msdq.zb_ccfx(db_name='聚合数据', table_name='生意参谋_直播场次分析')
|
3390
|
-
msdq.tg_by_day(db_name='聚合数据', table_name='多店推广场景_按日聚合')
|
3391
|
-
msdq.performance_concat(bb_tg=False, db_name='聚合数据', table_name='天猫_推广汇总') # _推广商品销售
|
3392
|
-
|
3393
|
-
|
3394
|
-
def query2(months=1, download_manager=None):
|
3395
|
-
msdq = MysqlDatasQuery(download_manager=download_manager) # 实例化数据处理类
|
3396
|
-
msdq.months = months # 设置数据周期, 1 表示近 2 个月
|
3397
|
-
msdq.dplyd(db_name='聚合数据', table_name='店铺流量来源构成')
|
3398
|
-
msdq.tg_rqbb(db_name='聚合数据', table_name='天猫_人群报表')
|
3399
|
-
msdq.tg_gjc(db_name='聚合数据', table_name='天猫_关键词报表')
|
3400
|
-
msdq.jd_gjc(db_name='聚合数据', table_name='京东_关键词报表')
|
3401
|
-
msdq.se_search(db_name='聚合数据', table_name='天猫店铺来源_手淘搜索')
|
3402
|
-
# sdq.aikucun_bd_spu(db_name='聚合数据', table_name='爱库存_商品spu榜单')
|
3403
|
-
msdq.dmp_crowd(db_name='聚合数据', table_name='达摩盘_人群报表')
|
3404
|
-
msdq.deeplink(db_name='聚合数据', table_name='达摩盘_deeplink人群洞察')
|
3405
|
-
msdq.global_insights(db_name='聚合数据', table_name='全域洞察')
|
3406
|
-
|
3407
|
-
|
3408
|
-
def query3(months=1, download_manager=None):
|
3409
|
-
msdq = MysqlDatasQuery(download_manager=download_manager) # 实例化数据处理类
|
3410
|
-
msdq.months = months # 设置数据周期, 1 表示近 2 个月
|
3411
|
-
msdq.spph(db_name='聚合数据', table_name='天猫_商品排行')
|
3412
|
-
msdq.item_up(db_name='聚合数据', table_name='淘宝店铺货品')
|
3413
|
-
|
3414
|
-
|
3415
|
-
def main(months=3):
|
3416
|
-
logger.info('数据聚合任务开始')
|
3417
|
-
# 1. 更新日期表 更新货品年份基准表, 属性设置 3 - 货品年份基准
|
3418
|
-
date_table()
|
3419
|
-
# 2. 数据聚合
|
3420
|
-
db_config = {
|
3421
|
-
'username': username,
|
3422
|
-
'password': password,
|
3423
|
-
'host': host,
|
3424
|
-
'port': int(port),
|
3425
|
-
'pool_size': 20,
|
3426
|
-
'mincached': 5,
|
3427
|
-
'maxcached': 10,
|
3428
|
-
}
|
3429
|
-
with s_query.QueryDatas(**db_config) as download_manager:
|
3430
|
-
query1(download_manager=download_manager, months=months)
|
3431
|
-
query2(download_manager=download_manager, months=months)
|
3432
|
-
query3(download_manager=download_manager, months=months)
|
3433
|
-
|
3434
|
-
logger.info('数据聚合完成')
|
3435
|
-
|
3436
|
-
|
3437
|
-
if __name__ == '__main__':
|
3438
|
-
# main(months=3)
|
3439
|
-
pass
|
3440
|
-
|
3441
|
-
db_config = {
|
3442
|
-
'username': username,
|
3443
|
-
'password': password,
|
3444
|
-
'host': host,
|
3445
|
-
'port': int(port),
|
3446
|
-
'pool_size': 20,
|
3447
|
-
'mincached': 5,
|
3448
|
-
'maxcached': 10,
|
3449
|
-
}
|
3450
|
-
with s_query.QueryDatas(**db_config) as download_manager:
|
3451
|
-
# shdq = ShopDataQuery(download_manager=download_manager)
|
3452
|
-
# shdq.months = 1
|
3453
|
-
# shdq.shops_concat(db_name='聚合数据', table_name='多店聚合_日报')
|
3454
|
-
|
3455
|
-
query1(download_manager=download_manager, months=1)
|