目录
pinghua.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 生成示例数据(含噪声的正弦波)
np.random.seed(42)
x = np.linspace(0, 10, 200)
y = np.sin(x) + np.random.normal(0, 0.1, 200)
# 简单移动平均函数
def moving_average(data, window_size):
return pd.Series(data).rolling(window_size, center=True).mean().values
window_size = 9
sma = moving_average(y, window_size)
# 可视化
plt.figure(figsize=(12, 6))
plt.plot(x, y, label='Original', alpha=0.5)
plt.plot(x, sma, label=f'SMA (window={window_size})', color='red')
plt.legend()
plt.title('Simple Moving Average')
plt.show()
def median_filter(data, window_size):
return pd.Series(data).rolling(window_size, center=True).median().values
median = median_filter(y, window_size)
plt.figure(figsize=(12, 6))
plt.plot(x, y, label='Original', alpha=0.5)
plt.plot(x, median, label=f'Median Filter (window={window_size})', color='purple')
plt.legend()
plt.title('Median Filter')
plt.show()
from scipy.signal import savgol_filter
def savitzky_golay(data, window_size, poly_order=2):
return savgol_filter(data, window_size, poly_order)
poly_order = 3 # 多项式阶数
savgol = savitzky_golay(y, window_size, poly_order)
plt.figure(figsize=(12, 6))
plt.plot(x, y, label='Original', alpha=0.5)
plt.plot(x, savgol, label=f'Savitzky-Golay (window={window_size}, order={poly_order})', color='orange')
plt.legend()
plt.title('Savitzky-Golay Filter')
plt.show()
plt.figure(figsize=(14, 8))
plt.plot(x, y, label='Original', alpha=0.3, linewidth=2)
plt.plot(x, sma, label='Moving Average', linestyle='--')
plt.plot(x, median, label='Median Filter', linestyle=':')
plt.plot(x, savgol, label='Savitzky-Golay')
plt.legend()
plt.title('Smoothing Methods Comparison')
plt.xlabel('Time')
plt.ylabel('Value')
plt.grid(True)
plt.show()
moving_average函数说明:
处理一维数据,使用Pandas的rolling
方法计算移动平均。参数center=True
确保窗口居中,min_periods=1
允许在数据不足时使用可用数据进行计算,避免结果中出现NaN。
3d点平滑,3个轴分别平滑
import numpy as np
import pandas as pd
def moving_average_3d(points, window_size):
"""3D点序列滑动平均
:param points: (n,3)形状的numpy数组
:param window_size: 窗口大小(奇数)
"""
df = pd.DataFrame(points, columns=['x', 'y', 'z'])
# 各轴独立滑动平均(居中窗口)
smoothed = df.rolling(window=window_size, center=True, min_periods=1).mean()
return smoothed.values
# 示例数据:随机3D轨迹
np.random.seed(42)
n = 50
raw_points = np.cumsum(np.random.randn(n,3)*0.5, axis=0) # 含噪声的随机游走
# 应用滑动平均
window = 5 # 窗口大小(建议使用奇数)
smoothed_points = moving_average_3d(raw_points, window)