Цикл по DataFrame для сохранения повторяющейся задачи вручную - PullRequest
0 голосов
/ 21 марта 2019

Я выполнил следующие задачи вручную, и я уверен, что есть способ написать цикл, но я не уверен, как это сделать в Python.

Данные выглядят так:

df

                   a   b   c   market   ret
date        id                           
2015-01-01  1     10   4   2     10     0.02
2015-01-01  2     20   3   5     15     0.03
2015-01-01  3     30   2   3     20     0.05 
2015-01-01  4     40   1   10    25     0.01
2015-01-02  1     15   8   4     15    -0.03
2015-01-02  2     10   6   1     10     0.02
2015-01-02  3     25  10   2     22     0.06
2015-01-02  4     30   3   7     26     0.06
2015-01-03  1     25   2   2     16    -0.07
2015-01-03  2     10   6   1     18     0.01
2015-01-03  3     5    8   5     26     0.04
2015-01-03  4     30   1   6     21    -0.05

Я делаю следующее:

dfa = df

dfa['market'] = dfa.groupby(level = ['id']).market.shift()

dfa['port'] = dfa.groupby(['date'])['a'].transform(lambda x: pd.qcut(x, 4, labels = False))

# value-weighted portoflio returns
dfa = dfa.set_index(['port'], append = True)
dfa['tmktcap'] = dfa.groupby(['date','port'])['mktcap'].transform(sum)
dfa['w_ret'] = (dfa.mktcap / dfa.tmktcap) * dfa.ret

#reshape long to wide
dfa = dfa.groupby(['date', 'port'])['w_ret'].sum().shift(-4)
dfa = dfa['2006-01-01':].rename('a')
dfa = dfa.unstack()
dfa[4.0] = dfa[3.0] - dfroe[0.0] 
dfa = dfa.stack().reset_index().set_index(['date'])
dfa['port'] = dfa['port'].map({0.0:'a0',1.0:'a1',2.0:'a2',3.0:'a3',4.0:'aL-S'})
dfa = dfa.reset_index().set_index(['date', 'port']).unstack()

Но затем я повторяю эту задачу для b ис.

Итак, я начинаю с установки dfb = df, просто меняю a на b и следую этому процессу при выполнении для c.

Я должен был сделать это для переменных, идущих от a до h в целом (только некоторые примеры данных, использованных здесь), поэтому любая помощь в написании цикла была бы удивительной !!!!!

1 Ответ

1 голос
/ 21 марта 2019

Зацикливание на выборе столбцов. Затем сохраните результаты в массиве, списке или словаре. Вот пример со списком.

results = [] # this list will store your results
columns_to_process = ['a', 'b','c','d','f']

for col in columns_to_process:
    data = df.copy()
    data['market'] = data.groupby(level = ['id']).market.shift()
    data['port'] = data.groupby(['date'])[col].transform(lambda x: pd.qcut(x, 4, labels = False))

    # do whatever you want with data

    results.append(data) # this store the result in position 0 then 1 then 2 etc

#then use your result:

result[0] # for the dfa
result[1] # for dfb etc

Или вы можете сохранить все результаты в одном кадре данных. Для этого вы просто выбираете нужные столбцы и сохраняете их в DataFrame.

df['result_a'] = data.columns_i_want_to_save

Вы спросили:

#Do I just change a to col where I change name of the column?
dfa['port'].map({0.0:'a0',1.0:'a1',2.0:'a2',3.0:'a3',4.0:'aL-S'})

Вы можете сделать некоторое «добавление строки». Что-то вроде:

    dfa['port'].map({0.0:col+'0',
                     1.0:col+'1',
                     2.0:col+'2',
                     3.0:col+'3',
                     4.0:col+'L-S'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...