標籤彙整: python
受保護的文章:Python 337期 作業繳交
受保護的文章:Python 336期 作業繳交
受保護的文章:Python 335期 作業繳交
受保護的文章:Python 330期 作業繳交
Pandas+SQL-空氣品質資料擷取
Pandas+SQL 操作 – 前言
Pandas+SQL 的操作範例,本篇文章以政府開放資料平台中的 空氣品質指標(AQI) 為資料來源,展示了如何使用 pandas 搭配 SQL 語法 來做資料搜尋,對於已經有 SQL 語法操作基礎的人,可以用之前學過的 SQL 語法快速的搜尋並篩選出所需要的資料,提供大家參考。
Pandas 簡介
Pandas 是 python 的一個數據分析模組庫,於 2009 年底開源出來,提供高效能、簡易使用的資料格式 (Data Frame) 讓使用者可以快速操作及分析資料,主要特色描述如下:
- 在異質數據的讀取、轉換和處理上,讓分析人員更容易處理,例如:從列欄試算表中找到想要的值。
- Pandas 提供兩種主要的資料結構,Series 與 DataFrame。
- Series: 用來處理時間序列相關的資料(如感測器資料等),主要為建立索引的一維陣列。
- DataFrame: 用來處理結構化(Table like)的資料,有列索引與欄標籤的二維資料集,例如:關聯式資料庫、 CSV 等等。
- 透過載入至 Pandas 的資料結構物件後,透過結構化物件所提供的方法,快速地資料前處理。例如:資料補值,空值去除或取代等。
- 更多的輸入來源及輸出整合性,例如:可以從資料庫讀取資料進入 Dataframe ,也可將處理完的資料存回資料庫。
本篇文章就是使用 DataFrame 搭配關連式資料庫,使用 SQL 語法進行資料查詢篩選,而未來有時間再整理更多其他 Pandas 相關的應用範例。
安裝 Pandas
Python 安裝方式一樣都是透過 pip install 即可完成安裝,語法如下:
pip install pandas
其他介紹可以參考 官方網站
JSON
JSON(JavaScript Object Notation)是一種由道格拉斯·克羅克福特構想設計、輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。儘管 JSON 是 Javascript 的一個子集,但 JSON 是獨立於語言的文字格式,並且採用了類似於 C語言 家族的一些習慣。此種格式與XML格式常被用於API的資料回傳格式。本篇文章的程式碼範例就是以 JSON 格式的內容為資料的輸入來源。
範例程式碼
此範例程式主要流程大致為:
- 透過 requests 呼叫政府公開資料的 API 得到空氣品質指標的資料( JSON 格式)
- 透過 json.loads 函數將資料讀入
- 使用 pandas DataFrame 產生出資料框
- 透過 sqlalchemy 模組中的 create_engine 函數來建立 sqlite 的連線 ,並設定將資料表儲存在 memory 中(提供一次性的操作使用,若需要永久儲存則可以寫入檔案中)
- 使用 SQL 語法作取出特定的欄位(縣市、區域、平均 PM2.5 值)並以 PM2.5 的值由大至小排序。
import json import requests import pandas as pd ''' 資料庫的讀寫函數可以使用 SQLAlchemy,支援 PostgreSQL, MySQL, Oracle, Microsoft SQL server 等資料庫... ''' from sqlalchemy import create_engine req = requests.get('http://opendata2.epa.gov.tw/AQI.json') data = json.loads(req.content.decode('utf8')) df = pd.DataFrame(data) #透過sqlalchemy模組中的create_engine函數來建立sqlite的連線 #並設定將資料表儲存在memory中(提供一次性的操作使用,若需要永久儲存則可以寫入檔案中) engine = create_engine('sqlite:///:memory:') df.to_sql('db_table', engine, index=False) print(pd.read_sql_query('SELECT `County` as `縣市`, `SiteName` as `區域`, \ CAST(`PM2.5_AVG` AS int) as `PM2.5` FROM `db_table` \ order by CAST(`PM2.5_AVG` AS int) ASC', engine))
點我觀看執行範例 (使用 Microsoft Azure Notebooks )
若有其他想法,例如:想知道哪個縣市的整體平均空氣品質較差就可以在 SQL 語法中使用 GROUP BY 語法,對於 SQL 語法熟悉的話就能輕易地藉由改變查詢的語法來獲得想查詢 / 篩選的資料。
PS. 對於Python語法上有疑問可以參考課程投影片
Google關鍵字搜尋,將搜尋結果排名紀錄下來
使用Python撰寫自動化搜尋特定關鍵字
Google關鍵字搜尋將搜尋結果排名紀錄下來
Selenium 使用 Chrome 瀏覽器 webdriver
SEO (Search Engine Optimization),是維護網站非常重要的一項工作,利用這個小程式可以自動化的搜尋關鍵字,並將搜尋排名結果存入檔案,以利分析成效與後續的持續優化。
需要先安裝 selenium 套件
下載 Chrome 瀏覽器 webdriver
額外會需要用到兩隻檔案,需要先建立好放置於py檔同層資料夾下
site.csv : 裡面放要搜尋的網站位置
terms.csv : 搜尋關鍵字
from selenium import webdriver import csv import time chromedriver = "/Users/chifu/Documents/chromedriver" chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--incognito") driver = webdriver.Chrome(chromedriver, chrome_options=chrome_options) csvr_site = csv.reader(open('site.csv', 'r')) csvr_terms = csv.reader(open('terms.csv', 'r')) outfile = open('rank.csv', 'w') csvwriter = csv.writer(outfile) search_pages = 5 for s in csvr_site: site = s[0] for row in csvr_terms: print(row[0]) current_page = 1 while current_page <= search_pages: if current_page == 1: driver.get("https://www.google.com.tw/search?q=%s" % row[0]) else: driver.get(next_pageurl) time.sleep(1) doms = driver.find_elements_by_css_selector("div.rc h3.r a") next_pageurl = driver.find_element_by_css_selector("a#pnnext.pn").get_attribute("href") counter = 0 rank = "not found" for dom in doms: counter += 1 href = dom.get_attribute("href") if site in href: rank = counter break if rank != "not found": break current_page += 1 csvwriter.writerow([row[0], current_page, rank]) outfile.flush() time.sleep(1) driver.close()
相關API參考