Spliting DataFrame opp i flere rammer av datoer Python

stemmer
0

Jeg forstår fullt ut er det noen versjoner av dette spørsmål der ute, men ingen ser ut til å få i kjernen av problemet mitt. Jeg har en pandaer Dataframe med omtrent 72 000 rader fra 2015 til nå. Jeg bruker en beregning som finner flest virkningsfulle ord for et gitt sett av tekst (tf_idf). Denne beregningen tar ikke hensyn til tid, så jeg trenger å bryte min viktigste Dataframe ned i tidsbaserte segmenter, ideelt sett hver 15 og 30 dager (eller n dager egentlig, ikke uke / måned), og deretter kjøre beregningen på hver gang-segmentert Dataframe for å se og plott hva ordene kommer opp mer og mindre over tid.

Jeg har vært i stand til å bygge en del av denne ut dette semi-manuelt med følgende:

def dateRange():
    start = input(Enter a start date (MM-DD-YYYY) or '30' for last 30 days: )
    if (start != '30'):
        datetime.strptime(start, '%m-%d-%Y')
        end = input(Enter a end date (MM-DD-YYYY): )
        datetime.strptime(end, '%m-%d-%Y')
        dataTime = data[(data['STATUSDATE'] > start) & (data['STATUSDATE'] <= end)]
    else:
        dataTime = data[data.STATUSDATE > datetime.now() - pd.to_timedelta('30day')]
    return dataTime

dataTime = dateRange()
dataTime2 = dateRange()

def calcForDateRange(dateRangeFrame):
    ##### LONG FUNCTION####
    return word and number

calcForDateRange(dataTime)
calcForDateRange(dataTime2)

Dette fungerer - men jeg har til å skape de 2 datoene som forventes som jeg opprettet dette som en test manuelt. Hvordan kan jeg dele Dataframe av trinn og kjøre beregningen for hver dataframe?

dictser angivelig den måten å gjøre dette. Jeg prøvde:

dict_of_dfs = {}
for n, g in data.groupby(data['STATUSDATE']):
    dict_of_dfs[n] = g

for frame in dict_of_dfs:
    calcForDateRange(frame)

Den dict Resultatet var 2015-01-02: Dataframeuten ramme. Hvordan kan jeg bryte dette ned i en 100 eller så Dataframes å kjøre min funksjon på?

Også, jeg forstår ikke helt hvordan å bryte ned ['STATUSDATE']på antall dager spesielt?

Jeg ville unngå itera så mye som mulig, men jeg vet at jeg vil trolig måtte someehere.

Takk skal du ha

Publisert på 02/12/2019 klokken 23:52
kilden bruker
På andre språk...                            


2 svar

stemmer
1

La oss anta at du har en dataramme som dette:

date = pd.date_range(start='1/1/2018', end='31/12/2018', normalize=True)
x = np.random.randint(0, 1000, size=365)

df = pd.DataFrame(x, columns = ["X"])
df['Date'] = date
df.head()

utgang :

    X   Date
0   328 2018-01-01
1   188 2018-01-02
2   709 2018-01-03
3   259 2018-01-04
4   131 2018-01-05

Så dette dataramme har 365 rader, en for hver dag i året.

Nå hvis du vil gruppere disse dataene inn i intervaller på 20 dager og gi hver gruppe til en dict, kan du gjøre følgende

df_dict = {}
for k,v in df.groupby(pd.Grouper(key="Date", freq='20D')):
    df_dict[k.strftime("%Y-%m-%d")] = pd.DataFrame(v)
print(df_dict)
Svarte 03/12/2019 kl. 00:17
kilden bruker

stemmer
1

Hva med noe sånt som dette. Det skaper en ordbok av ikke tomme dataframes tastet på startdatoen for perioden.

import datetime as dt

start = '12-31-2017'
interval_days = 30

start_date = pd.Timestamp(start)
end_date = pd.Timestamp(dt.date.today() + dt.timedelta(days=1))
dates = pd.date_range(start=start_date, end=end_date, freq=f'{interval_days}d')

sub_dfs = {d1.strftime('%Y%m%d'): df.loc[df.dates.ge(d1) & df.dates.lt(d2)]
           for d1, d2 in zip(dates, dates[1:])}
# Remove empty dataframes.
sub_dfs = {k: v for k, v in sub_dfs.items() if not v.empty}
Svarte 03/12/2019 kl. 00:24
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more