2016-04-19 9 views
2

?以下の表に(物理的な在庫が0を下回ることはできません)

  • 「在庫の変化」の欄には、毎日の販売/新株式購入を反映しています。
  • データ入力/ヒューマンエラーがCUMSUMを適用すること-5物理的に不可能である負の在庫レベルを示すことを意味します。
  • 「インベントリ」の欄に示すように、データ入力エラーが端(95対100)での問題であり続けます。これを達成するための

データフレーム

  change in inventory inventory cumsum 
2015-01-01     100  100  100 
2015-01-02     -20   80  80 
2015-01-03     -30   50  50 
2015-01-04     -40   10  10 
2015-01-05     -15   0  -5 
2015-01-06     100  100  95 

一つの方法は、それが厄介になると、おそらくこれを行うには、より効率的な方法があるが、ループを使用することです。ここ

は、データフレームを生成するためのコードである:

import pandas as pd 
df = pd.DataFrame.from_dict({'change in inventory': {'2015-01-01': 100, 
    '2015-01-02': -20, 
    '2015-01-03': -30, 
    '2015-01-04': -40, 
    '2015-01-05': -15, 
    '2015-01-06': 100}, 
'inventory': {'2015-01-01': 100, 
    '2015-01-02': 80, 
    '2015-01-03': 50, 
    '2015-01-04': 10, 
    '2015-01-05': 0, 
    '2015-01-06': 100}}) 

df['cumsum'] = df['change in inventory'].cumsum() 
df 

「インベントリ」の欄に示す値を生成するためのpython /パンダの最小値と累積和を適用する方法は?

+0

あなたは結果を正確に何にしたいですか?列にエラーがある場合、それらを修正するために使用できるいくつかの異なるヒューリスティックがあります。 –

+0

インベントリの列に示されているのと同じ結果を出すことを目的としています。 – Greg

+0

複数の負の値がある場合はどうなりますか? – Zero

答えて

0

あなたは、残念ながら、ループを使用することができます

lastvalue = 0 
newcum = [] 
for row in df['change in inventory']: 
    thisvalue = row + lastvalue 
    if thisvalue < 0: 
     thisvalue = 0 
    newcum.append(thisvalue) 
    lastvalue = thisvalue 

print pd.Series(newcum, index=df.index) 
2015-01-01 100 
2015-01-02  80 
2015-01-03  50 
2015-01-04  10 
2015-01-05  0 
2015-01-06 100 
dtype: int64 
0

非常に醜いソリューション

start = df.index[0] 
df['cumsum'] = [max(df['change in inventory'].loc[start:end].sum(), 0) 
    for end in df.index] 
+0

残念なことに、この解決策は「インベントリ」列と同じ結果をもたらさない。つまり、最後の行は100でなく95です。 – Greg

1

データによっては、同じ符号、例えばとはるかに効率的なブロックをループすることができます。大きな実行サブブロックはすべて正または負である。負の値を実行した後は、正の値に戻すように注意する必要があります。ベクター上合計分として最小制限値と

:CSUMで

import numpy as np 
i_sign = np.append(np.where(np.diff(np.sign(vector)) > 0)[0],[len(vector)]) 
i0 = 1 
csum = np.maximum(minS, vector[:1]) 
for i1 in i_sign: 
    tmp_csum = np.maximum(minS, csum[-1] + np.cumsum(vector[i0:i1+1])) 
    csum = np.append(csum, tmp_csum) 
    i0 = i1 

最終出力。

関連する問題