Python Pandas で Split-Apply-Combine パラダイムを利用しようとすると、いくつかの奇妙な動作に気付きました - 変数x
が正しい長さになりません!
私が達成しようとしていることの概要:
- groupby() 操作を使用して、複数の会社のデータを含むデータフレームをグループに分割します (会社ごとに 1 つ)。
- 各グループの情報余剰を計算する
- 結果を含む新しいデータフレームを返す
最初のグループの計算は完璧です。ただし、2番目のグループでは、データフレームをスライスするときに前の変数の長さを継承しているようです-これはなぜですか? コードと提供されたデバッグからわかるように、私は問題を特定しようとしましたが、それを見ることができません。
関数呼び出し:
data_nasdaq_top_100_preprocessed_mi_res = sentisignal.split_apply_combine(data_nasdaq_top_100_preprocessed_merge, 'SYMBOL', sentisignal.information_surplus, 10, 'PCA_SENTIMENT', 'PCA_FINANCE', -1, True)
デバッグ (および問題):
最初のグループ:
['AAL'] exante True
len(df.index) 928
shift_x length 928
len(x.index) 927 len(x) 927 end_index 927
len(x) 927
doane 927
success
2 番目のグループ:
['AAPL'] exante True
len(df.index) 1006
shift_x length 1006
len(x.index) 78 len(x) 78 end_index 1005
len(x) 78
doane 78
success
これが問題です - 何らかの理由で の長さx
が 78 に減り (1005 になるはずです!)、不思議なことに 1006 - 928 = 78 (最初のグループの長さ - 2 番目のグループの長さ)
コード:
分割適用結合方法
def split_apply_combine(df, key, func, *args):
# print "args:", args
return df.groupby(key).apply(func, *args)
情報余剰方式(デバッグあり)
def information_surplus(df, time_shift, varx, vary, bins, exante):
print df.SYMBOL.unique(), "exante ", exante
output = []
if exante:
shift_range = range(0, -(time_shift+1), -1)
else:
shift_range = range(0, time_shift+1)
print "len(df.index)", len(df.index)
for i in shift_range:
if abs(i) > len(df.index):
break
shift_x = df[varx].shift(i)
print "shift_x length", len(shift_x)
if exante:
end_index = (len(shift_x.index) - 1 - abs(i))
x = shift_x.ix[1:end_index]
y = df[vary].ix[1:end_index]
print "len(x.index)", len(x.index), "len(x)", len(x), "end_index", end_index
else:
print "exec"
x = shift_x.ix[1+abs(i):]
y = df[vary].ix[1+abs(i):]
mi = calc_mutual_information(x, y, bins)
if i == 0:
mi_origin = mi
if mi_origin == 0:
inf_surp_pct = 0
else:
inf_surp_pct = (mi - mi_origin) / mi_origin * 100
output.append({'SHIFT': i, 'MUTUAL_INFORMATION': mi, 'INFORMATION_SURPLUS_DIFF': mi - mi_origin, 'INFORMATION_SURPLUS_PCT': inf_surp_pct})
output_frame = pd.DataFrame(output)
return output_frame
相互情報法
def calc_mutual_information(x, y, bins):
print "len(x)", len(x)
try:
if bins == -1:
bins = doane_bin(x)
if bins == np.inf:
bins = sturges_bin(x)
except ValueError:
bins = 10.0
# print "bins", bins
try:
c_xy = np.histogram2d(x, y, bins)[0]
mi = metrics.mutual_info_score(None, None, contingency=c_xy)
print "success"
except Exception,e:
print "error with mi calc", str(e)
mi = 0
return mi