1

因此,我正在尝试导入(O&G/能源公司)S&P500 (SPY) BP 的股票价格。我正在寻找的结果是一个包含 3 列的“表格”;1 表示日期,1 表示 SPY 的 Adj Close,1 表示 BP 的 Adj Close。但是,我的代码产生:

ValueError: columns overlap but no suffix specified: Index(['SPY'], dtype='object')

我明白这个错误告诉我什么:索引列“Adj Close”有重叠。无论库存如何,我们每次提取的列都称为“SPY”。我正在使用的 join() 方法很困惑,因为列名必须是唯一的,好吧,我就是这样解释它的......

编码:

import pandas as pd

def test_run():
    start_date=('2016-03-10') #start date parameter
    end_date=('2017-03-10') #end date parameter
    dates=pd.date_range(start_date,end_date)
    df1=pd.DataFrame(index=dates) #create empty dataframe df1

    dfSPY=pd.read_csv("C:\SPY.csv",index_col="Date",parse_dates=True,
                  usecols=['Date','Adj Close'],na_values=['nan']) 
    #create dataframe for SPY stock

    #rename Adj Close column to SPY to prevent clash
    dfSPY=dfSPY.rename(columns={'Adj Close':'SPY'})

    #join the 2 dataframes using DataFrame.join(), and how='inner'
    df1=df1.join(dfSPY,how='inner')

    #read in more stocks; SPY & BP
    symbols=['SPY','BP']

    for symbol in symbols:
          df_temp=pd.read_csv("C{}.csv".format(symbol),index_col='Date',parse_dates=True,
                  usecols=['Date','Adj Close'],na_values=['nan'])

    #rename to prevent clash
    df_temp=df_temp.rename(columns={'Adj Close':symbol})
    df1=df1.join(df_temp) #use default how='left'
print(df1)

if __name__=="__main__":
test_run()

所以,这就是我得到的代码。如果有任何人可以阐明我做错了什么地球,请告诉我。

非常感谢!

4

2 回答 2

2

您提供的代码覆盖了 for 循环中 df_temp 的值 - 它只会以最后一次迭代期间分配的值结束。我假设下面发布的最后两行实际上在您的 for 循环中:

for symbol in symbols:
    df_temp=pd.read_csv("C{}.csv".format(symbol),index_col='Date',parse_dates=True,
              usecols=['Date','Adj Close'],na_values=['nan'])

    df_temp=df_temp.rename(columns={'Adj Close':symbol})
    df1=df1.join(df_temp) #use default how='left'

将 dfSPY 加入 df1 后,已经有一个“SPY”列。您的符号列表中再次出现“SPY”,这将引发错误,因为 pandas 无法加入具有重叠列名的数据帧,除非您指定后缀来区分列

于 2017-03-14T23:51:09.120 回答
0

我只是想结束这个问题。所以我放弃了导入股票的.CSV文件,直接从雅虎财经“导入”。这并没有真正回答我原来的问题,所以我仍然不知道出了什么问题,但是我觉得以下解决方案更有效且“优雅”:

import pandas as pd
import pandas.io.data as web
import datetime

start = datetime.datetime(2000,1,1)
end = datetime.date.today()

BP=web.DataReader("BP","yahoo",start,end)
SPY=web.DataReader("SPY","yahoo",start,end)
df_stocks=pd.DataFrame({"BP":BP["Adj Close"],"SPY":SPY["Adj Close"]})

df_stocks.tail()

               BP         SPY
Date                             
2017-03-07    33.869999   237.000000
2017-03-08    33.310001   236.559998
2017-03-09    33.500000   236.860001
2017-03-10    34.330002   237.690002
2017-03-13    34.070000   237.809998

感谢任何看过的人。

于 2017-03-14T21:47:51.023 回答