Объединение фреймов данных pandas, созданных с помощью цикла для данных базы данных SQL

#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