for循环中某些值的条件(Python熊猫)

时间:2019-07-29 09:21:00

标签: python pandas finance quantitative-finance

我在标准普尔中有几家公司的股票收益数据框架。我已经计算了他们的退货。

我希望有一个for循环,它从大型数据框中获取返回值最高(例如,该期间的平均值)的前5名(例如)公司,而返回值最低的5家公司。然后我要绘制它。

我有一个代码,可以给我所有公司的收益并进行绘图。

graph_df = pd.DataFrame()

for name in df['Name'].unique():
    print(name) # keeping track of which tickers are included
    name_df = df.copy()[df['Name']==name] # creating a new df, copying in the name columns
    name_df[f"{name}_factor"] = name_df["Difference"]
    if graph_df.empty:
        graph_df = name_df[[f"{name}_factor"]]
    else:
        graph_df = graph_df.join(name_df[f"{name}_factor"])

Plot

这是print(graph_df)的摘录:

             StockRet1   StockRet2   StockRet3   StockRet4   StockRet5
Dates                                                                  
1990-01-31   0.000000    0.000000    0.000000    0.000000    0.000000  
1990-02-28  -0.098820    0.000000   -0.076981    0.019755   -0.012170  
1990-03-30   0.023653    0.000000   -0.011115    0.044565   -0.042621  
1990-04-30   0.010303    0.000000   -0.074512    0.067319   -0.003569  

如您所见,该图非常混乱,因此我只想显示最高和最低值。我感谢所有帮助!

2 个答案:

答案 0 :(得分:2)

当您拥有整个dataFrame时:

df = df[np.concatenate((df.sum().sort_values().index[:5],df.sum().sort_values().index[-5:]))]

这给出了前5名和后5名。您只需绘制它们即可。

为避免数组之间出现任何重叠,您可以将串联体包装在set()中以获取唯一值。

答案 1 :(得分:0)

我认为您可以使用nlargest(在熊猫版0.17.0中已添加):

print graph_df
print df.nlargest(6, 'stockretaverage')

假设您计算的是第6列。

OR

假设感兴趣的列标记为“数据”,则一种解决方案是

df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]