実現したいこと
pandasでa列のn行目の値を基準にして、そこからn行目以降の別のb, c列の2列との値の差を
n+1行目、n+2行目、n+3行目・・・・
と順番に求めていき
その2列との差のどちらかがこちらが事前に指定していた値を上回った場合、その時点で処理を終了して
また、a列のn+1行目以降の任意の行の値を基準にしてb,c列との値の差を求めていくという作業を延々と繰り返していきたいのですが
以前はこの作業をfor文を使ってやっていたのですが
pandasでfor文は処理が遅くなるから極力使わない方がいいという記事を目にしたのでfor文以外でこの処理を実現したいです
※上記の文章だけでは処理が分かりにくいと思うので下記に例を書きます
基準値=[86.162, 86.843, 87.345, 88.314, 87.977, 87.204, 87.909, 88.355, 88.128]
高値 = [86.988, 87.601, 88.554, 88.486, 88.197, 88.110, 88.502, 88.578, 88.610]
低値 = [86.066, 86.604, 87.276, 87.811, 86.855, 87.017, 87.711, 87.481, 87.982]
例えばこの様なデータフレームがある場合
基準値2行目の87.345を取り出し
そこから高値or低値の差を高値なら「2行目」の88.554との差1.209を
低値なら「2行目」の87.276との差0.07を求めます
この時高値なら1.3以上の差。低値なら0.2以上の差をを超えない限り順番に同じ作業を繰り返していきます
なので次は
高値なら「3行目」の88.486との差1.141。低値なら87.811との差0.466を求め
この時低値との差が0.2以上なのでこの時点で処理を終了し
そこからまた次の指定した行。例えば5行目の基準値87.204を取り出して
高値なら「5行目」の88.110との差0.299。低値なら87.017との差0.794を求め
低値との差が0.2を超えているので処理を終了し
また次の指定した行で同じ作業を行う
この作業をfor文を使わずに高速化したいのですが何かいい方法はありますでしょうか?
※
いくつか補足すると
・「基準値」の行を選ぶ順番は必ず昇順になっています
なので153行目を選んだ後に120行目を指定するといった事はありません
・基準値を元に高値と低値で差を求める際、基準値がある同じ行から比較が始まり
それ以降は条件を満たさない限りそこから昇順に行は進んでいきます
・高値と低値で同時に条件を満たした場合の処理はまだ考えていませんがここでは一旦
両者の差を求めた時点で終了し、また次の行に飛ぶ事にします
発生している問題・分からないこと
一つ前に書いた通りになります
該当のソースコード
#該当のデータフレームの一部を張っておきます list1=[86.162, 86.843, 87.345, 88.314, 87.977, 87.204, 87.909, 88.355, 88.128, 88.416, 88.737, 87.698, 87.818, 88.479, 88.965, 89.395, 89.314, 88.654, 88.170, 87.705, 86.922, 87.116, 88.200, 88.270, 87.682, 87.030, 87.372, 87.286, 87.445, 87.734, 87.623, 87.012, 86.185, 86.823, 88.284, 88.095, 87.065, 86.609, 86.382, 86.944, 86.871, 86.927, 87.107, 86.762, 86.932, 86.588, 86.824, 86.367, 86.120, 86.625, 86.682, 86.543, 86.332, 86.407, 86.556, 87.058, 87.013, 86.795, 86.878, 86.933, 86.865, 86.656, 86.493, 86.470, 86.700, 86.779, 87.195, 87.130, 87.174, 87.291, 87.721, 87.873, 87.490, 88.338, 88.792, 88.567, 88.542, 88.957, 89.587, 89.063, 88.007, 88.102, 88.548, 88.935, 89.387, 89.860, 89.745, 88.739, 88.243, 88.564, 88.286, 87.712, 87.546, 87.327, 87.462, 87.562, 87.106, 87.482, 86.853, 87.067] list2 = [86.988, 87.601, 88.554, 88.486, 88.197, 88.110, 88.502, 88.578, 88.610, 88.971, 88.826, 88.021, 88.638, 89.059, 89.590, 89.691, 89.395, 88.836, 88.616, 87.936, 87.243, 88.336, 88.685, 88.364, 87.983, 87.679, 87.872, 87.899, 87.775, 87.976, 87.767, 87.782, 86.929, 88.490, 88.586, 88.211, 87.455, 87.040, 87.011, 87.305, 87.222, 87.787, 87.222, 86.983, 87.232, 87.148, 86.942, 86.500, 86.730, 86.940, 86.875, 86.738, 86.608, 86.805, 87.115, 87.522, 87.190, 87.052, 87.131, 87.050, 86.944, 86.867, 87.255, 86.919, 86.901, 87.310, 87.444, 87.627, 87.444, 87.830, 88.314, 88.245, 88.730, 88.895, 88.958, 88.769, 89.126, 90.197, 89.885, 89.218, 88.340, 88.584, 89.625, 89.485, 89.917, 89.922, 89.829, 88.811, 88.690, 88.637, 88.581, 87.796, 87.607, 87.665, 87.800, 87.949, 87.646, 87.680, 87.416, 88.329] list3 = [86.066, 86.604, 87.276, 87.811, 86.855, 87.017, 87.711, 87.481, 87.982, 88.229, 87.606, 87.597, 87.749, 88.477, 88.829, 89.139, 88.529, 88.168, 87.654, 86.704, 86.224, 87.047, 87.811, 87.456, 86.461, 86.896, 87.176, 87.032, 87.044, 87.548, 87.002, 85.698, 84.935, 86.635, 87.820, 86.879, 86.399, 86.259, 86.343, 86.324, 86.651, 86.792, 86.575, 86.274, 86.585, 86.381, 86.307, 85.984, 85.794, 86.481, 86.183, 86.235, 86.162, 86.390, 86.417, 86.855, 86.491, 86.546, 86.757, 86.302, 86.529, 86.424, 86.400, 86.450, 86.510, 86.703, 86.996, 87.025, 87.081, 87.133, 87.603, 87.274, 87.388, 88.180, 88.495, 88.273, 88.395, 88.844, 88.983, 87.076, 87.581, 87.989, 88.464, 88.871, 89.155, 89.490, 88.720, 87.974, 88.178, 87.698, 87.685, 87.123, 87.180, 87.095, 87.347, 87.016, 86.782, 86.830, 86.853, 87.018] colum =["基準値", "高", "低"] pd.DataFrame(data=zip(list1, list2, list3), columns=colum)
試したこと・調べたこと
上記の詳細・結果
ネットでいくつか調べてみたがfor文以外で特にいい方法が思いつきませんでした
補足
特になし

0 コメント