个人阅读统计分析工具:从CSV数据到可视化图表的实现


背景介绍

在数字化阅读日益普及的今天,很多读者会记录自己的阅读历程(如书籍名称、阅读时间、评分等)。如何从这些零散的阅读记录中提取有价值的信息(如每月阅读量、平均评分趋势)?本文将介绍一个“个人阅读统计分析工具”的实现,它能读取CSV格式的阅读记录,自动统计每月阅读数据并生成可视化图表,帮助你直观了解阅读习惯。

该工具不仅能锻炼数据处理(文件读写、日期解析、分组统计)和可视化(matplotlib绘图)能力,还能让阅读记录“活”起来——从冰冷的数字变成直观的图表,实用且有趣。

思路分析

要实现这个工具,我们需要分步骤解决以下问题:

  1. 数据读取与预处理:读取CSV文件,解析“阅读结束日期”为日期格式(便于按月份分组)。
  2. 按月统计:提取“阅读结束日期”的年月信息,按年月分组,统计每月阅读书籍数量(计数)和平均评分(均值)。
  3. 结果输出:将统计结果打印到命令行。
  4. 可视化呈现:使用matplotlib绘制柱状图(展示每月阅读量)和折线图(展示平均评分趋势),并保存为图片。

代码实现

下面是完整的Python实现(依赖pandasmatplotlib,需提前安装:pip install pandas matplotlib):

import pandas as pd
import matplotlib.pyplot as plt

def analyze_reading_records(csv_path):
    # 1. 读取CSV文件,处理日期格式
    # 假设CSV文件第一行为表头,列名:书籍名称、阅读开始日期、阅读结束日期、评分
    df = pd.read_csv(csv_path)
    # 将“阅读结束日期”转换为datetime类型,便于后续按月份分组
    df['阅读结束日期'] = pd.to_datetime(df['阅读结束日期'])

    # 2. 提取年月信息(格式:YYYY-MM),作为分组依据
    df['年月'] = df['阅读结束日期'].dt.strftime('%Y-%m')  # 生成“2023-01”这样的字符串

    # 3. 按“年月”分组,统计每月书籍数量(count)和平均评分(mean)
    # 分组后,对“书籍名称”计数(统计数量),对“评分”求均值(平均评分)
    monthly_stats = df.groupby('年月').agg(
        书籍数量=('书籍名称', 'count'),
        平均评分=('评分', 'mean')
    ).reset_index()  # 重置索引,方便后续遍历

    # 4. 输出统计结果到命令行
    print("===== 阅读统计结果 =====")
    for _, row in monthly_stats.iterrows():
        month = row['年月']
        count = row['书籍数量']
        avg_rating = row['平均评分']
        # 平均评分保留1位小数(如示例中的8.5、9.0)
        print(f"{month}:阅读书籍{count}本,平均评分{avg_rating:.1f}")

    # 5. 可视化:柱状图(每月阅读量)+ 折线图(平均评分)
    # ---- 柱状图:每月阅读书籍数量 ----
    plt.figure(figsize=(10, 6))  # 设置画布大小
    x = monthly_stats['年月']
    y_count = monthly_stats['书籍数量']
    plt.bar(x, y_count, color='skyblue', width=0.6)
    plt.title('每月阅读书籍数量统计')
    plt.xlabel('月份')
    plt.ylabel('书籍数量')
    plt.xticks(rotation=45)  # 旋转x轴标签,避免重叠
    plt.tight_layout()  # 自动调整布局,防止标签被截断
    plt.savefig('books_count.png', dpi=300)  # 保存为PNG,300dpi保证清晰度

    # ---- 折线图:每月平均评分 ----
    plt.figure(figsize=(10, 6))
    y_avg = monthly_stats['平均评分']
    plt.plot(x, y_avg, marker='o', color='orange', linestyle='-')
    plt.title('每月阅读书籍平均评分')
    plt.xlabel('月份')
    plt.ylabel('平均评分')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig('avg_rating.png', dpi=300)

if __name__ == "__main__":
    # 示例CSV文件路径(请替换为你的文件路径)
    csv_path = "reading_records.csv"
    try:
        analyze_reading_records(csv_path)
        print("统计完成!柱状图已保存为books_count.png,折线图已保存为avg_rating.png")
    except Exception as e:
        print(f"出错啦:{e}")

代码解释

  • 数据读取pd.read_csv()读取CSV文件,pd.to_datetime()将“阅读结束日期”转换为日期类型(支持后续的日期操作)。
  • 年月提取dt.strftime('%Y-%m')将日期格式化为“YYYY-MM”的字符串(如2023-01),作为分组的唯一标识。
  • 分组统计groupby('年月').agg(...)按年月分组,count统计书籍数量,mean计算平均评分。
  • 可视化细节
    • figsize=(10, 6)设置画布大小,避免图表拥挤。
    • plt.xticks(rotation=45)旋转x轴标签,防止月份文字重叠。
    • plt.tight_layout()自动调整子图间距,保证图表美观。
    • savefig()将图表保存为PNG文件,dpi=300提升清晰度。

测试与验证

将示例CSV数据(如下)保存为reading_records.csv,运行代码:

书名,阅读开始日期,阅读结束日期,评分
《白夜行》,2023-01-01,2023-01-10,9
《解忧杂货店》,2023-01-15,2023-01-25,8
《活着》,2023-02-05,2023-02-12,9
《许三观卖血记》,2023-03-01,2023-03-10,8
《兄弟》,2023-03-15,2023-03-20,9

命令行输出将与示例一致:

===== 阅读统计结果 =====
2023-01:阅读书籍2本,平均评分8.5
2023-02:阅读书籍1本,平均评分9.0
2023-03:阅读书籍2本,平均评分8.5
统计完成!柱状图已保存为books_count.png,折线图已保存为avg_rating.png

可视化结果
books_count.png:横轴为2023-012023-022023-03,纵轴为书籍数量212(柱状图)。
avg_rating.png:横轴同上,纵轴为平均评分8.59.08.5(折线图,带圆点标记)。

总结

通过这个项目,我们完成了从CSV数据读取日期处理分组统计可视化输出的完整流程,核心收获包括:

  1. 数据处理能力:掌握pandas的日期解析、分组统计(groupby+agg),能高效处理时间序列数据。
  2. 可视化技巧:学会用matplotlib绘制柱状图、折线图,掌握图表美化(布局、标签旋转、清晰度设置)。
  3. 工程化思维:将“阅读统计”的生活场景转化为代码逻辑,通过异常捕获(try-except)保证程序健壮性。

该工具可扩展空间大:比如支持多文件合并、按“阅读开始日期”统计、添加阅读时长分析(若CSV包含时长字段)等。如果你也有阅读记录,不妨用它分析自己的阅读轨迹,看看能否发现隐藏的阅读习惯~


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注