【发布时间】:2018-11-14 07:16:12
【问题描述】:
我有一个 pandas 数据框 df,其中一只股票的时间步长为 4,000,000。
任务是,对于每个时间步,我想先确定它是上升 0.1% 还是下降 0.1%。所以现在我正在将数据帧转换为 numpy 数组并循环遍历每个时间步,从 0 到 4,000,000 开始。
对于每个时间步,我会遍历以下时间步,直到找到价格差异为 0.1% 的时间步。如果价格上涨 0.1%,则标签为 1,如果价格下跌 0.1%,则标签为 0。这需要很长时间。
甚至有可能对此进行矢量化吗?我尝试考虑一种动态编程解决方案来降低时间复杂度,但我不确定是否有一个。
high_bid = df['high_bid'].values
high_ask = df['high_ask'].values
low_bid = df['low_bid'].values
low_ask = df['low_ask'].values
open_bid = df['open_bid'].values
open_ask = df['open_ask'].values
labels = np.empty(len(data))
labels[:] = np.nan
for i in range(len(labels)-1):
for j in range(i+1,len(labels)-1):
if (open_ask[i] + (open_ask[i]*target) <= high_bid[j]):
labels[i] = 1
break
elif (open_bid[i] - (open_bid[i]*target) >= low_ask[j]):
labels[i] = 0
break
df['direction'] = labels
例子
time open_bid open_ask high_bid high_ask low_bid \
0 2006-09-19 12:00:00 1.26606 1.26621 1.27063 1.27078 1.26504
1 2006-09-19 13:00:00 1.27010 1.27025 1.27137 1.27152 1.26960
2 2006-09-19 14:00:00 1.27076 1.27091 1.27158 1.27173 1.26979
3 2006-09-19 15:00:00 1.27008 1.27023 1.27038 1.27053 1.26708
4 2006-09-19 16:00:00 1.26816 1.26831 1.26821 1.26836 1.26638
5 2006-09-19 17:00:00 1.26648 1.26663 1.26762 1.26777 1.26606
6 2006-09-19 18:00:00 1.26756 1.26771 1.26781 1.26796 1.26733
7 2006-09-19 19:00:00 1.26763 1.26778 1.26785 1.26800 1.26754
8 2006-09-19 20:00:00 1.26770 1.26785 1.26825 1.26840 1.26765
9 2006-09-19 21:00:00 1.26781 1.26796 1.26791 1.26806 1.26703
low_ask direction
0 1.26519 1
1 1.26975 1
2 1.26994 0
3 1.26723 0
4 1.26653 0
5 1.26621 1
6 1.26748 NaN
7 1.26769 NaN
8 1.26780 NaN
9 1.26718 NaN
我想为所有 400 万行添加该方向列。
【问题讨论】:
-
您能否提供一个示例输入和输出以进行测试?几乎可以肯定
for循环可以被废弃,但我想要一些东西来测试:) -
这个问题可能对创建示例输入和输出有用How to make good reproducible pandas example
-
@roganjosh 我添加了一个示例。
-
您应该考虑不提取所有值并进行迭代,而是使用
df.itertuples()在数据帧上使用迭代器,并逐行提取值
标签: python performance pandas numpy