Практика 1. Введение в BigData
Базовые операции и знакомство с форматом работы.
Edit on GitHubWiki-версия
Материал полностью перенесен в документацию. Исходный ноутбук удален из репозитория.
Минькин Александр Дмитривеич - ИКБО-25-22
Практическая работа №1
-
Установить Python, если это не было сделано ранее.
-
Написать программу, которая вычисляет площадь фигуры, параметры которой подаются на вход. Фигуры, которые подаются на вход: треугольник, прямоугольник, круг. Результатом работы является словарь, где ключ – это название фигуры, а значение – это площадь.
import math
def calculate_areas(figures):
"""
figures — список словарей с параметрами фигур, пример:
[
{'type': 'треугольник', 'base': 10, 'height': 5},
{'type': 'прямоугольник', 'width': 4, 'height': 6},
{'type': 'круг', 'radius': 3}
]
Возвращает словарь {название_фигуры: площадь}.
"""
areas = {}
for fig in figures:
shape = fig.get('type').lower()
if shape == 'треугольник':
base = fig.get('base')
height = fig.get('height')
if base is not None and height is not None:
area = 0.5 * base * height
areas['треугольник'] = area
elif shape == 'прямоугольник':
width = fig.get('width')
height = fig.get('height')
if width is not None and height is not None:
area = width * height
areas['прямоугольник'] = area
elif shape == 'круг':
radius = fig.get('radius')
if radius is not None:
area = math.pi * radius ** 2
areas['круг'] = area
return areas
# Пример использования:
figures = [
{'type': 'треугольник', 'base': 10, 'height': 5},
{'type': 'прямоугольник', 'width': 4, 'height': 6},
{'type': 'круг', 'radius': 3}
]
result = calculate_areas(figures)
print(result)
# Вывод: {'треугольник': 25.0, 'прямоугольник': 24, 'круг': 28.274333882308138}Вывод:
{'треугольник': 25.0, 'прямоугольник': 24, 'круг': 28.274333882308138}- Написать программу, которая на вход получает два числа и операцию, которую к ним нужно применить. Должны быть реализованы следующие операции: +, -, /, //, abs – модуль, pow или ** – возведение в степень.
def calculator(a, b, operation):
if operation == '+':
return a + b
elif operation == '-':
return a - b
elif operation == '/':
if b == 0:
return "Ошибка: деление на ноль"
return a / b
elif operation == '//':
if b == 0:
return "Ошибка: деление на ноль"
return a // b
elif operation == 'abs':
# Игнорируем b, возвращаем модуль a
return abs(a)
elif operation == 'pow' or operation == '**':
return a ** b
else:
return "Ошибка: неизвестная операция"
# Пример использования:
a = float(input("Введите первое число: "))
b = float(input("Введите второе число: "))
operation = input("Введите операцию (+, -, /, //, abs, pow, **): ")
result = calculator(a, b, operation)
print("Результат:", result)Вывод:
Введите первое число: 5
Введите второе число: 4
Введите операцию (+, -, /, //, abs, pow, **): //
Результат: 1.0- Напишите программу, которая считывает с консоли числа (по одному в строке) до тех пор, пока сумма введённых чисел не будет равна 0 и после этого выводит сумму квадратов всех считанных чисел.
def sum_squares_until_zero_sum():
numbers = []
total_sum = 0
while True:
try:
num = float(input("Введите число: "))
except ValueError:
print("Ошибка: введите корректное число.")
continue
numbers.append(num)
total_sum += num
if total_sum == 0:
break
sum_of_squares = sum(x**2 for x in numbers)
print("Сумма квадратов введённых чисел:", sum_of_squares)
# Запуск функции
sum_squares_until_zero_sum()Вывод:
Введите число: 3
Введите число: -3
Сумма квадратов введённых чисел: 18.0- Напишите программу, которая выводит последовательность чисел, длинною N, где каждое число повторяется столько раз, чему оно равно. На вход программе передаётся неотрицательное целое число N. Например, если N = 7, то программа должна вывести 1 2 2 3 3 3 4. Вывод элементов списка через пробел – print(*list).
def generate_sequence(N):
result = []
num = 1
while len(result) < N:
result.extend([num] * num)
num += 1
# Ограничиваем длину последовательности ровно N элементами
return result[:N]
# Чтение входного значения
N = int(input("Введите неотрицательное целое число N: "))
sequence = generate_sequence(N)
print(*sequence)Вывод:
Введите неотрицательное целое число N: 7
1 2 2 3 3 3 4Даны два списка:
А = [1, 2, 3, 4, 2, 1, 3, 4, 5, 6, 5, 4, 3, 2]
В = [‘a’, ’b’, ’c’, ’c’, ’c’, ’b’, ’a’, ’c’, ’a’, ’a’, ’b’, ’c’, ’b’, ’a’]
Создать словарь, в котором ключи – это содержимое списка В, а значения для ключей словаря – это сумма всех элементов списка А в соответствии с буквой, содержащийся на той же позиции в списке В.
Пример результата программы: {‘a’ : 10, ‘b’ : 15, ‘c’ : 6}.
A = [1, 2, 3, 4, 2, 1, 3, 4, 5, 6, 5, 4, 3, 2]
B = ['a', 'b', 'c', 'c', 'c', 'b', 'a', 'c', 'a', 'a', 'b', 'c', 'b', 'a']
result = {}
for key, value in zip(B, A):
result[key] = result.get(key, 0) + value
print(result)Вывод:
{'a': 17, 'b': 11, 'c': 17}Скачать и загрузить данные о стоимости домов в калифорнии, используя библиотеку sklearn.
-
Использовать метод info().
-
Узнать, есть ли пропущенные значения, используя isna().sum().
-
Вывести записи, где средний возраст домов в районе более 50 лет и население более 2500 человек, используя метод loc().
-
Узнать максимальное и минимальное значения медианной стоимости дома.
-
Используя метод apply(), вывести на экран название признака и его среднее значение.
-
Составить отчет о проделанной работе. В отчете должен быть представлен код и результаты его выполнения с выводами.
-
Данные о стоимости домов в Калифорнии успешно загружены с использованием sklearn.datasets.fetch_california_housing с параметром as_frame=True для удобной работы с pandas DataFrame.
-
Метод info() предоставил сведения о структуре данных: количество строк (20640), типы столбцов и отсутствие пропущенных значений.
-
Проверка на пропущенные значения с помощью isna().sum() подтвердила, что данные полные, без отсутствующих значений.
-
Отфильтрованы записи районов с домами старше 50 лет и населением свыше 2500 человек, что позволяет выделить специфические участки для дополнительного анализа.
-
Найдены максимальное и минимальное значение целевой переменной — медианной стоимости дома, что дает ориентировку по разбросу цен.
-
Использование apply() помогло быстро вывести средние значения всех признаков для общего понимания их распределения.
Эти шаги создают прочную основу для дальнейшего анализа с использованием методов машинного обучения или углубленной статистики.
import pandas as pd
from sklearn.datasets import fetch_california_housing
# Загрузка данных с признаком as_frame=True для получения DataFrame сразу
housing = fetch_california_housing(as_frame=True)
df = housing.frame # pandas DataFrame с признаками и целевой переменной
# 8. Использовать метод info()
print("Информация о DataFrame:")
df.info()
print("\n")
# 9. Узнать, есть ли пропущенные значения (NaN)
print("Сумма пропущенных значений по столбцам:")
print(df.isna().sum())
print("\n")
# 10. Вывести записи, где средний возраст домов > 50 лет и население > 2500 человек
print("Записи с HouseAge > 50 и Population > 2500:")
filtered = df.loc[(df['HouseAge'] > 50) & (df['Population'] > 2500)]
print(filtered)
print("\n")
# 11. Максимальное и минимальное значение медианной стоимости дома
max_price = df['MedHouseVal'].max()
min_price = df['MedHouseVal'].min()
print(f"Максимальная медианная стоимость дома: {max_price}")
print(f"Минимальная медианная стоимость дома: {min_price}")
print("\n")
# 12. С использованием apply() вывести название признака и его среднее значение
print("Средние значения признаков:")
def print_mean(column):
print(f"{column.name}: {column.mean():.3f}")
df.apply(print_mean)Вывод:
Информация о DataFrame:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 MedInc 20640 non-null float64
1 HouseAge 20640 non-null float64
2 AveRooms 20640 non-null float64
3 AveBedrms 20640 non-null float64
4 Population 20640 non-null float64
5 AveOccup 20640 non-null float64
6 Latitude 20640 non-null float64
7 Longitude 20640 non-null float64
8 MedHouseVal 20640 non-null float64
dtypes: float64(9)
memory usage: 1.4 MB
Сумма пропущенных значений по столбцам:
MedInc 0
HouseAge 0
AveRooms 0
AveBedrms 0
Population 0
AveOccup 0
Latitude 0
Longitude 0
MedHouseVal 0
dtype: int64
Записи с HouseAge > 50 и Population > 2500:
MedInc HouseAge AveRooms AveBedrms Population AveOccup \
460 1.4012 52.0 3.105714 1.060000 3337.0 9.534286
4131 3.5349 52.0 4.646119 1.047945 2589.0 5.910959
4440 2.6806 52.0 4.806283 1.057592 3062.0 4.007853
5986 1.8750 52.0 4.500000 1.206349 2688.0 21.333333
7369 3.1901 52.0 4.730942 1.017937 3731.0 4.182735
8227 2.3305 52.0 3.488860 1.170380 3018.0 3.955439
13034 6.1359 52.0 8.275862 1.517241 6675.0 230.172414
15634 1.8295 52.0 2.628169 1.053521 2957.0 4.164789
15652 0.9000 52.0 2.237474 1.053535 3260.0 2.237474
15657 2.5166 52.0 2.839075 1.184049 3436.0 1.621520
15659 1.7240 52.0 2.278566 1.082348 4518.0 1.780142
15795 2.5755 52.0 3.402576 1.058776 2619.0 2.108696
15868 2.8135 52.0 4.584329 1.041169 2987.0 3.966799
Latitude Longitude MedHouseVal
460 37.87 -122.26 1.75000
4131 34.13 -118.20 1.93600
4440 34.08 -118.21 1.53000
5986 34.10 -117.71 2.12500
7369 33.97 -118.21 1.67600
8227 33.78 -118.20 1.62500
13034 38.69 -121.15 2.25000
15634 37.80 -122.41 2.43800
15652 37.80 -122.41 5.00001
15657 37.79 -122.41 2.75000
15659 37.79 -122.41 2.25000
15795 37.77 -122.42 3.25000
15868 37.76 -122.41 2.60300
Максимальная медианная стоимость дома: 5.00001
Минимальная медианная стоимость дома: 0.14999
Средние значения признаков:
MedInc: 3.871
HouseAge: 28.639
AveRooms: 5.429
AveBedrms: 1.097
Population: 1425.477
AveOccup: 3.071
Latitude: 35.632
Longitude: -119.570
MedHouseVal: 2.069
MedInc None
HouseAge None
AveRooms None
AveBedrms None
Population None
AveOccup None
Latitude None
Longitude None
MedHouseVal None
dtype: object1.*
Дан текст на английском языке. Необходимо закодировать его с
помощью азбуки Морзе, где каждой букве соответствует
последовательность точек и тире. Например, буква «g» превратится в
строку «--.». В переменной morze для удобства хранится словарь
соответствия латинских букв коду Морзе.
morze = {'a': '.-', 'b': '-…', 'c': '-.-.', 'd': '-..',
'e': '.', 'f': '..-.', 'g': '--.', 'h': '….',
'i': '..', 'j': '.---', 'k': '-.-', 'l': '.-..',
'm': '--', 'n': '-.', 'o': '---', 'p': '.--.',
'q': '--.-', 'r': '.-.', 's': '…', 't': '-',
'u': '..-', 'v': '…-', 'w': '.--', 'x': '-..-',
'y': '-.--', 'z': '--..'} На входе: В одной строке вам дан текст, который состоит из латинских букв и пробелов.
На выходе:Выведите каждое слово исходного текста, закодированное азбукой
Морзе. Количество строк в ответе должно совпадать с количеством слов
в исходном тексте. Между закодированными буквами ставится ровно
один пробел. Например, слово «Help» превратится в «.... . .-.. .--.».
Строчные и заглавные буквы кодируются одинаково.
Ignition sequence start
.. --. -. .. - .. --- -.
… . --.- ..- . -. -.-. .
… - .- .-. -morze = {
'a': '.-', 'b': '-...', 'c': '-.-.', 'd': '-..', 'e': '.', 'f': '..-.',
'g': '--.', 'h': '....', 'i': '..', 'j': '.---', 'k': '-.-', 'l': '.-..',
'm': '--', 'n': '-.', 'o': '---', 'p': '.--.', 'q': '--.-', 'r': '.-.',
's': '...', 't': '-', 'u': '..-', 'v': '...-', 'w': '.--', 'x': '-..-',
'y': '-.--', 'z': '--..'
}
text = input().strip()
words = text.split()
for word in words:
encoded_letters = [morze[char.lower()] for char in word if char.lower() in morze]
print(' '.join(encoded_letters))Вывод:
Ignition sequence start
.. --. -. .. - .. --- -.
... . --.- ..- . -. -.-. .
... - .- .-. -В некотором городе открывается новая служба по доставке электронных писем.
Необходимо наладить систему регистрации новых пользователей.
Регистрация должна работать следующим образом: если новый пользователь хочет зарегистрироваться на сайте, то он должен послать системе запрос name со своим именем. Система должна определить, существует ли уже такое имя в базе данных. Если такого имени не существует, то оно заносится в базу данных системы и пользователю возвращается ответ "ОК", подтверждающий успешную регистрацию. А если пользователь с таким именем уже существует, то система должна сформировать новое имя и выдать его пользователю в качестве подсказки, при этом сама подсказка также добавляется в базу данных. Новое имя формируется следующим образом: к name последовательно приписываются числа, начиная с 1 (name1, name2 и так далее), и среди них находят такое наименьшее i, что namei еще не содержится в системе.
Входные данныеВ первой строке входных данных задано число n (1 ≤ n ≤ 100000).
Следующие n строк содержат запросы к системе. Каждый запрос представляет собой непустую строку длиной не более 32 символов, состоящую только из строчных букв латинского алфавита.
Выходные данныеВ выходных данных должно содержаться n строк – ответы системы на запросы: "OK" в случае успешной регистрации, или подсказка с новым именем, если запрашиваемое уже занято.
Данные для проверки:| Вход: | Выход: |
|---|---|
| 3 b b b | OK b1 b2 |
| 10 bhnqaptmp bhnqaptmp bhnqaptmp bhnqaptmp bhnqaptmp bhnqaptmp bhnqaptmp bhnqaptmp bhnqaptmp bhnqaptmp | OK bhnqaptmp1 bhnqaptmp2 bhnqaptmp3 bhnqaptmp4 bhnqaptmp5 bhnqaptmp6 bhnqaptmp7 bhnqaptmp8 bhnqaptmp9 |
| 10 fpqhfouqdldravpjttarh fpqhfouqdldravpjttarh fpqhfouqdldravpjttarh fpqhfouqdldravpjttarh fpqhfouqdldravpjttarh fpqhfouqdldravpjttarh jmvplnrmba fpqhfouqdldravpjttarh jmvplnrmba fpqhfouqdldravpjttarh | OK fpqhfouqdldravpjttarh1 fpqhfouqdldravpjttarh2 fpqhfouqdldravpjttarh3 fpqhfouqdldravpjttarh4 fpqhfouqdldravpjttarh5 OK fpqhfouqdldravpjttarh6 jmvplnrmba1 fpqhfouqdldravpjttarh7 |
def registration_system():
n = int(input())
database = {}
for _ in range(n):
name = input().strip()
if name not in database:
# Имя уникально
database[name] = 0
print("OK")
else:
# Имя занято, ищем новое с суффиксом
database[name] += 1
new_name = name + str(database[name])
# Далее убеждаемся, что new_name тоже уникально
while new_name in database:
database[name] += 1
new_name = name + str(database[name])
database[new_name] = 0
print(new_name)
# Вызов функции
registration_system()Вывод:
3
b
OK
b
b1
b
b2Необходимо создать программу обработки запросов пользователей к
файловой системе компьютера. Над каждым файлом можно производить
следующие действия: запись – w ("write"), чтение – r ("read"), запуск – x ("execute").
На вход программе подаются следующие параметры: число n –
количество файлов в файловой системе. В следующих n строках
содержится информация с именами файлов и допустимыми действиями
(w, x, r), разделенных пробелами. Далее идет число m – количество
запросов к файлам вида «операция файл» (обозначение операции:
"write", "read", "execute").
Для каждого допустимого запроса программа должна возвращать OK,
для недопустимого – Access denied.
| Вход: | Выход: |
|---|---|
| 3 python.exe x book.txt r w notebook.exe r w x 5 read python.exe read book.txt write notebook.exe execute notebook.exe write book.txt | Access denied OK OK OK OK |
| 3 root.html r w x main.py x login.txt w r 4 read root.html write main.py execute main.py execute login.txt | OK Access denied OK Access denied |
| 2 1.txt 2.txt 2 write 1.txt execute 2.txt | Access denied Access denied |
def file_system_access():
n = int(input())
permissions = {}
# Чтение информации о файлах и их правах доступа
for _ in range(n):
line = input().strip().split()
filename = line[0]
allowed = set(line[1:]) if len(line) > 1 else set()
permissions[filename] = allowed
m = int(input())
op_map = {'write': 'w', 'read': 'r', 'execute': 'x'}
# Обработка запросов
for _ in range(m):
operation, filename = input().split()
op_code = op_map.get(operation)
if op_code and filename in permissions and op_code in permissions[filename]:
print("OK")
else:
print("Access denied")
file_system_access() # Запуск функцииВывод:
3
python.exe x
book.txt r w
notebook.exe r w x
5
read python.exe
Access denied
read book.txt
OK
write notebook.exe
OK
execute notebook.exe
OK
write book.txt
OK