我試圖找到每個時間間隔的貨幣相對變動。我有一個這樣的表:Date USD_NOK EUR_USD EUR_NOK 2020-08-09 9.03267 1.17732 10.60526 2020-08-10 8.97862 1.17749 10.58188還有一個像這樣的函數:def RelativeStrength(table): f1 = table.iloc[0][2] f2 = table.iloc[0][0] t1 = table.iloc[1][2] t2 = table.iloc[1][0] n = pow(((f1*f2)/(t1*t2)),1/3) n1 = t1 * (n/f1) n2 = t2 * (n/f2) return n, n1, n2然而,這些表包含數十年的數據,其間隔比每天要短得多,而且我有很多這樣的數據。該函數需要在每一行上運行,該行將與之前的行進行比較。我可以通過 for 循環輕松完成此操作,但是對于我擁有的數據集來說,這可能需要幾天的時間。因此,我希望使用 apply 或類似的東西。我嘗試過這樣的事情:table.apply(lambda x: [x[0].shift()], axis=1, result_type='expand')希望得到這樣的結果,但我沒有:Date USD_NOK EUR_USD EUR_NOK NOK USD EUR2020-08-09 9.03267 1.17732 10.60526 1.0021 0.0876 0.99232020-08-10 8.97862 1.17749 10.58188 1.0027 1.0005 0.9967(2020-08-09 的結果是虛構的,因為它們取決于 2020-08-08 的外匯交叉盤,而我尚未發布)然而,似乎 apply 一次只查看一行。是否可以使用 apply 對每一行進行計算,包括考慮之前的行?
1 回答

楊魅力
TA貢獻1811條經驗 獲得超6個贊
由于您的所有操作(*、/和**)默認情況下都具有內置的向量化支持,因此我建議您直接進行計算而不使用.apply().
df["f1_t1"] = df["EUR_NOK"].shift() / df["EUR_NOK"] # f1 over t1
df["f2_t2"] = df["USD_NOK"].shift() / df["USD_NOK"] # f2 over t2
df["NOK"] = (df["f1_t1"] * df["f2_t2"])**(1/3)
df["USD"] = df["NOK"] / df["f1_t1"]
df["EUR"] = df["NOK"] / df["f2_t2"]
# output
df
Date USD_NOK EUR_USD ... NOK USD EUR
0 2020-08-09 9.03267 1.17732 ... NaN NaN NaN
1 2020-08-10 8.97862 1.17749 ... 1.002740 1.000529 0.996740
請注意,創建的是可以多次重用的中間變量,而不是簡單的移位。這部分特定于您的公式。因此可以進一步減少操作次數。
添加回答
舉報
0/150
提交
取消