数据框中接下来 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
如果您还有任何问题,请告诉我们!
我需要弄清楚如何计算一列中低于该值的值出现在另一列中接下来的 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
如果您还有任何问题,请告诉我们!