मेरे पास IPython में निम्नलिखित डेटा फ़्रेम है, जहाँ प्रत्येक पंक्ति एक एकल स्टॉक है:
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)
मैं एक ग्रुपबी ऑपरेशन लागू करना चाहता हूं जो "वार्षिक" कॉलम में प्रत्येक तिथि के अनुसार, हर चीज में कैप-वेटेड औसत रिटर्न की गणना करता है।
यह उम्मीद के मुताबिक काम करता है:
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
लेकिन फिर मैं मूल डेटा फ़्रेम में इन मानों को "ब्रॉडकास्ट" पर वापस सॉर्ट करना चाहता हूं, और उन्हें निरंतर कॉलम के रूप में सहेजता हूं जहां तिथियां मेल खाती हैं।
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
मुझे एहसास है कि इस भोले काम को काम नहीं करना चाहिए। लेकिन मूल डेटाफ़्रेम पर एक नए कॉलम में एक ग्रुपबी ऑपरेशन के परिणाम को निर्दिष्ट करने के लिए "सही" पंडों का मुहावरा क्या है?
अंत में, मैं चाहता हूं कि "MarketReturn" नामक एक कॉलम उन सभी सूचकांकों के लिए एक निरंतर स्थिर मूल्य होगा जो ग्रुपबी ऑपरेशन के आउटपुट के साथ मिलान की तारीख है।
इसे प्राप्त करने के लिए एक हैक निम्नलिखित होगा:
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]
लेकिन यह धीमा, बुरा और unPythonic है।