質問編集履歴

2

追加

2017/08/30 17:47

投稿

Hidd
Hidd

スコア11

test CHANGED
File without changes
test CHANGED
@@ -27,3 +27,37 @@
27
27
 
28
28
 
29
29
  式がややこしいですが、dates, sector_namesの要素ごとに、zcolumnが上位2割の数値を取り出して計算してafterdf2[wcolumn]というところに数値を返しています。
30
+
31
+
32
+
33
+ 【上記と似たコードですが追加で質問です】
34
+
35
+ 上記については、教えて頂いた通りにgroupby, transform, np.whereを組み合わせることで計算時間が数十分の1に改善しました。ありがとうございます。
36
+
37
+ 他のコードも同様に修正できたのですが、どうしても以下のコードが修正できません。上記のコードとほぼ一緒で、DATE, SECTORでgroupby()をするというところまでは同じだと思うのですが、zcolumnの上位20%の行のMKT_CAPという列の数字を操作するところが違い上手くいきません。
38
+
39
+ ```Python
40
+
41
+ for (wcolumn, zcolumn) in zip(WM_columns, Z_columns):
42
+
43
+ afterdf2[wcolumn] = 0.0
44
+
45
+ for date1 in dates:
46
+
47
+ for name1 in sector_names:
48
+
49
+ z20sum = afterdf2[(afterdf2.DATE == date1) & (afterdf2.SECTOR == name1) & (afterdf2[zcolumn] >= np.percentile(afterdf2[(afterdf2.DATE == date1) & (afterdf2.SECTOR == name1)].ix[:, zcolumn],80))].ix[:,'MKT_CAP'].sum()
50
+
51
+ afterdf2[wcolumn] = np.where((afterdf2.DATE == date1) & (afterdf2.SECTOR == name1) & (afterdf2[zcolumn] >= np.percentile(afterdf2[(afterdf2.DATE == date1) & (afterdf2.SECTOR == name1)].ix[:, zcolumn],80)), afterdf2['MKT_CAP'] / z20sum * afterdf2['Sectorweight'] , afterdf2[wcolumn] )
52
+
53
+ ```
54
+
55
+ 教えて頂いたコードを参考に以下のように直してみたのですが、文法的に間違っているのか、TypeError: Transform function invalid for data typesというエラーになります。もし解決法がお分かりでしたら教えて頂けると大変助かります。よろしくお願いします。
56
+
57
+
58
+
59
+ ```Python
60
+
61
+ afterdf2.groupby(['DATE','SECTOR'])[[zcolumn,'MKT_CAP']].transform(lambda d,m : np.where(d >= d.quantile(0.8), m / m[d >= d.quantile(0.8)].sum(), 0))
62
+
63
+ ```

1

書式を改善しました

2017/08/30 17:47

投稿

Hidd
Hidd

スコア11

test CHANGED
File without changes
test CHANGED
@@ -5,6 +5,8 @@
5
5
  よろしくお願いします。
6
6
 
7
7
 
8
+
9
+ ```Python
8
10
 
9
11
  for (wcolumn, zcolumn) in zip(W_columns, Z_columns):
10
12
 
@@ -20,4 +22,8 @@
20
22
 
21
23
 
22
24
 
25
+ ```
26
+
27
+
28
+
23
- #式がややこしいですが、dates, sector_namesの要素ごとに、zcolumnが上位2割の数値を取り出して計算してafterdf2[wcolumn]というところに数値を返しています。
29
+ 式がややこしいですが、dates, sector_namesの要素ごとに、zcolumnが上位2割の数値を取り出して計算してafterdf2[wcolumn]というところに数値を返しています。