<jupyter_start><jupyter_text>Kolumna features zawiera słowniki zapisane w postacji stringmając słownik i podając metodę str(dict) otrzymamy zapis stringowy słownika, analogiczny jak w kolumnie features. Poniższa funkcja przywraca postać słownika ze stringa<jupyter_code>str_dict = '[{"key":"Gender","value":["Men"]},{"key":"Shoe Size","value":["M"]},{"key":"Shoe Category","value":["Men\'s Shoes"]},{"key":"Color","value":["Multicolor"]},{"key":"Manufacturer Part Number","value":["8190-W-NAVY-7.5"]},{"key":"Brand","value":["Josmo"]}]'
literal_eval(str_dict)
def parse_features (x):
  output_dict = {}
  if str(x) == 'nan' : return output_dict
  features = literal_eval(x.replace('\\"','"'))
  #po tej operacji mamy 'key': 'Gender', 'value': ['Men'], a chcemy 'Gender': 'Men'
  
  for item in features:
    key = item['key'].lower().strip() #to co jest pod key przypisujemy do key 
    # i jednoczesnie zamieniamy na małe litery i usuwamy spacje
    value = item['value'][0].lower().strip()
    
    output_dict[key]=value #wynik zapisujemy do nowego słownika

  return output_dict

df['features_parsed']= df['features'].map(parse_features)
df['features_parsed'].head()
keys = set()
df['features_parsed'].map (lambda x:keys.update(x.keys()))
len(keys)<jupyter_output><empty_output><jupyter_text>W kolejnym kroku dodajemy kolumny do danych odpowiadające poszczególnym key w zbiorze keys. Dostaną one nową nazwę z przedrostkiem "feat_".<jupyter_code>def get_name_feat(key):
  return 'feat_' + key

for key in tqdm_notebook(keys):
  df[get_name_feat(key)]=df.features_parsed.map(lambda feats: feats[key] if key in feats else np.nan)
df.columns<jupyter_output><empty_output><jupyter_text>Następnie sprawdzamy jak często występują poszczególne cechy.<jupyter_code>keys_stat = {}
for key in keys:
  keys_stat[key] = df [False == df[get_name_feat(key)].isnull()].shape[0]/df.shape[0]*100<jupyter_output><empty_output><jupyter_text>Danych jest dużo. Tworzymy filtr, który wybiera tylko te czechy które występują w ponad 30% danych.<jupyter_code>{k:v for k,v in keys_stat.items() if v>30}
df['feat_brand_cat']=df['feat_brand'].factorize()[0]
df['feat_color_cat']=df['feat_color'].factorize()[0]
df['feat_gender_cat']=df['feat_gender'].factorize()[0]
df['feat_manufacturer part number_cat']=df['feat_manufacturer part number'].factorize()[0]
df['feat_material_cat']=df['feat_material'].factorize()[0]

#zautomatyzowanie tego procesu dla wszystkich wartości
for key in keys:
  df[ get_name_feat(key) +'_cat'] =df[get_name_feat(key)].factorize()[0]
# wyciągnięcie zmiennych, które mają cat w nazwie
feats_cat = [x for x in df.columns if 'cat' in x]
feats_cat
#porównujemy czy cecha brand jest równa nowej feat_brand
df['brand'] = df['brand'].map(lambda x: str(x).lower())
df [ df.brand == df.feat_brand].shape<jupyter_output><empty_output><jupyter_text>Sprawdzamy model z nowymi zmiennymi<jupyter_code>feats = ['brand_cat', 'feat_brand_cat', 'feat_color_cat', 'feat_gender_cat', 'feat_manufacturer part number_cat', 'feat_material_cat']
model = RandomForestRegressor(max_depth=5, n_estimators=100, random_state=0)
result = run_model (feats, model)
X = df[feats].values
y = df['prices_amountmin'].values

m = RandomForestRegressor(max_depth=5, n_estimators=100, random_state=0)
m.fit(X,y)
print(result)
perm = PermutationImportance(m, random_state=1).fit(X,y)
eli5.show_weights(perm, feature_names = feats)
#Cecha 	feat_manufacturer part number_cat oraz 	feat_color_cat mają najmniejsze znaczenie. Można je usunąć
feats = ['brand_cat', 'feat_brand_cat', 'feat_gender_cat', 'feat_material_cat', 'feat_shape_cat', 'feat_color_cat','feat_metal type_cat', 'feat_style_cat']
model = RandomForestRegressor(max_depth=5, n_estimators=100, random_state=0)
result = run_model (feats, model)
X = df[feats].values
y = df['prices_amountmin'].values

m = RandomForestRegressor(max_depth=5, n_estimators=100, random_state=0)
m.fit(X,y)

print (result)
perm = PermutationImportance(m, random_state=1).fit(X,y)
eli5.show_weights(perm, feature_names = feats)<jupyter_output>(-57.35721017566436, 4.217609779695144)<jupyter_text>Brand jest ważny. Spróbujemy go poznać bliżej<jupyter_code>df.brand.value_counts(normalize = True)
df[df['brand'] == 'nike'].features_parsed.sample(5).values
!ls
!git add matrix_one/day5.ipynb
!git commit -m "Future engineering"
!git config --global user.email "<EMAIL>"
!git config --global user.name "Agnes"
!git push -u origin master<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1490029128388976, 'fraction_numerical': 0.017925162446784673, 'mean_word_length': 7.7358121330724074, 'pattern_counts': {'":': 12, '<': 25, '<?xml version=': 0, '>': 26, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '608809', 'license': 'MIT', 'n_tokens_mistral': 1771, 'n_tokens_neox': 1740, 'n_words': 345, 'path': 'day5.ipynb', 'repo_name': 'Agnesing/matrix', 'size': '4476'}