将数据帧单元乘以矩阵值的问题

问题描述 投票:0回答:2

Noob(正在尝试学习data_science),他在数据框中具有简单的投资组合。我想出售每家公司的一定数量的股票,将所出售的股票数量乘以价格,然后将其添加到现有现金价值(15000)中,四舍五入到小数点后两位。简要

new_port_df =
               Name   Price   Starting Number_of_shares
           0   MMM    10.00   50
           1   AXP    20.00   100
           2   AAPL   30.00   1000 
           3   Cash    1.00   15000

 shares_sold = [[ 5.] [ 15.] [75.] [   0.]] #(numpy.ndarray, shape (4,1))

 new_port_df['Price'] = 

           0    10.00
           1    20.00
           2    30.00
           3     1.00
           Name: Low, dtype: float64 # pandas.core.series.Series

所以基本上是现金+ = 5 * 10 + 15 * 20 + 75 * 30 + 0 * 1或15000 + 2600 = 17600

作为中间步骤(在谷歌搜索并阅读此处的其他文章之后,我已经尝试过:

cash_proceeds = np.dot(shares_sold, new_port['Price'])

ValueError: shapes (4,1) and (4,) not aligned: 1 (dim 1) != 4 (dim 0). I think I should be reshaping, but haven't had any luck.  

所需的结果如下(除了17600单元之外,所有其他功能都可以工作)

updated_port_df =
               Name   Price   Starting Number_of_shares
           0   MMM    10.00   45
           1   AXP    20.00   85
           2   AAPL   30.00   925 
           3   Cash    1.00   17600 # only the 17600 not working

简而言之,我能理解的答案比我无法理解的复杂答案更可取。感谢您的帮助。

python pandas numpy dataframe reshape
2个回答
0
投票

您可以使用熊猫dot,而不是np.dot。您需要1-d numpy数组才能在序列上使用点,因此需要将shares_sold转换为1-d

shares_sold = np.array([[ 5.], [ 15.], [75.] ,[   0.]])
shares_sold_1d = shares_sold.flatten()

cash_proceeds = new_port_df['Price'].dot(shares_sold_1d)

In [226]: print(cash_proceeds)
2600.0

要获得所需的输出,只需使用.loc分配和减法即可

(new_port_df.loc[new_port_df.Name.eq('Cash'), 'Starting_Number_of_shares'] = 
              new_port_df.loc[new_port_df.Name.eq('Cash'), 'Starting_Number_of_shares'] 
              + cash_proceeds)

new_port_df['Starting_Number_of_shares'] = new_port_df['Starting_Number_of_shares'] - shares_sold_1d

Out[235]:
   Name  Price  Starting_Number_of_shares
0   MMM   10.0                       45.0
1   AXP   20.0                       85.0
2  AAPL   30.0                      925.0
3  Cash    1.0                    17600.0

注意:如果您确实要使用np.dot,则需要按以下步骤交换顺序]

In [237]: np.dot(new_port_df['Price'], shares_sold)
Out[237]: array([2600.])

0
投票

而不是启动shares_sold作为列表列表,即[[],[],[]],您只需创建一个数字列表即可解决np.dot()错误。

shares_sold = [5,15,75,0]
cash_proceeds = np.dot(new_port_df['Price'], shares_sold)

或如Andy指出的,如果shares_sold已作为列表列表启动,则可以将其转换为数组,然后将其展平并从那里继续。我的回答不会解决随之而来的方法变化。

然后您可以更改shares_sold列表/数组中的最后一项,以反映股票出售中的现金变化(通知另存为负,因为将从您的Number of Shares列中减去这些项):

shares_sold[3] = -cash_proceeds

现在您可以从“股份数量”列中减去已售出的股票以反映更改(您表示您希望updated_port_df容纳此信息,因此我首先复制初始投资组合,然后进行更改),

updated_port_df = new_port_df.copy()
updated_port_df['Number_of_shares'] = updated_port_df['Number_of_shares'] - shares_sold
© www.soinside.com 2019 - 2024. All rights reserved.