#-*- coding : utf-8 -*-
from pyecharts.charts import Bar, Pie, Line, Map, Geo, Page, Grid, Liquid
from pyecharts import options as opts
import numpy as np
import pandas as pd
from pandas import DataFrame
#注意修改地质(r'c:\Users\lenovo\Desktop\2020donghang.xls)
total_data = pd.read_excel(r'c:\Users\lenovo\Desktop\2020donghang.xls',parse_dates=['label_order_time'],dtype={'prices': int})
np.set_printoptions(suppress=True)
pd.set_option('display.float_format', lambda x: ' % .1f' % x)
pd.set_option("precision", 1)
data_frame = DataFrame(total_data)
# 商品名称列表和金额列表
prices_lists = pd.pivot_table(data_frame, index=['brands'], values=['prices'], aggfunc=np.sum)
prices_list = prices_lists.sort_values(by="prices",ascending=True)
prices_totals = prices_list.reset_index()
brand_prices_name = prices_totals['brands'].tolist()
brand_prices = prices_totals['prices'].tolist()
# 商品名称列表和数量列表
# 计算商品 数量求和
number_lists = pd.pivot_table(data_frame, index=['brands'], values=['number'], aggfunc=np.sum)
#按数量从小到大值排序
number_list = number_lists.sort_values(by="number",ascending=True)
#增加索引列
nember_totals = number_list.reset_index()
# 提取商品名称列
brand_number_name = nember_totals['brands'].tolist()
# 提取商品名
brand_number = nember_totals['number'].tolist()
# 提取商数量
#2020各个月份总和
# 提取月份字段
data_frame['month'] = data_frame['label_order_time'].dt.to_period('M')
#按月 提取价格总合
month_prices = pd.pivot_table(data_frame, index=['month'], values=['prices'], aggfunc=np.sum)
list_prices = month_prices['prices'].tolist()
map_list = data_frame["address_province"].value_counts() #计算每个省会有多少个单子
map_values = map_list.tolist()
map_info = map_list.reset_index()
address_name = map_info["index"].tolist()
#地图信信 dict(zip(address_name,map_values)) 字典
address_list = list(zip(address_name,map_values)) #列表
print(address_list)
# 柱状图
def bar_datazoom_slider() -> Bar:
c = (
Bar()
.add_xaxis(brand_prices_name)
.add_yaxis("品牌金额", brand_prices)
# .add_xaxis(brand_number_name)
# .add_yaxis("订单数量", brand_number, is_selected=False)
.set_global_opts(
#标题修改
title_opts=opts.TitleOpts(title="2020商家销售表(元)",subtitle="总金额:"),
datazoom_opts=[opts.DataZoomOpts(range_start= 100)],
)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(
data=[opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值")# 这个用线拉
]
),
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值"), # 这个点标注
]
),
)
)
return c
#折线图
def line_markpoint() -> Line:
date_data = ["{}月".format(i)for i in range(1, 13)]
c = (
Line()
# .add_xaxis([str(i+1)+"月" for i in range(0,12)])
.add_xaxis(date_data)
.add_yaxis(
"",
list_prices,
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average", name="平均值")]),
)
.set_global_opts(title_opts=opts.TitleOpts(title="各月份销售(元)"))
)
return c
#饼图
def pie_rosetype() -> Pie:
c = (
Pie()
.add(
"",
[list(z) for z in zip(brand_number_name, brand_number)],
radius=["40%", "75%"],
)
.set_global_opts(
title_opts=opts.TitleOpts(title="销售总数量及占比(个)",subtitle="总数量:"),
legend_opts=opts.LegendOpts(type_="scroll", orient="vertical", pos_top="15%", pos_left="2%"),
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c} {d}%"),
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{b}: {c} ({d}%)"),
)
)
return c
#地图
def map_china() ->Map:
c = (
Map()
.add(series_name="确诊病例", data_pair=address_list , maptype="china", zoom=1, center=[105, 38])
.set_global_opts(
title_opts=opts.TitleOpts(title="订单发货地图"),
visualmap_opts=opts.VisualMapOpts(max_=9999, is_piecewise=True,
pieces=[{"max": 9, "min": 0, "label": "0-9", "color": "#FFE4E1"},
{"max": 99, "min": 10, "label": "10-99", "color": "#FF7F50"},
{"max": 499, "min": 100, "label": "100-499", "color": "#F08080"},
{"max": 999, "min": 500, "label": "500-999", "color": "#CD5C5C"},
{"max": 10000, "min": 1000, "label": "1000-10000", "color": "#7777"},
{"max": 59999, "min": 10000, "label": "10000++++", "color": "#8B0000"}]
)
)
)
return c
def page_simple_layout():
page = Page(layout=Page.SimplePageLayout)
page.add(
bar_datazoom_slider(),
line_markpoint(),
pie_rosetype(),
map_china(),
)
page.render("page_simple_layout.html")
if __name__ == "__main__":
page_simple_layout()
注意改表头字段
如图例