#pandas
#pandas
Вопрос:
У меня есть фрейм данных, в котором более 5 лет есть дата открытия, максимума, минимума, закрытия и дата каждой минуты. Я хочу вычислить новый столбец и хочу сравнить (закрыть — открыть) цену закрытия (этой минуты) с ценой открытия этого дня (9:15 утра). Как мне это сделать?
Ниже приведен скриншот файла. В J
столбце у меня есть цена открытия дня, а K
столбец — текущее закрытие. Я хочу вычислить разницу между закрытием и открытием. Этот файл содержит 0,7 миллиона строк и более 1000 дней, что означает, что цена открытия изменится 1000 раз.
У меня есть 200 таких похожих файлов, в которых мне нужно выполнить ту же процедуру, и, следовательно, цикл не является желаемым решением.
Ответ №1:
Просто используйте groupby
и transform
. Обратите внимание, что при этом предполагается, что ваши данные отсортированы (например, первое значение каждой группы — это цена открытия).
import pandas as pd
import datetime
# sample date
df1 = pd.DataFrame({'ticker': ['A']*5,
'date': pd.date_range('2020-01-01', '2020-01-01', periods=5),
'time': [datetime.time(9, 15), datetime.time(9, 16), datetime.time(9, 17),
datetime.time(9, 18), datetime.time(9, 19)],
'open': [1,2,3,4,5],
'close': [2,3,4,3,2]})
df2 = pd.DataFrame({'ticker': ['A']*5,
'date': pd.date_range('2020-01-02', '2020-01-02', periods=5),
'time': [datetime.time(9, 15), datetime.time(9, 16), datetime.time(9, 17),
datetime.time(9, 18), datetime.time(9, 19)],
'open': [3,2,3,4,5],
'close': [2,3,4,3,2]})
df = df1.append(df2)
# groupby the ticker and date then use transform to get the first value
# subtract the close from the first value of each group
df['diff'] = df['close'] - df.groupby(['ticker', 'date'])['open'].transform('first')
ticker date time open close diff
0 A 2020-01-01 09:15:00 1 2 1
1 A 2020-01-01 09:16:00 2 3 2
2 A 2020-01-01 09:17:00 3 4 3
3 A 2020-01-01 09:18:00 4 3 2
4 A 2020-01-01 09:19:00 5 2 1
0 A 2020-01-02 09:15:00 3 2 -1
1 A 2020-01-02 09:16:00 2 3 0
2 A 2020-01-02 09:17:00 3 4 1
3 A 2020-01-02 09:18:00 4 3 0
4 A 2020-01-02 09:19:00 5 2 -1