2015-04-21 22 views
2

我基本上運行一些代碼如下。基本上,我只是從CSV文件中檢索成對的股票(按照行1-庫存1,2,行2-庫存1,2等等,其中庫存1和庫存2在每行中不同)。然後我從雅虎那裏收集與這些股票「對」相關的數據。我計算股票的回報,並基本檢查一對股票之間的距離(回報差異)是否違反了某個閾值,如果是,我返回1.但是,我收到以下我無法解決的錯誤:解決Python代碼中的TypeError

PricePort(tickers) 
    27  for ticker in tickers: 
    28   #print ticker 
---> 29   x = pd.read_csv('http://chart.yahoo.com/table.csv?s=ttt'.replace('ttt',ticker),usecols=[0,6],index_col=0) 
    30   x.columns=[ticker] 
    31   final=pd.merge(final,x,left_index=True,right_index=True) 

TypeError: expected a character buffer object 

的代碼如下:

from datetime import datetime 
import pytz 
import csv 
import pandas as pd 
import pandas.io.data as web 
import numpy as np 

#Retrieves pairs of stocks (laid out as Row 1-Stock 1,2, Row 2-Stock 1,2 and so on, where Stock 1 and 2 are different in each row) from CSV File 
def Dataretriever(): 
     Pairs = [] 
     f1=open('C:\Users\Pythoncode\Pairs.csv') #Enter the location of the file 
     csvdata= csv.reader(f1) 
     for row in csvdata:   #reading tickers from the csv file 
      Pairs.append(row) 
     return Pairs 

tickers = Dataretriever() #Obtaining the data 

#Taking in data from Yahoo associated with these "Pairs" of Stocks 
def PricePort(tickers): 
    """ 
     Returns historical adjusted prices of a portfolio of stocks. 
     tickers=pairs 
    """ 
    final=pd.read_csv('http://chart.yahoo.com/table.csv?s=^GSPC',usecols=[0,6],index_col=0) 
    final.columns=['^GSPC'] 
    for ticker in tickers: 
     #print ticker 
     x = pd.read_csv('http://chart.yahoo.com/table.csv?s=ttt'.replace('ttt',ticker),usecols=[0,6],index_col=0) 
     x.columns=[ticker] 
     final=pd.merge(final,x,left_index=True,right_index=True) 
    return final 

#Calculating returns of the stocks 
def Returns(tickers): 
    l = [] 
    begdate=(2014,1,1) 
    enddate=(2014,6,1)  
    p = PricePort(tickers) 
    ret = (p.close[1:] - p.close[:-1])/p.close[1:] 
    l.append(ret) 
    return l 

#Basically a class to see if the distance (difference in returns) between a 
#pair of stocks breaches some threshold 
class ThresholdClass():  
    #constructor 
    def __init__(self, Pairs): 
     self.Pairs = Pairs 

    #Calculating the distance (difference in returns) between a pair of stocks 
    def Distancefunc(self, tickers): 
     k = 0 
     l = Returns(tickers) 
     summation=[[0 for x in range (k)]for x in range (k)]  #2d matrix for the squared distance 
     for i in range (k): 
      for j in range (i+1,k):  # it will be a upper triangular matrix 
       for p in range (len(self.PricePort(tickers))-1): 
        summation[i][j]= summation[i][j] + (l[i][p] - l[j][p])**2  #calculating distance 

     for i in range (k):  #setting the lower half of the matrix 1 (if we see 1 in the answer we will set a higher limit but typically the distance squared is less than 1) 
      for j in range (i+1): 
       sum[i][j]=1 
      return sum 

    #This function is used in determining the threshold distance 
    def MeanofPairs(self, tickers): 
     sum = self.Distancefunc(tickers) 
     mean = np.mean(sum) 
     return mean 

    #This function is used in determining the threshold distance 
    def StandardDeviation(self, tickers): 
     sum = self.Distancefunc(tickers) 
     standard_dev = np.std(sum) 
     return standard_dev 


    def ThresholdandnewsChecker(self, tickers): 
     threshold = self.MeanofPairs(tickers) + 2*self.StandardDeviation(tickers) 
     if (self.Distancefunc(tickers) > threshold): 
      return 1 

Threshold_Class = ThresholdClass(tickers) 
Threshold_Class.ThresholdandnewsChecker(tickers,1) 

回答

1

麻煩的是Dataretriever()返回一個列表,而不是一個字符串。當您遍歷tickers()時,名稱ticker被綁定到一個列表。

str.replace方法預計這兩個參數都是字符串。下面的代碼引發錯誤,因爲第二個參數是一個列表:

'http://chart.yahoo.com/table.csv?s=ttt'.replace('ttt', ticker) 

下一行x.columns = [ticker]會造成類似的問題。在這裏,ticker需要是可哈希對象(如字符串或整數),但列表不可哈希。

+0

謝謝。我編輯我的代碼如下,但我仍然有同樣的問題:'tickersasstrings =地圖(str,tickers) def PricePort(tickersasstrings): final = pd.read_csv('http://chart.yahoo.com/ table.csv?s =^GSPC',usecols = [0,6],index_col = 0) final.columns = ['^ GSPC'] tickersasstrings中的股票代碼: #print ticker x = pd.read_csv 'http://chart.yahoo.com/table.csv?s=ttt'.replace('ttt',ticker),usecols=[0,6],index_col=0) x.columns = [ticker] final = pd.merge(final,x,left_index = True,right_index = True) return final' – user131983

+0

我想這是因爲'x.columns = [ticker]'位。 'x.columns'需要分配給列表字符串或數字(可哈希)而不是列表列表(不可)。 –

+0

再次感謝。我試着將它改爲'x.columns = ticker',因爲它只會被分配一個字符串列表,但是這似乎不能解決問題。會不會有另一個問題? – user131983