Несколько критериев фильтрации для кадра данных - PullRequest
0 голосов
/ 16 января 2020

Благодаря @James у меня есть рабочий критерий фильтра. Теперь я попытался создать сценарий, который позволил бы мне загрузить файл данных, который содержит список биржевых тикеров и даты выпуска. Следовательно, я хочу перебрать список по функции фильтра. Тем не менее, я продолжаю получать

IndexError: index 0 is out of bounds for axis 0 with size 0

Любой способ как это исправить? См. Ниже сценарий и функцию:

Функция фильтра:

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\mergedshort.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»).

import shortdatafilterfinal
import csv
import tkinter as tk
from tkinter import filedialog

# SHORT DATA trading day time series
# Open File Dialog
# iterates the stock tickers and respective dates over the filter function

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename()

# Load Spreadsheet data
f = open(file_path)

csv_f = csv.reader(f)
next(csv_f)

result_data = []

# Iterate
for row in csv_f:
    try:
       return_data = shortdatafilterfinal.get_data(row[1], row[0])
       if len(return_data) != 0:
          # print(return_data)
          result_data_loc = [row[1], row[0]]
          result_data_loc.extend(return_data)
          result_data.append(result_data_loc)
    except AttributeError:
          print(row[0])
          print('\n\n')
          print(row[1])
          continue

if result_data is not None:
    with open('resultsshort.csv', mode='w', newline='') as result_file:
        csv_writer = csv.writer(result_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        for result in result_data:
            # print(result)
            csv_writer.writerow(result)
else:
    print("No results found!")

Ответы [ 2 ]

2 голосов
/ 16 января 2020

Если я правильно понял, вы хотите выбрать +/- 1 строку из выбранной даты:

short = df.loc[df['Symbol'] == 'ARAY']

def get_date(df, d):
    v = short['Date']==d
    return df[v | v.shift(fill_value=False) | v.shift(-1,fill_value=False)]

print(get_date(short, '2011-01-08'))

Отпечатки:

         Date Symbol
3  2011-01-06   ARAY
6  2011-01-08   ARAY
9  2011-01-12   ARAY
1 голос
/ 16 января 2020

Вы можете использовать .iloc для просмотра индекса элемента отфильтрованных результатов.

import pandas as pd

d = {'Date':['2011-01-03', '2011-01-03', '2011-01-03','2011-01-06', '2011-01-06', 
             '2011-01-06', '2011-01-08', '2011-01-08','2011-01-08', '2011-01-12', 
             '2011-01-12', '2011-01-12'], 
     'Symbol':['ARAY', 'POLA', 'AMRI', 'ARAY', 'POLA', 'AMRI', 'ARAY', 'POLA', 
               'AMRI', 'ARAY', 'POLA', 'AMRI']}
df = pd.DataFrame(d)

def look_around(df, symbol, date):
    short = df.loc[df.Symbol.eq(symbol)]
    # get the index of the row of interest
    ix = short[short.Date.eq(date)].index[0]
    # get the item row for that row's index
    iloc_ix = short.index.get_loc(ix)
    # get the +/-1 iloc rows (you have to use +2 because that is how slices work)
    return short.iloc[iloc_ix-1: iloc_ix+2]

look_around(df, 'ARAY', '2011-01-08')
# returns:
        Date Symbol
3 2011-01-06   ARAY
6 2011-01-08   ARAY
9 2011-01-12   ARAY
...