【问题标题】:Adding a label column to a dataframe向数据框添加标签列
【发布时间】:2018-10-11 22:21:01
【问题描述】:

我有一个数据框,可以在其中获取股票数据 (OHLC) 和日期作为索引。但是,代码名称没有显示在那里。 所以,数据看起来像这样:

                open      high       low     close     volume
date                                                         
2013-10-11   63.7003   64.5963   63.4609   64.4619   66934938
2013-10-14   64.0718   65.0855   64.0090   64.8841   65474542
2013-10-15   65.0757   65.6637   64.8161   65.2294   80018603
2013-10-16   65.5054   65.7330   65.3014   65.5478   62775013
2013-10-17   65.3995   66.0273   65.3602   65.9907   63398335
2013-10-18   66.1856   66.6133   66.1490   66.5649   72635570

我有一个股票代码列表,我正在运行一个 for 循环来获得相同的结果,然后使用 concat/append 最终获得数据。但是,我想在这里添加股票代码。我该怎么做 ?

下面是最终输出:

                open      high       low     close     volume   ticker
date                                                         
2013-10-11   63.7003   64.5963   63.4609   64.4619   66934938   AAPL
2013-10-14   64.0718   65.0855   64.0090   64.8841   65474542   AAPL
2013-10-15   65.0757   65.6637   64.8161   65.2294   80018603   AAPL
2013-10-16   65.5054   65.7330   65.3014   65.5478   62775013   AAPL
2013-10-17   65.3995   66.0273   65.3602   65.9907   63398335   AAPL
.................
.................
.................
.................
2013-10-11  153.0422  154.3197  152.9154  154.2654  104967037   SPY
2013-10-14  153.3140  155.0083  153.1962  154.8815  111901876   SPY
2013-10-15  154.4919  155.0718  153.5496  153.7580  153958055   SPY
2013-10-16  154.6822  155.9869  154.6051  155.9053  161058684   SPY
2013-10-17  155.2711  157.0379  155.2439  156.9473  129004482   SPY

PS : 我正在使用 iexfinance 库来获取历史价格。

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    我不熟悉iexfinance 库。但是,假设您有一个魔术函数 get_data_from_ticker,顾名思义,它在给定股票代码输入的情况下获取数据,可能是 pd.DataFrame 对象。

    给定一个列表tickers,您当前的流程可能如下所示:

    dfs = []
    for ticker in tickers:
        data = get_data_from_ticker(ticker)
        dfs.append(data)
    df = pd.concat(dfs)
    

    如果代码信息未存储在您的数据框中,这并不是特别有用。因此,您可以使用pd.DataFrame.assign 相应地添加系列:

    dfs = []
    for ticker in tickers:
        data = get_data_from_ticker(ticker)
        dfs.append(data.assign(ticker=ticker))
    df = pd.concat(dfs)
    

    最后,您可以通过使用列表推导来提高效率:

    dfs = [get_data_from_ticker(ticker).assign(ticker=ticker) for ticker in tickers]
    
    df = pd.concat(dfs)
    

    【讨论】:

    • 您也可以考虑使用生成器表达式而不是列表推导作为传递给pd.concat 的可迭代对象。在您开始进行任何进一步处理之前,这应该会将您的脚本的内存占用减少大约 2 倍。
    • 谢谢@jpp,它就像一个魅力。在标记数据框中不存在的某些值时,我总是遇到问题。我认为“分配”是一个不错的选择。
    猜你喜欢
    • 2020-04-17
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多