2017-06-22 106 views
5

我聽說不同的意見應該在何時應該使用Pandas vs何時使用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秒( 「19150869行中2445ms返回」)。

注: 對於熊貓的代碼,我在步跑這它從數據庫獲取數據之前:

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是非常不好的選擇,在熊貓中最慢的循環... – jezrael

+0

謝謝是的 - 我發現itertuples比iterrows更快。 – 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

Comapring 2技術真的很難,我不知道如果在一些很好的答案(太廣泛的原因),但我找到this

+0

感謝您的快速回復,感謝。給它一個旋轉。 PS。想你打算在那裏寫.astype(str)? – user1761806

+0

我添加它,因爲'str(tmp)' – jezrael

+0

好吧,結果在上面的方法花了90秒。對於SQLLite來說絕對是一種改進,但速度不會快到3秒。在此期間,我還檢查了我的記憶體使用情況,並徘徊在65%左右。無論如何,這是一個有趣的小練習來幫助我形成一個觀點。如果人們擁有它,很樂意對其他替代品進行基準測試,但通常我傾向於SQLLite來完成此任務。 – user1761806