【问题标题】:How to pass a variable as an argument of another function in python如何将变量作为python中另一个函数的参数传递
【发布时间】:2022-01-19 15:27:39
【问题描述】:

我有一个列表 (chart_list),我想一个一个地调用它们并绘制图表,但我遇到了一个错误。我该如何处理这个问题?我知道它们是字符串,但我不知道如何将其提供给tickerDf。

    
    import streamlit as st
    import yfinance as yf
    import pandas as pd
    import datetime
    
    
      
    cols = st.columns(2)
    
    # define the ticker symbol
    tickerSymbol = cols[0].text_input("Symbol:", 'GOOG')
    st.markdown(f'Shown are the **stock closing** price and **volume** of **{tickerSymbol}**')
    
    # get data on this ticker
    tickerData = yf.Ticker(tickerSymbol)
    
    period_list = ['1d', '5d']
    selected_period = cols[0].selectbox("Period:", period_list)
    
    interval_list = ['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']
    selected_interval = cols[1].selectbox("Interval", interval_list)
    
    today = datetime.date.today()
    yesterday = today + datetime.timedelta(days=-10)
    start_date = cols[0].date_input('Start date', yesterday)
    end_date = cols[1].date_input('End date', today)
    if start_date > end_date:
        st.error("Error: End date must fall after start date")
    
    # get the historical prices for this ticker
    tickerDf = tickerData.history(interval=selected_interval, start=start_date, end=end_date)
    # Open High Low Close Volume Dividends Stock Splits
    
    chart_list = ['Open', 'High', 'Low', 'Close', 'Volume']
    selected_charts = st.multiselect("Charts", chart_list)
    
    if st.button("Show"):
        for chart in chart_list:
            st.line_chart(tickerDf.chart)
            st.write(f"## {chart}")

【问题讨论】:

  • 你能分享一下错误吗?
  • AttributeError: 'DataFrame' 对象没有属性 'chart'

标签: python streamlit yfinance


【解决方案1】:

您不能像这样 (st.line_chart(tickerDf.chart)) 对数据框进行索引,因为这是列名的文字说明。

改用st.line_chart(tickerDf[chart])

【讨论】:

    【解决方案2】:

    问题是你如何在这个循环中访问数据框:

    for chart in chart_list:
        st.line_chart(tickerDf.chart)
        st.write(f"## {chart}")
    

    改成这样:

    for chart in selected_charts:
        st.write(f"## {chart}")
        st.line_chart(tickerDf[chart])
    

    工作代码:

    import streamlit as st
    import yfinance as yf
    import pandas as pd
    import datetime
    
    
    
    cols = st.columns(2)
    
    # define the ticker symbol
    tickerSymbol = cols[0].text_input("Symbol:", 'GOOG')
    st.markdown(f'Shown are the **stock closing** price and **volume** of **{tickerSymbol}**')
    
    # get data on this ticker
    tickerData = yf.Ticker(tickerSymbol)
    
    period_list = ['1d', '5d']
    selected_period = cols[0].selectbox("Period:", period_list)
    
    interval_list = ['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']
    selected_interval = cols[1].selectbox("Interval", interval_list)
    
    today = datetime.date.today()
    yesterday = today + datetime.timedelta(days=-10)
    start_date = cols[0].date_input('Start date', yesterday)
    end_date = cols[1].date_input('End date', today)
    if start_date > end_date:
        st.error("Error: End date must fall after start date")
    
    # get the historical prices for this ticker
    tickerDf = tickerData.history(interval=selected_interval, start=start_date, end=end_date)
    # Open High Low Close Volume Dividends Stock Splits
    
    chart_list = ['Open', 'High', 'Low', 'Close', 'Volume']
    selected_charts = st.multiselect("Charts", chart_list)
    
    if st.button("Show"):
        for chart in selected_charts:
            st.write(f"## {chart}")
            st.line_chart(tickerDf[chart])
    

    输出示例:

    【讨论】:

    • 非常感谢。
    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多