假设我(在一个列表中)收集了n只股票在一段时间内(比如上午11点后的前5分钟)进行的所有交易(为了简单起见,我将使用n=2,稍后再进行调整)。假设我们有固定的AAA和固定的BBB (如果有帮助,liststock=‘AAA’,'BBB')。这个列表看起来像是这样:
trades=[['AAA', '2011-01-03', '11:03:51', 21.5],['BBB', '2011-01-03','11:03:57', 31.5],
['AAA', '2011-01-03', '11:04:20', 21.55],
['BBB', '2011-01-03','11:04:19', 32.01], ['BBB', '2011-01-03','11:04:52', 31.7]]例如,2笔股票AAA交易和3笔股票BBB交易。选择每只股票的最后一笔交易会导致缺乏同步性问题。我们的想法是选择每只股票的最后一笔交易,并找到最早的('AAA','2011-01-03','11:04:20',21.55)。然后选择时间尽可能接近'11:04:20‘的所有其他股票的交易,这将导致我们选择'BBB','2011-01-03','11:04:19',32.01。输出应该是如下所示的列表:
C=[['AAA', '2011-01-03', '11:04:20', 21.55],['BBB', '2011-01-03','11:04:19', 32.01]]非常感谢!
发布于 2015-06-08 10:55:01
如果你使用带有key参数的sorted,这并不难。
这是代码,如果你不想读,我会在后面解释:
from datetime import datetime
trades=[['AAA', '2011-01-03', '11:03:51', 21.5],['BBB', '2011-01-03','11:03:57', 31.5],
['AAA', '2011-01-03', '11:04:20', 21.55],
['BBB', '2011-01-03','11:04:19', 32.01], ['BBB', '2011-01-03','11:04:52', 31.7]]
trades=[[i[0], datetime.strptime(i[1]+" "+i[2], "%Y-%m-%d %H:%M:%S"), i[3]] for i in trades]
most_liquid, *others, least_liquid = sorted(set(i[0] for i in trades), key=trades.count)
A=sorted((i for i in trades if i[0]==least_liquid), key=lambda n: n[1])[-1]
B=sorted((i for i in trades if i[0]==most_liquid), key=lambda n: abs(n[1]-A[1]))[0]它所做的是首先将每个交易从使用时间的字符串表示形式转换为datetime对象。它使用datetime.strptime类方法来实现这一点。然后,通过对交易进行排序,计算股票的流动性。该*others可推广到n股票。然后,它只过滤less_liquid交易,然后根据时间参数对它们进行排序。然后,它按名称more_liquid进行过滤,并按它与A交易之间的绝对差异进行排序。
所以你想要的对象是A和B。
发布于 2015-06-08 13:36:01
两只股票的解决方案是
from datetime import *
trades=[['AAA', '2011-01-03', '11:03:51', 21.5],['BBB', '2011-01-03','11:03:57', 31.5],
['AAA', '2011-01-03', '11:04:20', 21.55],
['BBB', '2011-01-03','11:04:19', 32.01], ['BBB', '2011-01-03','11:04:52', 31.7]]
stocknames = ['AAA','BBB']
A=[]
lastofeach=[]
for stock in stocknames:
for t in trades:
if t[0]==stock:
A.append(t)
A.sort(key=lambda e:(e[1], e[2]))
lastofeach.append(A[-1])
A[:]=[]
lastofeach.sort(key=lambda e:e[2])
lastofeach=[[i[0], datetime.strptime(i[1]+" "+i[2], "%Y-%m-%d %H:%M:%S"), i[3]] for i in lastofeach]
trades=[[i[0], datetime.strptime(i[1]+" "+i[2], "%Y-%m-%d %H:%M:%S"), i[3]] for i in trades]
A=lastofeach[0]
B=(sorted((i for i in trades if i[0]!=A[0]), key=lambda n: abs(n[1]-A[1]))[0])
C=[A,B]
print (C)(对于完全相同的答案,只需应用datetime.strftime(A1,“%Y-%m-%d%H:%M:%S”),拆分它并保存即可。
如果能为n>2提供解决方案,我们将不胜感激。任何大的O优化也是受欢迎的。
谢谢
https://stackoverflow.com/questions/30700533
复制相似问题