Почему мой цикл for не повторяется по всему списку панд - PullRequest
2 голосов
/ 29 октября 2019

stockticker_data - это кадр данных Pandas, который содержит список тикеров, но цикл for не выполняет итерацию по всему списку. По какой-то причине он останавливается сразу после первого символа списка. Что мне нужно сделать, чтобы перейти к следующему символу?

stockticker_data = pd.read_csv("Nifty 50 Scrapped data.csv")

all_data = {}

for ticker in stockticker_data:
    all_data = web.get_data_yahoo(ticker, '1/1/2018', '1/1/2019') 

print(all_data)

Вывод выглядит так:

             High         Low  ...      Volume   Adj Close
Date                                ...                        
2018-01-02  172.300003  169.259995  ...  25555900.0  167.701889
2018-01-03  174.550003  171.960007  ...  29517900.0  167.672668
2018-01-04  173.470001  172.080002  ...  22434600.0  168.451508

Я изменил код на

for index, ticker in stockticker_data.iteritems():

    all_data.append(web.get_data_yahoo(ticker, '1/1/2018', '1/1/2019'))

print(all_data)

Выходные данные изменились, но данные были получены только для одного символа: что-то здесь мне не хватает?

[Attributes   Adj Close                ...      Volume           
Symbols    AXISBANK.NS BAJAJ-AUTO.NS  ...  YESBANK.NS    ZEEL.NS
Date                                  ...                       
2018-01-01  564.798584   3152.436035  ...   4019878.0  1102118.0
2018-01-02  558.806030   3157.707031  ...   5224976.0   769766.0
2018-01-03  559.754822   3106.240723  ...   5672263.0  1207540.0
2018-01-04  559.205566   3128.667480  ...   5667580.0  1456032.0
2018-01-05  562.551331   3143.427002  ...  30720675.0  1568108.0
...                ...           ...  ...         ...        ...
2018-12-27  616.783997   2677.074463  ...  44303877.0  5809491.0
2018-12-28  624.274719   2658.001221  ...  27142501.0  6000271.0
2018-12-31  619.131104   2660.593262  ...  18970865.0  2663133.0
2019-01-01  626.521912   2666.950928  ...  24160878.0  2203533.0
2019-01-02  619.280884   2633.059570  ...  32583205.0  2687773.0

[248 rows x 288 columns]]

Process finished with exit code 0

Ответы [ 3 ]

3 голосов
/ 29 октября 2019

Вы фактически не добавляете в словарь all_data, вы просто перезаписываете переменную, поэтому она всегда будет последним объектом в вашем цикле for. Попробуйте добавить в список.

stockticker_data = pd.read_csv("Nifty 50 Scrapped data.csv")

all_data = []

for ticker in stockticker_data:
    all_data.append(web.get_data_yahoo(ticker, '1/1/2018', '1/1/2019'))

print(all_data)
0 голосов
/ 29 октября 2019

Поскольку вы заявили, что вам нужно циклически проходить элементы данных, вы можете использовать метод iteritems объекта dataframe для получения списка индексов строк и объектов серии, где заголовок столбца можно использовать в качестве атрибута для получения вашего значения.

Например, допустим, у меня есть следующие данные в "Nifty 50 Scrapped data.csv"

Ticker
CSCO
DFS
SOMETHING

, после чего вы можете получить свой товар с помощью следующего кода,

for rowIndex,  col in stockticker_data.iterrows():
    print rowIndex, col.Ticker
0 голосов
/ 29 октября 2019

Ваш оператор print находится за пределами цикла, поэтому он вычисляет all_data для каждого тикера, а затем печатает all_data только для последнего цикла.

Кроме того, циклический просмотр кадров данных неэффективен. Лучше сделать что-то вроде:

get_data = lambda ticker: web.get_data_yahoo(ticker, '1/1/2018', '1/1/2019')
stockticker_data['tickers'].apply(get_data)

, где 'tickers' - это имя столбца stockticker_data, содержащего символы тикера.

...