代码之家  ›  专栏  ›  技术社区  ›  Pietro Speroni

使用重采样为数据帧中的不同列聚合具有不同规则的数据

  •  0
  • Pietro Speroni  · 技术社区  · 6 年前

    我有一个典型的“开盘-高-低-收盘量”数据类型的数据框架,这在金融业很常见。每行1分钟。720行。我从海怪那里收集到这个密码:

    import urllib.request, json 
    
    with urllib.request.urlopen("https://api.kraken.com/0/public/OHLC?pair=XXBTZEUR&interval=1") as url:
        data = json.loads(url.read().decode())
    
    columns=['time', 'open', 'high', 'low', 'close', 'vwap', 'volume', 'ount']
    data_DF=pd.DataFrame(data['result']['XXBTZEUR'],columns=columns)
    data_DF['open']=data_DF['open'].astype(float)
    data_DF['high']=data_DF['high'].astype(float)
    data_DF['low']=data_DF['low'].astype(float)
    data_DF['close']=data_DF['close'].astype(float)
    data_DF['volume']=data_DF['volume'].astype(float)
    data_DF['vwap']=data_DF['vwap'].astype(float)
    data_DF['ount']=data_DF['ount'].astype(int)
    data_DF['time']=pd.to_datetime(data_DF['time'],unit='s')
    data_DF.set_index('time',inplace=True)
    

    我现在需要为不同的时间段聚合它。为了简单起见,让我们假设一下经典的5分钟。每个列必须根据不同的规则生成:
    开放列必须是样本开放列值的第一个falue;
    关闭列必须是样本关闭列值的最后一个值;
    high必须是样本高列值的最大值;
    low必须是样品低列值的最小值;

    data_DF5=data_DF['vwap'].resample('5Min').OHLC()
    

    但它会为每一列创建一系列的开盘-高点-低点-收盘。嗯,不是我想要的。

    data_DF5=data_DF['time'].resample('5Min')
    data_DF5['volume']=data_DF['volume'].resample('5Min').sum()
    data_DF5['open']=data_DF['open'].resample('5Min').first()
    data_DF5['close']=data_DF['close'].resample('5Min').last()
    data_DF5['high']=data_DF['high'].resample('5Min').max()
    data_DF5['low']=data_DF['low'].resample('5Min').min()
    

    目的是一次构建一列数据帧。

    我得到了一份工作

    无法打开“hashtable\u class\u helper.pxi”:找不到文件 我不能理解的错误。如果我把第一行改成

    data_DF5=data_DF['vwap'].resample('5Min').mean()
    

    我得到了一个我甚至无法解释的数据帧[参见(*)]。

    如果我把第一行改成

    data_DF5=data_DF['vwap'].resample('5Min')
    

    “DatetimeIndexResampler”对象不支持项分配。

    我真是不知所措。我一直在寻找其他问题,但似乎没有一个能涵盖这个案例。还有 manual page

    (*)

    2018-12-29 07:05:00 3417.8 2018-12-29 07:10:00 3411.12 2018-12-29 07:15:00 3408.98 2018-12-29 07:20:00 3409.46 2018-12-29 07:25:00 3409.26 2018-12-29 07:30:00 2729.18 2018-12-29 07:35:00 3413.9 2018-12-29 07:40:00 2739.32 2018-12-29 07:45:00 3426.12 2018-12-29 07:50:00 3423.46 2018-12-29 07:55:00 3433.22 2018-12-29 08:00:00 3424.14 2018-12-29 08:05:00 3426.44 2018-12-29 08:10:00 3424.6 2018-12-29 08:15:00 3425.22 2018-12-29 08:20:00 3425.6 2018-12-29 08:25:00 3425.72 2018-12-29 08:30:00 3427.96 2018-12-29 08:35:00 3427.64 2018-12-29 08:40:00 3427.06 2018-12-29 08:45:00 3426.06 2018-12-29 08:50:00 3423.38 2018-12-29 08:55:00 3426.42 2018-12-29 09:00:00 3441.08 2018-12-29 09:05:00 3439.68 2018-12-29 09:10:00 3429.38 2018-12-29 09:15:00 3422.12 2018-12-29 09:20:00 3418.4 2018-12-29 09:25:00 3419 2018-12-29 09:30:00
    3415.94 2018-12-... 开放时间2018-12-29 07:05:00 3418.9 2018-12-29 ... 截止时间2018-12-29 07:05:00

    1 回复  |  直到 6 年前
        1
  •  4
  •   YOLO    6 年前

    pd.Grouper

    data_DF = data_DF.groupby(pd.Grouper(freq='5min')).agg({'open':'first',
                                                            'close':'last',
                                                            'high':'max',
                                                            'low':'min'})
    
                           open   close    high     low
    time                                               
    2018-12-29 07:30:00  3411.4  3413.9  3413.9  3411.4
    2018-12-29 07:35:00  3413.9  3413.1  3416.1  3411.9
    2018-12-29 07:40:00  3413.1  3422.9  3427.5  3413.1
    2018-12-29 07:45:00  3421.1  3423.8  3431.7  3418.0
    2018-12-29 07:50:00  3423.8  3428.2  3428.2  3418.9