我正在搞乱Python以及它如何适用于股票交易。
对于特定季度的特定股票,我已经为其分配了一个值,这有助于我决定我是否喜欢股票。这些值位于名为“B”的列表中。我有另一个列表,其中包含同一股票的所有季度,称为发布日期。
如何创建一个查看已发布列表的脚本,如果某个季度的B列表中有值,请使用B列表中的值,如果不是,请使用零值?
我试过这个
release dates = [...(AAPL, 1, 2010), (AAPL, 2, 2010), (AAPL, 3, 2010), (AAPL, 4, 2010)...]
B = [(AAPL, 1, 2010, 2), (AAPL, 4, 2010, 10)]
output = []
for ticker, quarter, year, in releasedates:
value_2 = 0
for ticker_2, quarter_2, year_2, value in B:
if (ticker_2 == ticker and year_2 == year and quarter_2 == quarter):
output.append((ticker, quarter, year, value))
output.append((ticker, quarter, year, outside, value_2))
但是这给了我B列表值和每个日期的两个单独元组中的值0。像这样:
(格式为自动收报机,季度,年份,价值)
[... (AAPL,3,2015,10), (AAPL,3,2015,0) (AAPL,4,2015,0) ...]
当我真正想要的是这个时候:
[... (AAPL,3,2015,10), (AAPL,4,2015,0) ...]
答案 0 :(得分:1)
我正在使用示例数据,因为您没有提供任何自己的示例。如果您使用的字典中的密钥是某个股票,并且该值是某种标记,则可以执行以下操作( O(n)速度复杂度):
B = {1: True, 4: True} # Example flags. True being a good stock in this example.
releases = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # Example stocks.
for stock_id in releases:
if B.get(stock_id):
# Do Something
其他方面,在B
内循环releases
:
B = [(2, True), (4, True)]
releases = [1,2,3,4,5,6,7,8,9,10]
for stock in releases:
for flag in B:
if stock == flag[0]:
# Do Something, you've found a good stock.
更好的是,使用一些面向对象的设计并制作一个库存对象(例如下面的例子)。
class Stock(object):
def __init__(self, id, name, price, is_good):
self.id = id
self.name = name
self.price = price
self.is_good = is_good
这样,您不需要并行化数据容器来比较值;用于确定良好库存的数据完全封装在Stock
对象本身中。
现在我们可以看到潜在循环看起来更清洁和有效(不再索引或访问其他容器,只需简单的成员访问)。
for stock in stocks:
if stock.is_good:
# enter code here
答案 1 :(得分:1)
您可以使用字典对B
ticker, quarter, year
进行索引,然后查找很简单
releasedates = [('AAPL', 1, 2010), ('AAPL', 2, 2010), ('AAPL', 3, 2010),
('AAPL', 4, 2010)]
B = [('AAPL', 1, 2010, 2), ('AAPL', 4, 2010, 10)]
# index wanted values
B_index = {item[:3]:item[3] for item in B}
output = [(ticker, quarter, year, B_index.get((ticker, quarter, year), 0))
for ticker, quarter, year in releasedates]
print(output)