这篇文章使用的数据基于博文 微博爬虫
主要涉及的技术是 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 小结
以上图形分析的是整体的数据情况,更多的时候我们希望分析的是某一个话题或者某一个关键词的舆情状况,所以需要添加查询参数,下一篇文章我们拓展更多的图形,并且添加关键词参数。