mdbq 3.0.1__tar.gz → 3.0.2__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.1 → mdbq-3.0.2}/PKG-INFO +1 -1
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/aggregation/aggregation.py +17 -27
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/aggregation/query_data.py +83 -9
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/config/products.py +3 -3
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/dataframe/converter.py +3 -3
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/mysql/mysql.py +40 -10
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq.egg-info/PKG-INFO +1 -1
- {mdbq-3.0.1 → mdbq-3.0.2}/setup.py +1 -1
- {mdbq-3.0.1 → mdbq-3.0.2}/README.txt +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/__version__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/aggregation/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/aggregation/df_types.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/aggregation/mysql_types.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/aggregation/optimize_data.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/aggregation/query_data_bak.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/bdup/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/bdup/bdup.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/clean/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/clean/clean_upload.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/clean/data_clean.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/company/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/company/copysh.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/config/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/config/get_myconf.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/config/myconfig.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/config/set_support.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/config/update_conf.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/dataframe/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/log/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/log/mylogger.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/mongo/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/mongo/mongo.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/mysql/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/mysql/recheck_mysql.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/mysql/s_query.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/mysql/year_month_day.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/other/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/other/porxy.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/other/pov_city.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/other/sku_picture.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/other/ua_sj.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/pbix/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/pbix/refresh_all_old.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/req_post/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/req_post/req_tb.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/spider/__init__.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq/spider/aikucun.py +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq.egg-info/SOURCES.txt +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-3.0.1 → mdbq-3.0.2}/setup.cfg +0 -0
@@ -1238,23 +1238,13 @@ def test():
|
|
1238
1238
|
# df.to_csv(os.path.join(root, name), encoding='utf-8_sig', index=False, header=True)
|
1239
1239
|
# os.remove(os.path.join(root, name))
|
1240
1240
|
# results.append(df)
|
1241
|
-
# df = pd.concat(results)
|
1242
|
-
# df.drop_duplicates(
|
1243
|
-
# subset=[
|
1244
|
-
# '日期',
|
1245
|
-
# '店铺名称',
|
1246
|
-
# '报表类型',
|
1247
|
-
# '消耗',
|
1248
|
-
# '展现量',
|
1249
|
-
# '点击量',
|
1250
|
-
# ], keep='last', inplace=True, ignore_index=True)
|
1251
|
-
# df.fillna(0, inplace=True)
|
1252
|
-
# for col in df.columns.tolist():
|
1253
|
-
# df[col] = df[col].apply(lambda x: 0 if str(x) == '' else x)
|
1254
|
-
# path = '/Users/xigua/Downloads'
|
1255
|
-
# filename = '品销宝_2024年_合并.csv'
|
1256
|
-
# df.to_csv(os.path.join(path, filename), encoding='utf-8_sig', index=False, header=True)
|
1257
1241
|
|
1242
|
+
def test2():
|
1243
|
+
file = '/Users/xigua/Downloads/商品素材中心.xlsx'
|
1244
|
+
df = pd.read_excel(file, engine='openpyxl')
|
1245
|
+
df.replace(to_replace=['0'], value='', regex=False, inplace=True)
|
1246
|
+
# print(df.head())
|
1247
|
+
df.to_excel(file, index=False, header=True, engine='openpyxl')
|
1258
1248
|
|
1259
1249
|
if __name__ == '__main__':
|
1260
1250
|
# username = 'root'
|
@@ -1269,17 +1259,17 @@ if __name__ == '__main__':
|
|
1269
1259
|
# table_name='dmp人群报表',
|
1270
1260
|
# )
|
1271
1261
|
|
1272
|
-
|
1273
|
-
col =
|
1274
|
-
if col:
|
1275
|
-
|
1276
|
-
|
1277
|
-
|
1278
|
-
|
1279
|
-
|
1280
|
-
|
1281
|
-
|
1282
|
-
|
1262
|
+
test2()
|
1263
|
+
# col = 0
|
1264
|
+
# if col:
|
1265
|
+
# # 上传一个目录到指定数据库
|
1266
|
+
# db_name = '京东数据3'
|
1267
|
+
# table_name = '推广数据_全站营销'
|
1268
|
+
# upload_dir(
|
1269
|
+
# path=r'/Users/xigua/数据中心/原始文件3/京东报表/京准通_全站营销',
|
1270
|
+
# db_name=db_name,
|
1271
|
+
# collection_name=table_name,
|
1272
|
+
# )
|
1283
1273
|
|
1284
1274
|
|
1285
1275
|
|
@@ -180,6 +180,56 @@ class MysqlDatasQuery:
|
|
180
180
|
filename=None, # 用来追踪处理进度
|
181
181
|
reset_id=False, # 是否重置自增列
|
182
182
|
set_typ=set_typ,
|
183
|
+
default=True, # 对于空值使用默认值
|
184
|
+
)
|
185
|
+
|
186
|
+
# df_pic:商品排序索引表, 给 powerbi 中的主推款排序用的,(从上月1号到今天的总花费进行排序)
|
187
|
+
today = datetime.date.today()
|
188
|
+
last_month = today - datetime.timedelta(days=30)
|
189
|
+
if last_month.month == 12:
|
190
|
+
year_my = today.year - 1
|
191
|
+
else:
|
192
|
+
year_my = today.year
|
193
|
+
# 截取 从上月1日 至 今天的花费数据, 推广款式按此数据从高到低排序(商品图+排序)
|
194
|
+
# df_pic_lin = df[df['店铺名称'] == '万里马官方旗舰店']
|
195
|
+
df_pic = df.groupby(['日期', '店铺名称', '商品id'], as_index=False).agg({'花费': 'sum'})
|
196
|
+
if len(df_pic) == 0:
|
197
|
+
return True
|
198
|
+
df_pic = df_pic[~df_pic['商品id'].isin([''])] # 指定列中删除包含空值的行
|
199
|
+
date_obj = datetime.datetime.strptime(f'{year_my}-{last_month.month}-01', '%Y-%m-%d').date()
|
200
|
+
df_pic = df_pic[(df_pic['日期'] >= date_obj)]
|
201
|
+
df_pic = df_pic.groupby(['店铺名称', '商品id'], as_index=False).agg({'花费': 'sum'})
|
202
|
+
df_pic.sort_values('花费', ascending=False, ignore_index=True, inplace=True)
|
203
|
+
df_pic.reset_index(inplace=True)
|
204
|
+
df_pic['index'] = df_pic['index'] + 100
|
205
|
+
df_pic.rename(columns={'index': '商品索引'}, inplace=True)
|
206
|
+
df_pic['商品索引'].fillna(1000, inplace=True)
|
207
|
+
df_pic.pop('花费')
|
208
|
+
p= df_pic.pop('商品索引')
|
209
|
+
df_pic.insert(loc=2, column='商品索引', value=p) # df中插入新列
|
210
|
+
df_pic['更新时间'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
211
|
+
set_typ = {
|
212
|
+
'商品id': 'bigint',
|
213
|
+
'店铺名称': 'varchar(100)',
|
214
|
+
'商品索引': 'smallint',
|
215
|
+
'花费': 'decimal(12,2)',
|
216
|
+
'更新时间': 'timestamp',
|
217
|
+
}
|
218
|
+
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
219
|
+
print(f'{now} 正在更新: mysql ({host}:{port}) 属性设置3/商品索引表_主推排序调用')
|
220
|
+
m_engine.df_to_mysql(
|
221
|
+
df=df_pic,
|
222
|
+
db_name='属性设置3',
|
223
|
+
table_name='商品索引表_主推排序调用',
|
224
|
+
icm_update=['商品id'], # 增量更新, 在聚合数据中使用,其他不要用
|
225
|
+
move_insert=False, # 先删除,再插入
|
226
|
+
df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
|
227
|
+
drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
|
228
|
+
count=None,
|
229
|
+
filename=None, # 用来追踪处理进度
|
230
|
+
reset_id=False, # 是否重置自增列
|
231
|
+
set_typ=set_typ,
|
232
|
+
default=True, # 对于空值使用默认值
|
183
233
|
)
|
184
234
|
return True
|
185
235
|
|
@@ -267,6 +317,7 @@ class MysqlDatasQuery:
|
|
267
317
|
filename=None, # 用来追踪处理进度
|
268
318
|
reset_id=False, # 是否重置自增列
|
269
319
|
set_typ=set_typ,
|
320
|
+
default=True, # 对于空值使用默认值
|
270
321
|
)
|
271
322
|
return True
|
272
323
|
|
@@ -302,7 +353,7 @@ class MysqlDatasQuery:
|
|
302
353
|
'总成交笔数': '成交笔数',
|
303
354
|
'总成交金额': '成交金额'
|
304
355
|
}, inplace=True)
|
305
|
-
df.fillna(0, inplace=True)
|
356
|
+
# df.fillna(0, inplace=True)
|
306
357
|
df = df.astype({
|
307
358
|
'商品id': str,
|
308
359
|
'花费': float,
|
@@ -450,6 +501,7 @@ class MysqlDatasQuery:
|
|
450
501
|
filename=None, # 用来追踪处理进度
|
451
502
|
reset_id=False, # 是否重置自增列
|
452
503
|
set_typ=set_typ,
|
504
|
+
default=True, # 对于空值使用默认值
|
453
505
|
)
|
454
506
|
return True
|
455
507
|
|
@@ -486,7 +538,7 @@ class MysqlDatasQuery:
|
|
486
538
|
'总成交笔数': '成交笔数',
|
487
539
|
'总成交金额': '成交金额'
|
488
540
|
}, inplace=True)
|
489
|
-
df.fillna(0, inplace=True)
|
541
|
+
# df.fillna(0, inplace=True)
|
490
542
|
df = df.astype({
|
491
543
|
'商品id': str,
|
492
544
|
'花费': float,
|
@@ -579,6 +631,7 @@ class MysqlDatasQuery:
|
|
579
631
|
filename=None, # 用来追踪处理进度
|
580
632
|
reset_id=False, # 是否重置自增列
|
581
633
|
set_typ=set_typ,
|
634
|
+
default=True, # 对于空值使用默认值
|
582
635
|
)
|
583
636
|
return True
|
584
637
|
|
@@ -617,7 +670,7 @@ class MysqlDatasQuery:
|
|
617
670
|
'场景名字': '营销场景',
|
618
671
|
}, inplace=True)
|
619
672
|
df['营销场景'] = '超级直播'
|
620
|
-
df.fillna(0, inplace=True)
|
673
|
+
# df.fillna(0, inplace=True)
|
621
674
|
df = df.astype({
|
622
675
|
'花费': float,
|
623
676
|
# '点击量': int,
|
@@ -697,6 +750,7 @@ class MysqlDatasQuery:
|
|
697
750
|
filename=None, # 用来追踪处理进度
|
698
751
|
reset_id=False, # 是否重置自增列
|
699
752
|
set_typ=set_typ,
|
753
|
+
default=True, # 对于空值使用默认值
|
700
754
|
)
|
701
755
|
return True
|
702
756
|
|
@@ -726,7 +780,7 @@ class MysqlDatasQuery:
|
|
726
780
|
projection=projection,
|
727
781
|
)
|
728
782
|
df = df[df['报表类型'] == '账户']
|
729
|
-
df.fillna(value=0, inplace=True)
|
783
|
+
# df.fillna(value=0, inplace=True)
|
730
784
|
df.rename(columns={
|
731
785
|
'消耗': '花费',
|
732
786
|
'宝贝加购数': '加购量',
|
@@ -804,6 +858,7 @@ class MysqlDatasQuery:
|
|
804
858
|
filename=None, # 用来追踪处理进度
|
805
859
|
reset_id=False, # 是否重置自增列
|
806
860
|
set_typ=set_typ,
|
861
|
+
default=True, # 对于空值使用默认值
|
807
862
|
)
|
808
863
|
return True
|
809
864
|
|
@@ -858,6 +913,7 @@ class MysqlDatasQuery:
|
|
858
913
|
filename=None, # 用来追踪处理进度
|
859
914
|
reset_id=False, # 是否重置自增列
|
860
915
|
set_typ=set_typ,
|
916
|
+
default=True, # 对于空值使用默认值
|
861
917
|
)
|
862
918
|
return True
|
863
919
|
|
@@ -915,6 +971,7 @@ class MysqlDatasQuery:
|
|
915
971
|
filename=None, # 用来追踪处理进度
|
916
972
|
reset_id=False, # 是否重置自增列
|
917
973
|
set_typ=set_typ,
|
974
|
+
default=True, # 对于空值使用默认值
|
918
975
|
)
|
919
976
|
return True
|
920
977
|
|
@@ -996,6 +1053,7 @@ class MysqlDatasQuery:
|
|
996
1053
|
filename=None, # 用来追踪处理进度
|
997
1054
|
reset_id=False, # 是否重置自增列
|
998
1055
|
set_typ=set_typ,
|
1056
|
+
default=True, # 对于空值使用默认值
|
999
1057
|
)
|
1000
1058
|
return True
|
1001
1059
|
|
@@ -1043,6 +1101,7 @@ class MysqlDatasQuery:
|
|
1043
1101
|
filename=None, # 用来追踪处理进度
|
1044
1102
|
reset_id=False, # 是否重置自增列
|
1045
1103
|
set_typ=set_typ,
|
1104
|
+
default=True, # 对于空值使用默认值
|
1046
1105
|
)
|
1047
1106
|
return True
|
1048
1107
|
|
@@ -1126,6 +1185,7 @@ class MysqlDatasQuery:
|
|
1126
1185
|
filename=None, # 用来追踪处理进度
|
1127
1186
|
reset_id=False, # 是否重置自增列
|
1128
1187
|
set_typ=set_typ,
|
1188
|
+
default=True, # 对于空值使用默认值
|
1129
1189
|
)
|
1130
1190
|
return True
|
1131
1191
|
|
@@ -1192,6 +1252,7 @@ class MysqlDatasQuery:
|
|
1192
1252
|
filename=None, # 用来追踪处理进度
|
1193
1253
|
reset_id=False, # 是否重置自增列
|
1194
1254
|
set_typ=set_typ,
|
1255
|
+
default=True, # 对于空值使用默认值
|
1195
1256
|
)
|
1196
1257
|
return True
|
1197
1258
|
|
@@ -1289,6 +1350,7 @@ class MysqlDatasQuery:
|
|
1289
1350
|
filename=None, # 用来追踪处理进度
|
1290
1351
|
reset_id=False, # 是否重置自增列
|
1291
1352
|
set_typ=set_typ,
|
1353
|
+
default=True, # 对于空值使用默认值
|
1292
1354
|
)
|
1293
1355
|
return True
|
1294
1356
|
|
@@ -1358,6 +1420,7 @@ class MysqlDatasQuery:
|
|
1358
1420
|
filename=None, # 用来追踪处理进度
|
1359
1421
|
reset_id=False, # 是否重置自增列
|
1360
1422
|
set_typ=set_typ,
|
1423
|
+
default=True, # 对于空值使用默认值
|
1361
1424
|
)
|
1362
1425
|
return True
|
1363
1426
|
|
@@ -1419,6 +1482,7 @@ class MysqlDatasQuery:
|
|
1419
1482
|
filename=None, # 用来追踪处理进度
|
1420
1483
|
reset_id=False, # 是否重置自增列
|
1421
1484
|
set_typ=set_typ,
|
1485
|
+
default=True, # 对于空值使用默认值
|
1422
1486
|
)
|
1423
1487
|
return True
|
1424
1488
|
|
@@ -1498,6 +1562,7 @@ class MysqlDatasQuery:
|
|
1498
1562
|
filename=None, # 用来追踪处理进度
|
1499
1563
|
reset_id=False, # 是否重置自增列
|
1500
1564
|
set_typ=set_typ,
|
1565
|
+
default=True, # 对于空值使用默认值
|
1501
1566
|
)
|
1502
1567
|
return True
|
1503
1568
|
|
@@ -1636,6 +1701,7 @@ class MysqlDatasQuery:
|
|
1636
1701
|
filename=None, # 用来追踪处理进度
|
1637
1702
|
reset_id=False, # 是否重置自增列
|
1638
1703
|
set_typ=set_typ,
|
1704
|
+
default=True, # 对于空值使用默认值
|
1639
1705
|
)
|
1640
1706
|
return True
|
1641
1707
|
|
@@ -1888,6 +1954,7 @@ class MysqlDatasQuery:
|
|
1888
1954
|
filename=None, # 用来追踪处理进度
|
1889
1955
|
reset_id=False, # 是否重置自增列
|
1890
1956
|
set_typ=set_typ,
|
1957
|
+
default=True, # 对于空值使用默认值
|
1891
1958
|
)
|
1892
1959
|
return True
|
1893
1960
|
|
@@ -1972,6 +2039,7 @@ class MysqlDatasQuery:
|
|
1972
2039
|
filename=None, # 用来追踪处理进度
|
1973
2040
|
reset_id=False, # 是否重置自增列
|
1974
2041
|
set_typ=set_typ,
|
2042
|
+
default=True, # 对于空值使用默认值
|
1975
2043
|
)
|
1976
2044
|
return True
|
1977
2045
|
|
@@ -2024,6 +2092,7 @@ class MysqlDatasQuery:
|
|
2024
2092
|
filename=None, # 用来追踪处理进度
|
2025
2093
|
reset_id=False, # 是否重置自增列
|
2026
2094
|
set_typ=set_typ,
|
2095
|
+
default=True, # 对于空值使用默认值
|
2027
2096
|
)
|
2028
2097
|
return True
|
2029
2098
|
|
@@ -2131,6 +2200,7 @@ class MysqlDatasQuery:
|
|
2131
2200
|
filename=None, # 用来追踪处理进度
|
2132
2201
|
reset_id=False, # 是否重置自增列
|
2133
2202
|
set_typ=set_typ,
|
2203
|
+
default=True, # 对于空值使用默认值
|
2134
2204
|
)
|
2135
2205
|
return True
|
2136
2206
|
|
@@ -2541,6 +2611,7 @@ class MysqlDatasQuery:
|
|
2541
2611
|
filename=None, # 用来追踪处理进度
|
2542
2612
|
reset_id=False, # 是否重置自增列
|
2543
2613
|
set_typ=set_typ,
|
2614
|
+
default=True, # 对于空值使用默认值
|
2544
2615
|
)
|
2545
2616
|
return True
|
2546
2617
|
|
@@ -2616,7 +2687,7 @@ class MysqlDatasQuery:
|
|
2616
2687
|
'自然流量曝光量': int,
|
2617
2688
|
}
|
2618
2689
|
)
|
2619
|
-
[df[col].apply(lambda x: '0' if str(x) == '' else x) for col in df.columns.tolist()]
|
2690
|
+
# [df[col].apply(lambda x: '0' if str(x) == '' else x) for col in df.columns.tolist()]
|
2620
2691
|
set_typ = {
|
2621
2692
|
'日期': 'date',
|
2622
2693
|
'店铺名称': 'varchar(100)',
|
@@ -2651,6 +2722,7 @@ class MysqlDatasQuery:
|
|
2651
2722
|
filename=None, # 用来追踪处理进度
|
2652
2723
|
reset_id=False, # 是否重置自增列
|
2653
2724
|
set_typ=set_typ,
|
2725
|
+
default=True, # 对于空值使用默认值
|
2654
2726
|
)
|
2655
2727
|
return True
|
2656
2728
|
|
@@ -2690,7 +2762,7 @@ class MysqlDatasQuery:
|
|
2690
2762
|
df['毛利率'] = df.apply(
|
2691
2763
|
lambda x: round((x['成交金额'] - x['商品成本']) / x['成交金额'], 4) if x['成交金额'] > 0 else 0, axis=1)
|
2692
2764
|
df['盈亏'] = df.apply(lambda x: x['商品毛利'] - x['花费'], axis=1)
|
2693
|
-
[df[col].apply(lambda x: '0' if str(x) == '' else x) for col in df.columns.tolist()]
|
2765
|
+
# [df[col].apply(lambda x: '0' if str(x) == '' else x) for col in df.columns.tolist()]
|
2694
2766
|
set_typ = {
|
2695
2767
|
'日期': 'date',
|
2696
2768
|
'跟单sku_id': 'bigint',
|
@@ -2722,6 +2794,7 @@ class MysqlDatasQuery:
|
|
2722
2794
|
filename=None, # 用来追踪处理进度
|
2723
2795
|
reset_id=False, # 是否重置自增列
|
2724
2796
|
set_typ=set_typ,
|
2797
|
+
default=True, # 对于空值使用默认值
|
2725
2798
|
)
|
2726
2799
|
return True
|
2727
2800
|
|
@@ -2780,6 +2853,7 @@ def date_table():
|
|
2780
2853
|
count=None,
|
2781
2854
|
filename=None, # 用来追踪处理进度
|
2782
2855
|
set_typ=set_typ,
|
2856
|
+
default=True, # 对于空值使用默认值
|
2783
2857
|
)
|
2784
2858
|
|
2785
2859
|
|
@@ -2851,13 +2925,13 @@ def query_(months=1, less_dict=[]):
|
|
2851
2925
|
|
2852
2926
|
|
2853
2927
|
if __name__ == '__main__':
|
2854
|
-
main(days=
|
2855
|
-
# query_(months=
|
2928
|
+
main(days=130, months=3)
|
2929
|
+
# query_(months=1)
|
2856
2930
|
|
2857
2931
|
# # 4. 清理聚合数据
|
2858
2932
|
# optimize_data.op_data(
|
2859
2933
|
# db_name_lists=['聚合数据'],
|
2860
|
-
# days=
|
2934
|
+
# days=300,
|
2861
2935
|
# is_mongo=False,
|
2862
2936
|
# is_mysql=True,
|
2863
2937
|
# )
|
@@ -142,9 +142,9 @@ class Products:
|
|
142
142
|
# icm_update=['日期', '店铺名称', '宝贝id'], # 唯一组合键
|
143
143
|
unique_main_key=['商品id'],
|
144
144
|
set_typ={
|
145
|
-
'商品id': '
|
146
|
-
'平台': '
|
147
|
-
'上市年份': '
|
145
|
+
'商品id': 'bigint',
|
146
|
+
'平台': 'varchar(100)',
|
147
|
+
'上市年份': 'varchar(100)',
|
148
148
|
},
|
149
149
|
)
|
150
150
|
|
@@ -31,8 +31,8 @@ class DataFrameConverter(object):
|
|
31
31
|
return longest_value
|
32
32
|
|
33
33
|
# dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
|
34
|
-
df.replace([np.inf, -np.inf],
|
35
|
-
df.replace(to_replace=['\\N', '-', '--', '', 'nan', 'NAN'], value=
|
34
|
+
df.replace([np.inf, -np.inf], '', inplace=True) # 清理一些非法值
|
35
|
+
df.replace(to_replace=['\\N', '-', '--', '', 'nan', 'NAN'], value='', regex=False, inplace=True) # 替换掉特殊字符
|
36
36
|
df.replace(to_replace=[','], value='', regex=True, inplace=True)
|
37
37
|
df.replace(to_replace=['="'], value='', regex=True, inplace=True) # ="和"不可以放在一起清洗, 因为有: id=86785565
|
38
38
|
df.replace(to_replace=['"'], value='', regex=True, inplace=True)
|
@@ -88,7 +88,7 @@ class DataFrameConverter(object):
|
|
88
88
|
new_col = re.sub(r'_{2,}', '_', new_col)
|
89
89
|
new_col = re.sub(r'_+$', '', new_col)
|
90
90
|
df.rename(columns={col: new_col}, inplace=True)
|
91
|
-
df.fillna(0, inplace=True)
|
91
|
+
# df.fillna(0, inplace=True)
|
92
92
|
return df
|
93
93
|
|
94
94
|
|
@@ -127,7 +127,7 @@ class MysqlUpload:
|
|
127
127
|
return wrapper
|
128
128
|
|
129
129
|
@try_except
|
130
|
-
def dict_to_mysql(self, db_name, table_name, dict_data, icm_update=None, main_key=None, unique_main_key=None, index_length=100, set_typ=None):
|
130
|
+
def dict_to_mysql(self, db_name, table_name, dict_data, icm_update=None, main_key=None, unique_main_key=None, index_length=100, set_typ=None, default=True):
|
131
131
|
"""
|
132
132
|
插入字典数据
|
133
133
|
dict_data: 字典
|
@@ -186,7 +186,22 @@ class MysqlUpload:
|
|
186
186
|
if col_not_exist: # 数据表中不存在的列
|
187
187
|
for col in col_not_exist:
|
188
188
|
# 创建列,需转义
|
189
|
-
|
189
|
+
if default:
|
190
|
+
if dtypes[col] == 'date':
|
191
|
+
default = '2000-01-01'
|
192
|
+
elif dtypes[col] == 'datetime' or dtypes[col] == 'timestamp':
|
193
|
+
default = '2000-01-01 10:00:00'
|
194
|
+
elif 'decimal' in dtypes[col]:
|
195
|
+
default = 0.0
|
196
|
+
elif 'int' in dtypes[col]:
|
197
|
+
default = 0
|
198
|
+
elif 'varchar' in dtypes[col] or 'text' in dtypes[col]:
|
199
|
+
default = ''
|
200
|
+
elif 'year' in dtypes[col]:
|
201
|
+
default = '2000'
|
202
|
+
sql = f"ALTER TABLE `{table_name}` ADD COLUMN `{col}` {dtypes[col]} NOT NULL DEFAULT '{default}';"
|
203
|
+
else:
|
204
|
+
sql = f"ALTER TABLE `{table_name}` ADD COLUMN `{col}` {dtypes[col]} NOT NULL;"
|
190
205
|
cursor.execute(sql)
|
191
206
|
print(f"添加列: {col}({dtypes[col]})") # 添加列并指定数据类型
|
192
207
|
|
@@ -362,8 +377,8 @@ class MysqlUpload:
|
|
362
377
|
|
363
378
|
def cover_df(self, df):
|
364
379
|
""" 清理 df 的值和列名 """
|
365
|
-
df.replace([np.inf, -np.inf],
|
366
|
-
df.replace(to_replace=['\\N', '-', '--', '', 'nan', 'NAN'], value=
|
380
|
+
df.replace([np.inf, -np.inf], '', inplace=True) # 清理一些非法值
|
381
|
+
df.replace(to_replace=['\\N', '-', '--', '', 'nan', 'NAN'], value='', regex=False, inplace=True) # 替换掉特殊字符
|
367
382
|
df.replace(to_replace=[','], value='', regex=True, inplace=True)
|
368
383
|
df.replace(to_replace=['="'], value='', regex=True, inplace=True) # ="和"不可以放在一起清洗, 因为有: id=86785565
|
369
384
|
df.replace(to_replace=['"'], value='', regex=True, inplace=True)
|
@@ -387,7 +402,7 @@ class MysqlUpload:
|
|
387
402
|
new_col = re.sub(r'_{2,}', '_', new_col)
|
388
403
|
new_col = re.sub(r'_+$', '', new_col)
|
389
404
|
df.rename(columns={col: new_col}, inplace=True)
|
390
|
-
df.fillna(0, inplace=True)
|
405
|
+
# df.fillna(0, inplace=True)
|
391
406
|
return df
|
392
407
|
|
393
408
|
def convert_df_dtypes(self, df: pd.DataFrame):
|
@@ -411,15 +426,15 @@ class MysqlUpload:
|
|
411
426
|
elif result4: # 小数
|
412
427
|
__res_dict.update({k: 'decimal(12,2)'})
|
413
428
|
elif k == '日期':
|
414
|
-
__res_dict.update({k: '
|
429
|
+
__res_dict.update({k: 'date'})
|
415
430
|
elif k == '更新时间':
|
416
|
-
__res_dict.update({k: '
|
431
|
+
__res_dict.update({k: 'timestamp'})
|
417
432
|
elif v == 'int64':
|
418
433
|
__res_dict.update({k: 'int'})
|
419
434
|
elif v == 'float64':
|
420
435
|
__res_dict.update({k: 'decimal(10,4)'})
|
421
436
|
elif v == 'bool':
|
422
|
-
__res_dict.update({k: '
|
437
|
+
__res_dict.update({k: 'boolean'})
|
423
438
|
elif v == 'datetime64[ns]':
|
424
439
|
__res_dict.update({k: 'datetime'})
|
425
440
|
else:
|
@@ -428,7 +443,7 @@ class MysqlUpload:
|
|
428
443
|
|
429
444
|
# @try_except
|
430
445
|
def df_to_mysql(self, df, db_name, table_name, set_typ=None, icm_update=[], move_insert=False, df_sql=False, drop_duplicates=False,
|
431
|
-
filename=None, count=None, reset_id=False):
|
446
|
+
filename=None, count=None, reset_id=False, default=None):
|
432
447
|
"""
|
433
448
|
db_name: 数据库名
|
434
449
|
table_name: 表名
|
@@ -499,7 +514,22 @@ class MysqlUpload:
|
|
499
514
|
if col_not_exist: # 数据表中不存在的列
|
500
515
|
for col in col_not_exist:
|
501
516
|
# 创建列,需转义
|
502
|
-
|
517
|
+
if default:
|
518
|
+
if dtypes[col] == 'date':
|
519
|
+
default = '2000-01-01'
|
520
|
+
elif dtypes[col] == 'datetime' or dtypes[col] == 'timestamp':
|
521
|
+
default = '2000-01-01 10:00:00'
|
522
|
+
elif 'decimal' in dtypes[col]:
|
523
|
+
default = 0.0
|
524
|
+
elif 'int' in dtypes[col]:
|
525
|
+
default = 0
|
526
|
+
elif 'varchar' in dtypes[col] or 'text' in dtypes[col]:
|
527
|
+
default = ''
|
528
|
+
elif 'year' in dtypes[col]:
|
529
|
+
default = '2000'
|
530
|
+
sql = f"ALTER TABLE `{table_name}` ADD COLUMN `{col}` {dtypes[col]} NOT NULL DEFAULT '{default}';"
|
531
|
+
else:
|
532
|
+
sql = f"ALTER TABLE `{table_name}` ADD COLUMN `{col}` {dtypes[col]} NOT NULL;"
|
503
533
|
cursor.execute(sql)
|
504
534
|
print(f"添加列: {col}({dtypes[col]})") # 添加列并指定数据类型
|
505
535
|
|
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
|