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.
mdbq/aggregation/datashow.py
CHANGED
@@ -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,
|
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.
|
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
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
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
|
-
|
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['
|
188
|
-
df_city1 = df_city.head(
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
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
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
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 =
|
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=
|
268
|
-
b=
|
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.
|
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('{:.
|
625
|
-
|
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('{:.
|
757
|
-
|
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
|
-
|
837
|
-
|
838
|
-
|
839
|
-
)
|
840
|
-
|
841
|
-
# 商品人群画像
|
842
|
-
item_id_list = [
|
843
|
-
|
844
|
-
]
|
845
|
-
for item_id in item_id_list:
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
# 达摩盘人群画像
|
855
|
-
crowid_list = [
|
856
|
-
|
857
|
-
]
|
858
|
-
for crowid in crowid_list:
|
859
|
-
|
860
|
-
|
861
|
-
|
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=
|
869
|
-
|
906
|
+
end_date=None,
|
907
|
+
percent=0.015,
|
870
908
|
)
|
871
909
|
|
872
910
|
if __name__ == '__main__':
|
@@ -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=
|
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.
|
38
|
-
mdbq-3.4.
|
39
|
-
mdbq-3.4.
|
40
|
-
mdbq-3.4.
|
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
|
File without changes
|