作者:哟哟哈哈呼呼 | 来源:互联网 | 2023-01-31 15:37
关于何时应该使用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秒("在2445ms内返回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速度要快得多?
1> jezrael..:
看来你可以使用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
真的很慢 - 检查一下.
首先是来自SQL背景的用户代码的一些代码.
Comapring 2技术真的很难,我不确定是否有一个很好的答案(太广泛的原因),但我发现这一点.