【问题标题】:Finding column values for the first and last row in the previous year查找上一年第一行和最后一行的列值
【发布时间】:2021-04-01 00:41:25
【问题描述】:

我在 Google Colab 文档中有 Google 股票的价格历史记录,如下所示:

df = pd.DataReader('GOOG', data_source='yahoo', start='08-01-2004')

这些是价格历史中每个交易日的开盘价、最高价、最低价、收盘价和调整后的收盘价。我可以在 DataFrame 中为过去 12 个月的股票收益率创建一个新列,如下所示:

df['Trailing 12 month return'] = (df['Adj Close'] - 
  df['Adj Close'].shift(DAYS_TRADING_PER_YEAR)) / 
  df['Adj Close'].shift(DAYS_TRADING_PER_YEAR)

但是,如果我真正想要的是一个年回报率值,看看上一个日历年的回报率呢?那么,对于 2015 年,只要找到 2014 年的第一个交易日(更准确地说,是我们有数据的第一天)和 2014 年的最后一个交易日,然后得到该期间的百分比变化?

【问题讨论】:

    标签: pandas dataframe


    【解决方案1】:

    假设Date 是正确的datetime 列:

    1. groupby(df.Date.dt.year) 按年份分组
    2. apply()first_valid_index()last_valid_index() 计算得出的年费率
    3. shift()上一年得到的结果
    rates = df.groupby(df.Date.dt.year)['Adj Close'].apply(
        lambda g: (g.loc[g.last_valid_index()] - g.loc[g.first_valid_index()]) / g.loc[g.first_valid_index()]
    ).shift()
    
    # Date
    # 2014         NaN
    # 2015    0.128019
    # 2016    2.232232
    # 2017    1.041269
    # 2018    0.292042
    # 2019    0.154558
    # 2020   -0.136102
    # 2021    0.396961
    # Name: Adj Close, dtype: float64
    
    1. 然后map() 这些ratesdf.Date.dt.year 创建新列:
    df['Previous year rate of return'] = df.Date.dt.year.map(rates)
    
    #            Date   Adj Close  Previous year rate of return
    # 0    2014-08-01  166.724074                           NaN
    # 1    2014-08-02   69.634211                           NaN
    # ...         ...         ...                           ...
    # 999  2017-04-26  165.225121                      1.041269
    # 1000 2017-04-27   40.165297                      1.041269
    # ...         ...         ...                           ...
    # 2433 2021-03-30   67.864861                      0.396961
    # 2434 2021-03-31   31.408317                      0.396961
    

    【讨论】:

    • 这很好,但我实际上并不想更改现有 Adj Close 列中的内容。我想在一个新的专栏中这样做。如果给定年份的每一行都重复相同的值,那很好。
    • @Eliot Gotcha,答案已更新。基本上分别保存那些rates,然后用df.Date.dt.year 保存map()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多