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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

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

pandas

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

Q&A

解決済

2回答

5566閲覧

Pandasを使って移動平均を求めたい

J1N

総合スコア56

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2019/02/06 05:06

編集2019/02/06 05:18

前提・実現したいこと

CSV形式で保存されているデータに対して、Pythonを用いて移動平均を求める

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

--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-18-cc023d181ada> in <module> ----> 1 dataset["3SMA"] = dataset["Close"].apply(three_SMA) 2 dataset.iloc[0:9][["Date", "Close", "3SMA"]] ~/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds) 3192 else: 3193 values = self.astype(object).values -> 3194 mapped = lib.map_infer(values, f, convert=convert_dtype) 3195 3196 if len(mapped) and isinstance(mapped[0], Series): pandas/_libs/src/inference.pyx in pandas._libs.lib.map_infer() <ipython-input-17-113f80d88e95> in three_SMA(x) 1 def three_SMA(x): ----> 2 return x.rolling(window=3).mean() AttributeError: 'float' object has no attribute 'rolling'

該当のソースコード

Python3

1def three_SMA(x): 2 return x.rolling(window=3).mean() 3 4dataset["3SMA"] = dataset["Close"].apply(three_SMA) 5dataset.iloc[0:9][["Date", "Close", "3SMA"]]

試したこと

まだ、プログラミング初心者であり、どのようなことを試せるのかもわからない状況です。
dataset["Close_int"] = dataset["Close"].round().astype(int)
など、int型への変換を試みましたが、列にNullが含まれているため、型の変換自体うまくいきませんでした。

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

Jupiter notebook

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atsunofu

2019/02/06 05:22

データセットのフォーマットに問題が有る様です。 どの様なデータセットなのか教えていただけますか?
J1N

2019/02/06 05:31

ご覧いただき、ありがとうございます。 https://finance.yahoo.com/quote/%5EN225/history?ltr=1 米国のヤフーファイナンスからCSV形式でダウンロードした株価データを使用しています。 また、 dataset = pd.read_csv("dataset/N225(1980〜).csv") と入力し、pandas形式のデータセットにしています。
guest

回答2

0

移動平均の計算方法は別の方が説明いただいていますので、そこを参考下さい。
dataset のクレンジングが必要な様なので下記サイトを参考にして下さい。
pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出

python

1 2import pandas as pd 3 4#NaNを除去する場合 5df = df.dropna(subset=['(対象の列名)', '(対象の列名)'], how='all')) 6 7#文字を 0 に置き換えたい場合 8df = df.replace('(置き換えたい文字列)',float(0.000)) 9

等を試して、不要なデータを除去してから移動平均の計算を実施してみて下さい。

投稿2019/02/06 05:58

atsunofu

総合スコア59

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

J1N

2019/02/06 06:28

参考サイトを教えていただき、ありがとうございます。 これから、クレンジングに取り掛かってみます。
guest

0

ベストアンサー

移動平均の計算は、Series.rolling(window=5).mean() とすればよいです。
以下サンプル例

データ作成

python

1import numpy as np 2import pandas as pd 3 4data = np.random.choice([-1., 1.], size=500).cumsum() 5series = pd.Series(data) 6series.plot()

イメージ説明

移動平均を計算する。

python

1ma = series.rolling(window=5).mean() # 移動平均 2ma.plot()

イメージ説明

追記 NaN を含むデータの移動平均について

pandas.DataFrame.rolling

Minimum number of observations in window required to have a value (otherwise result is NA).
For a window that is specified by an offset, min_periods will default to 1. Otherwise, min_periods will default to the size of the window.

デフォルトでは window 内に1つでも NaN があると、その部分の平均は NaN になってしまいます。
min_periods を指定することで、window 内に最低でも min_periods 個の有効な値があれば、平均が計算されるようになります。

python

1import pandas as pd 2 3df = pd.read_csv('test.csv') 4ma = df['Close'].rolling(window=3, min_periods=1).mean() # 移動平均 5ma.plot()

データはコメント欄にあった株価のデータを使っています。

追記

データは こちら の Download Data をクリックすると、ダウンロードされる CSV ファイルであっていますか?
中身は以下のようです。

csv

1Date,Open,High,Low,Close,Adj Close,Volume 22019-01-07,19944.609375,20266.220703,19920.800781,20038.970703,20038.970703,81500 32019-01-08,20224.669922,20347.919922,20106.359375,20204.039063,20204.039063,86400 42019-01-09,20366.300781,20494.349609,20331.199219,20427.060547,20427.060547,72800 52019-01-10,20270.880859,20345.919922,20101.929688,20163.800781,20163.800781,73700 62019-01-11,20296.449219,20389.890625,20294.740234,20359.699219,20359.699219,77700 72019-01-14,null,null,null,null,null,null 82019-01-15,20264.820313,20571.279297,20204.429688,20555.289063,20555.289063,78300 92019-01-16,20575.720703,20580.250000,20323.320313,20442.750000,20442.750000,69500 102019-01-17,20544.230469,20571.750000,20342.460938,20402.269531,20402.269531,63600 112019-01-18,20472.810547,20682.119141,20454.130859,20666.070313,20666.070313,64700 122019-01-21,20848.380859,20892.679688,20678.259766,20719.330078,20719.330078,61200 132019-01-22,20770.060547,20805.929688,20558.300781,20622.910156,20622.910156,57100 142019-01-23,20453.439453,20686.289063,20438.220703,20593.720703,20593.720703,0 152019-01-24,20506.240234,20620.720703,20467.589844,20574.630859,20574.630859,61400 162019-01-25,20598.640625,20844.310547,20598.640625,20773.560547,20773.560547,68400 172019-01-28,20746.289063,20759.480469,20624.550781,20649.000000,20649.000000,56800 182019-01-29,20555.439453,20673.660156,20406.220703,20664.640625,20664.640625,63100 192019-01-30,20701.619141,20706.269531,20527.529297,20556.539063,20556.539063,72100 202019-01-31,20832.910156,20869.419922,20682.910156,20773.490234,20773.490234,75700 212019-02-01,20797.029297,20929.630859,20741.980469,20788.390625,20788.390625,82200 222019-02-04,20831.900391,20922.580078,20823.679688,20883.769531,20883.769531,66600 232019-02-05,20960.470703,20981.230469,20823.179688,20844.449219,20844.449219,65500 242019-02-06,20928.869141,20971.660156,20860.990234,20873.599609,20873.599609,0

これに対して、

python

1import pandas as pd 2 3df = pd.read_csv('test.csv') 4ma = df['Close'].rolling(window=3, min_periods=1).mean() # 移動平均 5ma.plot()

で動作確認していますが、質問者さんの環境ではエラーが出るということですか?

投稿2019/02/06 05:23

編集2019/02/06 06:15
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

J1N

2019/02/06 06:10

回答をしていただき、ありがとうございます。大変参考になります。 ただ、私の方で試すと、どうしても AttributeError: 'float' object has no attribute 'rolling' のエラーが出てしまいます。 ご記載いただきました、 df['Close"] は整数への型変換をされていますでしょうか? ご教示いただけますと幸いです。
tiitoi

2019/02/06 06:17

質問欄に書いてある dataset["Close"].apply(three_SMA) ではなく、回答のコードを実行してそうなりますか? また使用しているデータは追記した通りであっていますか?
J1N

2019/02/06 06:22

データはご記載アップしていただいたもので一致しております。 おっしゃる通り、私の環境ではエラーが出てしまいます。 例えば、2019年2月1日のCloseのデータを見ますと、「20788.390625」ですが、エラーの内容を読むと、この数字が小数(float)だから、rollingが使えないのかなと解釈していました。
J1N

2019/02/06 06:26

dataset["Close"].apply(three_SMA)の部分を変更しておりませんでした。 回答のコードを実施したら、正しく作動しました。 大変助かりました。 ご丁寧に教えていただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問