データベースの設計は最適とはほど遠いですが、それに対処しなければならず、今は本当に行き詰まっています。
編集:私は使用していますcx_Oracle
これは私のクエリです:
query="select degree, spectraldev.event.eventnumber \
from spectraldev.degree \
join spectraldev.alignment on \
(spectraldev.version_id = alignment.version_id) \
join spectraldev.event on \
(alignment.timestamp between event.eventstart and event.eventstop) \
join spectraldev.eventsetup on \
(spectraldev.event.eventsetup = spectraldev.eventsetup.oid) \
where spectraldev.event.eventnumber>=" + options.start + " AND spectraldev.event.eventnumber<=" + options.stop + " AND \
HITS>=" + str(options.minimum_hits)+" \
order by spectraldev.event.eventnumber"
db_cursor.execute(query)
これは、一意の番号 ( 346554degree
など) で識別される多くのイベントに対して一連の s (12.34 など)を返します。eventnumber
だから私はこのようなテーブルを取得します:
454544 45.2
454544 12.56
454544 41.1
454544 45.4
454600 22.3
454600 24.13
454600 21.32
454600 22.53
454600 54.51
454600 33.87
454610 32.7
454610 12.99
など…</p>
ここで、各イベントの平均度を含む辞書を作成する必要があります(対応するすべてのフロートを合計し、それらの数で割った値)。
これはSQLで実行できると思いますが、うまくいきません。現時点ではこれを行うために python を使用していますが、約 1000000 のイベントを処理する必要があるため、フェッチ コマンドは約 2000 のイベントを完了するのに 1 ~ 2 時間かかります。
これは私の取得部分であり、非常に時間がかかります。
_degrees = []
for degree, eventNumber in cursor.fetchall():
_degrees.append([eventNumber, degree])
次に、並べ替え(これは非常に高速で、1秒未満)と平均の計算(これも非常に高速です):
_d={}
for eventNumber, degree in _degrees:
_d.setdefault(eventNumber, []).append(degree)
for event in events:
_curDegree = _degrees[int(event)]
_meanDegree = sum(_curDegree) / float(len(_curDegree))
meanDegrees.append(_meanDegree)
SQL で Python の部分を実行する方法はありますか?