# Your answer here.판다와의 고급 랭글링

토마스 보젠, 2020년 9월
이 연습은 9장을 보완합니다.
연습
1.
이 연습 연습 세트에서는 정보는 아름답다에서 수집 및 컴파일된 실제 비밀번호(실제 데이터 유출에서 사용 가능)로 구성된 멋진 데이터세트를 살펴보겠습니다. R의 Tidy Tuesday 프로젝트. 이러한 비밀번호는 사용을 피해야 하는 일반적인(“잘못된”) 비밀번호입니다! 하지만 우리는 이 데이터 세트를 사용하여 정규식 기술을 연습할 것입니다.
’pd’라는 별칭을 사용하여 팬더를 가져오는 것부터 시작해 보겠습니다.
2.
데이터세트에는 다음과 같은 열이 있습니다.
| 변수 | 클래스 | 설명 |
|---|---|---|
| 순위 | 정수 | 공개된 비밀번호 데이터베이스의 인기도 |
| 비밀번호 | str | 비밀번호의 실제 텍스트 |
| 범주 | str | 비밀번호는 어떤 카테고리에 속하나요? |
| 값 | 부동 소수점 | 온라인 추측으로 문제를 풀 시간 |
| time_unit | str | 값과 일치시킬 시간 단위 |
| offline_crack_sec | 플로트 | 단 몇 초 만에 오프라인 크랙 완료 |
| 순위_alt | 정수 | 2위 |
| 강도 | 정수 | 강도 = 비밀번호 품질은 10이 가장 높고 1이 가장 낮습니다. 이는 일반적으로 잘못된 비밀번호와 관련이 있다는 점에 유의하세요. |
| 글꼴_크기 | 정수 | KIB용 그래픽을 만드는 데 사용됨 |
이 연습에서는 password, value 및 time_unit 열에만 관심이 있으므로 이 두 열만 다음 URL에서 df라는 데이터 프레임으로 가져옵니다: https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-14/passwords.csv
# Your answer here.3.
온라인 비밀번호 공격은 누군가가 귀하의 계정에 액세스하기 위해 매우 많은 수의 사용자 이름/비밀번호 조합을 시도하여 귀하의 계정을 해킹하려고 시도하는 것입니다. 데이터세트의 각 ‘비밀번호’에 대해 ’값’ 열에는 ‘온라인 비밀번호 공격’으로 계정을 해킹하는 데 걸리는 예상 시간이 표시됩니다. ’time_unit’ 열에는 해당 시간 값의 단위(예: 시간, 일, 연도 등)가 표시됩니다.
각 비밀번호에 대한 “온라인 비밀번호 추측 시간”을 더 쉽게 비교할 수 있도록 ’값’이 동일한 단위이면 훨씬 더 좋을 것입니다. 따라서 첫 번째 작업은 모든 값을 시간 단위로 변환하는 것입니다(아래에 제공한 변환 단위를 가정합니다. 예를 들어 1일은 24시간, 1주는 168시간 등).
units = {
"seconds": 1 / 3600,
"minutes": 1 / 60,
"days": 24,
"weeks": 168,
"months": 720,
"years": 8760,
}# Your answer here.4.
’123’으로 시작하는 비밀번호는 몇 개입니까?
# Your answer here.5.
’123’으로 시작하는 비밀번호를 해독하는 데 필요한 평균 시간(시간)은 얼마입니까? 이는 데이터 세트에 있는 모든 비밀번호의 평균과 어떻게 비교됩니까?
# Your answer here.6.
숫자가 포함되지 않은 비밀번호는 몇 개입니까?
# Your answer here.7.
숫자가 하나 이상 포함된 비밀번호는 몇 개입니까?
# Your answer here.8.
숫자가 포함되지 않은 비밀번호와 하나 이상의 숫자가 포함된 비밀번호 사이에 온라인 크래킹 시간에 뚜렷한 차이가 있습니까?
# Your answer here.9.
다음 구두점 [.!?\\-] 중 하나 이상을 포함하는 비밀번호는 몇 개입니까? (힌트: 이 데이터 세트에는 약한 비밀번호가 포함되어 있다는 것을 기억하세요…)
# Your answer here.10.
데이터 세트에서 온라인 추측을 통해 해독하는 데 가장 짧은 시간이 걸린 비밀번호는 무엇입니까? 어느 것이 가장 오래 걸렸나요?
# Your answer here.솔루션
1.
이 연습 연습 세트에서는 정보는 아름답다에서 수집 및 컴파일된 실제 비밀번호(실제 데이터 유출에서 사용 가능)로 구성된 멋진 데이터세트를 살펴보겠습니다. R의 Tidy Tuesday 프로젝트. 이러한 비밀번호는 사용을 피해야 하는 일반적인(“잘못된”) 비밀번호입니다! 하지만 우리는 이 데이터 세트를 사용하여 정규식 기술을 연습할 것입니다.
’pd’라는 별칭을 사용하여 팬더를 가져오는 것부터 시작해 보겠습니다.
import pandas as pd2.
데이터세트에는 다음과 같은 열이 있습니다.
| 변수 | 클래스 | 설명 |
|---|---|---|
| 순위 | 정수 | 공개된 비밀번호 데이터베이스의 인기도 |
| 비밀번호 | str | 비밀번호의 실제 텍스트 |
| 범주 | str | 비밀번호는 어떤 카테고리에 속하나요? |
| 값 | 부동 소수점 | 온라인 추측으로 문제를 풀 시간 |
| time_unit | str | 값과 일치시킬 시간 단위 |
| offline_crack_sec | 플로트 | 단 몇 초 만에 오프라인 크랙 완료 |
| 순위_alt | 정수 | 2위 |
| 강도 | 정수 | 강도 = 비밀번호 품질은 10이 가장 높고 1이 가장 낮습니다. 이는 일반적으로 잘못된 비밀번호와 관련이 있다는 점에 유의하세요. |
| 글꼴_크기 | 정수 | KIB용 그래픽을 만드는 데 사용됨 |
이 연습에서는 password, value 및 time_unit 열에만 관심이 있으므로 이 두 열만 다음 URL에서 df라는 데이터 프레임으로 가져옵니다: https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-14/passwords.csv
df = pd.read_csv(
"https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-14/passwords.csv",
usecols=["password", "value", "time_unit"],
skipfooter=7,
engine="python",
)
df.head()| password | value | time_unit | |
|---|---|---|---|
| 0 | password | 6.91 | years |
| 1 | 123456 | 18.52 | minutes |
| 2 | 12345678 | 1.29 | days |
| 3 | 1234 | 11.11 | seconds |
| 4 | qwerty | 3.72 | days |
3.
온라인 비밀번호 공격은 누군가가 귀하의 계정에 액세스하기 위해 매우 많은 수의 사용자 이름/비밀번호 조합을 시도하여 귀하의 계정을 해킹하려고 시도하는 것입니다. 데이터세트의 각 ‘비밀번호’에 대해 ’값’ 열에는 ‘온라인 비밀번호 공격’으로 계정을 해킹하는 데 걸리는 예상 시간이 표시됩니다. ’time_unit’ 열에는 해당 시간 값의 단위(예: 시간, 일, 연도 등)가 표시됩니다.
각 비밀번호에 대한 “온라인 비밀번호 추측 시간”을 더 쉽게 비교할 수 있도록 ’값’이 동일한 단위이면 훨씬 더 좋을 것입니다. 따라서 첫 번째 작업은 모든 값을 시간 단위로 변환하는 것입니다(아래에 제공한 변환 단위를 가정합니다. 예를 들어 1일은 24시간, 1주는 168시간 등).
units = {
"seconds": 1 / 3600,
"minutes": 1 / 60,
"days": 24,
"weeks": 168,
"months": 720,
"years": 8760,
}
for key, val in units.items():
df.loc[df["time_unit"] == key, "value"] *= val
df["time_unit"] = "hours"
df.head()| password | value | time_unit | |
|---|---|---|---|
| 0 | password | 60531.600000 | hours |
| 1 | 123456 | 0.308667 | hours |
| 2 | 12345678 | 30.960000 | hours |
| 3 | 1234 | 0.003086 | hours |
| 4 | qwerty | 89.280000 | hours |
4.
’123’으로 시작하는 비밀번호는 몇 개입니까?
df["password"].str.contains(r"^123").sum()9
5.
’123’으로 시작하는 비밀번호를 해독하는 데 필요한 평균 시간(시간)은 얼마입니까? 이는 데이터 세트에 있는 모든 비밀번호의 평균과 어떻게 비교됩니까?
print(
f"Avg. time to crack passwords beginning with 123: {df[df['password'].str.contains(r'^123')]['value'].mean():.0f} hrs"
)
print(f"Avg. time to crack for all passwords in dataset: {df['value'].mean():.0f} hrs")Avg. time to crack passwords beginning with 123: 107 hrs
Avg. time to crack for all passwords in dataset: 13918 hrs
6.
숫자가 포함되지 않은 비밀번호는 몇 개입니까?
df[df["password"].str.contains(r"^[^0-9]*$")].head()| password | value | time_unit | |
|---|---|---|---|
| 0 | password | 60531.60 | hours |
| 4 | qwerty | 89.28 | hours |
| 6 | dragon | 89.28 | hours |
| 7 | baseball | 60531.60 | hours |
| 8 | football | 60531.60 | hours |
7.
숫자가 하나 이상 포함된 비밀번호는 몇 개입니까?
df[df["password"].str.contains(r".*[0-9].*")].head()| password | value | time_unit | |
|---|---|---|---|
| 1 | 123456 | 0.308667 | hours |
| 2 | 12345678 | 30.960000 | hours |
| 3 | 1234 | 0.003086 | hours |
| 5 | 12345 | 0.030833 | hours |
| 11 | 696969 | 0.308667 | hours |
8.
숫자가 포함되지 않은 비밀번호와 하나 이상의 숫자가 포함된 비밀번호 사이에 온라인 크래킹 시간에 뚜렷한 차이가 있습니까?
print(
f" Avg. time to crack passwords without a number: {df[df['password'].str.contains(r'^[^0-9]*$')]['value'].mean():.0f} hrs"
)
print(
f"Avg. time to crack passwords with at least one number: {df[df['password'].str.contains(r'.*[0-9].*')]['value'].mean():.0f} hrs"
) Avg. time to crack passwords without a number: 8095 hrs
Avg. time to crack passwords with at least one number: 62005 hrs
9.
다음 구두점 [.!?\\-] 중 하나 이상을 포함하는 비밀번호는 몇 개입니까? (힌트: 이 데이터 세트에는 약한 비밀번호가 포함되어 있다는 것을 기억하세요…)
df[df["password"].str.contains(r"[.!?\\-]")]| password | value | time_unit |
|---|
10.
데이터 세트에서 온라인 추측을 통해 해독하는 데 가장 짧은 시간이 걸린 비밀번호는 무엇입니까? 어느 것이 가장 오래 걸렸나요?
df.query("value == value.min()")| password | value | time_unit | |
|---|---|---|---|
| 3 | 1234 | 0.003086 | hours |
| 19 | 2000 | 0.003086 | hours |
| 44 | 6969 | 0.003086 | hours |
| 76 | 1111 | 0.003086 | hours |
| 276 | 5150 | 0.003086 | hours |
| 314 | 2112 | 0.003086 | hours |
| 315 | 1212 | 0.003086 | hours |
| 324 | 7777 | 0.003086 | hours |
| 371 | 2222 | 0.003086 | hours |
| 373 | 4444 | 0.003086 | hours |
| 429 | 1313 | 0.003086 | hours |
df.query("value == value.max()")| password | value | time_unit | |
|---|---|---|---|
| 25 | trustno1 | 808285.2 | hours |
| 335 | rush2112 | 808285.2 | hours |
| 405 | jordan23 | 808285.2 | hours |
| 499 | passw0rd | 808285.2 | hours |