【问题标题】:Generating one NumPy array for each DataFrame row为每个 DataFrame 行生成一个 NumPy 数组
【发布时间】:2021-12-01 18:52:46
【问题描述】:

我正在尝试使用 mplfinance.plot() 绘制股票市场交易与特定股票的图。我使用用作 CSV 文件的 jstock 记录我的所有交易:

"Code","Symbol","Date","Units","Purchase Price","Current Price","Purchase Value","Current Value","Gain/Loss Price","Gain/Loss Value","Gain/Loss %","Broker","Clearing Fee","Stamp Duty","Net Purchase Value","Net Gain/Loss Value","Net Gain/Loss %","Comment"
"ASO","Academy Sports and Outdoors, Inc.","Sep 13, 2021","25.0","45.85","46.62","1146.25","1165.5","0.769999999999996","19.25","1.6793893129770994","0.0","0.0","0.0","1146.25","19.25","1.6793893129770994",""
"ASO","Academy Sports and Outdoors, Inc.","Aug 26, 2021","15.0","41.3","46.62","619.5","699.3","5.32","79.79999999999995","12.881355932203384","0.0","0.0","0.0","619.5","79.79999999999995","12.881355932203384",""
"ASO","Academy Sports and Outdoors, Inc.","Jun 3, 2021","10.0","37.48","46.62","374.79999999999995","466.2","9.14","91.40000000000003","24.386339381003214","0.0","0.0","0.0","374.79999999999995","91.40000000000003","24.386339381003214",""
"RMBS","Rambus Inc.","Nov 24, 2021","2.0","26.99","26.99","53.98","53.98","0.0","0.0","0.0","0.0","0.0","0.0","53.98","0.0","0.0",""

我可以很容易地使用这些数据

myportfolio = pd.read_csv(PORTFOLIO_LOCATION, parse_dates=[2])

但我需要为每笔交易创建与每日股价相匹配的单独列表:

Date,High,Low,Open,Close,Volume,Adj Close
2020-12-01,17.020000457763672,16.5,16.799999237060547,16.8799991607666,990900,16.8799991607666
2020-12-02,17.31999969482422,16.290000915527344,16.65999984741211,16.40999984741211,1200500,16.40999984741211

我有一个包含这个的普通 DataFrame。到目前为止,这就是我所拥有的:

for i in myportfolio.groupby("Code"):
    (code, j) = i
    if code == "ASO": # just testing it against one stock
        simp = pd.DataFrame(columns=["Date", "Units", "Price"],
            data=j[["Date", "Units", "Purchase Price"]].values, index=j[["Date"]])
        df = pd.read_csv("ASO-2020-12-01-2021-12-01.csv", index_col=0, parse_dates=True)
        # df.lookup(simp["Date"])
        df.insert(0, 'row_num', range(0,len(df)))
        k = df.loc[simp["Date"]]['row_num']
        trades = []
        for index, m in k.iteritems():
            t = np.zeros((df.shape[0], 1))
            t.fill(np.nan)
            t[m] = simp[index]["Price"]
            trades.append(t.to_list())

但我收到了KeyError: Timestamp('2021-09-17 00:00:00')

关于如何解决这个问题的任何想法?

附录 1:

import pandas as pd
trade_data = [['ASO', '5/5/21', 10], ['ASO', '5/6/21', 12], ['RBLX', '5/7/21', 15]]
trade_df = pd.DataFrame(trade_data, columns = ['Code', 'Date', 'Price'])
trade_df['Date'] = pd.to_datetime(trade_df['Date'])
trade_df

    Code    Date    Price
0   ASO 2021-05-05  10
1   ASO 2021-05-07  12
2   RBLX    2021-05-07  15

aso_data = [['5/5/21', 12, 5, 10, 7], ['5/6/21', 15, 7, 13, 8], ['5/7/21', 17, 10, 15, 11]]
aso_df = pd.DataFrame(aso_data, columns = ['Date', 'High', 'Low', 'Open', 'Close'])
aso_df['Date'] = pd.to_datetime(aso_df['Date'])
aso_df

    Date    High    Low Open    Close
0   2021-05-05  12  5   10  7
1   2021-05-06  15  7   13  8
2   2021-05-07  17  10  15  11

所以我想为 ASO 创建两个 NumPy 数组(每个交易一个)和一个用于 RBLX 交易。对于 ASO,我应该有两个 NumPy 数组,看起来像 [10, Nan, Nan][NaN, NaN, 12]

【问题讨论】:

    标签: pandas mplfinance


    【解决方案1】:

    你想要一个列表列表吗? 无需循环。

    df_list = df.values.tolist()
    

    【讨论】:

    • 我正在尝试构建一个 np.array 的列表,每个 np.appy 在一行中只包含一个值,其内容与 df(股票数据)一一对应。也就是说,每个列表包含一笔交易,其行与 df 中的日期匹配并包含交易价格。然后将其绘制到股票图表上。
    【解决方案2】:

    以防万一像我这样的新手遇到类似问题。

    for i in myportfolio.groupby(["Code"]):
        (code, j) = i
        if code == "ASO": # just testing it against one stock
            df = pd.read_csv("ASO-2020-12-01-2021-12-01.csv", index_col=0, parse_dates=True)
            df.insert(0, 'row_num', range(0,len(df)))
            k = df.loc[j["Date"]]['row_num']
            trades = []
            for index, m in j.iterrows(): 
                t = np.zeros((df.shape[0], 1))
                t.fill(np.nan)
                t[int(df.loc[m["Date"]]['row_num'])] = m["Purchase Price"]
                asplot = mpf.make_addplot(t, type="scatter", color='red', marker="D")
                trades.append(asplot)
            mpf.plot(df, type='candle', addplot=trades)
    

    生成了一个显示我的入口点的好的图表。祝你好运

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 2021-11-29
      • 1970-01-01
      • 2021-11-04
      • 2022-11-10
      • 1970-01-01
      • 2016-10-10
      • 2018-12-20
      • 1970-01-01
      相关资源
      最近更新 更多