为了账号安全,请及时绑定邮箱和手机立即绑定

pandas apply 与shift结合

pandas apply 与shift结合

小唯快跑啊 2023-12-26 16:22:16
我试图找到每个时间间隔的货币相对变动。我有一个这样的表: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

请注意,创建的是可以多次重用的中间变量,而不是简单的移位。这部分特定于您的公式。因此可以进一步减少操作次数。


查看完整回答
反对 回复 2023-12-26
  • 1 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信