python - Savgol 过滤数据框列
问题描述
我正在尝试应用 SciPy 的 savgol 过滤器来平滑我的数据。通过分别选择每一列、定义一个新的 y 值并绘制它,我已经成功地应用了过滤器。但是,我想以更有效的方式在数据帧中应用该函数。
y0 = alldata_raw.iloc[:,0]
w0 = savgol_filter(y0, 41, 1)
我的第一个想法是创建一个空数组,编写一个 for 循环将函数应用于每一列,将其附加到数组中,最后连接数组。但是我收到一个错误'TypeError:无法连接类型为“”的对象;只有 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)obj 有效'
smoothed_array = []
for key,values in alldata_raw.iteritems():
y = savgol_filter(values, 41, 1)
smoothed_array.append(y)
alldata_smoothed = pd.concat(smoothed_array, axis=1)
相反,我尝试使用 pd.apply() 函数,但是我遇到了问题。我有一条错误消息:“TypeError:预期 x 和 y 的长度相同”
alldata_smoothed = alldata_raw.apply(savgol_filter(alldata_raw, 41, 1), axis=1)
print(alldata_smoothed)
我对 python 很陌生,所以任何关于如何使每种方法工作的建议以及哪种方法更可取将不胜感激!
解决方案
为了使用过滤器,首先创建一个带有单个参数的函数 - 列数据。然后您可以将其应用于数据框列,如下所示:
from scipy.signal import savgol_filter
def my_filter(x):
return savgol_filter(x, 41, 1)
alldata_smoothed = alldata_raw.apply(my_filter)
你也可以使用一个lambda
函数:
alldata_smoothed = alldata_raw.apply(lambda x: savgol_filter(x,41,1))
axis=1
inapply
指定将函数应用于数据框行。您需要的是默认选项axis=0
,这意味着将其应用于列。
这很笼统,但文档告诉savgol_filter
我它也接受一个axis
论点。因此,在这种特定情况下,您可以一次将过滤器应用于整个数据帧。这可能会更高效,但我还没有检查 =)。
alldata_smoothed = pd.DataFrame(savgol_filter(alldata_raw, 41, 1, axis=0),
columns=alldata_raw.columns,
index=alldata_raw.index)
推荐阅读
- arrays - 通过使用过滤器功能反应从数组中删除项目,为什么uuid不断变化?
- c++ - 尝试使用 CGI 读取字符串时从 sscanf 获取错误
- python - Windows 10 上的 Docker 构建错误“执行程序运行失败...”
- python - 当范围不是数字时,在python中嵌套for循环
- linux - Postgres basebackup - 无法在 WAL 发件人中执行 SQL 命令以进行物理复制
- c# - 在碰撞Unity2D时将方向更改为随机方向
- react-native - 在 faltlistsliders 中,scrolltoindex 超出范围内的本机反应
- php - 每次我使用 $_POST 方法时未定义的变量 $id
- python - 如何使用python重命名文件夹中的图像名称?
- c# - 以不同方式获取用户主体时获取电子邮件地址的不同结果