我有一項任務需要在我的資料框中多次更改資料。我在 Jupyter notebook 中使用回圈寫了答案,運行大約需要 2.5 分鐘。
但是,當我使用模塊和定義將代碼重寫為 pycharm 時,大約需要 20 分鐘,而且我不知道我在哪里犯了錯誤。
這是對我的任務的解釋和我用 Jupyter 撰寫的想法,也許你會有一些想法,我可以如何寫得更好。
我有一個資料框,其中包含上周 0w 時工廠每周售出的玩具數量。
ID 0w 1w 2w 3w 4w 5w 6w 7w 8w 9w 10w 11w 12w 13w
0 0 1 0 0 5 1 65 2 62 1 1 2 1 60
1 0 0 1 5 16 0 2 0 0 40 0 100 0 0
2 0 3 0 0 0 0 0 40 0 0 20 0 0 0
3 0 5 6 0 0 0 0 0 0 0 0 0 0 0
4 0 1 0 0 0 0 0 0 0 0 0 0 0 0
第一步是將我的 df 中的每一行保存到串列“week_qty”的串列中:
week_qty = []
lenOfRows = len(copiedData)
for i in range(0, lenOfRows):
week_qty.append(weeksQtyEXTdata.iloc[i])
week_qty[0] = [0 1 0 0 5 1 65 2 62 1 1 2 1 60]
第二步是獲取每行的 90% 和 10% 的值并與串列的每個值進行比較,因此對于第一行 90% = 61.4 和 10% = 0。如果單元格中的值低于 p10,我會更改將其設定為 p10 的值,如果它高于 p90,我將其更改為 p90 的值。
def CalcPercenatage(week_qty,oneWeek):
p10=np.percentile(weekDemand,10)
p90=np.percentile(weekDemand,90)
if (oneWeek < p10):
return p10
elif(oneWeek > p90):
return p90
else:
return oneWeek
CalcPercenatage(week_qty[0]) = [60, 1, 2, 1, 1, 61.4, 2, 61.4, 1, 5, 0, 0, 1, 0]
最后一步是創建這些值的矩陣,并為每一行的 14 個單元格中的每一行執行此操作:
for i in range(0, lenOfRows):
Rows = []
for j in range(0, 14):
Rows.append(CalcPercenatage(week_qty[i], week_qty[i][j]))
MatrixBetweenWeeks.append(Rows)
我想讓它更快,對于 pycharm 中的 31000 個資料,它的作業時間太長了。
uj5u.com熱心網友回復:
您可以使用clip:
p10, p90 = np.percentile(df.iloc[:, 1:], [10, 90], axis=1)
out = df.iloc[:, 1:].clip(p10, p90, axis=0)
out['Average'] = out.mean(axis=1)
out = pd.concat([df.iloc[:, :1], out], axis=1)
輸出:
>>> out
ID 0w 1w 2w 3w 4w 5w 6w 7w 8w 9w 10w 11w 12w 13w Average
0 0 0 1.0 0.0 0 5 1 61.4 2.0 61.4 1.0 1.0 2.0 1 60 14.057143
1 1 0 0.0 1.0 5 16 0 2.0 0.0 0.0 32.8 0.0 32.8 0 0 6.400000
2 2 0 3.0 0.0 0 0 0 0.0 14.9 0.0 0.0 14.9 0.0 0 0 2.342857
3 3 0 3.5 3.5 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.500000
4 4 0 0.0 0.0 0 0 0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0.000000
表現
對于 31K 記錄:
%timeit myfunc(df)
15.3 ms ± 80 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/441271.html
