【问题标题】:Is it possible to use python time series business days to generate month end time series?是否可以使用 python 时间序列工作日来生成月末时间序列?
【发布时间】:2020-11-23 23:25:54
【问题描述】:

我正在使用 alphalens 分析基于因素的资产月回报率。我的问题是我的数据框是一个以日期和资产为索引的多索引数据框。

                    factor_score
date         asset
2000-01-30    0001     0.2
2000-01-30    0002     0.1
2000-01-30    0003     -0.2
2000-02-29    0001.    0.1
2000-02-29    0004.    0.4
2000-03-31

当我分析月末价格时,日期的频率是“M”(我使用 MonthEnd 作为偏移量来获取月末日期)。对于 alphalens,时间序列的频率要求是:频率必须是 Day、BDay 或 CustomBusinessDay。我想转换日期的频率以满足要求。

这是我尝试过的:

  1. 使用 BDay(21),这不起作用,因为添加 21 个工作日并不总是返回月末时间序列(例如,我得到 2000-01-31、2000-02-29、2000-03-29 , 2000-04-27)。它既不是月末日期,也不是业务月末日期。
  2. 我看到了一些建议
df.resample('M').last()

但这只会保留每个月末的最后一行,而不是所有数据条目。

任何建议将不胜感激。谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以通过在月末创建时间序列索引,然后从中提取数据帧来做到这一点。 使用pd.date_range(...,freq='BM') 的“BM”设置工作日结束的频率。

    import datetime
    import pandas as pd
    import pandas_datareader.data as web
    
    with open('./alpha_vantage_api_key.txt') as f:
        api_key = f.read()
    
    start = datetime.datetime(2018, 1, 1)
    end = datetime.datetime(2020, 5, 31)
    
    df_aapl = web.DataReader('AAPL', 'av-daily', start, end, api_key=api_key)
    df_aapl.index = pd.to_datetime(df_aapl.index)
    date_rng = pd.date_range(start, end, freq='BM')
    
    df_aapl[df_aapl.index.isin(date_rng)]
        open    high    low close   volume
    2018-01-31  166.8700    168.4417    166.50  167.43  30984099
    2018-02-28  179.2600    180.6150    178.05  178.12  33604574
    2018-04-30  162.1302    167.2600    161.84  165.26  42427424
    2018-05-31  187.2200    188.2300    186.14  186.87  27482793
    2018-06-29  186.2900    187.1900    182.91  185.11  22737666
    2018-07-31  190.3000    192.1400    189.34  190.29  39373038
    2018-08-31  226.5100    228.8700    226.00  227.63  43340134
    2018-09-28  224.7900    225.8400    224.02  225.74  22929364
    2018-10-31  216.8800    220.4500    216.62  218.86  38358933
    2018-11-30  180.2900    180.3300    177.03  178.58  39531549
    2018-12-31  158.5300    159.3600    156.48  157.74  35003466
    ....
    

    【讨论】:

      猜你喜欢
      • 2022-11-21
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-06-23
      • 2014-10-25
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多