使用来自不同数据帧的值作为映射函数进行分组/映射

2024-09-29 23:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两只熊猫的数据帧。你知道吗

交易数据框有一个不同交易的进入和退出时间列表

Trade#  Entrytimestamp         Exittimestamp 
0 2003-01-02 10:30:00  2003-01-07 14:30:00
1 2003-01-07 13:35:00  2003-01-09 12:30:00
2 2003-01-13 14:30:00  2003-01-16 11:10:00
3 2003-01-14 09:50:00  2003-01-23 13:20:00
4 2003-01-17 13:30:00  2003-01-29 14:30:00

tenmin数据帧有一个十分钟内有关股票价格的列表

timestamp             price
2003-01-02 00:00:00     50.12    
2003-01-02 00:10:00     50.15
2003-01-02 00:20:00     50.14
2003-01-02 00:30:00     50.13
2003-01-02 00:40:00     50.14

我想做的是找出每笔交易中的最高和最低价格,得到这样的结果:

Trade#  Entrytimestamp         Exittimestamp   IntraTradeMAX  IntraTradeMIN
0 2003-01-02 10:30:00  2003-01-07 14:30:00     60.75          60.40
1 2003-01-07 13:35:00  2003-01-09 12:30:00     70.52          63.26
2 2003-01-13 14:30:00  2003-01-16 11:10:00     69.25          67.52
3 2003-01-14 09:50:00  2003-01-23 13:20:00     62.90          61.00
4 2003-01-17 13:30:00  2003-01-29 14:30:00     67.58          65.15

我知道我只需要将10分钟的条形图文件按每笔交易的进入和退出时间分组,并取最大值,但如果不逐个遍历每笔交易,我就不知道如何做到这一点。鉴于我的文件有超过10000笔交易,这样做将花费太长的时间。关于如何用熊猫的方式做这件事有什么建议吗?你知道吗

如果有帮助,我目前的解决方案(太慢)如下。你知道吗

def intramax(row):  
    trademax = ten['price'][np.logical_and(ten['timestamp'] > row['Entrytimestamp'], ten['timestamp'] < row['Exittimestamp'])].max()
    return trademax  

trade['IntraTradeMAX'] = trade.apply(intramax, axis=1) 

Tags: 文件数据列表时间交易pricetimestamprow
1条回答
网友
1楼 · 发布于 2024-09-29 23:20:27

我相信你可以用一个更好的算法做得更好,也许有一些聪明的方法在pandas我没有想到,但一个相当幼稚的^{}实现似乎做得很好。你知道吗

In [110]: @numba.jit(nopython=True)
     ...: def intrastats(entry, exit_, ten_times, ten_prices):
     ...:     N = len(entry)
     ...:     K = len(ten_times)
     ...:     ans = np.zeros((N, 2))
     ...:     for i in range(N):
     ...:         ans[i, 0] = -np.inf
     ...:         ans[i, 1] = np.inf
     ...:         for j in range(K):
     ...:             if ten_times[j] < exit_[i] and ten_times[j] > entry[i]:
     ...:                 ans[i, 0] = max(ten_prices[j], ans[i, 0])
     ...:                 ans[i, 1] = min(ten_prices[j], ans[i, 1])
     ...:     return ans

In [114]: %timeit intrastats(trade['Entrytimestamp'].values.view('int64'), 
                             trade['Exittimestamp'].values.view('int64'), 
                             ten['timestamp'].values.view('int64'),
                             ten['price'].values)
10000 loops, best of 3: 43.1 µs per loop

In [115]: %timeit trade.apply(intramax, axis=1)
100 loops, best of 3: 3.2 ms per loop

相关问题 更多 >

    热门问题