mdbq 0.1.6__tar.gz → 0.1.8__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 (40) hide show
  1. {mdbq-0.1.6 → mdbq-0.1.8}/PKG-INFO +1 -1
  2. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/aggregation/query_data.py +118 -20
  3. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/company/copysh.py +5 -1
  4. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/mysql/mysql.py +15 -1
  5. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq.egg-info/PKG-INFO +1 -1
  6. {mdbq-0.1.6 → mdbq-0.1.8}/setup.py +1 -1
  7. {mdbq-0.1.6 → mdbq-0.1.8}/README.txt +0 -0
  8. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/__init__.py +0 -0
  9. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/__version__.py +0 -0
  10. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/aggregation/__init__.py +0 -0
  11. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/aggregation/aggregation.py +0 -0
  12. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/bdup/__init__.py +0 -0
  13. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/bdup/bdup.py +0 -0
  14. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/clean/__init__.py +0 -0
  15. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/clean/data_clean.py +0 -0
  16. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/company/__init__.py +0 -0
  17. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/config/__init__.py +0 -0
  18. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/config/get_myconf.py +0 -0
  19. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/config/update_conf.py +0 -0
  20. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/dataframe/__init__.py +0 -0
  21. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/dataframe/converter.py +0 -0
  22. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/log/__init__.py +0 -0
  23. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/log/mylogger.py +0 -0
  24. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/mongo/__init__.py +0 -0
  25. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/mongo/mongo.py +0 -0
  26. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/mysql/__init__.py +0 -0
  27. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/mysql/s_query.py +0 -0
  28. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/mysql/year_month_day.py +0 -0
  29. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/other/__init__.py +0 -0
  30. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/other/porxy.py +0 -0
  31. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/other/pov_city.py +0 -0
  32. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/other/ua_sj.py +0 -0
  33. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/pbix/__init__.py +0 -0
  34. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/pbix/pbix_refresh.py +0 -0
  35. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/pbix/refresh_all.py +0 -0
  36. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq/spider/__init__.py +0 -0
  37. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq.egg-info/SOURCES.txt +0 -0
  38. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq.egg-info/dependency_links.txt +0 -0
  39. {mdbq-0.1.6 → mdbq-0.1.8}/mdbq.egg-info/top_level.txt +0 -0
  40. {mdbq-0.1.6 → mdbq-0.1.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Home-page: https://pypi.org/project/mdbsql
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -1,5 +1,6 @@
1
1
  # -*- coding: UTF-8 –*-
2
2
  from mdbq.mongo import mongo
3
+ from mdbq.mysql import mysql
3
4
  from mdbq.mysql import s_query
4
5
  from mdbq.config import get_myconf
5
6
  import datetime
@@ -117,7 +118,7 @@ class MysqlDatasQuery:
117
118
  '订单数': 1,
118
119
  '退货量': 1,
119
120
  '退款额': 1,
120
- '退货量_发货后_': 1,
121
+ '退货量_发货后': 1,
121
122
  }
122
123
  df = self.download.data_to_df(
123
124
  db_name='生意经2',
@@ -128,6 +129,26 @@ class MysqlDatasQuery:
128
129
  )
129
130
  return df
130
131
 
132
+ def idbm(self):
133
+ """ 用生意经日数据制作商品 id 和编码对照表 """
134
+ data_values = self.download.columns_to_list(
135
+ db_name='生意经2',
136
+ tabel_name='宝贝指标',
137
+ columns_name=['宝贝id', '商家编码', '行业类目'],
138
+ )
139
+ df = pd.DataFrame(data=data_values)
140
+ return df
141
+
142
+ def sp_picture(self):
143
+ """ 用生意经日数据制作商品 id 和编码对照表 """
144
+ data_values = self.download.columns_to_list(
145
+ db_name='属性设置2',
146
+ tabel_name='商品素材导出',
147
+ columns_name=['日期', '商品id', '商品白底图', '方版场景图'],
148
+ )
149
+ df = pd.DataFrame(data=data_values)
150
+ return df
151
+
131
152
  def dplyd(self):
132
153
  start_date, end_date = self.months_data(num=self.months)
133
154
  projection = {
@@ -150,6 +171,16 @@ class MysqlDatasQuery:
150
171
  )
151
172
  return df
152
173
 
174
+ def sp_cost(self):
175
+ """ 电商定价 """
176
+ data_values = self.download.columns_to_list(
177
+ db_name='属性设置2',
178
+ tabel_name='电商定价',
179
+ columns_name=['日期', '款号', '年份季节', '吊牌价', '商家平台', '成本价', '天猫页面价', '天猫中促价'],
180
+ )
181
+ df = pd.DataFrame(data=data_values)
182
+ return df
183
+
153
184
  @staticmethod
154
185
  def months_data(num=0, end_date=None):
155
186
  """ 读取近 num 个月的数据, 0 表示读取当月的数据 """
@@ -229,7 +260,7 @@ class GroupBy:
229
260
  '订单数': ('订单数', np.min),
230
261
  '退货量': ('退货量', np.max),
231
262
  '退款额': ('退款额', np.max),
232
- '退货量_发货后_': ('退货量_发货后_', np.max),
263
+ '退货量_发货后': ('退货量_发货后', np.max),
233
264
  }
234
265
  )
235
266
  df['件均价'] = df.apply(lambda x: x['销售额'] / x['销售量'] if x['销售量'] > 0 else 0, axis=1).round(
@@ -244,6 +275,41 @@ class GroupBy:
244
275
  return df
245
276
  elif '店铺来源_日数据' in tabel_name:
246
277
  return df
278
+ elif '商品id编码表' in tabel_name:
279
+ df.drop_duplicates(subset='宝贝id', keep='last', inplace=True, ignore_index=True)
280
+ # df['行业类目'] = df['行业类目'].apply(lambda x: re.sub(' ', '', x))
281
+ try:
282
+ df[['一级类目', '二级类目', '三级类目']] = df['行业类目'].str.split(' -> ', expand=True).loc[:, 0:2]
283
+ except:
284
+ try:
285
+ df[['一级类目', '二级类目']] = df['行业类目'].str.split(' -> ', expand=True).loc[:, 0:1]
286
+ except:
287
+ df['一级类目'] = df['行业类目']
288
+ df.drop('行业类目', axis=1, inplace=True)
289
+ df.sort_values('宝贝id', ascending=False, inplace=True)
290
+ df = df[(df['宝贝id'] != '973') & (df['宝贝id'] != '973')]
291
+ return df
292
+ elif '商品id图片对照表' in tabel_name:
293
+ df['商品id'] = df['商品id'].astype('int64')
294
+ df['日期'] = df['日期'].astype('datetime64[ns]')
295
+ df = df[(df['商品白底图'] != '0') | (df['方版场景图'] != '0')]
296
+ # 白底图优先
297
+ df['商品图片'] = df[['商品白底图', '方版场景图']].apply(
298
+ lambda x: x['商品白底图'] if x['商品白底图'] !='0' else x['方版场景图'], axis=1)
299
+ # # 方版场景图优先
300
+ # df['商品图片'] = df[['商品白底图', '方版场景图']].apply(
301
+ # lambda x: x['方版场景图'] if x['方版场景图'] != '0' else x['商品白底图'], axis=1)
302
+ df.sort_values(by=['商品id', '日期'], ascending=[False, True], ignore_index=True, inplace=True)
303
+ df.drop_duplicates(subset=['商品id'], keep='last', inplace=True, ignore_index=True)
304
+ df = df[['商品id', '商品图片', '日期']]
305
+ df['商品图片'] = df['商品图片'].apply(lambda x: x if 'http' in x else None) # 检查是否是 http 链接
306
+ df.dropna(how='all', subset=['商品图片'], axis=0, inplace=True) # 删除指定列含有空值的行
307
+ df.sort_values(by='商品id', ascending=False, ignore_index=True, inplace=True) # ascending=False 降序排列
308
+ return df
309
+ elif '商品成本' in tabel_name:
310
+ df.sort_values(by=['款号', '日期'], ascending=[False, True], ignore_index=True, inplace=True)
311
+ df.drop_duplicates(subset=['款号'], keep='last', inplace=True, ignore_index=True)
312
+ return df
247
313
  else:
248
314
  print(f'<{tabel_name}>: Groupby 类尚未配置,数据为空')
249
315
  return pd.DataFrame({})
@@ -330,25 +396,57 @@ class GroupBy:
330
396
  index=index, header=header, engine=engine, freeze_panes=freeze_panes)
331
397
 
332
398
 
333
- def data_output():
334
- sdq = MysqlDatasQuery(target_service='home_lx')
335
- sdq.months = 0
336
-
337
- # df = sdq.tg_wxt() # 从数据库中获取数据并转为 df
338
- # g = GroupBy() # 数据聚合
339
- # df = g.groupby(df=df, tabel_name='推广数据_宝贝主体报表', is_maximize=True)
340
- # g.as_csv(df=df, filename='推广数据_宝贝主体报表') # 数据导出
341
-
342
- # df = sdq.syj()
343
- # g = GroupBy()
344
- # df = g.groupby(df=df, tabel_name='宝贝指标', is_maximize=True)
345
- # g.as_csv(df=df, filename='宝贝指标')
399
+ def data_aggregation():
400
+ """
401
+ 1. 从数据库中读取数据
402
+ 2. 数据聚合清洗
403
+ 3. 统一回传数据库: <聚合数据> (不再导出为文件)
404
+ """
405
+ sdq = MysqlDatasQuery(target_service='company') # 实例化数据处理类
406
+ sdq.months = 0 # 设置数据周期
407
+ g = GroupBy() # 实例化数据聚合类
408
+ # 实例化数据库连接
409
+ username, password, host, port = get_myconf.select_config_values(target_service='company', database='mysql')
410
+ m = mysql.MysqlUpload(username=username, password=password, host=host, port=port)
346
411
 
347
- df = sdq.dplyd()
348
- g = GroupBy()
349
- df = g.groupby(df=df, tabel_name='店铺来源_日数据', is_maximize=True)
350
- g.as_csv(df=df, filename='店铺来源_日数据')
412
+ data_dict = [
413
+ {
414
+ '数据库名': '聚合数据',
415
+ '集合名': '推广数据_宝贝主体报表',
416
+ '数据主体': sdq.tg_wxt(),
417
+ },
418
+ {
419
+ '数据库名': '聚合数据',
420
+ '集合名': '天猫生意经_宝贝指标',
421
+ '数据主体': sdq.syj(),
422
+ },
423
+ {
424
+ '数据库名': '聚合数据',
425
+ '集合名': '天猫_店铺来源_日数据',
426
+ '数据主体': sdq.dplyd(),
427
+ },
428
+ {
429
+ '数据库名': '聚合数据',
430
+ '集合名': '商品id编码表',
431
+ '数据主体': sdq.idbm(),
432
+ },
433
+ {
434
+ '数据库名': '聚合数据',
435
+ '集合名': '商品id图片对照表',
436
+ '数据主体': sdq.sp_picture(),
437
+ },
438
+ {
439
+ '数据库名': '聚合数据',
440
+ '集合名': '商品成本',
441
+ '数据主体': sdq.sp_cost(),
442
+ },
443
+ ]
444
+ for items in data_dict:
445
+ db_name, tabel_name, df = items['数据库名'], items['集合名'], items['数据主体']
446
+ df = g.groupby(df=df, tabel_name=tabel_name, is_maximize=True) # 2. 聚合数据
447
+ # g.as_csv(df=df, filename=tabel_name + '.csv')
448
+ m.df_to_mysql(df=df, db_name=db_name, tabel_name=tabel_name) # 3. 回传数据库
351
449
 
352
450
 
353
451
  if __name__ == '__main__':
354
- main()
452
+ data_aggregation()
@@ -314,4 +314,8 @@ def main():
314
314
 
315
315
 
316
316
  if __name__ == '__main__':
317
- main()
317
+ # main()
318
+ dp = aggregation.DatabaseUpdate(path='')
319
+ # dp.new_unzip(is_move=True)
320
+ # dp.cleaning(is_move=True) # 公司台式机需要移除
321
+ dp.upload_df(service_databases=[{'company': 'mysql'}])
@@ -181,6 +181,8 @@ class MysqlUpload:
181
181
  # 最优先处理 ID 类型, 在 mysql 里面, 有些列数字过长不能存储为 int 类型
182
182
  if 'id' in col or 'ID' in col or 'Id' in col or '摘要' in col or '商家编码' in col or '单号' in col or '款号' in col:
183
183
  return 'mediumtext'
184
+ if '商品编码' in col: # 京东sku/spu商品信息
185
+ return 'mediumtext'
184
186
  if '文件大小' in col: # bw 程序
185
187
  return 'mediumtext'
186
188
  elif '日期' in col or '时间' in col:
@@ -192,8 +194,12 @@ class MysqlUpload:
192
194
  elif dtype == 'datetime64[ns]': # 日期可能显示为数字, 因为放在判断 int 的前面
193
195
  return 'DATE'
194
196
  elif dtype == 'int32':
197
+ if len(str(max(df[col].tolist()))) >= 10: # 数值长度超限转为 mediumtext
198
+ return 'mediumtext'
195
199
  return 'INT'
196
200
  elif dtype == 'int64':
201
+ if len(str(max(df[col].tolist()))) >= 10:
202
+ return 'mediumtext'
197
203
  return 'INT'
198
204
  elif dtype == 'float64':
199
205
  return 'FLOAT'
@@ -391,11 +397,19 @@ class OptimizeDatas:
391
397
  self.config.update({'database': self.db_name}) # 添加更新 config 字段
392
398
  self.connection = pymysql.connect(**self.config)
393
399
  with self.connection.cursor() as cursor:
400
+ sql = f"SELECT 1 FROM {table_name} LIMIT 1"
401
+ cursor.execute(sql)
402
+ result = cursor.fetchone()
403
+ if not result:
404
+ now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S ")
405
+ print(f'{now}数据表: {table_name}, 数据长度为 0')
406
+ continue # 检查数据表是否为空
407
+
394
408
  cursor.execute(f"SHOW FULL COLUMNS FROM {table_name}") # 查询数据表的列信息
395
409
  columns = cursor.fetchall()
396
410
  date_exist = False
397
411
  for col in columns: # 遍历列信息,检查是否存在类型为日期的列
398
- if col['Field'] == '日期' and col['Type'] == 'date' or col['Type'].startswith('datetime'):
412
+ if col['Field'] == '日期' and (col['Type'] == 'date' or col['Type'].startswith('datetime')):
399
413
  date_exist = True
400
414
  break
401
415
  if date_exist: # 存在日期列
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 0.1.6
3
+ Version: 0.1.8
4
4
  Home-page: https://pypi.org/project/mdbsql
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='0.1.6',
6
+ version='0.1.8',
7
7
  author='xigua, ',
8
8
  author_email="2587125111@qq.com",
9
9
  url='https://pypi.org/project/mdbsql',
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