【问题标题】:Cannot process a csv file into a pandas with tickers, and fetch stock-info from the DataFrame无法将 csv 文件处理成带有股票代码的熊猫,并从 DataFrame 中获取股票信息
【发布时间】:2015-02-09 09:29:52
【问题描述】:

我正在尝试导入股票代码列表(#symbols_list...read_csv.. 的行),并将该日期的股票信息获取到 pandas。

import datetime
import pandas as pd
from pandas import DataFrame
from pandas.io.data import DataReader

#symbols_list = [pd.read_csv('Stock List.csv', index_col=0)]
symbols_list = ['AAPL', 'TSLA', 'YHOO','GOOG', 'MSFT','ALTR','WDC','KLAC']
symbols=[]

start = datetime.datetime(2014, 2, 9)
#end = datetime.datetime(2014, 12, 30)

for ticker in symbols_list:
    r = DataReader(ticker, "yahoo",
                   start = start)
                   #start=start, end)
    # add a symbol column
    r['Symbol'] = ticker
    symbols.append(r)
# concatenate all the dfs
df = pd.concat(symbols)
#define cell with the columns that i need
cell= df[['Symbol','Open','High','Low','Adj Close','Volume']]
#changing sort of Symbol (ascending) and Date(descending) setting Symbol as first column and changing date format
cell.reset_index().sort(['Symbol', 'Date'], ascending=[1,0]).set_index('Symbol').to_csv('stock.csv', date_format='%d/%m/%Y')

输入文件 Stock list.csv 具有以下内容,这些条目分别位于各自的行中:

Index
MMM
ABT
ABBV
ACE
ACN
ACT
ADBE
ADT
AES
AET
AFL
AMG

还有更多有趣的代码。

当使用手动编码列表运行时

symbols_list = ['AAPL', 'TSLA', 'YHOO','GOOG', 'MSFT','ALTR','WDC','KLAC']

一切正常并处理输入并将其存储到文件中, 但是每当我使用文件中的 read_csv 运行代码时,都会出现以下错误:

runfile('Z:/python/CrystallBall/SpyderProject/getstocks3.py', wdir='Z:/python/CrystallBall/SpyderProject') Reloaded modules: pandas.io.data, pandas.tseries.common Traceback (most recent call last):

  File "<ipython-input-32-67cbdd367f48>", line 1, in <module>
    runfile('Z:/python/CrystallBall/SpyderProject/getstocks3.py', wdir='Z:/python/CrystallBall/SpyderProject')

  File "C:\Program Files (x86)\WinPython-32bit-3.4.2.4\python-3.4.2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 601, in runfile
    execfile(filename, namespace)

  File "C:\Program Files (x86)\WinPython-32bit-3.4.2.4\python-3.4.2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 80, in execfile
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)

  File "Z:/python/CrystallBall/SpyderProject/getstocks3.py", line 35, in <module>
    cell.reset_index().sort(['Symbol', 'Date'], ascending=[1,0]).set_index('Symbol').to_csv('stock.csv', date_format='%d/%m/%Y')

  File "C:\Users\Morten\AppData\Roaming\Python\Python34\site-packages\pandas\core\generic.py", line 1947, in __getattr__
    (type(self).__name__, name))

AttributeError: 'Panel' object has no attribute 'reset_index'

为什么我只能处理手动布局的符号列表,而不是从文件中导入的代码?

有接受者吗?非常感谢任何帮助!

【问题讨论】:

  • 当你创建一个df时,不管它是否来自一个csv,当你迭代它时,返回的是列名,而不是每个行条目:for ticker in symbols_list:不会返回您的期望。您必须为row in symbols_list.index: 执行类似操作,然后将该行作为符号传递
  • 另外,你在做什么有点奇怪,你正在从对read_csv的调用中创建一个列表,为什么?这将创建一个包含单个 df 的列表

标签: csv python-3.x pandas stock ticker


【解决方案1】:

您的代码有许多问题,以下代码已修复并可以正常工作:

In [4]:

import datetime
import pandas as pd
from pandas import DataFrame
from pandas.io.data import DataReader

temp='''Index
MMM
ABT
ABBV
ACE
ACN
ACT
ADBE
ADT
AES
AET
AFL
AMG'''

df = pd.read_csv(io.StringIO(temp), index_col=[0])
symbols=[]

start = datetime.datetime(2014, 2, 9)

for ticker in df.index:
    r = DataReader(ticker, "yahoo",
                   start = start)
                   #start=start, end)
    # add a symbol column
    r['Symbol'] = ticker
    symbols.append(r)
# concatenate all the dfs
df = pd.concat(symbols)
#define cell with the columns that i need
cell= df[['Symbol','Open','High','Low','Adj Close','Volume']]
#changing sort of Symbol (ascending) and Date(descending) setting Symbol as first column and changing date format
cell.reset_index().sort(['Symbol', 'Date'], ascending=[1,0]).set_index('Symbol').to_csv('stock.csv', date_format='%d/%m/%Y')
cell
Out[4]:
           Symbol    Open    High     Low  Adj Close   Volume
Date                                                         
2014-02-10    MMM  129.65  130.41  129.02     126.63  3317400
2014-02-11    MMM  129.70  131.49  129.65     127.88  2604000
...           ...     ...     ...     ...        ...      ...
2015-02-06    AMG  214.35  215.82  212.64     214.45   424400

[3012 rows x 6 columns]

首先是这个:symbols_list = [pd.read_csv('Stock List.csv', index_col=0)]

这将创建一个包含单个条目的列表,该条目将是一个没有列的 df,只有一个代码值的索引。

这个:for ticker in symbols_list:

不起作用,因为从 df 返回的可迭代对象是列而不是每个条目,在您的情况下,您需要迭代索引,这就是我的代码所做的。

我不确定你想要实现什么,如果只有一列,则没有必要指定 index_col=0,你可以创建一个只有一列的 df,或者如果你通过 @987654325 @这将创建一个只有一列的系列。

【讨论】:

  • 谢谢大家,EdChum 你的回答可能对我最有帮助。
  • @MortenE 如果它解决了你的问题,你可以接受我的回答,我的回答左上角会有一个空的勾号,这样这个问题就不会悬而未决
  • 谢谢大家,EdChum 你的回答可能对我最有帮助。不过我有几个问题。该代码不会在我的设置中计算。我从该行收到一个 io 错误。 df = pd.read_csv(io.StringIO(temp), index_col=[0]) 此外,我不明白你的第一行......? temp = 指定什么?您使用 ''' ''' 表示代码只是 cmets?我想导入文件的内容(代码),我知道我正在创建一个只有索引列的熊猫。这我想填充相应的股票日股票信息,运行迭代循环。
  • @MortenE 您不应该逐字复制该部分,它只是一种将字符串视为文件对象的方法,因此请忽略临时部分并使用它:symbols_list = pd.read_csv('Stock List.csv', index_col=0)
  • 好的,感谢您的努力和澄清 Ed,然后在加载我的文件时,像以前一样,我收到一个错误,'name 'df' is not defined。
猜你喜欢
  • 1970-01-01
  • 2015-08-05
  • 2013-01-04
  • 1970-01-01
  • 2011-01-23
  • 2019-10-11
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多