Exemplo n.º 1
0
def analysis_total():
    # 处理数据
    x_data = pdata['年份'].tolist()
    # 将人口单位转换为亿
    y_data1 = pdata['年末总人口(万人)'].map(lambda x: "%.2f" % (x / 10000)).tolist()
    y_data2 = pdata['人口自然增长率(‰)'].tolist()
    y_data3 = pdata['人口出生率(‰)'].tolist()
    y_data4 = pdata['人口死亡率(‰)'].tolist()

    # 总人口柱状图
    bar = Bar(init_opts=opts.InitOpts(width="1200px", height="500px"))
    bar.add_xaxis(x_data)
    bar.add_yaxis("年末总人口(亿)",
                  y_data1,
                  category_gap="10%",
                  label_opts=opts.LabelOpts(rotate=90, position="inside"))
    bar.set_global_opts(
        title_opts=opts.TitleOpts(title="年末总人口变化情况",
                                  pos_bottom="bottom",
                                  pos_left="center"),
        xaxis_opts=opts.AxisOpts(
            type_="category",
            name='年份',
            # 坐标轴名称显示位置
            name_location='end',
            # x轴数值与坐标点的偏移量
            # boundary_gap=False,
            axislabel_opts=opts.LabelOpts(is_show=True,
                                          margin=10,
                                          color="#000",
                                          interval=1,
                                          rotate=90),
            # axisline_opts=opts.AxisLineOpts(is_show=True, symbol="arrow"),
            axistick_opts=opts.AxisTickOpts(is_show=True,
                                            is_align_with_label=True),
            axispointer_opts=opts.AxisPointerOpts(
                type_="line", label=opts.LabelOpts(is_show=True))),
        # y轴相关选项设置
        yaxis_opts=opts.AxisOpts(
            type_="value",
            position="left",
        ),
        legend_opts=opts.LegendOpts(is_show=True))

    # bar.render('bartest.html')

    # 自然增长率、出生率、死亡率折线图
    line = Line(init_opts=opts.InitOpts(width="1400px", height="500px"))
    line.add_xaxis(x_data)
    line.add_yaxis(series_name="自然增长率(‰)",
                   y_axis=y_data2,
                   label_opts=opts.LabelOpts(is_show=False))
    line.add_yaxis('出生率(‰)', y_data3, label_opts=opts.LabelOpts(is_show=False))
    line.add_yaxis('死亡率(‰)', y_data4, label_opts=opts.LabelOpts(is_show=False))
    line.set_global_opts(
        title_opts=opts.TitleOpts(title="人口自然增长率、出生率、死亡率",
                                  pos_bottom="bottom",
                                  pos_left="center"),
        xaxis_opts=opts.AxisOpts(
            name='年份',
            name_location='end',
            type_="value",
            min_="1949",
            max_interval=1,
            # 设置x轴不必与y轴的0对齐
            axisline_opts=opts.AxisLineOpts(is_on_zero=False),
            axislabel_opts=opts.LabelOpts(is_show=True,
                                          color="#000",
                                          interval=0,
                                          rotate=90),
            axistick_opts=opts.AxisTickOpts(is_show=True,
                                            is_align_with_label=True),
            axispointer_opts=opts.AxisPointerOpts(
                type_="shadow", label=opts.LabelOpts(is_show=True))),
        # y轴相关选项设置
        yaxis_opts=opts.AxisOpts(name='比例',
                                 type_="value",
                                 position="left",
                                 min_=-10,
                                 axislabel_opts=opts.LabelOpts(is_show=True)),
        legend_opts=opts.LegendOpts(is_show=True))

    # 渲染图像,将多个图像显示在一个html中
    # DraggablePageLayout表示可拖拽
    page = Page(layout=Page.DraggablePageLayout)
    page.add(bar)
    page.add(line)
    page.render('population_total.html')
Exemplo n.º 2
0
    return bar


@C.funcs
def overlap_bar_line() -> Bar:
    bar = (
        Bar()
        .add_xaxis(Faker.months)
        .add_yaxis("蒸发量", v1)
        .add_yaxis("降水量", v2)
        .extend_axis(
            yaxis=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value} °C"), interval=5
            )
        )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="Overlap-bar+line"),
            yaxis_opts=opts.AxisOpts(
                axislabel_opts=opts.LabelOpts(formatter="{value} ml")
            ),
        )
    )

    line = Line().add_xaxis(Faker.months).add_yaxis("平均温度", v3, yaxis_index=1)
    bar.overlap(line)
    return bar


Page().add(*[fn() for fn, _ in C.charts]).render()
Exemplo n.º 3
0
                        }, {
                            "min": 500,
                            "max": 999,
                            "label": '500到999人'
                        }, {
                            "min": 1000,
                            "max": 9999,
                            "label": '1000到9999人'
                        }, {
                            "min": 10000,
                            "label": '10000人以上'
                        }]),
                    title_opts=options.TitleOpts(
                        title="全国疫情热点地图",
                        subtitle=title_ncp_summary,
                        pos_left="center",
                        pos_top="10px",
                        title_textstyle_opts=options.TextStyleOpts(
                            color="#080808"),
                        subtitle_textstyle_opts=options.TextStyleOpts(
                            color="#080808")),
                    legend_opts=options.LegendOpts(is_show=False))  # 不显示图例
        )
        return output

    page = Page(layout=Page.SimplePageLayout, page_title="疫情数据")
    # 需要自行调整每个 chart 的 height/width,显示效果在不同的显示器上可能不同
    page.add(geo_map(), pie_rosetype(china_data_list), bar_datazoom_slider(),
             line_base())
    page.render(path="./pie2.html")
Exemplo n.º 4
0
def analysis_sex():
    x_data = pdata['年份'].tolist()
    # 历年男性人口数
    y_data_man = pdata['男性人口(万人)']
    # 历年女性人口数
    y_data_woman = pdata['女性人口(万人)']
    # 2019年男女比饼图
    sex_2019 = pdata[pdata['年份'] == 2019][['男性人口(万人)', '女性人口(万人)']]

    # 两列相减,获得新列
    y_data_man_woman = pdata['男性人口(万人)'] - pdata['女性人口(万人)']

    pie = Pie()
    pie.add("", [list(z) for z in zip(['男', '女'], np.ravel(sex_2019.values))])
    pie.set_global_opts(title_opts=opts.TitleOpts(
        title="2019中国男女比", pos_bottom="bottom", pos_left="center"))
    pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
    pie.render('nvpie.html')

    line = Line(init_opts=opts.InitOpts(width="1400px", height="500px"))
    line.add_xaxis(x_data)
    line.add_yaxis(
        series_name="男女差值",
        y_axis=y_data_man_woman.values,
        # 标出关键点的数据
        markpoint_opts=opts.MarkPointOpts(data=[
            opts.MarkPointItem(type_="min"),
            opts.MarkPointItem(type_="max"),
            opts.MarkPointItem(type_="average")
        ]),
        label_opts=opts.LabelOpts(is_show=False),
        markline_opts=opts.MarkLineOpts(
            data=[opts.MarkLineItem(type_="average")]))
    line.set_global_opts(
        title_opts=opts.TitleOpts(title="中国70年(1949-2019)男女差值(万人)",
                                  pos_left="center",
                                  pos_top="bottom"),
        legend_opts=opts.LegendOpts(is_show=False),
        xaxis_opts=opts.AxisOpts(
            name='年份',
            name_location='end',
            type_="value",
            min_="1949",
            max_interval=1,
            # 设置x轴不必与y轴的0对齐
            axisline_opts=opts.AxisLineOpts(is_on_zero=False),
            axislabel_opts=opts.LabelOpts(is_show=True,
                                          color="#000",
                                          interval=0,
                                          rotate=90),
            axistick_opts=opts.AxisTickOpts(is_show=True,
                                            is_align_with_label=True),
            axispointer_opts=opts.AxisPointerOpts(
                type_="shadow", label=opts.LabelOpts(is_show=True))),
        yaxis_opts=opts.AxisOpts(name='差值(万人)',
                                 type_="value",
                                 position="left",
                                 axislabel_opts=opts.LabelOpts(is_show=True)),
    )

    # 5、渲染图像,将多个图像显示在一个html中
    page = Page(layout=Page.DraggablePageLayout)
    page.add(pie)
    page.add(line)
    page.render('population_sex.html')
Exemplo n.º 5
0
grltab = Table()

c = [[gj[i], round(ljqz[i] * 10000 / rk[i], 2)] for i in range(len(gj))
     if ljqz[i] > 9]

grdata = sorted(c, key=lambda x: x[1], reverse=True)  #数组重新排序

cheaders = [grdata[i][0] for i in range(0, 10)]
crows = [[grdata[i][1] for i in range(0, 10)]]

grltab.add(cheaders, crows)
grltab.set_global_opts(title_opts=ComponentTitleOpts(
    title="全球新冠肺炎感染率前十国家(每千万人中感染人数)", subtitle="截至2020年3月15日"))

#页面布局组合
page = Page(layout=Page.SimplePageLayout)
page = Page(page_title="全球COVID19疫情扩散与输入性风险分析—海珠实验小学六年四班刘子悠的研学作品")

page.add(rkmap)
page.add(qztab)
page.add(tl)
page.add(grltab)
page.add(tlgr)
page.add(wbar)

#mtab=Tab() Tab与Page不兼容,忍痛放弃
#mtab=Tab(page_title="刘子悠的研学作品-tab")
#mtab.render("mytabmaps.html"),template_name='simple_page.html'

page.render('index2.html')
Exemplo n.º 6
0
# Bar-根据y轴的值自定义柱状的颜色
@obj_C.funcs
def bar_custom_bar_color():
    # 小于50红色,50-100蓝色,其他绿色
    color_function = """
            function (params) {
                if (params.value > 0 && params.value < 50) {
                    return 'red';
                } else if (params.value > 50 && params.value < 100) {
                    return 'blue';
                }
                return 'green';
            }
            """
    obj_bar = Bar()
    obj_bar.add_xaxis(Faker.choose())

    # 这里设置color不起作用
    obj_bar.add_yaxis("商家A", Faker.values(),color='#C1C1C1',itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function)))
    obj_bar.add_yaxis("商家B", Faker.values(),color='#909090',itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function)))
    obj_bar.add_yaxis("商家C", Faker.values(),color='#404040',itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function)))
    obj_bar.set_global_opts(
        title_opts=opts.TitleOpts(title="Bar-自定义柱状颜色", subtitle="副标题"),
        brush_opts=opts.BrushOpts()
    )
    return obj_bar


if __name__ == '__main__':
    obj_page = Page()
    obj_page.add(*[fn() for fn, _ in obj_C.charts]).render('html/example_bar.html')
            max_=250,
            position="right",
            offset=80,
            axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts(
                color="#5793f3")),
            axislabel_opts=opts.LabelOpts(formatter="{value} ml"),
        ),
        title_opts=opts.TitleOpts(title="Grid-多 Y 轴示例"),
        tooltip_opts=opts.TooltipOpts(trigger="axis",
                                      axis_pointer_type="cross"),
    ))

    line = (Line().add_xaxis(x_data).add_yaxis(
        "平均温度",
        [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2],
        yaxis_index=2,
        color="#675bba",
        label_opts=opts.LabelOpts(is_show=False),
    ))

    bar.overlap(line)
    return Grid().add(bar,
                      opts.GridOpts(pos_left="5%", pos_right="20%"),
                      is_control_axis_index=True)


# 需要自行调整每个 chart 的 height/width,显示效果在不同的显示器上可能不同
page = Page(layout=Page.SimplePageLayout)
page.add(bar_datazoom_slider(), line_markpoint(), pie_rosetype(),
         grid_mutil_yaxis())
page.render('tt.html')
Exemplo n.º 8
0
def mcharts(request):

	import pymysql
	from collections import Counter
	from pyecharts.faker import Faker  # pyecharts的示例数据来源
	from pyecharts import options as opts
	from pyecharts.charts import Bar, Tab, Pie, Line, WordCloud, Map, Bar, Page
	from pyecharts.globals import ThemeType, SymbolType, ChartType
	from pyecharts.components import Table
	from pyecharts.commons import utils
	from pyecharts.types import Tooltip
	import numpy as np
	import pandas as pd
	import re


	class SqlConnect(object):
		def __init__(self):
			self.db = pymysql.connect(host='localhost', user='******',password='******',db='liepinwang',charset='utf8')  # 链接数据库
			

	class GetExpData(SqlConnect):
		""" 获取和整理数据库中关于工作经验的数据 """
		def __init__(self, area, jobkey):
			super().__init__()
			self.area = area
			self.jobkey = jobkey

		def get_data(self):
			sql ='select experience,count(*) num from jobs where area="{}" and jobkey="{}" group by experience'.format(self.area,self.jobkey)
			data = pd.read_sql(sql,con=self.db)
			ex_list = list(data.experience)  # 经验列表
			num_list = list(data.num)  # 各经验对应的数值
			dict1 = dict(zip(ex_list,num_list))  # 把经验列表和数值组成一个字典
			dict2 = {'经验不限':0,'1-3年':0, '3-5年':0, '5-10年':0, '10年以上':0}
			# 将数据整合到不同的经验区间
			for key, value in dict1.items():
				try:
					key_num = int(re.match(r"\d+", key).group()) # 提取经验中的数字部分
					if(key_num>=1 and key_num<3):
						dict2['1-3年'] += value
					elif(key_num>=3 and key_num<5):
						dict2['3-5年'] +=value
					elif(key_num>=5 and key_num<10):
						dict2['5-10年'] += value
					else:
						dict2['10年以上'] += value
				except:  # 如果为None值
					dict2['经验不限'] +=value

			ex_list,ex_num_list = zip(*dict2.items())  # 用新字典的键值各自生成元组
			return ex_list,ex_num_list


	class GetPayData(SqlConnect):
		""" 获取和整理数据库中关于薪资的数据 """
		def __init__(self, area, jobkey):
			super().__init__()
			self.area = area
			self.jobkey = jobkey

		def get_data(self):
			sql = 'select pay,count(*) pay_num from jobs where area="{}" and jobkey="{}" group by pay'.format(self.area,self.jobkey)
			data = pd.read_sql(sql,con=self.db)
			pay_list = data.pay.tolist()
			pay_num_list = data.pay_num.tolist()
			dict1 = dict(zip(pay_list,pay_num_list)) # 把工资列表和对应数量组成一个字典
			dict2 = {'0-10w':0,'10-20w':0, '20-30w':0, '30-50w':0, '50-100w':0}
			# 将数据整合到不同的工资区间
			for key, value in dict1.items():
				try:
					pay_num = int(re.match(r'(\d+)\D?',key).group(1))
					if(pay_num>=0 and pay_num<10):
						dict2['0-10w'] += value
					elif(pay_num>=10 and pay_num<20):
						dict2['10-20w'] += value
					elif(pay_num>=20 and pay_num<30):
						dict2['20-30w'] += value
					elif(pay_num>=30 and pay_num<50):
						dict2['30-50w'] += value
					else:
						dict2['50-100w'] += value
				except:
					pass
			range_list, pay_list = zip(*dict2.items())  # 用新字典的键值各自生成元组
			return pay_list, range_list


	class GetTemData(SqlConnect):
		""" 获取和整理数据库中关于工作福利的数据 """
		def __init__(self, area, jobkey):
			super().__init__()
			self.area = area
			self.jobkey = jobkey

		def get_data(self):
			sql ='select temptation from jobs where temptation is not null and temptation <> "" and area="{}" and jobkey="{}" '.format(self.area,self.jobkey)
			data = pd.read_sql(sql,con=self.db)  # 获取到的数据是series类型
			try:
				str_tem_list = data.temptation.tolist()  # 每一个岗位的福利信息组成的一个列表
				tem_list = []
				length = len(str_tem_list)
				for i in range(0,length):
					# 因为此时的福利信息还是一个比较长的字符串,把它按照逗号分隔开来,取出每一个关键词再添加到列表中
					tem_list += str_tem_list[i].split(',')  # 这就构造出了一个元素都是单个关键词的列表
				c = dict(Counter(tem_list))
				tem_list, tem_num_list = zip(*c.items())  # 用新字典的键值各自生成元组
				return tem_list, tem_num_list
			except:
				raise Http404("没有找到相关信息")


	class GetEduData(SqlConnect):
		""" 获取和整理数据库中关于教育程度的数据 """
		def __init__(self, area, jobkey):
			super().__init__()
			self.area = area
			self.jobkey = jobkey

		def get_data(self):
			sql = 'select education, count(*) num from jobs where area="{}" and jobkey="{}" group by education'.format(self.area,self.jobkey)
			data = pd.read_sql(sql,con=self.db)  # 获取到的数据是series类型
			edu_list = data.education.tolist()
			edu_num_list = data.num.tolist()
			return edu_list, edu_num_list


	class GetExpAndPayData(SqlConnect):
		""" 工作经验和工资的关系 """
		def __init__(self, area, jobkey):
			super().__init__()
			self.area = area
			self.jobkey = jobkey

		def del_min_data(self, ex_list, num_list, average_list):
			import heapq
			length = int(len(ex_list)/3)
			for i in range(0,length):
				min_num_index = list(map(num_list.index, heapq.nsmallest(1, num_list)))[0]
				ex_list.pop(min_num_index)
				num_list.pop(min_num_index)
				average_list.pop(min_num_index)
			return ex_list, num_list, average_list

		def get_data(self):
			sql = 'select experience, pay from jobs where area="{}" and jobkey="{}"'.format(self.area, self.jobkey)
			data = pd.read_sql(sql,con=self.db)
			grouped = data.groupby('experience')
			ex_list = list(grouped.groups.keys())  # 经验列表
			num_list = grouped.agg(np.size).pay.tolist() # 各经验对应的工作岗位数量
			average_list = [] # 各经验对应的平均工资

			for i in ex_list: # 遍历经验列表
				pay_list = grouped.get_group(i).pay.tolist()  # 获取 当前经验 所对应的工资列表
				for j in range(0,len(pay_list)):  # 遍历工资列表
					pay_list[j] = int(re.match(r'(\d+)\D?',pay_list[j]).group(1))  # 用正则表达式提取出需要的部分
				a = np.array(pay_list)  # 转换格式,方便求平均值
				average_list.append(int(np.mean(a, axis=0)))  # 求平均值,并转换成int格式

			ex_list, num_list, average_list = self.del_min_data(ex_list, num_list, average_list)

			return ex_list, num_list, average_list


	class GetAreaData(SqlConnect):
		""" 获取和整理数据库中关于全国各地工作岗位数量的数据 """
		def __init__(self, jobkey):
			super().__init__()
			self.jobkey = jobkey

		def get_data(self):
			sql = 'select area,count(area) job_num from jobs where jobkey="{}" group by area'.format(self.jobkey)
			data = pd.read_sql(sql,con=self.db)  # 获取到的数据是series类型
			area_list = data.area.tolist()
			job_num_list = data.job_num.tolist()
			return area_list, job_num_list


	#饼图
	def pie_radius(ex_list,ex_num_list) -> Pie:
		c = (
			Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS,))  # 创建图形实例并设置主题
			.add(
				"",
				[list(z) for z in zip(ex_list, ex_num_list)],
				radius=["40%", "75%"],  # 内圆和外圆的大小
				center=["50%", "60%"]
			)
			# 全局配置项 - set_global_options
			.set_global_opts(  
				# 标题配置项
				title_opts=opts.TitleOpts(
					title="{} {} 岗位的工作经验要求".format(area,jobkey),  # 主标题
					title_textstyle_opts=opts.TextStyleOpts(color="black",),
					subtitle="岗位数量:{}个".format(sum(ex_num_list)),  # 副标题
					subtitle_textstyle_opts=opts.TextStyleOpts(color="slateblue", font_size=16),
				),
				# 图例配置项
				legend_opts=opts.LegendOpts(  # 图例配置项(图例就是左边那一列)
					orient="vertical",  # 图里列表的布局朝向
					pos_bottom="20%",  # 图例组件离容器下侧的距离
					pos_left="2%",  # 图例组件离容器左侧的距离
					textstyle_opts=opts.TextStyleOpts(font_size=16)  # 字体设置
				),

			)
			# 系列配置项 - set_series_options
			.set_series_opts(
				label_opts=opts.LabelOpts(  # 标签配置项(标签就是图片旁边的文字)
					formatter="{b}: {c}({d}%)",  # 标签内文本的格式
					font_size = 16,  # 标签文本的字号大小
				),
				
			)
		)
		return c

	# 柱状图
	def bar_base(pay_list, range_list) -> Bar:
		c = (
			Bar(init_opts=opts.InitOpts(theme=ThemeType.ROMA,))
			.add_xaxis(range_list)
			.add_yaxis(
				" ",
				pay_list,
			)
			.set_global_opts(
				title_opts=opts.TitleOpts(title="{}{}岗位工资待遇".format(area, jobkey), subtitle=""),
				yaxis_opts=opts.AxisOpts(name="岗位数量"),
				xaxis_opts=opts.AxisOpts(name="工资水平(年薪)"),
				tooltip_opts = opts.TooltipOpts(formatter = "{b} : {c}")
			)
			# 系列配置项 - set_series_options
			.set_series_opts(
				label_opts=opts.LabelOpts(  # 标签配置项(标签就是图片旁边的文字)
					formatter="{c}",  # 标签内文本的格式
					font_size = 16,  # 标签文本的字号大小
				),
			)
		)
		return c

	# 词云图
	def wordcloud_base(tem_list,tem_num_list) -> WordCloud:
		c = (
			WordCloud(init_opts = opts.InitOpts(width = "900px", height = "550px", theme=ThemeType.ROMA))
			.add("", zip(tem_list,tem_num_list), word_size_range=[20, 120], shape=SymbolType.DIAMOND)
			.set_global_opts(title_opts=opts.TitleOpts(title="{} {} 岗位工作福利".format(area,jobkey),))
		)
		return c

	# 富文本图
	def pie_rich_label(edu_list, edu_num_list) -> Pie:
		c = (
			Pie(init_opts = opts.InitOpts(height = "550px",))
			.add(
				"",
				[list(z) for z in zip(edu_list, edu_num_list)],
				radius=["40%", "55%"],
				label_opts=opts.LabelOpts(
					position="outside",
					formatter="{hr|}\n {b|{b}: }{c}  {per|{d}%}  ",
					background_color="#eee",
					border_color="#aaa",
					border_width=1,
					border_radius=4,
					rich={
						"a": {"color": "#999", "lineHeight": 22, "align": "center"},
						"abg": {
							"backgroundColor": "#e3e3e3",
							"width": "100%",
							"align": "right",
							"height": 22,
							"borderRadius": [4, 4, 0, 0],
						},
						"hr": {
							"borderColor": "#aaa",
							"width": "100%",
							"borderWidth": 0.5,
							"height": 0,
						},
						"b": {"fontSize": 16, "lineHeight": 33},
						"per": {
							"color": "#eee",
							"backgroundColor": "#334455",
							"padding": [2, 4],
							"borderRadius": 2,
						},
					},
				),
			)
			.set_global_opts(
				title_opts=opts.TitleOpts(title="{}{}岗位的教育程度要求".format(area, jobkey)),
				legend_opts = opts.LegendOpts(
					pos_top="bottom",
				),
			)
		)
		return c

	# 层叠多图(双Y轴) - 经验与平均工资
	def overlap_bar_line(ave_ex_list, ave_job_num_list, average_list) -> Bar:
		bar = (
			Bar()
			.add_xaxis(ave_ex_list)
			.add_yaxis("岗位数量", ave_job_num_list)
			.extend_axis(
				yaxis=opts.AxisOpts(
					axislabel_opts=opts.LabelOpts(formatter="{value} 万元"), split_number=5
				)
			)
			.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
			.set_global_opts(
				title_opts=opts.TitleOpts(title="Overlap-bar+line(双 Y 轴)"),
				yaxis_opts=opts.AxisOpts(
					axislabel_opts=opts.LabelOpts(formatter="{value} 个")
				),
			)
		)

		line = Line().add_xaxis(ave_ex_list).add_yaxis("平均工资", average_list, yaxis_index=1)
		bar.overlap(line)
		return bar

	# 地图(分段型)
	def map_visualmap(area_list, job_num_list) -> Map:
		c = (
			Map(init_opts=opts.InitOpts(theme=ThemeType.ROMA,))
			.add(
				"",
				[list(z) for z in zip(area_list, job_num_list)],
				"china",

				tooltip_opts = opts.TooltipOpts(formatter=utils.JsCode(
					"""function (params){
						return params.name + ' : ' + params.value + '<br/>';
					}"""
					))
			)
			.set_global_opts(
				title_opts=opts.TitleOpts(title="{}岗位全国热度一览".format(jobkey)),
				legend_opts = opts.LegendOpts(pos_left = 'center',),
				visualmap_opts=opts.VisualMapOpts(  # 视觉映射配置项
					is_piecewise=True,  # 是否分段
					max_= max(job_num_list),  # 分段的最大值
					# 自定义分段信息
					pieces = [
						{"min": 0, "max": int(max(job_num_list)/5), "color": "steelblue"},
						{"min": int(max(job_num_list)/5), "max": int(max(job_num_list)/5)*2},
						{"min": int(max(job_num_list)/5)*2, "max": int(max(job_num_list)/5)*3},
						{"min": int(max(job_num_list)/5)*3, "max": int(max(job_num_list)/5)*4},
						{"min": int(max(job_num_list)/5)*4, "max": max(job_num_list)},
					]
				)
			)
		)
		return c


	
	# if __name__ == '__main__':
	# 	# area = input("please enter the area:")
	# 	# jobkey = input("please enter the jobkey:")
	
	user_text = request.GET['key_words']

	# print(user_text)
	# print(type(user_text))
	try:
		user_text_list = (user_text.strip()).split(' ')  # 将用户输入的字符串去首尾空格后,按照空格切片
		area = user_text_list[0]
		jobkey = user_text_list[1]
	except IndexError:
		raise Http404("请检查输入的信息是否符合规范")

	# 获取工作经验的数据
	data_exp = GetExpData(area, jobkey)
	ex_list, ex_num_list = data_exp.get_data()
	# 获取工资的数据
	data_pay = GetPayData(area,jobkey)
	pay_list, range_list = data_pay.get_data()
	# 获取工作福利的数据
	data_tem = GetTemData(area, jobkey)
	tem_list, tem_num_list = data_tem.get_data()
	# 获取教育程度的数据
	data_edu = GetEduData(area, jobkey)
	edu_list, edu_num_list = data_edu.get_data()
	# 获取工作经验和对应平均工资的数据
	data_average = GetExpAndPayData(area, jobkey)
	ave_ex_list, ave_job_num_list, average_list = data_average.get_data()
	# 获取工作数量的数据
	data_area = GetAreaData(jobkey)
	area_list, job_num_list = data_area.get_data()



	# 构造布局
	# layout:布局方式, page_title: 网页名, interval: 图例间隔
	page = Page(layout=Page.SimplePageLayout, page_title = "{}-{}岗位的分析".format(area,jobkey), interval=2)
	page.add(
		pie_radius(ex_list, ex_num_list),
		bar_base(pay_list, range_list),
		wordcloud_base(tem_list, tem_num_list),
		pie_rich_label(edu_list, edu_num_list),
		overlap_bar_line(ave_ex_list, ave_job_num_list, average_list),
		map_visualmap(area_list, job_num_list),
	)
	page.render('charts/templates/charts/render.html')

	return render(request, 'charts/render.html')
Exemplo n.º 9
0
def analys_of_data(datas):
    """
    对主播类型进行分类,统计
    (dict)type_dict : {
        'type' : {
            'count': int,
            'popularity': int,
        }
        'type' : str(popularity*10000 + count)
    }
    """
    type_dict = dict()
    for data in datas:
        if data['type'] not in type_dict.keys():
            type_dict[data['type']] = data['popularity'] * 10000 + 1
        else:
            type_dict[data['type']] += data['popularity'] * 10000 + 1

    num_list = sorted([num % 10000 for num in list(type_dict.values())],
                      reverse=True)  # 获得类型数量的降序列表
    popul_list = sorted([int(num / 10000) for num in list(type_dict.values())],
                        reverse=True)  # 获得类型人气值的降序列表
    # 人气前25名的直播内容统计
    data_list = sorted(datas, key=lambda x: x['popularity'], reverse=True)
    popul_dict = dict()
    for data in data_list[:25]:
        if data['type'] not in popul_dict.keys():
            popul_dict[data['type']] = data['popularity'] * 100 + 1
        else:
            popul_dict[data['type']] += data['popularity'] * 100 + 1

    # 创建统计前25位人气主播的网页
    page_1 = Page(page_title='关于前25位人气主播分析')
    a = (Bar(init_opts=opts.InitOpts(width='100%')).add_xaxis([
        data_list[num]['name'] for num in range(25)
    ]).add_yaxis(
        '',
        [round(data_list[num]['popularity'] / 10000, 1) for num in range(25)],
        color='#fa0000').set_global_opts(
            title_opts=opts.TitleOpts(title="前25位人气主播排名(单位:万)"),
            datazoom_opts=[
                opts.DataZoomOpts(),
                opts.DataZoomOpts(type_="inside")
            ],
        ).set_series_opts(
            xaxis_opts=opts.AxisOpts(name='主播名称'),
            title_opts=opts.TitleOpts(title="人气值占比",
                                      pos_left='10%',
                                      pos_top='2%'),
            legend_opts=opts.LegendOpts(is_show=False),
        ))
    b = (Pie(init_opts=opts.InitOpts(width='100%')).add(
        series_name="数量占比",
        data_pair=[(list(popul_dict.keys())[num],
                    list(popul_dict.values())[num] % 100)
                   for num in range(popul_dict.__len__())],
        radius=50,
        center=['90%', '15%'],
    ).add(
        series_name="人气占比",
        data_pair=[(list(popul_dict.keys())[num],
                    int(list(popul_dict.values())[num] / 100))
                   for num in range(popul_dict.__len__())],
        radius=50,
        center=['90%', '40%'],
    ).set_series_opts(
        title_opts=opts.TitleOpts(title='数量占比情况'),
        legend_opts=opts.LegendOpts(type_='scroll',
                                    pos_left="50%",
                                    pos_top="2%",
                                    is_show=True),
    ))
    grid = (Grid(init_opts=opts.InitOpts(
        width='100%', height='720px', theme=ThemeType.DARK)).add(
            a, grid_opts=opts.GridOpts(pos_top="10%", pos_right="10%")).add(
                b, grid_opts=opts.GridOpts(pos_left="90%", pos_top='10%')))
    page_1.add(grid)
    page_1.render('./result/analys_of_25.html')
    # 提取类型前32(数量)的进行分类
    source_num_1 = list()
    source_num_2 = list()
    source_num_3 = list()
    source_num_4 = list()
    source_num_1.append(["数量", "人气", "类型"])
    source_num_2.append(["数量", "人气", "类型"])
    source_num_3.append(["数量", "人气", "类型"])
    source_num_4.append(["数量", "人气", "类型"])
    for num in range(type_dict.__len__()):
        type_num = list(type_dict.values())[num] % 10000
        type_popul = int(list(type_dict.values())[num] / 10000)
        type_name = list(type_dict.keys())[num]
        if num_list[8] < type_num <= num_list[0]:
            source_num_1.append([type_num, type_popul, type_name])
        elif num_list[16] < type_num <= num_list[8]:
            source_num_2.append([type_num, type_popul, type_name])
        elif num_list[24] < type_num <= num_list[16]:
            source_num_3.append([type_num, type_popul, type_name])
        elif num_list[32] < type_num <= num_list[24]:
            source_num_4.append([type_num, type_popul, type_name])

    # 提取类型前32(人气)的进行分类
    source_popul_1 = list()
    source_popul_2 = list()
    source_popul_3 = list()
    source_popul_4 = list()
    source_popul_other = {
        'type': '其他',
        'popularity': 0,
        'num': 0,
    }
    source_popul_1.append(["人气", "数量", "类型"])
    source_popul_2.append(["人气", "数量", "类型"])
    source_popul_3.append(["人气", "数量", "类型"])
    source_popul_4.append(["人气", "数量", "类型"])
    for num in range(type_dict.__len__()):
        type_num = list(type_dict.values())[num] % 10000
        type_popul = int(list(type_dict.values())[num] / 10000)
        type_name = list(type_dict.keys())[num]
        if popul_list[8] < type_popul <= popul_list[0]:
            source_popul_1.append([type_popul, type_num, type_name])
        elif popul_list[16] < type_popul <= popul_list[8]:
            source_popul_2.append([type_popul, type_num, type_name])
        elif popul_list[24] < type_popul <= popul_list[16]:
            source_popul_3.append([type_popul, type_num, type_name])
        elif popul_list[32] < type_popul <= popul_list[24]:
            source_popul_4.append([type_popul, type_num, type_name])
        else:
            source_popul_other['popularity'] += type_popul
            source_popul_other['num'] += type_num
    # # 创建一个网页实例,用于整合多张图表
    page_2 = Page(page_title='直播类型一览图1')
    page_3 = Page(page_title='直播类型一览图2')

    # 创建横向柱状图
    def create_bar(source,
                   page,
                   x_type,
                   x_name,
                   y_type,
                   title,
                   range,
                   range_text,
                   split_num=8):
        c = (Bar(init_opts=opts.InitOpts(
            width='100%', height='480px', theme=ThemeType.DARK)).add_dataset(
                source=source).add_yaxis(
                    series_name="",
                    y_axis=[],
                    encode={
                        "x": x_type,
                        "y": y_type
                    },
                    label_opts=opts.LabelOpts(is_show=False),
                ).set_global_opts(
                    title_opts=opts.TitleOpts(title=title),
                    xaxis_opts=opts.AxisOpts(name=x_name),
                    yaxis_opts=opts.AxisOpts(type_="category"),
                    visualmap_opts=opts.VisualMapOpts(
                        orient="horizontal",
                        pos_left="center",
                        min_=range[0],
                        max_=range[1],
                        range_text=range_text,
                        dimension=0,
                        range_color=["#D7DA8B", "#E15457"],
                        is_piecewise=True,
                        split_number=split_num,
                    ),
                ))
        page.add(c)

    create_bar(source_num_1, page_2, '人气', '人气', '类型', '类型人气(数量:前8名)',
               (num_list[7], num_list[0]), ('数量高', '数量低'))
    create_bar(source_num_2, page_2, '人气', '人气', '类型', '类型人气(数量:第8~16名)',
               (num_list[15], num_list[8]), ('数量高', '数量低'))
    create_bar(source_num_3, page_2, '人气', '人气', '类型', '类型人气(数量:第16~24名)',
               (num_list[23], num_list[16]), ('数量高', '数量低'))
    create_bar(source_num_4, page_2, '人气', '人气', '类型', '类型人气(数量:第24~32名)',
               (num_list[31], num_list[24]), ('数量高', '数量低'))
    page_2.render('./result/type_of_num.html')

    create_bar(source_popul_1,
               page_3,
               '数量',
               '数量',
               '类型',
               '类型数量(人气:前8名)', (popul_list[7], popul_list[0]), ('人气高', '人气低'),
               split_num=5)
    create_bar(source_popul_2,
               page_3,
               '数量',
               '数量',
               '类型',
               '类型数量(人气:第8~16名)', (popul_list[15], popul_list[8]),
               ('人气高', '人气低'),
               split_num=5)
    create_bar(source_popul_3,
               page_3,
               '数量',
               '数量',
               '类型',
               '类型数量(人气:第16~24名)', (popul_list[23], popul_list[16]),
               ('人气高', '人气低'),
               split_num=5)
    create_bar(source_popul_4,
               page_3,
               '数量',
               '数量',
               '类型',
               '类型数量(人气:第24~32名)', (popul_list[31], popul_list[24]),
               ('人气高', '人气低'),
               split_num=5)
    page_3.render('./result/type_of_popular.html')

    # 类型平均人气一览图
    source = list()
    for s in source_popul_1[1:]:
        source.append([s[2], round(s[0] / s[1] / 10000, 1)])
    for s in source_popul_2[1:]:
        source.append([s[2], round(s[0] / s[1] / 10000, 1)])
    for s in source_popul_3[1:]:
        source.append([s[2], round(s[0] / s[1] / 10000, 1)])
    source.append([
        source_popul_other['type'],
        round(
            source_popul_other['popularity'] / 10000 /
            source_popul_other['num'], 1)
    ])
    d = (Bar(
        init_opts=opts.InitOpts(width='100%',
                                height='720px',
                                theme=ThemeType.DARK,
                                page_title='直播平均人气排名')).add_xaxis([
                                    s[0] for s in source
                                ]).add_yaxis(
                                    '人气值(单位:万)', [s[1] for s in source],
                                    color='#fa0000').set_global_opts(
                                        title_opts=opts.TitleOpts(
                                            title="直播类型平均人气排名"),
                                        datazoom_opts=[
                                            opts.DataZoomOpts(),
                                            opts.DataZoomOpts(type_="inside")
                                        ],
                                    ).set_series_opts(
                                        xaxis_opts=opts.AxisOpts(name='直播类型'),
                                        legend_opts=opts.LegendOpts(
                                            is_show=False),
                                    ).render('./result/avg_of_popular.html'))
Exemplo n.º 10
0
def showing_pics(movie_name):
    #生成页面
    page = (Page(page_title=movie_name))

    #豆瓣用户豆龄图
    #读取用户数据
    filename = movie_name + '\\' + movie_name + 'dby.txt'
    with open(filename, 'r+', encoding='utf-8') as f:
        year_1 = f.read()
        years = year_1.split()
    #进行分层分类
    time = {
        '0<x<=25': 0,
        '25<x<=50': 0,
        '50<x<=75': 0,
        '75<x<=100': 0,
        '100<x<=125': 0,
        'x>125': 0
    }
    for x in years:
        if int(x) < 25:
            time['0<x<=25'] += 1
        elif int(x) < 50:
            time['25<x<=50'] += 1
        elif int(x) < 75:
            time['50<x<=75'] += 1
        elif int(x) < 100:
            time['75<x<=100'] += 1
        elif int(x) < 125:
            time['100<x<=125'] += 1
        else:
            time['x>125'] += 1
    #整理数据
    month_list1 = time.items()
    #出图
    dbmonth = (Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS)).add(
        "", month_list1, radius=["40%", "75%"]).set_global_opts(
            title_opts=opts.TitleOpts(title=movie_name + " 豆瓣用户“豆龄”分布图",
                                      subtitle='单位:月'),
            toolbox_opts=opts.ToolboxOpts(is_show=True),
            legend_opts=opts.LegendOpts(orient="vertical",
                                        pos_top="15%",
                                        pos_left="2%"),
        ).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))

    #IMDB用户D龄图
    #读取用户数据
    filename = movie_name + '\\' + movie_name + 'Dy.txt'
    with open(filename, 'r+', encoding='utf-8') as f:
        year_1 = f.read()
        years = year_1.split()
    #进行分类分层
    time = {
        '0<x<=40': 0,
        '40<x<=80': 0,
        '80<x<=120': 0,
        '120<x<=160': 0,
        '160<x<=200': 0,
        'x>200': 0
    }
    for x in years:
        if int(x) < 40:
            time['0<x<=40'] += 1
        elif int(x) < 80:
            time['40<x<=80'] += 1
        elif int(x) < 120:
            time['80<x<=120'] += 1
        elif int(x) < 160:
            time['120<x<=160'] += 1
        elif int(x) < 200:
            time['160<x<=200'] += 1
        else:
            time['x>200'] += 1
    #整理
    month_list2 = time.items()
    #出图
    Dmonth = (Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS)).add(
        "", month_list2, radius=["40%", "75%"]).set_global_opts(
            title_opts=opts.TitleOpts(title=movie_name + " IMDB“D龄”分布图",
                                      subtitle='单位:月'),
            toolbox_opts=opts.ToolboxOpts(is_show=True),
            legend_opts=opts.LegendOpts(orient="vertical",
                                        pos_top="15%",
                                        pos_left="2%"),
        ).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))

    #英文词云图
    #读取数据
    filename = movie_name + '\\' + movie_name + 'Dreview.txt'
    with open(filename, 'r+', encoding='utf-8') as f:
        rev_1 = f.read()
        #处理标点
        for i in rev_1:
            if i in string.punctuation:
                rev_1 = rev_1.replace(i, " ")
        #分词+统计
        words = rev_1.split()
        words_dic = Counter(words)
    #删除一些高频词
    file_del = 'ban.txt'
    with open(file_del, 'r+', encoding='utf-8') as d:
        del_1 = d.read()
        Ban_list = del_1.split('\n')
    #处理数据
    words_list = []
    for word, time in words_dic.items():
        if word.lower() in Ban_list or time < 35:
            continue
        else:
            a_word = (word.title(), time)
            words_list.append(a_word)
    #出图
    Eng_wordcloud = (WordCloud(init_opts=opts.InitOpts(
        theme=ThemeType.MACARONS)).add(
            "", words_list, word_size_range=[20, 100],
            shape="diamond").set_global_opts(
                title_opts=opts.TitleOpts(title=movie_name + " WordCloud",
                                          subtitle=None),
                toolbox_opts=opts.ToolboxOpts(is_show=True)))

    #中文词云图
    #读取爬取的文本文件
    filename = movie_name + '\\' + movie_name + 'dbreview.txt'
    with open(filename, 'r+', encoding='utf-8') as f:
        rev_2 = f.read()
        #中文分词
        cut_douban = " ".join(jieba.cut(rev_2, cut_all=False))
        list_douban = cut_douban.split(' ')
        copy_list = []
        for word in list_douban:
            copy_list.append(word)
        #删除长度为1的文本
        for word in copy_list:
            if len(word) == 1:
                list_douban.remove(word)
    stop = []
    review_dic = Counter(list_douban)
    #利用文件删除一些意义不大的词
    file_stop = '删除.txt'
    with open(file_stop, 'r+', encoding='utf-8') as s:
        stop_1 = s.read()
        stop = stop_1.split('\n')
    #整理
    word_list = []
    for words, times in review_dic.items():
        if words in stop or times < 9:
            continue
        else:
            b_word = (words, times)
            word_list.append(b_word)
    #出图
    Chn_wordcloud = (WordCloud(init_opts=opts.InitOpts(
        theme=ThemeType.MACARONS)).add(
            "", word_list, word_size_range=[20, 100],
            shape="diamond").set_global_opts(
                title_opts=opts.TitleOpts(title=movie_name + " 中文词云图",
                                          subtitle=None),
                toolbox_opts=opts.ToolboxOpts(is_show=True)))

    #豆瓣用户评分图
    #读取数据
    with open(movie_name + '\\' + movie_name + 'dbscores.txt',
              'r+',
              encoding='utf-8') as m:
        allthings = m.read().split(',')
        del allthings[-1]
        all_date = []
        points_dic = {}
        #按评价进行分类
        for div in allthings:
            point, date = div.split()
            if date not in all_date:
                points_dic[date] = {
                    '很差': 0,
                    '较差': 0,
                    '还行': 0,
                    '推荐': 0,
                    '力荐': 0
                }
                all_date.append(date)
            if point == '很差':
                points_dic[date]['很差'] += 1
            elif point == '较差':
                points_dic[date]['较差'] += 1
            elif point == '还行':
                points_dic[date]['还行'] += 1
            elif point == '推荐':
                points_dic[date]['推荐'] += 1
            else:
                points_dic[date]['力荐'] += 1
        #处理数据
        data = []
        for month, grade in points_dic.items():
            for hzc, num in grade.items():
                counting = []
                counting.append(month)
                counting.append(num)
                counting.append(hzc)
                data.append(counting)
    #出图
    dbpoints = (ThemeRiver(init_opts=opts.InitOpts(
        theme=ThemeType.MACARONS)).add(
            ['很差', '较差', '还行', '推荐', '力荐'],
            data,
            singleaxis_opts=opts.SingleAxisOpts(type_="time",
                                                pos_bottom="10%"),
        ).set_global_opts(title_opts=opts.TitleOpts(title=movie_name +
                                                    " 豆瓣评价分布图",
                                                    subtitle=None),
                          toolbox_opts=opts.ToolboxOpts(is_show=True),
                          datazoom_opts=[
                              opts.DataZoomOpts(is_show=True,
                                                range_start=0,
                                                range_end=100)
                          ]))

    #IMDB评分图
    #处理爬取的数据
    with open(movie_name + '\\' + movie_name + 'Dscores.txt',
              'r+',
              encoding='utf-8') as m:
        allthings = m.read().split(',')
        del allthings[-1]
        all_date = []
        points_dic = {}
        #按分数进行分类
        for div in allthings:
            point, date = div.split()
            if date not in all_date:
                points_dic[date] = {'好评': 0, '中评': 0, '差评': 0}
                all_date.append(date)
            if int(point) <= 3:
                points_dic[date]['差评'] += 1
            elif int(point) >= 7:
                points_dic[date]['好评'] += 1
            else:
                points_dic[date]['中评'] += 1
        #整理便于出图
        data = []
        for month, grade in points_dic.items():
            for hzc, num in grade.items():
                counting = []
                counting.append(month)
                counting.append(num)
                counting.append(hzc)
                data.append(counting)
    #出图
    Dpoints = (ThemeRiver(init_opts=opts.InitOpts(
        theme=ThemeType.MACARONS)).add(
            ['好评', '中评', '差评'],
            data,
            singleaxis_opts=opts.SingleAxisOpts(type_="time",
                                                pos_bottom="10%"),
        ).set_global_opts(title_opts=opts.TitleOpts(title=movie_name +
                                                    " IMDB评价分布主题河流图",
                                                    subtitle=None),
                          toolbox_opts=opts.ToolboxOpts(is_show=True),
                          datazoom_opts=[
                              opts.DataZoomOpts(is_show=True,
                                                range_start=0,
                                                range_end=100)
                          ]))

    #热点图
    #读取城市数据
    with open(movie_name + '\\' + movie_name + 'dbplaces.txt',
              'r+',
              encoding='utf-8-sig') as f:
        heat_1 = f.read()
        for i in heat_1:
            if i in string.punctuation:
                heat_1 = heat_1.replace(i, "")
        heat = heat_1.split()
        heat_dic = Counter(heat)
    #处理一些热点图数据库中没有的城市(此txt还要不停壮大)
    with open('no city.txt', 'r+', encoding='utf-8-sig') as e:
        no_city = e.read()
        no_city_list = no_city.split(' ')
    #整理数据
    heat_list = []
    for place, times in heat_dic.items():
        if place in no_city_list:
            continue
        c_word = (place, times)
        heat_list.append(c_word)
        #出图,反复产生图,来处理乱填地区的情况
        try:
            heat_map = (Geo(init_opts=opts.InitOpts(
                theme=ThemeType.MACARONS)).add_schema(maptype="china").add(
                    "", heat_list).set_series_opts(label_opts=opts.LabelOpts(
                        is_show=False)).set_global_opts(
                            visualmap_opts=opts.VisualMapOpts(),
                            title_opts=opts.TitleOpts(title=movie_name +
                                                      " 豆瓣观影热点图",
                                                      subtitle=None),
                            toolbox_opts=opts.ToolboxOpts(is_show=True)))
        except:
            a = heat_list.pop(-1)

    #中文情感分析图
    with open(movie_name + '\\' + movie_name + "dbreview.txt",
              'r',
              encoding='utf-8') as f:
        #读取影评文件
        text = f.read()
        s = SnowNLP(text)
        chn_senti = []
        #进行情感分析并记录数据
        for sent in s.sentences:
            chn_senti.append(SnowNLP(sent).sentiments)
    times = {
        '0<=x<=0.25': 0,
        '0.25<x<=0.5': 0,
        '0.5<x<=0.75': 0,
        '0.75<x<=1': 0
    }
    for x in chn_senti:
        if x < 0 or x > 1:
            continue
        elif x <= 0.25:
            times['0<=x<=0.25'] += 1
        elif x <= 0.5:
            times['0.25<x<=0.5'] += 1
        elif x <= 0.75:
            times['0.5<x<=0.75'] += 1
        else:
            times['0.75<x<=1'] += 1
    scores_list = times.items()
    #出图
    ch_motion = (Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS)).add(
        "", scores_list, radius=["40%", "75%"]).set_global_opts(
            title_opts=opts.TitleOpts(title=movie_name + "豆瓣用户评论情感分析图",
                                      subtitle=None),
            toolbox_opts=opts.ToolboxOpts(is_show=True),
            legend_opts=opts.LegendOpts(orient="vertical",
                                        pos_top="15%",
                                        pos_left="2%"),
        ).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))

    #英文情感分析图
    with open(movie_name + '\\' + movie_name + "Dreview.txt",
              'r',
              encoding='utf-8') as f:
        #读取影评文件
        text = f.read()
        blob = TextBlob(text)
        eng_senti = []
        #进行情感分析并记录数据
        for sent in blob.sentences:
            eng_senti.append(sent.sentiment.polarity)
    time = {'-1<=x<=-0.5': 0, '-0.5<x<=0': 0, '0<x<=0.5': 0, '0.5<x<=1': 0}
    for x in eng_senti:
        if x < -1 or x > 1:
            continue
        elif x <= -0.5:
            time['-1<=x<=-0.5'] += 1
        elif x <= 0:
            time['-0.5<x<=0'] += 1
        elif x <= 0.5:
            time['0<x<=0.5'] += 1
        else:
            time['0.5<x<=1'] += 1
    score_list = time.items()
    #出图
    en_motion = (Pie(init_opts=opts.InitOpts(theme=ThemeType.MACARONS)).add(
        "", score_list, radius=["40%", "75%"]).set_global_opts(
            title_opts=opts.TitleOpts(title=movie_name + "IMDB用户评论情感分析图",
                                      subtitle=None),
            toolbox_opts=opts.ToolboxOpts(is_show=True),
            legend_opts=opts.LegendOpts(orient="vertical",
                                        pos_top="15%",
                                        pos_left="2%"),
        ).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")))

    #将图加入页面中
    page.add(dbmonth, Dmonth)
    page.add(Chn_wordcloud, Eng_wordcloud)
    page.add(dbpoints, Dpoints)
    page.add(ch_motion, en_motion)
    try:
        page.add(heat_map)
    except:
        pass
    page.render(movie_name + '\\' + movie_name + '数据图.html')
    "", [list(z) for z in zip(grade, f_30b)],
    rosetype="radius",
    radius=["30%", "55%"]).set_colors(color).set_global_opts(
        title_opts=opts.TitleOpts("고객 등급: 코로나 전 30대")).set_series_opts(label))
tl2.add(pie_2, "코로나 전 30대 여성")
pie_3 = (Pie().add(
    "", [
        list(z)
        for z in zip(['02 골드', '03 로얄', '04 그린', '05 블루', '09 등급없음'], f_30a)
    ],
    rosetype="radius",
    radius=["30%", "55%"]).set_colors(color).set_global_opts(
        title_opts=opts.TitleOpts("고객 등급: 코로나 후 30대")).set_series_opts(label))
tl2.add(pie_3, "코로나 후 30대 여성")

page = Page().add(tl, tl2)
page.render_notebook()

# 각 집단의 고객등급을 시각화 해보았습니다.
#
# 우선 코로나 이후 진입한 2,30대의 대다수가 자산이 1억 미만인 사람들임을 확인할 수 있습니다.
# 그리고 전체적으로 여성보다 남성이, 20대가 30대보다 자산 규모가 작습니다.
# 코로나 이전 20대의 등급분포와 코로나 이후 30대의 등급분포가 비슷한 것도 눈에 띕니다.

# 고객 별 거래빈도를 시각화해보았습니다.
#
# 집단간의 차이가 1 내외로, 크게 두드러지지 않습니다.

# In[30]:

#고객별 종목 산업 개수 시각화