Добавление столбца в фрейм данных в Python

#python #pandas

#python #pandas

Вопрос:

Я пытаюсь добавить несколько столбцов в фрейм данных — вот код

 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))
  

Последняя строка выдает эту ошибку:

Ошибка значения: неверное количество переданных элементов 505, размещение подразумевает 1

Как я могу это исправить?

Комментарии:

1. какой тип stockdetails перед последней строкой?

2. Я думаю (извините, что все еще учусь) «stockdetails = []» сделает это списком?

3. вы инициализируете его как список, используя [] . но yf.download изменяет тип stockdetails

4. stockdetails в порядке! Я думаю, что это происходит, когда я пытаюсь добавить еще один столбец в фрейм данных, который вызывает сбой stockdetails[‘RSI’] = df_ta.apply(лямбда c: talib.RSI(c, timeperiod = 14))

Ответ №1:

Ваша лямбда-функция возвращает 505 значений, тогда как ваше назначение должно иметь только одно. Попробуйте преобразовать выходные данные в список-

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

Комментарии:

1. Благодарим за ответ — это изменение привело к этой ошибке ValueError: длина значений не соответствует длине индекса

2. Можете ли вы сообщить мне результат len(stockdetails) ?

3. конечно, это 128

4. Попробуйте: stockdetails['RSI']= talib.RSI(stockdetails['Adj Close'], timeperiod=14)

5. Спасибо, что я думаю, теперь я получаю эту ошибку: ValueError: значение истинности фрейма данных неоднозначно. Используйте .empty , .bool(),.item(),.any() или.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))
  

Комментарии:

1. Применяется ли цикл ‘for’ ко всем четырем строкам?