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

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

ただいまの
回答率

90.52%

  • Python

    7929questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6341questions

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

Python上での二乗平均平方根(RMS)

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 893

iwhr

score 8

 前提・実現したいこと

閲覧いただきありがとうございます.
Excel.csvファイルを読み込んで100個のデータごとに二乗平均平方根(RMS)を行い別のExcel.csvファイルに出力しようと考えています.
自分なりにプログラムを作ってみたのですがうまく実行できません.
読みこむExcel.csvファイルは例として下のようになります.
A列,B列のデータは4500行くらいまであり,B列をRMSしたいと考えております.
よろしくお願いいたします.

イメージ説明

 発生している問題・エラーメッセージ

プログラムが書けない.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-2b1f58483765> in <module>()
     16 data = pd.read_csv("P_emg-1524717370.csv",index_col="time")
     17 df_emg1 = data.iloc[:,[0]]
---> 18 RMS1 = window_rms(df_emg1,WINDOW_SIZE)
     19 df_RMS_emg1 = RMS1
     20 

<ipython-input-4-2b1f58483765> in window_rms(a, window_size)
     11   a2 = np.power(a,2)
     12   window = np.ones(window_size)/float(window_size)
---> 13   return np.sqrt(np.convolve(a2, window,"same"))
     14 
     15 #csvファイル読み込み

~\Anaconda3\lib\site-packages\numpy\core\numeric.py in convolve(a, v, mode)
   1034         raise ValueError('v cannot be empty')
   1035     mode = _mode_from_name(mode)
-> 1036     return multiarray.correlate(a, v[::-1], mode)
   1037 
   1038 

ValueError: object too deep for desired array

 該当のソースコード

 coding: utf-8

import csv
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
import pandas as pd
WINDOW_SIZE=100

RMSの式を作成

def window_rms(a, window_size):
a2 = np.power(a,2)
window = np.ones(window_size)/float(window_size)
return np.sqrt(np.convolve(a2, window,"same"))

csvファイル読み込み

data = pd.read_csv("example.csv",index_col="semit")
df_iwhr1 = data.iloc[:,[0]]
RMS1 = window_rms(df_iwhr1,WINDOW_SIZE)
df_RMS_iwhr1 = RMS1

 csvファイルの作成

csvfile = open ("new1.csv",'w',newline="")
df_RMS_iwhr1.to_csv(csvfile)

python

 試したこと

ここに問題に対して試したことを記載してください。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • mather

    2018/05/25 13:23

    ソースコードの部分をMarkdownのコードブロックで囲んでください。

    キャンセル

  • KSwordOfHaste

    2018/05/25 13:56

    質問者さんは質問文本文で「```<改行>コード...<改行>```ここに言語を入力<改行>Python<改行>```<改行>」と打ち込んでます。そうではなく「```Python<改行>コード...<改行>```<改行>」と入力せねばならないのです。たまにそう解釈する人がいますが…勘違いするのもわかりますw;

    キャンセル

  • iwhr

    2018/05/25 14:47

    お二方のおっしゃるとおりです.以後,投稿する際には気をつけたいと思います.

    キャンセル

回答 3

checkベストアンサー

0

RMSを移動平均で求めているのですね。
pandasだとこんな感じで書けると思います。

import pandas as pd
import numpy as np

window_size = 3
rms = lambda d: np.sqrt((d ** 2).sum() / d.size)

data = pd.read_csv('in.csv')
data['rms'] = data.iloc[:,0].rolling(window=window_size, min_periods=1, center=True).apply(rms)
data.to_csv('out.csv', index=None)

【補足】

簡単に説明します。

まず [1,2,3,4,5,6,7,8,9] といった1次元配列(pandas.Series)があった場合、RMSは

import pandas as pd
import numpy as np

row_data = pd.Series([1,2,3,4,5,6,7,8,9])
res = np.sqrt((row_data ** 2).sum() / row_data.size)
print(res)
#5.627314338711377

で求めることができますので、このRMSを求める式を lambdaで関数化しておいて

import pandas as pd
import numpy as np

row_data = pd.Series([1,2,3,4,5,6,7,8,9])
rms = lambda d: np.sqrt((d ** 2).sum() / d.size)

res = rms(row_data)
print(res)
#5.627314338711377


となります。

次に、今回の質問のコードの場合、列全体のRMSを求めるのではなく一定区間のRMSをずらしながら求めることが要求されておりますので、この部分はSeries.rolling() を使用することになります。
Series.rolling() を簡単なサンプルで説明すると、例えば [1,2,3,4,5,6,7,8,9] といった1次元配列に対してrolling().sum() を適用するとにより

row_data = pd.Series([1,2,3,4,5,6,7,8,9])
res = row_data.rolling(window=3).sum()
print(res)
#0     NaN
#1     NaN
#2     6.0
#3     9.0
#4    12.0
#5    15.0
#6    18.0
#7    21.0
#8    24.0
#dtype: float64

のように、一定区間(今回はwindow=3で指定した区間)毎の合計を求めることができます。
今回の場合は一定区間毎の合計では無く、自作した関数(rms)を適用したいので、Series.rolling().apply()を使用して

row_data = pd.Series([1,2,3,4,5,6,7,8,9])

rms = lambda d: np.sqrt((d ** 2).sum() / d.size)
res = row_data.rolling(window=3).apply(rms)
print(res)
#0         NaN
#1         NaN
#2    2.160247
#3    3.109126
#4    4.082483
#5    5.066228
#6    6.055301
#7    7.047458
#8    8.041559
#dtype: float64


となります。

最後に、rollingのパラメータですが、上記の例では index=0,1 の箇所の結果がNaNになっております。これはこの部分を計算するための入力データの数が区間数(Window=3)を満たしておらず計算が出来ないためです。そこでmin_periods=1 をパラメータで渡し、入力データが最低でも1つあれば計算を行うよう指定しております。さらに上記の例では 入力データindex=0,1,2の結果がindex=2に入っております。そこでcenter=Trueを渡す事により index=0,1,2の結果が index=1 に出力されるようにしております。

以上です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/25 14:53

    おっ、既に R.Shigemori さんが、pandas.rollong() つかったコードを挙げておられましたか・・。

    キャンセル

  • 2018/05/25 15:06

    magichanさん

    お答えいただきありがとうございました.
    たとえ同じコードであれ,書き方は異なるので非常に参考になります.ありがとうございます.
    教えていただいたコードをみながら自分でもやってみようと思います.

    キャンセル

  • 2018/05/27 14:51 編集

    magichanさん

    iwhrです.majichanさんのコードをみながら自分でもやってみたのですが,どのプログラムでどういう処理が行われているのかがわかりません...
    お時間がございましたら教えていただけませんか?
    よろしくお願いします.

    キャンセル

  • 2018/05/28 09:19

    簡単ですが、解説を追加しました。
    不明点がございましたらコメントください。

    キャンセル

  • 2018/05/30 11:00 編集

    magichanさん

    iwhrです.ご丁寧な説明ありがとうございます.
    おかけで,どのようなプログラムとなっているか理解できました.
    また,RMS処理のプログラムも完成させることができました.
    ありがとうございました.

    キャンセル

0

呼出元のdf_iwhr1DataFrameなので、window_rms関数内のa2shape(12345,1)のようになってしまい提示エラーが発生しています。
今回の提示コードでは全行を対象にしているので.ilocを使うまでもなくdata['semit']のように列値をSeriesとして渡してあげるとよいです。
参考:ValueError: object too deep for desired array while using convolution

import numpy as np
import pandas as pd

def window_rms(a, window_size):
    a2 = np.power(a,2)
    window = np.ones(window_size)/float(window_size)
    return np.sqrt(np.convolve(a2, window,"same"))

WINDOW_SIZE = 3
data = pd.DataFrame({'semit':[i+1 for i in range(10)],'iwhr1':[(i+1)*10 for i in range(10)]})
print(data)
RMS1 = window_rms(data['semit'],WINDOW_SIZE)
data['RMS'] = RMS1
print(data)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/25 14:58

    can110さん

    お答えいただきありがとうございます.
    教えていただいたコードをみなから自分でもやってみたいと思います.

    キャンセル

0

せっかくDataFrame化しているのでフル活用するコードです。

data['sq']=np.sqrt(df_iwhr1) # 全要素を二乗
data['mean']=data.rolling(window=WINDOW_SISE).mean()['sq']#移動平均
data['rms']=np.sqrt(data['mean']) #結果の平方根


計算の途中経過もdataの中にあるので必要なものを取り出してcsvファイルに出力してください

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/25 14:57

    R.Shigemoriさん

    お答えいただきありがとうございます.
    教えていただいたコードをみなから自分でやってみたいと思います.

    キャンセル

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

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

関連した質問

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

  • Python

    7929questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    6341questions

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