Загрузка данных


import pandas as pd
import numpy as np

# ============================================================
# 1. Загрузка данных
# ============================================================
# Если файл лежит рядом с ноутбуком:
df = pd.read_csv('listings.csv')

# Если хочешь загружать напрямую по ссылке (пример — замени на актуальную):
# df = pd.read_csv('http://data.insideairbnb.com/united-states/ny/new-york-city/YYYY-MM-DD/visualisations/listings.csv')

print("Размер датасета:", df.shape)
print("\nКолонки:")
print(df.columns.tolist())

# ============================================================
# 2a. Вывод начальных и конечных строк
# ============================================================
print("\n=== Первые 5 строк ===")
print(df.head())

print("\n=== Последние 5 строк ===")
print(df.tail())

# ============================================================
# 2б. Подготовка данных
# ============================================================

# Типы столбцов
print("\n=== Типы столбцов ===")
print(df.dtypes)

# Количество незаполненных значений в каждом столбце
print("\n=== Количество пропусков в каждом столбце ===")
print(df.isnull().sum())

# Количество строк после удаления строк с пропусками
df_clean = df.dropna()
print(f"\nИсходное количество строк: {len(df)}")
print(f"Количество строк после удаления пропусков: {len(df_clean)}")

# ============================================================
# 2в. Анализ данных
# ============================================================

# --- Средняя и медианная цена ---
print("\n=== Описательная статистика цены ===")
print("Средняя цена (mean):", round(df['price'].mean(), 2))
print("Медианная цена (median):", round(df['price'].median(), 2))

print("\nПолная описательная статистика по цене:")
print(df['price'].describe())

# --- Группировка по типу помещения (room_type) ---
print("\n=== Средняя и медианная цена по типу помещения ===")
room_stats = df.groupby('room_type')['price'].agg(['mean', 'median', 'count'])
room_stats = room_stats.round(2)
print(room_stats)

# --- Группировка по типу объекта и году (из last_review) ---
# Сначала преобразуем last_review в дату и вытащим год
df['last_review'] = pd.to_datetime(df['last_review'], errors='coerce')
df['year'] = df['last_review'].dt.year

print("\n=== Группировка по room_type и году последнего отзыва ===")
grouped = df.groupby(['room_type', 'year'])['price'].agg(['mean', 'median', 'count']).round(2)
print(grouped)

# Можно посмотреть только последние годы (например, 2022–2024)
print("\n=== Только 2022–2024 годы ===")
print(grouped.loc[(slice(None), [2022, 2023, 2024]), :])

# ============================================================
# Отбор данных по условиям (примеры)
# ============================================================

print("\n=== Примеры отбора данных по условиям ===")

# 1. Квартиры целиком (Entire home/apt) дороже 200$
filter1 = df[(df['room_type'] == 'Entire home/apt') & (df['price'] > 200)]
print(f"\n1. Entire home/apt дороже 200$: {len(filter1)} записей")
print(filter1[['name', 'neighbourhood', 'price', 'minimum_nights']].head(3))

# 2. Объявления с большим количеством отзывов (> 100) и ценой < 150
filter2 = df[(df['number_of_reviews'] > 100) & (df['price'] < 150)]
print(f"\n2. >100 отзывов и цена < 150$: {len(filter2)} записей")
print(filter2[['name', 'room_type', 'price', 'number_of_reviews']].head(3))

# 3. Объявления в определённом районе и доступные почти весь год
filter3 = df[(df['neighbourhood'] == 'Williamsburg') & (df['availability_365'] > 300)]
print(f"\n3. Williamsburg + availability > 300 дней: {len(filter3)} записей")
print(filter3[['name', 'price', 'availability_365']].head(3))

# 4. Только приватные комнаты с минимальным сроком ≤ 3 ночи
filter4 = df[(df['room_type'] == 'Private room') & (df['minimum_nights'] <= 3)]
print(f"\n4. Private room + minimum_nights ≤ 3: {len(filter4)} записей")

print("\nГотово!")