第一章:Python数据分析环境搭建与初体验

【理论讲解】

欢迎来到Python数据分析的世界!在开始之前,我们需要搭建一个工作台,也就是安装Python和一些必要的工具。

  • Python是什么? Python是一种简洁、强大的编程语言,非常适合数据处理和分析。
  • 为什么用Anaconda? Anaconda是一个方便的数据科学平台,它集成了Python解释器、常用的数据分析库(如Numpy, Pandas)以及像Jupyter Notebook这样的交互式开发环境。它能帮你省去很多麻烦的安装步骤。
  • Jupyter Notebook/Lab是什么? 它们就像一本交互式的笔记本,你可以在里面写代码、运行代码、查看结果,还可以添加文字说明和图片,非常适合我们学习和做数据分析报告。

【操作实践】

  1. Python版本选择与安装:
    • 推荐安装Python 3.8+ 版本。
    • 访问 Anaconda官网 下载并安装适合你操作系统的Anaconda Distribution。安装过程中,请勾选“Add Anaconda to my PATH environment variable”选项(如果提示)。
    • 安装完成后,打开命令行工具(Windows用户搜索“Anaconda Prompt”,Mac/Linux用户打开终端),输入 python --version 检查Python是否安装成功。
  2. Anaconda环境管理(可选但推荐):
    • 创建一个新的虚拟环境,避免不同项目之间的库冲突:bashconda create -n my_ecommerce_env python=3.9
    • 激活环境:bashconda activate my_ecommerce_env
    • 退出环境:bashconda deactivate
    • (后续课程我们将在 my_ecommerce_env 环境中进行)
  3. Jupyter Notebook/Lab的使用:
    • 在激活的环境下,输入 jupyter notebook 或 jupyter lab 即可在浏览器中打开工作界面。
    • 新建一个Python文件(.ipynb),在单元格中尝试输入 print("Hello, Data Analysis!") 并运行(Shift + Enter)。

【互动问答】

  • 学员在安装过程中遇到的问题。
  • Anaconda虚拟环境的作用是什么?
  • Jupyter Notebook和普通Python脚本有什么区别?

1.2 Python编程基础

【理论讲解】

在开始数据分析之前,我们需要掌握一些Python编程的基本“词汇”和“语法”。这些是构建任何程序的基石。

  • 变量: 存储数据的“盒子”,给数据起个名字。
  • 数据类型: 告诉Python这个盒子里面装的是什么类型的数据(数字、文字、真假等)。
  • 数据结构: 如何组织和存储多个数据,比如列表(有序可变)、元组(有序不可变)、字典(键值对)、集合(无序不重复)。
  • 条件语句: 让程序根据不同情况做出不同选择(如果…就…,否则…)。
  • 循环语句: 让程序重复执行某个任务多次。
  • 函数: 把一段代码封装起来,可以重复使用,提高效率。

【代码实例与电商场景案例】

我们用一个电商订单的例子来理解这些概念。

python

# 1. 变量和数据类型
# 电商场景:记录一个商品的订单信息

order_id = "EC2023001"  # 字符串:订单编号
product_name = "智能蓝牙耳机" # 字符串:商品名称
price = 199.99          # 浮点型:商品单价
quantity = 2            # 整型:购买数量
is_vip_customer = True  # 布尔型:是否为VIP客户

print(f"订单ID: {order_id}")
print(f"商品名称: {product_name}")
print(f"单价: {price} 元")
print(f"数量: {quantity} 个")
print(f"VIP客户: {is_vip_customer}")
print(f"总金额: {price * quantity} 元")

# 2. 列表 (List) - 有序、可变,适合存储一系列商品名称
# 电商场景:一个订单中的多个商品

products_in_order = ["智能蓝牙耳机", "手机壳", "屏幕保护膜"]
print(f"\n订单中的商品列表: {products_in_order}")
print(f"第一个商品: {products_in_order[0]}") # 索引从0开始
products_in_order.append("充电宝") # 添加新商品
print(f"添加充电宝后: {products_in_order}")

# 3. 元组 (Tuple) - 有序、不可变,适合存储固定不变的商品属性
# 电商场景:一个商品的固定SKU信息(SKU,Stock Keeping Unit,库存量单位)

product_sku_info = ("蓝牙耳机", "黑色", "标准版")
print(f"\n商品SKU信息: {product_sku_info}")
# product_sku_info.append("白色") # 这行代码会报错,因为元组不可变

# 4. 字典 (Dictionary) - 键值对,适合存储有对应关系的数据
# 电商场景:一个商品的详细属性

product_details = {
    "product_id": "P001",
    "name": "智能蓝牙耳机",
    "category": "数码产品",
    "brand": "TechSound",
    "price": 199.99,
    "stock": 150
}
print(f"\n商品详情: {product_details}")
print(f"商品品牌: {product_details['brand']}")
product_details['stock'] -= 1 # 更新库存
print(f"更新库存后: {product_details['stock']}")

# 5. 集合 (Set) - 无序、不重复,适合存储不重复的商品标签或用户ID
# 电商场景:某个促销活动中参与的唯一用户ID

campaign_users_ids = {"user_001", "user_003", "user_005", "user_001"} # user_001只会出现一次
print(f"\n参与活动的用户ID集合: {campaign_users_ids}")

# 6. 条件语句 (If/Else)
# 电商场景:根据订单总金额判断是否包邮

total_amount = 250.0
shipping_fee = 10.0

if total_amount >= 100:
    print(f"\n订单总金额 {total_amount} 元,满足包邮条件!")
    shipping_fee = 0
else:
    print(f"\n订单总金额 {total_amount} 元,需要支付运费 {shipping_fee} 元。")

print(f"最终运费: {shipping_fee} 元")

# 7. 循环语句 (For Loop)
# 电商场景:计算购物车中所有商品的总价

cart_items = [
    {"name": "智能蓝牙耳机", "price": 199.99, "quantity": 1},
    {"name": "手机壳", "price": 39.9, "quantity": 2},
    {"name": "充电线", "price": 25.0, "quantity": 3}
]

total_cart_price = 0
print("\n购物车商品明细:")
for item in cart_items:
    item_total = item['price'] * item['quantity']
    print(f" - {item['name']}: {item['price']} x {item['quantity']} = {item_total:.2f} 元")
    total_cart_price += item_total

print(f"购物车总价: {total_cart_price:.2f} 元")

# 8. 函数 (Function)
# 电商场景:封装一个计算订单折扣的函数

def calculate_discounted_price(original_price, discount_rate):
    """
    根据原价和折扣率计算折后价。
    original_price: 商品原价
    discount_rate: 折扣率 (0到1之间,例如0.8表示八折)
    """
    if not (0 <= discount_rate <= 1):
        print("折扣率必须在0到1之间!")
        return original_price
    discounted_price = original_price * discount_rate
    return discounted_price

product_original_price = 200.0
product_discount_rate = 0.75 # 七五折

final_price = calculate_discounted_price(product_original_price, product_discount_rate)
print(f"\n原价 {product_original_price} 元,打 {product_discount_rate*100:.0f} 折后,最终价格: {final_price:.2f} 元")

# 尝试错误折扣率
final_price_error = calculate_discounted_price(100, 1.2)

【互动问答】

  • 变量命名有什么规则和建议?
  • 列表和元组有什么主要区别?什么时候用列表,什么时候用元组?
  • 字典的“键”和“值”有什么特点?
  • for 循环和 if 语句在电商数据分析中还有哪些应用场景?
  • 如何定义一个函数来计算用户在某个时间段内的总消费金额?

1.3 初识数据分析库:Numpy与Pandas

【理论讲解】

现在我们有了Python编程的基础,是时候介绍两个数据分析的“瑞士军刀”了:Numpy 和 Pandas

  • Numpy: 专门处理数值计算的库,它提供了高性能的多维数组对象(ndarray),比Python自带的列表在处理大量数字时快得多。它是许多科学计算库的基础。
  • Pandas: 构建在Numpy之上,是Python数据分析的核心库。它提供了两种主要的数据结构:
    • Series: 一维带标签的数组,可以看作带索引的列表。
    • DataFrame: 二维带标签的表格数据结构,可以看作是Excel表格或数据库中的表,有行和列的索引。它是我们处理电商数据的主要工具。
  • 数据导入导出: 学习如何将外部数据(如CSV、Excel文件)读入Pandas DataFrame,以及如何将处理后的数据保存出去。

【代码实例与电商场景案例】

我们将创建一个简单的电商销售数据,并用Numpy和Pandas进行初步操作。

python

import numpy as np
import pandas as pd

# 1. Numpy 数组 (ndarray)
# 电商场景:存储一批商品的销售价格,进行快速数学运算

# 创建一个Numpy数组
sales_prices = np.array([120.5, 85.0, 299.9, 50.0, 150.2])
print("商品销售价格 (Numpy数组):", sales_prices)

# 快速计算统计量
print("平均价格:", sales_prices.mean())
print("最高价格:", sales_prices.max())
print("最低价格:", sales_prices.min())
print("价格总和:", sales_prices.sum())

# 对所有价格打八折
discounted_prices = sales_prices * 0.8
print("打八折后的价格:", discounted_prices)

# 2. Pandas Series
# 电商场景:记录某个商品的每日销售额

daily_sales_amount = pd.Series([1200, 1500, 1350, 1600, 1480],
                               index=['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05'],
                               name='每日销售额')
print("\n每日销售额 (Pandas Series):\n", daily_sales_amount)
print("1月3日的销售额:", daily_sales_amount['2023-01-03'])

# 3. Pandas DataFrame
# 电商场景:一个包含订单ID、商品名称、金额、数量的销售表格

# 创建一个字典,包含多列数据
data = {
    '订单ID': ['ORD001', 'ORD002', 'ORD003', 'ORD004', 'ORD005'],
    '商品名称': ['T恤', '牛仔裤', '运动鞋', 'T恤', '帽子'],
    '购买数量': [2, 1, 1, 3, 1],
    '单价': [59.9, 129.0, 399.0, 59.9, 49.0],
    '用户ID': ['U001', 'U002', 'U001', 'U003', 'U002']
}
df_sales = pd.DataFrame(data)
print("\n电商销售数据 (Pandas DataFrame):\n", df_sales)

# 计算总金额
df_sales['总金额'] = df_sales['购买数量'] * df_sales['单价']
print("\n添加总金额列:\n", df_sales)

# 4. 数据导入导出 (模拟文件操作)
# 假设我们有一个 sales_data.csv 文件,内容如下:
# 订单ID,商品名称,购买数量,单价,用户ID
# ORD001,T恤,2,59.9,U001
# ORD002,牛仔裤,1,129.0,U002
# ORD003,运动鞋,1,399.0,U001
# ORD004,T恤,3,59.9,U003
# ORD005,帽子,1,49.0,U002

# 模拟创建 CSV 文件
df_sales.to_csv('sales_data.csv', index=False)
print("\n'sales_data.csv' 文件已创建。")

# 从 CSV 文件读取数据
df_loaded_sales = pd.read_csv('sales_data.csv')
print("\n从CSV文件加载的数据:\n", df_loaded_sales)

# 模拟创建 Excel 文件
df_sales.to_excel('sales_data.xlsx', index=False)
print("\n'sales_data.xlsx' 文件已创建。")

# 从 Excel 文件读取数据
df_excel_sales = pd.read_excel('sales_data.xlsx')
print("\n从Excel文件加载的数据:\n", df_excel_sales)

【互动问答】

  • Numpy数组和Python列表在处理大量数字时有什么性能差异?
  • Pandas Series和DataFrame分别适用于什么类型的数据?
  • 在电商数据分析中,你觉得哪些数据会以Series形式出现?哪些会以DataFrame形式出现?
  • index=False 在 to_csv() 或 to_excel() 中有什么作用?
  • 如何读取一个包含中文的CSV文件而不出现乱码?(提示:encoding 参数)