Заполните отверстия в данных FRED в Pandas DataFrame - PullRequest
0 голосов
/ 20 апреля 2020

Меня зовут Ник, и я новичок в кодировании. Я недавно прошел курс Codeacademy по анализу финансовых данных с курсом Python. Я начал работать над некоторыми собственными проектами и столкнулся с препятствием.

Я импортирую данные по дневным ценам закрытия фондового индекса из API Федеральной резервной системы (FRED), используя pandas -datareader:

import numpy as np
import pandas as pd
import pandas_datareader.data as web
import matplotlib.pyplot as plt
from datetime import datetime

start = datetime(2020, 1, 1)

sp_data = web.DataReader('SP500', 'fred', start)

Фрейм данных sp_data отформатирован следующим образом:

              SP500
DATE               
2020-01-01      NaN
2020-01-02  3257.85
2020-01-03  3234.85
2020-01-06  3246.28
2020-01-07  3237.18

Проблема с этим фреймом данных заключается в том, что в дни, когда рынки закрыты (выходные, праздничные дни) эти даты полностью опущены. Вы можете видеть выше, что 2020-01-04 и 2020-01-05 отсутствуют, потому что они выходные. Я хотел бы, чтобы в моем датафрейме были все даты, даже когда рынок закрыт. В дни, когда рынки закрыты, я бы хотел, чтобы в колонке SP500 была только самая последняя цена закрытия. Таким образом, в 2020-01-04 и 2020-01-05 столбец SP500 будет иметь 3234,85.

Я пытался создать новый фрейм данных с каждой необходимой мне датой:

date_list = pd.date_range(start, np.datetime64('today'))
df = pd.DataFrame(date_list)
df.columns =['date']

Это создает:

        date
0 2020-01-01
1 2020-01-02
2 2020-01-03
3 2020-01-04
4 2020-01-05

Сейчас я пытаюсь создать столбец 'SP500' в df, перебирая каждую строку в sp_data, и, если даты совпадают, он присваивает это значение этому дата в df. Затем я буду использовать pd.DataFrame.ffill для заполнения пропущенных значений. Лямбда-функция, которую я использую для создания нового столбца:

df['SP500'] = sp_data.apply(lambda row: row['SP500'] if row.index == df.date else 0, axis=1)

Возвращает:

ValueError: Lengths must match to compare

Я знаю, что для использования лямбда-функции кадры должны быть одинаковой длины. на. Я предполагаю, что мой вопрос, каков наилучший способ итерации по каждой строке в Pandas кадре данных, чтобы назначить правильные значения правильным датам в новом кадре данных? Есть ли способы достижения sh той же конечной цели, которые намного проще, чем то, как я пытаюсь ее решить?

Любые и все предложения приветствуются!

1 Ответ

0 голосов
/ 20 апреля 2020

Это то, для чего используются индексы, если есть совпадение между индексом int нового пустого фрейма данных (df) и фреймом данных с данными (sp_data), тогда значение будет добавлено в новый фрейм данных иначе он присвоит значения NaN. Ваш df должен быть пустым фреймом данных с индексом date_list, а после этого просто назначьте новый столбец:

date_list = pd.date_range(start, np.datetime64('today'))
df = pd.DataFrame(index=date_list)

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