mdbq 2.9.8__py3-none-any.whl → 3.0.0__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/aggregation/query_data.py +308 -36
- mdbq/mysql/mysql.py +0 -6
- {mdbq-2.9.8.dist-info → mdbq-3.0.0.dist-info}/METADATA +1 -1
- {mdbq-2.9.8.dist-info → mdbq-3.0.0.dist-info}/RECORD +6 -6
- {mdbq-2.9.8.dist-info → mdbq-3.0.0.dist-info}/WHEEL +1 -1
- {mdbq-2.9.8.dist-info → mdbq-3.0.0.dist-info}/top_level.txt +0 -0
mdbq/aggregation/query_data.py
CHANGED
@@ -51,6 +51,9 @@ class MysqlDatasQuery:
|
|
51
51
|
self.months = 0 # 下载几个月数据, 0 表示当月, 1 是上月 1 号至今
|
52
52
|
# 实例化一个下载类
|
53
53
|
self.download = s_query.QueryDatas(username=username, password=password, host=host, port=port)
|
54
|
+
self.update_service = True # 调试时加,true: 将数据写入 mysql 服务器
|
55
|
+
self.pf_datas = []
|
56
|
+
self.pf_datas_jd = [] # 京东聚合销售表
|
54
57
|
|
55
58
|
@staticmethod
|
56
59
|
def try_except(func): # 在类内部定义一个异常处理方法
|
@@ -145,6 +148,22 @@ class MysqlDatasQuery:
|
|
145
148
|
'直接成交笔数': 'int',
|
146
149
|
'直接成交金额': 'decimal(12,2)',
|
147
150
|
}
|
151
|
+
self.pf_datas.append(
|
152
|
+
{
|
153
|
+
'集合名称': table_name,
|
154
|
+
'数据主体': df[['日期', '店铺名称', '商品id', '花费', '成交金额', '直接成交金额']]
|
155
|
+
}
|
156
|
+
) # 制作其他聚合表
|
157
|
+
self.pf_datas.append(
|
158
|
+
{
|
159
|
+
'集合名称': '天猫汇总表调用',
|
160
|
+
'数据主体': df[
|
161
|
+
['日期', '店铺名称', '推广渠道', '营销场景', '商品id', '花费', '展现量', '点击量', '加购量',
|
162
|
+
'成交笔数', '成交金额', '直接成交笔数', '直接成交金额', '自然流量曝光量']]
|
163
|
+
}
|
164
|
+
) # 制作其他聚合表
|
165
|
+
if not self.update_service:
|
166
|
+
return
|
148
167
|
min_date = df['日期'].min()
|
149
168
|
max_date = df['日期'].max()
|
150
169
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
@@ -221,9 +240,17 @@ class MysqlDatasQuery:
|
|
221
240
|
'退款额': 'decimal(12,2)',
|
222
241
|
'退款额_发货后': 'decimal(12,2)',
|
223
242
|
'退货量_发货后': 'int',
|
224
|
-
'件均价': '
|
243
|
+
'件均价': 'mediumint',
|
225
244
|
'价格带': 'varchar(100)',
|
226
245
|
}
|
246
|
+
self.pf_datas.append(
|
247
|
+
{
|
248
|
+
'集合名称': table_name,
|
249
|
+
'数据主体': df[['日期', '店铺名称', '宝贝id', '销售额', '销售量', '退款额_发货后', '退货量_发货后']]
|
250
|
+
}
|
251
|
+
) # 制作其他聚合表
|
252
|
+
if not self.update_service:
|
253
|
+
return
|
227
254
|
min_date = df['日期'].min()
|
228
255
|
max_date = df['日期'].max()
|
229
256
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
@@ -628,6 +655,14 @@ class MysqlDatasQuery:
|
|
628
655
|
}
|
629
656
|
)
|
630
657
|
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
658
|
+
self.pf_datas.append(
|
659
|
+
{
|
660
|
+
'集合名称': table_name,
|
661
|
+
'数据主体': df[['日期', '店铺名称', '推广渠道', '营销场景', '花费', '展现量', '观看次数', '加购量', '成交笔数', '成交金额', '直接成交笔数', '直接成交金额']]
|
662
|
+
},
|
663
|
+
) # 制作其他聚合表
|
664
|
+
if not self.update_service:
|
665
|
+
return
|
631
666
|
set_typ = {
|
632
667
|
'日期': 'date',
|
633
668
|
'推广渠道': 'varchar(100)',
|
@@ -730,6 +765,14 @@ class MysqlDatasQuery:
|
|
730
765
|
)
|
731
766
|
df.insert(loc=1, column='推广渠道', value='品销宝') # df中插入新列
|
732
767
|
df.insert(loc=2, column='营销场景', value='品销宝') # df中插入新列
|
768
|
+
self.pf_datas.append(
|
769
|
+
{
|
770
|
+
'集合名称': table_name,
|
771
|
+
'数据主体': df[['日期', '店铺名称', '推广渠道', '营销场景', '花费', '展现量', '点击量', '加购量', '成交笔数', '成交金额']]
|
772
|
+
},
|
773
|
+
) # 制作其他聚合表
|
774
|
+
if not self.update_service:
|
775
|
+
return
|
733
776
|
set_typ = {
|
734
777
|
'日期': 'date',
|
735
778
|
'推广渠道': 'varchar(100)',
|
@@ -793,6 +836,14 @@ class MysqlDatasQuery:
|
|
793
836
|
'二级类目': 'varchar(100)',
|
794
837
|
'三级类目': 'varchar(100)',
|
795
838
|
}
|
839
|
+
self.pf_datas.append(
|
840
|
+
{
|
841
|
+
'集合名称': table_name,
|
842
|
+
'数据主体': df[['宝贝id', '商家编码']]
|
843
|
+
}
|
844
|
+
) # 制作其他聚合表
|
845
|
+
if not self.update_service:
|
846
|
+
return
|
796
847
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
797
848
|
print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
|
798
849
|
m_engine.df_to_mysql(
|
@@ -842,6 +893,14 @@ class MysqlDatasQuery:
|
|
842
893
|
'日期': 'date',
|
843
894
|
'商品链接': 'varchar(255)',
|
844
895
|
}
|
896
|
+
self.pf_datas.append(
|
897
|
+
{
|
898
|
+
'集合名称': table_name,
|
899
|
+
'数据主体': df[['商品id', '商品图片']]
|
900
|
+
}
|
901
|
+
) # 制作其他聚合表
|
902
|
+
if not self.update_service:
|
903
|
+
return
|
845
904
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
846
905
|
print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name}')
|
847
906
|
m_engine.df_to_mysql(
|
@@ -960,8 +1019,16 @@ class MysqlDatasQuery:
|
|
960
1019
|
'天猫页面价': 'decimal(10,2)',
|
961
1020
|
'天猫中促价': 'decimal(10,2)',
|
962
1021
|
}
|
963
|
-
|
964
|
-
|
1022
|
+
self.pf_datas.append(
|
1023
|
+
{
|
1024
|
+
'集合名称': table_name,
|
1025
|
+
'数据主体': df[['款号', '成本价']]
|
1026
|
+
}
|
1027
|
+
) # 制作其他聚合表
|
1028
|
+
if not self.update_service:
|
1029
|
+
return
|
1030
|
+
min_date = pd.to_datetime(df['日期'].min()).strftime('%Y-%m-%d')
|
1031
|
+
max_date = pd.to_datetime(df['日期'].max()).strftime('%Y-%m-%d')
|
965
1032
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
966
1033
|
print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
|
967
1034
|
m_engine.df_to_mysql(
|
@@ -1018,6 +1085,14 @@ class MysqlDatasQuery:
|
|
1018
1085
|
}
|
1019
1086
|
)
|
1020
1087
|
df = df[df['花费'] > 0]
|
1088
|
+
self.pf_datas_jd.append(
|
1089
|
+
{
|
1090
|
+
'集合名称': table_name,
|
1091
|
+
'数据主体': df[['日期', '产品线', '触发sku_id', '跟单sku_id', '花费']]
|
1092
|
+
}
|
1093
|
+
) # 制作其他聚合表
|
1094
|
+
if not self.update_service:
|
1095
|
+
return
|
1021
1096
|
set_typ = {
|
1022
1097
|
'日期': 'date',
|
1023
1098
|
'店铺名称': 'varchar(100)',
|
@@ -1247,6 +1322,14 @@ class MysqlDatasQuery:
|
|
1247
1322
|
'成交金额': ('成交金额', np.max),
|
1248
1323
|
}
|
1249
1324
|
)
|
1325
|
+
self.pf_datas_jd.append(
|
1326
|
+
{
|
1327
|
+
'集合名称': table_name,
|
1328
|
+
'数据主体': df
|
1329
|
+
}
|
1330
|
+
) # 制作其他聚合表
|
1331
|
+
if not self.update_service:
|
1332
|
+
return
|
1250
1333
|
set_typ = {
|
1251
1334
|
'日期': 'date',
|
1252
1335
|
'店铺名称': 'varchar(100)',
|
@@ -1399,11 +1482,15 @@ class MysqlDatasQuery:
|
|
1399
1482
|
'客单价': 'decimal(10,2)',
|
1400
1483
|
'uv价值': 'decimal(10,2)',
|
1401
1484
|
}
|
1485
|
+
min_date = df['日期'].min()
|
1486
|
+
max_date = df['日期'].max()
|
1487
|
+
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
1488
|
+
print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
|
1402
1489
|
m_engine.df_to_mysql(
|
1403
1490
|
df=df,
|
1404
1491
|
db_name=db_name,
|
1405
1492
|
table_name=table_name,
|
1406
|
-
icm_update=['日期', '
|
1493
|
+
icm_update=['日期', '店铺名称', '词类型', '搜索词'], # 增量更新, 在聚合数据中使用,其他不要用
|
1407
1494
|
move_insert=False, # 先删除,再插入
|
1408
1495
|
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
1409
1496
|
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
@@ -1783,6 +1870,8 @@ class MysqlDatasQuery:
|
|
1783
1870
|
'成交笔数': 'int',
|
1784
1871
|
'成交金额': 'decimal(12,2)',
|
1785
1872
|
}
|
1873
|
+
if not self.update_service:
|
1874
|
+
return
|
1786
1875
|
min_date = df['日期'].min()
|
1787
1876
|
max_date = df['日期'].max()
|
1788
1877
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
@@ -2296,33 +2385,65 @@ class MysqlDatasQuery:
|
|
2296
2385
|
return result
|
2297
2386
|
|
2298
2387
|
# @try_except
|
2299
|
-
def performance(self, bb_tg=True):
|
2300
|
-
|
2301
|
-
tg
|
2302
|
-
|
2303
|
-
|
2304
|
-
|
2305
|
-
|
2306
|
-
|
2307
|
-
|
2308
|
-
|
2309
|
-
|
2310
|
-
|
2311
|
-
|
2312
|
-
|
2313
|
-
|
2388
|
+
def performance(self, db_name, table_name, bb_tg=True):
|
2389
|
+
|
2390
|
+
tg= [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '天猫_主体报表'][0]
|
2391
|
+
syj = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '生意经_宝贝指标'][0]
|
2392
|
+
idbm = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '商品id编码表'][0]
|
2393
|
+
pic = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '商品id图片对照表'][0]
|
2394
|
+
cost = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '商品成本'][0]
|
2395
|
+
|
2396
|
+
# 由于推广表之前根据场景、营销渠道等聚合的,这里不含这些字段所以要进一步聚合
|
2397
|
+
tg = tg.groupby(
|
2398
|
+
['日期', '店铺名称', '商品id'],
|
2399
|
+
as_index=False).agg(
|
2400
|
+
**{
|
2401
|
+
'花费': ('花费', np.sum),
|
2402
|
+
'成交金额': ('成交金额', np.sum),
|
2403
|
+
'直接成交金额': ('直接成交金额', np.sum),
|
2404
|
+
}
|
2405
|
+
)
|
2406
|
+
# 4. 生意经,推广表聚合
|
2314
2407
|
if bb_tg is True:
|
2315
2408
|
# 生意经合并推广表,完整的数据表,包含全店所有推广、销售数据
|
2316
|
-
df = pd.merge(syj,
|
2409
|
+
df = pd.merge(syj, tg, how='left', left_on=['日期', '店铺名称', '宝贝id'], right_on=['日期', '店铺名称', '商品id'])
|
2317
2410
|
df.drop(labels='商品id', axis=1, inplace=True) # 因为生意经中的宝贝 id 列才是完整的
|
2318
2411
|
df.rename(columns={'宝贝id': '商品id'}, inplace=True)
|
2319
|
-
# df.to_csv('/Users/xigua/Downloads/test.csv', encoding='utf-8_sig', index=False, header=True)
|
2320
2412
|
else:
|
2321
2413
|
# 推广表合并生意经 , 以推广数据为基准,销售数据不齐全
|
2322
|
-
df = pd.merge(
|
2414
|
+
df = pd.merge(tg, syj, how='left', left_on=['日期', '店铺名称', '商品id'], right_on=['日期', '店铺名称', '宝贝id'])
|
2323
2415
|
df.drop(labels='宝贝id', axis=1, inplace=True)
|
2324
|
-
|
2325
|
-
df.
|
2416
|
+
|
2417
|
+
df['商品id'] = df['商品id'].astype(int)
|
2418
|
+
df = df.groupby(
|
2419
|
+
['日期', '店铺名称', '商品id'],
|
2420
|
+
as_index=False).agg(
|
2421
|
+
**{
|
2422
|
+
'花费': ('花费', np.sum),
|
2423
|
+
'成交金额': ('成交金额', np.sum),
|
2424
|
+
'直接成交金额': ('直接成交金额', np.sum),
|
2425
|
+
'销售额': ('销售额', np.sum),
|
2426
|
+
'销售量': ('销售量', np.sum),
|
2427
|
+
'退款额_发货后': ('退款额_发货后', np.sum),
|
2428
|
+
'退货量_发货后': ('退货量_发货后', np.sum),
|
2429
|
+
}
|
2430
|
+
)
|
2431
|
+
# print(df.info())
|
2432
|
+
|
2433
|
+
idbm['宝贝id'] = idbm['宝贝id'].astype(int)
|
2434
|
+
# 1. id 编码表合并图片表
|
2435
|
+
df_cb = pd.merge(idbm, pic, how='left', left_on='宝贝id', right_on='商品id')
|
2436
|
+
df_cb = df_cb[['宝贝id', '商家编码', '商品图片']]
|
2437
|
+
# 2. df 合并商品成本表
|
2438
|
+
df_cb = pd.merge(df_cb, cost, how='left', left_on='商家编码', right_on='款号')
|
2439
|
+
df_cb = df_cb[['宝贝id', '商家编码', '商品图片', '成本价']]
|
2440
|
+
# print(df_cb.info())
|
2441
|
+
# 3. 合并 df
|
2442
|
+
df = pd.merge(df, df_cb, how='left', left_on='商品id', right_on='宝贝id')
|
2443
|
+
df.drop(labels='宝贝id', axis=1, inplace=True)
|
2444
|
+
|
2445
|
+
# df.drop_duplicates(subset=['日期', '店铺名称', '商品id', '花费', '销售额'], keep='last', inplace=True, ignore_index=True)
|
2446
|
+
# df.fillna(0, inplace=True)
|
2326
2447
|
df['成本价'] = df['成本价'].astype('float64')
|
2327
2448
|
df['销售额'] = df['销售额'].astype('float64')
|
2328
2449
|
df['销售量'] = df['销售量'].astype('int64')
|
@@ -2330,11 +2451,75 @@ class MysqlDatasQuery:
|
|
2330
2451
|
df['商品毛利'] = df.apply(lambda x: x['销售额'] - x['商品成本'], axis=1)
|
2331
2452
|
df['毛利率'] = df.apply(lambda x: round((x['销售额'] - x['商品成本']) / x['销售额'], 4) if x['销售额'] > 0 else 0, axis=1)
|
2332
2453
|
df['盈亏'] = df.apply(lambda x: x['商品毛利'] - x['花费'], axis=1)
|
2333
|
-
|
2454
|
+
[df[col].apply(lambda x: '0' if str(x) == '' else x) for col in df.columns.tolist()]
|
2455
|
+
set_typ = {
|
2456
|
+
'日期': 'date',
|
2457
|
+
'店铺名称': 'varchar(100)',
|
2458
|
+
'商品id': 'bigint',
|
2459
|
+
'销售额': 'decimal(12,2)',
|
2460
|
+
'销售量': 'int',
|
2461
|
+
'退款额_发货后': 'decimal(12,2)',
|
2462
|
+
'退货量_发货后': 'int',
|
2463
|
+
'花费': 'decimal(12,2)',
|
2464
|
+
'成交金额': 'decimal(12,2)',
|
2465
|
+
'直接成交金额': 'decimal(12,2)',
|
2466
|
+
'商家编码': 'varchar(100)',
|
2467
|
+
'商品图片': 'varchar(255)',
|
2468
|
+
'成本价': 'decimal(10,2)',
|
2469
|
+
'商品成本': 'decimal(10,2)',
|
2470
|
+
'商品毛利': 'decimal(10,2)',
|
2471
|
+
'毛利率': 'decimal(12,4)',
|
2472
|
+
'盈亏': 'decimal(12,4)',
|
2473
|
+
}
|
2474
|
+
if not self.update_service:
|
2475
|
+
return
|
2476
|
+
min_date = df['日期'].min()
|
2477
|
+
max_date = df['日期'].max()
|
2478
|
+
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
2479
|
+
print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
|
2480
|
+
m_engine.df_to_mysql(
|
2481
|
+
df=df,
|
2482
|
+
db_name=db_name,
|
2483
|
+
table_name=table_name,
|
2484
|
+
icm_update=[], # 增量更新, 在聚合数据中使用,其他不要用
|
2485
|
+
move_insert=True, # 先删除,再插入
|
2486
|
+
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
2487
|
+
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
2488
|
+
count=None,
|
2489
|
+
filename=None, # 用来追踪处理进度
|
2490
|
+
reset_id=False, # 是否重置自增列
|
2491
|
+
set_typ=set_typ,
|
2492
|
+
)
|
2493
|
+
return True
|
2334
2494
|
|
2335
2495
|
# @try_except
|
2336
|
-
def performance_concat(self, bb_tg=True):
|
2337
|
-
tg
|
2496
|
+
def performance_concat(self, db_name, table_name, bb_tg=True):
|
2497
|
+
tg = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '天猫汇总表调用'][0]
|
2498
|
+
zb = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '天猫_超级直播'][0]
|
2499
|
+
pxb = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '天猫_品销宝账户报表'][0]
|
2500
|
+
zb = zb.groupby(['日期', '店铺名称', '推广渠道', '营销场景'], as_index=False).agg(
|
2501
|
+
**{
|
2502
|
+
'花费': ('花费', np.sum),
|
2503
|
+
'展现量': ('展现量', np.sum),
|
2504
|
+
'观看次数': ('观看次数', np.sum),
|
2505
|
+
'加购量': ('加购量', np.sum),
|
2506
|
+
'成交笔数': ('成交笔数', np.sum),
|
2507
|
+
'成交金额': ('成交金额', np.sum),
|
2508
|
+
'直接成交笔数': ('直接成交笔数', np.sum),
|
2509
|
+
'直接成交金额': ('直接成交金额', np.sum),
|
2510
|
+
}
|
2511
|
+
)
|
2512
|
+
pxb = pxb.groupby(['日期', '店铺名称', '推广渠道', '营销场景'], as_index=False).agg(
|
2513
|
+
**{
|
2514
|
+
'花费': ('花费', np.sum),
|
2515
|
+
'展现量': ('展现量', np.sum),
|
2516
|
+
'点击量': ('点击量', np.sum),
|
2517
|
+
'加购量': ('加购量', np.sum),
|
2518
|
+
'成交笔数': ('成交笔数', np.sum),
|
2519
|
+
'成交金额': ('成交金额', np.sum)
|
2520
|
+
}
|
2521
|
+
)
|
2522
|
+
|
2338
2523
|
zb.rename(columns={
|
2339
2524
|
'观看次数': '点击量',
|
2340
2525
|
}, inplace=True)
|
@@ -2379,23 +2564,62 @@ class MysqlDatasQuery:
|
|
2379
2564
|
'自然流量曝光量': int,
|
2380
2565
|
}
|
2381
2566
|
)
|
2382
|
-
|
2567
|
+
[df[col].apply(lambda x: '0' if str(x) == '' else x) for col in df.columns.tolist()]
|
2568
|
+
set_typ = {
|
2569
|
+
'日期': 'date',
|
2570
|
+
'店铺名称': 'varchar(100)',
|
2571
|
+
'推广渠道': 'varchar(100)',
|
2572
|
+
'营销场景': 'varchar(100)',
|
2573
|
+
'商品id': 'bigint',
|
2574
|
+
'花费': 'decimal(12,2)',
|
2575
|
+
'展现量': 'int',
|
2576
|
+
'点击量': 'int',
|
2577
|
+
'加购量': 'int',
|
2578
|
+
'成交笔数': 'int',
|
2579
|
+
'成交金额': 'decimal(12,2)',
|
2580
|
+
'直接成交笔数': 'int',
|
2581
|
+
'直接成交金额': 'decimal(12,2)',
|
2582
|
+
'自然流量曝光量': 'int',
|
2583
|
+
}
|
2584
|
+
if not self.update_service:
|
2585
|
+
return
|
2586
|
+
min_date = df['日期'].min()
|
2587
|
+
max_date = df['日期'].max()
|
2588
|
+
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
2589
|
+
print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
|
2590
|
+
m_engine.df_to_mysql(
|
2591
|
+
df=df,
|
2592
|
+
db_name=db_name,
|
2593
|
+
table_name=table_name,
|
2594
|
+
icm_update=[], # 增量更新, 在聚合数据中使用,其他不要用
|
2595
|
+
move_insert=True, # 先删除,再插入
|
2596
|
+
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
2597
|
+
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
2598
|
+
count=None,
|
2599
|
+
filename=None, # 用来追踪处理进度
|
2600
|
+
reset_id=False, # 是否重置自增列
|
2601
|
+
set_typ=set_typ,
|
2602
|
+
)
|
2603
|
+
return True
|
2383
2604
|
|
2384
2605
|
# @try_except
|
2385
|
-
def performance_jd(self, jd_tg=True):
|
2386
|
-
jdtg
|
2606
|
+
def performance_jd(self, db_name, table_name, jd_tg=True, ):
|
2607
|
+
jdtg = [item['数据主体'] for item in self.pf_datas_jd if item['集合名称'] == '京东_京准通'][0]
|
2608
|
+
sku_sales = [item['数据主体'] for item in self.pf_datas_jd if item['集合名称'] == '京东_sku_商品明细'][0]
|
2609
|
+
cost = [item['数据主体'] for item in self.pf_datas if item['集合名称'] == '商品成本'][0]
|
2610
|
+
|
2387
2611
|
jdtg = jdtg.groupby(['日期', '跟单sku_id'],
|
2388
2612
|
as_index=False).agg(
|
2389
2613
|
**{
|
2390
2614
|
'花费': ('花费', np.sum)
|
2391
2615
|
}
|
2392
2616
|
)
|
2393
|
-
cost = self.data_tgyj['商品成本']
|
2394
2617
|
df = pd.merge(sku_sales, cost, how='left', left_on='货号', right_on='款号')
|
2395
2618
|
df = df[['日期', '商品id', '货号', '成交单量', '成交金额', '成本价']]
|
2396
2619
|
df['商品id'] = df['商品id'].astype(str)
|
2397
2620
|
jdtg['跟单sku_id'] = jdtg['跟单sku_id'].astype(str)
|
2398
2621
|
jdtg = jdtg.astype({'日期': 'datetime64[ns]'}, errors='raise')
|
2622
|
+
df = df.astype({'日期': 'datetime64[ns]'}, errors='raise')
|
2399
2623
|
if jd_tg is True:
|
2400
2624
|
# 完整的数据表,包含全店所有推广、销售数据
|
2401
2625
|
df = pd.merge(df, jdtg, how='left', left_on=['日期', '商品id'], right_on=['日期', '跟单sku_id']) # df 合并推广表
|
@@ -2414,7 +2638,40 @@ class MysqlDatasQuery:
|
|
2414
2638
|
df['毛利率'] = df.apply(
|
2415
2639
|
lambda x: round((x['成交金额'] - x['商品成本']) / x['成交金额'], 4) if x['成交金额'] > 0 else 0, axis=1)
|
2416
2640
|
df['盈亏'] = df.apply(lambda x: x['商品毛利'] - x['花费'], axis=1)
|
2417
|
-
|
2641
|
+
[df[col].apply(lambda x: '0' if str(x) == '' else x) for col in df.columns.tolist()]
|
2642
|
+
set_typ = {
|
2643
|
+
'日期': 'date',
|
2644
|
+
'跟单sku_id': 'bigint',
|
2645
|
+
'花费': 'decimal(12,2)',
|
2646
|
+
'货号': 'varchar(100)',
|
2647
|
+
'成交单量': 'int',
|
2648
|
+
'成交金额': 'decimal(12,2)',
|
2649
|
+
'成本价': 'decimal(10,2)',
|
2650
|
+
'商品成本': 'decimal(10,2)',
|
2651
|
+
'商品毛利': 'decimal(10,2)',
|
2652
|
+
'毛利率': 'decimal(12,4)',
|
2653
|
+
'盈亏': 'decimal(12,4)',
|
2654
|
+
}
|
2655
|
+
if not self.update_service:
|
2656
|
+
return
|
2657
|
+
min_date = df['日期'].min()
|
2658
|
+
max_date = df['日期'].max()
|
2659
|
+
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
2660
|
+
print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
|
2661
|
+
m_engine.df_to_mysql(
|
2662
|
+
df=df,
|
2663
|
+
db_name=db_name,
|
2664
|
+
table_name=table_name,
|
2665
|
+
icm_update=[], # 增量更新, 在聚合数据中使用,其他不要用
|
2666
|
+
move_insert=True, # 先删除,再插入
|
2667
|
+
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
2668
|
+
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
2669
|
+
count=None,
|
2670
|
+
filename=None, # 用来追踪处理进度
|
2671
|
+
reset_id=False, # 是否重置自增列
|
2672
|
+
set_typ=set_typ,
|
2673
|
+
)
|
2674
|
+
return True
|
2418
2675
|
|
2419
2676
|
|
2420
2677
|
def date_table():
|
@@ -2450,6 +2707,17 @@ def date_table():
|
|
2450
2707
|
host=host,
|
2451
2708
|
port=port,
|
2452
2709
|
)
|
2710
|
+
set_typ = {
|
2711
|
+
'日期': 'date',
|
2712
|
+
'年': 'varchar(50)',
|
2713
|
+
'月': 'varchar(50)',
|
2714
|
+
'日': 'int',
|
2715
|
+
'年月': 'varchar(50)',
|
2716
|
+
'月日': 'varchar(50)',
|
2717
|
+
'第n周': 'varchar(50)',
|
2718
|
+
'索引': 'int',
|
2719
|
+
'月索引': 'int',
|
2720
|
+
}
|
2453
2721
|
m.df_to_mysql(
|
2454
2722
|
df=df,
|
2455
2723
|
db_name='聚合数据',
|
@@ -2459,7 +2727,7 @@ def date_table():
|
|
2459
2727
|
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
2460
2728
|
count=None,
|
2461
2729
|
filename=None, # 用来追踪处理进度
|
2462
|
-
set_typ=
|
2730
|
+
set_typ=set_typ,
|
2463
2731
|
)
|
2464
2732
|
|
2465
2733
|
|
@@ -2483,7 +2751,7 @@ def main(days=100, months=3):
|
|
2483
2751
|
)
|
2484
2752
|
|
2485
2753
|
# 3. 数据聚合
|
2486
|
-
query_(months=
|
2754
|
+
query_(months=months)
|
2487
2755
|
time.sleep(60)
|
2488
2756
|
|
2489
2757
|
# 4. 清理聚合数据
|
@@ -2501,13 +2769,14 @@ def query_(months=1, less_dict=[]):
|
|
2501
2769
|
return
|
2502
2770
|
sdq = MysqlDatasQuery() # 实例化数据处理类
|
2503
2771
|
sdq.months = months # 设置数据周期, 1 表示近 2 个月
|
2772
|
+
sdq.update_service = True # 调试时加,true: 将数据写入 mysql 服务器
|
2504
2773
|
|
2505
2774
|
sdq.tg_wxt(db_name='聚合数据', table_name='天猫_主体报表')
|
2506
2775
|
sdq.syj(db_name='聚合数据', table_name='生意经_宝贝指标')
|
2507
|
-
sdq.dplyd(db_name='聚合数据', table_name='店铺流量来源构成')
|
2508
2776
|
sdq.idbm(db_name='聚合数据', table_name='商品id编码表')
|
2509
2777
|
sdq.sp_picture(db_name='聚合数据', table_name='商品id图片对照表')
|
2510
2778
|
sdq.sp_cost(db_name='聚合数据', table_name='商品成本')
|
2779
|
+
sdq.dplyd(db_name='聚合数据', table_name='店铺流量来源构成')
|
2511
2780
|
sdq.jdjzt(db_name='聚合数据', table_name='京东_京准通')
|
2512
2781
|
sdq.jdqzyx(db_name='聚合数据', table_name='京东_京准通_全站营销')
|
2513
2782
|
sdq.sku_sales(db_name='聚合数据', table_name='京东_sku_商品明细')
|
@@ -2522,9 +2791,12 @@ def query_(months=1, less_dict=[]):
|
|
2522
2791
|
sdq.tg_by_day(db_name='聚合数据', table_name='多店推广场景_按日聚合')
|
2523
2792
|
sdq.aikucun_bd_spu(db_name='聚合数据', table_name='爱库存_商品spu榜单')
|
2524
2793
|
sdq.dmp_crowd(db_name='聚合数据', table_name='达摩盘_人群报表')
|
2794
|
+
sdq.performance(bb_tg=True, db_name='聚合数据', table_name='_全店商品销售') # _全店商品销售
|
2795
|
+
sdq.performance(bb_tg=False, db_name='聚合数据', table_name='_推广商品销售') # _推广商品销售
|
2796
|
+
sdq.performance_jd(jd_tg=False, db_name='聚合数据', table_name='_京东_推广商品销售') # _推广商品销售
|
2797
|
+
sdq.performance_concat(bb_tg=False, db_name='聚合数据', table_name='天猫_推广汇总') # _推广商品销售
|
2525
2798
|
|
2526
2799
|
|
2527
2800
|
if __name__ == '__main__':
|
2528
2801
|
# main(days=100, months=3)
|
2529
|
-
|
2530
2802
|
query_(months=1)
|
mdbq/mysql/mysql.py
CHANGED
@@ -6,19 +6,13 @@ import re
|
|
6
6
|
import time
|
7
7
|
from functools import wraps
|
8
8
|
import warnings
|
9
|
-
from unittest.mock import inplace
|
10
|
-
|
11
9
|
import pymysql
|
12
10
|
import numpy as np
|
13
11
|
import pandas as pd
|
14
|
-
from markdown_it.rules_inline.backticks import regex
|
15
12
|
from sqlalchemy import create_engine
|
16
13
|
import os
|
17
14
|
import calendar
|
18
15
|
from mdbq.config import myconfig
|
19
|
-
from mdbq.config import set_support
|
20
|
-
from mdbq.dataframe import converter
|
21
|
-
from mdbq.aggregation import mysql_types
|
22
16
|
|
23
17
|
warnings.filterwarnings('ignore')
|
24
18
|
"""
|
@@ -5,7 +5,7 @@ mdbq/aggregation/aggregation.py,sha256=2KCVXZygQt4xVxGbFcDMBpL3PukY4yQF_uI-qLSTW
|
|
5
5
|
mdbq/aggregation/df_types.py,sha256=U9i3q2eRPTDY8qAPTw7irzu-Tlg4CIySW9uYro81wdk,8125
|
6
6
|
mdbq/aggregation/mysql_types.py,sha256=YTGyrF9vcRgfkQbpT-e-JdJ7c7VF1dDHgyx9YZRES8w,10934
|
7
7
|
mdbq/aggregation/optimize_data.py,sha256=79uwiM2WqNNFxGpE2wKz742PRq-ZGgFjdOV0vgptHdY,3513
|
8
|
-
mdbq/aggregation/query_data.py,sha256=
|
8
|
+
mdbq/aggregation/query_data.py,sha256=ekMNXE_3tMNUzm4DzkLustCOu62XIEVP-VPHns5nEqY,124191
|
9
9
|
mdbq/aggregation/query_data_bak.py,sha256=r1FU0C4zjXln7oVSrRkElh4Ehl-9mYhGcq57jLbViUA,104071
|
10
10
|
mdbq/bdup/__init__.py,sha256=AkhsGk81SkG1c8FqDH5tRq-8MZmFobVbN60DTyukYTY,28
|
11
11
|
mdbq/bdup/bdup.py,sha256=LAV0TgnQpc-LB-YuJthxb0U42_VkPidzQzAagan46lU,4234
|
@@ -27,7 +27,7 @@ mdbq/log/mylogger.py,sha256=oaT7Bp-Hb9jZt52seP3ISUuxVcI19s4UiqTeouScBO0,3258
|
|
27
27
|
mdbq/mongo/__init__.py,sha256=SILt7xMtQIQl_m-ik9WLtJSXIVf424iYgCfE_tnQFbw,13
|
28
28
|
mdbq/mongo/mongo.py,sha256=v9qvrp6p1ZRWuPpbSilqveiE0FEcZF7U5xUPI0RN4xs,31880
|
29
29
|
mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
|
30
|
-
mdbq/mysql/mysql.py,sha256=
|
30
|
+
mdbq/mysql/mysql.py,sha256=KGfByf3KJF0xG-DeDANbJVmS96jwqbhapXPwlygC8-s,59917
|
31
31
|
mdbq/mysql/recheck_mysql.py,sha256=rgTpvDMWYTyEn7UQdlig-pdXDluTgiU8JG6lkMh8DV0,8665
|
32
32
|
mdbq/mysql/s_query.py,sha256=fnXncwSmA7CB0ELn1a-YxYZDrYkC2Bcgnj2J4dcQ8X8,8481
|
33
33
|
mdbq/mysql/year_month_day.py,sha256=VgewoE2pJxK7ErjfviL_SMTN77ki8GVbTUcao3vFUCE,1523
|
@@ -44,7 +44,7 @@ mdbq/req_post/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
|
|
44
44
|
mdbq/req_post/req_tb.py,sha256=qg7pet73IgKGmCwxaeUyImJIoeK_pBQT9BBKD7fkBNg,36160
|
45
45
|
mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
|
46
46
|
mdbq/spider/aikucun.py,sha256=01qJo_Di5Kmi2lG5_HKb0OI283b1-Pgqh-nnA0pX4TY,19038
|
47
|
-
mdbq-
|
48
|
-
mdbq-
|
49
|
-
mdbq-
|
50
|
-
mdbq-
|
47
|
+
mdbq-3.0.0.dist-info/METADATA,sha256=a3HMAijPDSCqXF_6kAcl83eqlMbaiJP9d2_VnUDDUck,243
|
48
|
+
mdbq-3.0.0.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
|
49
|
+
mdbq-3.0.0.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
50
|
+
mdbq-3.0.0.dist-info/RECORD,,
|
File without changes
|