Python数据处理全流程

一、数据收集

(一)从文件中读取数据

  1. 读取文本文件
    • CSV文件(逗号分隔值)
      • CSV文件是一种常见的简单数据存储格式,使用逗号来分隔数据值。Python中的csv模块可以方便地读取和写入CSV文件。
      • 例如,读取一个简单的CSV文件,其中包含姓名和年龄两列数据:
        import csv
        data = []
        with open('example.csv', 'r') as file:
            reader = csv.reader(file)
            for row in reader:
                data.append(row)
        print(data)
        
      • 这里open函数以只读模式('r')打开文件example.csv,csv.reader函数创建一个读取器对象,通过循环遍历读取器对象,将每一行数据添加到data列表中。
    • JSON文件(JavaScript对象表示法)
      • JSON是一种轻量级的数据交换格式,在Web开发和数据存储中广泛使用。Python中的json模块用于处理JSON数据。
      • 例如,读取一个包含用户信息的JSON文件:
        import json
        with open('example.json', 'r') as file:
            data = json.load(file)
        print(data)
        
      • json.load函数将JSON格式的数据从文件中读取并转换为Python对象(如字典或列表)。
  2. 读取Excel文件
    • 使用pandas库
      • pandas是Python中强大的数据处理库,其中read_excel函数可以读取Excel文件(.xlsx和.xls格式)。
      • 例如,读取一个Excel文件中的数据:
        import pandas as pd
        df = pd.read_excel('example.xlsx')
        print(df)
        
      • 这里read_excel函数将Excel文件的数据读取到一个DataFrame对象(df)中,DataFrame是pandas中用于存储二维数据的结构,类似于表格,可以方便地进行各种数据处理操作。
    • 使用openpyxl或xlrd等库(以openpyxl为例)
      • openpyxl主要用于读取和写入Excel文件。
      • 例如,读取Excel文件中的一个工作表的数据:
        import openpyxl
        workbook = openpyxl.load_workbook('example.xlsx')
        sheet = workbook.active
        data = []
        for row in sheet.rows:
            row_data = []
            for cell in row:
                row_data.append(cell.value)
            data.append(row_data)
        print(data)
        
      • 首先使用load_workbook函数打开Excel工作簿,获取活动工作表(active),然后通过循环遍历工作表的行和列,将每个单元格的值添加到data列表中。
  3. 从数据库中获取数据
    • 使用sqlite3(以SQLite数据库为例)
      • SQLite是一个轻量级的嵌入式数据库,Python的sqlite3模块提供了对SQLite数据库的操作接口。
      • 例如,从一个SQLite数据库中读取数据:
        import sqlite3
        conn = sqlite3.connect('example.db')
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM users")
        data = cursor.fetchall()
        conn.close()
        print(data)
        
      • 首先使用connect函数连接到数据库文件example.db,创建一个游标对象(cursor),通过游标执行SQL查询语句(SELECT * FROM users),使用fetchall函数获取查询结果并存储在data中,最后关闭数据库连接。
    • 使用pymysql或psycopg2等库(以pymysql为例,用于MySQL数据库)
      • pymysql是Python中用于连接和操作MySQL数据库的库。
      • 例如,连接到MySQL数据库并读取数据:
        import pymysql
        conn = pymysql.connect(host='localhost', user='root', password='password', database='example_database')
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM customers")
        data = cursor.fetchall()
        conn.close()
        print(data)
        
      • 这里通过connect函数连接到本地MySQL服务器(host='localhost'),使用指定的用户名(user='root')和密码(password='password')以及数据库名(database='example_database')。然后执行SQL查询并获取结果,最后关闭连接。

(二)从网络获取数据

  1. 使用requests库进行简单的HTTP请求
    • requests库是Python中用于发送HTTP请求的常用库,它可以方便地获取网页内容、API数据等。
    • 例如,获取一个网页的文本内容:
      import requests
      url = "https://example.com"
      response = requests.get(url)
      if response.status_code == 200:
          data = response.text
          print(data)
      else:
          print("请求失败")
      
      • 首先定义要请求的网址(url),使用requests.get函数发送GET请求,检查响应的状态码(status_code)是否为200(表示请求成功),如果成功则获取响应的文本内容(text)并打印,否则打印请求失败的提示。
  2. 使用BeautifulSoup(结合requests)进行网页数据爬取(HTML/XML数据)
    • 当需要从网页中提取结构化的数据(如表格、特定标签内的内容等)时,可以使用BeautifulSoup库。
    • 例如,从一个网页中提取所有的链接:
      import requests
      from bs4 import BeautifulSoup
      url = "https://example.com"
      response = requests.get(url)
      if response.status_code == 200:
          soup = BeautifulSoup(response.text, 'html.parser')
          links = soup.find_all('a')
          for link in links:
              print(link.get('href'))
      else:
          print("请求失败")
      
      • 发送请求并获取网页内容后,使用BeautifulSoup对象(soup)解析网页内容,find_all函数用于查找所有的<a>标签(代表链接),通过循环遍历获取每个链接的href属性值并打印。
  3. 使用API获取数据
    • 许多网站和服务提供API(应用程序接口),通过API可以以结构化的方式获取数据。
    • 例如,使用一个天气API获取天气数据:
      import requests
      api_key = "your_api_key"
      city = "New York"
      url = f"https://api.example.com/weather?city={city}&key={api_key}"
      response = requests.get(url)
      if response.status_code == 200:
          weather_data = response.json()
          print(weather_data)
      else:
          print("请求失败")
      
      • 首先定义API密钥(api_key)和要查询的城市(city),构建API请求的网址(url),发送请求并检查状态码,若成功则将响应的JSON数据(使用json方法转换)作为天气数据打印出来。

二、数据清理

(一)处理缺失值

  1. 识别缺失值
    • 在pandas中
      • 对于一个DataFrame对象(df),可以使用isnull函数来检查每个单元格是否为缺失值,返回一个布尔型的DataFrame,其中True表示缺失值。
      • 例如,查看数据集中每列缺失值的数量:
        import pandas as pd
        df = pd.read_excel('example.xlsx')
        missing_count_per_column = df.isnull().sum()
        print(missing_count_per_column)
        
    • 在NumPy数组中(如果数据以数组形式存在)
      • 使用numpy.isnan函数来检查缺失值(对于数值型数据)。
      • 例如,对于一个简单的NumPy数组:
        import numpy as np
        data = np.array([1, np.nan, 3])
        missing_mask = np.isnan(data)
        print(missing_mask)
        
  2. 处理缺失值的方法
    • 删除包含缺失值的行或列
      • 在pandas中,可以使用dropna函数来删除包含缺失值的行或列。
      • 例如,删除包含缺失值的行:
        df = df.dropna(axis = 0)
        
      • 这里axis = 0表示按行操作,如果要按列操作则设置axis = 1。
    • 填充缺失值
      • 使用固定值填充
        • 在pandas中,可以使用fillna函数用一个固定的值填充缺失值。
        • 例如,用0填充所有缺失值:
          df = df.fillna(0)
          
      • 使用统计量填充(如均值、中位数、众数)
        • 例如,用每列的均值填充缺失值:
          column_means = df.mean()
          df = df.fillna(column_means)
          

(二)处理重复值

  1. 识别重复值
    • 在pandas中,使用duplicated函数可以检查每行是否为重复行,返回一个布尔型的列。
    • 例如,查看数据集中的重复行:
      import pandas as pd
      df = pd.read_excel('example.xlsx')
      duplicate_mask = df.duplicated()
      print(df[duplicate_mask])
      
  2. 删除重复值
    • 在pandas中,使用drop_duplicates函数删除重复行。
    • 例如,删除数据集中的重复行:
      df = df.drop_duplicates()
      

(三)数据格式统一

  1. 日期格式统一
    • 在pandas中
      • 如果数据中有日期列,可能会出现多种日期格式。可以使用to_datetime函数将日期列转换为统一的日期格式。
      • 例如,将一个日期列(假设列名为date)转换为YYYY - MM - DD格式:
        df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d', errors='coerce')
        
      • 这里format参数指定日期的原始格式,errors='coerce'表示如果日期格式无法转换则将其设置为NaT(不是时间)。
  2. 数据类型统一(如将字符串转换为数值)
    • 在pandas中
      • 可以使用astype函数转换数据类型。
      • 例如,将一个包含数字的字符串列(假设列名为price)转换为数值类型:
        df['price'] = df['price'].astype(float)
        
    • 在Python原生数据类型转换中(如果数据不是在pandas环境下)
      • 对于简单的列表等数据结构,可以使用合适的转换函数。例如,将字符串列表中的数字字符串转换为整数:
        data = ["1", "2", "3"]
        new_data = [int(i) for i in data]
        print(new_data)
        

三、数据转换

(一)数据标准化和归一化

  1. 标准化(Z - Score标准化)
    • 在pandas中,可以使用scale函数(如果已经安装了sklearn库)或者手动计算来实现数据标准化。
    • 例如,手动计算对一个数据列(假设列名为value)进行标准化:
      import pandas as pd
      df = pd.read_excel('example.xlsx')
      mean_value = df['value'].mean()
      std_value = df['value'].std()
      df['value_standardized'] = (df['value'] - mean_value)/std_value
      
    • 这里先计算列的均值和标准差,然后按照标准化公式(x - \mu)/\sigma进行计算,将标准化后的数据存储在新列value_standardized中。
  2. 归一化(Min - Max归一化)
    • 同样在pandas中,可以手动计算实现归一化。
    • 例如,对一个数据列(假设列名为score)进行归一化:
      min_score = df['score'].min()
      max_score = df['score'].max()
      df['score_normalized'] = (df['score'] - min_score)/(max_score - min_score)
      
      • 按照归一化公式(x - x_{min})/(x_{max}-x_{min})$进行计算,将归一化后的数据存储在新列score_normalized`中。

(二)数据编码

  1. 类别数据编码(如One - Hot编码)
    • 在pandas和sklearn中都可以进行One - Hot编码。
    • 例如,使用pandas的get_dummies函数对一个包含类别数据的列(假设列名为category)进行One - Hot编码:
      import pandas as pd
      df = pd.read_excel('example.xlsx')
      one_hot_encoded = pd.get_dummies(df['category'])
      df = pd.concat([df, one_hot_encoded], axis = 1)
      
      • 首先使用get_dummies函数对category列进行One - Hot编码,得到一个新的DataFrame(one_hot_encoded),然后使用concat函数将其与原始DataFrame(df)按列(axis = 1)合并。
  2. 标签编码(将类别标签转换为数值)
    • 在sklearn中可以使用LabelEncoder进行标签编码。
    • 例如,对一个类别标签列(假设列名为label)进行标签编码:
      from sklearn.preprocessing import LabelEncoder
      le = LabelEncoder()
      df['label_encoded'] = le.fit_transform(df['label'])
      
      • 首先创建一个LabelEncoder对象(le),然后使用fit_transform函数对label列进行编码,将编码后的数据存储在新列label_encoded中。

四、数据分析

(一)描述性统计分析

  1. 基本统计量计算(均值、中位数、众数、标准差等)
    • 在pandas中,可以直接使用DataFrame对象的方法来计算基本统计量。
    • 例如,计算一个数据集中各列的均值、中位数和标准差:
      import pandas as pd
      df = pd.read_excel('example.xlsx')
      mean_values = df.mean()
      median_values = df.median()
      std_values = df.std()
      print("均值:", mean_values)
      print("中位数:", median_values)
      print("标准差:", std_values)
      
  2. 数据分布分析(直方图、箱线图等)
    • 绘制直方图(使用matplotlib库)
      • 假设要绘制一个数据列(假设列名为age)的直方图来观察年龄的分布:
        import matplotlib.pyplot as plt
        import pandas as pd
        df = pd.read_excel('example.xlsx')
        plt.hist(df['age'], bins = 10)
        plt.xlabel('年龄')
        plt.ylabel('频数')
        plt.title('年龄分布直方图')
        plt.show()
        
      • 这里使用matplotlib的hist函数绘制直方图,bins参数指定直方图的区间数量,然后设置坐标轴标签和标题,最后使用show函数显示图形。
    • 绘制箱线图(使用matplotlib或seaborn库)
      • 以seaborn库为例,绘制一个数据集中多个列(假设为column1、column2、column3)的箱线图来比较它们的数据分布:
        import seaborn as sns
        import pandas as pd
        df = pd.read_excel('example.xlsx')
        data = [df['column1'], df['column2'], df['column3']]
        sns.boxplot(data = data)
        plt.xlabel('列名')
        plt.ylabel('数值')
        plt.title('箱线图比较')
        plt.show()
        
      • 首先将要绘制箱线图的列数据存储在一个列表(data)中,然后使用seaborn的boxplot函数绘制箱线图,设置坐标轴标签和标题后显示图形。

(二)相关性分析

  1. 计算相关性系数(如Pearson相关系数)
    • 在pandas中,可以使用corr函数计算数据集中各列之间的Pearson相关系数。
    • 例如,计算一个数据集中各列之间的

更多推荐