mdbq 3.0.0__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.
Files changed (54) hide show
  1. {mdbq-3.0.0 → mdbq-3.0.2}/PKG-INFO +1 -1
  2. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/aggregation/aggregation.py +17 -27
  3. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/aggregation/query_data.py +143 -8
  4. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/config/products.py +3 -3
  5. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/dataframe/converter.py +3 -3
  6. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/mysql/mysql.py +40 -10
  7. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq.egg-info/PKG-INFO +1 -1
  8. {mdbq-3.0.0 → mdbq-3.0.2}/setup.py +1 -1
  9. {mdbq-3.0.0 → mdbq-3.0.2}/README.txt +0 -0
  10. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/__init__.py +0 -0
  11. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/__version__.py +0 -0
  12. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/aggregation/__init__.py +0 -0
  13. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/aggregation/df_types.py +0 -0
  14. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/aggregation/mysql_types.py +0 -0
  15. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/aggregation/optimize_data.py +0 -0
  16. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/aggregation/query_data_bak.py +0 -0
  17. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/bdup/__init__.py +0 -0
  18. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/bdup/bdup.py +0 -0
  19. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/clean/__init__.py +0 -0
  20. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/clean/clean_upload.py +0 -0
  21. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/clean/data_clean.py +0 -0
  22. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/company/__init__.py +0 -0
  23. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/company/copysh.py +0 -0
  24. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/config/__init__.py +0 -0
  25. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/config/get_myconf.py +0 -0
  26. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/config/myconfig.py +0 -0
  27. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/config/set_support.py +0 -0
  28. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/config/update_conf.py +0 -0
  29. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/dataframe/__init__.py +0 -0
  30. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/log/__init__.py +0 -0
  31. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/log/mylogger.py +0 -0
  32. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/mongo/__init__.py +0 -0
  33. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/mongo/mongo.py +0 -0
  34. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/mysql/__init__.py +0 -0
  35. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/mysql/recheck_mysql.py +0 -0
  36. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/mysql/s_query.py +0 -0
  37. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/mysql/year_month_day.py +0 -0
  38. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/other/__init__.py +0 -0
  39. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/other/porxy.py +0 -0
  40. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/other/pov_city.py +0 -0
  41. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/other/sku_picture.py +0 -0
  42. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/other/ua_sj.py +0 -0
  43. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/pbix/__init__.py +0 -0
  44. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/pbix/pbix_refresh.py +0 -0
  45. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/pbix/refresh_all.py +0 -0
  46. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/pbix/refresh_all_old.py +0 -0
  47. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/req_post/__init__.py +0 -0
  48. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/req_post/req_tb.py +0 -0
  49. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/spider/__init__.py +0 -0
  50. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq/spider/aikucun.py +0 -0
  51. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq.egg-info/SOURCES.txt +0 -0
  52. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq.egg-info/dependency_links.txt +0 -0
  53. {mdbq-3.0.0 → mdbq-3.0.2}/mdbq.egg-info/top_level.txt +0 -0
  54. {mdbq-3.0.0 → mdbq-3.0.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 3.0.0
3
+ Version: 3.0.2
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -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
- # test()
1273
- col = 1
1274
- if col:
1275
- # 上传一个目录到指定数据库
1276
- db_name = '京东数据3'
1277
- table_name = '推广数据_全站营销'
1278
- upload_dir(
1279
- path=r'/Users/xigua/数据中心/原始文件3/京东报表/京准通_全站营销',
1280
- db_name=db_name,
1281
- collection_name=table_name,
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,60 @@ class MysqlDatasQuery:
1972
2039
  filename=None, # 用来追踪处理进度
1973
2040
  reset_id=False, # 是否重置自增列
1974
2041
  set_typ=set_typ,
2042
+ default=True, # 对于空值使用默认值
2043
+ )
2044
+ return True
2045
+
2046
+ def deeplink(self, db_name='聚合数据', table_name='达摩盘_deeplink人群洞察'):
2047
+ start_date, end_date = self.months_data(num=self.months)
2048
+ projection = {}
2049
+ df = self.download.data_to_df(
2050
+ db_name='达摩盘3',
2051
+ table_name='店铺deeplink人群洞察',
2052
+ start_date=start_date,
2053
+ end_date=end_date,
2054
+ projection=projection,
2055
+ )
2056
+ df.drop_duplicates(subset=['日期', '人群类型', '店铺名称', '人群规模', '广告投入金额'], keep='last', inplace=True, ignore_index=True)
2057
+ if not self.update_service:
2058
+ return
2059
+ set_typ = {
2060
+ '日期': 'date',
2061
+ '人群类型': 'varchar(100)',
2062
+ '店铺名称': 'varchar(100)',
2063
+ '人群规模': 'int',
2064
+ '人均成交价值': 'decimal(10, 4)',
2065
+ 'datatype': 'varchar(100)',
2066
+ '人群总计': 'int',
2067
+ '广告触达占比': 'decimal(12, 4)',
2068
+ '广告投入金额': 'decimal(12, 2)',
2069
+ 'touchcharge': 'decimal(12, 2)',
2070
+ '人群占比': 'decimal(12, 4)',
2071
+ '长周期roi': 'decimal(12, 4)',
2072
+ '支付买家数': 'int',
2073
+ '成交笔数': 'int',
2074
+ '成交金额': 'decimal(13, 2)',
2075
+ '触达人数': 'int',
2076
+ '长周期成交价值': 'decimal(13, 2)',
2077
+ '达摩盘id': 'int',
2078
+ }
2079
+ min_date = df['日期'].min()
2080
+ max_date = df['日期'].max()
2081
+ now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2082
+ print(f'{now} 正在更新: mysql ({host}:{port}) {db_name}/{table_name} -> {min_date}~{max_date}')
2083
+ m_engine.df_to_mysql(
2084
+ df=df,
2085
+ db_name=db_name,
2086
+ table_name=table_name,
2087
+ icm_update=['日期', '人群类型', '店铺名称', '人群规模', '广告投入金额'], # 增量更新, 在聚合数据中使用,其他不要用
2088
+ move_insert=True, # 先删除,再插入
2089
+ df_sql=False, # 值为 True 时使用 df.to_sql 函数上传整个表, 不会排重
2090
+ drop_duplicates=False, # 值为 True 时检查重复数据再插入,反之直接上传,会比较慢
2091
+ count=None,
2092
+ filename=None, # 用来追踪处理进度
2093
+ reset_id=False, # 是否重置自增列
2094
+ set_typ=set_typ,
2095
+ default=True, # 对于空值使用默认值
1975
2096
  )
1976
2097
  return True
1977
2098
 
@@ -2079,6 +2200,7 @@ class MysqlDatasQuery:
2079
2200
  filename=None, # 用来追踪处理进度
2080
2201
  reset_id=False, # 是否重置自增列
2081
2202
  set_typ=set_typ,
2203
+ default=True, # 对于空值使用默认值
2082
2204
  )
2083
2205
  return True
2084
2206
 
@@ -2489,6 +2611,7 @@ class MysqlDatasQuery:
2489
2611
  filename=None, # 用来追踪处理进度
2490
2612
  reset_id=False, # 是否重置自增列
2491
2613
  set_typ=set_typ,
2614
+ default=True, # 对于空值使用默认值
2492
2615
  )
2493
2616
  return True
2494
2617
 
@@ -2564,7 +2687,7 @@ class MysqlDatasQuery:
2564
2687
  '自然流量曝光量': int,
2565
2688
  }
2566
2689
  )
2567
- [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()]
2568
2691
  set_typ = {
2569
2692
  '日期': 'date',
2570
2693
  '店铺名称': 'varchar(100)',
@@ -2599,6 +2722,7 @@ class MysqlDatasQuery:
2599
2722
  filename=None, # 用来追踪处理进度
2600
2723
  reset_id=False, # 是否重置自增列
2601
2724
  set_typ=set_typ,
2725
+ default=True, # 对于空值使用默认值
2602
2726
  )
2603
2727
  return True
2604
2728
 
@@ -2638,7 +2762,7 @@ class MysqlDatasQuery:
2638
2762
  df['毛利率'] = df.apply(
2639
2763
  lambda x: round((x['成交金额'] - x['商品成本']) / x['成交金额'], 4) if x['成交金额'] > 0 else 0, axis=1)
2640
2764
  df['盈亏'] = df.apply(lambda x: x['商品毛利'] - x['花费'], axis=1)
2641
- [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()]
2642
2766
  set_typ = {
2643
2767
  '日期': 'date',
2644
2768
  '跟单sku_id': 'bigint',
@@ -2670,6 +2794,7 @@ class MysqlDatasQuery:
2670
2794
  filename=None, # 用来追踪处理进度
2671
2795
  reset_id=False, # 是否重置自增列
2672
2796
  set_typ=set_typ,
2797
+ default=True, # 对于空值使用默认值
2673
2798
  )
2674
2799
  return True
2675
2800
 
@@ -2728,6 +2853,7 @@ def date_table():
2728
2853
  count=None,
2729
2854
  filename=None, # 用来追踪处理进度
2730
2855
  set_typ=set_typ,
2856
+ default=True, # 对于空值使用默认值
2731
2857
  )
2732
2858
 
2733
2859
 
@@ -2791,6 +2917,7 @@ def query_(months=1, less_dict=[]):
2791
2917
  sdq.tg_by_day(db_name='聚合数据', table_name='多店推广场景_按日聚合')
2792
2918
  sdq.aikucun_bd_spu(db_name='聚合数据', table_name='爱库存_商品spu榜单')
2793
2919
  sdq.dmp_crowd(db_name='聚合数据', table_name='达摩盘_人群报表')
2920
+ sdq.deeplink(db_name='聚合数据', table_name='达摩盘_deeplink人群洞察')
2794
2921
  sdq.performance(bb_tg=True, db_name='聚合数据', table_name='_全店商品销售') # _全店商品销售
2795
2922
  sdq.performance(bb_tg=False, db_name='聚合数据', table_name='_推广商品销售') # _推广商品销售
2796
2923
  sdq.performance_jd(jd_tg=False, db_name='聚合数据', table_name='_京东_推广商品销售') # _推广商品销售
@@ -2798,5 +2925,13 @@ def query_(months=1, less_dict=[]):
2798
2925
 
2799
2926
 
2800
2927
  if __name__ == '__main__':
2801
- # main(days=100, months=3)
2802
- query_(months=1)
2928
+ main(days=130, months=3)
2929
+ # query_(months=1)
2930
+
2931
+ # # 4. 清理聚合数据
2932
+ # optimize_data.op_data(
2933
+ # db_name_lists=['聚合数据'],
2934
+ # days=300,
2935
+ # is_mongo=False,
2936
+ # is_mysql=True,
2937
+ # )
@@ -142,9 +142,9 @@ class Products:
142
142
  # icm_update=['日期', '店铺名称', '宝贝id'], # 唯一组合键
143
143
  unique_main_key=['商品id'],
144
144
  set_typ={
145
- '商品id': 'mediumtext',
146
- '平台': 'mediumtext',
147
- '上市年份': 'mediumtext',
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], 0, inplace=True) # 清理一些非法值
35
- df.replace(to_replace=['\\N', '-', '--', '', 'nan', 'NAN'], value=0, regex=False, inplace=True) # 替换掉特殊字符
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
- sql = f"ALTER TABLE `{table_name}` ADD COLUMN `{col}` {dtypes[col]} NOT NULL;"
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], 0, inplace=True) # 清理一些非法值
366
- df.replace(to_replace=['\\N', '-', '--', '', 'nan', 'NAN'], value=0, regex=False, inplace=True) # 替换掉特殊字符
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: 'DATE'})
429
+ __res_dict.update({k: 'date'})
415
430
  elif k == '更新时间':
416
- __res_dict.update({k: 'TIMESTAMP'})
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: 'BOOLEAN'})
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
- sql = f"ALTER TABLE `{table_name}` ADD COLUMN `{col}` {dtypes[col]} NOT NULL;"
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 3.0.0
3
+ Version: 3.0.2
4
4
  Home-page: https://pypi.org/project/mdbq
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -3,7 +3,7 @@
3
3
  from setuptools import setup, find_packages
4
4
 
5
5
  setup(name='mdbq',
6
- version='3.0.0',
6
+ version='3.0.2',
7
7
  author='xigua, ',
8
8
  author_email="2587125111@qq.com",
9
9
  url='https://pypi.org/project/mdbq',
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