2017-06-22 76 views
2

我想写一个script,它会经历txt-file中的每个股票代码,并通过googlefinance运行以收集其所有历史数据并将其输出到CSV-file。我知道这应该不是那么困难,但我似乎无法弄清楚我在这段代码中做错了什么。它适用于第一支股票,然后崩溃。我有一个假设,它与\n有关,但我尝试了splitlines()函数和其他一些东西。如何让脚本遍历每一行txt文件并执行一个函数?

我的代码:

import datetime as dt 
import matplotlib.pyplot as plt 
from matplotlib import style 
from matplotlib.finance import candlestick_ohlc 
import matplotlib.dates as mdates 
import pandas as pd 
import pandas_datareader.data as web 
from googlefinance import getQuotes 
import json 
from datetime import datetime 
from forex_python.converter import CurrencyRates 
from yahoo_finance import Share 

sp500 = open('sp500tickers.txt').read().splitlines() 

for x in sp500: 

    share = Share(sp500[x]) 
    print (share.get_price()) 

    start = dt.datetime(2001,1,1) 
    end = dt.datetime(2017,1,1) 

    df = web.DataReader(share, 'google', start, end) 
    df.to_csv(''+x+'.csv', parse_dates=True, index_col=0) 

文本文件

MMM 
ABT 
ABBV 
ACN 
ATVI 
AYI 
ADBE 
AAP 
AES 
AET 
AMG 
AFL 
A 
APD 
AKAM 
ALK 
ALB 
ALXN 
ALLE 
AGN 
ADS 
LNT 
ALL 
GOOGL 
GOOG 
MO 
AMZN 
AEE 
AAL 
... 

编辑的代码:

with open('p1.txt', 'r') as f: 
    for line in f: 
     line = line.rstrip() 

     share = Share(line) 
     style.use('ggplot') 
     print (share.get_price()) 

     start = dt.datetime(2001,1,1) 
     end = dt.datetime(2017,1,1) 

     df = web.DataReader(share, 'google', start, end) 
     df.to_csv(''+line+'.csv', parse_dates=True, index_col=0) 
+0

由于您已经在使用'pandas',为什么不使用'pd.read_csv()'? –

+0

含义...?将我的代号列表变成csv然后运行它?我最终会遇到同样的问题。 – sgerbhctim

+0

您的tickers列表是一个txt文件。一个txt文件可以通过'read_csv()'导入。你已经在构建价格的数据框,所以我不明白为什么要多步完成。 –

回答

2

在你的for-loop中,x不是一个迭代器。 x是本身的价值,所以改变这一行:

share = Share(sp500[x]) 

share = Share(x) 

和在读取文件时,你可以一次读取每一行,而不是读一下子,如下:

with open(file, 'r') as f: 
    for line in f: 
     line = line.rstrip() 
     #your code 
+0

你能帮助我完成该函数的第二部分吗?所以它很容易检索价格,但我得到了一些错误..在txt文件的308行后,我得到一个HTTP错误,所以我假设我称之为一个机器人的网站我看它。但我主要关心的是这个错误:'返回(seq [pos:pos + size]为范围内的pos(0,len(seq),size)) TypeError:'Share'类型的对象没有len()' - 当我试图将所有的历史数据转换为CSV时返回。我怎样才能解决这个问题? – sgerbhctim

+0

什么是'seq'?你可以发布整个功能吗? –

+0

我没有在我的函数中的任何地方写seq。我假设这与我使用的软件包有关。我的功能正是我现在所拥有的功能。 – sgerbhctim

0

1)你做什么,在这里:

sp500 = open('sp500tickers.txt').read().splitlines() 

正在读取整个文件到内存,这对于大文件坏主意 - 做这个:在这行

with open('sp500tickers.txt') as sp500: 

2):

share = Share(sp500[i]) 

哪里呢i来自?

+0

对不起,应该是x。我上传了我的代码的早期版本。现在解决。 – sgerbhctim

+0

仍然错误。 'x' **是**文本文件中的行,而不是索引。它应该只是'share = Share(x)' –

+0

好吧,让每个价格都在工作吧。现在我的问题变成了 - 为什么历史数据无法收集? – sgerbhctim

相关问题