Панды создают в конце месяца холдинг от деятельности - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь найти суммы остатков на конец месяца, основываясь на «проблемах» из списка действий df_td.

На самом деле я просто ищу количество «проблем» с положительным сальдо в конце каждого месяца.

Для этого мне нужно создать остаток на конец месяца, основанный на каждом «выпуске», «действии» и «долях» по действиям, меньшим, чем дата окончания месяца. Таким образом, общее количество вопросов с балансом> 0 для каждого периода.

«Действие» используется для определения, является ли это покупка или продажа, «+» или «-». Таким образом, баланс «+ долей» меньше »- долей« на каждую «эмиссию».

Раньше я использовал sql для этого, но это кажется серьезной тратой.

Какой лучший способ сделать это с пандами?

df_td

   action code     comm    credit        date  \
0       +    P     0.00      0.00  2013-03-27   
1       +    P     0.00      0.00  2013-03-27   
2       -    S    19.00  86751.01  2013-04-08   
3       +    Z  2000.00      0.00  2013-04-09   
4       -    S    18.71    730.49  2013-04-10   

                                       issue  \
   FIDELITY REAL ESTATE INVESTMENT PORTFOLIO FUND   
                FIDELITY NJ MUNICIPAL INCOME FUND   
   FIDELITY REAL ESTATE INVESTMENT PORTFOLIO FUND   
              AMERICAN RLTY CAP HEALTHCARE TR INC   
                FIDELITY NJ MUNICIPAL INCOME FUND   

     price    shares 
0  34.4800  2462.958    
1   0.2003    60.963      
2  35.2300  2462.958     
3  10.0000  2000.000     
4  12.2900    60.960    

образец месяца заканчивается df_month

        month
0  2013-03-31
1  2013-04-30
2  2013-05-31
3  2013-06-30
4  2013-07-31

чтобы по месяцам проходить циклы, как мне получить «баланс» каждой проблемы в df_td?

Надеюсь, это имеет смысл?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Я заставил это работать, хотя я уверен, что код может быть не идеальным или сексуальным.

сначала я создал "bal", чтобы показать, была ли это сумма дебета или кредита.

df_td [ 'bal' ] = np.where ( df_td [ 'action' ] == "+", df_td.shares, df_td.shares * -1 )

Затем я перебрал месяцы, используя групповую.

    cnt = [ ]

    for i, item in enumerate ( df.month ):

        // get the trades <= month
        df_mo = df_trd [ (df_trd.date <= item) ]

        // groupby the issue and sum the bal about
        i = df_mo.groupby ( 'issue' ) [ 'bal' ].sum ()

        // get the count where greater than 0
        c = i [ i > 0 ].count ()

        // add to list
        cnt.append ( c )

любые комментарии о том, как одобрить, очень приветствуются!

спасибо.

0 голосов
/ 28 апреля 2018

Проверьте, работает ли следующий код для ваших нужд:

def get_balance(x):
    return x.comm + x.credit + x.price*x.shares*(1 if x.action == '+' else -1)

df['balance'] = df.apply(get_balance, axis=1)
df.query('balance>0').set_index('date').resample('M').agg({'issue': 'nunique', 'balance': np.sum})

* Примечание *

  1. убедитесь, что ваше поле date имеет правильный формат (т.е. datetime64 [нс])

    df ['date'] = pd.to_datetime (df ['date'], формат = "% Y-% m-% d")

  2. вы можете переместить .query('balance>0') в конец цепочки, если общий баланс проблем является проблемой.

Протестировано: Python 3.6.4 + Pandas 0.22.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...