35 lines
1.2 KiB
Python
35 lines
1.2 KiB
Python
|
import pandas as pd
|
||
|
from sklearn.cluster import KMeans
|
||
|
from sklearn.preprocessing import StandardScaler
|
||
|
import matplotlib.pyplot as plt
|
||
|
|
||
|
# Загрузка данных
|
||
|
data = pd.read_csv("train_bikes.csv", sep=',').dropna()
|
||
|
|
||
|
# Выделение признаков (временные интервалы и количество аренды)
|
||
|
X = data[['datetime', 'count']].copy() # Создаем копию DataFrame
|
||
|
|
||
|
# Преобразование формата времени
|
||
|
X['datetime'] = pd.to_datetime(X['datetime'])
|
||
|
X['hour'] = X['datetime'].dt.hour
|
||
|
|
||
|
# Выполнение кластеризации
|
||
|
features = ['hour', 'count']
|
||
|
X_cluster = X[features]
|
||
|
scaler = StandardScaler()
|
||
|
X_scaled = scaler.fit_transform(X_cluster)
|
||
|
|
||
|
# Используйтся .loc для избежания SettingWithCopyWarning
|
||
|
X.loc[:, 'cluster'] = KMeans(n_clusters=3, random_state=42, n_init=10).fit_predict(X_scaled)
|
||
|
|
||
|
# Визуализация результатов
|
||
|
plt.scatter(X['hour'], X['count'], c=X['cluster'], cmap='viridis')
|
||
|
plt.xlabel('Hour of Day')
|
||
|
plt.ylabel('Bike Rentals')
|
||
|
plt.title('Clustering of Time Intervals based on Bike Rentals')
|
||
|
plt.show()
|
||
|
|
||
|
# Анализ результатов
|
||
|
cluster_summary = X.groupby('cluster')['count'].describe()
|
||
|
print(cluster_summary)
|