Pandas .join无法合并S& P500股票数据

时间:2017-06-29 20:06:10

标签: python csv pandas dataframe pandas-datareader

我正在关注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财经API的数据。所以这样一来,如果它试图找到一个我没有的csv,它仍然会结合我所拥有的那些而不会抛出错误。)

当我运行此功能时,它会创建一个名为sp500joinedcloses.csv的CSV,但它只包含一个自动收报机的数据,即ABBV。我知道它正在通过代码正确迭代,因为如果我在for循环中添加一个打印(自动收报机),则会打印所有正确的代码。

值得注意的是,ABBV不是我应该包含在数据帧中的第一个csv。他们首先应该有一个文件的自动收报机是AAPL,然后是ABBV。不知道为什么它似乎跳过了AAPL。

我将不胜感激任何帮助。我是熊猫的初学者,真的想学习我能做的一切。

1 个答案:

答案 0 :(得分:2)

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)