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

这篇文章使用的数据基于博文 微博爬虫

主要涉及的技术是 pandas + matplotlib ,是常见的python的数据分析作图方法

1 统计代码生成excel

利用pandas生成excel数据

python 复制代码
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生成柱状图和饼图

python 复制代码
# 读取处理后的数据
    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 执行结果

执行代码:

python 复制代码
if __name__ == '__main__':
    init_data()
    analyze_chart1()

生成的excel:

生成的分析图:

柱状图,我们使用到了蓝色的柱形,表示每个主题下的微博文章的数量的排列,只列出了前20的。

饼图,我们分析了负面的微博文章的比例,显示为红色,其他舆情(积极和中性)占97.8%。

4 小结

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

相关推荐
风流 少年21 小时前
数据可视化:matplotlib、pyecharts、panda、seaborn
数据挖掘·数据分析·matplotlib
SelectDB1 天前
云数仓费钱?用 SelectDB Serverless 三步配出秒级弹性,最高降本 70%
数据库·云原生·数据分析
backendbeacon1 天前
Cytoscape 3.10 下载安装教程 专业生物科学数据分析与蛋白互作网络可视化软件下载安装步骤
其他·数据挖掘·数据分析
fai厅的秃头姐!1 天前
Matplotlib
matplotlib
歪歪歪比巴卜1 天前
2026年多平台评论舆情分析工具推荐
数据分析·舆情分析·评论分析
babe小鑫1 天前
2026二本数字经济专业学数据分析的价值
数据挖掘·数据分析
Lx3522 天前
成了!不会前端,花一天时间给公司 BI 系统装上了 AI 智能体!
数据分析·agent·数据可视化
ATA88882 天前
数据库管理工具的数据安全机制对比:权限管控与审计
数据库·人工智能·数据分析·数据库管理
shujudang2 天前
深入数据架构选型:开源埋点系统 vs 企业级增长分析平台的工程与业务考量
架构·数据分析·开源
AllData公司负责人2 天前
数据集成管理|AIIData数据中台实现MySQL、Hive、Oracle一键接入Doris
大数据·数据库·人工智能·hive·mysql·oracle·数据分析