【问题标题】:How to store results of a for loop to a dataframe given a specific column/row?如何将 for 循环的结果存储到给定特定列/行的数据框?
【发布时间】:2020-06-21 16:49:00
【问题描述】:

我有一个具有不同信号和返回的数据框。我想做以下事情:

  1. 子集特定信号
  2. 计算年化收益率
  3. 将结果存储到数据框

我的数据框如下所示: enter image description here

我的代码如下所示:

years = range(1990,2019,1)
returns = pd.DataFrame(columns=signals)

for i in signals:
    signal_i = portbase[portbase['signalname'] == i] #Select single signal from dataframe
    
    for j in years:
        signal_i_j = signal_i[signal_i['year'] == j] #Subset single year from signal
        
        return_j = (((signal_i_j['return']/100)+1).prod() -1) * 100 #Calculate annualized return for signal i in year j
        
        returns.loc[j,i] #Add result to dataframe in column i and year j

除了最后一部分,我想保存我的结果,一切都正常。 我希望我的数据框看起来像这样: enter image description here

信号作为列,年份作为行

编辑: 使用以下代码有效:

df = portbase.groupby(['signalname','year'])['return'].apply(lambda x: (np.prod(1+x/100)-1) * 100).reset_index().T

但我的输出仍然不正确: enter image description here

我尝试将我的输出转换为数据帧,重置索引,现在以某种方式将我的信号列转换为行/标题。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    试试这个代码:

    df = portbase.groupby(['signalname','year'])['return'].apply(lambda x: (np.prod(1+x/100)-1) * 100).unstack().T
    

    【讨论】:

    • 您的解决方案运行良好!唯一的问题是,我的信号现在按行而不是按列安全。所以第一列是我的信号,第二列是年份(1990-2019),第三列是年度回报。你知道如何转置第一列,以便我将信号作为标题吗?
    • 我在上面编辑了我的问题。不幸的是,.T 没有转置我的信号列。
    • 不幸的是,它仍然无法正常工作。我已经更新了上述问题中的图片。
    【解决方案2】:

    可以为此使用 pivot_table。

    signal_cols = ['signalname1', 'signalname2']##..
    agg_func = lambda x: np.prod(1+x/100)-1)
    result = my_df.pivot_table(index='year', columns=signal_cols, values='return', aggfunc=agg_func)
    

    【讨论】:

      【解决方案3】:

      第一件事是您似乎没有使用您的计算来保存它们。 j 和 i 是信号和年份。

      在我看来,.loc() 函数用于按名称访问/读取行和列。 因此,您实际上是在尝试访问年份数据和回报信号。

      您可能需要将结果放入列表中,然后从中制作数据框。

      希望我的回答对你有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多