【问题标题】:Fill holes in FRED data in Pandas DataFrame在 Pandas DataFrame 中填充 FRED 数据中的漏洞
【发布时间】:2020-04-21 02:30:54
【问题描述】:

我的名字是尼克,我是编码新手。我最近完成了 Codeacademy 的 Python 分析财务数据课程。我已经开始自己做一些项目,但遇到了障碍。

我正在使用 pandas-datareader 从美联储 API (FRED) 导入股票指数每日收盘价数据:

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

我现在尝试通过遍历sp_data 中的每一行来在df 中创建一个“SP500”列,如果日期匹配,它将将该值分配给df 中的该日期。然后我将使用pd.DataFrame.ffill 来填充缺失值。我用来创建新列的 lambda 函数是:

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

这会返回:

ValueError: Lengths must match to compare

我知道数据帧需要具有相同的长度才能使用 lambda 函数。我想我的问题是,在 Pandas 数据框中迭代每一行以将正确的值分配给新数据框中的正确日期的最佳方法是什么?有没有比我尝试解决的方法更容易实现相同最终目标的方法?

欢迎提出任何建议!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    这是索引的用途,如果索引 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']
    

    【讨论】:

      猜你喜欢
      • 2016-08-30
      • 2017-08-07
      • 2019-04-26
      • 2021-04-17
      • 2022-08-15
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多