kaggle电子商务数据在线零售商的实际交易数据分析
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
import plotly as py
import seaborn as sns
import plotly.graph_objs as go #画图直接使用plotly函数比matplotlib方便一些
#下面两行是使用plotly画图时需要的
py.offline.init_notebook_mode()
pyplot = py.offline.iplot
#下面两行是解决中文乱码问题
plt.rcParams['-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
os.chdir('C:\\Users\\asus\\Desktop\\七天成为数据分析师\\数据集\\data') #表示定位到需要的文件夹
data = pd.read_csv('', encoding = 'ISO-8859-1', dtype = {'CustomerID': str})
"""
encoding我用uft-8和gbk都不好使,只有用ISO-8859-1才好使,ISO-8859-1称Latin-1或“西欧语言”,
是国际标准化组织内ISO/IEC 8859的第一个8位字符集。它以ASCII为基础,在空置的0xA0-0xFF的范围内,
加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用。实际上Windows-1252代码页包含了所有出现在ISO-8859-15中的字符。
ISO-8859-1对应的Windows代码页是Windows-28591。[4]然而,英文版的Windows 7、Windows10家庭中文版 系统上没有Windows-28591代码页。
"""
#理解数据
data.info() #查看数据(字段)的基本信息,看是否存在缺失值
data[data['InvoiceNo'].str[0] == 'C'] #查看是否有退货的
#数据清洗
data.apply(lambda x: sum(x.isnull())/len(x), axis = 0)
#lambda表示匿名函数,sum(())/len(x)表示缺失率,axis=0表示沿着纵向进行检索(对每一列进行操作)
df1 = data.dropna(how = 'any').copy()
"""
dropna表示如果存在缺失值,则用NULL进行填充,any表示只要一行中有一个变量存在缺失值,则对全行进行null填充即删除,
copy函数表示怕对df1进行操作时会改变原数据,则先对其进行拷贝
"""
df1['InvoiceDate'] = pd.to_datetime(df1['InvoiceDate'], errors = 'coerce')
#把订单日期转化为标准的时间格式,因为日期有可能是str格式,errors表示如果时间格式不是12/1/2010 8:26(日月年)这样的格式就把其转换为缺失值,即进行容错处理
df1['InvoiceDate'] = df1['InvoiceDate'].dt.date
#表示把日期提取为date,date格式为年月日形式
df1['Price'] = df1.apply(lambda x: x[3] * x[5], axis = 1)
#根据第二问因此要计算出消费总额,消费总额=数量(第4个元素)×单价(第六个元素),然后在表后添加一列名为Price里面存放消费总额;axis=1表示沿着横向进行检索(对每一行进行操作)
df1.head()
#数据分析和可视化
#购买商品数前十的国家有哪些?
quantity_first_10 = df1[df1['Quantity'] > 0].groupby('Country').sum()['Quantity'].sort_values(ascending = False).head(10)
"""
统计商购买数量,所以退货的就不能算在里面即Quantity数量<0的就不能放在里面,groupby表示根据国家来进行分组统计每个国家的Quantity总和,
ascending表示是否按升序进行排序
"""
quantity_basic = [go.Bar(x = quantity_first_10.index.tolist(), y = quantity_first_10.values.tolist(),
marker = dict(color = 'orange'), opacity = 0.5)]
"""
bar表示条形图,quantitly_first_10.index表示把索引值(国家名)列出来其为Series(索引在左边,值在右边)形式然后放在x轴,
quantitly_first_10.values表示把值(商品数量)列出来其为Series(索引在左边,值在右边)形式然后放在y轴,
tolist表示把索引值从series形式转为列表形式,marker表示设置图形的属性,opacity表示透明度
"""
layout = go.Layout(title = '购买商品数前十的国家', xaxis = dict(title = '国家'))
#layout表示设置画布的属性,xaxis表示设置x轴的属性
figure_basic = go.Figure(data = quantity_basic, layout = layout)
pyplot(figure_basic)