Commit afb30f9e authored by zhangshuo's avatar zhangshuo

Init

parents
File added
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="MateData" uuid="1ba7e8ea-76b5-4bf8-b2d1-e7c70af6f742">
<driver-ref>sqlite.xerial</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>org.sqlite.JDBC</jdbc-driver>
<jdbc-url>jdbc:sqlite:$PROJECT_DIR$/MateData.db</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (venv)" project-jdk-type="Python SDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Buu.iml" filepath="$PROJECT_DIR$/Buu.iml" />
</modules>
</component>
</project>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
from load_data import LoadData
def count_in_dict(data_dict, dict_key, step_value=1):
if dict_key in data_dict:
tmp_count = data_dict[dict_key] + step_value
else:
tmp_count = step_value
data_dict[dict_key] = tmp_count
# 分析 0元购、1元抽奖、其他占比
def analysis_classify(load_data, chart):
result_dict = {}
for data in load_data.data_list:
result_value = str(data['订单名称'])
result_value_price = float(data['价格'])
if str(result_value).find('0元领') > 0:
count_in_dict(result_dict, result_value)
elif float(result_value_price) == 1.0:
count_in_dict(result_dict, '1元抽奖')
else:
count_in_dict(result_dict, '其他')
chart.draw_pie_chart("0元购、1元抽奖、其他占比", result_dict)
# 商品类目聚合
def analysis_category(load_data, chart):
# 商品类目维度 一级类目分类
result_dict = {}
for data in load_data.real_data_list:
result_value = str(data['商品一级类目'])
count_in_dict(result_dict, result_value)
result_tmp = sorted(result_dict.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)
result_dict = {}
for (key, value) in result_tmp:
result_dict[key] = value
chart.draw_pie_chart("一级类目占比\n(去除0元领/1元福利等)", result_dict)
result_dict = {}
for data in load_data.real_data_list:
result_value = str(data['商品一级类目'] + "_" + data['商品二级类目'])
count_in_dict(result_dict, result_value)
# 商品类目维度 二级类目分类 仅保留前20
result_tmp = sorted(result_dict.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)
result_dict = {}
for index in range(len(result_tmp)):
item = result_tmp[index]
if index < 20:
result_dict[item[0]] = item[1]
else:
count_in_dict(result_dict, '其他', item[1])
chart.draw_pie_chart("二级类目占比\n(去除0元领/1元福利等)", result_dict)
# 购买的商品次数
def analysis_goods(load_data, chart):
# 仅第一单是0元领或者1元抽奖,有复购
# 仅第一单为正常商品,有复购
# 仅第一单是0元领或者1元抽奖,无复购
# 仅第一单为正常商品,无复购
result_dict = {}
for data_user_id in load_data.data_dict:
user_buy_list = load_data.data_dict[data_user_id]
user_buy_detail = user_buy_list[0]
if load_data.is_zero_buy(user_buy_detail):
# 仅一单为非常规
if len(user_buy_list) == 1:
count_in_dict(result_dict, '仅1单(0元领/1元抽奖)\n')
else:
user_buy_detail_s = user_buy_list[1]
if load_data.is_zero_buy(user_buy_detail_s):
count_in_dict(result_dict, '第一单(0元领/1元抽奖)\n第二单(0元领/1元抽奖)\n')
else:
count_in_dict(result_dict, '第一单(0元领/1元抽奖)\n第二单(常规订单)\n')
else:
# 仅一单为常规
if len(user_buy_list) == 1:
count_in_dict(result_dict, '仅1单(常规订单)\n')
print(user_buy_list)
else:
user_buy_detail_s = user_buy_list[1]
if load_data.is_zero_buy(user_buy_detail_s) <= 1.0:
count_in_dict(result_dict, '第一单(常规订单)\n第二单(0元领/1元抽奖)\n')
else:
count_in_dict(result_dict, '第一单(常规订单)\n第二单(常规订单)\n')
chart.draw_pie_chart("复购路径", result_dict)
result_dict = {}
for data in load_data.real_data_list:
result_value = str(data['商品类型'])
count_in_dict(result_dict, result_value)
result_tmp = sorted(result_dict.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)
result_dict = {}
for (key, value) in result_tmp:
result_dict[key] = value
chart.draw_pie_chart("商品类型占比\n(去除0元领/1元福利等)", result_dict)
# 按照价格段进行占比
def analysis_price(load_data, chart):
result_dict = {}
for data in load_data.real_data_list:
result_price = float(data['价格'])
# 价格按10一个step聚合
result_price_int = int(result_price / 10)
if result_price_int < 1:
result_key = '%d-9' % (result_price_int)
else:
result_key = '%d0-%d9' % (result_price_int, result_price_int)
count_in_dict(result_dict, result_key)
result_tmp = sorted(result_dict.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)
result_dict = {}
for index in range(len(result_tmp)):
item = result_tmp[index]
if index < 15:
result_dict[item[0]] = item[1]
else:
count_in_dict(result_dict, '其他价格段', item[1])
chart.draw_pie_chart("价格段占比\n(去除0元领/1元福利等)", result_dict)
# 用户下单时间占比
def analysis_order(load_data,chart):
result_dict = {}
for data_key in load_data.real_data_dict:
data_value = len(load_data.real_data_dict[data_key])
result_key = "%d单" % data_value
count_in_dict(result_dict,result_key)
result_tmp = sorted(result_dict.items(), key=lambda kv: (kv[1], kv[0]), reverse=True)
result_dict = {}
for (key, value) in result_tmp:
result_dict[key] = value
chart.draw_pie_chart("订单数占比\n(去除0元领/1元福利等)", result_dict)
This diff is collapsed.
This diff is collapsed.
import pyecharts.options as opts
from pyecharts.charts import Line, Pie, Page
class EChartDraw(object):
def __init__(self, result_path):
self.page = Page(layout=Page.DraggablePageLayout)
self.result_path = result_path
def draw_pie_chart(self, title_name, data_dict):
x_data = sorted(data_dict)
y_data = []
for key in x_data:
y_data.append(data_dict[key])
pie = Pie(init_opts=opts.InitOpts(width="1200px", height="600px"))
pie.set_global_opts(title_opts=opts.TitleOpts(title=title_name), legend_opts=opts.LegendOpts(pos_top=50),
)
pie.add("", [list(z) for z in zip(x_data, y_data)], center=["50%", "60%"])
pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}({d}%)"))
self.page.add(pie)
def draw_line_chart(self, title_name, data_dict):
x_data = sorted(data_dict)
y_data = []
for key in x_data:
y_data.append(data_dict[key])
line = Line(init_opts=opts.InitOpts(width="1200px", height="600px"))
line.set_global_opts(
title_opts=opts.TitleOpts(title=title_name),
legend_opts=opts.LegendOpts(pos_top=50),
xaxis_opts=opts.AxisOpts(type_="category", axislabel_opts={"rotate": -30}),
yaxis_opts=opts.AxisOpts(
type_="value",
axistick_opts=opts.AxisTickOpts(is_show=True),
splitline_opts=opts.SplitLineOpts(is_show=True),
)
)
line.add_xaxis(xaxis_data=x_data)
line.add_yaxis(
series_name="",
y_axis=y_data,
symbol="emptyCircle",
is_symbol_show=True,
label_opts=opts.LabelOpts(is_show=True),
)
self.page.add(line)
def build(self):
self.page.render(self.result_path)
import xlrd
import csv
# 读取数据
class LoadData(object):
def __init__(self, file_path):
self.file_path = file_path
self.title_list = []
# 基础数据
self.data_list = []
# 用户id进行分组
self.data_dict = {}
# 去除0元领,1元抽奖,服务费
self.real_data_list = []
# 去除0元领,1元抽奖,服务费
self.real_data_dict = []
def __build_re_buy_data(self):
# 需要去除价格为0的
for data in self.data_list:
if float(data['价格']) == 0.0:
print("删除价格为0 ", data)
self.data_list.remove(data)
if data['itemtype'] == '53':
data['商品类型'] = '212商品_一口价'
elif data['itemtype'] == '51':
data['商品类型'] = '212商品_拍卖'
self.data_dict = {}
self.real_data_list = []
self.real_data_dict = {}
# 按用户id聚合
for data in self.data_list:
user_id = str(int(data['用户id']))
item_list = []
if user_id in self.data_dict:
item_list = self.data_dict[user_id]
item_list.append(data)
sorted(item_list, key=lambda item: item['付费时间'])
self.data_dict[user_id] = item_list
# 去除价格少于1元的
if not self.is_zero_buy(data):
self.real_data_list.append(data)
# 去除0元领后排序
for data in self.real_data_list:
user_id = str(int(data['用户id']))
item_list = []
if user_id in self.real_data_dict:
item_list = self.real_data_dict[user_id]
item_list.append(data)
sorted(item_list, key=lambda item: item['付费时间'])
self.real_data_dict[user_id] = item_list
def __load_csv(self):
with open(self.file_path) as file:
file_csv = csv.reader(file)
self.title_list = next(file_csv)
for row in file_csv:
data = {}
for c_index in range(len(self.title_list)):
data[self.title_list[c_index]] = row[c_index]
self.data_list.append(data)
self.__build_re_buy_data()
def __load_xlsx(self):
workbook = xlrd.open_workbook(self.file_path)
sheet = workbook.sheet_by_index(0)
print('行数:', sheet.nrows, "列数:", sheet.ncols)
# 获取标题
for column in range(sheet.ncols):
self.title_list.append(sheet.cell(0, column).value)
print('标题:', self.title_list)
for row in range(1, sheet.nrows, 1):
data = {}
for colum in range(sheet.ncols):
data[self.title_list[colum]] = sheet.cell(row, colum).value
self.data_list.append(data)
self.__build_re_buy_data()
def load(self):
self.title_list = []
self.data_list = []
if self.file_path.find('.csv') > 0:
self.__load_csv()
print("读取CSV文件Done>>", self.file_path)
elif self.file_path.find('.xlsx') > 0:
self.__load_xlsx()
print("读取XLSX文件Done>>", self.file_path)
else:
print("读取失败,不支持该文件类型>>", self.file_path)
def is_zero_buy(self, data):
data_name = data['订单名称']
data_price = float(data['价格'])
return data_name.find('0元领') != -1 or data_price <= 1.0
import os
from analysis_strategy import analysis_classify, analysis_category, analysis_goods, analysis_price, analysis_order
from echart_draw import EChartDraw
from load_data import LoadData
def analysis_list(load_data, result_path):
chart = EChartDraw('./result/' + result_path)
analysis_classify(load_data, chart)
analysis_category(load_data, chart)
analysis_goods(load_data, chart)
analysis_price(load_data, chart)
analysis_order(load_data, chart)
chart.build()
if __name__ == "__main__":
# 读取文件
for root, dirs, files in os.walk('csv'):
for file in files:
csv_path = os.path.join(root, file)
result_file_name = file.replace('.csv', '_result.html')
load_data = LoadData(csv_path)
load_data.load()
analysis_list(load_data, result_file_name)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment