第2章:Python数据科学生态:Anaconda安装与配置、Jupyter Notebook使用、NumPy基础、Pandas基础、Matplotlib基础
说实话,很多初学者问我数据挖掘第一步该做什么,我总会说:先把你的Python环境搭好。别小看这一步,我见过太多人因为环境问题卡了整整一周。我自己刚入行时,也曾在配置环境上浪费过不少时间。
这一章,我们就来搞定数据挖掘的四大金刚:Anaconda、Jupyter Notebook、NumPy、Pandas、Matplotlib。嗯,一口气学完,后面你就知道有多爽了。
2.1 Anaconda:一站式数据科学工具箱
Anaconda是什么?说白了,它是一个Python发行版,把Python解释器、常用库、包管理器都打包好了。你装一个Anaconda,就等于装好了数据科学所需的大部分工具。
核心优势:
- 自带Python解释器(不用单独装Python)
- 内置conda包管理器(比pip更强大)
- 预装200+常用数据科学库
- 支持虚拟环境管理
2.1.1 安装步骤
我个人习惯去官网下载Anaconda Individual Edition。注意选对操作系统版本,Windows用户选64-Bit Graphical Installer就行。
# 安装完成后,验证是否成功
conda --version
# 输出示例:conda 23.7.4
python --version
# 输出示例:Python 3.11.5
小技巧:安装时勾选"Add Anaconda to my PATH environment variable",这样可以在命令行直接使用conda命令。不过新版安装器默认不勾选,建议手动勾上。
2.1.2 虚拟环境管理
我在项目中遇到过最头疼的事,就是不同项目依赖不同版本的库。比如项目A需要NumPy 1.19,项目B需要NumPy 1.24。怎么办?用虚拟环境隔离。
# 创建虚拟环境
conda create -n myenv python=3.9
# 激活环境
conda activate myenv
# 安装包
conda install numpy pandas matplotlib
# 退出环境
conda deactivate
# 查看所有环境
conda env list
注意:千万不要在base环境里装太多包。我曾经把base环境搞崩过,重装Anaconda花了半天。建议每个项目建一个独立环境。
2.2 Jupyter Notebook:交互式编程利器
Jupyter Notebook是我最常用的数据挖掘工具,没有之一。它把代码、运行结果、图表、文字说明整合在一个文档里,特别适合做探索性分析。
2.2.1 启动与基本操作
# 在命令行启动
jupyter notebook
# 或者使用JupyterLab(更现代的界面)
jupyter lab
启动后浏览器会自动打开,你会看到一个文件管理界面。新建一个Notebook,默认是.ipynb格式。
嗯,这里要注意几个快捷键:
- Shift + Enter:运行当前单元格并跳到下一个
- Ctrl + Enter:运行当前单元格但不跳转
- Esc + A:在当前单元格上方插入新单元格
- Esc + B:在当前单元格下方插入新单元格
- Esc + M:切换为Markdown单元格(写说明文字)
- Esc + Y:切换为代码单元格
我的习惯:先用Markdown单元格写清楚分析思路,再在代码单元格里实现。这样Notebook本身就是一份可执行的报告。
2.2.2 魔法命令
Jupyter有一些特殊的魔法命令,以%开头,能极大提升效率。
# 测量代码运行时间
%time sum(range(1000000))
# 查看变量内存占用
%whos
# 嵌入matplotlib图表
%matplotlib inline
# 运行外部Python文件
%run my_script.py
2.3 NumPy:数值计算的基础
NumPy是Python数据科学的基石。Pandas和Scikit-learn都建立在NumPy之上。说白了,NumPy就是高效的多维数组操作库。
2.3.1 创建数组
import numpy as np
# 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])
# 创建全零数组
zeros = np.zeros((3, 4))
# 创建全一数组
ones = np.ones((2, 3))
# 创建等差数列
seq = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
# 创建等间隔数组
lin = np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1]
2.3.2 数组运算
NumPy的向量化运算是我最喜欢的功能。不用写循环,直接对整个数组做运算,速度飞快。
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 逐元素运算
print(a + b) # [5, 7, 9]
print(a * b) # [4, 10, 18]
print(a ** 2) # [1, 4, 9]
# 广播机制
print(a + 10) # [11, 12, 13]
# 统计运算
print(a.mean()) # 2.0
print(a.sum()) # 6
print(a.max()) # 3
为什么NumPy这么快?因为它的底层是用C语言写的,而且利用了CPU的SIMD指令集。你想想看,Python的for循环每步都要做类型检查,NumPy直接操作内存块,速度能差几十倍。
2.3.3 索引与切片
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 取第一行
print(arr[0]) # [1, 2, 3]
# 取第一列
print(arr[:, 0]) # [1, 4, 7]
# 取子矩阵
print(arr[:2, 1:]) # [[2, 3], [5, 6]]
# 布尔索引
print(arr[arr > 5]) # [6, 7, 8, 9]
2.4 Pandas:数据分析的核心
Pandas提供了两种核心数据结构:Series(一维)和DataFrame(二维)。我在实际项目中,90%的数据处理工作都是用Pandas完成的。
2.4.1 Series与DataFrame
import pandas as pd
# Series:带标签的一维数组
s = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s)
# DataFrame:表格型数据结构
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'城市': ['北京', '上海', '广州']
})
print(df)
2.4.2 数据读取与查看
# 读取CSV文件
df = pd.read_csv('data.csv')
# 查看前5行
df.head()
# 查看基本信息
df.info()
# 查看统计摘要
df.describe()
# 查看列名
df.columns
避坑指南:我曾经在读取CSV时没指定编码,结果中文全乱码了。建议养成习惯:pd.read_csv('file.csv', encoding='utf-8')。如果还不行,试试encoding='gbk'。
2.4.3 数据清洗常用操作
# 检查缺失值
df.isnull().sum()
# 删除缺失值
df.dropna()
# 填充缺失值
df.fillna(df.mean())
# 删除重复行
df.drop_duplicates()
# 重命名列
df.rename(columns={'旧名': '新名'})
# 筛选数据
df[df['年龄'] > 30]
# 分组聚合
df.groupby('城市')['年龄'].mean()
2.5 Matplotlib:数据可视化基础
数据挖掘有个黄金法则:先可视化,再建模。Matplotlib是Python最经典的可视化库,虽然界面有点老气,但功能极其强大。
2.5.1 快速上手
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 创建折线图
plt.figure(figsize=(8, 4))
plt.plot(x, y, label='sin(x)', color='blue', linewidth=2)
plt.title('正弦函数')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()
2.5.2 常用图表类型
| 图表类型 | 适用场景 | 核心函数 |
|---|---|---|
| 折线图 | 趋势变化 | plt.plot() |
| 柱状图 | 类别对比 | plt.bar() |
| 散点图 | 变量关系 | plt.scatter() |
| 直方图 | 数据分布 | plt.hist() |
| 箱线图 | 异常值检测 | plt.boxplot() |
2.5.3 子图与布局
# 创建2行2列的子图
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
# 在第一个子图绘制
axes[0, 0].plot(x, np.sin(x))
axes[0, 0].set_title('sin(x)')
# 在第二个子图绘制
axes[0, 1].plot(x, np.cos(x), color='red')
axes[0, 1].set_title('cos(x)')
# 在第三个子图绘制
axes[1, 0].plot(x, np.tan(x), color='green')
axes[1, 0].set_ylim(-5, 5)
axes[1, 0].set_title('tan(x)')
# 在第四个子图绘制
axes[1, 1].scatter(x, np.sin(x) * np.cos(x), s=10)
axes[1, 1].set_title('sin(x)*cos(x)')
plt.tight_layout()
plt.show()
注意:在Jupyter Notebook中,记得先运行%matplotlib inline,否则图表可能不显示。如果你想要交互式图表,可以用%matplotlib notebook。
2.6 实战:完整的数据探索流程
最后,我们用一个完整的例子,把今天学的知识串起来。假设我们有一份销售数据,要做初步探索。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 1. 生成模拟数据
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100)
sales = np.random.normal(1000, 200, 100) + np.sin(np.linspace(0, 10, 100)) * 100
df = pd.DataFrame({
'日期': dates,
'销售额': sales
})
# 2. 数据概览
print("数据形状:", df.shape)
print("\n前5行:")
print(df.head())
print("\n统计摘要:")
print(df.describe())
# 3. 可视化分析
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.plot(df['日期'], df['销售额'])
plt.title('销售额趋势')
plt.xticks(rotation=45)
plt.subplot(1, 3, 2)
plt.hist(df['销售额'], bins=20, edgecolor='black')
plt.title('销售额分布')
plt.subplot(1, 3, 3)
plt.boxplot(df['销售额'])
plt.title('销售额箱线图')
plt.tight_layout()
plt.show()
# 4. 发现异常值
Q1 = df['销售额'].quantile(0.25)
Q3 = df['销售额'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['销售额'] < lower) | (df['销售额'] > upper)]
print(f"\n发现 {len(outliers)} 个异常值")
你看,短短几十行代码,我们就完成了数据加载、统计描述、可视化分析和异常检测。这就是Python数据科学生态的魅力——工具链完整,衔接流畅。
我个人建议,学完这一章后,找一份真实的数据集(比如Kaggle上的Titanic数据集),完整地走一遍这个流程。只有动手做,才能真正掌握。下一章,我们将进入数据预处理的世界,那才是数据挖掘真正开始的地方。