#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
изменяет тип stockdetails4. 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’ ко всем четырем строкам?