2017-06-22 2 views
5

いつ私がパンダを使うべきか、SQLをいつ使うべきか、さまざまな意見を聞いています。パンダVS SQLスピード

私は、データの19150869行にパンダで次の操作を実行しようとした:

for idx, row in df.iterrows(): 
    tmp = int((int(row['M'])/PeriodGranularity))+1 
    row['TimeSlot'] = str(row["D"]+1) + "-" + str(row["H"]) + "-" + str(tmp) 

そして、それは私が20分後に中止しなければならなかったので、時間がかかった見つけました。

私はSQLLiteに次のように行わ:

Select strftime('%w',PlayedTimestamp)+1 as D,strftime('%H',PlayedTimestamp) as H,strftime('%M',PlayedTimestamp) as M,cast(strftime('%M',PlayedTimestamp)/15+1 as int) as TimeSlot from tblMain 

と、それは4秒( "2445msで返さ19150869行")を取りました。

注: それはDBからデータを取得する前に、私はステップでこれを実行したパンダのコードの場合:

sqlStr = "Select strftime('%w',PlayedTimestamp)+1 as D,strftime('%H',PlayedTimestamp) as H,strftime('%M',PlayedTimestamp) as M from tblMain" 
df = pd.read_sql_query(sqlStr, con) 

が、それは私の符号化である障害ここでだか、それは一般的に、特定のためにことが認められていますタスクSQLは非常に高速ですか?

+0

iterrowsが本当に悪い選択で、slowiestパンダにループ... – jezrael

+0

おかげでええ - 私はitertuplesがiterrowsよりLOT迅速であることが判明しました。 – user1761806

答えて

3

あなたのソリューション(PeriodGranularityは、いくつかの変数である)ベクトル化を使用することができそうです:

df['TimeSlot'] = (df["D"]+1).astype(str) + "-" + 
        df["H"].astype(str) + "-" + 
       ((df['M'].astype(int)/PeriodGranularity).astype(int)+1).astype(str) 

そしてdatetimestrに使用strftimeを解析するために。

DataFrame.iterrowsは本当に遅いです - thisをご確認ください。

まずいくつかのcomaprison of code for suers coming from SQL background。 2つの技術をComapring

は本当に難しいですし、SO(広すぎるの理由)でのいくつかの素晴らしい答えは、私はthisを見つけた場合、私はわかりません。

+0

クイック返信ありがとう、ありがとう。それを渦巻きにする。 Ps。最後に.astype(str)を書くつもりだと思いますか? – user1761806

+0

'str(tmp)'が – jezrael

+0

になっているので、追加します。結果は90秒かかりました。間違いなく改善ですが、SQLLiteでは3秒という速さではありません。私はまた、その間に私のメモリ使用量をチェックし、それは約65%を乗り越えた。とにかく私はフォームをビューにするのを助ける興味深い小さなエクササイズでした。人々がそれを持っていれば、他の選択肢をベンチマークするのは楽しいですが、一般的に私はこの作業のためにSQLLiteに傾いています。 – user1761806

関連する問題