比较数千个值的更快方法

2024-04-29 12:07:29 发布

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

我有以下数据帧:

Price, Volume
100, 45656
101, 67563
103, 755
...
...
6543, 67567
6544, 7654

Price列中的每个条目都是唯一的,并且有几千行。目标是确定滚动行范围内的低成交量价格。换句话说,我并不是在试图找出整个数据帧中最低的卷。我在一个滚动的“窗口”上识别许多低容量行。你知道吗

假设我将滚动窗口设置为50。我要做的是将当前的体积值与上面的50个体积值和下面的50个体积值进行比较。如果当前的量值是该范围内的最低值,我将相应的价格保存到一个单独的列表中。然后我向下移动一行,再次比较,看看当前的体积值是否小于它上面和下面的50。你知道吗

我下面的代码可以正确地完成此任务:

rolling_window = 50
total_rows = len(df.index)
current_row = rolling_window
smallest_values = []

while current_row < total_rows - rolling_window:
    is_smallest = True
    for comparison_row in range(rolling_window):
        if vp.iloc[current_row]['Volume'] > vp.iloc[current_row -   comparison_row]['Volume'] or \
            vp.iloc[current_row]['Volume'] > vp.iloc[current_row + comparison_row]['Volume']:
            is_smallest = False
            break
    if is_smallest and vp.iloc[current_row]['Price'] not in smallest_values:
        smallest_values.append(vp.iloc[current_row]['Price'])
    current_row += 1

print(smallest_prices)

我的问题是它在处理大数据帧(几千项)时非常慢。我确信一定有更好的方法来完成我想做的事情,这样会更有效率。我担心我正在使算法做更多的工作比必要的,但我还没有想到另一种方法来做它。你知道吗

如果有人能提出一种更快/更有效的方法,我将不胜感激。你知道吗


Tags: 数据方法is体积currentwindowpricecomparison
2条回答

步骤1:实现一个滚动最小值,有101个周期(从当前点开始向上50个周期,向下50个周期)。你知道吗

步骤2:将这些最小值向下移动50,使其居中。你知道吗

步骤3:将体积与移动的最小值进行比较。如果他们匹配,那么这应该是在您的窗口内的最低量的价格。你知道吗

步骤4:筛选匹配项。你知道吗

第五步:享受额外的几分钟空闲时间!你知道吗

import pandas as pd
import bumpy as np

df = pd.DataFrame({'price': range(1000), 
                   'volume': np.random.random_integers(0, 500000, 1000)})
df['min_volume'] = pd.rolling_min(df.volume, 101)
df['min_shift'] = df['min_volume'].shift(-50)
df['match'] = df.volume == df.min_shift
>>> df[df.match]
Out[39]: 
     price  volume   min  min_shift match
181    181    4317  4317       4317  True
245    245    4478  4317       4478  True
358    358    1118  1118       1118  True
427    427    7251  1118       7251  True
504    504   10680  7251      10680  True
631    631    1096  1096       1096  True
699    699     277   277        277  True
770    770    2037   277       2037  True
828    828     310   310        310  True
931    931     516   516        516  True

要获得价格:

df[df.match].price 

从最低点跳49而不是只跳一个,这不是更有意义吗?因为接下来的49个值不能低于刚刚找到的值,如果它是最低的。你知道吗

另外,在另一方面,你可以尝试使用一个有序的地图,因为你说的价格都是唯一的。然后您只需查看映射的一端(取决于它的排序方式),就可以得到最小的键/值对。当然,我假设这个映射的实现做得很好,但是如果它在您的标准库中,它可能是。你知道吗

这样你就可以把列表中的100个值一次输入到地图中,并使之成为全盛时期。你知道吗

相关问题 更多 >