数据分析师常用技巧:
pdb调试:(类似debug)
#pbd 断点 'l':断点上下文 'c':继续执行
# 'n':运行下一句 'step':进入函数
#可以直接运行代码语句 例credit.shape
pdb.set_trace()
时间格式转换:
data["上映时间"] = pd.to_datetime(data["上映时间"])
data["上映年份"] = data["上映时间"].dt.year
数据透视表:
movies_type_year_relation = pd.pivot_table(
data=data,
index='上映年份',
columns='电影类型',
aggfunc='size'
)
Pyecharts:(百度开源的画图插件)
from pyecharts.charts import *
import pyecharts.options as opts
# 导入主题配置项
from pyecharts.globals import ThemeType
# theme=ThemeType.PURPLE_PASSION # 增加主题
c = (Funnel() # 漏斗图的实例化
.add("评分", [list(z) for z in zip(diff_runtime.index.astype(str).tolist(), diff_runtime["平均评分"].tolist())])
.set_global_opts(title_opts=opts.TitleOpts(title="电影时长与评分的关系"))
.set_series_opts(label_opts=opts.LabelOpts(is_show=True, position="inside"))
)
from pyecharts.charts import Geo # 地理图表
from pyecharts.globals import GeoType
from pyecharts.globals import SymbolType
geo.add_schema(
maptype="湖北",
# 通过样式设置---为地图增加颜色
itemstyle_opts=opts.ItemStyleOpts(color="#323c48", border_color="#111"),
# 显示地图上城市名称
label_opts=opts.LabelOpts(is_show=True))
# 增加数据【从哪个城市到哪个城市】
geo.add(series_name="",
# data_pair=[['武汉', '黄冈'], ['武汉', '十堰']],
data_pair=data_pair,
type_=GeoType.LINES,
effect_opts=opts.EffectOpts(
symbol=SymbolType.ARROW, symbol_size=6, color="blue"),
linestyle_opts=opts.LineStyleOpts(curve=0.2),)
# label信息 属于 系列配置项
geo.set_series_opts( label_opts=opts.LabelOpts(is_show=False))
geo.render("流向图.html")
轮播图:
from pyecharts.charts import Geo, Timeline
t1 = Timeline()
t1.add(geo, "2020-{}日".format(i))
地图热力图:
# 实例化画图对象
china_map = Map(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION))
大拼图:
# 形成大屏图,page需要为可拖拽
page = Page(layout=Page.DraggablePageLayout)
page = Page
page.save_resize_html(
# 将什么合成大屏图
source='疫情图的组合.html',
cfg_file='chart_config.json',
dest='终极大屏图.html'
)
曲线面积图:
from pyecharts.faker import Faker
c = (Line()
.add_xaxis(Faker.choose())
.add_yaxis("商家A", Faker.values(), areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
.add_yaxis("商家B", Faker.values(), areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
.set_global_opts(title_opts=opts.TitleOpts(title="Line-面积图"))
.render("line_area_style.html"))
网格图:
from pyecharts.charts import Grid # 网络
grid = Grid(init_opts=opts.InitOpts(bg_color='gray')) # 子图的效果【组合图】
# 一个画图对象; 该图的位置设置
grid.add(line, grid_opts=opts.GridOpts(pos_left="30%",
pos_right='30%'),
# 图中有多条轴,需要设置
is_control_axis_index=True )
柱状图折线图组合图:
# 不同类型的组合在一起
overlape = bar.overlap(line) # overlap前的主图
数据处理:
# 如果该行存在 空值,删除该行
data = data.dropna(axis=0, how='any', inplace=False)
data.info()
drop_data = data[mask].index # 删除行索引
# print("将删除的数据\n", drop_data[['销售数量', '应收金额', '实收金额']])
data.drop(index=drop_data, inplace=True)
# 按照 社保卡号+成交时间 去重
out2 = data.drop_duplicates(subset=["社保卡号", "成交时间"])
# keep {'first', 'last', False}
# first 保留第一个; last 保留最后一条; False删除所有重复的
格式化:
print("患者没有 (医保卡) 的人占比?%.2f%%"%(no_use_pct*100))
箱线图:
def box_analysis(val):# 下四分位数 和上 四分位数
ql, qu = val.quantile(q=[0.25, 0.75])
IQR = qu - ql # 间距
low = ql - 1.5 * IQR # 正常值的下限
high = qu + 1.5 * IQR # 正常值的上限
return (val >= low) & (val <= high)
哑变量编码:
# 参数2:prefix 前缀;生成的哑变量结果的列名称的前缀
out = pd.get_dummies(stu["城市"], prefix="城市")
print("哑变量转换后\n", out)
连续数据离散化:
# (1) 等宽法:区间信息传入是int, 每个区间的宽度是一样的
# 参数 bins 区间信息, 可以是int or 序列
# bins = [165, 170, 180, 190]
stu["hight"] = pd.cut(stu["hight"],
# bins=bins,bins=4,
include_lowest=True, # 区间是否包含最小值)
获取表格格式文件中所有工作表:
gongzi = pd.read_excel("../data/2020.07工资.xls",
sheet_name=None, # 获取所有工作表,返回的是字典)
print("工作表的名称", gongzi.keys())
detail1 = gongzi["meal_order_detail1"]
两列是否一致:
print("判断两列内容是否完全一致", df['A'].equals(df['B']))
print("判断两个DF内容是否完全一致", df.equals(df2))
简单的填充空值的方法:
# 不同列填充不同的值,借助字典的形式
data.fillna({"商品ID": 0, "类别ID": '/'},inplace=True)
method :{{'backfill', 'bfill', 'pad', 'ffill', None}}
backfill', 'bfill' 使用下一个非空值填充
'pad', 'ffill' 上一个非空值填充
data["类别ID"].fillna(method='backfill',inplace=True)
线性关系/拉格朗日插空值:
from scipy.interpolate import interp1d # 线性关系插值
# 提供已知的数据---建立自变量和因变量之间的关系
fun = interp1d(x=[1,2,3,4,7,8],
y=[3,5,7,9,15,17] )
from scipy.interpolate import lagrange # 拉格朗日 【非线性插值】
fun = lagrange(x=[1,2,3,4,7,8],
w=[3,5,7,9,15,17])
print(fun(5)) # [11. 13.]
print(fun([5,6])) # [11. 13.]
重叠合并:
# 内容相对完整的表作为主表 #重叠合并
out = df.combine_first(df2)
groupby(分组聚合):
透视表:
out2 = pd.pivot_table(
data=stu, # 进行透视的原始数据
index=['cls_id', 'group_id'], # 行索引/ 行分组键,根据那列内容进行分组,该列的不同内容会作为行索引
values=['score', 'hight'], # 关注的数据
# aggfunc='mean' # 对数据进行什么计算)
print("不同班级不同小组的学生的平均成绩\n", out2)
交叉表:
统计频数:
from collections import Counter
lists = ['a', 'a', 'b', 5, 6, 7, 5]
a = Counter(lists)