Në mësimin e makinerive, përfshirja e veçorive më parashikuese në një algoritëm zakonisht jep rezultate superiore. Për tezën time të Masterit, unë u ngarkova me krijimin e një motori parashikimi për pagesat e faturave, një motor që përpiqet të parashikojë datat e pagesave të faturave të sapo lëshuara.

Si dikush me përvojë paraprake në parashikimin e pagesave të faturave, e dija se sjellja e pagesave të mëparshme mund të ofronte një parashikim mjaft të saktë të pagesave të ardhshme. Ky kuptim u përforcua nga literatura që shqyrtova, e cila theksoi dritare të ndryshme të klientëve dhe borxheve globale si tregues parashikues brenda këtij konteksti. Tani që e dija se çfarë doja, më duhej një metodë për ta ekzekutuar atë në Python. Këtu zbulova funksionin e rrotullimit. Nëse preferoni një qasje më vizuale, mund të shikoni videon shoqëruese të YouTube në vend që të ndiqni metodën e përshkruar në tekstin më poshtë.

Kodi për shembullin e mëposhtëm, së bashku me grupin e të dhënave të përdorur, mund të aksesohet në GitHub nëpërmjet kësaj lidhjeje

Të dhënat e përdorura në këtë shembull përfshin 2466 fatura që përfshijnë një periudhë prej rreth dy vjetësh. Objektivi është ndërtimi i katër funksioneve të dritares që ekzaminojnë faturat e kaluara në nivel klienti dhe global, si për një dritare të bazuar në sasi prej tre faturash dhe një dritare të bazuar në kohë prej 30 ditësh. Pas importimit të pandave dhe pastrimit të të dhënave për të përfshirë vetëm kolonat përkatëse për këtë shembull, na mbetet fotografia e mëposhtme e grupit të të dhënave.

Krijimi i funksioneve globale është mjaft i thjeshtë, siç ilustrohet nga kodi më poshtë. Është e domosdoshme të konvertohet data në një format datatime dhe ta renditni atë përpara se të vazhdoni. Me atë të përfunduar, ne krijojmë një kolonë të re në grupin e të dhënave dhe e vendosim atë si 'df'. Kjo arrihet përmes komandës df.rolling(window = ‘30d’, on= “InvoiceDate”).DaysLate.mean(). Ajo që bën ky funksion është të marrë 30 ditët para faturës (sipas datës së faturës) dhe të llogarisë mesataren e kolonës 'Days Late'.

df["InvoiceDate"] = pd.to_datetime(df["InvoiceDate"])
df = df.sort_values('InvoiceDate')
# Global Days Late Last 30 Days
df["GlobalDaysLateLast30days"] = df.rolling(window = '30d', on = "InvoiceDate").DaysLate.mean()

Krijimi i agregateve të dritareve të bazuara në sasi është po aq i thjeshtë. Dallimi i vetëm është zëvendësimi i një agregati ditor me një numër të plotë. Ky rregullim do të japë mesataren e tre faturave të fundit. Për të shmangur vlerat NaN në këtë skenar, mund ta vendosni parametrin 'min_periods' në 1. Kjo do të sigurojë një mesatare edhe nëse algoritmi ka më pak se tre regjistrime në dispozicion.

# Global Days Late Last 3 Invoices (min_periods = 1 to avoid NaN)
df["GlobalDaysLateLast3Inv"] = df.rolling(window = 3, on = "InvoiceDate")
.DaysLate.mean()

Më poshtë, mund të shihni daljen e prodhuar nga këto funksione. Ne mund të kishim anashkaluar vlerat NaN duke vendosur 'min_periods' në 1, që është pikërisht ajo që do të bëjmë në nivelin e klientit.

Ne i përmbahemi të njëjtës qasje në nivelin e klientit, por kodi bëhet pak më i ndërlikuar. Kjo është kryesisht për shkak të kërkesës për zbatimin e grupimeve dhe rregullimin e indekseve. Më poshtë, do të gjeni fragmentin e kodit që na mundëson të llogarisim mesataren e tre faturave më të fundit në nivel klienti.

# Customer last 3 Invoices average days late 
df["AvLateLast3"] = df.groupby("customerID")
.rolling(window = 3,min_periods = 1)
.DaysLate.mean().reset_index().set_index("level_1")
.sort_index()["DaysLate"]

Grupimi i bazuar në kohë e ndërlikon më tej procesin pasi së pari duhet të gjenerojmë pikën e të dhënave përpara se ta bashkojmë përsëri në kornizën e të dhënave. Më poshtë mund të gjeni kodin përkatës për këtë operacion.

# Customer Average Days Late Last 30 days 
mean_30d = (df .set_index('InvoiceDate') # !important 
.sort_index() .groupby('customerID') 
.rolling('30d')['DaysLate']
.mean() 
.reset_index(name='CustomerDaysLate_30days') ) 
# merge the rolling mean back to original dataframe 
df = df.merge(mean_30d)

Siç mund ta shihni në grupin përfundimtar të të dhënave, ne kemi ekzekutuar me sukses funksionet e dritares si në nivelin global ashtu edhe në atë të klientit. Shembulli për një klient është më poshtë.

Kam gjetur se këto metoda janë tepër të vlefshme në krijimin e veçorive për mësimin e makinerive. Unë jam vërtet i interesuar të dëgjoj për përvojat tuaja në zbatimin e tyre ose ndonjë sugjerim që mund të keni për përmirësimin e kodit të dhënë më sipër. Ju lutem mos ngurroni të ndani mendimet tuaja në seksionin e komenteve. Gëzuar kodimin!