Как эффективно отобразить данные между временными рядами в Python - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь создать эффективную функцию для повторной выборки данных временных рядов.

Предположение: Оба набора данных временных рядов имеют одинаковое время начала и окончания.(Я делаю это на отдельном шаге.)

Функция повторной выборки (неэффективно)

import numpy as np

def resample(desired_time_sequence, data_sequence):
    downsampling_indices = np.linspace(0, len(data_sequence)-1, len(desired_time_sequence)).round().astype(int)
    downsampled_array = [data_sequence[ind] for ind in downsampling_indices] 
    return  downsampled_array

Скоростное тестирование

import timeit
def test_speed(): resample([1,2,3], [.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6])
print(timeit.timeit(test_speed, number=100000))
# 1.5003695999998854 

Интересно услышать любые предложения.

1 Ответ

2 голосов
/ 21 июня 2019

Замена

downsampled_array = [data_sequence[ind] for ind in downsampling_indices]

на

downsampled_array = data_sequence[downsampling_indices]

обеспечила 7-кратное ускорение моих данных тестирования.

Код, используемый для измерения ускорения:

import timeit

f1 = """
def resample(output_len, data_sequence):
    downsampling_indices = np.linspace(0, len(data_sequence)-1, output_len).round().astype(int)
    downsampled_array = [data_sequence[ind] for ind in downsampling_indices]
    return downsampled_array

resample(output_len, data_sequence)
"""

f2 = """
def resample_fast(output_len, data_sequence):
    downsampling_indices = np.linspace(0, len(data_sequence)-1, output_len).round().astype(int)
    downsampled_array = data_sequence[downsampling_indices]
    return downsampled_array

resample_fast(output_len, data_sequence)
"""


setup="""
import numpy as np
data_sequence = np.random.randn(10000)
output_len = 752
"""

print(timeit.timeit(f1, setup, number=1000))
print(timeit.timeit(f2, setup, number=1000))

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