我需要一些幫助來優化一段代碼。首先,我將提供一些背景資訊。我有一個具有 23k 行和 33 列的 DataFrame 代表預訂,另一個具有 2k 行和 50 列的 DataFrame 代表屬性。我想要了解每月的 GBV(總預訂價值)和每月預訂的晚數。棘手的部分是“每月”傾斜以下內容:
如果預訂時間為每月 25 日至下個月 5 日,且 ADR(平均每日房價)為 50 美元,則預訂結果如下:
第 1 個月預訂的晚數:7 晚(25 日至 31 日) 第 2 個月的預訂晚數:5 晚(1 日至 5 日) 第 1 個月 GBV:7 晚 * 50 美元 = 350 美元 第 2 個月 GBV:5 晚 * 50美元 = 250 美元
示例資料為: 在預訂資料框中:Arrival_date、Departure_date、Accommodation_amount 在屬性資料框中:每個月的 GBV 列和每個月的預訂夜數列
這是我目前正在使用的一段代碼:
i=0
while i < len(kpi):
if kpi['cod_reservation_status'][i] == 'CONF':
dateRange = pd.date_range(kpi['arrival'][i], kpi['departure'][i], freq='d', closed='left')
index = prop_index(int(kpi['id_room'][i]), props.id_room_type)
nGBV = kpi['accommodation_total_amount'][i] / len(dateRange)
for adate in dateRange:
if adate.month == 1 and adate.year == 2022:
props['January Booked'][index] = props['January Booked'][index] 1
props['January GBV'][index] = props['January GBV'][index] nGBV
if adate.month == 2 and adate.year == 2022:
props['February Booked'][index] = props['February Booked'][index] 1
props['February GBV'][index] = props['February GBV'][index] nGBV
if adate.month == 3 and adate.year == 2022:
props['March Booked'][index] = props['March Booked'][index] 1
props['March GBV'][index] = props['March GBV'][index] nGBV
if adate.month == 4 and adate.year == 2022:
props['April Booked'][index] = props['April Booked'][index] 1
props['April GBV'][index] = props['April GBV'][index] nGBV
if adate.month == 5 and adate.year == 2022:
props['May Booked'][index] = props['May Booked'][index] 1
props['May GBV'][index] = props['May GBV'][index] nGBV
if adate.month == 6 and adate.year == 2022:
props['June Booked'][index] = props['June Booked'][index] 1
props['June GBV'][index] = props['June GBV'][index] nGBV
if adate.month == 7 and adate.year == 2022:
props['July Booked'][index] = props['July Booked'][index] 1
props['July GBV'][index] = props['July GBV'][index] nGBV
if adate.month == 8 and adate.year == 2022:
props['August Booked'][index] = props['August Booked'][index] 1
props['August GBV'][index] = props['August GBV'][index] nGBV
if adate.month == 9 and adate.year == 2022:
props['September Booked'][index] = props['September Booked'][index] 1
props['September GBV'][index] = props['September GBV'][index] nGBV
if adate.month == 10 and adate.year == 2022:
props['October Booked'][index] = props['October Booked'][index] 1
props['October GBV'][index] = props['October GBV'][index] nGBV
if adate.month == 11 and adate.year == 2022:
props['November Booked'][index] = props['November Booked'][index] 1
props['November GBV'][index] = props['November GBV'][index] nGBV
if adate.month == 12 and adate.year == 2022:
props['December Booked'][index] = props['December Booked'][index] 1
props['December GBV'][index] = props['December GBV'][index] nGBV
i =1
這行得通并且可以完成作業,但是速度很慢。在 22k 條目上,我需要 2 分半鐘。我相信有一種方法可以優化這一點。歡迎任何想法。優化回圈的最佳實踐是什么?您將如何完成這項特定任務?
PS:kpi=reservationsDataFrame,props=propertiesDataFrame
uj5u.com熱心網友回復:
對于 pandas,您不能使用 while 和 for 回圈,因為可以使用用 C 代碼撰寫并編譯(比解釋更快)的 pandas 內置函式。
嘗試使用props.loc[:,"column"].apply("the function you want to apply")
使用 pandas,您必須考慮整個資料集,而不是迭代物件。
查看df.loc[row,col]和df.apply()的檔案
uj5u.com熱心網友回復:
Pandas 與 Numpy 一樣,被認為用于向量運算。盡可能避免迭代,想想“塊”方程。
一些技巧:
- 使用諸如
query快速資料訪問之類的結構,例如df.query("reserved=True") - 此外
apply(),您可以“explode()”日期范圍:這將創建新行,您可以在其中并行應用操作(日期 = 預訂日期) - ...
對于 Pandas/Numpy,唯一鼓勵使用for/while回圈的地方是使用 Numba 或 Cython
uj5u.com熱心網友回復:
我注意到你有這個:
i=0
while i < len(kpi):
while回圈比回圈for慢。因為 while 回圈在每次迭代后檢查條件。
所以你應該用這個替換它:
for i in range(len(kpi) - 1)
您需要減去一個的原因是因為您希望i始終小于len(kpi)因為當您使用開始時的索引時0
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/478501.html
