根据彭博 python pandas 中选定的季度数据计算 return API
Calculate return from selected quarterly data in python pandas from Bloomberg API
目前,我正在使用 Bloomberg API
,并处理一些 web crawler
到 Python pandas 数据框。我已经检索了数据,并努力对它们进行一些分析以创建某种模拟。比方说,我有这个数据:
ABC US Equity
2011-01-03 243.00
2011-01-04 243.58
2011-01-05 243.45
2011-01-06 244.28
2011-01-07 244.13
2011-01-10 244.32
2011-01-11 245.83
2011-01-12 246.31
2011-01-13 247.05
2011-01-14 247.39
2011-01-17 249.24
2011-01-18 248.93
2011-01-19 248.68
2011-01-20 248.30
2011-01-21 249.81
...
2011-04-01 437.32
...
2011-07-01 438.40
...
2011-10-03 438.79
...
2012-01-03 438.79
Objective
我想添加新的列来计算 return 基于这个标准:
- 它从季度间隔数据中获取值,在本例中为 2011-04-01、2011-07-01、2011-10-03 和 2011-01-03
- 对它们进行平均并将它们与来自 2011-01-03 的数据相除,并将结果放入 2012-01-03[=46] 的新列中=]行
- 下一行也适用
预期
ABC US Equity Return
2011-01-03 243.00 #The result should be (average(437.32+438.40+438.79+439.81)/243.00)-1
2011-01-04 243.58 and so on, same calculation on the next row
2011-01-05 243.45 ...
2011-01-06 244.28 ...
2011-01-07 244.13 ...
2011-01-10 244.32
2011-01-11 245.83
2011-01-12 246.31
2011-01-13 247.05
2011-01-14 247.39
2011-01-17 249.24
2011-01-18 248.93
2011-01-19 248.68
2011-01-20 248.30
2011-01-21 249.81
...
2011-04-01 437.32
...
2011-07-01 438.40
...
2011-10-03 438.79
...
2012-01-03 439.81
到目前为止,我只尝试计算平均值,但结果本身与我的预期相差甚远
df['Return'] = [
df2.loc[
edt - pd.tseries.offsets.DateOffset(months=4):edt,
'ABC US Equity'].mean()
for edt in df.index
这段代码反而产生了 "rolling" 意思,不是我所期望的。
有人知道如何破解这个问题吗?我花了几天时间才弄明白。我是 Python 的新手,如果这是基本问题,我深表歉意。
您可以使用pd.date_range
设置比较季度。您只需选择开始日期,select 您想要的周期数,然后通过设置 freq='BQS'
,您将获得业务季度开始时间:
quarters = pd.date_range(pd.Timestamp(2011,4,1), periods=4, freq='BQS')
然后您可以将结果列设置为:
(df.loc[df['date_column'].isin(quarters), ['ABC US Equity']]
.apply(lambda x: x.mean()/df['ABC US Equity']-1))
编辑:如果你的日期列是索引,你可以这样做:
df.reindex(quarters).apply(lambda x: x.mean()/df['ABC US Equity']-1)
确保您的索引是日期时间索引。如果不是,你可以这样做:
df.index = pd.to_datetime(df.index)
注意:您的示例包含 2 个日期为 2011-01-03 的值。如果最后一个值有误,您可能希望从 2011-04-01 开始您的季度,这将使您的最后一个季度日期为 2012-01-02。如果它们都有效但您想排除平均值中的第一个,则需要将 .iloc[1:]
添加到上面的第一行。
让我们从第一组开始:
quarters = pd.date_range(pd.Timestamp(2011,4,1), periods=4, freq='BQS')
要使它们向前滚动 1 天,您可以使用列表理解:
rolling_quarters = [quarters + pd.Timedelta(days=i) for i in range(len(df))]
你的比较值是:
comp_values = [df.reindex(q).values.mean() for q in rolling_quarters]
您的结果将是:
comp_values/df['ABC US Equity']-1
目前,我正在使用 Bloomberg API
,并处理一些 web crawler
到 Python pandas 数据框。我已经检索了数据,并努力对它们进行一些分析以创建某种模拟。比方说,我有这个数据:
ABC US Equity
2011-01-03 243.00
2011-01-04 243.58
2011-01-05 243.45
2011-01-06 244.28
2011-01-07 244.13
2011-01-10 244.32
2011-01-11 245.83
2011-01-12 246.31
2011-01-13 247.05
2011-01-14 247.39
2011-01-17 249.24
2011-01-18 248.93
2011-01-19 248.68
2011-01-20 248.30
2011-01-21 249.81
...
2011-04-01 437.32
...
2011-07-01 438.40
...
2011-10-03 438.79
...
2012-01-03 438.79
Objective
我想添加新的列来计算 return 基于这个标准:
- 它从季度间隔数据中获取值,在本例中为 2011-04-01、2011-07-01、2011-10-03 和 2011-01-03
- 对它们进行平均并将它们与来自 2011-01-03 的数据相除,并将结果放入 2012-01-03[=46] 的新列中=]行
- 下一行也适用
预期
ABC US Equity Return
2011-01-03 243.00 #The result should be (average(437.32+438.40+438.79+439.81)/243.00)-1
2011-01-04 243.58 and so on, same calculation on the next row
2011-01-05 243.45 ...
2011-01-06 244.28 ...
2011-01-07 244.13 ...
2011-01-10 244.32
2011-01-11 245.83
2011-01-12 246.31
2011-01-13 247.05
2011-01-14 247.39
2011-01-17 249.24
2011-01-18 248.93
2011-01-19 248.68
2011-01-20 248.30
2011-01-21 249.81
...
2011-04-01 437.32
...
2011-07-01 438.40
...
2011-10-03 438.79
...
2012-01-03 439.81
到目前为止,我只尝试计算平均值,但结果本身与我的预期相差甚远
df['Return'] = [
df2.loc[
edt - pd.tseries.offsets.DateOffset(months=4):edt,
'ABC US Equity'].mean()
for edt in df.index
这段代码反而产生了 "rolling" 意思,不是我所期望的。
有人知道如何破解这个问题吗?我花了几天时间才弄明白。我是 Python 的新手,如果这是基本问题,我深表歉意。
您可以使用pd.date_range
设置比较季度。您只需选择开始日期,select 您想要的周期数,然后通过设置 freq='BQS'
,您将获得业务季度开始时间:
quarters = pd.date_range(pd.Timestamp(2011,4,1), periods=4, freq='BQS')
然后您可以将结果列设置为:
(df.loc[df['date_column'].isin(quarters), ['ABC US Equity']]
.apply(lambda x: x.mean()/df['ABC US Equity']-1))
编辑:如果你的日期列是索引,你可以这样做:
df.reindex(quarters).apply(lambda x: x.mean()/df['ABC US Equity']-1)
确保您的索引是日期时间索引。如果不是,你可以这样做:
df.index = pd.to_datetime(df.index)
注意:您的示例包含 2 个日期为 2011-01-03 的值。如果最后一个值有误,您可能希望从 2011-04-01 开始您的季度,这将使您的最后一个季度日期为 2012-01-02。如果它们都有效但您想排除平均值中的第一个,则需要将 .iloc[1:]
添加到上面的第一行。
让我们从第一组开始:
quarters = pd.date_range(pd.Timestamp(2011,4,1), periods=4, freq='BQS')
要使它们向前滚动 1 天,您可以使用列表理解:
rolling_quarters = [quarters + pd.Timedelta(days=i) for i in range(len(df))]
你的比较值是:
comp_values = [df.reindex(q).values.mean() for q in rolling_quarters]
您的结果将是:
comp_values/df['ABC US Equity']-1