簡體   English   中英

在每個 dataframe 行中查找前 3 個值

[英]Find top 3 values in each dataframe row

我試圖從monthly_return dataframe 中找到每個月回報率最高的前三只股票。

在此處輸入圖像描述

結果應如下所示:

在此處輸入圖像描述

數據:

!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_pricelow_pricehigh_priceclose_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 個 DataFrame 重新整形並組合成 1 個 DataFrame(命名為price ),格式如下。

在此處輸入圖像描述

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接下來,使用調整后的收盤價( Adj Close列中的值)計算這 7 家公司自 2015 年 5 月以來的月度股票回報。 調整后的收盤價是考慮了股息支付、拆分和其他直接影響整體回報的因素的衡量標准。

為了計算每月股票收益,我們需要將月底調整后的收盤價與月初調整后的收盤價進行比較。 回報的公式以一個月內最后一天的價格除以第一天的價格開始。 然后從該結果中減去數字 1。 您可以將結果保留為十進制格式。 將生成的DataFrame命名為monthly_return 它應該如下所示:

在此處輸入圖像描述

我的答案(我還沒有真正完成這個,因為我不知道如何 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()

當前 Dataframe 表: 在此處輸入圖像描述

任務 4 [主要問題]根據monthly_return,找出每個月回報率最高的前 3 只股票。 結果應如下所示:

在此處輸入圖像描述

對於任務 3、任務 4 或我的任何不正確代碼的任何幫助和建議將不勝感激。

你必須先取出 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

處理此類數據的一種更簡單的方法是長 pivot,排序並取前 N 個,因此我們將其包裝到 function 中,以防止數據幀過度填充環境..(我不知道你有多少..):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM