Как оптимизировать Python Pandas итерации? - PullRequest
0 голосов
/ 06 мая 2019

у меня датафрейм выглядит так:

''' df: 
        index, sales_fraction, Selected, T_value, A_value, D_value
        1       0.33            t          0.3343   0.33434   0.33434 
        2       0.45            a          0.3434   0.23232   0.33434 
        3       0.56            d          0.3434   0.33434   0.6767
        4       0.545           t          0.3434   0.33434   0.3346
        5       0.343           d          0.2323   0.96342   0.2323
''' 

У меня есть такая функция:

def aggregation(df):       

            df['sales_fraction'] = df['volume']/df['volume'].sum()
            res = 0
            for ix, row in df.iterrows():
                if row['Selected'] == 't':
                    res += row['sales_fraction'] * row['T_value']
                elif row['Selected'] == 'a':
                    res += row['sales_fraction'] * row['A_value']
                elif row['Selected'] == 'd':
                    res += row['sales_fraction'] * row['D_value']                    

            return res

Он работает очень медленно, так как мне нужно миллионы раз использовать функцию агрегирования в другой функции. Любое предложение, как я могу оптимизировать свой код? Я был бы очень признателен за вашу помощь. Спасибо!

Ответы [ 5 ]

1 голос
/ 06 мая 2019

если я правильно понял, как вы делаете свои расчеты, то могу ли я предложить вам попробовать что-то с этой строкой кода и сравнить ее с результатами вашей функции (все встроено):

(df.loc[df["Selected"] == 't',"T_value"] * df.loc[df["Selected"] == 
't',"sales_fraction"]).sum() + (df.loc[df["Selected"] == 'a',"A_value"] * 
df.loc[df["Selected"] == 'a',"sales_fraction"]).sum()+(df.loc[df["Selected"] == 
'd',"D_value"] * df.loc[df["Selected"] == 'd',"sales_fraction"]).sum()
1 голос
/ 06 мая 2019

Эта функция использует поиск и сумму

def aggregation(df):  
    return sum(df.lookup(df.index, df['Selected'].str.upper() +'_value')*df['sales_fraction'])
1 голос
/ 06 мая 2019

Я использую lookup

s=df.loc[:,'T_value':]
s.columns=s.columns.str.split('_').str[0]
np.sum(df.sales_fraction*s.lookup(s.index,df.Selected.str.upper()))
Out[1421]: 0.8606469
1 голос
/ 06 мая 2019

Попробуйте pd.get_dummies():

weights = pd.get_dummies(df.Selected)[['t','a', 'd']]
selected = (df[['T_value', 'A_value', 'D_value']].values * weights.values).sum(1)
(selected * df['sales_fraction']).sum()

# 0.8606469
1 голос
/ 06 мая 2019

Вы можете использовать np.select и np.sum :

cond1 = df['Selected'] == 't' 
cond2= df['Selected'] =='a'
cond3 = df['Selected']=='d'
val1 = df['sales_fraction'] * df['T_value']
val2 = df['sales_fraction'] * df['a_value']
val3 = df['sales_fraction'] * df['D_value']
conditions = [cond1, cond2, cond3]
values = [val1, val2, val3]

res = np.sum(np.select(conditions, values))

np.select может принимать несколько условий и возвращать соответствующие значения для этих условий. Таким образом, вы можете получить список conditions и список values и передать его на np.select. Тогда np.sum вернет сумму всех значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...