Search code examples
pythonpandasdataframeyfinance

Iterate though list loop error help - Yfinance


I created a list of tickers which I'm trying to get certain information from through Yfinance. The problem I'm facing is trying to get certain data such as ebitda, enterprise value, and total assets all in one script. I've looked through plenty of material and tried different methods but I cannot figure it out.

Have a great day. Thanks!

The program that works for one request

import pandas as pd
import numpy as np
import yfinance as yf

tickers = ['AAPL', 'GOOGL', 'FB']
a = [yf.Ticker(t).info.get('ebitda', 'NaN') for t in tickers]

pd.set_option("display.max_rows", None)
df = pd.DataFrame(a, tickers, columns=['Ebitda'])
print(df)

Output

             Ebitda
AAPL   120233000960
GOOGL   85196996608
FB      54758998016

Here is what I'm trying to do that I need help on. this script results in an init() TypeError for the df variable (for pandas data frame)

import pandas as pd
import numpy as np
import yfinance as yf

tickers = ['AAPL', 'GOOGL', 'FB']

for t in tickers:
    a = yf.Ticker(t).info.get('ebitda', 'NaN')
    b = yf.Ticker(t).info.get('enterpriseValue', 'NaN')
    c = yf.Ticker(t).info.get('totalAssets', 'NaN')


pd.set_option("display.max_rows", None)  
df = pd.DataFrame(a, tickers, b, c, columns=['Ebitda', 'EnterpriseValue', 'TotalAssets',])
print(df)

Desired Output

Ticker       Ebitda    Enterprise Value    TotalAssets
AAPL   120233000960    2460000000000       323890000000
GOOGL   85196996608    1980000000000       275909000000
FB      54758998016     833000000000       133376000000


Solution

  • If you use for-loop then using normal assigment a = ... you can get only last value.

    It is standard rule: if you use for-loop then you have to use list to get all results.

    BTW: You could run Ticker(t) only once in loop - maybe it will run faster.

    import pandas as pd
    import yfinance as yf
    
    tickers = ['AAPL', 'GOOGL', 'FB']
    
    column_a = []  # <-- list for all results
    column_b = []  # <-- list for all results
    column_c = []  # <-- list for all results
    
    for t in tickers:
        print('---', t, '---')
        
        all_info = yf.Ticker(t).info
    
        a = all_info.get('ebitda', 'NaN')
        b = all_info.get('enterpriseValue', 'NaN')
        c = all_info.get('totalAssets', 'NaN')
        
        column_a.append(a)  # <-- list for all results
        column_b.append(b)  # <-- list for all results
        column_c.append(c)  # <-- list for all results
    
    #pd.set_option("display.max_rows", None)
    
    df = pd.DataFrame({
        'Tickets': tickers,
        'Ebitda': column_a,           # <-- list for all results
        'EnterpriseValue' :column_b,  # <-- list for all results
        'TotalAssets': column_c,      # <-- list for all results
    })
    print(df)
    

    EDIT:

    Eventually you could append directly to DataFrame

    First you have to create empty DataFrame but with all columns.

    Next you can append dictionary with ignore_index=True. And in DataFrame you have to assign it again to DataFrame - df = df.append(...)

    import pandas as pd
    import yfinance as yf
    
    tickers = ['AAPL', 'GOOGL', 'FB']
    
    df = pd.DataFrame(columns=['Tickets', 'Ebitda', 'EnterpriseValue', 'TotalAssets'])
    
    for t in tickers:
        print('---', t, '---')
        
        all_info = yf.Ticker(t).info
        
        a = all_info.get('ebitda', 'NaN')
        b = all_info.get('enterpriseValue', 'NaN')
        c = all_info.get('totalAssets', 'NaN')
      
        df = df.append({
            'Tickets': t,
            'Ebitda': a,
            'EnterpriseValue': b,
            'TotalAssets': c,
        }, ignore_index=True)  
    
    #pd.set_option("display.max_rows", None)
        
    print(df)