frompyecharts.chartsimportBar,WordCloud,Line,Pie#分别是柱状图词云折现(曲线)饼图前端使用的是Django模板语言加载同一种模板使用Ajax从后端获取生成的图的json信息第一个Bar的代码可以如下所示
defbar_salary()->Bar():ress=partJobInfo.objects.all()salary_list=[]salary_dic={}foriinress:#这个for循环就是统计单价的所有信息ifi.priceand5<=i.price<=200:#这里去除脏数据ifi.priceinsalary_dic:salary_dic[i.price]+=1else:salary_dic[i.price]=1x=sorted(list(salary_dic.keys()))y=[salary_dic[i]foriinx]x=[str(i)foriinx]#要求输入的数据是字符串需要格式化一次try:salary_bar=(Bar().add_xaxis(x).add_yaxis("元/小时",y,color=Faker.rand_color()).set_global_opts(title_opts=opts.TitleOpts(title="数量"),datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(type_="inside")],).dump_options_with_quotes())exceptExceptionase:print(e)returnreturnsalary_bar饼图按照如下所示的代码返回json数据到前端前端使用这个数据进行可视化
defeducation_Pie()->Pie():ress=partJobInfo.objects.all()education_dic={}foriinress:ifi.educationineducation_dic:education_dic[i.education]+=1else:education_dic[i.education]=1c=(Pie().add("",list(education_dic.items()),center=["40%","50%"],).set_global_opts(title_opts=opts.TitleOpts(title="学历验饼图"),legend_opts=opts.LegendOpts(type_="scroll",pos_left="80%",orient="vertical"),).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}")).dump_options_with_quotes())returncLine的曲线图可以参照如下所示的代码
defdistrict_Line()->Line():ress=partJobInfo.objects.filter()dateTime_dic={}foriinress:ifi.dateTime.yearindateTime_dic:dateTime_dic[i.dateTime.year]+=1else:dateTime_dic[i.dateTime.year]=+1x_data=[iforiindateTime_dic.keys()]y_data=[dateTime_dic[i]foriinx_data]x_data=sorted(x_data)x_data=[str(i)foriinx_data]print(x_data)print(y_data)c=(Line().set_global_opts(tooltip_opts=opts.TooltipOpts(is_show=False),xaxis_opts=opts.AxisOpts(type_="category"),yaxis_opts=opts.AxisOpts(type_="value",axistick_opts=opts.AxisTickOpts(is_show=True),splitline_opts=opts.SplitLineOpts(is_show=True),),).add_xaxis(xaxis_data=x_data).add_yaxis(series_name="",y_axis=y_data,symbol="emptyCircle",is_symbol_show=True,is_smooth=True,label_opts=opts.LabelOpts(is_show=False),).dump_options_with_quotes())returnc词云图的计算非常消耗资源为了减少计算资源按照如下先生成词云所需要的wordCloud.json文件然后在每一次点击对应页面的时候,直接加载wordCloud.json文件进行可视化生成就按照如下的代码
importreclassPriceProcess:def__init__(self):self.result=partJobInfo.objects.all()defupdate_salary(self):foriinself.result:if"元/小时"ini.salary:hours=re.findall(r'\d+',i.salary)ifhours:i.price=float(self.processing(hours))i.save()else:passelif"元/天"ini.salary:day=re.findall(r'\d+',i.salary)ifday:price=float(self.processing(day,8))i.price=round(price,2)i.save()elif"元/月"ini.salary:month=re.findall(r'\d+',i.salary)ifmonth:price=float(self.processing(month,22*8))i.price=round(price,2)i.save()else:passelse:try:i.price=re.findall(r'\d+',i.salary)[0]i.save()exceptExceptionase:passdefprocessing(self,i_data,num=1):price_min=int(min(i_data))price_max=int(max(i_data))result_price=(price_max+price_min)/2/numreturnresult_pricedjango代码与浏览器交互模型
1.用户通过浏览器请求一个页面2.请求到达RequestMiddlewares,中间件对request做一些预处理或者直接response请求3.URLConf通过urls.py文件和请求的URL找到相应的View4.ViewMiddlewares被访问,它同样可以对request做一些处理或者直接返回response5.调用View中的函数6.View中的方法可以选择性的通过Models访问底层的数据7.所有的Model-to-DB的交互都是通过manager完成的8.如果需要,Views可以使用一个特殊的Context9.Context被传给Template用来生成页面a.Template使用Filters和Tags去渲染输出b.输出被返回到Viewc.HTTPResponse被发送到ResponseMiddlewaresd.任何ResponseMiddlewares都可以丰富response或者返回一个完全不同的responsee.Response返回到浏览器,呈现给用户