Практика 1. Введение в BigData

Базовые операции и знакомство с форматом работы.

Edit on GitHub

Wiki-версия

Материал полностью перенесен в документацию. Исходный ноутбук удален из репозитория.

Минькин Александр Дмитривеич - ИКБО-25-22

Практическая работа №1

  1. Установить Python, если это не было сделано ранее.

  2. Написать программу, которая вычисляет площадь фигуры, параметры которой подаются на вход. Фигуры, которые подаются на вход: треугольник, прямоугольник, круг. Результатом работы является словарь, где ключ – это название фигуры, а значение – это площадь.

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}

Вывод:

text
{'треугольник': 25.0, 'прямоугольник': 24, 'круг': 28.274333882308138}
  1. Написать программу, которая на вход получает два числа и операцию, которую к ним нужно применить. Должны быть реализованы следующие операции: +, -, /, //, abs – модуль, pow или ** – возведение в степень.
python
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)

Вывод:

text
Введите первое число: 5
Введите второе число: 4
Введите операцию (+, -, /, //, abs, pow, **): //
Результат: 1.0
  1. Напишите программу, которая считывает с консоли числа (по одному в строке) до тех пор, пока сумма введённых чисел не будет равна 0 и после этого выводит сумму квадратов всех считанных чисел.
python
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()

Вывод:

text
Введите число: 3
Введите число: -3
Сумма квадратов введённых чисел: 18.0
  1. Напишите программу, которая выводит последовательность чисел, длинною N, где каждое число повторяется столько раз, чему оно равно. На вход программе передаётся неотрицательное целое число N. Например, если N = 7, то программа должна вывести 1 2 2 3 3 3 4. Вывод элементов списка через пробел – print(*list).
python
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)

Вывод:

text
Введите неотрицательное целое число 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}.

python
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)

Вывод:

text
{'a': 17, 'b': 11, 'c': 17}

Скачать и загрузить данные о стоимости домов в калифорнии, используя библиотеку sklearn.

  1. Использовать метод info().

  2. Узнать, есть ли пропущенные значения, используя isna().sum().

  3. Вывести записи, где средний возраст домов в районе более 50 лет и население более 2500 человек, используя метод loc().

  4. Узнать максимальное и минимальное значения медианной стоимости дома.

  5. Используя метод apply(), вывести на экран название признака и его среднее значение.

  6. Составить отчет о проделанной работе. В отчете должен быть представлен код и результаты его выполнения с выводами.

Отчёт о проделанной работе:
  • Данные о стоимости домов в Калифорнии успешно загружены с использованием sklearn.datasets.fetch_california_housing с параметром as_frame=True для удобной работы с pandas DataFrame.

  • Метод info() предоставил сведения о структуре данных: количество строк (20640), типы столбцов и отсутствие пропущенных значений.

  • Проверка на пропущенные значения с помощью isna().sum() подтвердила, что данные полные, без отсутствующих значений.

  • Отфильтрованы записи районов с домами старше 50 лет и населением свыше 2500 человек, что позволяет выделить специфические участки для дополнительного анализа.

  • Найдены максимальное и минимальное значение целевой переменной — медианной стоимости дома, что дает ориентировку по разбросу цен.

  • Использование apply() помогло быстро вывести средние значения всех признаков для общего понимания их распределения.

Эти шаги создают прочную основу для дальнейшего анализа с использованием методов машинного обучения или углубленной статистики.

python
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)

Вывод:

text
Информация о 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: object

1.*
Дан текст на английском языке. Необходимо закодировать его с помощью азбуки Морзе, где каждой букве соответствует последовательность точек и тире. Например, буква «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

Перевод
.. --. -. .. - .. --- -.  
… . --.- ..- . -. -.-. .
… - .- .-. -
python
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))

Вывод:

text
Ignition sequence start
.. --. -. .. - .. --- -.
... . --.- ..- . -. -.-. .
... - .- .-. -
2.*

В некотором городе открывается новая служба по доставке электронных писем.

Необходимо наладить систему регистрации новых пользователей.

Регистрация должна работать следующим образом: если новый пользователь хочет зарегистрироваться на сайте, то он должен послать системе запрос 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
python
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()

Вывод:

text
3
b
OK
b
b1
b
b2
3.*

Необходимо создать программу обработки запросов пользователей к файловой системе компьютера. Над каждым файлом можно производить следующие действия: запись – 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
python
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()  # Запуск функции

Вывод:

text
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