sho73movie
@sho73movie

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

streamlit sharingにアップした場合にのみエラー発生します。

解決したいこと

streamlit sharingにアップした場合にのみエラーが発生するのを解決したいです。

vscodeのterminalでstreamlit runして開発中は問題なかったのですがstreamlit sharingにアップしたところエラーが発生しました。

windows
pyhon3

発生している問題・エラー

以下streamlitの画面
image.png

上記からアクセスすると下記のようにエラー発生します。

ModuleNotFoundError: This app has encountered an error. The original error message is redacted to prevent data leaks. Full error details have been recorded in the logs (if you're on Streamlit Cloud, click on 'Manage app' in the lower right of your app).
Traceback:
File "/home/appuser/venv/lib/python3.7/site-packages/streamlit/script_runner.py", line 379, in _run_script
    exec(code, module.__dict__)
File "/app/stock_price/app.py", line 2, in <module>
    import yfinance as yf

該当するソースコード

import pandas as pd
import yfinance as yf
import altair as alt
import streamlit as st

st.title('米国株価可視化アプリ')

st.sidebar.write("""
# GAFA株価
こちらは株価可視化ツールです。以下のオプションから表示日数を指定できます。
""")

st.sidebar.write("""
## 表示日数
""")

days = st.sidebar.slider('日数',1,50,20)

st.write(f"""
### 過去 **{days}日間** のGAFA株価
""")

@st.cache
def get_data(days,tickers):
    df = pd.DataFrame()
    for company in tickers.keys():
        tkr = yf.Ticker(tickers[company])
        hist = tkr.history(period=f'{days}d')
        hist.index = hist.index.strftime('%d %B %Y')
        hist = hist[['Close']]
        hist.columns = [company]
        hist = hist.T
        hist.index.name = 'Name'
        df = pd.concat([df,hist])
    return df

try:
    st.sidebar.write("""
    ## 株価の範囲指定
    """)
    ymin,ymax = st.sidebar.slider(
        '範囲を指定してください。',
        0.0,3500.0,(0.0,3500.0)
    )

    tickers = {
        'apple' : 'AAPL',
        'facebook' : 'FB',
        'google':'GOOGL',
        'microsoft':'MSFT',
        'netflix':'NFLX',
        'amazon':'AMZN'
    }
    df = get_data(days,tickers)
    companies = st.multiselect(
        '会社名を選択してください。',
        list(df.index),
        ['google','amazon','facebook','apple'] #デフォルトの指定
    )
    #companiseに何も入っていない時の処理
    if not companies:
        st.error('少なくとも一社は選んでください。')
    #選択された企業を表示させる
    else:
        data = df.loc[companies]
        st.write('### 株価(USD)',data.sort_index())
        data = data.T.reset_index()
        data = pd.melt(data,id_vars=['Date']).rename(
            columns = {'value':'Stock Prices(USD)'}
        )
        chart = (
            alt.Chart(data)
            .mark_line(opacity=0.8,clip=True)
            .encode(
                x='Date:T',
                y=alt.Y('Stock Prices(USD):Q', stack = None, scale = alt.Scale(domain=[ymin,ymax])),
                color='Name:N'
            )
        )
        st.altair_chart(chart,use_container_width=True)
except:
    st.error(
        'おっと!なにかエラーが起きているようです。'
    )

0

2Answer

分かっているわけじゃないですが・・・
import yfinance as yf でエラー発生しているので、ライブラリをインストールしてないとかパスが違ってる気がしますが、確認されましたでしょうか?
import yfinance as yf の1行だけのプログラムを実行できるか確認してみてはいかがでしょうか?

0Like

Comments

  1. サーバ側にインストールされていないのではありませんか?
    requirements.txt に必要なパッケージを記述していますか?
  2. @sho73movie

    Questioner

    requirements.txt を用意しておらず、pandas、yfinance、altair、streamlitすべて記載し
    githubで更新したうえで再度streamlitへアップロードしましたが同じエラーがでてしまいました・・・
  3. @sho73movie

    Questioner

    解決できました。
    Git Hub側でrequirements.txtの内容(pandas、yfinance、altair、streamlitの記載)が更新されてなかったことが原因でした。

ご回答ありがとうございます。
terminalでpip listするとyfinanceが入っていることが確認できるのでライブラリはインストールされております。

また、terminalで以下のようにパスを確認できますがこれと何を比べればいいのでしょうか。

>>> import yfinance
>>> print(yfinance.__file__)
C:\anaconda3\lib\site-packages\yfinance\__init__.py

初学者なため、教えていただきたいです。

0Like

Your answer might help someone💌