實戰|Python數據分析可視化並打包

你們好,關於Python數據分析的工具咱們已經講了不少了,相信一直關注的讀者對於Pandas、NumPy、Matplotlib的各類操做必定不陌生,今天咱們就用一份簡單的數據來學習如何使用Python進行數據分析,本文主要涉及下面三個部分:
  • Pandas數據處理app

  • Matplotlib繪圖dom

  • 彩蛋:利用pyinstaller將py文件打包爲exeide



雖然本文使用的數據(醫學相關)不會出如今你平時的工做學習中,可是處理的過程好比導入數據缺失值處理數據去重計算彙總可視化導出等操做倒是重要的,甚至還教你如何將程序打包以後對於重複的工做能夠一鍵完成!所以我十分建議從文末獲取數據邊敲邊思考,畢竟像這樣配有詳細註釋的代碼講解並很少~函數

數據與需求說明

今天分享的案例來源於一個著名的實驗Cell Counting Kit-8。首先咱們來看下原始數據工具

圖片

咱們須要完成的工做主要有四塊:
    1. 去除各組全部重複中的最大值和最小值
    2. 全部數據根據D0的對應分組進行標準化
    3. 計算各組數據的均值和標準差表格:均值彙總表均值-標準差彙總表
    4. 繪製折線圖
因此咱們須要的結果應該是:在本身的桌面上建一個文件夾命名data將原始數據data.xlsx放進去,以後運行完程序後文件夾會新增3個文件:學習

而這三個文件就是咱們須要的結果
ui

均值彙總表url

均值-標準差彙總表spa

折線圖命令行

如今咱們就來說解如何實現。

代碼實現

首先導入庫並調用函數獲取桌面文件夾路徑並寫在全局

import pandas as pd
import matplotlib.pyplot as plt
import os
import random
def GetDesktopPath():
    return os.path.join(os.path.expanduser("~"), 'Desktop')

path = GetDesktopPath() + '/data/'

導入原始數據並去除缺失值

dat = pd.read_excel(path + 'data.xlsx',
                    sheet_name=0,
                    header=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(lambda x: sorted(x)[1:nrep - 1], axis=1)

df = df.to_frame(name='total')
for i in range(nrep - 2):
    df[f'{i + 1}'] = df['total'].str[i]

df.drop(columns=['total'], inplace=True)

用匿名函數排序返回的是Series的升序列表,須有轉換回DataFrame再拆成三列,最後去掉原來返回那一列便可。所以有了如上代碼

在常規列中添加分組信息和批次信息,便於後續作彙總表

df['group'] = df.index

day_lst = []
for i in range(nd):
    day_lst.append(f'Day{i}')
# 用列表推導式作列表內元素重複並添加新列
df['day'] = [i for i in day_lst for _ in range(ngroup)]

效果如圖:

根據D0的各組均值對全部數據標準化,能夠簡單理解爲DO批次5個組去除兩個極值後各求平均值,這5個批次的5個組各自除於D0對應組的均值)

# 根據組數取出D0的全部行數,而後按行求均值,會自動忽略文本信息
mean_lst = df.iloc[0:ngroup, :].mean(axis = 1).tolist()

# 因爲接下來要按行進行迭代,且索引的分組信息已經有一個新列來表述,這裏重置索引方便迭代
df.reset_index(drop=True, inplace=True)

# 迭代的內容看起來複雜實際上不難
# 本質上就是將迭代行的數據和D0對應分組均值相除
for index, i in df.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=(85))

for i in range(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

將上一節的完整代碼(後臺回覆0509獲取)保存成py文件,這裏我保存爲cck8.py,而後放在桌面上data文件夾內,而後打開命令行,cd進入該文件夾,而後調用第二行命令便可以編譯成exe

cd C:\Users\chenx\Desktop\data
pyinstaller --onefile --clean cck8.py

固然第二行的命令能夠自定義如添加圖標等等,這裏不作介紹,有興趣的讀者能夠本身探索。

相關文章
相關標籤/搜索