Вычисление суммы комбинации столбцов в пандах по строкам с выходным файлом с названием указанной комбинации - PullRequest
0 голосов
/ 07 июня 2018

Я ищу способ создания CSV-файла для определенной комбинации данных из столбцов в кадре данных.

Мои данные выглядят так (за исключением еще 200 строк)

+-------------------------------+-----+----------+---------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+---------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+
|            Species            | OGT |  Domain  |       A       |      C       |      D       |      E       |      F       |      G       |      H       |      I       |      K       |       L       |      M       |      N       |      P       |      Q       |      R       |      S       |      T       |      V       |      W       |      Y       |
+-------------------------------+-----+----------+---------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+---------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+
| Aeropyrum pernix              |  95 | Archaea  |  9.7659115711 | 0.6720465616 | 4.3895390781 | 7.6501943794 | 2.9344881615 | 8.8666657183 | 1.5011817208 | 5.6901432494 | 4.1428307243 | 11.0604191603 |   2.21143353 | 1.9387130928 | 5.1038552753 | 1.6855017182 | 7.7664358772 |  6.266067034 | 4.2052190807 | 9.2692433532 |  1.318690698 | 3.5614200159 |
| Argobacterium fabrum          |  26 | Bacteria | 11.5698896021 | 0.7985475923 | 5.5884500155 | 5.8165463343 | 4.0512504104 | 8.2643271309 | 2.0116736244 | 5.7962804605 | 3.8931525401 |  9.9250463349 | 2.5980609708 | 2.9846761128 | 4.7828063605 | 3.1262365491 | 6.5684282943 | 5.9454781844 | 5.3740045968 | 7.3382308193 | 1.2519739683 | 2.3149400984 |
| Anaeromyxobacter dehalogenans |  27 | Bacteria | 16.0337898849 | 0.8860252895 | 5.1368827707 | 6.1864992608 | 2.9730203513 | 9.3167603253 | 1.9360386851 |  2.940143349 | 2.3473650439 |  10.898494736 | 1.6343905351 | 1.5247123262 | 6.3580285706 | 2.4715303021 | 9.2639057482 | 4.1890063803 | 4.3992339725 | 8.3885969061 | 1.2890166336 | 1.8265589289 |
| Aquifex aeolicus              |  85 | Bacteria |  5.8730327277 |  0.795341216 | 4.3287799008 | 9.6746388172 | 5.1386954322 | 6.7148035486 | 1.5438364179 | 7.3358775924 | 9.4641440609 | 10.5736658776 | 1.9263080969 | 3.6183861236 | 4.0518679067 | 2.0493569604 | 4.9229955632 | 4.7976564501 | 4.2005259246 | 7.9169763709 | 0.9292167138 | 4.1438942987 |
| Archaeoglobus fulgidus        |  83 | Archaea  |  7.8742687687 | 1.1695110027 | 4.9165979364 | 8.9548767369 |  4.568636662 | 7.2640358917 | 1.4998752909 | 7.2472039919 | 6.8957233203 |  9.4826333048 | 2.6014466253 |  3.206476915 | 3.8419576418 | 1.7789787933 | 5.7572748236 | 5.4763351139 | 4.1490633048 | 8.6330814159 | 1.0325605451 | 3.6494619148 |
+-------------------------------+-----+----------+---------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+---------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+--------------+

Что я хочу сделать, это найти способ создания CSV с видами, OGT, а затем комбинацию нескольких других столбцов, скажем, A, C, E & G и суммы процентов этих конкретныхзначения.

Таким образом, вывод выглядит примерно так: (эти суммы только что составлены)

ACEG.csv

             Species              OGT   Sum of percentage  
 ------------------------------- ----- ------------------- 
  Aeropyrum pernix                 95             23.4353  
  Anaeromyxobacter dehalogenans    26             20.3232  
  Argobacterium fabrum             27             14.2312  
  Aquifex aeolicus                 85             15.0403  
  Archaeoglobus fulgidus           83             34.0532  

Цель этого состоит в том, чтобы я мог сделатьэто для каждой из 10 миллионов комбинаций каждого столбца (AY), но я полагаю, что это простой цикл for.Я изначально пытался достичь этого в R, но после размышлений использование панд в python, вероятно, будет лучшим выбором.

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Вот что вы можете попробовать:

from itertools import product
from string import ascii_uppercase
import pandas as pd

combinations = [''.join(i) for i in product(ascii_uppercase, repeat = 4)]

for combination in combinations:
    new_df = df[['Species', 'OGT']]
    new_df['Sum of percentage'] = df[list(combination)]
    new_df.to_csv(combination + '.csv')

====

Редактировать после комментария Якима Пироженко, combinations лучше использовать itertools.combinations, чтобы избежать дублирования, например'AAAA':

combinations = [''.join(i) for i in itertools.combinations(ascii_uppercase, r = 4)]
0 голосов
/ 07 июня 2018

Не является ответом на исходный вопрос, но это может быть полезно с учетом обсуждения.

Цель состоит в том, чтобы найти комбинацию столбцов, чтобы сумма столбцов имела максимальную корреляцию с OGT.Это может быть легко, потому что ковариация является билинейной:

  • cov(OGT, A+B) = cov(OGT, A) + cov(OGT, B).

Я полагаюсь на два упрощающих предположения:

  1. Факторы A, B, C и т. Д. Являются независимыми.
  2. Виды взвешиваются одинаково.
  3. Дисперсия каждого фактора равна 1.

Идея:

  1. Нормализовать все столбцы, чтобы иметь единичную дисперсию (т. Е. Допущение 3).
  2. Вычислить ковариации OGT для каждого столбца.
  3. Сортировать коэффициенты A, B, C по порядкуубывающей ковариации.В качестве префикса этой схемы будет использоваться оптимальная комбинация.
  4. Какой префикс мы должны выбрать?Тот, где сумма за стандартное отклонение является наибольшим.Из-за нормализации на шаге 1 каждое стандартное отклонение суммы каждого префикса составляет просто sqrt (n) для префикса размера n.Осталось найти максимальный индекс в серии, что легко.

Это может быть немного быстрее, чем проверка всех возможных комбинаций.


import pandas as pd
import numpy as np

# set up fake data
import string

df = pd.DataFrame(np.random.rand(3, 26), columns=list(string.ascii_uppercase))

df["species"] = ["dog", "cat", "human"]
df["OGT"] = np.random.randint(0, 100, 3)
df = df.set_index("species")

# actual work
alpha_cols = list(string.ascii_uppercase)
# normalize standard deviations of each column
df = df[alpha_cols + ["OGT"]].div(df.std(0), axis=1)
# compute correlations (= covariances) of OGT with each column
corrs = df.corrwith(df.OGT).sort_values(ascending=False)
del corrs["OGT"]

# sort covariances in order from the greatest to the smallest
# compute cumulative sums
# divide by standard deviation of a group (i.e. sqrt(n) at index n-1)
cutoff = (corrs.cumsum() / np.sqrt(np.arange(corrs.shape[0]) + 1)).idxmax()
answer = sorted(corrs.loc[:cutoff].index.values)
print(answer)

# e.g.
# ['B', 'I', 'K', 'O', 'Q', 'S', 'U', 'V', 'Y']
0 голосов
/ 07 июня 2018

Что-то вроде этого?

def subset_to_csv(cols):
    df['Sum of percentage'] = your_data[list(cols)].sum(axis=1)
    df.to_csv(cols + '.csv')

df = your_data[['Species', 'OGT']]

for c in your_list_of_combinations:
    subset_to_csv(c)

Где cols - строка, содержащая столбцы, которые вы хотите поднастроить, например: 'ABC'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...