Проблема с использованием kmeans для отфильтрованных данных pandas. ⇐ Python
-
Anonymous
Проблема с использованием kmeans для отфильтрованных данных pandas.
Я импортировал файл CSV и отфильтровал два столбца. Очень стандартно и работает, как и ожидалось. Однако, как только я запускаю тест KMeans, результат оказывается неожиданным. Я либо запускаю его со всем набором данных (а не с отфильтрованными данными), либо с неправильными данными.
# Загрузить данные data = pd.read_csv('ISD.csv',coding='ISO-8859-1') # Удалить «%» из всего DataFrame data = data.apply(lambda x: x.str.rstrip('%') if x.dtype == 'O' else x) # Замените '#DIV/0!' с NaN data.replace('#DIV/0!', pd.NA, inplace=True) # Преобразуем соответствующие столбцы в плавающие, заменяя пропущенные значения 0 data['Долг к собственному капиталу'] = data['Долг к собственному капиталу'].replace(pd.NA, '0').astype(float) Это загружает загруженные данные.
# Выберите соответствующие финансовые показатели selected_metrics = data[['Долг к собственному капиталу', 'Стабильное финансовое положение']] # Применить фильтры filtered_data = selected_metrics[(selected_metrics['Стабильное финансовое положение'] == 1)].copy() # Проверьте количество стабильного финансового положения в отфильтрованных данных. print("Показатели стабильного финансового положения в отфильтрованных данных:") print(filtered_data['Стабильное финансовое положение'].value_counts()) # Сброс индекса filtered_data filtered_data.reset_index(drop=True, inplace=True) print(filtered_data['Стабильное финансовое положение'].value_counts()) print (filtered_data['Долг к собственному капиталу'].max()) print (filtered_data['Долг к собственному капиталу'].min()) Результат ожидаемый и правильный
Признаки стабильного финансового положения в отфильтрованных данных:
Стабильное финансовое положение 1 1316 Имя: count, тип d: int64 Стабильное финансовое положение 1 1316 Имя: count, тип d: int64 1.923278013 1.25e-09 Однако на следующем этапе все, похоже, дает сбой, и результаты становятся неожиданными.
# Кластеризация kmeans = KMeans(n_clusters=3, n_init=10) # Отрегулируйте количество кластеров по мере необходимости # Подгонка и прогнозирование отфильтрованных данных Cluster_labels = kmeans.fit_predict(filtered_data[['Долг к собственному капиталу', 'Стабильное финансовое положение']]) # Назначаем метки кластера исходному DataFrame data.loc[filtered_data.index, 'Кластер'] = метки_кластера Выполнение описаний ниже дает максимальное значение 226149 для кластера 0, 370 для кластера 1 и 5000 для кластера 2.
# Проверка меток кластера print("\nКоличество кластеров:") print(данные['Кластер'].value_counts()) # Изучите характеристики кластера Cluster_stats = data.groupby('Cluster')['Долг к собственному капиталу'].describe() print("\nХарактеристики кластера:") печать (cluster_stats) результаты ниже
Количество кластеров: Кластер 0,0 998 1,0 244 2,0 74 Имя: count, тип d: int64 Характеристики кластера: среднее значение счета стандартное ... 50% 75% макс. Кластер... 0,0 968,0 524,708244 8306,283145 ... 0,056144 1,629182 226149.000000 1,0 239,0 550,843018 4978,241124 ... 0,054620 1,931508 50000,000000 2,0 71,0 13,488451 64,011376 ... 0,007957 0,373877 370,186275 Я ошибаюсь с фильтрацией или с тестом Kmeans?
спасибо
Я импортировал файл CSV и отфильтровал два столбца. Очень стандартно и работает, как и ожидалось. Однако, как только я запускаю тест KMeans, результат оказывается неожиданным. Я либо запускаю его со всем набором данных (а не с отфильтрованными данными), либо с неправильными данными.
# Загрузить данные data = pd.read_csv('ISD.csv',coding='ISO-8859-1') # Удалить «%» из всего DataFrame data = data.apply(lambda x: x.str.rstrip('%') if x.dtype == 'O' else x) # Замените '#DIV/0!' с NaN data.replace('#DIV/0!', pd.NA, inplace=True) # Преобразуем соответствующие столбцы в плавающие, заменяя пропущенные значения 0 data['Долг к собственному капиталу'] = data['Долг к собственному капиталу'].replace(pd.NA, '0').astype(float) Это загружает загруженные данные.
# Выберите соответствующие финансовые показатели selected_metrics = data[['Долг к собственному капиталу', 'Стабильное финансовое положение']] # Применить фильтры filtered_data = selected_metrics[(selected_metrics['Стабильное финансовое положение'] == 1)].copy() # Проверьте количество стабильного финансового положения в отфильтрованных данных. print("Показатели стабильного финансового положения в отфильтрованных данных:") print(filtered_data['Стабильное финансовое положение'].value_counts()) # Сброс индекса filtered_data filtered_data.reset_index(drop=True, inplace=True) print(filtered_data['Стабильное финансовое положение'].value_counts()) print (filtered_data['Долг к собственному капиталу'].max()) print (filtered_data['Долг к собственному капиталу'].min()) Результат ожидаемый и правильный
Признаки стабильного финансового положения в отфильтрованных данных:
Стабильное финансовое положение 1 1316 Имя: count, тип d: int64 Стабильное финансовое положение 1 1316 Имя: count, тип d: int64 1.923278013 1.25e-09 Однако на следующем этапе все, похоже, дает сбой, и результаты становятся неожиданными.
# Кластеризация kmeans = KMeans(n_clusters=3, n_init=10) # Отрегулируйте количество кластеров по мере необходимости # Подгонка и прогнозирование отфильтрованных данных Cluster_labels = kmeans.fit_predict(filtered_data[['Долг к собственному капиталу', 'Стабильное финансовое положение']]) # Назначаем метки кластера исходному DataFrame data.loc[filtered_data.index, 'Кластер'] = метки_кластера Выполнение описаний ниже дает максимальное значение 226149 для кластера 0, 370 для кластера 1 и 5000 для кластера 2.
# Проверка меток кластера print("\nКоличество кластеров:") print(данные['Кластер'].value_counts()) # Изучите характеристики кластера Cluster_stats = data.groupby('Cluster')['Долг к собственному капиталу'].describe() print("\nХарактеристики кластера:") печать (cluster_stats) результаты ниже
Количество кластеров: Кластер 0,0 998 1,0 244 2,0 74 Имя: count, тип d: int64 Характеристики кластера: среднее значение счета стандартное ... 50% 75% макс. Кластер... 0,0 968,0 524,708244 8306,283145 ... 0,056144 1,629182 226149.000000 1,0 239,0 550,843018 4978,241124 ... 0,054620 1,931508 50000,000000 2,0 71,0 13,488451 64,011376 ... 0,007957 0,373877 370,186275 Я ошибаюсь с фильтрацией или с тестом Kmeans?
спасибо