我不是很有编程经验,我被困在一个资产管理领域的研究项目中。
我的目标:我有2个数据框架,-一个包含除了其他列"欧洲短日期";SP150030after","SP1500365before"(截图)和第二个包含"日期"S&P 1500_return"(截图)。对于第一个数据框中的每一行,我想计算"欧洲短日期"列中日期之前365天标准普尔1500指数的累计收益。以及标普1500指数在"欧洲短日"一栏日期后30天的累计收益;并将这些结果放在"SP150030after"one_answers"SP1500365before".
这些返回值将使用第二个数据帧计算。"S& 1500页_return"第二个数据框中每个日期的列表示"标准普尔1500市场指数+ 1"的日收益。因此,例如,要在第一个数据框中获得2020年12月31日之前超过1年的累计回报,我必须计算"P 1500_return"列中值的乘积。从2019年12月31日至2020年12月30日期间数据框2中每个当前日(交易日)的第二个数据框起。
我已经尝试过了:我翻了"欧洲短约会"。DataFrame 1 "Date"在Dataframe 2中作为索引字段通过&;for&;来实现我的目标循环。我试图把"欧洲短约会"变成"欧洲短约会"。成为"名单";使用它来迭代数据框架1,但我得到以下错误:"/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:18: SettingWithCopyWarning:试图在来自数据帧的切片副本上设置值。尝试使用.loc[row_indexer,col_indexer] = value代替";
这是我目前为止的代码:
Main_set = pd.read_excel('...')
Main_set = pd.DataFrame(Main_set)
Main_set['European short date'] = pd.to_datetime(Main_set['European short date'], format='%d.%m.%y', errors='coerce').dt.strftime('%Y-%m-%d')
Main_set = Main_set.set_index('European short date')
Main_set.head(5)
Indexes = pd.read_excel('...')
Indexes = pd.DataFrame(Indexes)
Indexes['Date'] = pd.to_datetime(Indexes['Date'], format='%d.%m.%y', errors='coerce').dt.strftime('%Y-%m-%d')
Indexes = Indexes.set_index('Date')
SP1500DailyReturns = Indexes[['S&P 1500 SUPER COMPOSITE - PRICE INDEX']]
SP1500DailyReturns['S&P 1500_return'] = (SP1500DailyReturns['S&P 1500 SUPER COMPOSITE - PRICE INDEX'] / SP1500DailyReturns['S&P 1500 SUPER COMPOSITE - PRICE INDEX'].shift(1))
SP1500DailyReturns.to_csv('...')
Main_set['SP50030after'] = np.zeros(326)
import math
dates = Main_set['European short date'].to_list()
dates.head()
for n in dates:
Main_set['SP50030after'] = math.prod(arr)
提前感谢!
如果它对某些人有用,我通过使用for循环并将问题分成更多步骤来解决这个问题:
for n in dates:
Date = pd.Timestamp(n)
DateB4 = Date - pd.Timedelta("365 days")
DateAfter = Date + pd.Timedelta("30 days")
ReturnsofPeriodsBackwards = SP1500DailyReturns.loc[str(DateB4) : str(Date), 'S&P 1500_return']
Main_set.loc[str(Date), 'SP500365before'] = np.prod(ReturnsofPeriodsBackwards)
ReturnsofPeriodsForward = SP1500DailyReturns.loc[str(Date) : str(DateAfter), 'S&P 1500_return']
Main_set.loc[str(Date), 'SP50030after'] = np.prod(ReturnsofPeriodsForward)