У меня есть список значений numpy / pandas:
a = np.random.randint(-100, 100, 10000)
b = a/100
Я хочу применить пользовательскую функцию cumsum, но я не нашел способа сделать это без циклов. Пользовательская функция устанавливает верхний предел 1 и нижний предел -1 для значений cumsum, если «добавить» к сумме выходит за эти пределы, «добавить» становится 0.
В случае, если сумма находится в пределах от -1 до 1, но «добавленное» значение выйдет за пределы, «добавленное» становится остатком от -1 или 1.
Вот версия цикла:
def cumsum_with_limits(values):
cumsum_values = []
sum = 0
for i in values:
if sum+i <= 1 and sum+i >= -1:
sum += i
cumsum_values.append(sum)
elif sum+i >= 1:
d = 1-sum # Remainder to 1
sum += d
cumsum_values.append(sum)
elif sum+i <= -1:
d = -1-sum # Remainder to -1
sum += d
cumsum_values.append(sum)
return cumsum_values
Есть ли способ векторизовать это? Мне нужно запустить эту функцию для больших наборов данных, и моя текущая проблема - производительность. Цени любую помощь!
Обновление : Немного исправлен код и небольшое пояснение к выводам:
Используя np.random.seed (0), первые 6 значений:
b = [0.72, -0.53, 0.17, 0.92, -0.33, 0.95]
Ожидаемый результат:
o = [0.72, 0.19, 0.36, 1, 0.67, 1]