数据分析(pandas)---03.案例

import pandas as pd
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^读取csv文件,将字符串转为日期时间格式^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6'
# 读取csv文件() seq分隔符 read_table或者read_csv 建议read_csv
order = pd.read_csv('C:\pyproject\day03\matplot_data\meal_order_info.csv',sep=',',encoding='gbk')
print(order)

# lock_time里的日期是字符串类型,需要转换成可以比较运算的时间戳类型
# 使用to_datetime()
order['lock_time'] = pd.to_datetime(order['lock_time'])
order['use_start_time']=pd.to_datetime(order['use_start_time'])

# 对整个表日期进行操作,pandas支持日期范围
print('最小的时间为:',pd.Timestamp.min)
print('最大的时间为:',pd.Timestamp.max)

# 年、月、日、星期
year = [i.year for i in order['lock_time']]
month = [i.month for i in order['lock_time']]
day = [i.day for i in order['lock_time']]
day_name = [i.day_name for i in order['lock_time']]
print('lock_time中的星期名称数据前五个:',day_name[:5])
print(type(day_name)) #<class 'list'>

# 操作
time_delta=order['lock_time']-pd.to_datetime('2017.1.1')
print('距离2017年1月1日0点0时0分后的数据',time_delta[:5])
print(time_delta.dtypes) #timedelta64[ns]

# 定义点餐时间
check_time = order['lock_time']-order['use_start_time']
print('用时最少的点餐时间为:',check_time.min()) #-1 days +00:05:00
print('用时最多的点餐时间为:',check_time.max()) #16 days 00:08:00
print('平均点餐时间为:',check_time.mean()) #0 days 01:12:07.500000


# 异常数据 去除空值、负值和标准差为0的数据
for i in range(order.shape[0]):
    if order['lock_time'][i]<order['use_start_time'][i]:
        # 找出异常数据所在行
        print(i)

'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^读取xlsx文件,汇总多个表数据,删除异常数据^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
# 汇总多个表数据
from pandas import DataFrame
import xlrd

# 获取excel文件以及文件中的表名
wb = xlrd.open_workbook('C:\pyproject\day03\matplot_data\meal_order_detail.xlsx')
sheet = wb.sheet_names()
print(sheet)  #['meal_order_detail1', 'meal_order_detail2', 'meal_order_detail3']


# 总的数据容器
total = DataFrame()
# 循环遍历所有sheet,汇总数据,index_col 让第几列为索引
for i in range(len(sheet)):
    data = pd.read_excel('C:\pyproject\day03\matplot_data\meal_order_detail.xlsx',sheet_name=i,index_col=False)
    print(type(data))

    # 汇总数据
    total = total.append(data)

# 保存
writer = pd.ExcelWriter('output.xlsx')
total.to_excel(writer,'Sheet1')
writer.save()

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~餐饮数据分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
detail = pd.read_excel('output.xlsx')
# 公共属性值
print(type(detail)) #<class 'pandas.core.frame.DataFrame'>
print(detail.shape) #(10037, 19)
print(detail.size)  #190703
print(detail.ndim)  #2

# 取一列数据,
# 只有一列,是序列类型,可以当做ndarray访问
# 格式:表名['列名']
amounts = detail['amounts']
counts = detail['counts']
# 对某一列的某几行访问:访问 DataFrame 中某一列的某几行时,单独一列的 DataFrame 可以视为一个 Series(另一种 pandas 提供的类,可以看作是只有一列的 DataFrame), 而访问一个 Series 基本和访问一个一维的 ndarray 相同。

# 取多列数据
# 格式: 表名[['列名1','列名2',....]]
detail_ac=detail[['amounts','counts']]
print('订单详情表中counts和amounts两列的描述性统计信息为:',detail_ac.describe())

# 关于行的读取
# 格式 :  表名.loc[行,列]
detail_ac = detail.loc[:5,['amounts','counts']]
print('前5行的数据:\n',detail_ac)

# 类别,将相同的值作为一类
print(detail['order_id'])
print(detail['dishes_name'])
detail['order_id'] = detail['order_id'].astype('category')
detail['dishes_name'] = detail['dishes_name'].astype('category')
print(detail['order_id'])
print(detail['dishes_name'])
print('订单详情表中关于order_id(订单编号)'
      '与dishes_name(菜品名称)的描述性统计结果为:\n',
      detail[['order_id','dishes_name']])

'``````````````````````````````订单数据剔除空值与相同值```````````````````````````````````````'
col = detail.shape[1]
print('原始数据中心列的个数',col) #20

# 获取所有列属性对应的describe,返回布尔值
# loc方法,传入的是索引名称
colisNull = detail.describe().loc['count'] == 0
print(colisNull)
print(type(colisNull)) #序列

# 去除全为空值的列和标准差为0的列
# 1.剔除空值
for i in range(len(colisNull)):
    if colisNull[i]:
        detail.drop(colisNull.index[i],axis=1,inplace=True)

# 2.剔除0值
stdisZero = detail.describe().loc['std'] == 0
for i in range(len(stdisZero)):
    if stdisZero[i]:
        detail.drop(stdisZero.index[i],axis=1,inplace=True)

print('剔除空值后列的个数',detail.shape[1]) #10
print(detail.describe())


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值