Приветствуем вас на канале "Это разве аналитика?"! Меня зовут Андрей, я разработчик bi / de / java и приглашаю вас присоединиться к нашему каналу @eto_analytica. Здесь вы найдете анализ данных и визуализацию, интересные ссылки, вакансии, уроки, юмор, а также личный опыт в сфере аналитики. Наш стек технологий включает Python, Java, SQL, Tableau, Knime, Yandex.Облако, Yandex DataLens. Если вы интересуетесь аналитикой данных, хотите узнать новое и поделиться опытом с единомышленниками, то этот канал для вас. Присоединяйтесь к нам и давайте вместе развиваться и делиться знаниями в области аналитики!
12 Jan, 06:21
11 Jan, 05:05
10 Jan, 10:41
09 Jan, 13:45
09 Jan, 06:33
08 Jan, 19:01
07 Jan, 18:32
06 Jan, 18:34
03 Jan, 18:13
select-in load
). При использовании Unit Of Work, тот обращается именно к мапперу для сохранения данных.map_imperatively
).01 Jan, 06:52
30 Dec, 10:56
27 Dec, 18:49
27 Dec, 18:29
27 Dec, 07:44
27 Dec, 07:44
25 Dec, 13:27
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, erid 2VtzqvZbrQz
25 Dec, 06:56
25 Dec, 06:55
24 Dec, 08:46
23 Dec, 06:42
22 Dec, 15:26
04 Dec, 13:25
04 Dec, 07:08
04 Dec, 04:31
03 Dec, 17:18
02 Dec, 20:44
02 Dec, 05:04
01 Dec, 05:44
29 Nov, 16:46
pip install pydeps
pydeps your_project_path
29 Nov, 05:23
28 Nov, 07:09
27 Nov, 11:37
27 Nov, 09:00
26 Nov, 04:20
25 Nov, 17:00
25 Nov, 14:56
25 Nov, 14:24
25 Nov, 09:34
25 Nov, 06:39
translate(column, 'áéíóúàèìòùãẽĩõũâêîôûäëïöüçñ', 'aeiouaeiouaeiouaeiouaeioucn')
regexp_replace(column, '[^\x00-\x7F]+', '') /* удаление не ASCII символов */
select timestampz_column at time zone 'Europe/Moscow'
coalesce(
try_cast(timestamp_column as timestamp with time zone),
timestamp_column::timestamp at time zone 'UTC'
) /* если не всегда указана временная зона */
regexp_replace(column, '[^a-zA-Z0-9\s]', '') /* только буквы, цифры и пробелы */
translate(column, '[]{}()*#$%@!?+=/\|', '') /* удаление конкретных символов */
case
when lower(column) in ('1', 'yes', 'true', 'y', 't') then true
when lower(column) in ('0', 'no', 'false', 'n', 'f') then false
else null
end as bool_column
24 Nov, 06:47
case
when date_column between '1900-01-01' and '2100-12-31'
then date_column
else cast(null as date)
end as valid_date /* уточняй, как должно быть
по бизнес-требованиям. иногда даты из средне-далёкого
будущего это ок, например "плановая дата закрытия ипотеки" */
select key,
string_agg(values, ',')
from ...
group by key
select distinct col1, col2, col3
from table
/* или */
select col1, col2, col3
from table
group by col1, col2, col3
with prep_cte as (
select col1, col2, business_key, updated_at,
row_number() over (
partition by business_key
order by coalesce(updated_at, '1900-01-01') desc
) as rn
from table
)
select * from prep_cte
where rn = 1
/* оставляем последнюю версию строки по каждому бизнес-ключу */
23 Nov, 17:59
23 Nov, 10:12
case when trim(lower(column)) in (
'', 'null', 'none', 'n/a', 'na', '-',
'#n/a', '#н/д', '(empty)', 'undefined'
) or column ~ '^\s*$' /* только пробелы */
then null
else column
end as clean_column
case when numeric_col ~ '^\d+(\.\d+)?$'
then cast(numeric_col as decimal(18,2))
else null
end /* для последующих join по числовым полям */
cast(num_id as varchar(20)) as num_id /* для join,
где с одной стороны поле varchar(20), а в другой -- числа */
union example:
select cast(id as varchar) as id, name from table1
union all
select id, name from table2 /* приводим к более широкому типу */
case when try_cast(date_field as date) is not null
then try_cast(date_field as date)
else try_cast(date_field as timestamp)::date
end /* для разных форматов дат */
coalesce(column, 'default') as column
cast(null as [data_type]) as column /* null может быть разных типов */
split_part(full_name, ' ', 1) as surname,
split_part(full_name, ' ', 2) as name /* наивный подход,
для каждого отдельного случая может быть сильно сложнее, вплоть до регулярок */
concat_ws(' ', nullif(address_line_1, ''), nullif(address_line_2, '')) as address
23 Nov, 10:12
column as new_column
try_cast(date_column as date) /* для безопасного приведения */
to_date(date_string, 'YYYY-MM-DD') /* если известен формат */
case when date_column ~ '^\d{4}-\d{2}-\d{2}$' then cast(date_column as date) end /* с валидацией */
case when is_valid_json(json_column) then /* проверка валидности */
json_value(json_column, '$.field_name'),
json_query(json_column, '$.contacts[*].phone'), /* массив */
json_value(json_column, '$.address.city'), /* вложенный объект */
(select string_agg(value, ',')
from json_table(json_column, '$.tags[*]' columns (value varchar path '$'))
) as tags /* массив в строку */
end
trim(upper(replace(column, ' ', '')))
или другому подобному формату. lower(col) like '%sub%string%'
плохо масштабируется и зачастую приводит к неожиданным результатам (когда под шаблон начинают попадать "не те" категории). 16 Nov, 07:10
15 Nov, 10:52
15 Nov, 04:52
12 Nov, 08:47
11 Nov, 09:26
11 Nov, 05:01
10 Nov, 07:03
09 Nov, 19:23
08 Nov, 15:26
08 Nov, 08:09
08 Nov, 07:01
07 Nov, 13:12
07 Nov, 10:54
if 'df1' not in locals():
df1 = pd.DataFrame() # Создаем df1, если он не существует
import pandas as pd
df2 = pd.DataFrame({
'status': [1, 2, 3],
'manager_name': ['Иванов', 'Петров', 'Сидоров'] })
# Проверка наличия df1
if 'df1' not in locals() or df1.empty:
df1 = df2.copy() # Если df1 пустой или не существует, присваиваем ему df2
else:
df1 = pd.concat([df1, df2], ignore_index=True) # Объединение строк
try:
if df1.empty:
# Если df1 пустой, присваиваем ему значения df2
df1 = df2.copy()
else:
# Если df1 не пустой, объединяем его с df2
df1 = pd.concat([df1, df2], ignore_index=True)
except NameError:
# Если df1 не был создан, создаем его как копию df2
df1 = df2.copy()
df1
07 Nov, 06:33
06 Nov, 19:09
06 Nov, 17:00
06 Nov, 13:00
06 Nov, 05:29
05 Nov, 18:39
05 Nov, 06:23
03 Nov, 06:06
02 Nov, 06:56
31 Oct, 16:55
30 Oct, 18:51
30 Oct, 18:51
30 Oct, 15:52
29 Oct, 15:11
29 Oct, 11:04
import pandas as pd
print(pd.version)
df = pd.read_csv("sample.csv")
df["entry_date"] = pd.to_datetime(df["entry_date"])
12/01/2018 08:26
13/12/2018 09:02
%d/%m/%Y %H:%M
- супер. А теперь вишенка на торте, смотрим как преобразовал пандас наши строки:12/01/2018 08:26 -> 2018-12-01 08:26:00
13/12/2018 09:02 -> 2018-12-13 09:02:00
ValueError: time data "13/12/2018 09:02" doesn't match format "%m/%d/%Y %H:%M", at position 881
format
, в котором требуется указать пандасу с каким форматом даты он имеет дело. SELECT
entry_date,
parseDateTime64BestEffort(entry_date) AS entry_date_dt
FROM
s3('https://storage.yandexcloud.net/public-bucket-6/sandbox/sample.csv',
'CSVWithNames')
WHERE
entry_date IN ('12/01/2018 08:26', '13/12/2018 09:02');
entry_date |entry_date_dt |
----------------+-------------------+
12/01/2018 08:26|2018-01-12 05:26:00|
13/12/2018 09:02|2018-12-13 06:02:00|
28 Oct, 03:32
24 Oct, 11:19
24 Oct, 05:06
24 Oct, 04:06
23 Oct, 17:26
23 Oct, 09:51
23 Oct, 05:57
23 Oct, 05:57
22 Oct, 18:51
22 Oct, 05:06
22 Oct, 04:30
21 Oct, 18:58
21 Oct, 10:33
21 Oct, 07:01
21 Oct, 04:25
20 Oct, 08:28
20 Oct, 05:08
19 Oct, 14:28
19 Oct, 05:06
18 Oct, 03:18
17 Oct, 05:14
16 Oct, 06:51
16 Oct, 05:12
еклама. ООО «Отус онлайн-образование», ОГРН 1177746618576 Erid 2VtzqvzVTv3
15 Oct, 16:24
15 Oct, 16:16
15 Oct, 12:46
15 Oct, 05:55
15 Oct, 05:14
pre-commit
, linting
для локальной разработки.