我需要弄清楚如何计算一列中低于该值的值在另一列中接下来的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行中,"最后价格"中的值有多少次低于"B50"列中的第一个值(1244.325(;计数";作为新列"计数B50"中的值,该值将在日期行2020-04-03上。
然后在下一行(日期行2020-06-04(,我会计算在接下来的20行中,"最后价格"值低于"B50"中第二个值(1331.84(的次数,并将其记录在日期行2020:06-04的"计数B50"列中…依此类推
您可以使用DataFrame方法rolling
。既然你想要一个窗口;展望未来";对于接下来的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
如果您有任何进一步的问题,请告诉我们!