我听到有关何时应该使用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速度要快得多?
答案 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)
要解析datetime
到str
,请使用strftime
。
DataFrame.iterrows
真的很慢 - 请检查this。
首先是comaprison of code for users coming from SQL background。
Comapring 2技术真的很难,我不确定是否有一个很好的答案(太宽泛的原因),但我发现this。
答案 1 :(得分:1)
Pandas数据帧不打算以这种方式进行迭代。 This是很好的资料来源,可以帮助您更好地了解应该使用什么来提高效率。简而言之,numpy向量化是在可能的情况下可以采用的方法,否则pandas apply()函数仍然比iterrows()快许多倍。 重构后看到比较结果会很有趣。