import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
%config InlineBackend.figure_format = 'svg'
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('data/2018年北京积分落户数据.csv', index_col='id')
df.info()
df.company.replace('北京华为数字技术有限公司', '华为技术有限公司北京研究所', inplace=True)
df.company.value_counts()[:20]
ser = df.company.replace('.*?华为(?!海洋网络).*', '华为技术有限公司北京研究所', regex=True)
ser.value_counts()[:20]
kobe_df = pd.read_csv('data/kobe_data.csv')
kobe_df.info()
pd.set_option('max_columns', None)
kobe_df.head()
# 1.科比使用得最多的投篮动作。
ser = kobe_df.action_type + '-' + kobe_df.combined_shot_type
ser.value_counts().index[0]
# 2.科比职业生涯交手最多的队伍是哪支球队。
kobe_df.drop_duplicates('game_id').opponent.value_counts().index[0]
# 3.科比职业生涯总得分。
# temp = kobe_df.dropna()
# temp = temp.query('shot_made_flag == 1')
# temp.shot_type.map(lambda x: int(x[0])).sum()
temp = kobe_df.dropna()[kobe_df.shot_made_flag == 1]
temp.shot_type.str.extract(r'(\d).*').applymap(int).sum()
video_df = pd.read_excel('data/某视频网站运营数据.xlsx')
video_df.info()
video_df.head()
# 根据views对数据排降序,根据video_id对数据进行去重
temp = video_df.sort_values('likes', ascending=False).drop_duplicates('video_id')
temp
# 找出点赞数在100000次以上的视频ID、标题和赞数
temp.query('likes > 100000')[['video_id', 'title', 'likes']]
# 对上面的结果进行进行去重,并找出点赞数排前10名的视频信息
temp.nlargest(10, 'likes')
# 根据频道对数据分组,统计出每个频道播放数、赞数、踩数和评论数各自的总和
temp2 = temp.pivot_table(
index='channel_title',
values=['views', 'likes', 'dislikes', 'comment_count'],
aggfunc='sum'
)
temp2
# 根据上面的结果找出热门频道("播放数+赞数+评论数”总和最高的前10名)
temp2['hot_value'] = temp2.views + temp2.likes + temp2.comment_count
temp2.nlargest(10, 'hot_value')['hot_value']
Pandas相关知识点
数据抽样
sample()
方法。
import random
df = pd.read_excel(
'data/2020年销售数据.xlsx',
header=1,
# skiprows=lambda row: row > 1 and random.random() < 0.9
)
df.info()
# 随机抽样200条数据
df.sample(n=200)
# 随机抽样10%的数据
df.sample(frac=0.1)
独热编码
数据表中的字符串字段通常需要做预处理,因为字符串字段没有办法计算相关性,也没有办法进行 χ 2 \chi^2 χ2检验、Gamma检验等操作,机器学习的算法。处理字符串通常有以下几种方式:
- 有序变量(Ordinal Variable):字符串表示的数据有大小关系,那么可以对字符串进行序号化处理。
- 分类变量(Categorical Variable)/ 名义变量(Nominal Variable):字符串表示的数据没有大小关系和等级之分,那么就可以使用独热编码处理成哑变量(虚拟变量)矩阵。
- 定距变量(Scale Variable):数据有大小高低之分,可以进行加减运算。
可以使用get_dummies()
函数来生成哑变量(虚拟变量)矩阵,将哑变量引入回归模型,虽然使模型变得较为复杂,但可以更直观地反映出该自变量的不同属性对于因变量的影响。
df = pd.DataFrame(
data={
'姓名': ['关羽', '张飞', '赵云', '马超', '黄忠'],
'职业': ['医生', '程序员', '分析师', '律师', '教师'],
'学历': ['高中', '大专', '本科', '硕士', '博士']
}
)
df
# 生成哑变量矩阵(独热编码)
temp = pd.get_dummies(df['职业'])
df[temp.columns] = temp
df.drop(columns='职业', inplace=True)
df
# 作业:将“学历”列替换成“定距变量”,不同学历的值请自行拟定
import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='school_1')
conn
student_df = pd.read_sql('select stu_id, stu_name from tb_student', conn)
student_df
course_df = pd.read_sql('select cou_id, cou_name from tb_course', conn)
course_df
record_df = pd.read_sql('select rec_id, stu_id, cou_id, score from tb_record where score is not null', conn)
record_df
# 合井表(how-连接表的方式,on- 基于哪个字段进行连表操作)
temp_df = pd.merge( student_df, record_df, how='inner', on='stu_id')
temp_df = pd.merge(temp_df, course_df, how='inner', on='cou_id')
temp_df.reindex(columns=['stu_name', 'cou_name', 'score'])
# 拼接表:表结构一致,数据来自于多张表,可以通过拼接操作实现数据的汇总
names = ['高新', '犀浦', '新津']
dfs = [pd.read_excel(f'data/小宝剑大药房({name}店)2018年销售数据.xlsx', header=1)
for name in names]
pd.concat(dfs, ignore_index=True)
from sklearn.datasets import load_boston
dataset = load_boston()
dir(dataset)
df = pd.DataFrame(data=dataset.data, columns=dataset.feature_names)
df['PRICE'] = dataset.target
df
# 协方差
df.cov()
temp = df.corr()
temp = temp.drop(index='PRICE')
# highlight_max - 高亮最大值
# highlight_min - 高亮最小值
temp.style.highlight_max(
subset=['PRICE'],
props='background: blue; color: white')
temp = df.corr()
temp = temp.drop(index='PRICE')
# background_gradient - 设置使用颜色阶梯
temp.style.background_gradient('Reds', subset=['PRICE']).to_excel('data/temp.xlsx')
其他方法
rolling()
方法expanding()
方法ewm()
方法explode()
方法interpolate()
方法
df = pd.DataFrame(np.arange(10).reshape(2,5),index=['time', 'food'])
df
haha = df.rolling(3, min_periods=1, axis=1).mean()
haha
df.rolling(3, axis=1).sum()
df.expanding(3, axis=1).mean()
df.ewm(com=0.5, axis=1).mean()
参数:
com
:浮动,可选- 根据质心指定衰减,a = 1/(1 + com),为了com≥0.
- 跨度:浮动,可选
- 根据跨度指定衰减,a = 2/(span + 1),为了span≥1.
df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
df
df.ewm(com=0.5).mean()
df = pd.DataFrame({'A': [[0, 1, 2], 'foo', [], [3, 4]],
'B': 1,
'C': [['a', 'b', 'c'], np.nan, [], ['d', 'e']]})
df
df.explode('A')
method
参数:-
linear
:忽略索引并将值视为等距。这是 MultiIndexes 支持的唯一方法。 -
time
:处理每日和更高分辨率的数据以插入 给定的间隔长度。 -
index
, ‘values’:使用索引的实际数值。 -
pad
:使用现有值填充 NaN。 -
“最近”、“零”、“线性”、“二次”、“三次”、“样条”、“重心”、“多项式”:传递给
scipy
。插值.interp1d
。这些方法使用索引的数值。polynomial
和spline
都要求您还指定一个阶数(int),例如 .df.interpolate(method=‘polynomial’, order=5) -
krogh
、piecewise_polynomial
、spline
、pchip
、akima
、cubicspline
:围绕类似名称的 SciPy 插值方法的包装。见注释。 -
from_derivatives
:指的是 scipy。插值.BPoly.from_derivatives替换 scipy 0.18 中的“piecewise_polynomial”插值方法。
-
s = pd.Series([0, 1, np.nan, 3])
s
s.interpolate()
s = pd.Series([np.nan, "single_one", np.nan,
"fill_two_more", np.nan, np.nan, np.nan,
4.71, np.nan])
s
s.interpolate(method='pad', limit=2)
s = pd.Series([0, 2, np.nan, 8])
s.interpolate(method='polynomial', order=2)
df = pd.DataFrame([(0.0, np.nan, -1.0, 1.0),
(np.nan, 2.0, np.nan, np.nan),
(2.0, 3.0, np.nan, 9.0),
(np.nan, 4.0, -4.0, 16.0)],
columns=list('abcd'))
df
df.interpolate(method='linear', limit_direction='forward', axis=0)
df['d'].interpolate(method='polynomial', order=2)
# !pip install pandas-datareader
import pandas_datareader as pdr
# baba_df = pdr.get_data_yahoo('BABA', start='2021-1-1', end='2021-6-30')
baba_df = pd.read_excel('data/BABA.xlsx')
baba_df
baba_df.Close.rolling(10).mean()[:20]
baba_df.Close.expanding?