Я хочу вычислить матрицу корреляции большого набора данных (1M строк). Идея состоит в том, чтобы рассчитать соотношение продаж продукта. Если два продукта имеют одинаковое увеличение / уменьшение продаж по сравнению с прошлым годом, возможно, существует корреляция.
Я уже пробовал сообщения здесь:
Которые все более или менее делают то же самое, но собирают матрицу корреляции обратно в драйвер. Что является проблемой, поскольку большой набор данных делает эту коллекцию ОЗУ интенсивной . Я ищу способ разбить эту проблему на части и использовать распределенные вычисления Spark. Уникальных продуктов 170 тыс., Поэтому задание выполняется 170 тыс. Раз, а комбинаций 29Б.
Моя идея состоит в том, чтобы рассчитать корреляцию столбец за столбцом (перекрестное применение), а затем собрать ее во фрейме данных (или СДР) запускать фильтры поверх него (только с соотношением> 0,8). Но я не знаю, с чего начать.
Набор данных в основном выглядит следующим образом.
d = {'Product': ['A', 'B', 'C','A', 'B', 'C','A', 'B', 'C'],\
'Year': [2010, 2010, 2010, 2011, 2011, 2011, 2012, 2012, 2012],\
'Revenue': [100, 200, 300, 110, 190, 320, 120, 220, 350]}
df = pd.DataFrame(data=d)
Я транспонирую данные, чтобы в столбцах были указаны годы.
df = df.pivot(index='Product', columns='Year', values='Revenue').fillna(0)
Я вычисляю pct_change, чтобы иметь относительное изменение по сравнению с прошлым годом.
df_diff = df.pct_change(axis=1).replace([np.inf, -np.inf], np.nan).fillna(0)
Year 2010 2011 2012
Product
A 0.0 0.100000 0.090909
B 0.0 -0.050000 0.157895
C 0.0 0.066667 0.093750
И мне понадобится соотношение ... С pandas easy
# change structure
df_diff = df_diff.stack().unstack(level=0)
# get correlation
df_diff = df_diff.corr().abs()
# change structure back
df_diff = df_diff.unstack().to_frame(name='value')
df_diff.index = df_diff.index.set_names(['Product_1', 'Product_2'])
df_diff.reset_index(inplace=True)
Product_1 Product_2 value
0 A A 1.000000
1 A B 0.207317
2 A C 0.933485
3 B A 0.207317
4 B B 1.000000
5 B C 0.544352
6 C A 0.933485
7 C B 0.544352
8 C C 1.000000