mdbq 0.2.5__py3-none-any.whl → 0.2.7__py3-none-any.whl

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.
@@ -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='销售盈亏') # 3. 回传数据库
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()
mdbq/mysql/data_types.py CHANGED
@@ -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)
mdbq/mysql/mysql.py CHANGED
@@ -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
- cols = df.columns.tolist()
111
- dtypes = df.dtypes.apply(str).to_dict() # 将 dataframe 数据类型转为字典形式
112
- # 转换为 mysql 的数据类型
113
- dtypes.update({col: self.convert_dtype_to_sql(df=df, col=col, dtype=dtypes[col]) for col in cols})
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
- # 2. 检查列, 不存在则添加新列
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
- # # 3. 移除指定日期范围内的数据, 避免重复插入
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
- # 4. 更新插入数据
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
- """ 转换DataFrame列的数据类型为SQL数据类型 """
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'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 0.2.5
3
+ Version: 0.2.7
4
4
  Home-page: https://pypi.org/project/mdbsql
5
5
  Author: xigua,
6
6
  Author-email: 2587125111@qq.com
@@ -2,7 +2,7 @@ mdbq/__init__.py,sha256=Il5Q9ATdX8yXqVxtP_nYqUhExzxPC_qk_WXQ_4h0exg,16
2
2
  mdbq/__version__.py,sha256=y9Mp_8x0BCZSHsdLT_q5tX9wZwd5QgqrSIENLrb6vXA,62
3
3
  mdbq/aggregation/__init__.py,sha256=EeDqX2Aml6SPx8363J-v1lz0EcZtgwIBYyCJV6CcEDU,40
4
4
  mdbq/aggregation/aggregation.py,sha256=TkxyIBowTuoNrhVkrgnYNXwNQXCX_xjh7wcYXdP65-E,58496
5
- mdbq/aggregation/query_data.py,sha256=Xx3x_3XVsHrVM2-wOQQFu8oOBmWpqjxXSUGAyXvKTag,22819
5
+ mdbq/aggregation/query_data.py,sha256=FGkLsN9bC9xa53cO8wR7eknqcVhRO97TiEAoPbVLUQ8,23186
6
6
  mdbq/bdup/__init__.py,sha256=AkhsGk81SkG1c8FqDH5tRq-8MZmFobVbN60DTyukYTY,28
7
7
  mdbq/bdup/bdup.py,sha256=LAV0TgnQpc-LB-YuJthxb0U42_VkPidzQzAagan46lU,4234
8
8
  mdbq/clean/__init__.py,sha256=A1d6x3L27j4NtLgiFV5TANwEkLuaDfPHDQNrPBbNWtU,41
@@ -11,6 +11,7 @@ mdbq/company/__init__.py,sha256=qz8F_GsP_pMB5PblgJAUAMjasuZbOEp3qQOCB39E8f0,21
11
11
  mdbq/company/copysh.py,sha256=G1DFkGtR02i4yKcWGOaFHZG2ZkzRPxo4cDl9x5eqHXk,15980
12
12
  mdbq/config/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
13
13
  mdbq/config/get_myconf.py,sha256=9v3xebfcS1tptxpvk3_tGxfXjAehGVCveYe4iRUzLQQ,6372
14
+ mdbq/config/products.py,sha256=tFqSfFSXyZXcof0gAeHq0Ftn4F5i9ucoMyIqZ1H_D2Q,4260
14
15
  mdbq/config/update_conf.py,sha256=YjGjjRchu5BcrmLJkoLjHEF2TbGOmsgCWX4LroXOYWQ,3455
15
16
  mdbq/dataframe/__init__.py,sha256=2HtCN8AdRj53teXDqzysC1h8aPL-mMFy561ESmhehGQ,22
16
17
  mdbq/dataframe/converter.py,sha256=h_BDc6oNmMCVFOUzZJq4nXNGDyJFJyycpWqlyrv7U04,3089
@@ -19,8 +20,8 @@ mdbq/log/mylogger.py,sha256=oaT7Bp-Hb9jZt52seP3ISUuxVcI19s4UiqTeouScBO0,3258
19
20
  mdbq/mongo/__init__.py,sha256=SILt7xMtQIQl_m-ik9WLtJSXIVf424iYgCfE_tnQFbw,13
20
21
  mdbq/mongo/mongo.py,sha256=q0B4wXDSTtXg_vMN7MPh6zdxl6tT68tM74LmdVNQQek,31892
21
22
  mdbq/mysql/__init__.py,sha256=A_DPJyAoEvTSFojiI2e94zP0FKtCkkwKP1kYUCSyQzo,11
22
- mdbq/mysql/data_types.py,sha256=OERyHwG61s-agBM1aERESYY4GWwJwaZ7NtQfbe6GTgo,10732
23
- mdbq/mysql/mysql.py,sha256=nVrnkHWlcttr3Mx0Bdneb04oTlKtbDL9WrAUY4IEnow,31363
23
+ mdbq/mysql/data_types.py,sha256=-miEqNaXgDKUp3z6SkBD6D4kj6_dVeWM0rCeeK0jEi4,10998
24
+ mdbq/mysql/mysql.py,sha256=BNKICpMCFskg8Zk8iR1tmDmOTvtNbOf8_lORPgHBdWs,33570
24
25
  mdbq/mysql/s_query.py,sha256=6-8O9MHhi3-7n3isJ7t2kTCYL2mSBC_HrxSQmXM5UtI,7901
25
26
  mdbq/mysql/year_month_day.py,sha256=VgewoE2pJxK7ErjfviL_SMTN77ki8GVbTUcao3vFUCE,1523
26
27
  mdbq/other/__init__.py,sha256=jso1oHcy6cJEfa7udS_9uO5X6kZLoPBF8l3wCYmr5dM,18
@@ -31,7 +32,7 @@ mdbq/pbix/__init__.py,sha256=Trtfaynu9RjoTyLLYBN2xdRxTvm_zhCniUkVTAYwcjo,24
31
32
  mdbq/pbix/pbix_refresh.py,sha256=JUjKW3bNEyoMVfVfo77UhguvS5AWkixvVhDbw4_MHco,2396
32
33
  mdbq/pbix/refresh_all.py,sha256=wulHs4rivf4Mi0Pii2QR5Nk9-TBcvSwnCB_WH9QULKE,5939
33
34
  mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
34
- mdbq-0.2.5.dist-info/METADATA,sha256=1Yjt_WKaqm5cV5i4HM0QzNoHKMWs8NfG09sPIvgIFh4,245
35
- mdbq-0.2.5.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
36
- mdbq-0.2.5.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
37
- mdbq-0.2.5.dist-info/RECORD,,
35
+ mdbq-0.2.7.dist-info/METADATA,sha256=CC4QeA4zCHTt9DFEDHBv55Ki22hsywd4BMndbzWLyYY,245
36
+ mdbq-0.2.7.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
37
+ mdbq-0.2.7.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
38
+ mdbq-0.2.7.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.44.0)
2
+ Generator: setuptools (70.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5