Python学习之路
- 第一章 背景&基础知识
- 第三章 基本数据类型:凯撒密码
- 第四章 程序控制结构:猜数字游戏
- 第五章 函数和代码复用:软文的诗词风
- 第六章 组合数据类型:文本词频统计
- 第七章 文件和数据格式化
- 第八章 python计算生态
- 第九章 Python标准库概览
- 第十章 Python第三方库概览
- 第十一章 python第三方库纵览
- 第十二章 Python pandas和numpy数据分析
- 入门介绍
- pandas读取数据
- pandas数据结构
- pandas数据查询
- pandas新增数据列
- pandas数据统计函数
- pandas缺失值处理
- pandas SettingWithCopyWarning 报警复现、原因、解决方案
- pandas数据排序
- pandas字符串的处理
- pandas的axis参数
- pandas的索引用途
- pandas的merge语法
- pandas的concat语法
- pandas批量拆分与合并EXCEL文件
- pandas实现group by分组统计
- pandas的分层索引Multiindex
- pandas的数据转换函数map apply applymap
- pandas对每个分组应用apply函数
- pandas使用stack和pivot实现数据透视
- pandas对日期的快速处理
- pandas处理日期索引的缺失
- pandas实现excel的vlookup功能
- pandas找出影响结果的特征
- pandas计算同比环比
- 时间相关
- dataframe 排序
- 输出Excel/CSV
- 参数设置
- 列表
第一章 背景&基础知识
一、Python语言的特点
二、python基本语法元素
1. 数据类型-字符串类型
- 切片:利用[N:M]格式进行切片时,切取N但不包含M的连续字符
- 字符串长度:len()
2. 语句元素
- 引用(import):调用具体功能
import <功能库名称>
<功能库名称>.<函数名称>()
- 赋值(=):同步赋值
a,b = b,a+b
3.基本输入输出函数
- 输出函数(eval):以Python表达式的方式解析并执行字符串
value = eval(input("请输入要计算的数值:"))*2
print(value)
- 输出函数(print):混合输入字符串与变量值
a = 1234 b = 5678
print("数字{}和数字{}的和是{}".format(a,b,a+b))
- 输出函数(print):对end参数进行赋值
print(<待输出内容>,end = "<待输出的结尾>")
程序的语句元素
表达式
用于产生或计算新数据值。由数据和操作符等构成。
赋值语句
用=表赋值
<变量> = <表达式>
<变量1>,<变量2>...=<表达式1>,<表达式2>
引用
#引用
import <功能库名称>
#调用
<功能库名称>.<函数名称>( )
其他语句
- 分支语句
#单分支
if <条件>:
<语句块>
- 循环语句
while 【<条件>】:
<语句块1>
<语句块2>
基本输入输出函数
input( )函数
<变量> = input (<提示性文字>)
ps: 注意返回值是字符型
eval( )函数
以Python表达式的方式解析并执行字符串,将返回结果输出。经常与input搭配使用。
eval(<字符串>)
#与input搭配
<变量> = eval(input(<提示性文字>))
print()函数
- 输出字符串
print (<待输出字符串>)
- 输出变量
print(<变量1>,<变量2>,......)
- 混合输出
print (<输出字符串模板>.format(<变量1>,<变量2>......))
- 对end函数赋值
print (<待输出内容>,end = "<增加的输出结尾>")
第三章 基本数据类型:凯撒密码
数字类型
整数类型
- 默认十进制
- 二进制0b 0B,八进制0o 0O,十六进制0x 0X
- 不同进制之间可以直接运算
浮点型
- 必须带小数部分,0也可以
- 一般表示&科学计数法:e = a*10的b次方
复数
- a + bj b为1时也不可省略
- 用虚数.real和虚数.imag分别获得其实数和虚数部分
运算
数值运算操作符
- 以上所有操作符都可以与= 相连接,形成增强赋值操作符op (x op y 等价于 x = x op y)
- 数值运算结果可能改变结果的数据类型。
数值运算函数
字符串类型及格式化
分类
- 单行字符:用单引号或双引号
- 多行字符:用三个单引号或三个双引号
转义符
\n 换行
\0 空格
\ 反斜杠
’ 、’’ 反单引号双引号
\t 制表符
索引
- 左端从0开始,反向为负。
- 字符串均以unicode编码储存
<字符串或字符串变量>[序号]
切片
<字符串或字符串变量>[N:M]
#不包含m
format( )方法
<{<槽>}模板字符串>.format(<逗号分隔的参数>)
槽中的参数:
{ <参数序号从0开始>:<填充><对齐><宽度>,<.精度><类型>}
字符串类型的操作
字符串操作符
字符串处理函数
字符串处理方法
类型判断和类型间转换
- type( x )对x进行类型判断
- 数字类型转换可以通过数值运算操作符或内置转换函数
第四章 程序控制结构:猜数字游戏
程序的基本机构
流程图
分类
- 顺序结构
- 分支结构
- 循环结构
程序的分支结构
单分支结构:if 语句
if <条件>:
语句块
二分支结构:if - else 语句
#标准表达
if <条件>:
<语句块1>
else:
<语句块2>
#简洁模式
<表达式1> if <条件> else <表达式2>
多分支结构:if-elif-else 语句
if <条件1>:
<语句块1>
elif<条件2>:
<语句块2>
...
else:
<语句块n>
- 判断条件及组合
- 除0和空外,其余都为true
- not and or
程序的循环结构
遍历循环:for
for <循环变量> in <遍历结构>:
<语句块>
# 扩展模式
for <循环变量> in <遍历结构>:
<语句块1>
else:
<语句块2>
- 遍历结构可以是字符串、文件、range(<循环次数>)函数或组合数据类型。
- else 语句只有在循环正常执行之后才执行
无限循环:while
while <条件>:
<语句块>
# 扩展模式
while <条件>:
<语句块1>
else:
<语句块2>
- else 语句只有在循环正常执行之后才执行
循环控制:break 和 continue
- continue 只结束本次循环
- break 具备结束循环的能力
程序的异常处理
try:
<语句块1>
except:
<语句块2>
可处理输入及程序运行异常
第五章 函数和代码复用:软文的诗词风
函数的基本使用
- 函数定义
def <函数名>(<参数列表>):
<函数体>
return <返回值列表>
- 函数使用
<函数名>(<实际赋值参数列表>)
函数的参数传递
- 可选参数传递
def <函数名>(<非可选参数>,<可选参数>=<默认值>):
<函数体>
return <返回值列表>
- 参数名称传递
<函数名>(<参数名> = <实际值>)
- 函数的返回值
可以0个 1个 或多个
可使用一个或多个变量来保存多返回值的结果
变量的作用域
局部变量
仅作用于函数内部
全局变量
跨越多个函数,在函数里使用全局变量需使用global
代码复用
耦合度
- 紧耦合
- 松耦合
第六章 组合数据类型:文本词频统计
组合数据类型的基本概念
分类
- 集合:元素集合 eg 集合
- 序列:元素向量 eg 字符串、元组、列表
- 映射:“键-值”数据项的组合 eg 字典
集合类型概述
- { } 或 set( )
- 无序组合
- 元素唯一
- 元素类型必须是固定的,即列表、字典等无法作为元素
- 4个操作符
- 常用的一些函数和方法
序列类型概述
- 一维元素向量
- 元素之间存在顺序关系,通过序列访问
- 通用操作符和函数
映射类型概述
- “键-值”对的映射关系
- 元素之间是无序的,通过键值访问
列表类型
定义
- [ ] 或 list ( )
- 包含0个或多个元组的有序序列
- 无元素限制,类型可以不同
遍历
- 可以使用for对元素进行遍历
for <循环变量> in <列表变量>:
<语句块>
- 可使用切片
<列表或列表变量>[N:M]
或
<列表或列表变量>[N:M:K]#K 表步长
列表类型的操作
操作函数
操作方法
赋值
- 用 = 不是拷贝,拷贝是copy( ),等号是关联引用,指向同一套内容
- 使用索引配合等号才可赋值
字典类型
定义
- { } 或 dict( )
- “键-值”映射
{<键1>:<值1>,<键2>:<值2>,...,<键n>:<值n>}
索引
<值> = <字典变量> [<键>]
字典类型的操作
操作函数
操作方法
遍历
- 遍历返回索引值,值须通过get.( )获得
for <变量名> in <字典名>:
<语句块>
第七章 文件和数据格式化
第八章 python计算生态
第九章 Python标准库概览
第十章 Python第三方库概览
第十一章 python第三方库纵览
第十二章 Python pandas和numpy数据分析
入门介绍
numpy
用来存储和处理大型矩阵。eg 矩阵运算、矢量处理、N维数据变换。
pandas
提供数据模型和快速便捷处理数据的函数和方法。
pandas读取数据
读取纯文本文件
读取csv文件
#读取
a = pd.read_csv (path)
#查看前几行
a.head()
#查看数据行数、列数)
a.shape
#查看列名列表
a.columns
#查看索引列
a.index
#查看每列数据类型
a.dtypes
读取txt文件:指定分隔符,列名
a = pd.read_csv(
fpath,
sep = '\t', #列分符
header = None, #无标题行
names = ['列名1','列名2',......'']
)
读取excel文件
a = pd.read_excel(path)
读取mysql文件
import pymysql
conn = pymysql.connect(
host = '127.0.0.1',
user = 'root',
password = '1234',
database = 'girls',
charset = 'utf8'
)
a = pd.read_sql("select * from <table>",con=conn )
pandas数据结构
import pandas as pd
import numpy as np
dataframe
定义
二维数据,整个表格,多行多列
series
定义
一维数据,一行或一列 。
由一组数据及与之相关的数据标签(即索引)组成。
pandas数据查询
loc方法: 根据行列标签进行查询,既能查询,又能覆盖写入。
#数据预处理,替换并修改数据类型
a.loc[:," " ] = a[" "].str.replace(" "," ").astype('')
使用单个label值查询数据
#得到单个值
a.loc ['label','column']
#得到一个series
a.loc['label',['column 1','column 2']]
使用值列表批量查询
#得到series
a.loc [['label 1','label 2'],'column']
#得到dataframe
a.loc[['label 1','label 2'],['column 1','column 2']]
使用数值区间进行范围查询
既包含开始又包含结束
#行区间
a.loc [['label 1':'label 2'],'column']
#行列区间
a.loc[['label 1':'label 2'],['column 1':'column 2']]
使用条件表达式查询
#简单条件查询
a.loc[a["column"]< value , : ]
#复杂条件查询
a.loc[(a["column 1" ]< value) & (a["column 2" ]==value)])......, : ]
调用函数查询
a.loc[lambda a : (a["column 1" ]< value & a["column 2" ]==value......), : ])]
pandas新增数据列
直接赋值
a.loc [ :, "new column"] = a.[column 1]-a.[column 2]
apply
def function ()
assign
分条件赋值(广播📢)
pandas数据统计函数
汇总类统计
- 一下子提取所有数字列统计结果
a.describe( )
- 查看单个series的数据
a["column "].mean( )
- 聚合函数
a["column "].max( )
唯一去重和按值技术
- 唯一性去重(用于枚举、分类列)
a["column "].unique( )
- 按值计数
a["column "].values_counts( )
相关系数和协方差
- 相关系数:衡量相似度程度
a.corr( ) #全局 相关系数矩阵
a.[column 1].corr(a.[ column 2]) # 单个
- 协方差:衡量同向方向程度
a.cov( ) #全局 协方差矩阵
a.[column 1].cov(a.[ column 2]) # 单个
pandas缺失值处理
检测
isnull notnull
丢弃、删除缺失值
dropna: axis how inplace
填充空值
fillna : value method axis inplace
pandas SettingWithCopyWarning 报警复现、原因、解决方案
核心要诀:pandas的dataframe的修改写操作,只允许在源dataframe上进行,一步到位
pandas数据排序
series的排序
series.sort_value(ascending = true,inplace = false)
- ascending : true 升序 false 降序
- inplace :是否修改原始series
dataframe的排序
dataframe.sort_value(by,ascending = true,inplace = false)
- by : 字符串或list<字符串>,单列排序或多列排序
- ascending :bool或list : true 升序 false 降序,by的多列
- inplace :是否修改原始dataframe
pandas字符串的处理
基本规则
- 使用方法:先获取seies的str属性,再在属性上调用函数
- 只能在字符串使用,数字列无效
- dataframe上没有str属性和处理方法
- series.str并不是Python原生字符串,而是pandas的一套方法。
- series.str默认开启正则表达式模式。
pandas的axis参数
- axis = 0 或者 ”index“
单行:某一行
聚合:cross rows - axis = 1 或者 “columns”
单行:某一列
聚合:cross columns
pandas的索引用途
pandas的merge语法
pandas的merge,相当于sql的join
pandas的concat语法
pandas.concat(objs,axis = 0,join= 'outer',ignore_index = False)
pandas批量拆分与合并EXCEL文件
iloc 拆分dataframe
pandas实现group by分组统计
pandas的分层索引Multiindex
基本概念
- 分层索引:在一个轴向上拥有多个层级,可以表达更高维度的数据形式
- 可以更方便的进行数据筛选,如果有序则性能更好
- group by 等
pandas的数据转换函数map apply applymap
对比
- map:只用于series,实现每个值>值的映射
- apply: 用于series实现每个值的处理,用于dataframe实现某个轴的series处理
- applymap: 只能用于dataframe,用于处理该dataframe的每个元素
map
- series.map (dict)
- series.map(function)
pandas对每个分组应用apply函数
pandas使用stack和pivot实现数据透视
pandas对日期的快速处理
- pd.to_datetime
- Timestamp
- DatetimeIndex
pandas处理日期索引的缺失
- dataframe.reindex
- dataframe.resample
pandas实现excel的vlookup功能
pandas找出影响结果的特征
引入sklearn 机器学习包
#最影响结果的K个特征
from sklearn.feature_selection import SelectKBest
#卡方检验
from sklearn.feature_selection import chi2
pandas计算同比环比
pct_change
时间相关
- 生成时间集 : datetime.date
- 截取时间:datetime.strftime
- 时间差:datetime.timedelta
date = datetime.date(2019,1,1)
date_end = datetime.date(2020,12,31)
months = [ ]
while date <= date_end:
month = date.strftime("%Y-%m")
print(month)
i = "'"
months.append (i + month + i)
date = date + datetime.timedelta(days=31)
dataframe 排序
- 按列排序:sort_values
- 重置索引:reset_index (可不保留索引)
df_sort = df.sort_values(by = ['brand_id','shop_id','product_id'])
df_sort = df_sort.reset_index(drop=True)
输出Excel/CSV
- CSV 直接输出:to_csv
- CSV 对表拆分输出
# 表直接输出
df_sort.to_csv('Comments_Taobao.csv', encoding='utf_8_sig', index=None)
# 确定表规模
row_number = df_sort.shape[0]
csv_number = math.ceil(row_number/ 5)
# 对表拆分并输出
for i in range(5):
df_temp = df_sort.iloc[i*csv_number:(i+1)*csv_number,:]
csv_name = 'Comments_Tmall_'+ str(i+1) +'.csv'
print(csv_name)
df_temp.to_csv(csv_name, encoding='utf_8_sig', index=None)
- EXCEL 输出:to_excel
参数设置
- 1)参数嵌入sql : f’’’’ { } ‘’’
2)参数嵌入sql : f’’’’ ‘’’ %()
begin_date = datetime.date(2021,1,24)
end_date = datetime.date(2021,2,1)
sql_fgs =f'''
select title,web_url,replay_url from ze.FGS_Transfer
where live_date >= "{begin_date}"
and live_date < "{end_date}"
order by live_date,title;
'''
fgs = pd.read_sql(sql_fgs,impa_conn)
name=f'aaa.scope.csv'
def upload_data(db, filename):
csv_filename = name
create_ddl = f"""
CREATE TABLE %s.%s (
goodsid bigint
nlp_category string
mars_category string
platform string
)
""" %(name.split('.')[0],name.split('.')[1])
loader = CSVToHiveLoader(
database=name.split('.')[0],
filename=name,
table=name.split('.')[1],
delete_file=False,
is_std_csv=True,
has_header=True,
mode='OVERWRITE', # 自行选择模式,OVERWRITE, MERGE或APPEND
#primary_keys=['sku_name'], # 也可自行选择primary key
create_table_ddl=create_ddl
)
loader.execute()
print(f'%s uploaded.' %name)
return
upload_data(name.split('.')[0],name.split('.')[1])
- 参数嵌入文件名 : '{a} . format ’
eval(i)
writer = pd.ExcelWriter('{a} 完成.xlsx'.format(a=complete_date))
for i in ['fgs','kol','ali']:
eval(i).to_excel(excel_writer=writer,sheet_name=i,encoding='utf_8_sig', index=None)
writer.save()
writer.close()
列表
- 两个列表连接 zip()
for product,date in zip(product_list,date_list):
sql = f"""
select DISTINCT dt,product_id,daily_sales as volume from dianzhentan.ods_product
WHERE product_id = {product}
and dt = {date}
"""
- 字典方式相连
daily_product = dict(zip(productlist,dailylist))
df_d2 = pd.DataFrame()
for product in productlist:
sql_d1 = f"""
SELECT dt,brand_name,product_id,title,count,sales,category_3,category_name from tmall.daily_deal
WHERE product_id = {product}
and dt = {daily_product[product]}
"""
print (sql_d1)
df_d1 = pd.read_sql(sql_d1,impa_conn)
df_d2 = df_d2.append(df_d1)