Frekuensi pada x baris berikutnya dalam kerangka data

Saya perlu mencari cara untuk menghitung frekuensi suatu nilai di bawah nilai dari satu kolom yang muncul pada x baris berikutnya di kolom lain.

Menempelkan beberapa data akan membuat ini lebih jelas:

              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

Jadi saya ingin memasukkan jumlah hari (atau jumlah baris jika Anda mau). Mari gunakan 20 dalam contoh ini. Saya kemudian harus dapat menghitung berapa kali dalam 20 baris berikutnya nilai di 'Last Price' berada di bawah nilai pertama di kolom 'B50' (1244.325) . Saya kemudian akan mencatat jumlah ini sebagai nilai di kolom baru 'Hitungan B50' dan itu akan berada pada baris tanggal 03-04-2020.

Kemudian pada baris berikutnya (baris tanggal 04-06-2020) saya akan menghitung berapa kali selama 20 baris berikutnya nilai 'Harga Terakhir' berada di bawah nilai kedua di 'B50' (1331,84) dan catat ini di kolom 'Hitung B50' pada baris tanggal 04-06-2020...dan seterusnya dan seterusnya.


person breaker7    schedule 11.12.2020    source sumber


Jawaban (1)


Anda dapat menggunakan metode DataFrame rolling. Karena Anda menginginkan jendela yang menantikan N baris berikutnya (ditambah yang sebenarnya), Anda dapat melakukan:

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()))

Jika Anda tidak ingin memasukkan baris sebenarnya dalam perhitungan, Anda cukup menambahkan argumen kata kunci closed="right" di dalam panggilan rolling.

Apa pun pilihannya, untuk data pengujian Anda, outputnya adalah sebagai berikut (untuk lima baris pertama):

       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

Beri tahu kami jika Anda memiliki masalah lebih lanjut!

person Ralubrusto    schedule 11.12.2020
comment
Bekerja dengan baik. Terimakasih banyak. Saya tidak mengetahui metode ForwardWindow. - person breaker7; 15.12.2020