【问题标题】:Pandas .join not working to combine S&P500 stock dataPandas .join 无法合并 S&P500 股票数据
【发布时间】:2017-12-03 16:22:35
【问题描述】:

我正在关注 PythonProgramming.net 上的金融教程,当我尝试将多个数据帧组合成一个大数据帧时遇到了问题。我为此创建了一个函数:

def compile_data():
    with open ("sp500tickers.pickle", "rb") as f:
        tickers = pickle.load(f)

    main_df = pd.DataFrame()

    for count,ticker in enumerate(tickers):
        try:
            df = pd.read_csv('stock_dfs/{}.csv'.format(ticker))
            df.set_index('Date', inplace=True)
            df.rename(columns={'Close':ticker}, inplace=True)
            df.drop(['Open','High','Low','Volume'], 1, inplace=True)
            if main_df.empty:
                main_df = df
            else:
                main_df.join(df, how='outer')
                print(main_df.head())
            if count % 10 == 0:
                print(count)
        except Exception:
            pass

    print(main_df.head())
    main_df.to_csv('sp500joinedcloses.csv')

(我在上面的代码中使用 try/except 的原因是因为我有 S&P500 的所有代码列表,但无法从 Google Finance API 中获取所有代码的数据......所以这样,如果它试图找到我没有的 csv,它仍然会合并我拥有的那些,而不会引发错误。)

当我运行这个函数时,它会创建一个名为 sp500joinedcloses.csv 的 CSV,但它只包含一个股票代码的数据,即 ABBV。我知道它正在正确地遍历代码,因为如果我在 for 循环中添加一个 print(ticker),所有正确的代码都会被打印出来。

还值得注意的是,ABBV 不是我拥有的第一个应该包含在数据框中的 csv。他们首先应该有一个文件的股票代码是 AAPL,然后是 ABBV。不知道为什么它似乎跳过了 AAPL。

如果有任何帮助,我将不胜感激。我是 pandas 的初学者,我真的很想学习有关它的一切。

【问题讨论】:

    标签: python csv pandas dataframe pandas-datareader


    【解决方案1】:

    IIUC:

    你不想使用join,如果你从一个空的数据框开始,你无论如何也不能使用。请改用pd.concat

    main_df = pd.concat([main_df, df], axis=1)
    

    但是,我会推荐这个来替换你的整个过程:

    def read_file(ticker):
        df = pd.read_csv('stock_dfs/{}.csv'.format(ticker)).set_index('Date')
        return df.Close.rename(ticker)
    
    with open ("sp500tickers.pickle", "rb") as f:
        tickers = pickle.load(f)
    
    main_df = pd.concat([read_file(t) for t in tickers], axis=1)
    

    【讨论】:

    • 感谢您的洞察力。但是在这种情况下 join 不起作用,因为我有 if main_df.empty: main_df = df?
    • @BenSpreger main_df = main_df.join(df, how='outer') 可能有用...试试看
    • @BenSpreger 我仍然会推荐我的流程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2016-08-13
    • 2020-08-09
    相关资源
    最近更新 更多