我有以下数据框:
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)
我的问题是,处理大型数据帧(数千项)时速度非常慢。我敢肯定必须有一种更好的方法来实现我想要做的更有效的事情。我担心我会让算法做更多的工作而不是必要但我还没有想到另一种方法来做它。
如果有人能提出更快/更有效的方法,我将非常感激。
答案 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