正文
python聚合函数 python聚合函数整数列表求最大,最小,平均值
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
利用Python进行数据分析(9)-重采样resample和频率转换
Python-for-data-重新采样和频率转换
重新采样指的是将时间序列从一个频率转换到另一个频率的过程。
但是也并不是所有的采样方式都是属于上面的两种
pandas中使用resample方法来实现频率转换python聚合函数,下面是resample方法的参数详解:
将数据聚合到一个规则的低频上python聚合函数,例如将时间转换为每个月python聚合函数,"M"或者"BM"python聚合函数,将数据分成一个月的时间间隔。
每个间隔是半闭合的,一个数据只能属于一个时间间隔。时间间隔的并集必须是整个时间帧
默认情况下,左箱体边界是包含的。00:00的值是00:00到00:05间隔内的值
产生的时间序列按照每个箱体左边的时间戳被标记。
传递span class="mark"label="right"/span可以使用右箱体边界标记时间序列
向loffset参数传递字符串或者日期偏置
在金融数据中,为每个数据桶计算4个值是常见的问题:
通过span class="girk"ohlc聚合函数/span能够得到四种聚合值列的DF数据
低频转到高频的时候会形成缺失值
ffill() :使用前面的值填充, limit 限制填充的次数
数据蛙-Python进阶
这是漫长的一周,本周完成了Python的进阶模块,主要是pandas、numpy、matplotlib、seaborn、pyecharts这些模块的学习以及一个实际的案例:商品销售情况分析,之前一直觉得课程难度不够,但到这一周难度就大大提高了。尤其是案例练习中的RFM模型和用户生命周期建立,看懂不难但是自己写一直出错,在不断出错不断尝试中知识得到了积累,另外可视化部分没有什么练习题,希望后面可以加上一些这方面的练习,接下来分模块来总结一下学习的内容。
重新设置索引:df.set_index()
Series格式转换为DataFrame:df.to_frame()
文件读取:pd.read_csv(filepath, header = 0,skiprows=[1,2])
使用位置做索引:df.loc[0] 使用列表做索引:df.loc[[0,1,2]]
使用切片做索引:df.loc[0:4] 使用bool类型索引:df[df['年龄']30]
loc 是基于索引值的,切片是左闭右闭的
iloc 是基于位置的,切片是左闭右开的
修改列索引:df.rename(columns={'姓名':'name', '年龄':'age'},inplace=True)
替换一个值:df.replace({'name':{'小明':'xiaoming'}},inplace=True)
对数据进行排序:df.sort_values('age')
累加求和:df.cumsum(0)
删除列:del df['player'] 删除行:df.drop(labels=0) labels 是行列的名字
数据拼接:pd.concat([left,right],axis=1)
# 指定列进行关联,默认是 inner join result = pd.merge(left,right,on='key')
#多个关联条件:result = pd.merge(left, right, on=['key1', 'key2'])
#左连接:result = pd.merge(left, right, how='left', on=['key1', 'key2'])
# 列名不一样的关联:pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])
#单个分组:groups = df.groupby('district')
# 作用多个聚合函数:groups.agg([np.mean,np.sum,np.std])
# 针对具体列聚合 groups.age.agg([np.mean,np.sum,np.std])
# 不同列不同聚合函数 groups.agg({"age":np.mean,"novip_buy_times":np.sum})
分组后该列值求和显示:groups['vip_buy_times'].transform('sum')
通常用于求占比:transform(lambda x: x /sum(x))
# 填充指定值:np.full([3,4],1)
# 起始为10,5为步长,30为结尾取不到:np.arange(10, 30, 5)
#随机矩阵:np.random.random((2,3))
# 平均划分:np.linspace( 0, 2*pi, 100 )
# 类型及转换:vector.astype('float')
# 多维变一维:matrix.ravel()
# 矩阵的扩展:a = np.arange(0, 40, 10) b = np.tile(a, (3, 5)) # 行变成3倍,列变成5倍
# 水平拼接:np.hstack((a,b)) 竖直拼接:np.vstack((a,b))
# 竖直分割:np.hsplit(a,3) #水平分割:np.vsplit(a,3)
8. Select the data in rows [3, 4, 8] and in columns ['animal', 'age'].
A:df.loc[df.index[[3,4,8]],['animal','age']]
行采用位置,列采用普通索引,这里利用index函数将位置变化为具体的普通索引,再利用loc函数
19. The 'priority' column contains the values 'yes' and 'no'. Replace this column with a column of boolean values: 'yes' should be True and 'no' should be False
A1:df['priority'].replace(['yes','no'],[True,False],inplace=True) 用replace函数替换
A2:df['priority'] = df['priority'].map({'yes': True, 'no': False}) 用map函数替换
最大最小值的索引:df.idxmax、df.idxmin
找出最大最小的前N个数:nlargest()和nsmallest()
将原表分组 并设置分段区间 pd.cut(df['A'], np.arange(0, 101, 10))
resample函数 日期重采样:s.resample('M').mean()
TimeGrouper 重组:s.groupby(pd.TimeGrouper('4M')).idxmax()
split 分割函数:temp = df['From_To'].str.split('_', expand=True) True为DataFrame
两个DataFrame拼接用join:df = df.join(temp)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
%matplotlib inline 直接显示
折线图:plt.plot(x,y,color = 'r')
柱状图:plt.bar(x,y) plt.barh(x,y) 多个bar x设置不同 堆积图 bottom设置不同
散点图:plt.scatter(x, y, c=colors, alpha=0.5, s = area)
直方图:plt.hist(a,bins= 20) bin代表分隔的最小单位
plt.legend() 显示图例
for a,b in zip(X+W[i],data[i]):
plt.text(a,b,"%.0f"% b,ha="center",va= "bottom") 添加数据标签
plt.annotate('注释文本',xy=(1, np.sin(1)),xytext=(2, 0.5), fontsize=16,arrowprops=dict(arrowstyle="-")) 添加注释文本
plt.xlabel("Group") x轴标题
plt.ylabel("Num") y轴标题
fig, axes = plt.subplots(nrows=2, ncols=2,facecolor='darkslategray') 绘制多个图形
axes[0,0] axes[0,1] axes[1,0] axes[1,1]
pylab.rcParams['figure.figsize'] = (10, 6) # 调整图片大小
动态展示图表
from pyecharts.charts import Bar
from pyecharts import options as opts
** pyecharts 绘图的五个步骤:**
创建图形对象:bar = Bar()
添加绘图数据:bar.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
配置系列参数:对标签、线型等的一些设置
配置全局参数:bar.set_global_opts(title_opts=opts.TitleOpts(title="销售情况"))
渲染图片:生成本地 HTML 文件 bar.render("mycharts.html") bar.render()
notebook 渲染:bar.render_notebook()
bar = (Bar()
.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
.set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况"))
)
bar.render_notebook()
柱状图:Bar()
条形图:bar.reversal_axis() #翻转XY轴,将柱状图转换为条形图
折线图:from pyecharts.charts import Line line=Line()
饼图:from pyecharts.charts import Page, Pie Pie()
转换日期类型:df['order_dt']=pd. to_datetime (df.order_dt,format="%Y%m%d")
将日期转换为月为单位:df['month']=df.order_dt.values. astype('datetime64[M]') 所有日期显示为当月第一天
去除日期单元值:order_diff/ np.timedelta64(1,'D')
过滤部分极值:grouped_user.sum() .query('order_products100') .order_amount
数据透视表:rfm=df.pivot_table( index ='user_id', values =['order_products','order_amount'], aggfunc ={'order_amount':'sum','order_products':'sum'})
map() 方法是pandas.series.map()方法, 对DF中的元素级别的操作, 可以对df的某列或某多列
applymap(func) 也是DF的属性, 对整个DF所有元素应用func操作
purchase_r=pivoted_counts.applymap(lambda x: 1 if x1 else np.NaN if x==0 else 0)
apply(func) 是DF的属性, 对DF中的行数据或列数据应用func操作,也可用于Series
apply(lambda x:x.cumsum()/x.sum()) 累计占比
apply(lambda x:x/x.sum(),axis=0) 每一列中每行数据占比
下周开始进入数据分析思维的课程,很期待后面的课程以及项目,加油!
python--pandas分组聚合
groupby 方法是pandas中的分组方法,对数据框采用 groupby 方法后,返回的是 DataFrameGroupBy 对象,一般分组操作后会进行聚合操作。
对数据框按 A 列进行分组,产生分组数据框。分组数据框是可迭代对象,可以进行循环遍历,可以看出在循环中,每个元素的类型是元组,
元组的第一个元素是分组值,第二个元素是对应的分组数据框。
可以对分组后的数据框直接使用聚合方法 agg ,对分组数据框的每一列计算统计函数值。
可以根据数据框外的序列数据对数据框进行分组,需要注意 序列长度需要与数据框行数相同 。
可以根据数据框的多列对数据框进行分组。
根据 A , B 列进行分组,然后求和。
可以根据索引对数据框进行分组,需要设置 level 参数。
数据框只有一层索引,设置参数 level=0 。
当数据框索引有多层时,也可以根据需求设置 level 参数,完成分组聚合。
设置 level 参数,如需要根据第一层索引,即 id1 进行分组,可以设置 level=0 或 level='id1' 完成分组聚合。
分组后一般会进行聚合操作,用 agg 方法进行聚合。
对分组后数据框使用单个函数进行聚合,单个聚合函数会对每列进行计算,然后合并返回。聚合函数以字符串的形式传入。
可以对分组后的数据指定列进行分组聚合。需要注意 子列需要用[]包裹 。
聚合函数也可以传入自定义的匿名函数。
聚合函数可以是多个函数。聚合时,多个聚合函数会对每列进行计算,然后合并返回。聚合函数以列表的形式传入。
聚合返回后的数据列名有两层索引,第一层是聚合的列名,第二层是使用的聚合函数名。如果需要对返回的聚合函数名重命名,
需要在传参时,传入元组,第一个元素为聚合函数名,第二个元素为聚合函数。
同样,也可以传入匿名函数。
如果需要对不同的列进行不同的聚合计算,则需要传入字典的形式。
可以重命名聚合后的列名,注意 只能对一列传入一个聚合函数时有效 。
Python分组
前言分组原理
核心:
1.不论分组键是数组、列表、字典、Series、函数,只要其与待分组变量的轴长度一致都可以传入groupby进行分组。
2.默认axis=0按行分组,可指定axis=1对列分组。
对数据进行分组操作的过程可以概括为:split-apply-combine三步:
1.按照键值(key)或者分组变量将数据分组。
2.对于每组应用我们的函数,这一步非常灵活,可以是python自带函数,可以是我们自己编写的函数。
3.将函数计算后的结果聚合。
1 分组模式及其对象
1.1 分组的一般模式
三个要素:分组依据、数据来源、操作及其返回结果
df.groupby(分组依据)[数据来源].使用操作
1.2 分组依据的本质
1.3Groupby 对象
通过 ngroups 属性,可以访问分为了多少组:
通过 groups 属性,可以返回从 组名映射到 组索引列表的字典:
当 size 作为 DataFrame 的属性时,返回的是表长乘以表宽的大小,但在 groupby 对象上表示统计每个组的 元素个数:
通过 get_group 方法可以直接获取所在组对应的行,此时必须知道组的具体名字:
1.4 分组的三大操作
分组的三大操作:聚合、变换和过滤
2.聚合函数
2.1内置聚合函数
包括如下函数: max/min/mean/median/count/all/any/idxmax/idxmin/mad/nunique/skew/quantile/sum/std/var/sem/size/prod
2.2agg 方法
【a】使用多个函数
当使用多个聚合函数时,需要用列表的形式把内置聚合函数的对应的字符串传入,先前提到的所有字符串都是合法的。
【b】对特定的列使用特定的聚合函数
对于方法和列的特殊对应,可以通过构造字典传入 agg 中实现,其中字典以列名为键,以聚合字符串或字符串列表为值。
【c】使用自定义函数
在 agg 中可以使用具体的自定义函数,需要注意传入函数的参数是之前数据源中的列,逐列进行计算
【d】聚合结果重命名 如果想要对结果进行重命名,只需要将上述函数的位置改写成元组,元组的第一个元素为新的名字,第二个位置为原来的函数,包括聚合字符串和自定义函数
3 变换和过滤
3.1 变换函数与 transform 方法
变 换 函 数 的 返 回 值 为 同 长 度 的 序 列, 最 常 用 的 内 置 变 换 函 数 是 累 计 函 数:cum- count/cumsum/cumprod/cummax/cummin ,它们的使用方式和聚合函数类似,只不过完成的是组内 累计操作。
3.2 组索引与过滤
过滤在分组中是对于组的过滤,而索引是对于行的过滤
组过滤作为行过滤的推广,指的是如果对一个组的全体所在行进行统计的结果返回 True 则会被保留,False 则该组会被过滤,最后把所有未被过滤的组其对应的所在行拼接起来作为 DataFrame 返回。
在 groupby 对象中,定义了 filter 方法进行组的筛选,其中自定义函数的输入参数为数据源构成的 DataFrame 本身,在之前例子中定义的 groupby 对象中,传入的就是 df[['Height', 'Weight']] ,因此所有表方法和属性 都可以在自定义函数中相应地使用,同时只需保证自定义函数的返回为布尔值即可。
4 跨列分组
4.1 apply 的引入
4.2 apply 的使用
在设计上,apply 的自定义函数传入参数与 filter 完全一致,只不过后者只允许返回布尔值
【a】标量情况:结果得到的是 Series ,索引与 agg 的结果一致
【b】Series 情况:得到的是 DataFrame ,行索引与标量情况一致,列索引为 Series 的索引
【c】DataFrame 情况:得到的是 DataFrame ,行索引最内层在每个组原先 agg 的结果索引上,再加一层返 回的 DataFrame 行索引,同时分组结果 DataFrame 的列索引和返回的 DataFrame 列索引一致
python怎么学习?
学习Python编程技术的流程与步骤,自学与参加培训学习都适用。
一、清楚学习目标
无论是学习什么知识,都要有一个对学习目标的清楚认识。只有这样才能朝着目标持续前进,少走弯路,从学习中得到不断的提升,享受python学习计划的过程。
虽然目前的编程语言有很多,但是基础语法上的概念,本质上都是相通的。可以做到一通百通。所以没有必要为了学哪门语言纠结太多。
python是目前市面上,我个人认为是最简洁最优雅最有钱途最全能的编程语言,没有之一。所以既然你决定了要学习python,那么就需要先下一个决心,至少决定要作为自己的主力语言。
python是全能语言,社区庞大,有太多的库和框架。你只需要找到合适的工具来实现想法,省去了造轮子的精力。
coder可以写尽可能少的代码来实现同等的功能。“人生苦短,我用python”是至理名言。
如果实现一个中等业务复杂度的项目,在相同的时间要求内,用java实现要4-5个码农的话,用python实现也许只需要1个。这就是python最大的优势了。
二、基本python 知识学习
1. 了解Python是什么,都能做些什么?
2. 知道什么是变量、算法、解释器
3. Python基本数据类型
4. 列表和元组的操作方法
5. 字符串操作方法
6. 基本的字典操作方法
以上这些可以略微掌握之后就进行下一步,遇到忘记不会的可以再参考一下书和笔记。
虽然看书学编辑是效率最低的事情。且不说书的内容基本过时。就是比较较的翻译也很晦涩,照书写了代码跑不通,不断报错。是很打击学习积极性的。
不过,介绍语法的基础书,还是可以买一本,作为手册查阅之用。这类基础书籍买一本就好,找个周末休息时间,一天便可看完。
三、掌握Python的条件、循环和相关的执行语句
任何知识它的基础知识都是有些枯燥的,现在我们就可以动手来做一些逻辑层面的东西了。掌握 if、else、elif、while、for、continue、break和列表推导式等这些语句的使用,还有程序中的异常处理。
四、面对对象知识
面对对象OOP,更高层次的Python程序结构,代码的重用避免代码冗余,打包你的代码,函数的参数、作用域等。
类,可以帮助我们减少大量的开发时间,提高编程的效率,对中大型项目十分关键。
五、项目实践
在这个阶段,一定要多动手实践,查找和处理过程中遇到的错误和异常,遇到问题多上网搜索,也可以参考公众号内的一些文章,或者加上咱们文章下方的老师领取合适的项目实例。
在成功的解决了这些问题之后,会有一种很大的成就感,这样一个良性循环,才是你学习Python这类程序语言的最大动力。
以上是小姐姐总结学习Python的步骤和流程。当然参加我们的Python培训课程,可以更快速、系统全面地掌握Python的各种知识。通过课后习题,让大家动手动脑的参与,课后问题解答会让你茅塞顿开。
培训班还会有很多实用的Python项目,从零开始带领大家一块解决项目遇到的问题,避免浪费大量精力和时间。最终让大家可以自行编写想要的各种Python程序。
六:缺点
当然任何一门语言都有缺点,Python也不例外。小姐姐认为学习一门语言不仅需要清楚的知道学习步骤,做到心中有规划。也需要适当的了解一下他的缺点,也是为了更好的掌握、完善。
1、第一个缺点就是运行速度和C程序比要慢很多,因为Python是解释型语言,代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。
2、第二个缺点就是代码不能加密。如果要发布你的Python程序实际上就是发布源代码,还好我们大部分用python是来写应用程序,给用户提供服务的,用户其实不需要也不关心你的源码。
怎么使用Python中Pandas库Resample,实现重采样,完成线性插值
#python中的pandas库主要有DataFrame和Series类(面向对象的的语言更愿意叫类) DataFrame也就是
#数据框(主要是借鉴R里面的data.frame),Series也就是序列 ,pandas底层是c写的 性能很棒,有大神
#做过测试 处理亿级别的数据没问题,起性能可以跟同等配置的sas媲美
#DataFrame索引 df.loc是标签选取操作,df.iloc是位置切片操作
print(df[['row_names','Rape']])
df['行标签']
df.loc[行标签,列标签]
print(df.loc[0:2,['Rape','Murder']])
df.iloc[行位置,列位置]
df.iloc[1,1]#选取第二行,第二列的值,返回的为单个值
df.iloc[0,2],:]#选取第一行及第三行的数据
df.iloc[0:2,:]#选取第一行到第三行(不包含)的数据
df.iloc[:,1]#选取所有记录的第一列的值,返回的为一个Series
df.iloc[1,:]#选取第一行数据,返回的为一个Series
print(df.ix[1,1]) # 更广义的切片方式是使用.ix,它自动根据你给到的索引类型判断是使用位置还是标签进行切片
print(df.ix[0:2])
#DataFrame根据条件选取子集 类似于sas里面if、where ,R里面的subset之类的函数
df[df.Murder13]
df[(df.Murder10)(df.Rape30)]
df[df.sex==u'男']
#重命名 相当于sas里面的rename R软件中reshape包的中的rename
df.rename(columns={'A':'A_rename'})
df.rename(index={1:'other'})
#删除列 相当于sas中的drop R软件中的test['col']-null
df.drop(['a','b'],axis=1) or del df[['a','b']]
#排序 相当于sas里面的sort R软件里面的df[order(x),]
df.sort(columns='C') #行排序 y轴上
df.sort(axis=1) #各个列之间位置排序 x轴上
#数据描述 相当于sas中proc menas R软件里面的summary
df.describe()
#生成新的一列 跟R里面有点类似
df['new_columns']=df['columns']
df.insert(1,'new_columns',df['B']) #效率最高
df.join(Series(df['columns'],name='new_columns'))
#列上面的追加 相当于sas中的append R里面cbind()
df.append(df1,ignore_index=True)
pd.concat([df,df1],ignore_index=True)
#最经典的join 跟sas和R里面的merge类似 跟sql里面的各种join对照
merge()
#删除重行 跟sas里面nodukey R里面的which(!duplicated(df[])类似
df.drop_duplicated()
#获取最大值 最小值的位置 有点类似矩阵里面的方法
df.idxmin(axis=0 ) df.idxmax(axis=1) 0和1有什么不同 自己摸索去
#读取外部数据跟sas的proc import R里面的read.csv等类似
read_excel() read_csv() read_hdf5() 等
与之相反的是df.to_excel() df.to_ecv()
#缺失值处理 个人觉得pandas中缺失值处理比sas和R方便多了
df.fillna(9999) #用9999填充
#链接数据库 不多说 pandas里面主要用 MySQLdb
import MySQLdb
conn=MySQLdb.connect(host="localhost",user="root",passwd="",db="mysql",use_unicode=True,charset="utf8")
read_sql() #很经典
#写数据进数据库
df.to_sql('hbase_visit',con, flavor="mysql", if_exists='replace', index=False)
#groupby 跟sas里面的中的by R软件中dplyr包中的group_by sql里面的group by功能是一样的 这里不多说
#求哑变量
dumiper=pd.get_dummies(df['key'])
df['key'].join(dumpier)
#透视表 和交叉表 跟sas里面的proc freq步类似 R里面的aggrate和cast函数类似
pd.pivot_table()
pd.crosstab()
#聚合函数经常跟group by一起组合用
df.groupby('sex').agg({'height':['mean','sum'],'weight':['count','min']})
#数据查询过滤
test.query("0.2
将STK_ID中的值过滤出来
stk_list = ['600809','600141','600329']中的全部记录过滤出来,命令是:rpt[rpt['STK_ID'].isin(stk_list)].
将dataframe中,某列进行清洗的命令
删除换行符:misc['product_desc'] = misc['product_desc'].str.replace('\n', '')
删除字符串前后空格:df["Make"] = df["Make"].map(str.strip)
如果用模糊匹配的话,命令是:
rpt[rpt['STK_ID'].str.contains(r'^600[0-9]{3}$')]
对dataframe中元素,进行类型转换
df['2nd'] = df['2nd'].str.replace(',','').astype(int) df['CTR'] = df['CTR'].str.replace('%','').astype(np.float64)
#时间变换 主要依赖于datemie 和time两个包
#其他的一些技巧
df2[df2['A'].map(lambda x:x.startswith('61'))] #筛选出以61开头的数据
df2["Author"].str.replace(".+", "").head() #replace(".+", "")表示将字符串中以””开头;以””结束的任意子串替换为空字符串
commits = df2["Name"].head(15)
print commits.unique(), len(commits.unique()) #获的NAME的不同个数,类似于sql里面count(distinct name)
#pandas中最核心 最经典的函数apply map applymap
关于python聚合函数和python聚合函数整数列表求最大,最小,平均值的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。