Pandas 损益汇总到下一个工作日
Pandas P&L rollup to the next business day
我很难有效地执行此操作。我在数据框中有一些股票和每日损益信息。实际上,我有数百万行数据,所以效率很重要!
数据框看起来像:
-------------------------------
| Date | Security | P&L |
-------------------------------
| 2016-01-01 | AAPL | 100 |
-------------------------------
| 2016-01-02 | AAPL | 200 |
-------------------------------
| 2016-01-03 | AAPL | 300 |
-------------------------------
| 2016-01-04 | AAPL | -200 |
-------------------------------
我只想将损益结转至下一个工作日(不包括所有美国假期和周末)
因此,生成的数据框如下所示:
-------------------------------
| Date | Security | P&L |
-------------------------------
| 2016-01-04 | AAPL | 400 |
-------------------------------
我正在寻找实现此目的的有效方法。不幸的是,我确实有数千种证券和超过 5 年的数据需要处理,所以蛮力无法工作!
提前致谢,非常感谢任何对此的指点!
然后我们可以创建业务日期的 DataFrame merge_asof
。然后我们可以对此进行分组以获得总和。
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
#df['Date'] = pd.to_datetime(df.Date)
date_min = '2015-01-01'
date_max = '2016-12-31'
cal = USFederalHolidayCalendar()
holidays = cal.holidays(date_min, date_max).tolist()
df2 = pd.DataFrame({'bdate': pd.bdate_range(date_min, date_max,
holidays=holidays, freq='C')})
res = pd.merge_asof(df, df2, left_on='Date', right_on='bdate', direction='forward')
# Date Security P&L bdate
#0 2016-01-01 AAPL 100 2016-01-04
#1 2016-01-02 AAPL 200 2016-01-04
#2 2016-01-03 AAPL 300 2016-01-04
#3 2016-01-04 AAPL -200 2016-01-04
res.groupby(['Security', 'bdate'])['P&L'].sum()
#Security bdate
#AAPL 2016-01-04 400
IIUC 你可以这样做:
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
import numpy as np
date_min = '2015-01-01'
date_max = '2016-12-31'
cal = USFederalHolidayCalendar()
holidays = cal.holidays(date_min, date_max).tolist()
df = pd.DataFrame({"Date":pd.date_range(date_min, date_max)})
df["Security"] ="APPL"
df["P&L"] = np.random.randint(-1000, 1000, len(df))
df[~df["Date"].isin(holidays)].groupby("Security")\
.agg({"Date":"max",
"P&L":"sum"})\
.reset_index()
我很难有效地执行此操作。我在数据框中有一些股票和每日损益信息。实际上,我有数百万行数据,所以效率很重要! 数据框看起来像:
-------------------------------
| Date | Security | P&L |
-------------------------------
| 2016-01-01 | AAPL | 100 |
-------------------------------
| 2016-01-02 | AAPL | 200 |
-------------------------------
| 2016-01-03 | AAPL | 300 |
-------------------------------
| 2016-01-04 | AAPL | -200 |
-------------------------------
我只想将损益结转至下一个工作日(不包括所有美国假期和周末) 因此,生成的数据框如下所示:
-------------------------------
| Date | Security | P&L |
-------------------------------
| 2016-01-04 | AAPL | 400 |
-------------------------------
我正在寻找实现此目的的有效方法。不幸的是,我确实有数千种证券和超过 5 年的数据需要处理,所以蛮力无法工作!
提前致谢,非常感谢任何对此的指点!
然后我们可以创建业务日期的 DataFrame merge_asof
。然后我们可以对此进行分组以获得总和。
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
#df['Date'] = pd.to_datetime(df.Date)
date_min = '2015-01-01'
date_max = '2016-12-31'
cal = USFederalHolidayCalendar()
holidays = cal.holidays(date_min, date_max).tolist()
df2 = pd.DataFrame({'bdate': pd.bdate_range(date_min, date_max,
holidays=holidays, freq='C')})
res = pd.merge_asof(df, df2, left_on='Date', right_on='bdate', direction='forward')
# Date Security P&L bdate
#0 2016-01-01 AAPL 100 2016-01-04
#1 2016-01-02 AAPL 200 2016-01-04
#2 2016-01-03 AAPL 300 2016-01-04
#3 2016-01-04 AAPL -200 2016-01-04
res.groupby(['Security', 'bdate'])['P&L'].sum()
#Security bdate
#AAPL 2016-01-04 400
IIUC 你可以这样做:
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar
import numpy as np
date_min = '2015-01-01'
date_max = '2016-12-31'
cal = USFederalHolidayCalendar()
holidays = cal.holidays(date_min, date_max).tolist()
df = pd.DataFrame({"Date":pd.date_range(date_min, date_max)})
df["Security"] ="APPL"
df["P&L"] = np.random.randint(-1000, 1000, len(df))
df[~df["Date"].isin(holidays)].groupby("Security")\
.agg({"Date":"max",
"P&L":"sum"})\
.reset_index()