aotushijie 2022-06-21 15:52 采纳率: 60%
浏览 40
已结题

Python轮播图只出现一个年份的

数据

import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd

#通过requests请求到电影票房的页面
text = requests.get(url="http://www.piaofang.biz/")
text.encoding = text.apparent_encoding
#print(text.text)

#通过BeautifulSoup解析:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple beautifulsoup4
main_page = BeautifulSoup(text.text,"html.parser")
#html的解析器
#找到table
table = main_page.find("table")
#
f = open("电影票房.csv",mode="w",encoding='utf-8',newline="")
trs = table.find_all("tr")

#拿到每一个tr
for tr in trs:
    lst = tr.find_all("td")#找到每一个td
    if len(lst) != 0:
        for td in lst:
         #  print(td.text)
           f.write(td.text.strip().replace(',','').strip().replace('$',''))#strip默认去掉左右两边的空白,replace替换数据中的逗号
           f.write(',')
        f.write("\n")

f.close()

数据分析加画图

import numpy as np
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Pie,Bar,Timeline
###数据提取
data = pd.read_csv("电影票房.csv",encoding = 'utf-8',header=None)


# print(data)

#那到1,2中的数据

data = data.loc[:, [2,3]] #逗号前面的是行,表示都要     后面的表示是列,只要3.5     loc[:, 1:4] 1-4列出现
# print(data)
#拆分类别数据
def func1(item):    #/前面的类别
    #把类别单独拎出来,数据处理
    return  item.split('/')[0]#切割类别


def func2(item):     #/后面的类别
    #把类别单独拎出来,数据处理
    if "/" in item:
        return  item.split("/")[1]#切割类别
    else:
        return "lxy"



data[6] = data[3].map(func1) #将多出的类别在起一列   后面的是原本的列
data[7] = data[3].map(func2)
# print(data)

#把数据拆分开
data_1 = data.loc[:, [2, 6]]
data_2 = data.loc[:, [2, 7]]
data_2 = data_2.loc[data_2[7] != 'lxy']#将data_2中所有’lxy‘的数据删除
data_2 = data_2.rename(columns={7:6})  #将data_2中的第七列重新命名为6,防止合并出现nan
# print(data_1)
# print(data_2)
# data = data_1.append(data_2)
data = pd.concat([data_1,data_2])#合并
# print(data)

#计算每一种类型的票房的平均值
data = data.groupby([2,6]).size().reset_index()#以第六列为组进行计算,取消year1为默认列
#列数重命名
data.columns = ["year","类型","类型总数"]
# resp = data[data['year']==1982][['类型','类型总数']]\
#     .sort_values(by='类型总数',ascending=True).values.tolist()  #不包括第一列
#
# print(resp)
#保存处理好的数据
# data.to_csv('年份.csv')

#
###画图
#时间序列
timeline = Timeline()
#播放设置:设置时间间隔  1s    1s=1000ms
timeline.add_schema(play_interval=1000)#毫秒

for year in data['year'].unique():
    resp = (
        data[data['year']==year][['类型','类型总数']]
        .sort_values(by='类型总数',ascending=False)
        .values.tolist()
    )
# print(year)
#绘制柱状图
bar = Bar()
#x轴
bar.add_xaxis([x[0] for x in resp])
#y轴
bar.add_yaxis('',[x[1] for x in resp])
#让柱状图横着放
bar.reversal_axis()
#将计数的标签放在图形的右边
bar.set_series_opts(label_opts=opts.LabelOpts(position='right'))
#设置下图标的名称
bar.set_global_opts(title_opts=opts.TitleOpts(title='全球电影1982-2021 类型统计'))
#将设置好的bar对象放置到轮播图中,并且标签选择年份
timeline.add(bar,f'{year}年')
#将设置好的图标保存为HTML
timeline.render('year.html')

为什么只出来2021年的数据,该加什么

  • 写回答

2条回答 默认 最新

  • 溪风沐雪 2022-06-21 16:14
    关注

    你的缩进有问题

    img


    应该在for循环内部,只有最后一行在循环外部

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?