У меня есть два кадра данных: 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)