我在标准普尔中有几家公司的股票收益数据框架。我已经计算了他们的退货。
我希望有一个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"])
这是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
如您所见,该图非常混乱,因此我只想显示最高和最低值。我感谢所有帮助!
答案 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)]