python - 找出 pandas df 中滚动函数的索引
问题描述
我有一个带有一些值的 pandas df,我试图找出列或滚动基础的最小值,以及这些滚动最小值的索引。
例如,
df["low"].rolling(200).min()
在滚动 200 周期中创建一系列最小“低点”。
有人可以建议如何获得该新滚动系列的“低”指数吗?
解决方案
您可以使用argmin
:
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame({'low': np.random.randint(0,100,20)})
window_size = 4
df['min'] = df['low'].rolling(window_size).min()
df['min_idx'] = (df['low'].rolling(window_size).apply(np.argmin) + df.index - window_size + 1).astype('Int64')
结果:
low min min_idx
0 44 NaN <NA>
1 47 NaN <NA>
2 64 NaN <NA>
3 67 44.0 0
4 67 47.0 1
5 9 9.0 5
6 83 9.0 5
7 21 9.0 5
8 36 9.0 5
9 87 21.0 7
10 70 21.0 7
11 88 36.0 8
12 88 70.0 10
13 12 12.0 13
14 58 12.0 13
15 65 12.0 13
16 39 12.0 13
17 87 39.0 16
18 46 39.0 16
19 88 39.0 16
以上适用于从
0
到的范围索引len(df)-1
。如果您有任何其他索引,它会变得更加复杂:
np.random.seed(0)
df = pd.DataFrame({'low': np.random.randint(0,100,20)})
df.index = np.random.permutation(20)
window_size = 4
df['min'] = df['low'].rolling(window_size).min()
min_idx = df.index[(df['low'].rolling(window_size).apply(np.argmin) + pd.RangeIndex(len(df)) - window_size + 1)[window_size-1:].astype(int)]
df['min_idx'] = [np.nan]*(window_size - 1) + min_idx.tolist()
df['min_idx'] = df['min_idx'].astype('Int64')
结果:
low min min_idx
6 44 NaN <NA>
14 47 NaN <NA>
16 64 NaN <NA>
10 67 44.0 6
7 67 47.0 14
1 9 9.0 1
15 83 9.0 1
11 21 9.0 1
2 36 9.0 1
12 87 21.0 11
18 70 21.0 11
19 88 36.0 2
0 88 70.0 18
3 12 12.0 3
4 58 12.0 3
9 65 12.0 3
8 39 12.0 3
13 87 39.0 8
5 46 39.0 8
17 88 39.0 8
推荐阅读
- doxygen - Doxygen:使 C++ 的高亮代码具有与 Visual Studio 相同的颜色
- xamarin.forms - 将 android 应用程序分发到 AzureDevops 管道上的 AppCenter 时的状态代码 405
- corda - Corda 节点使用 postgresql 和 schema 时结果集大于一行
- python - 尝试使用 python 连接到 Exchange 邮件帐户时出现错误“无法使用密钥创建缓存协议..”
- django - 使用 django profileserializer 获取用户名
- java - 如何在骆驼测试中配置 application.properties?
- javascript - 在 Ruby on Rails 中对 html 部分渲染执行 javascript
- angular - 如何在材料表中添加过滤器行?
- php - 致命错误的问题:调用未定义的函数 filter_var()
- php - Laravel 如何使用 if else 调用函数