2017-03-11 8 views
1

したがって、私はS & P500(SPY)BPの株価(O & G /エネルギー会社)の株価をインポートしようとしています。私が探している結果は、3列の "テーブル"です。日付は1、SPYのAdj Closeは1、BPのAdj Closeは1です。しかし、私のコードでは、次のように表示されます。Pythonで2つの金融株式をインポートする

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

ので、それはです:列名は一意でなければなりませんので、私は使用していjoin()メソッドは、

コードが...、まあ、そのようなことは、私はそれを解釈してきた方法です混乱していますコードがあります。もし私が間違ったことをしたことについて何らかの光を当てることができる人がいるなら、私に知らせてください。

多くの感謝!

+0

NB/Adj Closeは'SPY'と 'BP'というシンボルに置き換えられます – Matthew

+0

おそらく過去にPythonで優れたものをインポートするのはなぜですか?最終的には、最終的にExcelでもチャートを提供する必要があります.VBScriptで直接作業を開始すると、後でこのような場合に2時間の労働時間を節約できます。 (それは複雑なので、pyhtonのものではないから) –

+0

@VitaliPom Python内で優れたサポートがあります。 vbcscriptに切り替える必要はありません。 – e4c5

答えて

0

私はちょっとこの質問を閉じたいと思っていました。だから私は株式の.CSVファイルをインポートすることをあきらめ、Yahoo Financeから直接 "インポート"した。持っていた誰にも

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」列がすでにあります:私は以下の投稿を最後の2行は、あなたのループの内側に実際にあると仮定します。列を区別するために接尾辞を指定しない限り、パンダが重複する列名を持つデータフレームに参加できないため、エラーをスローする「SPY」が再び表示されます。

+0

答えをありがとう。しかし、私はちょうど私が懇願から上に掲示した代替方法を使用したことを望む。コードが少なく、きれいで効率的です。 – Matthew

関連する問題