在Python导入股票数据时如何解决这个问题?

2024-04-25 15:11:55 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉,我是个乞丐,所以这可能很简单,但我不知道怎么了

import pandas as pd
from pandas_datareader import data as wb
tickers = ['F','MSFT','BP']
new_data = pd.DataFrame()
for t in tickers:
    new_data[t] = wb.DataReader(t, data_source='yahoo', start='2015-1-1')

这是我得到的错误:



ValueError                                Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in _ensure_valid_index(self, value)
   3524             try:
-> 3525                 value = Series(value)
   3526             except (ValueError, NotImplementedError, TypeError):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py in __init__(self, data, index, dtype, name, copy, fastpath)
    312 
--> 313                 data = SingleBlockManager(data, index, fastpath=True)
    314 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\managers.py in __init__(self, block, axis, do_integrity_check, fastpath)
   1515         if not isinstance(block, Block):
-> 1516             block = make_block(block, placement=slice(0, len(axis)), ndim=1)
   1517 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in make_block(values, placement, klass, ndim, dtype, fastpath)
   3266 
-> 3267     return klass(values, ndim=ndim, placement=placement)
   3268 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in __init__(self, values, placement, ndim)
   2774 
-> 2775         super().__init__(values, ndim=ndim, placement=placement)
   2776 

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in __init__(self, values, placement, ndim)
    127                 "Wrong number of items passed {val}, placement implies "
--> 128                 "{mgr}".format(val=len(self.values), mgr=len(self.mgr_locs))
    129             )

ValueError: Wrong number of items passed 6, placement implies 1318

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-11-6f48653a5e0e> in <module>
      2 new_data = pd.DataFrame()
      3 for t in tickers:
----> 4     new_data[t] = wb.DataReader(t, data_source='yahoo', start='2015-1-1')

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in __setitem__(self, key, value)
   3470         else:
   3471             # set column
-> 3472             self._set_item(key, value)
   3473 
   3474     def _setitem_slice(self, key, value):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in _set_item(self, key, value)
   3546         """
   3547 
-> 3548         self._ensure_valid_index(value)
   3549         value = self._sanitize_column(key, value)
   3550         NDFrame._set_item(self, key, value)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in _ensure_valid_index(self, value)
   3526             except (ValueError, NotImplementedError, TypeError):
   3527                 raise ValueError(
-> 3528                     "Cannot set a frame with no defined index "
   3529                     "and a value that cannot be converted to a "
   3530                     "Series"

ValueError: Cannot set a frame with no defined index and a value that cannot be converted to a Series

我想这和丢失的信息有关吧?把int读成文本还是什么?有人能帮忙吗

这实际上是我在网上课程上做的一个练习的答案键,它返回了这个错误


Tags: inpycoreselfpandasdatavaluelib
2条回答

在具有相同大小数据的数据框中,您只能指定具有的列:列或系列(按术语)。让我们看看DataReader返回的内容:

wb.DataReader('F', data_source='yahoo', start='2015-1-1').head()

Date        High    Low     Open    Close   Volume        AdjClose
2015-01-02  15.65   15.18   15.59   15.36   24777900.0  11.452041
2015-01-05  15.13   14.69   15.12   14.76   44079700.0  11.004693
2015-01-06  14.90   14.38   14.88   14.62   32981600.0  10.900313
2015-01-07  15.09   14.77   14.78   15.04   26065300.0  11.213456
2015-01-08  15.48   15.23   15.40   15.42   33943400.0  11.496773

它返回一个数据帧。如果您想从这里选择一列(比如,Open),可以将其分配给新表

tickers = ['F','MSFT','BP']
new_data = pd.DataFrame()
for t in tickers:
    new_data[t] = wb.DataReader(t, data_source='yahoo', start='2015-1-1')['Open']
new_data.head()

Date          F         MSFT       BP
2015-01-02  15.59   46.660000   38.209999
2015-01-05  15.12   46.369999   36.590000
2015-01-06  14.88   46.380001   36.009998
2015-01-07  14.78   45.980000   36.000000
2015-01-08  15.40   46.750000   36.430000

你可以指定一本字典

import pandas as pd
from pandas_datareader import data as wb
tickers = ['F','MSFT','BP']
new_data = {}
for t in tickers:
    new_data[t] = wb.DataReader(t, data_source='yahoo', start='2015-1-1')

print(new_data['F'])

您正在尝试将数据帧分配给数据帧的每一列

相关问题 更多 >