<jupyter_start><jupyter_text>Table of Contents1&nbsp;&nbsp;ДЗ-31.1&nbsp;&nbsp;A. Нетеплицева матрица1.1.1&nbsp;&nbsp;numpy1.1.2&nbsp;&nbsp;цикл2&nbsp;&nbsp;B. Подматрица с нужным детерминантом2.1&nbsp;&nbsp;C. Коммиты2.1.1&nbsp;&nbsp;pandas2.1.2&nbsp;&nbsp;словари2.1.3&nbsp;&nbsp;словари + pandas2.2&nbsp;&nbsp;D. Нетворкинг2.2.1&nbsp;&nbsp;pandas + Counter2.2.2&nbsp;&nbsp;pandas3&nbsp;&nbsp;СР-33.1&nbsp;&nbsp;B-33.2&nbsp;&nbsp;B-24&nbsp;&nbsp;ДЗ-3: Дефолты4.1&nbsp;&nbsp;7-гистограммы4.2&nbsp;&nbsp;9-корреляция  ДЗ-3  A. Нетеплицева матрица  numpy<jupyter_code>import numpy as np
x = np.array(list(map(int, input().split())))
x

x
n = x.size
A = np.vstack([np.roll(x, i) for i in range(n)])
A

np.triu(A)
np.tril(A.T, -1)
ans = np.tril(A.T, -1) + np.triu(A)
ans
ans[np.arange(1, n, 2)] = ans[np.arange(1, n, 2)][:n,::-1]
print(ans.astype(int))<jupyter_output>[[1 2 3 4 5]
 [4 3 2 1 2]
 [3 2 1 2 3]
 [2 1 2 3 4]
 [5 4 3 2 1]]<jupyter_text>цикл<jupyter_code>x = list(map(int, input().split()))
xx = list(x[::-1][:-1]) + list(x)
A = []
for i in range(len(xx),0,-1):
    if i%2!=0:
        A.append(xx[i:i+n][::-1])
    else:
        A.append(xx[i:i+n])
        
print(*A, sep='\n')<jupyter_output>1 2 3 4 5
[]
[5]
[5, 4]
[3, 4, 5]
[5, 4, 3, 2]
[1, 2, 3, 4, 5]
[4, 3, 2, 1, 2]
[3, 2, 1, 2, 3]
[2, 1, 2, 3, 4]<jupyter_text>B. Подматрица с нужным детерминантом<jupyter_code>import numpy as np
from math import ceil
a = np.array([list(map(float,x.split())) for x in input().split(';')])
b = np.array([list(map(float,x.split())) for x in input().split(';')])

print(a)
print(b)
n = a.shape[0]
ans = False
for i in range(n):
    for j in range(n):
        for m in range(n):
            M = a[i:(i+m),j:(j+m)]
            if M.shape[0]==M.shape[1] and np.isclose(np.linalg.det(M), b[i,j]):
                ans = True
                break
print(ans)<jupyter_output>True<jupyter_text>C. Коммиты  pandas<jupyter_code>import pandas as pd
from pandas.io.json import json_normalize
import json

with open('commits.json', 'r') as inp:
    data = json.load(inp)
    
raw_data = json_normalize(data, 'files', ['username', 'commit_time'])
raw_data
raw_data.groupby('username')['changed_lines'].sum()
raw_data.groupby('username')['commit_time'].nunique()
agg = raw_data.groupby(['name','username'])[['commit_time']].min().sort_values(['name','commit_time'])
agg
agg = raw_data.groupby(['name','username'])[['commit_time']].min().sort_values(['name','commit_time'])
d = {}
for file in agg.reset_index()['name'].unique():
    d[file] = agg.loc[file].iloc[0].name
d = pd.DataFrame([d]).T.reset_index().groupby(0).count().to_dict()['index'] 
d<jupyter_output><empty_output><jupyter_text>словари<jupyter_code>import pandas as pd
import json
from collections import defaultdict

with open('commits.json') as json_file:
    data = json.load(json_file)
    
data = sorted(data, key=lambda x: x['commit_time'])

new_files = set()
table = defaultdict(lambda: {'commits':0, 'changed_lines':0, 'new_files':0})

for comit in data:
    user = comit['username']
    table[user]['commits'] +=1
    for file in comit['files']:
        table[user]['changed_lines'] += file['changed_lines']
        if file['name'] not in new_files:
            new_files.add(file['name'])
            table[user]['new_files'] += 1

table
data[0]
df = pd.DataFrame(table).T
df.index.name = 'username'
print(df.sort_index().reset_index().to_string(index=False))<jupyter_output>username  commits  changed_lines  new_files
    bober38       12            885          2
   coder007        7            396          1
ivan_ivanov       15           1473          4
  john_snow       12           1211          4
        pet       14           1896          2
   vanessic       14           1622          7
      yegor       14           1341          7
       zeno       12           1211          1<jupyter_text>словари + pandas<jupyter_code>import pandas as pd
from pandas.io.json import json_normalize
import json

with open('commits.json', 'r') as inp:
    data = json.load(inp)
    
raw_data = json_normalize(data, 'files', ['username', 'commit_time'])
raw_data.commit_time = pd.to_datetime(raw_data.commit_time, format="%Y/%m/%d %H:%M:%S")
raw_data.sort_values(by='commit_time', inplace=True)

users = dict()
files = dict()

for ind, row in raw_data.iterrows():    
    file, lines, user, time = row['name'], row['changed_lines'] ,row['username'], row['commit_time']
    if user not in users:
        users[user] = {'username': user, 'commits': set(), 'changed_lines': 0, 'new_files': 0}
    if file not in files:
        files[file] = user
        users[user]['new_files'] += 1
    users[user]['changed_lines'] += int(lines)
    users[user]['commits'].add(time)
    
for user in users:
    users[user]['commits'] = len(users[user]['commits'])
    
result = pd.DataFrame.from_dict(users, columns=['username', 'commits', 'changed_lines', 'new_files'], orient='index')
result.sort_values(by='username', inplace=True)
print(result.to_string(index=False))<jupyter_output>username  commits  changed_lines  new_files
    bober38       12            885          2
   coder007        7            396          1
ivan_ivanov       15           1473          4
  john_snow       12           1211          4
        pet       14           1896          2
   vanessic       14           1622          7
      yegor       14           1341          7
       zeno       12           1211          1<jupyter_text>D. Нетворкинг  pandas + Counter<jupyter_code>import pandas as pd
from collections import Counter

f = open("networking.tsv", "r").read()
s = [x.split('\t') for x in f.split('\n')][:-1]

agg = pd.DataFrame(Counter(sum(s,[])).items(), columns=['person','links_count'])
agg = agg.sort_values(by=['links_count','person'], ascending=[False,True]).head()
print(agg.to_string(index=False))
# sorted(s, key=lambda x: (x[1], x[0]))
s[:5]<jupyter_output><empty_output><jupyter_text>pandas<jupyter_code>import pandas as pd


# df = pd.DataFrame([x.split('\t') for x in f.split('\n')])
df = pd.read_csv('networking.tsv', sep='\t', header=None)

agg = (df[0].value_counts() + df[1].value_counts()).dropna().astype(int)
agg = pd.DataFrame(agg).reset_index()
agg.columns = ['person','links_count']
agg = agg.sort_values(by=['links_count','person'], ascending=[False,True]).head()
print(agg.to_string(index=False))<jupyter_output>person  links_count
        <NAME>            7
            <NAME>            6
<NAME>            6
   <NAME>            5
         <NAME>            5<jupyter_text>СР-3  B-3- Дан файл с результатами соревнований пар в спортивных танцах на льду, записанными в произвольном порядке. - Напишите программу, которая по названию страны определяет партнершу из пары, занявшей самое высокое место. - ФОРМАТ ВВОДА - Файл skating.txt в кодировке utf-8, где на каждой строке записан результат соревнований пары в формате     - " -  / , ".     - Например, "1 место - Габриэлла Пападакис / Гийом Сизерон, Франция".- Гарантируется, что в файле есть минимум одна строка.- ВАЖНО! - Ваше решение будет проверяться на закрытых тестах. - Ваш код должен считывать файл 'skating.txt' без дополнительных указаний (например, пути к файлу на вашем компьютере).- С клавиатуры вводится название страны.- ФОРМАТ ВЫВОДА- Строка, имя и через пробел фамилия партнерши из введенной страны, занявшей самое высокое место.- ДОПОЛНИТЕЛЬНО- В открытом тесте используется файл skating.txt. Вы можете скачать его и проверить свое решение локально.- В примере в первой колонке отображается номер теста (0 — открытый тест), считывать это число или использовать его в вашем решении не нужно.<jupyter_code>ex = '1 место - Габриэлла Пападакис / <NAME>, Франция'
exs = '''1 место - q w / a b, fr
2 место - q w / e r, ru
3 место - a b / q w, fr
4 место - c d / q w, fr
5 место - a b / c d, ru'''
exs
data = [x.replace(' место -',',').replace(' /',',').split(', ') for x in exs.split('\n')]
data
country = 'ru' #input()
data = [x for x in data if x[3]==country]
data
best_pair = min(data, key=lambda x: int(x[0]))
best_pair
print(best_pair[1])<jupyter_output>q w<jupyter_text>B-2<jupyter_code>tickets = {}
winners = set()

ticket = input()

while ticket != 'КОНЕЦ':
    name, number = ticket.split('; ')
    if name not in tickets:
        tickets[name] = []
    tickets[name].append(number)
    ticket = input()

win_numbers = set(input().split())


win_numbers
tickets
for name in tickets:
    if len(set(tickets[name]) & win_numbers)>0:
        winners.add(name)
print(*sorted(winners), sep=', ')<jupyter_output>g, r<jupyter_text>ДЗ-3: Дефолты  7-гистограммы 7. Постройте гистограмму по суммам предоставленных кредитов (*LIMIT_BAL*) для каждой из групп клиентов отдельно (с дефолтом и без). (один график)8. На основе графика из предыдущего пункта, ответьте на вопросы: 8.1 По кредитам какого размера чаще всего происходят дефолты? 8.2 Начиная от какой суммы кредита клиентов без дефолта становится больше, чем клиентов с дефолтом? 8.3  Как по графику определить, есть ли такие одобренные суммы кредитов, по которым никогда не происходит дефолт? Выведите значения а) сумм кредитов, по которым всегда встречается дефолт, б) и те, по которым никогда не бывает дефолта. 9. Постройте матрицу корреляций для всех переменных по статусу погашения кредита. Добавьте значения корреляций на график. Есть ли общий тренд по возрастанию/убыванию корреляции по времени (всем месяцам)? 10. Напишите функцию, которая возвращает словарь, где ключ - это сумма одобренного кредита, а значение - это вложенный словарь. В нем по ключу ```ratio``` хранится отношение клиентов с дефолтом к тем, у кого его не было, с такой суммой кредитов, а по ключу ```num_clients```  - общее число клиентов с таким кредитом. Пример элемента словаря: ``` {50000.0 : {'ratio': 0.357, 'num_clients': 3365}```. Отсортируйте получившийся словарь по ключу ```ratio``` в убывающем порядке. У какого размера кредита наибольшая доля клиентов с дефолтом? А сколько в датасете клиентов, по которым посчитана эта доля? Можем ли мы сделать вывод, что в целом не стоит одобрять эту сумму для кредита новым клиентам?<jupyter_code>import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df = pd.read_csv('defaults.csv')
df.head(2)
plt.figure(figsize=(14,6))
plt.subplot(2,2,1)
g = sns.histplot(data=df, x='LIMIT_BAL', hue='default.payment.next.month',  
             bins=10,
             common_norm=False, stat='density',
             #log_scale=True
            )
plt.legend(['no','yes'],title='default',loc='center left', bbox_to_anchor=(1, 0.5))

plt.subplot(2,2,3)
sns.kdeplot(x=df[df['default.payment.next.month']==0]['LIMIT_BAL'])
sns.kdeplot(x=df[df['default.payment.next.month']==1]['LIMIT_BAL'])

plt.subplot(2,2,2)
sns.histplot(data=df, x='LIMIT_BAL', hue='default.payment.next.month', 
             bins=10, log_scale=True, 
             common_norm=False, 
             stat='density')
plt.legend(['no','yes'],title='default',loc='center left', bbox_to_anchor=(1, 0.5))

plt.subplot(2,2,4)
df['LIMIT_BAL_q'] = pd.qcut((df['LIMIT_BAL']/1e3).round().astype(int), q=np.linspace(0,1,10), duplicates='drop')
df.groupby('LIMIT_BAL_q')['default.payment.next.month'].mean().plot(kind='bar')

plt.tight_layout()
plt.show()<jupyter_output>/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pandas/plotting/_matplotlib/tools.py:400: MatplotlibDeprecationWarning: 
The is_first_col function was deprecated in Matplotlib 3.4 and will be removed two minor releases later. Use ax.get_subplotspec().is_first_col() instead.
  if ax.is_first_col():<jupyter_text>9-корреляция<jupyter_code>pays = [f'PAY_{i}'for i in range(7) if i!=1]

plt.figure(figsize=(14,6))
plt.subplot(121)
cor = df.corr()[pays]
sns.heatmap(cor, vmin=-1, vmax=1, cmap=sns.color_palette("coolwarm", as_cmap=True),cbar=False)


plt.subplot(122)
cor = df[pays].corr().T
sns.heatmap(cor, vmin=-1, vmax=1, cmap=sns.color_palette("coolwarm", as_cmap=True),annot = True)

plt.tight_layout()
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15242378810594703, 'fraction_numerical': 0.03031817424621023, 'mean_word_length': 3.7779546358933547, 'pattern_counts': {'":': 0, '<': 46, '<?xml version=': 0, '>': 47, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '12', 'dir': 'jupyter-structured-clean-dedup', 'id': '380167', 'license': 'MIT', 'n_tokens_mistral': 4925, 'n_tokens_neox': 5050, 'n_words': 1073, 'path': 'sem11_parser/sem11_review_hw3-cw3_2012-209.ipynb', 'repo_name': 'hse-econ-data-science/dap_2021_spring', 'size': '12046'}