Background: After upgrading Pandas from version 0.11 to 0.13.0rc1, my application started generating new warnings, such as:
E:\FinReporter\FM_EXT.py:449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
quote_df['TVol'] = quote_df['TVol'] / TVOL_SCALE
I am attempting to set a value on a copy of a slice from a DataFrame, which might not have the intended effect. This can lead to unintended consequences and bugs in my code.
Example Function Triggering the Warning
Here’s the function that generates the warning:
def _decode_stock_quote(list_of_150_stk_str):
"""Decode the webpage and return a DataFrame."""
from cStringIO import StringIO
str_of_all = "".join(list_of_150_stk_str)
quote_df = pd.read_csv(StringIO(str_of_all), sep=',', names=list('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg'))
quote_df.rename(columns={'A': 'STK', 'B': 'TOpen', 'C': 'TPCLOSE', 'D': 'TPrice', 'E': 'THigh', 'F': 'TLow', 'I': 'TVol', 'J': 'TAmt', 'e': 'TDate', 'f': 'TTime'}, inplace=True)
quote_df = quote_df.ix[:, [0, 3, 2, 1, 4, 5, 8, 9, 30, 31]]
quote_df['TClose'] = quote_df['TPrice']
quote_df['RT'] = 100 * (quote_df['TPrice'] / quote_df['TPCLOSE'] - 1)
quote_df['TVol'] = quote_df['TVol'] / TVOL_SCALE
quote_df['TAmt'] = quote_df['TAmt'] / TAMT_SCALE
quote_df['STK_ID'] = quote_df['STK'].str.slice(13, 19)
quote_df['STK_Name'] = quote_df['STK'].str.slice(21, 30)
quote_df['TDate'] = quote_df.TDate.map(lambda x: x[0:4] + x[5:7] + x[8:10])
return quote_df
More Warning Messages
E:\FinReporter\FM_EXT.py:449: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
quote_df['TVol'] = quote_df['TVol'] / TVOL_SCALE
E:\FinReporter\FM_EXT.py:450: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
quote_df['TAmt'] = quote_df['TAmt'] / TAMT_SCALE
E:\FinReporter\FM_EXT.py:453: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
quote_df['TDate'] = quote_df.TDate.map(lambda x: x[0:4] + x[5:7] + x[8:10])