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.
- {mdbq-0.0.8 → mdbq-0.0.9}/PKG-INFO +1 -1
- mdbq-0.0.9/mdbq/dataframe/__init__.py +4 -0
- mdbq-0.0.9/mdbq/dataframe/converter.py +57 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mongo/mongo.py +11 -53
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/mysql.py +3 -37
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/PKG-INFO +1 -1
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/SOURCES.txt +2 -3
- {mdbq-0.0.8 → mdbq-0.0.9}/setup.py +1 -1
- mdbq-0.0.8/mdbq/aggregation/__init__.py +0 -4
- mdbq-0.0.8/mdbq/aggregation/aggregation.py +0 -1050
- mdbq-0.0.8/mdbq/aggregation/query_data.py +0 -321
- {mdbq-0.0.8 → mdbq-0.0.9}/README.txt +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/__version__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/bdup/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/bdup/bdup.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/clean/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/clean/data_clean.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/company/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/company/copysh.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/config/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/config/get_myconf.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/config/update_conf.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/log/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/log/mylogger.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mongo/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/s_query.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/mysql/year_month_day.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/porxy.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/pov_city.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/other/ua_sj.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/pbix/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq/spider/__init__.py +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-0.0.8 → mdbq-0.0.9}/setup.cfg +0 -0
@@ -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
|
-
|
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
|
-
|
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 '京东数据集'
|
@@ -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
|