# Лабораторная работа 3.1

## Счастливый билетик



Билет считается счастливым, если выполнено следующее условие: сумма первых трёх цифр номера равна сумме последних трёх цифр.

**Задание:**

1) Определите число `ticket_number` — шестизначный номер билета;

2) Напишите код, который по шестизначному номеру `ticket_number` билетика проверяет, является ли он счастливым;

3) Если номер счастливый, выведите строку `Yes`, иначе — `No`.

---

**Пример 1:**

*Input:* 123456

*Output:* No


**Пример 2:**

*Input:* 123042

*Output:* Yes


```python
ticket_number = 123042
```


```python
ticket_number = list(map(int, str(ticket_number)))
if sum(ticket_number[0:3]) == sum(ticket_number[3:]):
    print('Yes')
else:
    print('No')
```

    Yes


## Пароль



Пусть пароль может содержать только латинские буквы, знаки препинания и цифры.

Пароль считается надёжным, если удовлетворяет следующим условиям:
- содержит буквы в разных регистрах;
- содержит цифры;
- содержит не менее `4` уникальных символов;
- не содержит ваше имя латинницей, записанное буквами любых регистров (anna, iVan, ...).

Иначе пароль считается слабым.

**Задание:**

1) Определите строку `password` — придуманный вами пароль;

2) Напишите код, который по паролю `password` проверяет, является ли он надёжным;

3) Если пароль надёжный, выведите строку `strong`, иначе — `weak`.


---

Пусть имя пользоватея -- Андрей.

**Пример 1:**

*Input:* Aandrei123

*Output:* weak


**Пример 2:**

*Input:* an12dRei

*Output:* strong


```python
password = 'Qwerty123'
```


```python
k = password.lower().count("andrei")
if k == 0:
    uq = set(password)
    lower_flag = False
    upper_flag = False
    digit_flag = False
    for char in uq:
        if char.islower():
            lower_flag = True
        if char.isupper():
            upper_flag = True
        if char.isdigit():
            digit_flag = True
    if len(uq) >= 4 and lower_flag and upper_flag and digit_flag:
        print('strong')
    else:
        print('weak')
else:
    print('weak')
```

    strong


## Числа Фибоначчи
Как известно, [числа Фибоначчи](https://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B0_%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8) — это последовательность чисел, каждое из которых равно сумме двух предыдущих (первые два числа равны $1$):
$$
    1, 1, 2, 3, 5, 8, 13, \ldots
$$

**Задание:**

1) Определите число `amount` — количество чисел Фибоначчи, которые надо вывести;

2) Напишите код, который выводит первые `amount` чисел Фибоначчи.

---

**Пример 1:**

*Input:* 3

*Output:* 1 1 2


**Пример 2:**

*Input:* 10

*Output:* 1 1 2 3 5 8 13 21 34 55



```python
amount = 10
```


```python
a = 1
b = 1
for i in range(amount):
    print(a, end=" ")
    c = a
    a = b
    b = b + c
```

    1 1 2 3 5 8 13 21 34 55 

## Время исследований



На сайте https://www.kaggle.com/ выберите любой набор данных в формате CSV и проведите для него маленькое исследование: загрузите данные из набора с использованием стандартного модуля `csv`, посмотрите средние значения и стандартные отклонения двух выбранных числовых атрибутов, найдите [методом наименьших квадратов](https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BD%D0%B0%D0%B8%D0%BC%D0%B5%D0%BD%D1%8C%D1%88%D0%B8%D1%85_%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BE%D0%B2) уравнение линейной зависимости, связывающей один числовой атрибут с другим. Для оценки заданной зависимости найдите [коэффициент парной корреляции](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D1%80%D0%B5%D0%BB%D1%8F%D1%86%D0%B8%D1%8F), сделайте соответствующие выводы.

**Результаты надо обязательно прокомментировать и пояснить!**

---

**Пример 1:**

Пусть таблица `bikes.csv` содержит данные по арендам велосипедов за $2$ года:
- `datetime`: дата и время аренды
- `season`: время года
- `temp`: температура воздуха по Цельсию
- `windspeed`: скорость ветра 
- `registered`: число аренд

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



Пусть таблица `dataset.csv` содержит данные о сделках с криптовалютой биткоин за $2014-2021$ год:

- `Date`: дата
- `Open`: цена первой сделки торгового дня
- `High`: максимальная цена за торговый день
- `Low`: минимальная цена в течение торгового дня 
- `Close`: цена последней сделки торгового дня
- `Adj Close`: цена закрытия, скорректированная для отражения стоимости после учета любых корпоративных действий
- `Volume`: количество единиц, торгуемых за день

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

Количества единиц, торгуемых за день - независимая - X

Цена последней сделки торгового дня - зависимая - Y


```python
# Функция для опредления является ли строка вещественным числом

def is_number(str):
    try:
        float(str)
        return True
    except ValueError:
        return False

```


```python
# Считываем данным из файла
# Считываются только числовые значения
# 4 столбец - цена закрытия
# 6 столбец - объём торгов

data = open('dataset.csv', 'r')
df = []
for line in data:
    temp = line.replace('\n', '')
    temp = temp.split(',')
    if is_number(temp[4]):
        df.append((float(temp[4]), float(temp[6])))
```

Уравнение параболической регрессии имеет вид:

\begin{equation}
y = a_0 + a_1x + a_2x^2
\end{equation}

Для нахождения коэффициентов параболы необходимо решить систему уравнений:

\begin{equation}
\left \{ \begin{aligned}
& a_0n+a_1 \sum_{i=1}^{n} x_i+a_2 \sum_{i=1}^{n} x_i^2= \sum_{i=1}^{n} y_i\\
& a_0\sum_{i=1}^{n} x_i+a_1 \sum_{i=1}^{n} x_i^2+a_2 \sum_{i=1}^{n} x_i^3= \sum_{i=1}^{n} y_ix_i\\
& a_0\sum_{i=1}^{n} x_i^2+a_1 \sum_{i=1}^{n} x_i^3+a_2 \sum_{i=1}^{n} x_i^4= \sum_{i=1}^{n} y_ix_i^2
\end{aligned} \right.
\end{equation}

Для решение данной системы уравнений нам необходимовычислить следующие значения:

\begin{equation}
\sum_{i=1}^{n} x_i  ,  \sum_{i=1}^{n} y_i  ,  
\sum_{i=1}^{n} x_i^2  ,  \sum_{i=1}^{n} x_i^3  ,  
\sum_{i=1}^{n} x_i^4  ,  \sum_{i=1}^{n} y_ix_i  ,  
\sum_{i=1}^{n} y_ix_i^2
\end{equation}
Следующая часть кода выполняет данные вычисления:<br>


```python
# Подсчитываем данные, необходимые для дальнейших расчетов
n = len(df) - 1
sum_x = 0
sum_x2 = 0
sum_y = 0
sum_x3 = 0
sum_yx = 0
sum_x4 = 0
sum_yx2 = 0
for value in df:
    x = value[1]
    sum_x += x
    y = value[0]
    sum_y += y
    x2 = x*x
    sum_x2 += x2
    x3 = x2 * x
    sum_x3 += x3
    x4 = x2 * x2
    sum_x4 += x4
    yx = y * x
    sum_yx += yx
    yx2 = y * x2
    sum_yx2 += yx2
av_x = sum_x / n
av_y = sum_y / n
numerator = 0
sqr_x = 0
sqr_y = 0
denominator = 0
for value in df:
    dif_x = value[1] - av_x
    dif_y = value[0] - av_y
    numerator += dif_x * dif_y
    sqr_x += dif_x * dif_x
    sqr_y += dif_y * dif_y
denominator = (sqr_x * sqr_y) ** (1/2)
```

В верхнем блоке мы высчитываем значение `числителя` и `знаменателя`, которые необходимы для расчета коэффициента парной корреляции.

Расчет производится по следующей формуле:

\begin{equation}
r = \dfrac{ \sum( x_i - x_{ средн. } ) (y_i - y_{средн.})}
{\sqrt{\sum( x_i - x_{ средн. } )^2 * \sum( y_i - y_{ средн. } )^2}}
\end{equation}


```python
# Вывод системы уравнений, которую необходимо решить
print(f"a0*{n}+a1*{sum_x}+a2*{sum_x2}={sum_y}")
print(f"a0*{sum_x}+a1*{sum_x2}+a2*{sum_x3}={sum_yx}")
print(f"a0*{sum_x2}+a1*{sum_x3}+a2*{sum_x4}={sum_yx2}")
```

    a0*2690+a1*39408335808274.0+a2*1.6619030512691775e+24=29813155.465381928
    a0*39408335808274.0+a1*1.6619030512691775e+24+a2*1.2322908569016729e+35=1.0677419732345071e+18
    a0*1.6619030512691775e+24+a1*1.2322908569016729e+35+a2*2.0227571563617705e+46=5.647841473167303e+28



```python
# Функция для нахождения определителя матрицы
def determinant(matrix):
    if len(matrix) == 1:
        return matrix[0][0]
    else:
        n = len(matrix)
        summa = 0
        for i in range(n):
            minor = []
            for x in range(n):
                temporary = []
                for y in range(n):
                    if x != i and y != 0:
                        temporary.append(matrix[x][y])
                if len(temporary) == n - 1:
                    minor.append(temporary)
            if i % 2 == 0:
                summa += matrix[i][0] * determinant(minor)
            else:
                summa -= matrix[i][0] * determinant(minor)
        return summa
```


```python
# Функция для решения СЛАУ
def slae_solver(x, y):
    det1 = determinant(x)
    if det1 == 0:
        return None
    n = len(x)
    ans = []
    deters = []
    for k in range(n):
        matrix = []
        for i, line in enumerate(x):
            temp = []
            for j, var in enumerate(line):
                if j == k:
                    temp.append(y[i])
                else:
                    temp.append(var)
            matrix.append(temp)
        deters.append(determinant(matrix))
    for det in deters:
        ans.append(det/det1)
    return ans
```


```python
# Коэфиценты для решения уравнений
temp_x = [
    [n, sum_x, sum_x2],
    [sum_x, sum_x2, sum_x3],
    [sum_x2, sum_x3, sum_x4]
]
temp_y = [
    sum_y,
    sum_yx,
    sum_yx2
]
```


```python
# Вывод уравнения параболической регрессии
ans = slae_solver(temp_x, temp_y)
print(f"y = {ans[0]} + {ans[1]}x + {ans[2]}x^2")
```

    y = 1187.896296047084 + 7.560368116947179e-07x + -1.911325770321666e-18x^2



```python
# Подсчет коэффициента парной корреляции 
r = numerator / denominator
r
```




    0.7327908953378983



**Вывод:**
Коэфицент парной корреляции = 0.73, что говорит о том, что существует средней тесноты зависимость между зависимой и независимой величиной

1d5887613b730595aec900b09fccf4c639255513
ipynb
Jupyter Notebook
Solved notebooks/lab3.1.ipynb
HAXF13D/TRO-lab1
d8be09e64241daa275a79d0569685876344f233b
MIT
Solved notebooks/lab3.1.ipynb
HAXF13D/TRO-lab1
d8be09e64241daa275a79d0569685876344f233b
MIT
Solved notebooks/lab3.1.ipynb
HAXF13D/TRO-lab1
d8be09e64241daa275a79d0569685876344f233b
MIT
Qwen/Qwen-72B
1. YES
2. YES