mdbq 0.2.5__tar.gz → 0.2.7__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.2.5 → mdbq-0.2.7}/PKG-INFO +1 -1
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/aggregation/query_data.py +5 -2
- mdbq-0.2.7/mdbq/config/products.py +123 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/mysql/data_types.py +7 -1
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/mysql/mysql.py +44 -8
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq.egg-info/PKG-INFO +1 -1
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq.egg-info/SOURCES.txt +1 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/setup.py +1 -1
- {mdbq-0.2.5 → mdbq-0.2.7}/README.txt +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/__version__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/aggregation/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/aggregation/aggregation.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/bdup/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/bdup/bdup.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/clean/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/clean/data_clean.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/company/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/company/copysh.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/config/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/config/get_myconf.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/config/update_conf.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/dataframe/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/dataframe/converter.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/log/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/log/mylogger.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/mongo/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/mongo/mongo.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/mysql/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/mysql/s_query.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/mysql/year_month_day.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/other/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/other/porxy.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/other/pov_city.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/other/ua_sj.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/pbix/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/pbix/pbix_refresh.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/pbix/refresh_all.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq/spider/__init__.py +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq.egg-info/dependency_links.txt +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/mdbq.egg-info/top_level.txt +0 -0
- {mdbq-0.2.5 → mdbq-0.2.7}/setup.cfg +0 -0
@@ -369,6 +369,9 @@ class GroupBy:
|
|
369
369
|
df = pd.merge(df, syj, how='left', left_on=['日期', '商品id'], right_on=['日期', '宝贝id'])
|
370
370
|
df.drop(labels='宝贝id', axis=1, inplace=True)
|
371
371
|
df.drop_duplicates(subset=['日期', '商品id', '花费', '销售额'], keep='last', inplace=True, ignore_index=True)
|
372
|
+
df['商品成本'] = df.apply(lambda x: x['成本价'] + x['销售额']/x['销售量'] * 0.11 + 6 if x['销售量'] > 0 else 0, axis=1)
|
373
|
+
df['商品毛利'] = df.apply(lambda x: x['销售额'] - x['商品成本'] * x['销售量'], axis=1)
|
374
|
+
df['商品盈亏'] = df.apply(lambda x: x['商品毛利'] - x['花费'], axis=1)
|
372
375
|
return df
|
373
376
|
|
374
377
|
def as_csv(self, df, filename, path=None, encoding='utf-8_sig',
|
@@ -505,8 +508,8 @@ def data_aggregation(service_databases=[{}]):
|
|
505
508
|
df = g.groupby(df=df, tabel_name=tabel_name, is_maximize=True) # 2. 聚合数据
|
506
509
|
# g.as_csv(df=df, filename=tabel_name + '.csv')
|
507
510
|
m.df_to_mysql(df=df, db_name=db_name, tabel_name=tabel_name) # 3. 回传数据库
|
508
|
-
res = g.performance()
|
509
|
-
m.df_to_mysql(df=res, db_name='聚合数据', tabel_name='销售盈亏')
|
511
|
+
res = g.performance() # 盈亏表,依赖其他表,单独做
|
512
|
+
m.df_to_mysql(df=res, db_name='聚合数据', tabel_name='销售盈亏')
|
510
513
|
|
511
514
|
|
512
515
|
if __name__ == '__main__':
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# -*- coding: UTF-8 –*-
|
2
|
+
import json
|
3
|
+
import os
|
4
|
+
import platform
|
5
|
+
import getpass
|
6
|
+
import pandas as pd
|
7
|
+
from mdbq.mysql import mysql
|
8
|
+
from mdbq.config import get_myconf
|
9
|
+
"""
|
10
|
+
天猫货品年份基准对照
|
11
|
+
"""
|
12
|
+
|
13
|
+
|
14
|
+
class Products:
|
15
|
+
def __init__(self):
|
16
|
+
self.datas = []
|
17
|
+
|
18
|
+
def update_my_datas(self):
|
19
|
+
my_datas = [
|
20
|
+
{
|
21
|
+
'平台': '天猫', '商品id': '822020840000', '上市年份': '2024年8月'
|
22
|
+
},
|
23
|
+
{
|
24
|
+
'平台': '天猫', '商品id': '811000000000', '上市年份': '2024年7月'
|
25
|
+
},
|
26
|
+
{
|
27
|
+
'平台': '天猫', '商品id': '800000000000', '上市年份': '2024年6月'
|
28
|
+
},
|
29
|
+
{
|
30
|
+
'平台': '天猫', '商品id': '791359643000', '上市年份': '2024年5月'
|
31
|
+
},
|
32
|
+
{
|
33
|
+
'平台': '天猫', '商品id': '778971448000', '上市年份': '2024年4月'
|
34
|
+
},
|
35
|
+
{
|
36
|
+
'平台': '天猫', '商品id': '770576016820', '上市年份': '2024年3月'
|
37
|
+
},
|
38
|
+
{
|
39
|
+
'平台': '天猫', '商品id': '766115058400', '上市年份': '2024年2月'
|
40
|
+
},
|
41
|
+
{
|
42
|
+
'平台': '天猫', '商品id': '759478591187', '上市年份': '2024年1月'
|
43
|
+
},
|
44
|
+
{
|
45
|
+
'平台': '天猫', '商品id': '752770183000', '上市年份': '2023年12月'
|
46
|
+
},
|
47
|
+
{
|
48
|
+
'平台': '天猫', '商品id': '745123890000', '上市年份': '2023年11月'
|
49
|
+
},
|
50
|
+
{
|
51
|
+
'平台': '天猫', '商品id': '741000000000', '上市年份': '2023年10月'
|
52
|
+
},
|
53
|
+
{
|
54
|
+
'平台': '天猫', '商品id': '736841920000', '上市年份': '2023年9月'
|
55
|
+
},
|
56
|
+
{
|
57
|
+
'平台': '天猫', '商品id': '730800000000', '上市年份': '2023年8月'
|
58
|
+
},
|
59
|
+
{
|
60
|
+
'平台': '天猫', '商品id': '726939636835', '上市年份': '2023年7月'
|
61
|
+
},
|
62
|
+
{
|
63
|
+
'平台': '天猫', '商品id': '721366048631', '上市年份': '2023年6月'
|
64
|
+
},
|
65
|
+
{
|
66
|
+
'平台': '天猫', '商品id': '716130443004', '上市年份': '2023年5月'
|
67
|
+
},
|
68
|
+
{
|
69
|
+
'平台': '天猫', '商品id': '709824308589', '上市年份': '2023年4月'
|
70
|
+
},
|
71
|
+
{
|
72
|
+
'平台': '天猫', '商品id': '705440027804', '上市年份': '2023年3月'
|
73
|
+
},
|
74
|
+
{
|
75
|
+
'平台': '天猫', '商品id': '701096067973', '上市年份': '2023年2月'
|
76
|
+
},
|
77
|
+
{
|
78
|
+
'平台': '天猫', '商品id': '696017000000', '上市年份': '2023年1月'
|
79
|
+
},
|
80
|
+
{
|
81
|
+
'平台': '天猫', '商品id': '666510000000', '上市年份': '2022年货品'
|
82
|
+
},
|
83
|
+
{
|
84
|
+
'平台': '天猫', '商品id': '636010000000', '上市年份': '2021年货品'
|
85
|
+
},
|
86
|
+
{
|
87
|
+
'平台': '天猫', '商品id': '610485872286', '上市年份': '2020年货品'
|
88
|
+
},
|
89
|
+
{
|
90
|
+
'平台': '天猫', '商品id': '585066000000', '上市年份': '2019年货品'
|
91
|
+
},
|
92
|
+
{
|
93
|
+
'平台': '天猫', '商品id': '563237000000', '上市年份': '2018年货品'
|
94
|
+
},
|
95
|
+
{
|
96
|
+
'平台': '天猫', '商品id': '100', '上市年份': '历史悠久'
|
97
|
+
},
|
98
|
+
]
|
99
|
+
self.datas += my_datas
|
100
|
+
|
101
|
+
def to_mysql(self,):
|
102
|
+
self.update_my_datas()
|
103
|
+
df = pd.DataFrame(self.datas)
|
104
|
+
username, password, host, port = get_myconf.select_config_values(
|
105
|
+
target_service='home_lx',
|
106
|
+
database='mysql',
|
107
|
+
)
|
108
|
+
m = mysql.MysqlUpload(
|
109
|
+
username=username,
|
110
|
+
password=password,
|
111
|
+
host=host,
|
112
|
+
port=port,
|
113
|
+
)
|
114
|
+
m.df_to_mysql(df=df, db_name='属性设置2', tabel_name='货品年份基准')
|
115
|
+
|
116
|
+
|
117
|
+
def main():
|
118
|
+
pass
|
119
|
+
|
120
|
+
|
121
|
+
if __name__ == '__main__':
|
122
|
+
p = Products()
|
123
|
+
p.to_mysql()
|
@@ -252,4 +252,10 @@ def main():
|
|
252
252
|
|
253
253
|
if __name__ == '__main__':
|
254
254
|
# main()
|
255
|
-
mysql_all_dtypes()
|
255
|
+
# mysql_all_dtypes()
|
256
|
+
|
257
|
+
path = '/Users/xigua/数据中心/自动0备份/py/数据更新/support'
|
258
|
+
d = DataTypes()
|
259
|
+
# 从本地文件中读取 dtype 信息
|
260
|
+
dtypes = d.load_dtypes(cl='mysql', db_name='生意经2', collection_name='店铺指标', path=path)
|
261
|
+
print(dtypes)
|
@@ -13,6 +13,7 @@ import os
|
|
13
13
|
import calendar
|
14
14
|
from mdbq.config import get_myconf
|
15
15
|
from mdbq.dataframe import converter
|
16
|
+
from mdbq.mysql import data_types
|
16
17
|
|
17
18
|
warnings.filterwarnings('ignore')
|
18
19
|
|
@@ -107,12 +108,15 @@ class MysqlUpload:
|
|
107
108
|
cursor.execute(sql)
|
108
109
|
print(f'创建 mysql 表: {tabel_name}')
|
109
110
|
|
110
|
-
|
111
|
-
|
112
|
-
#
|
113
|
-
|
111
|
+
# # 2. 列数据类型转换
|
112
|
+
# cols = df.columns.tolist()
|
113
|
+
# dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
|
114
|
+
# # 转换为 mysql 的数据类型
|
115
|
+
# dtypes.update({col: self.convert_dtype_to_sql(df=df, col=col, dtype=dtypes[col]) for col in cols})
|
116
|
+
dtypes = self.convert_dtypes(df=df, db_name=db_name, tabel_name=tabel_name)
|
114
117
|
|
115
|
-
#
|
118
|
+
# 3. 检查列, 不存在则添加新列
|
119
|
+
cols = df.columns.tolist()
|
116
120
|
for col in cols:
|
117
121
|
sql = ('SELECT 1 FROM information_schema.columns WHERE table_schema = %s AND table_name = %s AND '
|
118
122
|
'column_name = %s')
|
@@ -134,7 +138,7 @@ class MysqlUpload:
|
|
134
138
|
cursor.execute(f"CREATE INDEX index_name ON {tabel_name}({col})")
|
135
139
|
connection.commit() # 提交事务
|
136
140
|
|
137
|
-
# #
|
141
|
+
# # 4. 移除指定日期范围内的数据, 避免重复插入
|
138
142
|
# dates = df['日期'].values.tolist()
|
139
143
|
# start_date = pd.to_datetime(min(dates)).strftime('%Y-%m-%d')
|
140
144
|
# end_date = (pd.to_datetime(max(dates)) + datetime.timedelta(days=1)).strftime('%Y-%m-%d')
|
@@ -142,7 +146,7 @@ class MysqlUpload:
|
|
142
146
|
# cursor.execute(sql)
|
143
147
|
# connection.commit()
|
144
148
|
|
145
|
-
#
|
149
|
+
# 5. 更新插入数据
|
146
150
|
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S ")
|
147
151
|
print(f'{now}正在更新 mysql ({self.host}:{self.port}) {db_name}/{tabel_name}')
|
148
152
|
if str(self.host) == '192.168.1.100': # 群晖服务器
|
@@ -176,8 +180,40 @@ class MysqlUpload:
|
|
176
180
|
finally:
|
177
181
|
connection.close()
|
178
182
|
|
183
|
+
def convert_dtypes(self, df, db_name, tabel_name):
|
184
|
+
"""
|
185
|
+
根据本地已经存在的记录着 mysql dtypes 的 json 文件转换 df 的类型为 mysql 专有的数据类型
|
186
|
+
允许通过 json 文件指定列的数据类型
|
187
|
+
以下两种情况已经兼容:
|
188
|
+
1. 可能不存在本地 json 文件 (利用 convert_dtype_to_sql 函数按指定规则转换全部列)
|
189
|
+
2. json 文件中没有或者缺失部分列信息(利用 convert_dtype_to_sql 函数按指定规则转换缺失列)
|
190
|
+
"""
|
191
|
+
cols = df.columns.tolist()
|
192
|
+
path = '/Users/xigua/数据中心/自动0备份/py/数据更新/support'
|
193
|
+
# json_file = os.path.join(path, 'df_dtypes.json')
|
194
|
+
# if os.path.isfile(json_file):
|
195
|
+
d = data_types.DataTypes()
|
196
|
+
# 从本地文件中读取 dtype 信息
|
197
|
+
dtypes = d.load_dtypes(cl='mysql', db_name=db_name, collection_name=tabel_name, path=path)
|
198
|
+
# 可能会因为没有 json 文件, 返回 None
|
199
|
+
if dtypes:
|
200
|
+
# 按照文件记录更新 dtypes
|
201
|
+
dtypes.update({col: dtypes[col] for col in cols if col in dtypes.keys()})
|
202
|
+
# 可能存在部分列不在文件记录中
|
203
|
+
col_not_exist = [col for col in cols if col not in dtypes.keys()]
|
204
|
+
# 这些列不存在于 df 中, 必须移除
|
205
|
+
[dtypes.pop(col) for col in list(dtypes.keys()) if col not in cols]
|
206
|
+
else:
|
207
|
+
dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
|
208
|
+
col_not_exist = cols
|
209
|
+
# 对文件不存在的列信息进行数据类型转换(按指定规则)
|
210
|
+
dtypes.update({col: self.convert_dtype_to_sql(df=df, col=col, dtype=df[col].dtype) for col in col_not_exist})
|
211
|
+
# 至此 df 中全部列类型已经转换完成
|
212
|
+
# 返回结果, 示例: {'上市年份': 'mediumtext', '商品id': 'mediumtext', '平台': 'mediumtext'}
|
213
|
+
return dtypes
|
214
|
+
|
179
215
|
def convert_dtype_to_sql(self, df, col, dtype):
|
180
|
-
"""
|
216
|
+
""" 按照以下规则转换DataFrame列的数据类型为 MYSQL 专有的数据类型 """
|
181
217
|
# 最优先处理 ID 类型, 在 mysql 里面, 有些列数字过长不能存储为 int 类型
|
182
218
|
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
219
|
return 'mediumtext'
|
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
|