Skip to main content

Hossam Data Helper

Project description

๐ŸŽ“ Hossam Data Helper

Python Version License: MIT Version

Hossam์€ ๋ฐ์ดํ„ฐ ๋ถ„์„, ์‹œ๊ฐํ™”, ํ†ต๊ณ„ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ข…ํ•ฉ ํ—ฌํผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

์•„์ดํ‹ฐ์œŒ(ITWILL)์—์„œ ์ง„ํ–‰ ์ค‘์ธ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ฐ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ˆ˜์—…์„ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ์ด๊ด‘ํ˜ธ ๊ฐ•์‚ฌ์˜ ๊ฐ•์˜์—์„œ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“‹ ๋ชฉ์ฐจ


โœจ ํŠน์ง•

  • ๐Ÿ“Š ํ’๋ถ€ํ•œ ์‹œ๊ฐํ™”: Seaborn/Matplotlib ๊ธฐ๋ฐ˜์˜ 25+ ์‹œ๊ฐํ™” ํ•จ์ˆ˜
  • ๐ŸŽฏ ํ†ต๊ณ„ ๋ถ„์„: ํšŒ๊ท€, ๋ถ„๋ฅ˜, ์‹œ๊ณ„์—ด ๋ถ„์„์„ ์œ„ํ•œ ํ†ต๊ณ„ ๋„๊ตฌ
  • ๐Ÿ“ฆ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ: ํ•™์Šต์šฉ ๋ฐ์ดํ„ฐ์…‹ ์ฆ‰์‹œ ๋กœ๋“œ ๊ธฐ๋Šฅ
  • ๐Ÿ”ง ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ: ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ, ์ด์ƒ์น˜ ํƒ์ง€, ์Šค์ผ€์ผ๋ง ๋“ฑ
  • ๐Ÿš€ ๊ฐ„ํŽธํ•œ ์‚ฌ์šฉ: ์ง๊ด€์ ์ธ API๋กœ ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘ ์ง€์›
  • ๐Ÿ“ˆ ๊ต์œก์šฉ ์ตœ์ ํ™”: ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ต์œก์— ํŠนํ™”๋œ ์„ค๊ณ„

๐Ÿ“ฆ ์„ค์น˜

PyPI๋ฅผ ํ†ตํ•œ ์„ค์น˜ (๊ถŒ์žฅ)

pip install hossam

๊ฐœ๋ฐœ ๋ฒ„์ „ ์„ค์น˜

git clone https://github.com/leekh4232/hossam-data.git
cd hossam-data
pip install -e .

์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.8 ์ด์ƒ
  • pandas, numpy, matplotlib, seaborn ๋“ฑ (์ž๋™ ์„ค์น˜๋จ)

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

๋ฒ„์ „ ํ™•์ธ

import hossam
print(hossam.__version__)  # 0.3.0

์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ๋กœ๋“œ

from hossam import load_data, load_info

# ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ์…‹ ๋ชฉ๋ก ํ™•์ธ
datasets = load_info()
print(datasets)

# ํŠน์ • ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰
ad_datasets = load_info(search="AD")

# ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
df = load_data('AD_SALES')
print(df.head())

๊ฐ„๋‹จํ•œ ์‹œ๊ฐํ™”

from hossam import plot as hs_plot
import pandas as pd
import numpy as np

# ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ
df = pd.DataFrame({
    'x': np.random.randn(100),
    'y': np.random.randn(100),
    'category': np.random.choice(['A', 'B', 'C'], 100)
})

# ์‚ฐ์ ๋„ ๊ทธ๋ฆฌ๊ธฐ
hs_plot.hs_scatterplot(df=df, xname='x', yname='y', hue='category', palette='Set1')

# ๋ฐ•์Šคํ”Œ๋กฏ ๊ทธ๋ฆฌ๊ธฐ
hs_plot.hs_boxplot(df=df, xname='category', yname='x', palette='pastel')

# KDE ํ”Œ๋กฏ ๊ทธ๋ฆฌ๊ธฐ
hs_plot.hs_kdeplot(df=df, xname='x', hue='category', fill=True, fill_alpha=0.3)

๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ๋ฐ์ดํ„ฐ ๋กœ๋”

ํ•™์Šต์šฉ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ์…‹์„ ๋น ๋ฅด๊ฒŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

from hossam import load_data, load_info

# ๋ชจ๋“  ๋ฐ์ดํ„ฐ์…‹ ๋ชฉ๋ก ๋ณด๊ธฐ
all_datasets = load_info()

# ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰
search_results = load_info(search="regression")

# ๋ฐ์ดํ„ฐ ๋กœ๋“œ
df = load_data('DATASET_NAME')

์ฃผ์š” ๋ฐ์ดํ„ฐ์…‹ (์˜ˆ์‹œ):

  • AD_SALES: ๊ด‘๊ณ ๋น„์™€ ๋งค์ถœ ๋ฐ์ดํ„ฐ
  • ๊ธฐํƒ€ ๋‹ค์–‘ํ•œ ํšŒ๊ท€, ๋ถ„๋ฅ˜, ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์…‹

2. ์‹œ๊ฐํ™” ๋ชจ๋“ˆ (hossam.plot)

๊ธฐ๋ณธ ํ”Œ๋กฏ

์„  ๊ทธ๋ž˜ํ”„ (Line Plot)
from hossam import plot as hs_plot

hs_plot.hs_lineplot(
    df=df,
    xname='time',
    yname='value',
    hue='category',
    marker='o',
    palette='Set1'
)
์‚ฐ์ ๋„ (Scatter Plot)
hs_plot.hs_scatterplot(
    df=df,
    xname='x',
    yname='y',
    hue='group',
    palette='husl'
)
ํžˆ์Šคํ† ๊ทธ๋žจ (Histogram)
hs_plot.hs_histplot(
    df=df,
    xname='value',
    hue='category',
    bins=30,
    kde=True,
    palette='Set2'
)

๋ถ„ํฌ ์‹œ๊ฐํ™”

๋ฐ•์Šคํ”Œ๋กฏ (Box Plot)
hs_plot.hs_boxplot(
    df=df,
    xname='category',
    yname='value',
    orient='v',
    palette='pastel'
)
๋ฐ”์ด์˜ฌ๋ฆฐ ํ”Œ๋กฏ (Violin Plot)
hs_plot.hs_violinplot(
    df=df,
    xname='category',
    yname='value',
    palette='muted'
)
KDE ํ”Œ๋กฏ (Kernel Density Estimation)
# 1์ฐจ์› KDE
hs_plot.hs_kdeplot(
    df=df,
    xname='value',
    hue='category',
    fill=True,
    fill_alpha=0.3,
    palette='Set1'
)

# 2์ฐจ์› KDE
hs_plot.hs_kdeplot(
    df=df,
    xname='x',
    yname='y',
    palette='coolwarm'
)

ํ†ต๊ณ„์  ํ”Œ๋กฏ

ํšŒ๊ท€์„ ์ด ํฌํ•จ๋œ ์‚ฐ์ ๋„ (Regression Plot)
hs_plot.hs_regplot(
    df=df,
    xname='x',
    yname='y',
    palette='red'
)
์„ ํ˜• ๋ชจ๋ธ ํ”Œ๋กฏ (LM Plot)
hs_plot.hs_lmplot(
    df=df,
    xname='x',
    yname='y',
    hue='category'
)
์ž”์ฐจ ํ”Œ๋กฏ (Residual Plot)
from sklearn.linear_model import LinearRegression

# ๋ชจ๋ธ ํ•™์Šต
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# ์ž”์ฐจ ํ”Œ๋กฏ
hs_plot.hs_residplot(
    y=y_test,
    y_pred=y_pred,
    lowess=True,  # LOWESS ํ‰ํ™œํ™”
    mse=True      # MSE ๋ฒ”์œ„ ํ‘œ์‹œ
)
Q-Q ํ”Œ๋กฏ (Quantile-Quantile Plot)
residuals = y_test - y_pred
hs_plot.hs_qqplot(y_pred=residuals)
ํ˜ผ๋™ ํ–‰๋ ฌ (Confusion Matrix)
hs_plot.hs_confusion_matrix(
    y=y_test,
    y_pred=y_pred,
    cmap='Blues'
)

๋‹ค๋ณ€๋Ÿ‰ ๋ถ„์„

์Œ ๊ด€๊ณ„ ํ”Œ๋กฏ (Pair Plot)
hs_plot.hs_pairplot(
    df=df,
    diag_kind='kde',
    hue='category',
    palette='Set1'
)
๊ณต๋™ ๋ถ„ํฌ ํ”Œ๋กฏ (Joint Plot)
hs_plot.hs_jointplot(
    df=df,
    xname='x',
    yname='y',
    palette='viridis'
)
ํžˆํŠธ๋งต (Heatmap)
# ์ƒ๊ด€๊ณ„์ˆ˜ ํ–‰๋ ฌ
corr_matrix = df.corr()
hs_plot.hs_heatmap(
    data=corr_matrix,
    palette='coolwarm'
)

๊ณ ๊ธ‰ ์‹œ๊ฐํ™”

๋ณผ๋ก ๊ป์งˆ ์‚ฐ์ ๋„ (Convex Hull)
hs_plot.hs_convex_hull(
    data=df,
    xname='x',
    yname='y',
    hue='cluster',
    palette='Set1'
)
100% ๋ˆ„์  ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ (Stacked Bar)
hs_plot.hs_stackplot(
    df=df,
    xname='category',
    hue='subcategory',
    palette='Pastel1'
)
P-Value ์ฃผ์„ ๋ฐ•์Šคํ”Œ๋กฏ
hs_plot.hs_pvalue1_anotation(
    data=df,
    target='value',
    hue='group',
    pairs=[('A', 'B'), ('B', 'C')],
    test='t-test_ind',
    text_format='star'
)
ํด๋ž˜์Šค๋ณ„ ๋ถ„ํฌ (Distribution by Class)
hs_plot.hs_distribution_by_class(
    data=df,
    xnames=['feature1', 'feature2'],
    hue='target',
    type='kde',
    fill=True,
    palette='Set1'
)
ํด๋ž˜์Šค๋ณ„ ์‚ฐ์ ๋„ (Scatter by Class)
hs_plot.hs_scatter_by_class(
    data=df,
    group=[['x', 'y'], ['x', 'z']],
    hue='target',
    outline=True,  # ๋ณผ๋ก ๊ป์งˆ ํ‘œ์‹œ
    palette='husl'
)

๊ณตํ†ต ๋งค๊ฐœ๋ณ€์ˆ˜

๋ชจ๋“  ์‹œ๊ฐํ™” ํ•จ์ˆ˜๋Š” ๋‹ค์Œ ๊ณตํ†ต ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  • width: ์บ”๋ฒ„์Šค ๊ฐ€๋กœ ํ”ฝ์…€ (๊ธฐ๋ณธ๊ฐ’: 1280)
  • height: ์บ”๋ฒ„์Šค ์„ธ๋กœ ํ”ฝ์…€ (๊ธฐ๋ณธ๊ฐ’: 720)
  • dpi: ํ•ด์ƒ๋„ (๊ธฐ๋ณธ๊ฐ’: 200)
  • palette: ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ ('Set1', 'Set2', 'pastel', 'husl', 'coolwarm' ๋“ฑ)
  • ax: ์™ธ๋ถ€ Axes ๊ฐ์ฒด ์ „๋‹ฌ ๊ฐ€๋Šฅ
  • callback: Axes ํ›„์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜

์บ”๋ฒ„์Šค ํฌ๊ธฐ ์กฐ์ • ์˜ˆ์ œ

# ๊ณ ํ•ด์ƒ๋„ ํฐ ์ฐจํŠธ
hs_plot.hs_scatterplot(
    df=df,
    xname='x',
    yname='y',
    width=1920,
    height=1080,
    dpi=300
)

์™ธ๋ถ€ Axes ์‚ฌ์šฉ ์˜ˆ์ œ

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(12, 10))

hs_plot.hs_boxplot(df=df, xname='cat', yname='val', ax=axes[0, 0])
hs_plot.hs_violinplot(df=df, xname='cat', yname='val', ax=axes[0, 1])
hs_plot.hs_histplot(df=df, xname='val', ax=axes[1, 0])
hs_plot.hs_kdeplot(df=df, xname='val', ax=axes[1, 1])

plt.tight_layout()
plt.show()

์ฝœ๋ฐฑ ํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์ œ

def custom_style(ax):
    ax.set_title('์‚ฌ์šฉ์ž ์ •์˜ ์ œ๋ชฉ', fontsize=16, fontweight='bold')
    ax.set_xlabel('X์ถ• ๋ ˆ์ด๋ธ”', fontsize=12)
    ax.set_ylabel('Y์ถ• ๋ ˆ์ด๋ธ”', fontsize=12)
    ax.grid(True, alpha=0.3, linestyle='--')

hs_plot.hs_scatterplot(
    df=df,
    xname='x',
    yname='y',
    callback=custom_style
)

3. ๋ถ„์„ ๋ชจ๋“ˆ (hossam.analysis)

๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ํ†ต๊ณ„ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

from hossam import analysis as hs_analysis

# ๊ธฐ์ˆ  ํ†ต๊ณ„ ๋ถ„์„
# ํšŒ๊ท€ ๋ถ„์„ ํ—ฌํผ
# ๋ถ„๋ฅ˜ ์„ฑ๋Šฅ ํ‰๊ฐ€
# ์‹œ๊ณ„์—ด ๋ถ„์„
# ๋“ฑ๋“ฑ (์ƒ์„ธ ๋ฌธ์„œ ์ฐธ์กฐ)

4. ์ „์ฒ˜๋ฆฌ ๋ชจ๋“ˆ (hossam.prep)

๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ๋ฐ ์ •์ œ๋ฅผ ์œ„ํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค.

from hossam import prep as hs_prep

# ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ
# ์ด์ƒ์น˜ ํƒ์ง€ ๋ฐ ์ œ๊ฑฐ
# ์Šค์ผ€์ผ๋ง ๋ฐ ์ธ์ฝ”๋”ฉ
# ๋“ฑ๋“ฑ (์ƒ์„ธ ๋ฌธ์„œ ์ฐธ์กฐ)

5. ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ชจ๋“ˆ (hossam.util)

๊ธฐํƒ€ ํŽธ์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

from hossam import util as hs_util

# ๋‹ค์–‘ํ•œ ํ—ฌํผ ํ•จ์ˆ˜๋“ค
# ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜
# ํŒŒ์ผ I/O ์ง€์›
# ๋“ฑ๋“ฑ (์ƒ์„ธ ๋ฌธ์„œ ์ฐธ์กฐ)

๐Ÿ“š ์˜์กด์„ฑ

Hossam์€ ๋‹ค์Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

ํ•ต์‹ฌ ์˜์กด์„ฑ

  • pandas: ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ๋ถ„์„
  • numpy: ์ˆ˜์น˜ ๊ณ„์‚ฐ
  • matplotlib: ๊ธฐ๋ณธ ์‹œ๊ฐํ™”
  • seaborn: ํ†ต๊ณ„ ์‹œ๊ฐํ™”

ํ†ต๊ณ„ ๋ฐ ๋จธ์‹ ๋Ÿฌ๋‹

  • scipy: ๊ณผํ•™ ๊ณ„์‚ฐ ๋ฐ ํ†ต๊ณ„
  • scikit-learn: ๋จธ์‹ ๋Ÿฌ๋‹ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • statsmodels: ํ†ต๊ณ„ ๋ชจ๋ธ๋ง
  • pingouin: ํ†ต๊ณ„ ๋ถ„์„

๊ธฐํƒ€

  • tqdm: ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ
  • tabulate: ํ‘œ ํ˜•์‹ ์ถœ๋ ฅ
  • requests: HTTP ์š”์ฒญ
  • openpyxl, xlrd: Excel ํŒŒ์ผ ์ง€์›
  • statannotations: ํ†ต๊ณ„ ์ฃผ์„
  • joblib: ์ง๋ ฌํ™” ๋ฐ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

๋ชจ๋“  ์˜์กด์„ฑ์€ pip install hossam ์‹œ ์ž๋™์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.


๐ŸŽ“ ์‚ฌ์šฉ ์‚ฌ๋ก€

๊ต์œก์šฉ

# ์ˆ˜์—…์—์„œ ๋น ๋ฅด๊ฒŒ ์‹œ๊ฐํ™” ์‹œ์—ฐ
from hossam import load_data, plot as hs_plot

df = load_data('SAMPLE_DATA')
hs_plot.hs_pairplot(df=df, hue='target', palette='Set1')

๋ฐ์ดํ„ฐ ํƒ์ƒ‰

# ๋น ๋ฅธ EDA (ํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„)
from hossam import plot as hs_plot

# ๋ถ„ํฌ ํ™•์ธ
hs_plot.hs_distribution_by_class(
    data=df,
    hue='target',
    type='histkde'
)

# ์ƒ๊ด€๊ด€๊ณ„ ํ™•์ธ
hs_plot.hs_heatmap(data=df.corr(), palette='coolwarm')

# ํŠน์ง• ๊ด€๊ณ„ ํ™•์ธ
hs_plot.hs_scatter_by_class(
    data=df,
    hue='target',
    outline=True
)

๋ชจ๋ธ ํ‰๊ฐ€

from sklearn.linear_model import LinearRegression
from hossam import plot as hs_plot

# ๋ชจ๋ธ ํ•™์Šต
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# ์ž”์ฐจ ๋ถ„์„
hs_plot.hs_residplot(y=y_test, y_pred=y_pred, lowess=True, mse=True)

# ์ •๊ทœ์„ฑ ๊ฒ€์ฆ
hs_plot.hs_qqplot(y_pred=y_test - y_pred)

๐Ÿ“ ๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.


๐Ÿ‘จโ€๐Ÿซ ์ €์ž

์ด๊ด‘ํ˜ธ (Lee Kwang-Ho)


๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์•„์ดํ‹ฐ์œŒ์—์„œ ์ง„ํ–‰๋˜๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„ ๊ต์œก์„ ์œ„ํ•ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜๊ฐ•์ƒ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•™์Šต์— ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.


๐Ÿ“ž ์ง€์› ๋ฐ ๋ฌธ์˜


Happy Data Analysis! ๐Ÿ“Šโœจ

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hossam-0.3.0.tar.gz (26.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hossam-0.3.0-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

File details

Details for the file hossam-0.3.0.tar.gz.

File metadata

  • Download URL: hossam-0.3.0.tar.gz
  • Upload date:
  • Size: 26.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for hossam-0.3.0.tar.gz
Algorithm Hash digest
SHA256 5260eac1a78e6c743352683b78784521b7f5ae1a8fee6847a0a710b0f4786d9c
MD5 17872dce5214df61144f5ac363d51f87
BLAKE2b-256 51e58c574d1b7bf975d80d59131b6253d86a092388a3dcebf9776b9f4c65d70a

See more details on using hashes here.

File details

Details for the file hossam-0.3.0-py3-none-any.whl.

File metadata

  • Download URL: hossam-0.3.0-py3-none-any.whl
  • Upload date:
  • Size: 22.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for hossam-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4626c1b57f1ffa19a3d88983d2a5718b0d17c61684440f415d16b577a26f4663
MD5 cb45236f7fa02d1df6ffcd25f4e7d9d5
BLAKE2b-256 49d365a27fdd11bab60930dca53ab1d0c0573eef11261a2cd00696591185c584

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page