質問編集履歴
2
追加
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
書式を改善しました
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
|
-
|
29
|
+
式がややこしいですが、dates, sector_namesの要素ごとに、zcolumnが上位2割の数値を取り出して計算してafterdf2[wcolumn]というところに数値を返しています。
|