Python 熊猫宝洁;我要到下一个工作日

Python 熊猫宝洁;我要到下一个工作日,python,pandas,pandas-groupby,python-datetime,quantitative-finance,Python,Pandas,Pandas Groupby,Python Datetime,Quantitative Finance,我很难有效地做到这一点。我在数据框中有一些股票和每日损益信息。实际上,我有数百万行数据,因此效率非常重要! 数据帧看起来像: ------------------------------- | Date | Security | P&L | ------------------------------- | 2016-01-01 | AAPL | 100 | ------------------------------- | 2016-01-02 | AAPL

我很难有效地做到这一点。我在数据框中有一些股票和每日损益信息。实际上,我有数百万行数据,因此效率非常重要! 数据帧看起来像:

-------------------------------
| 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年的数据要处理,所以暴力无法工作


提前感谢您,非常感谢您的指点

我们可以创建业务日期的数据框架,然后
merge\u 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

我们可以创建业务日期的数据框架,然后
merge\u 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您可以执行以下操作:

将熊猫作为pd导入
从pandas.tseries.holiday导入USFederalHolidayCalendar
将numpy作为np导入
日期\分钟='2015-01-01'
日期=2016年12月31日
cal=USFederalHolidayCalendar()
假日=校准假日(日期最小值,日期最大值).tolist()
df=pd.DataFrame({“Date”:pd.Date\u范围(Date\u min,Date\u max)})
df[“安全性”]=“应用程序”
df[“损益”]=np.random.randint(-1000,1000,len(df))
df[~df[“日期”].isin(假日)].groupby(“安全”)\
.agg({“日期”:“最大值”,
“损益表”:“总和”})\
.reset_index()

IIUC您可以执行以下操作:

将熊猫作为pd导入
从pandas.tseries.holiday导入USFederalHolidayCalendar
将numpy作为np导入
日期\分钟='2015-01-01'
日期=2016年12月31日
cal=USFederalHolidayCalendar()
假日=校准假日(日期最小值,日期最大值).tolist()
df=pd.DataFrame({“Date”:pd.Date\u范围(Date\u min,Date\u max)})
df[“安全性”]=“应用程序”
df[“损益”]=np.random.randint(-1000,1000,len(df))
df[~df[“日期”].isin(假日)].groupby(“安全”)\
.agg({“日期”:“最大值”,
“损益表”:“总和”})\
.reset_index()

“你可以使用<代码>工作日< /代码>,这个库你可以考虑使用<代码> DASK < /代码>这里。你有天要掉的列表吗?@ ANSEV你可以使用<代码>工作日。这个库你可以考虑使用<代码> DASK < /代码>。谢谢。我想这样做不会改变。在达斯克,如果你想跑得更快。我建议你,如果这是一个日常工作,你应该考虑其他方法。是的,我不知道DASK…看起来很有前途……去尝试一下吧!谢谢谢谢谢谢…我想这样就可以了如果你想让dask运行得更快的话,它应该在不改变dask的情况下工作。我建议你,如果这是一个日常工作,你应该考虑其他方法。是的,我不知道DASK…看起来很有前途……去尝试一下吧!谢谢你。这将是1:1的合并,带来未来最接近的工作日,因此不必担心改变形状。只需确保指定适当的最小和最大日期来包含完整的数据集。它应该。这将是1:1的合并,带来未来最接近的工作日,因此不必担心改变形状。只需确保指定适当的最小和最大日期来包含完整的数据集。