Python определяет функцию для подмножества датафрейма по условию в заданном c столбце - PullRequest
0 голосов
/ 20 марта 2020

Пытаюсь создать функцию для создания новых фреймов данных для каждого сектора, но не уверен, что я делаю неправильно в возвращаемой части функции.

Это то, что я сделал, чтобы создать числа для каждого сектор. тогда в моих данных у меня есть столбец gsector, в котором есть номера для соответствующего сектора. Надеюсь, это имеет смысл.

# Create a list of the GICS Sectors 
Energy = 10
Materials = 15 
Industrials = 20
Consumer_Discretionary = 25
Consumer_Staples = 30
Health_Care = 35
Financials = 40
Information_Technology = 45
Communication_Services = 50
Utilities = 55
Real_Estate = 60

GICS_Sectors = [Energy,Materials,Industrials,Consumer_Discretionary,Consumer_Staples,Health_Care,Financials,Information_Technology,Communication_Services,Utilities,Real_Estate]
##############################################################################

def Sector_Subset(dataframe,GICS_Sectors):
    """
    This function takes a dataframe and will pull sector specific data 
    to create a new dataframe for each eactor

    Parameters:
        dataframe = Portfolio
        GICS_Sectors = Each 11 sectors

    Return:
        GICS_dataframe

    Notes:
        We want to do this so we can easily graph momentum separately to compare sectors
    """
        dataframe[['datadate','GVKEY','trt1m','gsector','Start_Date','Rank_Percentile','Buy_Date','Sell_Date']]
return [dataframe.groupby('gsector').get_group(d) for d in GICS_Sectors]


Energy_Portfolio = Sector_Subset(Portfolio,Energy)

1 Ответ

0 голосов
/ 20 марта 2020

Наиболее вероятная ошибка в последней строке вашего примера

Вместо:

return [dataframe.get_group(d) for d in GICS_Sectors]

Вы должны написать:

return [dataframe.groupby('gsector').get_group(d) for d in GICS_Sectors]

Как вы упоминали ранее , вы хотите сгруппировать данные по столбцу «gsector». Тем не менее, это не было указано нигде в разрезанной. Я не на 100% это была ваша проблема - переменные Portfolio и Energy не были объявлены, поэтому я должен был догадаться.

Вот мой рабочий пример кода со случайными данными в кадре данных.

import pandas as pd

# Modified original function
def Sector_Subset(dataframe,GICS_Sectors):
    """
    This function takes a dataframe and will pull sector specific data 
    to create a new dataframe for each eactor

    Parameters:
        dataframe = Portfolio
        GICS_Sectors = Each 11 sectors

    Return:
        GICS_dataframe

    Notes:
        We want to do this so we can easily graph momentum separately to compare sectors
    """

dataframe[['datadate','GVKEY','trt1m',
           'gsector','Start_Date','Rank_Percentile',
           'Buy_Date','Sell_Date']]

    # Below is the suspected error
    return [dataframe.groupby('gsector').get_group(d) for d in GICS_Sectors]
    # Original code
    # return [dataframe.get_group(d) for d in GICS_Sectors]

# Example data
Portfolio = {'datadate':['2020-03-20', '2020-03-19', '2020-03-18', '2020-03-17'],
        'GVKEY':[201, 211, 191, 181],
        'trt1m':[202, 212, 192, 182],
        'gsector':['Italy', 'Poland', 'Germany', 'Italy'],
        'Start_Date':['2020-03-15', '2020-02-19', '2020-03-13', '2020-03-11'],
        'End_Date':['2020-03-16', '2020-03-19', '2020-03-16', '2020-03-12'],
        'Rank_Percentile':['30th', '40th', '45th', '29th'],
        'Buy_Date':['2020-03-15', '2020-03-15', '2020-03-15', '2020-03-15'],
        'Sell_Date':['2020-03-17', '2020-03-18', '2020-03-165', '2020-03-15']}

# Test the function
Portfolio = pd.DataFrame(Portfolio)
Energy = ['Italy', 'Poland', 'Germany']
Energy_Portfolio = Sector_Subset(Portfolio, Energy)

# Print results
for enrg in Energy_Portfolio:
    print('\n')
    print(enrg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...