当前位置: 首页 > article >正文

微博舆情数据分析(一)pandas + matplotlib 作图

这篇文章使用的数据基于博文 微博爬虫
主要涉及的技术是 pandas + matplotlib ,是常见的python的数据分析作图方法

1 统计代码生成excel

利用pandas生成excel数据

def init_data():
    df = pd.read_sql_query("SELECT * FROM tb_weibo", cnn)
    print('初始化数据完毕..')
    # 分割 topics 字段
    df['topics'] = df['topics'].str.split(',')

    # 扁平化 topics 字段
    df_exploded = df.explode('topics')

    # 统计 attitudes_count、comments_count、reposts_count 的和值
    summary_df = df_exploded.groupby('topics').agg({
        'attitudes_count': 'sum',
        'comments_count': 'sum',
        'reposts_count': 'sum',
        'keywords': 'first',  # 展示对应的 keywords 字段
        'label': 'count'  # 统计对应行数,取名为 total
    }).reset_index().rename(columns={'label': 'total'})
    # 统计负面文章的数量(label 等于 '消极' 的数量)
    negative_count_df = df_exploded[df_exploded['label'] == '消极'].groupby('topics').size().reset_index(
        name='native_count')
    # 统计用户的个数(去重)
    user_count_df = df_exploded.groupby('topics')['user_id'].nunique().reset_index(name='user_count')
    # 合并所有统计结果
    result_df = summary_df.merge(negative_count_df, on='topics', how='left').merge(user_count_df, on='topics',
                                                                                   how='left')
    # 替换 NaN 值为 0(如果有的话)
    result_df.fillna(0, inplace=True)
    # 根据 total 进行倒序排列
    result_df = result_df.sort_values(by=['total'], ascending=False)
    # 将结果保存为 Excel 文件
    result_df.to_excel('topic.xlsx', index=False)
    print('数据处理完毕,生成 topic.xlsx 文件')

2 生成分析图

利用matplotlib生成柱状图和饼图

# 读取处理后的数据
    def analyze_chart1():
    # 读取处理后的数据
    result_df = pd.read_excel('topic.xlsx')

    # 确保 topics 列是字符串类型并处理 NaN 值
    result_df['topics'] = result_df['topics'].astype(str).fillna('未知主题')

    # 取前20个主题
    top_20_df = result_df.head(20)

    # 设置中文字体,确保能够显示中文字符
    matplotlib.rcParams['font.family'] = 'SimHei'  # 使用黑体
    matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题

    # 1. 柱状图:分析各个关键词的文章条数 total 列
    plt.figure(figsize=(12, 6))
    plt.bar(top_20_df['topics'], top_20_df['total'], color='skyblue')
    plt.xlabel('主题')
    plt.ylabel('文章条数')
    plt.title('各个关键词的文章条数(前20)')
    plt.xticks(rotation=45, ha='right')  # 旋转 x 轴标签
    plt.tight_layout()
    plt.savefig('bar_chart_total.png')  # 保存图表
    plt.show()  # 显示图表

    # 2. 饼图:分析负面舆情 native_count 和 total
    sizes = [result_df['native_count'].sum(), result_df['total'].sum() - result_df['native_count'].sum()]
    labels = ['负面舆情', '其他舆情']
    plt.figure(figsize=(8, 8))
    plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140, colors=['tomato', 'lightgreen'])
    plt.title('负面舆情与其他舆情占比')
    plt.axis('equal')  # 使饼图为圆形
    plt.savefig('pie_chart_native_count.png')  # 保存图表
    plt.show()  # 显示图表


3 执行结果

执行代码:

if __name__ == '__main__':
    init_data()
    analyze_chart1()

生成的excel:
在这里插入图片描述
生成的分析图:
柱状图,我们使用到了蓝色的柱形,表示每个主题下的微博文章的数量的排列,只列出了前20的。
在这里插入图片描述
饼图,我们分析了负面的微博文章的比例,显示为红色,其他舆情(积极和中性)占97.8%。
在这里插入图片描述

4 小结

以上图形分析的是整体的数据情况,更多的时候我们希望分析的是某一个话题或者某一个关键词的舆情状况,所以需要添加查询参数,下一篇文章我们拓展更多的图形,并且添加关键词参数。


http://www.kler.cn/news/367022.html

相关文章:

  • Java线程安全
  • 用接地气的例子趣谈 WWDC 24 全新的 Swift Testing 入门(一)
  • SQL SERVER 2005/2008/2012/2016/2020 数据库状态为“可疑”的解决方法(亲测可用)
  • Linux相关概念和易错知识点(16)(Shell原理、进程属性和环境变量表的联系)
  • LeetCode_231. 2 的幂_java
  • Android中的权限管理机制
  • 基于图像拼接算法及实现
  • 数据结构——插入排序
  • 数字图像处理(c++)-图像读取或者显示
  • 使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理方便内网网站访问)【使用frp搭建内网穿透】
  • 【跨平台】ReactNative 入门初探
  • 「Qt Widget中文示例指南」如何实现半透明背景?
  • Android跨进程通信
  • Python中,lambda函数的用法是什么?
  • 基于Python+Django的气象数据分析与可视化系统
  • hive修改表操作与array类型
  • 详解Apache版本、新功能和技术前景
  • 【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机
  • SQLI LABS | Less-11 POST-Error Based-Single quotes-String
  • 机器学习认知包
  • 【Linux系统】进程的创建与程序计数器(PC指针)
  • windows DLL技术-DLL的更新和安全性
  • C++研发笔记8——C语言程序设计初阶学习笔记6
  • 028_Comma_Separated_List_in_Matlab中的逗号分割列表
  • electron 中 app 的 getName、setName 方法
  • react hook应用详解+diff 理解 + 父子组件渲染