ssj兼职数据Django+pyecharts可视化展示

展示结果

针对以上几种图分别使用的是


from pyecharts.charts import Bar, WordCloud, Line,Pie# 分别是 柱状图  词云 折现(曲线) 饼图

前端使用的是Django模板语言 加载同一种模板 使用Ajax从后端获取生成的图的json信息
第一个Bar的代码可以如下所示

def bar_salary() -> Bar():
    ress = partJobInfo.objects.all()
    salary_list = []
    salary_dic = {}
    for i in ress:#这个for循环就是统计单价的所有信息
        if i.price and 5 <= i.price <= 200:#这里去除脏数据
            if i.price in salary_dic:
                salary_dic[i.price] += 1
            else:
                salary_dic[i.price] = 1
    x = sorted(list(salary_dic.keys()))
    y = [salary_dic[i] for i in x]
    x = [str(i) for i in x] #要求输入的数据是字符串需要格式化一次
    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()
        )
    except Exception as e:
        print(e)
        return
    return salary_bar

饼图按照如下所示的代码返回json数据到前端 前端使用这个数据进行可视化

def education_Pie() -> Pie():
    ress = partJobInfo.objects.all()
    education_dic = {}
    for i in ress:
        if i.education in education_dic:
            education_dic[i.education] += 1
        else:
            education_dic[i.education] = 1
    c = (
        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()
    )
    return c

Line的曲线图可以参照如下所示的代码


def district_Line() -> Line():
    ress = partJobInfo.objects.filter()
    dateTime_dic = {}
    for i in ress:
        if i.dateTime.year in dateTime_dic:
            dateTime_dic[i.dateTime.year] += 1
        else:
            dateTime_dic[i.dateTime.year] = +1
    x_data = [i for i in dateTime_dic.keys()]
    y_data = [dateTime_dic[i] for i in x_data]
    x_data = sorted(x_data)
    x_data = [str(i) for i in x_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()
    )

    return c

词云图的计算非常消耗资源为了减少计算资源 按照如下 先生成词云所需要的wordCloud.json文件 然后在每一次点击对应页面的时候,直接加载wordCloud.json文件进行可视化生成
就按照如下的代码

def worldCloudmy():
    import jieba
    from sklearn.feature_extraction.text import CountVectorizer
    ress = partJobInfo.objects.all()#filter(~Q(positionDesc='desc'))
    content = ''
    for s in ress:
        content += s.desc
    comment_after_split = jieba.cut(str(content), cut_all=False)
    wl_space_split = " ".join(comment_after_split)
    cv = CountVectorizer()
    words = []
    contents_count = cv.fit_transform([wl_space_split])
    # 词有哪些
    list1 = cv.get_feature_names()
    # 词的频率
    list2 = contents_count.toarray().tolist()[0]
    contents_dict = dict(zip(list1, list2))
    for key, value in contents_dict.items():
        words.append((key, value))
    json_path = os.path.join(base_dir,"app01","wordCloud.json")
    with open(json_path,"w", encoding="utf8") as f:
        f.write(json.dumps(words, ensure_ascii=False))


def word_cloud() -> WordCloud():
    json_path = os.path.join(base_dir, "wordCloud.json")
    with open(json_path, "r", encoding="utf8") as f:
        word = json.load(f)
    c = (
        WordCloud()
            .add(
            "",
            word,
            word_size_range=[20, 100],
            textstyle_opts=opts.TextStyleOpts(font_family="cursive"),
        )
            .set_global_opts(title_opts=opts.TitleOpts(title="WordCloud"))
            .dump_options_with_quotes()
    )
    return c

价格数据清洗的代码如下所示

import re


class PriceProcess:
    def __init__(self):
        self.result = partJobInfo.objects.all()

    def update_salary(self):
        for i in self.result:
            if "元/小时" in i.salary:
                hours = re.findall(r'\d+', i.salary)
                if hours:
                    i.price = float(self.processing(hours))
                    i.save()
                else:
                    pass
            elif "元/天" in i.salary:
                day = re.findall(r'\d+', i.salary)
                if day:
                    price = float(self.processing(day, 8))
                    i.price = round(price, 2)
                    i.save()

            elif "元/月" in i.salary:
                month = re.findall(r'\d+', i.salary)
                if month:
                    price = float(self.processing(month, 22 * 8))
                    i.price = round(price, 2)
                    i.save()
                else:
                    pass
            else:
                try:
                    i.price = re.findall(r'\d+', i.salary)[0]
                    i.save()
                except Exception as e:
                    pass

    def processing(self, i_data, num=1):
        price_min = int(min(i_data))
        price_max = int(max(i_data))
        result_price = (price_max + price_min) / 2 / num
        return result_price

django代码与浏览器交互模型

数据流程图

1. 用户通过浏览器请求一个页面
2. 请求到达Request Middlewares,中间件对request做一些预处理或者直接response请求
3. URLConf通过urls.py文件和请求的URL找到相应的View
4. View Middlewares被访问,它同样可以对request做一些处理或者直接返回response
5. 调用View中的函数
6. View中的方法可以选择性的通过Models访问底层的数据
7. 所有的Model-to-DB的交互都是通过manager完成的
8. 如果需要,Views可以使用一个特殊的Context
9. Context被传给Template用来生成页面
a. Template使用Filters和Tags去渲染输出
b. 输出被返回到View
c. HTTPResponse被发送到Response Middlewares
d. 任何Response Middlewares都可以丰富response或者返回一个完全不同的response
e. Response返回到浏览器,呈现给用户

其他详情请联系本人simp00@163.com

posted @ 2021-04-13 16:05  simp00  阅读(487)  评论(0编辑  收藏  举报