毕业设计:新能源汽车数据分析可视化系统+爬虫

1、项目介绍

技术栈:
Python语言、Django框架 、MySQL数据库、Vue框架、Scrapy爬虫、Echarts可视化、懂车帝网数据

2、项目界面

(1)车型详情页

![在这里

3、项目说明

基于Django框架和Vue框架的新能源汽车数据采集分析可视化系统是一个用于收集、分析和展示新能源汽车相关数据的系统。该系统利用Django框架作为后端开发工具,使用Vue框架构建前端界面,旨在为用户提供一个直观、易用的数据分析和可视化平台。

该系统的主要功能包括数据采集、数据处理、数据分析和数据可视化。首先,系统通过与新能源汽车相关的传感器和设备进行连接,实时采集各种数据,例如电池状态、充电效率和车辆行驶数据等。然后,系统将采集到的原始数据进行预处理和清洗,以确保数据的准确性和完整性。

接下来,系统利用分析算法和模型对数据进行分析,提取出有价值的信息和洞察,并生成相应的报告和图表。用户可以根据自己的需求选择不同的分析方法和指标,以深入了解新能源汽车的性能和效率。

最后,系统通过可视化方式将分析结果展示给用户。用户可以通过直观的图表、图形和地图来查看数据的趋势、变化和关联性。此外,系统也提供了交互式的功能,用户可以根据自己的兴趣和需求进行数据的筛选、排序和比较。

总之,基于Django框架和Vue框架的新能源汽车数据采集分析可视化系统是一个功能强大、易用的工具,能够帮助用户深入理解和分析新能源汽车相关数据,为相关领域的决策提供支持。

4、部分代码




def to_dict(l, exclude=tuple(), single=False):
    # 将数据库模型 变为 字典数据 的工具类函数
    def transform(v):
        if isinstance(v, datetime):
            return v.strftime("%Y-%m-%d %H:%M:%S")
        return v

    def _todict(obj):
        j = {
            k: transform(v)
            for k, v in obj.__dict__.items()
            if not k.startswith("_") and k not in exclude
        }
        return j

    if single:
        return _todict(l)
    return [_todict(i) for i in l]


def all_grouped_brands(request):
    """
    返回按拼音分组的所有品牌的JSON响应。

    Args:
        request (HttpRequest): HTTP请求对象。

    Returns:
        JsonResponse: 按拼音分组的所有品牌的JSON响应。
    """
    # 获取请求数据
    data = request.json

    # 获取所有品牌并转换为字典
    brands = to_dict(Brand.objects.all().order_by("pinyin", "-on_sale_series_count"))

    # 按拼音分组品牌
    result = [(i[0], list(i[1])) for i in groupby(brands, key=lambda x: x["pinyin"])]

    # 返回JSON响应
    return JsonResponse(result, safe=False)


def query_car_series(request):
    """根据请求参数查询车系。

    Args:
        request (HttpRequest): HTTP请求。

    Returns:
        JsonResponse: 包含车系的JSON响应。
    """
    # 获取请求参数
    body = request.json
    pagesize = body.get("pagesize", 10)
    page = body.get("page", 1)
    exclude_fields = ["pagesize", "page", "total", "orderby"]
    orderby = body.get("orderby")

    # 从请求参数构建查询
    query = {k: v for k, v in body.items() if k not in exclude_fields and v}
    q = Q(**query)

    # 获取车系对象并对结果进行分页
    objs = CarSeries.objects.filter(q).order_by(orderby)
    paginator = Paginator(objs, pagesize)

    # 获取指定页面并将结果转换为字典列表
    try:
        pg = paginator.page(page)
        result = list(pg.object_list)
    except Exception as e:
        result = []

    result = to_dict(result)

    # 将结果作为JSON响应返回
    return JsonResponse({"total": paginator.count, "records": result})


def lasted_sales_rank_months(request):
    months = list(
        CarSale.objects.values_list("month", flat=True)
        .order_by("-month")
        .distinct()[:24]
    )
    return JsonResponse(months, safe=False)


def lasted_sales_issue_months(request):
    months = list(
        CarIssue.objects.values_list("stime", flat=True)
        .order_by("-stime")
        .distinct()[:24]
    )
    return JsonResponse(months, safe=False)


def car_rank(request):
    body = request.json
    id = body.get("id")
    return _car_rank(id)


@lru_cache()
def _car_rank(id):
    # 获取当前日期及1年前的日期
    today = datetime.now().date()
    one_year_ago = today - timedelta(days=365)
    # 设置查询条件
    q = Q(month__gte=one_year_ago.strftime("%Y%m"), month__lte=today.strftime("%Y%m"))
    result = (
        CarSale.objects.filter(q)
        .values("series_id", "series_name")
        .annotate(total_sales=Sum("rank_value"))
        .filter(total_sales__gt=0)
        .order_by("-total_sales")
    )
    sales_rank = next(
        (
            i
            for i, e in enumerate(
                result,
                start=1,
            )
            if e["series_id"] == int(id)
        ),
        -1,
    )
    # ---------
    # 获取当前日期及1年前的日期
    q = Q(
        stime__gte=one_year_ago.strftime("%Y-%m-%d"),
        stime__lte=today.strftime("%Y-%m-%d"),
    )
    result = (
        CarIssue.objects.filter(q)
        .values("series_id", "series_name")
        .annotate(total_issues=Sum("count"))
        .filter(total_issues__gt=0)
        .order_by("-total_issues")
    )
    issue_rank = next(
        (
            i
            for i, e in enumerate(
                result,
                start=1,
            )
            if e["series_id"] == int(id)
        ),
        -1,
    )

    return JsonResponse(dict(sales_rank=sales_rank, issue_rank=issue_rank))


def car_sales_rank(request):
    # 获取请求体中的数据
    body = request.json
    # 获取请求体中的月份
    month = body.get("month")
    # 定义查询条件
    q = Q()
    # 根据月份设置查询条件
    if month == "1y":
        # 获取当前日期及1年前的日期
        today = datetime.now().date()
        one_year_ago = today - timedelta(days=365)
        # 设置查询条件
        q &= Q(
            month__gte=one_year_ago.strftime("%Y%m"), month__lte=today.strftime("%Y%m")
        )
    elif month == "6m":
        # 近半年,即6个月
        today = datetime.now().date()
        half_year_ago = today - timedelta(days=365 // 2)
        # 设置查询条件
        q &= Q(
            month__gte=half_year_ago.strftime("%Y%m"), month__lte=today.strftime("%Y%m")
        )
    else:
        q &= Q(month=month)
    # 统计各个车系一年内的总销量,并按照销量进行排序和排名
    result = (
        CarSale.objects.filter(q)
        .values("series_id", "series_name")
        .annotate(total_sales=Sum("rank_value"))
        .order_by("-total_sales")
    )
    # 对结果进行排名
    result_list = list(result)
    for i, item in enumerate(result_list):
        item["sales_rank"] = i + 1
    # 分页处理数据
    pagesize = body.get("pagesize", 20)
    page_num = body.get("page", 1)
    paginator = Paginator(result_list, pagesize)  # 创建Paginator对象
    page = paginator.get_page(page_num)  # 获取指定页码的数据
    result = list(page.object_list)
    # 获取每个车系的详细信息,并将其添加到结果中
    for i in result:
        car_series = to_dict([CarSeries.objects.get(series_id=i["series_id"])])[0]
        i.update(**car_series)
    # 返回分页后的结果
    return JsonResponse({"total": paginator.count, "records": result})


def car_issue_rank(request):
    body = request.json
    stime = body.get("stime")
    type = body.get("type")
    q = Q()
    if stime == "1y":
        # 获取当前日期及1年前的日期
        today = datetime.now().date()
        one_year_ago = today - timedelta(days=365)
        q &= Q(
            stime__gte=one_year_ago.strftime("%Y-%m-%d"),
            stime__lte=today.strftime("%Y-%m-%d"),
        )
    elif stime == "6m":
        # 近半年,即6个月
        today = datetime.now().date()
        half_year_ago = today - timedelta(days=365 // 2)
        q &= Q(
            stime__gte=half_year_ago.strftime("%Y-%m-%d"),
            stime__lte=today.strftime("%Y-%m-%d"),
        )
    else:
        q &= Q(stime=stime)
    if type:
        q &= Q(type=type)
    # 统计各个车系一年内的总问题数,并按照问题数进行排序和排名
    result = (
        CarIssue.objects.filter(q)
        .values("series_id", "series_name")
        .annotate(total_issues=Sum("count"))
        .order_by("-total_issues")
    )

    # 对结果进行排名
    result_list = list(result)
    for i, item in enumerate(result_list):
        item["issues_rank"] = i + 1

    # 分页处理数据
    pagesize = body.get("pagesize", 20)
    page_num = body.get("page", 1)
    paginator = Paginator(result_list, pagesize)  # 创建Paginator对象
    page = paginator.get_page(page_num)  # 获取指定页码的数据
    result = list(page.object_list)
    for i in result:
        car_series = to_dict([CarSeries.objects.get(series_id=i["series_id"])])[0]
        counter = Counter()
        for x in CarIssue.objects.filter(q, series_id=i["series_id"]).values_list(
            "dxwt", flat=True
        ):
            counter.update(dict([(j["ctiTitle"], j["count"]) for j in x]))
        i["issues"] = counter.most_common(10)
        i.update(**car_series)
    return JsonResponse({"total": paginator.count, "records": result})



源码获取:

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值