首页 > 解决方案 > pandas DataFrame(Python)的基线减法/删除

问题描述

我有一些细胞发光的实验延时数据。不幸的是,基线会随着时间而变化(参见附图,例如https://i.stack.imgur.com/zjlBR.png),这使得分析数据变得更加困难。对于不同的样本,基线以不同的方式变化(例如,一些是线性减少/增加)。

我想知道是否有某种方法可以删除我的 DataFrame 中每一列的基线。我研究了 scipy 的 signal.detrend,但由于它不是完全线性的,在这种情况下它似乎没有用。在发布这个问题之前我已经搜索了几天,但我还没有找到合适的解决方案。我考虑过绘制局部最小值并减去它们,但我发现这种工具过于生硬,并且在包含 40 列的整个 DataFrame 上实现是不明智的。

我还找到了 peakutils 基线模块,但我发现它并不令人满意。有什么我错过的吗?这应该远不是实验数据中的一个独特问题,所以如果 SciPy 没有合适的模块,我会感到非常惊讶。下面是我希望能够从中减去基线的数据类型示例,有效地消除了周期性并使其或多或少呈线性。

import numpy as np    
n = 1000
limit_low = 0
limit_high = 0.48
my_data = np.random.normal(0, 0.5, n) \
      + np.abs(np.random.normal(0, 2, n) \
               * np.sin(np.linspace(0, 3*np.pi, n)) ) \
      + np.sin(np.linspace(0, 5*np.pi, n))**2 \
      + np.sin(np.linspace(1, 6*np.pi, n))**2
scaling = (limit_high - limit_low) / (max(my_data) - min(my_data))
my_data = my_data * scaling
my_data = my_data + (limit_low - min(my_data))

(代码由用户 Swier 提供)

标签: pythonpandasmatplotlibbaseline

解决方案


如果我正确理解您的问题,那么您正在处理的是非平稳时间序列。这是时间序列分析中的常见问题,但有一些方法可以处理非平稳数据或使其平稳(例如去趋势)。这些操作并非微不足道,并且有多种方法,主要是从 R 等更多面向统计的语言中复制而来(例如:https ://www.statsmodels.org/dev/generated/statsmodels.tsa.tsatools.detrend.html ) .

LSTM 还可以处理非平稳数据。有关更多有用的讨论,请参阅此答案


推荐阅读