Как перебирать словарей и список для создания нового словаря - PullRequest
0 голосов
/ 19 января 2019

Из проекта я получаю список словарей, которые выглядят так:

METTS MARK = {'salary': 365788, 'to_messages': 807, 'deferral_payments': 'NaN', 'total_payments': 1061827, 'exercised_stock_options': 'NaN', 'bonus': 600000, 'limited_stock' : 585062, «shared_receipt_with_poi»: 702, «limited_stock_deferred»: «NaN», «total_stock_value»: 585062, «расходы»: 94299, «loan_advances»: «NaN», «from_messages»: 29, «прочее»: 1740, « from_this_person_to_poi ': 1,' poi ': False,' Director_fees ':' NaN ',' deferred_income ':' NaN ',' long_term_incentive ':' NaN ',' email_address ':' mark.metts@enron.com ',' from_poi_to_this_person ': 38}

Что я хочу сделать, это взять каждое из значений, масштабировать его, заменить значение «NaN» на 0, а затем вернуть его на свое законное место в словаре.

Код, который я пробовал, выглядит следующим образом:

Загрузить словарь, содержащий набор данных

with open("final_project_dataset.pkl", "r") as data_file:
    data_dict = pickle.load(data_file)

Ключ в наборе данных с именем total создавал явный выброс, поэтому я удалил его

del data_dict["TOTAL"]

Интуитивно выбирая мои функции

my_features = [
    'poi',
    'salary',#
    'bonus',#
    'exercised_stock_options',#
    'total_stock_value',#
    'total_payments',
    'expenses',
    'loan_advances',#
    'deferral_payments',
    'deferred_income',
    'restricted_stock',#
    'restricted_stock_deferred',
    'long_term_incentive',#
    'shared_receipt_with_poi',#
    #'from_this_person_to_poi',
    #director_fees',
    #'from_messages',
    #'to_messages',
    #'from_poi_to_this_person'
]


keys = data_dict.keys()
values = data_dict.values()

замена значений NaN на 0 значений

list_of_values = []
for key in keys:
        tmp_list = []
        for feature in my_features:
            try:
                data_dict[key][feature]
            except KeyError:
                print "error: key ", feature, " not present"
            value = data_dict[key][feature]
            if value=="NaN":
                value = 0
            tmp_list.append( float(value) )
        list_of_values.append(tmp_list)

функция масштабирования с помощью скейлера min / max

from sklearn.preprocessing import MinMaxScaler
data_array = np.array(list_of_values)
scaler = MinMaxScaler()
rescaled_data = scaler.fit_transform(data_array)

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

[0. 0,32916568 0,075 0,01279963 0,01025327 0,41221264 0,01569801 1. 0,18366453 0,10365427 0. 0.12715088]

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

my_data_dict = []
for key in keys:
    key = {}
    for x in range( len(rescaled_data) ):
        for count in range( len(my_features) ):
            key[ my_features[count] ] = rescaled_data[x][count]        
    my_data_dict.append(key)

Но я получаю длинный список словарей с одинаковыми значениями .. например:

{'salary': 0,24744478779905296, 'deferral_payments': 0,01569801010492397, 'total_payments': 0,01228550157492107, 'loan_advances': 0,0, 'бонус': 0,075, 'limited_stock_detockred': 0,103679 '361: 366 068,668) 689%: всего: 0 038 365 361: 0688: 369: 0688: 361: 0688: 361: 0,68: 0,668: 0,668: 0,668: 036: 0: 0: 0: 8: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 89: 0: 89: 0: 89: 0: 89: 0: 89: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0. 0.550692201098954, 'exercised_stock_options': 0.011200759837784508, 'poi': 1.0, 'deferred_income': 1.0, 'shared_receipt_with_poi': 0.1583046549538127, 'limited_stock': 0.17265209213492153} 061 * 10313803803% в течение длительного времени: 0,013% 1031%, т.

{'salary': 0,24744478779905296, 'deferral_payments': 0,01569801010492397, 'total_payments': 0,01228550157492107, 'loan_advances': 0,0, 'бонус': 0,075, 'limited_stock_detockred': 0,103679 '361: 366 068,668) 4906868689 0.550692201098954, 'exercised_stock_options': 0.011200759837784508, 'poi': 1.0, 'deferred_income': 1.0, 'shared_receipt_with_poi': 0.1583046549538127, 'limited_stock': 0.17265209213492153} 061 * 10313103, 1031%, 10113113803_1803_1803803_1803_1803_1803_1803_1803_1803_380_113_113_311003_1803_1803_1803_311_1803_311_1803_311_1803_1003_180_113_113_113_1803313_3113113 0313 10 10 10 10 10 10 15 15 153 0833 10313,183113113113 103 0313 3 103 3 831 3 8 8 8 8 8 8 8 3 8 3 3 3 за 3 года в течение долгих лет ', в долг.

Как мне взять ключи из data_dict (старый словарь), изменить их данные и сложить в новый словарь?

1 Ответ

0 голосов
/ 19 января 2019

Как сказал Джо Паттен, панды упрощают работу, вы можете преобразовать свой словарь в информационный фрейм, сделать свои вещи и затем преобразовать их обратно в словарь, если хотите:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

ser = pd.Series(METTS_MARK) #I am using your METTS_MARK

ser.replace('NaN',0,inplace=True)
ser.drop(index="email_address",inplace=True) #to make everything numerical so we can scale, you can add it back later

df = pd.DataFrame(ser)

scaler = MinMaxScaler()
df[0] = scaler.fit_transform(df)

после того, как вы закончите:

newDict = df[0].to_dict()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...