集合:
python内置了集合这一数据结构,同数学上的集合概念基本上是一致的,它与列表的区别在于:1.它的元素是不重复的,而且是无序的;2.它不支持索引。一般我们通过花括号{}或者set()函数来创建一个集合。
>>alst
Out[2]: [2, 3, 45, 5, 3, 3, 2]
>>set(alst)
Out[3]: {2, 3, 5, 45}
由于集合的特殊性(特别是无序性),因此集合有一些特别的运算。
a=t|s #t和s的并集
b=t&s #t和s的交集
c=t-s #求差集(项在t中,但不在s中)
d=t^s #对称差集(项在t或s中,但不会同时出现在二者中)
filter()函数:
顾名思义,是一个过滤器,用来筛选出列表中符合条件的元素:
b=filter(lambda x: x>5 and x<8,range(10))
b=list(b) #结果是[6,7]
使用filter()函数首先需要一个返回值为bool型的函数,如上述的lambda x:x>5 and x<8定义了一个函数,判断x是否大于5且小于8,然后将这个函数作用到range(10)的每个元素中,如果为True,则"挑出"那个元素,最后将满足条件的所有元素组成一个列表返回。
当然,上述filter语句,可以用列表解析写为:
b=[i for i in range(1) if i>5 and i<8]
它并不比filter语句复杂。但我们使用filter()最终目的是兼顾简洁和效率,因为map()、reduce()或filter()的循环速度比python内置的for或while循环要快得多。
创建字典的两种方法:
>>adict
Out[14]: {'a': 10, 'b': 30}
>>bdict=dict([['a',3],['b',9]])
>>bdict
Out[16]: {'a': 3, 'b': 9}
pandas基本的数据结构是Series和DataFrame.顾名思义,Series就是序列,类似一维数组;DataFrame则相当于一张二维的表格,类似二维数组,它的每一列都是一个Series.为了定位Series中的元素,Pandas提供了Index对象,每个Series都会带有一个对应的Index,用来标记不同的元素,Index的内容不一定是数字,也可以是字母、中文等,它类似于SQL中的主键。
类似的,DataFrame相当于多个带有同样Index的Series的组合(本质是Series的容器),每个Series都带有唯一的表头,用来标记不同的Series.
统计量分析:
用统计指标对定量数据进行统计描述,常从集中趋势和离散趋势两个方面进行分析。
平均水平的指标是对个体集中趋势的度量,使用最广泛的是均值和中位数;反映变异程度的指标则是对个体离开平均水平的度量,使用较广泛的是标准差(方差)、四分位间距。
作为一个统计量,均值的主要问题是对极端值很敏感。如果数据中存在极端值或者数据是偏态分布的,那么均值就不能很好地度量数据的集中趋势。为了消除少量极端值的影响,可以使用截断均值或者中位数来度量数据的集中趋势。截断均值是去掉高、低极端值之后的平均数。
贡献度分析:
又称帕累托分析,它的原理是帕累托法则,又称20/80定律。同样的投入放在不同的地方会产生不同的效益。例如,对一个公司来讲,80%的利润常常来自于20%最畅销的产品,而其它80%的产品只产生了20%的利润。
#画帕累托图
import pandas as pd
#导入餐饮数据
canyin_df=pd.read_excel(r'd:\Users\zhanggl21\Desktop\catering_dish_profit.xls')
canyin_df=canyin_df[['菜品名','盈利']].sort_values(by='盈利',ascending=False)
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif']=['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(10,6),dpi=80)
ax1=plt.gca()
ax1.bar(range(len(canyin_df.index)),canyin_df.盈利,bottom=0,color='orange')
plt.xticks(range(len(canyin_df.index)),canyin_df.菜品名)
plt.xlabel('菜品名',fontsize=12)
plt.ylabel('盈利金额',fontsize=12)
plt.title('不同菜品盈利贡献度',fontsize=16)
#添加盈利金额的数据标签
for x,y in zip(range(len(canyin_df.index)),canyin_df.盈利):
plt.text(x,y*0.5,str(y),va='center',ha='center')
ax2=ax1.twinx()
p=canyin_df.盈利.cumsum()/canyin_df.盈利.sum()
ax2.plot(range(len(p.index)),p.values,linestyle='--',linewidth=2,\
marker='o',markerfacecolor='k')
plt.ylabel('盈利比例',fontsize=12)
#添加盈利比例的数据标签
for x,y in zip(range(len(canyin_df.index)),p.values):
plt.text(x,y-0.03,format(y,'.2%'),color='r',alpha=0.6)
plt.show()
df1.rolling(window=2,min_periods=2).sum()
Out[33]:
a b
0 NaN NaN
1 10.0 10.0
2 13.0 3.0
数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据规约。
相关分析之有关系数:
相关系数的选择:
在正态分布假定下,Spearman秩相关系数与Pearson相关系数在效率上是等价的,而对于连续测量数据,更适合用Pearson相关系数来进行
分析。
判定系数:
判定系数是相关系数的平方,用r**2表示;用来衡量回归方程对y的解释程度。判定系数取值范围在0到1之间。越接近于1,表明x与y之间
的相关性越强;越接近于0,表明两个变量之间几乎没有直线相关关系。
分析系列产品销售量之间的相关性可以得到不同菜品之间的关系,比如是替补菜品、互补菜品或者没有关系,为产品采购提供参考。
#相关系数矩阵
df=pd.read_excel(r'd:\Users\zhanggl21\Desktop\catering_sale_all.xls')
df.corr()['翡翠蒸香茜饺'] #查看某一菜品与其它菜品的相关性
df.翡翠蒸香茜饺.corr(df.香煎韭菜饺) #查看某两种菜品之间的相关性
数据规范化:
数据规范化(归一化)处理是数据挖掘的一项基础工作。不同评价指标往往具有不同的量纲,数值间的差别可能很大,不进行处理可能会
影响到数据分析的结果。为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一
个特定的区域,便于进行综合分析。
(data-data.min())/(data.max()-data.min()) #最小-最大规范化
(data-data.mean())/data.std() #零-均值规范化
data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化