1. 程式人生 > >第十四章 pandas官方文件0.22中文教程---Tutorials(lessons 3 ),個人渣翻譯

第十四章 pandas官方文件0.22中文教程---Tutorials(lessons 3 ),個人渣翻譯

這裡寫圖片描述

Lesson 3 建立函式,從EXCEL讀取,匯出到EXCEL - 異常值 - Lambda函式-切片和切塊資料。
import pandas as pd
import numpy.random as np
import matplotlib.pyplot as plt

我們將建立自己的測試資料進行分析

# set seed
np.seed(111)

# Function to generate test data
def CreateDataSet(Number=1):

    Output = []

    for i in range(Number):

        # Create a weekly (mondays) date range
rng = pd.date_range(start='1/1/2009', end='12/31/2012', freq='W-MON') # Create random data data = np.randint(low=25,high=1000,size=len(rng)) # Status pool status = [1,2,3] # Make a random list of statuses random_status = [status[np.randint(low=0,high=len(status))] for
i in range(len(rng))] # State pool states = ['GA','FL','fl','NY','NJ','TX'] # Make a random list of states random_states = [states[np.randint(low=0,high=len(states))] for i in range(len(rng))] Output.extend(zip(random_states, random_status, data, rng)) return
Output

現在我們有了生成測試資料的函式,我們可以建立一些資料並將其插入到dataframe中。

dataset = CreateDataSet(4)
df = pd.DataFrame(data=dataset, columns=['State','Status','CustomerCount','StatusDate'])
df.info()

這裡寫圖片描述
我們現在將這個dataframe儲存到一個Excel檔案中,然後將它返回到dataframe。我們這樣做只是為了向您展示如何讀寫Excel檔案。
我們不會將dataframe的索引值寫入Excel檔案,因為它們不是我們初始測試資料集的一部分。

# Save results to excel
df.to_excel('Lesson3.xlsx', index=False)
print('Done')

我們將使用read_excel函式從Excel檔案中讀取資料。該函式允許您按名稱或位置讀取特定的選項卡。

# Parse a specific sheet
df = pd.read_excel('Lesson3.xlsx', 0, index_col='StatusDate')
df.dtypes

這裡寫圖片描述

df.index

這裡寫圖片描述

df.head()

這裡寫圖片描述
本節試圖清理資料以進行分析
①確保state列都是大寫的。
②只選擇帳戶狀態為“1”的記錄
③將(NJ和NY)合併到state列中的NY。
④刪除任何異常值(資料集中的任何奇怪結果)
讓我們快速看一下一些狀態值是大寫的,有些是小寫的。

df['State'].unique()

這裡寫圖片描述
要將所有狀態值轉換為大寫,我們將使用upper()函式和dataframe的apply屬性。lambda函式簡單地將上部函式應用於狀態列中的每個值。

# Clean State Column, convert to upper case
df['State'] = df.State.apply(lambda x: x.upper())
df['State'].unique()

這裡寫圖片描述

# Only grab where Status == 1
mask = df['Status'] == 1
df = df[mask]

簡單得把NJ變成NY…
[df.State == ‘NJ’] –在狀態列中找到它們等於NJ的所有記錄
df.State[df.State == ‘NJ’] = ‘NY’ –在狀態列中它們等於NJ的所有記錄中,將它們替換為NY

# Convert NJ to NY
mask = df.State == 'NJ'
df['State'][mask] = 'NY'

現在我們可以看到我們有一個更乾淨的資料集

df['State'].unique()

這裡寫圖片描述
在這一點上,我們可能想要繪製資料以檢查資料中的異常值或不一致。我們將使用dataframe的plot()屬性。
正如你從下圖所看到的,它不是非常確定的,可能是我們需要執行更多的資料準備的標誌。

df['CustomerCount'].plot(figsize=(15,5));

這裡寫圖片描述
如果我們看一下資料,我們就會開始意識到同一個狀態、狀態和狀態組合有多個值。這可能意味著您正在處理的資料是髒的/壞的/不準確的,但是我們將不這麼認為。我們可以假設這個資料集是更大資料集的子集,如果我們只是將CustomerCount列中的值新增到每個狀態、StatusDate和Status中,我們將得到每天的客戶總數。

sortdf = df[df['State']=='NY'].sort_index(axis=0)
sortdf.head(10)

這裡寫圖片描述
現在我們的任務是建立一個新的dataframe,以壓縮資料,這樣我們就有了每個狀態和StatusDate的每日客戶計數。我們可以忽略狀態列,因為這個列中的所有值都是值1。為此,我們將使用dataframe的函式groupby和sum()。
注意,我們必須使用reset_index。如果我們不這樣做,我們就不能同時使用狀態和狀態,因為groupby函式只期望列作為輸入。reset_index函式將索引StatusDate返回到dataframe中的列。

# Group by State and StatusDate
Daily = df.reset_index().groupby(['State','StatusDate']).sum()
Daily.head()

這裡寫圖片描述
(我不知道為什麼要必須使用reset_index,不用它結果也一樣)
這裡寫圖片描述
state和StatusDate列將自動被放置在每日dataframe的索引中。您可以將索引看作是資料庫表的主鍵,但不考慮具有惟一值的約束。您將看到的索引中的列允許我們輕鬆地選擇、繪製和執行資料的計算。
下面我們刪除狀態列,因為它都等於1,不再需要。

del Daily['Status']
Daily.head()

這裡寫圖片描述

# What is the index of the dataframe
Daily.index

這裡寫圖片描述

# Select the State index
Daily.index.levels[0]

這裡寫圖片描述

# Select the StatusDate index
Daily.index.levels[1]

這裡寫圖片描述
現在讓我們繪製每個狀態的資料。
通過打破狀態列的圖表你可以看到,我們對資料的樣子有了更清晰的瞭解。你能發現任何異常值嗎?

Daily.loc['FL'].plot()
Daily.loc['GA'].plot()
Daily.loc['NY'].plot()
Daily.loc['TX'].plot()

(多重索引畫圖還是用了.loc定位)
這裡寫圖片描述
我們還可以在特定的日期(比如2012年)繪製資料。我們現在可以清楚地看到,這些州的資料到處都是。由於資料由每週客戶陣列成,因此資料的可變性似乎是可疑的。在本教程中,我們將假設糟糕的資料並繼續進行。

Daily.loc['FL']['2012':].plot()
Daily.loc['GA']['2012':].plot()
Daily.loc['NY']['2012':].plot()
Daily.loc['TX']['2012':].plot();

這裡寫圖片描述
我們假設每個月客戶數量應該保持相對穩定。在那個月的特定範圍之外的任何資料都將從資料集中刪除。最終的結果應該是沒有峰值的平滑的圖形。
StateYearMonth–這裡我們按state、年和月的statusdate分組
Daily[‘Outlier’]–一個布林值(True或False)值,讓我們知道CustomerCount列中的值是否超出可接受範圍。
我們將使用屬性transform而不是apply。其原因是,transform將保持dataframe的形狀(行號和列)不變,而apply不會。通過檢視前面的圖,我們可以發現它們不像高斯分佈,這意味著我們不能使用像平均值和stDev這樣的彙總統計資訊。我們用百分位數。注意,我們有消除良好資料的風險。

# Calculate Outliers
StateYearMonth = Daily.groupby([Daily.index.get_level_values(0), Daily.index.get_level_values(1).year, Daily.index.get_level_values(1).month])
Daily['Lower'] = StateYearMonth['CustomerCount'].transform( lambda x: x.quantile(q=.25) - (1.5*x.quantile(q=.75)-x.quantile(q=.25)) )
Daily['Upper'] = StateYearMonth['CustomerCount'].transform( lambda x: x.quantile(q=.75) + (1.5*x.quantile(q=.75)-x.quantile(q=.25)) )
Daily['Outlier'] = (Daily['CustomerCount'] < Daily['Lower']) | (Daily['CustomerCount'] > Daily['Upper']) 

# Remove Outliers
Daily = Daily[Daily['Outlier'] == False]

dataframe名為Daily,它將儲存每日彙總的客戶數。原始資料(df)每天有多個記錄。我們剩下的資料集是由狀態和狀態資料進行索引的。Outlier列應該等於False,表示記錄不是異常值。

Daily.head()

這裡寫圖片描述
我們建立了一個單獨的dataframe,它以StatusDate的形式將每天的dataframe命名為ALL。本質上,我們去掉了狀態列。Max列表示每個月的最大客戶數。最大列用來平滑圖形。

# Combine all markets

# Get the max customer count by Date
ALL = pd.DataFrame(Daily['CustomerCount'].groupby(Daily.index.get_level_values(1)).sum())
ALL.columns = ['CustomerCount'] # rename column

# Group by Year and Month
YearMonth = ALL.groupby([lambda x: x.year, lambda x: x.month])

# What is the max customer count per Year and Month
ALL['Max'] = YearMonth['CustomerCount'].transform(lambda x: x.max())
ALL.head()

這裡寫圖片描述
正如您從上面的所有dataframe中看到的,在2009年1月,客戶的最大數量是901。如果我們使用了apply,那麼我們就會得到一個dataframe(年份和月份)作為索引,並且只使用值為901的Max列。

此外,衡量目前的客戶數量是否達到了公司設定的目標也有好處。這裡的任務是直觀地顯示當前的客戶數量是否達到了下面列出的目標。我們將把目標稱為BHAG(龐大的年度目標)。
12/31/2011 - 1,000 customers
12/31/2012 - 2,000 customers
12/31/2013 - 3,000 customers
我們將使用date_range函式來建立日期
通過選擇一個或一年的頻率,我們將能夠從上面得到三個目標日期

# Create the BHAG dataframe
data = [1000,2000,3000]
idx = pd.date_range(start='12/31/2011', end='12/31/2013', freq='A')
BHAG = pd.DataFrame(data, index=idx, columns=['BHAG'])
BHAG

這裡寫圖片描述
將dataframes與我們在上一課中所學到的結合起來,使用concat函式進行簡單操作。記住,當我們選擇軸= 0時,我們會追加行。

# Combine the BHAG and the ALL data set 
combined = pd.concat([ALL,BHAG], axis=0)
combined = combined.sort_index(axis=0)
combined.tail()

這裡寫圖片描述

fig, axes = plt.subplots(figsize=(12, 7))

combined['BHAG'].fillna(method='pad').plot(color='green', label='BHAG')
combined['Max'].plot(color='blue', label='All Markets')
plt.legend(loc='best');

這裡寫圖片描述
還需要預測明年的客戶數量,我們可以在幾個簡單的步驟中做到這一點。我們將首先將合併的dataframe按年分組,並將該年的最大客戶數放在一起。這將使我們每年有一行。

# Group by Year and then get the max value per year
Year = combined.groupby(lambda x: x.year).max()
Year

這裡寫圖片描述

# Add a column representing the percent change per year
Year['YR_PCT_Change'] = Year['Max'].pct_change(periods=1)
Year

為了獲得明年的最終客戶數量,我們將假定我們目前的增長率保持不變。然後,我們將增加這幾年的客戶數量,這將是我們明年的預測。
建立每個狀態的單個圖

# First Graph
ALL['Max'].plot(figsize=(10, 5));plt.title('ALL Markets')

# Last four Graphs
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(20, 10))
fig.subplots_adjust(hspace=1.0) ## Create space between plots

Daily.loc['FL']['CustomerCount']['2012':].fillna(method='pad').plot(ax=axes[0,0])
Daily.loc['GA']['CustomerCount']['2012':].fillna(method='pad').plot(ax=axes[0,1]) 
Daily.loc['TX']['CustomerCount']['2012':].fillna(method='pad').plot(ax=axes[1,0]) 
Daily.loc['NY']['CustomerCount']['2012':].fillna(method='pad').plot(ax=axes[1,1]) 

# Add titles
axes[0,0].set_title('Florida')
axes[0,1].set_title('Georgia')
axes[1,0].set_title('Texas')
axes[1,1].set_title('North East');

這裡寫圖片描述

相關推薦

pandas官方0.22中文教程---Tutorialslessons 3 個人翻譯

Lesson 3 建立函式,從EXCEL讀取,匯出到EXCEL - 異常值 - Lambda函式-切片和切塊資料。 import pandas as pd import numpy.random as np import matplotlib.p

pandas官方0.22中文教程---Tutorialslessons 4 lessons 5個人翻譯

Lesson 4 –新增/刪除列-索引操作 在這節課中我們將回到基礎。我們將使用一個小的資料集,這樣您就可以很容易地理解我要解釋的內容。我們將新增列、刪除列,並以許多不同的方式分割資料。享受吧

網絡共享服務之samba

windows 計算機 免費軟件 信息服務 全世界 Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。在此之前我們已經了解了NFS和FTP,NFS與samba一樣,也是在網絡中實現文件共享的一種實現,但不幸的是,其不支持windows平臺,而本

使用VS2017開發APP中使用VUE.js開發遇到打包出來的android 在低版本的android4.3中無法正常使用

vue.js 文件 默認 項目 let ons dir file 開發app 使用VS2017開發VUE的APP應用遇到的問題集合 1, 打包出來的apk文件在Android 6.0版本以上手機可以正常打開,在Android 4.3版本手機上無法打開 原因:一開

分鐘掌握pandaspandas官方翻譯

十分鐘掌握pandas 文件版本:0.20.3 這是一個對pandas簡短的介紹,適合新使用者。你可以在Cookbook中檢視更詳細的內容。 通常,我們要像下面一樣匯入一些包。 In [1]: import pandas as pd In [2]: import numpy as np I

Java

class 小寫字母 圓點 對象 文件夾 頂級域名 前綴 部分 不同 第十四章 1、Java中的包(package) 2.1 包,對應到磁盤中的文件夾 2.2 新建一個class,默認保存在缺省包中 2.3

springboot + profile不同環境讀取不同配置

img ont 代碼執行 ring stp uri div () rim 具體做法: 不同環境的配置設置一個配置文件,例如:dev環境下的配置配置在application-dev.properties中;prod環境下的配置配置在application-prod.

沒有銀彈 ---軟工程中的根本和次要問題

測試 未來 接收 增長 ada tail 進行 tro 困難 http://blog.csdn.net/zuochao_2013/article/details/73614151 在未來的十年內,無論是在技術還是管理方法上,都看不出有任何突破性的進步,能夠保證在十年內大幅度

Maven學習()-----Maven 構建配置

dev sources png rod 基於 ret 丟失 tof inter Maven 構建配置文件 什麽是構建配置文件? 生成配置文件是一組可以用來設置或覆蓋 Maven 構建配置值的默認值。使用生成配置文件,你可以針對不同的環境,如:生產V/S開發環境自定義構建。

算法導論讀書筆記--數據結構的擴張

步驟 檢驗 int 由於 旋轉 著色 推出 log 14.3 算法導論第14章 數據結構的擴張 一些工程應用需要的只是標準數據結構, 但也有許多其他的應用需要對現有數據結構進行少許的創新和改造, 但是只在很少情況下需要創造出全新類型的數據結構, 更經常的是通過存儲額外信息的

學習筆記 使用CSS3動畫

進行 delay 簡單的 angle 新版 chrome tor 3.0 :focus 第14章 使用CSS3動畫 【學習重點】 設計2D動畫 設計3D動畫 設計過渡動畫 設計幀動畫 能夠使用CSS3動畫功能設計頁面特效樣式 14.1 設計2D動畫 CSS2D T

JAVA-初步認識--多線程-wait和sleep的區別

分享圖片 thread long img wait方法 object 安全 截圖 也會 一. wait和sleep的方法有些類似,我們現在要對其進行描述,區分它們。 wait方法在object類中,而且有兩種形式,分別是wait()和wait(long timeout),我

JAVA-初步認識--多線程-停止線程方式-定義標記

凍結 als 大小 span clas thread 結果 gpo http 一. 線程既然開啟了,運行了,凍結又恢復運行了,那什麽時候消亡呢? 怎麽來停止線程呢?不能一直在運行。 線程怎麽停,線程自己最清楚。在Thread類中,提供了stop方法, 本來線程持有一個鎖,

JAVA-初步認識--多線程-停止線程方式-interrupt

拋出異常 處理 不下來 停止線程 一個 表現 執行 技術分享 mage 一. 結合上一節繼續講述,不要以為設置了標記線程就能停止,依舊有停不下來的情況。 整個函數就是添加了wait()方法,導致try-catch的加入。 DOS結果顯示,程序沒有停下來,和主線程結束了

課 find命令及名後綴

20180330一、find命令搜索命令1?whereis 命令,格式:whereis -bmsu 文件名稱。(模糊查找)-b 只找binary文件-m 只找在manual路徑下的文件-s 只找source來源文件-u 找沒有說明檔的文件 2?locate 命令 模糊搜索(安裝yum install -y l

進階八顆 Python對的操作

appdata ren 文檔 只讀 路徑和 users python admin 分別是 在Windows中,我們可以很容易地創建、修改和刪除文件。我們熟悉的文件類型也有很多:txt、mkv、mp3、docx... 在Python中,我們依舊可以執行創建、修改和刪除文件的操

NFS搭建與配置

linux14.1 NFS介紹NFS是Network File System的縮寫NFS最早由Sun公司開發,分2,3,4三個版本,2和3由Sun起草開發,4.0開始Netapp公司參與並主導開發,最新為4.1版本NFS數據傳輸基於RPC協議,RPC為Remote Procedure Call的簡寫。NFS

擴展IP訪問控制列表配置

ACL 實驗 CCNA IP訪問控制列表 一、實驗名稱 擴展IP訪問控制列表配置 二、實驗內容 1.新建 Packet Tracer 拓撲圖。2.路由器R1與路由器R2通過 V.35 電纜串口連接,DCE 端連接在 R2 上, 配置其時鐘頻率 64000;主機與路由器通過交叉線連接。3.配置P

java基礎 Servlet聲明周期、Servlet向jsp中提供數據、Servlet跳轉jsp、jsp中書寫java代碼

表達式 hello java代碼 cati 地址 生命周期 tdi getattr cat 一、Servlet聲明周期 1.Servlet的聲明周期一般分為四步:加載、實例化、服務、銷毀。 2.實例化在整個生命周期中只執行一次。 二、jsp 1.Se

Python編程:從入門到實踐——【作業】——記分

wid ont elif pac rom ext splay 添加 能夠 第十四章 14-1 按P開始新遊戲 : 鑒於遊戲《外星人入侵》 使用鍵盤來控制飛船, 最好讓玩家也能夠通過按鍵來開始遊戲。 請添加讓玩家在按P時開始遊戲的代碼。 也許這樣做會有所幫助: 將check_