赞
踩
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。