利用Python實(shí)現(xiàn)數(shù)據(jù)偏移

現(xiàn)在有如下這么一張表,這張表存儲(chǔ)了每個(gè)uid在不同周(w)的訂單情況。我們想知道每個(gè)用戶在不同周內(nèi)消費(fèi)頻次的變化情況。消費(fèi)頻次變化的標(biāo)準(zhǔn)就是這周訂單數(shù)和上周訂單數(shù)的相對(duì)變化,如果這周訂單比上周增加了,就說(shuō)明消費(fèi)頻次提高了,反之則說(shuō)明消費(fèi)頻次降低了。

要實(shí)現(xiàn)上面的需求,其實(shí)只需要新增一列,這一列用來(lái)存儲(chǔ)每個(gè)uid在上一周期的訂單情況,然后將兩列進(jìn)行做差,差的結(jié)果就是每個(gè)uid消費(fèi)頻次的變化。具體結(jié)果如下:

上面這個(gè)結(jié)果該如何實(shí)現(xiàn)呢?也就是如何讓數(shù)據(jù)進(jìn)行上下偏移呢?借助的就是Python中的shift函數(shù),我們這一節(jié)就講講shift是怎么使用的。shift的功能是對(duì)數(shù)據(jù)進(jìn)行偏移,該函數(shù)的具體參數(shù)如下:
df.shift(periods=1, freq=None, axis=0)
periods為偏移的幅度;freq只適用于時(shí)間索引的偏移,是對(duì)索引的偏移,而值不發(fā)生變化;axis用來(lái)指明是橫向偏移還是縱向偏移,當(dāng)axis=0時(shí)表示縱向偏移,默認(rèn)就是縱向偏移,當(dāng)要縱向偏移時(shí),axis參數(shù)可以省略不寫。當(dāng)axis=1時(shí)表示橫向偏移。如果periods為正,則表示向下/右偏移,如果peeriods為負(fù),則表示向上/左偏移。接下來(lái)我們看一些具體實(shí)例:
df.shift(1)
運(yùn)行上面的代碼,所有的數(shù)據(jù)向下偏移一行,具體結(jié)果如下:

df.shift(-1)
運(yùn)行上面的代碼,所有的數(shù)據(jù)向上偏移一行,具體結(jié)果如下:

df.shift(1,axis = 1)
運(yùn)行上面的代碼,所有的數(shù)據(jù)向右偏移一列,具體結(jié)果如下:

df.shift(-1,axis = 1)
運(yùn)行上面的代碼,所有的數(shù)據(jù)向左偏移一列,具體結(jié)果如下:

了解完了shift用法以后我們來(lái)看下我們開(kāi)頭那個(gè)需求該怎么做呢?新增加一列l(wèi)ast_sales,并給其賦值為sales列,然后將last_sales這一列向上偏移一行。實(shí)現(xiàn)代碼如下:
df["last_sales"] = df["sales"]
df["last_sales"] = df["last_sales"].shift(1)
df
運(yùn)行上面代碼,會(huì)得到每一行的sales_s與他的上一行的sales,這個(gè)sales不一定是他自己上一個(gè)周期的sales,比如第一個(gè)uid=2的上一個(gè)周期應(yīng)該是0,但是這里面卻是4:

很明顯,上面的結(jié)果并非我們想要的結(jié)果,我們想要的是每個(gè)uid內(nèi)的上一個(gè)周期的sales,而非每一行sales對(duì)應(yīng)的上一行的sales,那怎么辦呢?方法就是在組內(nèi)進(jìn)行shift,也就是與groupby 進(jìn)行組合使用,先對(duì)uid進(jìn)行g(shù)roupby,然后再進(jìn)行shift偏移,具體代碼如下:
df["last_sales"] = df.groupby("uid")["sales"].shift(1).fillna(0)
df
最后運(yùn)行上面的代碼,就得到了我們開(kāi)頭想要的結(jié)果,即每個(gè)uid當(dāng)期的sales和他自己上一期的sales,具體結(jié)果如下:

以上就是關(guān)于shift函數(shù)的使用情況。
