### 使用Python进行曲线平滑
#### Numpy的应用
Numpy提供了一种高效的方式来进行基础的数据处理,对于一些简单的曲线平滑需求来说,可以通过多项式拟合来实现。通过`numpy.polyfit(x, y, deg)`函数可以找到最佳拟合直线或多阶次的多项式方程[^1]。
```python
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 4 * np.pi, 50)
y = np.sin(x) + (np.random.rand(len(x)) - 0.5)
z = np.polyfit(x, y, 3) # 进行三阶多项式拟合
p = np.poly1d(z)
xp = np.linspace(min(x), max(x), 100)
plt.plot(x, y, '.', xp, p(xp), '-')
plt.show()
```
此段代码展示了如何利用Numpy中的`polyfit()`以及`poly1d()`两个功能完成对原始数据点集$(x,y)$基于三次多项式的拟合并绘制出光滑后的趋势图[^2]。
#### SciPy的应用
SciPy扩展了Numpy的功能,在信号处理方面提供了更强大的工具箱,比如`savgol_filter()`可以从scipy.signal模块调用来执行Savitzky-Golay滤波器算法,这是一种广泛应用于光谱学和平滑时间序列数据分析的技术。
```python
from scipy.signal import savgol_filter
filtered_y = savgol_filter(y, window_length=7, polyorder=2)
plt.figure(figsize=(8,6))
plt.plot(x, y,'o', label='Original Data')
plt.plot(x, filtered_y, '-', lw=2,label="Filtered Signal")
plt.legend(loc='best')
plt.show()
```
上述例子中选择了窗宽为7、二次多项式的Savitzky–Golay过滤器用于去除噪声并使曲线更加平滑。
#### Pandas的应用
虽然Pandas主要用于结构化数据分析,但它同样能够辅助做简单的时间序列平滑工作。例如采用移动窗口均值法(Rolling Mean),即通过对连续子区间求平均值得到新的序列达到降噪效果[^3]。
```python
import pandas as pd
df = pd.DataFrame({'data': y}, index=x)
rolling_mean = df['data'].rolling(window=5).mean()
plt.figure(figsize=(8,6))
plt.plot(df.index, df.values, 'o-',label='Original Data')
plt.plot(rolling_mean.index, rolling_mean.values, '-r',lw=2,label="Moving Average Smoothing")
plt.legend(loc='best')
plt.show()
```
这段脚本先构建了一个包含$x$作为索引列和$y$作为数值列的数据框对象,接着应用`.rolling().mean()`方法实现了宽度为五的数据帧上滚动平均数计算,并最终绘制成图表展示原系列与经过平滑处理之后的结果对比。