你好。 关于Python数据分析的工具我已经谈了很多,我想一直关注的读者对Pandas、NumPy、Matplotlib的各种操作一定都不了解。 今天我们将学习如何使用简单的数据用Python进行数据分析。 本文主要涉及以下三个部分。
Pandas数据处理
映射图
使用pyinstaller将py文件打包为exe
虽然本文所用的数据(医学)不会出现在平时的工作学习中,但数据导入、缺失值处理、数据重载、计算、汇总、可视化、导出等处理过程至关重要,是将程序打包后的重复性工作
数据和要求说明
今天分享的案例来源于著名的实验Cell Counting Kit-8。 首先看看原始数据:
我们需要完成的工作主要有四项:
从各组的所有重复中移除最大值和最小值
所有数据都将根据D0的相应组进行标准化
计算各组数据的平均值和标准差的表:平均值汇总表和平均值-标准差汇总表
绘制折线图
因此,在您的桌面上创建一个名为data的文件夹,放入原始数据data.xlsx,然后运行程序,文件夹中应该会添加三个文件。
这三个文件是我们需要的结果
平均值摘要
平均-标准差摘要
折线图
那么,让我来说明如何实现。
代码实现
首先导入库,然后调用函数获取桌面文件夹路径并全局写入
importpandasaspd
importmatplotlib.pyplotasplt
输入
导入随机
defGetDesktopPath () :
return OS.path.join (OS.path.expand user (),(Desktop ) ) ) )。
path=GetDesktopPath (()/data/) )。
读取原始数据并删除缺少的值
dat=PD.read _ excel (path ' data.xlsx ),
sheet_name=0,
头儿=none,
index_col=0)
dat=dat.dropna(how='any ',axis=0) ) ) )。
获取重复次数、组数、天数。 原始数据有6天、5组、5次重复。 可以直接使用这三个数据,但在今后的实验中这三个可能会更改。 最好不要写死,以便代码可以复用。
获取#组数
ngroup=dat.index.value_counts ().shape[0]
取得#列数即重复次数
nrep=dat.shape[1]
#获取天数(操作的批处理次数)即总行数除以组数,最后除尽是为了返回int
nd=dat.shape[0]//ngroup
消除极大值和极小值。 这里的解决方案是按行升序排序,删除第一个和最后一个数据,可以由apply lambda处理
df=dat.apply (lambdax : sorted (x ) [1:nrep-1],axis=1) )
df=df.to_frame(name='total ' ) )。
foriinrange(nrep-2 ) :
df[f'{i 1}']=df['total'].str[i]
df.drop(columns=['total'] ',inplace=True ) )。
按匿名函数排序会返回Series的升序列表。 必须将其转换为DataFrame并拆分为三列,最后移除原始列并返回。 因此,有上述代码
在常规列中添加组信息和批次信息,以便于以后创建汇总表
df['group']=df.index
day_lst=[]
foriinrange(nd ) :
day_lst.append(f'day{I} ) )
#用列表导出公式重复列表中的元素,添加新列
df [ ' day ' ]=[ iforinday _ lst for _ in range (n group ) ]
效果如下。
如果根据D0各组的平均值对所有数据进行标准化,则可以简单理解为DO批次的5个组除了2个极值外分别求出平均值,这5个批次的5个组分别排除了D0对应组的平均值)
如果根据#组数检索D0中的所有行数,并对每行求平均值,则会自动忽略文本信息
mean_l
st = df.iloc[0:ngroup, :].mean(axis = 1).tolist()# 由于接下来要按行进行迭代,且索引的分组信息已经有一个新列来表述,这里重置索引方便迭代
df.reset_index(drop=True, inplace=True)
# 迭代的内容看起来复杂实际上不难
# 本质上就是将迭代行的数据和D0对应分组均值相除
forindex, iindf.iterrows():
df.iloc[index, 0:nrep - 2] = i[0:nrep - 2] / mean_lst[index% ngroup]
标准化结束后即可获取均值和标准差
# 同样mean和std均会忽略非数值列
# 谨慎一点用df['mean'] = df.iloc[:, 0:nrep - 2].mean(axis=1)也可以
df['mean'] = df.mean(axis=1)
df['std'] = df.std(axis=1)
# 获取最后四列
results = df.iloc[:, -4:]
制作数据透视表并导出
# 用round保留4位有效数字
tb1 = pd.pivot_table(data=results,
index='group',
columns='day',
values='mean').round(4)
tb2 = pd.pivot_table(data=results,
index='group',
columns='day',
values=['mean','std']).round(4)
tb1.to_excel(path + '/result(mean).xlsx',
index=True,
header=True)
tb2.to_excel(path + '/result(mean+std).xlsx',
index=True,
header=True)
在Jupyter Notebook呈现结果如下,在Excel的呈现如本文开头所示
利用matplotlib画图,补充两个细节,如果在Jupyter Notebook希望出图需要加上如下代码
%matplotlib inline
如果有中文字符需要呈现也同样需要用代码设置
plt.rcParams['font.sans-serif'] = ['SimHei']
汇总表的索引(组名)可以用做图像的标签。而颜色和折线上标记样式所用的测量是根据所需的个数随机无放回抽样
group_lst = tb1.index.tolist()
colors = ['b','g','r','c','m','y']
color_lst = random.sample(colors, ngroup)
markers = ['.',',','o','v','^','',
'1','2','3','4','s','p','*','h','H','+','x','D','d']
marker_lst = random.sample(markers, ngroup)
最后的画图代码:
# 设置画布大小
plt.figure(figsize=(8, 5))
foriinrange(ngroup):
plt.plot(tb1.iloc[i, :].tolist(),
f'{color_lst[i]}{marker_lst[i]}-', lw=2)
plt.xticks(range(0, nd), day_lst, fontsize=18)
plt.ylabel('Relative Cell Amount', fontsize=18)
plt.legend(group_lst, loc='best', fontsize=12)
# 让图像的显示分布正常
plt.tight_layout()
# 保存一定要在调用展示之前
plt.savefig(path + "/折线图.png")
plt.show()
exe打包
首先在命令行使用pip安装pyinstaller
pip install pyinstaller
将完整代码保存成py文件,这里我保存为cck8.py,然后放在桌面上data文件夹内,然后打开命令行,cd进入该文件夹,然后调用第二行命令即可以编译成exe
cd C:UserschenxDesktopdata
pyinstaller --onefile --clean cck8.py
当然第二行的命令可以自定义如添加图标等等,这里不做介绍,有兴趣的可以自己探索。
【编辑推荐】
【责任编辑:未丽燕 TEL:(010)68476606】
点赞 0