Как объединить кортежи, возвращаемые apply groupby, в pandas из talib.BBANDS - PullRequest
1 голос
/ 04 мая 2020

Итак, допустим, у меня есть фрейм данных, который создан следующим образом и имеет 3 продукта A, B, C

df = pd.DataFrame({'type' : ['A','A','B','B','C','C'], 'x' : [1,2,3,4,5,6]})

, которые вы можете распечатать и увидеть, как показано ниже

   type x
0   A   1
1   A   2
2   B   3
3   B   4
4   C   5
5   C   6

Теперь я создаю функцию с именем f, которая возвращает кортеж

def f(x):
    return x*2, x*3, x*4

И я применяю это к кадру данных с помощью groupby типа

df.groupby('type').apply(lambda x : f(x.x))

И теперь результат серия из 3 массивов, как показано ниже. Но как мне слить ее обратно в фрейм данных правильно

type
A    ([2, 4], [3, 6], [4, 8])
B    ([6, 8], [9, 12], [12, 16])
C    ([10, 12], [15, 18], [20, 24])
dtype: object

То, что я хочу увидеть, это

type x a  b  c
A    1 2  3  4
A    2 4  6  8
B    3 6  9  12
B    4 8  12 16
C    5 10 15 20
C    6 12 18 24

РЕДАКТИРОВАНИЕ: Обратите внимание, что я дал функцию f в качестве очень простого примера и похоже, почему я не могу напрямую создать новый столбец с умножением. Но представьте себе более сложную функцию f, которая использует 3 столбца, а затем генерирует кортежи, которые не являются прямым умножением столбцов

Именно поэтому я задал этот вопрос

Реальная рассматриваемая функция - talib.BBANDS

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Предполагая, что в вашем реальном случае : требуется groupby, ваша функция принимает несколько столбцов в качестве входных данных и возвращает несколько столбцов в качестве выходных, ваша функция может возвращать фрейм данных:

def f(x):
    return pd.DataFrame({'a':x*2, 'b':x*3, 'c':x*4}, index=x.index)

# then assign directly or use join
df[['a','b','c']] = df.groupby('type').apply(lambda x : f(x.x))

print (df)
  type  x   a   b   c
0    A  1   2   3   4
1    A  2   4   6   8
2    B  3   6   9  12
3    B  4   8  12  16
4    C  5  10  15  20
5    C  6  12  18  24

Отредактируйте имя используемой функции talib.BBANDS, тогда, я думаю, вы можете создать оболочку:

def f(x):
    upper, middle, lower = talib.BBANDS(x, ...) #enter the parameter you need
        return pd.DataFrame({'upper':upper, 'middle':middle, 'lower':lower }, 
                            index=x.index)
df[['upper','middle','lower']] = df.groupby('type').apply(lambda x : f(x.x))
0 голосов
/ 04 мая 2020
import pandas as pd
df = pd.DataFrame({'type' : ['A','A','B','B','C','C'], 'x' : [1,2,3,4,5,6]})

newcol=df['x']**2
df['x**2']=newcol

df

выход: enter image description here

...