首页 > 解决方案 > 计算来自彭博 API 的 python pandas 中选定季度数据的回报

问题描述

目前,我正在使用,并对Python 熊猫数据框Bloomberg API做一些事情。web crawler我已经检索了数据,并正在与他们进行一些分析以创建某种模拟。比方说,我有这些数据:

                  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

客观的

我想添加基于此标准计算回报的新列:

  1. 它从季度间隔数据中获取值,在本例中为2011-04-012011-07-012011-10-032011-01-03
  2. 将它们平均并与2011-01-03的数据相除,并将结果放入2012-01-03的新列中行的新列中
  3. 它也适用于下一行

期待

                 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

这段代码反而产生了“滚动”的意思,而不是我所期望的。

有人知道如何解决这个问题吗?,我花了几天时间来解决这个问题。我是 Python 新手,如果是基本问题,我深表歉意。

标签: pythonpandasbloomberg

解决方案


您可以使用pd.date_range来设置比较季度。您只需选择开始日期,选择所需的期间数,然后通过设置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:]到上面的第一行。


推荐阅读