【问题标题】:Python pandas asof join on groupsPython pandas asof 加入群组
【发布时间】:2016-02-10 20:34:40
【问题描述】:

我有两个 pandas 数据框 X 和 Y,每个都包含过去一个月的盘中价格和时间数据。我想在 X 上运行 Y 的 asof join,即每次看到 X 上的更新时,我们都会采用 Y 的现行价格。我想进行日内分析(因为隔夜效应)

我现在的代码是

Y_asof = Y.groupby('Date').apply(lambda x: x.asof(X.index))

但是,这会返回一个错误提示

AttributeError: 'DataFrame' object has no attribute 'asof'

当我运行时它正在工作

Y_asof = Y.apply(lambda x: x.asof(X.index))

X的样本数据:

                                 Mid        Date
Time                                            
2015-09-15 13:02:03.000049  7.575392  2015-09-15
2015-09-15 13:02:06.000049  7.575521  2015-09-15
2015-09-15 13:02:08.000049  7.575392  2015-09-15
2015-09-15 13:02:14.000049  7.575521  2015-09-15
2015-09-15 13:02:15.000048  7.575649  2015-09-15

Y的样本数据:

                                 Mid        Date
Time                                            
2015-09-15 12:00:00.443000  4.650894  2015-09-15
2015-09-15 12:00:00.443000  4.650899  2015-09-15
2015-09-15 12:00:06.321000  4.650894  2015-09-15
2015-09-15 12:00:06.322000  4.650884  2015-09-15
2015-09-15 12:00:10.839000  4.650894  2015-09-15

有人可以帮忙吗?非常感谢!

【问题讨论】:

  • 能否提供一些示例数据?
  • 嗨,Alexander,我附上了每个数据集的负责人。注意,完整的数据集是一个月的数据。

标签: python join pandas


【解决方案1】:

asof 是一个 Series 方法,而不是 DataFrame 方法。它适用于时间列:

In [11]: Y.groupby('Date').apply(lambda x: x["Time"].asof(X.index))
Out[11]:
Time                                 0                           1                           2                           3                           4
Date
2015-09-15  2015-09-15 12:00:00.443000  2015-09-15 12:00:00.443000  2015-09-15 12:00:06.321000  2015-09-15 12:00:06.322000  2015-09-15 12:00:10.839000

当您进行应用时,它会跨越每一行(这是一个系列)。

【讨论】:

  • 嗨,感谢安迪的帮助。这行得通。但是我将如何获得整个数据框的 as of join 。我也想查看中间价列。另外,如果 asof 是 pd.Series 上的方法,为什么 Y_asof = Y.apply(lambda x: x.asof(X.index)) 会起作用。
【解决方案2】:

我相信 pandas 会抛出一个错误,因为 Y.groupby('Date') 创建了一个没有 asof 方法的 GroupBy 对象。如果您只是使用groupby 作为按日期排序的一种方式,则可以改为使用Y_asof = Y.sort('Date').apply(lambda x: x.asof(X.index))

【讨论】:

    【解决方案3】:

    pandas 0.19 has an asof join。由于您想要每个X 的最新Y

    pd.merge(X, Y, on='time')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-04
      • 2016-02-09
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多