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

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

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

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

pandas

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

Q&A

解決済

2回答

424閲覧

Pandas DFの値がリストの場合に、そのリスト内要素の条件で取得

666_paru

総合スコア20

Python

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

pandas

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

0グッド

0クリップ

投稿2020/09/23 04:43

以下のようなFXのバックテストの結果のCSVをDFで読み込み、集計を行っております。
今、困っているのが、要素がリストの場合に上手く操作できずに詰まっております。

python

1 WINorLOSE BUYorSELL Talibシグナル \ 2370 LOSE SELL ['Belthold' 'integer' 'LongLineCandle' 'Marubozu'] 3371 LOSE SELL ['Hikkake'] 4372 LOSE SELL ['Belthold' 'Hikkake'] 5373 LOSE SELL ['GapThreeMethods'] 6374 WIN BUY ['Doji' 'Gravestone' 'LongLeggedDoji'] 7 8 Talib_Value 9370 [-100 -100 -100 -100] 10371 [-100] 11372 [-100 -200] 12373 [-100] 13374 [100 100 100]

パターンは以下のようになっています。

python

1ペア: ["USD_JPY", "EUR_USD"...] 2時間軸:["H","4H"] 3MACD判定サイズ:[21, 36, 45] 4トレンド判定:[1,-1] 5BUYかSELLか 6Talibシグナル:["TwoCrows", "ThreeBlackCrows", "ThreeInside", "ThreeLineStrike", "ThreeOutside", 7"ThreeStarsInTheSouth", "ThreeAdvancingWhiteSoldiers", "AdvanceBlock", "Belthold", "Breakaway", 8"integer", "DarkCloudCover", "Doji", "DojiStar", "DragonflyDoji", "Engulfing","EngulfingDojiStar", 9"EveningStar", "whitelines", "Gravestone", "Hammer", "HangingMan", "Harami", "HaramiCross", "HighWave", "Hikkake", "ModifiedHikkake", "Pigeon", "IdenticalThreeCrows", "InNeck", InvertedHammer", 10"LadderBottom", "LongLeggedDoji", "LongLineCandle","Marubozu", "MatchingLow", "MorningDojiStar", 11"MorningStar", "OnNeck", "Piercing", "Rickshaw", "ThreeMethods", "Separating", "ShootingStar", 12"ShortLineCandle", "Spinning", "Stalled", "Sandwich", "Takuri", "TasukiGap", "Thrusting", "Tristar", 13 "Unique", "GapThreeMethods"] 14Talib_Value:["100", "200", "-100", "-200"]

ここから集計して、CSVに出力するのですが、欲しいのは、
ペア、時間軸、MACDの判定サイズ、トレンド判定、BUYかSELLか Talibシグナル、Talib_Valueの組み合わせ毎に、
エントリー回数、勝率、勝率n%以上のTalibシグナルのリスト、勝率n%以下のTalibシグナルのリストです。

例1:
ペア:"USD_JPY"
時間軸:"H"
MACD:21
トレンド判定:1
BUYかSELL:"BUY"
Talibシグナル:"Hikkake"
Talib_Value:"-100"
出力→エントリー回数,勝率、高・低勝率のシグナルのリスト

例2:
ペア:"USD_JPY"
時間軸:"H"
MACD:21
トレンド判定:1
BUYかSELL:"BUY"
Talibシグナル:"Hikkake"
Talib_Value:"-200"
出力→エントリー回数,勝率、高・低勝率のシグナルのリスト

です。

問題なのが、Talibシグナル、Talib_Valueでして、リストで出力されたのをそのままDFに入れてCSVにしています。
読み込むと、372番は"['Belthold' 'Hikkake'] "と"[-100 -200]"という文字列の状態です。

このエントリーの時に、エントリーするか判定するメソッドで、
'Belthold'は-100、'Hikkake'は-200となっています。
その為、Hikkakeの-200の勝率を出すときに、TalibシグナルとTalib_Valueを文字列からリスト化して、'Hikkake'のインデックスを取得し、Talib_Valueのインデックスの値が-200かを判定する処理が必要になり、このあたりでうまく作れなくなりました。

作成したもの

python

1#文字列をリスト化 2df["Talib_Value"] = df["Talib_Value"].str.strip('[]').str.replace(' ', ',').str.split(',') 3df["Talibシグナル"] = df["Talibシグナル"].str.strip('[]').str.replace(' ', ',').str.replace("'", '').str.split(',') 4 5TalibMethod = "Hikkake" 6Talib_Values = ["100", "200", "-100", "-200"] 7BUYorSELLs = ["BUY", "SELL"] 8 9TV = Talib_Values[1] 10BorS = BUYorSELLs[0] 11 12dfBuy100 = df[["WINorLOSE", "BUYorSELL", "Talibシグナル", "Talib_Value"]][(df['Talibシグナル'].astype("str").str.contains(TalibMethod)) & (df["BUYorSELL"] == BorS)] 13 14print(dfBuy100[40:45]) 15 16----------出力---------- 17 18 WINorLOSE BUYorSELL Talibシグナル \ 19371 LOSE SELL [Hikkake] 20372 LOSE SELL [Belthold, Hikkake] 21387 LOSE SELL [Hikkake] 22398 WIN SELL [Hikkake] 23429 WIN SELL [Belthold, integer, Hikkake, LongLineCandle, M... 24 25 Talib_Value 26371 [-100] 27372 [-100, -200] 28387 [-100] 29398 [-100] 30429 [-100, -100, -100, -100, -100] 31

あとはTalibシグナルのインデックスを取得して、Talib_Valueのインデックスの値と比較してのbool配列取得でいいと思うのですが、うまくできず、お教え頂きたく思います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

リストにしてあるので、インデックスを取得し、for文の力技で解決しました。

投稿2020/09/28 16:47

666_paru

総合スコア20

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

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

0

csvを文字列としてDataFrameに変換した直後に、以下の処理を入れてください。

Python

1df['Talibシグナル'] = df['Talibシグナル'].str.strip('[]').str.split(' ') 2df['Talib_Value'] = df['Talib_Value'].str.strip('[]').str.split(' ')

すると、Talibシグナル、Talib_Valueの列は、文字列がリストに変換され、DataFrameに内包された形になります。
あとは、気持ちよくデータ処理ができると思います。

投稿2020/09/23 11:32

toast-uz

総合スコア3266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問