Циклический просмотр значений вложенного словаря для заполнения второго словаря - python - PullRequest
2 голосов
/ 24 февраля 2020

У меня есть следующий словарь:

rts = {
         "PO1": {
                   "congruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]
                             },

                  "incongruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]

                             }
         },
         "PO2": {
                   "congruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]
                             },

                  "incongruent": {

                             "rt": [0.647259, 0.720116, 0.562909, 0.538918, 0.633367],
                        "correct": ["True", "True", "True", "True", "True", "False",]

                             }
         }
}

Вот код, который у меня есть до сих пор:

import csv
from pathlib import Path
import json
import numpy as np
from numpy import array


def main():
    rts = {}
    statsDict = {}

    data = Path('C:/Users/oli.warriner/Desktop/data(2)/data')

    for csvfile in data.glob('*.csv'):
        key = csvfile.stem

        with csvfile.open() as f:
            csv_reader = csv.reader(f)

            # Skip the header
            _ = next(csv_reader)

            rts[key] = {
                'congruent': {
                    'rt': [],
                    'correct': []
                },
                'incongruent': {
                    'rt': [],
                    'correct': []
                },
            }

            for tn, ctext, cname, condition, response, rt, correct in csv_reader:
                rts[key][condition]['rt'].append(float(rt))
                rts[key][condition]['correct'].append(correct)


    for k in rts:
        key = k
        statsDict[key] = {
                'congruent': {
                    'mean': [],
                    'stddev': [],
                    'correct': []
                },
                'incongruent': {
                    'mean': [],
                    'stddev': [],
                    'correct': []
                },
            }
        for n in rts[k]:
            for i in rts[key][n]

    array([rts[k] for k in rts]).mean()
    print(array)

if __name__ == "__main__":
    main()

Я читаю каталог csv-файлов, чтобы произвести «rts» словарь, который вы видите выше (его гораздо больше, чем я только что сократил здесь).

Теперь я хочу использовать словарь "rts" для заполнения "statsDict".

Мне нужно l oop через словарь "rts" и вычислить среднее и стандартное отклонение от значений "rt" в значениях "congruent" и "incongruent" для каждого ключа отдельно.

Затем мне нужно использовать логические значения в «правильном» для каждого ключа, чтобы вычислить процент истинного в каждом из них.

Мне удается l oop через первую пару слоев на словарь, однако, теперь я немного растерялся, я не уверен, как go перейти на следующий уровень вниз и начать делать необходимые мне расчеты статистики.

Надеюсь, людям это понятно. Дайте знать, если у вас появятся вопросы. Заранее спасибо!

1 Ответ

2 голосов
/ 24 февраля 2020

На основе приведенного примера rts вы можете создать словарь со статистикой с таким фрагментом кода:

import statistics
import json

rts = { ... as given ... }

stats_dict = {}
for k in rts.keys():
    stats_dict[k] = {}
    for ck in rts[k].keys():
        stats_dict[k][ck] = {}
        stats_dict[k][ck]["mean"] = statistics.mean(rts[k][ck]["rt"])
        stats_dict[k][ck]["stdev"] = statistics.stdev(rts[k][ck]["rt"])    
        stats_dict[k][ck]["true_percentage"] = len([x for x in rts[k][ck]["correct"] if x == "True"]) / len(rts[k][ck]["correct"])

print(json.dumps(stats_dict, indent=2))

Примечания

  • Вам не обязательно нужно numpy для расчета статичности. Достаточно встроенного пакета statistics
  • Вам не нужно заранее инициализировать словарь. Просто используйте ключи данного словаря rts и используйте те же ключи для словаря статистики stats_dict

Вывод

{
  "PO1": {
    "congruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    },
    "incongruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    }
  },
  "PO2": {
    "congruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    },
    "incongruent": {
      "mean": 0.6205138,
      "stdev": 0.07207165926839758,
      "true_percentage": 0.8333333333333334
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...