Python_96 2023-12-26 21:52 采纳率: 50%
浏览 15
已结题

数据处理和可视化显示

我爬取了链家网上100页3000条房子的信息详细页面的内容,包括总价、单价、小区名称、所在区域以及基本信息里的内容,每个内容作为一个字段名,字段名称和网页上名称相同,将这些详细信息存入一个csv格式文件里面后

import requests  # 导入requests库,用于发送HTTP请求
from bs4 import BeautifulSoup  # 从bs4库中导入BeautifulSoup,用于解析HTML
import csv  # 导入csv库,用于读写CSV文件
import time  # 导入time库,用于计时
import concurrent.futures  # 导入concurrent.futures库,用于并发处理
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import matplotlib.font_manager as fm

# 定义函数从单个页面爬取房屋详情
def scrape_page(url):
    response = requests.get(url)  # 发送HTTP GET请求获取页面内容
    soup = BeautifulSoup(response.text, 'html.parser')  # 使用BeautifulSoup解析页面内容
    house_list = soup.find_all('div', class_='info clear')  # 查找页面中所有房屋信息的元素
    data = []  # 创建一个空列表,用于存储房屋信息
    for house in house_list:  # 遍历每个房屋信息元素
        detail = {}  # 创建一个空字典,用于存储单个房屋的详细信息
        detail['总价'] = house.find('div', class_='totalPrice').text.strip()  # 获取房屋总价并去除空白字符
        detail['单价'] = house.find('div', class_='unitPrice').text.strip()  # 获取房屋单价并去除空白字符
        detail['小区名称'] = house.find('div', class_='positionInfo').a.text.strip()  # 获取小区名称并去除空白字符
        detail['所在区域'] = house.find('div', class_='positionInfo').a.next_sibling.next_sibling.text.strip()  # 获取所在区域并去除空白字符
        house_info = house.find('div', class_='houseInfo').text.split('|')  # 将房屋信息按竖线分割成列表
        detail['房型'] = house_info[1].strip()  # 获取房型并去除空白字符
        detail['朝向'] = house_info[2].strip()  # 获取朝向并去除空白字符
        detail['楼层'] = house_info[3].strip() if len(house_info) > 3 else 'N/A'  # 获取楼层并去除空白字符,若无楼层信息则设为'N/A'
        detail['面积'] = house_info[4].strip()  # 获取面积并去除空白字符
        detail['用途'] = house_info[5].strip()  # 获取用途并去除空白字符
        data.append(detail)  # 将单个房屋的详细信息添加到数据列表中
    return data  # 返回包含房屋详细信息的列表

# 主函数用于爬取多个页面并将数据保存到CSV文件中
def scrape_lianjia():
    start_time = time.time()  # 记录开始时间
    all_data = []  # 创建一个空列表,用于存储所有房屋的详细信息
    for page in range(1, 101):  # 遍历100个页面
        url = f'https://nb.lianjia.com/ershoufang/pg{page}/'  # 构造页面网址
        page_data = scrape_page(url)  # 爬取单个页面的数据
        all_data.extend(page_data)  # 将单个页面的数据添加到所有数据列表中
    with open('house_info.csv', 'w', newline='', encoding='utf-8') as csvfile:  # 打开CSV文件进行写操作
        fieldnames = ['总价', '单价', '小区名称', '所在区域', '房型', '朝向', '楼层', '面积', '用途']  # 定义CSV文件的字段名
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)  # 创建CSV写操作的DictWriter对象
        writer.writeheader()  # 写入CSV文件的字段名
        for house in all_data:  # 遍历所有房屋的详细信息
            writer.writerow(house)  # 将单个房屋的详细信息写入CSV文件中
    end_time = time.time()  # 记录结束时间
    print(f'爬取所有数据所需时间: {end_time - start_time} 秒')  # 打印爬取所有数据所需的时间

# 调用主函数开始爬取
scrape_lianjia()

然后问题就是我不会处理这些数据,如何将这些数据可视化出来,
可视化要求就是

分析各列数据,并对各列数据进行处理,转变成合适的数据列。
利用直方图、柱状图、箱型图等三种图形分析对比展示宁波全市及各区的房屋总价、单价、建筑面积的分布情况。
利用合适图形分析对比宁波市各区的房屋总价、单价、建筑面积的平均值。
利用合适图形分析对比宁波各区房屋的室、厅、厨、卫数量的分布情况。
利用合适图形分析对比宁波各区房屋的梯、户数量的分布情况。
利用合适图形分析对比宁波市各区的户型结构、建筑结构、装修情况的占比数据。
利用合适图形分析对比宁波市各区楼层高度(总层数)的分布情况。
利用合适图形分析所在楼层与房屋单价的关系。
把【挂牌时间】减去【上次交易】作为房子的年龄,用合适图形分析房子年龄与房屋总价和单价的关系。
去除空值超过30%的列,将剩下的空值用该列的平均值替换或者用其他你认为合适的值进行替换。
小问题有点多求麻烦一下,数据图尽量清晰明了一点,我用GPT生成的全是乱码图根本看不清

  • 写回答

17条回答 默认 最新

  • 社区专家-Monster-XH 2023-12-27 00:36
    关注
    获得0.90元问题酬金
    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    plt.rcParams['font.family'] = 'SimHei'
    plt.rcParams['axes.unicode_minus'] = False
    
    def convert_price(price_str):
        try:
            return float(price_str.split('元')[0].replace(',', ''))
        except:
            return np.nan
    
    file_path = 'house_info.csv'  
    house_data = pd.read_csv(file_path)
    
    house_data['总价'] = house_data['总价'].str.replace('万', '').astype(float) * 10000  # 将总价转换为数值型数据
    house_data['单价'] = house_data['单价'].apply(convert_price)  # 将单价转换为数值型数据
    house_data['面积'] = house_data['面积'].str.extract('(\d+\.?\d*)').astype(float)  # 将面积转换为数值型数据
    house_data['总楼层'] = house_data['楼层'].str.extract('共(\d+)层').astype(float)  # 提取总楼层信息
    house_data['所在楼层'] = house_data['楼层'].str.extract('(低|中|高)楼层').fillna('其他')  # 提取所在楼层信息
    
    # 移除缺失值超过30%的列
    missing_values = house_data.isnull().mean()
    columns_to_drop = missing_values[missing_values > 0.3].index
    house_data = house_data.drop(columns=columns_to_drop)
    
    # 仅对数值型列填充剩余的缺失值
    numeric_columns = house_data.select_dtypes(include=[np.number]).columns
    house_data[numeric_columns] = house_data[numeric_columns].fillna(house_data[numeric_columns].mean())
    
    # 可视化函数
    def create_histograms(data, columns, title_prefix):
        for column in columns:
            plt.figure(figsize=(10, 6))
            sns.histplot(data[column], kde=True)
            plt.title(f"{title_prefix} - {column} (直方图)")
            plt.xlabel(column)
            plt.ylabel('频率')
            plt.show()
    
    # 调整后的柱状图绘制函数
    def create_bar_plots(data, columns, title_prefix):
        for column in columns:
            plt.figure(figsize=(12, 6))  # 增加图形宽度
            sns.barplot(x='所在区域', y=column, data=data)
            plt.title(f"{title_prefix} - {column} (各区平均值柱状图)")
            plt.xlabel('所在区域')
            plt.ylabel(column)
            plt.xticks(rotation=45)  # 旋转横坐标标签
            plt.tick_params(axis='x', labelsize=8)  # 调整标签字体大小
            plt.show()
    
    # 调整后的箱型图绘制函数
    def create_box_plots(data, columns, title_prefix):
        for column in columns:
            plt.figure(figsize=(12, 6))  # 增加图形宽度
            sns.boxplot(x='所在区域', y=column, data=data)
            plt.title(f"{title_prefix} - {column} (箱型图)")
            plt.xlabel('所在区域')
            plt.ylabel(column)
            plt.xticks(rotation=45)  # 旋转横坐标标签
            plt.tick_params(axis='x', labelsize=8)  # 调整标签字体大小
            plt.show()
    
    
    # 可视化
    columns_to_visualize = ['总价', '单价', '面积']
    create_histograms(house_data, columns_to_visualize, "宁波全市及各区房屋")
    create_bar_plots(house_data, columns_to_visualize, "宁波全市及各区房屋")
    create_box_plots(house_data, columns_to_visualize, "宁波全市及各区房屋")
    
    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 1月3日
  • 修改了问题 12月26日
  • 修改了问题 12月26日
  • 创建了问题 12月26日