熊猫VS SQL速度

时间:2017-06-22 09:08:47

标签: sql sqlite pandas

我听到有关何时应该使用Pandas与何时使用SQL的不同观点。

我尝试在Pandas中对19,150,869行数据执行以下操作:

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秒钟(“在2445毫秒内返回19150869行”)。

注意: 对于Pandas代码,我在它之前的步骤中运行它以从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速度要快得多?

2 个答案:

答案 0 :(得分:6)

似乎你可以使用vectorize解决方案(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 users coming from SQL background

Comapring 2技术真的很难,我不确定是否有一个很好的答案(太宽泛的原因),但我发现this

答案 1 :(得分:1)

Pandas数据帧不打算以这种方式进行迭代。 This是很好的资料来源,可以帮助您更好地了解应该使用什么来提高效率。简而言之,numpy向量化是在可能的情况下可以采用的方法,否则pandas apply()函数仍然比iterrows()快许多倍。 重构后看到比较结果会很有趣。