Накопительные суммы и переносы - векторизация с пандами - PullRequest
0 голосов
/ 04 мая 2018

Могу ли я сделать следующее с pandas.Series math на a и b без явного циклического прохождения?

In [38]: a = pd.Series([4, 8, 3, 6, 2])

In [39]: b = pd.Series([3, 9, 5, 5, 4])

In [40]: alist = a.tolist()
    ...: blist = b.tolist()
    ...: for i in range(len(alist)):
    ...:     diff = max(0, alist[i] - blist[i])
    ...:     try:
    ...:         alist[i + 1] = alist[i + 1] + diff
    ...:     except IndexError:
    ...:         if diff > 0:
    ...:             alist.append(diff)
    ...:     blist[i] = max(0, blist[i] - alist[i])
    ...: 

In [41]: alist
Out[41]: [4, 9, 3, 6, 3]

In [42]: blist
Out[42]: [0, 0, 2, 0, 1]

Я увеличиваю следующее значение a с разницей a и b, если оно больше нуля, а затем вычитаю b из этого кумулятивного суммоподобного вычисления.

Ответы [ 4 ]

0 голосов
/ 04 мая 2018

Рассмотрим приведенный ниже код, который использует .shift () , а затем roll () .

df=pd.DataFrame({
    'a': a,
    'b': b
})
alist = list(np.roll((df['a'].shift(-1)+(df['a']-df['b']).clip(lower=0)).fillna(df.iloc[0]['a']), 1).astype(int))
blist = list((df['b'] - alist).clip(lower=0))
print(allist)
print(blist)

Выход:

[4, 9, 3, 6, 3]
[0, 0, 2, 0, 1]
0 голосов
/ 04 мая 2018

Это один из способов использования numpy:

import numpy as np

a += np.maximum(0, a-b).shift().fillna(0).astype(int)
b = np.maximum(0, b - a)

print(a)

0    4
1    9
2    3
3    6
4    3
dtype: int64

print(b)

0    0
1    0
2    2
3    0
4    1
dtype: int64
0 голосов
/ 04 мая 2018

Вот еще один тупой подход с использованием where и roll:

alist = np.where(np.roll(a - b > 0, 1), a + np.roll(a - b, 1), a)
blist = np.maximum(b.values - alist, 0)

print alist
# [4 9 3 6 3]
print blist
# [0 0 2 0 1]
0 голосов
/ 04 мая 2018

IIUc, вам нужно shift (эту строку можно заменить на shift alist[i + 1] = alist[i + 1] + diff)

alist=a.add((a-b).clip(lower=0).shift(),fill_value=0).astype(int)
blist=(b-alist).clip_lower(0)
alist
Out[340]: 
0    4
1    9
2    3
3    6
4    3

blist
Out[341]: 
0    0
1    0
2    2
3    0
4    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...