私は Python データ サイエンスの初心者で、クリックストリーム分析を行っています。ファイル サイズが大きすぎます。約 3,300 万行です。セッション期間を見つけるために作成したこのスクリプトを実行しています。操作の進行状況を確認するために i を出力しています。しかし、12 時間近くが経過し、400 000 までしか到達していません。900 万近くのセッションがあります。この速度だと270時間(11日)近くかかります。時間を短縮するには、これを最適化する必要があります。
データセットは次のとおりです。
Sid Tstamp アイテム ID 0 1 2014-04-07T10:54:09.868Z 214536500 1 1 2014-04-07T10:54:46.998Z 214536506 2 1 2014-04-07T10:57:00.306Z 214577561 3 2 2014-04-07T13:56:37.614Z 214662742 4 2 2014-04-07T13:57:19.373Z 214662742 5 2 2014-04-07T13:58:37.446Z 214825110 6 2 2014-04-07T13:59:50.710Z 214757390 7 2 2014-04-07T14:00:38.247Z 214757407 8 2 2014-04-07T14:02:36.889Z 214551617
これが私のコードです。for ループが動作を遅くしていると思います。セッション期間については、最初にすべてのセッションで最大タイムスタンプと最小タイムスタンプを見つけています。次に、for ループでそれらを seconds.microseconds に変換し、Tstamp 列で同時更新を使用して最終的な減算を行います。
adi = "H:/excelfiles/clicks3.csv"
k = pandas.read_csv(adi)
k.columns=['Sid','Tstamp','Itemid']
#Dropping Redundant Columns
k.drop(k.columns[2],axis=1,inplace=True)
#Stores max timestamp in amax
idx=k.groupby(['Sid'])['Tstamp'].transform(max) == k['Tstamp']
amax=k[idx].set_index('Sid')
#Stores min timestamp in amin
idy=k.groupby(['Sid'])['Tstamp'].transform(min) == k['Tstamp']
amin=k[idy].set_index('Sid')
i=0
for temp1,temp2,temp3 in zip(amax['Tstamp'],amax.index,amin['Tstamp']):
sv1= datetime.datetime.strptime(temp1, "%Y-%m-%dT%H:%M:%S.%fZ")
sv2= datetime.datetime.strptime(temp3, "%Y-%m-%dT%H:%M:%S.%fZ")
if(i%1000==0):
print i
d1=time.mktime(sv1.timetuple()) + (sv1.microsecond / 1000000.0)
d2=time.mktime(sv2.timetuple()) + (sv2.microsecond / 1000000.0)
amax.loc[temp2,'duration']= (d1-d2)/60
i=i+1
#amax stores the final session duration
amax=amax.reset_index()
このコードを最適化するために何ができるか。
編集 1: マイクロ秒の部分を削除しました。