Преобразование кадра данных ежедневных панд в частоту минут не работает для двух строк данных - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь преобразовать дневной частотный фрейм данных в минутные данные, и в предыдущем посте было предложено использовать метод ffil, приведенный ниже, но, похоже, он не работает с фреймами данных, которые состоят только из 2 строк ( Преобразованиеof Daily pandas dataframe к минутной частоте ).

Таким образом, нижеприведенный кадр данных должен быть преобразован.

import pandas as pd
dict = [
        {'ticker':'jpm','date': '2016-11-28','returns': 0.2},
{ 'ticker':'ge','date': '2016-11-28','returns': 0.2},
{'ticker':'fb', 'date': '2016-11-28','returns': 0.2},
{'ticker':'aapl', 'date': '2016-11-28','returns': 0.2},
{'ticker':'msft','date': '2016-11-28','returns': 0.2},
{'ticker':'amzn','date': '2016-11-28','returns': 0.2},
{'ticker':'jpm','date': '2016-11-29','returns': 0.2},
{'ticker':'ge', 'date': '2016-11-29','returns': 0.2},
{'ticker':'fb','date': '2016-11-29','returns': 0.2},
{'ticker':'aapl','date': '2016-11-29','returns': 0.2},
{'ticker':'msft','date': '2016-11-29','returns': 0.2},
{'ticker':'amzn','date': '2016-11-29','returns': 0.2}
]
df = pd.DataFrame(dict)
df['date']      = pd.to_datetime(df['date'])
df=df.set_index(['date','ticker'], drop=True)  

Это работает на всем фрейме данных:

df_min = df.unstack().asfreq('Min', method='ffill').between_time('8:30','16:00').stack()

Но когда я работаю с меньшим фреймом данных, он почему-то возвращает пустой фрейм данных:

df2=df.iloc[0:2,:]

df2_min = df2.unstack().asfreq('Min', method='ffill').between_time('8:30','16:00').stack()

У кого-нибудь есть объяснение этому странному поведению?

edt: я заметил, что код работает, только если в фрейме данных есть хотя бы 7 строк.

1 Ответ

1 голос
/ 05 июля 2019

Если у вас есть только 2 строки ввода DataFrame, то после изменения на unstack получите одну строку DataFrame, и pandas не может создать непрерывную минуту DataFrame, поскольку только одно значение DatetimeIndex.

Возможнорешение добавить на следующий день после изменения формы, заполнить его данными последней предыдущей строки, применить решение и на последних шагах удалить последнюю строку помощника по позициям с iloc:

df2=df.iloc[0:2]
print (df2)
                   returns
date       ticker         
2016-11-28 jpm         0.2
           ge          0.2

df3 = df2.unstack()
print (df3)
ticker         jpm   ge
date                   
2016-11-28     0.2  0.2
df3.loc[df3.index.max() + pd.Timedelta(1, unit='d')] = df3.iloc[-1]
print (df3)
           returns     
ticker         jpm   ge
date                   
2016-11-28     0.2  0.2
2016-11-29     0.2  0.2 <- helper row

df_min = df3.asfreq('Min', method='ffill')
print (df_min.tail())
                    returns     
ticker                  jpm   ge
date                            
2016-11-28 23:56:00     0.2  0.2
2016-11-28 23:57:00     0.2  0.2
2016-11-28 23:58:00     0.2  0.2
2016-11-28 23:59:00     0.2  0.2
2016-11-29 00:00:00     0.2  0.2 <- helper row

df_min = df_min.iloc[:-1].between_time('8:30','16:00').stack()
#print (df_min)
...