Python 环境配置与外部库
环境配置与工具准备
安装 Python 3.8+ 版本
从 Python 官网 下载对应操作系统的安装包。勾选'Add Python to PATH'选项,确保环境变量自动配置。安装完成后,命令行输入 python --version 验证是否成功。
Python 3.8+ 环境的搭建流程,包括 Jupyter Notebook 配置及常用数据科学库(NumPy、Pandas、Matplotlib、Seaborn)的安装。内容涵盖 NumPy 数组操作、Pandas 数据处理与清洗、以及 Matplotlib 和 Seaborn 的可视化图表绘制方法,旨在帮助开发者快速掌握数据科学基础工具链。
从 Python 官网 下载对应操作系统的安装包。勾选'Add Python to PATH'选项,确保环境变量自动配置。安装完成后,命令行输入 python --version 验证是否成功。
通过命令行安装 Jupyter:
pip install jupyter notebook
启动 Jupyter:
jupyter notebook
浏览器将自动打开交互式界面,新建笔记本文件(扩展名为 .ipynb)即可开始编码。
在命令行中批量安装核心库:
pip install numpy pandas matplotlib seaborn scikit-learn
验证安装:
import numpy as np
print(np.__version__) # 应输出版本号无报错
Shift+Enter 执行当前单元格。# 编写标题或普通文本。例如:# 一级标题 ## 二级标题 *斜体*或**加粗**文本
推荐使用 conda 创建独立环境以避免依赖冲突:
conda create -n my_env python=3.8 conda activate my_env
后续所有库安装在此环境中进行。
?(如 np.array?)。Help > Keyboard Shortcuts 获取。使用 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]
通过列表创建:
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'])
通过字典创建:
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)
基础透视:
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()
折线图适用于展示数据随时间或有序类别的变化趋势。以下是一个包含完整注释的示例:
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()
散点图用于展示两个变量之间的相关性或分布。示例代码:
# 生成随机数据
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()
子图功能允许在同一画布上展示多个图形。示例:
# 创建 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()
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()
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()
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 是基于 Matplotlib 的 Python 数据可视化库,提供更高级的统计图形接口。以下将详细介绍常用图形及进阶操作。
直方图用于展示连续变量的分布情况,通过 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"显示密度而非计数箱线图展示数据分布的五数概括(最小值、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(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 自定义颜色方案热力图通过颜色深浅展示矩阵数据值大小。
# 计算相关系数矩阵
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(data=tips, x="day", y="total_bill", inner="quartile")
plt.title("Violin Plot Example")
plt.show()
创建多面板图形矩阵。
g = sns.FacetGrid(tips, col="time", row="smoker")
g.map(sns.scatterplot, "total_bill", "tip")
g.add_legend()
plt.show()
展示变量间线性关系。
sns.lmplot(
data=tips, x="total_bill", y="tip", hue="smoker", markers=["o", "x"]
)
plt.title("Regression Plot")
plt.show()
经验累积分布函数图。
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 边学边练,从官方示例代码开始修改调试)

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online