如何获取列表和字典的键

0 投票
2 回答
46 浏览
提问于 2025-04-14 18:21

我正在使用streamlit来展示我的数据框结果。

我有一段代码可以通过market.values()和timeframes.values()来选择市场和时间段。

timeframes = {
            'daily':'Daily',
            'weekly':'Weekly',
            'monthly':'Monthly',
            'quarterly':'Quarterly',
            'annually':'Annually'
        }    
markets = {
                'forex':{'Market':'Forex','Symbol':'EURUSD=X.csv','Continent':'World','Currency':'USD'},
                'crypto':{'Market':'Crypto','Symbol':'BTC-USD.csv','Continent':'World','Currency':'USD'},
                'futures':{'Market':'Futures','Symbol':'CL=F.csv','Continent':'World','Currency':'USD'},
                'indexes':{'Market':'Indexes','Symbol':'^NDX.csv','Continent':'World','Currency':'USD'},
                'etfs':{'Market':'ETFs','Symbol':'SPY.csv','Continent':'World','Currency':'USD'},
                'australia':{'Market':'Australian Stocks','Symbol':'BHP.AX.csv','Continent':'Oceania','Currency':'AUD'},
                'canada':{'Market':'Canadian Stocks','Symbol':'RY.TO.csv','Continent':'North America','Currency':'CAD'},
                'china':{'Market':'Chinese Stocks','Symbol':'600519.SS.csv','Continent':'Asia','Currency':'CNY'},
                'france':{'Market':'French Stocks','Symbol':'MC.PA.csv','Continent':'Europe','Currency':'EUR'},
                'germany':{'Market':'German Stocks','Symbol':'SAP.DE.csv','Continent':'Europe','Currency':'EUR'},
                'hongkong':{'Market':'Hong Kong Stocks','Symbol':'0941.HK.csv','Continent':'Asia','Currency':'HKD'},
                'india':{'Market':'Indian Stocks','Symbol':'RELIANCE.NS.csv','Continent':'Asia','Currency':'INR'},
                'italy':{'Market':'Italian Stocks','Symbol':'RACE.MI.csv','Continent':'Europe','Currency':'EUR'},
                'japan':{'Market':'Japanese Stocks','Symbol':'7203.T.csv','Continent':'Asia','Currency':'JPY'},
                'singapore':{'Market':'Singapore Stocks','Symbol':'D05.SI.csv','Continent':'Asia','Currency':'SGD'},
                'spain':{'Market':'Spanish Stocks','Symbol':'ITX.MC.csv','Continent':'Europe','Currency':'EUR'},
                'swiss':{'Market':'Swiss Stocks','Symbol':'NESN.SW.csv','Continent':'Europe','Currency':'CHF'},
                'unitedarabemirates':{'Market':'UAE Stocks','Symbol':'DEWA.AE.csv','Continent':'Asia','Currency':'AED'},
                'unitedkingdom':{'Market':'UK Stocks','Symbol':'AZN.L.csv','Continent':'Europe','Currency':'GBP'},
                'unitedstates':{'Market':'US Stocks','Symbol':'AAPL.csv','Continent':'North America','Currency':'USD'},
                'test':{'Market':'Test','Symbol':'AAPL.csv','Continent':'North America','Currency':'USD'}
            }    
selected_markets = st.multiselect(label='Market',options=list(markets.values()),default=list(markets.values()))
selected_timeframes = st.multiselect(label='Timeframe',options=list(timeframes.values()),default=list(timeframes.values()))

然后我有另一段代码用来读取每个选定的市场和时间段的数据csv文件。

for selected_market in selected_markets:
    for selected_timeframe in selected_timeframes:
        df = pd.read_csv('{}'.format("data/" + selected_market + "_" + selected_timeframe + ".csv"))

我遇到一个问题,因为在循环中,"selected_market"和"selected_timeframe"的值分别是"Australian Stocks"和"Daily",但是文件"Australian Stocks_Daily.csv"并不存在,我实际上有一个文件叫"australia_daily.csv"。我不知道怎么把"selected_market"和"selected_timeframe"分别对应到"market"列表和"timeframes"列表中的键。

有没有什么办法可以解决这个问题?非常感谢。

2 个回答

0

使用一个查找的 字典

markets_lookup = { val['Market']: key for key, val in markets.items()}

for selected_market in selected_markets:
    for selected_timeframe in selected_timeframes:
        key = markets_lookup[selected_market]
        df = pd.read_csv(f"data/{key}_{selected_timeframe.lower()}.csv"))

我无法测试这段代码,如果有错误请告诉我。


编辑:

markets = {
    'forex':{'Market':'Forex','Symbol':'EURUSD=X.csv','Continent':'World','Currency':'USD'},
    'crypto':{'Market':'Crypto','Symbol':'BTC-USD.csv','Continent':'World','Currency':'USD'},
    'futures':{'Market':'Futures','Symbol':'CL=F.csv','Continent':'World','Currency':'USD'},
    'indexes':{'Market':'Indexes','Symbol':'^NDX.csv','Continent':'World','Currency':'USD'},
    'etfs':{'Market':'ETFs','Symbol':'SPY.csv','Continent':'World','Currency':'USD'},
    'australia':{'Market':'Australian Stocks','Symbol':'BHP.AX.csv','Continent':'Oceania','Currency':'AUD'},
    'canada':{'Market':'Canadian Stocks','Symbol':'RY.TO.csv','Continent':'North America','Currency':'CAD'},
    'china':{'Market':'Chinese Stocks','Symbol':'600519.SS.csv','Continent':'Asia','Currency':'CNY'},
    'france':{'Market':'French Stocks','Symbol':'MC.PA.csv','Continent':'Europe','Currency':'EUR'},
    'germany':{'Market':'German Stocks','Symbol':'SAP.DE.csv','Continent':'Europe','Currency':'EUR'},
    'hongkong':{'Market':'Hong Kong Stocks','Symbol':'0941.HK.csv','Continent':'Asia','Currency':'HKD'},
    'india':{'Market':'Indian Stocks','Symbol':'RELIANCE.NS.csv','Continent':'Asia','Currency':'INR'},
    'italy':{'Market':'Italian Stocks','Symbol':'RACE.MI.csv','Continent':'Europe','Currency':'EUR'},
    'japan':{'Market':'Japanese Stocks','Symbol':'7203.T.csv','Continent':'Asia','Currency':'JPY'},
    'singapore':{'Market':'Singapore Stocks','Symbol':'D05.SI.csv','Continent':'Asia','Currency':'SGD'},
    'spain':{'Market':'Spanish Stocks','Symbol':'ITX.MC.csv','Continent':'Europe','Currency':'EUR'},
    'swiss':{'Market':'Swiss Stocks','Symbol':'NESN.SW.csv','Continent':'Europe','Currency':'CHF'},
    'unitedarabemirates':{'Market':'UAE Stocks','Symbol':'DEWA.AE.csv','Continent':'Asia','Currency':'AED'},
    'unitedkingdom':{'Market':'UK Stocks','Symbol':'AZN.L.csv','Continent':'Europe','Currency':'GBP'},
    'unitedstates':{'Market':'US Stocks','Symbol':'AAPL.csv','Continent':'North America','Currency':'USD'},
    'test':{'Market':'Test','Symbol':'AAPL.csv','Continent':'North America','Currency':'USD'}
}

markets_lookup = {val['Market']: key for key, val in markets.items()}
print(markets_lookup)

输出结果:

{'Forex': 'forex', 'Crypto': 'crypto', 'Futures': 'futures', 'Indexes': 'indexes', 'ETFs': 'etfs', 'Australian Stocks': 'australia', 'Canadian Stocks': 'canada', 'Chinese Stocks': 'china', 'French Stocks': 'france', 'German Stocks': 'germany', 'Hong Kong Stocks': 'hongkong', 'Indian Stocks': 'india', 'Italian Stocks': 'italy', 'Japanese Stocks': 'japan', 'Singapore Stocks': 'singapore', 'Spanish Stocks': 'spain', 'Swiss Stocks': 'swiss', 'UAE Stocks': 'unitedarabemirates', 'UK Stocks': 'unitedkingdom', 'US Stocks': 'unitedstates', 'Test': 'test'}
0

试着修改代码,在构建读取CSV文件的文件路径时,使用来自市场和时间框架字典的键。

for selected_market in selected_markets:
for selected_timeframe in selected_timeframes:
    # Construct the filename using keys
    filename = "{}_{}.csv".format(markets[selected_market]['Symbol'], selected_timeframe.lower())
    file_path = os.path.join("data", filename)

    if os.path.exists(file_path):
        # Read the CSV file
        df = pd.read_csv(file_path)
        # Process your dataframe as needed
    else:
        st.warning(f"File not found: {file_path}")

撰写回答