#! /usr/bin
# -*- coding: utf-8 -*-
import pandas as pd
# input data输入数据
gds_bk_book_file = "F:\\data\\input\\book_cd.txt"
gds_bk_sales_file = "F:\\data\\input\\gds_sales_bk.txt"
# 列名称规范 - 如果有列名,则设置为header=None, skiprows=1,同时把规范的名称给出可以跳过指定索引行[0]
# skiprows 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始
# nrows 需要读取的行数(从文件头开始算起)
book_col_index = ['book_cd', 'l2_book_cd', 'l2_book_des', 'book_local_cd']
sales_col_index = ('id', 'ord_day', 'stu_id', 'book_cd', 'book_pay')
gds_bk_book = pd.read_csv(gds_bk_book_file, sep='\t', names=book_col_index, header=None, skiprows=1)
gds_bk_sales = pd.read_csv(gds_bk_sales_file, sep='\t', names=sales_col_index, header=None, skiprows=1)
# 数据类型的转换-关联的数据类型需要一致
gds_bk_book['book_cd'] = gds_bk_book['book_cd'].astype('str')
gds_bk_sales['book_cd'] = gds_bk_sales['book_cd'].astype('str')
# # 数据转换和去重
unique_mem_data = gds_bk_sales['stu_id'].drop_duplicates()
print("##===查看去重后的stu个数============================")
data_static = unique_mem_data.shape
print("原订单数据" + str(gds_bk_sales.shape))
print("去重后的stu个数" + str(data_static))
# # 关联前确保数据类型一致,object会自动转换,所以,可设置为str等情况
mid_data = pd.merge(gds_bk_sales, gds_bk_book,
left_on='book_cd',
right_on='book_cd',
how='left')
grouped = mid_data.groupby(['stu_id', 'l2_book_cd'])
# 组内计数, 求和, 求均值, 求方差
# print(grouped['book_pay'].sum())
# print(grouped['book_pay'].count())
print("##===查看分组的个数============================")
# 查看分组的个数
# print(len(grouped['book_pay'])) 运行比较慢
print(grouped['book_pay'].count().shape)
# 时间处理格式-转换为时间类型然后变换时间格式
# pandas.to_datetime
# dt.strftime 需要转换datetime为其他格式 Series.dt.strftime(self, *args, **kwargs) 返回object-即str类型
gds_bk_sales_date_mid = pd.to_datetime(gds_bk_sales['ord_day'], format='%m/%d/%Y')
# 数据集中的时间数据中包含了哪些年、月、日
print("##===数据集中的时间数据中包含了哪些年、月、日========# ")
print(gds_bk_sales_date_mid.dt.year.unique())
print(gds_bk_sales_date_mid.dt.month.unique())
print(gds_bk_sales_date_mid.dt.day.unique())
# 日期的格式转换
gds_bk_sales['ord_day'] = gds_bk_sales_date_mid.dt.strftime('%Y%m%d')
# 数据输出 header=None
out_path = "F:\\data\\output\\book_cd_sale.txt"
print("##===输出文件\n" + out_path)
# gds_bk_sales.to_csv(out_path, sep='\t', index=False, encoding='utf-8', date_format='%Y%m%d')
gds_bk_sales.to_csv(out_path, sep='\t', index=False, encoding='utf-8')