Как сделать эту функцию повторяемой (получение indexerror) - PullRequest
0 голосов
/ 23 января 2020

Я довольно новичок в python и кодировании в целом. У меня есть большой файл данных, который предоставляет ежедневные данные за период 2011–2018 гг. Для ряда биржевых тикеров (300 ~).

Данные представляют собой файл .csv с приблизительно 150 тыс. Строк и выглядят следующим образом (короткий пример):

Date,Symbol,ShortExemptVolume,ShortVolume,TotalVolume
20110103,AAWW,0.0,28369,78113.0
20110103,AMD,0.0,3183556,8095093.0
20110103,AMRS,0.0,14196,18811.0
20110103,ARAY,0.0,31685,77976.0
20110103,ARCC,0.0,177208,423768.0
20110103,ASCMA,0.0,3930,26527.0
20110103,ATI,0.0,193772,301287.0
20110103,ATSG,0.0,23659,72965.0
20110103,AVID,0.0,7211,18896.0
20110103,BMRN,0.0,21740,213974.0
20110103,CAMP,0.0,2000,11401.0
20110103,CIEN,0.0,625165,1309490.0
20110103,COWN,0.0,3195,24293.0
20110103,CSV,0.0,6133,25394.0

У меня есть функция, которая позволяет мне фильтровать определенный символ c и получать 10 наблюдений до и после указанной даты (может быть любой датой между 2011 и 2018 гг.).

import pandas as pd
from datetime import datetime
import urllib
import datetime

def get_data(issue_date, stock_ticker):
    df = pd.read_csv (r'D:\Project\Data\Short_Interest\exampledata.csv')
    df['Date'] = pd.to_datetime(df['Date'], format="%Y%m%d")
    d = df

    df = pd.DataFrame(d)
    short = df.loc[df.Symbol.eq(stock_ticker)]
    # get the index of the row of interest
    ix = short[short.Date.eq(issue_date)].index[0]
    # get the item row for that row's index
    iloc_ix = short.index.get_loc(ix)
    # get the +/-1 iloc rows (+2 because that is how slices work), basically +1 and -1 trading days
    short_data = short.iloc[iloc_ix-10: iloc_ix+11]
    return [short_data]

Я хочу создать сценарий, который повторяет список «Issue_Dates» и «Stock_tickers». Список (.csv) выглядит следующим образом:

ARAY,07/08/2017
ARAY,24/04/2014
ACETQ,16/11/2015
ACETQ,16/11/2015
NVLNA,15/08/2014
ATSG,29/09/2017
ATI,24/05/2016
MDRX,18/06/2013
MDRX,18/06/2013
AMAGX,10/05/2017
AMAGX,14/02/2014
AMD,14/09/2016

Чтобы разбить мою проблему и вопрос, я хотел бы знать, как сделать следующее:

Во-первых, как мне загрузить входы?

Во-вторых, как мне вызвать функцию на каждом входе?

И, наконец, как мне накапливать все возвраты функции в одном кадре данных?

1 Ответ

0 голосов
/ 23 января 2020

Для загрузки входов и вызова функции для каждой строки; переберите файл csv, передайте значения каждой строки функции и соберите получившийся Series в списке.

Я немного изменил вашу функцию: удалил создание DataFrame, чтобы оно выполнялось только один раз, и добавил блок try/except, чтобы учесть пропущенные даты или тикеры (данные вашего примера не совпадали слишком хорошо). Даты во втором csv выглядят так, как будто они day/month/year, поэтому я преобразовал их для этого формата.

import pandas as pd
import datetime, csv

def get_data(df, issue_date, stock_ticker):
    '''Return a Series for the ticker centered on the issue date.

    '''
    short = df.loc[df.Symbol.eq(stock_ticker)]
    # get the index of the row of interest
    try:
        ix = short[short.Date.eq(issue_date)].index[0]
        # get the item row for that row's index
        iloc_ix = short.index.get_loc(ix)
        # get the +/-1 iloc rows (+2 because that is how slices work), basically +1 and -1 trading days
        short_data = short.iloc[iloc_ix-10: iloc_ix+11]
    except IndexError:
        msg = f'no data for {stock_ticker} on {issue_date}'
        #log.info(msg)
        print(msg)
        short_data = None
    return short_data

df = pd.read_csv (datafile)
df['Date'] = pd.to_datetime(df['Date'], format="%Y%m%d")

results = []
with open('issues.csv') as issues:
    for ticker,date in csv.reader(issues):
        day,month,year = map(int,date.split('/'))
    #    dt = datetime.datetime.strptime(date, r'%d/%m/%Y')
        date = datetime.date(year,month,day)
        s = get_data(df,date,ticker)
        results.append(s)
    #    print(s)

Создание единого DataFrame или таблицы для всей этой информации может быть проблематичным c особенно поскольку диапазоны дат все разные. Наверное, стоит задать отдельный вопрос по этому поводу. Его mcve , вероятно, должен включать несколько минимальных серий Pandas с парой различных диапазонов дат и тикеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...