Python高分数据可视化分析(网易云热评音乐数据分析)

本文介绍了使用Django开发的一个项目,实现了用户登录注册、个人信息管理、歌单数据可视化(包括点赞量、评论量、收藏量等)以及歌曲类型和热门程度的统计。项目还展示了词云图,帮助用户直观了解歌曲的热门特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目介绍:

项目名称:基于Django的网易云热评歌单数据可视化分析;项目实现功能:用户登陆注册,用户个人信息编辑修改,数据总览以及实现歌单的收藏,针对歌单的点赞量,评论量,收藏量,歌曲量,歌单类型等系列数据参数对数据进行可视化分析。

项目技术简介:

登陆注册:

# 01用户登录
def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    if request.method == 'POST':
        name = request.POST.get('name')
        password = request.POST.get('password')
        if User.objects.filter(username=name, password=password):
            user=User.objects.get(username=name, password=password)
            username=request.session['username'] = {'username':user.username,'avatar':str(user.avatar)}
            return redirect('index')
        else:
            msg = '信息错误!'
            return render(request, 'login.html', {"msg": msg})

# 02用户注册
def register(request):
    if request.method == 'POST':
        name = request.POST.get('name')
        password = request.POST.get('password')
        phone = request.POST.get('phone')
        email = request.POST.get('email')
        avatar = request.FILES.get('avatar')
        stu = User.objects.filter(username=name)
        if stu:
            msg = '用户已存在!'
            return render(request, 'register.html', {"msg": msg})
        else:
            User.objects.create(username=name,password=password,phone=phone,email=email,avatar=avatar)
            msg = "注册成功!"
            return render(request, 'login.html', {"msg": msg})
    if request.method == 'GET':
        return render(request,'register.html')

用户登录 (login 函数)

  1. GET 请求:当用户访问登录页面时,视图函数会返回登录页面模板。

  2. POST 请求:当用户提交登录表单时,视图函数会获取表单中提交的用户名和密码。

  3. 使用 User.objects.filter(username=name, password=password) 进行用户名和密码的验证。这里使用了 filter() 方法而不是 get() 方法,因为 filter() 方法会返回一个 QuerySet,即使没有匹配项也不会引发异常。

  4. 如果存在匹配的用户,则将用户对象赋值给 user 变量,并将用户名和头像信息存储在会话(session)中,然后重定向到首页。

  5. 如果用户名或密码错误,视图函数将返回登录页面,并在页面上显示错误信息。

用户注册 (register 函数)

  1. POST 请求:当用户提交注册表单时,视图函数会获取表单中提交的用户名、密码、电话、邮箱和头像信息。

  2. 使用 User.objects.filter(username=name) 检查用户名是否已经存在于数据库中。

  3. 如果用户名已经存在,则返回注册页面,并在页面上显示错误信息。

  4. 如果用户名不存在,使用 User.objects.create() 创建新用户,并将用户信息存储到数据库中。

  5. 注册成功后,返回登录页面,并在页面上显示注册成功的消息。

    def tableData(request):
        username = request.session.get("username").get('username')
        useravatar = request.session.get("username").get('avatar')
        userInfo = User.objects.get(username=username)
        tableData = Songs.objects.all()
        paginator = Paginator(tableData, 10)
        # 根据请求地址的信息来跳转页码数据
        cur_page = 1
        if request.GET.get("page"):
            cur_page = int(request.GET.get("page"))
        if cur_page:
            c_page = paginator.page(cur_page)
        else:
            c_page = paginator.page(1)
        page_range = []
        visibleNumber = 10
        min = int(cur_page - visibleNumber / 2)
        if min < 1:
            min = 1
        max = min + visibleNumber
        if max > paginator.page_range[-1]:
            max = paginator.page_range[-1]
        for i in range(min,max):
            page_range.append(i)
        return render(request, 'tableData.html',{
            'username': username,
            'useravatar': useravatar,
            'userInfo': userInfo,
            'tableData':tableData,
            "pagination":paginator,
            "c_page":c_page,
            'page_range':page_range
        })
    
    
    def historyTableData(request):
        username = request.session.get("username").get('username')
        userInfo = User.objects.get(username=username)
        historyData = Histroy.objects.all()
        return render(request,'historyTableData.html',{
            'userInfo': userInfo,
            'historyData':historyData
        })
    def addHistory(request,songId):
        username = request.session.get("username").get('username')
        userInfo = User.objects.get(username=username)
        getHistoryTableData.addHistory(userInfo,songId)
        return redirect('historyTableData')
    

tableData 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 使用 User.objects.get(username=username) 通过用户名获取用户的详细信息。
  • 获取所有歌曲数据,使用 Songs.objects.all()
  • 使用 Django 的 Paginator 对歌曲数据进行分页处理,每页显示 10 条记录。
  • 通过 request.GET.get("page") 获取当前请求的页码,然后通过 paginator.page(cur_page) 获取当前页的记录。
  • 计算页码范围(page_range),用于在页面上显示页码导航。页码范围根据当前页码和一个固定的可见页码数量(visibleNumber)来计算。
  • 将收集到的所有信息通过上下文传递给 tableData.html 模板并渲染页面。

 historyTableData 函数:

  • 类似于 tableData 函数,从会话中获取当前登录用户的用户名,并获取用户的详细信息。
  • 获取所有历史记录数据,使用 History.objects.all()
  • 将用户信息和历史记录数据通过上下文传递给 historyTableData.html 模板并渲染页面。

addHistory 函数:

  • 从会话中获取当前登录用户的用户名,并获取用户的详细信息。
  • addHistory(userInfo, songId) 似乎是一个尝试将指定歌曲 ID 与当前用户的历史记录关联的操作。但是,代码中没有提供 getHistoryTableData.addHistory 的实现细节,因此无法具体解释其功能。假设它是用来添加一个新的历史记录项到数据库中。
  • 完成添加历史记录后,通过 redirect('historyTableData') 重定向到历史记录页面。
def songDistribute(request):
    username = request.session.get("username").get('username')
    useravatar = request.session.get("username").get('avatar')
    songs = Songs.objects.all();dict1={};result1=[];dict2={};result2=[];
    for i in songs:
        if dict1.get(i.tag,-1)==-1:
            dict1[i.tag]=1
        else:
            dict1[i.tag]+=1
    for k,v in dict1.items():
        result1.append({
            'value': v,
            "name":k
        })
    for i in songs:
       if dict2.get(datetime.strptime(str(i.time), '%Y-%m-%d').year,-1)==-1:
           dict2[datetime.strptime(str(i.time), '%Y-%m-%d').year]=1
       else:
           dict2[datetime.strptime(str(i.time), '%Y-%m-%d').year]+=1
    for k,v in dict2.items():
        result2.append({
            'value': v,
            "name":k
        })
    context={'result1':result1,'result2':result2,'username':username,'useravatar':useravatar}
    return render(request,'songDistribute.html',context)
def songScore(request):
    username = request.session.get("username").get('username')
    useravatar = request.session.get("username").get('avatar')
    songs1=Songs.objects.all().order_by('-playcount')[0:10]
    songs2=Songs.objects.all().order_by('-commentcount')[0:10]
    data1=['收藏量','分享量','评论量'];data2=['收藏量','播放量','分享量']
    list1=[];list2=[];list3=[];list4=[];list5=[];list6=[];list7=[];list8=[];
     # 取得评分前10的景点名称
    for p in songs1:
        list1.append(p.collectcount);list2.append(p.sharecount);list3.append(p.commentcount);list4.append(p.title)
    for p in songs2:
        list5.append(p.playcount);list6.append(p.collectcount);list7.append(p.sharecount);list8.append(p.title)
    context={'data1':data1,'data2':data2,'list1':list1,'list2':list2,'list3':list3,'list4':list4,'list5':list5,'list6':list6,'list7':list7,'list8':list8,'username':username,'useravatar':useravatar}
    return render(request,'songScore.html',context)
def songwordcloud(request):
    username = request.session.get("username").get('username')
    useravatar = request.session.get("username").get('avatar')
    # wouldCloud.wouldCloudMain()
    context = {'username':username,'useravatar':useravatar}
    return render(request,'songwordcloud.html',context)

def songtyperank(request):
    username = request.session.get("username").get('username')
    useravatar = request.session.get("username").get('avatar')
    list1_legend=[];list1=[];list2_legend=[];list2=[];list3_legend=[];list3=[]
    type1songs=Songs.objects.all().filter(tag='华语').order_by('-playcount')[:10]
    type2songs=Songs.objects.all().filter(tag='欧美').order_by('-playcount')[:10]
    type3songs=Songs.objects.all().filter(tag='日语').order_by('-playcount')[:10]
    for p in type1songs:
        list1_legend.append(p.title)
        list1.append({'value':p.playcount,'name':p.title})
    for p in type2songs:
        list2_legend.append(p.title)
        list2.append({'value':p.playcount,'name':p.title})
    for p in type3songs:
        list3_legend.append(p.title)
        list3.append({'value':p.playcount,'name':p.title})
    context={'username':username,'useravatar':useravatar,'list1_legend':list1_legend,'list1':list1,'list2_legend':list2_legend,'list2':list2,'list3_legend':list3_legend,'list3':list3}
    return render(request, 'songtyperank.html', context)

songDistribute 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 获取所有歌曲数据,使用 Songs.objects.all()
  • 统计歌曲的标签(tag)和年份信息,分别存储在 dict1 和 dict2 字典中,并将统计结果转换成适合图表展示的格式。
  • 将处理后的数据传递给模板,并渲染 songDistribute.html 页面。

songScore 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 获取收藏量、分享量、评论量和播放量排名前 10 的歌曲数据,并将其存储在 songs1 和 songs2 列表中。
  • 将数据组织成适合图表展示的格式,并传递给模板,以便在页面上显示歌曲的评分情况。

songwordcloud 函数:

这个函数的目的是生成歌曲标题和标签的词云图,用于展示歌曲标题和标签的热门关键词。在实际应用中,可以在页面上展示这些词云图,以便用户更直观地了解歌曲的热门主题和标签。

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 导入必要的模块和库,包括 Songs 模型、matplotlib 绘图库、jieba 中文分词库以及 WordCloud 词云库。

  • 从数据库中获取所有歌曲数据,使用 Songs.objects.all()

  • 遍历每首歌曲,将歌曲标题和标签(tag)拼接成一个长字符串,并使用 jieba 分词库对其进行分词处理。

  • 从文件中读取停用词(stopwords),这些词通常是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉的词语,如“的”、“了”、“是”等。

  • 对分词后的结果进行处理,去除停用词,并统计词频,将其保存在 word_dict 字典中。

  • 使用 WordCloud 词云库生成词云图,设置字体、背景颜色和尺寸等参数,并调用 generate_from_frequencies 方法根据词频生成词云图。

  • 使用 matplotlib 绘制词云图,并将其保存为静态文件(如 JPEG 格式的图片)。

  • 重复以上步骤,分别生成歌曲标签的词云图,并保存为另一个静态文件。

  • 将用户信息传递给模板,以便在页面上显示。

songtyperank 函数:

  • 从会话(session)中获取当前登录用户的用户名和头像信息。
  • 获取华语、欧美和日语歌曲的播放量排名前 10 的数据,并将其存储在 type1songstype2songs 和 type3songs 列表中。
  • 将数据组织成适合图表展示的格式,并传递给模板,以便在页面上显示不同类型歌曲的播放排行。

 项目运行效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小熊Coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值