1. 快捷導航

            Jupyter Notebook將京東商品參數數據表做行列轉換

            2022-5-30 16:44| 發布者: Fuller| 查看: 1546| 評論: 0

            摘要: 本模板對采集結果數據表進行類似于Excel的處理,把采集到的每個商品的多條excel記錄(對應多個參數),清洗成:每個商品一行,每個參數一列。

            1. 關于本notebook

            1.1. 數據分析師可以駕馭的數據處理模板

            Excel是數據分析師的必備工具,眾多功能可以滿足絕大多數的數據清洗、轉換、統計計算、可視化展示。而Jupyter Notebook這類交互式數據探索和分析工具代表了一股不容忽視的潮流,借助于Python編程的強大力量,數據加工的能力和靈活性已經有相當明顯的優勢,尤其是程序代碼和文字描述可以混合編排,數據探索和數據描述做完了,一篇研究報告也基本上成型了。

            然而Python畢竟是一個全功能的編程語言,對于非編程出身的數據分析師來說,Pandas,Numpy,Matplotlib這些詞讓人望而生畏。本系列Notebook將設法解決這個問題,讓非編程出身的數據分析師能夠忽略復雜的編程過程,專注于數據處理和統計分析部分,就像使用Excel的公式一樣駕馭Python。

            所以,我們將嘗試發布一系列Jupyter Notebook,像文檔模板,一些基本的程序環境設置、文件操作等固化下來,在設定的分析場景下不需要改動程序代碼。而數據處理部分的代碼可以根據需要截取選用。每一項功能用一個code cell存代碼,不需要的處理功能可以刪除。

            1.2. 本模板適應的場景

            本模板可以處理GooSeeker網絡爬蟲軟件采集京東商品詳情頁面的參數列表而得到的數據表,采集的原始頁面如下:京東商品參數頁面

            本模板對采集結果數據表進行類似于Excel的處理,把采集到的每個商品的多條excel記錄(對應多個參數),清洗成:每個商品一行,每個參數一列。

            本Notebook按如下規則查找和處理excel數據表及字段:

            1. 采集結果excel表放在data/raw中,當有多個excel文件存在時,處理第1個文件。下圖是本模板自帶的實例數據表:示例采集結果文件

            2. 采集結果表中,需要有這幾個字段:商品名稱,價格,category,參數名,參數值,_fullpath(商品網址,會作為唯一性關鍵詞):示例采集結果文件字段

            3. 清洗處理后的excel表,保存在data/processed下

            1.3. 使用方法

            基本操作順序是:

            1. 使用GooSeeker網絡爬蟲軟件采集京東商品詳情頁面的參數列表(以iphone13和oppo K10 Pro為例),并導出數據表

            2. 將導出的數據表放在本notebook的data/raw文件夾中

            3. 從頭到尾執行本notebook的單元

            注意:每個notebook項目目錄都預先規劃好了,具體參看Jupyter Notebook項目目錄規劃參考。如果要做多個分析項目,把整個模板目錄專門拷貝一份給每個分析項目。

            1.4. 簡要技術說明

            下文注明【編程細節】的文字,如果不太關心可以跳過,這樣的文字往往是詳細解釋程序變量和函數的作用和用法。

            本notebook主要采用Pandas程序庫。用Pandas打開Excel表格,生成一個DataFrame類型的對象,這個對象提供了一系列數據表格探索的函數,類似于關系數據庫的表格結構和數據的操作。

            2. 數據源

            數據源是使用GooSeeker網絡爬蟲軟件采集京東商品詳情頁面的參數列表(以iphone13和oppo K10 Pro為例)。供參考和實驗。

            3. 修改歷史

            2022-05-18:第一版發布

            4. 版權說明

            本notebook是GooSeeker大數據分析團隊開發的,本notebook中的代碼可自由共享使用,包括轉發、復制、修改、用于其他項目中。

            5. 準備程序環境

            導入必要的Python程序包,設定要分析的文件名變量。使用以下變量對應不同的GooSeeker采集結果表:

            file_jd_detail_para:采集導出的京東商品詳細參數表

            file_jd_detail_para_output:清洗后保存到data/processed下的數據表名


            import pandas as pd

            import numpy as np

            import os

            %xmode Verbose

            # 存原始數據的目錄

            raw_data_dir = os.path.join(os.getcwd(), '..\\..\\data\\raw')

            # 存處理后的數據的目錄

            processed_data_dir = os.path.join(os.getcwd(), '..\\..\\data\\processed')

            filename_temp = pd.Series(['xlsx'])

            file_jd_detail_para = ''

            file_jd_detail_para_output = ''


            輸出結果:

            Exception reporting mode: Verbose


            # 這段代碼看起來有些奇怪,這是因為GooSeeker的網絡爬蟲軟件和分詞軟件會產生好幾個輸出文件

            # 在我們的系列notebook中,給這些輸出文件編了編號,在同一個notebook中可以同時處理多個文件,比如,進行合并

            # 那么在raw文件夾中,應該給文件名加上合適的前綴,確保查出來的順序跟程序中的編號一致。

            # 例如,以往分詞和情感分析的結果文件編號有這些:

            # 0:'詞頻', 1:'分詞效果', 2:'選詞矩陣', 3:'選詞匹配', 4:'選詞結果', 5:'共詞矩陣'

            # 本文為了簡化,假定raw文件夾中只有一個要分析的excel文件,編號是0

            INDEX_CRAWLER_RESULT_FILE = 0

            for item_filename in os.listdir(raw_data_dir):

                if filename_temp[INDEX_CRAWLER_RESULT_FILE] in item_filename:

                    file_jd_detail_para = item_filename

                    break

            if file_jd_detail_para:

                print("采集結果原始excel表:", "data\\raw\\", file_jd_detail_para)

            else:

                print("采集結果原始excel表:不存在")

            ?

            輸出結果:

            采集結果原始excel表: data\raw\ 京東商品詳情_參數采集_1652857131584.xlsx


            6. 將數據的行列進行轉換

            用GooSeeker網絡爬蟲采集數據的時候,有時候是為了省事,定義一個很通用的采集規則,把網頁上的產品參數表(一行一個參數)原樣采集下來,不用定義復雜的采集規則,給每個參數命名專門的名字。這就是產生上面采集結果的原因。

            顯然,針對這樣的采集結果,就需要這個notebook做一個變換,把一行一個參數的格式變成一列一個參數,這樣轉換以后,一行只有一個產品。

            6.1. 打開原始采集結果excel數據表

            這里的df變量表示打開的excel表格,這是一個DataFrame對象,下面的所有操作都是針對DataFrame對象做的。


            df = ''

            try:

                df = pd.read_excel(os.path.join(raw_data_dir, file_jd_detail_para))

                print("數據表打開成功")

            except:

                print("數據表打開錯誤,請檢查數據文件:","data\\raw\\", file_jd_detail_para)

            ?

            輸出結果:

            數據表打開成功


            6.2. 操作數據表進行數據清洗

            【注意】以下演示的所有步驟都需要在上一步“打開原始采集結果excel數據表”成功的條件下才能正常執行。

            使用notebook最大一個好處,就是可以來來回回執行多個cell,修改一下再執行,如果不小心,會在后面的cell做了一些設置,卻在前面的cell使用了,如果當時是在反復執行,就不會覺得有問題,但是哪一天從頭初始執行,就會遇到錯誤。所以,哪些放在前面執行,要心里注意一下。

            6.3. 清洗完成后保存的excel表

            file_jd_detail_para_output = 'output_' + file_jd_detail_para


            6.4. 初始化清洗結果dataframe

            下面的語句其實是產生了一個新的dataframe,是一個空的,只有兩個字段,就像新創建一張表一樣,將用來存儲清洗后的結果數據。

            很多Pandas的dataframe函數執行結果是生成一個新的dataframe,即便是在老的dataframe上做表格計算,往往也是新生成一個dataframe。這有一個很大的好處,對比sql,常常一拍腦袋“大件事了,數據更新錯了!”,此時作為普通用戶就很難回退回去,因為在交互式界面上輸入sql語句,每句一個事務,即時提交了。

            但是,dataframe大部分情況下在執行了一個函數以后會生成一個新的dataframe,這就避免了很多像上面那樣的拍腦袋。這叫immutable的模式。但是Pandas允許一些就地更改,這跟Spark dataframe不一樣,那是嚴格immutable。


            df_output = pd.DataFrame(columns=['_fullpath','商品名稱'])

            df_output


            輸出結果:

            _fullpath 商品名稱


            6.5. 顯示采集結果表的表頭和第5條記錄

            df.head(5)


            6.6. 讀取采集結果表的每條記錄,清洗進最終的集成表

            上一個excel執行完成以后,你會發現數據有個很大問題:同一個產品的不同參數分別放在一行中。

            下面的代碼就是進行行列轉換:

            1. 首先_fullpath表示產品網址,作為唯一性關鍵詞,如果結果表還沒有這個產品,就插入一行新數據

            2. 然后把每個參數值作為一列放在產品行中


            for idx, row in df.iterrows():

                # 從源數據表讀出來需要的字段

                # 讀源數據表的時候,采用了序號方式:idx

                v_fullpath = df.iloc[idx]['_fullpath']

                v_item_name = df.iloc[idx]['商品名稱']

                v_para_name = df.iloc[idx]['參數名']

                v_para_value = df.iloc[idx]['參數值']

                # 如果作為唯一性關鍵字的_fullpath字段還沒有這一行數據,那么先插入這行數據

                if len(df_output.loc[df_output['_fullpath'] == v_fullpath]) == 0:

                    # 每次append,生成了一個新的dataframe,用原來的df_output繼續保存新的dataframe

                    df_output = df_output.append({'_fullpath': v_fullpath, '商品名稱': v_item_name}, ignore_index = True)

                #下面這個操作沒有生成新的dataframe,而是增加了表的列,用于存某個參數值,并填上了參數值

                df_output.loc[df_output['_fullpath'] == v_fullpath, v_para_name] = v_para_value


            6.7. 顯示最終結果表的前5行

            df_output.head(5)


            6.7. 把最終結果表保存到data/processed目錄下

            df_output.to_excel(os.path.join(processed_data_dir, file_jd_detail_para_output), sheet_name='sheet1')

            7. 下載notebook

            下載本Jupyter Notebook文件:京東商品詳情參數數據清洗Jupyter Notebook模板.zip


            鮮花

            握手

            雷人

            路過

            雞蛋

            最新評論

            GMT+8, 2022-11-24 12:14

            欧美一级午夜福利免费区