mdbq 3.3.0__py3-none-any.whl → 3.3.1__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.
@@ -1,2423 +0,0 @@
1
- # -*- coding: UTF-8 –*-
2
- import re
3
- import socket
4
- from mdbq.mongo import mongo
5
- from mdbq.mysql import mysql
6
- from mdbq.mysql import s_query
7
- from mdbq.aggregation import optimize_data
8
- from mdbq.config import myconfig
9
- from mdbq.config import products
10
- import datetime
11
- from dateutil.relativedelta import relativedelta
12
- import pandas as pd
13
- import numpy as np
14
- from functools import wraps
15
- import platform
16
- import getpass
17
- import json
18
- import os
19
- import time
20
-
21
- """
22
- 程序用于下载数据库(调用 s_query.py 下载并清洗), 并对数据进行聚合清洗, 不会更新数据库信息;
23
-
24
- 添加新库流程:
25
- 1. 在 MysqlDatasQuery 类中创建函数,从数据库取出数据
26
- 2. 在 GroupBy 类中创建函数,处理聚合数据
27
- 3. 在 data_aggregation 类中添加 data_dict 字典键值,回传数据到数据库
28
-
29
- """
30
- username, password, host, port, service_database = None, None, None, None, None,
31
- if socket.gethostname() in ['xigua_lx', 'xigua1', 'MacBookPro']:
32
- conf = myconfig.main()
33
- conf_data = conf['Windows']['xigua_lx']['mysql']['local']
34
- username, password, host, port = conf_data['username'], conf_data['password'], conf_data['host'], conf_data['port']
35
- service_database = {'xigua_lx': 'mysql'}
36
- elif socket.gethostname() in ['company', 'Mac2.local']:
37
- conf = myconfig.main()
38
- conf_data = conf['Windows']['company']['mysql']['local']
39
- username, password, host, port = conf_data['username'], conf_data['password'], conf_data['host'], conf_data['port']
40
- service_database = {'company': 'mysql'}
41
- if not username:
42
- print(f'找不到主机:')
43
-
44
-
45
-
46
-
47
- class MongoDatasQuery:
48
- """
49
- 从 数据库 中下载数据
50
- self.output: 数据库默认导出目录
51
- self.is_maximize: 是否最大转化数据
52
- """
53
- def __init__(self, target_service):
54
- # target_service 从哪个服务器下载数据
55
- self.months = 0 # 下载几个月数据, 0 表示当月, 1 是上月 1 号至今
56
- # 实例化一个下载类
57
- self.download = mongo.DownMongo(username=username, password=password, host=host, port=port, save_path=None)
58
-
59
- def tg_wxt(self):
60
- self.download.start_date, self.download.end_date = self.months_data(num=self.months)
61
- projection = {
62
- '日期': 1,
63
- '场景名字': 1,
64
- '主体id': 1,
65
- '花费': 1,
66
- '展现量': 1,
67
- '点击量': 1,
68
- '总购物车数': 1,
69
- '总成交笔数': 1,
70
- '总成交金额': 1,
71
- '自然流量曝光量': 1,
72
- '直接成交笔数': 1,
73
- '直接成交金额': 1,
74
- }
75
- df = self.download.data_to_df(
76
- db_name='推广数据2',
77
- collection_name='主体报表',
78
- projection=projection,
79
- )
80
- return df
81
-
82
- @staticmethod
83
- def days_data(days, end_date=None):
84
- """ 读取近 days 天的数据 """
85
- if not end_date:
86
- end_date = datetime.datetime.now()
87
- start_date = end_date - datetime.timedelta(days=days)
88
- return pd.to_datetime(start_date), pd.to_datetime(end_date)
89
-
90
- @staticmethod
91
- def months_data(num=0, end_date=None):
92
- """ 读取近 num 个月的数据, 0 表示读取当月的数据 """
93
- if not end_date:
94
- end_date = datetime.datetime.now()
95
- start_date = end_date - relativedelta(months=num) # n 月以前的今天
96
- start_date = f'{start_date.year}-{start_date.month}-01' # 替换为 n 月以前的第一天
97
- return pd.to_datetime(start_date), pd.to_datetime(end_date)
98
-
99
-
100
- class MysqlDatasQuery:
101
- """
102
- 从数据库中下载数据
103
- """
104
- def __init__(self):
105
- # target_service 从哪个服务器下载数据
106
- self.months = 0 # 下载几个月数据, 0 表示当月, 1 是上月 1 号至今
107
- # 实例化一个下载类
108
- self.download = s_query.QueryDatas(username=username, password=password, host=host, port=port)
109
-
110
- @staticmethod
111
- def try_except(func): # 在类内部定义一个异常处理方法
112
- @wraps(func)
113
- def wrapper(*args, **kwargs):
114
- try:
115
- return func(*args, **kwargs)
116
- except Exception as e:
117
- print(f'{func.__name__}, {e}') # 将异常信息返回
118
-
119
- return wrapper
120
-
121
- @try_except
122
- def tg_wxt(self):
123
- start_date, end_date = self.months_data(num=self.months)
124
- projection = {
125
- '日期': 1,
126
- '场景名字': 1,
127
- '主体id': 1,
128
- '花费': 1,
129
- '展现量': 1,
130
- '点击量': 1,
131
- '总购物车数': 1,
132
- '总成交笔数': 1,
133
- '总成交金额': 1,
134
- '自然流量曝光量': 1,
135
- '直接成交笔数': 1,
136
- '直接成交金额': 1,
137
- '店铺名称': 1,
138
- }
139
- df = self.download.data_to_df(
140
- db_name='推广数据2',
141
- table_name='主体报表',
142
- start_date=start_date,
143
- end_date=end_date,
144
- projection=projection,
145
- )
146
- return df
147
-
148
- @try_except
149
- def syj(self):
150
- start_date, end_date = self.months_data(num=self.months)
151
- projection = {
152
- '日期': 1,
153
- '宝贝id': 1,
154
- '商家编码': 1,
155
- '行业类目': 1,
156
- '销售额': 1,
157
- '销售量': 1,
158
- '订单数': 1,
159
- '退货量': 1,
160
- '退款额': 1,
161
- '退款额_发货后': 1,
162
- '退货量_发货后': 1,
163
- '店铺名称': 1,
164
- }
165
- df = self.download.data_to_df(
166
- db_name='生意经3',
167
- table_name='宝贝指标',
168
- start_date=start_date,
169
- end_date=end_date,
170
- projection=projection,
171
- )
172
- return df
173
-
174
- @try_except
175
- def tg_rqbb(self):
176
- start_date, end_date = self.months_data(num=self.months)
177
- projection = {
178
- '日期': 1,
179
- '场景名字': 1,
180
- '主体id': 1,
181
- '花费': 1,
182
- '展现量': 1,
183
- '点击量': 1,
184
- '总购物车数': 1,
185
- '总成交笔数': 1,
186
- '总成交金额': 1,
187
- '直接成交笔数': 1,
188
- '直接成交金额': 1,
189
- '人群名字': 1,
190
- '店铺名称': 1,
191
- }
192
- df = self.download.data_to_df(
193
- db_name='推广数据2',
194
- table_name='人群报表',
195
- start_date=start_date,
196
- end_date=end_date,
197
- projection=projection,
198
- )
199
- return df
200
-
201
- @try_except
202
- def tg_gjc(self):
203
- start_date, end_date = self.months_data(num=self.months)
204
- projection = {
205
- '日期': 1,
206
- '场景名字': 1,
207
- '宝贝id': 1,
208
- '词类型': 1,
209
- '词名字_词包名字': 1,
210
- '花费': 1,
211
- '展现量': 1,
212
- '点击量': 1,
213
- '总购物车数': 1,
214
- '总成交笔数': 1,
215
- '总成交金额': 1,
216
- '直接成交笔数': 1,
217
- '直接成交金额': 1,
218
- '店铺名称': 1,
219
- }
220
- df = self.download.data_to_df(
221
- db_name='推广数据2',
222
- table_name='关键词报表',
223
- start_date=start_date,
224
- end_date=end_date,
225
- projection=projection,
226
- )
227
- return df
228
-
229
- @try_except
230
- def tg_cjzb(self):
231
- start_date, end_date = self.months_data(num=self.months)
232
- projection = {
233
- '日期': 1,
234
- '场景名字': 1,
235
- '人群名字': 1,
236
- '计划名字': 1,
237
- '花费': 1,
238
- '展现量': 1,
239
- '进店量': 1,
240
- '粉丝关注量': 1,
241
- '观看次数': 1,
242
- '总购物车数': 1,
243
- '总成交笔数': 1,
244
- '总成交金额': 1,
245
- '直接成交笔数': 1,
246
- '直接成交金额': 1,
247
- '店铺名称': 1,
248
- }
249
- df = self.download.data_to_df(
250
- db_name='推广数据2',
251
- table_name='超级直播报表_人群',
252
- start_date=start_date,
253
- end_date=end_date,
254
- projection=projection,
255
- )
256
- return df
257
-
258
- @try_except
259
- def pxb_zh(self):
260
- start_date, end_date = self.months_data(num=self.months)
261
- projection = {
262
- '日期': 1,
263
- '报表类型': 1,
264
- '搜索量': 1,
265
- '搜索访客数': 1,
266
- '展现量': 1,
267
- # '自然流量增量曝光': 1,
268
- '消耗': 1,
269
- '点击量': 1,
270
- '宝贝加购数': 1,
271
- '成交笔数': 1,
272
- '成交金额': 1,
273
- # '成交访客数': 1
274
- '店铺名称': 1,
275
- }
276
- df = self.download.data_to_df(
277
- db_name='推广数据2',
278
- table_name='品销宝',
279
- start_date=start_date,
280
- end_date=end_date,
281
- projection=projection,
282
- )
283
- return df
284
-
285
- @try_except
286
- def idbm(self):
287
- """ 用生意经日数据制作商品 id 和编码对照表 """
288
- data_values = self.download.columns_to_list(
289
- db_name='生意经3',
290
- table_name='宝贝指标',
291
- columns_name=['宝贝id', '商家编码', '行业类目'],
292
- )
293
- df = pd.DataFrame(data=data_values)
294
- return df
295
-
296
- @try_except
297
- def sp_picture(self):
298
- """ 用生意经日数据制作商品 id 和编码对照表 """
299
- data_values = self.download.columns_to_list(
300
- db_name='属性设置3',
301
- table_name='商品素材中心',
302
- columns_name=['日期', '商品id', '商品白底图', '方版场景图'],
303
- )
304
- df = pd.DataFrame(data=data_values)
305
- return df
306
-
307
- @try_except
308
- def dplyd(self):
309
- """ 新旧版取的字段是一样的 """
310
- start_date, end_date = self.months_data(num=self.months)
311
- projection = {
312
- '日期': 1,
313
- '一级来源': 1,
314
- '二级来源': 1,
315
- '三级来源': 1,
316
- '访客数': 1,
317
- '支付金额': 1,
318
- '支付买家数': 1,
319
- '支付转化率': 1,
320
- '加购人数': 1,
321
- '店铺名称': 1,
322
- }
323
- df = self.download.data_to_df(
324
- db_name='生意参谋3',
325
- table_name='店铺流量来源构成',
326
- start_date=start_date,
327
- end_date=end_date,
328
- projection=projection,
329
- )
330
- # df = df[df['店铺名称'] == '万里马官方旗舰店']
331
- return df
332
-
333
- @try_except
334
- def dplyd_old(self):
335
- start_date, end_date = self.months_data(num=self.months)
336
- projection = {
337
- '日期': 1,
338
- '一级来源': 1,
339
- '二级来源': 1,
340
- '三级来源': 1,
341
- '访客数': 1,
342
- '支付金额': 1,
343
- '支付买家数': 1,
344
- '支付转化率': 1,
345
- '加购人数': 1,
346
- }
347
- df = self.download.data_to_df(
348
- db_name='生意参谋2',
349
- table_name='店铺来源_日数据_旧版',
350
- start_date=start_date,
351
- end_date=end_date,
352
- projection=projection,
353
- )
354
- return df
355
-
356
- @try_except
357
- def sp_cost(self):
358
- """ 电商定价 """
359
- data_values = self.download.columns_to_list(
360
- db_name='属性设置3',
361
- table_name='电商定价',
362
- columns_name=['日期', '款号', '年份季节', '吊牌价', '商家平台', '成本价', '天猫页面价', '天猫中促价'],
363
- )
364
- df = pd.DataFrame(data=data_values)
365
- return df
366
-
367
- @try_except
368
- def jdjzt(self):
369
- start_date, end_date = self.months_data(num=self.months)
370
- projection = {
371
- '日期': 1,
372
- '产品线': 1,
373
- '触发sku_id': 1,
374
- '跟单sku_id': 1,
375
- '花费': 1,
376
- '展现数': 1,
377
- '点击数': 1,
378
- '直接订单行': 1,
379
- '直接订单金额': 1,
380
- '总订单行': 1,
381
- '总订单金额': 1,
382
- '直接加购数': 1,
383
- '总加购数': 1,
384
- 'spu_id': 1,
385
- '店铺名称':1,
386
- }
387
- df = self.download.data_to_df(
388
- db_name='京东数据3',
389
- table_name='推广数据_京准通',
390
- start_date=start_date,
391
- end_date=end_date,
392
- projection=projection,
393
- )
394
- return df
395
-
396
- @try_except
397
- def jdqzyx(self):
398
- start_date, end_date = self.months_data(num=self.months)
399
- projection = {
400
- '日期': 1,
401
- '产品线': 1,
402
- '花费': 1,
403
- '全站投产比': 1,
404
- '全站交易额': 1,
405
- '全站订单行': 1,
406
- '全站订单成本': 1,
407
- '全站费比': 1,
408
- '核心位置展现量': 1,
409
- '核心位置点击量': 1,
410
- }
411
- df = self.download.data_to_df(
412
- db_name='京东数据3',
413
- table_name='推广数据_全站营销', # 暂缺
414
- start_date=start_date,
415
- end_date=end_date,
416
- projection=projection,
417
- )
418
- return df
419
-
420
- @try_except
421
- def jd_gjc(self):
422
- start_date, end_date = self.months_data(num=self.months)
423
- projection = {
424
- '日期': 1,
425
- '产品线': 1,
426
- '计划类型': 1,
427
- '计划id': 1,
428
- '推广计划': 1,
429
- '搜索词': 1,
430
- '关键词': 1,
431
- '关键词购买类型': 1,
432
- '广告定向类型': 1,
433
- '花费': 1,
434
- '展现数': 1,
435
- '点击数': 1,
436
- '直接订单行': 1,
437
- '直接订单金额': 1,
438
- '总订单行': 1,
439
- '总订单金额': 1,
440
- '总加购数': 1,
441
- '领券数': 1,
442
- '商品关注数': 1,
443
- '店铺关注数': 1,
444
- }
445
- df = self.download.data_to_df(
446
- db_name='京东数据3',
447
- table_name='推广数据_关键词报表',
448
- start_date=start_date,
449
- end_date=end_date,
450
- projection=projection,
451
- )
452
- return df
453
-
454
- @try_except
455
- def sku_sales(self):
456
- start_date, end_date = self.months_data(num=self.months)
457
- projection = {
458
- '日期': 1,
459
- '商品id': 1,
460
- '货号': 1,
461
- '成交单量': 1,
462
- '成交金额': 1,
463
- '访客数': 1,
464
- '成交客户数': 1,
465
- '加购商品件数': 1,
466
- '加购人数': 1,
467
- }
468
- df = self.download.data_to_df(
469
- db_name='京东数据3',
470
- table_name='京东商智_sku_商品明细',
471
- start_date=start_date,
472
- end_date=end_date,
473
- projection=projection,
474
- )
475
- return df
476
-
477
- @try_except
478
- def spu_sales(self):
479
- start_date, end_date = self.months_data(num=self.months)
480
- projection = {
481
- '日期': 1,
482
- '商品id': 1,
483
- '货号': 1,
484
- '成交单量': 1,
485
- '成交金额': 1,
486
- '访客数': 1,
487
- '成交客户数': 1,
488
- '加购商品件数': 1,
489
- '加购人数': 1,
490
- }
491
- df = self.download.data_to_df(
492
- db_name='京东数据3',
493
- table_name='京东商智_spu_商品明细',
494
- start_date=start_date,
495
- end_date=end_date,
496
- projection=projection,
497
- )
498
- return df
499
-
500
- @staticmethod
501
- def months_data(num=0, end_date=None):
502
- """ 读取近 num 个月的数据, 0 表示读取当月的数据 """
503
- if not end_date:
504
- end_date = datetime.datetime.now()
505
- start_date = end_date - relativedelta(months=num) # n 月以前的今天
506
- start_date = f'{start_date.year}-{start_date.month}-01' # 替换为 n 月以前的第一天
507
- return pd.to_datetime(start_date), pd.to_datetime(end_date)
508
-
509
- @try_except
510
- def se_search(self):
511
- start_date, end_date = self.months_data(num=self.months)
512
- projection = {
513
- '日期': 1,
514
- '店铺名称': 1,
515
- '搜索词': 1,
516
- '词类型': 1,
517
- '访客数': 1,
518
- '加购人数': 1,
519
- '商品收藏人数': 1,
520
- '支付转化率': 1,
521
- '支付买家数': 1,
522
- '支付金额': 1,
523
- '新访客': 1,
524
- '客单价': 1,
525
- 'uv价值': 1,
526
- }
527
- df = self.download.data_to_df(
528
- db_name='生意参谋3',
529
- table_name='手淘搜索_本店引流词',
530
- start_date=start_date,
531
- end_date=end_date,
532
- projection=projection,
533
- )
534
- return df
535
-
536
- @try_except
537
- def zb_ccfx(self):
538
- start_date, end_date = self.months_data(num=self.months)
539
- projection = {
540
- # '日期': 1,
541
- # '店铺': 1,
542
- # '场次信息': 1,
543
- # '场次id': 1,
544
- # '直播开播时间': 1,
545
- # '开播时长': 1,
546
- # '封面图点击率': 1,
547
- # '观看人数': 1,
548
- # '观看次数': 1,
549
- # '新增粉丝数': 1,
550
- # '流量券消耗': 1,
551
- # '观看总时长(秒)': 1,
552
- # '人均观看时长(秒)': 1,
553
- # '次均观看时长(秒)': 1,
554
- # '商品点击人数': 1,
555
- # '商品点击次数': 1,
556
- # '商品点击率': 1,
557
- # '加购人数': 1,
558
- # '加购件数': 1,
559
- # '加购次数': 1,
560
- # '成交金额(元)': 1,
561
- # '成交人数': 1,
562
- # '成交件数': 1,
563
- # '成交笔数': 1,
564
- # '成交转化率': 1,
565
- # '退款人数': 1,
566
- # '退款笔数': 1,
567
- # '退款件数': 1,
568
- # '退款金额': 1,
569
- # '预售定金支付金额': 1,
570
- # '预售预估总金额': 1,
571
- # '店铺名称': 1,
572
- }
573
- df = self.download.data_to_df(
574
- db_name='生意参谋3',
575
- table_name='直播分场次效果',
576
- start_date=start_date,
577
- end_date=end_date,
578
- projection=projection,
579
- )
580
- return df
581
-
582
- # @try_except
583
- def tg_by_day(self):
584
- """
585
- 汇总各个店铺的推广数据,按日汇总
586
- """
587
- start_date, end_date = self.months_data(num=self.months)
588
- projection = {
589
- '日期': 1,
590
- '场景名字': 1,
591
- '花费': 1,
592
- '展现量': 1,
593
- '点击量': 1,
594
- '总购物车数': 1,
595
- '总成交笔数': 1,
596
- '总成交金额': 1,
597
- '店铺名称': 1,
598
- }
599
- df_tm = self.download.data_to_df(
600
- db_name='推广数据2',
601
- table_name='营销场景报表',
602
- start_date=start_date,
603
- end_date=end_date,
604
- projection=projection,
605
- )
606
- df_tm.rename(columns={'场景名字': '营销场景'}, inplace=True)
607
- df_tm = df_tm.groupby(
608
- ['日期', '店铺名称', '营销场景', '花费'],
609
- as_index=False).agg(
610
- **{
611
- '展现量': ('展现量', np.max),
612
- '点击量': ('点击量', np.max),
613
- '加购量': ('总购物车数', np.max),
614
- '成交笔数': ('总成交笔数', np.max),
615
- '成交金额': ('总成交金额', np.max)
616
- }
617
- )
618
-
619
- df_tb = self.download.data_to_df(
620
- db_name='推广数据_淘宝店',
621
- table_name='营销场景报表',
622
- start_date=start_date,
623
- end_date=end_date,
624
- projection=projection,
625
- )
626
- # print(df_tb)
627
- # df_tm.to_csv('/Users/xigua/Downloads/test2.csv', index=False, header=True, encoding='utf-8_sig')
628
- # df_tb.to_csv('/Users/xigua/Downloads/test.csv', index=False, header=True, encoding='utf-8_sig')
629
- df_tb.rename(columns={'场景名字': '营销场景'}, inplace=True)
630
- df_tb = df_tb.groupby(
631
- ['日期', '店铺名称', '营销场景', '花费'],
632
- as_index=False).agg(
633
- **{
634
- '展现量': ('展现量', np.max),
635
- '点击量': ('点击量', np.max),
636
- '加购量': ('总购物车数', np.max),
637
- '成交笔数': ('总成交笔数', np.max),
638
- '成交金额': ('总成交金额', np.max)
639
- }
640
- )
641
-
642
- projection = {
643
- '日期': 1,
644
- '报表类型': 1,
645
- '消耗': 1,
646
- '展现量': 1,
647
- '点击量': 1,
648
- '宝贝加购数': 1,
649
- '成交笔数': 1,
650
- '成交金额': 1,
651
- '店铺名称': 1,
652
- }
653
- df_tm_pxb = self.download.data_to_df(
654
- db_name='推广数据2',
655
- table_name='品销宝',
656
- start_date=start_date,
657
- end_date=end_date,
658
- projection=projection,
659
- )
660
- df_tm_pxb = df_tm_pxb[df_tm_pxb['报表类型'] == '账户']
661
- df_tm_pxb = df_tm_pxb.groupby(
662
- ['日期', '店铺名称', '报表类型', '消耗'],
663
- as_index=False).agg(
664
- **{
665
- '展现量': ('展现量', np.max),
666
- '点击量': ('点击量', np.max),
667
- '加购量': ('宝贝加购数', np.max),
668
- '成交笔数': ('成交笔数', np.max),
669
- '成交金额': ('成交金额', np.max)
670
- }
671
- )
672
- df_tm_pxb.rename(columns={'报表类型': '营销场景', '消耗': '花费'}, inplace=True)
673
- df_tm_pxb['营销场景'] = '品销宝'
674
-
675
- # 因为 2024.04.16及之前的营销场景报表不含超级直播,所以在此添加
676
- if start_date < pd.to_datetime('2024-04-17'):
677
- projection = {
678
- '日期': 1,
679
- '场景名字': 1,
680
- '花费': 1,
681
- '展现量': 1,
682
- '观看次数': 1,
683
- '总购物车数': 1,
684
- '总成交笔数': 1,
685
- '总成交金额': 1,
686
- '店铺名称': 1,
687
- }
688
- df_tm_living = self.download.data_to_df(
689
- db_name='推广数据2',
690
- table_name='超级直播报表_人群',
691
- start_date=start_date,
692
- end_date=pd.to_datetime('2024-04-16'), # 只可以取此日期之前的数据
693
- projection=projection,
694
- )
695
- if len(df_tm_living) > 0:
696
- df_tm_living.rename(columns={'场景名字': '营销场景'}, inplace=True)
697
- df_tm_living = df_tm_living.groupby(
698
- ['日期', '店铺名称', '营销场景', '花费'],
699
- as_index=False).agg(
700
- **{
701
- '展现量': ('展现量', np.max),
702
- '点击量': ('观看次数', np.max),
703
- '加购量': ('总购物车数', np.max),
704
- '成交笔数': ('总成交笔数', np.max),
705
- '成交金额': ('总成交金额', np.max)
706
- }
707
- )
708
- else:
709
- df_tm_living = pd.DataFrame()
710
- else:
711
- df_tm_living = pd.DataFrame()
712
-
713
- projection = {
714
- '日期': 1,
715
- '产品线': 1,
716
- '触发sku_id': 1,
717
- '跟单sku_id': 1,
718
- '花费': 1,
719
- '展现数': 1,
720
- '点击数': 1,
721
- '直接订单行': 1,
722
- '直接订单金额': 1,
723
- '总订单行': 1,
724
- '总订单金额': 1,
725
- '直接加购数': 1,
726
- '总加购数': 1,
727
- 'spu_id': 1,
728
- '店铺名称': 1,
729
- }
730
- df_jd = self.download.data_to_df(
731
- db_name='京东数据3',
732
- table_name='推广数据_京准通',
733
- start_date=start_date,
734
- end_date=end_date,
735
- projection=projection,
736
- )
737
- df_jd = df_jd.groupby(['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', 'spu_id', '花费', '展现数', '点击数'],
738
- as_index=False).agg(
739
- **{'直接订单行': ('直接订单行', np.max),
740
- '直接订单金额': ('直接订单金额', np.max),
741
- '成交笔数': ('总订单行', np.max),
742
- '成交金额': ('总订单金额', np.max),
743
- '直接加购数': ('直接加购数', np.max),
744
- '加购量': ('总加购数', np.max),
745
- }
746
- )
747
- df_jd = df_jd[['日期', '店铺名称', '产品线', '花费', '展现数', '点击数', '加购量', '成交笔数', '成交金额']]
748
- df_jd.rename(columns={'产品线': '营销场景', '展现数': '展现量', '点击数': '点击量'}, inplace=True)
749
- df_jd = df_jd[df_jd['花费'] > 0]
750
-
751
- projection = {
752
- '日期': 1,
753
- '产品线': 1,
754
- '花费': 1,
755
- '全站投产比': 1,
756
- '全站交易额': 1,
757
- '全站订单行': 1,
758
- '全站订单成本': 1,
759
- '全站费比': 1,
760
- '核心位置展现量': 1,
761
- '核心位置点击量': 1,
762
- '店铺名称': 1,
763
- }
764
- df_jd_qzyx = self.download.data_to_df(
765
- db_name='京东数据3',
766
- table_name='推广数据_全站营销',
767
- start_date=start_date,
768
- end_date=end_date,
769
- projection=projection,
770
- )
771
- df_jd_qzyx = df_jd_qzyx.groupby(['日期', '店铺名称', '产品线', '花费'], as_index=False).agg(
772
- **{'全站投产比': ('全站投产比', np.max),
773
- '成交金额': ('全站交易额', np.max),
774
- '成交笔数': ('全站订单行', np.max),
775
- '全站订单成本': ('全站订单成本', np.max),
776
- '全站费比': ('全站费比', np.max),
777
- '展现量': ('核心位置展现量', np.max),
778
- '点击量': ('核心位置点击量', np.max),
779
- }
780
- )
781
- df_jd_qzyx.rename(columns={'产品线': '营销场景'}, inplace=True)
782
- df_jd_qzyx = df_jd_qzyx[['日期', '店铺名称', '营销场景', '花费', '展现量', '点击量', '成交笔数', '成交金额']]
783
- df_jd_qzyx = df_jd_qzyx[df_jd_qzyx['花费'] > 0]
784
-
785
- _datas = [item for item in [df_tm, df_tb, df_tm_pxb, df_tm_living, df_jd, df_jd_qzyx] if len(item) > 0] # 阻止空的 dataframe
786
- df = pd.concat(_datas, axis=0, ignore_index=True)
787
- return df
788
-
789
- @try_except
790
- def aikucun_bd_spu(self):
791
- start_date, end_date = self.months_data(num=self.months)
792
- projection = {
793
- '日期': 1,
794
- 'spi_id': 1,
795
- '商品名称': 1,
796
- '品牌名称': 1,
797
- '商品款号': 1,
798
- '一级类目名称': 1,
799
- '二级类目名称': 1,
800
- '三级类目名称': 1,
801
- '转发次数': 1,
802
- '转发爱豆人数': 1,
803
- '访客量': 1,
804
- '浏览量': 1,
805
- '下单gmv': 1,
806
- '成交gmv': 1,
807
- '供货额': 1,
808
- '供货价': 1,
809
- '销售爱豆人数_成交': 1,
810
- '支付人数_交易': 1,
811
- '支付人数_成交': 1,
812
- '销售量_成交': 1,
813
- '销售量_交易': 1,
814
- '订单数_成交': 1,
815
- '订单数_交易': 1,
816
- '成交率_交易': 1,
817
- '成交率_成交': 1,
818
- '可售库存数': 1,
819
- '售罄率': 1,
820
- '在架sku数': 1,
821
- '可售sku数': 1,
822
- 'sku数_交易': 1,
823
- 'sku数_成交': 1,
824
- '营销后供货额': 1,
825
- '营销后供货价': 1,
826
- '店铺名称': 1,
827
- }
828
- projection = {}
829
- df = self.download.data_to_df(
830
- db_name='爱库存2',
831
- table_name='商品spu榜单',
832
- start_date=start_date,
833
- end_date=end_date,
834
- projection=projection,
835
- )
836
- return df
837
-
838
- @try_except
839
- def dmp_crowd(self):
840
- start_date, end_date = self.months_data(num=self.months)
841
- projection = {
842
- '日期': 1,
843
- '人群id': 1,
844
- '人群规模': 1,
845
- '用户年龄': 1,
846
- '消费能力等级': 1,
847
- '用户性别': 1,
848
- }
849
- # projection = {}
850
- df_crowd = self.download.data_to_df(
851
- db_name='达摩盘3',
852
- table_name='我的人群属性',
853
- start_date=start_date,
854
- end_date=end_date,
855
- projection=projection,
856
- )
857
- df_crowd.sort_values('日期', ascending=True, ignore_index=True, inplace=True)
858
- df_crowd.drop_duplicates(subset=['人群id',], keep='last', inplace=True, ignore_index=True)
859
- df_crowd.pop('日期')
860
- df_crowd = df_crowd.astype({'人群id': 'int64'}, errors='ignore')
861
- projection = {}
862
- df_dmp = self.download.data_to_df(
863
- db_name='达摩盘3',
864
- table_name='dmp人群报表',
865
- start_date=start_date,
866
- end_date=end_date,
867
- projection=projection,
868
- )
869
- df_dmp = df_dmp.astype({'人群id': 'int64'}, errors='ignore')
870
- df_dmp.sort_values('日期', ascending=True, ignore_index=True, inplace=True)
871
- df_dmp.drop_duplicates(subset=['日期', '人群id', '消耗_元'], keep='last', inplace=True, ignore_index=True)
872
- df = pd.merge(df_dmp, df_crowd, left_on=['人群id'], right_on=['人群id'], how='left')
873
- # 清除一些不必要的字符
874
- df['用户年龄'] = df['用户年龄'].apply(lambda x: '~'.join(re.findall(r'^(\d+).*-(\d+)岁$', str(x))[0]) if '岁' in str(x) else x)
875
- df['消费能力等级'] = df['消费能力等级'].apply(lambda x: f'L{''.join(re.findall(r'(\d)', str(x)))}' if '购买力' in str(x) else x)
876
- # df.to_csv('/Users/xigua/Downloads/test3.csv', index=False, header=True, encoding='utf-8_sig')
877
- # breakpoint()
878
- df.rename(columns={'消耗_元': '消耗'}, inplace=True)
879
- return df
880
-
881
-
882
-
883
- class GroupBy:
884
- """
885
- 数据聚合和导出
886
- """
887
- def __init__(self):
888
- # self.output: 数据库默认导出目录
889
- if platform.system() == 'Darwin':
890
- self.output = os.path.join('/Users', getpass.getuser(), '数据中心/数据库导出')
891
- elif platform.system() == 'Windows':
892
- self.output = os.path.join('C:\\同步空间\\BaiduSyncdisk\\数据库导出')
893
- else:
894
- self.output = os.path.join('数据中心/数据库导出')
895
- self.data_tgyj = {} # 推广综合聚合数据表
896
- self.data_jdtg = {} # 京东推广数据,聚合数据
897
- self.sp_index_datas = pd.DataFrame() # 商品 id 索引表
898
-
899
- @staticmethod
900
- def try_except(func): # 在类内部定义一个异常处理方法
901
- @wraps(func)
902
- def wrapper(*args, **kwargs):
903
- try:
904
- return func(*args, **kwargs)
905
- except Exception as e:
906
- print(f'{func.__name__}, {e}') # 将异常信息返回
907
-
908
- return wrapper
909
-
910
- # @try_except
911
- def groupby(self, df, table_name, is_maximize=True):
912
- """
913
- self.is_maximize: 是否最大转化数据
914
- table_name: 聚合数据库处的名称,不是原始数据库
915
- """
916
- if isinstance(df, pd.DataFrame):
917
- if len(df) == 0:
918
- print(f' query_data.groupby 函数中 {table_name} 传入的 df 数据长度为0')
919
- self.data_tgyj.update(
920
- {
921
- table_name: pd.DataFrame(),
922
- }
923
- )
924
- return pd.DataFrame()
925
- # elif '多店推广场景_按日聚合' in table_name: # 这个函数传递的是多个 df 组成的列表,暂时放行
926
- # pass
927
- else:
928
- print(f'query_data.groupby函数中 {table_name} 传入的 df 不是 dataframe 结构')
929
- return pd.DataFrame()
930
- # print(table_name)
931
- if '天猫_主体报表' in table_name:
932
- df.rename(columns={
933
- '场景名字': '营销场景',
934
- '主体id': '商品id',
935
- '总购物车数': '加购量',
936
- '总成交笔数': '成交笔数',
937
- '总成交金额': '成交金额'
938
- }, inplace=True)
939
- df.fillna(0, inplace=True)
940
- df = df.astype({
941
- '商品id': str,
942
- '花费': float,
943
- '展现量': int,
944
- '点击量': int,
945
- '加购量': int,
946
- '成交笔数': int,
947
- '成交金额': float,
948
- '自然流量曝光量': int,
949
- '直接成交笔数': int,
950
- '直接成交金额': float,
951
- }, errors='raise')
952
- if is_maximize:
953
- df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量'], as_index=False).agg(
954
- **{'加购量': ('加购量', np.max),
955
- '成交笔数': ('成交笔数', np.max),
956
- '成交金额': ('成交金额', np.max),
957
- '自然流量曝光量': ('自然流量曝光量', np.max),
958
- '直接成交笔数': ('直接成交笔数', np.max),
959
- '直接成交金额': ('直接成交金额', np.max)
960
- }
961
- )
962
- else:
963
- df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量'], as_index=False).agg(
964
- **{
965
- '加购量': ('加购量', np.min),
966
- '成交笔数': ('成交笔数', np.min),
967
- '成交金额': ('成交金额', np.min),
968
- '自然流量曝光量': ('自然流量曝光量', np.min),
969
- '直接成交笔数': ('直接成交笔数', np.max),
970
- '直接成交金额': ('直接成交金额', np.max)
971
- }
972
- )
973
- df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
974
- df_new = df.groupby(['日期', '店铺名称', '商品id'], as_index=False).agg(
975
- **{
976
- '花费': ('花费', np.sum),
977
- '成交笔数': ('成交笔数', np.max),
978
- '成交金额': ('成交金额', np.max),
979
- '自然流量曝光量': ('自然流量曝光量', np.max),
980
- '直接成交笔数': ('直接成交笔数', np.max),
981
- '直接成交金额': ('直接成交金额', np.max)
982
- }
983
- )
984
- self.data_tgyj.update(
985
- {
986
- table_name: df_new,
987
- }
988
- )
989
- self.data_tgyj.update(
990
- {
991
- '天猫汇总表调用': df,
992
- }
993
- )
994
- # df_pic:商品排序索引表, 给 powerbi 中的主推款排序用的,(从上月1号到今天的总花费进行排序)
995
- today = datetime.date.today()
996
- last_month = today - datetime.timedelta(days=30)
997
- if last_month.month == 12:
998
- year_my = today.year - 1
999
- else:
1000
- year_my = today.year
1001
- # 截取 从上月1日 至 今天的花费数据, 推广款式按此数据从高到低排序(商品图+排序)
1002
- df_pic_lin = df[df['店铺名称'] == '万里马官方旗舰店']
1003
- df_pic = df_pic_lin.groupby(['日期', '商品id'], as_index=False).agg({'花费': 'sum'})
1004
- df_pic = df_pic[~df_pic['商品id'].isin([''])] # 指定列中删除包含空值的行
1005
- date_obj = datetime.datetime.strptime(f'{year_my}-{last_month.month}-01', '%Y-%m-%d').date()
1006
- df_pic = df_pic[(df_pic['日期'] >= date_obj)]
1007
- df_pic = df_pic.groupby(['商品id'], as_index=False).agg({'花费': 'sum'})
1008
- df_pic.sort_values('花费', ascending=False, ignore_index=True, inplace=True)
1009
- df_pic.reset_index(inplace=True)
1010
- df_pic['index'] = df_pic['index'] + 100
1011
- df_pic.rename(columns={'index': '商品索引'}, inplace=True)
1012
- df_pic_new = pd.merge(df_pic_lin, df_pic, how='left', on=['商品id'])
1013
- df_pic_new['商品索引'].fillna(1000, inplace=True)
1014
- self.sp_index_datas = df_pic_new[['商品id', '商品索引']] # 商品索引表_主推排序调用
1015
- return df
1016
- elif '商品索引表' in table_name:
1017
- return df
1018
- elif '爱库存_商品spu榜单' in table_name:
1019
- df.drop_duplicates(
1020
- subset=[
1021
- '日期',
1022
- '店铺名称',
1023
- 'spu_id',
1024
- '访客量',
1025
- '浏览量',
1026
- '下单gmv',
1027
- '成交gmv',
1028
- ], keep='last', inplace=True, ignore_index=True)
1029
- return df
1030
- elif '天猫_人群报表' in table_name and '达摩盘' not in table_name:
1031
- """
1032
- 天猫推广人群报表独立生成消费力、年龄层、分类等特征,不依赖于达摩盘数据表
1033
- """
1034
- df.rename(columns={
1035
- '场景名字': '营销场景',
1036
- '主体id': '商品id',
1037
- '总购物车数': '加购量',
1038
- '总成交笔数': '成交笔数',
1039
- '总成交金额': '成交金额'
1040
- }, inplace=True)
1041
- df.fillna(0, inplace=True)
1042
- df = df.astype({
1043
- '商品id': str,
1044
- '花费': float,
1045
- '展现量': int,
1046
- '点击量': int,
1047
- '加购量': int,
1048
- '成交笔数': int,
1049
- '成交金额': float,
1050
- '直接成交笔数': int,
1051
- '直接成交金额': float,
1052
- }, errors='raise')
1053
- if is_maximize:
1054
- df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量', '人群名字'], as_index=False).agg(
1055
- **{'加购量': ('加购量', np.max),
1056
- '成交笔数': ('成交笔数', np.max),
1057
- '成交金额': ('成交金额', np.max),
1058
- '直接成交笔数': ('直接成交笔数', np.max),
1059
- '直接成交金额': ('直接成交金额', np.max)
1060
- }
1061
- )
1062
- else:
1063
- df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '展现量', '点击量', '人群名字'], as_index=False).agg(
1064
- **{
1065
- '加购量': ('加购量', np.min),
1066
- '成交笔数': ('成交笔数', np.min),
1067
- '成交金额': ('成交金额', np.min),
1068
- '直接成交笔数': ('直接成交笔数', np.max),
1069
- '直接成交金额': ('直接成交金额', np.max)
1070
- }
1071
- )
1072
- df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
1073
- # 1. 匹配 L后面接 2 个或以上数字,不区分大小写,示例:L345
1074
- # 2. 其余情况,L 后面接多个数字的都会被第一条 if 命中,不区分大小写
1075
- df['消费力层级'] = df.apply(
1076
- lambda x:
1077
- ''.join(re.findall(r'(l\d+)', x['人群名字'].upper(), re.IGNORECASE)) if re.findall(r'(l\d{2,})', x['人群名字'], re.IGNORECASE)
1078
- else 'L5' if re.findall(r'(l\d*5)', x['人群名字'], re.IGNORECASE)
1079
- else 'L4' if re.findall(r'(l\d*4)', x['人群名字'], re.IGNORECASE)
1080
- else 'L3' if re.findall(r'(l\d*3)', x['人群名字'], re.IGNORECASE)
1081
- else 'L2' if re.findall(r'(l\d*2)', x['人群名字'], re.IGNORECASE)
1082
- else 'L1' if re.findall(r'(l\d*1)', x['人群名字'], re.IGNORECASE)
1083
- else '', axis=1)
1084
- # 1. 匹配连续的 4 个数字且后面不能接数字或"元"或汉字,筛掉的人群示例:月均消费6000元|受众20240729175213|xxx2024真皮公文包
1085
- # 2. 匹配 2数字_2数字且前面不能是数字,合法匹配:人群_30_50_促; 非法示例:L345_3040 避免识别出 35~20 岁用户的情况
1086
- # pattern = r'(\d{4})(?!\d|[\u4e00-\u9fa5])' # 匹配 4 个数字,后面不能接数字或汉字
1087
- # pattern = r'(?<![\d\u4e00-\u9fa5])(\d{4})' # 匹配前面不是数字或汉字的 4 个连续数字
1088
-
1089
- # 匹配 4 个数字,前面和后面都不能是数字或汉字
1090
- pattern1 = r'(?<![\d\u4e00-\u9fa5])(\d{4})(?!\d|[\u4e00-\u9fa5])'
1091
- # 匹配指定字符,前面不能是数字或 l 或 L 开头
1092
- pattern2 = r'(?<![\dlL])(\d{2}_\d{2})'
1093
- df['用户年龄'] = df.apply(
1094
- lambda x:
1095
- ''.join(re.findall(pattern1, x['人群名字'].upper())) if re.findall(pattern1, x['人群名字'])
1096
- # else ''.join(re.findall(r'[^\d|l|L](\d{2}_\d{2})', x['人群名字'].upper())) if re.findall(r'[^\d|l|L](\d{2}_\d{2})', x['人群名字'])
1097
- else ''.join(re.findall(pattern2, x['人群名字'].upper())) if re.findall(pattern2, x['人群名字'])
1098
- else ''.join(re.findall(r'(\d{2}-\d{2})岁', x['人群名字'].upper())) if re.findall(r'(\d{2}-\d{2})岁', x['人群名字'])
1099
- else '', axis=1)
1100
- df['用户年龄'] = df['用户年龄'].apply(
1101
- lambda x: f'{x[:2]}~{x[2:4]}' if str(x).isdigit()
1102
- else str(x).replace('_', '~') if '_' in x
1103
- else str(x).replace('-', '~') if '-' in x
1104
- else x
1105
- )
1106
- # 年龄层不能是 0 开头
1107
- df['用户年龄'] = df['用户年龄'].apply(
1108
- lambda x: '' if str(x).startswith('0') else x)
1109
- # df = df.head(1000)
1110
- # df.to_csv('/Users/xigua/Downloads/test.csv', index=False, header=True, encoding='utf-8_sig')
1111
- # breakpoint()
1112
-
1113
- # 下面是添加人群 AIPL 分类
1114
- dir_file = f'\\\\192.168.1.198\\时尚事业部\\01.运营部\\0-电商周报-每周五更新\\分类配置文件.xlsx'
1115
- dir_file2 = '/Volumes/时尚事业部/01.运营部/0-电商周报-每周五更新/分类配置文件.xlsx'
1116
- if platform.system() == 'Windows':
1117
- dir_file3 = 'C:\\同步空间\\BaiduSyncdisk\\原始文件2\\分类配置文件.xlsx'
1118
- else:
1119
- dir_file3 = '/Users/xigua/数据中心/原始文件2/分类配置文件.xlsx'
1120
- if not os.path.isfile(dir_file):
1121
- dir_file = dir_file2
1122
- if not os.path.isfile(dir_file):
1123
- dir_file = dir_file3
1124
- if os.path.isfile(dir_file):
1125
- df_fl = pd.read_excel(dir_file, sheet_name='人群分类', header=0)
1126
- df_fl = df_fl[['人群名字', '人群分类']]
1127
- # 合并并获取分类信息
1128
- df = pd.merge(df, df_fl, left_on=['人群名字'], right_on=['人群名字'], how='left')
1129
- df['人群分类'].fillna('', inplace=True)
1130
- if '人群分类' in df.columns.tolist():
1131
- # 这行决定了,从文件中读取的分类信息优先级高于内部函数的分类规则
1132
- # 这个 lambda 适配人群名字中带有特定标识的分类,强匹配
1133
- df['人群分类'] = df.apply(
1134
- lambda x: self.set_crowd(keyword=str(x['人群名字']), as_file=False) if x['人群分类'] == ''
1135
- else x['人群分类'], axis=1
1136
- )
1137
- # 这个 lambda 适配人群名字中聚类的特征字符,弱匹配
1138
- df['人群分类'] = df.apply(
1139
- lambda x: self.set_crowd2(keyword=str(x['人群名字']), as_file=False) if x['人群分类'] == ''
1140
- else x['人群分类'], axis=1
1141
- )
1142
- else:
1143
- df['人群分类'] = df['人群名字'].apply(lambda x: self.set_crowd(keyword=str(x), as_file=False))
1144
- df['人群分类'] = df.apply(
1145
- lambda x: self.set_crowd2(keyword=str(x['人群名字']), as_file=False) if x['人群分类'] == ''
1146
- else x['人群分类'], axis=1
1147
- )
1148
- df['人群分类'] = df['人群分类'].apply(lambda x: str(x).upper() if x else x)
1149
- # df.to_csv('/Users/xigua/Downloads/test_人群分类.csv', index=False, header=True, encoding='utf-8_sig')
1150
- # breakpoint()
1151
- return df
1152
- elif '天猫_关键词报表' in table_name:
1153
- df.rename(columns={
1154
- '场景名字': '营销场景',
1155
- '宝贝id': '商品id',
1156
- '总购物车数': '加购量',
1157
- '总成交笔数': '成交笔数',
1158
- '总成交金额': '成交金额'
1159
- }, inplace=True)
1160
- df.fillna(0, inplace=True)
1161
- df = df.astype({
1162
- '商品id': str,
1163
- '花费': float,
1164
- '展现量': int,
1165
- '点击量': int,
1166
- '加购量': int,
1167
- '成交笔数': int,
1168
- '成交金额': float,
1169
- '直接成交笔数': int,
1170
- '直接成交金额': float,
1171
- }, errors='raise')
1172
- if is_maximize:
1173
- df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '展现量', '点击量'], as_index=False).agg(
1174
- **{'加购量': ('加购量', np.max),
1175
- '成交笔数': ('成交笔数', np.max),
1176
- '成交金额': ('成交金额', np.max),
1177
- '直接成交笔数': ('直接成交笔数', np.max),
1178
- '直接成交金额': ('直接成交金额', np.max)
1179
- }
1180
- )
1181
- else:
1182
- df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '展现量', '点击量'], as_index=False).agg(
1183
- **{
1184
- '加购量': ('加购量', np.min),
1185
- '成交笔数': ('成交笔数', np.min),
1186
- '成交金额': ('成交金额', np.min),
1187
- '直接成交笔数': ('直接成交笔数', np.max),
1188
- '直接成交金额': ('直接成交金额', np.max)
1189
- }
1190
- )
1191
- df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
1192
- df['是否品牌词'] = df['词名字_词包名字'].str.contains('万里马|wanlima', regex=True)
1193
- df['是否品牌词'] = df['是否品牌词'].apply(lambda x: '品牌词' if x else '')
1194
- dir_file = f'\\\\192.168.1.198\\时尚事业部\\01.运营部\\0-电商周报-每周五更新\\分类配置文件.xlsx'
1195
- dir_file2 = '/Volumes/时尚事业部/01.运营部/0-电商周报-每周五更新/分类配置文件.xlsx'
1196
- if not os.path.isfile(dir_file):
1197
- dir_file = dir_file2
1198
- if os.path.isfile(dir_file):
1199
- df_fl = pd.read_excel(dir_file, sheet_name='关键词分类', header=0)
1200
- # df_fl.rename(columns={'分类1': '词分类'}, inplace=True)
1201
- df_fl = df_fl[['关键词', '词分类']]
1202
- # 合并并获取词分类信息
1203
- df = pd.merge(df, df_fl, left_on=['词名字_词包名字'], right_on=['关键词'], how='left')
1204
- df.pop('关键词')
1205
- df['词分类'].fillna('', inplace=True)
1206
- if '词分类' in df.columns.tolist():
1207
- # 这行决定了,从文件中读取的词分类信息优先级高于 ret_keyword 函数的词分类
1208
- df['词分类'] = df.apply(
1209
- lambda x: self.ret_keyword(keyword=str(x['词名字_词包名字']), as_file=False) if x['词分类'] == ''
1210
- else x['词分类'], axis=1
1211
- )
1212
- else:
1213
- df['词分类'] = df['词名字_词包名字'].apply(lambda x: self.ret_keyword(keyword=str(x), as_file=False))
1214
- # df.to_csv('/Users/xigua/Downloads/test.csv', index=False, header=True, encoding='utf-8_sig')
1215
- # breakpoint()
1216
- return df
1217
- elif '天猫_超级直播' in table_name:
1218
- df.rename(columns={
1219
- '观看次数': '观看次数',
1220
- '总购物车数': '加购量',
1221
- '总成交笔数': '成交笔数',
1222
- '总成交金额': '成交金额',
1223
- '场景名字': '营销场景',
1224
- }, inplace=True)
1225
- df['营销场景'] = '超级直播'
1226
- df.fillna(0, inplace=True)
1227
- df = df.astype({
1228
- '花费': float,
1229
- # '点击量': int,
1230
- '加购量': int,
1231
- '成交笔数': int,
1232
- '成交金额': float,
1233
- '进店量': int,
1234
- '粉丝关注量': int,
1235
- '观看次数': int,
1236
- }, errors='raise')
1237
- if is_maximize:
1238
- df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数', '展现量'],
1239
- as_index=False).agg(
1240
- **{
1241
- '进店量': ('进店量', np.max),
1242
- '粉丝关注量': ('粉丝关注量', np.max),
1243
- '加购量': ('加购量', np.max),
1244
- '成交笔数': ('成交笔数', np.max),
1245
- '成交金额': ('成交金额', np.max),
1246
- '直接成交笔数': ('直接成交笔数', np.max),
1247
- '直接成交金额': ('直接成交金额', np.max),
1248
- }
1249
- )
1250
- else:
1251
- df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数', '展现量'],
1252
- as_index=False).agg(
1253
- **{
1254
- '进店量': ('进店量', np.min),
1255
- '粉丝关注量': ('粉丝关注量', np.min),
1256
- '加购量': ('加购量', np.min),
1257
- '成交笔数': ('成交笔数', np.min),
1258
- '成交金额': ('成交金额', np.min),
1259
- '直接成交笔数': ('直接成交笔数', np.min),
1260
- '直接成交金额': ('直接成交金额', np.min),
1261
- }
1262
- )
1263
- df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
1264
- # df.insert(loc=2, column='营销场景', value='超级直播') # df中插入新列
1265
- # df = df.loc[df['日期'].between(start_day, today)]
1266
- df_new = df.groupby(['日期', '店铺名称', '推广渠道', '营销场景'], as_index=False).agg(
1267
- **{
1268
- '花费': ('花费', np.sum),
1269
- '展现量': ('展现量', np.sum),
1270
- '观看次数': ('观看次数', np.sum),
1271
- '加购量': ('加购量', np.sum),
1272
- '成交笔数': ('成交笔数', np.sum),
1273
- '成交金额': ('成交金额', np.sum),
1274
- '直接成交笔数': ('直接成交笔数', np.sum),
1275
- '直接成交金额': ('直接成交金额', np.sum),
1276
- }
1277
- )
1278
- self.data_tgyj.update(
1279
- {
1280
- table_name: df_new,
1281
- }
1282
- )
1283
- return df
1284
- elif '天猫_品销宝账户报表' in table_name:
1285
- df = df[df['报表类型'] == '账户']
1286
- df.fillna(value=0, inplace=True)
1287
- df.rename(columns={
1288
- '消耗': '花费',
1289
- '宝贝加购数': '加购量',
1290
- '搜索量': '品牌搜索量',
1291
- '搜索访客数': '品牌搜索人数'
1292
- }, inplace=True)
1293
- df = df.astype({
1294
- '花费': float,
1295
- '展现量': int,
1296
- '点击量': int,
1297
- '加购量': int,
1298
- '成交笔数': int,
1299
- '成交金额': float,
1300
- '品牌搜索量': int,
1301
- '品牌搜索人数': int,
1302
- }, errors='raise')
1303
- if is_maximize:
1304
- df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '展现量', '点击量'], as_index=False).agg(
1305
- **{
1306
- '加购量': ('加购量', np.max),
1307
- '成交笔数': ('成交笔数', np.max),
1308
- '成交金额': ('成交金额', np.max),
1309
- '品牌搜索量': ('品牌搜索量', np.max),
1310
- '品牌搜索人数': ('品牌搜索人数', np.max),
1311
- }
1312
- )
1313
- else:
1314
- df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '展现量', '点击量'], as_index=False).agg(
1315
- **{
1316
- '加购量': ('加购量', np.min),
1317
- '成交笔数': ('成交笔数', np.min),
1318
- '成交金额': ('成交金额', np.min),
1319
- '品牌搜索量': ('品牌搜索量', np.min),
1320
- '品牌搜索人数': ('品牌搜索人数', np.min),
1321
- }
1322
- )
1323
- df.insert(loc=1, column='推广渠道', value='品销宝') # df中插入新列
1324
- df.insert(loc=2, column='营销场景', value='品销宝') # df中插入新列
1325
- df_new = df.groupby(['日期', '店铺名称', '推广渠道', '营销场景'], as_index=False).agg(
1326
- **{
1327
- '花费': ('花费', np.sum),
1328
- '展现量': ('展现量', np.sum),
1329
- '点击量': ('点击量', np.sum),
1330
- '加购量': ('加购量', np.sum),
1331
- '成交笔数': ('成交笔数', np.sum),
1332
- '成交金额': ('成交金额', np.sum)
1333
- }
1334
- )
1335
- self.data_tgyj.update(
1336
- {
1337
- table_name: df_new,
1338
- }
1339
- )
1340
- return df
1341
- elif '宝贝指标' in table_name:
1342
- """ 聚合时不可以加商家编码,编码有些是空白,有些是 0 """
1343
- df['宝贝id'] = df['宝贝id'].astype(str)
1344
- df.fillna(0, inplace=True)
1345
- # df = df[(df['销售额'] != 0) | (df['退款额'] != 0)] # 注释掉, 因为后续使用生意经作为基准合并推广表,需确保所有商品id 齐全
1346
- df = df.groupby(['日期', '店铺名称', '宝贝id', '行业类目'], as_index=False).agg(
1347
- **{'销售额': ('销售额', np.min),
1348
- '销售量': ('销售量', np.min),
1349
- '订单数': ('订单数', np.min),
1350
- '退货量': ('退货量', np.max),
1351
- '退款额': ('退款额', np.max),
1352
- '退款额_发货后': ('退款额_发货后', np.max),
1353
- '退货量_发货后': ('退货量_发货后', np.max),
1354
- }
1355
- )
1356
- df['件均价'] = df.apply(lambda x: x['销售额'] / x['销售量'] if x['销售量'] > 0 else 0, axis=1).round(
1357
- 0) # 两列运算, 避免除以0
1358
- df['价格带'] = df['件均价'].apply(
1359
- lambda x: '2000+' if x >= 2000
1360
- else '1000+' if x >= 1000
1361
- else '500+' if x >= 500
1362
- else '300+' if x >= 300
1363
- else '300以下'
1364
- )
1365
- self.data_tgyj.update(
1366
- {
1367
- table_name: df[['日期', '店铺名称', '宝贝id', '销售额', '销售量', '退款额_发货后', '退货量_发货后']],
1368
- }
1369
- )
1370
- return df
1371
- elif '店铺流量来源构成' in table_name:
1372
- # 包含三级来源名称和预设索引值列
1373
- # 截取 从上月1日 至 今天的花费数据, 推广款式按此数据从高到低排序(商品图+排序)
1374
- df_visitor3 = df.groupby(['日期', '三级来源'], as_index=False).agg({'访客数': 'sum'})
1375
- df_visitor3 = df_visitor3[~df_visitor3['三级来源'].isin([''])] # 指定列中删除包含空值的行
1376
- # df_visitor = df_visitor[(df_visitor['日期'] >= f'{year_my}-{last_month.month}-01')]
1377
- df_visitor3 = df_visitor3.groupby(['三级来源'], as_index=False).agg({'访客数': 'sum'})
1378
- df_visitor3.sort_values('访客数', ascending=False, ignore_index=True, inplace=True)
1379
- df_visitor3.reset_index(inplace=True)
1380
- df_visitor3['index'] = df_visitor3['index'] + 100
1381
- df_visitor3.rename(columns={'index': '三级访客索引'}, inplace=True)
1382
- df_visitor3 = df_visitor3[['三级来源', '三级访客索引']]
1383
-
1384
- # 包含二级来源名称和预设索引值列
1385
- df_visitor2 = df.groupby(['日期', '二级来源'], as_index=False).agg({'访客数': 'sum'})
1386
- df_visitor2 = df_visitor2[~df_visitor2['二级来源'].isin([''])] # 指定列中删除包含空值的行
1387
- # df_visitor2 = df_visitor2[(df_visitor2['日期'] >= f'{year_my}-{last_month.month}-01')]
1388
- df_visitor2 = df_visitor2.groupby(['二级来源'], as_index=False).agg({'访客数': 'sum'})
1389
- df_visitor2.sort_values('访客数', ascending=False, ignore_index=True, inplace=True)
1390
- df_visitor2.reset_index(inplace=True)
1391
- df_visitor2['index'] = df_visitor2['index'] + 100
1392
- df_visitor2.rename(columns={'index': '二级访客索引'}, inplace=True)
1393
- df_visitor2 = df_visitor2[['二级来源', '二级访客索引']]
1394
-
1395
- df = pd.merge(df, df_visitor2, how='left', left_on='二级来源', right_on='二级来源')
1396
- df = pd.merge(df, df_visitor3, how='left', left_on='三级来源', right_on='三级来源')
1397
- return df
1398
- elif '商品id编码表' in table_name:
1399
- df['宝贝id'] = df['宝贝id'].astype(str)
1400
- df.drop_duplicates(subset='宝贝id', keep='last', inplace=True, ignore_index=True)
1401
- # df['行业类目'] = df['行业类目'].apply(lambda x: re.sub(' ', '', x))
1402
- try:
1403
- df[['一级类目', '二级类目', '三级类目']] = df['行业类目'].str.split(' -> ', expand=True).loc[:, 0:2]
1404
- except:
1405
- try:
1406
- df[['一级类目', '二级类目']] = df['行业类目'].str.split(' -> ', expand=True).loc[:, 0:1]
1407
- except:
1408
- df['一级类目'] = df['行业类目']
1409
- df.drop('行业类目', axis=1, inplace=True)
1410
- df.sort_values('宝贝id', ascending=False, inplace=True)
1411
- df = df[(df['宝贝id'] != '973') & (df['宝贝id'] != '973')]
1412
- self.data_tgyj.update(
1413
- {
1414
- table_name: df[['宝贝id', '商家编码']],
1415
- }
1416
- )
1417
- return df
1418
- elif '商品id图片对照表' in table_name:
1419
- df['商品id'] = df['商品id'].astype('int64')
1420
- df['日期'] = df['日期'].astype('datetime64[ns]')
1421
- df = df[(df['商品白底图'] != '0') | (df['方版场景图'] != '0')]
1422
- # 白底图优先
1423
- df['商品图片'] = df[['商品白底图', '方版场景图']].apply(
1424
- lambda x: x['商品白底图'] if x['商品白底图'] !='0' else x['方版场景图'], axis=1)
1425
- # # 方版场景图优先
1426
- # df['商品图片'] = df[['商品白底图', '方版场景图']].apply(
1427
- # lambda x: x['方版场景图'] if x['方版场景图'] != '0' else x['商品白底图'], axis=1)
1428
- df.sort_values(by=['商品id', '日期'], ascending=[False, True], ignore_index=True, inplace=True)
1429
- df.drop_duplicates(subset=['商品id'], keep='last', inplace=True, ignore_index=True)
1430
- df = df[['商品id', '商品图片', '日期']]
1431
- df['商品图片'] = df['商品图片'].apply(lambda x: x if 'http' in x else None) # 检查是否是 http 链接
1432
- df.dropna(how='all', subset=['商品图片'], axis=0, inplace=True) # 删除指定列含有空值的行
1433
- df['商品链接'] = df['商品id'].apply(
1434
- lambda x: f'https://detail.tmall.com/item.htm?id={str(x)}' if x and '.com' not in str(x) else x)
1435
- df.sort_values(by='商品id', ascending=False, ignore_index=True, inplace=True) # ascending=False 降序排列
1436
- self.data_tgyj.update(
1437
- {
1438
- table_name: df[['商品id', '商品图片']],
1439
- }
1440
- )
1441
- df['商品id'] = df['商品id'].astype(str)
1442
- return df
1443
- elif '商品成本' in table_name:
1444
- df.sort_values(by=['款号', '日期'], ascending=[False, True], ignore_index=True, inplace=True)
1445
- df.drop_duplicates(subset=['款号'], keep='last', inplace=True, ignore_index=True)
1446
- self.data_tgyj.update(
1447
- {
1448
- table_name: df[['款号', '成本价']],
1449
- }
1450
- )
1451
- return df
1452
- elif '京东_京准通' in table_name and '全站营销' not in table_name:
1453
- df = df.groupby(['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', 'spu_id', '花费', '展现数', '点击数'], as_index=False).agg(
1454
- **{'直接订单行': ('直接订单行', np.max),
1455
- '直接订单金额': ('直接订单金额', np.max),
1456
- '总订单行': ('总订单行', np.max),
1457
- '总订单金额': ('总订单金额', np.max),
1458
- '直接加购数': ('直接加购数', np.max),
1459
- '总加购数': ('总加购数', np.max),
1460
- }
1461
- )
1462
- df = df[df['花费'] > 0]
1463
- self.data_jdtg.update(
1464
- {
1465
- table_name: df[['日期', '产品线', '触发sku_id', '跟单sku_id', '花费']],
1466
- }
1467
- )
1468
- return df
1469
- elif '京东_京准通_全站营销' in table_name:
1470
- df = df.groupby(['日期', '产品线', '花费'], as_index=False).agg(
1471
- **{'全站投产比': ('全站投产比', np.max),
1472
- '全站交易额': ('全站交易额', np.max),
1473
- '全站订单行': ('全站订单行', np.max),
1474
- '全站订单成本': ('全站订单成本', np.max),
1475
- '全站费比': ('全站费比', np.max),
1476
- '核心位置展现量': ('核心位置展现量', np.max),
1477
- '核心位置点击量': ('核心位置点击量', np.max),
1478
- }
1479
- )
1480
- df = df[df['花费'] > 0]
1481
- return df
1482
- elif '京东_sku_商品明细' in table_name:
1483
- df = df[df['商品id'] != '合计']
1484
- df = df.groupby(['日期', '商品id', '货号', '访客数', '成交客户数', '加购商品件数', '加购人数'],
1485
- as_index=False).agg(
1486
- **{
1487
- '成交单量': ('成交单量', np.max),
1488
- '成交金额': ('成交金额', np.max),
1489
- }
1490
- )
1491
- self.data_jdtg.update(
1492
- {
1493
- table_name: df,
1494
- }
1495
- )
1496
- return df
1497
- elif '京东_spu_商品明细' in table_name:
1498
- df = df[df['商品id'] != '合计']
1499
- df = df.groupby(['日期', '商品id', '货号', '访客数', '成交客户数', '加购商品件数', '加购人数'],
1500
- as_index=False).agg(
1501
- **{
1502
- '成交单量': ('成交单量', np.max),
1503
- '成交金额': ('成交金额', np.max),
1504
- }
1505
- )
1506
- self.data_jdtg.update(
1507
- {
1508
- table_name: df,
1509
- }
1510
- )
1511
- return df
1512
- elif '京东_关键词报表' in table_name:
1513
- df_lin = df[['计划id', '推广计划']]
1514
- df_lin.drop_duplicates(subset=['计划id'], keep='last', inplace=True, ignore_index=True)
1515
- df = df.groupby(['日期', '产品线', '计划类型', '计划id', '搜索词', '关键词', '关键词购买类型', '广告定向类型', '展现数', '点击数', '花费'],
1516
- as_index=False).agg(
1517
- **{
1518
- '直接订单行': ('直接订单行', np.max),
1519
- '直接订单金额': ('直接订单金额', np.max),
1520
- '总订单行': ('总订单行', np.max),
1521
- '总订单金额': ('总订单金额', np.max),
1522
- '总加购数': ('总加购数', np.max),
1523
- '领券数': ('领券数', np.max),
1524
- '商品关注数': ('商品关注数', np.max),
1525
- '店铺关注数': ('店铺关注数', np.max)
1526
- }
1527
- )
1528
- df = pd.merge(df, df_lin, how='left', left_on='计划id', right_on='计划id')
1529
- df['k_是否品牌词'] = df['关键词'].str.contains('万里马|wanlima', regex=True)
1530
- df['k_是否品牌词'] = df['k_是否品牌词'].apply(lambda x: '品牌词' if x else '')
1531
- df['s_是否品牌词'] = df['搜索词'].str.contains('万里马|wanlima', regex=True)
1532
- df['s_是否品牌词'] = df['s_是否品牌词'].apply(lambda x: '品牌词' if x else '')
1533
- return df
1534
- elif '天猫店铺来源_手淘搜索' in table_name:
1535
- df = df.groupby(
1536
- ['日期', '店铺名称', '词类型', '搜索词'],
1537
- as_index=False).agg(
1538
- **{
1539
- '访客数': ('访客数', np.max),
1540
- '加购人数': ('加购人数', np.max),
1541
- '支付金额': ('支付金额', np.max),
1542
- '支付转化率': ('支付转化率', np.max),
1543
- '支付买家数': ('支付买家数', np.max),
1544
- '客单价': ('客单价', np.max),
1545
- 'uv价值': ('uv价值', np.max)
1546
- }
1547
- )
1548
- return df
1549
- elif '生意参谋_直播场次分析' in table_name:
1550
- df.drop_duplicates(subset=['场次id'], keep='first', inplace=True, ignore_index=True)
1551
- return df
1552
- elif '多店推广场景_按日聚合' in table_name:
1553
- df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d', errors='ignore') # 转换日期列
1554
- df = df.groupby(
1555
- ['日期', '店铺名称', '营销场景'],
1556
- as_index=False).agg(
1557
- **{
1558
- '花费': ('花费', np.sum),
1559
- '展现量': ('展现量', np.sum),
1560
- '点击量': ('点击量', np.sum),
1561
- '加购量': ('加购量', np.sum),
1562
- '成交笔数': ('成交笔数', np.sum),
1563
- '成交金额': ('成交金额', np.sum)
1564
- }
1565
- )
1566
- df.sort_values(['日期', '店铺名称', '花费'], ascending=[False, False, False], ignore_index=True, inplace=True)
1567
- # df.to_csv('/Users/xigua/Downloads/test.csv', encoding='utf-8_sig', index=False, header=True)
1568
- return df
1569
- elif '达摩盘_人群报表' in table_name:
1570
- return df
1571
-
1572
- else:
1573
- print(f'<{table_name}>: Groupby 类尚未配置,数据为空')
1574
- return pd.DataFrame({})
1575
-
1576
- @try_except
1577
- def ret_keyword(self, keyword, as_file=False):
1578
- """ 推广关键词报表,关键词分类, """
1579
- datas = [
1580
- {
1581
- '类别': '品牌词',
1582
- '值': [
1583
- '万里马',
1584
- 'wanlima',
1585
- 'fion',
1586
- '菲安妮',
1587
- '迪桑娜',
1588
- 'dissona',
1589
- 'hr',
1590
- 'vh',
1591
- 'songmont',
1592
- 'vanessahogan',
1593
- 'dilaks',
1594
- 'khdesign',
1595
- 'peco',
1596
- 'giimmii',
1597
- 'cassile',
1598
- 'grotto',
1599
- 'why',
1600
- 'roulis',
1601
- 'lesschic',
1602
- 'amazing song',
1603
- 'mytaste',
1604
- 'bagtree',
1605
- '红谷',
1606
- 'hongu',
1607
- ]
1608
- },
1609
- {
1610
- '类别': '智选',
1611
- '值': [
1612
- '智选',
1613
- ]
1614
- },
1615
- {
1616
- '类别': '智能',
1617
- '值': [
1618
- '智能',
1619
- ]
1620
- },
1621
- {
1622
- '类别': '年份',
1623
- '值': [
1624
- '20',
1625
- ]
1626
- },
1627
- {
1628
- '类别': '材质',
1629
- '值': [
1630
- '皮',
1631
- '牛仔',
1632
- '丹宁',
1633
- '帆布',
1634
- ]
1635
- },
1636
- {
1637
- '类别': '季节',
1638
- '值': [
1639
- '春',
1640
- '夏',
1641
- '秋',
1642
- '冬',
1643
- ]
1644
- },
1645
- {
1646
- '类别': '一键起量',
1647
- '值': [
1648
- '一键起量',
1649
- ]
1650
- },
1651
- {
1652
- '类别': '款式',
1653
- '值': [
1654
- '水桶',
1655
- '托特',
1656
- '腋下',
1657
- '小方',
1658
- '通用款',
1659
- '手拿',
1660
- '马鞍',
1661
- '链条',
1662
- '菜篮',
1663
- 'hobo',
1664
- '波士顿',
1665
- '凯莉',
1666
- '饺子',
1667
- '盒子',
1668
- '牛角',
1669
- '公文',
1670
- '月牙',
1671
- '单肩',
1672
- '枕头',
1673
- '斜挎',
1674
- '手提',
1675
- '手拎',
1676
- '拎手',
1677
- '斜肩',
1678
- '棒球',
1679
- '饺包',
1680
- '保龄球',
1681
- '戴妃',
1682
- '半月',
1683
- '弯月',
1684
- '法棍',
1685
- '流浪',
1686
- '拎包',
1687
- '中式',
1688
- '手挽',
1689
- '皮带',
1690
- '眼镜',
1691
- '斜跨',
1692
- '律师',
1693
- '斜背',
1694
- ]
1695
- },
1696
- {
1697
- '类别': '品类词',
1698
- '值': [
1699
- '老花',
1700
- '包包',
1701
- '通勤',
1702
- '轻奢',
1703
- '包',
1704
- '新款',
1705
- '小众',
1706
- '爆款',
1707
- '工作',
1708
- '精致',
1709
- '奢侈',
1710
- '袋',
1711
- '腰带',
1712
- '裤带',
1713
- '女士',
1714
- '复古',
1715
- '高级',
1716
- '容量',
1717
- '时尚',
1718
- '商务',
1719
- ],
1720
- },
1721
- ]
1722
- if as_file:
1723
- with open(os.path.join(self.output, f'分类配置.json'), 'w') as f:
1724
- json.dump(datas, f, ensure_ascii=False, sort_keys=False, indent=4)
1725
- breakpoint()
1726
- result = ''
1727
- res = []
1728
- is_continue = False
1729
- for data in datas:
1730
- for item in data['值']:
1731
- if item == '20':
1732
- pattern = r'\d\d'
1733
- res = re.findall(f'{item}{pattern}', str(keyword), re.IGNORECASE)
1734
- else:
1735
- res = re.findall(item, str(keyword), re.IGNORECASE)
1736
- if res:
1737
- result = data['类别']
1738
- is_continue = True
1739
- break
1740
- if is_continue:
1741
- break
1742
- return result
1743
-
1744
- @try_except
1745
- def set_crowd(self, keyword, as_file=False):
1746
- """ 推广人群报表,人群分类, """
1747
- result_a = re.findall('_a$|_a_|_ai|^a_', str(keyword), re.IGNORECASE)
1748
- result_i = re.findall('_i$|_i_|^i_', str(keyword), re.IGNORECASE)
1749
- result_p = re.findall('_p$|_p_|_pl|^p_||^pl_', str(keyword), re.IGNORECASE)
1750
- result_l = re.findall('_l$|_l_|^l_', str(keyword), re.IGNORECASE)
1751
-
1752
- datas = [
1753
- {
1754
- '类别': 'A',
1755
- '值': result_a,
1756
- },
1757
- {
1758
- '类别': 'I',
1759
- '值': result_i,
1760
- },
1761
- {
1762
- '类别': 'P',
1763
- '值': result_p,
1764
- },
1765
- {
1766
- '类别': 'L',
1767
- '值': result_l,
1768
- }
1769
- ]
1770
-
1771
- is_res = False
1772
- for data in datas:
1773
- if data['值']:
1774
- data['值'] = [item for item in data['值'] if item != '']
1775
- if data['值']:
1776
- return data['类别']
1777
- if not is_res:
1778
- return ''
1779
-
1780
- @try_except
1781
- def set_crowd2(self, keyword, as_file=False):
1782
- """ 推广人群报表,人群分类, """
1783
- datas = [
1784
- {
1785
- '类别': 'A',
1786
- '值': [
1787
- '相似宝贝',
1788
- '相似店铺',
1789
- '类目',
1790
- '88VIP',
1791
- '拉新',
1792
- '潮流',
1793
- '会场',
1794
- '意向',
1795
- '>>', # 系统推荐的搜索相关人群
1796
- '关键词:', # 系统推荐的搜索相关人群
1797
- '关键词_', # 自建的搜索相关人群
1798
- '扩展',
1799
- '敏感人群',
1800
- '尝鲜',
1801
- '小二推荐',
1802
- '竞争',
1803
- '资深',
1804
- '女王节',
1805
- '本行业',
1806
- '618',
1807
- '包包树',
1808
- '迪桑娜',
1809
- '菲安妮',
1810
- '卡思乐',
1811
- '场景词',
1812
- '竞对',
1813
- '精选',
1814
- '发现',
1815
- '行业mvp'
1816
- '特征继承',
1817
- '机会',
1818
- '推荐',
1819
- '智能定向',
1820
- ]
1821
- },
1822
- {
1823
- '类别': 'I',
1824
- '值': [
1825
- '行动',
1826
- '收加',
1827
- '收藏',
1828
- '加购',
1829
- '促首购',
1830
- '店铺优惠券',
1831
- '高转化',
1832
- '认知',
1833
- '喜欢我', # 系统推荐宝贝/店铺访问相关人群
1834
- '未购买',
1835
- '种草',
1836
- '兴趣',
1837
- '本店',
1838
- '领券',
1839
- ]
1840
- },
1841
- {
1842
- '类别': 'P',
1843
- '值': [
1844
- '万里马',
1845
- '购买',
1846
- '已购',
1847
- '促复购'
1848
- '店铺会员',
1849
- '店铺粉丝',
1850
- '转化',
1851
- ]
1852
- },
1853
- {
1854
- '类别': 'L',
1855
- '值': [
1856
- 'L人群',
1857
- ]
1858
- },
1859
- ]
1860
- if as_file:
1861
- with open(os.path.join(self.output, f'分类配置_推广人群分类_函数内置规则.json'), 'w') as f:
1862
- json.dump(datas, f, ensure_ascii=False, sort_keys=False, indent=4)
1863
- breakpoint()
1864
- result = ''
1865
- res = []
1866
- is_continue = False
1867
- for data in datas:
1868
- for item in data['值']:
1869
- res = re.findall(item, str(keyword), re.IGNORECASE)
1870
- if res:
1871
- result = data['类别']
1872
- is_continue = True
1873
- break
1874
- if is_continue:
1875
- break
1876
- return result
1877
-
1878
- # @try_except
1879
- def performance(self, bb_tg=True):
1880
- # print(self.data_tgyj)
1881
- tg, syj, idbm, pic, cost = (
1882
- self.data_tgyj['天猫_主体报表'],
1883
- self.data_tgyj['生意经_宝贝指标'],
1884
- self.data_tgyj['商品id编码表'],
1885
- self.data_tgyj['商品id图片对照表'],
1886
- self.data_tgyj['商品成本']) # 这里不要加逗号
1887
- pic['商品id'] = pic['商品id'].astype(str)
1888
- df = pd.merge(idbm, pic, how='left', left_on='宝贝id', right_on='商品id') # id 编码表合并图片表
1889
- df = df[['宝贝id', '商家编码', '商品图片']]
1890
- df = pd.merge(df, cost, how='left', left_on='商家编码', right_on='款号') # df 合并商品成本表
1891
- df = df[['宝贝id', '商家编码', '商品图片', '成本价']]
1892
- df = pd.merge(tg, df, how='left', left_on='商品id', right_on='宝贝id') # 推广表合并 df
1893
- df.drop(labels='宝贝id', axis=1, inplace=True)
1894
- if bb_tg is True:
1895
- # 生意经合并推广表,完整的数据表,包含全店所有推广、销售数据
1896
- df = pd.merge(syj, df, how='left', left_on=['日期', '店铺名称', '宝贝id'], right_on=['日期', '店铺名称', '商品id'])
1897
- df.drop(labels='商品id', axis=1, inplace=True) # 因为生意经中的宝贝 id 列才是完整的
1898
- df.rename(columns={'宝贝id': '商品id'}, inplace=True)
1899
- # df.to_csv('/Users/xigua/Downloads/test.csv', encoding='utf-8_sig', index=False, header=True)
1900
- else:
1901
- # 推广表合并生意经 , 以推广数据为基准,销售数据不齐全
1902
- df = pd.merge(df, syj, how='left', left_on=['日期', '店铺名称', '商品id'], right_on=['日期', '店铺名称', '宝贝id'])
1903
- df.drop(labels='宝贝id', axis=1, inplace=True)
1904
- df.drop_duplicates(subset=['日期', '店铺名称', '商品id', '花费', '销售额'], keep='last', inplace=True, ignore_index=True)
1905
- df.fillna(0, inplace=True)
1906
- df['成本价'] = df['成本价'].astype('float64')
1907
- df['销售额'] = df['销售额'].astype('float64')
1908
- df['销售量'] = df['销售量'].astype('int64')
1909
- df['商品成本'] = df.apply(lambda x: (x['成本价'] + x['销售额']/x['销售量'] * 0.11 + 6) * x['销售量'] if x['销售量'] > 0 else 0, axis=1)
1910
- df['商品毛利'] = df.apply(lambda x: x['销售额'] - x['商品成本'], axis=1)
1911
- df['毛利率'] = df.apply(lambda x: round((x['销售额'] - x['商品成本']) / x['销售额'], 4) if x['销售额'] > 0 else 0, axis=1)
1912
- df['盈亏'] = df.apply(lambda x: x['商品毛利'] - x['花费'], axis=1)
1913
- return df
1914
-
1915
- @try_except
1916
- def performance_concat(self, bb_tg=True):
1917
- tg, zb, pxb = self.data_tgyj['天猫汇总表调用'], self.data_tgyj['天猫_超级直播'], self.data_tgyj['天猫_品销宝账户报表']
1918
- zb.rename(columns={
1919
- '观看次数': '点击量',
1920
- }, inplace=True)
1921
- zb.fillna(0, inplace=True) # astype 之前要填充空值
1922
- tg.fillna(0, inplace=True)
1923
- zb = zb.astype({
1924
- '花费': float,
1925
- '展现量': int,
1926
- '点击量': int,
1927
- '加购量': int,
1928
- '成交笔数': int,
1929
- '成交金额': float,
1930
- '直接成交笔数': int,
1931
- '直接成交金额': float,
1932
- }, errors='raise')
1933
- tg = tg.astype({
1934
- '商品id': str,
1935
- '花费': float,
1936
- '展现量': int,
1937
- '点击量': int,
1938
- '加购量': int,
1939
- '成交笔数': int,
1940
- '成交金额': float,
1941
- '直接成交笔数': int,
1942
- '直接成交金额': float,
1943
- '自然流量曝光量': int,
1944
- }, errors='raise')
1945
- # tg = tg.groupby(['日期', '推广渠道', '营销场景', '商品id', '花费', '展现量', '点击量'], as_index=False).agg(
1946
- # **{'加购量': ('加购量', np.max),
1947
- # '成交笔数': ('成交笔数', np.max),
1948
- # '成交金额': ('成交金额', np.max),
1949
- # '自然流量曝光量': ('自然流量曝光量', np.max),
1950
- # '直接成交笔数': ('直接成交笔数', np.max),
1951
- # '直接成交金额': ('直接成交金额', np.max)
1952
- # }
1953
- # )
1954
- df = pd.concat([tg, zb, pxb], axis=0, ignore_index=True)
1955
- df.fillna(0, inplace=True) # concat 之后要填充空值
1956
- df = df.astype(
1957
- {
1958
- '商品id': str,
1959
- '自然流量曝光量': int,
1960
- }
1961
- )
1962
- return df
1963
-
1964
- # @try_except
1965
- def performance_jd(self, jd_tg=True):
1966
- jdtg, sku_sales = self.data_jdtg['京东_京准通'], self.data_jdtg['京东_sku_商品明细']
1967
- jdtg = jdtg.groupby(['日期', '跟单sku_id'],
1968
- as_index=False).agg(
1969
- **{
1970
- '花费': ('花费', np.sum)
1971
- }
1972
- )
1973
- cost = self.data_tgyj['商品成本']
1974
- df = pd.merge(sku_sales, cost, how='left', left_on='货号', right_on='款号')
1975
- df = df[['日期', '商品id', '货号', '成交单量', '成交金额', '成本价']]
1976
- df['商品id'] = df['商品id'].astype(str)
1977
- jdtg['跟单sku_id'] = jdtg['跟单sku_id'].astype(str)
1978
- jdtg = jdtg.astype({'日期': 'datetime64[ns]'}, errors='raise')
1979
- if jd_tg is True:
1980
- # 完整的数据表,包含全店所有推广、销售数据
1981
- df = pd.merge(df, jdtg, how='left', left_on=['日期', '商品id'], right_on=['日期', '跟单sku_id']) # df 合并推广表
1982
- else:
1983
- df = pd.merge(jdtg, df, how='left', left_on=['日期', '跟单sku_id'], right_on=['日期', '商品id']) # 推广表合并 df
1984
- df = df[['日期', '跟单sku_id', '花费', '货号', '成交单量', '成交金额', '成本价']]
1985
- df.fillna(0, inplace=True)
1986
- df['成本价'] = df['成本价'].astype('float64')
1987
- df['成交金额'] = df['成交金额'].astype('float64')
1988
- df['花费'] = df['花费'].astype('float64')
1989
- df['成交单量'] = df['成交单量'].astype('int64')
1990
- df['商品成本'] = df.apply(
1991
- lambda x: (x['成本价'] + x['成交金额'] / x['成交单量'] * 0.11 + 6) * x['成交单量'] if x['成交单量'] > 0 else 0,
1992
- axis=1)
1993
- df['商品毛利'] = df.apply(lambda x: x['成交金额'] - x['商品成本'], axis=1)
1994
- df['毛利率'] = df.apply(
1995
- lambda x: round((x['成交金额'] - x['商品成本']) / x['成交金额'], 4) if x['成交金额'] > 0 else 0, axis=1)
1996
- df['盈亏'] = df.apply(lambda x: x['商品毛利'] - x['花费'], axis=1)
1997
- return df
1998
-
1999
- def as_csv(self, df, filename, path=None, encoding='utf-8_sig',
2000
- index=False, header=True, st_ascend=None, ascend=None, freq=None):
2001
- """
2002
- path: 默认导出目录 self.output, 这个函数的 path 作为子文件夹,可以不传,
2003
- st_ascend: 排序参数 ['column1', 'column2']
2004
- ascend: 升降序 [True, False]
2005
- freq: 将创建子文件夹并按月分类存储, freq='Y', 或 freq='M'
2006
- """
2007
- if len(df) == 0:
2008
- return
2009
- if not path:
2010
- path = self.output
2011
- else:
2012
- path = os.path.join(self.output, path)
2013
- if not os.path.exists(path):
2014
- os.makedirs(path)
2015
- if filename.endswith('.csv'):
2016
- filename = filename[:-4]
2017
- if st_ascend and ascend:
2018
- try:
2019
- df.sort_values(st_ascend, ascending=ascend, ignore_index=True, inplace=True)
2020
- except:
2021
- print(f'{filename}: sort_values排序参数错误!')
2022
- if freq:
2023
- if '日期' not in df.columns.tolist():
2024
- return print(f'{filename}: 数据缺少日期列,无法按日期分组')
2025
- groups = df.groupby(pd.Grouper(key='日期', freq=freq))
2026
- for name1, df in groups:
2027
- if freq == 'M':
2028
- sheet_name = name1.strftime('%Y-%m')
2029
- elif freq == 'Y':
2030
- sheet_name = name1.strftime('%Y年')
2031
- else:
2032
- sheet_name = '_未分类'
2033
- new_path = os.path.join(path, filename)
2034
- if not os.path.exists(new_path):
2035
- os.makedirs(new_path)
2036
- new_path = os.path.join(new_path, f'{filename}{sheet_name}.csv')
2037
- if st_ascend and ascend: # 这里需要重新排序一次,原因未知
2038
- try:
2039
- df.sort_values(st_ascend, ascending=ascend, ignore_index=True, inplace=True)
2040
- except:
2041
- print(f'{filename}: sort_values排序参数错误!')
2042
-
2043
- df.to_csv(new_path, encoding=encoding, index=index, header=header)
2044
- else:
2045
- df.to_csv(os.path.join(path, filename + '.csv'), encoding=encoding, index=index, header=header)
2046
-
2047
- def as_json(self, df, filename, path=None, orient='records', force_ascii=False, st_ascend=None, ascend=None):
2048
- if len(df) == 0:
2049
- return
2050
- if not path:
2051
- path = self.output
2052
- else:
2053
- path = os.path.join(self.output, path)
2054
- if not os.path.exists(path):
2055
- os.makedirs(path)
2056
- if st_ascend and ascend:
2057
- try:
2058
- df.sort_values(st_ascend, ascending=ascend, ignore_index=True, inplace=True)
2059
- except:
2060
- print(f'{filename}: sort_values排序参数错误!')
2061
- df.to_json(os.path.join(path, filename + '.json'),
2062
- orient=orient, force_ascii=force_ascii)
2063
-
2064
- def as_excel(self, df, filename, path=None, index=False, header=True, engine='openpyxl',
2065
- freeze_panes=(1, 0), st_ascend=None, ascend=None):
2066
- if len(df) == 0:
2067
- return
2068
- if not path:
2069
- path = self.output
2070
- else:
2071
- path = os.path.join(self.output, path)
2072
- if not os.path.exists(path):
2073
- os.makedirs(path)
2074
- if st_ascend and ascend:
2075
- try:
2076
- df.sort_values(st_ascend, ascending=ascend, ignore_index=True, inplace=True)
2077
- except:
2078
- print(f'{filename}: sort_values排序参数错误!')
2079
- df.to_excel(os.path.join(path, filename + '.xlsx'), index=index, header=header, engine=engine, freeze_panes=freeze_panes)
2080
-
2081
-
2082
- def date_table():
2083
- """
2084
- 生成 pbix 使用的日期表
2085
- """
2086
- start_date = '2022-01-01' # 日期表的起始日期
2087
- yesterday = time.strftime('%Y-%m-%d', time.localtime(time.time() - 86400))
2088
- dic = pd.date_range(start=start_date, end=yesterday)
2089
- df = pd.DataFrame(dic, columns=['日期'])
2090
- df.sort_values('日期', ascending=True, ignore_index=True, inplace=True)
2091
- df.reset_index(inplace=True)
2092
- # inplace 添加索引到 df
2093
- p = df.pop('index')
2094
- df['月2'] = df['日期']
2095
- df['月2'] = df['月2'].dt.month
2096
- df['日期'] = df['日期'].dt.date # 日期格式保留年月日,去掉时分秒
2097
- df['年'] = df['日期'].apply(lambda x: str(x).split('-')[0] + '年')
2098
- df['月'] = df['月2'].apply(lambda x: str(x) + '月')
2099
- # df.drop('月2', axis=1, inplace=True)
2100
- mon = df.pop('月2')
2101
- df['日'] = df['日期'].apply(lambda x: str(x).split('-')[2])
2102
- df['年月'] = df.apply(lambda x: x['年'] + x['月'], axis=1)
2103
- df['月日'] = df.apply(lambda x: x['月'] + x['日'] + '日', axis=1)
2104
- df['第n周'] = df['日期'].apply(lambda x: x.strftime('第%W周'))
2105
- df['索引'] = p
2106
- df['月索引'] = mon
2107
- df.sort_values('日期', ascending=False, ignore_index=True, inplace=True)
2108
-
2109
- m = mysql.MysqlUpload(
2110
- username=username,
2111
- password=password,
2112
- host=host,
2113
- port=port,
2114
- )
2115
- m.df_to_mysql(
2116
- df=df,
2117
- db_name='聚合数据',
2118
- table_name='日期表',
2119
- move_insert=True, # 先删除,再插入
2120
- df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
2121
- drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
2122
- count=None,
2123
- filename=None, # 用来追踪处理进度
2124
- set_typ={},
2125
- )
2126
-
2127
-
2128
- def data_aggregation(months=1, is_juhe=True, less_dict=[]):
2129
- """
2130
- 1. 从数据库中读取数据
2131
- 2. 数据聚合清洗
2132
- 3. 统一回传数据库: <聚合数据> (不再导出为文件)
2133
- 公司台式机调用
2134
- months: 1+,写 0 表示当月数据,但在每月 1 号时可能会因为返回空数据出错
2135
- is_juhe: 聚合数据
2136
- less_dict::只聚合某个特定的库
2137
- """
2138
- if months == 0:
2139
- print(f'months 不建议为 0 ')
2140
- return
2141
-
2142
- sdq = MysqlDatasQuery() # 实例化数据处理类
2143
- sdq.months = months # 设置数据周期, 1 表示近 2 个月
2144
- g = GroupBy() # 实例化数据聚合类
2145
- # 实例化数据库连接
2146
-
2147
- m = mysql.MysqlUpload(username=username, password=password, host=host, port=port)
2148
-
2149
- # 从数据库中获取数据, 返回包含 df 数据的字典
2150
- data_dict = [
2151
- {
2152
- '数据库名': '聚合数据', # 清洗完回传的目的地数据库
2153
- '集合名': '天猫_主体报表', # 清洗完回传的数据表名
2154
- '唯一主键': ['日期', '推广渠道', '营销场景', '商品id', '花费'],
2155
- '数据主体': sdq.tg_wxt(),
2156
- },
2157
- {
2158
- '数据库名': '聚合数据',
2159
- '集合名': '生意经_宝贝指标',
2160
- '唯一主键': ['日期', '宝贝id'], # 不能加其他字段做主键,比如销售额,是变动的,不是唯一的
2161
- '数据主体': sdq.syj(),
2162
- },
2163
- {
2164
- '数据库名': '聚合数据',
2165
- '集合名': '店铺流量来源构成',
2166
- '唯一主键': ['日期', '一级来源', '二级来源', '三级来源', '访客数'],
2167
- '数据主体': sdq.dplyd(),
2168
- },
2169
- {
2170
- '数据库名': '聚合数据',
2171
- '集合名': '商品id编码表',
2172
- '唯一主键': ['宝贝id'],
2173
- '数据主体': sdq.idbm(),
2174
- },
2175
- {
2176
- '数据库名': '聚合数据',
2177
- '集合名': '商品id图片对照表',
2178
- '唯一主键': ['商品id'],
2179
- '数据主体': sdq.sp_picture(),
2180
- },
2181
- {
2182
- '数据库名': '聚合数据',
2183
- '集合名': '商品成本', # 暂缺 10.31
2184
- '唯一主键': ['款号'],
2185
- '数据主体': sdq.sp_cost(),
2186
- },
2187
- {
2188
- '数据库名': '聚合数据',
2189
- '集合名': '京东_京准通',
2190
- '唯一主键': ['日期', '产品线', '触发sku_id', '跟单sku_id', '花费', ],
2191
- '数据主体': sdq.jdjzt(),
2192
- },
2193
- {
2194
- '数据库名': '聚合数据',
2195
- '集合名': '京东_京准通_全站营销', # 暂缺
2196
- '唯一主键': ['日期', '产品线', '花费'],
2197
- '数据主体': sdq.jdqzyx(),
2198
- },
2199
- {
2200
- '数据库名': '聚合数据',
2201
- '集合名': '京东_sku_商品明细',
2202
- '唯一主键': ['日期', '商品id', '成交单量'],
2203
- '数据主体': sdq.sku_sales(),
2204
- },
2205
- {
2206
- '数据库名': '聚合数据',
2207
- '集合名': '京东_spu_商品明细',
2208
- '唯一主键': ['日期', '商品id', '成交单量'],
2209
- '数据主体': sdq.spu_sales(),
2210
- },
2211
- {
2212
- '数据库名': '聚合数据',
2213
- '集合名': '天猫_人群报表',
2214
- '唯一主键': ['日期', '推广渠道', '营销场景', '商品id', '花费', '人群名字'],
2215
- '数据主体': sdq.tg_rqbb(),
2216
- },
2217
- {
2218
- '数据库名': '聚合数据',
2219
- '集合名': '天猫_关键词报表',
2220
- '唯一主键': ['日期', '推广渠道', '营销场景', '商品id', '花费', '词类型', '词名字_词包名字',],
2221
- '数据主体': sdq.tg_gjc(),
2222
- },
2223
- {
2224
- '数据库名': '聚合数据',
2225
- '集合名': '天猫_超级直播',
2226
- '唯一主键': ['日期', '推广渠道', '营销场景', '花费'],
2227
- '数据主体': sdq.tg_cjzb(),
2228
- },
2229
- {
2230
- '数据库名': '聚合数据',
2231
- '集合名': '京东_关键词报表',
2232
- '唯一主键': ['日期', '产品线', '搜索词', '关键词', '展现数', '花费'],
2233
- '数据主体': sdq.jd_gjc(),
2234
- },
2235
- {
2236
- '数据库名': '聚合数据',
2237
- '集合名': '天猫_品销宝账户报表',
2238
- '唯一主键': ['日期', '报表类型', '推广渠道', '营销场景', '花费'],
2239
- '数据主体': sdq.pxb_zh(),
2240
- },
2241
- {
2242
- '数据库名': '聚合数据',
2243
- '集合名': '天猫店铺来源_手淘搜索', # 暂缺
2244
- '唯一主键': ['日期', '关键词', '访客数'],
2245
- '数据主体': sdq.se_search(),
2246
- },
2247
- {
2248
- '数据库名': '聚合数据',
2249
- '集合名': '生意参谋_直播场次分析', # 暂缺
2250
- '唯一主键': ['场次id'],
2251
- '数据主体': sdq.zb_ccfx(),
2252
- },
2253
- {
2254
- '数据库名': '聚合数据',
2255
- '集合名': '多店推广场景_按日聚合',
2256
- '唯一主键': [],
2257
- '数据主体': sdq.tg_by_day(),
2258
- },
2259
- {
2260
- '数据库名': '聚合数据',
2261
- '集合名': '爱库存_商品spu榜单',
2262
- '唯一主键': [],
2263
- '数据主体': sdq.aikucun_bd_spu(),
2264
- },
2265
- {
2266
- '数据库名': '聚合数据',
2267
- '集合名': '达摩盘_人群报表',
2268
- '唯一主键': [],
2269
- '数据主体': sdq.dmp_crowd(),
2270
- },
2271
- ]
2272
-
2273
- if less_dict:
2274
- data_dict = [item for item in data_dict if item['集合名'] in less_dict]
2275
- for items in data_dict: # 遍历返回结果
2276
- db_name, table_name, unique_key_list, df = items['数据库名'], items['集合名'], items['唯一主键'], items['数据主体']
2277
- df = g.groupby(df=df, table_name=table_name, is_maximize=True) # 2. 聚合数据
2278
- if len(g.sp_index_datas) != 0:
2279
- # 由推广主体报表,写入一个商品索引表,索引规则:从上月 1 号至今花费从高到低排序
2280
- m.df_to_mysql(
2281
- df=g.sp_index_datas,
2282
- db_name='属性设置3',
2283
- table_name='商品索引表_主推排序调用',
2284
- move_insert=False, # 先删除,再插入
2285
- # df_sql=True,
2286
- drop_duplicates=False,
2287
- icm_update=['商品id'],
2288
- count=None,
2289
- filename=None,
2290
- set_typ={},
2291
- )
2292
- g.sp_index_datas = pd.DataFrame() # 重置,不然下个循环会继续刷入数据库
2293
- # g.as_csv(df=df, filename=table_name + '.csv') # 导出 csv
2294
- if '日期' in df.columns.tolist():
2295
- m.df_to_mysql(
2296
- df=df,
2297
- db_name=db_name,
2298
- table_name=table_name,
2299
- move_insert=True, # 先删除,再插入
2300
- # df_sql=True,
2301
- # drop_duplicates=False,
2302
- # icm_update=unique_key_list,
2303
- count=None,
2304
- filename=None,
2305
- set_typ={},
2306
- ) # 3. 回传数据库
2307
- else: # 没有日期列的就用主键排重
2308
- m.df_to_mysql(
2309
- df=df,
2310
- db_name=db_name,
2311
- table_name=table_name,
2312
- move_insert=False, # 先删除,再插入
2313
- # df_sql=True,
2314
- drop_duplicates=False,
2315
- icm_update=unique_key_list,
2316
- count=None,
2317
- filename=None,
2318
- set_typ={},
2319
- ) # 3. 回传数据库
2320
- if is_juhe:
2321
- res = g.performance(bb_tg=True) # 盈亏表,依赖其他表,单独做
2322
- m.df_to_mysql(
2323
- df=res,
2324
- db_name='聚合数据',
2325
- table_name='_全店商品销售',
2326
- move_insert=True, # 先删除,再插入
2327
- # df_sql=True,
2328
- # drop_duplicates=False,
2329
- # icm_update=['日期', '商品id'], # 设置唯一主键
2330
- count=None,
2331
- filename=None,
2332
- set_typ={},
2333
- )
2334
- res = g.performance(bb_tg=False) # 盈亏表,依赖其他表,单独做
2335
- m.df_to_mysql(
2336
- df=res,
2337
- db_name='聚合数据',
2338
- table_name='_推广商品销售',
2339
- move_insert=True, # 先删除,再插入
2340
- # df_sql=True,
2341
- # drop_duplicates=False,
2342
- # icm_update=['日期', '商品id'], # 设置唯一主键
2343
- count=None,
2344
- filename=None,
2345
- set_typ={},
2346
- )
2347
- res = g.performance_concat(bb_tg=False) # 推广主体合并直播表,依赖其他表,单独做
2348
- m.df_to_mysql(
2349
- df=res,
2350
- db_name='聚合数据',
2351
- table_name='天猫_推广汇总',
2352
- move_insert=True, # 先删除,再插入
2353
- # df_sql=True,
2354
- # drop_duplicates=False,
2355
- # icm_update=['日期', '推广渠道', '营销场景', '商品id', '花费', '展现量', '点击量'], # 设置唯一主键
2356
- count=None,
2357
- filename=None,
2358
- set_typ={},
2359
- )
2360
- res = g.performance_jd(jd_tg=False) # 盈亏表,依赖其他表,单独做
2361
- m.df_to_mysql(
2362
- df=res,
2363
- db_name='聚合数据',
2364
- table_name='_京东_推广商品销售',
2365
- move_insert=True, # 先删除,再插入
2366
- # df_sql=True,
2367
- # drop_duplicates=False,
2368
- # icm_update=['日期', '跟单sku_id', '货号', '花费'], # 设置唯一主键
2369
- count=None,
2370
- filename=None,
2371
- set_typ={},
2372
- )
2373
-
2374
-
2375
- def main(days=100, months=3):
2376
- # 1. 更新日期表 更新货品年份基准表, 属性设置 3 - 货品年份基准
2377
- date_table()
2378
- p = products.Products()
2379
- p.to_mysql()
2380
-
2381
- # 2. 清理非聚合数据库
2382
- system = platform.system() # 本机系统
2383
- host_name = socket.gethostname() # 本机名
2384
- conf = myconfig.main()
2385
- db_list = conf[system][host_name]['mysql']['数据库集']
2386
- not_juhe_db_list = [item for item in db_list if item != '聚合数据']
2387
- optimize_data.op_data(
2388
- db_name_lists=not_juhe_db_list,
2389
- days=31, # 原始数据不需要设置清理太长
2390
- is_mongo=False,
2391
- is_mysql=True,
2392
- )
2393
-
2394
- # 3. 数据聚合
2395
- data_aggregation(
2396
- months=months,
2397
- is_juhe=True, # 生成聚合表
2398
- # less_dict=['天猫_品销宝账户报表'], # 单独聚合某一个数据库
2399
- )
2400
- time.sleep(60)
2401
-
2402
- # 4. 清理聚合数据
2403
- optimize_data.op_data(
2404
- db_name_lists=['聚合数据'],
2405
- days=days,
2406
- is_mongo=False,
2407
- is_mysql=True,
2408
- )
2409
-
2410
-
2411
- if __name__ == '__main__':
2412
- # main(days=100, months=3)
2413
-
2414
- # data_aggregation(
2415
- # months=3,
2416
- # is_juhe=True, # 生成聚合表
2417
- # # less_dict=['天猫_品销宝账户报表'], # 单独聚合某一个数据库
2418
- # )
2419
- data_aggregation(
2420
- months=1,
2421
- is_juhe=True, # 生成聚合表
2422
- # less_dict=['天猫_品销宝账户报表'], # 单独聚合某一个数据库
2423
- )