ความถี่ใน x แถวถัดไปใน 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 ในตัวอย่างนี้ ฉันจะต้องสามารถคำนวณได้ว่าค่าใน 'ราคาล่าสุด' ต่ำกว่าค่าแรกในคอลัมน์ 'B50' (1244.325) กี่ครั้งใน 20 แถวถัดไป จากนั้น ฉันจะบันทึกการนับนี้เป็นค่าในคอลัมน์ใหม่ 'นับ B50' และจะอยู่ในบรรทัดวันที่ 2020-04-03

จากนั้นในแถวถัดไป (บรรทัดวันที่ 04-06-2020) ฉันจะนับจำนวนครั้งใน 20 แถวถัดไปที่ค่า 'ราคาล่าสุด' ต่ำกว่าค่าที่สองใน 'B50' (1331.84) และบันทึกสิ่งนี้ในคอลัมน์ 'นับ B50' ในบรรทัดวันที่ 2020-06-04...และอื่นๆไปเรื่อยๆ


person breaker7    schedule 11.12.2020    source แหล่งที่มา


คำตอบ (1)


คุณสามารถใช้เมธอด 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()))

หากคุณไม่ต้องการรวมแถวจริงในการคำนวณ คุณสามารถเพิ่มอาร์กิวเมนต์คำหลัก closed="right" ในการเรียก rolling ได้

ไม่ว่าจะด้วยวิธีใด สำหรับข้อมูลทดสอบของคุณ ผลลัพธ์จะเป็นดังนี้ (สำหรับห้าแถวแรก):

       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

แจ้งให้เราทราบหากคุณมีปัญหาเพิ่มเติม!

person Ralubrusto    schedule 11.12.2020
comment
ใช้งานได้ดี ขอบคุณมาก. ฉันไม่ทราบวิธีการ ForwardWindow - person breaker7; 15.12.2020