科學計算:Python 分析數據找問題,並圖形化

對於記錄的數據,如何用 Python 進行分析、或圖形化呢?

本文將介紹 numpy, matplotlib, pandas, scipy 幾個包,進行數據分析、與圖形化。

準備環境

Python 環境建議用 Anaconda 發行版,下載地址:

  • 官方: https://www.anaconda.com/products/individual#Downloads
  • 清華源: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

Anaconda 是一個用於科學計算的 Python 發行版,已經包含了眾多流行的科學計算、數據分析的 Python 包。

可以 conda list 列出已有的包,會發現本文要介紹的幾個包都有了:

$ conda list | grep numpy
numpy                     1.17.2           py37h99e6662_0

$ conda list | grep "matplot\|seaborn\|plotly"
matplotlib                3.1.1            py37h54f8f79_0
seaborn                   0.9.0                    py37_0

$ conda list | grep "pandas\|scipy"
pandas                    0.25.1           py37h0a44026_0
scipy                     1.3.1            py37h1410ff5_0

如果已有 Python 環境,那麼 pip 安裝一下它們:

pip install numpy matplotlib pandas scipy
# pypi 鏡像: https://mirrors.tuna.tsinghua.edu.cn/help/pypi/

本文環境為: Python 3.7.4 (Anaconda3-2019.10)

準備數據

本文假設了如下格式的數據 data0.txt :

id, data, timestamp
0, 55, 1592207702.688805
1, 41, 1592207702.783134
2, 57, 1592207702.883619
3, 59, 1592207702.980597
4, 58, 1592207703.08313
5, 41, 1592207703.183011
6, 52, 1592207703.281802
...

CSV 格式:逗號分隔,讀寫簡單, Excel 可打開。

之後,我們會一起達成如下幾個目標:

  • CSV 數據, numpy 讀取與計算
  • data 列數據, matplotlib 圖形化
  • data 列數據, scipy 插值,形成曲線
  • timestamp 列數據, pandas 分析前後差值、每秒個數

numpy 讀取數據

numpy 可用 loadtxt 直接讀取 CSV 數據,

import numpy as np

# id, (data), timestamp
datas = np.loadtxt(p, dtype=np.int32, delimiter=",", skiprows=1, usecols=(1))
  • dtype=np.int32: 數據類型 np.int32
  • delimiter=",": 分隔符 “,”
  • skiprows=1: 跳過第 1 行
  • usecols=(1): 讀取第 1 列

如果讀取多列,

# id, (data, timestamp)
dtype = {'names': ('data', 'timestamp'), 'formats': ('i4', 'f8')}
datas = np.loadtxt(path, dtype=dtype, delimiter=",", skiprows=1, usecols=(1, 2))

dtype 說明可見: https://numpy.org/devdocs/reference/arrays.dtypes.html

numpy 分析數據

numpy 計算均值、樣本標準差:

# average
data_avg = np.mean(datas)
# data_avg = np.average(datas)

# standard deviation
# data_std = np.std(datas)
# sample standard deviation
data_std = np.std(datas, ddof=1)

print("  avg: {:.2f}, std: {:.2f}, sum: {}".format(
      data_avg, data_std, np.sum(datas)))

matplotlib 圖形化

只需四行,就能圖形化显示了:

import sys

import matplotlib.pyplot as plt
import numpy as np

def _plot(path):
  print("Load: {}".format(path))
  # id, (data), timestamp
  datas = np.loadtxt(path, dtype=np.int32, delimiter=",", skiprows=1, usecols=(1))

  fig, ax = plt.subplots()
  ax.plot(range(len(datas)), datas, label=str(i))
  ax.legend()
  plt.show()

if __name__ == "__main__":
  if len(sys.argv) < 2:
    sys.exit("python data_plot.py *.txt")
  _plot(sys.argv[1])

ax.plot(x, y, ...) 橫坐標 x 取的數據下標 range(len(datas))

完整代碼見文末 Gist 地址的 data_plot.py 。運行效果如下:

$ python data_plot.py data0.txt
Args
  nonzero: False
Load: data0.txt
  size: 20
  avg: 52.15, std: 8.57, sum: 1043

可以讀取多個文件,一起显示:

$ python data_plot.py data*.txt
Args
  nonzero: False
Load: data0.txt
  size: 20
  avg: 52.15, std: 8.57, sum: 1043
Load: data1.txt
  size: 20
  avg: 53.35, std: 6.78, sum: 1067

scipy 對數據插值

x, y 兩組數據,用 scipy 進行插值,平滑成曲線:

from scipy import interpolate

xnew = np.arange(xvalues[0], xvalues[-1], 0.01)
ynew = interpolate.interp1d(xvalues, yvalues, kind='cubic')

完整代碼見文末 Gist 地址的 data_interp.py 。運行效果如下:

python data_interp.py data0.txt

matplotlib 圖像化時如何配置、延遲、保存,可見代碼與註釋。

pandas 分析數據

這兒需要讀取 timestamp 列數據,

# id, data, (timestamp)
stamps = np.loadtxt(path, dtype=np.float64, delimiter=",", skiprows=1, usecols=(2))

numpy 計算前後差值,

stamps_diff = np.diff(stamps)

pandas 統計每秒個數,

stamps_int = np.array(stamps, dtype='int')
stamps_int = stamps_int - stamps_int[0]
import pandas as pd
stamps_s = pd.Series(data=stamps_int)
stamps_s = stamps_s.value_counts(sort=False)

辦法:把時間戳直接變整秒數,再 pandas 統計相同值。

完整代碼見文末 Gist 地址的 stamp_diff.py 。運行效果如下:

python stamp_diff.py data0.txt

matplotlib 圖形化時怎麼显示多個圖表,也可見代碼。

結語

本文代碼 Gist 地址: https://gist.github.com/ikuokuo/8629cc28079199c65e0eedb0d02a9e74

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

石膏內藏犀牛角 越南機場破獲125公斤走私

摘錄自2019年7月28日中央社報導

越南當局今天25日在首都河內一座機場破獲犀牛角走私案,查獲55支、重達125斤藏在石膏內的犀牛角。

目前不清楚這些犀牛角來自哪個非洲國家。警方同日逮捕一名涉及野生動物走私的主要嫌疑人與另兩名男子。警方發現他們停在停車場的車內放了7具冷凍老虎屍體,之後循線逮捕。

越南黑市販售象牙、穿山甲、老虎器官和犀牛角等野生動物,其中尤以犀牛角特別昂貴,一公斤價格可高達6萬美元。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

珍奶風席捲馬來西亞 掀起清真認證與環保話題

摘錄自2019年7月28日中央社報導

台灣珍奶近年來席捲東南亞市場,馬來西亞各大街小巷可隨處看見珍珠奶茶飲料店,某些街道還被稱作「奶茶街」,這股珍珠奶茶風潮也在當地帶動了清真、健康及環保等話題。

馬來西亞穆斯林人口超過1900萬人,對於源自台灣的珍珠奶茶,一名穆斯林網民近期就在網路上開始探討眾多席捲馬國的珍珠奶茶品牌,是否取得清真認證,引起網民熱烈討論。

伊斯蘭教是馬國官方宗教,馬來西亞同時奉行伊斯蘭法及聯邦憲法,穆斯林日常生活食用或碰觸身體的產品,必須符合伊斯蘭教義,即為「清真(Halal)」,避免碰觸包括豬和酒精等的不潔之物。獲得清真認證的產品從原物料開始到產品處理都必須嚴格把關。

除了清真認證受到關注之外,珍珠奶茶飲料杯主要都以塑膠材質為主,人們在飲用後隨處拋棄杯子的現象已經對環境帶來破壞,也受到許多環保人士的批評。

其中,最受熱議的奶茶街位於雪蘭莪州(Selangor)首邦市(Subang)SS15區,此地區約有近15家珍珠奶茶店,缺乏公德心的消費者在飲用奶茶後隨手將奶茶杯丟棄在店門前、溝渠、階梯上,幾乎隨處可見珍奶杯及吸管、塑膠袋,嚴重影響市容。

清道夫在收拾「殘局」後,堆積如山的樹膠杯及吸管塑膠袋更是讓人看了目瞪口呆,台灣珍珠奶茶風行馬來西亞,與馬國政府近期所推動的「減糖」、「減塑」、「禁吸管」政策背道而馳。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

鼓勵廢塑膠回收!印尼泗水「空瓶當車票」

摘錄自2018年11月12日民視報導

印尼第二大城泗水為了鼓勵民眾回收塑膠廢棄物,推動了「用塑膠空瓶當車票」的活動,只要用塑膠空瓶就能換公車車票,免費在市區搭一趟車。這不僅鼓勵民眾回收塑膠廢棄物,也增加大眾運輸的使用率,印尼政府希望藉這項活動,在2020年前讓印尼免受塑膠塑廢棄物之苦。

泗水衛生局官員迪居尼亞托羅表示:「為避免塑膠瓶造成環境污染問題,我們呼籲居民回收塑膠空瓶,用這些空瓶來換公車車票。」

這項活動每天回收平均200公斤塑膠空瓶,周末回收數更高,從活動開始到現在,回收量已累積高達39公噸。

印尼是僅次於中國全球最大塑膠垃圾製造國之一,其中泗水的日常垃圾中,就有15%是塑膠廢棄物。當地政府也表示,這項活動讓塑膠廢棄物具有實用價值,讓民眾更關注這項問題。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

幼獸淪名流自拍炫富工具後棄養

摘錄自2018年11月15日公視報導

法國警方19號在香榭大道攔下一輛名車藍寶堅尼,發現裡面有一隻不到兩個月大的獅子寶寶,動保團體表示有越來越多人,會買一隻幼獸自拍炫富,然後棄養,形成歪風。

動保團體「300萬之友」主席胡庭說:「問題就出在馬戲團,他們可以利用野生動物(表演),法國馬戲團大約有1500隻野生動物,可怕的是這些馬戲團有繁殖的權利。」

胡庭認為,買幼獸自拍並上傳這群媒體的歪風,是來自波斯灣阿拉伯國家,這些小動物長大就會被丟棄;他們在約旦撿到三、四十隻被丟棄的小獅子,但更令人擔心的是,現在法國似乎也開始流行,過去半年,他們陸續撿到四隻獅子幼獸。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

挪威帶頭衝,歐洲電動車銷售量突破百萬大關

根據 EV volumes 資料顯示,歐洲上半年電動車(含純電池動力與插電式混合動力車)銷售量猛增,歷史累計銷售量已在 6 月正式突破百萬輛大關。

2018 上半年,歐洲電動車銷售量每月至少增加 5,000 輛,累計銷售量達 19.5 萬輛,較去年成長 42%,其中純電池動力車占 51%,其餘為混合動力車。

據 EV volumes 估計,歐洲 2018 全年電動車銷售量將達 43 萬輛,對照全球預估來到 135 萬輛。

挪威目前是歐洲電動車銷售量最高的國家,不過德國在後猛追,EV volumes 預期今年底德國電動車銷售量就將超越挪威。

中國電動車銷售量更早突破 100 萬輛,幾乎比歐洲快了一年,且需求持續成長,預估 2018 年底就會超越兩百萬輛。

(本文內容由 授權使用。首圖來源:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

電動車前景看俏,全球電動車累計銷售量已突破 400 萬

彭博能源財經(BNEF)最新報告指出,全球電動自小客車累計銷售已突破 400 萬大關,雖然乍看之下只佔總汽車銷售量的一小部分,但與 2015 年的 100 萬輛相比,其成長速度可說是一日千里。

BNEF 指出,若把電動巴士計算在內,電動車銷售量早在 7 月初就抵達 400 萬,其中電動自小客車全球銷售量在 2018 年 6 月底來到 350 萬輛,電動巴士則為是 421,000 輛,總銷售量為 397 萬。

報告顯示,電動車銷售量從 100 萬到 200 萬輛僅花費 17 個月,更在短短 6 個月就從 300 萬增加到 400 萬輛,而隨著電動車技術進步與價格下滑,未來電動車發展將踩油門加速,全球電動車銷售量僅需 6 個月、在 2019 年 3 月就能突破 500 萬。

電動車銷售量與日俱增,電動車銷售佔比在中國、歐洲和北美等主要市場也不斷提升,以 2018 年第二季來說,電動車就分別占當地總銷售的 4%、2.3% 與 1.6%。中國市場則是全球電動車發展迅速的一大功臣,中國市場早在 2011 年就佔全球電動自小客車總銷售的 37%,更占電動巴士的 99%。

BNEF 指出,未來中國將佔全球電動車總銷售的 42%,歐洲與北美分別占 26% 與 25%,若特斯拉平價電動車款 Model 3 在北美的銷售行情一路上漲,北美電動車銷售量則會迅速超越歐洲,而這兩個市場的銷售量也將同時達到 130 萬輛。

報告也表示,2018 年底之前還會有幾款電動車上市,這將能進一步提升全球電動車銷售市場。BNEF 指出,Model 3 將於 2019 年中旬進入歐洲市場、中國的「雙積分制」也將在 2019 年生效,新型車款與政策都能推動歐洲與中國電動車買氣。

中國雙積分制規定各大車廠必須出售一定比例的環保車,其中分為「油耗積分」與「新能源積分」,若車廠生產越多汽油車,油耗積分就會隨之減少;生產越多高性能電動車,新能源積分就越多。車廠每年正負積分必須抵銷歸零,如果積分沒辦法歸零就不能販售新車。

在政策挹注之下,中國電動車發展將逐步加速。中國媒體也指出,中國政府預估新能源車產量可在 2020 年達到 200 萬輛,銷售佔比更會在 2025 年達到總汽車市場的 20%。

BNEF 先前預估,2025 年全球電動車累計銷售量將增加 10 倍、達到 1,100 萬輛,2020-2030 年電動車價格則可與傳統汽車相當,2030 年全球電動車銷售量有望突破 3,000 萬輛。

隨著氣候變遷與空氣污染加劇,各國開始意識到電動車開發的重要性、紛紛開始制定禁售汽柴油車時間表與路上零排放目標,未來電動車的發展還會再加快,說不定可提早突破 1,000 萬大關。

(首圖來源:。文/DaisyChuang)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

LeetCode 78,面試常用小技巧,通過二進制獲得所有子集

本文始發於個人公眾號:TechFlow,原創不易,求個關注

今天是LeetCode專題第47篇文章,我們一起來看下LeetCode的第78題Subsets(子集)。

這題的官方難度是Medium,點贊3489,反對79,通過率59.9%。從這個數據我們也可以看得出來,這是一道難度不是很大,但是質量很高的題。的確,在這道題的解法當中,你會學到一種新的技巧。

廢話不多說,我們先來看題意。

題意

這題的題意非常簡單,和上一題有的一拼,基本上從標題就能猜到題目的意思。給定一個沒有重複元素的int型數組,要求返回所有的子集,要求子集當中沒有重複項,每一項當中也沒有重複的元素。

樣例

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

照搬上題

剛拿到手可能有點蒙,但是稍微想一下就會發現,這一題和上題非常接近,兩者唯一的不同就是,子集沒有數量的限制,從空集開始,一直到它本身結束,不論多少個元素都可以。而上一題要求的是有數量限制的,也就是說上一題我們求的其實是限定了k個元素的子集。

想明白這點就簡單了,顯然我們可以復用上一題的算法,我們來遍歷這個k,從0到n,就可以獲得所有的子集了。只要你上一題做出來了,那麼這題幾乎沒有任何難度。如果你沒有看過上一題的文章的話,可以通過傳送門回顧一下:

LeetCode 77,組合挑戰,你能想出不用遞歸的解法嗎?

我們直接來看代碼:

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        # 上一題求解k個組合的解法
        def combine(n, k, ret):
            window = list(range(1, k+1)) + [n+1]
            j = 0
            
            while j < k:
                cur = []
                for i in range(k):
                    cur.append(nums[window[i] - 1])
                ret.append(cur[:])
                
                j = 0
                while j < k and window[j+1] == window[j] + 1:
                    window[j] = j + 1
                    j += 1
                window[j] += 1
                
        # 手動添加空集
        ret = [[]]
        n = len(nums)
        # 遍歷k從1到n
        for i in range(1, n+1):
            combine(n, i, ret)
        return ret

二進制組合

照搬上一題的解法固然是可行的,但是這麼做完全沒有必要,也得不到任何收穫。所以我們應該想一下新的解法。

既然這道題讓我們求的是所有的子集,那麼我們可以從子集的特點入手。我們之前學過,一個含有n個元素的子集的數量是。這個很容易想明白,因為n個元素,每個元素都有兩個狀態,選或者不選。並且這n個元素互相獨立,也就是說某個元素選或者不選並不會影響其他的元素,所以我們可以知道一共會有種可能。

我們也可以從組合數入手,我們令所有子集的數量為S,那麼根據上面我們用組合求解的解法,可以得到:

兩者的結果是一樣的,說明這個結論一定是正確的。

不知道大家看到n個元素,每個元素有兩個取值有什麼想法,如果做過的題目數量夠多的話,應該能很快聯想到二進制。因為在二進制當中,每一個二進制位就只有0和1兩種取值。那麼我們就可以用n位的二進制數來表示n個元素集合取捨的狀態。n位二進制數的取值範圍是,所以我們用一重循環去遍歷它,就相當於一重循環遍歷了整個集合所有的狀態。

這種技巧我們也曾經在動態規劃狀態壓縮的文章當中提到過,並且在很多題目當中都會用到。所以建議大家可以了解一下,說不定什麼時候面試就用上了。

根據這個技巧, 我們來實現代碼就非常簡單了。

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        ret = []
        n = len(nums)
        # 遍歷所有的狀態
        # 1左移n位相當於2的n次方
        for s in range(1 << n):
            cur = []
            # 通過位運算找到每一位是0還是1
            for i in range(n):
                # 判斷s狀態在2的i次方上,也就是第i位上是0還是1
                if s & (1 << i):
                    cur.append(nums[i])
            ret.append(cur[:])
            
        return ret

從代碼來看明顯比上面的解法短得多,實際上運行的速度也更快,因為我們去掉了所有多餘的操作,我們遍歷的每一個狀態都是正確的,也不用考慮重複元素的問題。

總結

不知道大家看完文章都有一些什麼感悟,可能第一種感悟就是LeetCode應該按照順序刷吧XD。

的確如此,LeetCode出題人出題都是有套路的,往往出了一道題之後,為了提升題目數量(湊提數),都會在之前題目的基礎上做變形,變成一道新題。所以如果你按照順序刷題的話,會很明顯地發現這一點。如果你從這個角度出發去思考的話,不但能理解題目之間的聯繫,還能揣摩出出題人的用意,這也是一件很有趣的事情。

如果喜歡本文,可以的話,請點個關注,給我一點鼓勵,也方便獲取更多文章。

本文使用 mdnice 排版

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

.Net Core基礎的健康檢查

前言

健康檢查能查看我們的應用程序當前是否是一個健康的運行狀態。微軟已經給我們提供了健康檢查輪子,只需要簡單的配置就能完成服務的狀態檢查。一起來實現一個最簡單的健康檢查吧。

開始

  • 新建一個空的webApi項目。 並引用Microsoft.Extensions.Diagnostics.HealthChecks 包。並在ConfigureServicesConfigure中加入相關配置
public void ConfigureServices(IServiceCollection services)
{
    //健康檢查服務
    services.AddHealthChecks();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //加入中間件
    app.UseHealthChecks("/healthChecks");
}

最簡單的檢查就完成了,我們測試一下。

返Healthy,表示服務正常。

自定義拓展

HealthChecks提供了一個IHealthCheck接口,這個接口只有一個CheckHealthAsync方法,我們只需要實現這個接口就可以實現我們需要的各種自定義的檢查項目。CheckHealthAsync返回一個HealthCheckResult的枚舉代表健康檢查的幾種狀態,分別是異常,降級,健康。

public enum HealthStatus
{
    Unhealthy = 0,
    Degraded = 1,
    Healthy = 2,
}

實現接口,返回不健康狀態。

public class SqlHealthChecks : IHealthCheck
{
    public Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = new CancellationToken())
    {
        if (1 == 1)
        {
            return Task.FromResult(HealthCheckResult.Unhealthy());
        }
    }
}

ConfigureServices中添加自定義的檢查,AddCheck可以添加你自定的健康檢查服務,

public void ConfigureServices(IServiceCollection services)
{
    //健康檢查服務
    services.AddHealthChecks().AddCheck<SqlHealthChecks>("key");
}

測試可以發現返回的為不健康的應用

自定義返回值

我們可以利用HealthCheckOptions來實現健康檢查的自定義返回內容.

private static Task WriteResponse(HttpContext context, HealthReport healthReport)
{
    context.Response.ContentType = "application/json";
    var result = JsonHelper.SerializeObject(new
    {
        code = context.Response.StatusCode,
        errors = healthReport.Entries.Select(e => new
        {
            key = e.Key,
            value = e.Value.Status.ToString()
        })
    });

    return context.Response.WriteAsync(result);
}


public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHostApplicationLifetime appLifetime)
{

    app.UseHealthChecks("/healthChecks", new HealthCheckOptions{ResponseWriter = WriteResponse});

}

測試返回效果

引入Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 可以為DbContext進行檢查


public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks().AddCheck<SqlHealthChecks>("key").AddDbContextCheck<DbContext>("DbContext");
}

健康檢查UI

引入AspNetCore.HealthChecks.UI並在ConfigureServicesConfigure中加入相應的配置

public void ConfigureServices(IServiceCollection services)  
{  
    services.AddHealthChecksUI();  
}  

public void Configure(IApplicationBuilder app, IHostingEnvironment env)  
{  
    app.UseHealthChecksUI();  
}  

appsetting,json文件中加入配置

{
  "HealthChecksUI": {
    "HealthChecks": [
      {
        "Name": "HealthCheck",
        "Uri": "https://localhost:5000/healthCheck"
      }
    ],
    "EvaluationTimeinSeconds": 10,
    "MinimumSecondsBetweenFailureNotifications": 60
  }
}

啟動項目並指向/healthchecks-ui。

擴展包

開源社區已經有很多現有的優秀的擴展包我們可以直接引用

AspNetCore.HealthChecks.Npgsql
AspNetCore.HealthChecks.Redis
AspNetCore.HealthChecks.AzureStorage
AspNetCore.HealthChecks.AzureServiceBus
AspNetCore.HealthChecks.MySql
AspNetCore.HealthChecks.DocumentDb
AspNetCore.HealthChecks.SqLite
AspNetCore.HealthChecks.Kafka
AspNetCore.HealthChecks.RabbitMQ
AspNetCore.HealthChecks.IdSvr
AspNetCore.HealthChecks.DynamoDB
AspNetCore.HealthChecks.Oracle
AspNetCore.HealthChecks.Uris
AspNetCore.HealthChecks.System
AspNetCore.HealthChecks.Network
AspNetCore.HealthChecks.SqlServer
AspNetCore.HealthChecks.MongoDb

參考文章

  • 微軟官方文檔
  • 社區
  • 源碼理解HealthCheck

總結

實現了一個最簡單的健康檢查功能,可以在這個基礎上進行自定義的擴展和開發。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

露西催生禁令 英擬禁寵物店售未滿6個月貓犬

摘錄自2018年8月23日中央社報導

英格蘭地區擬禁止寵物店銷售6個月以下的幼貓幼犬,民眾僅可領養或從合法繁殖者購買,而催生禁令的是一隻名叫「露西」、出生繁殖場的可憐小狗。

英國廣播公司(BBC)報導,英格蘭地區將從10月1日禁止銷售不滿8週大的幼貓幼犬,並計劃進一步擴大,限制出售6個月大的幼貓幼犬。

英國環境、食物及鄉村事務部表示,民眾目前可以直接從合法繁殖者,或是從合法的第三方賣家購買幼貓幼犬。然而,由於第三方賣家售出的寵物沒有數量紀錄,難以控管。

動保團體表示,僅能推估每年大不列顛地區(Great Britain)售出數量約在4萬至8萬隻,而根據政府紀錄,英格蘭地區僅有不到100家第三方賣家(包含寵物店)有販售貓犬的合法執照。

英國環境食品及農村事務部大臣戈夫(Michael Gove)表示:「我們會消滅繁殖場,確保第三方不能再販售小貓、小狗。」

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

※教你寫出一流的銷售文案?

※超省錢租車方案

FB行銷專家,教你從零開始的技巧