Pandas 应用与 shift 相结合
Pandas apply combined with shift
我试图找到每个时间间隔内货币的相对运动。
我有一个 table 这样的:
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
然而,tables 包含几十年的数据,间隔比每天短很多,我有很多这样的数据。
该函数需要在每一行上 运行,该行将与之前的行进行比较。
我可以通过 for 循环轻松完成此操作,但使用我拥有的数据集可能需要数天时间。因此,我希望使用 apply 或类似的东西。
我试过这样的事情:
table.apply(lambda x: [x[0].shift()], axis=1, result_type='expand')
并希望得到这样的结果,但我没有:
Date USD_NOK EUR_USD EUR_NOK NOK USD EUR
2020-08-09 9.03267 1.17732 10.60526 1.0021 0.0876 0.9923
2020-08-10 8.97862 1.17749 10.58188 1.0027 1.0005 0.9967
(2020-08-09 的结果是编造的,因为它们取决于 2020-08-08 的外汇交叉盘,我没有发布)
但是,apply 似乎一次只查看一行。是否可以使用 apply 对每一行进行计算,包括考虑之前的行?
因为你所有的操作(*
、/
和**
)默认都有built-in矢量化支持,我建议你直接计算而不用.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
请注意,可以 多次重复使用 的中间变量是创建的,而不是简单的移位。这部分特定于您的公式。从而可以进一步减少操作次数。
我试图找到每个时间间隔内货币的相对运动。
我有一个 table 这样的:
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
然而,tables 包含几十年的数据,间隔比每天短很多,我有很多这样的数据。
该函数需要在每一行上 运行,该行将与之前的行进行比较。
我可以通过 for 循环轻松完成此操作,但使用我拥有的数据集可能需要数天时间。因此,我希望使用 apply 或类似的东西。
我试过这样的事情:
table.apply(lambda x: [x[0].shift()], axis=1, result_type='expand')
并希望得到这样的结果,但我没有:
Date USD_NOK EUR_USD EUR_NOK NOK USD EUR
2020-08-09 9.03267 1.17732 10.60526 1.0021 0.0876 0.9923
2020-08-10 8.97862 1.17749 10.58188 1.0027 1.0005 0.9967
(2020-08-09 的结果是编造的,因为它们取决于 2020-08-08 的外汇交叉盘,我没有发布)
但是,apply 似乎一次只查看一行。是否可以使用 apply 对每一行进行计算,包括考虑之前的行?
因为你所有的操作(*
、/
和**
)默认都有built-in矢量化支持,我建议你直接计算而不用.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
请注意,可以 多次重复使用 的中间变量是创建的,而不是简单的移位。这部分特定于您的公式。从而可以进一步减少操作次数。