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

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

ただいまの
回答率

90.51%

  • Python 3.x

    9765questions

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

  • pandas

    894questions

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

Pandasのapply機能

解決済

回答 1

投稿 編集

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

J1N

score 3

前提・実現したいこと

自分で定義した関数をapplyを用いてpandasuに適用する

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

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-231-f829a566d8dd> in <module>
      5 dataset = pd.get_dummies(data = dataset, columns = ["short_ma_order"])
      6 
----> 7 dataset["direction_of_3"] = dataset.apply(direction_of_3)
      8 
      9 dataset.tail()

~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in apply(self, func, axis, broadcast, raw, reduce, result_type, args, **kwds)
   6012                          args=args,
   6013                          kwds=kwds)
-> 6014         return op.get_result()
   6015 
   6016     def applymap(self, func):

~/anaconda3/lib/python3.6/site-packages/pandas/core/apply.py in get_result(self)
    314         if isinstance(self.f, (list, dict)):
    315             return self.obj.aggregate(self.f, axis=self.axis,
--> 316                                       *self.args, **self.kwds)
    317 
    318         return super(FrameRowApply, self).get_result()

~/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py in aggregate(self, func, axis, *args, **kwargs)
   5826         if axis == 0:
   5827             try:
-> 5828                 result, how = self._aggregate(func, axis=0, *args, **kwargs)
   5829             except TypeError:
   5830                 pass

~/anaconda3/lib/python3.6/site-packages/pandas/core/base.py in _aggregate(self, arg, *args, **kwargs)
    549             return self._aggregate_multiple_funcs(arg,
    550                                                   _level=_level,
--> 551                                                   _axis=_axis), None
    552         else:
    553             result = None

~/anaconda3/lib/python3.6/site-packages/pandas/core/base.py in _aggregate_multiple_funcs(self, arg, _level, _axis)
    607         # if we are empty
    608         if not len(results):
--> 609             raise ValueError("no results")
    610 
    611         try:

ValueError: no results

該当のソースコード

def direction_of_3(column):
    direction_of_3 = []
    idx = list(column.index)
    for i in idx:
        dif_1 = column["3SMA"].diff()[i]

        if dif_1 > 0:
            direction = 1
        else:
            direction = 0
        direction_of_3.append(direction)
    return direction_of_3

dataset["direction_of_3"] = dataset.apply(direction_of_3)

元データ

Date Open High Low Close Adj Close Volume 3SMA 5SMA 7SMA
1980-01-04 6560.160156 6560.160156 6560.160156 6560.160156 6560.160156 0 NaN NaN NaN
1980-01-07 6552.649902 6552.649902 6552.649902 6552.649902 6552.649902 0 NaN NaN NaN
1980-01-08 6563.279785 6563.279785 6563.279785 6563.279785 6563.279785 0 6558.696614 NaN NaN
1980-01-09 6591.830078 6591.830078 6591.830078 6591.830078 6591.830078 0 6569.253255     NaN NaN
1980-01-10 6594.009766 6594.009766 6594.009766 6594.009766 6594.009766 0.0 6583.039876     6572.385937 NaN
1980-01-11 6615.509766 6615.509766 6615.509766 6615.509766 6615.509766     0.0 6600.449870 6583.455859 NaN
1980-01-14 6659.549805 6659.549805 6659.549805 6659.549805 6659.549805 0.0 6623.023112 6604.835840 6590.998465
1980-01-16 6653.259766 6653.259766 6653.259766 6653.259766 6653.259766 0.0 6642.773112 6622.831836 6604.298410
1980-01-17 6656.299805 6656.299805 6656.299805 6656.299805 6656.299805 0.0 6656.369792 6635.725782 6619.105539
1980-01-18 6649.299805 6649.299805 6649.299805 6649.299805 6649.299805 0.0 6652.953125 6646.783789 6631.394113
1980-01-21 6666.270020 666.270020 6666.270020 6666.270020 6666.270020 0.0 6657.289877 6656.935840     6642.028390
1980-01-22 6684.589844 6684.589844 6684.589844 6684.589844 6684.589844 0.0 6666.719890 6661.943848 6654.968402
1980-01-23 6694.189941 6694.189941 6694.189941 6694.189941 6694.189941 0.0 6681.683268 6670.129883 6666.208427
1980-01-24 6746.930176 6746.930176 6746.930176 6746.930176 6746.930176 0.0 6708.569987 6688.255957 6678.691337
1980-01-25 6767.709961 6767.709961 6767.709961 6767.709961 6767.709961 0.0 6736.276693 6711.937988 6695.041365
1980-01-28 6763.609863 6763.609863 6763.609863 6763.609863 6763.609863 0.0 6759.416667 6731.405957 6710.371373
1980-01-29 6770.830078 6770.830078 6770.830078 6770.830078 6770.830078 0.0 6767.383301 6748.654004 6727.732840
1980-01-30 6776.600098 6776.600098 6776.600098 6776.600098 6776.600098 0.0 6770.346680 6765.136035 6743.494280
1980-01-31 6768.160156 6768.160156 6768.160156 6768.160156 6768.160156 0.0 6771.863444 6769.382031 6755.432896
1980-02-01 6777.640137 6777.640137 6777.640137 6777.640137 6777.640137 0.0 6774.133464 6771.368066 6767.354353

試したこと

同じ内容を実行するために、以下のコードを試したところ、成功しました。

idx = list(dataset["3SMA"].index)
direction_of_3 = []
for i in idx:
    dif_1 = dataset["3SMA"].diff()[i]
    if dif_1 > 0:
        direction = 1
    else:
        direction = 0
    direction_of_3.append(direction)

dataset["direction_of_3"] = direction_of_3

しかし、コードに書いた通り、先に関数として定義しておき、その後にapplyを用いて適用しようとすると、エラーが起きてしまいます。
今回のコードがうまくいかない原因と、applyをうまくいくようにするための方法、またapplyの正しい使い方について、教えていただけますと幸いです。

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

Jupiter notebook を使用しています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • tiitoi

    2019/02/09 00:13

    質問欄に読み込んだ元データを追記できますか?

    キャンセル

  • J1N

    2019/02/09 00:25

    ご覧いただき、ありがとうございます。
    元データの画像を質問に追加しました。
    まだ初心者のため、pandasで編集を加えた別ファイルとして保存する方法とそれをこのサイトにアップする方法を知らない状況です。
    元データをアップする手順をもし教えていただけましたら、取り掛かってみます。
    大変お手数をおかけしますが、よろしくお願いいたします。

    キャンセル

  • tiitoi

    2019/02/09 00:29

    ファイルアップする機能はないですが、質問欄を編集して、markdown 記法で生のCSVデータをそのまま貼り付ければいいと思います。(長い場合は最初の20行ぐらいを抜粋)

    https://qiita.com/kamorits/items/6f342da395ad57468ae3#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5

    キャンセル

  • J1N

    2019/02/09 01:01 編集

    最初の20行を抜粋して記載してみました。
    いかがでしょうか?

    キャンセル

回答 1

checkベストアンサー

+1

DataFrame.apply() 関数は axis で指定した方向の各行 (列) ごとに関数を呼び出して変換が行われます。
関数の引数はこの場合、Series になります。

df = pd.DataFrame(data=[[1, 2, 3], [4, 5, 6]], columns=['a', 'b', 'c'])
df
    a   b   c 
 1   1   2   3 
 2   4   5   6 

axis=0 の場合、列ごとに適用 (デフォルト)

def func(x):
    return x - x.max()

df.apply(func, axis=0)
    a   b   c 
 1   -4   0   -2 
 2   -6   0   -2 

axis=1 の場合、行ごとに適用

def func(x):
    return x - x.max()

df.apply(func, axis=1)
    a   b   c 
 1   -1   -3   -3 
 2   0   0   0 

なので、DataFrame.apply() の結果をある列に入れてる以下のコードは
Series に DataFrame を代入していることになり、おかしいのではないでしょうか?

dataset["direction_of_3"] = dataset.apply(direction_of_3)

ある列 (行) だけに適用したい場合は Series の apply 関数を呼び出してください

def func(x):
    return 2 * x

df['a'] = df['a'].apply(func)
df
    a   b   c 
 1   2   5   8 
 2   4   8   6 

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/09 12:18

    教えていただき、ありがとうございます。
    非常によく理解できました。

    キャンセル

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

  • Python 3.x

    9765questions

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

  • pandas

    894questions

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