文章目录

  • 前言
    • 为什么要学习python
    • 为什么要对比excel学习python
  • 第1章 数据分析基础
    • 数据分析的作用
    • 数据分析的内容
    • 数据分析的流程
  • 第2章 python基础知识
    • 1.python介绍
    • 2.python的下载与安装
    • 3.python的基本概念
    • 4.字符串
    • 5.数据结构——列表
    • 6.数据结构——字典
    • 7.数据结构——元组
    • 8.运算符
    • 9.循环语句
      • for循环
      • while循环
    • 10.条件语句
      • if语句
      • else语句
      • elif语句
    • 11.函数
    • 12.高级特征
      • 列表生成式
      • map 函数
  • 第3章 pandas数据结构
    • series数据结构
    • DataFrame表格型数据结构
  • 第4章 获取数据源
    • 导入外部数据
    • 新建数据
    • 熟悉数据
  • 第5章 数据预处理
    • 缺失值处理
    • 重复值处理
    • 异常值的检测与处理
    • 数据类型转换
      • python的数据类型
      • 类型转换
      • 索引设置
  • 第6章 数据选择
  • 第7章 数值操作
    • 数值替换
    • 数值排序
    • 数值排名
    • 数值删除
      • 删除列
      • 删除行
    • 数值计数
    • 唯一值获取
    • 数值查找
    • 区间切分
    • 插入新的行列
    • 行列互换
    • 索引重塑
    • 长宽表转换
      • 宽表转换为长表
      • 长表转换为宽表
    • apply()与applymap()函数
  • 第8章 数据运算
    • 算术运算
    • 比较运算
    • 汇总运算
  • 第9章 时间序列
    • 获取当前时刻的时间
    • 指定日期和时间的格式
    • 字符串和时间格式的相互转换
    • 时间索引
    • 时间运算
  • 第10章 数据分组/数据透视表
    • 数据分组
    • 数据透视表
  • 第11章 多表拼接
    • 横向拼接
    • 纵向拼接
  • 第12章 结果导出
    • 导出为.xlsx文件
    • 导出为.csv文件
    • 多个sheet
  • 第13章 数据可视化
  • 第14章 案例分析
  • 第15章 numpy数组

前言

为什么要学习python

1.处理大量数据时,python效率高于excel
2.python可以实现自动化
python比VBA更强大
3.python可以用来做算法模型

为什么要对比excel学习python


以下是本书的学习笔记

第1章 数据分析基础

数据分析的作用

1.现状分析
整体运营情况、业务构成、日报月报周报
2.原因分析
一般通过专题分析来分析原因
3.预测分析
在原因分析的基础上,对未来发展趋势做出预测

数据分析的内容

1.总体概览指标——统计绝对数
称为关键性指标
2.对比性指标
常见的有:同比、环比、差
3.集中趋势指标
4.离散程度指标
5.相关性指标
*相关关系与因果关系

数据分析的流程

1.熟悉工具
2.明确目的
3.获取数据
4.熟悉数据
5.处理数据
*异常数据
*重复数据
*缺失数据
*测试数据

6.分析数据——下钻法
7.得出结论
8.验证结论
9.展示结论

第2章 python基础知识

1.python介绍

2.python的下载与安装

本书提供的方式为 安装anaconda,利用jupyter notebook 进行学习
jupyter notebook的markdown功能—目录:

  • 打开anaconda prompt
  • 输入 pip install jupyter_contrib_nbextensions
  • 输入 jupyter contrib nbextension install --user
  • 打开jupyter,可以看到多了一个目录栏nbextensions
  • 勾选上 table of contents

3.python的基本概念

数:int float

  • 变量:
  • 标识符:
  • 数据类型:数 字符串
  • 输出与输出格式设置:str.format()方法
    (示例):
print('{}月{}借方余额为:{:.2f}元'.format(6,'固定资产',10000))

运行结果为:6月固定资产借方余额为:10000.00元

4.字符串

字符串的连接 +
字符串的复制 *
字符串的长度 len()
字符串的查找 in not in .find()
字符串的索引 a[]
字符串的分隔 .split()
移除字符 .strip() #默认移除空格和换行符,也可添加指定字符

5.数据结构——列表

列表的复制与合并: * +
向列表中插入新元素:.append(元素) .insert(位置,元素)
获取列表中值出现的次数 .count()
获取列表中值出现的位置 .index()
获取列表中指定位置的值:普通索引与切片索引
删除列表中的值 .pop(位置) .remove(值)
对列表中的值进行排序 .sort() #默认升序排序

6.数据结构——字典

  • 将键值以列表的形式存放再元组中,可以用dict()进行转换
  • test_dict[“键”]="值“
  • keys()用来获取所有键
  • values()用来获取所有值
  • items()用来获取键值对

7.数据结构——元组

  • 元组与列表类似,但元素不能修改
  • 获取元组的长度: len(tup)
  • 获取元组内的元素:普通索引 切片索引
  • 元组与列表相互转换: list(tup)转换为列表; tuple(t_list)转换为元组
  • zip()函数:将可迭代对象(列表、元组)作为参数,对应的元素打包成一个个元组,返回由这些元组组成的列表;常与for循环一起搭配使用
list_a1=["小米","小水","小菜","小白"]
list_a2=[101,102,103,104]
tup_b1=(93,98,95,94)
tup_b2=("优","优","优","优")
result=[]for i in zip(list_a1,list_a2,tup_b1,tup_b2):result.append(i)print(result)

[('小米', 101, 93, '优'), ('小水', 102, 98, '优'), ('小菜', 103, 95, '优'), ('小白', 104, 94, '优')]

8.运算符

算术运算符 Value
+
-
*
/
% 相除取余
** 10**5 表示10的5次方
// 相除取整
比较运算符 value
== 等于
!= or <> 不等于(<>有的版本不可用)
> < >= <=
逻辑运算符 value
and
or
not

9.循环语句

for循环

可以遍历任何序列的项目

#遍历列表
subject=["excel","sql","python","统计学"]
for sub in subject:print("我目前正在学习:{}".format(sub))

我目前正在学习:excel
我目前正在学习:sql
我目前正在学习:python
我目前正在学习:统计学。


while循环

当满足条件时,执行某程序

10.条件语句

if语句

else语句

elif语句

11.函数

def 函数名(参数):语句块  语句块1: print()
语句块2:data=()
return data

普通函数与匿名函数

#普通函数
def addxy(x,y):result=x+yreturn result
addxy(1,2)#匿名函数
f=lambda x,y:x+y
f(1,2)

12.高级特征

列表生成式

#普通方法生成列表
num=[1,2,3,4,5]
new=[]
for i in num:new.append(i**2)
new#列表生成式
num=[1,2,3,4,5]
[i**2 for i in num]

例2 ,两层嵌套

#普通方法生成列表
list1=["A","B","C","D"]
list2=["a","b","c","f"]
new=[]
for m in list1 :for n in list2:new.append(m+n)
new#列表生成式
list1=["A","B","C","D"]
list2=["a","b","c","f"]
[m+n for m in list1 for n in list2]

map 函数

map(function,agrs),表示对序列agrs中的每个值进行function操作,最终得到一个结果序列

a=map(lambda x,y:x+y,[1,2,3],[3,2,1])#将map的结果存储再列表中
#方法一 for循环遍历
for i in a:print(i)#方法二 list方法
a=map(lambda x,y:x+y,[1,2,3],[3,2,1])
b=list(a)
#or
b=list(map(lambda x,y:x+y,[1,2,3],[3,2,1]))

第3章 pandas数据结构

数据分析常用的模块

import pandas as pd
import numpy as np
from matplotlib.pyplot as plt

series数据结构

series是由一组数据与一组与之相关的数据标签(即索引)组成:

  1. 创建一个series使用pd.series()方法;
  2. 获取series的索引利用index()方法;
  3. 获取series的值利用values()方法
import pandas as pd#传入一个列表
s1=pd.Series(["a","b","c","d","e"])
s1#传入一个列表 并指定索引
s2=pd.Series(["a","b","c","d","e"],index=[1,2,5,4,3])
s2#传入一个字典,key即为索引
s3=pd.Series({"a":1,"b":2,"c":3})
s3

注意python大小写敏感

DataFrame表格型数据结构

DataFrame是由一组数据与一对索引(行 列)
DataFrame

import pandas as pd
#传入一个列表
df1=pd.DataFrame(["a","b","c","d","e"])
df1#传入一个嵌套列表
df2=pd.DataFrame([["A","a"],["B","b"],["C","c"]])#传入一个嵌套元组的列表
df3=pd.DataFrame([("A","a"),("B","b"),("C","c")])#传入 并指定索引
df4=pd.DataFrame([["A","a"],["B","b"],["C","c"]],columns=["大写","小写"],index=[1,2,3])#传入一个字典,key即为索引
data={"小写":["a","b","c"],"大写":["A","B","C"]}
df5=pd.DataFrame(data,index=[1,2,3])
#新增一行数据
tmp_df_V=tmp_df_V.append([{'orderid':'27415245'}],ignore_index=True)#ignore_index=True 加入tmp_df_V的索引;合并两个DataFrame时设置未False则应用原来各自的索引
#append不直接对tmp_df_V进行操作,需要赋值

第4章 获取数据源

导入外部数据

  • 导入.xlsx文件,用pd.read_excel(r"路径")
    加r避免电脑默认路径中的\被转义,否则需要手动将\换成/

    • 参数sheet_name= 用来指定导入的sheet
      参数可指定为"sheet的名字",也可指定为顺序,从0开始计
    • 参数index_col指定某一列作为行索引(第几列,从0开始)
      从0开始的默认索引作为
    • 参数header设置列索引
      从0开始计数,选择作为索引的行;可设置为none,默认为首行header=0
    • 参数usecols设置需要导入的列
      从0开始计数,可以切片
  • 导入.csv文件 ,用pd.read_csv(r"路径")

    • 参数sep指明分隔符号,默认为逗号
      常见的分隔符号有:逗号 空格 制表符(\t)
    • 参数nrows指明读取行数
    • 参数encoding指定编码格式
      python常用编码格式:utf-8 gbk;默认编码格式为utf-8
    • 参数engine
    • 当文件路径或者文件名包含中文时,需要设置engine参数
    • 默认值为"C",需要设置为"python"
    • 相应也需要调整encoding的值为"utf-8-sig"或者"gbk"
  • 导入.txt文件 ,用pd.read_table(r"路径",sep=" ")
    pd.read_table是利用分隔符隔开的文件导入DataFrame的通用函数,sep参数为必须填写

  • 导入.sql文件

  • 安装模块pip install pymysql
    pd.read_table是利用分隔符隔开的文件导入DataFrame的通用函数,sep参数为必须填写
import pymysql#创建链接
eng=pymysql.connect(host='',user='',password='',db='',charset='')
#host:数据库地址/本机使用localhost
#user 用户名;password 密码
#db:数据库名
#charset:数据库编码,一般为UTF-8#写sql查询
sql='select * from table_'#导入sql
df=pd.read_sql(sql,end)
#可以设置行索引参数index_col,列索引参数columns

新建数据

可以利用pd.DataFrame()方法新建

熟悉数据

df.head(10) #预览前10行,默认5
df.shape #行数和列数,不包含索引
df.info() #查看数据类型
df.describe() #获取所有数值型字段的分布值

第5章 数据预处理

缺失值处理

#查看缺失值
df.info ()
df.isnull()
#缺失值删除
df.dropna() #参数 how="all"仅删除全为空值的行
#缺失值填充
df.fillna(值) #所有缺失值填充为指定值
df.fillna({字段名:值,字段名:值})#指定列的缺失值填充为指定值

重复值处理

import pandas as pd
df3.drop_duplicates() #删除重复项 默认保留第一个行
df3.drop_duplicates(subset="列名") #对指定列进行去重 默认保留第一个行
df3.drop_duplicates(subset=["列名1","列名2"],keep=last/False)
#列表通过多个列去重
#参数keep设置保留项,默认值为first,可以设置为last/False,False为把重复值全部删除

异常值的检测与处理

  • 异常值的检测

主要有三种方式:

  • 业务经验划定指标的正常范围
  • 通过箱型图识别:在箱型图上下边缘以外的点称为异常值
  • 服从正态分布的数据,3σ原则:μ±3σ的值为异常值
  • 异常值处理

处理方式:

  • 删除–最常用 #满足条件的过滤出来作为新表处理
  • 把异常值当作缺失值来填充 #实则为替换,利用replace()方法
  • 研究异常值的原因

数据类型转换

python的数据类型

类型 说明
int 整型
float 浮点数
object python对象类型 用O表示
string_ 字符串 用S表示,S10表示长度为10的字符串
Unicode_ 固定长度的Unicode类型
datetime64[ns] 时间格式

info()方法、df[“字段”].dtype 方法

类型转换

df["列名"].astype("字段类型")
#如将一个int类型的字段转换为float类型,公式中的"字段类型"可以填写为"float64"
###
#如需要修改原DataFrame某字段类型,需要使用函数之后赋值给原字段
df1["allianceid"]=df1["allianceid"].astype("object")

索引设置

  • 添加索引
  • 默认用从0开始的自然数做索引
  • df.columns=[“第一列”,“第二列”,…] 传入列表里的值作为列索引
  • df.index=[1,2,3,4,5,6,7] 传入列表里的值作为行索引
  • 重新设置索引 一般指行索引的设置
  • df.set_index(“列2”) 将列2作为索引列(即行索引)
  • 层次化索引:传入多个列名,用多列作索引
  • 重命名索引

df.rename(columns={“原索引名”:“新索引名”},index={“原行索引名”:“新行索引名”})

  • 重置索引

主要用在层次化索引表中:将索引列当作一个columns返回

df.reset_index() #默认将所有index转化为columns
df.reset_index(level=0) #将第0级索引转化为columns
df.reset_index(drop=True) #将原索引删掉,不加入columns;默认为False
#参数inplace还可以用来设置是否修改原数据表

第6章 数据选择

#选择数据:选择7月海外的orderid和amount
df3[['orderid','amount']]  #传入列名选择
df3.iloc[:,[0,11]] #传入列的位置选择——可以通过info()方法定位位置
df3.iloc[:,0:3] #选择连续的列——前3列
df3.iloc[0:10,0:3] #选择连续的行列——前3列、前10行
df3.loc[[0,1,2]]  #指定行索引选择行数据
df3.iloc[0] # 选择第一行(转置显示)
df3.iloc[0:2,] #选择前两行
df3.iloc[[0,2]] #选择第一行和第三行
#选择满足条件的数据 ——布尔索引
df3[df3["star"]>=3]  #选择星级为3星以上的数据
df3[(df3["star"]>=3) & (df3["isibu"]=="T")] #选择星级为3星以上且为ibu的数据 **注意双等号判断#布尔索引选择行+普通索引选择列+切片索引选择行
#df[布尔索引条件][行索引条件--切片][列索引条件--指定列名]
#其中,行、列索引条件可省略
df3[df3["star"]>=3][0:3] #选择星级为3星以上的前3行数据
df3[df3["star"]>=3][0:3][['orderid','amount']] #选择星级为3星以上的指定列的前3行数据
df3[df3["star"]>=3][['orderid','amount']] #选择星级为3星以上的指定列'orderid','amount'的数据

第7章 数值操作

数值替换

用处:异常值替换处理、缺失值填充处理等
类型:一对一替换、多对一替换、多对多替换

import numpy as np
#一对一替换
df1["countryname"].replace("香港","中国香港",inplace=True) #选中列进行替换操作,inplace默认值为False 即默认不修改原表)
df1.replace(np.NaN,'others') #对整个表的缺失值进行替换,类似 fillna()方法
#np.NaN为缺失值的一种表达方式
#多对一替换,借助列表
df1['countryname'].replace(['香港','澳门','台湾'],'中国港澳台')
#多对多替换,借助字典
df1['countryname'].replace({'香港':'中国香港','澳门':'中国澳门','台湾':'中国台湾'})

数值排序

分为升序与降序

  • 按照一列进行排序
    使用 df.sort_values()方法,默认升序,False为降序;
    默认缺失值排在最后,设置na_position='first’可以把确实值所在列排在前面
df.sort_values(by=['col'],ascending=True/False,na_position='first' /'last')
  • 按照多列数值进行排序
    参数的值用列表的形式给出即可;
    ascending可以只指定一个值,也可用列表对应给出不同的排序方式

数值排名

会新增一列
对应excel中的rank.avg()和rank.eq()函数
python中使用rank()方法:

涉及参数
ascending:默认升序,=False为降序
method:可设置四个值(average first min max)指定不同的排序方式

操作案例

  • 步骤1:新建一个有重复项的dataframe——新建
tmp_df=[]
tmp_df=df3['orderid'].head(10)
tmp_df
type(tmp_df) #得到pandas.core.series.Series 即是一个series
tmp_df_V=pd.DataFrame(tmp_df) # 将数据传入到DataFrame中
  • 步骤2:添加重复项的数据
    一行数据
#dataframe新增一行数据
tmp_df_V=tmp_df_V.append([{'orderid':'27415245'}],ignore_index=True)
#ignore_index=True 加入tmp_df_V的索引;合并两个DataFrame时设置未False则应用原来各自的索引
#append不直接对tmp_df_V进行操作,需要赋值

多行数据

#借助新的dataframe传入多行数据
a = [['27415245'],['27415289'],['27415267'],[2222]]
tmp_df_3=pd.DataFrame()
tmp_df_3=tmp_df_3.append(a)
tmp_df_3.columns=["orderid"]#修改列名,保证合并到一列
tmp3=tmp_df_3.append(tmp_df_V) #合并操作
  • 步骤3:排名操作
#转换object数据类型为int
tmp3["orderid"]=tmp3["orderid"].astype("int64")
tmp3['orderid'].rank(method="average")#数值相同的取平均名次
tmp3['orderid'].rank(method="first") #名次唯一,数值相同的按出现顺序
tmp3['orderid'].rank(method="min")#数值相同的取最小名次
tmp3['orderid'].rank(method="max")#数值相同的取最大名次
  • 步骤4:作为一列新增到原来的dataframe中
tmp3['排名']=tmp3['orderid'].rank(method="average")

数值删除

删除列

drop()方法,参数axis=1表示删除列,axis=0表示删除行

#备份数据 并查看数据类型
tmp_df2=df3
tmp_df2.info()#表达方式一:输入列名
tmp_df2.drop(["commission","allianceid"],axis=1)#不会直接作用在tmp_df2上#表达方式二:输入位置
tmp_df2.drop(tmp_df2.columns[[9,12]],axis=1)#表达方式三利用columns 无需axis参数
tmp_df2=tmp_df2.drop(columns=["commission","allianceid"])#并直接作用在原表格上

删除行

  • drop()方法
    与删除列类似,注意参数axis=0,columns换成index
  • 过滤条件法
    df[条件]
#删除vendortype不为供应商的数据
##!注意==与=的区别
tmp_df2[tmp_df2["vendortype"]=="供应商"]

数值计数

tmp_df2["alliancetype"].value_counts(normalize=False,sort=True)
#normalize默认为False,设置为True可以输出计数占比
#sort 默认值为True,表示按计数降序排列,设置为False则按索引顺序

唯一值获取

#唯一值获取
tmp_df2["countryname"].unique()

数值查找

#数值查找
#isin()方法,可单个值或者多个值,使用方法如下
tmp_df2.isin(['香港'])
tmp_df2[tmp_df2["vendortype"]=="供应商"]["countryname"].isin(['澳门','香港'])
#tmp_df2表的vendortype为供应商中,countryname是否为香港澳门
#输出结果为true false

区间切分

对应excel的if嵌套,如年龄分层
python可用cut()方法与qcut()方法

  • cut()方法
tmp_df2["amount_cate"]=pd.cut(tmp_df2["amount"],bins=[0,300,600,900,1200,1500,2000,3000,4000,6000,8000])
#参数bins设置分层的区间范围
#cut()方法的结果时左开右闭的区间
#分层结果赋值给tmp_df2最后新建一列amount_cate
tmp_df2["amount_cate"].value_counts(normalize=True)
#查看分层的分布情况
  • qcut()方法
#指定分层的份数,区间范围应该是考虑数值与个数情况
tmp_df2["amount_cate2"]=pd.qcut(tmp_df2["amount"],10)
#分成10份
#分层结果赋值给tmp_df2最后新建一列amount_cate2
tmp_df2["amount_cate2"].value_counts(normalize=True)
tmp_df2["amount_cate2"].unique()
#查看分层的分布情况

插入新的行列

  • 插入行:用两个表拼接的思路(可参考数值排名的案例操作)
  • 插入列 insert() 方法

行列互换

.T方法实现转置

df4.describe().T.T

索引重塑

含义:表格型数据转换到树形数据,即如将列索引变成第二层行索引,形成层次化索引;使用stack()方法
反向操作,可以使用unstack()方法

df4.describe().stack().unstack()

长宽表转换

宽表转换为长表

  • 使用stack()方法
#1.先选取数据集进行操作
tmp_df6_1=df6[df6["orderdate"]>="2020-01"]
#set_index()方法先将无需转换的列设置成索引
#stack()方法转成行
#reset_index()索引重置
#rename()设置新的列名
tmp_df6_2=tmp_df6_1.set_index(["citylevel","star","orderdate","type"]).stack().reset_index().rename(columns={0:"data","level_4":"datatype"})
tmp_df6_2
  • 使用melt()方法
tmp_df6_3=tmp_df6_1.melt(id_vars=["citylevel","star","orderdate","type"],var_name='datatype',value_name='data')
#参数id_vars为保持不变的列;
#var_name为转换为行的列的列名;
#value_name为新产生的列的列名
tmp_df6_3

两种方法的结果默认排序方式不一样,stack方法按行,melt方法按列

长表转换为宽表

对应excel的数据透视表,在10.2节讲解

apply()与applymap()函数

df6["momrate"].apply(lambda x:x*100)
#与匿名函数lambda结合使用
#对momrate这一列每个元素都*100
#指定行数据操作类似df6.applymap(lambda x:x*100)
#与匿名函数lambda结合使用
#对df6表中每个元素都*100

第8章 数据运算

算术运算

#加减乘除
round((df6["num"]-df6["num_lastM"])/df6["num_lastM"]*1,4)
#可以在外层+round() 非科学计数法显示

比较运算

#比较判断 < > !=
df6["num"]>df6["num_lastM"]#返回对应位置的True False

汇总运算

#非空值计数
df6.count()#计算每一列非空单元格的数量
df6.count(axis=1)#计算每一行非空单元格的数量
df6['num'].sum()#sum求和,同样地,借助参数axis=1可以控制对行运算(下同)
df6['num'].mean()#平均值
df6['num'].max()#最大值
df6.iloc[0:2,].max(axis=1)#对前两行求最大值
df6['num'].min()#最小值
df6.iloc[0:2,].min()#在前两行范围内,对每一列求最小值
df6.iloc[0:2,].min(axis=1)#axis=1,前两行的数据中,对每行求最小值
df6['num'].median() #中位数
df6[['num','num_lastM','num_lastY']].mode() #众数
df6[['num','num_lastM','num_lastY']].var()#方差
df6[['num','num_lastM','num_lastY']].std()#标准差
df6[['num','num_lastM','num_lastY']].quantile(0.25)#1/4分位数
df6[['num','num_lastM','num_lastY']].quantile(0.75)#3/4分位数
df6[['num','num_lastM','num_lastY']].quantile(0.6)
#相关性运算--一般使用的是皮尔逊相关系数
df6['num'].corr(df6['num_lastM'])#指定两列之间的相关系数
df6[['num','num_lastM','num_lastY']].corr()#多列之间两两相关的相关系数
df6[['num','num_lastM','star']].corr()#结果只有'num','num_lastM'两个字段的相关系数,其中star不是数值型

第9章 时间序列

获取当前时刻的时间

#获取当前时刻的日期
datetime.now()
datetime.now().year#年
datetime.now().month#月
datetime.now().day#日
datetime.now().hour
datetime.now().minute
datetime.now().second
#获取周数
datetime.now().weekday() #一周中的第几天
datetime.now().weekday()+1#系统记录周天是每周的第一天,故+1处理
datetime.now().isocalendar()#一年中的第几周、以及当周的第几天(已作+1处理,但还是从周日开始算新的一周,注意区分)
datetime.now().isocalendar()[0]#当前日期所在年份
datetime.now().isocalendar()[1]#当前日期所在周数
datetime.now().isocalendar()[2]#当前日期所在周的第几天

指定日期和时间的格式

#时间格式
datetime.now()
datetime.now().date()#当前时间展示到日期维度
datetime.now().time()#当前时间只展示时间
#借助strftime()自定义时间和日期格式
datetime.now().strftime('%Y-%m-%d')
datetime.now().strftime('%F')#'%Y-%m-%d'的简写形式
datetime.now().strftime('%Y/%m/%d')
datetime.now().strftime('%Y-%m-%d %H:%M:%S')
datetime.now().strftime('%Y-%m-%d %I:%M:%S')#%I表示12小时制
datetime.now().strftime('%Y-%h-%d %H:%M:%S')
datetime.now().strftime('%Y-%m-%d %W %H:%M:%S')#%W为周数,周一为新的一周
datetime.now().strftime('%Y-%m-%d %U %H:%M:%S')#%U为周数,周日为新的一周
datetime.now().strftime('%Y-%m-%d %W %w %H:%M:%S')#%W为周数,周一为新的一周;%w为周几,从0开始(0对应周日,1对应周一)

字符串和时间格式的相互转换

#字符串与时间格式的转换
type('2020-09-28')#得到结果是str
from dateutil.parser import parse
type(parse('2020-09-28')) #得到结果是datetime.datetime

时间索引

  • 当日期为索引列时
  • 当日期是普通列时
    借助布尔索引实现时间的选取,注意字段格式为str时要转换为timestamp
df6[df6["orderdate"]>="2020-09"]
df6[df6["orderdate"]>datetime(2020,1,1)]
#若提示orderdate为str格式,需要先进行格式转换
#法一 用pandas的to_datetime()方法
tmp_df6=df6
tmp_df6["orderdate"]=pd.to_datetime(df6["orderdate"])
tmp_df6[tmp_df6["orderdate"]>datetime(2020,1,1)]
#法二 用apply()方法
tmp_df6_02=df6
tmp_df6_02["orderdate"]=tmp_df6_02["orderdate"].apply(lambda x:datetime.strptime(x,'%Y-%m-%d %H:%M:%S'))
tmp_df6_02[tmp_df6_02["orderdate"]>="2020-09"]

时间运算

  • 时间差
sub_c=datetime.now()-parse('2020-09-21')
sub_c #返回一个timedelta对象,差值为7天36127秒

返回的结果为:datetime.timedelta(days=7, seconds=36127, microseconds=944638)
表示返回一个timedelta对象,差值为7天36127秒
timedelta对象包含天、秒、微秒三个等级,可以直接获取;获取小时、分钟则需换算

sub_c.days
sub_c.seconds
sub_c.seconds/3600 #换算为小时
sub_c.seconds/60 #换算为分钟
  • 时间偏移
#时间偏移
##法一 timedelta方法
from datetime import timedelta
date=datetime(2019,10,17,9,17)
date+timedelta(days=100) # 往后推移100天
date-timedelta(seconds=3600*12) #往前推移12小时#法二 date offset方法
from pandas.tseries.offsets import Day,Hour,Minute
date+Day(365)
date+Hour(3000)
date-Minute(3000)

第10章 数据分组/数据透视表

数据分组

#分组键是列名
df6.groupby("citylevel").count()
tmp_df=df6[(df6["type"]=="产量")&(df6["orderdate"]>="2020-01")].groupby(["citylevel","star"])[["num","num_lastM","num_lastY"]].sum()
#汇总求和2020年按照城市等级、酒店星级的当月产量、上月产量、去年同期产量
#groupby(["citylevel","star"])按多个字段分组
#[["num","num_lastM","num_lastY"]]对指定列进行汇总
#.count() .sum()选择运算方法
tmp_df["mom"]=tmp_df["num"]/tmp_df["num_lastM"]-1 #该数据无实际含义
tmp_df["yoy"]=tmp_df["num"]/tmp_df["num_lastY"]-1 # 2020年1-8月产量的同比增长率
tmp_df#查看数据
#分组键是series
#与分组键为列名的区别在于 groupby中传入的内容的具体形式不同 ,其余都一样
df6.groupby(df6["citylevel"]).count()
tmp_df=df6[(df6["type"]=="产量")&(df6["orderdate"]>="2020-01")].groupby([df6["citylevel"],df6["star"]])[["num","num_lastM","num_lastY"]].sum()
tmp_df["yoy"]=tmp_df["num"]/tmp_df["num_lastY"]-1 # 2020年1-8月产量的同比增长率
tmp_df#查看数据
  • aggregate方法
    aggregate方法可以一次使用多种汇总方法;
    可以针对不同的列做不同的汇总运算
#aggregate方法
df6.groupby(df6["citylevel"]).aggregate(["count","sum"])
df6.groupby(df6["citylevel"]).aggregate({"star":"count","num":"sum","num_lastM":"sum","num_lastY":"sum","momrate":"mean"})
  • 重置索引
#重置索引(将分组字段citylevel、star转换为非索引列
df6.groupby([df6["citylevel"],df6["star"]]).aggregate({"type":"count","num":"sum","num_lastM":"sum","num_lastY":"sum","momrate":"mean"}).reset_index()

数据透视表

#基本表达即所有参数如下
pd.pivot_table(df,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna=True,margins_name='ALL')
#values表示计算的值
#index表示行
#columns表示列
#aggfunc表示运算方法
#fill_value表示对空值的值进行填充
#margins表示是否显示合计列
#dropna表示是否删除缺失值
#margins_name表示合计列的列名
#练习如下
pd.pivot_table(df6[(df6["orderdate"]>="2020-01")&(df6["type"]=="产量")],values=['type','num'],index='orderdate',columns='citylevel',aggfunc={'type':'count','num':'sum'},fill_value=0,margins=True,dropna=False,margins_name='ALL').reset_index()
#df6[(df6["orderdate"]>="2020-01")&(df6["type"]=="产量")]设置了过滤条件
#values=['type','num']可以对多个字段进行汇总
#aggfunc={'type':'count','num':'sum'}通过字典设置不同字段不同汇总方式
#fill_value=0缺失值填充为0
#.reset_index()重置索引

第11章 多表拼接

横向拼接

#//简单的横向拼接
pd.merge(df8,df7,on="orderid",how='inner')
#case
#//对df8和tmp_df7先进行分组与汇总
tmp_result7=tmp_df7.groupby([tmp_df7["type"],tmp_df7["etd"],tmp_df7["country"]]).aggregate({"orderid":"count","ciiquantity":"sum","ciireceivable":"sum"}).reset_index()
tmp_result8=df8.groupby([df8["type"],df8["etd"],df8["region"]]).aggregate({"orderid":"count","ciiquantity":"sum","ciireceivable":"sum"}).reset_index()
#//新建一列id:由type etd region组成的匹配id
tmp_result7["id"]=tmp_result7["type"]+tmp_result7["etd"]+tmp_result7["country"]
tmp_result8["id_no"]=tmp_result8["type"]+tmp_result8["etd"]+tmp_result8["region"]
#//使用merge()方法进行横向拼接
pd.merge(tmp_result8,tmp_result7,left_on="id_no",right_on='id',how='left',suffixes=["_F","_N"])
#参数说明: left_on right_on on 为连接键
##         how指定连接方式,默认为 inner,可指定 left right outer
##         suffixes自定义重复列名,默认为 ["_x","_y"]

纵向拼接

concat()方法

#case
#step1 添加区分列、修改保持列名一致
tmp_result7['source']="national"
tmp_result7=tmp_result7.rename(columns={"country":"region"})
tmp_result8['source']="finance"
tmp_result8=tmp_result8.rename(columns={"id_no":"id"})
#普通合并
pd.concat([tmp_result7,tmp_result8])
#设置concat参数
pd.concat([tmp_result7,tmp_result8],ignore_index=True).drop_duplicates()
#参数ignore_index重置索引,默认值是False
#drop_duplicates()删除重复项

第12章 结果导出

导出为.xlsx文件

#to_exel 方法
#基本表达
df6_result1.to_excel(excel_writer=r"D:\Users\Desktop\data\output\outputtest_df6pivot.xlsx",sheet_name='df6pivot')
#参数设置
df8_result1=df8.groupby([df8["type"],df8["orderstatus"],df8["etd"],df8["region"]]).aggregate({"orderid":"count","ciiquantity":"sum","ciireceivable":"sum"}).reset_index()
df8_result1.to_excel(excel_writer=r"D:\Users\Desktop\data\output\outputtest_df8.xlsx",sheet_name='df8',index=False, #不导出index;上述df6则是因为数据透视表设置了index为orderdate#columns=["type","etd","orderid"] 限定导出的列encoding="utf-8", #一般都选择utf-8na_rep=0, #缺失值填充为0inf_rep=0 #无穷值填充为0)

导出为.csv文件

excel中csv有两种形式:
CSV UTF-8(逗号分隔)(.csv) 编码格式为utf-8
CSV(逗号分隔)(
.csv) 编码格式为gbk

df6_result1.to_csv(path_or_buf=r"D:\Users\yl.zhong\Desktop\data\output\outputtest_df6pivot.csv",#index,columns这两个参数同上xlsxsep=',' #sep参数用来指定分隔符号,默认为逗号分隔,na_rep=0 #设置缺失值,encoding='utf-8-sig' #默认涉及utf-8的编码,可能会出现中文乱码,则使用utf-8-sig或者gbk)#csv没有sheet_name这个参数,不能设置sheet名

多个sheet

#声明一个读写对象
writer=pd.ExcelWriter(r"D:\Users\yl.zhong\Desktop\data\output\sheets.xlsx",engine='xlsxwriter')
#将df6_result1、df8_result1写入到“sheets”中的两个sheet,并命名
df6_result1.to_excel(writer,sheet_name='df6pivot')
df8_result1.to_excel(writer,sheet_name='df8',index=False, #不导出index;上述df6则是因为数据透视表设置了index为orderdate#columns=["type","etd","orderid"] 限定导出的列encoding="utf-8", #一般都选择utf-8na_rep=0, #缺失值填充为0inf_rep=0 #无穷值填充为0)
#保存读写的内容
writer.save()

第13章 数据可视化

第14章 案例分析

第15章 numpy数组

《对比excel,轻松学习python数据分析》学习笔记相关推荐

  1. 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术

    本章要点 任何一个应用程序,总是不停的和数据打交道. 瞬时数据:指储存在内存当中,有可能因为程序关闭或其他原因导致内存被回收而丢失的数据. 数据持久化技术,为了解决关键性数据的丢失. 6.1 持久化技 ...

  2. 第一行代码学习笔记第二章——探究活动

    知识点目录 2.1 活动是什么 2.2 活动的基本用法 2.2.1 手动创建活动 2.2.2 创建和加载布局 2.2.3 在AndroidManifest文件中注册 2.2.4 在活动中使用Toast ...

  3. 第一行代码学习笔记第八章——运用手机多媒体

    知识点目录 8.1 将程序运行到手机上 8.2 使用通知 * 8.2.1 通知的基本使用 * 8.2.2 通知的进阶技巧 * 8.2.3 通知的高级功能 8.3 调用摄像头和相册 * 8.3.1 调用 ...

  4. 第一行代码学习笔记第六章——详解持久化技术

    知识点目录 6.1 持久化技术简介 6.2 文件存储 * 6.2.1 将数据存储到文件中 * 6.2.2 从文件中读取数据 6.3 SharedPreferences存储 * 6.3.1 将数据存储到 ...

  5. 第一行代码学习笔记第三章——UI开发的点点滴滴

    知识点目录 3.1 如何编写程序界面 3.2 常用控件的使用方法 * 3.2.1 TextView * 3.2.2 Button * 3.2.3 EditText * 3.2.4 ImageView ...

  6. 第一行代码学习笔记第十章——探究服务

    知识点目录 10.1 服务是什么 10.2 Android多线程编程 * 10.2.1 线程的基本用法 * 10.2.2 在子线程中更新UI * 10.2.3 解析异步消息处理机制 * 10.2.4 ...

  7. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

  8. 第一行代码学习笔记第五章——详解广播机制

    知识点目录 5.1 广播机制 5.2 接收系统广播 * 5.2.1 动态注册监听网络变化 * 5.2.2 静态注册实现开机广播 5.3 发送自定义广播 * 5.3.1 发送标准广播 * 5.3.2 发 ...

  9. 第一行代码学习笔记第九章——使用网络技术

    知识点目录 9.1 WebView的用法 9.2 使用HTTP协议访问网络 * 9.2.1 使用HttpURLConnection * 9.2.2 使用OkHttp 9.3 解析XML格式数据 * 9 ...

  10. 安卓教程----第一行代码学习笔记

    安卓概述 系统架构 Linux内核层,还包括各种底层驱动,如相机驱动.电源驱动等 系统运行库层,包含一些c/c++的库,如浏览器内核webkit.SQLlite.3D绘图openGL.用于java运行 ...

最新文章

  1. 【烦人的问题】有一天发现VSCode中自己的鼠标选择老是跨行选择多段代码,怎么都改不回来,而且用alt+shift+鼠标都无法切换,肿么办?
  2. eclipse可以写前端吗_Python 竟然也可以写网页前端了!
  3. iOS 新特性分列式 之 iOS 8.x - 主要内容:应用扩展、手动对焦、Size Class
  4. 初看jQuery,比较dojo与jQuery的不同点
  5. redis主从架构宕机问题手动解决
  6. SAP UI5 GM6 require sap.ui.core.Core
  7. 分布式部署携程Apollo构建配置中心
  8. TimeSpan 用法 求离最近发表时间的函数
  9. 关于Android学习要问的一些问题
  10. UVA10800 Not That Kind of Graph【模拟+绘图】
  11. VS code 连接Linux服务器
  12. pb模型文件与.pbtxt配置不匹配导致OpenCV调用dnn模块出错(Mask R-CNN为例)
  13. 模仿开发H5游戏,看你有多色
  14. 《Miss Talk》第04期:对话凯叔讲故事 曲艳颂
  15. Android实时监听短信并上传服务器
  16. QT实现弹幕和webp格式礼物动效
  17. 插上耳机没声音 程序包ID:Audioplaybackdiagnostic 错误代码:0x80070002 源:引擎 上下文:升级
  18. 会员权益营销如何助力会员指数增长
  19. MATLAB--基本操作与矩阵输入
  20. 【免费资源必备】LingoDeer,扫描全能王直装版等五款APP让你享受上千个免费资源

热门文章

  1. 股票连续跌停后开板表现
  2. 括号匹配openjudge c语言,OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】...
  3. ubuntu端opencv人脸检测,并实现自动拍照,录视频
  4. chrome 主页被劫持,每天首次打开chrome都会进入2345的界面
  5. g++ 编译hook文件命令
  6. OpenOffice前途惨淡,我们还有其它选择吗?
  7. 从word2vec到bert:NLP预训练模型发展史
  8. 对电化学稳态阻抗谱(EIS)的数据进行自动化处理并可视化作图/画图(科研投稿)
  9. Qt开发之路——整型与字符串 int与QString互转
  10. 给大家介绍一个方便,好用的网络收藏夹