简易数据分析--豆瓣电影(pandas+pyecharts)

一.数据

通过爬虫爬取豆瓣的top250,爬取数据(排名,片名,导演,上影时间,国家,类型,演员,时长,评分,页面)
在这里插入图片描述

二.处理数据

1.导入数据

data = pd.read_csv('data.csv')
data.head()

在这里插入图片描述

2.进行年月分析

统计出不同年份的电影数量
year = data.groupby('上影时间')['上影时间'].count()
#或者用year = data['上影时间'].value_counts()
year

在这里插入图片描述

利用pyecharts进行数据展示(折线图)

pycharts中文使用手册(注意版本):http://pyecharts.org/#/zh-cn/intro

import pyecharts.options as opts
from pyecharts.charts import Line
#注意缩进问题

c = (
    Line()
        .add_xaxis(list(year.index))
        .add_yaxis("年份", list(year))
        .set_global_opts(title_opts=opts.TitleOpts(title="电影年份分析*折线图"))
    .render_notebook()
)
c

在这里插入图片描述

3.进行国家分析

简单处理国家的数据
data['国家'][:50]

在这里插入图片描述
由于有些电影是合拍的,出现多个国家的选取第一个出现的,若出现有’中国‘的统计为中国(比如中国大陆 中国香港),利用map方法,还要注意去掉空格(否则会出现重复的数据)

def get_country(i):
    str = '中国'
    if str in i:
        return str
    else:
        return i.split(' ')[0].strip()
data['country'] = data['国家'].map(get_country)
data['country'][0:50]

在这里插入图片描述

进行统计数量
country = data.groupby('country')['country'].count()
country

在这里插入图片描述

利用pyecharts进行数据展示(饼图)
from pyecharts import options as opts
from pyecharts.charts import Pie

c = (
        Pie()
        .add("", [list(z) for z in zip(list(country.index), list(country))])
        .set_global_opts(title_opts=opts.TitleOpts(title="国家"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .render_notebook()
    )
c

在这里插入图片描述
效果不太好,应该只选取前10的作为展示更好

4.对演员进行分析

处理演员数据

由于同一部电影有多个主演,所以将演员一列全部放入同一个字符串,然后再进行分割

all_actors = ""
for i in range(250):
    #最后一个可能会变float型
    if isinstance(data.iloc[i,6],str):
#     print(type(all_actors),type(data.iloc[i,6]))
        all_actors += data.iloc[i,6]
print(all_actors)

在这里插入图片描述

actors = all_actors.split(' ')
actors

在这里插入图片描述
利用counter进行统计演员出现的次数

from collections import Counter
dict_actors = Counter(actors)
# dict_actors
#最后一个会空,注意
del dict_actors['']
dict_actors

在这里插入图片描述
选取出现次数前十的演员

top10 = dict_actors.most_common(10)
top10

在这里插入图片描述
提取演员和出现的次数

attr = []
v = []
for i in top10:
    attr.append(i[0])
    v.append(i[1])

在这里插入图片描述

利用pycharts进行数据展示(饼图)
c = (
        Pie()
        .add("", [list(z) for z in zip(attr, v)])
        .set_global_opts(title_opts=opts.TitleOpts(title="演员"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
        .render_notebook()
    )
c

在这里插入图片描述

# -*- coding: utf-8 -*- import pandas as pd from pyecharts import options as opts from pyecharts.charts import Line,Bar,Funnel,Pie from pyecharts.components import Table from pyecharts.options import ComponentTitleOpts from sqlalchemy import create_engine from pyecharts.charts import Page from pyecharts.charts import WordCloud from collections import Counter import jieba import re # 创建数据库连接 engine = create_engine('mysql+pymysql://root:123456@localhost/doubandata') #1. #2. def line_chart2(): # 从数据库中读取数据 query = "SELECT show_time FROM t_music" df = pd.read_sql(query, engine) # 处理日期数据,提取年份 df['year'] = pd.to_datetime(df['show_time'], errors='coerce').dt.year # 统计每年的歌曲发行数量 year_counts = df['year'].dropna().astype(int).value_counts().sort_index() # 准备数据用于生成折线图 years = year_counts.index.astype(str).tolist() counts = year_counts.values.tolist() # 创建折线图 line = Line(init_opts=opts.InitOpts(width="1600px", height="800px")) line.add_xaxis(years) line.add_yaxis("歌曲发行数量", counts, label_opts=opts.LabelOpts(is_show=True, position="top")) # 设置全局配置项 line.set_global_opts( title_opts=opts.TitleOpts(title="每年歌曲发行数量统计"), xaxis_opts=opts.AxisOpts(type_="category", name="年份"), yaxis_opts=opts.AxisOpts(type_="value", name="发行数量"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross") ) # 渲染图表到HTML文件 line.render("2.song_release_counts_by_year.html") return line #3. def line_chart3(): # 从数据库中读取数据 query = "SELECT show_time, score FROM t_music" df = pd.read_sql(query, engine) # 将 score 列转换为数值类型,无法转换的会变为 NaN df['score'] = pd.to_numeric(df['score'], errors='coerce') # 处理日期数据,提取年份 df['year'] = pd.to_datetime(df['show_time'], errors='coerce').dt.year # 删除无效数据(如日期或评分为空) df = df.dropna(subset=['year', 'score']) # 按年份分组计算每年的平均评分,保留一位小数 yearly_avg_scores = df.groupby('year')['score'].mean().round(1).sort_index() # 准备数据用于生成折线图 years = yearly_avg_scores.index.astype(int).astype(str).tolist() # 确保年份为整数且不带小数点 avg_scores = yearly_avg_scores.values.tolist() # 创建折线图 line = Line(init_opts=opts.InitOpts(width="1600px", height="800px")) line.add_xaxis(years) line.add_yaxis("平均评分", avg_scores, label_opts=opts.LabelOpts(is_show=True, position="top")) # 设置全局配置项 line.set_global_opts( title_opts=opts.TitleOpts(title="每年歌曲发行的平均评分"), xaxis_opts=opts.AxisOpts(type_="category", name="年份"), yaxis_opts=opts.AxisOpts(type_="value", name="平均评分", min_=7, max_=10), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross") ) # 渲染图表到 HTML 文件 line.render("3.song_release_scores_by_year.html") return line page = Page( page_title="基于Python的豆瓣音乐数据分析与可视化", layout=Page.DraggablePageLayout, # 拖拽方式 ) page.add_js_funcs( """ document.body.style.backgroundColor = '#f0f8ff'; // 设置背景颜色为淡蓝色 """ ) # 添加图表到页面 page.add( # 绘制折线图 line_chart2(), line_chart3(), # 绘制表格 ) # 渲染大屏到临时HTML文件 page.render('大屏_临时1.html') 怎么生成好看个性化的可视化大屏网页
最新发布
03-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值