单车数据分析

import pandas as pd
import numpy as np
from pylab import mpl
from datetime import datetime
import calendar
import seaborn as sn
import matplotlib.pyplot as plt

#设置中文字体
mpl.rcParams['font.sans-serif']=['SimHei'] 

# weekday方法:日期--》星期值(整数,下标从0开始)
# strptime方法:字符串--》日期
# day_name方法:星期值--》星期(字符串)
# month_name方法:月份值--》月份(字符串)
# month方法:日期--》月份值(整数)(1-12)
# map方法:根据对应字典产生映射

#数据采集和处理

def Data_Collect_and_Prosses():
    #数据读取
    bike_data=pd.read_csv('train.csv')
    #数据查看
    print(bike_data.shape)  # 查看数据(几行几列)
    print(bike_data.head(50))# 查看数据的前5行
    print(bike_data.dtypes)  # 查看数据类型

    # 2.3数据提取
    # 2.3.1提取年月日
    # 对datetime这一列应用匿名函数:
    # x表示datetime这一列数据
    # x.split()以空格符分割,返回字符串列表
    # x.split()[0]取出列表的第一个元素

    #添加一列 date
    bike_data['date']=bike_data.datetime.apply(lambda x: x.split()[0]) 
     
    # 2.3.2提取小时
    bike_data['hour']=bike_data.datetime.apply(lambda x: x.split()[1].split(':')[0])

    # 2.3.3 在年月日的基础上提取星期几(格式化字符串)
    bike_data['weekday'] = bike_data.date.apply(
        lambda dateString: calendar.day_name[datetime.strptime(dateString, '%Y/%m/%d').weekday()])
    
    # 2.3.4 在年月日的基础上提取月份值
    bike_data['month'] = bike_data.date.apply(
        lambda dateString: calendar.month_name[datetime.strptime(dateString, "%Y/%m/%d").month])
    
    # 2.4 数据转换
    # 2.4.1 将season转换为英文季节值
    bike_data['season'] = bike_data.season.map({1: 'spring', 2: 'summer', 3: 'fall', 4: 'winter'})

    # 2.4.2 将以下变量转化成分类变量
    print(bike_data)
    varlist = ['hour', 'weekday', 'month', 'season', 'holiday', 'workingday']
    for x in varlist:
        bike_data[x] = bike_data[x].astype('category')  # astype 改变数据类型
    print(bike_data.dtypes)

    # 2.4.3删除无意义的列
    bike_data.drop('datetime', axis=1, inplace=True)  #inplace=True:不创建新的对象

    # 2.5数据清洗

    # 2.5.1查看数据缺失
    print(bike_data.describe())  #describe()函数返回数据结构的统计变量(count,unique等)
    
    # 2.5.2查看是否有异常值
    #fig:figure的缩写
    #fig,axes=plt.subplots():创建总画布(figure)总窗口,有figure就可以在上边作图
    fig, axes = plt.subplots(nrows=2, ncols=2)  #2行2列的子图
    fig.set_size_inches(12, 12)  # 重设大小,单位:英寸
    
    # v垂直 h水平
    # 绘制箱型图  
    # sn.boxplot(data=数据集, x,y=输入数据, orient=绘图方向(v/h), ax=matplotlib轴)
    sn.boxplot(data=bike_data, y='count', orient='v', ax=axes[0][0])
    sn.boxplot(data=bike_data, x='season', y="count", orient='v', ax=axes[0][1])
    sn.boxplot(data=bike_data, x='hour', y="count", orient='v', ax=axes[1][0])
    sn.boxplot(data=bike_data, x='workingday', y="count", orient='v', ax=axes[1][1])
    # 设置横坐标、纵坐标、标题
    axes[0][0].set(ylabel="骑行人数", title="骑行人数")
    axes[0][1].set(ylabel="骑行人数", xlabel="季节", title="各季节骑行人数")
    axes[1][0].set(ylabel="骑行人数", xlabel="时间段", title="各时间段骑行人数")
    axes[1][1].set(ylabel="骑行人数", xlabel="是否工作日", title="工作日和非工作日骑行人数")
    
    #保存与显示
    plt.savefig('collect_and_process_data.png')  # 保存图片
    plt.show()  # 显示图片

    # 2.5.3剔除异常数据
    print(np.abs(bike_data["count"] - bike_data["count"].mean()))
    print(3 * bike_data["count"].std())
    print(np.abs(bike_data["count"] - bike_data["count"].mean()) <= (3 * bike_data["count"].std()))
    processed_data = bike_data[np.abs(bike_data["count"] - bike_data["count"].mean()) <= (3 * bike_data["count"].std())]
    print(processed_data)
    processed_data.to_csv('processed_data.csv')
    return processed_data

# 3. 数据分析与可视化(不同月份的骑行月份分析)
def Data_Analysis_and_Visualization_month(bike_data):
    fig, axes = plt.subplots()
    fig.set_size_inches(12, 20)
    sortOrder = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October",
                 "November", "December"]

    # 判断每个月份有几条记录,
    # 并按由大到小顺序排序(reset_index():重置索引)
    monthAggregated = pd.DataFrame(bike_data.groupby("month")["count"].mean()).reset_index()
    # print(monthAggregated)
    # (ascending=True:升序排列)
    monthSorted = monthAggregated.sort_values(by="count", ascending=True)  # 按月份从小到大排序
    # print(monthSorted)

    # 绘制柱状图
    sn.barplot(data=monthSorted, x="month", y="count", order=sortOrder)
    axes.set(xlabel="月份", ylabel="平均骑行人数", title="不同月份的骑行人数")
    plt.savefig('result_month.png')
    plt.show()

# 4. 数据分析与可视化(不同时间的骑行时间)
def Data_Analysis_and_Visualization_hour(bike_data):
    fig, ax = plt.subplots()
    fig.set_size_inches(12, 20)
    hueOrder = ['Sunday', 'Monday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

    # 一周内不同时间的骑行人数
    hourAggregated = pd.DataFrame(bike_data.groupby(['hour', 'weekday'])['count'].mean()).reset_index()
    print(hourAggregated)
    # 绘制折线图
    #sn.pointplot(x,y=x,y轴数据类别,hue=第二次分类的数据类别, 
    #             hue_order=字符串列表,显示指定分类顺序,data=数组)
    sn.pointplot(x=hourAggregated['hour'], y=hourAggregated['count'], 
        hue=hourAggregated['weekday'], hue_order=hueOrder,data=hourAggregated)
    ax.set(xlabel='时间', ylabel='骑行人数', title='一周内不同时间的骑行人数')
    plt.savefig('result_hour.png')
    plt.show()

# 主函数
def main():
    p_data=Data_Collect_and_Prosses()
    Data_Analysis_and_Visualization_month(p_data)
    Data_Analysis_and_Visualization_hour(p_data)

# 主程序
if __name__ == '__main__':
    main()

你可能感兴趣的:(Data,Analysis,Python)