ОК, теперь я исправил свой подход к работе со входами, как первоначально было запрошено.
Начните с набора образцов данных:
dataset = {{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}, {f, 0}, {g, 4},
{h,5}, {i, 6}, {j, 7}, {k, 4}, {l, 7}, {m, 8}, {n, 9}, {o, 0}, {p,2},
{q, 3}};
Возьми транспонирование:
trDataset = Transpose[dataset];
следующая функция для работы только с Y-значениями:
trDataset[[2]] = FoldList[Plus, dataset[[1, 2]], Map[Max[#, 0] &, Differences[dataset[[All, 2]]]]]
Отмена транспонирования:
dataset = Transpose[trDataset]
и вывод теперь
{{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}, {f, 5}, {g, 9}, {h, 10}, {i,
11}, {j, 12}, {k, 12}, {l, 15}, {m, 16}, {n, 17}, {o, 17}, {p,
19}, {q, 20}}
Я еще не тестировал производительность этого решения.
РЕДАКТИРОВАТЬ: ОК, вот основа исправления, оставшуюся часть работы я оставлю вам @dreeves. Эта версия monotonify работает только со списком чисел, я не включил ее в свое предыдущее предложение по работе с вашими данными.
monotonify[series_] :=
Split[series, Less] //. {a___, x_List, y_List, z___} /;
Last[x] > First[y] -> {a, x, y + Last[x], z} // Flatten
РЕДАКТИРОВАТЬ 2: Другая функция, которая работает со списком чисел. Это намного быстрее, чем моя предыдущая попытка.
monotonify[series_] :=
Accumulate[Flatten[Map[Flatten[{#[[1]], Differences[#]}] &,
Split[series, Less]]]]