【问题标题】:Baseline subtraction/removal of a pandas DataFrame (Python)pandas DataFrame(Python)的基线减法/删除
【发布时间】:2019-01-27 16:20:32
【问题描述】:

我有一些细胞发光的实验延时数据。不幸的是,基线会随着时间而变化(例如,参见附图,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 提供)

【问题讨论】:

  • 请提供 minimal reproducible example(没有图片/链接,只有文字)。
  • 我很抱歉。我对 Python 还是很陌生,并且边走边学。我真的不知道如何为随机噪声信号编写短代码,而且也不可能仅附上我的 DataFrame 的样本。但是,我设法从一个旧问题中找到了一个并将其添加。

标签: python pandas matplotlib baseline


【解决方案1】:

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

LSTM 还可以处理非平稳数据。请参阅this answer 以获得更多有用的讨论。

【讨论】:

  • statsmodels 模块的问题是我必须指定顺序。当一些似乎是二阶而另一些似乎是一阶时,这就会成为问题。我想我可以根据它创建两个不同的数据框,然后尝试该模块。但我仍然希望有一个可以直接在数据帧上工作的解决方案,因为我有 20 个不同的解决方案(来自独立实验)。
猜你喜欢
  • 1970-01-01
  • 2013-12-16
  • 2020-09-15
  • 2017-10-16
  • 2012-09-14
  • 2021-03-14
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多