mdbq 3.4.0__py3-none-any.whl → 3.4.1__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 +175 -108
- mdbq/spider/aikucun.py +1 -1
- {mdbq-3.4.0.dist-info → mdbq-3.4.1.dist-info}/METADATA +1 -1
- {mdbq-3.4.0.dist-info → mdbq-3.4.1.dist-info}/RECORD +6 -6
- {mdbq-3.4.0.dist-info → mdbq-3.4.1.dist-info}/WHEEL +0 -0
- {mdbq-3.4.0.dist-info → mdbq-3.4.1.dist-info}/top_level.txt +0 -0
mdbq/aggregation/datashow.py
CHANGED
@@ -91,7 +91,9 @@ else:
|
|
91
91
|
|
92
92
|
class DataShow:
|
93
93
|
def __init__(self):
|
94
|
-
self.path = '/Users/xigua/Downloads'
|
94
|
+
self.path = '/Users/xigua/Downloads/html文件'
|
95
|
+
if not os.path.isdir(self.path):
|
96
|
+
os.makedirs(self.path)
|
95
97
|
root = tk.Tk()
|
96
98
|
self.screen_width = root.winfo_screenwidth()
|
97
99
|
self.screen_height = root.winfo_screenheight()
|
@@ -119,100 +121,143 @@ class DataShow:
|
|
119
121
|
df = pd.concat(__res, ignore_index=True)
|
120
122
|
return df
|
121
123
|
|
122
|
-
def
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
if
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
df1 = df[df['日期'] >= st_date(1)]
|
137
|
-
df2 = df[df['日期'] >= st_date(7)]
|
138
|
-
df3 = df[df['日期'] >= st_date(30)]
|
139
|
-
df2 = df2.groupby(
|
140
|
-
['三级来源'],
|
141
|
-
as_index=False).agg(
|
142
|
-
**{
|
143
|
-
'访客数': ('访客数', np.sum),
|
144
|
-
}
|
124
|
+
def pov_city(self, db_name='生意经3', filename='销售地域分布', start_date=None, end_date=None, percentage=None):
|
125
|
+
"""
|
126
|
+
生意经 省份城市销售分析
|
127
|
+
"""
|
128
|
+
if not start_date:
|
129
|
+
start_date = self.start_date
|
130
|
+
if not end_date:
|
131
|
+
end_date = self.end_date
|
132
|
+
pov_set = self.getdata(
|
133
|
+
db_name='属性设置3',
|
134
|
+
table_name=f'城市等级',
|
135
|
+
pro_list=[],
|
136
|
+
start_date=start_date,
|
137
|
+
end_date=end_date
|
145
138
|
)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
139
|
+
# print(pov_set)
|
140
|
+
# 城市
|
141
|
+
pro_list = ['日期', '店铺名称', '城市', '销售额', '退款额']
|
142
|
+
year = datetime.datetime.today().year
|
143
|
+
df_city = self.getdata(
|
144
|
+
db_name=db_name,
|
145
|
+
table_name=f'地域分析_城市_{year}',
|
146
|
+
pro_list=pro_list,
|
147
|
+
start_date=start_date,
|
148
|
+
end_date=end_date
|
149
|
+
)
|
150
|
+
df_city = df_city[df_city['店铺名称'] == '万里马官方旗舰店']
|
151
|
+
df_city = df_city.groupby(['店铺名称', '城市'], as_index=False).agg(
|
152
|
+
**{'销售额': ('销售额', np.sum), '退款额': ('退款额', np.sum)})
|
153
|
+
df_city = df_city[df_city['销售额'] > 0]
|
154
|
+
|
155
|
+
# 将城市等级添加到df
|
156
|
+
pov_set = pov_set[['城市等级', '城市']]
|
157
|
+
pov_set.drop_duplicates(subset='城市', keep='last', inplace=True, ignore_index=True)
|
158
|
+
df_city = pd.merge(df_city, pov_set, left_on=['城市'], right_on=['城市'], how='left')
|
159
|
+
df_level = df_city.groupby(['店铺名称', '城市等级'], as_index=False).agg(
|
160
|
+
**{'销售额': ('销售额', np.sum), '退款额': ('退款额', np.sum)})
|
161
|
+
data_list = [('销售 按城市等级', df_level['城市等级'].tolist(), df_level['销售额'].tolist())]
|
162
|
+
if percentage:
|
163
|
+
print(df_city['销售额'].sum())
|
164
|
+
return
|
165
|
+
df_city1 = df_city[df_city['销售额'] > int(percentage)]
|
166
|
+
data_list += ('销售额top城市', df_city1['城市'].tolist(), df_city1['销售额'].tolist())
|
167
|
+
df_city2 = df_city[df_city['退款额'] > int(percentage)]
|
168
|
+
data_list += ('退款额top城市', df_city2['城市'].tolist(), df_city2['退款额'].tolist())
|
169
|
+
|
170
|
+
# 省份
|
171
|
+
pro_list = ['日期', '店铺名称', '省份', '销售额', '退款额']
|
172
|
+
year = datetime.datetime.today().year
|
173
|
+
df_pov = self.getdata(
|
174
|
+
db_name=db_name,
|
175
|
+
table_name=f'地域分析_省份_{year}',
|
176
|
+
pro_list=pro_list,
|
177
|
+
start_date=start_date,
|
178
|
+
end_date=end_date
|
152
179
|
)
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
# 创建一个具有1行2列的网格布局
|
163
|
-
t_p = []
|
164
|
-
for i in range(num):
|
165
|
-
t_p.extend([{"type": "pie"}])
|
166
|
-
fig = make_subplots(rows=1, cols=num, specs=[t_p])
|
167
|
-
pie_title = {1: 1, 2: 7, 3: 30}
|
168
|
-
i = 1
|
169
|
-
for item in data_list:
|
170
|
-
# 计算每个扇区的百分比,并找出哪些扇区应该被保留
|
171
|
-
total = sum(item['值'])
|
172
|
-
# 计算每个扇区的百分比,并找出哪些扇区应该被保留
|
173
|
-
threshold_percentage = 0.1 # 阈值百分比
|
174
|
-
filtered_indices = [i for i, value in enumerate(item['值']) if
|
175
|
-
(value / total) * 100 >= threshold_percentage]
|
176
|
-
# 提取被保留的扇区的标签和值
|
177
|
-
filtered_labels = [item['键'][i] for i in filtered_indices]
|
178
|
-
filtered_values = [item['值'][i] for i in filtered_indices]
|
180
|
+
df_pov = df_pov[df_pov['店铺名称'] == '万里马官方旗舰店']
|
181
|
+
# print(df_pov[df_pov['省份'] == '广东'])
|
182
|
+
df_pov = df_pov.groupby(['店铺名称', '省份'], as_index=False).agg(
|
183
|
+
**{'销售额': ('销售额', np.sum), '退款额': ('退款额', np.sum)})
|
184
|
+
if percentage:
|
185
|
+
df_pov1 = df_pov[df_pov['销售额'] > int(percentage)]
|
186
|
+
data_list += [('销售 按省份', df_pov1['省份'].tolist(), df_pov1['销售额'].tolist())] # 添加列表数据
|
187
|
+
df_pov2 = df_pov[df_pov['退款额'] > int(percentage)]
|
188
|
+
data_list += [('退款 按省份', df_pov2['省份'].tolist(), df_pov2['退款额'].tolist())] # 添加列表数据
|
179
189
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
190
|
+
t_p1 = []
|
191
|
+
for i in range(3):
|
192
|
+
t_p1.extend([{"type": "pie"}]) # 折线图类型
|
193
|
+
t_p2 = []
|
194
|
+
for i in range(3):
|
195
|
+
t_p2.extend([{"type": "pie"}]) # 饼图类型
|
196
|
+
specs = [t_p1, t_p2]
|
197
|
+
fig = make_subplots(rows=2, cols=3, specs=specs)
|
198
|
+
row = 0
|
199
|
+
col = 0
|
200
|
+
for item in data_list:
|
201
|
+
title, labels, values = item
|
202
|
+
# 计算每个扇区的百分比,并找出哪些扇区应该被保留
|
203
|
+
total = sum(values)
|
204
|
+
# 计算每个扇区的百分比,并找出哪些扇区应该被保留
|
205
|
+
percentage = 1.2 # 阈值百分比
|
206
|
+
filtered_indices = [i for i, value in enumerate(values) if
|
207
|
+
(value / total) * 100 >= percentage]
|
208
|
+
# 提取被保留的扇区的标签和值
|
209
|
+
filtered_labels = [labels[i] for i in filtered_indices]
|
210
|
+
filtered_values = [values[i] for i in filtered_indices]
|
211
|
+
# 添加饼图
|
212
|
+
fig.add_trace(
|
213
|
+
go.Pie(
|
214
|
+
labels=filtered_labels,
|
215
|
+
values=filtered_values,
|
216
|
+
name=title,
|
217
|
+
textinfo='label+percent'
|
218
|
+
),
|
219
|
+
row=row // 3 + 1,
|
220
|
+
col=col % 3 + 1,
|
221
|
+
)
|
222
|
+
x = 0.14 + 0.355 * (row % 3)
|
223
|
+
y = 1.04 - 0.59 * (row // 3)
|
224
|
+
fig.add_annotation(
|
225
|
+
text=title,
|
226
|
+
x=x,
|
227
|
+
y=y,
|
228
|
+
xref='paper', # # 相对于整个图表区域
|
229
|
+
yref='paper',
|
230
|
+
showarrow=True, # 显示箭头
|
231
|
+
align="left", # 文本对齐方式
|
232
|
+
font=dict(size=14),
|
233
|
+
)
|
234
|
+
row += 1
|
235
|
+
col += 1
|
236
|
+
fig.update_layout(
|
237
|
+
title_text=f'销售地域分布',
|
238
|
+
# xaxis_title='X Axis',
|
239
|
+
# yaxis_title='Y Axis',
|
240
|
+
# width=self.screen_width // 1.4,
|
241
|
+
# height=self.screen_width // 2,
|
242
|
+
margin=dict(
|
243
|
+
l=100, # 左边距
|
244
|
+
r=100,
|
245
|
+
t=100, # 上边距
|
246
|
+
b=100,
|
247
|
+
),
|
248
|
+
legend=dict(
|
249
|
+
# title='Legend Title', # 图例标题
|
250
|
+
orientation='v', # 图例方向('h' 表示水平,'v' 表示垂直)
|
251
|
+
# x=0.5, # 图例在图表中的 x 位置(0 到 1 的比例)
|
252
|
+
# y=1.02, # 图例在图表中的 y 位置(稍微超出顶部以避免遮挡数据)
|
253
|
+
font=dict(
|
254
|
+
size=12 # 图例字体大小
|
208
255
|
)
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
data_list = [{'键': labels1, '值': values1}, {'键': labels2, '值': values2}, {'键': labels3, '值': values3}]
|
213
|
-
fig = make_sub(data_list=data_list, num=3)
|
256
|
+
)
|
257
|
+
)
|
214
258
|
fig.write_html(os.path.join(self.path, f'{filename}.html'))
|
215
259
|
|
260
|
+
|
216
261
|
def dpll(self, db_name='聚合数据', table_name='店铺流量来源构成', pro_list=None, filename='店铺流量来源'):
|
217
262
|
if not pro_list:
|
218
263
|
pro_list = ['日期', '店铺名称', '类别', '来源构成', '二级来源', '三级来源', '访客数']
|
@@ -600,7 +645,7 @@ class DataShow:
|
|
600
645
|
align="left", # 文本对齐方式
|
601
646
|
font=dict(size=12),
|
602
647
|
)
|
603
|
-
fig.write_html(os.path.join(self.path, f'{filename}.html'))
|
648
|
+
fig.write_html(os.path.join(self.path, f'{filename}_{item_id}.html'))
|
604
649
|
|
605
650
|
def crowd(self, db_name='人群画像2', table_list=None, pro_list=None, filename='达摩盘人群画像', crowd_id=None, last_date=None):
|
606
651
|
# item_ids = [696017020186, 714066010148, 830890472575]
|
@@ -739,29 +784,51 @@ class DataShow:
|
|
739
784
|
align="left", # 文本对齐方式
|
740
785
|
font=dict(size=12),
|
741
786
|
)
|
742
|
-
fig.write_html(os.path.join(self.path, f'{filename}.html'))
|
787
|
+
fig.write_html(os.path.join(self.path, f'{filename}_{crowd_name[:15]}.html'))
|
743
788
|
|
744
789
|
|
745
790
|
def main():
|
746
791
|
ds = DataShow()
|
747
|
-
ds.dpll()
|
748
|
-
ds.tg(
|
749
|
-
days=15,
|
750
|
-
# start_date='2024-11-01',
|
751
|
-
# end_date='2024-11-30',
|
752
|
-
)
|
753
|
-
ds.item_crowd(
|
754
|
-
item_id=839148235697,
|
755
|
-
lab='全部渠道',
|
756
|
-
option='商详浏览',
|
757
|
-
last_date=None,
|
758
|
-
d_str='近30天',
|
759
|
-
)
|
760
|
-
ds.crowd(
|
761
|
-
crowd_id=40457166,
|
762
|
-
last_date=None,
|
763
|
-
)
|
764
792
|
|
793
|
+
# # 店铺流量来源
|
794
|
+
# ds.dpll()
|
795
|
+
# # 多店聚合推广数据
|
796
|
+
# ds.tg(
|
797
|
+
# days=15,
|
798
|
+
# # start_date='2024-11-01',
|
799
|
+
# # end_date='2024-11-30',
|
800
|
+
# )
|
801
|
+
#
|
802
|
+
# # 商品人群画像
|
803
|
+
# item_id_list = [
|
804
|
+
# 839148235697,
|
805
|
+
# ]
|
806
|
+
# for item_id in item_id_list:
|
807
|
+
# ds.item_crowd(
|
808
|
+
# item_id=item_id,
|
809
|
+
# lab='全部渠道',
|
810
|
+
# option='商详浏览',
|
811
|
+
# last_date=None,
|
812
|
+
# d_str='近30天',
|
813
|
+
# )
|
814
|
+
#
|
815
|
+
# # 达摩盘人群画像
|
816
|
+
# crowid_list = [
|
817
|
+
# 40457166,
|
818
|
+
# ]
|
819
|
+
# for crowid in crowid_list:
|
820
|
+
# ds.crowd(
|
821
|
+
# crowd_id=crowid,
|
822
|
+
# last_date=None,
|
823
|
+
# )
|
824
|
+
|
825
|
+
ds.pov_city(
|
826
|
+
db_name='生意经3',
|
827
|
+
filename='销售地域分布',
|
828
|
+
start_date='2024-06-01',
|
829
|
+
end_date='2024-12-11',
|
830
|
+
percentage=1,
|
831
|
+
)
|
765
832
|
|
766
833
|
if __name__ == '__main__':
|
767
834
|
main()
|
mdbq/spider/aikucun.py
CHANGED
@@ -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=Hwpt9REb7Iep_ptdVw0TqebYaJNNyvNs6dyOB_LqozM,34893
|
6
6
|
mdbq/aggregation/optimize_data.py,sha256=RXIv7cACCgYyehAxMjUYi_S7rVyjIwXKWMaM3nduGtA,3068
|
7
7
|
mdbq/aggregation/query_data.py,sha256=FiNZhL5_El2B5ADfCPGUZXsE2iZd3UmGml9Te9qJIpU,175364
|
8
8
|
mdbq/bdup/__init__.py,sha256=AkhsGk81SkG1c8FqDH5tRq-8MZmFobVbN60DTyukYTY,28
|
@@ -33,8 +33,8 @@ mdbq/pbix/pbix_refresh.py,sha256=JUjKW3bNEyoMVfVfo77UhguvS5AWkixvVhDbw4_MHco,239
|
|
33
33
|
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
|
-
mdbq/spider/aikucun.py,sha256=
|
37
|
-
mdbq-3.4.
|
38
|
-
mdbq-3.4.
|
39
|
-
mdbq-3.4.
|
40
|
-
mdbq-3.4.
|
36
|
+
mdbq/spider/aikucun.py,sha256=v7VO5gtEXR6_4Q6ujbTyu1FHu7TXHcwSQ6hIO249YH0,22208
|
37
|
+
mdbq-3.4.1.dist-info/METADATA,sha256=n1MFzq9VZzCy63dJOU-fcJSZ0lZTXawBaIW5vXngzCE,243
|
38
|
+
mdbq-3.4.1.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
|
39
|
+
mdbq-3.4.1.dist-info/top_level.txt,sha256=2FQ-uLnCSB-OwFiWntzmwosW3X2Xqsg0ewh1axsaylA,5
|
40
|
+
mdbq-3.4.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|