Search code examples
csvpython-3.xpandasstockticker

Cannot process a csv file into a pandas with tickers, and fetch stock-info from the DataFrame


I am trying to import a list of stock-tickers (the line that is #symbols_list...read_csv..), and fetch stock-info on that date into a pandas.

import datetime
import pandas as pd
from pandas import DataFrame
from pandas.io.data import DataReader

#symbols_list = [pd.read_csv('Stock List.csv', index_col=0)]
symbols_list = ['AAPL', 'TSLA', 'YHOO','GOOG', 'MSFT','ALTR','WDC','KLAC']
symbols=[]

start = datetime.datetime(2014, 2, 9)
#end = datetime.datetime(2014, 12, 30)

for ticker in symbols_list:
    r = DataReader(ticker, "yahoo",
                   start = start)
                   #start=start, end)
    # add a symbol column
    r['Symbol'] = ticker
    symbols.append(r)
# concatenate all the dfs
df = pd.concat(symbols)
#define cell with the columns that i need
cell= df[['Symbol','Open','High','Low','Adj Close','Volume']]
#changing sort of Symbol (ascending) and Date(descending) setting Symbol as first column and changing date format
cell.reset_index().sort(['Symbol', 'Date'], ascending=[1,0]).set_index('Symbol').to_csv('stock.csv', date_format='%d/%m/%Y')

The input file Stock list.csv has the following content with these entries on each their separate row:

Index
MMM
ABT
ABBV
ACE
ACN
ACT
ADBE
ADT
AES
AET
AFL
AMG

and many more tickers of interest.

When run with the manually coded list

symbols_list = ['AAPL', 'TSLA', 'YHOO','GOOG', 'MSFT','ALTR','WDC','KLAC']

It all works fine and processes the input and stores it to a file, But whenever I run the code with the read_csv from file, I get the following error:

runfile('Z:/python/CrystallBall/SpyderProject/getstocks3.py', wdir='Z:/python/CrystallBall/SpyderProject') Reloaded modules: pandas.io.data, pandas.tseries.common Traceback (most recent call last):

  File "<ipython-input-32-67cbdd367f48>", line 1, in <module>
    runfile('Z:/python/CrystallBall/SpyderProject/getstocks3.py', wdir='Z:/python/CrystallBall/SpyderProject')

  File "C:\Program Files (x86)\WinPython-32bit-3.4.2.4\python-3.4.2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 601, in runfile
    execfile(filename, namespace)

  File "C:\Program Files (x86)\WinPython-32bit-3.4.2.4\python-3.4.2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 80, in execfile
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)

  File "Z:/python/CrystallBall/SpyderProject/getstocks3.py", line 35, in <module>
    cell.reset_index().sort(['Symbol', 'Date'], ascending=[1,0]).set_index('Symbol').to_csv('stock.csv', date_format='%d/%m/%Y')

  File "C:\Users\Morten\AppData\Roaming\Python\Python34\site-packages\pandas\core\generic.py", line 1947, in __getattr__
    (type(self).__name__, name))

AttributeError: 'Panel' object has no attribute 'reset_index'

Why can I only process the symbol_list manually laid out, and not the imported tickers from file?

Any takers? Any help greatly appreciated!


Solution

  • Your code has numerous issues which the following code has fixed and works:

    In [4]:
    
    import datetime
    import pandas as pd
    from pandas import DataFrame
    from pandas.io.data import DataReader
    
    temp='''Index
    MMM
    ABT
    ABBV
    ACE
    ACN
    ACT
    ADBE
    ADT
    AES
    AET
    AFL
    AMG'''
    
    df = pd.read_csv(io.StringIO(temp), index_col=[0])
    symbols=[]
    
    start = datetime.datetime(2014, 2, 9)
    
    for ticker in df.index:
        r = DataReader(ticker, "yahoo",
                       start = start)
                       #start=start, end)
        # add a symbol column
        r['Symbol'] = ticker
        symbols.append(r)
    # concatenate all the dfs
    df = pd.concat(symbols)
    #define cell with the columns that i need
    cell= df[['Symbol','Open','High','Low','Adj Close','Volume']]
    #changing sort of Symbol (ascending) and Date(descending) setting Symbol as first column and changing date format
    cell.reset_index().sort(['Symbol', 'Date'], ascending=[1,0]).set_index('Symbol').to_csv('stock.csv', date_format='%d/%m/%Y')
    cell
    Out[4]:
               Symbol    Open    High     Low  Adj Close   Volume
    Date                                                         
    2014-02-10    MMM  129.65  130.41  129.02     126.63  3317400
    2014-02-11    MMM  129.70  131.49  129.65     127.88  2604000
    ...           ...     ...     ...     ...        ...      ...
    2015-02-06    AMG  214.35  215.82  212.64     214.45   424400
    
    [3012 rows x 6 columns]
    

    So firstly this: symbols_list = [pd.read_csv('Stock List.csv', index_col=0)]

    This will create a list with a single entry which will be a df with no columns and just an index of your ticker values.

    This: for ticker in symbols_list:

    won't work because the iterable object that is returned from the df is the column and not each entry, in your case you need to iterate over the index which is what my code does.

    I'm not sure what you wanted to achieve, it isn't necessary to specify that index_col=0 if there is only one column, you can either create a df with just a single column, or if you pass squeeze=True this will create a Series which just has a single column.