Оптимизация времени для реконструкции кадра данных панд (случайная или фиксированная выборка) - PullRequest
1 голос
/ 29 марта 2019

Я очень плохо знаком с 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

Мне нужно максимально сократить время (при сохранении читабельности / ремонтопригодности, не нужно использовать «хаки»).

Буду признателен за любую помощь и указатели в правильном направлении.

Заранее спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...