【问题标题】:Add a column to a dataframe in Python在 Python 中向数据框添加列
【发布时间】:2021-01-11 17:51:28
【问题描述】:

我正在尝试向数据框添加几列 - 这是代码

import import_ipynb
import talib
import numpy
import yfinance as yf
import datetime as dt
import time
from datetime import datetime, timedelta 
import sqlite3
import pandas
import numpy as np
conn = sqlite3.connect('Strategy_RSI_MACD_Data.db')
c = conn.cursor()
 
c.execute("select distinct Stock from Universe")
tickers = c.fetchall()   
for row in tickers:
    if row[0]:
        ticker_list.append(row[0])
        stockdetails = yf.download(
            tickers = ticker_list,
            period = '6mo',
            interval = '1d',
            group_by = 'ticker',
            auto_adjust = False,
            prepost = False,
            threads = True,
            proxy = None
        )

df_ta = pandas.DataFrame(data = stockdetails['Adj Close'], dtype=numpy.float64)
stockdetails['RSI'] = df_ta.apply(lambda c: talib.RSI(c, timeperiod = 14))

最后一行抛出这个错误:

ValueError: 传递的项目数错误 505,位置暗示 1

我该如何解决这个问题?

【问题讨论】:

  • 最后一行之前的stockdetails是什么类型?
  • 我认为(抱歉还在学习)“stockdetails = []”会成为一个列表吗?
  • 您正在使用 [] 将其初始化为列表。但是yf.download 改变了 stockdetails 的类型
  • stockdetails 没问题!我认为这是当我尝试向数据框中添加另一列时导致崩溃 stockdetails['RSI'] = df_ta.apply(lambda c: talib.RSI(c, timeperiod = 14))

标签: python pandas


【解决方案1】:

您的 lambda 函数返回 505 个值,而您的分配应该只有一个。尝试将输出转换为列表-

stockdetails['RSI'] = [df_ta.apply(lambda c: talib.RSI(c, timeperiod = 14))]

【讨论】:

  • 感谢您的回复 - 更改导致此错误 ValueError: 值的长度与索引的长度不匹配
  • 你能告诉我len(stockdetails)的输出吗?
  • 确定 - 是 128
  • 试试:stockdetails['RSI']= talib.RSI(stockdetails['Adj Close'], timeperiod=14)
  • 感谢接近我想 - 现在我得到这个错误:ValueError:DataFrame的真值是不明确的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。我相信错误就在这一行 close= pd.Series(stockdetails['Adj Close'])
【解决方案2】:

我想通了!! - 我需要插入一个循环遍历这些值:

for row in tickers:
    c.execute("select [Adj Close] from StockData where Symbol = ? ", (row))
    AdjClose = c.fetchall()
    df_ta = pd.DataFrame(data = AdjClose, dtype=numpy.float64)
    df_ta = df_ta.apply(lambda c: talib.RSI(c, timeperiod = 14))

【讨论】:

  • 'for' 循环是否适用于所有四行?
猜你喜欢
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多