更快速地比较数千个值

时间:2015-03-25 08:03:53

标签: python pandas logic

我有以下数据框:

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

价格列中的每个条目都是唯一的,有几千行。目标是确定滚动范围内的低价格。换句话说,我没有尝试识别整个数据帧中的最低音量。我在滚动的窗口中识别出许多低容量行。

假设我将滚动窗口设置为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)

我的问题是,处理大型数据帧(数千项)时速度非常慢。我敢肯定必须有一种更好的方法来实现我想要做的更有效的事情。我担心我会让算法做更多的工作而不是必要但我还没有想到另一种方法来做它。

如果有人能提出更快/更有效的方法,我将非常感激。

2 个答案:

答案 0 :(得分:2)

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

此外,在另一方面,您可能会尝试使用有序地图,因为您说价格都是唯一的。然后你可以看一下地图的一端(取决于它的排序方式)来拉出最小的键/值对。当然,我假设该地图的实施做得很好,但如果它在您的标准库中,它可能就是。

通过这种方式,您可以将列表中的100个值一次性输入到地图中并使用它进行全盛时期。

答案 1 :(得分:1)

步骤1:实施具有101个周期的滚动分钟(从当前点开始向上50和50)。

步骤2:通过将这些最小值向下移动50来居中这些最小值。

步骤3:将音量与移位的最小值进行比较。如果它们匹配,那么那应该是窗口中音量最低的价格。

第4步:过滤匹配。

第5步:享受额外的空闲时间!

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