Python 将批聚合到新数据帧

Python 将批聚合到新数据帧,python,pandas,Python,Pandas,对不起,如果这是重复的。我搜索了很多,但也许我太笨了,看不到其他问题/答案的答案 我有股票行情数据。勾选数据如下所示: Bid Ask Price Volume 0 12325.0 12335.0 12335.0 1 1 12330.5 12335.5 12335.5 1 2 12337.5 12340.0 12340.0 1 Open Close High Low Volume 0 NaN 12335.5 12335.5

对不起,如果这是重复的。我搜索了很多,但也许我太笨了,看不到其他问题/答案的答案

我有股票行情数据。勾选数据如下所示:

    Bid     Ask     Price   Volume
0   12325.0 12335.0 12335.0 1
1   12330.5 12335.5 12335.5 1
2   12337.5 12340.0 12340.0 1

    Open Close  High    Low     Volume
0   NaN 12335.5 12335.5 12335.0 2.0
1   12330.5 12340.0 12340.0 12340.0 1.0
代码:

df_tick = pd.DataFrame({
    'Bid': [12325.0, 12330.5,12337.5],
    'Ask': [12335.0, 12335.5,12340.0],
    'Price': [12335.0, 12335.5, 12340.0],
    'Volume' : [1,1,1]
})
我正在尝试编写一个聚合器,它将n个滴答声聚合到蜡烛数据中。蜡烛数据如下所示:

    Bid     Ask     Price   Volume
0   12325.0 12335.0 12335.0 1
1   12330.5 12335.5 12335.5 1
2   12337.5 12340.0 12340.0 1

    Open Close  High    Low     Volume
0   NaN 12335.5 12335.5 12335.0 2.0
1   12330.5 12340.0 12340.0 12340.0 1.0
在哪里

打开:上一批的最后价格

关闭:当前批次的最后价格

:当前批次的最大值

低值:当前批次的最小值

体积:当前批次的所有体积之和

我所做的是:

def aggregate_to_candles(data, step):
    df = pd.DataFrame(columns=['Open', 'Close', 'High', 'Low'])
    
    for i in range(0, len(data), step):
        window = data.iloc[i: i + step]
        
        previous_close = data.iloc[i-1: i, 2].values[0]  if i > 0 else np.nan
        
        df = df.append({
            'Open' : previous_close,
            'Close': window.tail(1)['Price'].values[0],
            'High': window['Price'].max(), 
            'Low': window['Price'].min(), 
            'Volume': window['Volume'].sum()
            }, ignore_index=True)

    return df
调用
aggregate\u to\u candles(df\u tick,2)
将给出如上所示的聚合结果。这似乎是正确的

这样做吗?有更好/更快/更容易的方法吗?对于我来说,将500万个滴答声聚合成150个批次需要相当长的时间。
我试着用滚动窗口来做,但我认为代码不值得在这里显示。

IIUC,让我们试试
groupby
+
agg

dct = {'Close': ('Price', 'last'), 'High': ('Price', 'max'),
       'Low': ('Price', 'min'), 'Volumne': ('Volume', 'sum')}

N = 2 # Aggregate on 2 second interval
candles = df_tick.groupby(df_tick.index // N).agg(**dct)
candles['Open'] = candles['Close'].shift() # last price of previous batch


我喜欢你有趣的话,魔术师:-)太快了!!结果看起来是正确的!我试着去了解发生了什么。.agg(**dct)在做什么?它以某种方式调用字典中定义的函数。你知道我在哪里可以找到这方面的参考资料吗?@SvenBardos很高兴我能帮上忙
agg(**dct)
用于聚合字典中定义的列及其相应的聚合函数。例如,
Price
列使用
max
进行聚合,结果存储在新创建的列
High
中,以获得当前批次的最大值。作为参考,你可以查一下