mdbq 0.0.8__tar.gz → 0.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.
Files changed (40) hide show
  1. {mdbq-0.0.8 → mdbq-0.0.9}/PKG-INFO +1 -1
  2. mdbq-0.0.9/mdbq/dataframe/__init__.py +4 -0
  3. mdbq-0.0.9/mdbq/dataframe/converter.py +57 -0
  4. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mongo/mongo.py +11 -53
  5. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/mysql.py +3 -37
  6. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/PKG-INFO +1 -1
  7. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/SOURCES.txt +2 -3
  8. {mdbq-0.0.8 → mdbq-0.0.9}/setup.py +1 -1
  9. mdbq-0.0.8/mdbq/aggregation/__init__.py +0 -4
  10. mdbq-0.0.8/mdbq/aggregation/aggregation.py +0 -1050
  11. mdbq-0.0.8/mdbq/aggregation/query_data.py +0 -321
  12. {mdbq-0.0.8 → mdbq-0.0.9}/README.txt +0 -0
  13. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/__init__.py +0 -0
  14. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/__version__.py +0 -0
  15. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/bdup/__init__.py +0 -0
  16. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/bdup/bdup.py +0 -0
  17. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/clean/__init__.py +0 -0
  18. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/clean/data_clean.py +0 -0
  19. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/company/__init__.py +0 -0
  20. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/company/copysh.py +0 -0
  21. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/config/__init__.py +0 -0
  22. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/config/get_myconf.py +0 -0
  23. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/config/update_conf.py +0 -0
  24. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/log/__init__.py +0 -0
  25. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/log/mylogger.py +0 -0
  26. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mongo/__init__.py +0 -0
  27. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/__init__.py +0 -0
  28. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/s_query.py +0 -0
  29. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/year_month_day.py +0 -0
  30. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/__init__.py +0 -0
  31. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/porxy.py +0 -0
  32. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/pov_city.py +0 -0
  33. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/ua_sj.py +0 -0
  34. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/pbix/__init__.py +0 -0
  35. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/pbix/pbix_refresh.py +0 -0
  36. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/pbix/refresh_all.py +0 -0
  37. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/spider/__init__.py +0 -0
  38. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/dependency_links.txt +0 -0
  39. {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/top_level.txt +0 -0
  40. {mdbq-0.0.8 → mdbq-0.0.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 0.0.8
3
+ Version: 0.0.9
4
4
  Home-page: https://pypi.org/project/mdbsql
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -0,0 +1,4 @@
1
+
2
+
3
+
4
+ # dataframe 优化
@@ -0,0 +1,57 @@
1
+ # -*- coding:utf-8 -*-
2
+ import pandas as pd
3
+ import numpy as np
4
+ import re
5
+
6
+
7
+ class DataFrameConverter(object):
8
+ def __init__(self, df=pd.DataFrame({})):
9
+ self.df = df
10
+
11
+ def convert_df_cols(self, df=pd.DataFrame({})):
12
+ """
13
+ 清理 dataframe 列名的不合规字符(mysql)
14
+ 对数据类型进行转换(尝试将 object 类型转为 int 或 float)
15
+ """
16
+ if len(df) == 0:
17
+ df = self.df
18
+ if len(df) == 0:
19
+ return
20
+ # dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
21
+ df.replace([np.inf, -np.inf], 0, inplace=True) # 清理一些非法值
22
+ df.replace(to_replace=['\\N', '-', '--', '', 'nan'], value=0, regex=False, inplace=True) # 替换掉特殊字符
23
+ df.replace(to_replace=[','], value='', regex=True, inplace=True)
24
+ df.replace(to_replace=['="'], value='', regex=True, inplace=True) # ="和"不可以放在一起清洗, 因为有: id=86785565
25
+ df.replace(to_replace=['"'], value='', regex=True, inplace=True)
26
+ cols = df.columns.tolist()
27
+ for col in cols:
28
+ # df[col] = df[col].apply(lambda x: re.sub('[="]', '', str(x)) if '="' in str(x) else x)
29
+ # 百分比在某些数据库中不兼容, 转换百分比为小数
30
+ df[col] = df[col].apply(lambda x: float(float((str(x).rstrip("%"))) / 100) if str(x).endswith('%') and '~' not in str(x) else x)
31
+ # 尝试转换合适的数据类型
32
+ if df[col].dtype == 'object':
33
+ try:
34
+ df[col] = df[col].astype(int) # 尝试转换 int
35
+ except:
36
+ df[col] = df[col].astype('float64', errors='ignore') # 尝试转换 float, 报错则忽略
37
+ if df[col].dtype == 'float': # 对于小数类型, 保留 6 位小数
38
+ df[col] = df[col].apply(lambda x: round(float(x), 6) if x != 0 else x)
39
+ # 清理列名, 在 mysql 里面列名不能含有某些特殊字符
40
+ if '日期' in col or '时间' in col:
41
+ try:
42
+ df[col] = df[col].apply(lambda x: pd.to_datetime(x))
43
+ except:
44
+ pass
45
+ new_col = col.lower()
46
+ new_col = re.sub(r'[\',,()()/=<>+\-*^"’\[\]~#|&% .;]', '_', new_col)
47
+ df.rename(columns={col: new_col}, inplace=True)
48
+ df.fillna(0, inplace=True)
49
+ return df
50
+
51
+
52
+ if __name__ == '__main__':
53
+ df = pd.DataFrame(np.random.randn(5, 3), columns=['a', 'b', 'c'])
54
+ converter = DataFrameConverter()
55
+ df = converter.convert_df_cols(df)
56
+ print(df['a'].dtype)
57
+ print(df)
@@ -10,6 +10,7 @@ import pymongo
10
10
  from functools import wraps
11
11
  from concurrent.futures import ThreadPoolExecutor
12
12
  from mdbq.config import get_myconf
13
+ from mdbq.dataframe import converter
13
14
 
14
15
  warnings.filterwarnings('ignore')
15
16
 
@@ -209,15 +210,6 @@ class DownMongo:
209
210
  else:
210
211
  print(f'{now}正在下载数据 ({self.host}) {self.db_name}: {self.collection_name}, 数据区间: {self.start_date} ~ {self.end_date}')
211
212
 
212
- # self.start_date = datetime.datetime.now() - datetime.timedelta(days=self.days)
213
- # query = { # 读取数据库中指定时间区间的数据
214
- # '日期':
215
- # {
216
- # '$gte': self.start_date,
217
- # '$lte': self.end_date
218
- # },
219
- # }
220
- # _df = pd.DataFrame((list(_collection.find(query)))) # 将数据转换为 dataframe
221
213
  if not self.start_date:
222
214
  self.start_date = datetime.datetime.now() - datetime.timedelta(days=self.days)
223
215
  self.end_date = datetime.datetime.now()
@@ -236,17 +228,16 @@ class DownMongo:
236
228
  # print(doc)
237
229
  datas.append(doc)
238
230
  _df = pd.DataFrame(datas)
231
+ if len(_df) == 0:
232
+ print(f'查询的数据量: {len(_df)}, 森么都米有花生')
233
+ self.client.close()
234
+ return
235
+ if '_id' in _df.columns.tolist():
236
+ _df.drop('_id', axis=1, inplace=True)
239
237
 
240
- for col in _df.columns.tolist(): # 保存之前尝试转换数据类型
241
- if '日期' in col:
242
- _df[col] = _df[col].astype(str).apply(lambda x: ''.join(re.findall(r'(\d{4}-\d{2}-\d{2})', x)))
243
- _df[col] = pd.to_datetime(_df[col], format='%Y-%m-%d', errors='ignore') # 转换日期列
244
- elif '_id' in col:
245
- # _df['_id'] = _df['_id'].astype(str) # 将 '_id' 字段转换为字符串,因为它是一个 ObjectId 对象
246
- _df.drop('_id', axis=1, inplace=True)
247
- else:
248
- _df[col] = pd.to_numeric(_df[col], errors='ignore')
249
238
  print(f'查询的数据量: {len(_df)}')
239
+ cv = converter.DataFrameConverter()
240
+ _df = cv.convert_df_cols(_df)
250
241
  s_date = re.findall(r'(\d{4}-\d{2}-\d{2})', str(_df['日期'].values.min()))[0]
251
242
  e_date = re.findall(r'(\d{4}-\d{2}-\d{2})', str(_df['日期'].values.max()))[0]
252
243
  if not file_type.startswith('.'):
@@ -420,7 +411,8 @@ class UploadMongo:
420
411
  start_date = None
421
412
  end_date = None
422
413
 
423
- df = self.convert_df_cols(df=df) # 清理列名中的不合规字符
414
+ cv = converter.DataFrameConverter()
415
+ df = cv.convert_df_cols(df=df) # 清理列名中的不合规字符
424
416
  if '日期' in df.columns.tolist():
425
417
  # df['日期'] = df['日期'].apply(lambda x: pd.to_datetime(x))
426
418
  collections.create_index([('日期', -1)], background=True) # 必须, 创建索引, background 不阻塞
@@ -469,40 +461,6 @@ class UploadMongo:
469
461
 
470
462
  self.client.close() #
471
463
 
472
- def convert_df_cols(self, df):
473
- """
474
- 清理 dataframe 列名的不合规字符(mysql)
475
- 对数据类型进行转换(尝试将 object 类型转为 int 或 float)
476
- """
477
- # dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
478
- df.replace([np.inf, -np.inf], 0, inplace=True) # 清理一些非法值
479
-
480
- cols = df.columns.tolist()
481
- df.replace(to_replace=['\\N', '-', '--', '', 'nan'], value=0, regex=False, inplace=True) # 替换掉特殊字符
482
- df.replace(to_replace=[','], value='', regex=True, inplace=True)
483
- for col in cols:
484
- # 百分比在某些数据库中不兼容, 转换百分比为小数
485
- df[col] = df[col].apply(lambda x: float(float((str(x).rstrip("%"))) / 100) if str(x).endswith('%') and '~' not in str(x) else x)
486
- # 尝试转换合适的数据类型
487
- if df[col].dtype == 'object':
488
- try:
489
- df[col] = df[col].astype(int) # 尝试转换 int
490
- except:
491
- df[col] = df[col].astype('float64', errors='ignore') # 尝试转换 float, 报错则忽略
492
- if df[col].dtype == 'float': # 对于小数类型, 保留 6 位小数
493
- df[col] = df[col].apply(lambda x: round(float(x), 6) if x != 0 else x)
494
- # 清理列名, 在 mysql 里面列名不能含有某些特殊字符
495
- if '日期' in col or '时间' in col:
496
- try:
497
- df[col] = df[col].apply(lambda x: pd.to_datetime(x))
498
- except:
499
- pass
500
- new_col = col.lower()
501
- new_col = re.sub(r'[\',,()()/=<>+\-*^"’\[\]~#|&% .;]', '_', new_col)
502
- df.rename(columns={col: new_col}, inplace=True)
503
- df.fillna(0, inplace=True)
504
- return df
505
-
506
464
 
507
465
  class OptimizeDatas:
508
466
  """
@@ -12,6 +12,7 @@ from sqlalchemy import create_engine
12
12
  import os
13
13
  import calendar
14
14
  from mdbq.config import get_myconf
15
+ from mdbq.dataframe import converter
15
16
 
16
17
  warnings.filterwarnings('ignore')
17
18
 
@@ -67,7 +68,8 @@ class MysqlUpload:
67
68
  """
68
69
  db_name = re.sub(r'[\',,()()/=<>+\-*^"’\[\]~#|&% .]', '_', db_name)
69
70
  tabel_name = re.sub(r'[\',,()()/=<>+\-*^"’\[\]~#|&% .]', '_', tabel_name)
70
- df = self.convert_df_cols(df=df) # 清理列名中的不合规字符
71
+ cv = converter.DataFrameConverter()
72
+ df = cv.convert_df_cols(df=df) # 清理列名中的不合规字符
71
73
 
72
74
  connection = pymysql.connect(**self.config) # 连接数据库
73
75
  try:
@@ -182,42 +184,6 @@ class MysqlUpload:
182
184
  else:
183
185
  return 'mediumtext'
184
186
 
185
-
186
- def convert_df_cols(self, df):
187
- """
188
- 清理 dataframe 列名的不合规字符(mysql)
189
- 对数据类型进行转换(尝试将 object 类型转为 int 或 float)
190
- """
191
- # dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
192
- df.replace([np.inf, -np.inf], 0, inplace=True) # 清理一些非法值
193
-
194
- cols = df.columns.tolist()
195
- df.replace(to_replace=['\\N', '-', '--', '', 'nan'], value=0, regex=False, inplace=True) # 替换掉特殊字符
196
- df.replace(to_replace=[','], value='', regex=True, inplace=True)
197
- for col in cols:
198
- # 百分比在某些数据库中不兼容, 转换百分比为小数
199
- df[col] = df[col].apply(lambda x: float(float((str(x).rstrip("%"))) / 100) if str(x).endswith('%') and '~' not in str(x) else x)
200
- # 尝试转换合适的数据类型
201
- if df[col].dtype == 'object':
202
- try:
203
- df[col] = df[col].astype(int) # 尝试转换 int
204
- except:
205
- df[col] = df[col].astype('float64', errors='ignore') # 尝试转换 float, 报错则忽略
206
- if df[col].dtype == 'float': # 对于小数类型, 保留 6 位小数
207
- df[col] = df[col].apply(lambda x: round(float(x), 6) if x != 0 else x)
208
- # 清理列名, 在 mysql 里面列名不能含有某些特殊字符
209
- if '日期' in col or '时间' in col:
210
- try:
211
- df[col] = df[col].apply(lambda x: pd.to_datetime(x))
212
- except:
213
- pass
214
- new_col = col.lower()
215
- new_col = re.sub(r'[\',,()()/=<>+\-*^"’\[\]~#|&% .;]', '_', new_col)
216
- df.rename(columns={col: new_col}, inplace=True)
217
- df.fillna(0, inplace=True)
218
- return df
219
-
220
-
221
187
  def upload_pandas(self, update_path, db_name, days=None):
222
188
  """
223
189
  专门用来上传 pandas数据源的全部文件, 跳过 '其他数据' or '京东数据集'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 0.0.8
3
+ Version: 0.0.9
4
4
  Home-page: https://pypi.org/project/mdbsql
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -6,9 +6,6 @@ mdbq.egg-info/PKG-INFO
6
6
  mdbq.egg-info/SOURCES.txt
7
7
  mdbq.egg-info/dependency_links.txt
8
8
  mdbq.egg-info/top_level.txt
9
- mdbq/aggregation/__init__.py
10
- mdbq/aggregation/aggregation.py
11
- mdbq/aggregation/query_data.py
12
9
  mdbq/bdup/__init__.py
13
10
  mdbq/bdup/bdup.py
14
11
  mdbq/clean/__init__.py
@@ -18,6 +15,8 @@ mdbq/company/copysh.py
18
15
  mdbq/config/__init__.py
19
16
  mdbq/config/get_myconf.py
20
17
  mdbq/config/update_conf.py
18
+ mdbq/dataframe/__init__.py
19
+ mdbq/dataframe/converter.py
21
20
  mdbq/log/__init__.py
22
21
  mdbq/log/mylogger.py
23
22
  mdbq/mongo/__init__.py
@@ -3,7 +3,7 @@
3
3
  from setuptools import setup, find_packages
4
4
 
5
5
  setup(name='mdbq',
6
- version='0.0.8',
6
+ version='0.0.9',
7
7
  author='xigua, ',
8
8
  author_email="2587125111@qq.com",
9
9
  url='https://pypi.org/project/mdbsql',
@@ -1,4 +0,0 @@
1
-
2
-
3
-
4
- # 数据清洗, 数据聚合, 入库