2017-03-11 5 views
1

그래서 S & P500 (SPY) BP의 주가 (O & G/에너지 회사)의 주가를 가져 오려고합니다. 내가 찾고있는 결과는 3 열의 "테이블"입니다. 날짜는 1, Adj는 1 SPY의 닫기 및 Adj의 1 BP의 닫기. 그러나, 내 코드를 생성합니다 :Python을 사용하여 두 개의 금융 주식 가져 오기

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

나는이 오류가 내게 말하고있는 것을 이해합니다. 색인 열 "Adj Close"가 겹쳐 있습니다. 재고와 관계없이 우리가 매번 추출하는 컬럼을 "스파이 (SPY)"라고합니다.

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() 

그래서,이있다 : 열 이름은 고유해야하기 때문에 내가 사용하고 조인() 메소드는

코드는 ..., 음, 그런 일이 내가 해석 한 방법입니다 혼란 내가 가진 코드. 내가 잘못한 지구가 무엇인지 밝혀 줄 수있는 사람이 누구든지 있다면 알려주세요.

감사합니다.

+0

NB/Adj Close는 다음과 같아야합니다. 'SPY'및 'BP'기호로 바뀝니다 – Matthew

+0

아마도 과거에 파이썬으로 가져 오기가 뛰어 났을까요? 아마도 결국에는 엑셀에서도 차트를 제공해야 할 필요가 있거나 필요하기 때문에 VBScript로 직접 작업을 시작하면 나중에이 시간에 두 배의 노동 시간을 절약 할 수 있습니다. (복잡한 Python이 아니기 때문에) –

+0

@VitaliPom python 내에서 Excel에 대한 탁월한 지원이 있습니다. vbcscript로 전환 할 필요가 없습니다. – e4c5

답변

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 

감사합니다 보기.

+0

NB/start = datetime.datetime (2000,1,1) 및 end = datetime.date.today() – Matthew

1

제공 한 코드는 for 루프의 df_temp 값을 무시합니다. 마지막 반복에서 할당 된 값으로 끝납니다. 당신이 DF1하는 dfSPY에 가입 한 후

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' 

이미 'SPY'열있다 : 나는 아래 게시 마지막 두 줄은 루프에 대한 귀하의 내부 실제로 가정합니다. 열을 구별하기 위해 접미어를 지정하지 않으면 pandas가 겹치는 열 이름을 가진 데이터 프레임을 결합 할 수 없기 때문에 오류가 발생합니다.

+0

답변 해 주셔서 감사합니다. 그러나 나는 단지 내가 구걸에서 위에 게시 한 대체 방법을 사용했으면 좋겠다. 적은 코드, 깨끗하고 효율적인. – Matthew