[英]Compare current month rate against a base rate (old rate) using .shift() option
我有大量的項目數據集,其中包含員工特定的每月計費率以及計費時間。 我正在尋找創建 python 代碼,它可以檢測員工的費率變化並通過每月與舊費率(基本費率)進行比較來得出增量增加(新舊)。 我嘗試使用以下代碼:
我的數據集 (df) 的簡化版本如下所示:
Proj_ID Empl_ID Bill_Date Bill_Rate Bill_hours
1234 780313 1/31/2020 20 174.5
1234 780313 2/29/2020 25 160
1234 780313 3/31/2020 25 130
1234 780313 4/30/2020 25 145
7890 832123 1/31/2020 10 160
7890 832123 2/29/2020 15 125
7890 832123 3/31/2020 15 138
7890 832123 4/30/2020 15 156
以項目和員工 ID 組合作為唯一標識符的分配鍵:
df['key'] = df['Project_ID'] + df['Employee_ID']
使用np.where
& .shift
創建下面的代碼,通過將當前速率與“鍵”的先前速率進行比較來檢測速率增加,以檢測增加(Y/N)並獲得當月的增量收入:
df['Inc_Y/N'] = np.where((df['Bill_Rate'] - df.groupby(['key']).Bill_Rate.shift(1))>0, 'Yes', 'No')
df['Inc_rev'] = (df['Bill_Rate'] - df.groupby(['key']).Bill_Rate.shift(1))*df['Bill_hours']
基於上述,代碼能夠檢測到 2 月(對於項目 1234)和 3 月(對於項目 7890)和月份的增量增長,如下所示:
Proj_ID Emp_ID Bill_Date Bill_Rate Bill_hours Inc_Y/N Inc_rev
1234 780313 1/31/2020 20 174.5 No 0
1234 780313 2/29/2020 25 160 Yes 800
1234 780313 3/31/2020 25 130 No 0
1234 780313 4/30/2020 25 145 No 0
7890 832123 1/31/2020 10 160 No 0
7890 832123 2/29/2020 10 125 No 0
7890 832123 3/31/2020 15 138 Yes 690
7890 832123 4/30/2020 15 156 No 0
但是,在上述 output 中,在利率上漲之后的幾個月內,例如:項目 1234 - 代碼將 3 月 31 日的利率 (25) 與之前的 2 月 29 日 (25) 的利率進行比較,而不是 1 月 31 日 (20) 到期的舊利率我將那幾個月的增量收入設為 0。
誰能告訴我我哪里出錯了?
我相信這就是你想要做的:
df["first_month_rate"] = df.groupby("Proj_ID").Bill_Rate.transform("first")
df["Inc_rev"] = (df.Bill_Rate - df.first_month_rate) * df.Bill_hours
print(df)
Output:
Proj_ID Empl_ID Bill_Date Bill_Rate Bill_hours first_month_rate Inc_rev
0 1234 780313 2020-01-31 20 174.5 20 0.0
1 1234 780313 2020-02-29 25 160.0 20 800.0
2 1234 780313 2020-03-31 25 130.0 20 650.0
3 1234 780313 2020-04-30 25 145.0 20 725.0
4 7890 832123 2020-01-31 10 160.0 10 0.0
5 7890 832123 2020-02-29 15 125.0 10 625.0
6 7890 832123 2020-03-31 15 138.0 10 690.0
7 7890 832123 2020-04-30 15 156.0 10 780.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.