2013-12-08 5 views
5

Quando si reindicalizza, ad esempio, dati di 1 minuto ai dati giornalieri (ad es. Indice per i prezzi giornalieri alle 16:00), se c'è una situazione in cui non ci sono dati di 1 minuto per il timestamp di 16:00 in un giorno, si desidera inoltrare il riempimento dagli ultimi dati 1 min non null. Nel seguente caso, non ci sono dati 1min prima delle 16:00 del 13 e gli ultimi dati 1min provengono dal decimo.Qual è la funzionalità del metodo di riempimento durante la reindicizzazione?

Quando si utilizza reindex con method = 'ffill', non ci si aspetterebbe che il seguente codice riempia il valore il 13 alle 16:00? Ispezionando daily1 mostra che manca comunque.

import pandas as pd 
import numpy as np 

hf_index = pd.date_range(start='2013-05-09 9:00', end='2013-05-13 23:59', freq='1min') 
hf_prices = np.random.rand(len(hf_index)) 
hf = pd.DataFrame(hf_prices, index=hf_index) 
hf.ix['2013-05-10 18:00':'2013-05-13 18:00',:]=np.nan 
hf.plot() 

ind_daily = pd.date_range(start='2013-05-09 16:00', end='2013-05-13 16:00', freq='B') 

print(ind_daily.values) 
daily1 = hf.reindex(index=ind_daily, method='ffill') 

Per riempire come uno (o meglio) aspetterei, ho bisogno di fare questo:

daily2 = daily1.fillna(method='ffill') 

Se questo è il caso, qual è il metodo di riempimento in reindicizzare realtà facendo. Non mi è chiaro solo dalla documentazione dei panda. Mi sembra che non dovrei fare la linea sopra.

+0

Hmm. Sono d'accordo che questo è un comportamento inaspettato e potrebbe essere un bug. Per inciso, questo può aiutarti nel frattempo, con dati indicizzati a data/ora, [resample] (http: //pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.resample.html) è in genere una scelta migliore rispetto a reindex. Vedi in particolare gli argomenti delle parole chiave '' label'' e '' close'' che potrebbero essere correlati al tuo problema. –

+0

@ user915 altrimenti, come è possibile reindicizzare il dataframe su un'altra frequenza mentre si stanno ancora trattando i valori mancanti come valore mancante? –

+0

@runnerup utilizzando il metodo = Nessuno? – user915

risposta

1

scrivo il mio commento sul github qui pure:

il comportamento attuale, a mio parere ha più senso. I valori "nan" possono essere valori "effettivi" validi in alcuni scenari. il concetto di un valore reale "nan" dovrebbe essere diverso dal valore "nan" a causa del cambiamento dell'indice. Se ho un dataframe come questo:

 A  B  C 
1 1.242 NaN 0.110 
3 NaN -0.185 -0.209 
5 -0.581 1.483 NaN 

e voglio mantenere tutti nan come nan, rende molto più senso di avere:

df.reindex([2, 4, 6], method='ffill') 
     A  B  C 
2 1.242 NaN 0.110 
4 NaN -0.185 -0.209 
6 -0.581 1.483 NaN 

basta prendere qualsiasi valore c'è (nan o non nan) e riempire in avanti fino al prossimo indice disponibile. La reindicizzazione non dovrebbe imporre un riempimento obbligatorio sui dati.

Questo è completamente diverso da

df.reindex([2, 4, 6], method=None) 

che produce

A B C 
2 NaN NaN NaN 
4 NaN NaN NaN 
6 NaN NaN NaN 

Ecco un esempio:

np.nan può solo significare non applicabile; dire che ho dati orari, e nei fine settimana alcuni calcoli non sono applicabili. Riempirò nan per quelle colonne durante i fine settimana. ora se ho indice più fine, diciamo ogni minuto, il reindex prenderà l'ultimo valore da venerdì e lo riempirà per l'intero fine settimana. Questo è sbagliato.

nella reindicizzazione di un dataframe, fll di inoltro significa basta prendere qualsiasi valore ci sia (nan o non nan) e riempire in avanti fino al prossimo indice disponibile. Un valore 'nan' può essere solo un'osservazione valida e valida che si desidera mantenere così com'è.

La reindirizzamento non deve imporre un riempimento obbligatorio sui dati.

+0

Scusa se ho frainteso qualcosa qui nell'esempio sopra ma non dovrebbe element (4, B) = -0.185 e non -0.742? Sto solo cercando di capire il tuo punto. Penso di iniziare a cogliere il tuo punto più ampio sulla distinzione tra Ffill e Fillna, ma non sono sicuro di aver compreso questo esempio. – user915

+0

@ user915 scusa, si trattava di una copia incolla errata. risolto quello. vedere la pagina github per un esempio di utilizzo –

Problemi correlati