2016-11-18 1 views
3

У меня есть dataframe с квартальным ВВП США как значения столбца. Я хотел бы посмотреть на значения, 3 за раз, и найти индекс, где ВВП упал в течение следующих двух кварталов подряд. Это означает, что мне нужно сравнивать отдельные элементы внутри df ['GDP'] друг с другом, в группах по 3.Как получить доступ к отдельным элементам в катящемся окне на фрейме данных

Вот пример dataframe.

df = pd.DataFrame(data=np.random.randint(0,10,10), columns=['GDP']) 
df 

    GDP 
0 4 
1 4 
2 4 
3 1 
4 4 
5 4 
6 8 
7 2 
8 3 
9 9 

Я использую df.rolling().apply(find_recession), но я не знаю, как я могу получить доступ к отдельным элементам подвижного окна в моей find_recession() функции.

gdp['Recession_rolling'] = gdp['GDP'].rolling(window=3).apply(find_recession_start) 

Как я могу получить доступ к отдельным элементам внутри подвижного окна, так что я могу сделать сравнение таких как gdp_val_2 < < gdp_val_1 gdp_val? .

.rolling() применяется() будет проходить через весь dataframe, 3 значения в то время, так что давайте посмотрим на одном конкретном окне, которое начинается с индекса местоположения 6:

GDP 
6 8 # <- gdp_val 
7 2 # <- gdp_val_1 
8 3 # <- gdp_val_2 

Как я могу получить доступ к gdp_val, gdp_val_1 и gdp_val_2 в текущем окне?

+0

Ваш вопрос непонятен. Небольшая выборка ваших данных и ожидаемый результат помогут. Пожалуйста, прочитайте [MCVE] (http://stackoverflow.com/help/mcve). – Kartik

+1

[Документы] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.core.window.Rolling.apply.html#pandas.core.window.Rolling.apply) говорят, что функция '' 'Необходимо создать одно значение из ввода ndarray ...' ''. Таким образом, вы просто индексируете * в * это. Я предполагаю, что это первый позиционный аргумент. Напишите фиктивную функцию, которая печатает переданное. – wwii

+0

Попробуйте '' 'numpy.all (a [1:] wwii

ответ

0

Короткий ответ: вы не можете, но вы можете использовать свои знания о структуре фреймворка/серии.

Вы знаете размер окна, вы знаете, текущий индекс - таким образом, вы можете выводить сдвиг относительно текущего индекса:

Давайте делать вид, вот ваш ввп:

In [627]: gdp 
Out[627]: 
0 8 
1 0 
2 0 
3 4 
4 0 
5 3 
6 6 
7 2 
8 5 
9 5 
dtype: int64 

наивный подход просто вернуть (argmin() - 2) и добавить его к текущему индексу:

In [630]: gdp.rolling(window=3).apply(lambda win: win.argmin() - 2) + gdp.index 
Out[630]: 
0 NaN 
1 NaN 
2 1.0 
3 1.0 
4 2.0 
5 4.0 
6 4.0 
7 7.0 
8 7.0 
9 7.0 
dtype: float64 

наивный подход не будет возвращать правильный результат, так как вы с не предсказывайте, какой индекс он вернет, когда будут равные значения, и когда произойдет подъем в середине. Но вы понимаете идею.

+0

Спасибо за ввод. Это не совсем то, что я ищу. Мне нужно знать, как обращаться к отдельным элементам массива win в пользовательской определенной функции. поэтому, если у меня есть gdp.rolling (window = 3).apply (lambda win: find_recession_start (win)), как я могу получить доступ к элементам выигрыша в find_recession_start()? – Codedorf

+0

@Codedorf: выиграть [0], выиграть [1], выиграть [2]? – newtover

+0

Да! Это то, что я искал. Спасибо! – Codedorf

0

Использование выражения лямбда внутри .apply() передаст массив в пользовательскую функцию (find_recession_start), и поэтому я могу просто получить доступ к элементам, как если бы я использовал список/массив, например. arr[0], arr[1], arr[2]

df = pd.DataFrame(data=np.random.randint(0,10,10), columns=['GDP']) 

def my_func(arr): 
    if((arr[2] < arr[1]) & (arr[1] < arr[0])): 
     return 1 
    else: 
     return 0 

df['Result'] = df.rolling(window=3).apply(lambda x: my_func(x)) 
df 

    GDP Result 
0 8 NaN 
1 0 NaN 
2 8 0.0 
3 1 0.0 
4 9 0.0 
5 7 0.0 
6 9 0.0 
7 8 0.0 
8 3 1.0 
9 9 0.0 
Смежные вопросы