Эффективно восстановить DataFrame, используя индекс с передискретизацией - PullRequest
0 голосов
/ 02 июля 2018

У меня есть два кадра данных: df1 и df2

и df1, и df2 получены из одного и того же исходного набора данных, который имеет DatetimeIndex.

У df2 все еще есть DatetimeIndex.

Принимая во внимание, что df1 был подвергнут избыточной выборке и теперь имеет индекс int с предыдущим DatetimeIndex в виде столбца «Date» внутри.

Мне нужно восстановить df2 так, чтобы он совпал с df1, то есть мне нужно будет пересчитать строки с передискретизацией, а затем упорядочить их и установить их в том же индексе int, который имеет df1.

В настоящее время я использую эти две функции ниже, но они мучительно медленны. Есть ли способ ускорить это? Я не смог найти ни одной встроенной функции, которая делает это. Есть ли?

def align_data(idx_col,data):
    new_data = pd.DataFrame(index=idx_col.index,columns=data.columns)
    for label,group in idx_col.groupby(idx_col):
        if len(group.index) > 1:
            slice = expanded(data.loc[label],len(group.index)).values
        else:
            slice = data.loc[label]
        new_data.loc[group.index] = slice
    return new_data

def expanded(row,l):
    return pd.DataFrame(data=[row for i in np.arange(l)],index=np.arange(l),columns=row.index)

Тест можно сгенерировать, используя код ниже:

import pandas as pd
import numpy as np
import datetime as dt
dt_idx = pd.DatetimeIndex(start='1990-01-01',end='2018-07-02',freq='B')
df1 = pd.DataFrame(data=np.zeros((len(dt_idx),20)),index=dt_idx)
df1.index.name = 'Date'
df2 = df1.copy()
df1 = pd.concat([df1,df1.sample(len(dt_idx)/2)],axis=0)
df1.reset_index(drop=False,inplace=True)
t = dt.datetime.now()
df2_aligned = align_data(df1['Date'],df2)
print(dt.datetime.now()-t)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...