Перебирать элементы в одном столбце, ссылаясь на тег в другом столбце - PullRequest
1 голос
/ 15 апреля 2019

Предположим, я управляю многими брокерскими акциями, каждая из которых имеет разные типы акций. Я пытаюсь написать код для проведения стресс-теста.

То, что я пытаюсь сделать, у меня есть 2 кадра данных:

Информация об учетной записи (датафрейм):

account = {'account':['1', '1', '1', '2', '2'], 'Stock type':['A', 'A', 'B', 'B', 'C'], 'share value' = '100', '150', '200', '175', '85']}

сценарий стресс-теста (датафрейм):

test = {'stock type':['A', 'B', 'C', 'D'], 'stress shock':['0.8', '0.7', '0.75', 0.6']}

Учитывая эти 2 кадра данных, я хочу рассчитать для каждой учетной записи, какова стоимость акций после стрессового шока.

т.е. для счета № 1 после значения шока = 100 * 0,8 + 150 * 0,8 + 200 * 0,7 = 340

Я пробовал некоторые базовые циклы for, но мой ноутбук jupyter скоро сломается (не хватит памяти) после запуска.

shocked = []
for i in range(len(account)):
    for j in range(len(test)):
        if account.loc[i,'Stock type'] == test.loc[j,'stock type']:
            shocked.append(account.loc[i,'share value']*test.loc[j, 'stock type']

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Сначала мы можем сделать merge, чтобы собрать данные двух кадров данных вместе.Затем мы вычисляем after shock value и, наконец, получаем sum каждого account:

merge = account.merge(test, on='Stock type')

merge['after_stress_shock'] = pd.to_numeric(merge['share value']) * pd.to_numeric(merge['stress shock'])

merge.groupby('account')['after_stress_shock'].sum()

account
1    340.00
2    186.25
Name: after_stress_shock, dtype: float64

Примечание Я использовал pandas.to_numeric, так как ваши значениянаходятся в string типе.

0 голосов
/ 15 апреля 2019

Создайте от Series до map «тип запаса» для «стресс-шок».

Затем используйте pandas.groupby.apply с функцией lambda для желаемого результата:

stress_map = test.set_index('stock type')['stress shock']

account.groupby('account').apply(lambda x: (x['Stock type'].map(stress_map) * x['share value']).sum())

[выход] * +1014 *

account
1    340.00
2    186.25
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...