Question

Je suis très nouveau sur Python et je souhaite créer un programme de négociation d'actions en boîte noire qui trouve diverses corrélations entre les taux de rendement des actions et me donne une réponse telle que l'achat, la vente, la conservation, etc. J'ai trouvé un peu facile àutilisez le module Python pour récupérer des données boursières appelé ystockquote qui extrait des informations de Yahoo!La finance.Le module peut être trouvé à l'adresse http://www.goldb.org/ystockquote.html .

L'une de ses capacités est de produire des prix historiques pour un stock sous la forme ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos'].Je peux lui donner une plage de dates pour ce faire et il me donne une liste imbriquée contenant une seule liste avec les informations ci-dessus pour chaque jour.

Ma question est de savoir comment organiser chacun de ces points de données séparés (Date, Ouvert, Haut, Bas, etc.) dans une structure que je pourrai appeler plus tard dans mon script et trier.J'ai besoin que ce processus soit facile à automatiser.Quels types d'algorithmes ou de structures de données pourrais-je trouver utiles?

Était-ce utile?

La solution

Vous recherchez peut-être une structure de dictionnaire plutôt qu'une liste:

>>> 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}}

Ici, j'ai imbriqué un dictionnaire dans chaque entrée du dictionnaire principal "prix". Le premier niveau du dictionnaire prend la date comme clé et correspond à un dictionnaire contenant les informations de prix pour cette date.

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

Le deuxième niveau du dictionnaire utilise les noms d'attribut comme clés et correspond aux valeurs d'attribut elles-mêmes.

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

Il semble que, pour la fonction get_historical_prices à laquelle vous faites référence, chaque jour est affiché comme une entrée de la forme [Date, Open, High, Low, Close, Volume, Adj_Clos]. Si vous voulez construire un dictionnaire pour une liste de ces entrées, vous devrez faire trois choses:

Tout d'abord, vous devrez indexer chaque entrée pour séparer le Date des autres éléments, car c'est ce que vous allez utiliser pour indexer la première dimension de votre dict. Vous pouvez obtenir le premier élément avec entry[0] et les autres éléments avec 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]

Deuxièmement, puisque vous souhaitez associer chacun des autres éléments à une clé spécifique, vous devez faire une liste de ces clés dans le même ordre que les éléments de données vous sont donnés. En utilisant la fonction zip(), vous pouvez combiner deux listes p et q, en prenant le ième élément de chacune et en créant zip(p,q)[i] == (p[i], q[i]). De cette manière, vous créez une liste de paires (clé, valeur) que vous pouvez passer à un constructeur de dictionnaire:

>>> 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)]

Enfin, vous souhaitez construire votre dictionnaire et l'indexer à sa date appropriée dans l'historique global:

>>> 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

Vous pouvez parcourir votre liste de history imbriquée pour construire votre dictionnaire de deux manières, la première utilisant une boucle for traditionnelle:

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))

Ou si vous voulez jouer avec une technique Python légèrement plus avancée, essayez un dict imbriqué déclaration du générateur :

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

Ce dernier est un doozy si vous êtes nouveau dans la programmation, mais je vous encourage à lire dans ce lien; rappelez-vous, lors de la programmation en Python, Google est votre ami. J'espère que je vous ai donné suffisamment de mots clés et d'idées ici pour commencer à apprendre, et je vous laisse le reste.

Autres conseils

Étant donné une liste de listes de longueur égale, il est très facile de trier par n'importe quelle "colonne":

>>> 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]]

L'argument de mot-clé key prend une fonction qui, étant donné un élément de la liste, renvoie une valeur qui est utilisée comme clé de tri.

Mais si vous voulez faire des choses plus intéressantes, il vaut probablement mieux utiliser une base de données.De manière pratique (pour moi), la documentation sqlite3 utilise comme exemple un tableau des stocks, quiJe me suis approprié et modifié doucement:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top