首页 > 编程语言 >Python数据处理训练

Python数据处理训练

时间:2024-05-26 23:46:43浏览次数:29  
标签:comment plt 训练 Python rankings comments print year 数据处理

(一)、中国大学排名数据分析与可视化(写到实验报告中)

【源代码程序】

import requests

from bs4 import BeautifulSoup

import matplotlib.pyplot as plt

 

# URL 模板,按年份爬取数据

URL_TEMPLATE = "https://www.shanghairanking.cn/rankings/bcur/{}"

 

 

# 爬取数据函数

def fetch_rankings(year):

    url = URL_TEMPLATE.format(year)

    response = requests.get(url)

 

    # 检查响应状态码

    if response.status_code != 200:

        print(f"Failed to retrieve data for year {year}. Status code: {response.status_code}")

        return []

 

    soup = BeautifulSoup(response.content, "html.parser")

    table = soup.find("table", {"class": "rk-table"})

 

    # 检查是否成功找到表格

    if not table:

        print(f"Failed to find the ranking table for year {year}.")

        return []

 

    rows = table.find_all("tr")[1:11]  # 取前10行数据

 

    rankings = []

    for row in rows:

        cols = row.find_all("td")

        rank = cols[0].text.strip()

        university = cols[1].text.strip()

        score = cols[2].text.strip()

        rankings.append((rank, university, score))

 

    return rankings

 

 

# 打印排名信息

def print_rankings(rankings, year):

    if not rankings:

        print(f"No data available for year {year}.")

        return

 

    print(f"\n{year} 年前 10 名大学排名:")

    print(f"{'排名':<5} {'大学':<20} {'得分':<10}")

    print("-" * 40)

    for rank, university, score in rankings:

        print(f"{rank:<5} {university:<20} {score:<10}")

 

 

# 可视化函数

def plot_rankings(rankings_dict):

    # 设置字体

    plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体

    plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

 

    years = list(rankings_dict.keys())

    universities = {university for year in years for _, university, _ in rankings_dict[year]}

 

    plt.figure(figsize=(10, 6))

 

    for university in universities:

        ranks = []

        for year in years:

            rank = next((int(rank) for rank, uni, _ in rankings_dict[year] if uni == university), None)

            ranks.append(rank)

        plt.plot(years, ranks, marker='o', label=university if ranks[-1] and ranks[-1] <= 10 else "")

 

    plt.gca().invert_yaxis()

    plt.xticks(years)

    plt.xlabel('年份')

    plt.ylabel('排名')

    plt.title('2015-2019年前10大学排名变化')

    plt.legend()

    plt.show()

 

 

# 查询排名信息

def query_ranking(rankings_dict):

    while True:

        university = input("请输入大学名称:")

        year = input("请输入年份(2015-2019):")

 

        if not year.isdigit() or int(year) not in rankings_dict:

            print("年份输入有误,请重新输入。")

            continue

 

        year = int(year)

        rank_info = next((rank for rank, uni, _ in rankings_dict[year] if uni == university), None)

 

        if rank_info:

            print(f"{year} 年 {university} 排名:{rank_info}")

        else:

            print(f"{year} 年没有找到 {university} 的排名信息。")

 

        cont = input("是否继续查询?(y/n): ")

        if cont.lower() != 'y':

            break

 

 

if __name__ == "__main__":

    rankings_dict = {}

 

    for year in range(2015, 2019+1):

        rankings_dict[year] = fetch_rankings(year)

        print_rankings(rankings_dict[year], year)

 

    plot_rankings(rankings_dict)

 

    query_ranking(rankings_dict)

 

 

)、豆瓣图书评论数据分析与可视化(写到实验报告中)

【源代码程序】

import requests

from bs4 import BeautifulSoup

import jieba

from wordcloud import WordCloud

import matplotlib.pyplot as plt

 

 

# 爬取短评数据函数

def fetch_comments(book_id, start=0, limit=20, status='P', sort_by='time'):

    url = f"https://book.douban.com/subject/{book_id}/comments/?start={start}&limit={limit}&status={status}&sort={sort_by}"

    headers = {

        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36"

    }

    response = requests.get(url, headers=headers)

    soup = BeautifulSoup(response.content, "html.parser")

    comments = soup.find_all("div", class_="comment")

 

    comment_data = []

    for comment in comments:

        username = comment.find("span", class_="comment-info").find("a").text

        content = comment.find("span", class_="short").text

        date = comment.find("a", class_="comment-time").text.strip()

        rating_tag = comment.find("span", class_="rating")

        rating = rating_tag['class'][0][7:8] if rating_tag else "无评分"

        votes = comment.find("span", class_="vote-count").text

        comment_data.append({

            "username": username,

            "content": content,

            "date": date,

            "rating": rating,

            "votes": int(votes)

        })

 

    return comment_data

 

 

# 爬取多页数据

def fetch_multiple_pages(book_id, start=0, limit=20, status='P',sort_by='score', num_pages=3):

    all_comments = []

    for page in range(num_pages):

        start_page = start + page * limit

        comments = fetch_comments(book_id, start=start_page, limit=limit, status=status, sort_by=sort_by)

        all_comments.extend(comments)

    return all_comments

 

 

# 输出前10条短评信息

def print_top_comments(comments, top_n=10):

    for i, comment in enumerate(comments[:top_n], 1):

        print(

            f"{i}. 用户名: {comment['username']}, 评论时间: {comment['date']}, 评分: {comment['rating']}, 点赞数: {comment['votes']}")

        print(f"   短评: {comment['content']}")

 

 

# 按照点赞数排序并输出前10条短评信息

def print_top_comments_by_votes(comments, top_n=10):

    sorted_comments = sorted(comments, key=lambda x: x['votes'], reverse=True)

    print_top_comments(sorted_comments, top_n)

 

 

# 文本分析与词云生成

def generate_wordcloud(comments):

    text = " ".join([comment['content'] for comment in comments])

    words = " ".join(jieba.cut(text))

 

    if not words.strip():

        print("没有足够的评论内容生成词云。")

        return

 

    wordcloud = WordCloud(font_path='msyh.ttc', width=800, height=400, background_color='white').generate(words)

 

    plt.figure(figsize=(10, 5))

    plt.imshow(wordcloud, interpolation="bilinear")

    plt.axis("off")

    plt.show()

 

    # 统计词频

    words_list = jieba.lcut(text)

    word_freq = {}

    for word in words_list:

        if len(word) > 1:

            word_freq[word] = word_freq.get(word, 0) + 1

    sorted_word_freq = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)

    print("前10位词频统计结果:")

    for word, freq in sorted_word_freq[:10]:

        print(f"{word}: {freq}")

 

def total(book_id,sort_by):

 

    start = 0  # 起始位置

    limit = 20  # 每页数量

    statuses = ['P', 'N', 'F']  # 读书状态:P代表读过,N代表在读,F代表想读

    # 存储各状态下的评论

    all_comments = {}

 

    # 爬取数据并存储

    for status in statuses:

        comments = fetch_multiple_pages(book_id, start=start, limit=limit, status=status, sort_by=sort_by, num_pages=3)

        all_comments[status] = comments

 

    if book_id =='36781566':

        print(f"《叙事本能》")

    else:

        print(f"《暗处的女儿》")

    if sort_by == 'time':

        print("最新排序前10位短评信息:")

    else:

        print("热门排序前10位短评信息:")

    # 输出各状态下前10位短评信息

    for status, comments in all_comments.items():

        # 读书状态:P代表读过,N代表在读,F代表想读

        if status == 'P':

            print(f"读书状态:读过")

        elif status == 'N':

            print(f"读书状态:在读")

        else:

            print(f"读书状态:想读")

        print_top_comments(comments)

        print()

    # 文本分析与词云生成

    print("\n按点赞数排序前10位短评信息:")

    all_comments_merged = sum(all_comments.values(), [])

    generate_wordcloud(all_comments_merged)

 

 

 

if __name__ == "__main__":

    books_id = ["36701566","36721763"]  

    sorts = ['time','score']  # 'time' for 最新, 'score' for 热门

 

    # 爬取数据

    for book_id in books_id:

        for sort in sorts:

            total(book_id,sort)

 

    print("\n热门排序前10位短评信息:")

 

)、函数图形1绘制(写到实验报告中)

【源代码程序】

import matplotlib.pyplot as plt

import numpy as np

 

x = np.arange(0, 10, 0.0001)

y1 = x ** 2

y2 = np.cos(x * 2)

y3 = y1 * y2

plt.plot(x, y1,linestyle='-.')

plt.plot(x, y2,linestyle=':')

plt.plot(x, y3,linestyle='--')

plt.savefig("3-1.png")

plt.show()

 

 

 

import matplotlib.pyplot as plt

import numpy as np

fig, subs = plt.subplots(2, 2)

subs[0][0].plot(x, y1)

subs[0][1].plot(x, y2)

subs[1][0].plot(x, y3)

plt.savefig("3-2.png")

plt.show()

 

(四)、函数图形2绘制(写到实验报告中)

【源代码程序】

import matplotlib.pyplot as plt

import numpy as np

 

x = np.arange(-2, 2, 0.0001)

y1 = np.sqrt(2 * np.sqrt(x ** 2) - x ** 2)

y2 = (-2.14) * np.sqrt(np.sqrt(2) - np.sqrt(np.abs(x)))

plt.plot(x, y1, 'r', x, y2, 'r')

plt.fill_between(x, y1, y2, facecolor='pink')

plt.savefig("heart.png")

plt.show()

标签:comment,plt,训练,Python,rankings,comments,print,year,数据处理
From: https://www.cnblogs.com/yuanxinglan/p/18214553

相关文章

  • python04
    Python数据处理训练 班级:信2205-2班         学号:20224082        姓名:艾鑫一实验目的l 使学生熟练安装扩展库numpy、requests、bs4、pandas、seaborn、matplotlib等;l 使学生熟悉使用标准库cvs操作文件;l 使学生熟悉使用pandas进行数据分析的基本......
  • python venv
    venv虚拟环境作用Python虚拟环境主要是为不同Python项目创建一个隔离的环境,每个项目都可以拥有独立的依赖包环境,而项目间的依赖包互不影响;venv环境下,⽤pip安装的包都在安装到了venv这个环境下,系统python环境不受任何影响,也就是说,venv环境是专门针对当前项⽬创建的。......
  • 7-Python中的函数
    一、定义函数1.定义defgreat_user():   """显示简单的问候语"""     (函数的描述,可以自动生成一个说明文档)   print("Hello")二、传递实参(位置实参+关键字实参)1.位置实参(1)基于实参的顺序,在函数调用时把每个实参关联到函数定义中的形参(2)位置实......
  • wxpython开发gui界面基础
    wxpython开发gui基础知识一、前言记录使用wxpython开发gui工具吧。gui界面主要就是先布局,每个模块都是一个对象。二、基础知识importwxclassMyFrame(wx.Frame):def__int__(self):super(MyFrame,self).__int__()这里定义了一个主窗口为MyFrame的主窗口......
  • python之re库,正则表达
    一、前言为什么要学re库呢?这里主要学他的正则表达,在编写安全脚本的时候肯定要遇到一些不规则的匹配规则,当然编写爬虫也少不了正则匹配去找到一些具有特殊特征的字符串。因此这是十分必要的,然而。re库使Python语言拥有全部的正则表达式功能。我会先介绍一些常见的函数的功能并且......
  • python脚本之requests库上传文件
    一、前言在学习的时候,发现有一个AWD的文件上传执行漏洞,突然想着批量对不同靶机进行操作并get_flag。思路简单,但是没构造过文件上传的requests的post请求的payload。便记录一下。二、构造知识在上传文件的时候,数据表的post请求体里面通常是下面这样------WebKitFormBoundary......
  • 【Python】 XGBoost模型的使用案例及原理解析
    原谅把你带走的雨天在渐渐模糊的窗前每个人最后都要说再见原谅被你带走的永远微笑着容易过一天也许是我已经老了一点那些日子你会不会舍不得思念就像关不紧的门空气里有幸福的灰尘否则为何闭上眼睛的时候又全都想起了谁都别说让我一个人躲一躲你的承诺我竟......
  • 【Python】LightGBM:快速高效的梯度提升框架
    原谅把你带走的雨天在渐渐模糊的窗前每个人最后都要说再见原谅被你带走的永远微笑着容易过一天也许是我已经老了一点那些日子你会不会舍不得思念就像关不紧的门空气里有幸福的灰尘否则为何闭上眼睛的时候又全都想起了谁都别说让我一个人躲一躲你的承诺我竟......
  • 【Python】 XGBoost vs LightGBM:两大梯度提升框架的对比
    原谅把你带走的雨天在渐渐模糊的窗前每个人最后都要说再见原谅被你带走的永远微笑着容易过一天也许是我已经老了一点那些日子你会不会舍不得思念就像关不紧的门空气里有幸福的灰尘否则为何闭上眼睛的时候又全都想起了谁都别说让我一个人躲一躲你的承诺我竟......
  • 【Python】利用TensorFlow和Keras进行不平衡数据集的分类任务
    原谅把你带走的雨天在渐渐模糊的窗前每个人最后都要说再见原谅被你带走的永远微笑着容易过一天也许是我已经老了一点那些日子你会不会舍不得思念就像关不紧的门空气里有幸福的灰尘否则为何闭上眼睛的时候又全都想起了谁都别说让我一个人躲一躲你的承诺我竟......