У меня два вопроса по Dask. Во-первых: в документации для dask четко указано, что вы можете переименовывать столбцы с тем же синтаксисом, что и pandas. Я использую dask 1.0.0. По какой-либо причине я получаю эти ошибки ниже?
df = pd.DataFrame(dictionary)
df
# I am not sure how to choose values for divisions, meta, and name. I am also pretty unsure about what these really do.
ddf = dd.DataFrame(dictionary, divisions=[8], meta=pd.DataFrame(dictionary), name='ddf')
ddf
cols = {'Key':'key', '0':'Datetime','1':'col1','2':'col2','3':'col3','4':'col4','5':'col5'}
ddf.rename(columns=cols, inplace=True)
TypeError: rename() got an unexpected keyword argument 'inplace'
Итак, я удалил inplace=True
и попробовал следующее:
ddf = ddf.rename(columns=cols)
ValueError: dictionary update sequence element #0 has length 6; 2 is required
Фреймворк данных pandas показывает реальный фрейм данных, но когда я вызываю ddf.compute()
, я получаю пустой фрейм данных.
Мой второй вопрос заключается в том, что я немного не понимаю, как назначать подразделения, мета и имя. Насколько это полезно / вредно, если я использую dask для распараллеливания на одной машине по сравнению с кластером?
Что касается переименования, я обычно меняю имена функций, когда использую dask, возможно, это сработает и для вас:
new_columns = ['key', 'Datetime', 'col1', 'col2', 'col3', 'col4', 'col5']
df = df.rename(columns=dict(zip(df.columns, new_columns)))
Что касается определения количества разделов, документация дает довольно хороший пример использования данных временных рядов для принятия решения о том, как разделить фрейм данных: http://docs.dask.org/en/latest/dataframe-design.html#partitions.
Я не мог заставить эту строку работать (потому что я передавал dictionary
в качестве базового словаря Python, что не является правильным вводом)
ddf = dd.DataFrame(dictionary, divisions=[2], meta=pd.DataFrame(dictionary,
index=list(range(2))), name='ddf')
print(ddf.compute())
() # this is the output of ddf.compute(); clearly something is not right
Итак, мне пришлось создать несколько фиктивных данных и использовать их в моем подходе к созданию dask dataframe
.
Создание фиктивных данных в словаре
d = {0: [388]*2,
1: [387]*2,
2: [386]*2,
3: [385]*2,
5: [384]*2,
'2012-06-13': [389]*2,
'2012-06-14': [389]*2,}
Создать Dask dataframe
из Словарьсумка для посуды
DataFrame
, а затем использовать .to_dict(..., orient='records')
, чтобы получить последовательность (список строковых словарей), необходимую для создания пакета daskИтак, вот как я создал нужную последовательность
d = pd.DataFrame(d, index=list(range(2))).to_dict('records')
print(d)
[{0: 388,
1: 387,
2: 386,
3: 385,
5: 384,
'2012-06-13': 389,
'2012-06-14': 389},
{0: 388,
1: 387,
2: 386,
3: 385,
5: 384,
'2012-06-13': 389,
'2012-06-14': 389}]
Теперь использую список словарей для создания dask bag
dask_bag = db.from_sequence(d, npartitions=2)
print(dask_bag)
dask.bag<from_se..., npartitions=2>
Переделать dask bag в dask dataframe
df = dask_bag.to_dataframe()
Переименовать столбцы в dask dataframe
cols = {0:'Datetime',1:'col1',2:'col2',3:'col3',5:'col5'}
df = df.rename(columns=cols)
print(df)
Dask DataFrame Structure:
Datetime col1 col2 col3 col5 2012-06-13 2012-06-14
npartitions=2
int64 int64 int64 int64 int64 int64 int64
... ... ... ... ... ... ...
... ... ... ... ... ... ...
Dask Name: rename, 6 tasks
Вычислить dask dataframe
(на этот раз не будет вывода ()
!)
print(ddf.compute())
Datetime col1 col2 col3 col5 2012-06-13 2012-06-14
0 388 387 386 385 384 389 389
0 388 387 386 385 384 389 389
Примечания:
.rename
: inplace
не поддерживается.'0'
, '1'
и т. д. Для имен столбцов, которые были целыми числами. Возможно, для ваших данных (как в случае с фиктивными данными здесь) словарь должен быть просто целыми числами 0
, 1
и т. д.dask
документы, я использовал этот подход, основанный на переименовании словаря 1-1, и имена столбцов не входит в переименование слов будут оставлены без изменений.
Если вы хотите только строчные буквы и удалить пробелы, вы можете сделать:
data = dd.read_csv('*.csv').rename(columns=lambda x: x.lower().replace(' ', '_'))
FWIW, создание словаря для переназначения каждого имени столбца (даже тех, которые я не хочу изменять, а затем использование
ddf = ddf.rename(columns=cols)
, отлично сработало для меня.