Python - расчет в датафреймах - PullRequest
0 голосов
/ 15 мая 2019

У меня проблемы с расчетом в данных.

Я вычисляю

  • % - изменение на столбец
  • % - доля на столбец на основе суммы строки

Теперь я хочу вычислить% -обмен на столбец на основе% -перечисления на столбец. Я бы сделал это следующим образом:

(col A% -смена * col A% -по доле) + (col B% -смены * col B% -по доле) + (col C% -смена * col C% -по доле) и т. Д.

Я подумал о двух способах сделать это, хотя ни один из них не работает ... И - конечно - я хотел бы сделать это максимально динамично, так как число столбцов будет меняться.

Вот некоторый код для получения подходящего кадра данных:

    import pandas as pd
    import numpy as np

    df1 = pd.DataFrame(np.array([
    ['2019-04-29', 5, 5, 10],
    ['2019-04-28', 10, 10, 50],
    ['2019-04-27', 20, 5, 100]]),
    columns=['Date', 'attr1', 'attr2', 'attr3'])

    df1["attr1"] = pd.to_numeric(df1["attr1"])
    df1["attr2"] = pd.to_numeric(df1["attr2"])
    df1["attr3"] = pd.to_numeric(df1["attr3"])

    df1 = df1.set_index(['Date'])
    col_list= list(df1)

    df1['sum'] = df1[col_list].sum(axis=1)

    for i in col_list:
    df1[i + ' %-change'] = df1[i].pct_change()*100
    df1[i + " %-share"] = df1[i]/ df1['sum']

Идея 1: В основном я пробую формулу, упомянутую выше. Так что умножьте% -share и% -change каждого столбца и суммируйте их. Я думал об использовании .sum, но не знаю, как использовать его в этой конкретной ситуации.

df1[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])

Идея 2: Мысль о том, чтобы сделать это в два этапа. Первым шагом будет умножение% -share и% -change каждого столбца. Вторым шагом будет суммирование новых столбцов в новой строке кода. Проблема в том, что я не могу сделать это динамически. Мне нужно было бы вручную выбрать столбцы, которые мне нужно обобщить, но если я скажу, что 100 столбцов - это действительно утомительная работа.

Я думал о записи недавно вычисленных столбцов в новый фрейм данных, поэтому у меня есть все нужные мне столбцы, но данные в фрейме для меня не имеют смысла.

df2[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])

Как всегда, любая помощь очень ценится.

Большое спасибо!

1 Ответ

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

Вы можете попробовать использовать dataframe.apply с функцией lumbda.

# get the column name out
changeCol = [col for col in df1.columns if 'change' in col]
shareCol = [col for col in df1.columns if 'share' in col]

# calculate
result = df1.apply(lambda x: sum([x[changeCol[i]]*x[shareCol[i]] for i in range(len(changeCol))]), axis=1)

# after you could append the result to your dataframe or do whatever you like.
# df1["result"] = result
# ...


[ref] pandas.DataFrame.apply

...