数据框中接下来 x 行的频率

Frequency over next x rows in dataframe

我需要弄清楚如何计算一列中低于该值的值出现在另一列中接下来的 x 行中的频率。

粘贴一些数据应该会更清楚:

              DATE    Last Price    B50
  ID            
SPX Index   2020-04-03  2488.65 1244.325

SPX Index   2020-04-06  2663.68 1331.840

SPX Index   2020-04-07  2659.41 1329.705

SPX Index   2020-04-08  2749.98 1374.990

SPX Index   2020-04-09  2789.82 1394.910

SPX Index   2020-04-13  2761.63 1380.815

SPX Index   2020-04-14  2846.06 1423.030

SPX Index   2020-04-15  2783.36 1391.680

SPX Index   2020-04-16  2799.55 1399.775

SPX Index   2020-04-17  2874.56 1437.280

SPX Index   2020-04-20  2823.16 1411.580

SPX Index   2020-04-21  2736.56 1368.280

SPX Index   2020-04-22  2799.31 1399.655

SPX Index   2020-04-23  2797.80 1398.900

SPX Index   2020-04-24  2836.74 1418.370

SPX Index   2020-04-27  2878.48 1439.240

SPX Index   2020-04-28  2863.39 1431.695

SPX Index   2020-04-29  2939.51 1469.755

SPX Index   2020-04-30  2912.43 1456.215

SPX Index   2020-05-01  2830.71 1415.355

SPX Index   2020-05-04  2842.74 1421.370

SPX Index   2020-05-05  2868.44 1434.220

SPX Index   2020-05-06  2848.42 1424.210

SPX Index   2020-05-07  2881.19 1440.595

SPX Index   2020-05-08  2929.80 1464.900

SPX Index   2020-05-11  2930.32 1465.160

SPX Index   2020-05-12  2870.12 1435.060

SPX Index   2020-05-13  2820.00 1410.000

SPX Index   2020-05-14  2852.50 1426.250

SPX Index   2020-05-15  2863.70 1431.850

所以我希望能够输入天数(如果您愿意,也可以输入行数)。让我们在这个例子中使用 20。 然后我需要能够计算在接下来的 20 行中 'Last Price' 中的值低于第一个值的次数 'B50' (1244.325) 。然后,我会将此“计数”记录为新列 'Count B50' 中的一个值,该列将在日期行 2020-04-03 上。

然后在下一行(日期行 2020-06-04)我会计算在接下来的 20 行中 'Last Price' 值低于 'B50' 中第二个值的次数(1331.84) 并将其记录在日期行 2020-06-04 的 'Count B50' 列中……依此类推。

您可以使用 DataFrame 方法 rolling。因为你想要一个 window “期待”接下来的 N 行(加上实际的行),你可以这样做:

indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=N+1)

df['Count_B50'] = (df['Last_Price'].rolling(indexer, min_periods=1)
                                   .apply(lambda window: (window <
                                                          df['B50'].iloc[window.index.min()]
                                                          ).sum()))

如果您不想在计算中包含实际行,您可以在 rolling.

的调用中添加关键字参数 closed="right"

无论哪种方式,对于您的测试数据,输出如下(前五行):

       DATE  Last_Price       B50  Count_B50
 2020-04-03     2488.65  1244.325        0.0
 2020-04-06     2663.68  1331.840        0.0
 2020-04-07     2659.41  1329.705        0.0
 2020-04-08     2749.98  1374.990        0.0
 2020-04-09     2789.82  1394.910        0.0

如果您还有任何问题,请告诉我们!