对同一天进行求和和平均
Summing and averaging for the same days
我有我在 excel 中按天数排序的数据,我现在想做的是获取每一天的每日 return 的总和。这里的问题是我这几天有多个条目。所以我可能只有一个 2018-12-05 的 Daily Return 条目,但 2018-12-06 的 5 个条目。我希望我在 2018-12-06 只获得一个条目,其中包括每日累计 return(因此所有累计 return 加在一起)和平均每天 return(因此累计 return 除以当天的条目数。对于 2018-12-06,这将除以 5)。
所以我现在拥有的数据是这样的:
Dates Last.Price Daily.Return
19788 2018-11-23 75.18 -0.001199
19789 2018-11-23 129.04 -0.026490
19790 2018-11-26 77.84 -0.035382
19791 2018-11-26 127.98 0.008215
19792 2018-11-27 79.50 -0.021326
19793 2018-11-27 122.68 0.041413
19794 2018-11-28 80.27 -0.009686
19795 2018-11-29 80.00 0.003364
最终的数据框应该是这样的
Dates Last.Price Cum.Return Average.Return
19788 2018-11-23 75.18 -0.027689 -0.0138445
19790 2018-11-26 77.84 -0.027167 -0.0135835
19792 2018-11-27 79.50 0.020087 0.0100435
19794 2018-11-28 80.27 -0.009686 -0.009686
19795 2018-11-29 80.00 0.003364 0.003364
到目前为止,我有以下代码来计算每日 return 的总和。但是,它的总和不正确。而且我不知道如何实现平均每天 return。
df = pd.read_csv('/Python Test/SP500Acquirer.csv')
def sum_from_days_prior(row, df):
'''returns sum of values in row month,
from all dates in df prior to row date'''
day = pd.to_datetime(row).day
all_dates_prior = df[df.index <= row]
same_day = all_dates_prior[all_dates_prior.index.day == day]
return same_day["Daily.Return"].sum()
df.set_index('Dates', inplace = True)
df.index = pd.to_datetime(df.index)
df["Dates"] = df.index
df.sort_index(inplace = True)
df["Day"] = df["Dates"].apply(lambda row: sum_from_days_prior (row, df))
df.drop("Dates", axis = 1, inplace = True)
print(df.tail(20))
如前所述,此代码无法正确计算每日 return 的总和。而且我不知道如何获得这些天的平均 returns。
我认为您需要按 agg
with functions first
, sum
and mean
:
进行汇总
因为列Daily.Return
是通过list中定义的多个函数聚合的,所以在输出中得到MultiIndex
。所以有必要展平它 - 最简单的是使用 map
和 join
.
df = df.groupby('Dates').agg({'Last.Price':'first', 'Daily.Return':['mean','sum']})
print (df)
Last.Price Daily.Return
first mean sum
Dates
2018-11-23 75.18 -0.013844 -0.027689
2018-11-26 77.84 -0.013583 -0.027167
2018-11-27 79.50 0.010044 0.020087
2018-11-28 80.27 -0.009686 -0.009686
2018-11-29 80.00 0.003364 0.003364
print (df.columns)
MultiIndex(levels=[['Last.Price', 'Daily.Return'], ['first', 'mean', 'sum']],
labels=[[0, 1, 1], [0, 1, 2]])
df.columns = df.columns.map('_'.join)
print (df)
Last.Price_first Daily.Return_mean Daily.Return_sum
Dates
2018-11-23 75.18 -0.013844 -0.027689
2018-11-26 77.84 -0.013583 -0.027167
2018-11-27 79.50 0.010044 0.020087
2018-11-28 80.27 -0.009686 -0.009686
2018-11-29 80.00 0.003364 0.003364
最后 rename
列:
d = {'Last.Price_first':'Last.Price',
'Daily.Return_sum': 'Cum.Return',
'Daily.Return_mean': 'Average.Return'}
df = df.rename(columns=d)
print (df)
Last.Price Average.Return Cum.Return
Dates
2018-11-23 75.18 -0.013844 -0.027689
2018-11-26 77.84 -0.013583 -0.027167
2018-11-27 79.50 0.010044 0.020087
2018-11-28 80.27 -0.009686 -0.009686
2018-11-29 80.00 0.003364 0.003364
我有我在 excel 中按天数排序的数据,我现在想做的是获取每一天的每日 return 的总和。这里的问题是我这几天有多个条目。所以我可能只有一个 2018-12-05 的 Daily Return 条目,但 2018-12-06 的 5 个条目。我希望我在 2018-12-06 只获得一个条目,其中包括每日累计 return(因此所有累计 return 加在一起)和平均每天 return(因此累计 return 除以当天的条目数。对于 2018-12-06,这将除以 5)。
所以我现在拥有的数据是这样的:
Dates Last.Price Daily.Return
19788 2018-11-23 75.18 -0.001199
19789 2018-11-23 129.04 -0.026490
19790 2018-11-26 77.84 -0.035382
19791 2018-11-26 127.98 0.008215
19792 2018-11-27 79.50 -0.021326
19793 2018-11-27 122.68 0.041413
19794 2018-11-28 80.27 -0.009686
19795 2018-11-29 80.00 0.003364
最终的数据框应该是这样的
Dates Last.Price Cum.Return Average.Return
19788 2018-11-23 75.18 -0.027689 -0.0138445
19790 2018-11-26 77.84 -0.027167 -0.0135835
19792 2018-11-27 79.50 0.020087 0.0100435
19794 2018-11-28 80.27 -0.009686 -0.009686
19795 2018-11-29 80.00 0.003364 0.003364
到目前为止,我有以下代码来计算每日 return 的总和。但是,它的总和不正确。而且我不知道如何实现平均每天 return。
df = pd.read_csv('/Python Test/SP500Acquirer.csv')
def sum_from_days_prior(row, df):
'''returns sum of values in row month,
from all dates in df prior to row date'''
day = pd.to_datetime(row).day
all_dates_prior = df[df.index <= row]
same_day = all_dates_prior[all_dates_prior.index.day == day]
return same_day["Daily.Return"].sum()
df.set_index('Dates', inplace = True)
df.index = pd.to_datetime(df.index)
df["Dates"] = df.index
df.sort_index(inplace = True)
df["Day"] = df["Dates"].apply(lambda row: sum_from_days_prior (row, df))
df.drop("Dates", axis = 1, inplace = True)
print(df.tail(20))
如前所述,此代码无法正确计算每日 return 的总和。而且我不知道如何获得这些天的平均 returns。
我认为您需要按 agg
with functions first
, sum
and mean
:
因为列Daily.Return
是通过list中定义的多个函数聚合的,所以在输出中得到MultiIndex
。所以有必要展平它 - 最简单的是使用 map
和 join
.
df = df.groupby('Dates').agg({'Last.Price':'first', 'Daily.Return':['mean','sum']})
print (df)
Last.Price Daily.Return
first mean sum
Dates
2018-11-23 75.18 -0.013844 -0.027689
2018-11-26 77.84 -0.013583 -0.027167
2018-11-27 79.50 0.010044 0.020087
2018-11-28 80.27 -0.009686 -0.009686
2018-11-29 80.00 0.003364 0.003364
print (df.columns)
MultiIndex(levels=[['Last.Price', 'Daily.Return'], ['first', 'mean', 'sum']],
labels=[[0, 1, 1], [0, 1, 2]])
df.columns = df.columns.map('_'.join)
print (df)
Last.Price_first Daily.Return_mean Daily.Return_sum
Dates
2018-11-23 75.18 -0.013844 -0.027689
2018-11-26 77.84 -0.013583 -0.027167
2018-11-27 79.50 0.010044 0.020087
2018-11-28 80.27 -0.009686 -0.009686
2018-11-29 80.00 0.003364 0.003364
最后 rename
列:
d = {'Last.Price_first':'Last.Price',
'Daily.Return_sum': 'Cum.Return',
'Daily.Return_mean': 'Average.Return'}
df = df.rename(columns=d)
print (df)
Last.Price Average.Return Cum.Return
Dates
2018-11-23 75.18 -0.013844 -0.027689
2018-11-26 77.84 -0.013583 -0.027167
2018-11-27 79.50 0.010044 0.020087
2018-11-28 80.27 -0.009686 -0.009686
2018-11-29 80.00 0.003364 0.003364