Как отсортировать структурированный список биржевых данных для последующего доступа в Python? - PullRequest
2 голосов
/ 17 июня 2011

Я очень плохо знаком с Python и хочу создать черную программу торговли акциями, которая находит различные корреляции между нормами доходности акций и дает мне такие ответы, как покупка, продажа, удержание и т. Д.используйте модуль Python для извлечения биржевых данных, называемых ystockquote, которые извлекают информацию из Yahoo!Финансы.Модуль можно найти по адресу http://www.goldb.org/ystockquote.html.

. Одна из его возможностей - вывод исторических цен на акции в виде ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos'].Я могу дать ему диапазон дат, чтобы сделать это, и он даст мне вложенный список, содержащий один список с вышеуказанной информацией, это для каждого дня.

Мой вопрос заключается в том, как организовать каждую из этих отдельных точек данных (Дата, Open, High, Low и т. Д.) В структуру, которую я могу вызвать позже в моем сценарии и отсортировать.Мне нужен этот процесс, чтобы его было легко автоматизировать.Какие алгоритмы или структуры данных я могу найти полезными?

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

Возможно, вы ищете структуру словаря , а не список:

>>> prices = dict()
>>> prices['2011-01-02'] = {'Open':20.00, 'High':30.00, 'Low':10.00, 'Close':21.00, 'Volume':14.00, 'Adj Clos':120}
>>> prices['2010-11-09'] = {'Open':22.00, 'High':50.00, 'Low':20.00, 'Close':42.00, 'Volume':10.00, 'Adj Clos':666}
>>> prices
{'2011-01-02': {'Volume': 14.0, 'Adj Clos': 120, 'High': 30.0, 'Low': 10.0, 'Close': 21.0, 'Open': 20.0}, '2010-11-09': {'Volume': 10.0, 'Adj Clos': 666, 'High': 50.0, 'Low': 20.0, 'Close': 42.0, 'Open': 22.0}}

Здесь я вложил словарь в каждую запись основного словаря "цен".Первый уровень словаря принимает в качестве ключа дату и сопоставляется со словарем, содержащим информацию о цене на эту дату.

>>> prices['2011-01-02']
{'Volume': 14.0, 'Adj Clos': 120, 'High': 30.0, 'Low': 10.0, 'Close': 21.0, 'Open': 20.0}

Второй уровень словаря использует имена атрибутов в качестве ключей и сопоставляетсамим значениям атрибута.

>>> prices['2010-11-09']['Open']
22.0
>>> prices['2010-11-09']['Close']
42.0

Похоже, что для функции get_historical_prices, на которую вы ссылаетесь, каждый день выводится как запись в форме [Date, Open, High, Low, Close, Volume, Adj_Clos].Если вы хотите создать словарь для списка этих записей, вам нужно сделать три вещи:

Во-первых, вам нужно будет проиндексировать каждую запись, чтобы отделить Date от других.элементы, так как это то, что вы будете использовать для индексации первого измерения вашего dict.Вы можете получить первый элемент с помощью entry[0], а остальные элементы - с помощью entry[1:].

>>> entry = ['2011-01-02', 20.00, 30.00, 10.00, 21.00, 14.00, 120]
>>> date = entry[0]
>>> date
'2011-01-02'
>>> values = entry[1:]
>>> values
[20.0, 30.0, 10.0, 21.0, 14.0, 120]

Второй, поскольку вы хотите связать каждый из других элементов с определенным ключом, вы должны составить списокэти ключи в том же порядке, что и элементы данных.Используя функцию zip(), вы можете объединить два списка p и q, беря i-й элемент из каждого и получая zip(p,q)[i] == (p[i], q[i]).Таким образом, вы создаете список пар (ключ, значение), которые вы можете передать конструктору словаря:

>>> keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
>>> pairs = zip(keys, entry[1:])
>>> pairs
[('Open', 20.0), ('High', 30.0), ('Low', 10.0), ('Close', 21.0), ('Volume', 14.0), ('Adj Clos', 120)]

Наконец, вы хотите создать свой словарь и индексировать его в соответствующую дату вобщая история:

>>> stockdict = dict(pairs)
>>> stockdict
{'Volume': 14.0, 'Adj Clos': 120, 'High': 30.0, 'Low': 10.0, 'Close': 21.0, 'Open': 20.0}
>>> histodict = dict()
>>> histodict[date] = stockdict

Вы можете перебирать свой вложенный список history, чтобы создать свой словарь двумя способами, первый использует традиционный цикл for:

keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
histodict = dict()
for item in history:
    date = item[0]
    values = item[1:]
    histodict[date] = dict(zip(keys, values))

Или, если вы хотите поиграть с немного более продвинутой техникой Python, попробуйте вложенный оператор dict generator :

keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
histodict = dict((item[0], dict(zip(keys, item[1:]))) for item in history)

Этот последний излишне утомителен, если вы новичок в программировании,но я призываю вас прочитать в этой ссылке;помните, что при программировании на Python Google - ваш друг.Я надеюсь, что дал вам достаточно ключевых слов и идей, чтобы начать обучение, а остальное оставлю на ваше усмотрение.

1 голос
/ 17 июня 2011

Учитывая список списков равной длины, его очень легко отсортировать по любому «столбцу»:

>>> l = [[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [0, 0, 0, 0, 0], [6, 6, 6, 6, 6]]
>>> l.sort(key=lambda l: l[1])
>>> l
[[0, 0, 0, 0, 0], [1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [6, 6, 6, 6, 6]]
>>> l.sort(key=lambda l: l[4])
>>> l
[[0, 0, 0, 0, 0], [5, 4, 3, 2, 1], [1, 2, 3, 4, 5], [6, 6, 6, 6, 6]]

Аргумент ключевого слова key принимает функцию, которая, учитывая элемент в списке,возвращает значение, которое используется в качестве ключа сортировки.

Но если вы хотите сделать более интересные вещи, вам, вероятно, лучше использовать базу данных.Удобно (для меня) документы sqlite3 использовать в качестве примера таблицу запасов, которую я аккуратно присвоил и изменил:

import sqlite3
conn = sqlite3.connect('/tmp/example')   # use ':memory:' for an in-memory db
c = conn.cursor()

# Create table
c.execute('''create table stocks
(date text, trans text, symbol text,
 qty real, price real)''')

# Insert a row of data
c.execute("""insert into stocks
          values ('2006-01-05','BUY','RHAT',100,35.14)""")

# Save (commit) the changes
conn.commit()

# Insert another row of data
c.execute("""insert into stocks
          values ('2006-01-07','SELL','RHAT',100,2.11)""")

# Select rows of data from table in an order
rows_by_date = c.execute("""select * from stocks order by date""")
for row in rows_by_date:
    print row

# In a different order
rows_by_price = c.execute("""select * from stocks order by price""")
for row in rows_by_price:
    print row
...