質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • Python 3.x

    7413questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • pandas

    677questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

時間ごとに単純移動平均を計算する:Pandas

解決済

回答 1

投稿

  • 評価
  • クリップ 2
  • VIEW 2,386

pepasuke623

score 34

前提・実現したいこと

お世話になります。時間ごとに区切って単純移動平均を出したいと思っています。

例えばこんなデータがあるとします。

//data.csv
time,val
10:00:00.111,65
10:00:00.555,68
10:00:00.888,37
10:00:01.111,34
10:00:01.222,36
10:00:01.333,34
10:00:01.555,12
10:00:01.888,64
10:00:02.111,94
10:00:02.555,54
10:00:02.888,47
10:00:03.111,35
10:00:03.555,48
10:00:03.888,43
・
・


一秒ごとに取れる値の数がまちまちで,10:00:00台では3個、10:00:01台では5個だったりします。
この中で3秒ごとに取れたデータを平均して1.5秒づつずらして単純移動平均計算したいと思っています。
例えば

  • 10:00:03.000では10:00:00.000から10:00:03.000の間に取れた値を平均して10:00:03.000の横に出力する
  • 10:00:04.500では10:00:01.500から10:00:04.500の間に取れた値を平均して10:00:04.500の横に出力する
  • 10:00:06.000では10:00:03.000から10:00:06.000の間に取れた値を平均して10:00:06.000の横に出力する
    という計算を繰り返します。アウトプットイメージとしてはこんな感じでしょうか。
//Output.csv(aveの値は適当に入れた)
time,ave
10:00:00,000,Nan
10:00:01.500,Nan
10:00:03.000,37
10:00:04.500,34
10:00:06.000,64
・
・
・

試したこと

先程調べた限りでは、rollingを使えばのようなものは出来るみたいです。

import pandas as pd

my_parser = lambda date: pd.datetime.strptime('%h:%m:%s.%f')

# ファイルを読み込む
df = pd.read_csv('data.csv', date_parser=my_parser)

df_new = df.rolling(window=3, min_periods=3).mean()


rollingの場合は移動平均に必要な個数が決まっています。今回行いたいのは時間ごとに枠をずらして,任意の枠に取得できた個数分を平均したいです。

お手数ですが、方法を教えていただければと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

こんな感じでよろしいでしょうか?

もう少しスマートに書ける気がしますが、とりあえず。

data.csv

time,val
10:00:00.111,65
10:00:00.555,68
10:00:00.888,37
10:00:01.111,34
10:00:01.222,36
10:00:01.333,34
10:00:01.555,12
10:00:01.888,64
10:00:02.111,94
10:00:02.555,54
10:00:02.888,47
10:00:03.111,35
10:00:03.555,48
10:00:03.888,43

sample.py

import pandas as pd
# Data読み込み
my_parser = lambda time: pd.datetime.strptime('2017-04-01 {}'.format(time), '%Y-%m-%d %H:%M:%S.%f')
df = pd.read_csv('data.csv', date_parser=my_parser, parse_dates=['time'])
# DataTimeIndexを生成
index = pd.date_range('2017-04-01 10:00:00', '2017-04-01 10:00:30', freq='1500ms')
# 平均を求める際の時間範囲
range = pd.DateOffset(seconds=3)
# 移動平均を計算
result = pd.DataFrame([df[(df['time'] >= d) & (df['time'] <= d+range)]['val'].mean()  for d in index], index=index, columns=['MovingAverage'])
print(result)

やっていることは、コードを見ていただけると解ると思いますが、

  1. まず、10:00:00から10:00:30まで1.5秒Stepの DateTimeIndex を生成
  2. DateTimeIndex の各行毎に各データが時間範囲内かどうかを求める
  3. DateTimeIndex の各行毎に時間範囲内のデータの平均値を算出
  4. DateTimeIndexと平均値データによりDataFrameを構築
    となっております。

なお、本来は時刻情報だけ結果を算出したほうがよさそうですが、
時間範囲かどうかを求める条件文を簡略化する都合上、適当な
年月日(2017/04/01)を使用してDateTime情報を生成しております。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/22 22:24

    ありがとうございます!
    まず時間ごとの枠を作ってから,その後移動平均(区間ごとに平均の計算をする)ということですね.
    たしかにこの通りプログラムを作成したら出来ました!
    どうもありがとうございます!!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    7413questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • pandas

    677questions

    Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。