python的4个内建的数据结构:
列表List [1,2,3]
元组tuple (1,2,3)
字典dictionary {‘data’:1,‘data2’:2}
集合set{1,2,2,3} 或者set([1,2,2,3])# 集合是会自动去重为{1,2,3}的
列表和元组可以用到的函数:
cmp(a,b)比较,len(a),max(a),min(a),sum(a),sorted(a)
列表独有的函数:a.append(199),a.count(1)
a.extend([1,2]) 将列表[1,2]追加到列表a末尾
a.index(1)找出第一个1的索引
a.insert(2,1)将1插入到列表a索引为2的位置
a.pop(188)删除列表a中索引为188的数据
字典的处理:
dict([[‘data’,1],[‘data2’,2]])相当于 {‘data’:1,‘data2’:2}
集合的处理:
a|b 并集,&交集,-求差,^对称差集
python中函数式编程的常见函数:(更快)
lambda(),map(),reduce(),filter()
map()命令等同于效率更高的for命令
a=[1,2,3]
b=map(lambda x:x+2,a)
b= list(b)
#结果为[3,4,5]
for的写法是 b=[i+2 for i in a ]
lilter()函数,筛选过滤符合条件的元素
b= filter (labmda x:x>5 and x<8,range(10))
b=list(b)
[6,7]
python的拓展库
numpy:数组
scipy:矩阵(依赖于numpy)
matplotlib:可视化
pandas:数据分析工具
statsmodels:统计
scikit-learn :机器学习库
keras:深度学习
gensim:文本学习
numpy的基本操作:
#-- coding:utf-8 -
import numpy as np
a=np.array([2,0,1,5])
print(a[:3])# 切片 引用前3个数据
matplotlib作图
x = np.linspace(0, 10, 1000)
y = np.sin(x) + 1
z = np.cos(x**2) + 1
plt.figure(figsize=(8, 4))
plt.plot(x, y, label=‘sin x +1’, color=‘red’, linewidth=2)
lable 和 label 大大不同
plt.plot(x, z, ‘b–’, label=‘cos x^2 +1’)
plt.xlabel(‘times(s)’)
plt.ylabel(‘volt’)
plt.title(‘thousand’)
plt.ylim(0, 2.2)
plt.legend()
plt.show()
excel的读取
pip install xlrd #读取
pip install xlwt # 写入
pandas的基本数据结构:Series(一维数据)、DataFrame(二维数组)
常见的读表:
pd.read_excel(‘data.xls’,index_col=u’日期’)# 取中文列名
pd.read_csv(‘data.csv’,encoding=‘utf-8’)
from statsmodels.tsa.stattools import adfuller as ADF
ADF(np.random.rand(100))#返回ADF值 P值
sklearn 的常用代码
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit()
model.predict(X_new)
model.predict_proba(X_new)# LR使用
model.score()#得分越高fit越好
额外的知识
model.transform()从数据中学到新的基空间
model.fit_transform()学习到基空间并转换
#-- coding: utf-8 --
import pandas as pd
catering_sale = ‘C:/Users/thous/Desktop/python_new/chapter3/demo/data/catering_sale.xls’ #餐饮数据
data = pd.read_excel(catering_sale, index_col = u’日期’) #读取数据,指定“日期”列为索引列
import matplotlib.pyplot as plt #导入图像库
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] #用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’] = False #用来正常显示负号
import numpy as np
import pandas as pd
n_sample = 1000
df_score = pd.DataFrame({
‘user_id’: [u for u in range(n_sample)],
‘label’:np.random.randint(2, size=n_sample),
‘score’: 900*np.random.random(size=n_sample),
‘term’: 20201+np.random.randint(5, size=n_sample)
})
df_score.groupby(‘term’).agg(total=(‘label’, ‘count’),
bad=(‘label’, ‘sum’),
bad_rate=(‘label’, ‘mean’))
#KS,GINI,AUC
from sklearn.metrics import roc_auc_score, roc_curve
def get_auc(ytrue, yprob):
auc = roc_auc_score(ytrue, yprob)
if auc < 0.5:
auc = 1 - auc
return auc
def get_ks(ytrue, yprob):
fpr, tpr, thr = roc_curve(ytrue, yprob)
ks = max(abs(tpr - fpr))
return ks
def get_gini(ytrue, yprob):
auc = get_auc(ytrue, yprob)
gini = 2 * auc - 1
return gini
df_metrics = pd.DataFrame({
‘auc’: df_score.groupby(‘term’).apply(lambda x: get_auc(x[‘label’], x[‘score’])),
‘ks’: df_score.groupby(‘term’).apply(lambda x: get_ks(x[‘label’], x[‘score’])),
‘gini’: df_score.groupby(‘term’).apply(lambda x: get_gini(x[‘label’], x[‘score’]))
})
#PSI
df_score[‘score_bin’] = pd.cut(df_score[‘score’], [0, 500, 700, 800, 900])
df_total = pd.pivot_table(df_score,
values=‘user_id’,
index=‘score_bin’,
columns=[‘term’],
aggfunc=“count”,
margins=True)
df_ratio = df_total.div(df_total.iloc[-1, :], axis=1)
eps = np.finfo(np.float32).eps
lst_psi = list()
for idx in range(1, len(df_ratio.columns)-1):
last, cur = df_ratio.iloc[0, -1: idx-1]+eps, df_ratio.iloc[0, -1: idx]+eps
psi = sum((cur-last) * np.log(cur / last))
lst_psi.append(psi)
df_ratio.append(pd.Series([np.nan]+lst_psi+[np.nan],
index=df_ratio.columns,
name=‘psi’))
#总人数比例和坏客户比例
df_total = pd.pivot_table(df_score,
values=‘user_id’,
index=‘score_bin’,
columns=[‘term’],
aggfunc=“count”,
margins=True)
df_ratio = df_total.div(df_total.iloc[-1, :], axis=1)
df_bad = pd.pivot_table(df_score[df_score[‘label’]==1],
values=‘user_id’,
index=‘score_bin’,
columns=[‘term’],
aggfunc=“count”,
margins=True)
df_bad_rate = df_bad/df_total
#做图
import seaborn as sns
colormap = sns.diverging_palette(130, 20, as_cmap=True)
df_ratio.drop(‘All’).T.plot(kind=‘bar’, stacked=True, colormap=colormap)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
colormap = sns.diverging_palette(130, 20, as_cmap=True)
df_bad_rate.drop(‘All’).T.plot(kind=‘line’, colormap=colormap)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
Pandas提供了pivot_table函数来进行数据透视表分析。下面是pivot_table函数的基本语法:
pivot_table(data, values=None, index=None, columns=None, aggfunc=‘mean’, fill_value=None, margins=False, dropna=True, margins_name=‘All’)
下面我们将介绍一些常用参数的含义:
data:要进行数据透视表分析的数据集。
values:要计算的值的字段名。
index:用于分组的字段名。
columns:用于分列的字段名。
aggfunc:用于计算值的函数,默认为’mean’。
fill_value:用于填充缺失值的值。
margins:是否添加汇总行和列。
dropna:是否删除包含缺失值的行或列。
margins_name:汇总行和列的名称。
Pandas提供了plot函数来进行数据可视化。下面是plot函数的基本语法:
plot(kind=‘line’, ax=None, subplots=False, sharex=None, sharey=False, layout=None, figsize=None, use_index=True, title=None, grid=None, legend=True, style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, secondary_y=False, sort_columns=False, **kwds)
下面我们将介绍一些常用参数的含义:
kind:图表类型,如’line’、‘bar’、'barh’等。
ax:要绘制图表的坐标轴。
subplots:是否将每个列绘制为单独的子图。
sharex:是否共享x轴。
sharey:是否共享y轴。
layout:子图布局。
figsize:图表尺寸。
use_index:是否使用索引作为x轴。
title:图表标题。
grid:是否显示网格线。
legend:是否显示图例。
style:图表样式。
logx:是否使用对数刻度x轴。
logy:是否使用对数刻度y轴。
loglog:是否使用对数刻度x轴和y轴。
xticks:x轴刻度。
yticks:y轴刻度。
xlim:x轴范围。
ylim:y轴范围。
rot:x轴标签旋转角度。
fontsize:字体大小。
colormap:颜色映射。
table:是否绘制表格。
yerr:y轴误差。
xerr:x轴误差。
secondary_y:是否绘制第二个y轴。
sort_columns:是否按列名排序。
使用Pandas导入数据并读取文件
要使用pandas导入数据和读取文件,我们可以使用库提供的read_*函数。
导入Pandas
import pandas as pd
使用Pandas读取文件
读取CSV文件
df = pd.read_csv(‘file.csv’)
读取Excel文件
df = pd.read_excel(‘file.xlsx’)
读取JSON文件
df = pd.read_json(‘file.json’)
读取Sql查询
pd.read_sql(query, connection_object)
读取Parquet文件
df = pd.read_parquet(‘file.parquet’)
从url读取HTML表
url=‘https://www.example.com/table.html’
tables = pd.read_html(url)
Pandas提供了各种数据选择方法,允许你从DataFrame或Series中提取特定数据。
用于获取带有标签列的series
df[column]
选择多列
df[[‘column_name1’, ‘column_name2’]]
通过标签选择单行
df.loc[label]
通过标签选择多行
df.loc[[label1, label2, label3]]
通过整数索引选择单行
df.iloc[index]
通过整数索引选择多行
df.iloc[start_index:end_index]
根据条件过滤行
df[df[‘column_name’] > 5 ]
使用多个条件过滤行
df[(df[‘column_name1’] > 5) & (df[‘column_name2’] == ‘value’)]
通过标签选择特定的行和列
df.loc[row_labels, column_labels]
通过整数索引选择特定的行和列
df.iloc[row_indices, column_indices]
根据条件选择数据框中的行和列
df.loc[df[‘column_name’] > 5, [‘column_name1’, ‘column_name2’]]
数据清洗是数据预处理阶段的重要步骤,在此阶段对数据进行转换和修改以确保其准确性、一致性和可靠性。
检查缺失值
df.isnull()
删除有缺失值的行
df.dropna()
用特定值填充缺失值
df.fillna(value)
插入缺失值
df.interpolate()
检查重复行
df.duplicated()
删除重复行
df.drop_duplicates()
计算z分数
z_scores = (df - df.mean()) / df.std()
根据z分数识别离群值
= df[z_scores > threshold]
删除离群值
df_cleaned = df[z_scores <= threshold]
替换列中的值
df[‘column_name’] = df[‘column_name’].str.replace(‘old_value’, ‘new_value’)
删除前/尾空格
df[‘column_name’] = df[‘column_name’].str.strip()
将字符串转换为小写
df[‘column_name’] = df[‘column_name’].str.lower()
将列转换为不同的数据类型
df[‘column_name’] = df[‘column_name’].astype(‘new_type’)
将列转换为日期时间
df[‘date_column’] = pd.to_datetime(df[‘date_column’])
重命名列名
df.columns = [‘Cat’, ‘Mat’, ‘Xat’]
重置DataFrame的索引
df.reset_index()
根据条件过滤行
df_filtered = df[df[‘column_name’] > 5]
按单列对DataFrame进行排序
df_sorted = df.sort_values(‘column_name’)
按多列对DataFrame进行排序
df_sorted = df.sort_values([‘column_name1’, ‘column_name2’], ascending=[True, False])
按单列对DataFrame进行分组并计算另一列的平均值
grouped_data = df.groupby(‘column_name’)[‘other_column’].mean()
按多列对DataFrame进行分组并计算另一列的总和
grouped_data = df.groupby([‘column_name1’, ‘column_name2’])[‘other_column’].sum()
计算列的总和
sum_value = df[‘column_name’].sum ()
计算列的平均值
mean_value = df[‘column_name’].mean()
计算列的最大值
max_value = df[‘column_name’].max()
计算列的最小值
min_value = df[ ‘column_name’ ].min()
统计列中非空值的个数
count = df[‘column_name’].count()
对DataFrame进行分组并重置索引
grouped_data = df.groupby(‘column_name’)[‘other_column’].sum().reset_index()
在pandas中,你可以使用各种函数基于公共列或索引来连接或组合多个DataFrame。
将df中的行添加到df2的末尾
df.append(df2)
将df中的列添加到df2的末尾
pd.concat([df, df2])
对列A执行外连接
outer_join = pd.merge(df1, df2, on=‘A’, how=‘outer’), axis =1)
对列A执行内连接
inner_join = pd.merge(df1, df2, on=‘A’, how=‘inner’)
对列A执行左连接
left_join = pd.merge(df1, df2, on=‘A’, how=‘left’)
对列A执行右连接
right_join = pd.merge(df1, df2, on=‘A’, how=‘right’)
Pandas提供了广泛的统计函数和方法来分析DataFrame或Series中的数据。
计算数值列的描述性统计
df.describe()
计算某列的总和
df[‘column_name’].sum()
计算某列的平均值
df[‘column_name’].mean()
计算某列的最大值
df[‘column_name’].max()
计算某列中非空值的数量
df[‘column_name’].count()
计算列中某个值的出现次数
df[‘column_name’].value_counts()
以csv格式导出, 不带行索引导出
df.to_csv(‘filename.csv’, index=False)
以Excel格式导出, 不带行索引导出
data.to_excel(‘filename.xlsx’, index=False)
导出Json格式
data.to_json(‘filename.json’, orient=‘records’)
以SQL格式导出
data.to_sql(‘table_name’, con=engine, if_exists=‘replace’, index=False)
从数据库导入数据
import sqlite3
conn = sqlite3.connect(‘database.db’)
query = ‘SELECT * FROM table_name’
df_db = pd.read_sql(query, conn)
将数据保存到数据库
import sqlite3
conn = sqlite3.connect(‘database.db’)
df.to_sql(‘table_name’, conn, if_exists=‘replace’, index=False)
数据清洗(去除空白字符)
df[‘column_name’] = df[‘column_name’].str.strip()
缺失值处理(删除包含缺失值的行)
df.dropna(inplace=True)
重复值处理(删除重复行)
df.drop_duplicates(inplace=True)
按列进行分组并计算平均值
grouped_df = df.groupby(‘column_name’).mean()
多列分组并计算总和
grouped_df = df.groupby([‘column1’, ‘column2’]).sum()
数据排序
sorted_data = df.sort_values(by=‘Age’, ascending=False)
添加新列
df[‘Gender’] = [‘Male’, ‘Female’, ‘Male’, ‘Female’, ‘Male’]
创建一个包含时间序列数据的DataFrame
data = pd.DataFrame({‘Date’: pd.date_range(start=‘2020-01-01’, periods=10),
‘Sales’: [100, 200, 150, 250, 180, 120, 300, 350, 400, 250]})
将日期列设置为索引
data.set_index(‘Date’, inplace=True)
计算每周销售总额
weekly_sales = data.resample(‘W’).sum()
打印每周销售总额
print(weekly_sales)
创建一个包含销售数据的DataFrame
data = pd.DataFrame({‘Year’: [‘2019’, ‘2019’, ‘2020’, ‘2020’],
‘Quarter’: [‘Q1’, ‘Q2’, ‘Q1’, ‘Q2’],
‘Product’: [‘A’, ‘B’, ‘A’, ‘B’],
‘Sales’: [100, 200, 150, 250]})
创建透视表
pivot_table = data.pivot_table(index=‘Year’, columns=‘Quarter’, values=‘Sales’, aggfunc=‘sum’)
打印透视表
print(pivot_table)
data = [[1,‘Bob’, 24, ‘American’, ‘high-school’],[2, ‘Nancy’, 23, ‘Australia’, ‘college’],[3, ‘Lili’, 22, ‘China’, ‘college’],[4, ‘Leo’, 27, ‘M78’, ‘university’],[5, ‘David’, 24, ‘moon’, ‘high-school’]]
df = pd.DataFrame(data, columns=[‘serial’, ‘name’, ‘age’, ‘from’, ‘grade’], index=[‘a’,‘b’,‘c’,‘d’,‘e’])
聚合,按grade分组,并计算分组后的平均年龄
xdf = df.groupby(‘grade’)[‘age’].mean()
删除一些列,让数据更简单些,再去做后面的操作
data = data.drop([“ma5”,“ma10”,“ma20”,“v_ma5”,“v_ma10”,“v_ma20”], axis=1)
推荐使用loc和iloc来获取的方式
data.loc[data.index[0:4], [‘open’, ‘close’, ‘high’, ‘low’]]
data.iloc[0:4, data.columns.get_indexer([‘open’, ‘close’, ‘high’, ‘low’])]
直接修改原来的值
data[‘close’] = 1 # 这一列都变成1
或者
data.close = 1
按照开盘价大小进行排序 , 使用ascending指定按照大小排序
data.sort_values(by=“open”, ascending=True).head()
按照多个键进行排序
data.sort_values(by=[‘open’, ‘high’])
data.query(“open<24 & open>23”).head()
可以指定值进行一个判断,从而进行筛选操作
data[data[“open”].isin([23.53, 23.85])]
stock_rise = data[‘p_change’]
stock_rise.cumsum()
axis=0:默认是列,axis=1为行进行运算
data[[‘open’, ‘close’]].apply(lambda x: x.max() - x.min(), axis=0)
data = pd.read_csv(“./data/stock_day.csv”, usecols=[‘open’, ‘close’])
json_read = pd.read_json(“./data/Sarcasm_Headlines_Dataset.json”, orient=“records”, lines=True)
json_read.to_json(“./data/test.json”, orient=‘records’)
qcut = pd.qcut(p_change, 10)
计算分到每个组数据个数
qcut.value_counts()
自己指定分组区间
bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)
p_counts.value_counts()
得出one-hot编码矩阵
dummies = pd.get_dummies(p_counts, prefix=“rise”)
按照行索引进行
pd.concat([data, dummies], axis=1)
默认内连接
result = pd.merge(left, right, on=[‘key1’, ‘key2’])
pro.plot(kind=‘bar’, stacked=True)
plt.show()
按color分组,再取出price1列求平均值
col.groupby([‘color’])[‘price1’].mean()
和上述一个功能
col[‘price1’].groupby(col[‘color’]).mean()
分组,数据的结构不变
col.groupby([‘color’], as_index=False)[‘price1’].mean()
按照国家分组,求出每个国家的星巴克零售店数量
count = starbucks.groupby([‘Country’]).count()
count[‘Brand’].plot(kind=‘bar’, figsize=(20, 8))
plt.show()
进行字符串分割
temp_list = [i.split(“,”) for i in df[“Genre”]]
获取电影的分类
genre_list = np.unique([i for j in temp_list for i in j])
增加新的列,创建全为0的dataframe
temp_df = pd.DataFrame(np.zeros([df.shape[0],genre_list.shape[0]]),columns=genre_list)
###学习进度 20(32/352)
python数据分析与挖掘实战
from pylab import mpl
mpl.rcParams[‘axes.unicode_minus’]=False
#显示中文
mpl.rcParams[‘font.sans-serif’]=[‘SimHei’]
pivot_table.plot(kind=‘line’, figsize=(10, 6), title=‘产品类别销售额趋势’)
#删除同名列,保留前面一项
df=df.loc[:,~df.columns.duplicated()]
df