我有一个大的数据帧(数百行),它以正弦运动在零附近振荡. 当我调用我的数据时,最新的数据点要么是跟踪一个峰,要么是一个谷,不能用于我的目的,因为它不是完整的峰或谷.

我需要做的是找到上一个完整的峰或谷,并将其作为单独的数据帧返回.

下面是一些说明imtry 做什么的代码.


import matplotlib.pyplot as plt

import pandas as pd


data = pd.DataFrame(
    [1, 2, 3, 4, 3.7, 3.5, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -6.3, -6, -5.9, -5.3, -5, -4, -3, -2, 0, 1, 2, 4, 5, 3,
     2, 1, -1, -2], columns=list('T'))

plt.plot(data)
plt.axhline(y=0.0, color='r', linestyle='-')
plt.show()

Plotting this returns Output

因此,由于最近的数据是负的,我需要返回圈出的区域,因为它是最近的完整山谷.

因此,在本例中,我想返回一个数据帧形式的PERVICE_VALILE

previous_valley = [-1, -2, -3, -4, -5, -6, -6.3, -6, -5.9, -5.3, -5, -4, -3, -2]

当我调用数据时,它也可能是在跟踪峰值,因此我还需要一种方法来找到最近的完整峰值

目前,我可以通过颠倒数据帧来找到我想要的数据,然后遍历它,丢弃值,直到我到达我需要的峰顶或谷地(大量循环),但我会第一个承认它不是很有效或不是非常有效,所以我希望有人能给我指个更有效的方法.

谢谢!

推荐答案

Code

cond1 = data['T'].eq(0)
s = data['T'].mask(cond1).bfill()
grp = s.mul(s.shift()).lt(0).cumsum() # divide group by peak, valley

# find max group number of valley (except uncomplete valley)
target = grp[data['T'].lt(0) & grp.lt(grp.max())].max() 
# boolean indexing max groupy number of valley
out = data[grp.eq(target) & ~cond1]

输出:

      T
10  -1.0
11  -2.0
12  -3.0
13  -4.0
14  -5.0
15  -6.0
16  -6.3
17  -6.0
18  -5.9
19  -5.3
20  -5.0
21  -4.0
22  -3.0
23  -2.0

CHK与其他示例

data = pd.DataFrame([1, 2, 1, 0, -1, -2, -1, 0, 1, 2, 1, 0, -1, -2, -3, -2, -1, 0, 1, 2], columns=['T'])

数据:

[1, 2, 1, 0, -1, -2, -1, 0, 1, 2, 1, 0, -1, -2, -3, -2, -1, 0, 1, 2]

输出:

[-1, -2, -3, -2, -1]

Python相关问答推荐

Pandas 有条件轮班操作

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

Python库:可选地支持numpy类型,而不依赖于numpy

将tdqm与cx.Oracle查询集成

如何更新pandas DataFrame上列标题的de值?

基于行条件计算(pandas)

Matplotlib中的字体权重

Python—转换日期:价目表到新行

基于多个数组的多个条件将值添加到numpy数组

干燥化与列姆化的比较

以极轴表示的行数表达式?

仅取消堆叠最后三列

如何在Python中创建仅包含完整天数的月份的列表

如何获取给定列中包含特定值的行号?

将数据从一个单元格保存到Jupyter笔记本中的下一个单元格

按列表分组到新列中

对包含JSON列的DataFrame进行分组

组颠倒大Pandas 数据帧

将时间序列附加到数据帧