Pythonでの後でアクセスするために、ストックデータの構造化リストを並べ替える方法は?
-
28-10-2019 - |
質問
私はPythonに非常に新しいので、株式の返品率と購入、販売、保留などの応答を提供するさまざまな相関関係を見つけるブラックボックスストック取引プログラムを構築したいと考えています。 Yahoo!から情報を引き出すYstockQuoteという株式データを取得するためファイナンス。モジュールはで見つけることができます http://www.goldb.org/ystockquote.html.
その能力の1つは、フォームの株式の履歴価格を出力することです ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
. 。これを行うために日付範囲を与えることができ、毎日上記の情報を含む単一のリストを含むネストされたリストを提供します。
私の質問は、これらの個別のデータポイント(日付、オープン、ハイ、ローなど)のそれぞれを、スクリプトとソートの後半で呼び出すことができる構造にどのように整理するかです。このプロセスが簡単に自動化できるようにする必要があります。どのような種類のアルゴリズムまたはデータ構造が役立つと思うでしょうか?
解決
あなたはを探しているかもしれません 辞書 リストではなく構造:
>>> 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}
辞書の2番目のレベルでは、属性名をキーとして使用し、属性値にマップします。
>>> 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]
. 。これらのエントリのリストの辞書を作成したい場合は、3つのことをする必要があります。
まず、各エントリをインデックス化して分離する必要があります 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()
関数2つのリストを組み合わせることができます p
と q
, 、それぞれからith要素を取り、作成します 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
辞書を2つの方法で構築するためのリスト、1つ目は従来のものを使用することです 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を試してみてください ジェネレーターステートメント:
keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Clos']
histodict = dict((item[0], dict(zip(keys, item[1:]))) for item in history)
あなたがプログラミングに慣れていないなら、それは最後のものですが、私はあなたがそのリンクで読むことをお勧めします。 Pythonでプログラミングするとき、Googleはあなたの友人であることを忘れないでください。学習を開始するためにここで十分なキーワードとアイデアを与えてくれたことを願っています。残りはあなたに任せます。
他のヒント
等しい長さのリストのリストを考えると、「列」で非常に簡単に並べ替えができます。
>>> 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