Меня зовут Ник, и я новичок в кодировании. Я недавно прошел курс 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 той же конечной цели, которые намного проще, чем то, как я пытаюсь ее решить?
Любые и все предложения приветствуются!