2013-12-07 2 views
0

Я написал функцию ниже, чтобы создать 3 столбца внутри панели (все данные). Цикл for предназначен для обновления их значения на основе расчета.Обновление столбцов в панели данных внутри панели без цикла?

Есть ли способ обновить эти столбцы для всех фреймов данных без использования цикла for?

def addAdjustedColumns(symbols, quotes): 
    new_quotes = quotes.copy() 

    # add 3 columns to all dataframes inside the panel 
    new_quotes = quotes.transpose(2, 0, 1) 
    new_quotes['AdjOpen'] = 0. 
    new_quotes['AdjHigh'] = 0. 
    new_quotes['AdjLow'] = 0. 
    new_quotes = new_quotes.transpose(1, 2, 0)  

    for symbol in symbols: 
     new_quotes[symbol].AdjOpen = new_quotes[symbol].Open * (new_quotes[symbol].AdjClose/new_quotes[symbol].Close) 
     new_quotes[symbol].AdjHigh = new_quotes[symbol].High * (new_quotes[symbol].AdjClose/new_quotes[symbol].Close) 
     new_quotes[symbol].AdjLow = new_quotes[symbol].Low * (new_quotes[symbol].AdjClose/new_quotes[symbol].Close) 

    return new_quotes 

Спасибо,

JM

ответ

1

Вот некоторые панели операций, которые могут оказаться полезными. Я организовываю панель таким образом, чтобы (на вашем языке) символы (от A до D) были minor_axis, а поля (High, Low, Close) - это элементы, а даты - major_axis. Это все под панд 0.12

In [12]: p = tm.makePanel() 

In [13]: p.items = ['High','Low','CLose'] 

In [14]: p 
Out[14]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 3 (items) x 30 (major_axis) x 4 (minor_axis) 
Items axis: High to CLose 
Major_axis axis: 2000-01-03 00:00:00 to 2000-02-11 00:00:00 
Minor_axis axis: A to D 

Полевые операции транслируются все символы по датам легко

In [15]: p['HL'] = p['High']-p['Low'] 

In [16]: p 
Out[16]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 4 (items) x 30 (major_axis) x 4 (minor_axis) 
Items axis: High to HL 
Major_axis axis: 2000-01-03 00:00:00 to 2000-02-11 00:00:00 
Minor_axis axis: A to D 

Чтобы добавить символ, переставлять, добавлять и переставлять назад

In [17]: pa = p.transpose(2,0,1) 

In [18]: pa 
Out[18]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 4 (items) x 4 (major_axis) x 30 (minor_axis) 
Items axis: A to D 
Major_axis axis: High to HL 
Minor_axis axis: 2000-01-03 00:00:00 to 2000-02-11 00:00:00 

In [19]: pa['E'] = pa['A'] + pa['D'] 

In [20]: p = pa.transpose(1,2,0) 

In [21]: p 
Out[21]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 4 (items) x 30 (major_axis) x 5 (minor_axis) 
Items axis: High to HL 
Major_axis axis: 2000-01-03 00:00:00 to 2000-02-11 00:00:00 
Minor_axis axis: A to E 
+0

это все по сути, медленные операции, потому что вы делаете много небольших операций индексирования. вместо этого гораздо эффективнее либо построить панель непосредственно из многоуровневого dict или concat-кадров. если у вас много символов, тогда создание как нового (а не изменения) будет намного быстрее. – Jeff

+0

Когда я тестировал только 2 символа, моя работа была быстрее, но затем я сделал это с несколькими символами, и ваше решение было быстрее. Благодарю. – jmatos

Смежные вопросы