2017-01-05 7 views
0

Я пытаюсь взять сумму каждой строки в моей панде Dataframe:Суммирования Ряды в панде Dataframe возвращающейся NAN

new_df['cash_change'] = new_df.sum(axis=0)

Однако мои результаты снова возвращаются NaN

Я думаю, что это, возможно, что-то делать с тем, когда я конвертировать мои позиции в Decimal для умножения:

pos_to_dec = np.array([Decimal(d) for d in security.signals['positions'].values])

Что я должен сделать, чтобы умножить мои столбцы вместе. Я бросил его обратно, однако:

cash_change[security.symbol] = cash_change[security.symbol].astype(float)

Вот полный метод. Его цель состоит в том, чтобы выполнить некоторые колонки умножения для каждого безопасности затем сумму общее количество в конце:

def get_cash_change(self): 
    """ 
    Calculate daily cash to be transacted every day. Cash change depends on 
    the position (either buy or sell) multiplied by the adjusted closing price 
    of the equity multiplied by the trade amount. 
    :return: 
    """ 
    cash_change = pd.DataFrame(index=self.positions.index) 
    try: 

     for security in self.market_on_close_securities: 
      # First convert all the positions from floating-point to decimals 
      pos_to_dec = np.array([Decimal(d) for d in security.signals['positions'].values]) 

      cash_change['positions'] = pos_to_dec 
      cash_change['bars'] = security.bars['adj_close_price'].values 

      # Perform calculation for cash change 
      cash_change[security.symbol] = cash_change['positions'] * cash_change['bars'] * self.trade_amount 

      cash_change[security.symbol] = cash_change[security.symbol].astype(float) 

      # Clean up for next security 
      cash_change.drop('positions', axis=1, inplace=True) 
      cash_change.drop('bars', axis=1, inplace=True) 

    except InvalidOperation as e : 
     print("Invalid input : " + str(e)) 

    # Sum each equities change in cash 
    new_df = cash_change.dropna() 

    new_df['cash_change'] = new_df.sum(axis=0) 

    return cash_change 

Мой new_df Dataframe заканчивает тем, что-то вроде этого:

   MTD  ESS  SIG  SNA cash_change 
price_date             
2000-01-04  0.0  0.00  0.00  0.00   NaN 
2000-01-05  0.0  0.00  0.00  0.00   NaN 
2000-01-06  0.0  0.00  0.00  0.00   NaN 
2000-01-07  0.0  0.00  0.00  0.00   NaN 
2000-01-10  0.0  0.00  0.00  0.00   NaN 
2000-01-11  0.0  0.00  0.00  0.00   NaN 
2000-01-12  0.0  0.00  0.00  0.00   NaN 
2000-01-13  0.0  0.00  0.00  0.00   NaN 
2000-01-14  0.0  0.00  0.00  0.00   NaN 
2000-01-18  0.0  0.00  0.00  0.00   NaN 
2000-01-19  0.0  0.00  0.00  0.00   NaN 
2000-01-20  0.0  0.00  0.00  0.00   NaN 
2000-01-21  0.0  0.00  0.00  0.00   NaN 
2000-01-24  0.0 1747.83 1446.71  0.00   NaN 
2000-01-25 3419.0  0.00  0.00  0.00   NaN 
2000-01-26  0.0  0.00  0.00 1660.38   NaN 
2000-01-27  0.0  0.00 -1293.27  0.00   NaN 
2000-01-28  0.0  0.00  0.00  0.00   NaN 

Любые предложения по что я делаю неправильно? Или, возможно, другой способ суммирования столбцов для каждой строки?

+0

Я бы предложил добавить минимальный воспроизводимый пример - http://stackoverflow.com/help/mcve. Люди здесь, как правило, готовы помочь, но я сомневаюсь, что многие пользователи SO будут играть в эту игру угадывания с вашим текущим вопросом. –

ответ

3

Когда вы подаете axis=0 в методе DF.sum, он выполняет суммирование по индексам (в вертикальном направлении, если их легче понять). В результате вы получаете всего 4 значения, рассчитанные в соответствии с 4 столбцами блока данных. Затем вы присваиваете этому результату новый столбец данных. Поскольку они не используют одну и ту же ось индекса для переиндексации, вы получаете серию из NaN элементов.

Вы действительно хотите сделать суммирование по столбцам (в горизонтальном направлении).

Изменение этой строки:

new_df['cash_change'] = new_df.sum(axis=1) # sum row-wise across each column 

Теперь вы получили бы конечное вычисленных суммированных значений.

+1

Спасибо за помощь! – user3547551

1
new_df['cash_change'] = new_df.sum(axis=1) 
+0

Это было то, что первоначально пытался выполнить ОП, из-за чего появлялись «NaNs». –

+0

@nickil maveli OP try axis = 0 – Mahesh

+0

И могу ли я знать, как это отличается от ответа, который я написал? Если у вас есть что-то интересное, чтобы добавить к этому, отредактируйте свой пост. –