Вычисление по всему DataFrame
Нужно пересчитать заданный DataFrame в другой валюте:

rate = {'RUB': 69.183071}

df1:

   id val1  val2    val3
    a  100   200    300
    b  500   700    100
    c  1000  1500   2000

Нужно получить df2 в другой валюте по rate, грубо говоря значения в DataFrame разделить на rate:
df2:

id val1  val2    val3
a  1.44   2.89   4.33
b  7.22   10.11   1.44
c  14.45  21.68   28.91

Пытался сделать через
apply lambda, но почему-то все применимо только к столбцу и выдает мне
Series. Через
groupby что-то тоже не получается.


Создать новый DataFrame
Есть два DataFrame
df1['a'],df1['b'],df1['c'],df1['d']
df2['a'],df2['b'],df2['c'],df2['d']
Как создать новый столбец с данным
df1['new]
в котором будут браться значения
df1['a']/df2['a']
df1['b']/df2['b']
df1['c']/df2['c']
df1['d']/df2['d']
и выбираться максимальное значение из них?

Как-то так:
<code>
cols = ["a", "b", "c", "d"]
df1["new"] = (df1[cols] / df2[cols]).max(axis=1)
</code>


Отсортировать DataFrame по значениям столбца
Есть DataFrame, полученный из
pivot. В столбце
ST значения являются цифрами, но принадлежат к типам
int,
float и
str:

                                    Club  ST
0                    SSV Jahn Regensburg  78
1                  1. FC Heidenheim 1846  71
2                   1. FC Kaiserslautern  79
3                             1. FC Köln   0
...

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

При выводе возникает ошибка разных типов данных, а как применить метод
max к значениям столбца не получается:

with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(b.sort_values(ascending=False))

приводит к
TypeError: '>' not supported between instances of 'str' and 'int'.
Попытка фильтрации DataFrame
b2[int(b2.ST) > 90] приводит к
TypeError: cannot convert the series to <class 'int'>.

Сначала преобразуйте столбец к числовому типу данных:
<code>
df["ST"] = pd.to_numeric(df["ST"], errors="coerce")
df_sorted = df.sort_values("ST", ascending=False)
</code>


Нормализация данных
Задача состоит в нормализации(0-1) стакана приказов в биржевой торговле.
В стакане я могу видеть только 25 наилучших ценовых предложений, т.е. 25 приказов вида ASK и 25 приказов вида BID. Если я правильно понимаю то для нормализации нужно максимальное число в стакане(это будет 1), а минимальное(это будет 0), остальные числа это разброс между макс и мин значениями. Таким образом получается, что 1 всегда будет первый приказ в списке ASK, а 0 последний приказ в списке BID.
Подскажите, пожалуйста, как можно нормализовать быстро меняющиеся данные такого рода? Нужно ли создавать отдельную БД для нормализации? И если да, то как?(Приказы быстро отменяются/появляются и непонятно какие данные надо записывать)

Описанная вами нормализация называется
Min-Max Scaling и вычисляется по формуле:

z[i] = (x[i] - min(x)) / (max(x) - min(x))

Соответственно самым быстрым способом скалирования быстроизменяющихся данных будет хранение трёх дополнительных значений (переменных):

min_value
max_value
diff_max_min (max - min)

Расчёт скалированного значения:

z[i] = (x[i] - min_value) / diff_max_min

Далее по мере поступления новых значений обновлять эти три переменные при необходимости (если новое значение больше текущего максимума или меньше текущего минимума).
PS Другие способы нормализации данных


Как описать функцию в конце файла, чтобы интерпретатор не ругался?
Описываю эту тестовую функцию в конце файла:

def test():
    print('Test')

Интерпретатор ругается, что функция неопределена так как он еще с ней не сталкивался

NameError: name 'test' is not defined

Можно ли как-то указать интерпретатору на нужную функцию?

Если очень хочется, можно добавить функцию
main, а из нее уже вызывать функцию
test:

def main():
    test()

def test():
    print('Test')

main()


Лишние символы в начале XML-файла
Хочу распарсить XML-файл. После скачивания вижу в начале файла какие-то лишние символы. При чем это происходит только с локального компьютера (на Ubuntu). Если этот же скрипт закинуть на сервер (тоже на Ubuntu), то все ок.
Что это такое и что с этим делать?

xml = requests.get(url).text.encode('utf-8')
print(xml[:10])

Результат такой:

b'\xc3\xaf\xc2\xbb\xc2\xbf<?xm'

Без encode эти символы выглядят как
ï»¿

ï»¿ в начале файла обычно является BOM сигнатурой.
В этом случае следует воспользоваться кодировкой
utf-8-sig (как указано в вашем ответе):

r = requests.get(url)
if not r.ok:
    r.raise_for_status()
xml = r.content.decode('utf-8-sig')

.content в отличие от
.text вернет байт-строку, которую можно декодировать, используя нужную кодировку.


Как подсчитать очки в турнире на основе pandas.DataFrame с результатами игр
Есть df в который добавляются результаты игр команд:

df = pd.DataFrame(data={'h_title': ('Sparta', 'Boor', 'Sachs', 'Boor', 'T-Rax'),
                        'h_goals': (0, 2, 5, 1, 2),
                        'a_title': ('Boor', 'Sachs', 'Sparta', 'T-Rax', 'Sparta'),
                        'a_goals': (4, 2, 1, 2, 2)})

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

team_dict = {i : 0 for i in ds['h_title']}

Команда победитель получит +3 очка в value, и по 1-му очку получают обе при ничьей.
Те вывод team_dict на основе df в текущем состоянии получится:
{'Sparta': 1, 'Boor': 4, 'Sachs': 4, 'T-Rax': 4}
К сожалению моих знаний пока не хватает, чтобы решить эту несложную задачу.

Попробуйте так:

def score(df):
    h_vals = (df.eval("h_goals > a_goals") * 3 + df.eval("h_goals == a_goals") * 1).to_numpy()
    h = pd.Series(h_vals, index=df["h_title"]).sum(level=0)
    a_vals = (df.eval("h_goals < a_goals") * 3 + df.eval("h_goals == a_goals") * 1).to_numpy()
    a = pd.Series(a_vals, index=df["a_title"]).sum(level=0)
    return a+h

In [114]: score(df)
Out[114]:
a_title
Boor      4
Sachs     4
Sparta    1
T-Rax     4
dtype: int32

In [115]: score(df).to_dict()
Out[115]: {'Boor': 4, 'Sachs': 4, 'Sparta': 1, 'T-Rax': 4}


Какие варианты разворота строки?
Хочу написать функцию, не используя срезы, не используя метод reverce и функцию reverced, не создавая пустой массив при этом. Знаю можно использовать стандартный алгоритм замены символов с предварительным портированием. Какие еще могут быть варианты?
<code>
def reversed_string(s):
    chars = list(s)
    for i in range(len(s) // 2):
        tmp = chars[i]
        chars[i] = chars[len(s) - i - 1]
        chars[len(s) - i - 1] = tmp
    return ''.join(chars)

data = reversed_string('stroka')
print(data)
</code>

def reversed_str(origin_str):
    return ''.join(origin_str[index] for index in range(len(origin_str) - 1, -1, -1))

print(reversed_str('1234567'))  # '7654321'


Как правильно вводить значения для двух списков с клавиатуры?
Вот формат ввода:

n
a[0] b[0]
a[1] b[1]
...  ...
a[n] b[n]

Вот пример ввода:

3
1 100
2 200
3 300

Как лучше и короче всего осуществить такой ввод данных с клавиатуры, чтобы поместить целые числа из первого столбца в список "a", а целые числа из второго столбца в список "b"?
Т. е. на выходе должно получиться:

a = [1, 2, 3]
b = [100, 200, 300]

Используйте:

input() для получения ввода (как строка)

int для конвертации строки в целое число

range для вызова указанного количества итераций

str.split для разбиения строки на список по пробелам

Пример:

n = int(input())
items_a = []
items_b = []

for _ in range(n):
    a, b = map(int, input().split())
    items_a.append(a)
    items_b.append(b)

print(items_a)
print(items_b)

Для введенных значений:

3
1 100
2 200
3 300

Результат:

[1, 2, 3]
[100, 200, 300]


Поиск и удаление строки с unicodeescape в mssql на python
В SQL таблице есть столбец
sc_path, в котором содержится запись
C:\Users\elebedev\Desktop\Python Мне нужно удалить все строки в таблице содержащие эту запись.

from sqlalchemy import create_engine

path=r'C:\Users\elebedev\Desktop\Python'

con_log = create_engine('mssql+pymssql://log:pass@s1c/base')
sql_log = "DELETE FROM python_log WHERE CONVERT(NVARCHAR, sc_path) = '{}' ".format(path)
with con_log.begin() as conn:
    conn.execute(sql_log)

Код выполняется, но он не видит эти строки. Как мне кажется, что это из за
unicodeescape символа, но это не точно.
Подскажите, как быть?

Вы используете
raw string - соответственно Python сам "заэкранирует" обратные слеши:

In [57]: path=r'C:\Users\elebedev\Desktop\Python'

In [58]: path
Out[58]: 'C:\\Users\\elebedev\\Desktop\\Python'

Если вас интересуют строки, начинающиеся с данной подстроки, то запрос нужно изменить:

sql_log = "DELETE FROM python_log WHERE CONVERT(NVARCHAR, sc_path) like CONVERT(NVARCHAR, %s)"
parms = (f"{path}%", )
# NOTE:          ^ ^
con_log.execute(sql_log, parms)


Помогите пофиксить код
Код получает на вход массив и должна реализовывать 2 функции по нахождению:

Суммы положительных элементов стоящих на чётных местах
Произведение отрицательных элементов стоящих на нечётных местах

<code>
vvod=int(input('размер массива '))
for i in range(0,vvod):
 vvod=int(input('индекс '+str(i)+' число: '))
 array.append(vvod)
 print('получившийся массив:' + str(array))
 n=1
 sume=0
 proiz=1
 log=False
for i in array:
  if n%2==0 and i>0:
    sume+=i
    n+=1
    n=1
    for i in array:
      if n%2!=0:
        if i<0:
          proiz=proiz*i
          log=True
          n+=1
          if log==False:
            proiz=0
            print('Суммы положительных элементов стоящих на чётных местах '+str(sume))
            print('Произведение отрицательных элементов стоящих на нечётных местах '+str(proiz))
</code>

Намудрили с алгоритмом подсчета, можно намного проще сделать. Пример:
<code>
array = [4, 2, 2, -3, -2, 0, 6, 5, 6, -1, 6, 2, 6, -3, -3, -2, 0, 3, 5, 5]

total_sum = 0
total_prod = 1

for i, x in enumerate(array):
    # Четный индекс, положительное число
    if i % 2 == 0 and x > 0:
        total_sum += x

    # Нечетный индекс, отрицательное число
    if i % 2 == 1 and x < 0:
        total_prod *= x

print(total_sum)   # 35
print(total_prod)  # 18
</code>


Перегруппировать словари по одинаковому ключу
Прошу помочь.
Есть словарь:

{'feauture': 'Громкость звука', 'value': '0'},
{'feauture': 'Потребл. ток', 'value': '0.0002'},
{'feauture': 'Потребл. ток', 'value': '0.0003'},
{'feauture': 'Потребл. ток', 'value': '0.0004'},
{'feauture': 'Потребл. ток', 'value': '0.009'},
{'feauture': 'Потребл. ток', 'value': '0.014'},
{'feauture': 'Потребл. ток', 'value': '0.048'},
{'feauture': 'Потребл. ток', 'value': '0.06'},
{'feauture': 'Потребл. ток', 'value': '0.3'},
{'feauture': 'Вторичный ток 3', 'value': '0.33'},
{'feauture': 'Потребл. ток', 'value': '0.4'},
{'feauture': 'Вторичный ток 2', 'value': '0.41'},
{'feauture': 'Вторичный ток 2', 'value': '0.62'},
{'feauture': 'Вторичный ток 1', 'value': '0.625'},
{'feauture': 'Вторичный ток 2', 'value': '0.66'},
{'feauture': 'Макс. выход. ток', 'value': '0.660'},
{'feauture': 'Макс. выход. ток', 'value': '0.83'},
{'feauture': 'Макс. выход. ток', 'value': '1'},
{'feauture': 'Модульная ширина (общ. кол-во модульных расстояний)', 'value': '10'},
{'feauture': 'Макс. дальность действия', 'value': '100'}

Хочу привести к такому виду:

{'feauture': 'Громкость звука', ['0']},
{'feauture': 'Потребл. ток', ['0.0002', '0.0003', '0.0004', '0.009'.... ]},
{'feauture': 'Вторичный ток 3', ['0.33']},
{'feauture': 'Потребл. ток', ['0.4']},
{'feauture': 'Вторичный ток 2', ['0.41', '0.62', '0.66']}},
{'feauture': 'Вторичный ток 1', ['0.625']},
{'feauture': 'Макс. выход. ток', ['0.660', '0.83', '1']},

Необходимо сгруппировать по свойству товара и во вложенном словаре получить все значения этого свойства без повторений.

без внешних библиотек

data = [
    {'feauture': 'Громкость звука', 'value': '0'},
    {'feauture': 'Потребл. ток', 'value': '0.0002'},
    {'feauture': 'Потребл. ток', 'value': '0.0003'},
    # ...
]

from itertools import groupby
from operator import itemgetter

key = itemgetter('feauture')
out = [{'feauture': k, 'value': [x['value'] for x in g]}
       for k, g in groupby(sorted(data, key=key), key=key)]

с помощью Pandas

import pandas as pd

df = pd.DataFrame(data)
out = df.groupby('feauture', as_index=False).agg(list).to_dict('records')


Проверка числа на целость
Нужно, чтобы программа проверяла является ли число точным кубом. Я написал так:
<code>
import math

n=int(input())
if (pow(n,1/3)).is_integer():
    print("yes")
else:
    print("no")
</code>
Но когда ввожу число 8 - все верно пишет "yes". Но если ввести 125, 216 и другие точные кубы, то почему-то выдает -"no". В чем ошибка?
Пробовал вместо pow(n,1/3) использовать n**(1/3) - та же проблема.

python, как и большинство других языков, не отличит число
1/3 от числа достаточно близкого к нему

>>> 1/3 == 0.33333333333333331234512345
True

Точность вычислений с плавающей точкой ограничена, поэтому все сравнения дробных чисел нужно производить с учетом погрешности, например так.

if round(pow(n, 1/3), 6).is_integer(): # сравнение с точностью до 0.000001

Правда, стоит сказать, что от всех проблем это не убережет: если числа достаточно большие, потеря точности проявится значительно сильнее.

>>> round((123123123**3) ** (1/3), 6)
123123123.0
>>> round((1231231231**3) ** (1/3), 6)
1231231230.999999

>>> 100000000000000000.0 == 99999999999999999.0
True

Upd:
Целочисленный алгоритм нахождения кубического корня (с отбрасыванием дробной части)

def intcuberoot(n):
    if n < 0:
        return -intcuberoot(-n)
    elif n < 2:
        return n
    else:
        x = intcuberoot(n >> 3) << 1
        return x if (x + 1) ** 3 > n else x + 1

def iscube(n):
    return intcuberoot(n) ** 3 == n

У него тоже есть свои ограничения - он не особо оптимальный да и упрется в потолок рекурсии на огромных числах, но явная ошибка лучше чем неточный результат.

>>> iscube(555**300)
True

Upd2
Итеративный алгоритм (без ограничений на размер числа)

def intcuberoot2(n):
    if n < 0:
        return -intcuberoot2(-n)

    x = 0

    for bit in range((n.bit_length() + 2) // 3, -1, -1):
        if (x | 1 << bit) ** 3 <= n:
            x |= 1 << bit

    return x


Ошибка при запуске: No such file or directory: ''
Не появляется окно,  сразу ошибка

import tkinter as tk
import hashlib
def show_text():
    label_text.set('Hash, "' + f + '"')

root = tk.Tk()

road = tk.StringVar()
road1 = tk.StringVar()
entry = tk.Entry(root, width=40, textvariable=road)
entry.pack()
entry = tk.Entry(root, width=40, textvariable=road1)
entry.pack()
button = tk.Button(root, text="Click Me", command=show_text)
button.pack()
fl = open(str(road.get()))
f = hashlib.sha256(fl)
label_text = tk.StringVar()
label = tk.Label(root, textvariable=label_text)
label.pack()

root.mainloop()

Ошибка:

Traceback (most recent call last):
  File "D:\Python\Test.py", line 16, in <module>
    fl = open(str(road.get()))
FileNotFoundError: [Errno 2] No such file or directory: ''

Весь код не находящийся внутри функций или классов выше
root.mainloop() выполняется сразу после запуска программы. Получается что вы только создаете окно, текстовое поле и сразу запрашиваете из текстового поля его содержимое. Пользователь физически не успеет ничего ввести.
Нужно перенести открытие и обработку файла в обработчик кнопки, чтобы открытие файла происходило только после нажатия на нее:

import tkinter as tk
import hashlib

def show_text():
    fl = open(str(road.get()))
    f = hashlib.sha256(fl)
    label_text.set('Hash, "' + f + '"')

root = tk.Tk()

road = tk.StringVar()
road1 = tk.StringVar()
entry = tk.Entry(root, width=40, textvariable=road)
entry.pack()
entry = tk.Entry(root, width=40, textvariable=road1)
entry.pack()
button = tk.Button(root, text="Click Me", command=show_text)
button.pack()

label_text = tk.StringVar()
label = tk.Label(root, textvariable=label_text)
label.pack()

root.mainloop()


Python win32 узнать все атрибуты файла
Всем привет. Пытаюсь разобраться с библиотекой на питон win32. Хочу узнать весь список атрибутов файла. Но при использовании этой функции и других - выводится только последний добавленный атрибут.
Как с помощью win32 для питона узнать все атрибуты?
пишу код:

def attributes(fileName):
        win32file.SetFileAttributes(fileName, win32file.FILE_ATTRIBUTE_READONLY)
        win32file.SetFileAttributes(fileName, win32file.FILE_ATTRIBUTE_SYSTEM)
        att = win32file.GetFileAttributes(fileName)
        print(f"Current attributes: {att}")

результат:

4

если заменить на

att = win32file.GetFileAttributesEx(fileName)

, то результат будет такой:

Current attributes: (4, pywintypes.datetime(2019, 9, 9, 13, 30, 32,
  221000, tzinfo=TimeZoneInfo('GMT Standard Time', True)),
  pywintypes.datetime(2019, 9, 9, 16, 19, 25, 397000,
  tzinfo=TimeZoneInfo('GMT Standard Time', True)),
  pywintypes.datetime(2019, 9, 9, 16, 19, 19, 138000,
  tzinfo=TimeZoneInfo('GMT Standard Time', True)), 42)

В вашем коде вы сначала делаете файл только "только для чтения", потом только системным. Т.е. вторым вызовом "перезатираете" то что сделали первым вызовом.
GetFileAttributes вам показывает правильный результат - файл системный, но не только для чтения.
Функция
SetFileAttributes вторым параметром принимает атрибуты как целое число, в котором каждый бит отвечает за определенный атрибут (битовые "флаги"). Чтобы сделать файл и системным, и только для чтения, атрибуты нужно объединить с помощью битового логического "или":

win32file.SetFileAttributes(fileName, win32file.FILE_ATTRIBUTE_READONLY | win32file.FILE_ATTRIBUTE_SYSTEM)


Как объявить пустой двумерный массив?
Как можно объявить двумерный массив размерностью x, y.
Так не работает:
<code>
arr = [][]
arr = [x][y]
</code>
Мне нужен именно пустой массив, т.к. дальше я буду вносить туда значения.
Нашел вариант с матрицей zeros, но его использовать не хотелось бы.

Можно использовать модуль Numpy - numpy.empty():

import numpy as np

arr = np.empty((x,y), dtype="float32")

In [47]: arr = np.empty((x,y), dtype="object")

In [48]: arr
Out[48]:
array([[None, None, None],
       [None, None, None],
       [None, None, None],
       [None, None, None],
       [None, None, None]], dtype=object)

In [49]: arr[1,1] = "XXXXX"

In [50]: arr
Out[50]:
array([[None, None, None],
       [None, 'XXXXX', None],
       [None, None, None],
       [None, None, None],
       [None, None, None]], dtype=object)


Как лаконично и красиво поместить число в диапазон?
Следующий фрагмент кода бросается в глаза своей "топорностью", поэтому хочу его сделать более красивым.
Делаю простой конвертер изображения из rgb в hex, поэтому значение должно быть на интервале [0;255]
<code>
if number < 0:
    number = 0
if number > 255:
    number = 255
</code>
Можно ли средствами Python уменьшить код?

Попробуйте так:

def clip(val, min_=0, max_=255):
    return max(min_, min(max_, val))

тесты:

In [12]: clip(100)
Out[12]: 100

In [13]: clip(1000)
Out[13]: 255

In [14]: clip(-1000)
Out[14]: 0

по совету @Bogdan, добавлю вариант с использованием тернарного оператора:

def clip(val, min_=0, max_=255):
    return min_ if val < min_ else max_ if val > max_ else val

для тех, кто использует Numpy - в Numpy существует готовая функция np.clip():
Пример:

import numpy as np

In [34]: a = np.arange(10)

In [35]: a
Out[35]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [36]: clipped = np.clip(a, 3, 8)

In [37]: clipped
Out[37]: array([3, 3, 3, 3, 4, 5, 6, 7, 8, 8])


Расчет расстояния по нескольким координатам python
Имеется два массива с широтой и долготой.

lat = np.array([])
lon = np.array([])

Необходимо рассчитать расстояние между каждой точкой и сложить их.
Само расстояние вычисляется с помощью geopy.

dist = distance.geodesic(mark1, mark2, ellipsoid='WGS-84').m

Обновлено:
strawdog, спасибо за ответ!
Но всё же получается, что он считает разницу числом из первого массива и второго.
Поэтому переделал, вот рабочий вариант:

sum_distance = 0
for i in range(len(lat)):
    mark1 = (lat[i-1], lon[i-1])
    mark2 = (lat[i], lon[i])
    if i > 0: # Для того, чтобы исключить суммирование с последней координаты
        sum_distance += distance.geodesic(mark1, mark2, ellipsoid='WGS-84').km
    else:
        sum_distance = 0

В результате вывод:

0
  0,4
  0,8
  ...
  13,2

Вероятно, так:
<code>
from geopy.distance import geodesic
import numpy as np

lat = np.array([22.5726, 28.7041, 6.9270])
lon = np.array([88.3639, 77.1025, 79.8612])

dist = 0
for i in range(len(lat)):
    dist += geodesic(lat[i], lon[i], ellipsoid='WGS-84').m

print(dist)
</code>

20810835.3369049


Python Django Дата комментария к статье
У меня сделана модель комментария, html-форма добавления комментария к статье.
При добавлении комментария не отображается правильно дата и время его публикации, вместо нужной даты, просто пишется None. Поле даты коммента:

comment_date = models.DateTimeField('время', default = timezone.now, null = True)

Я знаю, что это происходит из-за null = True, но без него я получаю ошибку при добавлении комментария. Параметр default не работает, ранее я пробовал различные вариации timezone.now, но к успеху это не привело. Я думал, что дело стоит в миграциях, но нет, я делаю все миграции верно и это не помогает.
Прикладываю полный код:
models.py

class Comment(models.Model):
article = models.ForeignKey(Article, on_delete = models.CASCADE) # connecting 'Comment model' with 'Article model' by ForeignKey

author_name = models.CharField('имя автора', max_length = 50)
comment_text = models.CharField('текст комментария', max_length = 10000)
comment_date = models.DateTimeField('время', default = timezone.now, null = True)

def __str__(self):
    return self.author_name

class Meta:
    verbose_name = 'Комментарий'
    verbose_name_plural = 'Комментарии'

Далее views.py:

def detail(request, article_id):
try:
    a = Article.objects.get(id = article_id)
except:
    raise Http404('Статья не найдена!')

latest_comments_list = a.comment_set.order_by('-id')[:10]

return render(request, 'articles/detail.html', {'article': a, 'latest_comments_list': latest_comments_list})

def leave_comment(request, article_id):
    try:
        a = Article.objects.get(id = article_id)
    except:
        raise Http404('Статья не найдена!')

a.comment_set.create(author_name = request.POST.get('name'), comment_text = request.POST.get('text'), comment_date = request.POST.get('date'))

return HttpResponseRedirect(reverse('articles:detail', args = (a.id,)))

urls.py:

urlpatterns = [
path('', views.index, name = 'index'),
path('<int:article_id>/', views.detail, name = 'detail'),
path('<int:article_id>/leave_comment/', views.leave_comment, name = 'leave_comment')

]
И html-код:

{% extends 'base.html' %} <!-->detail.html<-->

{% block title %}{{article.article_title}}{% endblock %}

{% block content %}

	<h2>{{article.article_title}}</h2>
	<p>{{article.article_text}}</p>
	<em>{{article.pub_date}}</em>

	{% if article.was_published_recently %}
		Новая статья!
	{% endif %}

	<hr>

		{% if latest_comments_list %}
			{% for c in latest_comments_list %}
				<p>
					<strong>{{c.author_name}}</strong>
					<p>{{c.comment_text}}</p>
					<strong>{{c.comment_date}}</strong>
				</p>
			{% endfor %}
		{% else %}
			Комментарии не найдены, станьте первым!
		{% endif %}

	<hr>

	<form action="{% url 'articles:leave_comment' article.id %}" method="POST">
		{% csrf_token %}

		<input type="text" required placeholder="Ваше имя" name="name"><br>
		<textarea name="text" required="" placeholder="Текст комментария" cols="30" rows="10"  width="100px" height="50px"></textarea><br>
		<strong name="date"></strong>

		<button type="submit">Оставить комментарий</button>

	</form>

{% endblock %}

Я разобрался с проблемой, она заключалась далеко не в миграциях, а в методе создания модели. Мне кстати помог auto_add_now ! =)
Поясню: Проблема заключалась в методе создания самой модели. Я использовал
a.comment_set.create(author_name = request.POST.get('name'), comment_text = request.POST.get('text'), comment_date = request.POST.get('date'))
как оказалось, это не лучшая практика, поэтому стоит использовать более гуманный метод создания модели:

Comment.objects.create(
    article=a,
    author_name=request.POST.get('name'),
    comment_text=request.POST.get('text')
)

Всем спасибо за помощь, всем благодарен, вопрос закрыт!


Метод replace python
Программа меняет в тексте слово отель на гостиницу. Но возникает ошибка когда слово отель встречается внутри другого слова, например К-отель-ники, т.е. программа меняет в этом слове фразу. В итоге получается - Кгостиницаники.
Kак исправить?
Код в упрощенном виде выглядит так:
<code>
param = "Отель расположен в городе Котельники."
param = param.replace('отель','гостиница')
</code>

Воспользуйтесь регулярными выражениями:

import re

param = re.sub(r"\bотель\b", "гостиница", param)
param = re.sub(r"\bОтель\b", "Гостиница", param)

Результат:

In [20]: print(param)
Гостиница расположен в городе Котельники.


Ошибка <Response [200]> python vk_api
Пишу программу на python для выкладывания постов с изображением в группу Vk. Использую библиотеку vk_api и requests.
Собственно вот сама программа:
<code>
import vk_api
import time
import random
import datetime
import requests

token='токен пользователя (доступ к wall и photos)'
group_id=id групы
vk = vk_api.VkApi(token=token)
gWUS=vk.method('photos.getWallUploadServer',{'group_id':group_id})
album_id=gWUS['album_id']
user_id=gWUS['user_id']
upload_url=gWUS['upload_url']
file={'photo1':open('q.png','rb')}
ur=requests.post(upload_url,files=file)
print(ur)
</code>
При запуске выводит

Response [200]

.
Как это можно исправить?

Это не ошибка, это успешный результат (см. Список кодов состояния HTTP). Чтобы получить текст ответа, нужно брать поле
text, например:

print(ur.text)


Как передать именованный аргумент sqlite?
Не могу разобраться, как мне передать именованный аргумент (переменную) в базу данных.
Создал базу данных следующим образом:

import sqlite3

conn = sqlite3.connect("mydatabase.db")
cursor = conn.cursor()

cursor.execute("CREATE TABLE users (id numeric)") #пробовал и текстовое значение

Пытался вставить переменную так:

ids = [] #заполненный список с значениями, которые мне нужно вставить
for i in ids:
   cursor.execute("INSERT INTO users VALUES (?,)", i) #пробовал через форматирование строки, тоже не вышло

Что я делаю не так?

cursor.execute(sql, parameters) в качестве параметров ожидает итерируемый объект (обычно список или кортеж):

ids = [1,2,3]

for i in ids:
    cursor.execute("INSERT INTO users VALUES (?)", (i,))   # qmark style
#  NOTE: ---------------------------->       ^^^   ^^^^

используем именованные параметры:

for i in ids:
    cursor.execute("INSERT INTO users VALUES (:id)", {"id": i})  # (named style)

ВНИМАНИЕ:
(<скаляр>) - не является кортежем!

In [55]: i = 1

In [56]: type( i )
Out[56]: int

In [57]: type( (i) )   #  /  NOTE!
Out[57]: int           #  \  (i) - это просто скаляр, а не кортеж

In [58]: type( (i,) )
Out[58]: tuple


Ошибка SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 1-2: truncated \xXX escape на на Python kivy
Пишу калькулятор на python kivy и вылетает такая ошибка:

[INFO   ] [Logger      ] Record log in /home/egor/.kivy/logs/kivy_19-09-07_59.txt
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "/usr/local/lib/python3.6/dist-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
[INFO   ] [Python      ] Interpreter at "/usr/bin/python3"
[INFO   ] [Factory     ] 184 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil, img_gif (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
 Traceback (most recent call last):
   File "main.py", line 21, in <module>
     Main().run()
   File "/usr/local/lib/python3.6/dist-packages/kivy/app.py", line 828, in run
     self.load_kv(filename=self.kv_file)
   File "/usr/local/lib/python3.6/dist-packages/kivy/app.py", line 599, in load_kv
     root = Builder.load_file(rfilename)
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/builder.py", line 368, in load_string
     parser = Parser(content=string, filename=fn)
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/parser.py", line 401, in __init__
     self.parse(content)
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/parser.py", line 514, in parse
     rule.precompile()
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/parser.py", line 261, in precompile
     x.precompile()
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/parser.py", line 261, in precompile
     x.precompile()
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/parser.py", line 261, in precompile
     x.precompile()
   [Previous line repeated 1 more time]
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/parser.py", line 257, in precompile
     x.precompile()
   File "/usr/local/lib/python3.6/dist-packages/kivy/lang/parser.py", line 179, in precompile
     self.co_value = eval(value)
   File "<string>", line 1
 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 1-2: truncated \xXX escape

main.py:

from kivy.app import App
from kivy.uix.pagelayout import PageLayout

class Root(PageLayout):
    pass

class Main(App):
    def build(self):
        return Root()

Main().run()

main.kv:

<CustomLabel@Label>:
    text_size: self.size
    #padding_x: 5

<Root>:
    id: field
    GridLayout:
        cols:1
        TextInput:
            id : CalcPanel
        GridLayout:
            id : keyboardCalc
            cols:5
            Button:
                text: 'sin'
                on_press:
                    CalcPanel.text += 'sin('
            Button:
                text: 'cos'
                on_press:
                    CalcPanel.text += 'cos('
            Button:
                text: 'tan'
                on_press:
                    CalcPanel.text += 'tg('
            Button:
                text: 'AC'
                on_press:
                    CalcPanel.text ='0'
            Button:
                id : delete
                text: 'del'
            Button:
                text: 'X^y'
                on_press:
                    CalcPanel.text += ' ** '
            Button:
                text: 'sqrt'
                on_press:
                    CalcPanel.text += 'sqrt('
            Button:
                text: '!'
                on_press:
                    CalcPanel.text += 'factorial('
            Button:
                text: '('
                on_press:
                    CalcPanel.text += '('
            Button:
                text: ')'
                on_press:
                    CalcPanel.text += ')'
            Button:
                text: '1\x'
                on_press:
                    CalcPanel.text += '1/('
            Button:
                text: 'Pi'
                on_press:
                    CalcPanel.text += 'pi'
            Button:
                text: 'e'
                on_press:
                    CalcPanel.text += 'e'
            Button:
                text: '%'
                on_press:
                    CalcPanel.text += '%'
            Button:
                text: '/'
                on_press:
                    CalcPanel.text += '/'
            Button:
                text: '0'
                on_press:
                    CalcPanel.text += '0'
            Button:
                text: '7'
                on_press:
                    CalcPanel.text += '7'
            Button:
                text: '8'
                on_press:
                    CalcPanel.text += '8'
            Button:
                text: '9'
                on_press:
                    CalcPanel.text += '9'
            Button:
                text: '*'
                on_press:
                    CalcPanel.text += '*'
            Button:
                text: '.'
                on_press:
                    CalcPanel.text += '.'
            Button:
                text: '4'
                on_press:
                    CalcPanel.text += '4'
            Button:
                text: '5'
                on_press:
                    CalcPanel.text += '5'
            Button:
                text: '6'
                on_press:
                    CalcPanel.text += '6'
            Button:
                text: '-'
                on_press:
                    CalcPanel.text += '-'
            Button:
                text: ''
            Button:
                text: '1'
                on_press:
                    CalcPanel.text += '1'
            Button:
                text: '2'
                on_press:
                    CalcPanel.text += '2'
            Button:
                text: '3'
                on_press:
                    CalcPanel.text += '3'
            Button:
                text: '+'
                on_press:
                    CalcPanel.text += '+'
    Button:
        id:button

при этом если удалить виджет keyboardCalc (который с кучей кнопок) то ошибка не вылетает. Что я делаю не так?

Проблема в строке:
'1\x'
Обратный слэш внутри строк в Python имеет особое значение, см. например тут: Работа со строками в Python: литералы, раздел Экранированные последовательности - служебные символы.
В данной строке Python его распознает как часть последовательности типа
'\xDE' (где DE - шестнадцатеричный код символа), о чем и написано в ошибке: "truncated \xXX escape" - примерно переводится как "обрезанная экранированная последовательность \xXX".
Проблема решается или экранированием слеша
'1\\x', либо использованием "сырых" строк (строки с
r перед первой кавычкой) -
r'1\x' (про сырые строки см. по ссылке выше, раздел "Сырые" строки - подавляют экранирование).
Или же заменить обратный слэш на прямой: похоже, у вас предполагается операция деления единицы на какое-то число.


Как вывести только нужные параметры через subprocess Popen
Если использовать этот код, то выводятся все процессы на компьютере, но мне надо не всё знать об этих процессах, а только id и сколько памяти они занимают. Я никак найти не смог как это сделать не используя библиотеку psutil.
<code>
    import os
    from subprocess import Popen, PIPE, check_output
    print(*[line.decode('cp866', 'ignore')
    for line in Popen('tasklist', stdout=PIPE).stdout().readlines()])
</code>

Используем только встроенные модули:
<code>
import io
import csv
from subprocess import check_output

fh = io.StringIO(check_output(["tasklist", "/fo", "csv"]).decode('cp866', 'ignore'))
reader = csv.DictReader(fh, delimiter=",")
for row in reader:
    print(row["PID"], row["Mem Usage"])
</code>


Узнать функцию из которой был вызван __getitem__
<code>
class DictStruct(dict):

'''...'''

    # Автоматически создаёт объекты класса Dict
    # Если они есть в пути, Например:
    # При struct['dict1']['dict2'] = ...
    # добавит dict1 даже если его нету
    #
    # Нужно чтоб при присваивании дополнение
    # недостающих блоков работали с созданием Dict-ов,
    # но при выводе возвращало ошибку если ключ отсутствует

    def __getitem__(self, key):
        if key not in self.__dict__.keys():
             return self.__missing__(key)
    return self.__dict__[key]

def __setitem__(self, key, value):
    pass

def __missing__(self, key):
    #Если нету нужного ключа

    self.__dict__[key] = type(self)()
    return self.__dict__[key]

'''...'''

if __name__=='__main__':

    struct = DictStruct()

    struct['userlist']['user']['name'] = 'Username' # +

    print(struct['userlist']['user']['age']) # - // Должно вернуть ошибку
</code>
Как узнать откуда был вызван метод класса и на при оделённых функциях делать дополнительные проверки

1.
__getitem__ и
__setitem__
В данном случае
__getitem__ и
__setitem__ не подойдут. Независимо от того, присваиваете вы значение в словарь последнего уровня или извлекаете,
__getitem__ всё равно будет вызываться по пути - для получения значений у словарей верхних уровней (1-го, 2-го и т.д.), через которые мы находим самый вложенный словарь, в котором собираемся менять элемент.
То есть ваша конструкция для записи нового элемента в словарь:

struct['userlist']['user']['name'] = 'Username'

работает следующим образом:

struct.__getitem__('userlist').__getitem__('user').__setitem__('name','Username')

struct.__getitem__('userlist') - вызываем метод
__getitem__ у объекта
struct и передаём ему
'userlist'. В нашем случае метод должен вернуть словарь, назовём его
2_level_dict.

2_level_dict.__getitem__('user') - у полученного в предыдущем шаге словаря
2_level_dict таким же способом получаем следующий словарь -
3_level_dict.

3_level_dict.__setitem__('name','Username') - в конце записываем новое значение в словарь
3_level_dict.
в результате получаем желаемый многоуровневый словарь:
{'userlist': {'user': {'name': 'Username'}}}.

Итого: несмотря на то, что вы хотели записать значение, метод
__getitem__ вызывался два раза. Он вызывается всякий раз, когда происходит запрос элемента в словаре, а без запроса здесь не обойтись - нужно же добраться до самого вложенного словаря.
Переходим ко второй конструкции:

print(struct['userlist']['user']['age'])

"под капотом" она представляет собой следующее:

struct.__getitem__('userlist').__getitem__('user').__getitem__('age')

На данный момент
__getitem__ вместо того, чтобы выдать ошибку, не найдя элемент
'userlist' в первом словаре, молча создаст новый словарь и присвоит его ключу
'userlist'. Потом второй словарь -
'user'. И т.д.
Чтобы вторая конструкция выдавала ошибку при отсутствии какого-либо элемента, нужно убирать дефолтное создание нового словаря
DictStruct из
__getitem__, а мы не можем, так как тогда перестанет работать первая.
Замечание: слово
struct лучше не использовать - оно является ключевым в языке C и используется там очень часто. На работу программы написанной на Python это никак не влияет, но людям знакомым с С не удобно читать этот код. Мне во всяком случае.
2. Получение имени вызывающего объекта:
Для определения объекта из которого функция была вызвана, можно использовать модуль inspect:

import inspect
def foo():
    # возьми текущий фрейм объект (frame object)
    current_frame = inspect.currentframe()

    # получи фрейм объект, который его вызвал
    caller_frame = current_frame.f_back

    # возьми у вызвавшего фрейма исполняемый в нём объект типа "код" (code object)
    code_obj = caller_frame.f_code

    # и получи его имя
    code_obj_name = code_obj.co_name

    print("Имя вызывающего объекта: ", code_obj_name)

def a():
    foo()

def b():
    foo()

a()
b()
foo()

Output

Имя вызывающего объекта:  a
Имя вызывающего объекта:  b
Имя вызывающего объекта:  <module>

Сильно расписывать не буду, тут слишком многое надо объяснять, чтобы стало понятно. Что такое фрейм, что такое объект типа "код"...


Python: как вывести число типа float с определенным количеством знаков после запятой
Есть вот такая функция:

def vol(rad):

    print(4/3*3.141592*rad**3, "cm^3")

вывод будет:

vol(5)

523.5986666666666 cm^3

Вопрос: как вывести ответ определенным количеством знаков после запятой, напирмер 523.598 или 523.59 по возможности сохранив компактность кода


Нужно перенести в каталог с изменением структуры каталога
Есть лежат два каталога:

/var/data1/ и

/var/data2/
Каталог data1 имеет структуру:

<version>/<name_service>/<build_number>/*_<os>_<architectura>.(zip|7z)

пример:

3.18.100/alfa/32/alfa_linux_x86_64.zip
3.18.100/zero/32/zero-ctrl_linux_i686.7z

Нужно перенести все файлы из
data1 в каталог
data2 с изменением структуры каталога, так что бы первым уровнем стал имя директории с названием дистрибутива и добавить разделение каталогов по архитектурам
пример:

alfa/3.18.100/32/linux_x86_64/alfa.zip
zero/3.18.100/32/linux_i686/zero-ctrl.7z

Получился вот такой код, немного пояснил конечно.
Один момент остался, файлы переезжают а старая структура папок остается, ее потом вручную можно дропнуть.
Закидывайте код в файл, потом, запускайте в папке на уровне с 3.18.100. Ответственности не несу. Делайте обязательно бекапы
<code>
#python3.7
import os
from pathlib import Path

root_path = os.getcwd()

# Функция изменения пути
def rebuild_path(path):
    # Распаковка пути, на директории и название файла
    path, file = os.path.split(path)

    # Распаковка названия файла на имя и расширение
    filename, file_extension = os.path.splitext(file)

    # Получаем список директорий
    path_list = path.split('/')

    # Собираем директории назад в другом порядке
    new_path = '%s/%s/%s' % (path_list[1], path_list[0], path_list[2])

    # Разбиваем имя файла на две части слева от _ и справа от _, правая не нужна
    new_filename, _ = filename.split('_', 1)

    # Собираем все назад
    return '%s/%s%s' % (new_path, new_filename, file_extension)

# Получаем рекурсивно список файлов, наших целей
for filename in list(Path(".").rglob("*.*")):
    # Нам нужны файлы с 3мя директориями
    if str(filename).count('/') != 3: continue
    # Получили новый путь
    new_filename_path = rebuild_path(filename)
    # Получили путь директорий файла
    mkdir_path, _ = os.path.split(new_filename_path)

    try:
        # Рекурсивное создание
        os.makedirs(os.path.join(root_path,mkdir_path))
        # Перемещение
        os.rename(str(filename), new_filename_path)
    except OSError:
        print("Creation of the directory %s failed" % mkdir_path)
    else:
        print("Successfully created the directory %s " % mkdir_path)
</code>


Как найти ключевые слова в тексте одного столбца DataFrame?
у меня есть файл CSV я его прочитал, импортировал библиотеки
мне необходимо найти ключевые слова в тексте одного столбца:
вот эти критерии, отдельно:

/city/directory/<цифры или буквы>.html

/good/<цифры>/owner_info

/bulletin/<цифры>

и пользователь у которого совпадали эти 3 критерии совместно
мой код

import pandas as pd
import numpy as np
import re

exp = pd.read_csv(r'C:\Users\4X\Desktop\pandas\study\...csv')

re.findall('(?:/good/)|(?:/owner_info)', '/good/<цифры>/owner_info?')
exp.query('url == @card_filte')

здесь все отрабатывает
а вот со вторым и третьим не работает

contacs1 = re.findall(r'(?:/good/)|(?:/owner_info)', '/good/<цифры>/owner_info?')
exp.query('url == @contacs1_filte')

contacs2 = re.findall(r'(?:/bulletin/)', '/bulletin/<цифры>')
exp.query('url == @contacs1_filte')

Для того чтобы искать в столбце используя регулярные выражения можно воспользоваться pandas.Series.str.contains():
<code>
mask = df["column_name"].str.contains(r"<reg_exp>")
res = df.loc[mask]
</code>
PS если в вопросе будет приведен пример данных и ожидаемый результат, то я дополню вопрос примером, с использованием ваших данных...


VK CallBack API долгая обработка запроса
Проблема: есть веб приложение на
Flask, на которое приходят запросы и он должен на них ответить. Ответ не зависит от запроса, а обработка самого запроса может занимать долгое время.
Вопрос: как вернуть ответ "сразу", а обработку запроса выполнить "на фоне"?

Как это реализовано сейчас:

from flask import Flask, request
import time
import json
from multiprocessing import Process

app = Flask(__name__)

def event_handler(event):
    time.sleep(300)  # Имитация долгой обработки запроса

@app.route("/callback_server", methods=["POST"])
def vk_callback():
    event = json.loads(request.data)
    if "type" not in event:
        return "Nope"
    if event["type"] == "confirmation" and event["group_id"] == group_id:
        return confirmation_token
    if event["secret"] != secret:
        return "Auth failed"
    proc = Process(target=event_handler, args=(event,))
    proc.daemon = True
    proc.start()
    return "ok"

Т.е. сейчас у меня обработка запроса выполняется в отдельном процессе, но я не уверен, что это правильно, т.к. плодить процесс при каждом запросе (а быть их может очень много) это не очень хорошая идея. Если же делать через потоки, то из-за GIL нет гарантии, что ответ вернётся "сразу".

Если проблема в том, что один пользователь при запросе должен дожидаться конца обработки запроса другого пользователя, то тут следует использовать какой-нибудь WSGI (например, gunicorn. Хостинг pythonanywhere, к примеру, использует uWSGI).

Если проблема в том, что один пользователь долго ждёт ответа, то возвращать ему ответ до того, как сервер обработал этот запрос, не очень правильно. Контрпример:

Пусть сущность E создаётся несколько секунд

Пользователь отправил запрос на создание какой-либо сущности E;
Пользователь сразу же получил ответ, что сущность создана;
Следующим запросом пользователь хочет прочитать созданную сущность E, а сервер ещё не успел её создать.

Как это применимо к VK Callback API: Callback API имеет механизм повторных отправок уведомлений в случае, если сервер в ответ не вернул
ok. Проблема кроется в том, что на фоне этот запрос может и не обработаться (завершиться с ошибкой), но сервер вернёт
ok, что предовратит повторную отправку уведомлений, которая происходит при неудаче. Таким образом, Ваш "фоновый процесс" запрос не обработает, но сервер ответит что обработал.
Если же это не является проблемой и всё ещё остаётся необходимость обрабатывать запросы "в фоне", то лучше обрабатывать их в процессах, а не потоках, т.к., судя по описанию, обработка запроса здесь является CPU-bound операцией. Только вместо того, чтобы плодить процесс при каждом запросе, лучше завести некий пул процессов и отправлять задачу им. Таким образом, всегда будет крутиться фиксированное количество процессов, которые будут выполнять задачи из очереди.


telegra bot на aiogram как использовать состояния в callback_query_handler?
Использую aiogram для управления ботом
машина состояний:

from aiogram.utils.helper import Helper, HelperMode, ListItem

class StateMach(Helper):
    mode =HelperMode.snake_case
    STATE_VIP= ListItem()
    STATE_START= ListItem()

Код обработчиков:

@dp.message_handler(state= '*', commands=['vip'])
async def proc_vip_com(msg: types.Message):
    keyboard=InlineKeyboardMarkup()
    viplist = getvip()
    state = dp.current_state(user=msg.from_user.id)
    await state.set_state(StateMach.all()[0])
    for i in viplist:
        keyboard.add(types.InlineKeyboardButton(text=i[2],callback_data=i[0]))
    await bot.send_message(msg.from_user.id, text="VIP раздел", reply_markup=keyboard)

@dp.callback_query_handler(lambda c: c.data, state = StateMach.STATE_VIP)
async def poc_callback_but(call:types.CallbackQuery):
    await bot.answer_callback_query(call.id)
    await bot.send_message(call.from_user.id, text=call.data)

Почему не работает
callback_query_handler, то есть не запускатся функция
proc_callback_but и как это исправить?

во-первых:

fsm aiogram use StatesGroup

пример:

from aiogram.dispatcher.filters.state import StatesGroup, State

class States(StatesGroup):

    start: State = State()
    end: State = State()
    contact: State = State()
    geo: State = State()
    get_mail: State = State()
    mail_ver: State = State()
    save_json: State = State()
    search_json: State = State()
    send_paste: State = State()

во-вторых callback можно сделать через:

posts_cb: CallbackData = CallbackData('post', 'id', 'action')` <br>

вот еще:

InlineKeyboardButton(text=text,
  callback_data=self.posts_cb.new(id=hash(call_back[val]),
  action=call_back[val]), )

и потом:

@dp.callback_query_handler(posts_cb.filter(action=["jsonbox"]))

и еще у aiogram есть документация
вот пример бота
чат aiogram


Не могу понять в чем ошибка. print не показывакт big и small number
Мне нужно заполнить 3 переменные через input. Вывести самое большое и самое маленькое.
Никак не могу понять, что делаю не так.
<code>
try:
num_1 = int(input('1 number'))
num_2 = int(input('2 number'))
num_3 = int(input('3 number'))
if num_1 > num_2 and num_3:
    num_1 = big_num
    if num_1 < num_2 and num_3:
        num_1 = small_num
        if num_2 > num_1 and num_3:
            num_2 = big_num
            if num_2 < num_1 and num_3:
                num_2 = small_num
                if num_3 > num_1 and num_2:
                    num_3 = big_num
                    if num_3 < num_1 and num_2:
                        num_3 = small_num
                        print(big_num, small_num)
                    else:
                        None
                else:
                    None
            else:
                None
        else:
            None
    else:
        None
else:
    None
except ValueError:
       print('Только числа:')
</code>

Вы делаете что-то невероятно сложное.
Предлагаю воспользоваться функциями
min и
max.
Пример:

num_1 = int(input('1 number: '))
num_2 = int(input('2 number: '))
num_3 = int(input('3 number: '))

nums = [num_1, num_2, num_3]

print('Max:', max(nums))
print('Min:', min(nums))

Или ещё короче:

nums = [int(input(f'{i+1} number: ')) for i in range(3)]

print('Max:', max(nums))
print('Min:', min(nums))


Можно ли оптимизировать данный код? [закрыт]

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

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 4 года назад.

                        Улучшить вопрос

Задача: Входные данные содержат два целых числа a и b, по одному в строке (−10^100 ⩽ a, b ⩽ 10^100). Вывести сумму чисел a и b.
Программа работает, но выглядит громоздко.
Можно ли как-то уменьшить или ускорить работу программы?
<code>
def addition(a, b:str): #сложение
    A = []
    B = []
    for i in a:
        A.append(int(i))
    for i in b:
        B.append(int(i))
    if len(A)>len(B):
        B = [0] * (len(A) - len(B)) + B
    else:
        A = [0] * (len(B) - len(A)) + A
    C = [0] * (len(A) + 1)
    for i in range(len(A), 0, -1):
        s = A[i-1] + B[i-1] + C[i]
        a = s // 10
        b = s % 10
        C[i] = b
        C[i-1] = a
    return C

def subtraction(a, b:str): #вычитание
    A = []
    B = []
    for i in a:
        A.append(int(i))
    for i in b:
        B.append(int(i))
    B = [0] * (len(A) - len(B)) + B
    C = [0] * len(A)
    for i in range(len(A) - 1, -1, -1):
        if A[i] < B[i]:
            k = i - 1
            while A[k] == 0:
                A[k] = 9
                k -= 1
            A[k] -= 1
            A[i] += 10
        C[i] = A[i] - B[i]
    return C

def deliting(C:list): #удаление лишних нулей в начале числа
    while C[0] == 0:
        C.pop(0)
    for i in range(len(C)):
        print(C[i], end='')

def comparison(a, b:str): #сравнение
    if len(a) > len(b):
        return (a, b, 1)
    elif len(a) < len(b):
        return (b, a, 2)
    else:
        for i in range(len(a)):
            if a[i] > b[i]:
                return (a, b, 1)
            elif a[i] < b[i]:
                return (b, a, 2)

a = input()
b = input()

if len(a) < 10 and len(b) < 10:
    print(int(a)+int(b))
elif a[0] != '-' and b[0] != '-':
    C = addition(a, b)
    deliting(C)
elif a[0] == '-' and b[0] != '-':
    a = a[1::]
    a, b, id = comparison(a, b)
    C = subtraction(a, b)
    if id == 1: # a>b
        print('-', end='')
        deliting(C)
    else:
        deliting(C)
elif a[0] != '-' and b[0] == '-':
    b = b[1::]
    a, b, id = comparison(a, b)
    C = subtraction(a, b)
    if id == 2: # a<b
        print('-', end='')
        deliting(C)
    else:
        deliting(C)
else: #a[0] == '-' and b[0] == '-'
    a = a[1::]
    b = b[1::]
    addition(a,b)
    print('-', end='')
    deliting(C)
</code>

Навскидку, без вникания в аглоритм
1

A = []
for i in a:
    A.append(int(i))

можно заменить на:

A = list(map(int, a))

2

if len(A) > len(B):
    B = [0] * (len(A) - len(B)) + B
else:
    A = [0] * (len(B) - len(A)) + A
C = [0] * (len(A) + 1)
for i in range(len(A), 0, -1):

можно заменить на однократное вычисление len:

la = len(A)
lb = len(B)
if la > lb:
    B = [0] * (la - lb) + B
    ...

3

for i in range(len(a)):
    if a[i] > b[i]:
        return (a, b, 1)
    elif a[i] < b[i]:
        return (b, a, 2)

не использовать индексы

for a1, b1 in zip(a, b):
    if a1 > b1:
        return (a, b, 1)
    elif a1 == b1:
        pass  # '==' по идее быстрее '<', т.е. этой добавление этого elif возможно ускорит
    else:
        return (b, a, 2)


Как использовать обученную нейронную сеть?
Я сделала нейронную сеть с помощью библиотеки keras и обучила на cifar-10.
Теперь, как мне на неё подать одно изображение из папки и получить ответ, а не прогонять сеть по тестовой выборке?
<code>
from keras.models import model_from_json

# Загрузить данные об архитектуре сети
json_file = open("neural_test.json", "r")
loaded_model_json = json_file.read()
json_file.close()

# Создать модель на основе загруженных данных
loaded_model = model_from_json(loaded_model_json)

# Загрузить веса в модель
loaded_model.load_weights("neural_test.h5")

#Загрузить данные
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

#нормализовать данные об интенсивности пикселей картинки
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

#преобразовать метки класса в категории
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)

# Компиляция модели
loaded_model.compile(loss="categorical_crossentropy", optimizer="sgd", metrics=["accuracy"])

# Проверка модели на тестовых данных
scores = loaded_model.evaluate(X_test, Y_test, verbose=0)
print("Точность сети на тестовых данных: %.2f%%" % (scores[1]*100))
</code>
Сейчас, как видно, сеть может выдать только свою точность

Для этого нужно подать на вход модели тензор размерности
(N, 32, 32, 3), где
N число картинок, которые вы хотите подать на вход сети для предсказания.

Y_predicted = loaded_model.predict(X_tensor)

PS даже если вы хотите подать на вход НС единственную картинку, ее надо преобразовать в 4D (четырех-мерный) тензор размерности:
(1, 32, 32, 3)


update.message.reply_text('Hi!') Как это работает? [дубликат]

На этот вопрос уже даны ответы здесь:

Группировка функций внутри классов

                                (2 ответа)

Закрыт 4 года назад.

Наткнулся на эту строку и не могу понять как сделать класс так чтобы получилось слово1.слово2.функция('параметр'). Можно ли сделать цепочку больше? Что означают слово1 и слово2? Это функции какого-то класса? Приведите пожалуйста пример и объясните как это работает.

У вас есть экземпляр класса слово1 в котором есть объект - слово2, который является экземпляром другого класса, у которого в свою очередь есть метод функция(). Внутри слова2 так-же может быть объект со своими методами или своими объектами и так далее.
Упрощенный пример
<code>
class Message:
    def __init__(self, mess):
        self.message = mess

    def append_text_to_message(self, text):
        return self.message + text

class Updater():
    def __init__(self, var):
        self.var = var
        self.message = Message(self.var)

update = Updater('Message ')

x = update.message.append_text_to_message('text')

>>> x
'Message text'
</code>


Использование функции в качестве значения словаря в Enum классе
Имеется данный код, но при запуске выдает ошибку:

TypeError: 'CLASS' object is not subscriptable.

Как я могу исправить это?
<code>
from enum import Enum

def some_func():
    return 1

class CLASS(Enum):
    OBJECT = {"key" : 1, "value" : some_func}

print(CLASS.OBJECT['value']())
</code>

Члены класса-перечисления являются экземплярами этого класса

>>> isinstance(CLASS.OBJECT, CLASS)
True

Чтобы получить соответствующее им значение, нужно обратиться к полю
value

>>> print(CLASS.OBJECT.value['value']())
1


Как сделать кнопку неактивной в tkinter?
Допустим мне нужно сделать эту кнопку неактивной:
<code>
tkinter.Button(win, text='Кнопка', font='Arial 18').place(x=80, y=230, width=100, height=35)
</code>

import tkinter as tk

root = tk.Tk()
button = tk.Button(root, text='Button')
button.pack()

button['state'] = 'disabled'
# или через метод config: button.config(state='disabled')

root.mainloop()

Для активации нужно установить значение
'normal':

button['state'] = 'normal'
# или через метод config: button.config(state='normal')


Как сделать выборку только тех объектов, у которых есть связанные объекты
Есть 2 модели со связью ForeignKey

class Parent(models.Model):
    name = models.CharField(max_length=30)

class Child(models.Model):
    name = models.CharField(max_length=30)
    parent = models.ForeignKey(Parent, related_name='child', on_delete=models.CASCADE)

Как сделать выборку только тех родителей, у которых есть хотя бы один ребенок?

qs = Parent.objects.filter(child='как это сделать?')

Нашел
<code>
qs = Parent.objects.filter(child__isnull=False).distinct()
</code>


Арифметические операции в Python справа налево, а не слева направо?
Простенький пример в Python вызвал у меня недоумение:

d = 15.961599999999999
d ** 1.5
>>>63.76973829534582
d ** 0.5 ** 3
>>>1.4137888521577402
0.5 ** 3
>>>0.125
d ** 0.125
>>>1.4137888521577402

Вопрос: почему Python вначале выполняет возведение
0.5 ** 3, а уже потом
d ** (0.5 ** 3). Разве не должны арифметические операции выполняться слева направо?
(d ** 0.5) ** 3

из документации (Python: table of operator precedence):

Operators in the same box group left to right (except for
  exponentiation, which groups from right to left).


PYTHON ModuleNotFoundError: No module named 'Image' хотя модуль установлен
Хочу импортировать компонент image, установил и импортировал:
<code>
import image
text = "Hello, PIL!!!"
color = (0, 0, 120)
img = Image.new('RGB', (100, 50), color)
imgDrawer = ImageDraw.Draw(img)
imgDrawer.text((10, 20), text)
img.save("pil-basic-example.png")
</code>
обшарил весь google и решение не нашел.
P.S. у меня кастомный путь установки: A:\Python\

Попробуйте вместо

import image

написать

from PIL import Image
from PIL import ImageDraw


Selenium. Как выбрать рандомный элемент в select
Как выбрать рандомный элемент в select в питоне с помощью Selenium.
Или как получить все элементы ?

После того, как вы сделали:

browser.get('example.com')

делаете:

elements = browser.find_elements_by_xpath('//*')
random_element = elements[random.randint(0, len(elements)-1)]

Здесь в коде:

'//*' - буквально значит - "Все элементы"

len(elements)-1 - вернёт число равное, количеству найденных элементов (это все элементы из xPath адреса выше) минус один, так как индексация начинается с 0, а не с 1.

random.randint(0, len(elements)-1) - вернёт случайное Целое число из последовательности от 0 до "количества найденных элементов минус 1"

elements[random.randint(0, len(elements)-1)] - обращение к элементу в списке по случайному индексу


Как правильнее подбирать параметры модели (RandomizedSearchCV,.GridSearchCV) или же вручную
Столкнулся с задачей подбора параметров для модели lightgbm, соответсвенно возникает вопрос, каким способом лучше всего их подбирать? Использовал метод RandomizedSearchCV, в течение 10 часов подбирались параметры, а толку от этого нет, точность такая же как и при ручном вводе параметров наугад. +/- смысл параметров понятен, какие отвечают за переобучение, какие за точность и скорость обучения, но вот не совсем понятно, если подбирать вручную то по одному или по парам, или еще варианты?
Ниже превожу пример как я реализовал подбор параметров:
<code>
SEED = 4
NFOLDS = 2
kf = KFold(n_splits= NFOLDS, shuffle=False)

    parameters = {

          'num_leaves': np.arange(100,500,100),
          'min_child_weight': np.arange(0.01,1,0.01),
          'feature_fraction': np.arange(0.1,0.4,0.01),
          'bagging_fraction':np.arange(0.3,0.5,0.01),
          'min_data_in_leaf': np.arange(100,1500,10),
          'objective': ['binary'],
          'max_depth': [-1],
          'learning_rate':np.arange(0.001,0.02,0.001),
          "boosting_type": ['gbdt'],
          "bagging_seed": np.arange(10,42,5),
          "metric": ['auc'],
          "verbosity": [1],
          'reg_alpha': np.arange(0.3,1,0.2),
          'reg_lambda':  np.arange(0.37,0.39,0.001),
          'random_state': [425],
          'n_estimators': [500],
    }

 model = lightgbm.LGBMClassifier()
RSCV = RandomizedSearchCV(model,parameters,scoring='roc_auc',cv=kf.split(train),n_iter=30,verbose=50)

RSCV.fit(train,label)
</code>

Если подбор параметров не дает никакого профита, может стоит попробовать другую модель или поработать с фичами (признаками). А если ты хочешь вручную подбирать как-то параметры, то можешь попробовать принцип ортогонализации (Orthogonalization). У Andrew NG на Coursera можешь посмотреть видео на эту тему. Но смысл в том, что ты изменяешь значения одного параметра , а все остальные параметры фиксируешь, и смотришь как меняется качество твоей модели.


Почему элементы переменной не замещаются?
Пытаюсь понять след. код (буду комментировать, чтобы было видно путь моего мышления, чтобы могли меня понять):
<code>
word = "moloko" #слово которое нужно угадать
so_far = "x" * len(word) по одному x на букву, которую надо угадать
# пока слово не угадано
while so_far != word:
Просим пользователя ввести букву
guess = input("")
если буква есть в слове, которое надо угадать
if guess in word:
new = "" #создаем пустую строку для добавления элементов
    for i in range(len(word)):#итерация выполняется 6 раз(длина слова)
        if  guess==word[i]: #если буква есть угадываемом слове
            new = new + guess #добавляем в переменную букву
            print(new)
        else:#иначе
            new = new + so_far[i] #добавляем x
            print(new)
            # print(so_far[i])
    so_far = new
</code>
На выходе, допустим если ввести первой буквой "o", будет xoxoxo, и если затем "м", будет moxoxo. Так вот вопрос, разве переменная new, куда записывается буквы и x, при вводе другой буквы, которая есть в слове, допустим "м", не должна ли полностью меняться на mxxxx? Объясните пжл, я видимо не до конца понимаю этот код!(((( Я пол дня и уже вечер не могу понять, вернее я понял, но не до конца понимаю, как происходит итерация в данном коде

Вот в этой строке:

new = new + so_far[i] #добавляем x

Ваш комментарий верен только для самого первого угадывания, когда у нас действительно в
so_far лежат одни иксы.
Однако уже после первого угадывания, последняя строчка:

so_far = new

записывает в
so_far текущий
new. Поэтому после первого угадывания в
so_far лежат уже не шесть иксов, а
'xoxoxo'.


Ускорить процес обработки данных
подскажите как можно ускорить процесс обработки данных.
Есть 2 столбца, если значение 2 столбца совпадает с нужным мне названием, я вытаскиваю значение из первого столбца этой же строки + проверка на одинаковые значение.
Когда в базе около 2000 строк, работает достаточно быстро, но когда их около 100 000, обработка занимает около 10сек. Есть какой-то способ уменьшить время обработки?
<code>
for index,row in mdlReg.iterrows():
        if row['Zonetype'] == 'Aisle':
            a = row['zonename']
            if a not in self.sektor:
                self.sektor.append(a)
        if row['Zonetype'] == 'Floornum':
            a = str(row['zonename'])
            if a not in self.floor:
                self.floor.append(a)
        if row["Zonetype"] == "Sector":
            a = str(row['zonename'])
            if a not in self.spanN:
                self.spanN.append(a)
        if row["Zonetype"] == "Zonename":
            a = str(row["zonename"])
            if a not in self.placevalue:
                self.placevalue.append(a)
</code>

Отфильтровать по логической маске и взять уникальные значения?
<code>
self.sektor = mdlReg[mdlReg['Zonetype'] == 'Aisle']['zonename'].unique().tolist()
self.floor  = mdlReg[mdlReg['Zonetype'] == 'Floornum']['zonename'].unique().tolist()
self.spanN  = mdlReg[mdlReg['Zonetype'] == 'Sector']['zonename'].unique().tolist()
self.placevalue = mdlReg[mdlReg['Zonetype'] == 'Zonename']['zonename'].unique().tolist()
</code>


В каком виде в оперативной памяти хранятся генераторы?
В каком виде в оперативной памяти храниться генератор при итерации по нему?
Например:

res = (num for num in range(10**100000)
for el in res:
    print(el)

Понятно, что сам генератор храниться как объект в оперативной памяти и занимает некоторое определенное место. Но что происходит при непосредственной итерации по нему? Какую память начинает занимать сам генератор
res после 1-ой, 2-ой и так далее итераций?

res = (num for num in range(10**100000)

приблизительно соответствует следующему коду

def f():
    for num in range(10**100000)
        yield num

res = f()

Здесь
f – это сопрограмма, специальная функция, которая приостанавливает выполнение после каждого
yield, давая возможность вызывающей стороне забрать сгенерированное значение, а также передать какое-нибудь значение внутрь функции.
Сопрограмма возобновит выполнение с того места, где остановилась, когда вызывающая сторона попросит следующее значение. Если значений не осталось (сопрограмма завершилась), она выбросит исключение
StopIteration, которое воспринимается как сигнал к завершению цикла.

def f():
    for i in range(3):
        x = yield i * i
        print('получено', x)

>>> coro = f()
>>> coro.send(None)
0
>>> coro.send(11)
получено 11
1
>>> coro.send(True)
получено True
4
>>> coro.send('test')
получено test
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Другими словами, генераторное выражение хранится в виде вызванной, но не завершенной функции, и занимает примерно столько памяти, сколько требуется на хранение самого функционального объекта и всех локальных переменных вызванной функции.
С
range дела обстоят немного иначе. Это объект, который хранит три значения –
начало,
конец и
шаг и на их основе позволяет вычислить любое значение из диапазона по формуле

ri = начало + i ∙ шаг

или

ri = конец + i ∙ шаг

если индекс отрицательный.
А при взятии среза создается новый объект
range

>>> r = range(0, 1000000, 1000)
>>> r[0]
0
>>> r[-1]
999000
>>> r[1:10]
range(1000, 10000, 1000)
>>> r[::-1]
range(999000, -1000, -1000)

Когда такой объект передается в
for, создается итератор, который дополнительно хранит еще и индекс текущего элемента.

>>> r = range(3)
>>> it = iter(r)
>>> it
<range_iterator object at 0x7f5cb3a91ba0>
>>> next(it)
0
>>> next(it)
1
>>> next(it)
2
>>> next(it)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

Т.е.
range, так же как и генераторное выражение не нуждается в том, чтобы хранить все значения в памяти, он просто высчитывает очередное значение при каждом обращении


Удаление пары ключ-значение в словаре с использованием .lower()
Нужно удалить из словаря пару ключ-значение независимо от того, каким регистром вводится ключ.
Словарь содержит:

'Bob' : '123123',
'Henry' : '9239829',
'Sandy' : '98238989'

Если вводить ключ регистром, отличным от указанного в ключе, выдает ошибку KeyError, то есть, например, если ввести bob вместо Bob, случится ошибка.
Как сделать так, чтобы ключ удалялся независимо от используемого регистра, чтобы при вводе 'bob' удалялся ключ 'Bob'?
Пробовал сделать так:

delete = input()
        del ab[delete.lower()]

и так:

delete = input().lower()
        del ab[delete]

Что, по-моему, одно и то же, не работает.

UPD получилось удалить ключ с помощью

        delete = input()
        for name in list(ab):
            if name.lower() == delete:
                del ab[name]

<code>
dic = {'Bob' : '123123',
'Henry' : '9239829',
'Sandy' : '98238989' }
key = input()
dic.pop(key if key[0].isupper() else key[0].capitalize() + key[1:])
</code>
Как-то так.


Как пропустить часть кода в Python?
Я еще только начинаю изучать Python и никак не могу понять как пропустить часть кода. Допустим у меня есть вот это:
<code>
print ('Начало')
for j in 'hellow  world':
    if j == 'w':
        break
    print(j*2, end = '')

l = [12, 34, 54, 67]
print ('\n',l)

print('\n',l, sep='')
print('123')
print(*'123')
print(*'123', sep=', ')

l = [1, 4, 45, 56, 78]
i = 0
while i < 4:
    print (l[i])
    i += 1
print ('Конец')
</code>
Я хочу, чтобы у меня выводилось только Начало и Конец. Как это сделать? Подскажите пожалуйста

Можно, например, воспользоваться условным оператором
if и ввести дополнительную переменную, которая будет будет показывать нужно ли вывести всё или пропустить часть кода.

print ('Начало')
print_all = False # флаг, показывающий нужно ли выводить всё
if print_all:
    for j in 'hellow  world':
        if j == 'w':
            break
        print(j*2, end = '')

    l = [12, 34, 54, 67]
    print ('\n',l)

    print('\n',l, sep='')
    print('123')
    print(*'123')
    print(*'123', sep=', ')

    l = [1, 4, 45, 56, 78]
    i = 0
    while i < 4:
        print (l[i])
        i += 1
print ('Конец')


Как оформить в одну строку вывод текста со значениями % format в python
У меня в 2 сроки получется код

print("Пропусков стало:")
'{:.1%}'.format(new.isnull().sum().sum() / df.size)

Сейчас выводится например

Пропусков стало:
0.2 %

А как сделать, чтобы выводилось в одну строку(например)

Пропусков стало: 0.2 %

Надо просто не разделять один аргумент на два:
<code>
print("Пропусков стало: {:.1%}".format(new.isnull().sum().sum() / df.size))
</code>


Как удалить столбцы, у которых кол-во пропущенных значений больше 2 согласно прилагаемого алгоритма
Алгоритм удаления по заданию следующий:

найдите все такие столбцы (метод
.isna() + подвыборка с условием)
определите их названия (поймите как выцепить названия и сохраните их в массив, т.е. по цепочке примените методы
.index,
.tolist() или
.values)
"дропните их" (используйте метод
.drop (имена столбцов))
результат сохраните в новой табличке (например,
data_1), исходную менять не нужно

Сделала по-другому:

cols_to_delete = df2.columns[df2.isna().sum() > 2]
df2.drop(cols_to_delete, axis = 1, inplace = True)

Что мне непонятно: как сделать задание по вышеуказанному алгоритму #1 - #4.

df = pd.DataFrame({
    'col1': [23, 54, pd.np.nan, 87],
    'col2': [45, 39, 45, 32],
    'col3': [pd.np.nan, pd.np.nan, 76, pd.np.nan,]
})

Исходный DF:

In [92]: df
Out[92]:
   col1  col2  col3
0  23.0    45   NaN
1  54.0    39   NaN
2   NaN    45  76.0
3  87.0    32   NaN

Решение 1:

In [93]: thresh = 2

In [94]: new = df.loc[:, df.isna().sum().le(thresh)]

Решение 2:

In [96]: new = df.drop(columns=df.columns[df.isna().sum() > thresh])

Результат:

In [95]: new
Out[95]:
   col1  col2
0  23.0    45
1  54.0    39
2   NaN    45
3  87.0    32


requests.exceptions.TooManyRedirects: Exceeded 30 redirects
Я парсю этот портал.Заголовок,дату и контент новости.И при парсинге использую python 3.7 библиотеку
BS4
И вот при парсинге этого портала у меня выходит такая ошибка:

Traceback (most recent call last):
  File "C:/Users/Администратор/PycharmProjects/Task/parser.py", line 124, in <module>
    call_all_func(resources)
  File "C:/Users/Администратор/PycharmProjects/Task/parser.py", line 104, in call_all_func
    item_page = get_html(resource_link)
  File "C:/Users/Администратор/PycharmProjects/Task/parser.py", line 14, in get_html
    r = requests.get(url)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 668, in send
    history = [resp for resp in gen] if allow_redirects else []
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 668, in <listcomp>
    history = [resp for resp in gen] if allow_redirects else []
  File "C:\Users\Администратор\AppData\Local\Programs\Python\Python37-32\lib\site-packages\requests\sessions.py", line 165, in resolve_redirects
    raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp)
requests.exceptions.TooManyRedirects: Exceeded 30 redirects.

 Process finished with exit code 1

Вот строчка кода
request запроса

def get_html(url):
    r = requests.get(url)
    return r.text

Пробовал делать так

def get_html(url):
    r = requests.get(url,allow_redirects=True)
    return r.text

Но это мне не помогло.
Я из ошибки понял только то,что превышено 30 перенаправлений.Как устранить эту ошибку ?

Нашел в чем была причина:Циклические редиректы. То есть странница ссылается на саму себя, и requests при попытке дойти до итоговой страницы превышает лимит запросов. Решение проблемы - игнорировать ошибку. Перехватывать ее.

<code>
# < Получаем html код.
def get_html(url):
    try:
        r = requests.get(url)
        return r.text
    except requests.exceptions.TooManyRedirects:
        pass
</code>


Обращение по индексам в Pandas с инверсией (исключить индексы из выборки)
Не смог найти в документации:
Есть список индексов которые мне НЕ нужно выводить.
Как вывести с помощью
.loc или как-то иначе индексы вне этого списка?

Есть подозрение, что вы не очень хорошо искали.

import pandas as pd

df = pd.DataFrame({'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9], 'col2': [3, 4, 5, 6, 7, 8, 9, 10, 11]})
print(df)

   col1  col2
0     1     3
1     2     4
2     3     5
3     4     6
4     5     7
5     6     8
6     7     9
7     8    10
8     9    11

Выводим "срез":

print(df.loc[1:5])
   col1  col2
1     2     4
2     3     5
3     4     6
4     5     7
5     6     8

Выводим без одного элемента (не самый элегантный способ:

print(df.loc[df.index != 1])
   col1  col2
0     1     3
2     3     5
3     4     6
4     5     7
5     6     8
6     7     9
7     8    10
8     9    11

Выводим без элементов из списка:

print(df.loc[~df.index.isin([1,3,5])])
   col1  col2
0     1     3
2     3     5
4     5     7
6     7     9
7     8    10
8     9    11


Ошибка при распаковке данных из БД
Есть БД с данными о пользователях. Данные принимаю через цикл
for:

        import sqlite3

        Connect = sqlite3.connect('TheTruckerDB.db')
        Cursor = Connect.cursor()

        user_id = event.object.from_id
        vk = session_api

        SQLCheck = """SELECT uid, fname, lname, car, money, lvl FROM Players WHERE uid = ?"""
        Cursor.execute(SQLCheck, (str(user_id),))

        for u_id, f_name, c, m, l in Cursor.fetchall():

                mess = '🙎♂ Ваш профиль:\n\n🆔:\t{u_id}\nИмя:\t{f_name}\nУровень:\t{l}\nТранспорт:\t{c}\nДенежный баланс:\t{m}\n\nДата регистрации:'

        send_message(vk, peer_id, message=mess)

При запросе, чтобы вывести данные через
send_message. Но возникает ошибка:

   for u_id, f_name, c, m, l in Cursor.fetchall():
ValueError: too many values to unpack (expected 5)

Подскажите, что не так.

Ваш запрос выбирает из базы шесть полей для строки (uid, fname, lname, car, money, lvl).
А вот здесь:
<code>
for u_id, f_name, c, m, l in Cursor.fetchall():
</code>
Вы пытаетесь эти шесть значений распихать в пять переменных.
Соответственно, либо уберите из SELECT лишнее поле, либо добавьте в for ещё одну переменную.


Формат генератора списка в параметре функции
Почему в параметре метода
join можно упускать квадратные скобки при генерации списка?

my_str = ' '.join(i for i in ['rat','milk','pit','bull','dog'] if len(i)>3)

Но

A = i for i in ['rat','milk','pit','bull','dog'] if len(i)>3

вызовет ошибку.

Выражение без квадратных скобок (
[]) и с ними — это два разных выражения.

В Вашем примере Вы не используете квадратные скобки, поэтому следующее выражение:

i for i in ['rat','milk','pit','bull','dog'] if len(i)>3

расценивается как генератор (
generator expression или же
genexpr).
Обычно такие выражения обрамляются в круглые скобки (
()), но они иногда могут быть опущены, как в первом Вашем примере.
Если же квадратные скобки использовать:

[i for i in ['rat','milk','pit','bull','dog'] if len(i)>3]

то это уже будет списковое включение (
list comprehension или же
listcomp).

Большой разницы между ними нет.
Если в кратце, то генератор возвращает значения по одному и только если его "попросить", а списковое включение сразу возвращает готовый список.
В Вашем примере эта разница неочевидна.
Всё потому, что метод
join поддерживает методы итерирования и сам по одному "просит" элементы из генератора.

Теперь давайте докажем это, проведя дизассемблирование кода. Чтоб уж наверняка :)
Генератор:

print(dis.dis(r"x = ' '.join(i for i in [1, 2, 3])"))

stdout (частично):

4 LOAD_CONST 1 (<code object <genexpr> at ..., file "<dis>", line 1>)
#                             ^^^^^^^

Списковое включение:

print(dis.dis(r"x = ' '.join([i for i in [1, 2, 3]])"))

stdout (частично):

4 LOAD_CONST 1 (<code object <listcomp> at ..., file "<dis>", line 1>)
#                             ^^^^^^^^


Не могу создать массив numpy. Module 'numpy' has no attribute 'array' [закрыт]

Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются.

 Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.

Закрыт 1 год назад.

                        Улучшить вопрос

Не получается создать и вывести матрицу, пишет, что

module 'numpy' has no attribute 'array'

Вот сам код:
<code>
import numpy as np
a = np.array([1, 2, 3])
print(a)
</code>

Я нашел ошибку,как было замечено @SergeyGornostaev,я назвал файл также,как и импортируемый модуль,в результате этого,я как бы импортировал "сам себя",потом после переименовки файла,все стало работать корректно.


сравнить все значения элемента списка
есть такой код:
<code>
  def func()
    while True:
            d = len(resultfromsteam['response']['trade_offers_sent'])
                for i in range(d):
                    tradestate = resultfromsteam["response"]['trade_offers_sent'][i]['trade_offer_state']
                    time.sleep(1)
                    if tradestate == 9:
                       print('123')
                    else:
                      func()
</code>
Я хочу, чтобы элемент по очереди проверялся.Если значение ключа с таким-то элементом будет равно 9,print('123')
когда я делаю так,как написано в коде, мне вылетает ошибка,типо слишком много ты вызвал функцию.

for value in resultfromsteam["response"]['trade_offers_sent']:
    if value['trade_offer_state'] == 9:
        print('123')
    continue


Выбор подхода для написания системы
Есть ERP система, парус. Крутится на oracle базе.
Система не обладает ни веб интерфейсом ни мобильными приложениями.
Сейчас там разработана система мм пользователь составляет заявку - кидает туда - дальше там всякие бухгалтерско экономические дела по ее оплате. Грубо говоря небольшая система электронного документа оборота.
Отправка заявки на данный момент реализована через макросы в экселе, оракл модули на компьютерах, извращенно короче.
Требуется перенести этот механизм в web.
Что требуется в вебе - авторизация по учетным записям оракл, не большой дашборд мм грубо говоря выборками из всего списка заявок (сколько согласовано, сколько отправелно и так далее), возможность составить заявку там (заполнить 10 полей, приложить файлик, нажать кнопку отправить и данные загружаются в оракл базу), возможность просмотреть заявки, которые ожидают согласования.
Собственно вопрос. Для работы над этим будет нанят человек, может не один, т.к. я не хочу аутсорс да и свой разработчик давно требуется и нужно понимать, как оптимальнее сделать данный процесс.
Питон+джанго или пхп или может есть более подходящие варианты.

Питон+джанго или пхп или может есть более подходящие варианты.

Выполнить задачу подобную Вашей, можно на любом стеке web технологий. В первую очередь важно:

Чётко поставить задачу. Тогда результат на выходе будет значительно ближе к ожидаемому;
Чтобы в тех бизнес процессах, которые предстоит автоматизировать не было бардака. Иначе ничего, кроме автоматизированного бардака Вы не получите, а время и деньги потратите.

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


Особенности работы JupyterNotebook. Вопрос по работе модуля logging в Python. Дублирование вывода
Приветстсвую! Изучаю модуль logging в Python. Я уже привык тестировать нечто новое в JupyterNotebook и этот раз не стал исключением.
Вот код, который я запускаю:

import logging
import otherMod2

def main():
    """
    The main entry point of the application
    """

    logger = logging.getLogger("exampleApp")
    logger.setLevel(logging.INFO)

    # create the logging file handler
    fh = logging.FileHandler("new_snake.log")

    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    fh.setFormatter(formatter)

    # add handler to logger object
    logger.addHandler(fh)

    logger.info("Program started")
    result = otherMod2.add(7, 8)
    logger.info("Done!")

if __name__ == "__main__":
    main()

В otherMod2.py:

import logging

module_logger = logging.getLogger("example_App.otherMod2")

def add(x, y):
    """"""
    logger = logging.getLogger("example_App.otherMod2.add")
    logger.info("added %s and %s to get %s" % (x, y, x+y))
    return x+y

Вот что, должно печататься в файл "new_snake.log":

2019-08-31 12:32:52,491 - exampleApp - INFO - Program started
2019-08-31 12:32:52,491 - exampleApp.otherMod2.add - INFO - added 7 and 8 to get 15
2019-08-31 12:32:52,491 - exampleApp - INFO - Done!

Что интересно, при повторном запуске
main(), происходит дублирование каждой строки. Т.е. запись в файл становится:

2019-08-31 12:37:26,414 - exampleApp - INFO - Program started
2019-08-31 12:37:26,414 - exampleApp - INFO - Program started
2019-08-31 12:37:26,415 - exampleApp.otherMod2.add - INFO - added 7 and 8 to get 15
2019-08-31 12:37:26,415 - exampleApp.otherMod2.add - INFO - added 7 and 8 to get 15
2019-08-31 12:37:26,415 - exampleApp - INFO - Done!
2019-08-31 12:37:26,415 - exampleApp - INFO - Done!

При третьем запуске пишется соответственно:

2019-08-31 12:38:04,835 - exampleApp - INFO - Program started
2019-08-31 12:38:04,835 - exampleApp - INFO - Program started
2019-08-31 12:38:04,835 - exampleApp - INFO - Program started
2019-08-31 12:38:04,835 - exampleApp.otherMod2.add - INFO - added 7 and 8 to get 15
2019-08-31 12:38:04,835 - exampleApp.otherMod2.add - INFO - added 7 and 8 to get 15
2019-08-31 12:38:04,835 - exampleApp.otherMod2.add - INFO - added 7 and 8 to get 15
2019-08-31 12:38:04,836 - exampleApp - INFO - Done!
2019-08-31 12:38:04,836 - exampleApp - INFO - Done!
2019-08-31 12:38:04,836 - exampleApp - INFO - Done!

Что самое интересное: в случае запуска
main() в PyCharm - всё рааботает нормально. Это именно особенность работы JupyterNotebook. Я думал, что проблема в том, что я несколько раз делаю
import otherMod2 по сути, код внутри otherMod2 выполняется каждый раз. Однако при обычном запуске
main() вывод продолжает увеличиваться везде на один. Что это за особенность такая?

Потому что, как написано в документации:

All calls to this function with a given name return the same logger
  instance. This means that logger instances never need to be passed
  between different parts of an application.

Можно попробовать чистить (
logger.handlers.clear()) так:

import logging
import otherMod2

def main():
    """
    The main entry point of the application
    """

    logger = logging.getLogger("exampleApp")
    if (logger.hasHandlers()):
        logger.handlers.clear()

    logger.setLevel(logging.INFO)

    # create the logging file handler
    fh = logging.FileHandler("new_snake.log")

   formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
   fh.setFormatter(formatter)

   # add handler to logger object
   logger.addHandler(fh)

   logger.info("Program started")
   result = otherMod2.add(7, 8)
   logger.info("Done!")

if __name__ == "__main__":

#logger.addHandler(handler)
    main()


Почему комментарии добавляются только после перезапуска сервера django?
Через админ панель добавляются без проблем, а через input только при перезагрузке сервера.
Что я делаю не так?
<code>
from django.shortcuts import render
from django.http import Http404, HttpResponseRedirect
from django.http import HttpResponse
from .models import Source
from django.urls import reverse
from django.utils import timezone

source_list = Source.objects.order_by('-source_date')[:22]

def index(request):
    return render(request,'source/AllCode.html', {'source_list':
source_list})

def showcode(request, source_id):
    try:
        s = Source.objects.get( id = source_id )
    except:
        HttpResponseRedirect('/source')
    return render(request, 'source/Code.html', {'source': s})

def addcode(request):
    try:
        newsource = Source( source_title = request.POST['title'],
source_language = request.POST['language'],\
        source_code = request.POST['code'], source_date = timezone.now())
        newsource.save()

         return HttpResponseRedirect( reverse('source:showcode', args =
(newsource.id, )) )

    except:
        return render(request, 'source/save.html')
</code>

def index(request):
    source_list = Source.objects.order_by('-source_date')[:22]
    return render(request,'source/AllCode.html', {'source_list':
source_list})


В ответе один ключ используется много раз
Вот response:
<code>
{"response":{"trade_offers_sent":[{"tradeofferid":"3688672517","accountid_other":484947526,"message":"TPA9 ... /trade/2774573977/MhHeod5FnmY/","expiration_time":1568380970,"trade_offer_state":4,}{"tradeofferid":"3688571692","accountid_other":5551133,"message":"UQTM ... /trade/2774290053/KYrUQ0lVCFw/","expiration_time":1568375852,"trade_offer_state":3,}
</code>
в этом респонсе мне надо узнать,допустим tradeofferid во втором обмене.Как это можно сделать?

То, что Вы привели в вопросе не является
Json'ом. В вашем ответе используются завершающие запятые, а также не совпадает количество открывающих и закрывающих скобок. Я думаю, Вы опечатались при копировании.
Если предположить, что Вы имели в виду это:

{
    "response": {
        "trade_offers_sent": [{
            "tradeofferid": "3688672517",
            "accountid_other": 484947526,
            "message": "TPA9 ... /trade/2774573977/MhHeod5FnmY/",
            "expiration_time": 1568380970,
            "trade_offer_state": 4
        }, {
            "tradeofferid": "3688571692",
            "accountid_other": 5551133,
            "expiration_time": 1568375852,
            "trade_offer_state": 3
        }]
    }
}

то Вы можете распарсить ответ с помощью модуля
json.
Пример:

import json

# Я добавил запятые и закрыл скобки, чтобы это стало валидным Json
response = '{"response":{"trade_offers_sent":[{"tradeofferid":"3688672517","accountid_other":484947526,"message":"TPA9 ... /trade/2774573977/MhHeod5FnmY/","expiration_time":1568380970,"trade_offer_state":4},{"tradeofferid":"3688571692","accountid_other":5551133,"expiration_time":1568375852,"trade_offer_state":3}]}}'
d = json.loads(response)

tradeofferid = d['response']['trade_offers_sent'][1]['tradeofferid']
print(tradeofferid)

stdout:

3688571692


Аннотация параметра функции в Python, если параметр - файл
У меня есть функция, которая создает и возвращает объекты на основе переданного в нее
csv файла, к примеру такая:

def get_objects_list(csv_file: xxx) -> list:
    return list()

В функцию я передаю объект файла, полученного из менеджера контекста, и не знаю, как мне его аннотировать. Подскажите?

Воспользуйтесь typing.IO:

import typing

def get_objects_list(csv_file: typing.IO) -> list:
    return list(...)

из документации:

Generic type
IO[AnyStr] and its subclasses
TextIO(IO[str]) and

BinaryIO(IO[bytes]) represent the types of
I/O streams such as
  returned by
open().


Как работает imblearn.under_sampling.ClusterCentroids?
Допустим, есть сильно несбалансированная выборка:
X - признаки,
у - целевая переменная (бинарная). Балансируем выборку с помощью метода
ClusterCentroids() (из модуля
imbalanced-learn), получаем новую выборку
X_cc,
y_cc. Берем модель, например
XGBClassifier (для бинарной классификации), и обучаем ее на этой новой выборке. Далее берем выборку
X1 (из исходного пространства признаков
X), для которой требуется предсказать целевую переменную с помощью обученного ранее классификатора.
Вопрос:
как классификатор, обученный на кластерах признаков исходного
пространства, может предсказывать целевую переменную по самим
признакам исходного пространства (не кластерам)?

Попробую описать суть данного алгоритма и как им пользоваться...
Суть проблемы несбалансированных данных:
Библиотека (модуль)
imblearn /
Imbalanced-Learn предназначена для работы с несбалансированными выборками данных - такими где число образцов / экземпляров, принадлежащих различным классам различаются в разы. В том случае если у нас присутствует только два класса (бинарная классификация), то эти классы принято называть
majority class (класс большинства) и
minority class (класс меньшинства).
Классическим примером является задача выявления мошеннических транзакций. Очень часто в таких выборках доля мошеннических транзакций не превышает 1%. В таком случае даже если в качестве предсказания мы всегда будем маркировать транзакцию как нормальную (не мошенническую), то общая точность предсказания будет >= 99%. Подавляющее большинство алгоритмов классификации плохо справляется с обучением на разбалансированных выборках.
Если коротко, то данную проблему можно решить приблизительно уравняв число экземпляров обоих классов. Делают это обычно следующим способом:

уменьшив число экземпляров класса большинства
увеличив число экземпляров класса меньшинства
комбинация
1. и
2.

Суть алгоритма
imblearn.under_sampling.ClusterCentroids:
Данный алгоритм использует алгоритм кластеризации k-Means для нахождения центроидов (геометрический центр кластера)
N кластеров для класса большинства. Скорее всего, в качестве
N берется число экземпляров класса меньшинства. Таким образом выбрав
N центроидов класса большинства из всех экземпляров класса большинства мы сбалансировали обучающую выборку, оставив в ней по
N экземпляров для каждого класса.
Применение алгоритма
imblearn.under_sampling.ClusterCentroids:
В процессе обучения мы находим оптимальные коэффициенты / веса и для предсказания просто используем найденные коэффициенты / веса, подставив их в функцию алгоритма классификации. (Мы об этом не заботимся - готовые реализации классификаторов делают это за нас.)
Поэтому теоретически нам достаточно сбалансировать только обучающую выборку, обучить модель и дальше можно использовать обученную модель без балансировки.
На практике перед тем как использовать непосредственно классификацию, данные необходимо предварительно подготовить. Обычно подготовка состоит из следующих шагов:

imputing missing data - заполнение или удаление отсутствующих данных (например:
None,
NaN, пустые строки и т.д.), т.к. большинство алгоритмов классификации или не работают или плохо справляются с отсутствующими данными.

encoding non-numerical data - преобразование нечисловых данных в числовые.

data scaling & normalizing - калибровка (скалирование и нормализация) данных

classification - непосредственно классификация.

Чтобы объединить все шаги подготовки данных и классификации часто используют
pipeline:

pipeline = Pipeline([
    ("impute", imputer),
    ("encode", encoder),
    ("scale", scaler),
    ("classify", classifier),
])

и потом используют объект
pipeline для обучения и классификации:

pipeline.fit(X_train, y_train)
y_predicted = pipeline.predict(X_test)

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

PS некоторые моменты в ответе могут показаться слишком очевидными автору вопроса. Я постарался подробно ответить на вопрос, чтобы ответ оказался полезным и понятным также тем кто попадет сюда по ссылке поисковика.


Ошибка при миграции python django
TypeError: init() missing 1 required positional argument: 'on_delete'
Появляется такая ошибка при миграции.
<code>
status = models.ForeignKey(Status)
</code>
Код, который, похоже, вызывает проблемы. Как исправить?

Добавить позиционный аргумент
on_delete.
Пример:

status = models.ForeignKey(Status, on_delete=models.CASCADE)

Данный аргумент отвечает за то, что произойдёт при удалении связанного объекта.
Значение
CASCADE говорит, что запись, которая ссылается на удалённый объект, тоже должна быть удалена.


Как можно сделать "трансформацию" из одного текста в другой
Необходимо сделать что бы из текста, допустим
'Hello World' (Вместо этих, может быть любые слова, которые ввел пользователь) переводились в
'Ｈｅｌｌｏ　ｗｏｒｌｄ'
Готовый "алфавит" из подобных символов:
ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ
Нижний регистр:
ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ
Подскажите как можно такое реализовать.

trans = str.maketrans('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
                      'ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ'
                      'ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ')

print('Hello World'.translate(trans))


получить цвет заливки ячейки в Excel файле
есть файл, который состоит с милиона строк его нужно пропарсить.
что я собственно и сделал, но есть еще задача по проверке цвета заливки в этой ячейке.
<code>
# -*- coding: utf-8 -*-
from openpyxl import load_workbook

wb_form = load_workbook("1.xlsx", data_only=True)
sheet_form = wb_form["1"]
wb = sheet_form["B2"].value
f = open("1.txt", "w+")
tmp = 0

for iter, row in enumerate(sheet_form.values):
    if iter == 0:
        continue
    for i in row:
         if i == None:
             continue
         print(i)

f.close()
</code>
не могу найти решение.
как в момент итерации проверять цвет ячейки?

Пример:
<code>
In [73]: from openpyxl import load_workbook
    ...:
    ...: wb = load_workbook(r"C:\Temp\1.xlsx")
    ...: ws = wb["Sheet1"]
    ...:
    ...: for row in ws.iter_rows(min_row=1, max_col=3, max_row=5):
    ...:     for cell in row:
    ...:         print(f"coordinate: {cell.coordinate}\tvalue: {cell.value}\tcolor: {cell.fill.start_color.index}")
    ...:
coordinate: A1  value: a        color: 00000000
coordinate: B1  value: b        color: 00000000
coordinate: C1  value: c        color: 00000000
coordinate: A2  value: 1        color: 00000000
coordinate: B2  value: 2        color: FFC6EFCE
coordinate: C2  value: 3        color: 00000000
coordinate: A3  value: 4        color: 00000000
coordinate: B3  value: 5        color: FFFFC7CE
coordinate: C3  value: 6        color: 00000000
coordinate: A4  value: 7        color: 00000000
coordinate: B4  value: 8        color: FFFFEB9C
coordinate: C4  value: 9        color: 00000000
coordinate: A5  value: 10       color: 00000000
coordinate: B5  value: 11       color: 5
coordinate: C5  value: 12       color: 00000000
</code>


Как поместить окно tkinter поверх окон других приложений?
Нужно создать окно, которое находилось бы всегда поверх окон других запущенных приложений. Можно ли это реализовать с помощью tkinter'a ?

try:
    from tkinter import*
except:
    from Tkinter import*
root=Tk()
root.attributes("-topmost",True)
root.mainloop()


Как подключить файл, находящийся в параллельный папке?
У меня такая структура папок(все init с двумя нижними чертами по обоим сторонам):
main.py
scraper
---init.py
---Page
------init.py
------Page.py
---BookPage
------init.py
------BookPage.py
---MainPage
------init.py
------MainPage.py
Вопрос: как мне импортировать Page в BookPage? В интернете предлагают изменить path. Можно ли сделать это по другому?
Вот мой главный init.py

from .Page import Page
from .MainPage import MainPage
from .BookPage import BookPage

Вот другие
1

from .BookPage import BookPage

2

from .MainPage import MainPage

3

from .Page import Page

Если я Вас правильно понял, попробуйте в файле BookPage.py:
<code>
from ..Page import Page
</code>
Количество точек означает, на сколько "уровней" вверх нужно подняться, где одна точка – нуль (то есть, остаться на том же "уровне", где находится исходный файл)


Сортировка списка словарей
Дано: 2 словаря содержащие список словарей

a ={'id': 1,
 'jsonrpc': '2.0',
 'result': [{'itemid': '138451',
             'key_': 'rows_changed[foo1]',
             'lastvalue': '0',
             'name': 'Rows changed (delta) for foo1',
             'prevvalue': '0'},
            {'itemid': '97404',
             'key_': 'rows_changed[bar2]',
             'lastvalue': '8',
             'name': 'Rows changed (delta) for bar2',
             'prevvalue': '8'},
            {'itemid': '97412',
             'key_': 'rows_changed[baz3]',
             'lastvalue': '2',
             'name': 'Rows changed (delta) for bz3',
             'prevvalue': '2'},
            {'itemid': '144281',
             'key_': 'rows_changed[#wtf]',
             'lastvalue': '0',
             'name': 'Rows changed (delta) for #wtf',
             'prevvalue': '0'}]}

b ={'id': 3,
 'jsonrpc': '2.0',
 'result': [{'itemid': '138451', 'value_avg': '0'},
            {'itemid': '97404', 'value_avg': '0'},
            {'itemid': '97412', 'value_avg': '0'},
            {'itemid': '144281', 'value_avg': '0'}]}

Задача: В словарь b добавить key_ и name из словаря а в случае если совпадают itemid.
Решение:

for idx_b,_ in enumerate(b['result']):
    for idx_a,_ in enumerate(a['result']):
        if b['result'][idx_b]['itemid'] == a['result'][idx_a]['itemid']:
            b['result'][idx_b]['name'] = a['result'][idx_a]['name']
            b['result'][idx_b]['key_'] = a['result'][idx_a]['key_']

Собсно вопрос: А как-то можно улучшить путём сокращения кода? Или мб какие встроенные функции для этого существуют?

Воспользуйтесь модулем Pandas:

In [40]: import pandas as pd  # pip install pandas

In [41]: cols = ["id", "jsonrpc"]

In [42]: B = pd.io.json.json_normalize(b, ["result"], meta=cols)

In [43]: A = pd.io.json.json_normalize(a, ["result"])

In [44]: res = B.merge(A[["itemid", "name", "key_"]])

результат:

In [45]: res
Out[45]:
   itemid value_avg id jsonrpc                           name                key_
0  138451         0  3     2.0  Rows changed (delta) for foo1  rows_changed[foo1]
1   97404         0  3     2.0  Rows changed (delta) for bar2  rows_changed[bar2]
2   97412         0  3     2.0   Rows changed (delta) for bz3  rows_changed[baz3]
3  144281         0  3     2.0  Rows changed (delta) for #wtf  rows_changed[#wtf]

если хотите получить вложенный словарь (как изначальный
b):

In [46]: d = (res.groupby(cols)
                 .apply(lambda x: x.drop(columns=cols).to_dict("r"))
                 .reset_index(name="result")
                 .to_dict("r"))

In [47]: d
Out[47]:
[{'id': 3,
  'jsonrpc': '2.0',
  'result': [{'itemid': '138451',
    'value_avg': '0',
    'name': 'Rows changed (delta) for foo1',
    'key_': 'rows_changed[foo1]'},
   {'itemid': '97404',
    'value_avg': '0',
    'name': 'Rows changed (delta) for bar2',
    'key_': 'rows_changed[bar2]'},
   {'itemid': '97412',
    'value_avg': '0',
    'name': 'Rows changed (delta) for bz3',
    'key_': 'rows_changed[baz3]'},
   {'itemid': '144281',
    'value_avg': '0',
    'name': 'Rows changed (delta) for #wtf',
    'key_': 'rows_changed[#wtf]'}]}]