我有以下数据帧:
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)
我的问题是它在处理大数据帧(几千项)时非常慢。我确信一定有更好的方法来完成我想做的事情,这样会更有效率。我担心我正在使算法做更多的工作比必要的,但我还没有想到另一种方法来做它。你知道吗
如果有人能提出一种更快/更有效的方法,我将不胜感激。你知道吗
步骤1:实现一个滚动最小值,有101个周期(从当前点开始向上50个周期,向下50个周期)。你知道吗
步骤2:将这些最小值向下移动50,使其居中。你知道吗
步骤3:将体积与移动的最小值进行比较。如果他们匹配,那么这应该是在您的窗口内的最低量的价格。你知道吗
步骤4:筛选匹配项。你知道吗
第五步:享受额外的几分钟空闲时间!你知道吗
要获得价格:
从最低点跳49而不是只跳一个,这不是更有意义吗?因为接下来的49个值不能低于刚刚找到的值,如果它是最低的。你知道吗
另外,在另一方面,你可以尝试使用一个有序的地图,因为你说的价格都是唯一的。然后您只需查看映射的一端(取决于它的排序方式),就可以得到最小的键/值对。当然,我假设这个映射的实现做得很好,但是如果它在您的标准库中,它可能是。你知道吗
这样你就可以把列表中的100个值一次输入到地图中,并使之成为全盛时期。你知道吗
相关问题 更多 >
编程相关推荐