malyj_gorgan: (Default)
[personal profile] malyj_gorgan
Переглядав якісь старі емейли і знайшов цікавий кусок коду десь десятилітньої давності. Це були часи, коли я ще був бона фіде вченим, жив в Матлабі, а продакшн код, типу статистичних алгоритмів томографічного відновлення гігантських 3D картинок писав на C. І раптом мені довелося шукати роботу в індустрії, і дали мені зробити домашнє завдання. Ну, є така фішка, особливо давніше була, при пошуках датазнавців дають програмувальний проект. Ну, там, прочитати дані з CSV файлів, пару перетворень, класифікатор, все таке. Зараз -- роботи на півгодини.

Який було би зробити просто, але одна засада - треба було використовувати Python, а я про нього тоді не знав приблизно нічого. Взагалі. Про бібліотеки, про саме існування якихось бібліотек. Відкрив сайт python.org, почав заглядати в документацію... І написав! Правда, тиждень грався, але навіть в час вклався, бо на ту домашку ліміту не було. В процесі щось вивчив, наприклад, з нуля на коліні написав naive Bayes класифікатор для змішаних числових і категорійних змінних (а от нема такого в їхніх бібліотеках, бо надто кастомізовано).

Послав в ту компанію. Чувак відповів -- data science aspects -- superb. Але взяти вони мене не візьмуть, бо у них трохи інший підхід до програмування.

І дивлячись на код нижче, я розумію, чому.... :)
Але, тим не менше, як на людину, яка вчора вперше відкрила документацію Пітону, і обчислює все в Сі, мені, знаєте, навіть не соромно.

А, код -- прочитати CSV табличку.

def read_csv_with_names(fname):
    try:
        fid = open(fname, 'r')
    except:
        raise NameError('Cannot read fname '+fname)
    Nrow, Ncol = -1, 0
    rows, columns, values = {}, {}, []
     
    for s in fid:
        s = s.strip().split(',')
        if(Nrow == -1):
            for z in s[1:]:
                columns[z] = Ncol
                Ncol += 1
            # done dealing with the first file
        else: # we know we are not in the first row
            rows[s[0]] = Nrow
            v = []
            for z in s[1:]:
                if z: v.append(float(z))
                else: v.append(float('inf'))
            values.append(v)	
        Nrow += 1
    # done reading
    fid.close()
    return Nrow, Ncol, rows, columns, values 

UPDATE:
Якщо неясно, то вищенаписаний код -- це спроба скопіювати логіку Сі там, де від неї лише шкода. Він ігнорує існування бібліотек, безпричинно перевизначає  код помилки), і, найгірше, обчислює абсолютно непотрібні змінні, які там для того, щоби потім звертатися до даних в таблиці як до матриці, за числовими індексами. Словом, зараз я те ж саме пишу так:
import pandas
pandas.read_csv(filename,index=0).fillna(float('inf'))
І навіть абсолютно функціонально ідентичний до мого колишнього метод виглядає так:
import pandas
def read_csv_with_names(fname):
    df = pandas.read_csv(fname, index_col=0).fillna(float('inf'))    
    return (df.shape[0], df.shape[1],
            {v:k for k,v in enumerate(df.index)},
            {v:k for k,v in enumerate(df.columns)},
            df.values.tolist())

Date: 2025-03-29 06:51 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Очень даже приличный код. Думаю, у них были совсем другие причины. Например: не китаец.

Date: 2025-03-29 07:28 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Классные задачи. 3d, выделение границ, преобразование Радона всякое... Вкусно. (Но не мне; я люблю код писать.)

Date: 2025-03-30 07:10 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Хм, звучит как идеальное решение, тетраэдральная сетки и адаптивная геометрия. Классно.

Date: 2025-03-29 11:07 am (UTC)
ukurainajin: (Default)
From: [personal profile] ukurainajin
s = s.strip().split(',')
Пайтон може на ходу змінювати типи змінних? З рядка зробити масив?
Edited Date: 2025-03-29 11:21 am (UTC)

Date: 2025-03-30 07:03 pm (UTC)
ukurainajin: (Default)
From: [personal profile] ukurainajin
Залишається текстом? А що тоді повертає split? Хіба не масив рядків? Тож бо й воно, що метод spit — це типова операція в різних мовах. Розбиває рядок за роздільником на масив підрядків.
Результат (тобто масив) у цьому коді записано назад до тієї самої змінної s, котра спочатку була рядком. Тому я й спитав про зміну типу.
Edited Date: 2025-03-30 07:21 pm (UTC)

Date: 2025-03-29 11:53 am (UTC)
From: [personal profile] sassa_nf
> дивлячись на код нижче, я розумію, чому.... :)

А я ні

Date: 2025-03-29 09:59 pm (UTC)
From: [personal profile] sassa_nf
А, тоді зрозуміло. Так, бездоганний код програміста не підходить у data science, я це помітив.

Date: 2025-03-29 11:32 pm (UTC)
From: [personal profile] sassa_nf
Та я розумію. Це я як програміст щодня роблю. Я про pandas. Мене від нього коробить як програміста.

Date: 2025-03-29 08:54 pm (UTC)
bytebuster: (ITCrowd-Cartoon)
From: [personal profile] bytebuster
Код як код, цілком норм, враховуючи ті часи.

Якщо сильно прискіпуватися:
* занадто процедурний,
* відсутність можливості іншої типізації даних (захардкожений float),
* захардкожена наявність header row,
* пряма робота з масивами скасовує можливість async aka lazy computation.

Date: 2025-03-29 11:58 pm (UTC)
bytebuster: (ITCrowd-Cartoon)
From: [personal profile] bytebuster
…Але одразу амністовано за спливанням терміну давності. :)

Profile

malyj_gorgan: (Default)
malyj_gorgan

January 2026

S M T W T F S
     1 23
45678910
11121314151617
18192021222324
25262728293031

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 6th, 2026 01:00 pm
Powered by Dreamwidth Studios