sysdate
- это текущие дата и время. trunc
- округляет дату и время до даты. trunc(sysdate) - 1
- это ноль часов вчерашнего дня.select
parameter_column,
trunc(sysdate) as date_today,
max(case when date_column < trunc(sysdate) then value_column end) as value_today,
trunc(sysdate) as date_yesterday,
max(case when date_column >= trunc(sysdate) then value_column end) as value_yesterday
from target_table
where date_column >= trunc(sysdate) - 1
group by parameter_column
lag
к текущей строке подтягивает предыдущую строку, так что можно объединять значения из двух строк в одной.select
parameter_column,
date_column as date_today,
value_column as value_today,
lag(date_column) over(partition by parameter_column order by date_column) as date_yeaterday,
lag(value_column) over(partition by parameter_column order by date_column) as value_yeaterday
from target_table
where date_column >= trunc(sysdate)
return True/False/1/0
. А потом заводишь нужные переменные, обрабатываешь общий случай с разными ответвлениями и вычислениями, в конце которого уже идет return answer
. GIL который блокирует доступ разных потоков к одному и тому же участку памятиНет, GIL гарантирует, что в каждый момент времени работает только один поток. При этом каждые несколько десятков/сотен тактов процессора работающие потоки сменяют друг друга (если их больше одного).
что собственно является одним из якорей в производетельностиСпорное и корявое утверждение.
зачем нужен класс threading.LockЧтобы дать работать одному потоку, а всем остальным запретить. Потому что иначе переключение между потоками произойдет в общем-то в случайный момент времени, а именно тогда, когда захочет интерпретатор. Он, конечно же, не парится по поводу зашитой в код логики и не будет ждать завершения каких-то конкретных вычислений/чтения/записи.
numpy.where
, которую можно вкладывать в себя, как обычные условные операторы:import numpy as np
import pandas as pd
if __name__ == '__main__':
df = pd.DataFrame({
'movie': [9999999, 2, 3, 1, 9999999],
'rating': [9999999, 2, 9999999, 9999999, 3],
'name': [1, 2, 4, 5, 10]})
df['result'] = np.where(
df['movie'] != 9999999,
df['movie'],
np.where(
df['rating'] != 9999999,
df['rating'],
df['name']))
print(df)
movie rating name result
0 9999999 9999999 1 1
1 2 2 2 2
2 3 9999999 4 3
3 1 9999999 5 1
4 9999999 3 10 3
self.player
равным. Тогда это были бы два различных объекта с абсолютно одинаковым поведением - это кстати один из подходов к созданию синглтонов в питоне.import pandas as pd
class URL_2:
def __init__(self, title=None, description=None):
self.title = title
self.description = description
def __iter__(self):
for attr_name in self.__dict__:
yield getattr(self, attr_name)
if __name__ == '__main__':
site_1 = URL_2(title='Купить телевизор', description='Телевизоры по низкой цене')
site_2 = URL_2(title='Услуги юриста', description='Адвокат спешит к вам')
df = pd.DataFrame([site_1, site_2])
df.columns = site_1.__dict__
print(df)
title description
0 Купить телевизор Телевизоры по низкой цене
1 Услуги юриста Адвокат спешит к вам
uuid[position] < '1'отберет 1/16 от всех значений, а условие
uuid[position] < '11'1/256 часть.
from dateutil import parser
spisok = ['25.05..2001', '25.06.2001', '25.43.2004', '05.02.2005', '27.02.2008']
for elem in spisok:
try:
d = parser.parse(elem, dayfirst=True)
print(f"{elem} -> {repr(d)}")
except parser.ParserError as err:
print(f"{elem} -> {err.__class__.__name__}: {err}")
import dateparser
spisok = ['25.05..2001', '25.06.2001', '25.43.2004', '05.02.2005', '27.02.2008']
for elem in spisok:
d = dateparser.parse(elem, languages=['ru'])
print(f"{elem} -> {repr(d)}")
foo = dict()
min_amount = 1
for type_, amount in (('food', 4), ('food', 3), ('car', 3), ('dog', 1)):
foo[type_] = foo.get(type_, 0) + (amount if amount >= min_amount else 0)
print(*sorted(foo.items(), key=lambda x: x[1]), sep='\n')