累積和の求め方-Numpy,Pandas,itertools-

リスト型のデータから、累積和を求める方法。

環境は python で、for文 で記載するとコードがスッキリしなかったので、いい方法がないか調べてみました。

データは以下のようなもの。

df_list = [ i for i in range(100)]
print(df_list)

[0, 1, 2, 3, 4, ... 95, 96, 97, 98, 99]

結果として得たいもの。

result = [0]
i = 0
for j in range(100):
    a = result[i] + j
    result.append(a)
    i = i + 1
del result[0]
print(result)

[0, 1, 3, 6, 10, ... 4560, 4656, 4753, 4851, 4950]

方法として、pandas, numpy, itertools の3通り見つかりました。

pandas と numpy では numpy のほうが速く、numpy と itertools では numpy のほうが速いという記事があるそうですが、私の環境では itertools > numpy > pandas の順に速かったので、 最終的には itertools を採用しました。

しかし、全ての方法を記載しておこうと思います。

まず、pandas。

import pandas as pd

df_list = [ i for i in range(100) ]

df = pd.DataFrame(df_list).cumsum()
print(df)

[結果]
       0
0      0
1      1
2      3
3      6
4     10
..   ...
95  4560
96  4656
97  4753
98  4851
99  4950

[100 rows x 1 columns]

別の列に表示することも出来ます。

df['sum'] = pd.DataFrame(df_list).cumsum()
print(df)

[結果]
     0   sum
0    0     0
1    1     1
2    2     3
3    3     6
4    4    10
..  ..   ...
95  95  4560
96  96  4656
97  97  4753
98  98  4851
99  99  4950

[100 rows x 2 columns]

次に、numpy。

import numpy as np

df_list = [ i for i in range(100) ]

a = np.array(df_list)
b = np.cumsum(a)

[結果]
array([   0,    1,    3,    6,   10,   15,   21,   28,   36,   45,   55,
         66,   78,   91,  105,  120,  136,  153,  171,  190,  210,  231,
        253,  276,  300,  325,  351,  378,  406,  435,  465,  496,  528,
        561,  595,  630,  666,  703,  741,  780,  820,  861,  903,  946,
        990, 1035, 1081, 1128, 1176, 1225, 1275, 1326, 1378, 1431, 1485,
       1540, 1596, 1653, 1711, 1770, 1830, 1891, 1953, 2016, 2080, 2145,
       2211, 2278, 2346, 2415, 2485, 2556, 2628, 2701, 2775, 2850, 2926,
       3003, 3081, 3160, 3240, 3321, 3403, 3486, 3570, 3655, 3741, 3828,
       3916, 4005, 4095, 4186, 4278, 4371, 4465, 4560, 4656, 4753, 4851,
       4950], dtype=int32)

これをリストに変換します。

c = b.tolist()

// 一度に書くとこうなります。
// d = np.cumsum(np.array(df_list)).tolist() 

[結果]
[0, 1, 3, 6, 10, ...  4560, 4656, 4753, 4851, 4950]

最後に itertools。

import itertools

iter = itertools.accumulate(df_list)
iter_list = list(iter)
print(iter_list)

[結果]
[0, 1, 3, 6, 10, ...  4560, 4656, 4753, 4851, 4950]
参考記事

Python(Pandas)にて累積和(累積値)を計算する方法【cumsum関数】

pandasで累積和・累積積(cumsum, cumprod, cummax, cummin)

Pythonで累積和・累積積(itertools.accumulate)

【Python】pandasとnumpyの違いと速度比較

NumPyで累積和・累積積(np.cumsum, np.cumprod)

NumPy配列ndarrayとPython標準のリストを相互に変換

Python Pandas:リストをデータフレームに変換する方法

すごいぞitertoolsくん

お薦め

【最強のコロナ対策】のど飴の殺菌成分がコロナ変異株を99%以上不活性化、コロナ茶番完全終了

創価企業「カルチュア・コンビニエンス・クラブ(CCC)」がTカードの個人データ販売を本格化へ 中国による対日工作や詐欺などの犯罪に利用される恐れ

【振り込め詐欺の元締めは日本財団だった!!】 振り込め詐欺の犯罪グループによって集められ、被害者に返還されなかった“50億円”が日本財団に流れていた

【岸田首相と統一教会の切っても切れない関係】 勝共連合を設立した笹川良一と岸田家は親戚であり、どちらも中国人だった!!

【伊豆箱根バス】ノーマスクの女性客を強制的に下車させ、道路運送法違反、車両使用停止処分に マスク未着用との理由で、乗車拒否することは法律違反