0
2

More than 3 years have passed since last update.

Pythonを使って大量の時系列データを少メモリー環境においてそれなりの速度で集計する方法例

Posted at

はじめに

複数拠点で1年間で収集した30秒周期のデータを読み込んで各時間の合計値を求めるという課題があり、正攻法でやったら全然処理できなかったので、ちょっと工夫した内容をメモしておきます。

データ形式

日時と値がCSV形式で拠点ごとに入っています。

日時
2018-10-01 00:00:00 4
2018-10-01 00:00:30 1
2018-10-01 00:01:00 2
2018-10-01 00:01:30 6
2018-10-01 00:02:00 7
2018-10-01 00:02:30 7
2019-09-31 23:59:30 7

このデータが100箇所以上の場所から集まってくるというものです。
なお、リアルタイムではなく、一定期間の経過後に集計するという内容でした。

単純計算で、一箇所が1,051,200件、100箇所の合計で105,120,000件のデータになります。

...10億(-_-;)

最初にやったこと

ファイルを全て一気に読み込み、日時でグルーピングして合計値を出す!

from glob import glob
import pandas as pd

files = glob("data/*.csv")

df = pd.DataFrame()

for file in files:
    df = pd.concat([df, pd.read_csv(file)])

df = df.groupby("日時").sum()

df.to_csv("合計値.csv")

...RAM使用量はスワップ領域をどんどん使い、半日経って80GBを超えたところでエラーで終了。

ファイルを減らして少しずつ合計値を求める方法を試したけど、ちょっとしっくりこない。

最後にやったこと

ファイルを読み込んで、都度合計値を求めるというやり方にしてみました。

from glob import glob
import pandas as pd

files = glob("data/*.csv")

df = pd.DataFrame()

for file in files:
    df = pd.concat([df, pd.read_csv(file)])
    df = df.groupby("日時").sum().reset_index()

df.to_csv("合計値.csv")

結果、RAMを圧迫することもなく、数分で終わりました。

当たり前のことかもしれないし、わかってしまえば何てことないことだけど、ちょっと時間を使ったってしまったので、同じ苦労をする人が一人でも減れば良いなと思って記録しておきました。

さて、僕の作業はここからが本番。
データ分析、頑張ろう...(-_-;)

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2