Как получить конкретный столбец из нескольких файлов CSV с пандами - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь извлечь Adj Close столбец из нескольких csv файлов.

Пример файла CSV (одно и то же содержимое можно скопировать в aapl.csv, msft.csv и hcp.csv:

Date    Open    High    Low Close   Volume  Adj Close
10/14/08    116.26  116.4   103.14  104.08  70749800    104.08
10/13/08    104.55  110.53  101.02  110.26  54967000    110.26
10/10/08    85.7    100 85  96.8    79260700    96.8
10/9/08 93.35   95.8    86.6    88.74   57763700    88.74
10/8/08 85.91   96.33   85.68   89.79   78847900    89.79
10/7/08 100.48  101.5   88.95   89.16   67099000    89.16
10/6/08 91.96   98.78   87.54   98.14   75264900    98.14
10/3/08 104 106.5   94.65   97.07   81942800    97.07
10/2/08 108.01  108.79  100 100.1   57477300    100.1
10/1/08 111.92  112.36  107.39  109.12  46303000    109.12
9/30/08 108.25  115 106.3   113.66  58095800    113.66
9/29/08 119.62  119.68  100.59  105.26  93581400    105.26
9/26/08 124.91  129.8   123 128.24  40208700    128.24
9/25/08 129.8   134.79  128.52  131.93  35865600    131.93
9/24/08 127.27  130.95  125.15  128.71  37393400    128.71
9/23/08 131.85  135.8   126.66  126.84  45727300    126.84

Мой код:

import pandas as pd
def test_run():
    start_date = '2008-10-01'
    end_date = '2008-10-09'
    dates = pd.date_range(start_date, end_date)
    df1 = pd.DataFrame(index=dates)
    dfSPY = pd.read_csv(
        'aapl.csv',
        index_col='Date',
        parse_dates=True,
        usecols=['Date', 'Adj Close'],
        na_values=['nan'])
    df1 = df1.join(dfSPY, how='inner')
    df1 = df1.rename(columns={'Adj Close':'SPY'})
    symbols = ['aapl', 'msft', 'hcp']
    for sym in symbols:
        df_temp = pd.read_csv(
            '{}.csv'.format(sym),
            index_col='Date',
            parse_dates=True,
            usecols=['Date', 'Adj Close'],
            na_values=['nan'])
        df_temp = df_temp.rename(columns={'Adj Close':sym})
        df1 = df1.join(df_temp, how='left')
    print(df1)
if __name__ == "__main__":
    test_run()

При запуске я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "1.py", line 27, in <module>
    test_run()
  File "1.py", line 22, in test_run
    na_values=['nan'])
  File "/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 678, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 440, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 787, in __init__
    self._make_engine(self.engine)
  File "/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 1014, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 1749, in __init__
    _validate_usecols_names(usecols, self.orig_names)
  File "/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 1134, in _validate_usecols_names
    "columns expected but not found: {missing}".format(missing=missing)
ValueError: Usecols do not match columns, columns expected but not found: ['Adj Close']

Я пытался ссылаться на несколько ссылок, но не смог понять, что мне не хваталоздесь. Заранее спасибо.

1 Ответ

0 голосов
/ 10 октября 2018

Учитывая, что ваш стек отслеживает ошибку (спасибо за публикацию полной трассировки), вы замечаете, что функция вызывается в строке 27 (test_run() внизу вашего кода).Ошибка, однако, запускает 5 строк в строке 22. Это начальное назначение df_temp, то есть секунда времени, когда вы вызываете функцию pd.read_csv.Поскольку он впервые работал для dfSPY с практически одинаковыми аргументами, это означает, что должно быть что-то другое с форматом файла для одной или нескольких ценных бумаг.Возможно, один из ваших файлов не имеет поля Adj Close, или вокруг него есть пробел, который необходимо обрезать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...