找出每个数据框行的前3个值。

问题描述 投票:1回答:1

我想找出每个月收益率最高的前3只股票,从。monthly_return 数据框架。

enter image description here

结果应该是这样的。

enter image description here

数据

!curl -L -s -o open_price.csv https://drive.google.com/uc?id=1eClVnVMMgw5bIFJ8sMS8h4d5Msj5gyKo
!curl -L -s -o low_price.csv https://drive.google.com/uc?id=1yRafpOnVQbCGUKq5YnIfXTZisCJQ386x
!curl -L -s -o high_price.csv https://drive.google.com/uc?id=1Kpwh_EgwjpSsFXojLrPvznmyl7z9_afk
!curl -L -s -o close_price.csv https://drive.google.com/uc?id=1IF96oVlbz1wOOKrcYbT7J1P6UCxVa5XI
!curl -L -s -o adj_close_price.csv https://drive.google.com/uc?id=1CjlEcxZkzYrNbqNQHPwLlAEvciEmtTF2
!ls

1. 任务1 导入5个.csv文件,并将生成的DataFrames命名为。open_price, low_price, high_price, close_priceadj_close_price,相应的。

我的答案是

open_price = pd.read_csv("open_price.csv")
low_price = pd.read_csv("low_price.csv")
high_price = pd.read_csv("high_price.csv")
close_price = pd.read_csv("close_price.csv")
adj_close_price = pd.read_csv("adj_close_price.csv")

2. 任务2将5个DataFrames重塑并合并为1个DataFrame(将其命名为 price),其格式如下。

enter image description here

open_price_melted = pd.melt(open_price,id_vars="Date",var_name="Symbol",value_name="Open")
high_price_melted = pd.melt(high_price,id_vars="Date",var_name="Symbol",value_name="High")
low_price_melted = pd.melt(open_price,id_vars="Date",var_name="Symbol",value_name="Low")
close_price_melted = pd.melt(close_price,id_vars="Date",var_name="Symbol",value_name="Close")
adj_close_price_melted = pd.melt(adj_close_price,id_vars="Date",var_name="Symbol",value_name="Adj Close")
melted_df = [open_price_melted,high_price_melted.loc[:,[False,False,True]],low_price_melted.loc[:,[False,False,True]],close_price_melted.loc[:,[False,False,True]],adj_close_price_melted.loc[:,[False,False,True]]]
price = pd.concat(melted_df,join="inner",axis=1)

任务3接下来,用调整后的收盘价计算这7家公司自2015年5月以来的月度股票收益率(栏中的数值为 Adj Close). 调整后的收盘价是考虑了派息、拆股等直接影响整体收益的因素的一种衡量方法。

要计算每月的股票回报率,我们需要将月末的调整收盘价与月初的调整收盘价进行比较。回报率的计算公式是先用一个月内最后一天的价格除以第一天的价格。然后从这个结果中减去数字1。您可以将结果保留为小数格式。将结果命名为 DataFrame monthly_return. 应该是下面的样子。

enter image description here

我的答案(我还没有真正完成这个,因为我不知道如何1)删除月份的文字和2)删除符号的文字。

stock = close_price
stock["Month"] = close_price["Date"].apply(lambda x: x[0:7])

stock_1 = pd.melt(stock, id_vars=["Date","Month"], var_name="Symbol", value_name="Adj Close")

stock_1_grp = stock_1.groupby(["Month","Symbol"])

stock_2 = stock_1_grp.agg([("", lambda x: x.iloc[len(x)-1]/x.iloc[0]-1)])
stock_2_pivot = pd.pivot_table(stock_2,values="Adj Close", index="Month", columns="Symbol")
stock_2_pivot.sort_index(axis=1)
stock_2_pivot.reset_index()

monthly_return = stock_2_pivot.iloc[1:36,0:]
monthly_return.reset_index()

当前数据框架表。enter image description here

任务4 [主要问题] 根据monthly_return,找出每个月回报率最高的前3只股票。结果应该是下面的样子。

enter image description here

如果有任何关于任务3和任务4的帮助和建议 或者我的代码不正确的地方,我将非常感激。

python pandas dataframe pandas-groupby
1个回答
1
投票

你得先把multiIndex去掉,我想应该是这样的。

monthly_return.columns = [j for i,j in monthly_return.columns]
monthly_return.reset_index(inplace=True)

    Month   AMZN    APPL    FB  GOOG    NFLX    SBUX    TSLA
0   2015-05 0.015040    0.010314    0.002532    -0.010764   0.120335    0.033207    0.109587
1   2015-06 0.007356    -0.039145   0.068253    -0.025244   0.054445    0.026810    0.075406

处理这类数据的一个简单方法是长距离旋转,排序,取最上面的N个,所以我们把它包进一个函数里,以防止环境中的数据框过多... ... 我不知道你有多少个...)。

def topN(data,n):
    df = data.melt(id_vars='Month')
    df = df.sort_values(by='value', ascending=False)
    df = df.groupby('Month').head(n)
    return df.sort_values(['Month','value'],ascending=[True,False])

那我们就做吧

topN(monthly_return,3)

    Month   variable    value
140 2015-05 NFLX    0.120335
210 2015-05 TSLA    0.109587
175 2015-05 SBUX    0.033207
211 2015-06 TSLA    0.075406
71  2015-06 FB  0.068253
141 2015-06 NFLX    0.054445
2   2015-07 AMZN    0.225794
142 2015-07 NFLX    0.220795
107 2015-07 GOOG    0.198854
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.