Как я могу запустить цикл for и добавить элементы в список в конце цикла?

#python #python-3.x

#python #python-3.x

Вопрос:

Здесь я упускаю что-то довольно простое, но это был долгий день, и я не уверен, что отключено. В приведенном ниже примере я трижды перебираю вызов списка ‘tickers’. Я хочу добавить результаты некоторого анализа в список в конце каждого цикла, поэтому добавляется три, а не 100 . Вот мой код.

 from pandas_datareader import data as wb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.pylab import rcParams
from sklearn.preprocessing import MinMaxScaler


start = '2020-03-01'
end = '2020-09-22'

tickers = ['TAN','QCLN','PBW']

thelen = len(tickers)

z=0
all_stocks=[]

price_data = []
for ticker in tickers:
    prices = wb.DataReader(ticker, start = start, end = end, data_source='yahoo')[['Open','Adj Close']]
    price_data.append(prices.assign(ticker=ticker)[['ticker', 'Open', 'Adj Close']])

    #names = np.reshape(price_data, (len(price_data), 1))
    
    df = pd.concat(price_data)
    df.reset_index(inplace=True)
    
    # doing some analysis in here, then writing results to a dataframe...

    z=z 1
    print(str(z)   ' of '   str(thelen))
    
all_stocks.append(ticker   ' act: '   str(new_seriesdata['Adj Close'].iloc[-1])   ' prd: '   str(myclosing_priceresult))
  

Как сейчас, я получаю все элементы в dataframe для последнего тикера, но первые два исчезли. Мне нужен тикер str(new_seriesdata[‘Adj Close’].iloc[-1]), который является последним элементом в фрейме данных.

Ответ №1:

  • Проблема в том, что код, вероятно, обновляет фрейм данных на месте prices .
    • Похоже, это не происходит в pandas версии 1.1.1.
  • Каждый раз, когда цикл повторяется, prices изменяется
  • price_data = []
    • price_data = [prices, prices, prices]
  • Чтобы prices правильно добавить, используйте .copy()
  • df = pd.concat(price_data) не должно быть в цикле
  • Если затем вы хотите выполнить вычисление для каждого тикера, используйте df.groupby('ticker') и агрегируйте вычисления.
 price_data = []

for ticker in tickers:
    prices = wb.DataReader(ticker, start = start, end = end, data_source='yahoo')[['Open','Adj Close']]
    price_data.append(prices.assign(ticker=ticker)[['ticker', 'Open', 'Adj Close']].copy())

df = pd.concat(price_data).reset_index()
  

df.head()

         Date ticker       Open  Adj Close
0 2020-03-02    TAN  36.630001  36.990002
1 2020-03-03    TAN  37.770000  37.130001
2 2020-03-04    TAN  38.130001  38.520000
3 2020-03-05    TAN  37.639999  38.330002
4 2020-03-06    TAN  37.299999  36.880001
  

df.tail()

           Date ticker       Open  Adj Close
424 2020-09-16    PBW  57.410000  57.650002
425 2020-09-17    PBW  56.130001  56.480000
426 2020-09-18    PBW  57.189999  57.310001
427 2020-09-21    PBW  56.139999  56.639999
428 2020-09-22    PBW  56.580002  56.509998