python 2023 a 9 Библиотека Pandas (1)
Введение.
Всем привет! Я тут подумала хорошо будет поделиться своими решениями по питону! Пожалуйста подпишитесь на мой канал про мою жизнь в МГУ "Варечка Окаянная")))
1. Железная логика
Какие различные наборы логических переменных x1,x2,x3x_1, x_2, x_3x1,x2,x3 приводят к ИСТИННОМУ значению приведенное ниже логическое высказывание?
(¬x1∧x2∧¬x3)∨(¬x1∧x2∧x3)∨(x1∧¬x2∧¬x3)∨(¬x1∧x2∧¬x3)∨(¬x1∧x2∧x3)∨(x1∧¬x2∧¬x3)(\neg x_1 \land x_2 \land \neg x_3) \lor (\neg x_1 \land x_2 \land x_3) \lor (x_1 \land \neg x_2 \land \neg x_3) \lor (\neg x_1 \land x_2 \land \neg x_3) \lor (\neg x_1 \land x_2 \land x_3) \lor (x_1 \land \neg x_2 \land \neg x_3)(¬x1∧x2∧¬x3)∨(¬x1∧x2∧x3)∨(x1∧¬x2∧¬x3)∨(¬x1∧x2∧¬x3)∨(¬x1∧x2∧x3)∨(x1∧¬x2∧¬x3)
Формат ввода
Обратите внимание, что на вход программе ничего не подается.
Формат вывода
На стандартный поток вывода или в файл \texttt{output.txt} выведите все наборы. Каждый набор выводится на отдельной строке. Каждый набор состоит из последовательности значений \texttt{True} или \texttt{False}, разделенных одним пробелом между собой.
Для пояснения, представим, что во всех наборах \texttt{False} заменили на 0, \texttt{True} на 1. Тогда каждый набор можно рассматривать как бинарный вектор: (x1,x2,x3)(x_1, x_2, x_3)(x1,x2,x3), где xi∈{0,1}x_i \in \{0, 1\}xi∈{0,1}. Все наборы можно отсортировать по возрастанию, если рассматривать их как числа в двоичной системе:
(0,0,1)(0,1,0)(0,1,1)...(1,1,0)(1,1,1)(0,0,1)\\ (0,1,0)\\ (0,1,1)\\ ...\\ (1,1,0)\\ (1,1,1)\\(0,0,1)(0,1,0)(0,1,1)...(1,1,0)(1,1,1)
Если теперь сделать обратную замену 0 и 1 на False и True соответственно, то получили упорядоченные наборы.
Примечания
Обратите внимание, что в данной задаче не нужно ничего передавать в качестве входных данных.
Ответ:
from itertools import product
# Boolean expression
def logical_expression(x1, x2, x3):
return (not x1 and x2 and not x3) or (not x1 and x2 and x3) or (x1 and not x2 and not x3)
# Generate all possible combinations of variable values
combinations = list(product([False, True], repeat=3))
# Evaluate a Boolean expression for each combination and sort in ascending order
result = sorted([(x1, x2, x3) for x1, x2, x3 in combinations if logical_expression(x1, x2, x3)])
# Output results
for values in result:
print(" ".join(map(str, values)))
2. Ошибка выжившего
В математической статистике есть много интересных парадоксов и загадок. Одним из самых известных и интересных примеров является так называемая "ошибка выжившего". Этот парадокс имеет много интерпретаций: например, есть известная история о том, как во время Второй мировой войны американские инженеры принимали решение о том, каким образом нужно укрепить части самолетов. У них были ресурсы для укрепления лишь одной части: двигателя, лобового стекла, крыльев или хвоста самолета. Большинство самолетов возвращались с повреждениями в районе хвоста и крыльев — логичным решением было укреплять одну из этих частей. Но все не так просто: в воздушном бою снаряды попадают по самолетам равномерно, поэтому факт того, что большинство самолетов возвращается с повреждениями в этих областях, говорит лишь о некритичности попаданий в эти области, поскольку самолетам все же хватает ресурсов для возвращения на базу. Тогда укреплять нужно область с минимальным количеством попаданий.
Вам предлагается отследить "ошибку выжившего" в следующем формате. Вам дан csv-файл, в котором содержится информация об N вернувшихся на базу самолетах. Мы условно разделили самолет на 10 областей, в двумерном массиве размерностью N x 10 приведено количество попаданий в каждую область из этих областей у вернувшегося самолета. Посчитайте среднее количество попаданий для каждой области по всем самолетам и примите решение о том, какую из 10 областей Вы бы стали укреплять.
Формат ввода
Файл input.csv, содержащий информацию о попаданиях в разные области самолета в виде двумерного массива: N строк — записи об N самолетах, 10 столбцов — количество попаданий в каждую из 10 областей.
Формат вывода
В стандартный поток вывода или в файл output.txt выведите число от 1 до 10, представляющее собой Ваш выбор. Обратите внимание, что области нумеруются не с 0, а с 1.
Примечания
Разделитель в файле input.csv — запятая. Файл input.csv не содержит заголовка. Использование pandas является обязательным. Не забывайте делать import pandas as pd.
Ответ:
import pandas as pd
# Read data from input.csv file
df = pd.read_csv('input.csv', header=None)
# Calculate the sum for each area and select the area with the minimum amount
chosen_area = df.sum().idxmin() + 1 # add 1, since areas are numbered starting from 1
# Output selected area
print(chosen_area)
3. Электрик Станислав и интернет-казино
Электрик Станислав любил смотреть фильмы и сериалы, пользуясь различными бесплатными сервисами, вследствие чего невольно стал частью аудитории реклам интернет-казино. Вдохновившись последними, Станислав твердо решил, что в жизни нужно что-то менять, и отправился искать удачу в интернет-казино "3 кабачка". Казино предложило Станиславу приветственный бонус: Станислав мог получить 1000 рублей или же статистику по выигрышам на каждом из игровых автоматов за последние 100 игр. Учитывая, что игровых автоматов в казино "3 кабачка" очень много, а Станислав не привык принимать необдуманные решения, он согласился на второе условие и получил таблицу с данными в файле input.csv. Станислав не учел лишь одного: в программе подготовки электриков никогда не было курса по анализу данных при помощи Python, так что Станислав теперь понятия не имеет, что ему делать со столь ценной информацией. Помогите Станиславу по данным из файла принять решение, какой из автоматов наиболее прибыльный.
Формат ввода
В input.csv хранятся данные о каждом автомате, а именно:
где namei\text{name}_inamei — название автомата, winki\text{win}_k^iwinki — выигрыш на автомате namei\text{name}_inamei за kkk-ю игру. Обратите внимание, что в примере для удобства приведена статистика только за последние 3 игры.
Формат вывода
Название автомата namei\text{name}_inamei, который в среднем дает наибольший выигрыш за последние 100 игр.
Примечания
Воспользуйтесь подходящими функциями из библиотеки \texttt{pandas}. Для считывания входных данных можно использовать либо старый подход (с помощью \texttt{open()}, \texttt{readlines()}, \texttt{split()} и т.д.). Но лучше считывать с помощью \texttt{pandas.read_csv()}. При работе с \texttt{pandas.DataFrame()} в текущей версии \texttt{pandas} может не работать конструкция вида: \texttt{df.columns[df.mean().argmax()]} (\texttt{df=pandas.DataFrame()}). Используйте одну из следующих конструкций: \texttt{df.mean().values.argmax()}, \texttt{.idxmax()}.
Ответ:
import pandas as pd
# Read data from input.csv file
df = pd.read_csv('input.csv')
# Calculate the average value for each machine and select the machine with the maximum average value
most_profitable_slot = df.mean().idxmax()
# Displaying the name of the most profitable machine
print(most_profitable_slot)
4. Инвестор Геннадий и новый Мерседес
Инвестор Геннадий копит на новый Мерседес. Для его покупки Геннадию необходимо накопить 8 000 000 рублей. Геннадий смотрит на эту задачу со здоровым оптимизмом: у Геннадия собран портфель из большого числа ценных бумаг. С прошлого сбора дивидендов прошло 20 расчетных периодов и каждая из этих ценных бумаг принесет Геннадию круглую сумму. В файле input.csv указана прибыльность каждой ценной бумаги за каждый расчетный период. Вам предлагается оценить, хватит ли Геннадию на новый Мерседес, если он соберет все дивиденды за все периоды, указанные в таблице. Найдите среди бумаг Геннадия наиболее прибыльную.
Формат ввода
В input.csv хранятся данные о дивидендах за расчетные периоды для каждой бумаги:
где namei\text{name}_inamei — название ценной бумаги, divki\text{div}_k^idivki — дивиденды за бумагу namei\text{name}_inamei за kkk-й расчетный период. Обратите внимание, что в примере для удобства приведена статистика только за последние 3 расчетных периода.
Формат вывода
Выведите 1, если Геннадию хватит на новый Мерседес, если он соберет все дивиденды за все периоды, указанные в таблице. В обратном случае выведите 0. Также через пробел выведите \texttt{namei} — название наиболее прибыльной (суммарно) бумаги.
Примечания:
- Воспользуйтесь подходящими функциями из библиотеки \texttt{pandas}.
- Нужно получить 8 миллионов со всех имеющихся бумаг (а не только с самой прибыльной).
- Для считывания данных рекомендуется использовать \texttt{pandas.read_csv()}.
- При использовании \texttt{numpy.genfromtxt()} для считывания входных данных может возникнуть ошибка, связанная с удалением точки в названии колонки 'Мыло.ру'. Это связано с особенностями реализации данной функции (см. официальную документацию). Лучше использовать \texttt{pandas.read_csv()}.
- При работе с \texttt{pandas.DataFrame()} в текущей версии \texttt{pandas} может не работать конструкция вида: \texttt{df.columns[df.mean().argmax()]} (\texttt{df=pandas.DataFrame()}). Используйте одну из следующих конструкций:\texttt{df.mean().values.argmax()},
\texttt{.idxmax()}.
Ответ:
import pandas as pd
# Read data from input.csv file
df = pd.read_csv('input.csv')
# Calculation of total dividends for each security
total_dividends = df.sum()
# Checking whether Gennady has enough for a new Mercedes
if total_dividends.sum() >= 8000000:
most_profitable_stock = total_dividends.idxmax()
print(f"1 {most_profitable_stock}")
else:
print("0")
5. Фильтрация данных
Имеется таблица с данными, которая считывается с помощью инструментов библиотеки Pandas.
import pandas as pd
data = pd.read_csv("demodata.csv")
Вы хотите отфильтровать данные по дням недели и цене так, чтобы в столбце weekdays были только значения Thu, а в столбце prices значения больше, чем 2 млн. Каким образом вы можете это сделать?
Примечания
Обратите внимание на расстановку круглых скобок и приоритеты логических операций.
Ответ:
data[(data.weekdays == 'Thu') & (data.prices > 2000000)]
data.query('weekdays == "Thu" and prices > 2000000')
6. Неравенство треугольника
В таблице содержатся длины треугольников - по три натуральных (целых положительных) числа в каждой строке. Выясните, какое количество троек чисел может являться сторонами треугольника, то есть удовлетворяет неравенству треугольника: длина любой стороны треугольника всегда меньше суммы длин двух его других сторон.
Формат ввода:
Данные содержатся в файле \texttt{input.csv}. Столбцы называются "a", "b", "c".
Пример данных:
a,b,c
10,20,50
10,41,50
100,40,60
100,40,61
20,50,20
20,50,31
60,60,60
Здесь в первой, третьей и пятой строках неравенство треугольника нарушено, а в остальных четырёх - соблюдено.
Формат вывода:
Одно целое число - количество треугольников во входных данных.
Для примера выше это число: 4
Примечания:
Данные в файле \texttt{input.csv} представлены в стандартном виде .csv:
- строки, разделённые '\n',
- разделитель в каждой строке - запятая без пробелов,
- названия столбцов записываются в первой строке,
- названия столбцов: "a", "b", "c".
Обратите внимание, что неравенство треугольника должно выполняться для всех сторон исходного треугольника.
Ответ:
import pandas as pd
# Read data from input.csv file
df = pd.read_csv('input.csv')
# Check the triangle inequality
valid_triangles = df.apply(lambda row: row['a'] + row['b'] > row['c'] and row['a'] + row['c'] > row['b'] and row['b'] + row['c'] > row['a'], axis=1)
# Count the number of valid triangles
triangle_count = valid_triangles.sum()
# Output the result
print(triangle_count)
Спасибо!
Телеграмм Свалка астронома Ai 🦄 MSU
Телеграмм Варечкин Блокнот 🌸 MSU
ВК Школа https://vk.com/mgu_gdz Физиув UwU
Дзен https://dzen.ru/varechka_uni_physics