mdbq 3.0.7__tar.gz → 3.0.9__tar.gz
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-3.0.7 → mdbq-3.0.9}/PKG-INFO +1 -1
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/aggregation/aggregation.py +27 -36
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/aggregation/query_data.py +151 -61
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/mysql/mysql.py +12 -5
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq.egg-info/PKG-INFO +1 -1
- {mdbq-3.0.7 → mdbq-3.0.9}/setup.py +1 -1
- {mdbq-3.0.7 → mdbq-3.0.9}/README.txt +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/__version__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/aggregation/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/aggregation/df_types.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/aggregation/mysql_types.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/aggregation/optimize_data.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/aggregation/query_data_bak.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/bdup/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/bdup/bdup.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/clean/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/clean/clean_upload.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/clean/data_clean.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/company/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/company/copysh.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/config/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/config/get_myconf.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/config/myconfig.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/config/products.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/config/set_support.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/config/update_conf.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/dataframe/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/dataframe/converter.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/log/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/log/mylogger.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/mongo/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/mongo/mongo.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/mysql/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/mysql/recheck_mysql.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/mysql/s_query.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/mysql/year_month_day.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/other/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/other/porxy.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/other/pov_city.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/other/sku_picture.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/other/ua_sj.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/pbix/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/pbix/refresh_all_old.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/req_post/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/req_post/req_tb.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/spider/__init__.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq/spider/aikucun.py +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq.egg-info/SOURCES.txt +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-3.0.7 → mdbq-3.0.9}/setup.cfg +0 -0
@@ -1192,52 +1192,43 @@ def one_file_to_mysql(file, db_name, table_name):
|
|
1192
1192
|
print(f'{os.path.splitext(os.path.basename(__file__))[0]}.one_file_to_mysql: 函数只接受文件, 此文件不存在: {file}')
|
1193
1193
|
return
|
1194
1194
|
filename = os.path.basename(file)
|
1195
|
-
|
1195
|
+
if file.endswith('.xlsx'):
|
1196
|
+
df = pd.read_excel(file)
|
1197
|
+
else:
|
1198
|
+
df = pd.read_csv(file, encoding='utf-8_sig', header=0, na_filter=False, float_precision='high')
|
1196
1199
|
# df.replace(to_replace=[','], value='', regex=True, inplace=True) # 替换掉特殊字符
|
1197
1200
|
m = mysql.MysqlUpload(username=username, password=password, host=host, port=port)
|
1198
1201
|
m.df_to_mysql(
|
1199
1202
|
df=df,
|
1200
1203
|
db_name=db_name,
|
1201
1204
|
table_name=table_name,
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1205
|
+
# icm_update=['sku_id'], # 增量更新, 在聚合数据中使用,其他不要用
|
1206
|
+
move_insert=False, # 先删除,再插入
|
1207
|
+
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
1208
|
+
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
1205
1209
|
count=None,
|
1206
|
-
filename=
|
1210
|
+
filename=None, # 用来追踪处理进度
|
1211
|
+
# reset_id=False, # 是否重置自增列
|
1212
|
+
# set_typ=set_typ,
|
1207
1213
|
)
|
1208
1214
|
|
1209
1215
|
|
1210
1216
|
def test():
|
1211
|
-
path = r'/Users/xigua
|
1217
|
+
path = r'/Users/xigua/Downloads/京准通'
|
1218
|
+
|
1212
1219
|
|
1213
|
-
results = []
|
1214
1220
|
for root, dirs, files in os.walk(path, topdown=False):
|
1215
1221
|
for name in files:
|
1216
1222
|
if name.endswith('.csv') and 'baidu' not in name and '~' not in name:
|
1217
1223
|
# df = pd.read_excel(os.path.join(root, name), header=0)
|
1218
1224
|
df = pd.read_csv(os.path.join(root, name), encoding='utf-8_sig', header=0, na_filter=False)
|
1219
|
-
|
1225
|
+
|
1220
1226
|
# print(name)
|
1221
1227
|
if len(df) == 0:
|
1222
1228
|
continue
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
print(name)
|
1227
|
-
df['更新时间'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
1228
|
-
# df.insert(loc=1, column='店铺名称', value='万里马官方旗舰店')
|
1229
|
-
# df['更新时间'] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
1230
|
-
df.to_csv(os.path.join(root, name), encoding='utf-8_sig', index=False, header=True)
|
1231
|
-
# for col in ['更新时间']:
|
1232
|
-
# if col not in df.columns.tolist():
|
1233
|
-
# print(name)
|
1234
|
-
# df[col] = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
1235
|
-
# df.to_csv(os.path.join(root, name), encoding='utf-8_sig', index=False, header=True)
|
1236
|
-
# pattern = re.findall(r'\d{4}-\d{2}-\d{2}_\d{4}-\d{2}-\d{2}', name)[0]
|
1237
|
-
# new_name = f'py_xg_店铺销售指标_万里马官方旗舰店_{pattern}.csv'
|
1238
|
-
# df.to_csv(os.path.join(root, name), encoding='utf-8_sig', index=False, header=True)
|
1239
|
-
# os.remove(os.path.join(root, name))
|
1240
|
-
# results.append(df)
|
1229
|
+
df['类目ID'] = df['类目ID'].apply(lambda x: 0 if str(x) == 'null' else x)
|
1230
|
+
df['类目名称'] = df['类目ID'].apply(lambda x: 0 if str(x) == 'null' else x)
|
1231
|
+
df.to_csv(os.path.join(root, name), encoding='utf-8_sig', index=False, header=True)
|
1241
1232
|
|
1242
1233
|
|
1243
1234
|
if __name__ == '__main__':
|
@@ -1246,21 +1237,21 @@ if __name__ == '__main__':
|
|
1246
1237
|
# host = ''
|
1247
1238
|
# port = ''
|
1248
1239
|
#
|
1249
|
-
#
|
1250
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
1254
|
-
|
1240
|
+
# 上传 1 个文件到数据库
|
1241
|
+
one_file_to_mysql(
|
1242
|
+
file=r'/Users/xigua/Downloads/批量SKU导出-批量任务.xlsx',
|
1243
|
+
db_name='属性设置3',
|
1244
|
+
table_name='京东商品属性',
|
1245
|
+
)
|
1255
1246
|
|
1256
|
-
test()
|
1257
|
-
# col =
|
1247
|
+
# test()
|
1248
|
+
# col = 1
|
1258
1249
|
# if col:
|
1259
1250
|
# # 上传一个目录到指定数据库
|
1260
1251
|
# db_name = '京东数据3'
|
1261
|
-
# table_name = '推广数据_
|
1252
|
+
# table_name = '推广数据_京准通'
|
1262
1253
|
# upload_dir(
|
1263
|
-
# path=r'/Users/xigua/数据中心/原始文件3
|
1254
|
+
# path=r'/Users/xigua/数据中心/原始文件3/京东报表/推广报表',
|
1264
1255
|
# db_name=db_name,
|
1265
1256
|
# collection_name=table_name,
|
1266
1257
|
# )
|
@@ -111,8 +111,10 @@ class MysqlDatasQuery:
|
|
111
111
|
'直接成交金额': 'float64',
|
112
112
|
}, errors='raise')
|
113
113
|
if is_maximize:
|
114
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '
|
115
|
-
**{
|
114
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
115
|
+
**{
|
116
|
+
'展现量': ('展现量', np.max),
|
117
|
+
'加购量': ('加购量', np.max),
|
116
118
|
'成交笔数': ('成交笔数', np.max),
|
117
119
|
'成交金额': ('成交金额', np.max),
|
118
120
|
'自然流量曝光量': ('自然流量曝光量', np.max),
|
@@ -121,8 +123,9 @@ class MysqlDatasQuery:
|
|
121
123
|
}
|
122
124
|
)
|
123
125
|
else:
|
124
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '
|
126
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量'], as_index=False).agg(
|
125
127
|
**{
|
128
|
+
'展现量': ('展现量', np.min),
|
126
129
|
'加购量': ('加购量', np.min),
|
127
130
|
'成交笔数': ('成交笔数', np.min),
|
128
131
|
'成交金额': ('成交金额', np.min),
|
@@ -131,6 +134,7 @@ class MysqlDatasQuery:
|
|
131
134
|
'直接成交金额': ('直接成交金额', np.max)
|
132
135
|
}
|
133
136
|
)
|
137
|
+
df.to_csv('/Users/xigua/Downloads/zhuti.csv', index=False, header=True, encoding='utf-8_sig')
|
134
138
|
df.insert(loc=1, column='推广渠道', value='万相台无界版') # df中插入新列
|
135
139
|
set_typ = {
|
136
140
|
'日期': 'date',
|
@@ -259,13 +263,14 @@ class MysqlDatasQuery:
|
|
259
263
|
)
|
260
264
|
df['宝贝id'] = df['宝贝id'].astype(str)
|
261
265
|
df = df.groupby(['日期', '店铺名称', '宝贝id', '行业类目'], as_index=False).agg(
|
262
|
-
**{
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
266
|
+
**{
|
267
|
+
'销售额': ('销售额', np.min),
|
268
|
+
'销售量': ('销售量', np.min),
|
269
|
+
'订单数': ('订单数', np.min),
|
270
|
+
'退货量': ('退货量', np.max),
|
271
|
+
'退款额': ('退款额', np.max),
|
272
|
+
'退款额_发货后': ('退款额_发货后', np.max),
|
273
|
+
'退货量_发货后': ('退货量_发货后', np.max),
|
269
274
|
}
|
270
275
|
)
|
271
276
|
df['件均价'] = df.apply(lambda x: x['销售额'] / x['销售量'] if x['销售量'] > 0 else 0, axis=1).round(
|
@@ -366,19 +371,22 @@ class MysqlDatasQuery:
|
|
366
371
|
'直接成交金额': 'float64',
|
367
372
|
}, errors='raise')
|
368
373
|
if is_maximize:
|
369
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '
|
374
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量', '人群名字'],
|
370
375
|
as_index=False).agg(
|
371
|
-
**{
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
376
|
+
**{
|
377
|
+
'展现量': ('展现量', np.max),
|
378
|
+
'加购量': ('加购量', np.max),
|
379
|
+
'成交笔数': ('成交笔数', np.max),
|
380
|
+
'成交金额': ('成交金额', np.max),
|
381
|
+
'直接成交笔数': ('直接成交笔数', np.max),
|
382
|
+
'直接成交金额': ('直接成交金额', np.max)
|
383
|
+
}
|
377
384
|
)
|
378
385
|
else:
|
379
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '
|
386
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '商品id', '花费', '点击量', '人群名字'],
|
380
387
|
as_index=False).agg(
|
381
388
|
**{
|
389
|
+
'展现量': ('展现量', np.min),
|
382
390
|
'加购量': ('加购量', np.min),
|
383
391
|
'成交笔数': ('成交笔数', np.min),
|
384
392
|
'成交金额': ('成交金额', np.min),
|
@@ -552,20 +560,23 @@ class MysqlDatasQuery:
|
|
552
560
|
}, errors='raise')
|
553
561
|
if is_maximize:
|
554
562
|
df = df.groupby(
|
555
|
-
['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '
|
563
|
+
['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '点击量'],
|
556
564
|
as_index=False).agg(
|
557
|
-
**{
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
565
|
+
**{
|
566
|
+
'展现量': ('展现量', np.max),
|
567
|
+
'加购量': ('加购量', np.max),
|
568
|
+
'成交笔数': ('成交笔数', np.max),
|
569
|
+
'成交金额': ('成交金额', np.max),
|
570
|
+
'直接成交笔数': ('直接成交笔数', np.max),
|
571
|
+
'直接成交金额': ('直接成交金额', np.max)
|
572
|
+
}
|
563
573
|
)
|
564
574
|
else:
|
565
575
|
df = df.groupby(
|
566
|
-
['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '
|
576
|
+
['日期', '店铺名称', '营销场景', '商品id', '词类型', '词名字_词包名字', '花费', '点击量'],
|
567
577
|
as_index=False).agg(
|
568
578
|
**{
|
579
|
+
'展现量': ('展现量', np.min),
|
569
580
|
'加购量': ('加购量', np.min),
|
570
581
|
'成交笔数': ('成交笔数', np.min),
|
571
582
|
'成交金额': ('成交金额', np.min),
|
@@ -682,9 +693,10 @@ class MysqlDatasQuery:
|
|
682
693
|
'观看次数': 'int64',
|
683
694
|
}, errors='raise')
|
684
695
|
if is_maximize:
|
685
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数'
|
696
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数'],
|
686
697
|
as_index=False).agg(
|
687
698
|
**{
|
699
|
+
'展现量': ('展现量', np.max),
|
688
700
|
'进店量': ('进店量', np.max),
|
689
701
|
'粉丝关注量': ('粉丝关注量', np.max),
|
690
702
|
'加购量': ('加购量', np.max),
|
@@ -695,9 +707,10 @@ class MysqlDatasQuery:
|
|
695
707
|
}
|
696
708
|
)
|
697
709
|
else:
|
698
|
-
df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数'
|
710
|
+
df = df.groupby(['日期', '店铺名称', '营销场景', '人群名字', '计划名字', '花费', '观看次数'],
|
699
711
|
as_index=False).agg(
|
700
712
|
**{
|
713
|
+
'展现量': ('展现量', np.min),
|
701
714
|
'进店量': ('进店量', np.min),
|
702
715
|
'粉丝关注量': ('粉丝关注量', np.min),
|
703
716
|
'加购量': ('加购量', np.min),
|
@@ -798,8 +811,9 @@ class MysqlDatasQuery:
|
|
798
811
|
'品牌搜索人数': 'int64',
|
799
812
|
}, errors='raise')
|
800
813
|
if is_maximize:
|
801
|
-
df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '
|
814
|
+
df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '点击量'], as_index=False).agg(
|
802
815
|
**{
|
816
|
+
'展现量': ('展现量', np.max),
|
803
817
|
'加购量': ('加购量', np.max),
|
804
818
|
'成交笔数': ('成交笔数', np.max),
|
805
819
|
'成交金额': ('成交金额', np.max),
|
@@ -808,8 +822,9 @@ class MysqlDatasQuery:
|
|
808
822
|
}
|
809
823
|
)
|
810
824
|
else:
|
811
|
-
df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '
|
825
|
+
df = df.groupby(['日期', '店铺名称', '报表类型', '花费', '点击量'], as_index=False).agg(
|
812
826
|
**{
|
827
|
+
'展现量': ('展现量', np.min),
|
813
828
|
'加购量': ('加购量', np.min),
|
814
829
|
'成交笔数': ('成交笔数', np.min),
|
815
830
|
'成交金额': ('成交金额', np.min),
|
@@ -1105,7 +1120,7 @@ class MysqlDatasQuery:
|
|
1105
1120
|
)
|
1106
1121
|
return True
|
1107
1122
|
|
1108
|
-
@try_except
|
1123
|
+
# @try_except
|
1109
1124
|
def jdjzt(self, db_name='聚合数据', table_name='京东_京准通'):
|
1110
1125
|
start_date, end_date = self.months_data(num=self.months)
|
1111
1126
|
projection = {
|
@@ -1135,15 +1150,33 @@ class MysqlDatasQuery:
|
|
1135
1150
|
df = df.groupby(
|
1136
1151
|
['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', 'spu_id', '花费', '展现数', '点击数'],
|
1137
1152
|
as_index=False).agg(
|
1138
|
-
**{
|
1139
|
-
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1153
|
+
**{
|
1154
|
+
'直接订单行': ('直接订单行', np.max),
|
1155
|
+
'直接订单金额': ('直接订单金额', np.max),
|
1156
|
+
'总订单行': ('总订单行', np.max),
|
1157
|
+
'总订单金额': ('总订单金额', np.max),
|
1158
|
+
'直接加购数': ('直接加购数', np.max),
|
1159
|
+
'总加购数': ('总加购数', np.max),
|
1160
|
+
}
|
1145
1161
|
)
|
1146
1162
|
df = df[df['花费'] > 0]
|
1163
|
+
projection={
|
1164
|
+
'sku_id': 1,
|
1165
|
+
'spu_id': 1,
|
1166
|
+
}
|
1167
|
+
df_sku = self.download.data_to_df(
|
1168
|
+
db_name='属性设置3',
|
1169
|
+
table_name='京东商品属性',
|
1170
|
+
start_date=start_date,
|
1171
|
+
end_date=end_date,
|
1172
|
+
projection=projection,
|
1173
|
+
)
|
1174
|
+
df.pop('spu_id') # 删除推广表的 spu id
|
1175
|
+
df = pd.merge(df, df_sku, how='left', left_on='跟单sku_id', right_on='sku_id')
|
1176
|
+
df.pop('sku_id') # 删除聚合后合并进来的 sku id,实际使用 跟单sku_id
|
1177
|
+
p = df.pop('spu_id')
|
1178
|
+
df.insert(loc=3, column='spu_id', value=p)
|
1179
|
+
|
1147
1180
|
self.pf_datas_jd.append(
|
1148
1181
|
{
|
1149
1182
|
'集合名称': table_name,
|
@@ -1187,6 +1220,42 @@ class MysqlDatasQuery:
|
|
1187
1220
|
set_typ=set_typ,
|
1188
1221
|
|
1189
1222
|
)
|
1223
|
+
|
1224
|
+
# # 按照 spu 聚合
|
1225
|
+
# df = df.groupby(
|
1226
|
+
# ['日期', '店铺名称', 'spu_id'],
|
1227
|
+
# as_index=False).agg(
|
1228
|
+
# **{
|
1229
|
+
# '花费': ('花费', np.sum),
|
1230
|
+
# '展现数': ('展现数', np.sum),
|
1231
|
+
# '点击数': ('点击数', np.sum),
|
1232
|
+
# '直接订单行': ('直接订单行', np.sum),
|
1233
|
+
# '直接订单金额': ('直接订单金额', np.sum),
|
1234
|
+
# '总订单行': ('总订单行', np.sum),
|
1235
|
+
# '总订单金额': ('总订单金额', np.sum),
|
1236
|
+
# '直接加购数': ('直接加购数', np.sum),
|
1237
|
+
# '总加购数': ('总加购数', np.sum),
|
1238
|
+
# }
|
1239
|
+
# )
|
1240
|
+
# min_date = df['日期'].min()
|
1241
|
+
# max_date = df['日期'].max()
|
1242
|
+
# now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
1243
|
+
# print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/京东_京准通_按spu -> {min_date}~{max_date}')
|
1244
|
+
# m_engine.df_to_mysql(
|
1245
|
+
# df=df,
|
1246
|
+
# db_name=db_name,
|
1247
|
+
# table_name='京东_京准通_按spu',
|
1248
|
+
# # icm_update=['日期', '产品线', '触发sku_id', '跟单sku_id', '花费', ], # 增量更新, 在聚合数据中使用,其他不要用
|
1249
|
+
# move_insert=True, # 先删除,再插入
|
1250
|
+
# df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
1251
|
+
# drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
1252
|
+
# count=None,
|
1253
|
+
# filename=None, # 用来追踪处理进度
|
1254
|
+
# reset_id=False, # 是否重置自增列
|
1255
|
+
# set_typ=set_typ,
|
1256
|
+
#
|
1257
|
+
# )
|
1258
|
+
|
1190
1259
|
return True
|
1191
1260
|
|
1192
1261
|
@try_except
|
@@ -1213,14 +1282,15 @@ class MysqlDatasQuery:
|
|
1213
1282
|
projection=projection,
|
1214
1283
|
)
|
1215
1284
|
df = df.groupby(['日期', '店铺名称', '产品线', '花费'], as_index=False).agg(
|
1216
|
-
**{
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1285
|
+
**{
|
1286
|
+
'全站投产比': ('全站投产比', np.max),
|
1287
|
+
'全站交易额': ('全站交易额', np.max),
|
1288
|
+
'全站订单行': ('全站订单行', np.max),
|
1289
|
+
'全站订单成本': ('全站订单成本', np.max),
|
1290
|
+
'全站费比': ('全站费比', np.max),
|
1291
|
+
'核心位置展现量': ('核心位置展现量', np.max),
|
1292
|
+
'核心位置点击量': ('核心位置点击量', np.max),
|
1293
|
+
}
|
1224
1294
|
)
|
1225
1295
|
df = df[df['花费'] > 0]
|
1226
1296
|
set_typ = {
|
@@ -1403,6 +1473,7 @@ class MysqlDatasQuery:
|
|
1403
1473
|
'加购人数': 'int',
|
1404
1474
|
'成交单量': 'int',
|
1405
1475
|
'成交金额': 'decimal(10,2)',
|
1476
|
+
'sku_id': 'varchar(100)',
|
1406
1477
|
}
|
1407
1478
|
min_date = df['日期'].min()
|
1408
1479
|
max_date = df['日期'].max()
|
@@ -1420,7 +1491,6 @@ class MysqlDatasQuery:
|
|
1420
1491
|
filename=None, # 用来追踪处理进度
|
1421
1492
|
reset_id=False, # 是否重置自增列
|
1422
1493
|
set_typ=set_typ,
|
1423
|
-
|
1424
1494
|
)
|
1425
1495
|
return True
|
1426
1496
|
|
@@ -1465,6 +1535,7 @@ class MysqlDatasQuery:
|
|
1465
1535
|
'加购人数': 'int',
|
1466
1536
|
'成交单量': 'int',
|
1467
1537
|
'成交金额': 'decimal(10,2)',
|
1538
|
+
'spu_id': 'varchar(100)',
|
1468
1539
|
}
|
1469
1540
|
min_date = df['日期'].min()
|
1470
1541
|
max_date = df['日期'].max()
|
@@ -1916,13 +1987,14 @@ class MysqlDatasQuery:
|
|
1916
1987
|
if len(df_jd) > 0:
|
1917
1988
|
df_jd = df_jd.groupby(['日期', '店铺名称', '产品线', '触发sku_id', '跟单sku_id', 'spu_id', '花费', '展现数', '点击数'],
|
1918
1989
|
as_index=False).agg(
|
1919
|
-
**{
|
1920
|
-
|
1921
|
-
|
1922
|
-
|
1923
|
-
|
1924
|
-
|
1925
|
-
|
1990
|
+
**{
|
1991
|
+
'直接订单行': ('直接订单行', np.max),
|
1992
|
+
'直接订单金额': ('直接订单金额', np.max),
|
1993
|
+
'成交笔数': ('总订单行', np.max),
|
1994
|
+
'成交金额': ('总订单金额', np.max),
|
1995
|
+
'直接加购数': ('直接加购数', np.max),
|
1996
|
+
'加购量': ('总加购数', np.max),
|
1997
|
+
}
|
1926
1998
|
)
|
1927
1999
|
df_jd = df_jd[['日期', '店铺名称', '产品线', '花费', '展现数', '点击数', '加购量', '成交笔数', '成交金额']]
|
1928
2000
|
df_jd.rename(columns={'产品线': '营销场景', '展现数': '展现量', '点击数': '点击量'}, inplace=True)
|
@@ -2911,24 +2983,38 @@ def date_table():
|
|
2911
2983
|
)
|
2912
2984
|
|
2913
2985
|
|
2914
|
-
def main(days=
|
2986
|
+
def main(days=150, months=3):
|
2987
|
+
"""
|
2988
|
+
days: 清理聚合数据的日期长度
|
2989
|
+
months: 生成聚合数据的长度
|
2990
|
+
"""
|
2915
2991
|
# 1. 更新日期表 更新货品年份基准表, 属性设置 3 - 货品年份基准
|
2916
2992
|
date_table()
|
2917
2993
|
p = products.Products()
|
2918
2994
|
p.to_mysql()
|
2919
2995
|
|
2920
|
-
#
|
2996
|
+
# 清理非聚合数据库
|
2921
2997
|
system = platform.system() # 本机系统
|
2922
2998
|
host_name = socket.gethostname() # 本机名
|
2923
2999
|
conf = myconfig.main()
|
2924
3000
|
db_list = conf[system][host_name]['mysql']['数据库集']
|
3001
|
+
not_juhe_db_list = [item for item in db_list if item != '聚合数据']
|
3002
|
+
optimize_data.op_data(
|
3003
|
+
db_name_lists=not_juhe_db_list,
|
3004
|
+
days= 31, # 清理聚合数据的日期长度
|
3005
|
+
is_mongo=False,
|
3006
|
+
is_mysql=True,
|
3007
|
+
)
|
3008
|
+
|
3009
|
+
# 2. 数据聚合
|
2925
3010
|
query_(months=months)
|
2926
3011
|
time.sleep(60)
|
2927
3012
|
|
2928
3013
|
# 3. 清理聚合数据
|
3014
|
+
|
2929
3015
|
optimize_data.op_data(
|
2930
|
-
db_name_lists=
|
2931
|
-
days=days,
|
3016
|
+
db_name_lists=['聚合数据'],
|
3017
|
+
days=days, # 清理聚合数据的日期长度
|
2932
3018
|
is_mongo=False,
|
2933
3019
|
is_mysql=True,
|
2934
3020
|
)
|
@@ -2971,12 +3057,16 @@ def query_(months=1, less_dict=[]):
|
|
2971
3057
|
|
2972
3058
|
if __name__ == '__main__':
|
2973
3059
|
main(days=150, months=3)
|
2974
|
-
# query_(months=
|
2975
|
-
|
3060
|
+
# query_(months=3)
|
3061
|
+
#
|
3062
|
+
# system = platform.system() # 本机系统
|
3063
|
+
# host_name = socket.gethostname() # 本机名
|
3064
|
+
# conf = myconfig.main()
|
3065
|
+
# db_list = conf[system][host_name]['mysql']['数据库集']
|
2976
3066
|
# # 4. 清理聚合数据
|
2977
3067
|
# optimize_data.op_data(
|
2978
3068
|
# db_name_lists=['聚合数据'],
|
2979
|
-
# days=
|
3069
|
+
# days=3650,
|
2980
3070
|
# is_mongo=False,
|
2981
3071
|
# is_mysql=True,
|
2982
3072
|
# )
|
@@ -840,7 +840,7 @@ class OptimizeDatas:
|
|
840
840
|
self.db_name = db_name
|
841
841
|
self.optimize()
|
842
842
|
|
843
|
-
def optimize(self):
|
843
|
+
def optimize(self, except_key=['更新时间']):
|
844
844
|
""" 更新一个数据库 移除冗余数据 """
|
845
845
|
if not self.db_name:
|
846
846
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S ")
|
@@ -904,12 +904,13 @@ class OptimizeDatas:
|
|
904
904
|
if self.end_date > pd.to_datetime(max_result['max_date']):
|
905
905
|
self.end_date = pd.to_datetime(max_result['max_date'])
|
906
906
|
dates_list = self.day_list(start_date=self.start_date, end_date=self.end_date)
|
907
|
+
# dates_list 是日期列表
|
907
908
|
for date in dates_list:
|
908
|
-
self.delete_duplicate(table_name=table_name, date=date)
|
909
|
+
self.delete_duplicate(table_name=table_name, date=date, except_key=except_key)
|
909
910
|
self.start_date = start_date_before # 重置,不然日期错乱
|
910
911
|
self.end_date = end_date_before
|
911
912
|
else: # 不存在日期列的情况
|
912
|
-
self.delete_duplicate2(table_name=table_name)
|
913
|
+
self.delete_duplicate2(table_name=table_name, except_key=except_key)
|
913
914
|
|
914
915
|
# # 5. 重置自增列 (id 列)
|
915
916
|
# try:
|
@@ -927,13 +928,16 @@ class OptimizeDatas:
|
|
927
928
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S ")
|
928
929
|
print(f'{now}mysql({self.host}: {self.port}) {self.db_name} 数据库优化完成!')
|
929
930
|
|
930
|
-
def delete_duplicate(self, table_name, date):
|
931
|
+
def delete_duplicate(self, table_name, date, except_key=['更新时间']):
|
931
932
|
datas = self.table_datas(db_name=self.db_name, table_name=str(table_name), date=date)
|
932
933
|
if not datas:
|
933
934
|
return
|
934
935
|
duplicate_id = [] # 出现重复的 id
|
935
936
|
all_datas = [] # 迭代器
|
936
937
|
for data in datas:
|
938
|
+
for e_key in except_key:
|
939
|
+
if e_key in data.keys(): # 在检查重复数据时,不包含 更新时间 字段
|
940
|
+
del data[e_key]
|
937
941
|
try:
|
938
942
|
delete_id = data['id']
|
939
943
|
del data['id']
|
@@ -962,7 +966,7 @@ class OptimizeDatas:
|
|
962
966
|
print(f'{self.db_name}/{table_name}, {e}')
|
963
967
|
self.connection.rollback() # 异常则回滚
|
964
968
|
|
965
|
-
def delete_duplicate2(self, table_name):
|
969
|
+
def delete_duplicate2(self, table_name, except_key=['更新时间']):
|
966
970
|
with self.connection.cursor() as cursor:
|
967
971
|
sql = f"SELECT * FROM {table_name}" # 如果不包含日期列,则获取全部数据
|
968
972
|
cursor.execute(sql)
|
@@ -972,6 +976,9 @@ class OptimizeDatas:
|
|
972
976
|
duplicate_id = [] # 出现重复的 id
|
973
977
|
all_datas = [] # 迭代器
|
974
978
|
for data in datas:
|
979
|
+
for e_key in except_key:
|
980
|
+
if e_key in data.keys(): # 在检查重复数据时,不包含 更新时间 字段
|
981
|
+
del data[e_key]
|
975
982
|
delete_id = data['id']
|
976
983
|
del data['id']
|
977
984
|
data = re.sub(r'\.0+\', ', '\', ', str(data)) # 统一移除小数点后面的 0
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|