#python #sql #pandas #dataframe #pyodbc
Вопрос:
Это работает, НО выходные данные не совпадают по индексу (дате). Вместо этого добавляются новые столбцы, но начинаются с последней строки первого кадра данных, т. е. Данные складываются «сверху» друг на друга, поэтому индекс даты повторяется. Есть ли способ выполнить итерацию и создать столбцы, соответствующие дате?
indexReturnData = pd.DataFrame() indexcount = int(input("how many indices do you want to use? Enter a quantity: ")) i=0 while i lt; indexcount: indexList = pd.read_sql_query('SELECT * FROM Instruments', conn) indexList = indexList[['InstrumentName','InstrumentID']] indexList indexListFind = input('Enter partial index name: ') indexList = indexList[indexList['InstrumentName'].str.contains(indexListFind, case=False)] # #need to add and if else statement in case of errors.... indexList = pd.DataFrame(indexList) print(indexList) indexID = input('Pick/Type in an INDEX list ID ("InstrumentID") From the List Above: ') indexName = indexList.query('InstrumentID ==' str(indexID))['InstrumentName'] indexName = list(indexName) indexReturns = pd.read_sql_query(""" SELECT * FROM InstrumentPrices WHERE InstrumentID=""" indexID , conn) indexReturns = indexReturns.filter(['ReportingDate', 'Returns']) indexReturns = indexReturns.rename(columns={'ReportingDate': 'Date','Returns': indexName[0]}) indexReturns = indexReturns.set_index('Date') indexReturnData = indexReturnData.append(indexReturns) i = 1
Выход:
Date Samp;P500 Samp;P600 308 9/1/1995 0.042 309 10/1/1995 -0.004 310 11/1/1995 0.044 311 12/1/1995 0.019 ….. ….. ….. ….. 603 4/1/2020 0.128 604 5/1/2020 0.048 605 6/1/2020 0.020 606 7/1/2020 0.056 623 9/1/1995 0.025 624 10/1/1995 -0.050 625 11/1/1995 0.038 626 12/1/1995 0.016 ….. ….. ….. ….. 918 4/1/2020 0.126 919 5/1/2020 0.041 920 6/1/2020 0.036 921 7/1/2020 0.040
Спасибо!
Ответ №1:
Просто основываясь на том, какова ваша текущая производительность и какова, по-моему, ваша желаемая производительность, я думаю, что вам сойдет с рук только a df.groupby('Date').sum()
. Запуск этого процесса сгруппирует все дубликаты в столбце «Дата» и произведет суммирование всех значений, которые он найдет для каждого столбца. Если я правильно понимаю, каждый столбец будет иметь только одно значение для строки даты, поэтому он будет «суммировать» это единственное число: то есть он вернет это число.
Я скопировал небольшой раздел вывода, который у вас есть выше (и удалил пустые строки) , и просто сделал df.groupby('Date').sum()
и получил это:
Samp;P500 Samp;P600 Date 10/1/1995 -0.004 -0.050 11/1/1995 0.044 0.038 12/1/1995 0.019 0.016 4/1/2020 0.128 0.126 5/1/2020 0.048 0.041 6/1/2020 0.020 0.036 7/1/2020 0.056 0.040 9/1/1995 0.042 0.025