1 つは最大値を返すだけで、もう 1 つは最大値を含む CSV からの行を返します。
import csv
import operator as op
import requests
symbol = "mtgoxUSD"
url = 'http://api.bitcoincharts.com/v1/trades.csv?symbol={}'.format(symbol)
csv_file = "trades_{}.csv".format(symbol)
data = requests.get(url)
with open(csv_file, "w") as f:
f.write(data.text)
with open(csv_file) as f:
next(f) # discard first row from file -- see notes
max_value = max(row[0] for row in csv.reader(f))
with open(csv_file) as f:
next(f) # discard first row from file -- see notes
max_row = max(csv.reader(f), key=op.itemgetter(0))
ノート:
max()
直接イテレータを消費し、イテレータをcsv.reader()
提供するので、それを渡すことができます。ヘッダー行を破棄する必要があるかもしれないと想定しているので、その方法を示しました。破棄するヘッダー行が複数ある場合はislice()
、itertools
モジュールから使用することをお勧めします。
最初のものでは、「ジェネレーター式」を使用して各行から単一の値を選択し、最大値を見つけます。これは「リスト内包表記」に非常に似ていますが、リスト全体を構築するのではなく、結果の値を反復処理できるようにするだけです。次にmax()
iterable を消費し、最大値を取得します。
max()
key=
「キー関数」を指定する引数を使用できます。key 関数を使用して値を取得し、その値を使用して最大値を計算します...ただし、返される値max()
は変更されていない元の値 (この場合は CSV の行の値) になります。この場合、主要な関数は次のように作成されoperator.itemgetter()
ます...必要な列を渡し、その列operator.itemgetter()
を取得する関数を作成します。
結果の関数は次と同等です。
def get_col_0(row):
return row[0]
max_row = max(csv.reader(f), key=get_col_0)
または、人々はこれを使用lambda
します:
max_row = max(csv.reader(f), key=lambda row: row[0])
operator.itemgetter()
でも便利で読みやすいと思います。そしてそれは速いです。
- データをファイルに保存してから、ファイルから再度プルすることを示しました。どこにも保存せずにデータを調べたい場合は、行ごとに反復するだけです。
おそらく次のようなものです:
text = data.text
rows = [line.split(',') for line in text.split("\n") if line]
rows.pop(0) # get rid of first row from data
max_value = max(row[0] for row in rows)
max_row = max(rows, key=op.itemgetter(0))
- 必要な列がわからない...列「A」は列0の可能性があるため、上記では0を使用しました。列番号はお好みで置き換えてください。