數據分析編程第二步: 最簡單的數據分析嘗試

2.1 數據介紹

有某公司的銷售數據表 sales.csv 如下:

第一行標題,解釋每一列存了什么東西。第二行開始每一行是一條數據,對應一個訂單。

這種數據有個專業的術語,叫結構化數據。這是現代數據處理中最常見的數據類型。

整個表格的數據統稱為一個數據表,其中的每一行(除了標題)稱為一條記錄,列稱為字段,標題中的字符串稱為字段名。上面這個表中能看見的部分有 12 條記錄,對應著這個 Excel 的第 2 到第 13 行;有 8 個字段,字段名分別是 orderDate, sales, customer, product, quantity, price, discount, paymentDate。字段名互不相同,可以唯一地標識某個列。這些字段(包括名稱和次序),稱為數據表的數據結構,簡稱結構

結構化數據也就是有數據結構的數據。

表格中 A2:H13 部分就是數據表里的數據了。我們會說某條記錄的某個字段的取值是什么。比如這里第 2 條記錄的 sales 字段取值為 Hef,第 8 條記錄的 quantity 字段取值為 8。數據表中每條記錄的每個字段都會有一個取值。

注意,數據表中只有字段有名稱,記錄沒有名稱。我們后面會講用什么辦法來標識和區分記錄。

可以有各種各樣的數據表,不同數據表的數據結構當然可以不同。一個數據表一定要有一套數據結構,而且也只能有一套。有時我們也會說到記錄的結構,意思就是指記錄所在的數據表的結構。

因為結構化數據經常會以這種行列式表格的形式呈現,我們也會直觀地把記錄和字段稱為,這是數據庫界的通行術語,并不是我們發明的通俗說法。甚至,有時候數據表呈現出來時已經沒有明顯的行和列了(馬上要講到這樣的例子),但人們仍然會用行和列這些術語來表示記錄和字段。

本文檔用到的 sales.csv 文件中列名的含義如下:

列名含義
orderID訂單 ID,取值為自然數列,和記錄序號一致
orderDate下單日期
sales銷售
customer客戶
product產品
quantity訂單數量
price訂單價格
discount訂單折扣
paymentDate付款日期
feedBack客戶反饋

2.2 選出去年的所有銷售記錄

第一步:讀取 sales.csv 文件中的數據

A
1=file("sales.csv").import@tc()

A1 函數file("sales.csv")表示從主目錄中找到 sales.csv 這個文件,并產生文件對象,這里參數是個字符串,要加雙引號。import@tc()表示讀入文件對象 file(“sales.csv”) 中的數據,這里@t是函數 import 的選項,表示文件的第一行是標題行,如果沒有這個選項,會把第一行當成數據讀入。@c表示文件中數據的列間分隔符是英文逗號,如果沒有這個選項,會默認當成 tab 分隔符。當兩個選項 @t 和 @c 同時寫時,可以省略一個 @, 寫成@tc

在界面中可以看到 A1 的值:

從圖中可以看出 A1 的值是一個二維表。前面介紹過,sales.csv 文件中存儲的是結構化數據,SPL 中用于裝載結構化數據的對象稱為序表,從名稱上可以理解為有次序的二維表。上圖中 A1 的值就是一個序表,從圖上看,序表比原始的結構化數據多了一個 Index,這就是序表的記錄次序,也稱為記錄序號,可以通過序號來訪問序表中的某一條記錄,比如 =A1(3),將返回 A1 中的第三條記錄:

第二步:從 A1 中選出 2024 年下單的數據:

A
1=file(“sales.csv”).import@tc()
2=A1.select(year(orderDate)==2024)

A2 select 函數表示過濾,這里的過濾條件year(orderDate)==2024表示選出 orderDate 的年份等于 2024 的數據。在 SPL 中相等比較用==,而=表示賦值。year函數表示獲得日期參數的年份。

界面上可以再看一下 A2 的值:

從界面上看,A2 是 2024 年的銷售記錄,表面上看和 A1 的序表似乎長得差不多,但它不是序表,它只是從 A1 序表中取出的部分記錄組成的一個有序集合,在 SPL 中有個專門的名稱叫排列

2.3 計算去年的總銷售額、單筆最大訂單額、訂單個數

第一步:讀取 sales.csv 文件中的數據

A
1=file(“sales.csv”).import@tc(orderDate,quantity,price,discount)

A1 由于本例中只用到了orderDate,quantity,price,discount這幾個字段,所以可以在 import 函數參數中指定這幾個字段,這樣讀數時只讀這幾個字段,可以提高讀數效率,減少內存占用。

第二步:過濾出 2024 年的數據,并算出訂單金額,以計算列的形式添加到原排列中

A
1=file(“sales.csv”).import@tc(orderDate,quantity,price,discount)
2=A1.select(year(orderDate)==2024).derive(quantity*price*discount:amount)

A2 derive 函數表示添加計算列,其中quantity*price*discount是計算表達式,amount是新產生的計算列的列名,表達式和列名之間用冒號分隔。特別強調的是表達式在前面,列名在后面。

第三步:聚合運算

A
1=file(“sales.csv”).import@tc(orderDate,quantity,price,discount)
2=A1.select(year(orderDate)==2024).derive(quantitypricediscount:amount)
3=A2.sum(amount)
4=A2.max(amount)
5=A2.count()

A3 對 A2 中的 amount 字段求和。

A4 對 A2 中的 amount 字段求最大值。

A5 對 A2 計數,算出 A2 的記錄數。

2.4 選出金額最大的三個訂單

A
1=file(“sales.csv”).import@tc()
2=A1.select(year(orderDate)==2024).derive(quantitypricediscount:amount)
3=A2.sort(-amount)
4=A3.to(3)

A3 sort 函數是排序,缺省是從小到大排,想從大到小排,相當于其相反數從小到大排,所以這里加了個負號,寫成-amount

A4 A3.to(3)表示選出 A3 中的前三條記錄。熟練之后可以把 A3 和 A4 寫到一起:A2.sort(-amount).to(3)

A4 的結果為:

可以看出,這種算法雖然簡單,但是沒有解決排名并列的問題,對于可能存在并列的數據,SPL 還有個 top 函數可以處理:

A
1=file(“sales.csv”).import@tc()
2=A1.select(year(orderDate)==2024).derive(quantitypricediscount:amount)
3=A2.top@r(3;-amount)

A3 A2.top@r(3;-amount)表示將A2排序后取前 3 條記錄。缺省排序規則和sort函數一致,但是top函數有個@r選項可以解決并列的情況。特別需要強調的是,3-amount之間是分號分隔,這時候返回的是排名前三的記錄。如果寫成逗號分隔,則返回排名前三的amount字段值。和 Excel 及其它程序語言不同,SPL 的參數分隔符不只是逗號,還可能有分號和冒號(在前面 derive 函數中就出現過冒號,用來分隔計算式和字段名)。

A3 的結果為:

top 函數解決了排名并列的問題。

2.5 第一筆付款的訂單、最后一筆付款的訂單

A
1=file(“sales.csv”).import@tc()
2=A1.select(year(orderDate)==2024)
3=A2.minp(paymentDate)
4=A2.maxp(paymentDate)

A3 A2.minp(ParmentDate)表示從排列 A2 中選出paymentDate的值最小的記錄,這里用于選出第一筆付款的訂單,它有點相當于 top(1,…)。由于本例中日期數據只精確到日,同一天可能存在多單付款,如果要把同一天付款的所有訂單都選出,可以給 minp 函數加上@a選項,如:A2.minp@a(paymentDate)

A4 選出最后一筆付款的訂單,maxp 函數規則和 minp 一致,這里不再贅述。

2.6 統計 2025 年 5 月 1 日以后下單的客戶數和付款的客戶數(去重)

AB
1=file(“sales.csv”).import@tc()2025-05-01
2=A1.select(orderDate>B1)
3=A2.icount(customer)
4=A2.select(paymentDate).icount(customer)

A3 A2.icount(customer)表示對A2逐行獲得customer的值,并對結果進行去重計數。

A4 A2.select(paymentDate)表示選出paymentDate不為空的記錄,即已付款記錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94172.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UDP報文的數據結構

主要內容參照https://doc.embedfire.com/net/lwip/zh/latest/doc/chapter14/chapter14.html#id6,整理出來自用。 1. UDP 報文首部結構體(udp_hdr) 為清晰定義 UDP 報文首部的各個字段,LwIP 設計了udp_hdr結構體,其包含…

圖論與最短路學習筆記

圖論與最短路在數學建模中的應用 一、圖論模型圖 G(V,E)G(V,E)G(V,E) VVV:頂點集合EEE:邊集合每條邊 (u,v)(u,v)(u,v) 賦予權值 w(u,v)w(u,v)w(u,v),可用 鄰接矩陣 或 鄰接表 表示。二、最短路問題的數學形式 目標:尋找從源點 sss…

第九節 Spring 基于構造函數的依賴注入

當容器調用帶有一組參數的類構造函數時,基于構造函數的 DI 就完成了,其中每個參數代表一個對其他類的依賴。接下來,我們將通過示例來理解 Spring 基于構造函數的依賴注入。示例:下面的例子顯示了一個類 TextEditor,只能…

【數據庫】PostgreSQL詳解:企業級關系型數據庫

文章目錄什么是PostgreSQL?核心特性1. 標準兼容性2. 擴展性3. 高級功能4. 可靠性數據類型1. 基本數據類型2. 高級數據類型基本操作1. 數據庫操作2. 表操作3. 數據操作高級查詢1. 連接查詢2. 子查詢3. 窗口函數JSON操作1. JSON數據類型2. JSON查詢3. JSON索引全文搜索…

FFMPEG相關解密,打水印,合并,推流,

1:ffmepg進行打水印解密 前提ffmepg安裝利用靜態版就可以這個什么都有,不用再配置其他信息:(這個利用ffmpeg終端命令是沒問題的,但是如果要是再C中調用ffmpeg庫那么還需要從新編譯安裝下) 各個版本 Inde…

MySql知識梳理之DML語句

注意: 插入數據時,指定的字段順序需要與值的順序是一一對應的。 字符串和日期型數據應該包含在引號中。 插入的數據大小,應該在字段的規定范圍內注意:修改語句的條件可以有,也可以沒有,如果沒有條件,則會修改整張表的所…

GaussDB GaussDB 數據庫架構師修煉(十八)SQL引擎-SQL執行流程

1 SQL執行流程查詢解析:詞法分析、語法分析、 語義分析 查詢重寫:視圖和規則展開、基于規則的查詢優化 計劃生成:路徑搜索和枚舉、選出最優執行計劃 查詢執行:基于優化器生成的物理執行計劃對數據進行獲取和計算2 解析器和優化器S…

grpc 1.45.2 在ubuntu中的編譯

要在 Ubuntu 上編譯 gRPC 1.45.2,需要按照以下步驟操作。以下指南基于 gRPC 官方文檔和相關資源,確保環境配置正確并成功編譯。請確保你有管理員權限(sudo)以安裝依賴項和執行相關命令。 1. 準備環境 確保你的 Ubuntu 系統已安裝…

lesson45:Linux基礎入門指南:從內核到實踐操作全解析

目錄 一、Linux簡介與核心概念 1.1 Linux的起源與發展 1.2 內核與發行版的關系 二、Linux內核版本解析 2.1 內核版本命名規則 2.2 2025年主流內核版本 三、主流Linux發行版對比 3.1 桌面用戶首選 Ubuntu 24.04 LTS Linux Mint 22 3.2 技術愛好者之選 Fedora 41 Ar…

PCL點云庫入門(第24講)——PCL庫點云特征之NARF特征描述 Normal Aligned Radial Feature(NARF)

一、算法原理 1、NARF 特征概述 NARF(Normal Aligned Radial Feature)是 2011 年由 Bastian Steder 等人在論文 《Point Feature Extraction on 3D Range Scans Taking into Account Object Boundaries》中提出的一種 稀疏局部 3D 特征描述子。 核心目標是提取具有“邊界意…

使用 eventpp 構建跨 RT-Thread 與 ARM-Linux 的輕量級 Active Object(AO)事件驅動框架

0. 引言 本文展示一個實踐路徑:以輕量級 C 事件庫 eventpp 為核心,設計并實現一個面向嵌入式的、可移植的 Active Object(AO)事件驅動架構。該架構滿足以下目標: 跨平臺兼容:單套代碼在 RT-Thread&#xff…

【python實用小腳本-193】Python全能PDF小助手:剪切/合并/旋轉/加密一條龍——再也不用開會員

Python全能PDF小助手:剪切/合并/旋轉/加密一條龍——再也不用開會員 PDF編輯, 本地處理, 零會員費, 多功能腳本, 瑞士軍刀 故事開場:一把瑞士軍刀救了周五下班的你 周五 17:55,老板甩來一堆 PDF: “把第 3、7 頁刪掉”“再和合同合…

Ubuntu根分區擴容

目錄 1.先查看/dev/sda 整塊磁盤設備的分區占用情況: 2.在VMware中編輯虛擬機: 3.進入虛擬機,進入disk應用程序: 4.擴容文件系統 5.最后通過df-h lsblk或通過可視化GParted進行驗證。 1.先查看/dev/sda 整塊磁盤設備的分區占…

智慧城市SaaS平臺/市政設施運行監測系統之空氣質量監測系統、VOC氣體監測系統、污水水質監測系統及環衛車輛定位調度系統架構內容

1. 空氣質量監測系統1) 監測點管理 a) 監測點基本信息 支持記錄空氣質量監測點的名稱、位置、類型、設備配置等信息。 b) 監測點分布地圖 支持通過GIS地圖展示監測點的分布情況,支持地圖查詢和導航。 2) 空氣質量監測 a) 實時數據采集 支持實時采集空氣質量數據&…

PiscCode迅速集成YOLO-Pose 實現姿態關鍵點軌跡跟蹤應用

在計算機視覺領域,人體姿態檢測與軌跡跟蹤是很多應用場景的核心技術,例如運動分析、行為識別、智能監控等。本文將介紹如何在 PiscCode 平臺上,利用 YOLO-Pose 模型進行姿態估計,并實現多人關鍵點軌跡跟蹤。 一、什么是 PiscCode …

HTTP的狀態碼有哪些,并用例子說明一下

問題HTTP的狀態碼有哪些,并用例子說明一下我的回答HTTP狀態碼是服務器對客戶端請求的響應碼,它們按照不同的功能被分為五大類。我來介紹一下主要的狀態碼及其實際應用場景:1xx(信息性狀態碼):表示請求已接收…

【51單片機】【protues仿真】基于51單片機寵物投食器系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示當前時間 2、按鍵設置時間,5個定時投喂時間? 3、可以通過手動按鍵進行投喂食物 4、步進電機模擬投喂食物 二、使用步驟 基于51單片機的寵物自動投…

掌握設計模式--命令模式

命令模式(Command Pattern) 命令模式(Command Pattern)是一種行為型設計模式,它將請求(命令)封裝成對象,從而使您能夠參數化客戶端(調用者)使用不同的請求、…

STM32之beep、多文件、延遲、按鍵以及呼吸燈

一、Beep控制 原理圖分析: 蜂鳴器三極管控制引腳對應 MCU PB8。當前蜂鳴器對應的電路中,三極管是 NPN 三極管,當前【基極】存在小電流,當前三極管導通。要求對應 PB8 引腳對外輸出電壓 / 電流。當前 PB8 輸出高電平,當…

C++的struct里面可以放函數,討論一下C++和C關于struct的使用區別

我們來看一個C代碼下面的struct結構體: struct UserValue {float lx;float ly;float rx;float ry;float L2;// 【構造函數】UserValue() {setZero();}// 【成員函數】void setZero() {lx 0;ly 0;rx 0;ry 0;L2 0;} };在這篇文章中,我們將來詳細解釋一下為什么 U…