Python 3.8+ 环境配置与数据科学工具全指南
Python环境配置与外部库
环境配置与工具准备
安装Python 3.8+版本
从Python官网下载对应操作系统的安装包。勾选“Add Python to PATH”选项,确保环境变量自动配置。安装完成后,命令行输入python --version验证是否成功。
配置Jupyter Notebook
通过命令行安装Jupyter:
pip install jupyter notebook 启动Jupyter:
jupyter notebook 浏览器将自动打开交互式界面,新建笔记本文件(扩展名为.ipynb)即可开始编码。
安装常用数据科学库
在命令行中批量安装核心库:
pip install numpy pandas matplotlib seaborn scikit-learn 验证安装:
import numpy as np print(np.__version__) # 应输出版本号无报错 Jupyter Notebook基础操作
- 单元格运行:点击工具栏的“运行”按钮或按
Shift+Enter执行当前单元格。 - Markdown注释:新建单元格后,选择“Markdown”模式,用
#编写标题或普通文本。例如:
# 一级标题 ## 二级标题 *斜体*或**加粗**文本 环境管理(可选)
推荐使用conda创建独立环境以避免依赖冲突:
conda create -n my_env python=3.8 conda activate my_env 后续所有库安装在此环境中进行。
调试与帮助
- 查看函数文档:在Jupyter中函数名后输入
?(如np.array?)。 - 快捷键列表:通过Jupyter的
Help > Keyboard Shortcuts获取。
安装Python 3.8+版本
从Python官网下载对应操作系统的安装包。勾选“Add Python to PATH”选项,确保环境变量自动配置。安装完成后,命令行输入python --version验证是否成功。
配置Jupyter Notebook
通过命令行安装Jupyter:
pip install jupyter notebook 启动Jupyter:
jupyter notebook 浏览器将自动打开交互式界面,新建笔记本文件(扩展名为.ipynb)即可开始编码。
安装常用数据科学库
在命令行中批量安装核心库:
pip install numpy pandas matplotlib seaborn scikit-learn 验证安装:
import numpy as np print(np.__version__) # 应输出版本号无报错 Jupyter Notebook基础操作
- 单元格运行:点击工具栏的“运行”按钮或按
Shift+Enter执行当前单元格。 - Markdown注释:新建单元格后,选择“Markdown”模式,用
#编写标题或普通文本。例如:
# 一级标题 ## 二级标题 *斜体*或**加粗**文本 环境管理(可选)
推荐使用conda创建独立环境以避免依赖冲突:
conda create -n my_env python=3.8 conda activate my_env 后续所有库安装在此环境中进行。
调试与帮助
- 查看函数文档:在Jupyter中函数名后输入
?(如np.array?)。 - 快捷键列表:通过Jupyter的
Help > Keyboard Shortcuts获取。
数据处理与科学计算
NumPy基础
多维数组对象 ndarray 的创建方法
使用 np.array() 可以从 Python 列表或元组创建 ndarray:
import numpy as np arr = np.array([1, 2, 3]) # 一维数组 arr_2d = np.array([[1, 2], [3, 4]]) # 二维数组 使用 np.zeros() 创建全零数组:
zeros_1d = np.zeros(3) # 一维零数组 zeros_2d = np.zeros((2, 3)) # 2x3 零矩阵 使用 np.ones() 创建全 1 数组:
ones_arr = np.ones((2, 2)) # 2x2 全 1 矩阵 使用 np.arange() 生成序列数组:
seq = np.arange(0, 10, 2) # 0, 2, 4, 6, 8 使用 np.linspace() 生成等间隔数组:
lin_arr = np.linspace(0, 1, 5) # [0.0, 0.25, 0.5, 0.75, 1.0] 使用 np.random 生成随机数组:
rand_arr = np.random.rand(3, 3) # 3x3 均匀分布随机矩阵 randn_arr = np.random.randn(2, 2) # 2x2 标准正态分布矩阵 数组的基本操作
查看数组形状:
arr = np.array([[1, 2], [3, 4]]) print(arr.shape) # (2, 2) 改变数组形状:
reshaped = arr.reshape(4) # 转换为一维数组 [1, 2, 3, 4] 数组索引与切片:
print(arr[0, 1]) # 2 print(arr[:, 1]) # 获取第二列 [2, 4] 数组拼接:
a = np.array([1, 2]) b = np.array([3, 4]) concat = np.concatenate([a, b]) # [1, 2, 3, 4] 数组运算与广播机制
算术运算:
a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) print(a + b) # [5, 7, 9] print(a * 2) # [2, 4, 6] 广播机制允许不同形状的数组进行计算:
a = np.array([[1], [2], [3]]) b = np.array([1, 2, 3]) print(a + b) # [[2, 3, 4], [3, 4, 5], [4, 5, 6]] 矩阵乘法:
mat_a = np.array([[1, 2], [3, 4]]) mat_b = np.array([[5, 6], [7, 8]]) dot_product = np.dot(mat_a, mat_b) # 或 mat_a @ mat_b 常用数学函数
统计计算:
arr = np.array([1, 2, 3, 4]) print(np.sum(arr)) # 10 print(np.mean(arr)) # 2.5 print(np.max(arr)) # 4 三角函数:
angles = np.array([0, np.pi/2]) print(np.sin(angles)) # [0.0, 1.0] 指数与对数:
print(np.exp([1, 2])) # [2.718, 7.389] print(np.log([1, np.e])) # [0.0, 1.0] 数组的高级操作
布尔索引:
arr = np.array([1, 2, 3, 4]) mask = arr > 2 print(arr[mask]) # [3, 4] 条件运算:
arr = np.array([1, -1, 0]) print(np.where(arr > 0, 1, -1)) # [1, -1, -1] 排序与去重:
unsorted = np.array([3, 1, 2]) sorted_arr = np.sort(unsorted) # [1, 2, 3] unique = np.unique([1, 2, 2, 3]) # [1, 2, 3] Pandas核心功能
Series创建
通过列表创建:
pd.Series([1, 3, 5, np.nan], index=['a', 'b', 'c', 'd']) 通过字典创建:
pd.Series({'a': 1, 'b': 3, 'c': 5}) 指定数据类型:
pd.Series([1, 2], dtype='float64') 从标量值创建:
pd.Series(5, index=['a', 'b', 'c']) DataFrame创建
通过字典创建:
pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) 通过二维数组创建:
pd.DataFrame(np.random.randn(3, 4), columns=['A', 'B', 'C', 'D']) 通过结构化数组创建:
pd.DataFrame(np.array([(1, 'a'), (2, 'b')], dtype=[('x', 'i4'), ('y', 'U1')])) 通过其他DataFrame创建:
pd.DataFrame(existing_df, copy=True) 高级索引技术
布尔索引:
df[df['A'] > 0] 位置索引:
df.iloc[3:5, 0:2] 标签索引:
df.loc['20200101':'20200103', ['A', 'B']] 多级索引:
df.set_index(['col1', 'col2']).sort_index() 数据清洗:处理缺失值与去重
检测缺失值:
df.isna().sum() 删除缺失值:
df.dropna(axis=0, how='any', subset=['col1', 'col2']) 填充缺失值:
固定值填充:
df.fillna(value=0) 前向填充:
df.fillna(method='ffill') 后向填充:
df.fillna(method='bfill') 统计值填充:
df.fillna(df.mean()) 插值填充:
df.interpolate() 高级去重操作
基于所有列去重:
df.drop_duplicates() 基于特定列去重:
df.drop_duplicates(subset=['col1']) 保留最后出现项:
df.drop_duplicates(keep='last') 标记重复项:
df.duplicated() 自定义重复判断:
df.drop_duplicates(subset=['col1'], keep=False) 数据聚合与透视
单列分组:
df.groupby('A').sum() 多列分组:
df.groupby(['A', 'B']).mean() 分组后多聚合:
df.groupby('A').agg(['sum', 'mean', 'std']) 自定义聚合:
df.groupby('A').agg({'B': 'sum', 'C': lambda x: max(x)-min(x)}) 分组后过滤:
df.groupby('A').filter(lambda x: x['B'].mean() > 0) pivot_table深度使用
基础透视:
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C']) 多值透视:
pd.pivot_table(df, values=['D', 'E'], index='A', columns='C') 指定聚合函数:
pd.pivot_table(df, values='D', index='A', aggfunc=[np.sum, len]) 填充缺失值:
pd.pivot_table(df, values='D', index='A', fill_value=0) 边际总计:
pd.pivot_table(df, values='D', index='A', margins=True) 时间序列处理
字符串转时间:
pd.to_datetime(df['date_col']) 时间戳提取:
df['datetime_col'].dt.year 时间偏移:
df['datetime_col'] + pd.Timedelta(days=1) 时间序列重采样
降采样:
df.resample('M').mean() 升采样:
df.resample('D').ffill() 自定义重采样:
df.resample('Q').agg({'A':'sum', 'B':'mean'}) 滚动窗口:
df.rolling(window=3).mean() 扩展窗口:
df.expanding().sum() 数据合并与连接
简单合并:
pd.concat([df1, df2], axis=0) 索引对齐合并:
pd.merge(df1, df2, on='key') 多键合并:
pd.merge(df1, df2, left_on=['key1', 'key2'], right_on=['key1', 'key2']) 不同合并方式:
pd.merge(df1, df2, how='outer') 索引合并:
df1.join(df2, how='left') 数据变形
宽表转长表:
pd.melt(df, id_vars=['A'], value_vars=['B', 'C']) 长表转宽表:
df.pivot(index='date', columns='variable', values='value') 交叉表:
pd.crosstab(df['A'], df['B']) 虚拟变量:
pd.get_dummies(df['category_col']) 性能优化技巧
矢量化操作:
df['new_col'] = df['A'] * 2 避免循环:
df.apply(lambda x: x['A'] * 2, axis=1) 使用eval()表达式:
df.eval('A + B') 类型优化:
df.astype({'A': 'int32'}) 分块处理:
pd.read_csv('large.csv', chunksize=10000) 内存管理
查看内存使用:
df.memory_usage(deep=True) 减少内存占用:
df.astype('category') 稀疏数据结构:
pd.arrays.SparseArray(df['col']) 释放内存:
del df; gc.collect() 数据可视化
折线图绘制(plt.plot())
折线图适用于展示数据随时间或有序类别的变化趋势。以下是一个包含完整注释的示例:
import matplotlib.pyplot as plt import numpy as np # 生成示例数据 x = np.linspace(0, 10, 100) # 0到10的100个等间隔数 y = np.sin(x) # 生成正弦曲线 # 绘制折线图 plt.plot(x, y, color='red', # 线条颜色 linestyle='--', # 虚线样式 linewidth=2, # 线宽 marker='o', # 数据点标记 markersize=5, # 标记大小 label='sin(x)') # 图例标签 # 添加标题和坐标轴标签 plt.title('Sine Wave Example', fontsize=14) plt.xlabel('X-axis', fontsize=12) plt.ylabel('Y-axis', fontsize=12) # 显示图例并调整网格 plt.legend(loc='upper right') plt.grid(True, linestyle=':', alpha=0.5) # 显示图形 plt.show() 散点图绘制(plt.scatter())
散点图用于展示两个变量之间的相关性或分布。示例代码:
# 生成随机数据 np.random.seed(42) x = np.random.randn(50) y = x * 2 + np.random.randn(50) * 0.5 # 绘制散点图 plt.scatter(x, y, c='blue', # 点颜色 s=80, # 点大小 alpha=0.6, # 透明度 edgecolors='black', # 边缘颜色 label='Data Points') # 添加回归线 plt.plot(np.unique(x), np.poly1d(np.polyfit(x, y, 1))(np.unique(x)), color='red', label='Trend Line') # 样式调整 plt.title('Scatter Plot with Trend Line', fontsize=14) plt.xlabel('Independent Variable', fontsize=12) plt.ylabel('Dependent Variable', fontsize=12) plt.legend() plt.show() 子图绘制(plt.subplots())
子图功能允许在同一画布上展示多个图形。示例:
# 创建2x2的子图布局 fig, axes = plt.subplots(2, 2, figsize=(10, 8)) # 子图1:折线图 axes[0, 0].plot(x, np.sin(x), color='green') axes[0, 0].set_title('Subplot 1: Sine Wave') # 子图2:散点图 axes[0, 1].scatter(x, y, color='orange') axes[0, 1].set_title('Subplot 2: Scatter Plot') # 子图3:柱状图 axes[1, 0].bar(['A', 'B', 'C'], [3, 7, 4], color='purple') axes[1, 0].set_title('Subplot 3: Bar Chart') # 子图4:直方图 axes[1, 1].hist(np.random.randn(1000), bins=20, color='pink') axes[1, 1].set_title('Subplot 4: Histogram') # 调整子图间距 plt.tight_layout() plt.show() 扩展绘图类型
柱状图(plt.bar())
categories = ['Category A', 'Category B', 'Category C'] values = [12, 24, 8] plt.bar(categories, values, color=['#FF5733', '#33FF57', '#3357FF'], edgecolor='black', width=0.6) plt.title('Bar Chart Example') plt.xticks(rotation=45) # 旋转x轴标签 plt.show() 饼图(plt.pie())
labels = ['Apples', 'Oranges', 'Bananas'] sizes = [30, 45, 25] explode = (0.1, 0, 0) # 突出显示第一部分 plt.pie(sizes, labels=labels, explode=explode, autopct='%1.1f%%', # 显示百分比 shadow=True, startangle=90) plt.title('Pie Chart Example') plt.show() 箱线图(plt.boxplot())
data = [np.random.normal(0, std, 100) for std in range(1, 4)] plt.boxplot(data, notch=True, # 缺口显示中位数置信区间 patch_artist=True, boxprops=dict(facecolor='lightblue')) plt.title('Boxplot Example') plt.xticks([1, 2, 3], ['Group 1', 'Group 2', 'Group 3']) plt.show() 样式高级调整
- 自定义颜色与样式
- 使用十六进制颜色码(如
#FF5733)或RGB元组(如(0.1, 0.2, 0.5))。 - 线型参数:
'-'(实线)、'--'(虚线)、':'(点线)。
- 使用十六进制颜色码(如
全局样式设置
plt.style.use('ggplot') # 使用预置主题(如 'ggplot', 'seaborn') 保存图形
plt.savefig('output.png', dpi=300, bbox_inches='tight') # 高分辨率保存 Seaborn高级可视化统计图形详解
Seaborn是基于Matplotlib的Python数据可视化库,提供更高级的统计图形接口。以下将详细介绍常用图形及进阶操作。
直方图(sns.histplot())
直方图用于展示连续变量的分布情况,通过bin将数据分段统计频率。
import seaborn as sns import matplotlib.pyplot as plt # 加载示例数据集 tips = sns.load_dataset("tips") # 基础直方图 sns.histplot(data=tips, x="total_bill") plt.title("Total Bill Distribution") plt.show() # 添加核密度估计 sns.histplot(data=tips, x="total_bill", kde=True) plt.title("With KDE Estimation") plt.show() # 分组直方图 sns.histplot(data=tips, x="total_bill", hue="sex", element="step") plt.title("Grouped by Gender") plt.show() 关键参数说明:
kde:是否叠加核密度曲线hue:按分类变量分组着色bins:手动设置分箱数量stat:可改为"density"显示密度而非计数
箱线图(sns.boxplot())
箱线图展示数据分布的五数概括(最小值、Q1、中位数、Q3、最大值)及离群点。
# 基础箱线图 sns.boxplot(data=tips, x="day", y="total_bill") plt.title("Daily Bill Distribution") plt.show() # 添加分组维度 sns.boxplot(data=tips, x="day", y="total_bill", hue="smoker") plt.title("With Smoking Status") plt.show() # 横向箱线图 sns.boxplot(data=tips, y="day", x="total_bill", orient="h") plt.title("Horizontal Orientation") plt.show() 进阶技巧:
showfliers=False可隐藏离群点whis参数调整离群点判定范围- 结合
swarmplot()可叠加原始数据点
散点矩阵(sns.pairplot())
散点矩阵可同时展示多个变量间的两两关系。
# 基础散点矩阵 sns.pairplot(data=tips) plt.suptitle("Pairwise Relationships") plt.show() # 添加分类着色 sns.pairplot(data=tips, hue="time", corner=True) plt.suptitle("Colored by Meal Time") plt.show() # 自定义对角线图形 sns.pairplot( data=tips, diag_kind="kde", plot_kws={"alpha": 0.6}, height=2.5 ) plt.suptitle("Custom Diagonal Plots") plt.show() 参数优化:
vars选择特定列markers为不同类别指定形状palette自定义颜色方案
热力图(sns.heatmap())
热力图通过颜色深浅展示矩阵数据值大小。
# 计算相关系数矩阵 corr = tips.corr() # 基础热力图 sns.heatmap(corr, annot=True, fmt=".2f") plt.title("Correlation Heatmap") plt.show() # 自定义热力图 sns.heatmap( corr, cmap="coolwarm", center=0, linewidths=.5, annot_kws={"size": 10} ) plt.title("Styled Heatmap") plt.show() 高级应用:
- 结合
clustermap()实现层次聚类热图 mask参数可隐藏部分矩阵cbar_kws自定义颜色条样式
进阶图形扩展
小提琴图(sns.violinplot())
结合箱线图和核密度估计的增强图形。
sns.violinplot(data=tips, x="day", y="total_bill", inner="quartile") plt.title("Violin Plot Example") plt.show() 分面网格(sns.FacetGrid)
创建多面板图形矩阵。
g = sns.FacetGrid(tips, col="time", row="smoker") g.map(sns.scatterplot, "total_bill", "tip") g.add_legend() plt.show() 回归图(sns.lmplot())
展示变量间线性关系。
sns.lmplot( data=tips, x="total_bill", y="tip", hue="smoker", markers=["o", "x"] ) plt.title("Regression Plot") plt.show() 分布对比图(sns.ecdfplot())
经验累积分布函数图。
sns.ecdfplot(data=tips, x="total_bill", hue="time") plt.title("ECDF Plot") plt.show() 样式与主题设置
# 设置整体样式 sns.set_style("whitegrid") sns.set_palette("husl") # 设置上下文(影响缩放比例) sns.set_context("notebook") # 可选paper/talk/poster # 自定义颜色调色板 custom_palette = sns.color_palette(["#9b59b6", "#3498db", "#95a5a6"]) sns.set_palette(custom_palette) 图形保存
plt.figure(figsize=(10, 6)) sns.histplot(data=tips, x="total_bill") plt.savefig("histogram.png", dpi=300, bbox_inches="tight") 建议从基础图形开始练习,逐步叠加更复杂的参数和样式设置。
学习资源推荐
官方文档:NumPy/Pandas/Matplotlib/scikit-learn官网
实战平台:Kaggle入门竞赛、UCI数据集练习
代码示例:GitHub搜索python-data-science-tutorial
(注:每个模块建议配合Jupyter Notebook边学边练,从官方示例代码开始修改调试)