#python #pandas #dataframe #function #filtering
Вопрос:
Не могу понять, как создать функцию, которая могла бы взять сумму предыдущей строки и использовать ее в качестве нового значения для следующей строки и повторять ее до конца кадра данных.
Пример: (здесь мы видим 2 значения и его прибыль от A до B в %)
import pandas as pd
df = pd.DataFrame(data={"A":[4,5,2,2], "B":[5,3,3,4]})
df['Profit_%'] = (df["B"] - df["A"]) / df["A"] * 100
print(df)
Функция:
new_col = 'c'
def apply_func_decorator(func):
prev_row = {}
def wrapper(curr_row, **kwargs):
val = func(curr_row, prev_row)
prev_row.update(curr_row)
prev_row[new_col] = val
return val
return wrapper
@apply_func_decorator
def running_total(curr_row, prev_row):
return curr_row['Profit_%'] * prev_row.get(new_col, 0) /100 125
Выход:
df[new_col] = df.apply(running_total, axis=1)
print(df)
Таким образом, вопрос будет заключаться в том, как применить функцию, начиная со 2-й строки, и сообщить Python, что начальная сумма для инвестирования составляет 100 долларов?
Итак, в реальной жизни это должно быть так: Мы инвестируем 100$, и с первой строки мы получаем 25% = 125$, Со второй строки мы теряем 40%, и мы теряем их со 125$ > и теперь у нас всего 75$, С третьей строки мы получаем 50%, и это будет: 112,5$ и т. Д.
Ответ №1:
Вы просто увеличиваете отдачу, вы могли бы просто использовать совокупный продукт:
df["C"] = 100*(df["B"]/df["A"]).cumprod()
>>> df
A B C
0 4 5 125.0
1 5 3 75.0
2 2 3 112.5
3 2 4 225.0
Комментарии:
1. Спасибо, что пропустили это. Пробовал несколько раз .cumprod, но использовал его неправильно.