Перевод: сумасшедший технический ботаник
оригинал:к data science.com/top-10-co…
Специалист по данным — это «тот, кто лучше разбирается в статистике, чем любой инженер-программист, и лучше в разработке программного обеспечения, чем любой статистик». Многие специалисты по данным имеют опыт работы в статистике и очень мало опыта в разработке программного обеспечения. Я старший специалист по данным и вхожу в 1% лучших специалистов по Python в Stackoverflow и работаю со многими (младшими) специалистами по данным. Ниже приведен список из 10 распространенных ошибок, с которыми я часто сталкиваюсь.
1. Не делиться данными, на которые есть ссылки в коде
Наука о данных требует кода и данных. Таким образом, чтобы другие могли воспроизвести ваши результаты, они должны иметь доступ к данным. Но многие люди забывают делиться данными, которые использует их код.
import pandas as pd
df1 = pd.read_csv('file-i-dont-have.csv') # fails
do_stuff(df)
решение:использоватьd6tpipeДелитесь файлами данных со своим кодом или загружайте их на S3, в Интернет, на Google Диск и т. д. или сохраняйте в базе данных, чтобы другие могли получить файлы (но не добавляйте их в git, см. ниже).
2. Жестко запрограммированные недоступные пути
Как и в случае с ошибкой 1, если вы жестко запрограммируете путь, к которому у других нет доступа, они не смогут запустить ваш код и должны будут проверить множество мест, чтобы изменить путь вручную. Буу!
import pandas as pd
df = pd.read_csv('/path/i-dont/have/data.csv') # fails
do_stuff(df)
# or
impor os
os.chdir('c:\\Users\\yourname\\desktop\\python') # fails
решение: используйте относительные пути, глобальные переменные конфигурации пути илиd6tpipeСделайте ваши данные легкодоступными.
3. Смешайте данные с кодом
Поскольку коду науки о данных нужны данные, почему бы не собрать их все вместе? Но когда вы посмотрите на свой проект, вы обнаружите файлы данных, изображения, результаты вывода и другие ненужные файлы, смешанные вместе. Упс, какой беспорядок!
├── data.csv
├── ingest.py
├── other-data.csv
├── output.png
├── report.html
└── run.py
решение: Организуйте свой каталог по категориям, таким как данные, отчеты, код и т. д. видетьCookiecutterНаука о данныхилишаблон проекта d6tflowИ используйте инструменты, упомянутые в первой статье, для хранения и обмена данными.
4. Зафиксируйте данные и исходный код с помощью Git
Большинство людей теперь контролируют версии своего кода (если вы этого не сделаете, это еще одна ошибка! См.git). При совместном использовании данных может быть легко добавить файлы данных в систему контроля версий. Это нормально для очень маленьких файлов, но git не оптимизирован для данных, особенно для больших файлов.
git add data.csv
решение: Используйте инструменты, упомянутые в первом пункте, для хранения и обмена данными. Если вы действительно хотите использовать систему контроля версий для управления данными, см.d6tpipe,DVCиGit большое файловое хранилище.
5. Пишите функции вместо DAG
Достаточно вопросов о данных, давайте поговорим о реальном коде! Поскольку первое, что вы изучаете, когда учитесь кодировать, — это функции, код обработки данных в основном организован как ряд функций, которые выполняются линейно. Это может вызвать некоторые проблемы, см.4 причины, почему код машинного обучения работает неправильно.
def process_data(data, parameter):
data = do_stuff(data)
data.to_pickle('data.pkl')
data = pd.read_csv('data.csv')
process_data(data)
df_train = pd.read_pickle(df_train)
model = sklearn.svm.SVC()
model.fit(df_train.iloc[:,:-1], df_train['y'])
**Решение.** Вместо линейного связывания функций код обработки данных лучше писать в виде набора задач с зависимостями. использоватьd6tflowилиairflow.
6. Слишком много циклов зависимости
Как и функции, циклы for — это первое, что вы изучаете, когда учитесь программировать. Это легко понять, но они медленные и многословные, что просто означает, что вы не знаете векторизации и вместо этого используете циклы.
x = range(10)
avg = sum(x)/len(x); std = math.sqrt(sum((i-avg)**2 for i in x)/len(x));
zscore = [(i-avg)/std for x]
# should be: scipy.stats.zscore(x)
# or
groupavg = []
for i in df['g'].unique():
dfg = df[df[g']==i]
groupavg.append(dfg['g'].mean())
# should be: df.groupby('g').mean()
решение:Numpy,scipyиpandasможет помочь вам векторизовать большую часть работы, которая, по вашему мнению, может потребовать зацикливания.
7. Не пишите модульные тесты
По мере изменения данных, параметров или пользовательского ввода ваш код может ненормально сломаться, вы можете этого не заметить, но это может привести к неправильному выводу, и если кто-то примет решение на основе вашего вывода, неверные данные приведут к неправильным решениям. !
**Решение:** используйтеassert
Заявление о проверке качества данных.pandasЕсть аналогичные тесты, которые также можно использоватьd6tstackПроверьте извлечение данных иd6tjoinна подключение для передачи данных. Проверка данных образца кода:
assert df['id'].unique().shape[0] == len(ids) # have data for all ids?
assert df.isna().sum()<0.9 # catch missing values
assert df.groupby(['g','date']).size().max() ==1 # no duplicate values/date?
assert d6tjoin.utils.PreJoin([df1,df2],['id','date']).is_all_matched() # all ids matched?
8. Не комментируйте код
Я вижу, вы торопитесь с анализом. Вы смешиваете вещи и передаете результаты своему клиенту или боссу. Затем через неделю они возвращаются и говорят «можете изменить xyz» или «можете обновить». Вы смотрите на свой код и не помните, почему вы сделали то, что сделали. А теперь представьте, что кто-то другой должен его запустить.
def some_complicated_function(data):
data = data[data['column']!='wrong']
data = data.groupby('date').apply(lambda x: complicated_stuff(x))
data = data[data['value']<0.9]
return data
решение: даже после того, как вы предоставите код для анализа данных, найдите дополнительное время, чтобы аннотировать то, что вы делаете. Вы будете благодарить себя, и другие будут делать то же самое! Это делает вас более похожим на профессионала!
9. Сохраните данные в формате csv или pickle.
Вернемся к данным, в конце концов, это наука о данных. Так же, как функции и циклы, форматы файлов CSV и pickle широко используются, но на практике они не очень хороши. CSV не содержит структуры, поэтому кто-то другой должен снова разбирать числа и даты. Хотя Pickles решает эту проблему, он доступен только в python и не будет сжат. Ни один из них не является хорошим форматом для хранения больших наборов данных.
def process_data(data, parameter):
data = do_stuff(data)
data.to_pickle('data.pkl')
data = pd.read_csv('data.csv')
process_data(data)
df_train = pd.read_pickle(df_train)
решение:использоватьparquetформат или другой формат двоичных данных и схема данных, сжимая данные, где это необходимо.d6tflowВывод данных задачи автоматически сохраняется в паркетном формате, поэтому вам не нужно с ними разбираться.
10. Использование блокнота Jupyter
Это спорный вывод: блокноты Jupyter так же распространены, как CSV, и многие люди используют его, что не означает, что он подходит. Ноутбуки Jupyter создают многие из упомянутых выше вредных привычек при разработке программного обеспечения, в частности:
- У вас возникает соблазн сохранить все файлы в один и тот же каталог
- Напишите код, который работает с контекстными отношениями кода, а не с DAG.
- вы не разбили свой код на модули
- трудно отлаживать
- Код и вывод смешаны в одном файле
- нет хорошего контроля версий