Tôi có khung dữ liệu sau trong IPython, trong đó mỗi hàng là một kho duy nhất:
In [261]: bdata
Out[261]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 21210 entries, 0 to 21209
Data columns:
BloombergTicker 21206 non-null values
Company 21210 non-null values
Country 21210 non-null values
MarketCap 21210 non-null values
PriceReturn 21210 non-null values
SEDOL 21210 non-null values
yearmonth 21210 non-null values
dtypes: float64(2), int64(1), object(4)
Tôi muốn áp dụng một phép toán theo nhóm để tính toán lợi tức trung bình có trọng số giới hạn trên mọi thứ, mỗi ngày trong cột "tháng".
Điều này hoạt động như mong đợi:
In [262]: bdata.groupby("yearmonth").apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
Out[262]:
yearmonth
201204 -0.109444
201205 -0.290546
Nhưng sau đó tôi muốn sắp xếp "phát sóng" các giá trị này trở lại các chỉ số trong khung dữ liệu ban đầu và lưu chúng dưới dạng cột không đổi nơi khớp ngày tháng.
In [263]: dateGrps = bdata.groupby("yearmonth")
In [264]: dateGrps["MarketReturn"] = dateGrps.apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/mnt/bos-devrnd04/usr6/home/espears/ws/Research/Projects/python-util/src/util/<ipython-input-264-4a68c8782426> in <module>()
----> 1 dateGrps["MarketReturn"] = dateGrps.apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
TypeError: 'DataFrameGroupBy' object does not support item assignment
Tôi nhận ra rằng nhiệm vụ ngây thơ này không nên làm việc. Nhưng thành ngữ Pandas "đúng" để gán kết quả của một phép toán theo nhóm vào một cột mới trên khung dữ liệu mẹ là gì?
Cuối cùng, tôi muốn một cột có tên "MarketReturn" sẽ là một giá trị không đổi lặp lại cho tất cả các chỉ số có ngày khớp với đầu ra của hoạt động theo nhóm.
Một mẹo để đạt được điều này sẽ như sau:
marketRetsByDate = dateGrps.apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
bdata["MarketReturn"] = np.repeat(np.NaN, len(bdata))
for elem in marketRetsByDate.index.values:
bdata["MarketReturn"][bdata["yearmonth"]==elem] = marketRetsByDate.ix[elem]
Nhưng điều này là chậm, xấu và không đẹp.