Повышение эффективности алгоритма сопоставления между двумя кадрами данных - PullRequest
0 голосов
/ 16 мая 2018

У меня есть два кадра данных, например.

более короткий период времени (4 часа)

Time                  Data_4h
1/1/01 00:00          1.1
1/1/01 06:00          1.2
1/1/01 12:00          1.3
1/1/01 18:00          1.1
2/1/01 00:00          1.1
2/1/01 06:00          1.2
2/1/01 12:00          1.3
2/1/01 18:00          1.1
3/1/01 00:00          1.1
3/1/01 06:00          1.2
3/1/01 12:00          1.3
3/1/01 18:00          1.1

Более длительный период времени (1 день)

Time                  Data_1d
1/1/01 00:00          1.1
2/1/01 00:00          1.6
3/1/01 00:00          1.0

Я хочу пометить данные более короткого временного интервала данными из данных более длинного временного интервала, но n-1 дней, оставив NaN там, где n-1 день не существует.

Например,

Окончательные объединенные данные, объединяющие 4 часа и 1 день

Time                  Data_4h     Data_1d
1/1/01 00:00          1.1         NaN
1/1/01 06:00          1.2         NaN
1/1/01 12:00          1.3         NaN
1/1/01 18:00          1.1         NaN
2/1/01 00:00          1.1         1.1
2/1/01 06:00          1.2         1.1
2/1/01 12:00          1.3         1.1
2/1/01 18:00          1.1         1.1 
3/1/01 00:00          1.1         1.6
3/1/01 06:00          1.2         1.6
3/1/01 12:00          1.3         1.6
3/1/01 18:00          1.1         1.6

Так что для 1/1 - он пытался найти 31/12, но не мог найти его, поэтому он был помечен как NaN. В течение 2/1 он искал 1/1 и помечал эти значения как 1.1 - значение для 1/1. В течение 3/1 он искал 2/1 и помечал их как 1.6 - значение для 2 / 1.

Важно отметить, что временные данные могут иметь большие пропуски. Поэтому я не могу получить доступ к строкам в большем таймфрейме напрямую.

Каков наилучший способ сделать это?

В настоящее время я перебираю все строки меньшего таймфрейма, а затем ищу дату более крупного таймфрейма, используя фильтр типа:

large_tf_data[(large_tf_data.index <= target_timestamp)][0]

Где target_timestamp рассчитывается для каждой строки в меньшем таймфрейме данных.

Это очень медленно! Любые предложения о том, как ускорить его?

1 Ответ

0 голосов
/ 16 мая 2018

Сначала позаботьтесь о датах

dayfirstme = lambda d: pd.to_datetime(d.Time, dayfirst=True)
df = df.assign(Time=dayfirstme)
df2 = df2.assign(Time=dayfirstme)

Затем конвертируйте df2 во что-то полезное

d2 = df2.assign(Time=lambda d: d.Time + pd.Timedelta(1, 'D')).set_index('Time').Data_1d

Примените магию

df.join(df.Time.dt.date.map(d2).rename(d2.name))

                  Time  Data_4h  Data_1d
0  2001-01-01 00:00:00      1.1      NaN
1  2001-01-01 06:00:00      1.2      NaN
2  2001-01-01 12:00:00      1.3      NaN
3  2001-01-01 18:00:00      1.1      NaN
4  2001-01-02 00:00:00      1.1      1.1
5  2001-01-02 06:00:00      1.2      1.1
6  2001-01-02 12:00:00      1.3      1.1
7  2001-01-02 18:00:00      1.1      1.1
8  2001-01-03 00:00:00      1.1      1.6
9  2001-01-03 06:00:00      1.2      1.6
10 2001-01-03 12:00:00      1.3      1.6
11 2001-01-03 18:00:00      1.1      1.6

IЯ уверен, что есть и другие способы, но я больше не хотел об этом думать.

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