我有一个看起来像这样的 DataFrame:
closingDate Time Last
0 1997-09-09 2018-12-13 00:00:00 1000
1 1997-09-09 2018-12-13 00:01:00 1002
2 1997-09-09 2018-12-13 00:02:00 1001
3 1997-09-09 2018-12-13 00:03:00 1005
我想创建一个包含大约 1440 列标记为时间戳的 DataFrame,其中相应的每日值是前一分钟的返回:
closingDate 00:00:00 00:01:00 00:02:00
0 1997-09-09 2018-12-13 -0.08 0.02 -0.001 ...
1 1997-09-10 2018-12-13 ...
我的问题是这是一个非常大的 DataFrame(几 GB),我需要多次执行此操作。时间和内存效率是关键,但时间更重要。是否有一些矢量化的内置方法可以在 pandas 中执行此操作?
最佳答案
您可以通过一些聚合和移动您的时间序列来做到这一点,这应该会导致更有效的计算。
首先按closingDate
聚合您的数据。
g = df.groupby("closingDate")
接下来,您可以将数据偏移一天。
shifted = g.shift(periods=1)
这将创建一个新数据框,其中 Last
值将来自前一分钟。现在您可以根据索引连接到您的原始数据框。
df = df.merge(shifted, left_index=True, right_index=True)
这会将移动后的列添加到新的数据框中,您可以使用它来进行差异计算。
df["Diff"] = (df["Last_x"] - df["Last_y"]) / df["Last_y"]
您现在已拥有所需的所有数据。如果您需要将每一分钟都作为自己的列,则可以对结果进行透视。通过对 closingDate
进行分组,然后应用转换,您可以避免跨天转换日期。如果您查看每天的第一个观察结果,您会得到一个 NaN
,因为这些值不会在不同的日子里移动。
关于python - pandas - 高效计算日内数据的分钟返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53781507/