Spliting dataframe in più fotogrammi per data Python

voti
0

Capisco perfettamente ci sono alcune versioni di questa domanda là fuori, ma nessuno sembra di avere al centro del mio problema. Ho un panda dataframe con circa 72.000 righe a partire dal 2015 ad oggi. Sto usando un calcolo che trova il maggior numero di parole di forte impatto per un dato insieme di testi (tf_idf). Questo calcolo non tiene conto per tempo, quindi ho bisogno di rompere il mio dataframe principale in segmenti basati sul tempo, idealmente ogni 15 e 30 giorni (o n giorni davvero, non settimana / mese), quindi eseguire il calcolo su ogni time-segmentato dataframe per vedere e la trama ciò che le parole arrivano sempre di meno nel corso del tempo.

Sono stato in grado di parte build di questo questo fuori semi-manualmente con il seguente:

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)

Questo funziona - Tuttavia, devo creare manualmente le 2 date che si prevede come ho creato questo come un test. Come posso dividere il dataframe con incrementi ed eseguire il calcolo per ogni dataframe?

dictssono presumibilmente il modo per farlo. Provai:

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

for frame in dict_of_dfs:
    calcForDateRange(frame)

Il risultato era dict 2015-01-02: Dataframesenza la struttura. Come posso scomposizione in un 100 o giù di lì Dataframes per eseguire la mia funzione?

Inoltre, non capisco pienamente come abbattere ['STATUSDATE']per numero di giorni in particolare?

Vorrei evitare l'iterazione, per quanto possibile, ma so che probabilmente dovrò someehere.

Grazie

È pubblicato 02/12/2019 alle 23:52
fonte dall'utente
In altre lingue...                            


2 risposte

voti
1

Supponiamo di avere un frame di dati in questo modo:

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()

uscita :

    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

Quindi questo frame di dati ha 365 righe, una per ogni giorno dell'anno.

Ora, se si desidera raggruppare i dati in intervalli di 20 giorni e di assegnare a ciascun gruppo di un dizionario, è possibile effettuare le seguenti operazioni

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)
Risposto il 03/12/2019 a 00:17
fonte dall'utente

voti
1

Che ne dici di qualcosa del genere. Si crea un dizionario di dataframes non vuote calettati alla data di inizio del periodo.

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}
Risposto il 03/12/2019 a 00:24
fonte dall'utente

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