Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在数据帧中创建显示上次记录峰值的列?_Python_Pandas_Scipy - Fatal编程技术网

Python 如何在数据帧中创建显示上次记录峰值的列?

Python 如何在数据帧中创建显示上次记录峰值的列?,python,pandas,scipy,Python,Pandas,Scipy,我正在尝试创建一个新的列,该列将列出上次记录的峰值,直到出现下一个峰值。例如,假设这是我现有的数据帧: index values 0 10 1 20 2 15 3 17 4 15 5 22 6 20 我想得到这样的东西: index values last_recorded_peak 0 10 10 1 20 20 2 15 20 3 17

我正在尝试创建一个新的列,该列将列出上次记录的峰值,直到出现下一个峰值。例如,假设这是我现有的数据帧:

index values
0      10
1      20
2      15
3      17
4      15
5      22
6      20
我想得到这样的东西:

index values last_recorded_peak
0      10        10
1      20        20
2      15        20
3      17        17
4      15        17
5      22        22
6      20        22
到目前为止,我已经尝试了np.max.acculate,它“累积”了最大值,但不完全是“峰值”(有些峰值可能低于最大值)

我还尝试了使用scipy.signal.find_peaks,它返回一个索引数组,在我的峰值所在的位置(在示例中,索引1、3、5),这不是我想要的


我是一个比较新的编码,任何指针都非常感谢

你走在正确的轨道上,这就是我要走的路,你只需要从结果中做一点工作:

from scipy import signal
peaks = signal.find_peaks(df['values'])[0]

df['last_recorded_peak'] = (df.assign(last_recorded_peak=float('nan'))
                              .last_recorded_peak
                              .combine_first(df.loc[peaks,'values'])
                              .ffill()
                              .combine_first(df['values']))


如果我正确理解你的意思,那么你正在寻找:

注意:对于示例数据帧,您可能需要使用我在
2
上设置的
窗口大小

输出

   values  last_recorded_peak
0      10                10.0
1      20                20.0
2      15                20.0
3      17                17.0
4      15                17.0
5      22                22.0
6      20                22.0

第3行变回17这一事实的逻辑是什么?索引3中17处的值“峰值”。。指数2和指数4给出了15,这使得指数3成为价值序列中的峰值。我查阅了关于“滚动”的信息,但我的峰值可能没有以特定的间隔整齐地隔开,但还是要感谢!欢迎@qwerty123别忘了你可以投票和接受答案,看看你是否可以对本节中的所有组件做一个简单的解释:(df.assign(last_recorded_peak=float('nan')).last_recorded_peak.combined_first(df.loc[peaks,'values')).ffill().combine_first(df['values'])“部分。我感觉您首先将新创建的列中的所有值指定给'NaN',然后在'peaks'所在的'values'中填充'values',但最后一部分除外。ffill().combine_first(df['values'])“我似乎无法理解,
combine_first
是一种在存在NaN(匹配索引)的列中添加值的简单方法。因此第一个是从
df.loc[peaks,'values']
分配值。你会看到南边和相应的山峰。然后你向前填充。初始值(在第一个峰值之前)仍为NaN。这就是剩余联合收割机的用途(首先:)@qwerty123
df['last_recorded_peak'] = df['values'].rolling(2).max().fillna(df['values'])
   values  last_recorded_peak
0      10                10.0
1      20                20.0
2      15                20.0
3      17                17.0
4      15                17.0
5      22                22.0
6      20                22.0