mdbq 3.4.2__py3-none-any.whl → 3.4.3__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.
@@ -122,14 +122,14 @@ class DataShow:
122
122
  df = pd.concat(__res, ignore_index=True)
123
123
  return df
124
124
 
125
- def pov_city(self, db_name='生意经3', filename='销售地域分布', start_date=None, end_date=None, percentage=None):
125
+ def pov_city(self, db_name='生意经3', filename='销售地域分布', start_date=None, end_date=None, percent=None):
126
126
  """
127
127
  生意经 省份城市销售分析
128
128
  """
129
129
  if not start_date:
130
130
  start_date = self.start_date
131
131
  if not end_date:
132
- end_date = self.end_date
132
+ end_date = self.today.strftime('%Y-%m-%d')
133
133
  pov_set = self.getdata(
134
134
  db_name='属性设置3',
135
135
  table_name=f'城市等级',
@@ -168,11 +168,27 @@ class DataShow:
168
168
  df_pov = df_pov.groupby(['店铺名称', '省份'], as_index=False).agg(
169
169
  **{'销售额': ('销售额', np.sum), '退款额': ('退款额', np.sum)})
170
170
  df_pov.drop_duplicates(subset='省份', keep='last', inplace=True, ignore_index=True)
171
+
172
+ # df_pov2: gmv 的饼图
173
+ df_pov['gmv销售'] = df_pov.apply(lambda x: x['销售额'] + x['退款额'], axis=1)
174
+ df_pov.sort_values(['gmv销售'], ascending=[False], ignore_index=True, inplace=True)
175
+ df_pov2 = df_pov.copy()
176
+ sales_sum = df_pov2['gmv销售'].sum()
177
+ df_pov2['省份'] = df_pov2.apply(lambda x: '其他' if (x['gmv销售'] / sales_sum) < percent else x['省份'], axis=1)
178
+
179
+ # df_pov3: 销售额的饼图
171
180
  df_pov.sort_values(['销售额'], ascending=[False], ignore_index=True, inplace=True)
172
- df_pov = df_pov[df_pov['省份'] != '其他']
173
- percentages = df_pov['销售额'] / df_pov['销售额'].sum() * 100
174
- df_pov1 = df_pov.head(10)
175
- data_list = [('销售 top省份', df_pov1['省份'].tolist(), df_pov1['销售额'].tolist(), percentages)]
181
+ df_pov3 = df_pov.copy()
182
+ sales_sum = df_pov3['销售额'].sum()
183
+ df_pov3['省份'] = df_pov3.apply(lambda x: '其他' if (x['销售额'] / sales_sum) < 0.016 else x['省份'], axis=1)
184
+
185
+ # df_pov1: 省份 销售额 堆叠柱形图
186
+ df_pov1 = df_pov.copy()
187
+ df_pov1 = df_pov1.head(15)
188
+ pov_sales_sum = df_pov1['销售额'].tolist()
189
+ pov_refunds = df_pov1['退款额'].tolist()
190
+ percentages = df_pov1['gmv销售'] / df_pov1['gmv销售'].sum() * 100
191
+ bar_list = [('省份销售/退款', df_pov1['省份'].tolist(), pov_sales_sum, percentages, pov_refunds)]
176
192
 
177
193
  # 将城市等级添加到df
178
194
  pov_set = pov_set[['城市等级', '城市']]
@@ -180,72 +196,93 @@ class DataShow:
180
196
  df_city = pd.merge(df_city, pov_set, left_on=['城市'], right_on=['城市'], how='left')
181
197
  df_level = df_city.groupby(['店铺名称', '城市等级'], as_index=False).agg(
182
198
  **{'销售额': ('销售额', np.sum), '退款额': ('退款额', np.sum)})
183
- city_level_list = [('按城市等级', df_level['城市等级'].tolist(), df_level['销售额'].tolist())]
199
+ pie_list = [
200
+ ('按城市等级', df_level['城市等级'].tolist(), df_level['销售额'].tolist()),
201
+ ('净销售 top省份', df_pov3['省份'].tolist(), df_pov3['销售额'].tolist()),
202
+ ('GMV top省份', df_pov2['省份'].tolist(), df_pov2['gmv销售'].tolist())
203
+ ]
204
+
205
+ # df_city1: 城市 销售额 堆叠柱形图
184
206
  df_city.drop_duplicates(subset='城市', keep='last', inplace=True, ignore_index=True)
207
+ df_city['gmv销售'] = df_city.apply(lambda x: x['销售额'] + x['退款额'], axis=1)
185
208
  df_city.sort_values(['销售额'], ascending=[False], ignore_index=True, inplace=True)
186
209
  df_city = df_city[df_city['城市'] != '其他']
187
- percentages = df_city['销售额'] / df_city['销售额'].sum() * 100
188
- df_city1 = df_city.head(10)
189
- data_list += [('销售 top城市', df_city1['城市'].tolist(), df_city1['销售额'].tolist(), percentages)]
190
-
191
- # 退款 top 城市
192
- df_city.sort_values(['退款额'], ascending=[False], ignore_index=True, inplace=True)
193
- percentages = df_city['退款额'] / df_city['退款额'].sum() * 100
194
- df_city2 = df_city.head(10)
195
- data_list += [('退款 top城市', df_city2['城市'].tolist(), df_city2['退款额'].tolist(), percentages)]
196
-
197
- t_p1 = [{"type": "pie"}]
198
- for i in range(2):
199
- t_p1.extend([{"type": "bar"}]) # 折线图类型
210
+ percentages = df_city['gmv销售'] / df_city['gmv销售'].sum() * 100
211
+ df_city1 = df_city.head(15)
212
+ city_sales_sum = df_city1['销售额'].tolist()
213
+ city_refunds = df_city1['退款额'].tolist()
214
+ bar_list += [('城市销售/退款', df_city1['城市'].tolist(), city_sales_sum, percentages, city_refunds)]
215
+
216
+ t_p1 = []
217
+ for i in range(3):
218
+ t_p1.extend([{"type": "pie"}])
200
219
  t_p2 = []
201
220
  for i in range(3):
202
- t_p2.extend([{"type": "bar"}]) # 饼图类型
221
+ t_p2.extend([{"type": "bar"}])
203
222
  specs = [t_p1, t_p2]
204
223
  fig = make_subplots(rows=2, cols=3, specs=specs)
205
- title, labels, values = city_level_list[0]
206
- # 添加饼图
207
- fig.add_trace(
208
- go.Pie(
209
- labels=labels,
210
- values=values,
211
- name=title,
212
- textinfo='label+percent'
213
- ),
214
- row=1,
215
- col=1,
216
- )
217
- x = 0.14
218
- y = 1
219
- fig.add_annotation(
220
- text=title,
221
- x=x,
222
- y=y,
223
- xref='paper', # # 相对于整个图表区域
224
- yref='paper',
225
- showarrow=True, # 显示箭头
226
- align="left", # 文本对齐方式
227
- font=dict(size=14),
228
- )
229
- row = 1
230
- col = 1
231
- for item in data_list:
232
- title, labels, values, percentages = item
233
- bar = go.Bar(
234
- x=labels,
235
- y=values,
236
- name=title,
237
- orientation='v', # 垂直柱形图
238
- text=percentages.map('{:.2f}%'.format), # 设置要显示的文本(百分比)
239
- textposition = 'outside', # 设置文本位置在柱形图外部
240
- width=0.55 # 调整柱子最大宽度
241
- )
242
- fig.add_trace(
243
- bar,
244
- row=row // 3 + 1,
245
- col=col % 3 + 1,
246
- )
224
+
225
+ row = 0
226
+ col = 0
227
+ for i in range(6):
228
+ if row // 3 == 0:
229
+ try:
230
+ title, labels, values = pie_list[col % 3]
231
+ except:
232
+ row += 1
233
+ col += 1
234
+ continue
235
+ # 添加饼图
236
+ fig.add_trace(
237
+ go.Pie(
238
+ labels=labels,
239
+ values=values,
240
+ name=title,
241
+ textinfo='label+percent'
242
+ ),
243
+ row=row//3 + 1,
244
+ col=col % 3 + 1,
245
+ )
246
+ else:
247
+ try:
248
+ title, labels, values, percentages, refunds = bar_list[col % 3]
249
+ except:
250
+ row += 1
251
+ col += 1
252
+ continue
253
+ bar = go.Bar(
254
+ x=labels,
255
+ y=values,
256
+ name='销售额',
257
+ orientation='v', # 垂直柱形图
258
+ # text=percentages.map('{:.1f}%'.format), # 设置要显示的文本(百分比)
259
+ # textposition = 'outside', # 设置文本位置在柱形图外部
260
+ width=0.55, # 调整柱子最大宽度
261
+ # marker_color='blue',
262
+ )
263
+ fig.add_trace(
264
+ bar,
265
+ row=row // 3 + 1,
266
+ col=col % 3 + 1,
267
+ )
268
+ bar = go.Bar(
269
+ x=labels,
270
+ y=refunds,
271
+ name='退款额',
272
+ orientation='v', # 垂直柱形图
273
+ text=percentages.map('{:.1f}%'.format), # 设置要显示的文本(百分比)
274
+ textposition='outside', # 设置文本位置在柱形图外部
275
+ width=0.55, # 调整柱子最大宽度
276
+ # marker_color = 'red',
277
+ )
278
+ fig.add_trace(
279
+ bar,
280
+ row=row // 3 + 1,
281
+ col=col % 3 + 1,
282
+ )
283
+
247
284
  x = 0.14 + 0.355 * (row % 3)
248
- y = 1 - 0.575 * (row // 3)
285
+ y = 0.99 - 0.58 * (row // 3)
249
286
  fig.add_annotation(
250
287
  text=title,
251
288
  x=x,
@@ -254,7 +291,7 @@ class DataShow:
254
291
  yref='paper',
255
292
  showarrow=True, # 显示箭头
256
293
  align="left", # 文本对齐方式
257
- font=dict(size=14),
294
+ font=dict(size=14)
258
295
  )
259
296
  row += 1
260
297
  col += 1
@@ -264,20 +301,21 @@ class DataShow:
264
301
  margin=dict(
265
302
  l=100, # 左边距
266
303
  r=100,
267
- t=100, # 上边距
268
- b=100,
304
+ t=80, # 上边距
305
+ b=80,
269
306
  ),
270
307
  legend=dict(
271
308
  orientation='v', # 图例方向('h' 表示水平,'v' 表示垂直)
272
309
  font=dict(
273
310
  size=12 # 图例字体大小
274
311
  )
275
- )
312
+ ),
313
+ barmode='stack', # stack(堆叠)、group(并列)、overlay(覆盖)、relative(相对)
276
314
  )
277
315
  fig.add_annotation(
278
- text=f'统计时间周期: {start_date}~{end_date}',
316
+ text=f'统计时间周期: {start_date}~{end_date} tips: 饼图剔除了销售<{f"{percent * 100}%"}的数据',
279
317
  x=0.5,
280
- y=-0.1,
318
+ y=-0.09,
281
319
  xref='paper', # # 相对于整个图表区域
282
320
  yref='paper',
283
321
  showarrow=False, # 显示箭头
@@ -621,8 +659,8 @@ class DataShow:
621
659
  y=values,
622
660
  name=table_name,
623
661
  orientation='v', # 垂直柱形图
624
- text=percentages.map('{:.2f}%'.format), # 设置要显示的文本(百分比)
625
- # textposition = 'outside', # 设置文本位置在柱形图外部
662
+ text=percentages.map('{:.1f}%'.format), # 设置要显示的文本(百分比)
663
+ textposition = 'outside', # 设置文本位置在柱形图外部
626
664
  width=0.55 # 调整柱子最大宽度
627
665
  )
628
666
  row = count // 3 + 1
@@ -753,8 +791,8 @@ class DataShow:
753
791
  y=values,
754
792
  name=table_name,
755
793
  orientation='v', # 垂直柱形图
756
- text=percentages.map('{:.2f}%'.format), # 设置要显示的文本(百分比)
757
- # textposition = 'outside', # 设置文本位置在柱形图外部
794
+ text=percentages.map('{:.1f}%'.format), # 设置要显示的文本(百分比)
795
+ textposition = 'outside', # 设置文本位置在柱形图外部
758
796
  width=0.55 # 调整柱子最大宽度
759
797
  )
760
798
  row = count // 3 + 1
@@ -829,44 +867,44 @@ class DataShow:
829
867
  def main():
830
868
  ds = DataShow()
831
869
 
832
- # 店铺流量来源
833
- ds.dpll()
834
- # 多店聚合推广数据
835
- ds.tg(
836
- days=15,
837
- # start_date='2024-11-01',
838
- # end_date='2024-11-30',
839
- )
840
-
841
- # 商品人群画像
842
- item_id_list = [
843
- 839148235697,
844
- ]
845
- for item_id in item_id_list:
846
- ds.item_crowd(
847
- item_id=item_id,
848
- lab='全部渠道',
849
- option='商详浏览',
850
- last_date=None,
851
- d_str='近30天',
852
- )
853
-
854
- # 达摩盘人群画像
855
- crowid_list = [
856
- 40457166,
857
- ]
858
- for crowid in crowid_list:
859
- ds.crowd(
860
- crowd_id=crowid,
861
- last_date=None,
862
- )
870
+ # # 店铺流量来源
871
+ # ds.dpll()
872
+ # # 多店聚合推广数据
873
+ # ds.tg(
874
+ # days=15,
875
+ # # start_date='2024-11-01',
876
+ # # end_date='2024-11-30',
877
+ # )
878
+ #
879
+ # # 商品人群画像
880
+ # item_id_list = [
881
+ # 839148235697,
882
+ # ]
883
+ # for item_id in item_id_list:
884
+ # ds.item_crowd(
885
+ # item_id=item_id,
886
+ # lab='全部渠道',
887
+ # option='商详浏览',
888
+ # last_date=None,
889
+ # d_str='近30天',
890
+ # )
891
+
892
+ # # 达摩盘人群画像
893
+ # crowid_list = [
894
+ # 40457166,
895
+ # ]
896
+ # for crowid in crowid_list:
897
+ # ds.crowd(
898
+ # crowd_id=crowid,
899
+ # last_date=None,
900
+ # )
863
901
 
864
902
  ds.pov_city(
865
903
  db_name='生意经3',
866
904
  filename='销售地域分布',
867
905
  start_date='2024-12-01',
868
- end_date='2024-12-11',
869
- percentage=0.02,
906
+ end_date=None,
907
+ percent=0.015,
870
908
  )
871
909
 
872
910
  if __name__ == '__main__':
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mdbq
3
- Version: 3.4.2
3
+ Version: 3.4.3
4
4
  Home-page: https://pypi.org/project/mdbq
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=-yzApnlqSN2L0E1YMu5ml-W827qpKQvWPCOI7jj2kzY,80264
5
- mdbq/aggregation/datashow.py,sha256=k4gUYldnmi_iZJrM7wNtjeenXJl82hUoYcPu6iIL3PU,35864
5
+ mdbq/aggregation/datashow.py,sha256=_pyv7ZmKpBp04bdE_N_RTtNbyBXHcOA-TAQ1vFxl8p8,37881
6
6
  mdbq/aggregation/optimize_data.py,sha256=RXIv7cACCgYyehAxMjUYi_S7rVyjIwXKWMaM3nduGtA,3068
7
7
  mdbq/aggregation/query_data.py,sha256=9NALeHTP9tblOEPyntLBRtdroLG_qN9qWi34Hg4rXFM,178891
8
8
  mdbq/bdup/__init__.py,sha256=AkhsGk81SkG1c8FqDH5tRq-8MZmFobVbN60DTyukYTY,28
@@ -34,7 +34,7 @@ mdbq/pbix/refresh_all.py,sha256=OBT9EewSZ0aRS9vL_FflVn74d4l2G00wzHiikCC4TC0,5926
34
34
  mdbq/pbix/refresh_all_old.py,sha256=_pq3WSQ728GPtEG5pfsZI2uTJhU8D6ra-htIk1JXYzw,7192
35
35
  mdbq/spider/__init__.py,sha256=RBMFXGy_jd1HXZhngB2T2XTvJqki8P_Fr-pBcwijnew,18
36
36
  mdbq/spider/aikucun.py,sha256=v7VO5gtEXR6_4Q6ujbTyu1FHu7TXHcwSQ6hIO249YH0,22208
37
- mdbq-3.4.2.dist-info/METADATA,sha256=I2lVjMi-WsvegW9ZCQcR4UV8wg4g1A9-mzgVFQ_H7x4,243
38
- mdbq-3.4.2.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
39
- mdbq-3.4.2.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
40
- mdbq-3.4.2.dist-info/RECORD,,
37
+ mdbq-3.4.3.dist-info/METADATA,sha256=O8d3FiyMrxJoF1-_OcK-YsIQ01m3hQaGxvn8Pk2UoYY,243
38
+ mdbq-3.4.3.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
39
+ mdbq-3.4.3.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
40
+ mdbq-3.4.3.dist-info/RECORD,,
File without changes