Я очень плохо знаком с python и pandas, и мой ограниченный опыт привел меня к неэффективному решению, делающему мой код слишком медленным .
У меня есть некоторые данные, соответствующие запасурыночные цены.
Выборка случайная на наносекундном уровне.
Я пытаюсь добиться преобразования в новый набор данных с фиксированной частотой дискретизации .
Я преобразую свой набор данных следующим образом:
- Я устанавливаю time_delta в качестве статического шага по времени 0,5 секунды
- Я отбрасываю записи, соответствующиета же наносекунда
- Я генерирую метки времени от моего
start_time
до вычисленного end_time
- Я перебираю свой исходный кадр данных, копируя (и дублируя при необходимости) последнюю известную запись вмоя time_delta для каждого шага к новому фрейму данных.
Я полагаю, что моя проблема, вероятно, в том, что я добавляю записи по одному в мой новый фрейм данных, однако я не смогвыяснить ваиспользование встроенных панд для оптимизации моего кода.
Время выполнения в настоящее время составляет ~ 4 минуты для данных за день (поворачивая ~ 30K выборок до 57600) при выполнении в Google Colab.
Я также тестировал локально без каких-либо улучшений.
# ====================================================================
# Rate Re-Definition
# ====================================================================
SAMPLES_PER_SECOND = 2
dt = 1000000000 / SAMPLES_PER_SECOND # Time delta in nanoseconds
SECONDS_IN_WORK_DAY = 28800 # 60 seconds * 60 minutes * 8 hours
TOTAL_SAMPLES = SECONDS_IN_WORK_DAY * SAMPLES_PER_SECOND
SAMPLING_PERIOD = dt * TOTAL_SAMPLES
start_of_day_timestamp = ceil_to_minute(df['TimeStamp'].iloc[0])
end_of_day_timestamp = start_of_day_timestamp + SAMPLING_PERIOD
fixed_timestamps = np.arange(start_of_day_timestamp,
end_of_day_timestamp,
dt,
dtype=np.uint64
)
# ====================================================================
# Drop records corresponding to the same timestamps
# ====================================================================
df1 = df.drop_duplicates(subset='TimeStamp', keep="last")
# ====================================================================
# Construct new dataframe
# ====================================================================
df2 = df1.iloc[0:1]
index_bounds_limit = df1.shape[0] - 1
index = 0
for i in tqdm(range(1, TOTAL_SAMPLES), desc="Constructing fixed sampling rate records... "):
while index < index_bounds_limit and df1['TimeStamp'].iloc[index] < fixed_timestamps[i]:
index += 1
df2 = df2.append(df1.iloc[index], ignore_index=True)
df2['TimeStamp'] = fixed_timestamps
Мне нужно максимально сократить время (при сохранении читабельности / ремонтопригодности, не нужно использовать «хаки»).
Буду признателен за любую помощь и указатели в правильном направлении.
Заранее спасибо