我有一个数据框,其中包含超过5年的每分钟的开盘价,最高价,最低价,收盘价和日期。我想计算一个新列,并想将(该分钟的)收盘价与当天(上午9:15)的开盘价进行比较。我该怎么办?
下面是文件的屏幕截图。在J
列中,有当日的开盘价,在K
列中,是运行的收盘价。我想计算关闭和打开之间的差异。该文件有70万行,超过1000天,这意味着公开价格将更改1000次。
我有200个类似的文件,需要执行相同的步骤,因此循环不是理想的解决方案。
答案 0 :(得分: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