python (第十三章 数据分析与可视化)

学习内容总览
  1. Pandas 深入:数据清洗、处理。
  2. Matplotlib 基础:绘制图表。
  3. 实践任务:分析电商价格趋势并可视化。
前置准备
  • 安装库:
    • pip install pandas matplotlib
  • 数据来源:复用 jd_prices.db(第12周的 SQLite 数据库)。

第一部分:Pandas 深入

1. 数据读取与清洗
  • 从 SQLite 加载数据到 DataFrame。
  • 示例
import pandas as pd
import sqlite3

# 读取数据库
conn = sqlite3.connect("jd_prices.db")
df = pd.read_sql_query("SELECT * FROM prices", conn)
conn.close()

print(df.head())  # 查看前5行
2. 数据处理
  • 转换时间戳
df["timestamp"] = pd.to_datetime(df["timestamp"])
  • 按商品分组
grouped = df.groupby("name")
for name, group in grouped:
    print(f"{name} 的记录数:{len(group)}")

第二部分:Matplotlib 基础

1. 基本图表
  • 折线图:展示价格变化。
  • 示例
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [10, 20, 15])
plt.title("简单折线图")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.show()
2. 中文支持
  • 解决中文乱码:
plt.rcParams["font.sans-serif"] = ["SimHei"]  # Windows
plt.rcParams["axes.unicode_minus"] = False  # 负号显示

实践任务:分析电商价格趋势

目标

jd_prices.db 中提取数据,用 Pandas 分析价格变化,用 Matplotlib 绘制趋势图。

代码实现
import pandas as pd
import sqlite3
import matplotlib.pyplot as plt

class PriceAnalyzer:
    def __init__(self, db_name="jd_prices.db"):
        self.db_name = db_name
        self.df = self.load_data()

    def load_data(self):
        """加载数据库数据"""
        conn = sqlite3.connect(self.db_name)
        df = pd.read_sql_query("SELECT name, price, timestamp FROM prices", conn)
        conn.close()
        df["timestamp"] = pd.to_datetime(df["timestamp"])
        return df

    def analyze_trend(self, product_name):
        """分析并可视化价格趋势"""
        # 筛选指定商品
        product_df = self.df[self.df["name"] == product_name]
        if product_df.empty:
            print(f"没有找到 {product_name} 的数据!")
            return
        
        # 统计信息
        print(f"\n{product_name} 价格分析:")
        print(f"平均价格:¥{product_df['price'].mean():.2f}")
        print(f"最高价格:¥{product_df['price'].max():.2f}")
        print(f"最低价格:¥{product_df['price'].min():.2f}")
        
        # 绘制折线图
        plt.figure(figsize=(10, 6))
        plt.plot(product_df["timestamp"], product_df["price"], marker="o")
        plt.title(f"{product_name} 价格趋势")
        plt.xlabel("时间")
        plt.ylabel("价格 (¥)")
        plt.grid(True)
        plt.xticks(rotation=45)
        plt.tight_layout()
        plt.rcParams["font.sans-serif"] = ["SimHei"]
        plt.rcParams["axes.unicode_minus"] = False
        plt.show()

    def view_summary(self):
        """查看所有商品概览"""
        if self.df.empty:
            print("暂无数据!")
        else:
            print("\n所有商品概览:")
            summary = self.df.groupby("name")["price"].agg(["mean", "min", "max", "count"])
            print(summary)

def main():
    analyzer = PriceAnalyzer()
    
    while True:
        print("\n=== 电商价格分析系统 ===")
        print("1. 分析价格趋势")
        print("2. 查看所有商品概览")
        print("3. 退出")
        
        choice = input("请选择操作(1-3):")
        
        if choice == "1":
            name = input("请输入商品名称:")
            analyzer.analyze_trend(name)
        
        elif choice == "2":
            analyzer.view_summary()
        
        elif choice == "3":
            print("谢谢使用!")
            break
        
        else:
            print("无效选择,请输入 1-3!")

if __name__ == "__main__":
    main()

代码讲解
  1. 数据加载

    • pd.read_sql_query 从 SQLite 加载数据。
    • 转换 timestamp 为日期时间格式。
  2. 趋势分析

    • 筛选特定商品,计算均值、最值。
    • 用 Matplotlib 绘制折线图,带网格和标记点。
  3. 概览

    • groupbyagg 统计所有商品的平均、最小、最大价格和记录数。

动手实践
  1. 准备环境
    • 安装 pandasmatplotlib
    • 确保 jd_prices.db 有数据(可运行第12周代码多抓几次)。
  2. 运行程序
    • 1,输入商品名(如 “Apple iPhone 14 Pro Max”),查看趋势图。
    • 2,查看所有商品概览。
    • 3,退出。
  3. 检查结果
    • 确认图表显示,数据是否正确。

预期输出
  • 趋势分析:
Apple iPhone 14 Pro Max 价格分析:
平均价格:¥7999.00
最高价格:¥7999.00
最低价格:¥7999.00

(显示折线图)

  • 概览:
所有商品概览:
                       mean     min     max  count
name
Apple iPhone 14 Pro Max  7999.0  7999.0  7999.0      3
华为 Mate 60 Pro          6499.0  6499.0  6499.0      2

小挑战
  1. 多商品对比:同时绘制多商品的趋势图。
  2. 导出数据:将分析结果保存为 CSV。
  3. 动态更新:结合爬虫实时更新数据。

你可能感兴趣的:(python,python,数据分析,开发语言)