Python春晚数据分析

import xlrd
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from flask import Flask, jsonify, render_template, request
from pyecharts import *#pyecharts 0.5.0
from imageio import imread
app = Flask(__name__)

plt.rcParams['font.sans-serif']=['SimHei']#设置中文字体

class Exc():
    def __init__(self,filePath,sheetName):
        self.data=xlrd.open_workbook(filePath)#文件路径
        self.table=self.data.sheet_by_name(sheetName)#excel中的表名
        # 获取第一列的key值
        self.keys = self.table.row_values(0)
        # 获取总行数
        self.rowNum = self.table.nrows
        # 获取总列数
        self.colNum = self.table.ncols
        
    
    def draw(self,):
        cls={}#以年份为单位,计数各类型节目数量
        ycls={}#存放单独一年给类型节目数量,循环清空
        years=1983#初始年份1983,后随读取年份而变化
        zoncate={}#各类型节目总数量
        rna=[]#存放所有演员名单
        rname={}#存放所有演员及其登场次数
        rnamel=[]#list存放排序后的演员名单
        zoncatel=[]#list存放排序前后节目名单
        
        if self.rowNum<=1:
            print('无数据可取')
        else:
            r=[]
            j=1
            
            for i in range (self.rowNum-1):
                
                s={}
                values=self.table.row_values(j)#换行读取存数据
                #print(values)
                for x in range(self.colNum):#存各列数据
                    s[self.keys[x]]=values[x]
                if int(s[self.keys[3]])!=years:#判断是否为同一年节目
                    #print(years,'年各种节目数目:',cls)
                    years=int(s[self.keys[3]])
                    cls={}

                rna=s[self.keys[2]].split('、')#对单个节目的每个演员分开计数
                for i in rna:
                    try:
                        rname[i]+=1#记表演人名单及其出场次数
                    except:
                        rname[i]=1

                try:
                    cls[s[self.keys[0]]]+=1#计各种节目个数
                except:
                    cls[s[self.keys[0]]]=1
                try:
                    zoncate[s[self.keys[0]]]+=1#各节目类型总表演次数
                except:
                    zoncate[s[self.keys[0]]]=1
                j+=1#行数加一
                   
                r.append(s)
                ycls[years]=cls 
            rname.pop('')
            rnamel=zip(rname.values(),rname.keys())#对人次字典进行 键、值 分包,值放前
            
            zoncatel=zip(zoncate.values(),zoncate.keys())#对类次字典进行 键、值 分包,值放前
            
            rnamel=sorted(rnamel)#从小到大以包中在前的登场次数values排名
            #print(rnamel)
            zoncatel=sorted(zoncatel)
            #print('所有的节目种类次数:',zoncatel)
#-------------------------------------------------------
            rna=[]
            rnum=[]
            rna2=[]
            rnum2=[]
            catena=[]
            catenum=[]
            inyear=1983
            self.yearpie=years
            yearslist=list(range(1983,years+1))#创建一个年份列表 作为折线图x轴

            for i in rnamel[-10:]:
                rna.append(i[1])
                rnum.append(i[0])
            barr = Bar('排名前十的演员的登场次数')
            barr.add("演员", rna, rnum, mark_line=["average"],title='排名前十的演员的登场次数')
            #bar.render('排名前十的演员的登场次数.html')
            
            for i in rnamel:
                rna2.append(i[1])
                rnum2.append(i[0])
            rna2.remove('1]')
            rnum2.remove(1)

            cy=WordCloud('演员词云')
            
            cy.add('',rna2,rnum2,shape='circle')
            
            cy2=WordCloud('节目词云')
            cy2.add('',list(zoncate.keys()),list(zoncate.values()))
            
            for i in zoncatel[-10:]:
                catena.append(i[1])
                catenum.append(i[0])
            line=Line('\n排名前十节目的每年表演次数变化')
            
            for i in catena:
                plty=[]
                radern=[0]
                for j in yearslist:
                    try:
                        
                        plty.append(ycls[j][i])
                    except KeyError:
                        plty.append(0)
                #print(plty)
                #radern[0]=plty
                line.add(i, yearslist, plty, mark_point=["max", "min"],mark_line=["average"])
            
            #print(ycls)

            piez=Pie('\n1983-2018年各类节目表演次数饼图')
            piez.add('',catena,catenum, is_more_utils=True)
            self.yclspie=ycls
            #------------
            page=Page()
            page.add(cy)
            page.add(cy2)
            page.add(barr)
            page.add(line)
            page.add(piez)

                
            page.render("templates/历年春晚数据图表.html")

    def drawpie(self,ye):
        inyear = 1983
        pie = Pie('\n\n\n\n{}年各种节目数目对比'.format(ye))
        cnum = list(self.yclspie[ye].values())
        cname = list(self.yclspie[ye].keys())
        pie.add('{}年各种节目数目对比'.format(inyear), cname, cnum, radius=[30, 75], is_more_utils=True)
        pie.render('templates/{}年各种节目数目对比.html'.format(ye))

@app.route("/home")
def home():
    data.draw()
    return render_template("历年春晚数据图表.html")

@app.route("/index")
def index():
    return render_template("index.html")

@app.route("/year", methods=['GET', 'POST'])
def getValues():
    yearslist = list(range(1983, 2019))
    text = request.form.get('year')
    text = int(text)
    if text in yearslist:
        data.drawpie(text)
        return render_template('{}年各种节目数目对比.html'.format(text))
    else:
        return '不存在'
    
    
    
if __name__=='__main__':
    filePath="春晚节目单.xlsx"
    sheetName='春晚节目单'
    data=Exc(filePath,sheetName)
    #print(data.dict_data())
    #data.draw()
    app.run(host='127.0.0.1', port=8080, debug=True)
    #data.drawpie()




  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值